diff -Nru frama-c-20140301+neon+dfsg/bin/boron2carbon.sh frama-c-20150201+sodium+dfsg/bin/boron2carbon.sh --- frama-c-20140301+neon+dfsg/bin/boron2carbon.sh 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/bin/boron2carbon.sh 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # diff -Nru frama-c-20140301+neon+dfsg/bin/carbon2nitrogen.sh frama-c-20150201+sodium+dfsg/bin/carbon2nitrogen.sh --- frama-c-20140301+neon+dfsg/bin/carbon2nitrogen.sh 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/bin/carbon2nitrogen.sh 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # diff -Nru frama-c-20140301+neon+dfsg/bin/fluorine2neon.sh frama-c-20150201+sodium+dfsg/bin/fluorine2neon.sh --- frama-c-20140301+neon+dfsg/bin/fluorine2neon.sh 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/bin/fluorine2neon.sh 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # diff -Nru frama-c-20140301+neon+dfsg/bin/lithium2beryllium.sh frama-c-20150201+sodium+dfsg/bin/lithium2beryllium.sh --- frama-c-20140301+neon+dfsg/bin/lithium2beryllium.sh 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/bin/lithium2beryllium.sh 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # diff -Nru frama-c-20140301+neon+dfsg/bin/neon2sodium.sh frama-c-20150201+sodium+dfsg/bin/neon2sodium.sh --- frama-c-20140301+neon+dfsg/bin/neon2sodium.sh 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/bin/neon2sodium.sh 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,165 @@ +########################################################################## +# # +# This file is part of Frama-C. # +# # +# Copyright (C) 2007-2015 # +# 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). # +# # +########################################################################## + +#! /bin/sh +# +# neon2sodium: +# convert a Frama-C plugin from Frama-C Neon to Frama-C Sodium +# as most as possible (no guarantee that the result is fully compatible) +# +# known miss features: don't work if a directory name contains some spaces + +NAME=neon2sodium +ARGS=$@ + +DIR= + +# verbosing on by default +VERBOSE="v" + +sedi () +{ + if [ -n "`sed --help 2> /dev/null | grep \"\\-i\" 2> /dev/null`" ]; then + eval sed -i "$@" + else + # option '-i' is not recognized by sed: use a tmp file + new_temp=`mktemp /tmp/frama-c.XXXXXXX` || exit 1 + eval sed "$@" > $new_temp + eval last=\${$#} + mv $new_temp $last + fi +} + +dirs () +{ + if [ -z "$DIR" ]; then + DIR=. + fi +} + +safe_goto () +{ + dir=$1 + cd $dir + $3 + cd $2 +} + +goto () +{ + if [ -d $1 ]; then + safe_goto $1 $2 $3 + else + echo "Directory '$1' does not exist. Omitted." + fi +} + +process_file () +{ + file=$1 + if [ "$VERBOSE" ]; then + echo "Processing file $file" + fi + sedi \ + -e "\"s/EmptyString/Empty_string/g\"" \ + -e "\"s/StringSet/String_set/g\"" \ + -e "\"s/StringList/String_list/g\"" \ + -e "\"s/Cil.kinteger64 ~loc \\([^~]\\)/Cil.kinteger64 ~loc ~kind:\\1/g\"" \ + -e "\"s/Integer.bits_of_max_float/Floating_point.bits_of_max_double/g\"" \ + -e "\"s/Integer.bits_of_most_negative_float/Floating_point.bits_of_most_negative_double/g\"" \ + -e "\"s/Cil.charConstToInt/Cil.charConstToIntConstant/g\"" \ + -e "\"s/Ival.neg/Ival.neg_int/g\"" \ + -e "\"s/Ival.sub/Ival.sub_int/g\"" \ + -e "\"s/Datatype.Big_int/Datatype.Integer/g\"" \ + $file +} + +apply_one_dir () +{ + if [ "$VERBOSE" ]; then + echo "Processing directory `pwd`" + fi + for f in `ls -p1 *.ml* 2> /dev/null`; do + process_file $f + done +} + +apply_recursively () +{ + apply_one_dir + for d in `ls -p1 | grep \/`; do + safe_goto $d .. apply_recursively + done +} + +applying_to_list () +{ + dirs + tmpdir=`pwd` + for d in $DIR; do + goto $d $tmpdir $1 + done +} + +help () +{ + echo "Usage: $NAME [options | directories] + +Options are: + -r | --recursive Check subdirectories recursively + -h | --help Display help message + -q | --quiet Quiet mode (i.e. non-verbose mode) + -v | --verbose Verbose mode (default)" + exit 0 +} + +error () +{ + echo "$1. +Do \"$NAME -h\" for help." + exit 1 +} + +FN="apply_one_dir" + +parse_arg () +{ + case $1 in + -r | --recursive) FN="apply_recursively";; + -h | -help ) help; exit 0;; + -q | --quiet ) VERBOSE=;; + -v | --verbose ) VERBOSE="v";; + -* ) error "Invalid option $1";; + * ) DIR="$DIR $1";; + esac +} + +cmd_line () +{ + for s in $ARGS; do + parse_arg $s + done + applying_to_list $FN +} + +cmd_line +exit 0 diff -Nru frama-c-20140301+neon+dfsg/bin/nitrogen2oxygen.sh frama-c-20150201+sodium+dfsg/bin/nitrogen2oxygen.sh --- frama-c-20140301+neon+dfsg/bin/nitrogen2oxygen.sh 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/bin/nitrogen2oxygen.sh 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # diff -Nru frama-c-20140301+neon+dfsg/bin/oxygen2fluorine.sh frama-c-20150201+sodium+dfsg/bin/oxygen2fluorine.sh --- frama-c-20140301+neon+dfsg/bin/oxygen2fluorine.sh 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/bin/oxygen2fluorine.sh 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # diff -Nru frama-c-20140301+neon+dfsg/Changelog frama-c-20150201+sodium+dfsg/Changelog --- frama-c-20140301+neon+dfsg/Changelog 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/Changelog 2015-05-29 15:31:43.000000000 +0000 @@ -12,6 +12,226 @@ # '#?nnn' : OLD-BTS entry #nnn # ############################################################################### +################################### +Open Source Release Sodium-20150201 +################################### + +- Kernel [2015/02/01] Tests are added to the distrib (make tests) +- Value [2015/01/07] Special functions CEA_ are deprecated. Use + Frama_C_show_each or Frama_C_dump_each instead. +- Kernel [2014/12/28] Improve pretty-printing of some loops. +-* Kernel [2014/12/16] -load-module M now works fine if M uses the API + of another plug-in (bts #!1824). + +-! Cil [2014/12/09] Default preprocessing command now includes Frama-C's + standard library, and when possible sets option '-nostdinc'. + See options -frama-c-stdlib and -cpp-gnu-like. +*! Cil [2014/12/09] Variables __FC_MACHDEP_FOO_BAR are now automatically + positioned when setting a non-standard machdep and using Frama-C's + standard library. +- Cil [2014/12/09] Option -pp-annot should be much faster when parsing + files with many ACSL annotations. +- Logic [2014/11/28] The ACSL parser now ignores /*@{ and /*@} comments, + to avoid conflicting with Doxygen. +- Value [2014/11/10] Accesses to locations that contain garbled mix now + cause the garbled mix to be reduced to the set of valid locations. +- Value [2014/11/07] Accesses to '*(foo *)p' may now reduce p according + to the validity of the access, when useful. +- Value [2014/11/07] Removed message "assigning non-deterministic + value from the first time". +- Value [2014/10/28] Option -slevel-merge-after-loop renamed to + -val-slevel-merge-after-loop. Now takes a set of kernel functions + as an argument. +- Value [2014/10/24] Per-callstack results are now always computed. + Option -val-callstack-results is deprecated. +- From [2014/10/24] New option -from-verify-assigns to give assigns/from + clauses of function with bodies a validity status. +-! Value [2014/10/24] Logic ranges are now evaluated using a dedicated + lattice. Results are almost always more precise, and the analysis + faster. +-* Kernel [2014/10/23] allow dynamically loaded module to start with a + lower-case letter. Fixes #1276. +-* Value [2014/10/15] Improved precision for variables that are reduced + (but not written) during a call memorized by option -memexec-all +- Value [2014/10/15] Indeterminate bits copied when option + -val-warn-copy-indeterminate is active now cause a reduction in + the source location. +- Value [2014/10/15] Arguments of functions that give rise to an alarm + are now reduced when possible. +- Value [2014/09/26] Reduce arguments of a function according to the + possible values of the formal at the end of the call. +- Value [2014/09/26] Better precision when a scalar value is written + through a garbled mix. +o! Value [2014/09/26] Remove experimental support for periodic bases. +-* Value [2014/09/25] Fix bug when writing precise values at too many + locations in packed arrays. +-* Value [2014/09/19] When for missing '\from' clause for '\result' when + result is used in a postcondition. Fixes bug #1908. +o! Value [2014/08/29] Garbled mix (constructor Top in modules + Location_Bits/Bytes) now explicitly mention the NULL base. +- Kernel [2014/08/15] New option '-then-last', which behaves like + '-then-on' on the last project created by a program transformer. +-* Value [2014/07/27] Text-only alarms that used the '\defined' predicate + (to warn about dereferencing pointers to out-of-scope variables) + are now emitted with the '\dangling_contents predicate. +- Logic [2014/07/27] The ACSL predicate '\specified', which has been + renamed to '!\dangling_contents' is now supported. +o! Value [2014/07/22] Value 'empty' is no longer exported in module + Offsetmap. The API should prevent any accidental creation. +- Inout [2014/07/22] Remove undocumented option -access-path +o! Value [2014/07/22] Most iterators of module Lmap and Cvalue.Model + now accept only the non-bottom and non-top cases. +o! Value [2014/07/22] API of module Cvalue.V_Or_Uninitialized is now + type-safe. Replace all occurrences of 'get_flags v' by 'v'. +o! Value [2014/07/22] Improve and clarify the return conventions of modules + Offsetmap, Lmap, Cvalue.V_Offsetmap and Cvalue.Model, by returning + three cases: `Bottom, `Top and `Map. The latter case indicates + the operation succeeded precisely'. +o! Value [2014/07/22] Functions find_base and find_base_or_default in + modules Lmap and Cvalue.Model now return an optional type, to + account for invalid bases (that may not be present in the map). +o! Value [2014/07/22] Some functions of modules Offsetmap, Lmap, + Cvalue.V_Offsetmap and Cvalue.Model now require a separate + Locations.Location_Bits.t and (integer) size, instead of a + Locations.location. This avoids errors when the case was + Int_Base.Top. +o Value [2014/07/22] Argument ~conflate_bottom to Cvalue.Model.find is now + optional. The documentation has been updated to better explain its + meaning. +- Value [2014/07/22] Message 'extracting bits of a pointer' is no longer + emitted, as it was redundant with the warnings about garbled mix. +-* Value [2014/07/22] Fix evaluation of '/' in the logic, that silently + ignored the presence of the value 0 in the divisor. +- Value [2014/07/22] The arguments of an invalid shift operation are now + reduced so that they belong to the proper range. +o! Value [2014/07/22] Multiple low-level functions have been removed from + modules Cvalue.V and Cvalue.Model, and are no longer available. +o! Value [2014/07/22] Function Cvalue.Model.find does *not* signal its + result is indeterminate anymore. Use function + Cvalue.Model.find_unspecified instead. +o! Value [2014/07/22] Major API change in directories src/ai and + src/memory_state. Functions no longer take ~with_alarms arguments. + Instead, they return booleans, that indicate an alarm occurred. +- Value [2014/07/22] More systematic emission of message 'operation [...] + incurs a loss of precision', signaling an arithmetic operation + on a pointer address. This message is now emitted by Value itself. +-! Kernel [2014/07/09] New way to handle command line options which + accepts sets of values. Values may be prefixed by '+' or + '-' to add/remove them and categories of values prefixed by + '@' are available as well (for instance @all). +o! Kernel [2014/07/09] A new bunch of functors are available to + define command line collections. +o! Cil [2014/07/03] Field 'vgenerated' of type Cil_types.varinfo has + been replaced by the field 'vtemp' to emphasize the fact that + it should only be set to true for temp variables generated + during elaboration. +o Cil [2014/06/27] Variables are created with a field 'vgenerated' set + to 'false' by default. Only Cil should position this field to + 'true'. +o! Cil [2014/06/27] The field 'vlogic' of type Cil_types.varinfo has + been replaced by the field 'vsource', to avoid confusion with + logic variables. The value of the new field is the negation of + the previous one. +-! Cil [2014/06/17] Frama-C's x86 default machdeps no longer assume that + the compiler is GCC. Some typing extensions and builtin are thus + deactivated. If you want a GCC-centric analysis, use the + gcc-prefixed machdeps. +o! Cil [2014/06/17] Modifications in some fields of type Cil_types.mach. + Function File.new_machdep has a simpler type. +- Value [2014/06/17] Option -val-split-return can now be used to split + between NULL / non-NULL pointers +- Kernel [2014/06/16] New option -const-readonly (set by default), that + asserts that 'const' variables must never be written. +- Logic [2014/06/16] New logic label "Init", that refers to the state + just after the initialization of globals. +- Cil [2014/06/16] Values extracted from initializers of const variables + are now accepted as arguments of directives pragma loop UNROLL. +- Logic [2014/06/16] New builtin functions \min and \max of type + Set(Integer) -> Int +- Semantic Constant Folding [2014/06/12] Reducing the number of introduced + casts; feature #!1787. +- Value [2014/06/07] Improve conversion of float values that have been + written as integers (through low-level memory accesses) +- Value [2014/06/06] Improved pretty-printing of variables containing + pointers. +-* Makefile [2014/06/05] Do not install ZArith with Frama-C anymore. +o* Makefile [2014/06/05] Fixed compilation bug for plug-ins with both a + GUI and a non-empty API (bug #!1798). +- Value [2014/06/01] Improved widening on variables that are used to + access an array +- Value [2014/05/27] The GUI now showns the value of logic l-values + inside function specifications. They are evaluated in the + pre-state of the function, before the evaluation of preconditions. +o Gui [2014/05/27] Logic l-values inside function specifications can + now be selected +* Slicing [2014/05/23] Fix issues about slicing calls to the main function + and journalization (bug #!1684). +- Kernel [2014/05/22] Nicer error message in case of code + incompatibility when loading a plug-in. +-* Kernel [2014/05/15] Fix bug #1765 (spelling errors). +-* Slicing [2014/05/14] Fix crashes about multiple slicing pragma inside a + function (bug #1768). +- Report [2014/04/07] New option -report-callsite-preconditions. +- Report [2014/04/07] More consistent behavior when option -report-untried + is not set. +- Report [2014/04/07] Better reporting of reachability statuses; do not + coalesce unproven reachability assertions with other alarms. +- Value [2014/04/05] When option -val-callstack-results is set, the GUI + now displays a callstacks-wide consolidation of the possibles + values for expressions and terms. Previously, the potentially + less precise summary state was used. +- From [2014/04/05] Major performance improvements on big analyses. +-! Value [2014/04/05] Complete rewrite of the modules Int_Intervals and + Offsetmap_bitwise; both are now implemented with the same + datastructure as Offsetmap. Many performance improvements. + Many changes in the API of module Offsetmap_bitwise. Few changes + in Int_Intervals, but the englobing module Lattice_Interval_Set + has been removed. +- Gui [2014/03/27] New option -gui-project to run the GUI in a + given project. +- Semantic Constant Folding [2014/03/25] Reducing the number of introduced + casts; feature issue #!1697. +- Semantic Constant Folding [2014/03/25] New option -scf-project-name. +o! Cil [2014/03/24] The ikind for Cil.kinteger64 is now optional. +- Value [2014/03/20] File-scope and formal const variables are read-only. + Any possibility of writing there is treated as alarm. +-! Gui [2014/03/14] C expressions can now be selected through the source + panel. +-* Cil [2014/03/13] Fix erroneous integral promotion of type 'char' on + architectures where 'char' is unsigned. +- Semantic Constant Folding [2014/03/13] Generate nicer constants for integers + and pointers +- Semantic Constant Folding [2014/03/13] Floating-point constants can now + be propagated. +-* Semantic Constant Folding [2014/03/13] Fix crashes and/or multiple declations + when a global was referenced in the constant-folded project + earlier than in the original one. +- Value [2014/03/12] Improve precision of &. +o Logic [2014/03/04] Annotations.{iter,fold}_all_code_annot are now + by default sorted. Use ~sorted:false in case of efficiency issues. +-* Value [2014/03/02] Dividing an integer value by a memory address + requires the address to be comparable to NULL. +- Value [2014/03/02] Alarms are now re-evaluated at the end of the + analysis. If their truth value is 'Valid' or 'Invalid', this more + precise status is used, instead of the previous 'Unknown' one. +- Value [2014/03/01] Preconditions of functions that are never called are + now also marked as dead at each call-site. +- Rte [2014/03/01] Very big floating-point constants that are converted + to an integer are now reported as overflowing in only one + direction +- Value [2014/03/01] Alarms when converting integers to floating-point + are now reported only for the range that overflows +- Value [2014/03/01] Instructions whose execution is guaranteed to fail + are now displayed in the GUI +- Value [2014/03/01] Option -val-after-results is now always active by + default, and can no longer be unset + +-! Kernel [2014/05/12] require ocamlgraph version 1.8.5 +- Kernel [2014/08/07] add instructions for downloading the manuals +-* Configure [2014/03/17] use the gcc from the configure for compiling c files +-* Configure [2014/03/10] fix for autoconf < 2.67 when checking ability + of default pre-processor to keep comments + ################################# Open Source Release Neon-20140301 ################################# @@ -21,7 +241,7 @@ -* Kernel [2014/02/18] Fix -machdep help in presence of other actions (bts #1643). +* Logic [2014/02/05] Better handling of sets. Use Tlogic_coerce to - explicitely mark conversion from singleton to set. + explicitly mark conversion from singleton to set. - Kernel [2014/02/04] Assigns clauses generated by the kernel for functions with neither a specification nor a body receive an 'Unknown' status. @@ -1607,7 +1827,7 @@ mkAddrOrStartOf,mkString,parseInt,sizeOf] no longer use an optional argument ?loc. It is now a non optional labeled argument. Previous default value of loc was - ~loc:Cil_datatype.Location.unkown which is most of the time + ~loc:Cil_datatype.Location.unknown which is most of the time not accurate. ################################### diff -Nru frama-c-20140301+neon+dfsg/cil/src/cil_datatype.ml frama-c-20150201+sodium+dfsg/cil/src/cil_datatype.ml --- frama-c-20140301+neon+dfsg/cil/src/cil_datatype.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/cil_datatype.ml 2015-05-29 15:31:43.000000000 +0000 @@ -1,45 +1,24 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) open Cil_types let (=?=) = Extlib.compare_basic @@ -289,7 +268,8 @@ let rec loc_skind = function | Return(_, l) | Goto(_, l) | Break(l) | Continue l | If(_, _, _, l) | Switch (_, _, _, l) | Loop (_, _, l, _, _) - | TryFinally (_, _, l) | TryExcept (_, _, _, l) -> l + | TryFinally (_, _, l) | TryExcept (_, _, _, l) + | Throw (_,l) | TryCatch(_,_,l) -> l | Instr hd -> Instr.loc hd | Block b -> (match b.bstmts with [] -> Location.unknown | s :: _ -> loc s) | UnspecifiedSequence ((s,_,_,_,_) :: _) -> loc s @@ -367,11 +347,12 @@ | TEnum _ -> 8 | TBuiltin_va_list _ -> 9 -let pbitsSizeOf = ref (fun _ -> failwith "pbitsSizeOf not yet defined") +let constfoldtoint = ref (fun _ -> failwith "constfoldtoint not yet defined") let punrollType = ref (fun _ -> failwith "punrollType not yet defined") - let drop_non_logic_attributes = ref (fun a -> a) +let compare_exp_struct_eq = + ref (fun _ -> failwith "compare_exp_struct_eq not yet defined") type type_compare_config = { by_name : bool; @@ -428,6 +409,17 @@ AAlignOf _ | AAlignOfE _ | AUnOp _ | ABinOp _ | ADot _ | AStar _ | AAddrOf _ | AIndex _ | AQuestion _ as a1), a2 -> index_attrparam a1 - index_attrparam a2 +and compare_array_sizes e1o e2o = + let compare_non_empty_size e1 e2 = + let i1 = !constfoldtoint e1 in + let i2 = !constfoldtoint e2 in + match i1, i2 with + | None, None -> (* inconclusive. do not return 0 *) + !compare_exp_struct_eq e1 e2 + | _ -> Extlib.opt_compare Integer.compare i1 i2 + in + Extlib.opt_compare compare_non_empty_size e1o e2o + and compare_type config t1 t2 = if t1 == t2 then 0 else @@ -445,10 +437,8 @@ compare_chain (compare_type config) t1 t2 (compare_attributes config) l1 l2 - | TArray (t1', _, _, l1), TArray (t2', _, _, l2) -> - (* bitsSizeOf is here to compare the size of the arrays *) - compare_chain (=?=) - (!pbitsSizeOf t1) (!pbitsSizeOf t2) + | TArray (t1', e1, _, l1), TArray (t2', e2, _, l2) -> + compare_chain compare_array_sizes e1 e2 (compare_chain (compare_type config) t1' t2' (compare_attributes config)) l1 l2 @@ -672,11 +662,11 @@ vid = -1; vaddrof = false; vreferenced = false; - vgenerated = false; + vtemp = false; vdescr = None; vdescrpure = false; vghost = false; - vlogic = false; + vsource = false; vlogic_var_assoc = None } include Make_with_collections @@ -890,7 +880,8 @@ | StartOf _, _ -> 1 | _, StartOf _ -> -1 | Info _, Info _ -> - Kernel.fatal "[exp_compare] Info node is obsolete. Do not use it" + Cmdline.Kernel_log.fatal + "[exp_compare] Info node is obsolete. Do not use it" and compare_lval (h1,o1) (h2,o2) = let res = compare_lhost h1 h2 in @@ -938,7 +929,8 @@ | AddrOf lv -> hash_lval (prime*acc lxor 329) lv | StartOf lv -> hash_lval (prime*acc lxor 431) lv | Info _ -> - Kernel.fatal "Info node is deprecated and should not be used" + 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 @@ -984,6 +976,7 @@ let equal = Datatype.from_compare let pretty fmt t = !Exp.pretty_ref fmt t end) +let () = compare_exp_struct_eq := ExpStructEq.compare module Block = struct let pretty_ref = Extlib.mk_fun "Cil_datatype.Block.pretty_ref" @@ -1837,8 +1830,9 @@ let rec hash g = match g with | Dfun_or_pred (l,_) -> 2 * Logic_info.hash l - | Dvolatile ([],_,_,(source,_)) -> - Kernel.fatal ~source "Empty location list for volatile annotation" + | Dvolatile ([],_,_,(_source,_)) -> + Cmdline.Kernel_log.fatal + "Empty location list for volatile annotation@." | Dvolatile (t::_,_,_,_) -> 3 * Identified_term.hash t | Daxiomatic (_,[],_) -> 5 (* Empty axiomatic is weird but authorized. *) @@ -1998,14 +1992,15 @@ Location.reprs let compare k1 k2 = Datatype.Int.compare (id k1) (id k2) let equal k1 k2 = - if k1 != k2 then ( - if (id k1) = (id k2) then - Kernel.fatal "Two kf for %a (%d) and %a (%d) (%d)" + if k1 != k2 then begin + if id k1 = id k2 then begin + Cmdline.Kernel_log.fatal "Two kf for %a (%d) and %a (%d) (%d)@." Varinfo.pretty (vi k1) (Extlib.address_of_value k1) - Varinfo.pretty (vi k2) (Extlib.address_of_value k2) - (id k1); - false) - else true + Varinfo.pretty (vi k2) (Extlib.address_of_value k2) + (id k1) + end; + false + end else true let hash = id let copy = Datatype.undefined let rehash x = match x.fundec with @@ -2055,6 +2050,55 @@ end +module Predicate_named = + Make + (struct + type t = predicate named + let name = "Predicate_named" + let reprs = + [ { name = [ "" ]; loc = Location.unknown; content = Pfalse } ] + let internal_pretty_code = Datatype.undefined + let pretty = Datatype.undefined + let varname _ = "p" + end) + +module Identified_predicate = + Make_with_collections + (struct + type t = identified_predicate + let name = "Identified_predicate" + let reprs = + [ { ip_name = [ "" ]; + ip_loc = Location.unknown; + ip_content = Pfalse; + ip_id = -1} ] + let compare x y = Extlib.compare_basic x.ip_id y.ip_id + let equal x y = x.ip_id = y.ip_id + let copy = Datatype.undefined + let hash x = x.ip_id + let internal_pretty_code = Datatype.undefined + let pretty = Datatype.undefined + let varname _ = "id_predyes" + end) + +module Funbehavior = + Datatype.Make + (struct + include Datatype.Serializable_undefined + type t = funbehavior + let name = "Funbehavior" + let reprs = + [ { b_name = "default!"; (* Cil.default_behavior_name *) + b_requires = Identified_predicate.reprs; + b_assumes = Identified_predicate.reprs; + b_post_cond = + List.map (fun x -> Normal, x) Identified_predicate.reprs; + b_assigns = WritesAny; + b_allocation = FreeAllocAny; + b_extended = [ "toto", 4, Identified_predicate.reprs ]; } ] + let mem_project = Datatype.never_any_project + end) + module Funspec = Datatype.Make (struct @@ -2062,7 +2106,7 @@ type t = funspec let name = "Funspec" let reprs = - [ { spec_behavior = []; + [ { spec_behavior = Funbehavior.reprs; spec_variant = None; spec_terminates = None; spec_complete_behaviors = []; @@ -2106,36 +2150,6 @@ end) end -module Predicate_named = - Make - (struct - type t = predicate named - let name = "Predicate_named" - let reprs = - [ { name = [ "" ]; loc = Location.unknown; content = Pfalse } ] - let internal_pretty_code = Datatype.undefined - let pretty = Datatype.undefined - let varname _ = "p" - end) - -module Identified_predicate = - Make_with_collections - (struct - type t = identified_predicate - let name = "Identified_predicate" - let reprs = - [ { ip_name = [ "" ]; - ip_loc = Location.unknown; - ip_content = Pfalse; - ip_id = -1} ] - let compare x y = Extlib.compare_basic x.ip_id y.ip_id - let equal x y = x.ip_id = y.ip_id - let copy = Datatype.undefined - let hash x = x.ip_id - let internal_pretty_code = Datatype.undefined - let pretty = Datatype.undefined - let varname _ = "id_predyes" - end) (**************************************************************************) (** {3 Logic_ptree} diff -Nru frama-c-20140301+neon+dfsg/cil/src/cil_datatype.mli frama-c-20150201+sodium+dfsg/cil/src/cil_datatype.mli --- frama-c-20140301+neon+dfsg/cil/src/cil_datatype.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/cil_datatype.mli 2015-05-29 15:31:43.000000000 +0000 @@ -1,45 +1,24 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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 of some useful CIL types. @plugin development guide *) @@ -215,11 +194,6 @@ include S_with_collections with type t = typ end -(**/**) (* Forward declarations from Cil *) -val pbitsSizeOf : (typ -> int) ref -val punrollType: (typ -> typ) ref -(**/**) - module Typeinfo: S_with_collections with type t = typeinfo module Varinfo_Id: Hptmap.Id_Datatype @@ -266,6 +240,8 @@ val pretty_ref: (Format.formatter -> t -> unit) ref end +module Funbehavior: S with type t = funbehavior + module Funspec: S with type t = funspec (** @since Fluorine-20130401 *) @@ -328,7 +304,7 @@ module Predicate_named: S with type t = predicate named module Identified_predicate: S_with_collections with type t = identified_predicate -(** @since Neon-20130301 *) +(** @since Neon-20140301 *) (**************************************************************************) (** {3 Logic_ptree} @@ -342,9 +318,15 @@ (** {2 Internal API} *) (* ****************************************************************************) +(* Forward declarations from Cil *) val drop_non_logic_attributes : (attributes -> attributes) ref +val constfoldtoint : (exp -> Integer.t option) ref +val punrollType: (typ -> typ) ref +(**/**) + val clear_caches: unit -> unit + (**/**) (* diff -Nru frama-c-20140301+neon+dfsg/cil/src/cil.ml frama-c-20150201+sodium+dfsg/cil/src/cil.ml --- frama-c-20140301+neon+dfsg/cil/src/cil.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/cil.ml 2015-05-29 15:31:43.000000000 +0000 @@ -49,7 +49,6 @@ * *) -open Cil_const open Logic_const open Format open Cil_datatype @@ -69,7 +68,7 @@ let pp_thisloc fmt = Location.pretty fmt (CurrentLoc.get ()) -let register_ast_dependencies, add_ast_dependency = +let set_dependencies_of_ast, dependency_on_ast = let list_self = ref [] in (fun ast -> State_dependency_graph.add_dependencies ~from:ast !list_self), (fun state -> list_self := state :: !list_self) @@ -103,10 +102,7 @@ let empty_size_cache () = {scache=Not_Computed} type theMachine = - { mutable msvcMode: bool; (** Whether the pretty printer should - print output for the MS VC - compiler. Default is GCC *) - mutable useLogicalOperators: bool; + { mutable useLogicalOperators: bool; mutable theMachine: mach; (** Cil.initCil will set this to the current machine description. *) mutable lowerConstants: bool; (** Do lower constants (default true) *) @@ -143,11 +139,10 @@ mutable lineLength: int; mutable warnTruncate: bool } -let default_machdep = Machdep_x86_32.gcc +let default_machdep = Machdeps.x86_32 let createMachine () = (* Contain dummy values *) - { msvcMode = false; - useLogicalOperators = false; + { useLogicalOperators = false; theMachine = default_machdep; lowerConstants = false(*true*); insertImplicitCasts = true; @@ -160,10 +155,10 @@ ptrdiffKind = IChar; ptrdiffType = voidType; typeOfSizeOf = voidType; - kindOfSizeOf = IUInt } + kindOfSizeOf = IUInt; +} let copyMachine src dst = - dst.msvcMode <- src.msvcMode; dst.useLogicalOperators <- src.useLogicalOperators; dst.theMachine <- src.theMachine; dst.lowerConstants <- src.lowerConstants; @@ -182,6 +177,9 @@ (* A few globals that control the interpretation of C source *) let theMachine = createMachine () +let msvcMode () = (theMachine.theMachine.compiler = "msvc") +let gccMode () = (theMachine.theMachine.compiler = "gcc") + let theMachineProject = ref (createMachine ()) module Machine_datatype = @@ -226,8 +224,6 @@ let selfMachine_is_computed = TheMachine.is_computed -let set_msvcMode b = theMachine.msvcMode <- b - let miscState = { lineDirectiveStyle = Some LinePreprocessorInput; print_CIL_Input = false; @@ -376,12 +372,19 @@ let dropAttribute (an: string) (al: attributes) = List.filter (fun a -> attributeName a <> an) al - let dropAttributes (anl: string list) (al: attributes) = - List.fold_left (fun acc an -> dropAttribute an acc) al anl - let hasAttribute (s: string) (al: attribute list) : bool = List.exists (fun a -> attributeName a = s) al + let rec dropAttributes (anl: string list) (al: attributes) = + match al with + | [] -> [] + | a :: q -> + let q' = dropAttributes anl q in + if List.mem (attributeName a) anl then + q' (* drop this attribute *) + else + if q' == q then al (* preserve sharing *) else a :: q' + let filterAttributes (s: string) (al: attribute list) : attribute list = List.filter (fun a -> attributeName a = s) al @@ -470,19 +473,59 @@ TArray (arrayPushAttributes al bt, l, s, a) | t -> typeAddAttributes al t - let typeRemoveAttributes (anl: string list) t = - let drop (al: attributes) = dropAttributes anl al in + let rec typeRemoveAttributes (anl: string list) t = + (* Try to preserve sharing. We use sharing to be more efficient, but also + to detect that we have removed an attribute under typedefs *) + let reshare al f = + let al' = dropAttributes anl al in + if al' == al then t else f al' + in + match t with + | TVoid a -> reshare a (fun a -> TVoid a) + | TInt (ik, a) -> reshare a (fun a -> TInt (ik, a)) + | TFloat (fk, a) -> reshare a (fun a -> TFloat (fk, a)) + | TEnum (enum, a) -> reshare a (fun a -> TEnum (enum, a)) + | TPtr (t, a) -> reshare a (fun a -> TPtr (t, a)) + | TArray (t, l, s, a) -> reshare a (fun a -> TArray (t, l, s, a)) + | TFun (t, args, isva, a) -> reshare a (fun a -> TFun(t, args, isva, a)) + | TComp (comp, s, a) -> reshare a (fun a -> TComp (comp, s, a)) + | TBuiltin_va_list a -> reshare a (fun a -> TBuiltin_va_list a) + | TNamed (tn, a) -> + let tn' = typeRemoveAttributes anl tn.ttype in + if tn' == tn.ttype then + reshare a (fun a -> TNamed (tn, a)) + else + typeAddAttributes (dropAttributes anl a) tn' + + let rec typeRemoveAttributesDeep (anl: string list) t = + (* Try to preserve sharing. We use sharing to be more efficient, but also + to detect that we have removed an attribute under typedefs *) + let reshare al f = + let al' = dropAttributes anl al in + if al' == al then t else f al' + in match t with - TVoid a -> TVoid (drop a) - | TInt (ik, a) -> TInt (ik, drop a) - | TFloat (fk, a) -> TFloat (fk, drop a) - | TEnum (enum, a) -> TEnum (enum, drop a) - | TPtr (t, a) -> TPtr (t, drop a) - | TArray (t, l, s, a) -> TArray (t, l, s, drop a) - | TFun (t, args, isva, a) -> TFun(t, args, isva, drop a) - | TComp (comp, s, a) -> TComp (comp, s, drop a) - | TNamed (t, a) -> TNamed (t, drop a) - | TBuiltin_va_list a -> TBuiltin_va_list (drop a) + | TVoid a -> reshare a (fun a -> TVoid a) + | TInt (ik, a) -> reshare a (fun a -> TInt (ik, a)) + | TFloat (fk, a) -> reshare a (fun a -> TFloat (fk, a)) + | TEnum (enum, a) -> reshare a (fun a -> TEnum (enum, a)) + | TPtr (t, a) -> + let t' = typeRemoveAttributesDeep anl t in + if t != t' then TPtr(t', dropAttributes anl a) + else reshare a (fun a -> TPtr(t,a)) + | TArray (t, l, s, a) -> + let t' = typeRemoveAttributesDeep anl t in + if t!=t' then TArray(t', l, s, dropAttributes anl a) + else reshare a (fun a -> TArray (t, l, s, a)) + | TFun (t, args, isva, a) -> reshare a (fun a -> TFun(t, args, isva, a)) + | TComp (comp, s, a) -> reshare a (fun a -> TComp (comp, s, a)) + | TBuiltin_va_list a -> reshare a (fun a -> TBuiltin_va_list a) + | TNamed (tn, a) -> + let tn' = typeRemoveAttributesDeep anl tn.ttype in + if tn' == tn.ttype then + reshare a (fun a -> TNamed (tn, a)) + else + typeAddAttributes (dropAttributes anl a) tn' (* JS: build an attribute annotation from [s]. *) let mkAttrAnnot s = "/*@ " ^ s ^ " */" @@ -491,6 +534,8 @@ let type_remove_qualifier_attributes = typeRemoveAttributes qualifier_attributes +let type_remove_qualifier_attributes_deep = + typeRemoveAttributesDeep qualifier_attributes type attributeClass = | AttrName of bool @@ -573,7 +618,7 @@ | _ -> false (* Make a varinfo. Used mostly as a helper function below *) - let makeVarinfo ?(logic=false) ?(generated=true) global formal name typ = + let makeVarinfo ?(source=true) ?(temp=false) global formal name typ = (* Strip const from type for locals *) let vi = { vorig_name = name; @@ -582,7 +627,7 @@ vglob = global; vdefined = false; vformal = formal; - vgenerated = generated; + vtemp = temp; vtype = if formal || global then typ else typeRemoveAttributes ["const"] typ; vdecl = Location.unknown; @@ -594,11 +639,11 @@ vdescr = None; vdescrpure = true; vghost = false; - vlogic = logic; + vsource = source; vlogic_var_assoc = None } in - set_vid vi; + Cil_const.set_vid vi; vi module FormalsDecl = @@ -612,10 +657,10 @@ end) let selfFormalsDecl = FormalsDecl.self - let () = add_ast_dependency selfFormalsDecl + let () = dependency_on_ast selfFormalsDecl let makeFormalsVarDecl (n,t,a) = - let vi = makeVarinfo ~generated:false false true n t in + let vi = makeVarinfo ~temp:false false true n t in vi.vattr <- a; vi @@ -682,6 +727,73 @@ b.b_assumes = [] && b.b_requires = [] && b.b_post_cond = [] && b.b_assigns = WritesAny && b.b_allocation = FreeAllocAny && b.b_extended = [] + (** Get the full name of a comp *) + let compFullName comp = + (if comp.cstruct then "struct " else "union ") ^ comp.cname + + + let missingFieldName = "" (* "___missing_field_name"*) + +(* The next compindo identifier to use. Counts up. *) + let nextCompinfoKey = + let module M = + State_builder.SharedCounter(struct let name = "compinfokey" end) + in + M.next + + (** Creates a (potentially recursive) composite type. Make sure you add a + * GTag for it to the file! **) + let mkCompInfo + (isstruct: bool) + (n: string) + ?(norig=n) + (* fspec is a function that when given a forward + * representation of the structure type constructs the type of + * the fields. The function can ignore this argument if not + * constructing a recursive type. *) + (mkfspec: compinfo -> (string * typ * int option * attribute list * + location) list) + (a: attribute list) : compinfo = + + (* make a new name for anonymous structs *) + if n = "" then Kernel.fatal "mkCompInfo: missing structure name\n" ; + (* Make a new self cell and a forward reference *) + let comp = + { cstruct = isstruct; + corig_name = norig; + cname = n; + ckey = nextCompinfoKey (); + cfields = []; (* fields will be added afterwards. *) + cattr = a; + creferenced = false; + (* Make this compinfo undefined by default *) + cdefined = false; } + in + let flds = + List.map (fun (fn, ft, fb, fa, fl) -> + { fcomp = comp; + ftype = ft; + forig_name = fn; + fname = fn; + fbitfield = fb; + fattr = fa; + floc = fl; + faddrof = false; + fsize_in_bits = None; + foffset_in_bits = None; + fpadding_in_bits = None; + }) (mkfspec comp) in + comp.cfields <- flds; + if flds <> [] then comp.cdefined <- true; + comp + + (** Make a copy of a compinfo, changing the name and the key *) + let copyCompInfo (ci: compinfo) (n: string) : compinfo = + let ci' = {ci with cname = n; ckey = nextCompinfoKey (); } in + (* Copy the fields and set the new pointers to parents *) + ci'.cfields <- List.map (fun f -> {f with fcomp = ci'}) ci'.cfields; + ci' + (** Different visiting actions. 'a will be instantiated with [exp], [instr], etc. @see Plugin Development Guide *) @@ -716,6 +828,8 @@ cfunbehavior: funbehavior -> funbehavior; cidentified_term: identified_term -> identified_term; cidentified_predicate: identified_predicate -> identified_predicate; + cexpr: exp -> exp; + ccode_annotation: code_annotation -> code_annotation; (* get the copy of a shared value *) get_stmt: stmt -> stmt; get_compinfo: compinfo -> compinfo; @@ -788,6 +902,7 @@ memo_fundec: fundec -> fundec; (* is the behavior a copy behavior *) is_copy_behavior: bool; + is_fresh_behavior: bool; project: Project.t option; (* reset memoizing tables *) reset_behavior_varinfo: unit -> unit; @@ -844,6 +959,8 @@ let is_copy_behavior b = b.is_copy_behavior +let is_fresh_behavior b = b.is_fresh_behavior + let memo_varinfo b = b.memo_varinfo let memo_compinfo b = b.memo_compinfo let memo_fieldinfo b = b.memo_fieldinfo @@ -998,7 +1115,10 @@ cfunbehavior = id; cidentified_term = id; cidentified_predicate = id; + ccode_annotation = id; + cexpr = id; is_copy_behavior = false; + is_fresh_behavior = false; project = None; memo_varinfo = id; memo_compinfo = id; @@ -1080,7 +1200,7 @@ fold_visitor_fundec = alphabetabeta; } -let copy_visit prj = +let copy_visit_gen fresh prj = let varinfos = Cil_datatype.Varinfo.Hashtbl.create 103 in let compinfos = Cil_datatype.Compinfo.Hashtbl.create 17 in let enuminfos = Cil_datatype.Enuminfo.Hashtbl.create 17 in @@ -1107,36 +1227,124 @@ let orig_logic_vars = Cil_datatype.Logic_var.Hashtbl.create 17 in let orig_kernel_functions = Cil_datatype.Kf.Hashtbl.create 17 in let orig_fundecs = Cil_datatype.Varinfo.Hashtbl.create 17 in + let temp_set_logic_var x new_x = + Cil_datatype.Logic_var.Hashtbl.add logic_vars x new_x + in + let temp_set_orig_logic_var new_x x = + Cil_datatype.Logic_var.Hashtbl.add orig_logic_vars new_x x + in let temp_memo_logic_var x = (* Format.printf "search for %s#%d@." x.lv_name x.lv_id;*) let res = try Cil_datatype.Logic_var.Hashtbl.find logic_vars x with Not_found -> (* Format.printf "Not found@.";*) - let new_x = { x with lv_id = x.lv_id } in - Cil_datatype.Logic_var.Hashtbl.add logic_vars x new_x; - Cil_datatype.Logic_var.Hashtbl.add orig_logic_vars new_x x; - new_x + let id = if fresh then Cil_const.new_raw_id () else x.lv_id in + let new_x = { x with lv_id = id } in + temp_set_logic_var x new_x; temp_set_orig_logic_var new_x x; new_x in (* Format.printf "res is %s#%d@." res.lv_name res.lv_id;*) res in + let temp_set_varinfo x new_x = + Cil_datatype.Varinfo.Hashtbl.add varinfos x new_x; + match x.vlogic_var_assoc, new_x.vlogic_var_assoc with + | None, _ | _, None -> () + | Some lx, Some new_lx -> + Cil_datatype.Logic_var.Hashtbl.add logic_vars lx new_lx + in + let temp_set_orig_varinfo new_x x = + Cil_datatype.Varinfo.Hashtbl.add orig_varinfos new_x x; + match new_x.vlogic_var_assoc, x.vlogic_var_assoc with + | None, _ | _, None -> () + | Some new_lx, Some lx -> + Cil_datatype.Logic_var.Hashtbl.add orig_logic_vars new_lx lx + in let temp_memo_varinfo x = try Cil_datatype.Varinfo.Hashtbl.find varinfos x with Not_found -> - let new_x = { x with vid = x.vid } in - Cil_datatype.Varinfo.Hashtbl.add varinfos x new_x; - Cil_datatype.Varinfo.Hashtbl.add orig_varinfos new_x x; - new_x + let new_x = + if fresh then Cil_const.copy_with_new_vid x else begin + let new_x = { x with vid = x.vid } in + (match x.vlogic_var_assoc with + | None -> () + | Some lv -> + let new_lv = { lv with lv_origin = Some new_x } in + new_x.vlogic_var_assoc <- Some new_lv); + new_x + end + in + temp_set_varinfo x new_x; temp_set_orig_varinfo new_x x; new_x + in + let temp_set_fundec f new_f = + Cil_datatype.Varinfo.Hashtbl.add fundecs f.svar new_f + in + let temp_set_orig_fundec new_f f = + Cil_datatype.Varinfo.Hashtbl.add orig_fundecs new_f.svar f in let temp_memo_fundec f = try Cil_datatype.Varinfo.Hashtbl.find fundecs f.svar with Not_found -> let v = temp_memo_varinfo f.svar in let new_f = { f with svar = v } in - Cil_datatype.Varinfo.Hashtbl.add fundecs f.svar new_f; - Cil_datatype.Varinfo.Hashtbl.add orig_fundecs v f; - new_f + temp_set_fundec f new_f; temp_set_orig_fundec new_f f; new_f + in + let temp_set_kernel_function kf new_kf = + Cil_datatype.Kf.Hashtbl.replace kernel_functions kf new_kf; + match kf.fundec, new_kf.fundec with + | Declaration(_,vi,_,_), Declaration(_,new_vi,_,_) + | Declaration(_,vi,_,_), Definition({ svar = new_vi }, _) + | Definition({svar = vi},_), Declaration(_,new_vi,_,_) -> + temp_set_varinfo vi new_vi + | Definition (fundec,_), Definition(new_fundec,_) -> + temp_set_fundec fundec new_fundec + in + let temp_set_orig_kernel_function new_kf kf = + Cil_datatype.Kf.Hashtbl.replace orig_kernel_functions new_kf kf; + match new_kf.fundec, kf.fundec with + | Declaration(_,new_vi,_,_), Declaration(_,vi,_,_) + | Declaration(_,new_vi,_,_), Definition({ svar = vi }, _) + | Definition({svar = new_vi},_), Declaration(_,vi,_,_) -> + temp_set_orig_varinfo new_vi vi + | Definition (new_fundec,_), Definition(fundec,_) -> + temp_set_orig_fundec new_fundec fundec + in + let temp_memo_kernel_function kf = + try Cil_datatype.Kf.Hashtbl.find kernel_functions kf + with Not_found -> + let new_kf = + match kf.fundec with + | Declaration (spec,vi,prms,loc) -> + let new_vi = temp_memo_varinfo vi in + { kf with fundec = Declaration(spec,new_vi,prms,loc) } + | Definition(f,loc) -> + let new_f = temp_memo_fundec f in + { kf with fundec = Definition(new_f,loc) } + in + temp_set_kernel_function kf new_kf; + temp_set_orig_kernel_function new_kf kf; + new_kf + in + let temp_set_compinfo c new_c = + Cil_datatype.Compinfo.Hashtbl.add compinfos c new_c; + List.iter2 + (fun f new_f -> Cil_datatype.Fieldinfo.Hashtbl.add fieldinfos f new_f) + c.cfields new_c.cfields + in + let temp_set_orig_compinfo new_c c = + Cil_datatype.Compinfo.Hashtbl.add orig_compinfos new_c c; + List.iter2 + (fun new_f f -> + Cil_datatype.Fieldinfo.Hashtbl.add orig_fieldinfos new_f f) + new_c.cfields c.cfields + in + let temp_memo_compinfo c = + try Cil_datatype.Compinfo.Hashtbl.find compinfos c + with Not_found -> + let new_c = + if fresh then copyCompInfo c c.cname else { c with ckey = c.ckey } + in + temp_set_compinfo c new_c; temp_set_orig_compinfo new_c c; new_c in { cfile = (fun x -> { x with fileName = x.fileName }); get_compinfo = @@ -1239,9 +1447,20 @@ cblock = (fun x -> { x with battrs = x.battrs }); cfunspec = (fun x -> { x with spec_behavior = x.spec_behavior}); cfunbehavior = (fun x -> { x with b_name = x.b_name}); - cidentified_predicate = (fun x -> { x with ip_id = x.ip_id }); - cidentified_term = (fun x -> { x with it_id = x.it_id}); + ccode_annotation = + if fresh then Logic_const.refresh_code_annotation + else (fun x -> { x with annot_id = x.annot_id }); + cidentified_predicate = + if fresh then Logic_const.refresh_predicate + else (fun x -> { x with ip_id = x.ip_id }); + cidentified_term = + if fresh then Logic_const.refresh_identified_term + else (fun x -> { x with it_id = x.it_id}); + cexpr = + (fun x -> + let id = if fresh then Eid.next () else x.eid in { x with eid = id }); is_copy_behavior = true; + is_fresh_behavior = fresh; project = Some prj; reset_behavior_varinfo = (fun () -> @@ -1296,14 +1515,7 @@ Cil_datatype.Varinfo.Hashtbl.clear fundecs; Cil_datatype.Varinfo.Hashtbl.clear orig_fundecs); memo_varinfo = temp_memo_varinfo; - memo_compinfo = - (fun x -> - try Cil_datatype.Compinfo.Hashtbl.find compinfos x - with Not_found -> - let new_x = { x with ckey = x.ckey } in - Cil_datatype.Compinfo.Hashtbl.add compinfos x new_x; - Cil_datatype.Compinfo.Hashtbl.add orig_compinfos new_x x; - new_x); + memo_compinfo = temp_memo_compinfo; memo_enuminfo = (fun x -> try Cil_datatype.Enuminfo.Hashtbl.find enuminfos x @@ -1350,7 +1562,8 @@ (fun x -> try Cil_datatype.Stmt.Hashtbl.find stmts x with Not_found -> - let new_x = { x with sid = x.sid } in + let sid = if fresh then Sid.next () else x.sid in + let new_x = { x with sid = sid } in Cil_datatype.Stmt.Hashtbl.add stmts x new_x; Cil_datatype.Stmt.Hashtbl.add orig_stmts new_x x; new_x); @@ -1358,7 +1571,9 @@ (fun x -> try Cil_datatype.Fieldinfo.Hashtbl.find fieldinfos x with Not_found -> - let new_x = { x with fname = x.fname } in + let _ = temp_memo_compinfo x.fcomp in + (* memo_compinfo fills the field correspondance table as well *) + let new_x = Cil_datatype.Fieldinfo.Hashtbl.find fieldinfos x in Cil_datatype.Fieldinfo.Hashtbl.add fieldinfos x new_x; Cil_datatype.Fieldinfo.Hashtbl.add orig_fieldinfos new_x x; new_x); @@ -1372,23 +1587,10 @@ new_x ); memo_logic_var = temp_memo_logic_var; - memo_kernel_function = - (fun x -> - try Cil_datatype.Kf.Hashtbl.find kernel_functions x - with Not_found -> - let fundec = - match x.fundec with - | Definition (f,l) -> Definition (temp_memo_fundec f,l) - | Declaration(s,v,p,l) -> - Declaration(s,temp_memo_varinfo v,p,l) - in - let new_x = { x with fundec = fundec } in - Cil_datatype.Kf.Hashtbl.add kernel_functions x new_x; - Cil_datatype.Kf.Hashtbl.add orig_kernel_functions new_x x; - new_x); + memo_kernel_function = temp_memo_kernel_function; memo_fundec = temp_memo_fundec; - set_varinfo = Cil_datatype.Varinfo.Hashtbl.replace varinfos; - set_compinfo = Cil_datatype.Compinfo.Hashtbl.replace compinfos; + set_varinfo = temp_set_varinfo; + set_compinfo = temp_set_compinfo; set_enuminfo = Cil_datatype.Enuminfo.Hashtbl.replace enuminfos; set_enumitem = Cil_datatype.Enumitem.Hashtbl.replace enumitems; set_typeinfo = Cil_datatype.Typeinfo.Hashtbl.replace typeinfos; @@ -1398,12 +1600,11 @@ set_stmt = Cil_datatype.Stmt.Hashtbl.replace stmts; set_fieldinfo = Cil_datatype.Fieldinfo.Hashtbl.replace fieldinfos; set_model_info = Cil_datatype.Model_info.Hashtbl.replace model_infos; - set_logic_var = Cil_datatype.Logic_var.Hashtbl.replace logic_vars; - set_kernel_function = Cil_datatype.Kf.Hashtbl.replace kernel_functions; - set_fundec = - (fun x y -> Cil_datatype.Varinfo.Hashtbl.replace fundecs x.svar y); - set_orig_varinfo = Cil_datatype.Varinfo.Hashtbl.replace orig_varinfos; - set_orig_compinfo = Cil_datatype.Compinfo.Hashtbl.replace orig_compinfos; + set_logic_var = temp_set_logic_var; + set_kernel_function = temp_set_kernel_function; + set_fundec = temp_set_fundec; + set_orig_varinfo = temp_set_orig_varinfo; + set_orig_compinfo = temp_set_orig_compinfo; set_orig_enuminfo = Cil_datatype.Enuminfo.Hashtbl.replace orig_enuminfos; set_orig_enumitem = Cil_datatype.Enumitem.Hashtbl.replace orig_enumitems; set_orig_typeinfo = Cil_datatype.Typeinfo.Hashtbl.replace orig_typeinfos; @@ -1412,15 +1613,13 @@ set_orig_logic_type_info = Cil_datatype.Logic_type_info.Hashtbl.replace orig_logic_type_infos; set_orig_stmt = Cil_datatype.Stmt.Hashtbl.replace orig_stmts; - set_orig_fieldinfo = + set_orig_fieldinfo = Cil_datatype.Fieldinfo.Hashtbl.replace orig_fieldinfos; set_orig_model_info = Cil_datatype.Model_info.Hashtbl.replace orig_model_infos; - set_orig_logic_var = Cil_datatype.Logic_var.Hashtbl.replace orig_logic_vars; - set_orig_kernel_function = - Cil_datatype.Kf.Hashtbl.replace orig_kernel_functions; - set_orig_fundec = - (fun x y -> Cil_datatype.Varinfo.Hashtbl.replace orig_fundecs x.svar y); + set_orig_logic_var = temp_set_orig_logic_var; + set_orig_kernel_function = temp_set_orig_kernel_function; + set_orig_fundec = temp_set_orig_fundec; iter_visitor_varinfo = (fun f -> Cil_datatype.Varinfo.Hashtbl.iter f varinfos); iter_visitor_compinfo = @@ -1491,6 +1690,14 @@ Cil_datatype.Varinfo.Hashtbl.fold f fundecs i); } +let copy_visit = copy_visit_gen false + +let refresh_visit = copy_visit_gen true + +let visitor_tbl = Hashtbl.create 5 + +let register_behavior_extension name ext = Hashtbl.add visitor_tbl name ext + (* sm/gn: cil visitor interface for traversing Cil trees. *) (* Use visitCilStmt and/or visitCilFile to use this. *) (* Some of the nodes are changed in place if the children are changed. Use @@ -2453,6 +2660,10 @@ let s' = visitCilLogicLabel vis s in let t' = vTerm t in if t' != t || s != s' then Pinitialized (s',t') else p + | Pdangling (s,t) -> + let s' = visitCilLogicLabel vis s in + let t' = vTerm t in + if t' != t || s != s' then Pdangling (s',t') else p | Pseparated seps -> let seps' = mapNoCopy vTerm seps in if seps' != seps then Pseparated seps' else p @@ -2533,9 +2744,18 @@ b.b_extended <- mapNoCopy (visitCilExtended vis) b.b_extended; b -and visitCilExtended vis (s,id,p as orig) = +and visitCilExtended vis (s,i,p as orig) = + let visit = + try Hashtbl.find visitor_tbl s + with Not_found -> (fun _ _ -> DoChildren) + in + let pre = i,p in + let (i, p as res) = doVisitCil vis id (visit vis) childrenCilExtended pre in + if res == pre then orig else (s,i,p) + +and childrenCilExtended vis (i,p as orig) = let r = mapNoCopy (visitCilIdPredicate vis) p in - if r == p then orig else (s,id,r) + if r == p then orig else (i,r) and visitCilPredicates vis ps = mapNoCopy (visitCilIdPredicate vis) ps @@ -2676,7 +2896,8 @@ if l' != l then Daxiomatic(id,l',loc) else a and visitCilCodeAnnotation vis ca = - doVisitCil vis id vis#vcode_annot childrenCodeAnnot ca + doVisitCil + vis vis#behavior.ccode_annotation vis#vcode_annot childrenCodeAnnot ca and childrenCodeAnnot vis ca = let vPred p = visitCilPredicateNamed vis p in @@ -2716,7 +2937,7 @@ and visitCilExpr (vis: cilVisitor) (e: exp) : exp = let oldLoc = CurrentLoc.get () in CurrentLoc.set e.eloc; - let res = doVisitCil vis id vis#vexpr childrenExp e in + let res = doVisitCil vis vis#behavior.cexpr vis#vexpr childrenExp e in CurrentLoc.set oldLoc; res and childrenExp (vis: cilVisitor) (e: exp) : exp = @@ -2973,6 +3194,23 @@ | Block b -> let b' = fBlock b in if b' != b then Block b' else s.skind + | Throw (e,loc) -> + let visit (e,t as exc) = + let e' = fExp e in + let t' = visitCilType vis t in + if e != e' || t != t' then (e',t') else exc + in + let e' = optMapNoCopy visit e in + if e != e' then Throw (e,loc) else s.skind + | TryCatch (b,l,loc) -> + let b' = fBlock b in + let visit (v,b as catch) = + let v' = visitCilCatch_binder vis v in + let b' = fBlock b in + if v != v' || b != b' then (v', b') else catch + in + let l' = mapNoCopy visit l in + if b != b' || l != l' then TryCatch (b', l',loc) else s.skind | TryFinally (b, h, l) -> let b' = fBlock b in let h' = fBlock h in @@ -3011,8 +3249,18 @@ if labels' != s.labels then s.labels <- labels'; s - - + and visitCilCatch_binder vis cb = + match cb with + | Catch_exn (v,l) -> + let visit_one_conversion (v, b as conv) = + let v' = visitCilVarDecl vis v in + let b' = visitCilBlock vis b in + if v != v' || b != b' then (v', b') else conv + in + let v' = visitCilVarDecl vis v in + let l' = mapNoCopy visit_one_conversion l in + if v != v' || l != l' then Catch_exn(v',l') else cb + | Catch_all -> cb and visitCilBlock (vis: cilVisitor) (b: block) : block = doVisitCil vis vis#behavior.cblock vis#vblock childrenBlock b and childrenBlock (vis: cilVisitor) (b: block) : block = @@ -3092,10 +3340,15 @@ in CurrentLoc.set oldloc; res and childrenVarDecl (vis : cilVisitor) (v : varinfo) : varinfo = + (* in case of refresh visitor, the associated new logic var has a different + id. We must visit the original logic var associated to it. *) + let visit_orig_var_assoc lv = + let o = vis#behavior.get_original_logic_var lv in + visitCilLogicVarDecl vis o + in v.vtype <- visitCilType vis v.vtype; v.vattr <- visitCilAttributes vis v.vattr; - v.vlogic_var_assoc <- - optMapNoCopy (visitCilLogicVarDecl vis) v.vlogic_var_assoc; + v.vlogic_var_assoc <- optMapNoCopy visit_orig_var_assoc v.vlogic_var_assoc; v and visitCilVarUse vis v = @@ -3200,8 +3453,8 @@ if debugVisit then Kernel.feedback "Visiting function %s" f.svar.vname ; assertEmptyQueue vis; vis#set_current_func f; + (* update fundec tables *) let f = vis#behavior.memo_fundec f in - f.svar <- vis#behavior.memo_varinfo f.svar; (* hit the function name *) let f = doVisitCil vis id (* copy has already been done *) vis#vfunc childrenFunction f @@ -3218,7 +3471,17 @@ f and childrenFunction (vis : cilVisitor) (f : fundec) : fundec = - f.svar <- visitCilVarDecl vis f.svar; (* hit the function name *) + (* we have already made a copy of the svar, but not visited it. + Use the original variable as argument of visitCilVarDecl, + update fundec table in case the vid gets changed. *) + let v = vis#behavior.get_original_varinfo f.svar in + let nv = visitCilVarDecl vis v in + if not (Cil_datatype.Varinfo.equal nv f.svar) then begin + Kernel.fatal + "Visiting the varinfo declared for function %a changes its id." + Cil_datatype.Varinfo.pretty nv + end; + f.svar <- nv; (* hit the function name *) (* visit local declarations *) f.slocals <- mapNoCopy (visitCilVarDecl vis) f.slocals; (* visit the formals *) @@ -3240,12 +3503,14 @@ f let childrenFieldInfo vis fi = - fi.fcomp <- vis#behavior.get_compinfo fi.fcomp; + (* already done at copy creation *) + (* fi.fcomp <- vis#behavior.get_compinfo fi.fcomp; *) fi.ftype <- visitCilType vis fi.ftype; fi.fattr <- visitCilAttributes vis fi.fattr; fi let visitCilFieldInfo vis f = + let f = vis#behavior.get_original_fieldinfo f in doVisitCil vis vis#behavior.memo_fieldinfo vis#vfieldinfo childrenFieldInfo f let childrenCompInfo vis comp = @@ -3353,14 +3618,6 @@ let prefixLen = String.length prefix in String.length s >= prefixLen && String.sub s 0 prefixLen = prefix - -(* The next compindo identifier to use. Counts up. *) -let nextCompinfoKey = - let module M = - State_builder.SharedCounter(struct let name = "compinfokey" end) - in - M.next - let bytesSizeOfInt (ik: ikind): int = match ik with | IChar | ISChar | IUChar | IBool -> 1 @@ -3389,15 +3646,19 @@ else if s = theMachine.theMachine.sizeof_longlong then ILongLong else raise Not_found +let uint64_t () = TInt(intKindForSize 8 true,[]) +let uint32_t () = TInt(intKindForSize 4 true,[]) +let uint16_t () = TInt(intKindForSize 2 true,[]) +let int64_t () = TInt(intKindForSize 8 false,[]) +let int32_t () = TInt(intKindForSize 4 false,[]) +let int16_t () = TInt(intKindForSize 2 false,[]) + let floatKindForSize (s:int) = if s = theMachine.theMachine.sizeof_double then FDouble else if s = theMachine.theMachine.sizeof_float then FFloat else if s = theMachine.theMachine.sizeof_longdouble then FLongDouble else raise Not_found -let int32Type () = TInt (intKindForSize 4 false,[]) -let int64Type () = TInt (intKindForSize 4 false,[]) - (** Returns true if and only if the given integer type is signed. *) let isSigned = function | IUChar | IBool @@ -3445,26 +3706,22 @@ let fits = Integer.le min_bound i && Integer.lt i max_strict_bound in if debugTruncation then Kernel.debug "Fits in %a %a : %b@." - !pp_ikind_ref k Datatype.Big_int.pretty i fits; + !pp_ikind_ref k Datatype.Integer.pretty i fits; fits (* Represents an integer as for a given kind. Returns a flag saying whether the value was changed during truncation (because it was too large to fit in k). *) let truncateInteger64 (k: ikind) i = - if debugTruncation then - Kernel.debug "Truncate to %a: %a@." - !pp_ikind_ref k Datatype.Big_int.pretty i; if fitsInInt k i then - i,false + i, false else - begin + let i' = let nrBits = Integer.of_int (8 * (bytesSizeOfInt k)) in let max_strict_bound = Integer.shift_left Integer.one nrBits in let modulo = Integer.pos_rem i max_strict_bound in let signed = isSigned k in - if signed - then + if signed then let max_signed_strict_bound = Integer.shift_right max_strict_bound Integer.one in @@ -3478,8 +3735,11 @@ Integer.add modulo max_strict_bound else modulo - end, - true + in + if debugTruncation then + Kernel.debug ~level:3 "Truncate %a to %a: %a" + Datatype.Integer.pretty i !pp_ikind_ref k Datatype.Integer.pretty i'; + i', true exception Not_representable let intKindForValue i (unsigned: bool) = @@ -3498,21 +3758,28 @@ else if fitsInInt ILongLong i then ILongLong else raise Not_representable -(* Construct an integer constant with possible truncation *) -let kinteger64_repr ~loc (k: ikind) i repr = +(* Construct an integer constant with possible truncation if the kind is not + specified *) +let kinteger64 ~loc ?repr ?kind i = if debugTruncation then - Kernel.debug "kinteger64_repr %a" Datatype.Big_int.pretty i; - let i', truncated = truncateInteger64 k i in - if truncated then - if debugTruncation then - Kernel.debug ~level:3 "Truncating integer %a to %a" - Datatype.Big_int.pretty i Datatype.Big_int.pretty i'; - new_exp ~loc (Const (CInt64(i' , k, repr))) - -let kinteger64 ~loc k i = kinteger64_repr ~loc k i None + Kernel.debug ~level:3 "kinteger64 %a" Datatype.Integer.pretty i; + let kind = match kind with + | None -> + (* compute the best ikind: [int] whenever possible and, if no signed type + is possible, try unsigned long long. *) + if fitsInInt IInt i then IInt + else begin + try intKindForValue i false + with Not_representable as exn -> + if fitsInInt IULongLong i then IULongLong else raise exn + end + | Some k -> k + in + let i', _truncated = truncateInteger64 kind i in + new_exp ~loc (Const (CInt64(i' , kind, repr))) (* Construct an integer of a given kind. *) -let kinteger ~loc (k: ikind) (i: int) = kinteger64 ~loc k (Integer.of_int i) +let kinteger ~loc kind (i: int) = kinteger64 ~loc ~kind (Integer.of_int i) (* Construct an integer. Use only for values that fit on 31 bits *) let integer_constant i = CInt64(Integer.of_int i, IInt, None) @@ -3538,23 +3805,21 @@ (** Given the character c in a (CChr c), sign-extend it to 32 bits. (This is the official way of interpreting character constants, according to ISO C 6.4.4.4.10, which says that character constants are chars cast - to ints) - Returns CInt64(sign-extened c, IInt, None) *) -let charConstToInt (c: char) : constant = + to ints) *) +let charConstToInt c = let c' = Char.code c in - let value = - if c' < 128 - then Integer.of_int c' - else Integer.of_int (c' - 256) - in - CInt64(value, IInt, None) + if c' < 128 + then Integer.of_int c' + else Integer.of_int (c' - 256) +let charConstToIntConstant c = + CInt64(charConstToInt c, IInt, None) let rec isInteger e = match e.enode with | Const(CInt64 (n,_,_)) -> Some n -| Const(CChr c) -> isInteger (dummy_exp (Const (charConstToInt c))) +| Const(CChr c) -> Some (charConstToInt c) | Const(CEnum {eival = v}) -> isInteger v -| CastE(_, e) -> isInteger e +| CastE(_, e) -> isInteger e (* BY: This is really strange... *) | _ -> None let isZero (e: exp) : bool = @@ -3612,6 +3877,13 @@ * positive integers since the lexer takes care of the sign *) let rec toInt base (acc: Integer.t) (idx: int) : Integer.t = let doAcc what = + if Integer.ge what base + then + Kernel.fatal ~current:true + "Invalid digit %a in integer constant '%s' in base %a." + (Integer.pretty ~hexa:false) what + str + (Integer.pretty ~hexa:false) base; let acc' = Integer.add what (Integer.mul base acc) in toInt base acc' (idx + 1) @@ -3650,23 +3922,20 @@ { term_node = TConst (Integer (i,Some str)) ; term_loc = loc; term_name = []; term_type = Linteger;} -let parseIntExp ~loc (str: string) : exp = +let parseIntExp ~loc repr = try - let i,kinds = parseIntAux str in - let res = + let i,kinds = parseIntAux repr in let rec loop = function | k::rest -> if fitsInInt k i then (* i fits in the current type. *) - kinteger64_repr ~loc k i (Some str) + kinteger64 ~loc ~repr ~kind:k i else loop rest | [] -> - Kernel.fatal ~source:(fst loc) "Cannot represent the integer %s" str + Kernel.fatal ~source:(fst loc) "Cannot represent the integer %s" repr in loop kinds - in - res with Failure "" as e -> - Kernel.warning "int_of_string %s (%s)\n" str (Printexc.to_string e); + Kernel.warning "int_of_string %s (%s)\n" repr (Printexc.to_string e); zero ~loc let mkStmtCfg ~before ~(new_stmtkind:stmtkind) ~(ref_stmt:stmt) : stmt = @@ -3731,67 +4000,6 @@ let dummyInstr = Asm([], ["dummy statement!!"], [], [], [], [], Location.unknown) let dummyStmt = mkStmt (Instr dummyInstr) - - (** Get the full name of a comp *) - let compFullName comp = - (if comp.cstruct then "struct " else "union ") ^ comp.cname - - - let missingFieldName = "" (* "___missing_field_name"*) - - (** Creates a (potentially recursive) composite type. Make sure you add a - * GTag for it to the file! **) - let mkCompInfo - (isstruct: bool) - (n: string) - ?(norig=n) - (* fspec is a function that when given a forward - * representation of the structure type constructs the type of - * the fields. The function can ignore this argument if not - * constructing a recursive type. *) - (mkfspec: compinfo -> (string * typ * int option * attribute list * - location) list) - (a: attribute list) : compinfo = - - (* make a new name for anonymous structs *) - if n = "" then Kernel.fatal "mkCompInfo: missing structure name\n" ; - (* Make a new self cell and a forward reference *) - let comp = - { cstruct = isstruct; - corig_name = norig; - cname = n; - ckey = nextCompinfoKey (); - cfields = []; (* fields will be added afterwards. *) - cattr = a; - creferenced = false; - (* Make this compinfo undefined by default *) - cdefined = false; } - in - let flds = - List.map (fun (fn, ft, fb, fa, fl) -> - { fcomp = comp; - ftype = ft; - forig_name = fn; - fname = fn; - fbitfield = fb; - fattr = fa; - floc = fl; - faddrof = false; - fsize_in_bits = None; - foffset_in_bits = None; - fpadding_in_bits = None; - }) (mkfspec comp) in - comp.cfields <- flds; - if flds <> [] then comp.cdefined <- true; - comp - - (** Make a copy of a compinfo, changing the name and the key *) - let copyCompInfo (ci: compinfo) (n: string) : compinfo = - let ci' = {ci with cname = n; ckey = nextCompinfoKey (); } in - (* Copy the fields and set the new pointers to parents *) - ci'.cfields <- List.map (fun f -> {f with fcomp = ci'}) ci'.cfields; - ci' - let rec unrollTypeDeep (t: typ) : typ = let rec withAttrs (al: attributes) (t: typ) : typ = match t with @@ -3833,12 +4041,12 @@ let mkWhile ~(guard:exp) ~(body: stmt list) : stmt list = (* Do it like this so that the pretty printer recognizes it *) - [ mkStmt + [ mkStmt ~valid_sid:true (Loop ([], mkBlock - (mkStmt + (mkStmt ~valid_sid:true (If(guard, - mkBlock [ mkEmptyStmt () ], + mkBlock [], mkBlock [ mkStmt (Break guard.eloc)], guard.eloc)) :: body), guard.eloc, None, None)) ] @@ -3847,28 +4055,22 @@ (start @ (mkWhile guard (body @ next))) - let mkForIncr ~(iter : varinfo) ~(first: exp) ~stopat:(past: exp) ~(incr: exp) + let mkForIncr ~(iter : varinfo) ~(first: exp) ~(stopat: exp) ~(incr: exp) ~(body: stmt list) : stmt list = (* See what kind of operator we need *) - let compop, nextop = - match unrollTypeSkel iter.vtype with - TPtr _ -> Lt, PlusPI - | _ -> Lt, PlusA + let nextop = match unrollTypeSkel iter.vtype with + | TPtr _ -> PlusPI + | _ -> PlusA in mkFor - [ mkStmt (Instr (Set (var iter, first, first.eloc))) ] - (new_exp ~loc:past.eloc - (BinOp(compop, new_exp ~loc:past.eloc (Lval(var iter)), past, intType))) - [ mkStmt - (Instr - (Set - (var iter, - (new_exp ~loc:incr.eloc - (BinOp(nextop, - new_exp ~loc:past.eloc (Lval(var iter)), - incr, - iter.vtype))), - incr.eloc)))] + [ mkStmtOneInstr ~valid_sid:true (Set (var iter, first, first.eloc)) ] + (new_exp ~loc:stopat.eloc (BinOp(Lt, evar iter, stopat, intType))) + [ mkStmtOneInstr ~valid_sid:true + (Set + (var iter, + (new_exp ~loc:incr.eloc + (BinOp(nextop, evar iter, incr, iter.vtype))), + incr.eloc))] body let block_from_unspecified_sequence us = @@ -3916,8 +4118,7 @@ with Not_found -> false in let stom, rest = List.partition isstoragemod al in - if not theMachine.msvcMode then - stom, rest + if not (msvcMode ()) then stom, rest else (* Put back the declspec. Put it without the leading __ since these will * be added later *) @@ -3959,6 +4160,11 @@ (TInt _ | TEnum _) -> true | _ -> false + let isIntegralOrPointerType t = + match unrollTypeSkel t with + | TInt _ | TEnum _ | TPtr _ -> true + | _ -> false + let isLogicIntegralType t = match t with | Ctype t -> isIntegralType t @@ -4043,7 +4249,7 @@ let typeOf_array_elem t = match unrollType t with | TArray (ty_elem, _, _, _) -> ty_elem - | _ -> assert false + | _ -> Kernel.fatal "Not an array type %a" !pp_typ_ref t (**** Compute the type of an expression ****) let rec typeOf (e: exp) : typ = @@ -4067,7 +4273,9 @@ | Const(CEnum {eival=v}) -> typeOf v - | Lval(lv) -> typeOfLval lv + (* l-values used as r-values lose their qualifiers (C99 6.3.2.1:2) *) + | Lval(lv) -> type_remove_qualifier_attributes (typeOfLval lv) + | SizeOf _ | SizeOfE _ | SizeOfStr _ -> theMachine.typeOfSizeOf | AlignOf _ | AlignOfE _ -> theMachine.typeOfSizeOf | UnOp (_, _, t) -> t @@ -4214,7 +4422,17 @@ | Larrow _ -> Kernel.fatal ~current:true "typeTermOffset: Field on a function type" in Logic_const.transform_element elt_type basetyp - (**** Look at at the presence of an attribute in a type ****) + (**** Look for the presence of an attribute in a type ****) + + let typeHasAttribute attr typ = hasAttribute attr (typeAttrs typ) + + let rec typeHasQualifier attr typ = + match typ with + | TNamed (t, a) -> + hasAttribute attr a || typeHasQualifier attr t.ttype + | TArray (t, _, _, a) -> + typeHasQualifier attr t || (* ill-formed type *) hasAttribute attr a + | _ -> hasAttribute attr (typeAttrs typ) let typeHasAttributeDeep a (ty:typ): bool = let f attrs = if hasAttribute a attrs then raise Exit in @@ -4372,53 +4590,36 @@ (fun sofar f -> (* Bitfields with zero width do not contribute to the alignment in * GCC *) - if not theMachine.msvcMode && f.fbitfield = Some 0 then sofar else + if not (msvcMode ()) && f.fbitfield = Some 0 then sofar else max sofar (alignOfField f)) 1 fields (* These are some error cases *) - | TFun _ when not theMachine.msvcMode -> + | TFun _ when not (msvcMode ()) -> theMachine.theMachine.alignof_fun | TFun _ as t -> raise (SizeOfError ("Undefined sizeof on a function.", t)) | TVoid _ as t -> raise (SizeOfError ("Undefined sizeof(void).", t)) in - match filterAttributes "aligned" (typeAttrs t) with - [] -> - (* no __aligned__ attribute, so get the default alignment *) - alignOfType () - | _ when !ignoreAlignmentAttrs -> - Kernel.warning "ignoring recursive align attributes on %a" - !pp_typ_ref t; - alignOfType () - | (Attr(_, [a]) as at)::rest -> begin - if rest <> [] then - Kernel.warning "ignoring duplicate align attributes on %a" - !pp_typ_ref t; - match intOfAttrparam a with - Some n -> n - | None -> - Kernel.warning "alignment attribute \"%a\" not understood on %a" - !pp_attribute_ref at !pp_typ_ref t; - alignOfType () - end - | Attr(_, [])::rest -> - (* aligned with no arg means a power of two at least as large as - any alignment on the system.*) - if rest <> [] then - Kernel.warning "ignoring duplicate align attributes on %a" - !pp_typ_ref t; - theMachine.theMachine.alignof_aligned - | at::_ -> - Kernel.warning "alignment attribute \"%a\" not understood on %a" - !pp_attribute_ref at !pp_typ_ref t; - alignOfType () + process_aligned_attribute + (fun fmt -> !pp_typ_ref fmt t) + (typeAttrs t) alignOfType -(* alignment of a possibly-packed struct field. *) +(* alignment of a possibly-packed or aligned struct field. *) and alignOfField (fi: fieldinfo) = let fieldIsPacked = hasAttribute "packed" fi.fattr - || hasAttribute "packed" fi.fcomp.cattr in - if fieldIsPacked then 1 - else bytesAlignOf fi.ftype + || hasAttribute "packed" fi.fcomp.cattr + in + if fieldIsPacked then begin + if hasAttribute "aligned" fi.fattr then + Kernel.warning + "packed attribute overrules aligned attributes for file %s" + fi.fname ; + 1 + end else + process_aligned_attribute + (fun fmt -> Format.fprintf fmt "field %s" fi.fname) + fi.fattr + (fun () -> bytesAlignOf fi.ftype) -and intOfAttrparam (a:attrparam) : int option = +and intOfAttrparam (a:attrparam) : int option = let rec doit a : int = match a with | AInt(n) -> Integer.to_int n @@ -4445,14 +4646,52 @@ with Failure _ | SizeOfError _ -> (* Can't compile *) ignoreAlignmentAttrs := false; None +and process_aligned_attribute (pp:Format.formatter->unit) attrs default_align = + match filterAttributes "aligned" attrs with + | [] -> + (* no __aligned__ attribute, so get the default alignment *) + default_align () + | _ when !ignoreAlignmentAttrs -> + Kernel.warning "ignoring recursive align attributes on %t" + pp; + default_align () + | (Attr(_, [a]) as at)::rest -> begin + if rest <> [] then + Kernel.warning "ignoring duplicate align attributes on %t" + pp; + match intOfAttrparam a with + Some n -> n + | None -> + Kernel.warning "alignment attribute \"%a\" not understood on %t" + !pp_attribute_ref at pp; + default_align () + end + | Attr(_, [])::rest -> + (* aligned with no arg means a power of two at least as large as + any alignment on the system.*) + if rest <> [] then + Kernel.warning "ignoring duplicate align attributes on %t" + pp; + theMachine.theMachine.alignof_aligned + | at::_ -> + Kernel.warning "alignment attribute \"%a\" not understood on %t" + !pp_attribute_ref at pp; + default_align () + + (* Computation of the offset of the field [fi], given the information [sofar] + computed for the previous fields. [last] indicates that we are considering + the last field of the struct. Set to [false] by default for unions. *) + and offsetOfFieldAcc ?(last=false) ~(fi: fieldinfo) ~(sofar: offsetAcc) : offsetAcc = + if msvcMode () then offsetOfFieldAcc_MSVC last fi sofar + else offsetOfFieldAcc_GCC last fi sofar (* GCC version *) (* Does not use the sofar.oaPrevBitPack *) -and offsetOfFieldAcc_GCC (fi: fieldinfo) (sofar: offsetAcc) : offsetAcc = +and offsetOfFieldAcc_GCC last (fi: fieldinfo) (sofar: offsetAcc) : offsetAcc = (* field type *) let ftype = unrollType fi.ftype in let ftypeAlign = 8 * alignOfField fi in - let ftypeBits = bitsSizeOf ftype in + let ftypeBits = (if last then bitsSizeOfEmptyArray else bitsSizeOf) ftype in match ftype, fi.fbitfield with (* A width of 0 means that we must end the current packing. It seems that * GCC pads only up to the alignment boundary for the type of this field. @@ -4494,12 +4733,12 @@ } (* MSVC version *) - and offsetOfFieldAcc_MSVC (fi: fieldinfo) + and offsetOfFieldAcc_MSVC last (fi: fieldinfo) (sofar: offsetAcc) : offsetAcc = (* field type *) let ftype = unrollType fi.ftype in let ftypeAlign = 8 * alignOfField fi in - let ftypeBits = bitsSizeOf ftype in + let ftypeBits = (if last then bitsSizeOfEmptyArray else bitsSizeOf) ftype in match ftype, fi.fbitfield, sofar.oaPrevBitPack with (* Ignore zero-width bitfields that come after non-bitfields *) | TInt (_ikthis, _), Some 0, None -> @@ -4516,7 +4755,7 @@ if sofar.oaFirstFree = packstart then packstart else packstart + wdpack in - offsetOfFieldAcc_MSVC fi + offsetOfFieldAcc_MSVC last fi { oaFirstFree = addTrailing firstFree ftypeAlign; oaLastFieldStart = sofar.oaLastFieldStart; oaLastFieldWidth = sofar.oaLastFieldWidth; @@ -4551,7 +4790,7 @@ if sofar.oaFirstFree = packstart then packstart else packstart + wdpack in - offsetOfFieldAcc_MSVC fi + offsetOfFieldAcc_MSVC last fi { oaFirstFree = addTrailing firstFree ftypeAlign; oaLastFieldStart = sofar.oaLastFieldStart; oaLastFieldWidth = sofar.oaLastFieldWidth; @@ -4577,10 +4816,21 @@ | _, Some _, None -> Kernel.fatal ~current:true "offsetAcc" - - and offsetOfFieldAcc ~(fi: fieldinfo) ~(sofar: offsetAcc) : offsetAcc = - if theMachine.msvcMode then offsetOfFieldAcc_MSVC fi sofar - else offsetOfFieldAcc_GCC fi sofar + (** This is a special version of [bitsSizeOf] that accepts empty arrays. + Currently, we only use it for flexible array members *) + and bitsSizeOfEmptyArray typ = + match unrollType typ with + | TArray (_, None, _, _) -> 0 + | TArray (_, Some e, _, _) -> begin + match constFoldToInt e with + | Some i when Integer.is_zero i -> + (* GCC extension. Cabs2Cil currently rewrites all such toplevel arrays as + having size 1. Hence this case can only appear for arrays within + structures *) + 0 + | _ -> bitsSizeOf typ + end + | _ -> bitsSizeOf typ (* The size of a type, in bits. If struct or array then trailing padding is * added *) @@ -4600,7 +4850,7 @@ scache (fun () -> begin (* Empty structs are allowed in msvc mode *) - if not comp.cdefined && not theMachine.msvcMode then begin + if not comp.cdefined && not (msvcMode ()) then begin raise (SizeOfError (Format.sprintf "abstract type '%s'" (compFullName comp), t)) @@ -4620,10 +4870,11 @@ oaPrevBitPack = None; } in let lastoff = - List.fold_left (fun acc fi -> offsetOfFieldAcc ~fi ~sofar:acc) + fold_struct_fields + (fun ~last acc fi -> offsetOfFieldAcc ~last ~fi ~sofar:acc) startAcc comp.cfields in - if theMachine.msvcMode && lastoff.oaFirstFree = 0 && comp.cfields <> [] + if msvcMode () && lastoff.oaFirstFree = 0 && comp.cfields <> [] then (* On MSVC if we have just a zero-width bitfields then the length * is 32 and is not padded *) @@ -4644,9 +4895,9 @@ } in let max = List.fold_left (fun acc fi -> - let lastoff = offsetOfFieldAcc ~fi ~sofar:startAcc in - if lastoff.oaFirstFree > acc then - lastoff.oaFirstFree else acc) 0 comp.cfields in + let lastoff = offsetOfFieldAcc ?last:None ~fi ~sofar:startAcc in + if lastoff.oaFirstFree > acc then + lastoff.oaFirstFree else acc) 0 comp.cfields in (* Add trailing by simulating adding an extra field *) addTrailing max (8 * bytesAlignOf t)) @@ -4671,17 +4922,21 @@ end) | TVoid _ -> 8 * theMachine.theMachine.sizeof_void | TFun _ -> - if not theMachine.msvcMode then + if not (msvcMode ()) then (* On GCC the size of a function is defined *) 8 * theMachine.theMachine.sizeof_fun else raise (SizeOfError ("Undefined sizeof on a function.", t)) | TArray (_, None, _, _) -> - (* it seems that on GCC the size of such an array is 0 *) - (* TODO: msvc case not handled *) - 0 + raise (SizeOfError ("Size of array without number of elements.", t)) + (* Iterator on the fields of a structure, with additional information about + having reached the last field (for flexible member arrays) *) + and fold_struct_fields f acc l = match l with + | [] -> acc + | [fi_last] -> f ~last:true acc fi_last + | fi :: (_ :: _ as q) -> fold_struct_fields f (f ~last:false acc fi) q and addTrailing nrbits roundto = (nrbits + roundto - 1) land (lnot (roundto - 1)) @@ -4698,20 +4953,15 @@ NoOffset -> start, width | Index(e, off) -> begin let ei = - match isInteger (constFold true e) with + match constFoldToInt e with | Some i -> Integer.to_int i | None -> raise (SizeOfError ("Index is not constant", baset)) in - let bt = - match unrollType baset with - | TArray(bt, _, _, _) -> bt - | t -> - Kernel.fatal ~current:true "bitsOffset: Index on a non-array %a" !pp_typ_ref t - in + let bt = typeOf_array_elem baset in let bitsbt = bitsSizeOf bt in loopOff bt bitsbt (start + ei * bitsbt) off end - | Field(f, off) when not f.fcomp.cstruct -> + | Field(f, off) when not f.fcomp.cstruct (* union *) -> if check_invariants then assert (match unrollType baset with | TComp (ci, _, _) -> ci == f.fcomp @@ -4719,20 +4969,20 @@ (* All union fields start at offset 0 *) loopOff f.ftype (bitsSizeOf f.ftype) start off - | Field(f, off) -> + | Field(f, off) (* struct *) -> if check_invariants then assert (match unrollType baset with | TComp (ci, _, _) -> ci == f.fcomp | _ -> false); if f.foffset_in_bits = None then begin - let aux acc fi = - let acc' = offsetOfFieldAcc ~fi ~sofar:acc in + let aux ~last acc fi = + let acc' = offsetOfFieldAcc ~last ~fi ~sofar:acc in fi.fsize_in_bits <- Some acc'.oaLastFieldWidth; fi.foffset_in_bits <- Some acc'.oaLastFieldStart; acc' in ignore ( - List.fold_left aux + fold_struct_fields aux { oaFirstFree = 0; oaLastFieldStart = 0; oaLastFieldWidth = 0; @@ -4770,8 +5020,8 @@ match unop with Neg -> let repr = Extlib.opt_map (fun s -> "-" ^ s) repr in - kinteger64_repr ~loc tk (Integer.neg i) repr - | BNot -> kinteger64 ~loc tk (Integer.lognot i) + kinteger64 ~loc ?repr ~kind:tk (Integer.neg i) + | BNot -> kinteger64 ~loc ~kind:tk (Integer.lognot i) | LNot -> if Integer.equal i Integer.zero then one ~loc else zero ~loc @@ -4780,7 +5030,7 @@ with Not_found -> e end (* Characters are integers *) - | Const(CChr c) -> new_exp ~loc (Const(charConstToInt c)) + | Const(CChr c) -> new_exp ~loc (Const(charConstToIntConstant c)) | Const(CEnum {eival = v}) -> constFold machdep v | Const (CReal _ | CWStr _ | CStr _ | CInt64 _) -> e (* a constant *) | SizeOf t when machdep -> begin @@ -4799,7 +5049,7 @@ (* The alignment of an expression is not always the alignment of its * type. I know that for strings this is not true *) match e.enode with - Const (CStr _) when not theMachine.msvcMode -> + | Const (CStr _) when not (msvcMode ()) -> kinteger ~loc theMachine.kindOfSizeOf theMachine.theMachine.alignof_str (* For an array, it is the alignment of the array ! *) @@ -4808,6 +5058,7 @@ | AlignOfE _ | AlignOf _ | SizeOfStr _ | SizeOfE _ | SizeOf _ -> e (* Depends on machdep. Do not evaluate in this case*) + (* Special case to handle the C macro 'offsetof' *) | CastE(it, { enode = AddrOf (Mem ({enode = CastE(TPtr(bt, _), z)}), off)}) when machdep && isZero z -> begin @@ -4832,8 +5083,8 @@ when (dropAttributes ["const"] a) = [] -> if debugConstFold then Kernel.debug "ConstFold to %a : %a@." - !pp_ikind_ref nk Datatype.Big_int.pretty i; - kinteger64 ~loc nk i + !pp_ikind_ref nk Datatype.Integer.pretty i; + kinteger64 ~loc ~kind:nk i | _, _ -> new_exp ~loc (CastE (t, e)) end | Lval lv -> new_exp ~loc (Lval (constFoldLval machdep lv)) @@ -4863,13 +5114,13 @@ let rec mkInt e = let loc = e.eloc in match e.enode with - Const(CChr c) -> new_exp ~loc (Const(charConstToInt c)) + | Const(CChr c) -> new_exp ~loc (Const(charConstToIntConstant c)) | Const(CEnum {eival = v}) -> mkInt v | CastE(TInt (ik, ta), e) -> begin let exp = mkInt e in match exp.enode with Const(CInt64(i, _, _)) -> - kinteger64 ~loc ik i + kinteger64 ~loc ~kind:ik i | _ -> {exp with enode = CastE(TInt(ik, ta), exp)} end | _ -> e @@ -4909,12 +5160,12 @@ | MinusPI, _, Const(CInt64(z,_,_)) when Integer.equal z Integer.zero -> e1'' | PlusA, Const(CInt64(i1,ik1,_)),Const(CInt64(i2,ik2,_)) when ik1 = ik2 -> - kinteger64 ~loc tk (Integer.add i1 i2) + kinteger64 ~loc ~kind:tk (Integer.add i1 i2) | MinusA, Const(CInt64(i1,ik1,_)),Const(CInt64(i2,ik2,_)) when ik1 = ik2 -> - kinteger64 ~loc tk (Integer.sub i1 i2) + kinteger64 ~loc ~kind:tk (Integer.sub i1 i2) | Mult, Const(CInt64(i1,ik1,_)), Const(CInt64(i2,ik2,_)) when ik1 = ik2 -> - kinteger64 ~loc tk (Integer.mul i1 i2) + kinteger64 ~loc ~kind:tk (Integer.mul i1 i2) | Mult, Const(CInt64(z,_,_)), _ when Integer.equal z Integer.zero -> zero ~loc | Mult, Const(CInt64(one,_,_)), _ @@ -4925,36 +5176,36 @@ when Integer.equal one Integer.one -> e1'' | Div, Const(CInt64(i1,ik1,_)),Const(CInt64(i2,ik2,_)) when ik1 = ik2 -> begin - try kinteger64 ~loc tk (Integer.div i1 i2) + try kinteger64 ~loc ~kind:tk (Integer.div i1 i2) with Division_by_zero -> new_exp ~loc (BinOp(bop, e1', e2', tres)) end | Div, Const(CInt64(i1,ik1,_)),Const(CInt64(i2,ik2,_)) when bytesSizeOfInt ik1 = bytesSizeOfInt ik2 -> begin - try kinteger64 ~loc tk (Integer.div i1 i2) + try kinteger64 ~loc ~kind:tk (Integer.div i1 i2) with Division_by_zero -> new_exp ~loc (BinOp(bop, e1', e2', tres)) end | Div, _, Const(CInt64(one,_,_)) when Integer.equal one Integer.one -> e1'' | Mod, Const(CInt64(i1,ik1,_)),Const(CInt64(i2,ik2,_)) when ik1 = ik2 -> begin - try kinteger64 ~loc tk (Integer.rem i1 i2) + try kinteger64 ~loc ~kind:tk (Integer.rem i1 i2) with Division_by_zero -> new_exp ~loc (BinOp(bop, e1', e2', tres)) end | BAnd, Const(CInt64(i1,ik1,_)),Const(CInt64(i2,ik2,_)) when ik1 = ik2 -> - kinteger64 ~loc tk (Integer.logand i1 i2) + kinteger64 ~loc ~kind:tk (Integer.logand i1 i2) | BAnd, Const(CInt64(z,_,_)), _ when Integer.equal z Integer.zero -> zero ~loc | BAnd, _, Const(CInt64(z,_,_)) when Integer.equal z Integer.zero -> zero ~loc | BOr, Const(CInt64(i1,ik1,_)),Const(CInt64(i2,ik2,_)) when ik1 = ik2 -> - kinteger64 ~loc tk (Integer.logor i1 i2) + kinteger64 ~loc ~kind:tk (Integer.logor i1 i2) | BOr, _, _ when isZero e1' -> e2' | BOr, _, _ when isZero e2' -> e1' | BXor, Const(CInt64(i1,ik1,_)),Const(CInt64(i2,ik2,_)) when ik1 = ik2 -> - kinteger64 ~loc tk (Integer.logxor i1 i2) + kinteger64 ~loc ~kind:tk (Integer.logxor i1 i2) | Shiftlt, Const(CInt64(i1,_ik1,_)),Const(CInt64(i2,_,_)) when shiftInBounds i2 -> - kinteger64 ~loc tk (Integer.shift_left i1 i2) + kinteger64 ~loc ~kind:tk (Integer.shift_left i1 i2) | Shiftlt, Const(CInt64(z,_,_)), _ when Integer.equal z Integer.zero -> zero ~loc | Shiftlt, _, Const(CInt64(z,_,_)) @@ -4962,10 +5213,10 @@ | Shiftrt, Const(CInt64(i1,ik1,_)),Const(CInt64(i2,_,_)) when shiftInBounds i2 -> if isunsigned ik1 then - kinteger64 ~loc tk + kinteger64 ~loc ~kind:tk (Integer.shift_right_logical i1 i2) else - kinteger64 ~loc tk (Integer.shift_right i1 i2) + kinteger64 ~loc ~kind:tk (Integer.shift_right i1 i2) | Shiftrt, Const(CInt64(z,_,_)), _ when Integer.equal z Integer.zero -> zero ~loc | Shiftrt, _, Const(CInt64(z,_,_)) @@ -5009,7 +5260,19 @@ end else new_exp ~loc (BinOp(bop, e1', e2', tres)) -let () = pbitsSizeOf := bitsSizeOf +and constFoldToInt ?(machdep=true) e = + match (constFold machdep e).enode with + | Const(CInt64(c,_,_)) -> Some c + | CastE (typ, e) when machdep && isPointerType typ -> begin + (* Those casts are left left by constFold *) + match constFoldToInt ~machdep e with + | None -> None + | Some i as r -> if fitsInInt theMachine.upointKind i then r else None + end + | _ -> None + + +let () = constfoldtoint := constFoldToInt ~machdep:true let intTypeIncluded kind1 kind2 = let bitsize1 = bitsSizeOfInt kind1 in @@ -5064,26 +5327,42 @@ (CInt64(Integer.of_int64 value,IULongLong,orig_rep)),(TInt(IULongLong,[])) end - (*/CEA*) + let invalidStmt = mkStmt (Instr (Skip Location.unknown)) + module Frama_c_builtins = + State_builder.Hashtbl + (Datatype.String.Hashtbl) + (Cil_datatype.Varinfo) + (struct + let name = "Cil.Frama_c_Builtins" + let dependencies = [] + let size = 3 + end) -let smallest_kind ~signed ~bits_size = - try - List.find - (fun kind -> isSigned kind=signed && bitsSizeOfInt kind = bits_size) - [IBool; (* This list is ordered by size of types *) - IChar; ISChar; IUChar; - IShort; IUShort; - IInt; IUInt; - ILong; IULong; - ILongLong; IULongLong] - with Not_found -> Kernel.fatal ~current:true "Could not find a%signed type of size %d" - (if signed then " " else "n un") bits_size - -let uint64_t () = TInt(smallest_kind ~signed:false ~bits_size:64,[]) -let uint32_t () = TInt(smallest_kind ~signed:false ~bits_size:32,[]) -let uint16_t () = TInt(smallest_kind ~signed:false ~bits_size:16,[]) + let () = dependency_on_ast Frama_c_builtins.self + + let is_builtin v = hasAttribute "FC_BUILTIN" v.vattr + + let is_unused_builtin v = is_builtin v && not v.vreferenced - let invalidStmt = mkStmt (Instr (Skip Location.unknown)) + +(* [VP] Should we projectify this ?*) +let special_builtins_table = ref Datatype.String.Set.empty +let special_builtins = Queue.create () + +let is_special_builtin s = + Queue.fold (fun res f -> res || f s) false special_builtins + +let add_special_builtin_family f = Queue.add f special_builtins + +let add_special_builtin s = + special_builtins_table := Datatype.String.Set.add s !special_builtins_table + +let () = add_special_builtin_family + (fun s -> Datatype.String.Set.mem s !special_builtins_table) + +let () = List.iter add_special_builtin + [ "__builtin_stdarg_start"; "__builtin_va_arg"; + "__builtin_va_start"; "__builtin_expect"; "__builtin_next_arg"; ] module Builtin_functions = State_builder.Hashtbl @@ -5095,19 +5374,15 @@ let size = 49 end) + let add_builtin ?(prefix="__builtin_") s t l b = + Builtin_functions.add (prefix ^ s) (t, l, b) + let () = registerAttribute "FC_BUILTIN" (AttrName true) (* Initialize the builtin functions after the machine has been initialized. *) let initGccBuiltins () : unit = - if not (TheMachine.is_computed ()) then - Kernel.fatal ~current:true "Call initCIL before initGccBuiltins" ; - if Builtin_functions.length () <> 0 then - Kernel.fatal ~current:true "builtins already initialized." ; - (* See if we have builtin_va_list *) - let hasbva = theMachine.theMachine.has__builtin_va_list in let sizeType = theMachine.upointType in - let add s t l b = Builtin_functions.add ("__builtin_" ^ s) (t, l, b) in - + let add = add_builtin in add "__fprintf_chk" intType (* first argument is really FILE*, not void*, but we don't want to build in @@ -5126,7 +5401,8 @@ voidPtrType [ voidPtrType; intType; sizeType; sizeType ] false; add "__printf_chk" intType [ intType; charConstPtrType ] true; add "__snprintf_chk" - intType [ charPtrType; sizeType; intType; sizeType; charConstPtrType ] true; + intType [ charPtrType; sizeType; intType; sizeType; charConstPtrType ] + true; add "__sprintf_chk" intType [ charPtrType; intType; sizeType; charConstPtrType ] true; add "__stpcpy_chk" @@ -5176,11 +5452,14 @@ add "atan2l" longDoubleType [ longDoubleType; longDoubleType ] false; - let int32t = int32Type () in - add "bswap32" int32t [int32t] false; + let uint16t = uint16_t () in + add "bswap16" uint16t [uint16t] false; + + let uint32t = uint32_t () in + add "bswap32" uint32t [uint32t] false; - let int64t = int64Type () in - add "bswap64" int64t [int64t] false; + let uint64t = uint64_t () in + add "bswap64" uint64t [uint64t] false; add "ceil" doubleType [ doubleType ] false; add "ceilf" floatType [ floatType ] false; @@ -5224,6 +5503,10 @@ add "huge_val" doubleType [] false; add "huge_valf" floatType [] false; add "huge_vall" longDoubleType [] false; + add "ia32_lfence" voidType [] false; + add "ia32_mfence" voidType [] false; + add "ia32_sfence" voidType [] false; + add "inf" doubleType [] false; add "inff" floatType [] false; add "infl" longDoubleType [] false; @@ -5261,9 +5544,6 @@ add "nans" doubleType [ charConstPtrType ] false; add "nansf" floatType [ charConstPtrType ] false; add "nansl" longDoubleType [ charConstPtrType ] false; - add "next_arg" - (* When we parse builtin_next_arg we drop the second argument *) - (if hasbva then TBuiltin_va_list [] else voidPtrType) [] false; add "object_size" sizeType [ voidPtrType; intType ] false; add "parity" intType [ uintType ] false; @@ -5319,6 +5599,86 @@ add "unreachable" voidType [ ] false; + let int8_t = Some scharType in + let int16_t = try Some (int16_t ()) with Not_found -> None in + let int32_t = try Some (int32_t ()) with Not_found -> None in + let int64_t = try Some (int64_t ()) with Not_found -> None in + let uint8_t = Some ucharType in + let uint16_t = try Some (uint16_t ()) with Not_found -> None in + let uint32_t = try Some (uint32_t ()) with Not_found -> None in + let uint64_t = try Some (uint64_t ()) with Not_found -> None in + + (* Binary monomorphic versions of atomic builtins *) + let atomic_instances = + [int8_t, "_int8_t"; + int16_t,"_int16_t"; + int32_t,"_int32_t"; + int64_t,"_int64_t"; + uint8_t, "_uint8_t"; + uint16_t,"_uint16_t"; + uint32_t,"_uint32_t"; + uint64_t,"_uint64_t"] + in + let add_sync (typ,name) f = + match typ with + | Some typ -> + add ~prefix:"__sync_" (f^name) typ [ TPtr(typ,[]); typ] true + | None -> () + in + let add_sync f = + List.iter (fun typ -> add_sync typ f) atomic_instances + in + add_sync "fetch_and_add"; + add_sync "fetch_and_sub"; + add_sync "fetch_and_or"; + add_sync "fetch_and_and"; + add_sync "fetch_and_xor"; + add_sync "fetch_and_nand"; + add_sync "add_and_fetch"; + add_sync "sub_and_fetch"; + add_sync "or_and_fetch"; + add_sync "and_and_fetch"; + add_sync "xor_and_fetch"; + add_sync "nand_and_fetch"; + add_sync "lock_test_and_set"; + List.iter (fun (typ,n) -> + match typ with + | Some typ -> + add ~prefix:"" ("__sync_bool_compare_and_swap"^n) + intType + [ TPtr(typ,[]); typ ; typ] + true + | None -> ()) + atomic_instances; + List.iter (fun (typ,n) -> + match typ with + | Some typ -> + add ~prefix:"" ("__sync_val_compare_and_swap"^n) + typ + [ TPtr(typ,[]); typ ; typ] + true + | None -> ()) + atomic_instances; + List.iter (fun (typ,n) -> + match typ with + | Some typ -> + add ~prefix:"" ("__sync_lock_release"^n) + voidType + [ TPtr(typ,[]) ] + true; + | None -> ()) + atomic_instances; + add ~prefix:"" "__sync_synchronize" voidType [] true +;; + +(* Builtins related to va_list. Added to all non-msvc machdeps, because + Cabs2cil supposes they exist. *) + let initVABuiltins () = + let hasbva = theMachine.theMachine.has__builtin_va_list in + let add = add_builtin in + add "next_arg" + (* When we parse builtin_next_arg we drop the second argument *) + (if hasbva then TBuiltin_va_list [] else voidPtrType) [] false; if hasbva then begin add "va_end" voidType [ TBuiltin_va_list [] ] false; add "varargs_start" voidType [ TBuiltin_va_list [] ] false; @@ -5335,51 +5695,22 @@ add "va_copy" voidType [ TBuiltin_va_list []; TBuiltin_va_list [] ] false; end - module Frama_c_builtins = - State_builder.Hashtbl - (Datatype.String.Hashtbl) - (Cil_datatype.Varinfo) - (struct - let name = "Cil.Frama_c_Builtins" - let dependencies = [] - let size = 3 - end) - - let () = add_ast_dependency Frama_c_builtins.self - - let is_builtin v = hasAttribute "FC_BUILTIN" v.vattr - - let is_unused_builtin v = is_builtin v && not v.vreferenced - - -(* [VP] Should we projectify this ?*) -let special_builtins_table = ref Datatype.String.Set.empty -let special_builtins = Queue.create () - -let is_special_builtin s = - Queue.fold (fun res f -> res || f s) false special_builtins - -let add_special_builtin_family f = Queue.add f special_builtins - -let add_special_builtin s = - special_builtins_table := Datatype.String.Set.add s !special_builtins_table - -let () = add_special_builtin_family - (fun s -> Datatype.String.Set.mem s !special_builtins_table) - -let () = List.iter add_special_builtin - [ "__builtin_stdarg_start"; "__builtin_va_arg"; - "__builtin_va_start"; "__builtin_expect"; "__builtin_next_arg"; ] - -(** Construct a hash with the builtins *) let initMsvcBuiltins () : unit = + (** Take a number of wide string literals *) + Builtin_functions.add "__annotation" (voidType, [ ], true) +;; + +let init_builtins () = if not (TheMachine.is_computed ()) then - Kernel.fatal ~current:true "Call initCIL before initMsvcBuiltins" ; + Kernel.fatal ~current:true "You must call initCIL before init_builtins" ; if Builtin_functions.length () <> 0 then - Kernel.fatal ~current:true "builtins already initialized." ; - (** Take a number of wide string literals *) - Builtin_functions.add "__annotation" (voidType, [ ], true); - () + Kernel.fatal ~current:true "Cil builtins already initialized." ; + if msvcMode () then + initMsvcBuiltins () + else begin + initVABuiltins (); + if gccMode () then initGccBuiltins (); + end (** This is used as the location of the prototypes of builtin functions. *) let builtinLoc: location = Location.unknown @@ -5392,10 +5723,7 @@ match c1, c2 with | CEnum e1, CEnum e2 -> e1.einame = e2.einame && e1.eihost.ename = e2.eihost.ename && - (match - isInteger (constFold true e1.eival), - isInteger (constFold true e2.eival) - with + (match constFoldToInt e1.eival, constFoldToInt e2.eival with | Some i1, Some i2 -> Integer.equal i1 i2 | _ -> false) | CInt64 (i1,k1,_), CInt64(i2,k2,_) -> @@ -5554,7 +5882,7 @@ | Some lv -> lv let copyVarinfo (vi: varinfo) (newname: string) : varinfo = - let vi' = copy_with_new_vid vi in + let vi' = Cil_const.copy_with_new_vid vi in vi'.vname <- newname; (match vi.vlogic_var_assoc with None -> () @@ -5575,17 +5903,17 @@ end else current_name - let makeLocal ?(generated=true) ?(formal=false) fdec name typ = + let makeLocal ?(temp=false) ?(formal=false) fdec name typ = (* a helper function *) let name = findUniqueName fdec name in fdec.smaxid <- 1 + fdec.smaxid; - let vi = makeVarinfo ~generated false formal name typ in + let vi = makeVarinfo ~temp false formal name typ in vi (* Make a local variable and add it to a function *) - let makeLocalVar fdec ?scope ?(generated=true) ?(insert = true) name typ = + let makeLocalVar fdec ?scope ?(temp=false) ?(insert = true) name typ = let typ = stripConstLocalType typ in - let vi = makeLocal ~generated fdec name typ in + let vi = makeLocal ~temp fdec name typ in if insert then begin fdec.slocals <- fdec.slocals @ [vi]; @@ -5600,18 +5928,11 @@ let makeTempVar fdec ?insert ?(name = "__cil_tmp") ?descr ?(descrpure = true) typ : varinfo = - let vi = makeLocalVar fdec ?insert name typ in + let vi = makeLocalVar fdec ~temp:true ?insert name typ in vi.vdescr <- descr; vi.vdescrpure <- descrpure; vi - let makePseudoVar = - let counter = ref 0 in - function ty -> - incr counter; - let name = "@" ^ (string_of_int !counter) in - makeVarinfo ~logic:true (* global= *)false (* formal= *)false name ty - (* Set the types of arguments and results as given by the function type * passed as the second argument *) let setFunctionType (f: fundec) (t: typ) = @@ -5679,9 +6000,8 @@ (* Make a global variable. Your responsibility to make sure that the name * is unique *) - let makeGlobalVar ?logic ?generated name typ = - let vi = makeVarinfo ?logic ?generated true false name typ in - vi + let makeGlobalVar ?source ?temp name typ = + makeVarinfo ?source ?temp true false name typ let emptyFunctionFromVI vi = let r = @@ -5701,7 +6021,7 @@ (* Make an empty function *) let emptyFunction name = let vi = - makeGlobalVar ~generated:false name (TFun(voidType, Some [], false,[])) + makeGlobalVar ~temp:false name (TFun(voidType, Some [], false,[])) in emptyFunctionFromVI vi let dummyFile = @@ -5833,7 +6153,7 @@ | _ :: rest -> search rest (* tail recursive *) | [] -> (*not found, so create one *) let t' = unrollTypeDeep t in - let new_decl = makeGlobalVar ~generated:false name t' in + let new_decl = makeGlobalVar ~temp:false name t' in setFormalsDecl new_decl t'; f.globals <- GVarDecl(empty_funspec (), new_decl, Location.unknown) :: f.globals; new_decl @@ -6033,6 +6353,9 @@ | Block b -> peepHole1 doone b.bstmts | UnspecifiedSequence seq -> peepHole1 doone (List.map (fun (x,_,_,_,_) -> x) seq) + | TryCatch(b,l,_) -> + peepHole1 doone b.bstmts; + List.iter (fun (_,b) -> peepHole1 doone b.bstmts) l | TryFinally (b, h, _l) -> peepHole1 doone b.bstmts; peepHole1 doone h.bstmts @@ -6040,7 +6363,7 @@ peepHole1 doone b.bstmts; peepHole1 doone h.bstmts; s.skind <- TryExcept(b, (doInstrList il, e), h, l); - | Return _ | Goto _ | Break _ | Continue _ -> ()) + | Return _ | Goto _ | Break _ | Continue _ | Throw _ -> ()) ss (* Process two statements and possibly replace them both *) @@ -6089,9 +6412,14 @@ | Switch (_e, b, _, _) -> b.bstmts <- peepHole2 ~agressive dotwo b.bstmts | Loop (_, b, _l, _, _) -> b.bstmts <- peepHole2 ~agressive dotwo b.bstmts | Block b -> b.bstmts <- doStmtList [] b.bstmts + | TryCatch (b,l,_) -> + b.bstmts <- peepHole2 ~agressive dotwo b.bstmts; + List.iter + (fun (_,b) -> + b.bstmts <- peepHole2 ~agressive dotwo b.bstmts) + l | TryFinally (b, h, _l) -> - b.bstmts <- - peepHole2 ~agressive dotwo b.bstmts; + b.bstmts <- peepHole2 ~agressive dotwo b.bstmts; b.bstmts <- peepHole2 ~agressive dotwo h.bstmts | TryExcept (b, (_il, _e), h, _l) -> b.bstmts <- peepHole2 ~agressive dotwo b.bstmts; @@ -6100,7 +6428,7 @@ | UnspecifiedSequence seq -> s.skind <- UnspecifiedSequence (doUnspecifiedStmtList seq) - | Return _ | Goto _ | Break _ | Continue _ -> () + | Return _ | Goto _ | Break _ | Continue _ | Throw _ -> () in if agressive then List.iter process ss; doStmtList [] ss @@ -6175,12 +6503,14 @@ let rec integralPromotion ?(forComparison=false) (t : typ) : typ = (* c.f. ISO 6.3.1.1 *) match unrollType t with | TInt ((IShort|ISChar|IBool), a) -> TInt(IInt, a) - | TInt (IChar,a) when isSigned IChar -> TInt(IInt, a) | TInt (IUChar|IUShort as k, a) -> if bitsSizeOfInt k < bitsSizeOf intType then TInt(IInt, a) else TInt(IUInt,a) + | TInt (IChar,a) -> + let k = if isSigned IChar then ISChar else IUChar in + integralPromotion ~forComparison (TInt (k, a)) | TInt (k,a) -> begin match findAttribute bitfield_attribute_name a with | [AInt size] -> @@ -6327,7 +6657,8 @@ match unrollType newt, e.enode with (* In the case were we have a representation for the literal, explicitly add the cast. *) - | TInt(newik, []), Const(CInt64(i, _, None)) -> kinteger64 ~loc newik i + | TInt(newik, []), Const(CInt64(i, _, None)) -> + kinteger64 ~loc ~kind:newik i | TPtr _, CastE (_, e') -> (match unrollType (typeOf e') with | (TPtr _ as typ'') -> @@ -6375,7 +6706,7 @@ | (Mod|BAnd|BOr|BXor|LAnd|LOr) -> doIntegralArithmetic () | (Shiftlt|Shiftrt) -> (* ISO 6.5.7. Only integral promotions. The result * has the same type as the left hand side *) - if theMachine.msvcMode then + if msvcMode () then (* MSVC has a bug. We duplicate it here *) doIntegralArithmetic () else @@ -6468,8 +6799,7 @@ let bop = if isPointerType et then PlusPI else PlusA in constFold false - (new_exp ~loc:e.eloc - (BinOp(bop, e, kinteger64 ~loc:e.eloc IULongLong i, et))) + (new_exp ~loc:e.eloc (BinOp(bop, e, kinteger64 ~loc:e.eloc i, et))) exception LenOfArray let lenOfArray64 eo = @@ -6516,8 +6846,8 @@ makeZeroInit ~loc fieldToInit.ftype)]) | TArray(bt, Some len, _, _) as t' -> let n = - match (constFold true len).enode with - Const(CInt64(n, _, _)) -> Integer.to_int n + match constFoldToInt len with + | Some n -> Integer.to_int n | _ -> Kernel.fatal ~current:true "Cannot understand length of array" in let initbt = makeZeroInit ~loc bt in @@ -6692,23 +7022,10 @@ | Case _ | Default _ -> true | _ -> false -let init_builtins () = - if theMachine.msvcMode then - initMsvcBuiltins () - else - initGccBuiltins () - -module type Machdeps = sig - val gcc : Cil_types.mach - val msvc : Cil_types.mach -end - let initCIL ~initLogicBuiltins machdep = if not (TheMachine.is_computed ()) then begin (* Set the machine *) - let module Mach = (val machdep: Machdeps) in - theMachine.theMachine <- - if theMachine.msvcMode then Mach.msvc else Mach.gcc; + theMachine.theMachine <- machdep; (* Pick type for string literals *) theMachine.stringLiteralType <- if theMachine.theMachine.const_string_literals then charConstPtrType @@ -6741,7 +7058,8 @@ else if name = "char" then IChar else if name = "unsigned char" then IUChar else - Kernel.fatal ~current:true "initCIL: cannot find the right ikind for type %s\n" name + Kernel.fatal + ~current:true "initCIL: cannot find the right ikind for type %s" name in theMachine.upointKind <- findIkindSz true theMachine.theMachine.sizeof_ptr; theMachine.upointType <- TInt(theMachine.upointKind, []); @@ -6902,7 +7220,7 @@ fun ty -> incr counter; let name = "__framac_tmp" ^ (string_of_int !counter) in - make_logic_var_local name ty + Cil_const.make_logic_var_local name ty let extract_varinfos_from_exp vexp = let visitor = object @@ -7045,7 +7363,7 @@ Logic_var.Set.union (free_vars_term bound_vars t) acc) Logic_var.Set.empty tl | Pallocable (_,t) | Pfreeable (_,t) - | Pvalid (_,t) | Pvalid_read (_,t) | Pinitialized (_,t) -> + | Pvalid (_,t) | Pvalid_read (_,t) | Pinitialized (_,t) | Pdangling (_,t) -> free_vars_term bound_vars t | Pseparated seps -> List.fold_left @@ -7291,24 +7609,26 @@ let dependencies = [] let size = 49 end) -let () = add_ast_dependency Switch_cases.self +let () = dependency_on_ast Switch_cases.self let separate_switch_succs = Switch_cases.memo separate_switch_succs class dropAttributes ?select () = object inherit genericCilVisitor (copy_visit (Project.current ())) - method! vattr a = + method! vattr a = match select with | None -> ChangeTo [] | Some l -> (match a with | (Attr (s,_) | AttrAnnot s) when List.mem s l -> ChangeTo [] | Attr _ | AttrAnnot _ -> DoChildren) - method! vtype ty = - match ty with - | TNamed (ty, attrs) -> - ChangeDoChildrenPost (typeAddAttributes attrs ty.ttype, fun x -> x) - | TVoid _ | TInt _ | TFloat _ | TPtr _ | TArray _ | TFun _ - | TComp _ | TEnum _ | TBuiltin_va_list _ -> DoChildren + method! vtype ty = match ty with + | TNamed (internal_ty, attrs) -> + let tty = typeAddAttributes attrs internal_ty.ttype in + (* keep the original type whenever possible *) + ChangeDoChildrenPost + (tty, fun x -> if x == internal_ty.ttype then ty else x) + | TVoid _ | TInt _ | TFloat _ | TPtr _ | TArray _ | TFun _ + | TComp _ | TEnum _ | TBuiltin_va_list _ -> DoChildren end let typeDeepDropAttributes select t = diff -Nru frama-c-20140301+neon+dfsg/cil/src/cil.mli frama-c-20150201+sodium+dfsg/cil/src/cil.mli --- frama-c-20140301+neon+dfsg/cil/src/cil.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/cil.mli 2015-05-29 15:31:43.000000000 +0000 @@ -91,50 +91,41 @@ machine has been set. *) val init_builtins: unit -> unit -(** Description of the machine as seen in GCC and MSVC modes. *) -module type Machdeps = sig - val gcc : Cil_types.mach - val msvc : Cil_types.mach -end - (** Call this function to perform some initialization, and only after you have set [Cil.msvcMode]. [initLogicBuiltins] is the function to call to init logic builtins. The [Machdeps] argument is a description of the hardware platform and of the compiler used. *) -val initCIL: initLogicBuiltins:(unit -> unit) -> (module Machdeps) -> unit +val initCIL: initLogicBuiltins:(unit -> unit) -> Cil_types.mach -> unit (* ************************************************************************* *) (** {2 Customization} *) (* ************************************************************************* *) type theMachine = private - { (** Whether the pretty printer should print output for the MS VC - compiler. Default is GCC *) - mutable msvcMode: bool; + { mutable useLogicalOperators: bool; (** Whether to use the logical operands LAnd and LOr. By default, do not use them because they are unlike other expressions and do not evaluate both of their operands *) - mutable useLogicalOperators: bool; mutable theMachine: mach; mutable lowerConstants: bool; (** Do lower constants (default true) *) - mutable insertImplicitCasts: bool; (** Do insert implicit casts - (default true) *) + mutable insertImplicitCasts: bool; + (** Do insert implicit casts (default true) *) + mutable underscore_name: bool; (** Whether the compiler generates assembly labels by prepending "_" to the identifier. That is, will function foo() have the label "foo", or "_foo"? *) - mutable underscore_name: bool; mutable stringLiteralType: typ; - mutable upointKind: ikind (** An unsigned integer type that fits - pointers. *); + mutable upointKind: ikind + (** An unsigned integer type that fits pointers. *); mutable upointType: typ; mutable wcharKind: ikind; (** An integer type that fits wchar_t. *) mutable wcharType: typ; mutable ptrdiffKind: ikind; (** An integer type that fits ptrdiff_t. *) mutable ptrdiffType: typ; - mutable typeOfSizeOf: typ; (** An integer type that is the type of - sizeof. *) - mutable kindOfSizeOf: ikind (** The integer kind of - {!Cil.typeOfSizeOf}. *) + mutable typeOfSizeOf: typ; + (** An integer type that is the type of sizeof. *) + mutable kindOfSizeOf: ikind; + (** The integer kind of {!Cil.typeOfSizeOf}. *) } val theMachine : theMachine @@ -145,14 +136,14 @@ val selfMachine_is_computed: ?project:Project.project -> unit -> bool (** whether current project has set its machine description. *) -val set_msvcMode: bool -> unit - (** Must be called before {!Cil.initCIL}. *) +val msvcMode: unit -> bool +val gccMode: unit -> bool (** Styles of printing line directives *) type lineDirectiveStyle = | LineComment (** Before every element, print the line * number in comments. This is ignored by - * processing tools (thus errors are reproted + * processing tools (thus errors are reported * in the CIL output), but useful for * visual inspection *) | LineCommentSparse (** Like LineComment but only print a line @@ -579,6 +570,9 @@ (** True if the argument is an integral type (i.e. integer or enum) *) val isIntegralType: typ -> bool +(** True if the argument is an integral or pointer type. *) +val isIntegralOrPointerType: typ -> bool + (** True if the argument is an integral type (i.e. integer or enum), either C or mathematical one *) val isLogicIntegralType: logic_type -> bool @@ -679,32 +673,30 @@ (** LVALUES *) (** Make a varinfo. Use this (rarely) to make a raw varinfo. Use other - * functions to make locals ({!Cil.makeLocalVar} or {!Cil.makeFormalVar} or - * {!Cil.makeTempVar}) and globals ({!Cil.makeGlobalVar}). Note that this - * function will assign a new identifier. - * The [logic] argument defaults to [false] - * and should be used to create a varinfo such that [varinfo.vlogic=true]. - * The [generated] argument defaults to [true] (in fact, only front-ends have - * the need to set it to false), and tells whether the variable is generated - * or comes directly from user input (the [vgenerated] flag). - * The first unnmamed argument specifies whether the varinfo is for a global and - * the second is for formals. *) + functions to make locals ({!Cil.makeLocalVar} or {!Cil.makeFormalVar} or + {!Cil.makeTempVar}) and globals ({!Cil.makeGlobalVar}). Note that this + function will assign a new identifier. + The [temp] argument defaults to [false], and corresponds to the + [vtemp] field in type {!Cil_types.varinfo}. + The [source] argument defaults to [true], and corresponds to the field + [vsource] . + The first unnmamed argument specifies whether the varinfo is for a global and + the second is for formals. *) val makeVarinfo: - ?logic:bool -> ?generated:bool -> bool -> bool -> string -> typ -> varinfo + ?source:bool -> ?temp:bool -> bool -> bool -> string -> typ -> varinfo (** Make a formal variable for a function declaration. Insert it in both the sformals and the type of the function. You can optionally specify where to insert this one. If where = "^" then it is inserted first. If where = "$" then it is inserted last. Otherwise where must be the name of a formal after which to insert this. By default it is inserted at the end. - A formal var is never generated. *) val makeFormalVar: fundec -> ?where:string -> string -> typ -> varinfo (** Make a local variable and add it to a function's slocals and to the given block (only if insert = true, which is the default). - Make sure you know what you are doing if you set insert=false. - [generated] is passed to {!Cil.makeVarinfo}. + Make sure you know what you are doing if you set [insert=false]. + [temp] is passed to {!Cil.makeVarinfo}. The variable is attached to the toplevel block if [scope] is not specified. @since Nitrogen-20111001 This function will strip const attributes @@ -712,13 +704,9 @@ least once. *) val makeLocalVar: - fundec -> ?scope:block -> ?generated:bool -> ?insert:bool + fundec -> ?scope:block -> ?temp:bool -> ?insert:bool -> string -> typ -> varinfo -(** Make a pseudo-variable to use as placeholder in term to expression - conversions. Its logic field is set. They are always generated. *) -val makePseudoVar: typ -> varinfo - (** Make a temporary variable and add it to a function's slocals. The name of the temporary variable will be generated based on the given name hint so that to avoid conflicts with other locals. @@ -732,8 +720,8 @@ ?descrpure:bool -> typ -> varinfo (** Make a global variable. Your responsibility to make sure that the name - is unique. [logic] defaults to [false]. [generated] defaults to [true].*) -val makeGlobalVar: ?logic:bool -> ?generated:bool -> string -> typ -> varinfo + is unique. [source] defaults to [true]. [temp] defaults to [false].*) +val makeGlobalVar: ?source:bool -> ?temp:bool -> string -> typ -> varinfo (** Make a shallow copy of a [varinfo] and assign a new identifier. If the original varinfo has an associated logic var, it is copied too and @@ -742,7 +730,7 @@ val copyVarinfo: varinfo -> string -> varinfo (** Changes the type of a varinfo and of its associated logic var if any. - @since Neon-20130301 *) + @since Neon-20140301 *) val update_var_type: varinfo -> typ -> unit (** Is an lvalue a bitfield? *) @@ -813,14 +801,13 @@ (** -1 *) val mone: loc:Location.t -> exp - -(** Construct an integer of a given kind, using OCaml's int64 type. If needed - * it will truncate the integer to be within the representable range for the - * given kind. The integer can have an optional literal representation. *) -val kinteger64_repr: loc:location -> ikind -> Integer.t -> string option -> exp - -(** Construct an integer of a given kind without literal representation. *) -val kinteger64: loc:location -> ikind -> Integer.t -> exp +(** Construct an integer of a given kind without literal representation. + Truncate the integer if [kind] is given, and the integer does not fit + inside the type. The integer can have an optional literal representation + [repr]. + @raise Not_representable if no ikind is provided and the integer is not + representable. *) +val kinteger64: loc:location -> ?repr:string -> ?kind:ikind -> Integer.t -> exp (** Construct an integer of a given kind. Converts the integer to int64 and * then uses kinteger64. This might truncate the value if you use a kind @@ -871,7 +858,8 @@ (This is the official way of interpreting character constants, according to ISO C 6.4.4.4.10, which says that character constants are chars cast to ints) Returns CInt64(sign-extened c, IInt, None) *) -val charConstToInt: char -> constant +val charConstToInt: char -> Integer.t +val charConstToIntConstant: char -> constant (** Do constant folding on an expression. If the first argument is [true] then will also compute compiler-dependent expressions such as sizeof. @@ -879,12 +867,18 @@ expressions in a given AST node. *) val constFold: bool -> exp -> exp +(** Do constant folding on the given expression, just as [constFold] would. The + resulting integer value, if the const-folding was complete, is returned. + The [machdep] optional parameter, which is set to [true] by default, + forces the simplification of architecture-dependent expressions. *) +val constFoldToInt: ?machdep:bool -> exp -> Integer.t option + (** Do constant folding on an term at toplevel only. This uses compiler-dependent informations and will remove all sizeof and alignof. *) val constFoldTermNodeAtTop: term_node -> term_node -(** Do constant folding on an term at toplevel only. +(** Do constant folding on an term. If the first argument is true then will also compute compiler-dependent expressions such as [sizeof] and [alignof]. *) @@ -1191,6 +1185,19 @@ their uses *) val typeRemoveAttributes: string list -> typ -> typ +val typeHasAttribute: string -> typ -> bool +(** Does the type have the given attribute. Does + not recurse through pointer types, nor inside function prototypes. + @since Sodium-20150201 *) + +val typeHasQualifier: string -> typ -> bool +(** Does the type have the given qualifier. Handles the case of arrays, for + which the qualifiers are actually carried by the type of the elements. + It is always correct to call this function instead of {!typeHasAttribute}. + For l-values, both functions return the same results, as l-values cannot + have array type. + @since Sodium-20150201 *) + val typeHasAttributeDeep: string -> typ -> bool (** Does the type or one of its subtypes have the given attribute. Does not recurse through pointer types, nor inside function prototypes. @@ -1201,6 +1208,12 @@ *) val type_remove_qualifier_attributes: typ -> typ +(** + remove also qualifiers under Ptr and Arrays + @since Sodium-20150201 +*) +val type_remove_qualifier_attributes_deep: typ -> typ + (** Remove all attributes relative to const, volatile and restrict attributes when building a C cast @since Oxygen-20120901 @@ -1317,6 +1330,20 @@ globals in the function's body. @plugin development guide *) +val refresh_visit: Project.t -> visitor_behavior + (** Makes fresh copies of the mutable structures and provides fresh id + for the structures that have ids. Note that as for {!copy_visit}, only + varinfo that are declared in the scope of the visit will be copied and + provided with a new id. + @since Sodium-20150201 + *) + +(** true iff the behavior provides fresh id for copied structs with id. + Always [false] for an inplace visitor. + @since Sodium-20150201 +*) +val is_fresh_behavior: visitor_behavior -> bool + (** true iff the behavior is a copy behavior. *) val is_copy_behavior: visitor_behavior -> bool @@ -1527,7 +1554,8 @@ (** a visitor who only does copies of the nodes according to [behavior] *) method vfile: file -> file visitAction - (** visit a whole file. *) + (** visit a whole file. + @plugin development guide *) method vvdec: varinfo -> varinfo visitAction (** Invoked for each variable declaration. The subtrees to be traversed @@ -1733,6 +1761,19 @@ end +(** Indicates how an extended behavior clause is supposed to be visited. + The default behavior is [DoChildren], which ends up visiting + each identified predicate in the list and leave the id as is. + + @plugin development guide + + @since Sodium-20150201 +*) +val register_behavior_extension: + string -> + (cilVisitor -> (int * identified_predicate list) -> + (int * identified_predicate list) visitAction) -> unit + (**/**) class internal_genericCilVisitor: fundec option ref -> visitor_behavior -> (unit->unit) Queue.t -> cilVisitor @@ -2231,9 +2272,14 @@ (**/**) -val register_ast_dependencies : State.t -> unit - (** Used to postpone some dependencies on [Ast.self], which is initialized - afterwards. *) +val dependency_on_ast: State.t -> unit + (** indicates that the given state depends on the AST. *) + +val set_dependencies_of_ast : State.t -> unit + (** Makes all states that have been marked as depending on the AST by + {!dependency_on_ast} depend on the given state. Should only be used + once when creating the AST state. + *) val pp_typ_ref: (Format.formatter -> typ -> unit) ref val pp_global_ref: (Format.formatter -> global -> unit) ref diff -Nru frama-c-20140301+neon+dfsg/cil/src/cil_state_builder.ml frama-c-20150201+sodium+dfsg/cil/src/cil_state_builder.ml --- frama-c-20140301+neon+dfsg/cil/src/cil_state_builder.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/cil_state_builder.ml 2015-05-28 08:53:23.000000000 +0000 @@ -1,45 +1,24 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) open State_builder open Cil_datatype diff -Nru frama-c-20140301+neon+dfsg/cil/src/cil_state_builder.mli frama-c-20150201+sodium+dfsg/cil/src/cil_state_builder.mli --- frama-c-20140301+neon+dfsg/cil/src/cil_state_builder.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/cil_state_builder.mli 2015-05-28 08:53:23.000000000 +0000 @@ -1,45 +1,24 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) (** Functors for building computations which use kernel datatypes. @plugin development guide *) diff -Nru frama-c-20140301+neon+dfsg/cil/src/cil_types.mli frama-c-20150201+sodium+dfsg/cil/src/cil_types.mli --- frama-c-20140301+neon+dfsg/cil/src/cil_types.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/cil_types.mli 2015-05-29 15:31:43.000000000 +0000 @@ -559,9 +559,9 @@ (** [true] if this variable is ever referenced. This is computed by [removeUnusedVars]. It is safe to just initialize this to [false]. *) - vgenerated: bool; + vtemp: bool; (** [true] for temporary variables generated by CIL normalization. [false] - for variables coming directly from user input. *) + for all the other variables. *) mutable vdescr: string option; (** For most temporary variables, a description of what the var holds. @@ -577,8 +577,11 @@ mutable vghost: bool; (** Indicates if the variable is declared in ghost code *) - vlogic: bool; - (** [false] iff this variable is a C variable. *) + vsource: bool; + (** [true] iff this variable appears in the source of the program, which is + the case of all the variables in the initial AST. Plugins may create + variables with [vsource=false], for example to handle dynamic allocation. + Those variables do *not* have an associated {!GVar} or {!GVarDecl}. *) mutable vlogic_var_assoc: logic_var option (** logic variable representing this variable in the logic world*) @@ -904,7 +907,8 @@ to manipulate formals you should use the provided functions {!Cil.makeFormalVar} and {!Cil.setFormals}. *) -(** Function definitions. *) +(** Function definitions. + @plugin development guide *) and fundec = { mutable svar: varinfo; (** Holds the name and type as a variable, so we can refer to it easily @@ -1014,27 +1018,33 @@ and stmtkind = | Instr of instr (** An instruction that does not contain control flow. Control implicitly - falls through. *) + falls through. + @plugin development guide *) | Return of exp option * location - (** The return statement. This is a leaf in the CFG. *) + (** The return statement. This is a leaf in the CFG. + @plugin development guide *) | Goto of stmt ref * location (** A goto statement. Appears from actual goto's in the code or from goto's that have been inserted during elaboration. The reference points to the statement that is the target of the Goto. This means that you have to update the reference whenever you replace the target statement. The - target statement MUST have at least a label. *) + target statement MUST have at least a label. + @plugin development guide *) | Break of location - (** A break to the end of the nearest enclosing Loop or Switch *) + (** A break to the end of the nearest enclosing Loop or Switch. + @plugin development guide *) | Continue of location - (** A continue to the start of the nearest enclosing [Loop] *) + (** A continue to the start of the nearest enclosing [Loop]. + @plugin development guide *) | If of exp * block * block * location (** A conditional. Two successors, the "then" and the "else" branches. Both - branches fall-through to the successor of the If statement. *) + branches fall-through to the successor of the If statement. + @plugin development guide *) | Switch of exp * block * (stmt list) * location (** A switch statement. [exp] is the index of the switch. [block] is @@ -1043,7 +1053,8 @@ case, the corresponding statement is in [stmt list], a statement cannot appear more than once in the list, and statements in [stmt list] can have several labels corresponding to several - cases. *) + cases. + @plugin development guide *) | Loop of code_annotation list * block * location * (stmt option) * (stmt option) @@ -1051,11 +1062,13 @@ loop using a [Break] statement. If {!Cfg.prepareCFG} has been called, the first stmt option will point to the stmt containing the continue label for this loop and the second will point to the stmt containing the break - label for this loop. *) + label for this loop. + @plugin development guide *) | Block of block (** Just a block of statements. Use it as a way to keep some block attributes - local *) + local. + @plugin development guide *) | UnspecifiedSequence of (stmt * lval list * lval list * lval list * stmt ref list) list @@ -1084,12 +1097,23 @@ experimental and may miss some unspecified sequences. In case you do not care about this feature just handle it - like a block (see {!Cil.block_from_unspecified_sequence}) *) + like a block (see {!Cil.block_from_unspecified_sequence}). + @plugin development guide *) + | Throw of (exp * typ) option * location + (** Throws an exception, C++ style. + We keep the type of the expression, to match + it against the appropriate catch clause. A Throw node has + no successor, even if it is in try-catch block that will catch + the exception: we keep normal and exceptional control-flow + completely separate, as in Jo and Chang, ICSSA 2004. + *) + | TryCatch of block * (catch_binder * block) list * location | TryFinally of block * block * location (** On MSVC we support structured exception handling. This is what you might expect. Control can get into the finally block either from the end of the - body block, or if an exception is thrown. *) + body block, or if an exception is thrown. + @plugin development guide *) | TryExcept of block * (instr list * exp) * block * location (** On MSVC we support structured exception handling. The try/except @@ -1106,7 +1130,22 @@ can get to the __except expression only if an exception is thrown. After that, depending on the value of the expression the control goes to the handler, propagates the exception, or retries the - exception. The location corresponds to the try keyword. *) + exception. The location corresponds to the try keyword. + @plugin development guide *) + +(** Kind of exceptions that are catched by a given clause. *) +and catch_binder = + | Catch_exn of varinfo * (varinfo * block) list + (** catch exception of given type(s). + If the list is empty, only exceptions with the same type as the + varinfo can be catched. If the list is non-empty, only exceptions + matching one of the type of a varinfo in the list are catched. + The associated block contains the operations necessary to transform + the matched varinfo into the principal one. + Semantics is by value (i.e. the varinfo is bound to a copy of the + catched object). + *) + | Catch_all (** default catch clause: all exceptions are catched. *) (** Instructions. They may cause effects directly but may not have control flow.*) @@ -1426,6 +1465,8 @@ {b deprecated:} Use [Pvalid(TBinOp(PlusPI(p,Trange(i1,i2))))] instead. similar to [Pvalid_index] but for a range of indices.*) | Pinitialized of logic_label * term (** the given locations are initialized. *) + | Pdangling of logic_label * term (** the given locations contain dangling + adresses. *) | Pallocable of logic_label * term (** the given locations can be allocated. *) | Pfreeable of logic_label * term (** the given locations can be free. *) | Pfresh of logic_label * logic_label * term * term @@ -1507,7 +1548,15 @@ mutable b_assigns : 'locs assigns; (** assignments. *) mutable b_allocation : 'locs allocation; (** frees, allocates. *) mutable b_extended : (string * int * 'pred list) list -(** Grammar extensions *) +(** Grammar extensions. + Each extension is associated to a keyword. An extension + can be registered through the following functions: + - {!Logic_typing.register_behavior_extension} for parsing and type-checking + - {!Cil_printer.register_behavior_extension} for pretty-printing an + extended clause + - {!Cil.register_behavior_extension} for visiting an extended clause + + @plugin development guide *) } (** kind of termination a post-condition applies to. See ACSL manual. *) @@ -1551,7 +1600,7 @@ (** loop/code invariant. The list of strings is the list of behaviors to which this invariant applies. The boolean flag is true for normal loop invariants and false for invariant-as-assertions. *) - + | AVariant of 'term variant (** loop variant. Note that there can be at most one variant associated to a given statement *) @@ -1645,10 +1694,6 @@ | VFormal of kernel_function type mach = { - version_major: int; (* Major version number *) - version_minor: int; (* Minor version number *) - version: string; (* version number *) - underscore_name: bool; (* If assembly names have leading underscore *) sizeof_short: int; (* Size of "short" *) sizeof_int: int; (* Size of "int" *) sizeof_long: int ; (* Size of "long" *) @@ -1673,11 +1718,15 @@ alignof_str: int; (* Alignment of strings *) alignof_fun: int; (* Alignment of function *) char_is_unsigned: bool; (* Whether "char" is unsigned *) + underscore_name: bool; (* If assembly names have leading underscore *) const_string_literals: bool; (* Whether string literals have const chars *) little_endian: bool; (* whether the machine is little endian *) alignof_aligned: int (* Alignment of a type with aligned attribute *); has__builtin_va_list: bool (* Whether [__builtin_va_list] is a known type *); __thread_is_keyword: bool (* Whether [__thread] is a keyword *); + compiler: string; (* Compiler being used. Currently recognized names + are 'gcc', 'msvc' and 'generic'. *) + version: string; (* Information on this machdep *) } (* diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/availexpslv.ml frama-c-20150201+sodium+dfsg/cil/src/ext/availexpslv.ml --- frama-c-20140301+neon+dfsg/cil/src/ext/availexpslv.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/availexpslv.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,430 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -(* compute available expressions, although in a somewhat - non-traditional way. the abstract state is a mapping from - lvalues to expressions as opposed to a set of - expressions *) - -open Cil_types -open Cil - -let debug = ref false - - -(* - * When ignore_inst returns true, then - * the instruction in question has no - * effects on the abstract state. - * When ignore_call returns true, then - * the instruction only has side-effects - * from the assignment if there is one. - *) -let ignore_inst = ref (fun _i -> false) -let ignore_call = ref (fun _i -> false) - -let registerIgnoreInst (f : instr -> bool) : unit = - let f' = !ignore_inst in - ignore_inst := (fun i -> (f i) || (f' i)) - -let registerIgnoreCall (f : instr -> bool) : unit = - let f' = !ignore_call in - ignore_call := (fun i -> (f i) || (f' i)) - - -module LvExpHash = Cil_datatype.LvalStructEq.Hashtbl - -(* exp LvExpHash.t -> exp LvExpHash.t -> bool *) -let lvh_equals lvh1 lvh2 = - if not(LvExpHash.length lvh1 = LvExpHash.length lvh2) - then false - else LvExpHash.fold (fun lv e b -> - if not b then b else - try let e2 = LvExpHash.find lvh2 lv in - if not (Expcompare.compareExpStripCasts e e2) - then false - else true - with Not_found -> false) - lvh1 true - -let lvh_pretty fmt lvh = - LvExpHash.iter - (fun lv e -> - Format.fprintf fmt "@\n%a -> %a" - Cil_printer.pp_lval lv Cil_printer.pp_exp e) - lvh - -(* the result must be the intersection of eh1 and eh2 *) -let lvh_combine lvh1 lvh2 = - if !debug then Kernel.debug ~level:2 "lvh_combine: combining %a\n and\n %a" - lvh_pretty lvh1 lvh_pretty lvh2; - let lvh' = LvExpHash.copy lvh1 in (* eh' gets all of eh1 *) - LvExpHash.iter (fun lv e1 -> - try let e2l = LvExpHash.find_all lvh2 lv in - if not(List.exists (fun e2 -> Expcompare.compareExpStripCasts e1 e2) e2l) - (* remove things from eh' that eh2 doesn't have *) - then let e1l = LvExpHash.find_all lvh' lv in - let e1l' = - List.filter (fun e -> not(Expcompare.compareExpStripCasts e e1)) e1l - in - LvExpHash.remove lvh' lv; - List.iter (fun e -> LvExpHash.add lvh' lv e) e1l' - with Not_found -> - LvExpHash.remove lvh' lv) lvh1; - if !debug then Kernel.debug "with result %a" lvh_pretty lvh'; - lvh' - - -(* On a memory write, kill expressions containing memory reads - variables whose address has been taken, and globals. *) -class memReadOrAddrOfFinderClass br = object - inherit nopCilVisitor - - method! vexpr e = match e.enode with - | Lval(Mem _, _) -> begin - br := true; - SkipChildren - end - | AddrOf(Var _vi, NoOffset) -> - (* Writing to memory won't change the address of something *) - SkipChildren - | _ -> DoChildren - - method! vvrbl vi = - if vi.vaddrof || vi.vglob then - (br := true; - SkipChildren) - else DoChildren - -end - -(* exp -> bool *) -let exp_has_mem_read e = - let br = ref false in - let vis = new memReadOrAddrOfFinderClass br in - ignore(visitCilExpr vis e); - !br - -let lval_has_mem_read lv = - let br = ref false in - let vis = new memReadOrAddrOfFinderClass br in - ignore(visitCilLval vis lv); - !br - -let lvh_kill_mem lvh = - LvExpHash.iter (fun lv e -> - if exp_has_mem_read e || lval_has_mem_read lv - then LvExpHash.remove lvh lv) - lvh - -(* need to kill exps containing a particular vi sometimes *) -class viFinderClass vi br = object - inherit nopCilVisitor - - method! vvrbl vi' = - if vi.vid = vi'.vid - then (br := true; SkipChildren) - else DoChildren - -end - -let exp_has_vi vi e = - let br = ref false in - let vis = new viFinderClass vi br in - ignore(visitCilExpr vis e); - !br - -let lval_has_vi vi lv = - let br = ref false in - let vis = new viFinderClass vi br in - ignore(visitCilLval vis lv); - !br - -let lvh_kill_vi lvh vi = - LvExpHash.iter (fun lv e -> - if exp_has_vi vi e || lval_has_vi vi lv - then LvExpHash.remove lvh lv) - lvh - -(* need to kill exps containing a particular lval sometimes *) -class lvalFinderClass lv br = object - inherit nopCilVisitor - - method! vlval l = - if compareLval l lv - then (br := true; SkipChildren) - else DoChildren - -end - -let exp_has_lval lv e = - let br = ref false in - let vis = new lvalFinderClass lv br in - ignore(visitCilExpr vis e); - !br - -let lval_has_lval lv (host,hostoff) = - let br = ref false in - let vis = new lvalFinderClass lv br in - (match host with - | Mem e -> ignore(visitCilExpr vis e) - | _ -> ()); - ignore(visitCilOffset vis hostoff); - !br - -let lvh_kill_lval lvh lv = - LvExpHash.iter (fun lv' e -> - if exp_has_lval lv e || lval_has_lval lv lv' - then LvExpHash.remove lvh lv') - lvh - - -class volatileFinderClass br = object - inherit nopCilVisitor - - method! vexpr e = - if (hasAttribute "volatile" (typeAttrs (typeOf e))) - then (br := true; SkipChildren) - else DoChildren -end - -let exp_is_volatile e : bool = - let br = ref false in - let vis = new volatileFinderClass br in - ignore(visitCilExpr vis e); - !br - -class addrOfOrGlobalFinderClass br = object - inherit nopCilVisitor - - method! vvrbl vi = - if vi.vaddrof || vi.vglob - then (br := true; SkipChildren) - else DoChildren - -end - -let lval_has_addrof_or_global lv = - let br = ref false in - let vis = new addrOfOrGlobalFinderClass br in - ignore(visitCilLval vis lv); - !br - -let lvh_kill_addrof_or_global lvh = - LvExpHash.iter (fun lv _ -> - if lval_has_addrof_or_global lv - then LvExpHash.remove lvh lv) - lvh - - -let lvh_handle_inst i lvh = - if (!ignore_inst) i then lvh else - match i with - Set(lv,e,_) -> begin - match lv with - | (Mem _, _) -> begin - LvExpHash.replace lvh lv e; - lvh_kill_mem lvh; - lvh_kill_addrof_or_global lvh; - lvh - end - | _ when not (exp_is_volatile e) -> begin - (* ignore x = x *) - if Expcompare.compareExpStripCasts (dummy_exp (Lval lv)) e then lvh - else begin - LvExpHash.replace lvh lv e; - lvh_kill_lval lvh lv; - lvh - end - end - | _ -> begin (* e is volatile *) - (* must remove mapping for lv *) - if !debug then - Kernel.debug "lvh_handle_inst: %a is volatile. killing %a" - Cil_printer.pp_exp e Cil_printer.pp_lval lv; - LvExpHash.remove lvh lv; - lvh_kill_lval lvh lv; - lvh - end - end - | Call(Some lv,_,_,_) -> begin - LvExpHash.remove lvh lv; - lvh_kill_lval lvh lv; - if not((!ignore_call) i) then begin - lvh_kill_mem lvh; - lvh_kill_addrof_or_global lvh - end; - lvh - end - | Call(_,_,_,_) -> begin - if not((!ignore_call) i) then begin - lvh_kill_mem lvh; - lvh_kill_addrof_or_global lvh; - end; - lvh - end - | Asm(_,_,_,_,_,_,_) -> begin - let _,d = Usedef.computeUseDefInstr i in - Cil_datatype.Varinfo.Set.iter (fun vi -> - lvh_kill_vi lvh vi) d; - lvh - end - | Code_annot _ | Skip _ -> lvh - -module AvailableExps = - struct - - let name = "Available Expressions" - - let debug = false - - (* mapping from var id to expression *) - type t = exp LvExpHash.t - - module StmtStartData = - Dataflow2.StartData(struct type t = exp LvExpHash.t let size = 64 end) - - let copy = LvExpHash.copy - - let pretty = lvh_pretty - - let computeFirstPredecessor _stm lvh = lvh - - let combinePredecessors (_stm:stmt) ~(old:t) (lvh:t) = - if lvh_equals old lvh then None else - Some(lvh_combine old lvh) - - let doInstr _ i lvh = lvh_handle_inst i lvh - - let doStmt _stm _astate = Dataflow2.SDefault - - let doGuard _ _c _astate = Dataflow2.GDefault, Dataflow2.GDefault - - let doEdge _ _ d = d - - end - -module AE = Dataflow2.Forwards(AvailableExps) - - -(* - * Computes AEs for function fd. - * - * - *) -let computeAEs fd = - try let slst = fd.sbody.bstmts in - let first_stm = List.hd slst in - AvailableExps.StmtStartData.clear (); - AvailableExps.StmtStartData.add first_stm (LvExpHash.create 4); - AE.compute [first_stm] - with Failure "hd" -> if !debug then Kernel.debug "fn w/ no stmts?" - | Not_found -> if !debug then Kernel.debug "no data for first_stm?" - - -(* get the AE data for a statement *) -let getAEs sid = - try Some(AvailableExps.StmtStartData.find sid) - with Not_found -> None - -(* get the AE data for an instruction list *) -let instrAEs il _sid lvh _out = - if !debug then Kernel.debug "instrAEs" ; - let proc_one hil i = - match hil with - [] -> let lvh' = LvExpHash.copy lvh in - let lvh'' = lvh_handle_inst i lvh' in - lvh''::hil - | lvh'::_ehrst as l -> - let lvh' = LvExpHash.copy lvh' in - let lvh'' = lvh_handle_inst i lvh' in - lvh''::l - in - let folded = List.fold_left proc_one [lvh] il in - let foldednotout = List.rev (List.tl folded) in - foldednotout - -class aeVisitorClass = object (self) - inherit nopCilVisitor - - val mutable ae_dat_lst = [] - - val mutable cur_ae_dat = None - - method! vstmt stm = - match getAEs stm with - | None -> - if !debug then Kernel.debug "aeVis: stm %d has no data" stm.sid ; - cur_ae_dat <- None; - DoChildren - | Some eh -> - match stm.skind with - Instr il -> - if !debug then Kernel.debug "aeVist: visit il" ; - ae_dat_lst <- instrAEs [il] stm.sid eh false; - DoChildren - | _ -> - if !debug then Kernel.debug "aeVisit: visit non-il" ; - cur_ae_dat <- None; - DoChildren - - method! vinst i = - if !debug then - Kernel.debug "aeVist: before %a, ae_dat_lst is %d long" - Cil_printer.pp_instr i (List.length ae_dat_lst); - try - let data = List.hd ae_dat_lst in - cur_ae_dat <- Some(data); - ae_dat_lst <- List.tl ae_dat_lst; - if !debug then Kernel.debug "aeVisit: data is %a" lvh_pretty data; - DoChildren - with Failure "hd" -> - if !debug then Kernel.debug "aeVis: il ae_dat_lst mismatch"; - DoChildren - - method get_cur_eh () = - match cur_ae_dat with - | None -> getAEs (Extlib.the self#current_stmt) - | Some eh -> Some eh - -end diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/cfg.ml frama-c-20150201+sodium+dfsg/cil/src/ext/cfg.ml --- frama-c-20140301+neon+dfsg/cil/src/ext/cfg.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/cfg.ml 2015-05-29 15:31:43.000000000 +0000 @@ -161,12 +161,19 @@ [] -> addSucc next | hd::_ -> addSucc hd in + let cfgCatch c next break cont = + match c with + | Catch_all -> () + | Catch_exn(_,l) -> + let cfg_aux_clause (_,b) = cfgBlock b next break cont in + List.iter cfg_aux_clause l + in let instrFallsThrough (i : instr) : bool = match i with Call (_, {enode = Lval (Var vf, NoOffset)}, _, _) -> (* See if this has the noreturn attribute *) not (hasAttribute "noreturn" vf.vattr) | Call (_, f, _, _) -> - not (hasAttribute "noreturn" (typeAttrs (typeOf f))) + not (typeHasAttribute "noreturn" (typeOf f)) | _ -> true in match s.skind with @@ -175,7 +182,7 @@ addOptionSucc next else () - | Return _ -> () + | Return _ | Throw _ -> () | Goto (p,_) -> addSucc !p | Break _ -> addOptionSucc break | Continue _ -> addOptionSucc cont @@ -209,9 +216,27 @@ | Loop(_,blk,_,_,_) -> addBlockSuccFull s blk; cfgBlock blk (Some s) next (Some s) - (* Since all loops have terminating condition true, we don't put any direct successor to stmt following the loop *) + + | TryCatch(t,c,_) -> + (* we enter the try block, and perform cfg in all the catch blocks, + but there's no edge leading to a catch-block. This has to be + taken into account by inter-procedural analyses directly, even + if there is a throw directly in the function. See cil_types.mli + for more information. *) + addBlockSucc t; + cfgBlock t next break cont; + (* If there are some auxiliary types catched by the clause, the cfg + goes from the conversion block to the main block of the catch clause *) + List.iter + (fun (c,b) -> + let n = + match b.bstmts with + | [] -> next + | s::_ -> Some s + in + cfgCatch c n break cont; cfgBlock b next break cont) c; | TryExcept _ | TryFinally _ -> Kernel.fatal "try/except/finally" @@ -246,6 +271,8 @@ | Switch _ -> "switch" | Block _ -> "block" | Return _ -> "return" + | Throw _ -> "throw" + | TryCatch _ -> "try-catch" | TryExcept _ -> "try-except" | TryFinally _ -> "try-finally" | UnspecifiedSequence _ -> "unspecifiedsequence" @@ -328,6 +355,9 @@ method! vexpr _ = SkipChildren method! vtype _ = SkipChildren method! vinst _ = SkipChildren + method! vcode_annot _ = SkipChildren (* via Loop stmt *) + method! vlval _ = SkipChildren (* via UnspecifiedSequence stmt *) + method! vattr _ = SkipChildren (* via block stmt *) end let link source dest = begin @@ -355,7 +385,7 @@ and succpred_stmt s fallthrough = match s.skind with Instr _ -> trylink s fallthrough - | Return _ -> () + | Return _ | Throw _ -> () | Goto(dest,_) -> link s !dest | Break _ | Continue _ @@ -388,6 +418,11 @@ succpred_block (block_from_unspecified_sequence seq) fallthrough | UnspecifiedSequence [] -> trylink s fallthrough + | TryCatch (t,c,_) -> + (match t.bstmts with + | [] -> trylink s fallthrough + | hd :: _ -> link s hd; succpred_block t fallthrough); + List.iter (fun (_,b) -> succpred_block b fallthrough) c | TryExcept _ | TryFinally _ -> failwith "computeCFGInfo: structured exception handling not implemented" @@ -519,7 +554,7 @@ s:: xform_switch_stmt rest break_dest cont_dest label_index (popstack+1) - | Instr _ | Return _ | Goto _ -> + | Instr _ | Return _ | Goto _ | Throw _ -> popn popstack; s:: xform_switch_stmt @@ -701,19 +736,24 @@ "while_%d_break" label_index),l,false)] ; let cont_loc = fst_l, fst_l in let cont_stmt = mkStmt (Instr (Skip cont_loc)) in - cont_stmt.labels <- - [Label - (freshLabel - (Printf.sprintf - "while_%d_continue" label_index),l,false)] ; b.bstmts <- cont_stmt :: b.bstmts ; let my_break_dest () = ref break_stmt in - let my_cont_dest () = ref cont_stmt in + let use_continue = ref false in + let my_cont_dest () = + use_continue := true; + ref cont_stmt + in Stack.push (Stack.create ()) breaks_stack; Stack.push (Stack.create ()) continues_stack; let b = xform_switch_block b my_break_dest my_cont_dest label_index in + if !use_continue then + cont_stmt.labels <- + [Label + (freshLabel + (Printf.sprintf + "while_%d_continue" label_index),l,false)] ; s.skind <- Loop(a,b,l,Some(cont_stmt),Some(break_stmt)); break_stmt.succs <- s.succs ; ignore (Stack.pop breaks_stack); @@ -726,6 +766,17 @@ popn popstack; s.skind <- Block b; s :: xform_switch_stmt rest break_dest cont_dest label_index 0 + | TryCatch (t,c,l) -> + let t' = xform_switch_block t break_dest cont_dest label_index in + let c' = + List.map + (fun (e,b) -> + (e, xform_switch_block b break_dest cont_dest label_index)) + c + in + s.skind <- TryCatch(t',c',l); + popn popstack; + s :: xform_switch_stmt rest break_dest cont_dest label_index 0 | UnspecifiedSequence seq -> let seq = xform_switch_unspecified seq break_dest cont_dest label_index @@ -782,6 +833,9 @@ method! vexpr _ = SkipChildren method! vtype _ = SkipChildren method! vinst _ = SkipChildren + method! vcode_annot _ = SkipChildren (* via Loop stmt *) + method! vlval _ = SkipChildren (* via UnspecifiedSequence stmt *) + method! vattr _ = SkipChildren (* via block stmt *) end (* prepare a function for computeCFGInfo by removing break, continue, diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/dataflow2.ml frama-c-20150201+sodium+dfsg/cil/src/ext/dataflow2.ml --- frama-c-20140301+neon+dfsg/cil/src/ext/dataflow2.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/dataflow2.ml 2015-05-28 08:53:23.000000000 +0000 @@ -1,45 +1,24 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) open Cil_types open Cil @@ -367,8 +346,11 @@ | UnspecifiedSequence _ | Goto _ | Break _ | Continue _ | TryExcept _ | TryFinally _ - | Loop _ | Return _ | Block _ -> - do_succs curr + | Loop _ | Return _ | Block _ -> do_succs curr + | Throw _ | TryCatch _ -> + Kernel.not_yet_implemented + "[dataflow] exception handling" + | If (e, _, _, _) -> let thenGuard, elseGuard = T.doGuard s e curr in diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/dataflow2.mli frama-c-20150201+sodium+dfsg/cil/src/ext/dataflow2.mli --- frama-c-20140301+neon+dfsg/cil/src/ext/dataflow2.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/dataflow2.mli 2015-05-28 08:53:23.000000000 +0000 @@ -1,45 +1,24 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) (** A framework for implementing data flow analysis. @plugin development guide *) diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/dataflow.ml frama-c-20150201+sodium+dfsg/cil/src/ext/dataflow.ml --- frama-c-20140301+neon+dfsg/cil/src/ext/dataflow.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/dataflow.ml 2015-05-29 15:31:43.000000000 +0000 @@ -302,8 +302,11 @@ | UnspecifiedSequence _ | Goto _ | Break _ | Continue _ | TryExcept _ | TryFinally _ - | Loop _ | Return _ | Block _ -> - do_succs curr + | Loop _ | Return _ | Block _ -> do_succs curr + + | Throw _ | TryCatch _ -> + Kernel.not_yet_implemented + "[dataflow] exception handling" | If (e, _, _, _) -> let thenGuard, elseGuard = T.doGuard s e curr in diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/dataflows.ml frama-c-20150201+sodium+dfsg/cil/src/ext/dataflows.ml --- frama-c-20140301+neon+dfsg/cil/src/ext/dataflows.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/dataflows.ml 2015-05-29 15:31:43.000000000 +0000 @@ -43,13 +43,6 @@ let dkey = Kernel.register_category "dataflows" -(* This file defines a set of dataflow frameworks. Instead of defining - a single dataflow interface that tries to accomodate with all the - options, having a set of dataflows allow to keep things simple in - the general case; specific demands are handled by using more - general dataflows. Simpler-to-instanciate dataflows are instances - of the more general dataflows. *) - open Ordered_stmt;; open Cil_types;; diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/dataflows.mli frama-c-20150201+sodium+dfsg/cil/src/ext/dataflows.mli --- frama-c-20140301+neon+dfsg/cil/src/ext/dataflows.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/dataflows.mli 2015-05-29 15:31:43.000000000 +0000 @@ -41,10 +41,16 @@ (* et Automatique). *) (****************************************************************************) +(** Set of dataflow frameworks. Instead of defining a single dataflow interface + that tries to accomodate with all the options, having a set of dataflows + allow to keep things simple in the general case; specific demands are + handled by using more general dataflows. Simpler-to-instanciate dataflows + are instances of the more general dataflows. *) + open Cil_types;; open Ordered_stmt;; -(* Environment relative to the function being processed, and function to +(** Environment relative to the function being processed, and function to create them from Kf. *) module type FUNCTION_ENV = sig val to_ordered: stmt -> ordered_stmt @@ -58,74 +64,78 @@ module type JOIN_SEMILATTICE = sig type t - (* Must be idempotent (join a a = a), commutative, and associative. *) + (** Must be idempotent (join a a = a), commutative, and associative. *) val join: t -> t -> t - (* Must verify that forall a, join a bottom = a. *) + (** Must verify that forall a, join a bottom = a. *) val bottom: t - (* Must verify: a is_included b <=> a join b = b. The dataflow does + (** Must verify: a is_included b <=> a join b = b. The dataflow does not require this function. *) (* val is_included: t -> t -> bool *) - (* This function is used by the dataflow algorithm to determine if - something has to be recomputed. Joining and inclusion testing are - similar operations, so it is often more efficient to do both at - the same time (e.g. when joining with bottom). Note that the - names [smaller] and [larger] are actually correct only if there - is an inclusion. - - Instead of defining it directly, it can be defined from join and - equal, or from is_included, for instance by - [if is_included new old then (true,old) else (false, join old new)] or - [let j = join old new in (equal j new, j)]. *) + (** This function is used by the dataflow algorithm to determine if + something has to be recomputed. Joining and inclusion testing are + similar operations, so it is often more efficient to do both at + the same time (e.g. when joining with bottom). Note that the + names [smaller] and [larger] are actually correct only if there + is an inclusion. + + Instead of defining it directly, it can be defined from join and + equal, or from is_included, for instance by + [if is_included new old then (true,old) else (false, join old new)] or + [let j = join old new in (equal j new, j)]. *) val join_and_is_included: t -> t -> (t * bool) - (* Display the contents of an element of the lattice. *) + (** Display the contents of an element of the lattice. *) val pretty: Format.formatter -> t -> unit end -(* Edge-based forward dataflow. It is edge-based because the transfer +(** Edge-based forward dataflow. It is edge-based because the transfer function can differentiate the state after a statement between different successors. In particular, the state can be reduced according to the conditions in if statements. *) module type FORWARD_MONOTONE_PARAMETER = sig include JOIN_SEMILATTICE - (* [transfer_stmt s state] must returns a list of pairs in which the - first element is a statement [s'] in [s.succs], and the second - element a value that will be joined with the current result for - before [s']. - - Note that it is allowed that not all succs are present in the - list returned by [transfer_stmt], or that succs are present several - times (this is useful to handle switchs). *) + (** [transfer_stmt s state] must returns a list of pairs in which the + first element is a statement [s'] in [s.succs], and the second + element a value that will be joined with the current result for + before [s']. + + Note that it is allowed that not all succs are present in the + list returned by [transfer_stmt], or that succs are present several + times (this is useful to handle switchs). *) val transfer_stmt: stmt -> t -> (stmt * t) list - (* The initial value for each statement. Statements in this list are - given the associated value, and are added to the worklist. Other - statements are initialized to bottom. *) + (** The initial value for each statement. Statements in this list are + given the associated value, and are added to the worklist. Other + statements are initialized to bottom. *) val init: (stmt * t) list end -module Simple_forward(Fenv:FUNCTION_ENV)(P:FORWARD_MONOTONE_PARAMETER) - :sig val before:P.t Ordered_stmt.ordered_stmt_array (* TODO: Should disappear, together with Fenv? *) - val fold_on_result: ('a -> stmt -> P.t -> 'a) -> 'a -> 'a - val iter_on_result: (stmt -> P.t -> unit) -> unit +module Simple_forward(Fenv:FUNCTION_ENV)(P:FORWARD_MONOTONE_PARAMETER) : sig + val before:P.t Ordered_stmt.ordered_stmt_array + (* TODO: Should disappear, together with Fenv? *) + + val fold_on_result: ('a -> stmt -> P.t -> 'a) -> 'a -> 'a + val iter_on_result: (stmt -> P.t -> unit) -> unit end;; -(* The following functions allow implementing [transfer_stmt] for the - [If] and [Switch] instruction, from a [transfer_guard] function. +(** The following functions allow implementing [transfer_stmt] for the + [If] statement, from a [transfer_guard] function. - [transfer_guard] receives a conditional expression, the current - statement, and the current state, and returns the new state when - the expression evaluates to respectively true and false. *) + [transfer_guard] receives a conditional expression, the current + statement, and the current state, and returns the new state when + the expression evaluates to respectively true and false. *) val transfer_if_from_guard: (stmt -> exp -> 'a -> 'a * 'a) -> stmt -> 'a -> (stmt * 'a) list -val transfer_switch_from_guard: + +(** Same as {!transfer_if_from_guard}, but for a [Switch] statement. *) +val transfer_switch_from_guard: (stmt -> exp -> 'a -> 'a * 'a) -> stmt -> 'a -> (stmt * 'a) list (* diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/deadcodeelim.ml frama-c-20150201+sodium+dfsg/cil/src/ext/deadcodeelim.ml --- frama-c-20140301+neon+dfsg/cil/src/ext/deadcodeelim.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/deadcodeelim.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,442 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -(* Eliminate assignment instructions whose results are not - used *) - -open Cil_types -open Cil -(*open Pretty*) - -module RD = Reachingdefs -module UD = Usedef -module IH = Datatype.Int.Hashtbl - - -module IS = FCSet.Make( - struct - type t = int - let compare = Datatype.Int.compare - end) - -let debug = RD.debug - -(* This function should be set by the client if it - * knows of functions returning a result that have - * no side effects. If the result is not used, then - * the call will be eliminated. *) -let callHasNoSideEffects : (instr -> bool) ref = - ref (fun _ -> false) - - -(* the set of used definition ids *) -let usedDefsSet = ref IS.empty - -(* a mapping d -> {u_1,...,u_n} where d is a - * definition id, and the u's are definition - * ids corresponding to definitions in which - * d was used *) -let defUseSetHash = IH.create 100 - -(* a mapping d -> {sid_1,...,sid_n} where d is - * a definition id and the sids are statement ids - * corresponding to non-Instr statements where d - * was used *) -let sidUseSetHash = IH.create 100 - -(* put used def ids into usedDefsSet *) -(* assumes reaching definitions have already been computed *) -class usedDefsCollectorClass = object(self) - inherit RD.rdVisitorClass as super - - method add_defids iosh e u = - UD.VS.iter - (fun vi -> - if IH.mem iosh vi.vid then - let ios = IH.find iosh vi.vid in - if !debug then - Kernel.debug "DCE: IOS size for vname=%s at stmt=%d: %d\n" - vi.vname - (Extlib.the self#current_stmt).sid - (RD.IOS.cardinal ios); - RD.IOS.iter - (function - | Some(i) -> - if !debug then - Kernel.debug "DCE: def %d used: %a\n" i Cil_printer.pp_exp e; - usedDefsSet := IS.add i (!usedDefsSet) - | None -> ()) ios - else if !debug then - Kernel.debug "DCE: vid %d:%s not in stm:%d iosh at %a\n" - vi.vid vi.vname - (Extlib.the self#current_stmt).sid - Cil_printer.pp_exp e) - u - - method! vexpr e = - let u = UD.computeUseExp e in - match self#get_cur_iosh() with - Some(iosh) -> self#add_defids iosh e u; DoChildren - | None -> - if !debug then - Kernel.debug "DCE: use but no rd data: %a\n" Cil_printer.pp_exp e; - DoChildren - - method! vstmt s = - ignore(super#vstmt s); - match s.skind with - | Instr _ -> DoChildren - | _ -> begin - let u,_d = UD.computeUseDefStmtKind s.skind in - match self#get_cur_iosh() with - | Some iosh -> - UD.VS.iter (fun vi -> - if IH.mem iosh vi.vid then - let ios = IH.find iosh vi.vid in - RD.IOS.iter (function - | Some i -> begin (* add s.sid to set for i *) - try - let set = IH.find sidUseSetHash i in - IH.replace sidUseSetHash i (IS.add s.sid set) - with Not_found -> - IH.add sidUseSetHash i (IS.singleton s.sid) - end - | None -> ()) ios) u; - DoChildren - | None -> DoChildren - end - - method! vinst i = - let cstmt = Extlib.the self#current_stmt in - let handle_inst iosh i = match i with - | Asm(_,_,slvl,_,_,_,_) -> List.iter (fun (_,s,lv) -> - match lv with (Var v, off) -> - if s.[0] = '+' then - self#add_defids iosh (dummy_exp(Lval(Var v, off))) - (UD.VS.singleton v) - | _ -> ()) slvl - | Call(_,ce,el,_) when not (!callHasNoSideEffects i) -> - List.iter (fun e -> - let u = UD.computeUseExp e in - UD.VS.iter (fun vi -> - if IH.mem iosh vi.vid then - let ios = IH.find iosh vi.vid in - RD.IOS.iter (function - | Some i -> begin (* add sid to set for i *) - try - let set = IH.find sidUseSetHash i in - IH.replace sidUseSetHash i (IS.add cstmt.sid set) - with Not_found -> - IH.add sidUseSetHash i (IS.singleton cstmt.sid) - end - | None -> ()) ios) u) (ce::el) - | Set((Mem _,_) as lh, rhs,_l) -> - List.iter (fun e -> - let u = UD.computeUseExp e in - UD.VS.iter (fun vi -> - if IH.mem iosh vi.vid then - let ios = IH.find iosh vi.vid in - RD.IOS.iter (function - | Some i -> begin (* add sid to set for i *) - try - let set = IH.find sidUseSetHash i in - IH.replace sidUseSetHash i (IS.add cstmt.sid set) - with Not_found -> - IH.add sidUseSetHash i (IS.singleton cstmt.sid) - end - | None -> ()) ios) u) ([new_exp - ~loc:Cil_datatype.Location.unknown - (Lval(lh));rhs]) - | _ -> () - in - ignore(super#vinst i); - match cur_rd_dat with - | None -> begin - if !debug then (Kernel.debug "DCE: instr with no cur_rd_dat\n"); - (* handle_inst *) - DoChildren - end - | Some(_,s,iosh) -> begin - let u,d = UD.computeUseDefInstr i in - (* add things in d to the U sets for things in u *) - let rec loop n = - if n < 0 then () else begin - UD.VS.iter (fun vi -> - if IH.mem iosh vi.vid then - let ios = IH.find iosh vi.vid in - RD.IOS.iter (function - | Some i -> begin (* add n + s to set for i *) - try - let set = IH.find defUseSetHash i in - IH.replace defUseSetHash i (IS.add (n+s) set) - with Not_found -> - IH.add defUseSetHash i (IS.singleton (n+s)) - end - | None -> ()) ios - else ()) u; - loop (n-1) - end - in - loop (UD.VS.cardinal d - 1); - handle_inst iosh i; - DoChildren - end - -end - -let is_volatile_tp tp = - List.exists (function (Attr("volatile",_)) -> true - | _ -> false) (typeAttrs tp) - -let is_volatile_vi vi = - let vi_vol = - List.exists (function (Attr("volatile",_)) -> true - | _ -> false) vi.vattr in - vi_vol || is_volatile_tp vi.vtype - - -(*************************************************** - * Also need to find reads from volatiles - * uses two functions above which - * are basically what Zach wrote, except one is for - * types and one is for vars. Another difference is - * they filter out pointers to volatiles. This - * handles DMA - ***************************************************) -class hasVolatile flag = object - inherit nopCilVisitor - method! vlval l = - let tp = typeOfLval l in - if (is_volatile_tp tp) then flag := true; - DoChildren - method! vexpr _e = - DoChildren -end - -let exp_has_volatile e = - let flag = ref false in - ignore (visitCilExpr (new hasVolatile flag) e); - !flag - -let el_has_volatile = - List.fold_left (fun b e -> - b || (exp_has_volatile e)) false - (***************************************************) - -let rec stripNopCasts (e:exp): exp = - match e.enode with - CastE(t, e') -> begin - match unrollType (typeOf e'), unrollType t with - TPtr _, TPtr _ -> (* okay to strip *) - stripNopCasts e' - (* strip casts from pointers to unsigned int/long*) - | (TPtr _ as t1), (TInt(ik,_) as t2) - when bitsSizeOf t1 = bitsSizeOf t2 - && not (isSigned ik) -> - stripNopCasts e' - | (TInt _ as t1), (TInt _ as t2) - when bitsSizeOf t1 = bitsSizeOf t2 -> (* Okay to strip.*) - stripNopCasts e' - | _ -> e - end - | _ -> e - -let compareExpStripCasts (e1: exp) (e2: exp) : bool = - compareExp (stripNopCasts e1) (stripNopCasts e2) - -let removedCount = ref 0 -(* Filter out instructions whose definition ids are not - in usedDefsSet *) -class uselessInstrElim : cilVisitor = object - inherit nopCilVisitor - - method! vstmt stm = - - (* give a set of varinfos and an iosh and get - * the set of definition ids definining the vars *) - let viSetToDefIdSet iosh vis = - UD.VS.fold (fun vi s -> - if IH.mem iosh vi.vid then - let ios = IH.find iosh vi.vid in - RD.IOS.fold (fun io s -> - match io with None -> s - | Some i -> IS.add i s) ios s - else s) vis IS.empty - in - - (* false when U(defid)\subeq instruses and SU(d) = empty *) - let check_defid i instruses iosh defid = - IS.mem defid (!usedDefsSet) && - try - let defuses = IH.find defUseSetHash defid in - (*let siduses = IH.find sidUseSetHash defid in*) - if IH.mem sidUseSetHash defid then begin - if !debug then - Kernel.debug "siduses not empty: %a\n" Cil_printer.pp_instr i; - true - end else begin - (* true if there is something in defuses not in instruses or when - * something from defuses is in instruses and is also used somewhere else *) - let instruses = viSetToDefIdSet iosh instruses in - IS.fold (fun i' b -> - if not(IS.mem i' instruses) then begin - if !debug then - Kernel.debug "i not in instruses: %a\n" Cil_printer.pp_instr i; - true - end else - (* can only use the definition i' at the definition defid *) - let i'_uses = IH.find defUseSetHash i' in - IH.mem sidUseSetHash i' || - if not(IS.equal i'_uses (IS.singleton defid)) then begin - IS.iter (fun iu -> match RD.getSimpRhs iu with - | Some(RD.RDExp e) -> - if !debug then Kernel.debug "i' had other than one use: %d: %a\n" - (IS.cardinal i'_uses) Cil_printer.pp_exp e - | Some(RD.RDCall i) -> - if !debug then Kernel.debug "i' had other than one use: %d: %a\n" - (IS.cardinal i'_uses) Cil_printer.pp_instr i - | None -> ()) i'_uses; - true - end else b) defuses false - end - with Not_found -> true - in - - let test (i,(_,s,iosh)) = - match i with - | Call(Some(Var vi,NoOffset),{enode = Lval(Var _vf,NoOffset)},el,_l) -> - if not(!callHasNoSideEffects i) then begin - if !debug then - Kernel.debug "found call w/ side effects: %a\n" - Cil_printer.pp_instr i; - true - end else begin - if !debug then - Kernel.debug "found call w/o side effects: %a\n" - Cil_printer.pp_instr i; - (vi.vglob || (is_volatile_vi vi) || (el_has_volatile el) || - let uses, defd = UD.computeUseDefInstr i in - let rec loop n = - n >= 0 && - (check_defid i uses iosh (n+s) || loop (n-1)) - in - loop (UD.VS.cardinal defd - 1) || (incr removedCount; false)) - end - | Call _ -> true - | Set(lh,e,_) when compareExpStripCasts (dummy_exp (Lval lh)) e -> - false (* filter x = x *) - | Set((Var vi,NoOffset),e,_) -> - vi.vglob || (is_volatile_vi vi) || (exp_has_volatile e) || - let uses, defd = UD.computeUseDefInstr i in - let rec loop n = - n >= 0 && - (check_defid i uses iosh (n+s) || loop (n-1)) - in - loop (UD.VS.cardinal defd - 1) || (incr removedCount; false) - | _ -> true - in - - let filter il stmdat = - match - let rd_dat_lst = RD.instrRDs il stm.sid stmdat false in - let ildatlst = List.combine [il] rd_dat_lst in - let ildatlst' = List.filter test ildatlst in - let (newil,_) = List.split ildatlst' in - newil - with - | [] -> Skip Cil_datatype.Location.unknown - | [ x ] -> x - | _ :: _ :: _ -> assert false - in - - match RD.getRDs stm with - None -> DoChildren - | Some(_,s,iosh) -> - match stm.skind with - Instr il -> - stm.skind <- Instr(filter il ((),s,iosh)); - SkipChildren - | _ -> DoChildren - -end - -(* until fixed point is reached *) -let elim_dead_code_fp (fd : fundec) : fundec = - (* fundec -> fundec *) - let rec loop fd = - usedDefsSet := IS.empty; - IH.clear defUseSetHash; - IH.clear sidUseSetHash; - removedCount := 0; - RD.computeRDs fd; - ignore(visitCilFunction (new usedDefsCollectorClass :> cilVisitor) fd); - let fd' = visitCilFunction (new uselessInstrElim) fd in - if !removedCount = 0 then fd' else loop fd' - in - loop fd - -(* just once *) -let elim_dead_code (fd : fundec) : fundec = - (* fundec -> fundec *) - usedDefsSet := IS.empty; - IH.clear defUseSetHash; - IH.clear sidUseSetHash; - removedCount := 0; - RD.computeRDs fd; - if !debug then (Kernel.debug "DCE: collecting used definitions\n"); - ignore(visitCilFunction (new usedDefsCollectorClass :> cilVisitor) fd); - if !debug then (Kernel.debug "DCE: eliminating useless instructions\n"); - visitCilFunction (new uselessInstrElim) fd - -class deadCodeElimClass full : cilVisitor = object - inherit nopCilVisitor - - method! vfunc fd = - let fd' = (if full then elim_dead_code_fp else elim_dead_code) fd in - ChangeTo(fd') - -end - -let dce ~full f = - if !debug then (Kernel.debug "DCE: starting dead code elimination\n"); - visitCilFile (new deadCodeElimClass full) f diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/deadcodeelim.mli frama-c-20150201+sodium+dfsg/cil/src/ext/deadcodeelim.mli --- frama-c-20140301+neon+dfsg/cil/src/ext/deadcodeelim.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/deadcodeelim.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -(** Dead code elimination. - -Note this is legacy Cil code, which is probably incorrect wrt. Frama-C -invariants. In particular, it uses inplace visitors to modify the AST. -Use with caution *) - - -val elim_dead_code : Cil_types.fundec -> Cil_types.fundec -(** Perform one pass of dead code elimination *) - -val elim_dead_code_fp : Cil_types.fundec -> Cil_types.fundec -(** Perform dead code elimination until a fixpoint is reach *) - -val dce : full:bool -> Cil_types.file -> unit -(** Perform dead code elimination on the entire file. If [full] is [false], - only one pass is performed. Otherwise, elimination is performed until - a fixpoint is reached. *) diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/expcompare.ml frama-c-20150201+sodium+dfsg/cil/src/ext/expcompare.ml --- frama-c-20140301+neon+dfsg/cil/src/ext/expcompare.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/expcompare.ml 2015-05-28 08:53:23.000000000 +0000 @@ -109,7 +109,7 @@ inherit nopCilVisitor method! vtype (t : typ) = - if hasAttribute "volatile" (typeAttrs t) then begin + if typeHasAttribute "volatile" t then begin br := true; SkipChildren end diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/liveness.ml frama-c-20150201+sodium+dfsg/cil/src/ext/liveness.ml --- frama-c-20140301+neon+dfsg/cil/src/ext/liveness.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/liveness.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,214 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -(* Calculate which variables are live at - * each statememnt. - * - * - * - *) - -open Cil_types -open Cil - -module UD = Usedef -module VS = Cil_datatype.Varinfo.Set - -let debug = ref false - -let live_label = ref "" -let live_func = ref "" - -let debug_print fmt vs = VS.fold - (fun vi _d -> - Format.fprintf fmt "name: %s id:%d " vi.vname - vi.vid) - vs (); - Format.fprintf fmt "@\n" - - -let min_print fmt vs = - VS.iter - (fun vi -> Format.fprintf fmt "%s(%a)," vi.vname Cil_printer.pp_typ vi.vtype) - vs; - Format.fprintf fmt "@\n" - -let printer = ref debug_print - -module LiveFlow = struct - let name = "Liveness" - let debug = false - type t = VS.t - module StmtStartData = - Dataflow2.StartData(struct type t = VS.t let size = 32 end) - - let pretty fmt vs = - let fn = !printer in - fn fmt vs - - let funcExitData = VS.empty - - let combineStmtStartData (_stm:stmt) ~(old:t) (now:t) = - if not(VS.compare old now = 0) - then Some now - else None - - let combineSuccessors = VS.union - - let doStmt stmt = - if debug then Kernel.debug "looking at: %a\n" Cil_printer.pp_stmt stmt; - match stmt.succs with - [] -> let u,_d = UD.computeUseDefStmtKind stmt.skind in - if debug then (Kernel.debug "doStmt: no succs %d\n" stmt.sid); - Dataflow2.Done u - | _ -> - let handle_stm vs = match stmt.skind with - Instr _ -> vs - | s -> let u, d = UD.computeUseDefStmtKind s in - VS.union u (VS.diff vs d) - in - Dataflow2.Post handle_stm - - let doInstr _ i _vs = - let transform vs' = - let u,d = UD.computeUseDefInstr i in - VS.union u (VS.diff vs' d) - in - Dataflow2.Post transform - - let filterStmt _stm1 _stm2 = true -end - -module L = Dataflow2.Backwards(LiveFlow) - -(* XXX: This does not compute the best ordering to - * give to the work-list algorithm. - *) -let all_stmts = ref [] -class nullAdderClass = object - inherit nopCilVisitor - - method! vstmt s = - all_stmts := s :: (!all_stmts); - LiveFlow.StmtStartData.add s VS.empty; - DoChildren - -end - -let null_adder fdec = - ignore(visitCilFunction (new nullAdderClass) fdec); - !all_stmts - -let computeLiveness fdec = - LiveFlow.StmtStartData.clear (); - UD.onlyNoOffsetsAreDefs := false; - all_stmts := []; - let a = null_adder fdec in - L.compute a - -let getLiveSet sid = - try Some(LiveFlow.StmtStartData.find sid) - with Not_found -> None - -let print_everything () = - LiveFlow.StmtStartData.iter (fun s vs -> - Format.printf "%d: %a" s.sid LiveFlow.pretty vs) - -let match_label lbl = match lbl with - Label(str,_,_b) -> - if !debug then (Kernel.debug "Liveness: label seen: %s\n" str); - (*b && *)(String.compare str (!live_label) = 0) -| _ -> false - -class doFeatureClass = object - inherit nopCilVisitor - - method! vfunc fd = - if String.compare fd.svar.vname (!live_func) = 0 then - (Cfg.clearCFGinfo fd; - ignore(Cfg.cfgFun fd); - computeLiveness fd; - if String.compare (!live_label) "" = 0 then - (printer := min_print; - print_everything (); - SkipChildren) - else DoChildren) - else SkipChildren - - method! vstmt s = - if List.exists match_label s.labels then try - let vs = LiveFlow.StmtStartData.find s in - (printer := min_print; - Format.printf "%a" LiveFlow.pretty vs; - SkipChildren) - with Not_found -> - if !debug then (Kernel.debug "Liveness: stmt: %d not found\n" s.sid); - DoChildren - else - (if List.length s.labels = 0 then - if !debug then (Kernel.debug "Liveness: no label at sid=%d\n" s.sid); - DoChildren) - -end - -let do_live_feature (f:file) = - visitCilFile (new doFeatureClass) f - -let feature = - { - fd_name = "Liveness"; - fd_enabled = ref false; - fd_description = "Spit out live variables at a label"; - fd_extraopt = [ - "--live_label", - Arg.String (fun s -> live_label := s), - "Output the variables live at this label"; - "--live_func", - Arg.String (fun s -> live_func := s), - "Output the variables live at each statement in this function."; - "--live_debug", - Arg.Unit (fun _n -> debug := true), - "Print lots of debugging info";]; - fd_doit = do_live_feature; - fd_post_check = false - } diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/oneret.ml frama-c-20150201+sodium+dfsg/cil/src/ext/oneret.ml --- frama-c-20140301+neon+dfsg/cil/src/ext/oneret.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/oneret.ml 2015-05-28 08:53:23.000000000 +0000 @@ -337,9 +337,15 @@ Stack.push returns returns_clause_stack; Stack.push ca.annot_content stmt_contract_stack; scanStmts (s::acc) mainbody (popstack + 1) rests - + | { skind = TryCatch(t,c,l) } as s :: rests -> + let scan_one_catch (e,b) = (e,scanBlock false b) in + let t = scanBlock false t in + let c = List.map scan_one_catch c in + s.skind <- TryCatch(t,c,l); + popn popstack; + scanStmts (s::acc) mainbody 0 rests | ({skind=(Goto _ | Instr _ | Continue _ | Break _ - | TryExcept _ | TryFinally _)} as s) + | TryExcept _ | TryFinally _ | Throw _)} as s) :: rests -> popn popstack; scanStmts (s::acc) mainbody 0 rests diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/ordered_stmt.ml frama-c-20150201+sodium+dfsg/cil/src/ext/ordered_stmt.ml --- frama-c-20140301+neon+dfsg/cil/src/ext/ordered_stmt.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/ordered_stmt.ml 2015-05-28 08:53:23.000000000 +0000 @@ -1,45 +1,24 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) open Cil_types diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/ordered_stmt.mli frama-c-20150201+sodium+dfsg/cil/src/ext/ordered_stmt.mli --- frama-c-20140301+neon+dfsg/cil/src/ext/ordered_stmt.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/ordered_stmt.mli 2015-05-28 08:53:23.000000000 +0000 @@ -1,45 +1,24 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) open Cil_types diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/reachingdefs.ml frama-c-20150201+sodium+dfsg/cil/src/ext/reachingdefs.ml --- frama-c-20140301+neon+dfsg/cil/src/ext/reachingdefs.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/reachingdefs.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,584 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -(* Calculate reaching definitions for each instruction. - * Determine when it is okay to replace some variables with - * expressions. - * - * After calling computeRDs on a fundec, - * ReachingDef.stmtStartData will contain a mapping from - * statement ids to data about which definitions reach each - * statement. ReachingDef.defIdStmtHash will contain a - * mapping from definition ids to the statement in which - * that definition takes place. - * - * instrRDs takes a list of instructions, and the - * definitions that reach the first instruction, and - * for each instruction figures out which definitions - * reach into or out of each instruction. - * - *) -open Cil_types -open Cil - -module DF = Dataflow2 -module UD = Usedef -module L = Liveness -module IH = Datatype.Int.Hashtbl - (* This module always uses "int = varinfo.vid", but generate some new ids - at some point. Thus, it cannot be easily be replaced by - Cil_datatype.Varinfo.Hashtbl... *) - -let debug_fn = ref "" - -module IOS = - FCSet.Make(struct - type t = int option - let compare io1 io2 = - match io1, io2 with - Some i1, Some i2 -> Datatype.Int.compare i1 i2 - | Some _i1, None -> 1 - | None, Some _i2 -> -1 - | None, None -> 0 - end) - -let debug = ref false - -(* return the intersection of - Datatype.Int.Hashtbles ih1 and ih2 *) -let ih_inter ih1 ih2 = - let ih' = IH.copy ih1 in - IH.iter (fun id _vi -> - if not(IH.mem ih2 id) then - IH.remove ih' id else - ()) ih1; - ih' - -let ih_union ih1 ih2 = - let ih' = IH.copy ih1 in - IH.iter (fun id vi -> - if not(IH.mem ih' id) - then IH.add ih' id vi - else ()) ih2; - ih' - -(* Lookup varinfo in iosh. If the set contains None - or is not a singleton, return None, otherwise - return Some of the singleton *) -(* IOS.t IH.t -> varinfo -> int option *) -let iosh_singleton_lookup iosh vi = - if IH.mem iosh vi.vid then - let ios = IH.find iosh vi.vid in - if not (IOS.cardinal ios = 1) then None - else IOS.choose ios - else None - -(* IOS.t IH.t -> varinfo -> IOS.t *) -let iosh_lookup iosh vi = - if IH.mem iosh vi.vid - then Some(IH.find iosh vi.vid) - else None - -(* return Some(vid) if iosh contains defId. - return None otherwise *) -(* IOS.t IH.t -> int -> int option *) -let iosh_defId_find iosh defId = - (* int -> IOS.t -> int option -> int option*) - let get_vid vid ios io = - match io with - Some(i) -> Some(i) - | None -> - let there = IOS.exists - (function None -> false - | Some(i') -> defId = i') ios in - if there then Some(vid) else None - in - IH.fold get_vid iosh None - -(* The resulting iosh will contain the - union of the same entries from iosh1 and - iosh2. If iosh1 has an entry that iosh2 - does not, then the result will contain - None in addition to the things from the - entry in iosh1. *) -(* XXX this function is a performance bottleneck *) -let iosh_combine iosh1 iosh2 = - let iosh' = IH.copy iosh1 in - IH.iter (fun id ios1 -> - try let ios2 = IH.find iosh2 id in - let newset = IOS.union ios1 ios2 in - IH.replace iosh' id newset; - with Not_found -> - let newset = IOS.add None ios1 in - IH.replace iosh' id newset) iosh1; - IH.iter (fun id ios2 -> - try ignore(IH.find iosh1 id) - with Not_found -> begin - (*if not(IH.mem iosh1 id) then*) - let newset = IOS.add None ios2 in - IH.add iosh' id newset end) iosh2; - iosh' - - -(* determine if two IOS.t IH.t s are the same *) -let iosh_equals iosh1 iosh2 = -(* if IH.length iosh1 = 0 && not(IH.length iosh2 = 0) || - IH.length iosh2 = 0 && not(IH.length iosh1 = 0)*) - if not(IH.length iosh1 = IH.length iosh2) - then - (Kernel.debug "iosh_equals: length not same" ; false) - else - IH.fold (fun vid ios b -> - if not b then b else - try let ios2 = IH.find iosh2 vid in - if not(IOS.compare ios ios2 = 0) then - (Kernel.debug "iosh_equals: sets for vid %d not equal\n" vid ; false) - else true - with Not_found -> - (Kernel.debug "iosh_equals: vid %d not in iosh2\n" vid ; false)) - iosh1 true - -(* replace an entire set with a singleton. - if nothing was there just add the singleton *) -(* IOS.t IH.t -> int -> varinfo -> unit *) -let iosh_replace iosh i vi = - if IH.mem iosh vi.vid then - let newset = IOS.singleton (Some i) in - IH.replace iosh vi.vid newset - else - let newset = IOS.singleton (Some i) in - IH.add iosh vi.vid newset - - -let iosh_filter_dead iosh vs = - IH.iter (fun vid _ -> - if not(UD.VS.exists (fun vi -> vid = vi.vid) vs) - then IH.remove iosh vid) - iosh - - -(* remove definitions that are killed. - add definitions that are gend *) -(* Takes the defs, the data, and a function for - obtaining the next def id *) -(* VS.t -> IOS.t IH.t -> (unit->int) -> unit *) -let proc_defs vs iosh f = - let pd vi = - let newi = f() in - (*if !debug then - ignore (E.log "proc_defs: genning %d\n" newi);*) - iosh_replace iosh newi vi - in - UD.VS.iter pd vs - -let idMaker () start = - let counter = ref start in - fun () -> - let ret = !counter in - counter := !counter + 1; - ret - -(* given reaching definitions into a list of - instructions, figure out the definitions that - reach in/out of each instruction *) -(* if out is true then calculate the definitions that - go out of each instruction, if it is false then - calculate the definitions reaching into each instruction *) -(* instr list -> int -> (varinfo IH.t * int) -> bool -> (varinfo IH.t * int) list *) -let iRDsHtbl = Hashtbl.create 128 -let instrRDs il sid (_ivih, s, iosh) out = - if Hashtbl.mem iRDsHtbl (sid,out) then Hashtbl.find iRDsHtbl (sid,out) else - -(* let print_instr i (_,s', iosh') = *) -(* let d = d_instr () i ++ line in *) -(* fprint stdout 80 d; *) -(* flush stdout *) -(* in *) - - let proc_one hil i = - match hil with - | [] -> - let _, defd = UD.computeUseDefInstr i in - if UD.VS.is_empty defd - then ((*if !debug then print_instr i ((), s, iosh);*) - [((), s, iosh)]) - else - let iosh' = IH.copy iosh in - proc_defs defd iosh' (idMaker () s); - (*if !debug then - print_instr i ((), s + UD.VS.cardinal defd, iosh');*) - ((), s + UD.VS.cardinal defd, iosh')::hil - | (_, s', iosh')::_hrst as l -> - let _, defd = UD.computeUseDefInstr i in - if UD.VS.is_empty defd - then - ((*if !debug then - print_instr i ((),s', iosh');*) - ((), s', iosh')::l) - else let iosh'' = IH.copy iosh' in - proc_defs defd iosh'' (idMaker () s'); - (*if !debug then - print_instr i ((), s' + UD.VS.cardinal defd, iosh'');*) - ((),s' + UD.VS.cardinal defd, iosh'')::l - in - let folded = List.fold_left proc_one [((),s,iosh)] [il] in - let foldedout = List.tl (List.rev folded) in - let foldednotout = List.rev (List.tl folded) in - Hashtbl.add iRDsHtbl (sid,true) foldedout; - Hashtbl.add iRDsHtbl (sid,false) foldednotout; - if out then foldedout else foldednotout - - - -(* The right hand side of an assignment is either - a function call or an expression *) -type rhs = RDExp of exp | RDCall of instr - -module ReachingDef = - struct - - let name = "Reaching Definitions" - - let debug = false - - (* Should the analysis calculate may-reach - or must-reach *) - let mayReach = ref false - - (* An integer that tells the id number of - the first definition *) - (* Also a hash from variable ids to a set of - definition ids that reach this statement. - None means there is a path to this point on which - there is no definition of the variable *) - type t = (unit * int * IOS.t IH.t) - - module StmtStartData = - Dataflow2.StartData - (struct type t = (unit * int * IOS.t IH.t) let size = 32 end) - (* entries for starting statements must - be added before calling compute *) - - let copy (_, i, iosh) = ((), i, Datatype.Int.Hashtbl.copy iosh) - - (* a mapping from definition ids to - the statement corresponding to that id *) - let defIdStmtHash = Datatype.Int.Hashtbl.create 32 - - (* mapping from statement ids to statements - for better performance of ok_to_replace *) - let sidStmtHash = Datatype.Int.Hashtbl.create 64 - - (* pretty printer *) - let pretty _fmt _ = () (* prettyprint defIdStmtHash stmtStartData*) - - - (* The first id to use when computeFirstPredecessor - is next called *) - let nextDefId = ref 0 - - (* Count the number of variable definitions in - a statement *) - let num_defs stm = - match stm.skind with - Instr(il) -> List.fold_left (fun s i -> - let _, d = UD.computeUseDefInstr i in - s + UD.VS.cardinal d) 0 [il] - | _ -> let _, d = UD.computeUseDefStmtKind stm.skind in - UD.VS.cardinal d - - (* the first predecessor is just the data in along with - the id of the first definition of the statement, - which we get from nextDefId *) - let computeFirstPredecessor stm (_, s, iosh) = - let startDefId = max !nextDefId s in - let numds = num_defs stm in - let rec loop n = - if n < 0 - then () - else - (Kernel.debug "RD: defId %d -> stm %d\n" (startDefId + n) stm.sid ; - Datatype.Int.Hashtbl.add defIdStmtHash (startDefId + n) stm; - loop (n-1)) - in - loop (numds - 1); - nextDefId := startDefId + numds; - ((), startDefId, Datatype.Int.Hashtbl.copy iosh) - - - let combinePredecessors (_stm:stmt) ~(old:t) ((_, _s, iosh):t) = - match old with (_, os, oiosh) -> begin - if iosh_equals oiosh iosh - then None - else - Some((), os, iosh_combine oiosh iosh) - end - - (* return an action that removes things that - are redefinied and adds the generated defs *) - let doInstr _ inst (_, s, iosh) = - let _, defd = UD.computeUseDefInstr inst in - proc_defs defd iosh (idMaker () s); - ((), s + UD.VS.cardinal defd, iosh) - - (* all the work gets done at the instruction level *) - let doStmt stm (_, _s, iosh) = - if not(Datatype.Int.Hashtbl.mem sidStmtHash stm.sid) then - Datatype.Int.Hashtbl.add sidStmtHash stm.sid stm; - if debug then Kernel.debug "RD: looking at %a\n" Cil_printer.pp_stmt stm; - match L.getLiveSet stm with - | None -> DF.SDefault - | Some vs -> begin - iosh_filter_dead iosh vs; - DF.SDefault - end - - - let doGuard _ _condition _ = DF.GDefault, DF.GDefault - - let doEdge _ _ d = d - -end - -module RD = Dataflow2.Forwards(ReachingDef) - -(* take the id number of a definition and return - the rhs of the definition if there is one. - Returns None if, for example, the definition is - caused by an assembly instruction *) -(* stmt IH.t -> (()*int*IOS.t IH.t) IH.t -> int -> (rhs * int * IOS.t IH.t) option *) -let rhsHtbl = IH.create 64 (* to avoid recomputation *) -let getDefRhs didstmh defId = - if IH.mem rhsHtbl defId then IH.find rhsHtbl defId else - let stm = - try IH.find didstmh defId - with Not_found -> Kernel.fatal "getDefRhs: defId %d not found\n" defId in - let (_,s,iosh) = - try ReachingDef.StmtStartData.find stm - with Not_found -> Kernel.fatal "getDefRhs: sid %d not found \n" stm.sid in - match stm.skind with - Instr il -> - let ivihl = instrRDs il stm.sid ((),s,iosh) true in (* defs that reach out of each instr *) - let ivihl_in = instrRDs il stm.sid ((),s,iosh) false in (* defs that reach into each instr *) - begin try - let iihl = List.combine (List.combine [il] ivihl) ivihl_in in - (try let ((i,(_,_,_diosh)),(_,_,iosh_in)) = List.find (fun ((i,(_,_,iosh')),_) -> - match iosh_defId_find iosh' defId with - Some vid -> - (match i with - Set((Var vi',NoOffset),_,_) -> vi'.vid = vid (* _ -> NoOffset *) - | Call(Some(Var vi',NoOffset),_,_,_) -> vi'.vid = vid (* _ -> NoOffset *) - | Call(None,_,_,_) -> false - | Asm(_,_,sll,_,_,_,_) -> List.exists - (function (_,_,(Var vi',NoOffset)) -> vi'.vid = vid | _ -> false) sll - | _ -> false) - | None -> false) iihl in - (match i with - Set((lh,_),e,_) -> - (match lh with - Var _vi' -> - (IH.add rhsHtbl defId (Some(RDExp(e),stm.sid,iosh_in)); - Some(RDExp(e), stm.sid, iosh_in)) - | _ -> Kernel.fatal "Reaching Defs getDefRhs: right vi not first") - | Call(_lvo,_e,_el,_) -> - (IH.add rhsHtbl defId (Some(RDCall(i),stm.sid,iosh_in)); - Some(RDCall(i), stm.sid, iosh_in)) - | Skip _ | Code_annot _ -> None - | Asm(_a,_sl,_slvl,_sel,_sl',_,_) -> None) (* ? *) - with Not_found -> - (if !debug then (Kernel.debug "getDefRhs: No instruction defines %d" defId); - IH.add rhsHtbl defId None; - None)) - with Invalid_argument _ -> None end - | _ -> Kernel.fatal "getDefRhs: defining statement not an instruction list %d" defId - (*None*) - -let prettyprint _fmt _didstmh _stmdat () (_,_s,_iosh) = () - (*seq line (fun (vid,ios) -> - num vid ++ text ": " ++ - IOS.fold (fun io d -> match io with - None -> d ++ text "None " - | Some i -> - let stm = IH.find didstmh i in - match getDefRhs didstmh stmdat i with - None -> d ++ num i - | Some(RDExp(e),_,_) -> - d ++ num i ++ text " " ++ (d_exp () e) - | Some(RDCall(c),_,_) -> - d ++ num i ++ text " " ++ (d_instr () c)) - ios nil) - (IH.tolist iosh)*) - -(* map all variables in vil to a set containing - None in iosh *) -(* IOS.t IH.t -> varinfo list -> () *) -let iosh_none_fill iosh vil = - List.iter (fun vi -> - IH.add iosh vi.vid (IOS.singleton None)) - vil - -let clearMemos () = - IH.clear rhsHtbl; - Hashtbl.clear iRDsHtbl - - -(* Computes the reaching definitions for a - function. *) -(* Cil.fundec -> unit *) -let computeRDs fdec = - try - if String.compare fdec.svar.vname (!debug_fn) = 0 then - (debug := true; - Kernel.debug "%s =\n%a\n" (!debug_fn) Cil_printer.pp_block fdec.sbody); - let bdy = fdec.sbody in - let slst = bdy.bstmts in - ReachingDef.StmtStartData.clear (); - IH.clear ReachingDef.defIdStmtHash; - IH.clear rhsHtbl; - Hashtbl.clear iRDsHtbl; - ReachingDef.nextDefId := 0; - let fst_stm = List.hd slst in - let fst_iosh = IH.create 32 in - UD.onlyNoOffsetsAreDefs := false; - ReachingDef.StmtStartData.add fst_stm ((), 0, fst_iosh); - L.computeLiveness fdec; - ignore(ReachingDef.computeFirstPredecessor fst_stm ((), 0, fst_iosh)); - if !debug then Kernel.debug "computeRDs: fst_stm.sid=%d\n" fst_stm.sid ; - RD.compute [fst_stm]; - if String.compare fdec.svar.vname (!debug_fn) = 0 then - debug := false - (* now ReachingDef.stmtStartData has the reaching def data in it *) - with Failure "hd" -> if String.compare fdec.svar.vname (!debug_fn) = 0 then - debug := false - -(* return the definitions that reach the statement - with statement id sid *) -let getRDs sid = - try - Some (ReachingDef.StmtStartData.find sid) - with Not_found -> - None -(* E.s (E.error "getRDs: sid %d not found\n" sid) *) - -let getDefIdStmt defid = - try - Some(IH.find ReachingDef.defIdStmtHash defid) - with Not_found -> - None - -let getStmt sid = - try Some(IH.find ReachingDef.sidStmtHash sid) - with Not_found -> None - -(* returns the rhs for the definition *) -let getSimpRhs defId = - let rhso = getDefRhs ReachingDef.defIdStmtHash defId in - match rhso with None -> None - | Some(r,_,_) -> Some(r) - -(* check if i is responsible for defId *) -(* instr -> int -> bool *) -let isDefInstr i defId = - match getSimpRhs defId with - Some(RDCall i') -> Cil_datatype.Instr.equal i i' - | _ -> false - -(* -(* Pretty print the reaching definition data for - a function *) -let ppFdec fdec = - seq line (fun stm -> - let ivih = IH.find ReachingDef.stmtStartData stm.sid in - ReachingDef.pretty () ivih) fdec.sbody.bstmts - -*) -(* If this class is extended with a visitor on expressions, - then the current rd data is available at each expression *) -class rdVisitorClass = object (self) - inherit nopCilVisitor - - (* if a list of instructions is being processed, - then this is the corresponding list of - reaching definitions *) - val mutable rd_dat_lst = [] - - (* these are the reaching defs for the current - instruction if there is one *) - val mutable cur_rd_dat = None - - method! vstmt stm = - match getRDs stm with - | None -> - if !debug then (Kernel.debug "rdVis: stm %d had no data\n" stm.sid); - cur_rd_dat <- None; - DoChildren - | Some(_,s,iosh) -> - match stm.skind with - Instr il -> - if !debug then (Kernel.debug "rdVis: visit il\n"); - rd_dat_lst <- instrRDs il stm.sid ((),s,iosh) false; - DoChildren - | _ -> - if !debug then (Kernel.debug "rdVis: visit non-il\n"); - cur_rd_dat <- None; - DoChildren - - method! vinst i = - if !debug then Kernel.debug "rdVis: before %a, rd_dat_lst is %d long\n" - Cil_printer.pp_instr i (List.length rd_dat_lst); - try - cur_rd_dat <- Some(List.hd rd_dat_lst); - rd_dat_lst <- List.tl rd_dat_lst; - DoChildren - with Failure "hd" -> - if !debug then (Kernel.debug "rdVis: il rd_dat_lst mismatch\n"); - DoChildren - - method get_cur_iosh () = - match cur_rd_dat with - None -> (match getRDs (Extlib.the self#current_stmt) with - None -> None - | Some(_,_,iosh) -> Some iosh) - | Some(_,_,iosh) -> Some iosh - -end diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/rmciltmps.ml frama-c-20150201+sodium+dfsg/cil/src/ext/rmciltmps.ml --- frama-c-20140301+neon+dfsg/cil/src/ext/rmciltmps.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/rmciltmps.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,1178 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -(* These are functions etc. for removing CIL generated - temporary variables. Some can be removed immediately, - others must wait until pretty printing *) - -open Cil_types -open Cil - -module RD = Reachingdefs -module AELV = Availexpslv -module UD = Usedef -module IH = Datatype.Int.Hashtbl -module IS = Datatype.Int.Set - -let debug = RD.debug - - -(* Type for the form of temporary variable names *) -type nameform = Suffix of string | Prefix of string | Exact of string - -(* take the id number of a definition and return - the rhs of the definition if there is one. - Returns None if, for example, the definition is - caused by an assembly instruction *) -(* int -> (rhs * int * IOS.t IH.t) option *) -let getDefRhs = RD.getDefRhs RD.ReachingDef.defIdStmtHash - -(* exp_is_ok_replacement - - Returns false if the argument contains a pointer dereference - or a variable whose address is taken anywhere *) - -let exp_ok = ref true -class memReadOrAddrOfFinderClass = object - inherit nopCilVisitor - - method! vexpr e = match e.enode with - Lval(Mem _, _) -> - exp_ok := false; - SkipChildren - | _ -> DoChildren - - method! vvrbl vi = - if vi.vglob then - (if !debug then (Kernel.debug "memReadOrAddrOfFinder: %s is a global\n" - vi.vname); - exp_ok := false; - SkipChildren) - else if vi.vaddrof then - (if !debug then - (Kernel.debug "memReadOrAddrOfFinder: %s has its address taken\n" - vi.vname); - exp_ok := false; - SkipChildren) - else (if !debug then (Kernel.debug "memReadOrAddrOfFinder: %s does not have its address taken\n" - vi.vname); - DoChildren) - -end - -let memReadOrAddrOfFinder = new memReadOrAddrOfFinderClass - -(* exp -> bool *) -let exp_is_ok_replacement e = - if !debug then - Kernel.debug "exp_is_ok_replacement: in exp_is_ok_replacement with %a\n" - Cil_printer.pp_exp e; - exp_ok := true; - ignore(visitCilExpr memReadOrAddrOfFinder e); - !exp_ok - -let emptyStmt = mkEmptyStmt () -let fsr = ref emptyStmt -class stmtFinderClass sid = object - inherit nopCilVisitor - - method! vstmt stm = - if stm.sid = sid - then (fsr := stm; SkipChildren) - else DoChildren - -end - -let find_statement _f sid = RD.getStmt sid - -(* Are there writes to memory in between - the two statements with the given ids *) -(* fundec -> int -> int -> bool *) -let wbHtbl = Hashtbl.create 256 -let writes_between f dsid sid = - if Hashtbl.mem wbHtbl (dsid,sid) then Hashtbl.find wbHtbl (dsid,sid) else - let dstmo = find_statement f dsid in - let stmo = find_statement f sid in - let find_write s = match s.skind with - Instr il -> List.exists (fun i -> - match i with - Set((Mem _,_),_,_) -> true (* pointer write *) - | Set((_,Index (_,_)),_,_) -> true (* array write *) - | Call(_,_,_,_) -> true - | _ -> false) [il] - | _ -> false - in - (* is there a path from start to goal that includes an - instruction that writes to memory? Do a dfs *) - let visited_sid_isr = ref IS.empty in - let rec dfs goal b start = - if !debug then - Kernel.debug "writes_between: dfs visiting %a\n" Cil_printer.pp_stmt start; - if start.sid = goal.sid then - let wh = find_write start in - (if !debug && b then - Kernel.debug "writes_between: start=goal and found a write\n"; - if !debug && (not b) then - Kernel.debug "writes_between: start=goal and no write\n"; - if !debug && wh then - Kernel.debug "writes_between: start=goal and write here\n"; - if !debug && (not wh) then - Kernel.debug "writes_between: start=goal and no write here\n"; - b || (find_write start)) - else - if IS.mem start.sid (!visited_sid_isr) then false else - let w = find_write start in - if !debug && w then - Kernel.debug "writes_between: found write %a" Cil_printer.pp_stmt start; - visited_sid_isr := IS.add start.sid (!visited_sid_isr); - let rec proc_succs sl = match sl with [] -> false - | s::rest -> if dfs goal (w || b) s then true else proc_succs rest - in - proc_succs start.succs - in - match stmo, dstmo with - None, _ | _, None -> Kernel.fatal "writes_between: defining stmt not an instr" - | Some stm, Some dstm -> - let _ = visited_sid_isr := IS.singleton stm.sid in - let from_stm = List.fold_left (dfs stm) false stm.succs in - let _ = visited_sid_isr := IS.empty in - let from_dstm = dfs stm false dstm in - (Hashtbl.add wbHtbl (dsid,sid) (from_stm || from_dstm); - from_stm || from_dstm) - -(* returns true when the variables in uses - * have the same definition ids in both curiosh - * and defiosh or are global and not defined in - * the current function *) -let verify_unmodified uses fdefs curiosh defiosh = - UD.VS.fold (fun vi b -> - let curido = RD.iosh_singleton_lookup curiosh vi in - let defido = RD.iosh_singleton_lookup defiosh vi in - match curido, defido with - Some(curid), Some(defid) -> - (if !debug then (Kernel.debug "verify_unmodified: curido: %d defido: %d" curid defid); - curid = defid && b) - | None, None -> - if not(UD.VS.mem vi fdefs) then - (if !debug then (Kernel.debug "verify_unmodified: %s not defined in function" vi.vname); - b) - else (* if the same set of definitions reaches, we can replace, also *) - let curios = try IH.find curiosh vi.vid - with Not_found -> RD.IOS.empty in - let defios = try IH.find defiosh vi.vid - with Not_found -> RD.IOS.empty in - RD.IOS.compare curios defios == 0 && b - | _, _ -> - (if !debug then Kernel.debug "verify_unmodified: %s has conflicting definitions. cur: %a\n def: %a" - vi.vname RD.ReachingDef.pretty ((),0,curiosh) - RD.ReachingDef.pretty ((),0,defiosh); - false)) - uses true - -let fdefs = ref UD.VS.empty -let udDeepSkindHtbl = IH.create 64 -class defCollectorClass = object - inherit nopCilVisitor - - method! vstmt s = - let _,d = if IH.mem udDeepSkindHtbl s.sid - then IH.find udDeepSkindHtbl s.sid - else let u',d' = UD.computeDeepUseDefStmtKind s.skind in - IH.add udDeepSkindHtbl s.sid (u',d'); - (u',d') in - fdefs := UD.VS.union !fdefs d; - DoChildren - -end - -let defCollector = new defCollectorClass - -let collect_fun_defs fd = - fdefs := UD.VS.empty; - ignore(visitCilFunction defCollector fd); - !fdefs - -(* ok_to_replace *) -(* is it alright to replace a variable use with the expression - that the variable was defined to be? *) -(* Takes the definitions that reached the place where the - variable was defined and the definitions that reach the - place the variable is used. If the same definitions for - the variables used in the expression reach both places, - then it is okay to replace the variable with the expression. *) -(* With regards to globals and parameters there are two - possibilities if the reverse lookup returns None for both - sets of reaching definitions: - 1) The global or parameter is actually not redefined. - 2) At both points no one definition *must* reach there. - For this reason, this function also takes the fundec, - so that it can be figured out which is the case *) -(* varinfo -> varinfo IH.t -> sid -> varinfo IH.t -> fundec -> rhs -> bool *) -(* sid is an int that is the statement id of the statement where - we are trying to do a replacement *) -(* vi is the varinfo of the variable that we are trying to replace *) -let ok_to_replace vi curiosh sid defiosh dsid f r = - let uses, safe = match r with - RD.RDExp e -> (UD.computeUseExp e, exp_is_ok_replacement e) - | RD.RDCall (Call(_,_,el,_) as i) -> - let safe = List.fold_left (fun b e -> - (exp_is_ok_replacement e) && b) true el in - let u,_d = UD.computeUseDefInstr i in - u, safe - | _ -> Kernel.fatal "ok_to_replace: got non Call in RDCall." - in - let target_addrof = if vi.vaddrof || vi.vglob then - (if !debug then (Kernel.debug "ok_to_replace: target %s had its address taken or is a global" vi.vname); - true) - else (if !debug then (Kernel.debug "ok_to_replace: target %s does not have its address taken" vi.vname); - false) in - let writes = if safe && not(target_addrof) then false else (writes_between f dsid sid) in - if (not safe || target_addrof) && writes - then - (if !debug then (Kernel.debug "ok_to_replace: replacement not safe because of pointers or addrOf"); - false) - else let fdefs = collect_fun_defs f in - let _ = if !debug then (Kernel.debug "ok_to_replace: card fdefs = %d" (UD.VS.cardinal fdefs)) in - let _ = if !debug then (Kernel.debug "ok_to_replace: card uses = %d" (UD.VS.cardinal uses)) in - verify_unmodified uses fdefs curiosh defiosh - -let useList = ref [] -(* Visitor for making a list of statements that use a definition *) -class useListerClass (defid:int) (vi:varinfo) = object(self) - inherit RD.rdVisitorClass - - method! vexpr e = - match e.enode with - Lval(Var vi', _off) -> - (match self#get_cur_iosh() with - Some iosh -> - let vido = RD.iosh_defId_find iosh defid in - let exists = match vido with Some _ -> true | None -> false in - if vi.vid = vi'.vid && exists - then (useList := - (Extlib.the self#current_stmt)::(!useList); DoChildren) - else DoChildren - | _ -> Kernel.fatal "useLister: no data for statement") - | _ -> DoChildren - -end - -(* ok_to_replace_with_incdec *) -(* Find out if it is alright to replace the use of a variable - with a post-incrememnt/decrement of the variable it is assigned to be *) -(* Takes the definitions reaching the variable use, the definitions - reaching the place where the variable was defined, the fundec, - the varinfo for the variable being considered and the right - hand side of its definition. *) -let ok_to_replace_with_incdec curiosh defiosh f id vi r = - - (* number of uses of vi where definition id reaches *) - let num_uses () = - let _ = useList := [] in - let ulc = new useListerClass id vi in - let _ = visitCilFunction (ulc :> cilVisitor) f in - List.length (!useList) - in - - (* Is e the addition or subtraction of one to vi? - Return Some(PlusA) if it's an addition, - Some(MinusA) if it's a subtraction, - and None otherwise *) - let inc_or_dec e vi = - match e.enode with - BinOp((PlusA|PlusPI|IndexPI), - {enode = Lval(Var vi', NoOffset)}, - {enode = Const(CInt64(one,_,_))},_) -> - if vi.vid = vi'.vid && Integer.equal one Integer.one - then Some(PlusA) - else if vi.vid = vi'.vid && - Integer.equal one Integer.minus_one - then Some(MinusA) - else None - | BinOp((MinusA|MinusPI), - {enode = Lval(Var vi', NoOffset)}, - {enode = Const(CInt64(one,_,_))},_) -> - if vi.vid = vi'.vid && Integer.equal one Integer.one - then Some(MinusA) - else None - | _ -> None - in - - match r with - RD.RDExp({enode = Lval(Var rhsvi, NoOffset)}) -> - let curido = RD.iosh_singleton_lookup curiosh rhsvi in - let defido = RD.iosh_singleton_lookup defiosh rhsvi in - (match curido, defido with - Some(curid), _ -> - let defios = try IH.find defiosh rhsvi.vid - with Not_found -> RD.IOS.empty in - let redefrhso = getDefRhs curid in - (match redefrhso with - None -> (if !debug then (Kernel.debug "ok_to_replace: couldn't get rhs for redef: %d" curid); - None) - | Some(redefrhs, _, redefiosh) -> - let tmprdido = RD.iosh_singleton_lookup redefiosh vi in - match tmprdido with - None -> (if !debug then (Kernel.debug "ok_to_replace: conflicting defs of %s reach redef of %s" vi.vname rhsvi.vname); - None) - | Some tmprdid -> - if not (tmprdid = id) then - (if !debug then (Kernel.debug "ok_to_replace: initial def of %s doesn't reach redef of %s" vi.vname rhsvi.vname); - None) - else let redefios = try IH.find redefiosh rhsvi.vid - with Not_found -> RD.IOS.empty in - let curdef_stmt = - try IH.find RD.ReachingDef.defIdStmtHash curid - with Not_found -> - Kernel.fatal "ok_to_replace: couldn't find statement defining %d" curid in - if not (RD.IOS.compare defios redefios = 0) then - (if !debug then - (Kernel.debug - "ok_to_replace: different sets of definitions of %s reach the def of %s and the redef of %s" - rhsvi.vname - vi.vname - rhsvi.vname); - None) - else - (match redefrhs with - RD.RDExp(e) -> (match inc_or_dec e rhsvi with - Some(PlusA) -> - if num_uses () = 1 then - Some(curdef_stmt.sid, curid, rhsvi, PlusA) - else (if !debug then (Kernel.debug "ok_to_replace: tmp used more than once"); - None) - | Some(MinusA) -> - if num_uses () = 1 then - Some(curdef_stmt.sid, curid, rhsvi, MinusA) - else (if !debug then (Kernel.debug "ok_to_replace: tmp used more than once"); - None) - | None -> - (if !debug then (Kernel.debug "ok_to_replace: redef isn't adding or subtracting one from itself"); - None) - | _ -> (Kernel.fatal "ok_to_replace: unexpected op in inc/dec info.")) - | _ -> (if !debug then (Kernel.debug "ok_to_replace: redef a call"); - None))) - | _ -> (if !debug then (Kernel.debug "ok_to_replace: %s has conflicting definitions" rhsvi.vname); - None)) - | _ -> (if !debug then (Kernel.debug "ok_to_replace: rhs not of correct form"); - None) - -(* A hash from variable ids to Call instruction - options. If a variable id is in this table, - and it is mapped to Some(Call()), then the - function call can be printed instead of the - variable *) -let iioh = IH.create 16 - -(* A hash from variable ids to information that - can be used to print a post increment/decrement - that can replace the variable *) -let incdecHash = IH.create 16 - -(* A hash from variable ids to a list of statement ids. - Because a post-inc/dec will be printed elsewhere, - the assignments of the variable in these statements - don't need to be printed *) -let idDefHash = IH.create 16 - -(* Add a pair to the list for vid and create a list if one - doesn't exist *) -let id_dh_add vid p = - if IH.mem idDefHash vid then - let oldlist = IH.find idDefHash vid in - let newlist = p::oldlist in - IH.replace idDefHash vid newlist - else - IH.add idDefHash vid [p] - -(* check if a name matches a form *) -(* string -> nameform -> bool *) -let check_form s f = - match f with - Suffix sfx -> - let frmlen = String.length sfx in - let slen = String.length s in - slen >= frmlen && - String.compare (String.sub s (slen - frmlen) frmlen) sfx = 0 - | Prefix pfx -> - let frmlen = String.length pfx in - String.length s >= frmlen && - String.compare (String.sub s 0 frmlen) pfx = 0 - | Exact ext -> - let frmlen = String.length ext in - String.length s = frmlen && - String.compare s ext = 0 - -(* check a name against a list of forms - if it matches any then return true *) -(* string -> nameform list -> bool *) -let check_forms s fl = - List.fold_left (fun b f -> b || check_form s f) - false fl - -let forms = [Exact "tmp"; - Prefix "tmp___"; - Prefix "__cil_tmp"; - Suffix "__e"; - Suffix "__b";] - -(* action: 'a -> varinfo -> fundec -> bool -> exp option - * iosh: 'a - * fd: fundec - * nofrm: bool - * - * Replace Lval(Var vi, NoOffset) with - * e where action iosh sid vi fd nofrm returns Some(e) *) -let varXformClass action data sid fd nofrm = object - inherit nopCilVisitor - - method! vexpr e = match e.enode with - Lval(Var vi, NoOffset) -> - (match action data sid vi fd nofrm with - None -> DoChildren - | Some e' -> - (* Cast e' to the correct type. *) - let e'' = mkCast e' vi.vtype in - ChangeTo e'') - | Lval(Mem e', off) -> - (* don't substitute constants in memory lvals *) - let post e = match e.enode with - Lval(Mem({enode = Const _}),off') -> - { e with enode = Lval(Mem e', off')} - | _ -> e - in - ChangeDoChildrenPost(new_exp ~loc:e.eloc (Lval(Mem e', off)), post) - | _ -> DoChildren - -end - -(* action: 'a -> lval -> fundec -> bool -> exp option - * lvh: 'a - * fd: fundec - * nofrm: bool - * - * Replace Lval(lv) with - * e where action lvh sid lv fd nofrm returns Some(e) *) -let lvalXformClass action data sid fd nofrm = object - inherit nopCilVisitor - - method! vexpr e = - let castrm e = - Expcompare.stripCastsDeepForPtrArith e - in - match e.enode with - | Lval((Mem e', off) as lv)-> begin - match action data sid lv fd nofrm with - | None -> - (* don't substitute constants in memory lvals *) - let post e = - match e.enode with - | Lval(Mem({enode = Const _}),off') -> - new_exp ~loc:e.eloc (Lval(Mem e', off')) - | _ -> Expcompare.stripCastsDeepForPtrArith e - in - ChangeDoChildrenPost(new_exp ~loc:e.eloc (Lval(Mem e', off)), post) - | Some e -> - let newt = typeOf(new_exp ~loc:e.eloc (Lval lv)) in - let e'' = mkCast e newt in - ChangeDoChildrenPost(e'', castrm) - end - | Lval lv -> begin - match action data sid lv fd nofrm with - | None -> DoChildren - | Some e' -> begin - (* Cast e' to the correct type. *) - let e'' = mkCast e' (typeOf(dummy_exp(Lval lv))) in - ChangeDoChildrenPost(e'', castrm) - end - end - | _ -> ChangeDoChildrenPost(castrm e, castrm) - -end - -(* Returns the set of definitions of vi in iosh that - are not due to assignments of the form x = x *) -(* IOS.t IH.t -> varinfo -> int option *) -let iosh_get_useful_def iosh vi = - if IH.mem iosh vi.vid then - let ios = IH.find iosh vi.vid in - let ios' = RD.IOS.filter (fun ido -> - match ido with None -> true | Some(id) -> - match getDefRhs id with - Some(RD.RDExp({enode = Lval(Var vi',NoOffset)}),_,_) - | Some(RD.RDExp - ({enode = CastE(_,{enode = Lval(Var vi',NoOffset)})}),_,_) -> - not(vi.vid = vi'.vid) (* false if they are the same *) - | _ -> true) ios - in - if not(RD.IOS.cardinal ios' = 1) - then (if !debug then (Kernel.debug "iosh_get_useful_def: multiple different defs of %d:%s(%d)" - vi.vid vi.vname (RD.IOS.cardinal ios')); - None) - else RD.IOS.choose ios' - else (if !debug then (Kernel.debug "iosh_get_useful_def: no def of %s reaches here" vi.vname); - None) - -let ae_tmp_to_exp_change = ref false -let ae_tmp_to_exp eh _sid vi _fd nofrm = - if nofrm || (check_forms vi.vname forms) - then try begin - let e = IH.find eh vi.vid in - if !debug then - Kernel.debug "tmp_to_exp: changing %s to %a" vi.vname Cil_printer.pp_exp e; - match e.enode with - | Const(CStr _) - | Const(CWStr _) -> None (* don't fwd subst str lits *) - | _ -> begin - ae_tmp_to_exp_change := true; - Some e - end - end - with Not_found -> None - else None - -let ae_lval_to_exp_change = ref false -let ae_lval_to_exp lvh _sid lv _fd nofrm = - match lv, nofrm with - | (Var vi, NoOffset), false -> - (* If the var is not a temp, then don't replace *) - if check_forms vi.vname forms then begin - try - let e = AELV.LvExpHash.find lvh lv in - match e.enode with - | Const(CStr _) - | Const(CWStr _) -> None - | _ -> begin - ae_lval_to_exp_change := true; - if !debug then - Kernel.debug "ae: replacing %a with %a" - Cil_printer.pp_lval lv Cil_printer.pp_exp e; - Some e - end - with Not_found -> None - end else None - | _, true -> begin - (* replace everything *) - try - let e = AELV.LvExpHash.find lvh lv in - match e.enode with - | Const(CStr _) - | Const(CWStr _) -> None - | _ -> begin - ae_lval_to_exp_change := true; - Kernel.debug "ae: replacing %a with %a" - Cil_printer.pp_lval lv Cil_printer.pp_exp e; - Some e - end - with Not_found -> None - end - | _, _ -> None - - -(* if the temp with varinfo vi can be - replaced by an expression then return - Some of that expression. o/w None. - If b is true, then don't check the form *) -(* IOS.t IH.t -> sid -> varinfo -> fundec -> bool -> exp option *) -let rd_tmp_to_exp_change = ref false -let rd_tmp_to_exp iosh sid vi fd nofrm = - if nofrm || (check_forms vi.vname forms) - then let ido = iosh_get_useful_def iosh vi in - match ido with None -> - if !debug then (Kernel.debug "tmp_to_exp: non-single def: %s" - vi.vname); - None - | Some(id) -> let defrhs = getDefRhs id in - match defrhs with None -> - if !debug then - (Kernel.debug "tmp_to_exp: no def of %s" vi.vname); - None - | Some(RD.RDExp(e) as r, dsid , defiosh) -> - if ok_to_replace vi iosh sid defiosh dsid fd r - then - (if !debug then - Kernel.debug "tmp_to_exp: changing %s to %a" - vi.vname Cil_printer.pp_exp e; - match e.enode with - | Const(CStr _) - | Const(CWStr _) -> None - | _ -> begin - rd_tmp_to_exp_change := true; - Some e - end) - else - (if !debug then (Kernel.debug "tmp_to_exp: not ok to replace %s" vi.vname); - None) - | _ -> - if !debug then (Kernel.debug "tmp_to_exp: rhs is call %s" vi.vname); - None - else - (if !debug then (Kernel.debug "tmp_to_exp: %s didn't match form or nofrm" vi.vname); - None) - -let rd_fwd_subst data sid e fd nofrm = - rd_tmp_to_exp_change := false; - let e' = visitCilExpr (varXformClass rd_tmp_to_exp data sid fd nofrm) e in - (e', !rd_tmp_to_exp_change) - -let ae_fwd_subst data sid e fd nofrm = - ae_tmp_to_exp_change := false; - let e' = visitCilExpr (varXformClass ae_tmp_to_exp data sid fd nofrm) e in - (e', !ae_tmp_to_exp_change) - -let ae_lv_fwd_subst data sid e fd nofrm = - ae_lval_to_exp_change := false; - let e' = visitCilExpr (lvalXformClass ae_lval_to_exp data sid fd nofrm) e in - (e', !ae_lval_to_exp_change) - -let ae_simp_fwd_subst data e nofrm = - ae_lv_fwd_subst data (-1) e (emptyFunction "@dummy@") nofrm - -let ae_tmp_to_const_change = ref false -let ae_tmp_to_const eh _sid vi _fd nofrm = - if nofrm || check_forms vi.vname forms then - try begin let e = IH.find eh vi.vid in - match e.enode with Const c -> begin - ae_tmp_to_const_change := true; - Some(new_exp ~loc:e.eloc (Const c)) end - | _ -> None end - with Not_found -> None - else None - -(* See if vi can be replaced by a constant - by checking all of the definitions reaching - this use of vi *) -let tmp_to_const_change = ref false -let tmp_to_const iosh sid vi fd nofrm = - if nofrm || check_forms vi.vname forms then - match RD.iosh_lookup iosh vi with - None -> None - | Some(ios) -> - let defido = - try RD.IOS.choose ios - with Not_found -> None in - match defido with None -> None | Some defid -> - match getDefRhs defid with - None -> None - | Some(RD.RDExp({enode = Const c;eloc=loc}), _, defiosh) -> - (match RD.getDefIdStmt defid with - None -> (Kernel.fatal "tmp_to_const: defid has no statement") - | Some(stm) -> - if ok_to_replace vi iosh sid defiosh stm.sid fd - (RD.RDExp(dummy_exp (Const c))) - then - let same = RD.IOS.for_all (fun defido -> - match defido with None -> false | Some defid -> - match getDefRhs defid with - None -> false - | Some(RD.RDExp({enode = Const c'}),_,defiosh) -> - if Cil_datatype.Constant.equal c c' then - match RD.getDefIdStmt defid with - None -> (Kernel.fatal "tmp_to_const: defid has no statement") - | Some(stm) -> - ok_to_replace vi iosh sid defiosh stm.sid fd - (RD.RDExp(dummy_exp (Const c'))) - else false - | _ -> false) ios - in - if same - then (tmp_to_const_change := true; - Some(new_exp ~loc (Const c))) - else None - else None) - | _ -> None - else None - -let const_prop iosh sid e fd nofrm = - tmp_to_const_change := false; - let e' = visitCilExpr (varXformClass tmp_to_const iosh sid fd nofrm) e in - (e', !tmp_to_const_change) - -let ae_const_prop eh sid e fd nofrm = - ae_tmp_to_const_change := false; - let e' = visitCilExpr (varXformClass ae_tmp_to_const eh sid fd nofrm) e in - (e', !ae_tmp_to_const_change) - -class expTempElimClass (fd:fundec) = object (self) - inherit RD.rdVisitorClass - - method! vexpr e = - - let do_change iosh vi = - let ido = RD.iosh_singleton_lookup iosh vi in - (match ido with - Some id -> - let riviho = getDefRhs id in - (match riviho with - Some(RD.RDExp(e) as r, dsid, defiosh) -> - if !debug then - Kernel.debug "Can I replace %s with %a?" - vi.vname Cil_printer.pp_exp e; - if ok_to_replace - vi iosh (Extlib.the self#current_stmt).sid defiosh dsid fd r - then - (if !debug then (Kernel.debug "Yes."); - ChangeTo(e)) - else (if !debug then (Kernel.debug "No."); - DoChildren) - | _ -> DoChildren) - | _ -> DoChildren) - in - - match e.enode with - Lval (Var vi,NoOffset) -> - (if check_forms vi.vname forms then - (* only allowed to replace a tmp with a function call once *) - (match cur_rd_dat with - Some(_,_s,iosh) -> do_change iosh vi - | None -> let iviho = RD.getRDs (Extlib.the self#current_stmt) in - match iviho with - Some(_,_s,iosh) -> - (if !debug then - (Kernel.debug "Try to change %s outside of instruction." vi.vname); - do_change iosh vi) - | None -> - (if !debug then - (Kernel.debug "%s in statement w/o RD info" vi.vname); - DoChildren)) - else DoChildren) - | _ -> DoChildren - -end - -class expLvTmpElimClass (fd : fundec) = object(self) - inherit AELV.aeVisitorClass - - method! vexpr e = - match self#get_cur_eh () with - | None -> DoChildren - | Some eh -> begin - let e', _ = - ae_lv_fwd_subst eh (Extlib.the self#current_stmt).sid e fd false in - ChangeTo e' - end - -end - -class incdecTempElimClass (fd:fundec) = object (self) - inherit RD.rdVisitorClass - - method! vexpr e = - - let do_change iosh vi = - let ido = RD.iosh_singleton_lookup iosh vi in - (match ido with - Some id -> - let riviho = getDefRhs id in - (match riviho with - Some(RD.RDExp _e as r, _, defiosh) -> - (match ok_to_replace_with_incdec iosh defiosh fd id vi r with - Some(curdef_stmt_id,redefid, rhsvi, b) -> - (if !debug then (Kernel.debug "No, but I can replace it with a post-inc/dec"); - if !debug then (Kernel.debug "cdsi: %d redefid: %d name: %s" - curdef_stmt_id redefid - rhsvi.vname); - IH.add incdecHash vi.vid (redefid, rhsvi, b); - id_dh_add rhsvi.vid (curdef_stmt_id, redefid); - DoChildren) - | None -> - (if !debug then (Kernel.debug "No."); - DoChildren)) - | _ -> DoChildren) - | _ -> DoChildren) - in - - match e.enode with - Lval (Var vi,NoOffset) -> - (if check_forms vi.vname forms then - (* only allowed to replace a tmp with an inc/dec if there is only one use *) - (match cur_rd_dat with - Some(_,_s,iosh) -> do_change iosh vi - | None -> let iviho = RD.getRDs (Extlib.the self#current_stmt) in - match iviho with - Some(_,_s,iosh) -> - (if !debug then (Kernel.debug "Try to change %s outside of instruction." vi.vname); - do_change iosh vi) - | None -> - (if !debug then (Kernel.debug "%s in statement w/o RD info" vi.vname); - DoChildren)) - else DoChildren) - | _ -> DoChildren - -end - -class callTempElimClass (fd:fundec) = object (self) - inherit RD.rdVisitorClass - - method! vexpr e = - - let do_change iosh vi = - let ido = RD.iosh_singleton_lookup iosh vi in - (match ido with - Some id -> - let riviho = getDefRhs id in - (match riviho with - Some(RD.RDCall(i) as r, dsid, defiosh) -> - if !debug then - Kernel.debug "Can I replace %s with %a?" - vi.vname Cil_printer.pp_instr i; - if ok_to_replace - vi iosh (Extlib.the self#current_stmt).sid defiosh dsid fd r - then (if !debug then (Kernel.debug "Yes."); - IH.add iioh vi.vid (Some(i)); - DoChildren) - else (if !debug then (Kernel.debug "No."); - DoChildren) - | _ -> DoChildren) - | _ -> DoChildren) - in - - match e.enode with - Lval (Var vi,NoOffset) -> - (if check_forms vi.vname forms then - (* only allowed to replace a tmp with a function call if there is only one use *) - if IH.mem iioh vi.vid - then (IH.replace iioh vi.vid None; DoChildren) - else - (match cur_rd_dat with - Some(_,_s,iosh) -> do_change iosh vi - | None -> let iviho = RD.getRDs (Extlib.the self#current_stmt) in - match iviho with - Some(_,_s,iosh) -> - (if !debug then (Kernel.debug "Try to change %s:%d outside of instruction." vi.vname vi.vid); - do_change iosh vi) - | None -> - (if !debug then (Kernel.debug "%s in statement w/o RD info" vi.vname); - DoChildren)) - else DoChildren) - | _ -> DoChildren - - (* Unused definitions cause multiple replacements - unless they are found and the replacement prevented. - It will be possible to replace more temps if dead - code elimination is performed before printing. *) - method! vinst i = - (* Need to copy this from rdVisitorClass because we are overriding *) - if !debug then - Kernel.debug "rdVis: before %a, rd_dat_lst is %d long" - Cil_printer.pp_instr i (List.length rd_dat_lst); - (try - cur_rd_dat <- Some(List.hd rd_dat_lst); - rd_dat_lst <- List.tl rd_dat_lst - with Failure "hd" -> - if !debug then (Kernel.debug "rdVis: il rd_dat_lst mismatch")); - match i with - Set((Var vi,_off),_,_) -> - if IH.mem iioh vi.vid - then (IH.replace iioh vi.vid None; DoChildren) - else (IH.add iioh vi.vid None; DoChildren) - | _ -> DoChildren - -end - - - -(* Remove local declarations that aren't set or used *) -(* fundec -> unit *) -let rm_unused_locals fd = - let oldIgnoreSizeof = !UD.ignoreSizeof in - UD.ignoreSizeof := false; - let used = List.fold_left (fun u s -> - let u', d' = UD.computeDeepUseDefStmtKind s.skind in - UD.VS.union u (UD.VS.union u' d')) UD.VS.empty fd.sbody.bstmts in - UD.ignoreSizeof := oldIgnoreSizeof; - - let good_var vi = UD.VS.mem vi used in - let good_locals = List.filter good_var fd.slocals in - let remove_block_locals = object - inherit Cil.nopCilVisitor - method! vblock b = - b.blocals <- List.filter good_var b.blocals; - DoChildren - end - in - fd.slocals <- good_locals; - ignore (visitCilBlock remove_block_locals fd.sbody) - - - -(* see if a vi is volatile *) -let is_volatile vi = - let vi_vol = - List.exists (function (Attr("volatile",_)) -> true - | _ -> false) vi.vattr in - let typ_vol = - List.exists (function (Attr("volatile",_)) -> true - | _ -> false) (typeAttrs vi.vtype) in - if !debug && (vi_vol || typ_vol) then - (Kernel.debug "unusedRemover: %s is volatile" vi.vname); - if !debug && not(vi_vol || typ_vol) then - (Kernel.debug "unusedRemover: %s is not volatile" vi.vname); - vi_vol || typ_vol - - -(* Remove temp variables that are set but not used *) -(* This is different from dead code elimination because - temps that can be eliminated during pretty printing - are also considered *) -class unusedRemoverClass : cilVisitor = object(self) - inherit nopCilVisitor - - val mutable unused_set = UD.VS.empty - val mutable cur_func = emptyFunction "@dummy@" - - (* a filter function for picking out - the local variables that need to be kept *) - method private good_var vi = - (is_volatile vi) || - (not(UD.VS.mem vi unused_set) && - (not(IH.mem iioh vi.vid) || - (match IH.find iioh vi.vid with - None -> true | Some _ -> false)) && - not(IH.mem incdecHash vi.vid)) - - (* figure out which locals aren't used *) - method! vfunc f = - cur_func <- f; - (* the set of used variables *) - let used = List.fold_left (fun u s -> - let u', _ = UD.computeDeepUseDefStmtKind s.skind in - UD.VS.union u u') UD.VS.empty f.sbody.bstmts in - let used = UD.computeUseLocalTypes ~acc_used:used f in - - (* the set of unused locals *) - let unused = List.fold_left (fun un vi -> - if UD.VS.mem vi used - then un - else (if !debug then (Kernel.debug "unusedRemoverClass: %s is unused" vi.vname); - UD.VS.add vi un)) UD.VS.empty f.slocals in - unused_set <- unused; - let good_locals = List.filter self#good_var f.slocals in - f.slocals <- good_locals; - DoChildren - - (* remove instructions that set variables - that aren't used. Also remove instructions - that set variables mentioned in iioh *) - method! vstmt stm = - - (* return the list of pairs with fst = f *) - let findf_in_pl f (pl : (int * int) list) = - List.filter (fun (fst,_snd) -> - if fst = f then true else false) - pl - in - - (* Return true if the assignment of this - variable in this statement is going to be - replaced by a post-inc/dec *) - let check_incdec vi e = - if IH.mem idDefHash vi.vid then - let pl = IH.find idDefHash vi.vid in - match findf_in_pl stm.sid pl with (_sid,redefid)::_l -> - let rhso = getDefRhs redefid in - (match rhso with - None -> (if !debug then (Kernel.debug "check_incdec: couldn't find rhs for def %d" redefid); - false) - | Some(rhs, _, _indiosh) -> - (match rhs with - RD.RDCall _ -> (if !debug then Kernel.debug "check_incdec: rhs not an expression"; - false) - | RD.RDExp e' -> - if compareExp e e' then true - else (if !debug then - Kernel.debug - "check_incdec: rhs of %d: %a, and needed redef %a \ - not equal" - redefid Cil_printer.pp_exp e' Cil_printer.pp_exp e; - false))) - | [] -> - (if !debug then - Kernel.debug "check_incdec: current statement not in list: %d. \ -%s = %a" - stm.sid - vi.vname - Cil_printer.pp_exp e; - false) - else (if !debug then Kernel.debug "check_incdec: %s not in idDefHash" - vi.vname; - false) - in - - (* return true if the rhs will get - pretty printed as a function call *) - let will_be_call e = - match e.enode with - Lval(Var vi,NoOffset) -> - if not(IH.mem iioh vi.vid) then false - else (match IH.find iioh vi.vid with - None -> false | Some _ -> true) - | _ -> false - in - - (* a filter function for picking out - the instructions that we want to keep *) - (* instr -> bool *) - let good_instr i = - match i with - Set((Var(vi),_),e,_) -> - if will_be_call e && - not(List.mem vi cur_func.slocals) - then cur_func.slocals <- vi::cur_func.slocals; - is_volatile vi || - (not (UD.VS.mem vi unused_set) && - not (IH.mem incdecHash vi.vid) && - not (check_incdec vi e)) || - will_be_call e - | Call (Some(Var(vi),_),_,_,_) -> - (* If not in the table or entry is None, - then it's good *) - not (IH.mem iioh vi.vid) || - (match IH.find iioh vi.vid with - None -> true | Some _ -> false) - | Asm(_,_,slvlst,_,_,_,_) -> - (* make sure the outputs are in the locals list *) - List.iter (fun (_,_s,lv) -> - match lv with (Var vi,_) -> - if List.mem vi cur_func.slocals - then () - else cur_func.slocals <- vi::cur_func.slocals - |_ -> ()) slvlst; - true - | _ -> true - in - - (* If the result of a function call isn't used, - then change to Call(None,...) *) - let call_fixer i = - match i with - Call (Some(Var(vi),_),e,el,l) as c -> - if UD.VS.mem vi unused_set then - Call(None,e,el,l) - else c - | _ -> i - in - - match stm.skind with - Instr il -> - (*let newil = List.filter good_instr [il] in - let newil' = List.map call_fixer newil in*) - stm.skind <- - Instr (if good_instr il then call_fixer il - else Skip Cil_datatype.Location.unknown); - SkipChildren - | _ -> DoChildren - - method! vblock b = - b.blocals <- List.filter self#good_var b.blocals; - DoChildren - -end - -(* from cleaner.ml *) - -(* Lifts child blocks into parents if the block has no attributes or labels *) -let rec fold_blocks b = - b.bstmts <- List.fold_right - (fun s acc -> - match s.skind with - Block ib -> - fold_blocks ib; - if (List.length ib.battrs = 0 && - List.length s.labels = 0) then - ib.bstmts @ acc - else - s::acc - | Instr (Skip _) when s.labels = [] -> - acc - | _ -> s::acc) - b.bstmts - [] - -class removeBrackets = object - inherit nopCilVisitor - method! vblock b = - fold_blocks b; - DoChildren -end - -(* clean up the code and - eliminate some temporaries - for pretty printing a whole function *) -(* Cil.fundec -> Cil.fundec *) -let eliminate_temps f = - ignore(visitCilFunction (new removeBrackets) f); - Cfg.clearCFGinfo f; - ignore(Cfg.cfgFun f); - UD.ignoreSizeof := false; - RD.computeRDs f; - IH.clear iioh; - IH.clear incdecHash; - IH.clear idDefHash; - let etec = new expLvTmpElimClass f in - let f' = visitCilFunction (etec :> cilVisitor) f in - let idtec = new incdecTempElimClass f' in - let f' = visitCilFunction (idtec :> cilVisitor) f' in - let ctec = new callTempElimClass f' in - let f' = visitCilFunction (ctec :> cilVisitor) f' in - visitCilFunction (new unusedRemoverClass) f' - -(* same as above, but doesn't remove the - obviated instructions and declarations. - Use this before using zrapp to print - expressions without temps *) -let eliminateTempsForExpPrinting f = - Cfg.clearCFGinfo f; - ignore(Cfg.cfgFun f); - UD.ignoreSizeof := false; - RD.computeRDs f; - IH.clear iioh; - IH.clear incdecHash; - IH.clear idDefHash; - let etec = new expLvTmpElimClass f in - let f' = visitCilFunction (etec :> cilVisitor) f in - RD.clearMemos (); (* we changed instructions and invalidated the "cache" *) - let idtec = new incdecTempElimClass f' in - let f' = visitCilFunction (idtec :> cilVisitor) f' in - let ctec = new callTempElimClass f' in - let f' = visitCilFunction (ctec :> cilVisitor) f' in - f' diff -Nru frama-c-20140301+neon+dfsg/cil/src/ext/usedef.ml frama-c-20150201+sodium+dfsg/cil/src/ext/usedef.ml --- frama-c-20140301+neon+dfsg/cil/src/ext/usedef.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/ext/usedef.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,261 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -open Cil_types -open Cil - -(** compute use/def information *) - -module VS = Cil_datatype.Varinfo.Set - -(** Set this global to how you want to handle function calls. - This also returns a modified argument list which will be used for the - purpose of Use analysis, in case you have a function that needs special - treatment of its args. *) -let getUseDefFunctionRef: (exp -> exp list -> VS.t * VS.t * exp list) ref = - ref (fun _func args -> (VS.empty, VS.empty, args)) - -(** Say if you want to consider a variable use. This applies to - variable reads only; see also considerVariableAddrOfAsUse *) -let considerVariableUse: (varinfo -> bool) ref = - ref (fun _ -> true) - - -(** Say if you want to consider a variable def *) -let considerVariableDef: (varinfo -> bool) ref = - ref (fun _ -> true) - -(** Say if you want to consider a variable addrof as a use *) -let considerVariableAddrOfAsUse: (varinfo -> bool) ref = - ref (fun _ -> true) - -(** Return any vars that should be considered "used" by an expression, - other than the ones it refers to directly. Deputy uses this for - variables in Cast annotations. *) -let extraUsesOfExpr: (exp -> VS.t) ref = - ref (fun _ -> VS.empty) - -(* When this is true, only definitions of a variable without - an offset are counted as definitions. So: - a = 5; would be a definition, but - a[1] = 5; would not. - Exception: writing to a union field is considered to be a definition of - the union even if this is set to true.*) -let onlyNoOffsetsAreDefs: bool ref = ref false - -(** Should we ignore the contents of sizeof and alignof? *) -let ignoreSizeof: bool ref = ref true - -let varUsed: VS.t ref = ref VS.empty -let varDefs: VS.t ref = ref VS.empty - -class useDefVisitorClass : cilVisitor = object (self) - inherit nopCilVisitor - - (** this will be invoked on variable definitions only because we intercept - * all uses of variables in expressions ! *) - method! vvrbl (v: varinfo) = - if (!considerVariableDef) v && - not(!onlyNoOffsetsAreDefs) then - varDefs := VS.add v !varDefs; - SkipChildren - - (** If onlyNoOffsetsAreDefs is true, then we need to see the - * varinfo in an lval along with the offset. Otherwise just - * DoChildren *) - method! vlval (l: lval) = - if !onlyNoOffsetsAreDefs then - match l with - (Var vi, NoOffset) -> - if (!considerVariableDef) vi then - varDefs := VS.add vi !varDefs; - SkipChildren - | (Var vi, Field(fi, NoOffset)) when not fi.fcomp.cstruct -> - (* If we are writing to a union field, treat that the same - as a write to a union. *) - if (!considerVariableDef) vi then - varDefs := VS.add vi !varDefs; - SkipChildren - | _ -> DoChildren - else DoChildren - - method! vexpr (e:exp) = - let extra = (!extraUsesOfExpr) e in - if not (VS.is_empty extra) then - varUsed := VS.union extra !varUsed; - match e.enode with - Lval (Var v, off) -> - ignore (visitCilOffset (self :> cilVisitor) off); - if (!considerVariableUse) v then - varUsed := VS.add v !varUsed; - SkipChildren (* So that we do not see the v *) - - | AddrOf (Var v, off) - | StartOf (Var v, off) -> - ignore (visitCilOffset (self :> cilVisitor) off); - if (!considerVariableAddrOfAsUse) v then - varUsed := VS.add v !varUsed; - SkipChildren - - | SizeOfE _ - | AlignOfE _ when !ignoreSizeof -> SkipChildren - - | _ -> DoChildren - - (* For function calls, do the transitive variable read/defs *) - method! vinst = function - Call (lvo, f, args, _) -> begin - (* we will compute the use and def that appear in - * this instruction. We also add in the stuff computed by - * getUseDefFunctionRef *) - let use, def, args' = !getUseDefFunctionRef f args in - varUsed := VS.union !varUsed use; - varDefs := VS.union !varDefs def; - - (* Now visit the children of "Call (lvo, f, args', _)" *) - let self: cilVisitor = (self :> cilVisitor) in - (match lvo with None -> () - | Some lv -> ignore (visitCilLval self lv)); - ignore (visitCilExpr self f); - List.iter (fun arg -> ignore (visitCilExpr self arg)) args'; - SkipChildren; - end - | Asm(_,_,slvl,_,_,_,_) -> List.iter (fun (_,s,lv) -> - match lv with (Var v, _off) -> - if s.[0] = '+' then - varUsed := VS.add v !varUsed; - | _ -> ()) slvl; - DoChildren - | _ -> DoChildren - -end - -let useDefVisitor = new useDefVisitorClass - -(** Compute the use information for an expression (accumulate to an existing - * set) *) -let computeUseExp ?(acc=VS.empty) (e: exp) : VS.t = - varUsed := acc; - ignore (visitCilExpr useDefVisitor e); - !varUsed - - -(** Compute the use/def information for an instruction *) -let computeUseDefInstr ?(acc_used=VS.empty) - ?(acc_defs=VS.empty) - (i: instr) : VS.t * VS.t = - varUsed := acc_used; - varDefs := acc_defs; - ignore (visitCilInstr useDefVisitor i); - !varUsed, !varDefs - - -(** Compute the use/def information for a statement kind. Do not descend into - * the nested blocks. *) -let computeUseDefStmtKind ?(acc_used=VS.empty) - ?(acc_defs=VS.empty) - (sk: stmtkind) : VS.t * VS.t = - varUsed := acc_used; - varDefs := acc_defs; - let ve e = ignore (visitCilExpr useDefVisitor e) in - let _ = - match sk with - Return (None, _) -> () - | Return (Some e, _) -> ve e - | If (e, _, _, _) -> ve e - | Break _ | Goto _ | Continue _ -> () - | Loop (_,_, _, _, _) -> () - | Switch (e, _, _, _) -> ve e - | Instr il -> - ignore (visitCilInstr useDefVisitor il) - | TryExcept _ | TryFinally _ -> () - | Block _ | UnspecifiedSequence _ -> () - in - !varUsed, !varDefs - -(* Compute the use/def information for a statement kind. - DO descend into nested blocks *) -let rec computeDeepUseDefStmtKind ?(acc_used=VS.empty) - ?(acc_defs=VS.empty) - (sk: stmtkind) : VS.t * VS.t = - let handle_block b = - List.fold_left (fun (u,d) s -> - let u',d' = computeDeepUseDefStmtKind s.skind in - (VS.union u u', VS.union d d')) (VS.empty, VS.empty) - b.bstmts - in - varUsed := acc_used; - varDefs := acc_defs; - let ve e = ignore (visitCilExpr useDefVisitor e) in - match sk with - Return (None, _) -> !varUsed, !varDefs - | Return (Some e, _) -> - let _ = ve e in - !varUsed, !varDefs - | If (e, tb, fb, _) -> - let _ = ve e in - let u, d = !varUsed, !varDefs in - let u', d' = handle_block tb in - let u'', d'' = handle_block fb in - (VS.union (VS.union u u') u'', VS.union (VS.union d d') d'') - | Break _ | Goto _ | Continue _ -> !varUsed, !varDefs - | Loop (_,b, _, _, _) -> handle_block b - | Switch (e, b, _, _) -> - let _ = ve e in - let u, d = !varUsed, !varDefs in - let u', d' = handle_block b in - (VS.union u u', VS.union d d') - | Instr il -> - ignore (visitCilInstr useDefVisitor il); - !varUsed, !varDefs - | TryExcept _ | TryFinally _ -> !varUsed, !varDefs - | Block b -> handle_block b - | UnspecifiedSequence seq -> handle_block - (block_from_unspecified_sequence seq) - -let computeUseLocalTypes ?(acc_used=VS.empty) - (fd : fundec) - = - List.fold_left (fun u vi -> - ignore(visitCilType useDefVisitor vi.vtype); - VS.union u (!varUsed)) acc_used fd.slocals diff -Nru frama-c-20140301+neon+dfsg/cil/src/frontc/cabs2cil.ml frama-c-20150201+sodium+dfsg/cil/src/frontc/cabs2cil.ml --- frama-c-20140301+neon+dfsg/cil/src/frontc/cabs2cil.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/frontc/cabs2cil.ml 2015-05-29 15:31:43.000000000 +0000 @@ -149,7 +149,7 @@ NoOffset -> false | Field (_,o) as off -> let t_offset = Cil.unrollType (Cil.typeOffset t off) in - Cil.hasAttribute "volatile" (Cil.typeAttr t_offset) || + Cil.typeHasAttribute "volatile" t_offset || is_dangerous_offset t_offset o | Index _ -> true @@ -161,9 +161,9 @@ false and is_dangerous_lval = function | Var v,_ when - (not v.vglob && not v.vformal && not v.vgenerated) + (not v.vglob && not v.vformal && not v.vtemp) || Cil.hasAttribute "volatile" v.vattr - || Cil.hasAttribute "volatile" (Cil.typeAttr (Cil.unrollType v.vtype)) + || Cil.typeHasAttribute "volatile" (Cil.unrollType v.vtype) -> true (* Local might be uninitialized, which will trigger UB, but we assume that the variables we generate are correctly initialized. @@ -229,7 +229,7 @@ let process_align_pragma name args = let aux pname v = - (if theMachine.msvcMode + (if Cil.msvcMode () || Cil.gccMode () then Kernel.warning else Kernel.debug ~level:1 ?dkey:None) ~current:true "Parsing ICC '%s' pragma." pname; match args with @@ -263,7 +263,7 @@ let process_pack_pragma name args = begin match name with | "pack" -> begin - if theMachine.msvcMode then + if Cil.msvcMode () then Kernel.warning ~current:true "'pack' pragmas are probably incorrect in MSVC mode. \ Using GCC like pragmas."; @@ -357,7 +357,7 @@ match unrollType t with | TComp (comp, _, _) when not comp.cstruct -> (* Turn transparent unions into the type of their first field *) - if hasAttribute "transparent_union" (typeAttrs t) then begin + if typeHasAttribute "transparent_union" t then begin match comp.cfields with | [] -> Kernel.abort ~current:true @@ -380,11 +380,11 @@ l let isOldStyleVarArgName n = - if theMachine.msvcMode then n = "va_alist" + if Cil.msvcMode () then n = "va_alist" else n = "__builtin_va_alist" let isOldStyleVarArgTypeName n = - if theMachine.msvcMode then n = "va_list" || n = "__ccured_va_list" + if Cil.msvcMode () then n = "va_list" || n = "__ccured_va_list" else n = "__builtin_va_alist_t" (*** EXPRESSIONS *************) @@ -807,7 +807,7 @@ (* ignore (E.log "stripConstLocalType(%a) for temporary\n" d_type typ); *) let t' = (!typeForInsertedVar) (Cil.stripConstLocalType typ) in let name = get_temp_name () in - let vi = makeVarinfo false false name t' in + let vi = makeVarinfo ~temp:true false false name t' in vi.vdescr <- Some descr; vi.vdescrpure <- descrpure; (* Rename if clash, but do not add to the environment *) @@ -952,6 +952,11 @@ let integralPromotion = Cil.integralPromotion +(* C99 6.3.2.1:2: l-values used as r-values lose their qualifier. By default, + we drop qualifiers, and recover them for the few operators that are + exceptions, also listed in 6.3.2.1:2 *) +let dropQualifiers = Cil.type_remove_qualifier_attributes + (* true if the expression is known to be a boolean result, i.e. 0 or 1. *) let rec is_boolean_result e = match e.enode with @@ -1473,7 +1478,7 @@ raise (Failure "cannot duplicate: has labels"); (match s.skind with If _ | Switch _ | Loop _ | Block _ | UnspecifiedSequence _ - | TryFinally _ | TryExcept _ + | TryCatch _ | Throw _ | TryFinally _ | TryExcept _ -> raise (Failure "cannot duplicate: complex stmt") | Instr _ | Goto _ | Return _ | Break _ | Continue _ -> @@ -1486,7 +1491,7 @@ let s' = { s with sid = s.sid} in let c = match s.skind with | Instr (Call _) -> [ref s'] - | Instr _ | TryExcept (_, _, _, _)| TryFinally (_, _, _) + | Instr _ | TryExcept _ | TryFinally _ | TryCatch _ | Throw _ | UnspecifiedSequence _| Block _| Loop (_, _, _, _, _) | Switch (_, _, _, _)| If (_, _, _, _)| Continue _| Break _ | Goto (_, _)| Return (_, _) -> assert (c = []); [] @@ -1593,11 +1598,10 @@ (* If needed, convert e to type t, and check in case the label was too big *) let e' = makeCast ~e ~newt:t in - let constFold = constFold false in + let constFold = constFold true in let e'' = if theMachine.lowerConstants then constFold e' else e' in - (match (constFold e).enode, (constFold e'').enode with - | Const(CInt64(i1, _, _)), Const(CInt64(i2, _, _)) - when not (Integer.equal i1 i2) -> + (match constFoldToInt e, constFoldToInt e'' with + | Some i1, Some i2 when not (Integer.equal i1 i2) -> Kernel.feedback ~once:true ~source:(fst e.eloc) "Case label %a exceeds range of %a for switch expression. \ Nothing to worry." @@ -1697,7 +1701,7 @@ change_label_stmt s s'; ChangeDoChildrenPost (s', fun x -> x) | Block _ | If _ | Loop _ - | TryFinally _ | TryExcept _ -> + | TryFinally _ | TryExcept _ | Throw _ | TryCatch _ -> self#push false s | Switch _ -> let change_cases stmt = @@ -1886,21 +1890,6 @@ end -(** ALLOCA ***) -let allocaFun () = - if theMachine.msvcMode then begin - let name = "alloca" in - let fdec = emptyFunction name in - Cil.update_var_type fdec.svar - (TFun(voidPtrType, - Some [ ("len", theMachine.typeOfSizeOf, []) ], false, [])); - fdec.svar - end - else - (* Use __builtin_alloca where possible, because this can be used - even when gcc is invoked with -fno-builtin *) - let alloca, _ = lookupGlobalVar "__builtin_alloca" in - alloca (* Maps local variables that are variable sized arrays to the expression that * denotes their length *) @@ -2084,9 +2073,8 @@ if oldk = k then oldk else (match what with | CombineFunarg b when - not theMachine.msvcMode && oldk = IInt - && bytesSizeOf t <= (bytesSizeOfInt IInt) - && b -> + Cil.gccMode () && oldk = IInt + && bytesSizeOf t <= (bytesSizeOfInt IInt) && b -> (* GCC allows a function definition to have a more precise integer * type than a prototype that says "int" *) k @@ -2099,10 +2087,7 @@ if oldk = k then oldk else ( match what with | CombineFunarg b when - not theMachine.msvcMode - && oldk = FDouble - && k = FFloat && b - -> + Cil.gccMode () && oldk = FDouble && k = FFloat && b -> (* GCC allows a function definition to have a more precise float * type than a prototype that says "double" *) k @@ -2318,7 +2303,7 @@ * local. This can happen when we declare an extern variable with * global scope but we are in a local scope. *) - (* We lookup in the environement. If this is extern inline then the name + (* We lookup in the environment. If this is extern inline then the name * was already changed to foo__extinline. We lookup with the old name *) let lookupname = if vi.vstorage = Static then @@ -2423,9 +2408,9 @@ end ; (* update the field [vdefined] *) if isadef then oldvi.vdefined <- true; - (* the *immutable* vgenerated field in oldvi cannot be updated. We assume + (* the *immutable* vtemp field in oldvi cannot be updated. We assume that all Frama-C builtins bear the FC_BUILTIN attribute - and thus are - translated into variables with vgenerated fields at [true]. *) + translated into variables with vtemp fields at [true]. *) oldvi, true with Not_found -> begin (* A new one. *) Kernel.debug ~level:2 ~dkey:category_global @@ -2440,6 +2425,33 @@ vi, false end +(* Register a builtin function *) +let setupBuiltin name (resTyp, argTypes, isva) = + let args = Some (List.map (fun at -> ("", at, [])) argTypes) in + let typ = TFun(resTyp, args, isva, []) in + let v = makeGlobalVar name typ in + ignore (alphaConvertVarAndAddToEnv true v); + (* Add it to the file as well *) + cabsPushGlobal (GVarDecl (empty_funspec (), v, Cil.builtinLoc)); + Cil.setFormalsDecl v v.vtype; + v +;; + +(** ALLOCA ***) +let allocaFun () = + if not (Cil.gccMode ()) then begin + try + let alloca, _ = lookupGlobalVar "alloca" in + alloca + with Not_found -> + setupBuiltin "alloca" (voidPtrType, [theMachine.typeOfSizeOf], false) + end + else + (* Use __builtin_alloca where possible, because this can be used + even when gcc is invoked with -fno-builtin *) + let alloca, _ = lookupGlobalVar "__builtin_alloca" in + alloca + let conditionalConversion (t2: typ) (t3: typ) : typ = let tresult = (* ISO 6.5.15 *) match unrollType t2, unrollType t3 with @@ -2551,8 +2563,8 @@ (* normal case: use array's declared length, newtype=thistype *) match leno with Some len -> begin - match (constFold true len).enode with - | Const(CInt64(ni, _, _)) when Integer.ge ni Integer.zero -> + match constFoldToInt len with + | Some ni when Integer.ge ni Integer.zero -> (Integer.to_int ni), false | _ -> Kernel.fatal ~current:true @@ -2645,7 +2657,7 @@ | _ -> Kernel.fatal ~current:true "Can initialize only one field for union" in - if theMachine.msvcMode && !pMaxIdx != 0 then + if Cil.msvcMode () && !pMaxIdx != 0 then Kernel.warning ~current:true "On MSVC we can initialize only the first field of a union"; CompoundInit (thistype, [ findField 0 comp.cfields ]), thistype @@ -2987,11 +2999,15 @@ | EnvEnum item,_ -> dummy_exp (Const (CEnum item)), typeOf item.eival | _ -> raise Not_found - let find_comp_type ~kind s = findCompType kind s [] let find_comp_field info s = findField s info.cfields - let find_type s = let t,_ = lookupTypeNoError "type" s in t + let find_type namespace s = + match namespace with + | Logic_typing.Typedef -> let t,_ = lookupTypeNoError "type" s in t + | Logic_typing.Union -> findCompType "union" s [] + | Logic_typing.Struct -> findCompType "struct" s [] + | Logic_typing.Enum -> findCompType "enum" s [] include Logic_labels @@ -3135,7 +3151,7 @@ instrFallsThrough il | UnspecifiedSequence seq -> blockFallsThrough (block_from_unspecified_sequence seq) - | Return _ | Break _ | Continue _ -> false + | Return _ | Break _ | Continue _ | Throw _ -> false | Goto _ -> false | If (_, b1, b2, _) -> blockFallsThrough b1 || blockFallsThrough b2 @@ -3158,6 +3174,10 @@ (* A loop falls through if it can break. *) blockCanBreak b | Block b -> blockFallsThrough b + | TryCatch (b, l, _) -> + List.fold_left + (fun acc (_,b) -> acc || blockFallsThrough b) + (blockFallsThrough b) l | TryFinally (_b, h, _) -> blockFallsThrough h | TryExcept (_b, _, _h, _) -> true (* Conservative *) and stmtListFallsThrough = function @@ -3178,7 +3198,7 @@ Kernel.debug ~level:4 "stmtCanBreak stmt %a" Cil_printer.pp_location (Stmt.loc s); match s.skind with - Instr _ | Return _ | Continue _ | Goto _ -> false + Instr _ | Return _ | Continue _ | Goto _ | Throw _ -> false | Break _ -> true | UnspecifiedSequence seq -> blockCanBreak (block_from_unspecified_sequence seq) @@ -3188,6 +3208,11 @@ (* switches and loops catch any breaks in their bodies *) false | Block b -> blockCanBreak b + | TryCatch (b,l,_) -> + List.fold_left + (fun acc (_,b) -> acc || blockCanBreak b) + (blockCanBreak b) + l | TryFinally (b, h, _) -> blockCanBreak b || blockCanBreak h | TryExcept (b, _, h, _) -> blockCanBreak b || blockCanBreak h and blockCanBreak b = @@ -3338,8 +3363,8 @@ | TArray(typ,Some e,_,_) -> let len = - match Cil.constFold true e with - | { enode = Const (CInt64 (i,_,_)) } -> Integer.to_int i + match Cil.constFoldToInt e with + | Some i -> Integer.to_int i | _ -> Kernel.fatal ~source:(fst loc) "Trying to zero-initialize variable with incomplete type" @@ -3408,7 +3433,7 @@ aux [] itvs in let unknown_idx = - Datatype.Big_int.Set.fold split_itv known_idx [0,pred len] + Datatype.Integer.Set.fold split_itv known_idx [0,pred len] in let one_range acc (low,high) = Logic_const.pand ~loc @@ -3517,7 +3542,7 @@ "implicit prototype cannot have variadic arguments" | TNamed _ -> assert false (* unrollType *) in - (* if we make a promotion, take it explicitely + (* if we make a promotion, take it explicitly into account in the argument itself *) let (_,e) = castTo arg_type typ exp in (name,typ,[]), e @@ -3586,7 +3611,7 @@ (* GCC allows a named type that appears first to be followed by things * like "short", "signed", "unsigned" or "long". *) match tspecs with - A.Tnamed _ :: (_ :: _ as rest) when not theMachine.msvcMode -> + | A.Tnamed _ :: (_ :: _ as rest) when Cil.gccMode () -> (* If rest contains "short" or "long" then drop the Tnamed *) if List.exists (function A.Tshort -> true | A.Tlong -> true | _ -> false) rest then @@ -3690,16 +3715,15 @@ | [A.Tlong; A.Tdouble] -> TFloat(FLongDouble, []) (* Now the other type specifiers *) + | [A.Tnamed "__builtin_va_list"] + when Cil.theMachine.theMachine.has__builtin_va_list -> + TBuiltin_va_list [] + | [A.Tnamed "__fc_builtin_size_t"] -> Cil.theMachine.typeOfSizeOf | [A.Tnamed n] -> - if n = "__builtin_va_list" && - Cil.theMachine.theMachine.has__builtin_va_list - then - TBuiltin_va_list [] - else - (match lookupType "type" n with - | (TNamed _) as x, _ -> x - | _ -> - Kernel.fatal ~current:true "Named type %s is not mapped correctly" n) + (match lookupType "type" n with + | (TNamed _) as x, _ -> x + | _ -> + Kernel.fatal ~current:true "Named type %s is not mapped correctly" n) | [A.Tstruct (n, None, _)] -> (* A reference to a struct *) if n = "" then @@ -3762,7 +3786,7 @@ smallest := i; if Integer.gt i !largest then largest := i; - if theMachine.msvcMode then + if Cil.msvcMode () then IInt else begin match Kernel.Enums.get () with @@ -3805,16 +3829,17 @@ | (kname, e, cloc) :: rest -> (* constant-eval 'e' to determine tag value *) let e' = getIntConstExp ghost e in - let e' = match isInteger (constFold true e') with + let e' = match constFoldToInt e' with | None -> - Kernel.fatal ~current:true + Kernel.fatal ~current:true "Constant initializer %a not an integer" Cil_printer.pp_exp e' | Some i -> let ik = updateEnum i in - if theMachine.lowerConstants then - kinteger64 ~loc:e.expr_loc ik i - else e' + if theMachine.lowerConstants then + kinteger64 ~loc:e.expr_loc ~kind:ik i + else + e' in processName kname e' (convLoc cloc) rest in @@ -3824,7 +3849,7 @@ (* Now set the right set of items *) enum.eitems <- List.map (fun (_, x) -> x) fields; (* Pick the enum's kind - see discussion above *) - if not theMachine.msvcMode then begin + begin let unsigned = Integer.ge !smallest Integer.zero in let smallKind = intKindForValue !smallest unsigned in let largeKind = intKindForValue !largest unsigned in @@ -3927,7 +3952,7 @@ in (* log "Looking at %s(%b): (%a)@." n isformal d_attrlist nattr;*) - let vi = makeVarinfo ~generated:isgenerated isglobal isformal n t in + let vi = makeVarinfo ~temp:isgenerated isglobal isformal n t in vi.vstorage <- sto; vi.vattr <- nattr; vi.vdecl <- ldecl; @@ -3943,7 +3968,7 @@ spec_res (n,ndt,a) : varinfo * chunk * exp * bool = - if not theMachine.msvcMode then + if not (Cil.msvcMode ()) then match isVariableSizedArray ghost ndt with None -> makeVarInfoCabs ~ghost ~isformal:false @@ -3995,8 +4020,8 @@ match H.find env n' with EnvEnum item, _ -> begin - match isInteger (constFold true item.eival) with - Some i64 when theMachine.lowerConstants -> + match constFoldToInt item.eival with + | Some i64 when theMachine.lowerConstants -> AInt i64 | _ -> ACons(n', []) end @@ -4094,6 +4119,7 @@ * the type for a name, or AttrType * if we are doing this type in a * typedef *) + ?(allowZeroSizeArrays=false) ?(allowVarSizeArrays=false) (bt: typ) (* The base type *) (dt: A.decl_type) @@ -4133,7 +4159,7 @@ else cabsTypeAddAttributes a2f (cabsTypeAddAttributes a1f restyp) - | TPtr ((TFun _ as tf), ap) when not theMachine.msvcMode -> + | TPtr ((TFun _ as tf), ap) when not (Cil.msvcMode ()) -> if a1fadded then TPtr(cabsTypeAddAttributes a2f tf, ap) else @@ -4198,11 +4224,11 @@ if Integer.lt i Integer.zero then Kernel.error ~once:true ~current:true "Length of array is negative" - else if Integer.equal i Integer.zero then + else if Integer.equal i Integer.zero && not allowZeroSizeArrays then begin Kernel.warning ~once:true ~source:(fst len'.eloc) "Length of array is zero. This GCC extension is unsupported. Assuming length is 1."; - raise (ChangeSize (Cil.zero ~loc:len'.eloc)) + raise (ChangeSize (Cil.one ~loc:len'.eloc)) end | _ -> if isConstant cst then @@ -4236,7 +4262,7 @@ * builtin_va_alist_t". On MSVC we do not have the ellipsis and we * have a last argument "va_alist: va_list" *) let args', isva' = - if args != [] && theMachine.msvcMode = not isva then begin + if args != [] && Cil.msvcMode () = not isva then begin let newisva = ref isva in let rec doLast = function [([A.SpecType (A.Tnamed atn)], (an, A.JUSTBASE, [], _))] @@ -4407,7 +4433,7 @@ if sto <> NoStorage || inl then Kernel.error ~once:true ~current:true "Storage or inline not allowed for fields"; let ftype, nattr = - doType ghost false (AttrName false) bt (A.PARENTYPE(attrs, ndt, a)) in + doType ~allowZeroSizeArrays:true ghost false (AttrName false) bt (A.PARENTYPE(attrs, ndt, a)) in (* check for fields whose type is an undefined struct. This rules out circularity: struct C1 { struct C2 c2; }; //This line is now an error. @@ -4549,7 +4575,7 @@ (* first, filter for those Const exps that are integers *) | Const (CInt64 _ ) -> e | Const (CEnum _) -> e - | Const (CChr i) -> new_exp ~loc (Const(charConstToInt i)) + | Const (CChr i) -> new_exp ~loc (Const(charConstToIntConstant i)) (* other Const expressions are not ok *) | Const _ -> @@ -4561,18 +4587,11 @@ the various sizeof and alignof expression kinds *) | _ -> e -(* this is like 'isIntConstExp', but retrieves the actual integer - * the expression denotes; I have not extended it to work with - * sizeof/alignof since (for CCured) we can't const-eval those, - * and it's not clear whether they can be bitfield width specifiers - * anyway (since that's where this function is used) - * -- VP 2006-12-20: C99 explicitly says so (par. 6.6.6) - *) and isIntegerConstant ghost (aexp) : int option = match doExp (ghost_local_env ghost) true aexp (AExp None) with - (_, c, e, _) when isEmpty c -> begin - match isInteger (Cil.constFold true e) with - Some i64 -> Some (Integer.to_int i64) + | (_, c, e, _) when isEmpty c -> begin + match Cil.constFoldToInt e with + | Some i64 -> Some (Integer.to_int i64) | _ -> None end | _ -> None @@ -4691,7 +4710,7 @@ Cil.error "variable appears in constant"; *) finishExp reads (unspecified_chunk empty) - (new_exp ~loc (Lval lval)) vi.vtype + (new_exp ~loc (Lval lval)) (dropQualifiers vi.vtype) | EnvEnum item, _ -> let typ = Cil.typeOf item.eival in (*Kernel.debug "Looking for %s got enum %s : %a of type %a" @@ -4730,8 +4749,10 @@ | (TInt _|TEnum _), TPtr(t2e,_) -> e2', t2, e1', t2e | _ -> Kernel.fatal ~current:true - "Expecting a pointer type in index:@\n t1=%a@\nt2=%a" - Cil_printer.pp_typ t1 Cil_printer.pp_typ t2 + "Expecting exactly one pointer type in array access %a[%a] (%a \ + and %a)" + Cil_printer.pp_exp e1' Cil_printer.pp_exp e2' + Cil_printer.pp_typ t1 Cil_printer.pp_typ t2 in (* We have to distinguish the construction based on the type of e1'' *) let res = @@ -4750,7 +4771,7 @@ then l else res :: l in - finishExp reads se (new_exp ~loc (Lval res)) tresult + finishExp reads se (new_exp ~loc (Lval res)) (dropQualifiers tresult) end | A.UNARY (A.MEMOF, e) -> if asconst then @@ -4770,7 +4791,7 @@ then r else res :: r in - finishExp reads se (new_exp ~loc (Lval res)) tresult + finishExp reads se (new_exp ~loc (Lval res)) (dropQualifiers tresult) (* e.str = (& e + off(str)). If e = (be + beoff) then e.str = (be * + beoff + off(str)) *) @@ -4798,13 +4819,13 @@ Kernel.fatal ~current:true "expecting a struct with field %s" str in let lv' = addOffsetLval field_offset lv in - let field_type = typeOf (dummy_exp (Lval lv')) in + let field_type = typeOfLval lv' in let reads = if Lval.Set.mem lv' local_env.authorized_reads then r else lv':: r in - finishExp reads se (new_exp ~loc (Lval lv')) field_type + finishExp reads se (new_exp ~loc (Lval lv')) (dropQualifiers field_type) (* e->str = * (e + off(str)) *) | A.MEMBEROFPTR (e, str) -> @@ -4823,13 +4844,13 @@ str Cil_printer.pp_typ x Cil_printer.pp_typ t' in let lv' = mkMem e' field_offset in - let field_type = typeOf (dummy_exp (Lval lv')) in + let field_type = typeOfLval lv' in let reads = if Lval.Set.mem lv' local_env.authorized_reads then r else lv' :: r in - finishExp reads se (new_exp ~loc (Lval lv')) field_type + finishExp reads se (new_exp ~loc (Lval lv')) (dropQualifiers field_type) | A.CONSTANT ct -> begin let hasSuffix str = @@ -4884,7 +4905,7 @@ * L'c'). But gcc allows L'abc', so I'll leave this here in case * I'm missing some architecture dependent behavior. *) let value = reduce_multichar theMachine.wcharType char_list in - let result = kinteger64 ~loc theMachine.wcharKind + let result = kinteger64 ~loc ~kind:theMachine.wcharKind (Integer.of_int64 value) in finishExp [] (unspecified_chunk empty) result (typeOf result) @@ -4975,10 +4996,7 @@ end else empty in let size = - match e'.enode with (* If we are taking the sizeof an - * array we must drop the StartOf *) - StartOf(lv) -> - new_exp ~loc (SizeOfE (new_exp ~loc:e'.eloc(Lval(lv)))) + match e'.enode with (* Maybe we are taking the sizeof a variable-sized array *) | Lval (Var vi, NoOffset) -> begin try @@ -5145,7 +5163,7 @@ * taking the address of the argument that was removed while * processing the function type. We compute the address based on * the address of the last real argument *) - if theMachine.msvcMode then begin + if Cil.msvcMode () then begin let rec getLast = function | [] -> Kernel.fatal ~current:true @@ -5195,7 +5213,7 @@ (* ignore (E.log "ADDROF on %a : %a\n" Cil_printer.pp_exp e' Cil_printer.pp_typ t); *) match e'.enode with - (Lval x | CastE(_, {enode = Lval x})) -> + | (Lval x | CastE(_, {enode = Lval x})) -> let reads = match x with | Mem _ ,_ -> r (* we're not really reading the @@ -5206,7 +5224,13 @@ then r else x :: r in - finishExp reads se (mkAddrOfAndMark loc x) (TPtr(t, [])) + (* Recover type qualifiers that were dropped by dropQualifiers + when the l-value was created *) + let tres = match e'.enode with + | Lval x -> Cil.typeOfLval x + | _ -> t + in + finishExp reads se (mkAddrOfAndMark loc x) (TPtr(tres, [])) | StartOf (lv) -> let tres = TPtr(typeOfLval lv, []) in (* pointer to array *) @@ -5581,7 +5605,7 @@ newTempVar "" true intType in let condChunk = - compileCondExp ~ghost false ce + compileCondExp ~ghost ce (empty +++ (mkStmtOneInstr ~ghost (Set(var tmp, integer ~loc 1,loc)),[],[],[])) @@ -5603,6 +5627,40 @@ * takes INTs as arguments *) A.VARIABLE n -> begin try + (* First look for polymorphic builtins. The typing rule is + luckily always the same one. *) + let n = match n with + | "__sync_add_and_fetch" | "__sync_sub_and_fetch" + | "__sync_or_and_fetch" | "__sync_and_and_fetch" + | "__sync_xor_and_fetch" | "__sync_nand_and_fetch" + | "__sync_fetch_and_add" | "__sync_fetch_and_sub" + | "__sync_fetch_and_or" | "__sync_fetch_and_and" + | "__sync_fetch_and_xor" | "__sync_fetch_and_nand" + | "__sync_bool_compare_and_swap" + | "__sync_val_compare_and_swap" + | "__sync_lock_release" | "__sync_lock_test_and_set" -> + begin + match args with + | a1::_ -> + (* The available prototypes are + typ' f(typ* a1,typ a2,typ a3,...); + typ' f(typ* a1,typ a2,...); + typ' f(typ* a1,...); + Hence we just infer the right type + looking at the first argument. *) + let _,_,_,t = doExp local_env false a1 AType in + let t = typeOf_pointed t in + Format.sprintf "%s_%sint%d_t" + n + (if isSignedInteger t then "" else "u") + (bitsSizeOf t) + | [] -> + Kernel.error ~once:true ~current:true + "Too few arguments for builtin %s" n; + n + end + | _ -> n + in let vi, _ = lookupVar n in let reads = if Lval.Set.mem @@ -5623,7 +5681,7 @@ (* Add a prototype to the environment *) let proto, _ = makeGlobalVarinfo false - (makeGlobalVar ~generated:false n ftype) in + (makeGlobalVar ~temp:false n ftype) in (* Make it EXTERN *) proto.vstorage <- Extern; IH.add noProtoFunctions proto.vid true; @@ -5815,178 +5873,203 @@ end | _ -> "" in - (* Try to intercept some builtins *) (match (!pf).enode with | Lval(Var fv, NoOffset) -> begin - if fv.vname = "__builtin_va_arg" then begin - match !pargs with - marker :: ({enode = SizeOf resTyp} as size) :: _ -> begin - (* Make a variable of the desired type *) - let is_real, destlv, r, destlvtyp = - match !pwhat with - ASet (is_real,lv, r, lvt) -> is_real, lv, r, lvt - | _ -> - let v = newTempVar "vararg" true resTyp in - locals := v::!locals; - false, var v, [], resTyp - in - pwhat := (ASet (is_real, destlv, r, destlvtyp)); - pargs := [marker; size; - new_exp ~loc - (CastE(voidPtrType, - new_exp ~loc (AddrOf destlv)))]; - pis__builtin_va_arg := true; - end - | _ -> - Kernel.warning ~current:true "Invalid call to %s\n" fv.vname; - end else if fv.vname = "__builtin_stdarg_start" || - fv.vname = "__builtin_va_start" then begin - match !pargs with - marker :: last :: [] -> begin - let isOk = - match (dropCasts last).enode with - Lval (Var lastv, NoOffset) -> - lastv.vname = getNameLastFormal () - | _ -> false - in - if not isOk then - Kernel.warning ~current:true - "The second argument in call to %s \ + match fv.vname with + | "__builtin_va_arg" -> + begin + match !pargs with + | marker :: ({enode = SizeOf resTyp} as size) :: _ -> begin + (* Make a variable of the desired type *) + let is_real, destlv, r, destlvtyp = + match !pwhat with + ASet (is_real,lv, r, lvt) -> is_real, lv, r, lvt + | _ -> + let v = newTempVar "vararg" true resTyp in + locals := v::!locals; + false, var v, [], resTyp + in + pwhat := (ASet (is_real, destlv, r, destlvtyp)); + pargs := [marker; size; + new_exp ~loc + (CastE(voidPtrType, + new_exp ~loc (AddrOf destlv)))]; + pis__builtin_va_arg := true; + end + | _ -> + Kernel.warning ~current:true "Invalid call to %s\n" fv.vname; + end + | "__builtin_stdarg_start" | "__builtin_va_start" -> + begin + match !pargs with + | marker :: last :: [] -> begin + let isOk = + match (dropCasts last).enode with + | Lval (Var lastv, NoOffset) -> + lastv.vname = getNameLastFormal () + | _ -> false + in + if not isOk then + Kernel.warning ~current:true + "The second argument in call to %s \ should be the last formal argument" fv.vname; - (* Check that "lastv" is indeed the last variable in the - * prototype and then drop it *) - pargs := [ marker ] - end - | _ -> - Kernel.warning ~current:true "Invalid call to %s\n" fv.vname; + (* Check that "lastv" is indeed the last variable in the + * prototype and then drop it *) + pargs := [ marker ] + end + | _ -> + Kernel.warning ~current:true "Invalid call to %s\n" fv.vname; - (* We have to turn uses of __builtin_varargs_start into uses - * of __builtin_stdarg_start (because we have dropped the - * __builtin_va_alist argument from this function) *) + (* We have to turn uses of __builtin_varargs_start into uses + * of __builtin_stdarg_start (because we have dropped the + * __builtin_va_alist argument from this function) *) + end - end else if fv.vname = "__builtin_varargs_start" then begin + | "__builtin_varargs_start" -> + begin (* Lookup the prototype for the replacement *) - let v, _ = - try lookupGlobalVar "__builtin_stdarg_start" - with Not_found -> - Kernel.abort ~current:true - "Cannot find __builtin_stdarg_start to replace %s" - fv.vname - in - pf := new_exp ~loc (Lval (var v)) - end else if fv.vname = "__builtin_next_arg" then begin - match !pargs with - last :: [] -> begin - let isOk = - match (dropCasts last).enode with - Lval (Var lastv, NoOffset) -> + let v, _ = + try lookupGlobalVar "__builtin_stdarg_start" + with Not_found -> + Kernel.abort ~current:true + "Cannot find __builtin_stdarg_start to replace %s" + fv.vname + in + pf := new_exp ~loc (Lval (var v)) + end + | "__builtin_next_arg" -> + begin + match !pargs with + last :: [] -> begin + let isOk = + match (dropCasts last).enode with + Lval (Var lastv, NoOffset) -> lastv.vname = getNameLastFormal () - | _ -> false - in - if not isOk then - Kernel.warning ~current:true - "The argument in call to %s should be \ + | _ -> false + in + if not isOk then + Kernel.warning ~current:true + "The argument in call to %s should be \ the last formal argument\n" fv.vname; - pargs := [ ] - end + pargs := [ ] + end | _ -> Kernel.warning ~current:true "Invalid call to %s\n" fv.vname; - end else if fv.vname = "__builtin_va_arg_pack" then begin - (match !pargs with [ ] -> begin - piscall := false; - pres := new_exp ~loc:e.expr_loc (SizeOfE !pf); - prestype := theMachine.typeOfSizeOf - end - | _ -> - Kernel.warning ~current:true - "Invalid call to builtin_va_arg_pack"); - end else if fv.vname = "__builtin_constant_p" then begin + end + | "__builtin_va_arg_pack" -> + begin + (match !pargs with [ ] -> begin + piscall := false; + pres := new_exp ~loc:e.expr_loc (SizeOfE !pf); + prestype := theMachine.typeOfSizeOf + end + | _ -> + Kernel.warning ~current:true + "Invalid call to builtin_va_arg_pack"); + end + | "__builtin_constant_p" -> + begin (* Drop the side-effects *) - prechunk := empty; - + prechunk := empty; + (* Constant-fold the argument and see if it is a constant *) - (match !pargs with - [ arg ] -> begin - match (constFold true arg).enode with - | Const _ -> piscall := false; - pres := integer ~loc:e.expr_loc 1 ; - prestype := intType - - | _ -> piscall := false; - pres := integer ~loc:e.expr_loc 0; - prestype := intType - end - | _ -> - Kernel.warning ~current:true - "Invalid call to builtin_constant_p") - end - else if fv.vname = "__builtin_types_compatible_p" then begin + (match !pargs with + [ arg ] -> begin + match (constFold true arg).enode with + | Const _ -> piscall := false; + pres := integer ~loc:e.expr_loc 1 ; + prestype := intType + + | _ -> piscall := false; + pres := integer ~loc:e.expr_loc 0; + prestype := intType + end + | _ -> + Kernel.warning ~current:true + "Invalid call to builtin_constant_p") + end + | "__builtin_types_compatible_p" -> + begin (* Constant-fold the argument and see if it is a constant *) - (match !pargs with - [ {enode = SizeOf t1}; {enode = SizeOf t2}] -> begin + (match !pargs with + [ {enode = SizeOf t1}; {enode = SizeOf t2}] -> begin (* Drop the side-effects *) - prechunk := empty; - piscall := false; - let compatible = - try ignore(combineTypes CombineOther t1 t2); true - with Failure _ -> false - in if compatible then - pres := integer ~loc 1 - else - pres := integer ~loc 0; - prestype := intType - end - | _ -> - Kernel.warning - ~once:true - ~current:true - "Invalid call to builtin_types_compatible_p"); - end - else if asconst then + prechunk := empty; + piscall := false; + let compatible = + try ignore(combineTypes CombineOther t1 t2); true + with Failure _ -> false + in if compatible then + pres := integer ~loc 1 + else + pres := integer ~loc 0; + prestype := intType + end + | _ -> + Kernel.warning + ~once:true + ~current:true + "Invalid call to builtin_types_compatible_p"); + end + | "__builtin_expect" -> + begin + match !pargs with + | [ arg;_ ] -> + (* Keep all side-effects, including those steming + from the second argument. This is quite strange but + compliant with GCC's behavior. *) + piscall := false; + pres := arg + | _ -> + Kernel.warning ~once:true ~current:true + "Invalid call to builtin_expect" + end + + (* TODO: Only keep the side effects of the 1st or 2nd argument + | "__builtin_choose_expr" -> + begin match !pargs with + | [ arg; e1; e2 ] -> + begin + let constfolded = constFold true arg in + match constfolded.enode with + | Const _ -> + piscall := false; + if isZero constfolded then begin + (* Keep only 3rd arg side effects *) + (*TODO: prechunk := sf @@ (List.nth sargsl 2);*) + pres := e2; + prestype := typeOf e2 + end else begin + (* Keep only 2nd arg side effects *) + (*TODO prechunk := sf @@ (List.nth sargsl 1);*) + pres := e1; + prestype := typeOf e1 + end + | _ -> Kernel.warning ~once:true ~current:true + "builtin_choose_expr expects a constant first argument" + end + | _ -> + Kernel.warning ~once:true ~current:true + "Invalid call to builtin_choose_expr: 3 arguments are \ + expected but %d are provided." + (List.length !pargs) + end*) + | _ -> + if asconst then (* last special case: we cannot allow a function call at this point.*) - begin - piscall := false; - Kernel.warning - ~once:true - ~current:true - "Call to %a in constant. Ignoring this call and \ + begin + piscall := false; + Kernel.warning + ~once:true + ~current:true + "Call to %a in constant. Ignoring this call and \ returning 0." - Cprint.print_expression f; - end -(*TODO: support those nice builtins. - One needs to translate the code below from - Cil to frama-C. - - else if fv.vname = "__builtin_choose_expr" then begin - - (* Constant-fold the argument and see if it is a constant *) - (match !pargs with - [ arg; e1; e2 ] -> begin - let constfolded = constFold true arg in - match constfolded.enode with - | (Const _) -> - piscall := false; - if isZero constfolded then begin - (* Keep only 3rd arg side effects *) - prechunk := (fun _ -> sf @@ (List.nth sargsl 2)); - pres := e2; - prestype := typeOf e2 - end else begin - (* Keep only 2nd arg side effects *) - prechunk := (fun _ -> sf @@ (List.nth sargsl 1)); - pres := e1; - prestype := typeOf e1 - end - | _ -> ignore (warn "builtin_choose_expr expects a constant first argument") - end - | _ -> - Kernel.warning "Invalid call to builtin_choose_expr") - end -*) + Cprint.print_expression f; + end end | _ -> ()); @@ -6059,11 +6142,22 @@ | A.COMMA el -> if asconst then Kernel.warning ~current:true "COMMA in constant"; + (* We must ignore AExpLeaveArrayFun (a.k.a. 'do not decay pointers') + if the expression at hand is a sequence with strictly more than + one expression, because the exception for sizeof and typeof only + apply when the expression is directly the argument of the operators. + See C99 and C11 6.3.2.1§3.) + *) + let what = + if what <> AExpLeaveArrayFun || List.length el = 1 + then what + else (AExp None) + in let rec loop sofar = function - [e] -> - let (r, se, e', t') = doExp local_env false e what - in (* Pass on the action *) - (r, sofar @@ (se, ghost), e', t') + | [e] -> + let (r, se, e', t') = doExp local_env false e what in + (* Pass on the action *) + (r, sofar @@ (se, ghost), e', t') | e :: rest -> let (_, se, _, _) = doExp local_env false e ADrop in loop (sofar @@ (se, ghost)) rest @@ -6175,7 +6269,7 @@ se3 @@ (keepPureExpr ~ghost e3' loc, ghost) else se3 in - let cond = compileCondExp ~ghost false ce1 se2 se3 in + let cond = compileCondExp ~ghost ce1 se2 se3 in finishExp (r2@r3) cond res Cil.voidType | Some _ -> (* we just keep e1 in case it is dangerous. everything else can be dropped *) @@ -6231,7 +6325,7 @@ finishExp ~newWhat:(ASet(is_real,lv, r, lvt)) r3 se3 e3' t3 in - let cond = compileCondExp ~ghost false ce1 se2 se3 in + let cond = compileCondExp ~ghost ce1 se2 se3 in finishExp (r2@r3) (scope_chunk @@ (cond, ghost)) @@ -6393,7 +6487,7 @@ | (Mod|BAnd|BOr|BXor) -> doIntegralArithmetic () | (Shiftlt|Shiftrt) -> (* ISO 6.5.7. Only integral promotions. The result * has the same type as the left hand side *) - if theMachine.msvcMode then + if Cil.msvcMode () then (* MSVC has a bug. We duplicate it here *) doIntegralArithmetic () else @@ -6551,7 +6645,6 @@ | Some orig -> ConditionalSideEffectHook.apply (orig,e)); ignore (checkBool t e'); - Cabscond.bind e e' ; CEExp (add_reads e.expr_loc r se, if asconst || theMachine.lowerConstants then constFold asconst e' @@ -6559,9 +6652,7 @@ in result - (* If cabscond is true, then CIL-atomic expressions must be bound with Cabscond. *) - -and compileCondExp ~ghost cabscond ce st sf = +and compileCondExp ~ghost ce st sf = match ce with | CEAnd (ce1, ce2) -> @@ -6573,7 +6664,7 @@ let lab = newLabelName "_LAND" in (false, gotoChunk ~ghost lab loc, consLabel ~ghost lab sf loc false) in - let st' = compileCondExp ~ghost cabscond ce2 st sf1 in + let st' = compileCondExp ~ghost ce2 st sf1 in if not duplicable && !doAlternateConditional then let st_fall_through = chunkFallsThrough st' in (* if st does not fall through, we do not need to add a goto @@ -6590,11 +6681,11 @@ else skipChunk in let (@@) s1 s2 = s1 @@ (s2, ghost) in - (compileCondExp ~ghost cabscond ce1 st' sf') + (compileCondExp ~ghost ce1 st' sf') @@ gotostmt @@ sf2 @@ labstmt else let sf' = sf2 in - compileCondExp ~ghost cabscond ce1 st' sf' + compileCondExp ~ghost ce1 st' sf' | CEOr (ce1, ce2) -> let loc = CurrentLoc.get () in @@ -6607,7 +6698,7 @@ in if not duplicable && !doAlternateConditional then let st' = duplicateChunk st1 in - let sf' = compileCondExp ~ghost cabscond ce2 st1 sf in + let sf' = compileCondExp ~ghost ce2 st1 sf in let sf_fall_through = chunkFallsThrough sf' in let lab = newLabelName "_LOR" in let gotostmt = @@ -6621,17 +6712,17 @@ else skipChunk in let (@@) s1 s2 = s1 @@ (s2, ghost) in - (compileCondExp ~ghost cabscond ce1 st' sf') + (compileCondExp ~ghost ce1 st' sf') @@ gotostmt @@ st2 @@ labstmt else let st' = st1 in - let sf' = compileCondExp ~ghost cabscond ce2 st2 sf in + let sf' = compileCondExp ~ghost ce2 st2 sf in (*Format.eprintf "result:@\nchunk then:@\n @[%a@]@\nchunk else: @[%a@]@." d_chunk st d_chunk sf;*) - compileCondExp ~ghost cabscond ce1 st' sf' + compileCondExp ~ghost ce1 st' sf' - | CENot ce1 -> compileCondExp ~ghost cabscond ce1 sf st + | CENot ce1 -> compileCondExp ~ghost ce1 sf st | CEExp (se, e) -> begin match e.enode with @@ -6646,21 +6737,16 @@ (* A special case for conditionals *) -and doCondition ?info local_env (isconst: bool) +and doCondition local_env (isconst: bool) (* If we are in constants, we do our best to eliminate the conditional *) (e: A.expression) (st: chunk) (sf: chunk) : chunk = - let cabscond = match info with - | Some (descr,loc) -> Cabscond.push_condition descr loc e - | None -> false - in - if not cabscond && isEmpty st && isEmpty sf(*TODO: ignore attribute FRAMA_C_KEEP_BLOCK*) then - let (_, se,_,_) = doExp local_env cabscond e ADrop in se + if isEmpty st && isEmpty sf(*TODO: ignore attribute FRAMA_C_KEEP_BLOCK*) then + let (_, se,_,_) = doExp local_env false e ADrop in se else let ce = doCondExp local_env isconst e in - if cabscond then Cabscond.pop_condition () ; - let chunk = compileCondExp ~ghost:local_env.is_ghost cabscond ce st sf in + let chunk = compileCondExp ~ghost:local_env.is_ghost ce st sf in chunk @@ -7107,8 +7193,8 @@ doExp local_env true idx (AExp(Some intType)) in let doidx = add_reads idxe'.eloc r doidx in - match (constFold true idxe').enode, isNotEmpty doidx with - Const(CInt64(x, _, _)), false -> Integer.to_int x, doidx + match constFoldToInt idxe', isNotEmpty doidx with + | Some x, false -> Integer.to_int x, doidx | _ -> Kernel.abort ~current:true "INDEX initialization designator is not a constant" @@ -7147,11 +7233,8 @@ if isNotEmpty doidxs || isNotEmpty doidxe then Kernel.fatal ~current:true "Range designators are not constants"; let first, last = - match (constFold true idxs').enode, (constFold true idxe').enode - with - Const(CInt64(s, _, _)), - Const(CInt64(e, _, _)) -> - Integer.to_int s, Integer.to_int e + match constFoldToInt idxs', constFoldToInt idxe' with + | Some s, Some e -> Integer.to_int s, Integer.to_int e | _ -> Kernel.fatal ~current:true "INDEX_RANGE initialization designator is not a constant" @@ -7597,7 +7680,7 @@ | ((n, _, _, _), _) :: _ -> n in let ghost = local_env.is_ghost in - let spec_res = doSpecList local_env.is_ghost sugg s in + let spec_res = doSpecList ghost sugg s in (* Do all the variables and concatenate the resulting statements *) let doOneDeclarator (acc: chunk) (name: init_name) = let (n,ndt,a,l),_ = name in @@ -7623,7 +7706,7 @@ "Bad alias attribute at %a" Cil_printer.pp_location (CurrentLoc.get())); acc end else - acc @@ (createLocal local_env.is_ghost spec_res name, ghost) + acc @@ (createLocal ghost spec_res name, ghost) in let res = List.fold_left doOneDeclarator empty nl in if isglobal then res @@ -7723,7 +7806,7 @@ (* Make the fundec right away, and we'll populate it later. We * need this throughout the code to create temporaries. *) currentFunctionFDEC := - { svar = makeGlobalVar ~generated:false n voidType; + { svar = makeGlobalVar ~temp:false n voidType; slocals = []; (* For now we'll put here both the locals and * the formals. Then "endFunction" will * separate them *) @@ -7846,7 +7929,7 @@ (* Create the formals and add them to the environment. *) (* sfg: extract tsets for the formals from dt *) let doFormal (loc : location) (fn, ft, fa) = - let f = makeVarinfo ~generated:false false true fn ft in + let f = makeVarinfo ~temp:false false true fn ft in (f.vdecl <- loc; f.vattr <- fa; alphaConvertVarAndAddToEnv true f) @@ -8079,9 +8162,11 @@ let protect_return,retval = (* Guard the [return] instructions we add with an [\assert \false]*) + let pfalse = Logic_const.unamed ~loc:endloc Pfalse in + let pfalse = { pfalse with name = ["missing_return"] } in let assert_false () = - let annot = Logic_const.new_code_annotation - (AAssert ([], Logic_const.unamed ~loc:endloc Pfalse)) + let annot = + Logic_const.new_code_annotation (AAssert ([], pfalse)) in Cil.mkStmt ~ghost:local_env.is_ghost (Instr (Code_annot (annot, endloc))) @@ -8301,7 +8386,7 @@ | _ -> Kernel.fatal "Trying to initialize a anonymous block" in let ensures = ref [] in - let known_idx = ref Datatype.Big_int.Set.empty in + let known_idx = ref Datatype.Integer.Set.empty in let explicit_init (_,off as lv) v = if not has_implicit_init then begin (* just add ensures at the toplevel init *) @@ -8318,9 +8403,9 @@ if Cil_datatype.Offset.equal curr_off my_off then begin match last_off with | Index(i,_) -> - (match Cil.constFold true i with - | { enode = Const (CInt64 (v,_,_)) } -> - known_idx := Datatype.Big_int.Set.add v !known_idx + (match Cil.constFoldToInt i with + | Some v -> + known_idx := Datatype.Integer.Set.add v !known_idx | _ -> Kernel.abort ~current:true "Non constant index in designator for array \ @@ -8584,7 +8669,7 @@ let st' = doStatement local_env st in let sf' = doStatement local_env sf in CurrentLoc.set (convLoc loc); - doCondition ~info:(Cabscond.IF,loc) local_env false e st' sf' + doCondition local_env false e st' sf' | A.WHILE(a,e,s,loc) -> let a = mk_loop_annot a loc in @@ -8600,8 +8685,7 @@ exitLoop (); CurrentLoc.set loc'; loopChunk ~ghost a - ((doCondition - ~info:(Cabscond.WHILE,loc) local_env false e skipChunk break_cond) + ((doCondition local_env false e skipChunk break_cond) @@ (s', ghost)) | A.DOWHILE(a, e,s,loc) -> @@ -8630,7 +8714,6 @@ let s'' = consLabContinue ~ghost (doCondition - ~info:(Cabscond.DOWHILE,loc) local_env false e skipChunk (breakChunk ~ghost loc')) in @@ -8665,7 +8748,6 @@ se1 @@ (loopChunk ~ghost a (((doCondition - ~info:(Cabscond.FOR,loc) local_env false e2 skipChunk break_cond) @@ (s', ghost)) @@ (s'', ghost)), ghost) in @@ -8753,9 +8835,8 @@ Kernel.error ~once:true ~current:true "Case statement with a non-constant"; let il, ih = - match (constFold true el').enode, (constFold true eh').enode with - Const(CInt64(il, _, _)), Const(CInt64(ih, _, _)) -> - Integer.to_int il, Integer.to_int ih + match constFoldToInt el', constFoldToInt eh' with + | Some il, Some ih -> Integer.to_int il, Integer.to_int ih | _ -> Kernel.fatal ~current:true "Cannot understand the constants in case range" @@ -8849,7 +8930,7 @@ match details with | None -> let tmpls' = - if theMachine.msvcMode then tmpls + if Cil.msvcMode () then tmpls else let pattern = Str.regexp "%" in let escape = Str.global_replace pattern "%%" in @@ -8901,7 +8982,39 @@ (i2c(mkStmtOneInstr ~ghost:local_env.is_ghost (Asm(attr', tmpls', outs', ins', clobs', labels', loc')),[],[],[]), ghost) - + | THROW (e,loc) -> + let loc' = convLoc loc in + CurrentLoc.set loc'; + (match e with + | None -> s2c (mkStmt ~ghost (Throw (None,loc'))) + | Some e -> + let se,e,t = doFullExp local_env false e (AExp None) in + se @@ + (s2c (mkStmt ~ghost (Throw (Some (e,t),loc'))),ghost)) + | TRY_CATCH(stry,l,loc) -> + let loc' = convLoc loc in + CurrentLoc.set loc'; + let chunk_try = doStatement local_env stry in + let type_one_catch (var,scatch) = + enterScope(); + let vi = + match var with + | None -> Catch_all + | Some (t,(n,ndt,a,ldecl)) -> + let spec = doSpecList ghost n t in + let vi = + makeVarInfoCabs + ~ghost ~isformal:false ~isglobal:false ldecl spec (n,ndt,a) + in + addLocalToEnv n (EnvVar vi); + Catch_exn(vi,[]) + in + let chunk_catch = doStatement local_env scatch in + exitScope(); + (vi,c2block ~ghost chunk_catch) + in + let catches = List.map type_one_catch l in + s2c (mkStmt ~ghost (TryCatch(c2block ~ghost chunk_try,catches,loc'))) | TRY_FINALLY (b, h, loc) -> let loc' = convLoc loc in CurrentLoc.set loc'; @@ -9013,20 +9126,8 @@ Logic_env.prepare_tables (); anonCompFieldNameId := 0; Kernel.debug ~level:2 "Converting CABS->CIL" ; - (* Setup the built-ins, but do not add their prototypes to the file *) - let setupBuiltin name (resTyp, argTypes, isva) = - let v = - makeGlobalVar name (TFun(resTyp, - Some (List.map (fun at -> ("", at, [])) - argTypes), - isva, [])) in - ignore (alphaConvertVarAndAddToEnv true v); - (* Add it to the file as well *) - cabsPushGlobal (GVarDecl (empty_funspec (), v, Cil.builtinLoc)); - Cil.setFormalsDecl v v.vtype - in - Cil.Builtin_functions.iter_sorted setupBuiltin; - + Cil.Builtin_functions.iter_sorted + (fun name def -> ignore (setupBuiltin name def)); let globalidx = ref 0 in let doOneGlobal (ghost,(d: A.definition)) = let local_env = ghost_local_env ghost in diff -Nru frama-c-20140301+neon+dfsg/cil/src/frontc/cabs2cil.mli frama-c-20150201+sodium+dfsg/cil/src/frontc/cabs2cil.mli --- frama-c-20140301+neon+dfsg/cil/src/frontc/cabs2cil.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/frontc/cabs2cil.mli 2015-05-28 08:53:20.000000000 +0000 @@ -260,7 +260,7 @@ (** Check that the two given types are compatible (C99, 6.2.7), and return a boolean. - @since Neon-20130301 + @since Neon-20140301 *) (* diff -Nru frama-c-20140301+neon+dfsg/cil/src/frontc/cabsbranches.ml frama-c-20150201+sodium+dfsg/cil/src/frontc/cabsbranches.ml --- frama-c-20140301+neon+dfsg/cil/src/frontc/cabsbranches.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/frontc/cabsbranches.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,223 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -open Cil_types -open Cil_datatype -open Cabscond - -(* -------------------------------------------------------------------------- *) -(* --- Branching --- *) -(* -------------------------------------------------------------------------- *) - -type branches = { - s_info : info ; - s_leftmost : int ; (* eid of the left-most atom *) - mutable s_then : block list ; - mutable s_else : block list ; -} - -let branches : (int,branches) Hashtbl.t = Hashtbl.create 371 (* indexed by info.id *) - -type target = Cond | Then | Else - -let link_target cbs tgt block = - match tgt with - | Cond -> () - | Then -> cbs.s_then <- block :: cbs.s_then - | Else -> cbs.s_else <- block :: cbs.s_else - -let rec link_branches cbs cond atom tt tf st sf = - match cond with - | And(a,b) -> - link_branches cbs a atom Cond tf st sf ; - link_branches cbs b atom tt tf st sf - | Or(a,b) -> - link_branches cbs a atom tt Cond st sf ; - link_branches cbs b atom tt tf st sf - | Not a -> - link_branches cbs a atom tf tt st sf - | Atom leaf -> - if leaf.eid = atom.eid then - ( link_target cbs tt st ; link_target cbs tf sf ) - | Blob -> () - -let rec leftmost = function - | And(cond,_) | Or(cond,_) | Not cond -> leftmost cond - | Atom e -> e.eid - | Blob -> 0 - -let link_stmt stmt = - match stmt.skind with - | If(e,b_then,b_else,_) -> - begin - match lookup e with - | Some info -> - let cbs = - try Hashtbl.find branches info.id - with Not_found -> - let eid = leftmost info.cond in - let cbs = { - s_info=info ; - s_leftmost=eid ; - s_then=[] ; - s_else=[] ; - } in - Hashtbl.add branches info.id cbs ; cbs - in - link_branches cbs info.cond e Then Else b_then b_else - | None -> () - end - | _ -> () - -let rec adherence adh = function - | [] -> adh - | { bstmts = stmt::_ }::bs -> adherence (Stmt.Set.add stmt adh) bs - | { bstmts = [] }::bs -> adherence adh bs - -let filter_block adh = function - | { bstmts = {skind=Goto _;succs=succs}::_ } -> - List.for_all (fun s -> not (Stmt.Set.mem s adh)) succs - | _ -> true - -type branch_info = { - mutable b_then : info list ; - mutable b_else : info list ; -} - -let branches_info : branch_info Stmt.Hashtbl.t = Stmt.Hashtbl.create 371 - -let get_branch_info s = - try Stmt.Hashtbl.find branches_info s - with Not_found -> - let binfo = { b_then=[] ; b_else=[] } in - Stmt.Hashtbl.add branches_info s binfo ; binfo - -let add_branch_then info block = - match block.bstmts with [] -> () | s::_ -> - let binfo = get_branch_info s in - binfo.b_then <- info :: binfo.b_then - -let add_branch_else info block = - match block.bstmts with [] -> () | s::_ -> - let binfo = get_branch_info s in - binfo.b_else <- info :: binfo.b_else - -let non_empty cbs = cbs.s_then <> [] && cbs.s_else <> [] - -let filter_internal cbs = - let adh = adherence (adherence Stmt.Set.empty cbs.s_then) cbs.s_else in - begin - cbs.s_then <- List.filter (filter_block adh) cbs.s_then ; - cbs.s_else <- List.filter (filter_block adh) cbs.s_else ; - if non_empty cbs then - begin - List.iter (add_branch_then cbs.s_info) cbs.s_then ; - List.iter (add_branch_else cbs.s_info) cbs.s_else ; - end - end - -class link_branches = -object - - inherit Visitor.frama_c_inplace - - method! vinit _ _ _ = Cil.SkipChildren - method! vtype _ = Cil.SkipChildren - method! vattr _ = Cil.SkipChildren - method! vinst _ = Cil.SkipChildren - method! vexpr _ = Cil.SkipChildren - method! vlval _ = Cil.SkipChildren - method! vlogic_type _ = Cil.SkipChildren - method! vterm _ = Cil.SkipChildren - method! vpredicate _ = Cil.SkipChildren - method! vpredicate_named _ = Cil.SkipChildren - method! vbehavior _ = Cil.SkipChildren - method! vspec _ = Cil.SkipChildren - method! vcode_annot _ = Cil.SkipChildren - method! vannotation _ = Cil.SkipChildren - method! vstmt_aux stmt = link_stmt stmt ; Cil.DoChildren - -end - -let computed = ref false -let compute () = - if !active && not !computed then - begin - Kernel.feedback "Computing Branches" ; - Visitor.visitFramacFile (new link_branches) (Ast.get()) ; - Hashtbl.iter (fun _ -> filter_internal) branches ; - computed := true ; - end - -let branches stmt = - compute () ; - match stmt.skind with - | If(e,_,_,_) -> - begin - match lookup e with - | None -> None - | Some info -> - try - let cbs = Hashtbl.find branches info.id in - if non_empty cbs && cbs.s_leftmost = e.eid - then Some ( cbs.s_then , cbs.s_else ) - else None - with Not_found -> None - end - | _ -> None - -let pp_comment fmt stmt = - if !active then - try - let binfo = Stmt.Hashtbl.find branches_info stmt in - Format.fprintf fmt "@[/*" ; - List.iter - (fun info -> Format.fprintf fmt "[THEN:%d]@," info.id) - binfo.b_then ; - List.iter - (fun info -> Format.fprintf fmt "[ELSE:%d]@," info.id) - binfo.b_else ; - Format.fprintf fmt "*/@]@ " ; - with Not_found -> () - -let () = Printer.cabsbranches_pp_comment := pp_comment diff -Nru frama-c-20140301+neon+dfsg/cil/src/frontc/cabsbranches.mli frama-c-20150201+sodium+dfsg/cil/src/frontc/cabsbranches.mli --- frama-c-20140301+neon+dfsg/cil/src/frontc/cabsbranches.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/frontc/cabsbranches.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -(* -------------------------------------------------------------------------- *) -(* --- Original Source Branches --- *) -(* -------------------------------------------------------------------------- *) - -open Cil_types - -val compute : unit -> unit (** Force the link for branches *) - -val branches : stmt -> ( block list * block list ) option - (** If the [stmt] is an original "if-then-else" statement, - returns the list of blocks associated to "then" and "else" - branches *) - -val pp_comment : Format.formatter -> stmt -> unit - (** Print the internal maps for debug *) diff -Nru frama-c-20140301+neon+dfsg/cil/src/frontc/cabscond.ml frama-c-20150201+sodium+dfsg/cil/src/frontc/cabscond.ml --- frama-c-20140301+neon+dfsg/cil/src/frontc/cabscond.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/frontc/cabscond.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,221 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -(* -------------------------------------------------------------------------- *) -(* --- Original Conditions --- *) -(* -------------------------------------------------------------------------- *) - -open Cabs - -type cond = - | And of cond * cond - | Or of cond * cond - | Not of cond - | Atom of Cil_types.exp - | Blob - -type kind = - | IF - | FOR - | WHILE - | DOWHILE - -type info = { - id : int ; - kind : kind ; - file : string ; - line : int ; - cond : cond ; -} - -type lazy_cond = - | LzAnd of lazy_cond * lazy_cond - | LzOr of lazy_cond * lazy_cond - | LzNot of lazy_cond - | LzAtom of Cabs.expression - -let rec lazy_cond e = match e.expr_node with - | Cabs.BINARY(Cabs.AND,e1,e2) -> LzAnd(lazy_cond e1,lazy_cond e2) - | Cabs.BINARY(Cabs.OR,e1,e2) -> LzOr(lazy_cond e1,lazy_cond e2) - | Cabs.UNARY(Cabs.NOT,e) -> LzNot(lazy_cond e) - | _ -> LzAtom e - -type binding = - | Lazy of int * lazy_cond - | Info of info - -type context = { - c_kind : kind ; - c_loc : Cabs.cabsloc ; - mutable c_binder : binding ; - mutable c_if : string option ; - mutable c_then : string option ; - mutable c_else : string option ; -} - -let c_info = ref 0 -let active = ref false -let c_stack : context list ref = ref [] - -let inconsistent from = - match !c_stack with - | context::_ -> - Kernel.warning - "[%s] Inconsistent state when binding condition at %a" - from Cabshelper.d_cabsloc context.c_loc ; - active := false - | _ -> - Kernel.warning - "[%s] Inconsistent condition stack (no condition expression stacked)" - from ; - active := false - -module Emap = Hashtbl.Make - (struct - type t = Cabs.expression - let equal = (==) - let hash = Hashtbl.hash - end) - -let atoms : Cil_types.exp Emap.t = Emap.create 371 -let conditions : (int,context) Hashtbl.t = Hashtbl.create 371 - -let rec cond = function - | LzAnd(x,y) -> And(cond x,cond y) - | LzOr(x,y) -> Or(cond x,cond y) - | LzNot x -> Not(cond x) - | LzAtom a -> try Atom(Emap.find atoms a) with Not_found -> Blob - -let push_condition kind loc a = - if !active then - let k = !c_info in - incr c_info ; - let context = { - c_loc = loc ; c_kind = kind ; - c_binder = Lazy(k,lazy_cond a) ; - c_if = None ; c_then = None ; c_else = None ; - } in - c_stack := context :: !c_stack ; - true - else - false - -let pop_condition () = - if !active then - match !c_stack with - | ({ c_binder=Lazy(id,lzc) } as context) :: stk -> - begin - c_stack := stk ; - context.c_binder <- Info { - id = id ; - kind = context.c_kind ; - file = (fst context.c_loc).Lexing.pos_fname ; - line = (fst context.c_loc).Lexing.pos_lnum ; - cond = cond lzc ; - } ; - end - | _ -> inconsistent "pop-condition" - -let top_context () = - match !c_stack with - | context :: _ when !active -> context - | _ -> raise Not_found - -let bind (a : Cabs.expression) (e : Cil_types.exp) = - try - let context = top_context () in - begin - Emap.replace atoms a e ; - Hashtbl.replace conditions e.Cil_types.eid context ; - end - with Not_found -> () - -(* -------------------------------------------------------------------------- *) -(* --- Retrieving Conditions --- *) -(* -------------------------------------------------------------------------- *) - -let lookup e = - try - match Hashtbl.find conditions e.Cil_types.eid with - | {c_binder=Info info} -> Some info - | _ -> None - with Not_found -> None - -(* -------------------------------------------------------------------------- *) -(* --- Pretty-Print --- *) -(* -------------------------------------------------------------------------- *) - -let pp_kind fmt kd = - Format.pp_print_string fmt - (match kd with - | IF -> "IF" - | FOR -> "FOR" - | WHILE -> "WHILE" - | DOWHILE -> "DO WHILE") - -let pp_where fmt (name,e,cond) = - let rec pp fmt = function - | And(x,y) -> Format.fprintf fmt "(%a && %a)" pp x pp y - | Or(x,y) -> Format.fprintf fmt "(%a || %a)" pp x pp y - | Not x -> Format.fprintf fmt "!(%a)" pp x - | Atom a -> - if a.Cil_types.eid = e.Cil_types.eid - then Format.pp_print_string fmt name - else Format.pp_print_char fmt '_' - | Blob -> Format.pp_print_char fmt '_' - in pp fmt cond - -open Cil_types - -let pp_comment fmt s = - if !active then - match s.skind with - | If(e,_,_,_) -> - begin - match lookup e with - | Some info -> - Format.fprintf fmt "/*[CID:%d] %a @[%a@] */@ " - info.id pp_kind info.kind pp_where ("here",e,info.cond) - | None -> () - end - | _ -> () diff -Nru frama-c-20140301+neon+dfsg/cil/src/frontc/cabscond.mli frama-c-20150201+sodium+dfsg/cil/src/frontc/cabscond.mli --- frama-c-20140301+neon+dfsg/cil/src/frontc/cabscond.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/frontc/cabscond.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -(* -------------------------------------------------------------------------- *) -(* --- Original Conditions --- *) -(* -------------------------------------------------------------------------- *) - -type cond = - | And of cond * cond - | Or of cond * cond - | Not of cond - | Atom of Cil_types.exp - | Blob - -type kind = - | IF - | FOR - | WHILE - | DOWHILE - -type info = { - id : int ; - kind : kind ; - file : string ; - line : int ; - cond : cond ; -} - -val active : bool ref - -(** Interface to be used during Cabs2cil *) - -val push_condition : kind -> Cabs.cabsloc -> Cabs.expression -> bool -(** Call it when entering [Cabs2cil.doCondition] - Return false if inactive. *) - -val pop_condition : unit -> unit -(** Call it when exiting [Cabs2cil.doCondition] *) - -val bind : Cabs.expression -> Cil_types.exp -> unit -(** Call it when constructing an [ifChunk] *) - -(** Interface to be used after CIL *) - -val lookup : Cil_types.exp -> info option - -val pp_kind : Format.formatter -> kind -> unit -val pp_where : Format.formatter -> (string * Cil_types.exp * cond) -> unit -val pp_comment : Format.formatter -> Cil_types.stmt -> unit diff -Nru frama-c-20140301+neon+dfsg/cil/src/frontc/cabs_debug.ml frama-c-20150201+sodium+dfsg/cil/src/frontc/cabs_debug.ml --- frama-c-20140301+neon+dfsg/cil/src/frontc/cabs_debug.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/frontc/cabs_debug.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -248,6 +248,19 @@ | TRY_FINALLY (bl1, bl2, loc) -> fprintf fmt "@[TRY_EXCEPT block(%a) block(%a) loc(%a)@]" pp_block bl1 pp_block bl2 pp_cabsloc loc + | THROW(e,loc) -> + fprintf fmt "@[THROW %a, loc(%a)@]" + (Pretty_utils.pp_opt pp_exp) e pp_cabsloc loc + | TRY_CATCH(s,l,loc) -> + let print_one_catch fmt (v,s) = + fprintf fmt "@[@[CATCH %a {@]@;%a@]@;}" + (Pretty_utils.pp_opt pp_single_name) v + pp_stmt s + in + fprintf fmt "@[@[TRY %a (loc %a) {@]@;%a@]@;}" + pp_stmt s + pp_cabsloc loc + (Pretty_utils.pp_list ~sep:"@;" print_one_catch) l | CODE_ANNOT (_,_) -> fprintf fmt "CODE_ANNOT" | CODE_SPEC _ -> fprintf fmt "CODE_SPEC" diff -Nru frama-c-20140301+neon+dfsg/cil/src/frontc/cabs_debug.mli frama-c-20150201+sodium+dfsg/cil/src/frontc/cabs_debug.mli --- frama-c-20140301+neon+dfsg/cil/src/frontc/cabs_debug.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/frontc/cabs_debug.mli 2015-05-28 08:53:23.000000000 +0000 @@ -1,45 +1,24 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) open Cabs diff -Nru frama-c-20140301+neon+dfsg/cil/src/frontc/cabshelper.ml frama-c-20150201+sodium+dfsg/cil/src/frontc/cabshelper.ml --- frama-c-20140301+neon+dfsg/cil/src/frontc/cabshelper.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/frontc/cabshelper.ml 2015-05-29 15:31:43.000000000 +0000 @@ -85,6 +85,7 @@ let default () = MyTable.empty end) let self = MyState.self + let () = Cil.dependency_on_ast self (* What matters is the beginning of the comment. *) let add (first,last) comment = @@ -189,6 +190,8 @@ | TRY_EXCEPT(_, _, _, loc) -> loc | TRY_FINALLY(_, _, loc) -> loc | (CODE_SPEC (_,l) |CODE_ANNOT (_,l)) -> l + | THROW(_,l) -> l + | TRY_CATCH(_,_,l) -> l end diff -Nru frama-c-20140301+neon+dfsg/cil/src/frontc/cabs.ml frama-c-20150201+sodium+dfsg/cil/src/frontc/cabs.ml --- frama-c-20140301+neon+dfsg/cil/src/frontc/cabs.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/frontc/cabs.ml 2015-05-28 08:53:23.000000000 +0000 @@ -230,6 +230,32 @@ asm_details option * (* extra details to guide GCC's optimizer *) cabsloc +(* Exception mechanism *) + | THROW of expression option * cabsloc + (** throws the corresponding expression. [None] corresponds to + re-throwing the exception currently being catched (thus is only + meaningful in a catch clause). This node is not generated by the + C parser, but can be used by external front-ends. + *) + | TRY_CATCH of statement * (single_name option * statement) list * cabsloc + (** [TRY_CATCH(s,clauses,loc)] catches exceptions thrown by execution of + [s], according to [clauses]. An + exception [e] is catched by the first clause + [(spec,(name, decl, _, _)),body] + such that the type of [e] is compatible with [(spec,decl)]. [name] + is then associated to a copy of [e], and [body] is executed. If the + [single_name] is [None], all exceptions are catched by the corresponding + clause. + + The corresponding [TryCatch] node in {!Cil_types.stmtkind} has a refined + notion of catching that allows a clause to match for more than + one type using appropriate conversions + (see also {!Cil_types.catch_binder}). + + This node is not generated by the C parser, but can be used by external + front-ends. + *) + (** MS SEH *) | TRY_EXCEPT of block * expression * block * cabsloc | TRY_FINALLY of block * block * cabsloc diff -Nru frama-c-20140301+neon+dfsg/cil/src/frontc/cabsvisit.ml frama-c-20150201+sodium+dfsg/cil/src/frontc/cabsvisit.ml --- frama-c-20140301+neon+dfsg/cil/src/frontc/cabsvisit.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/frontc/cabsvisit.ml 2015-05-28 08:53:23.000000000 +0000 @@ -388,6 +388,20 @@ let b2' = visitCabsBlock vis b2 in if b1' != b1 || e' != e || b2' != b2 then {s with stmt_node = TRY_EXCEPT(b1', e', b2', l)} else s + | THROW (e,l) -> + let e' = optMapNoCopy (visitCabsExpression vis) e in + if e != e' then { s with stmt_node = THROW(e',l) } else s + | TRY_CATCH(t,l,loc) -> + let visit_one_catch (v,s as c) = + let v' = optMapNoCopy (childrenSingleName vis NVar) v in + let s' = vs loc s in + if v' != v || s' != s then (v,s) else c + in + let t' = vs loc t in + let l' = mapNoCopy visit_one_catch l in + if t' != t || l' != l then + { s with stmt_node = TRY_CATCH(t',l',loc) } + else s | CODE_ANNOT _ | CODE_SPEC _ -> s and visitCabsExpression vis (e: expression) : expression = diff -Nru frama-c-20140301+neon+dfsg/cil/src/frontc/clexer.mll frama-c-20150201+sodium+dfsg/cil/src/frontc/clexer.mll --- frama-c-20140301+neon+dfsg/cil/src/frontc/clexer.mll 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/frontc/clexer.mll 2015-05-29 15:31:43.000000000 +0000 @@ -339,15 +339,13 @@ (match buffer with None -> () | Some b -> Buffer.add_char b ch) ; remainder buffer lexbuf -let do_lex_comment ?first_char remainder lexbuf = +let do_lex_comment ?(first_string="") remainder lexbuf = let buffer = - if Kernel.PrintComments.get () then - Some(let b = Buffer.create 80 in - (match first_char with Some c -> - Buffer.add_char b c - | None -> ()); - b) - else None + if Kernel.PrintComments.get () then begin + let b = Buffer.create 80 in + Buffer.add_string b first_string; + Some b + end else None in remainder buffer lexbuf ; match buffer with | Some b -> addComment (Buffer.contents b) @@ -473,10 +471,17 @@ | "global_register" | "location" -rule initial = - parse "/*" +rule initial = parse +| "/*" | "/*@{" | "/*@}" (* Skip special doxygen comments. Use of '@' instead + of '!annot_char' is intentional *) { - do_lex_comment comment lexbuf ; + let s = Lexing.lexeme lexbuf in + let first_string = + if String.length s > 2 then + String.sub s 2 (String.length s - 2) + else "" + in + do_lex_comment ~first_string comment lexbuf ; initial lexbuf } @@ -493,13 +498,20 @@ "Skipping annotation" end else begin - do_lex_comment ~first_char:c comment lexbuf ; + do_lex_comment ~first_string:(String.make 1 c) comment lexbuf ; initial lexbuf end } -| "//" - { do_lex_comment onelinecomment lexbuf ; +| "//" | "//@{" | "//@}" (* See comment for "/*@{" above *) + { + let s = Lexing.lexeme lexbuf in + let first_string = + if String.length s > 2 then + String.sub s 2 (String.length s - 2) + else "" + in + do_lex_comment ~first_string onelinecomment lexbuf ; E.newline(); if is_oneline_ghost () then begin exit_oneline_ghost (); @@ -521,7 +533,7 @@ "Skipping annotation" end else begin - do_lex_comment ~first_char:c onelinecomment lexbuf ; + do_lex_comment ~first_string:(String.make 1 c) onelinecomment lexbuf; E.newline(); if is_oneline_ghost () then begin diff -Nru frama-c-20140301+neon+dfsg/cil/src/frontc/cparser.mly frama-c-20150201+sodium+dfsg/cil/src/frontc/cparser.mly --- frama-c-20140301+neon+dfsg/cil/src/frontc/cparser.mly 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/frontc/cparser.mly 2015-05-29 15:31:43.000000000 +0000 @@ -213,6 +213,28 @@ into : (size_t) (&(type * ) 0)->member *) +let sizeofType () = + let findSpecifier name = + let convert_one_specifier s = + if s = "int" then Cabs.Tint + else if s = "unsigned" then Cabs.Tunsigned + else if s = "long" then Cabs.Tlong + else if s = "short" then Cabs.Tshort + else if s = "char" then Cabs.Tchar + else + Kernel.fatal + ~current:true + "initCIL: cannot find the right specifier for type %s" name + in + let add_one_specifier s acc = + (Cabs.SpecType (convert_one_specifier s)) :: acc + in + let specs = Str.split (Str.regexp " +") name in + List.fold_right add_one_specifier specs [] + in + findSpecifier Cil.theMachine.Cil.theMachine.Cil_types.size_t + + let transformOffsetOf (speclist, dtype) member = let mk_expr e = { expr_loc = member.expr_loc; expr_node = e } in let rec addPointer = function @@ -245,8 +267,7 @@ in let memberExpr = replaceBase member in let addrExpr = { memberExpr with expr_node = UNARY (ADDROF, memberExpr)} in - (* slight cheat: hard-coded assumption that size_t == unsigned int *) - let sizeofType = [SpecType Tunsigned], JUSTBASE in + let sizeofType = sizeofType(), JUSTBASE in { addrExpr with expr_node = CAST (sizeofType, SINGLE_INIT addrExpr)} let no_ghost_stmt s = {stmt_ghost = false ; stmt_node = s} diff -Nru frama-c-20140301+neon+dfsg/cil/src/frontc/cprint.ml frama-c-20150201+sodium+dfsg/cil/src/frontc/cprint.ml --- frama-c-20140301+neon+dfsg/cil/src/frontc/cprint.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/frontc/cprint.ml 2015-05-29 15:31:43.000000000 +0000 @@ -496,6 +496,18 @@ (pp_list ~sep:"@ " pp_print_string) tlist (pp_opt ~pre:":@ " print_details) details end + | THROW(e,_) -> + fprintf fmt "@[throw%a@]" + (Pretty_utils.pp_opt ~pre:" (@;" ~suf:")" print_expression) e + | TRY_CATCH(s,l,_) -> + let print_one_catch fmt (e,s) = + fprintf fmt "@[@[catch %a {@]@;%a@]@;}@;" + (Pretty_utils.pp_opt print_single_name) e + print_statement s + in + fprintf fmt "@[@[try %a {@]@;%a@]@;}@;" + print_statement s + (Pretty_utils.pp_list ~sep:"@;" print_one_catch) l | TRY_FINALLY (b, h, _) -> fprintf fmt "__try@ @[%a@]@ __finally@ @[%a@]" print_block b print_block h diff -Nru frama-c-20140301+neon+dfsg/cil/src/frontc/frontc.ml frama-c-20150201+sodium+dfsg/cil/src/frontc/frontc.ml --- frama-c-20140301+neon+dfsg/cil/src/frontc/frontc.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/frontc/frontc.ml 2015-05-29 15:31:43.000000000 +0000 @@ -54,7 +54,7 @@ close_me := false end - (* Signal that we are in MS VC mode *) +(* Signal that we are in MS VC mode *) (* BY: never called *) let setMSVCMode () = Cprint.msvcMode := true diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/check_logic_parser.ml frama-c-20150201+sodium+dfsg/cil/src/logic/check_logic_parser.ml --- frama-c-20140301+neon+dfsg/cil/src/logic/check_logic_parser.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/check_logic_parser.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_builtin.ml frama-c-20150201+sodium+dfsg/cil/src/logic/logic_builtin.ml --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_builtin.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_builtin.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -242,6 +242,8 @@ "\\round_float", ["m", rounding_mode; "x", Lreal], float_type; "\\round_double", ["m", rounding_mode ; "x", Lreal], double_type; (*"\\round_quad", ["m", rounding_mode; "x", Lreal], long_double_type;*) + "\\min", ["s", Ltype (set, [Linteger])], Linteger; + "\\max", ["s", Ltype (set, [Linteger])], Linteger; ] end diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_builtin.mli frama-c-20150201+sodium+dfsg/cil/src/logic/logic_builtin.mli --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_builtin.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_builtin.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_const.ml frama-c-20150201+sodium+dfsg/cil/src/logic/logic_const.ml --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_const.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_const.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -114,6 +114,8 @@ (** {2 pre-defined logic labels} *) (* empty line for ocamldoc *) +let init_label = LogicLabel (None, "Init") + let pre_label = LogicLabel (None, "Pre") let post_label = LogicLabel (None, "Post") @@ -167,6 +169,8 @@ | Ltype ({ lt_name = s }, []) when s = Utf8_logic.boolean -> true | _ -> false +let boolean_type = Ltype ({ lt_name = Utf8_logic.boolean ; lt_params = [] ; lt_def = None } , []) + (** {2 Offsets} *) let rec lastTermOffset (off: term_offset) : term_offset = @@ -236,6 +240,9 @@ let told ?(loc=Cil_datatype.Location.unknown) t = tat ~loc (t,old_label) +let tlogic_coerce ?(loc=Cil_datatype.Location.unknown) t lt = + term ~loc (TLogic_coerce (lt, t)) lt + let tvar ?(loc=Cil_datatype.Location.unknown) lv = term ~loc (TLval(TVar lv,TNoOffset)) lv.lv_type @@ -368,6 +375,8 @@ let pat ?(loc=Cil_datatype.Location.unknown) (p,q) = unamed ~loc (Pat (p,q)) let pinitialized ?(loc=Cil_datatype.Location.unknown) (l,p) = unamed ~loc (Pinitialized (l,p)) +let pdangling ?(loc=Cil_datatype.Location.unknown) (l,p) = + unamed ~loc (Pdangling (l,p)) let psubtype ?(loc=Cil_datatype.Location.unknown) (p,q) = unamed ~loc (Psubtype (p,q)) diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_const.mli frama-c-20150201+sodium+dfsg/cil/src/logic/logic_const.mli --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_const.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_const.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -43,6 +43,11 @@ (** set a fresh id to an existing code annotation*) val refresh_code_annotation: code_annotation -> code_annotation +(** set fresh id to properties of an existing funspec + @since Sodium-20150201 +*) +val refresh_spec: funspec -> funspec + (** creates a new identified predicate with a fresh id. *) val new_predicate: predicate named -> identified_predicate @@ -78,6 +83,9 @@ val loop_current_label: logic_label val loop_entry_label: logic_label +(** @since Sodium-20150201 *) +val init_label: logic_label + (* ************************************************************************** *) (** {2 Predicates} *) (* ************************************************************************** *) @@ -160,6 +168,9 @@ (** \initialized *) val pinitialized: ?loc:location -> logic_label * term -> predicate named +(** \dangling *) +val pdangling: ?loc:location -> logic_label * term -> predicate named + (** \at *) val pat: ?loc:location -> predicate named * logic_label -> predicate named @@ -180,7 +191,7 @@ (* ************************************************************************** *) (** returns [true] if the type is a set. - @since Neon-20130301 *) + @since Neon-20140301 *) val is_set_type: logic_type -> bool (** [set_conversion ty1 ty2] returns a set type as soon as [ty1] and/or [ty2] @@ -212,6 +223,9 @@ val is_boolean_type: logic_type -> bool (** @return true if the argument is the boolean type *) +val boolean_type: logic_type +(** @since Sodium-20150201 *) + (* ************************************************************************** *) (** {1 Logic Terms} *) (* ************************************************************************** *) @@ -256,6 +270,9 @@ (** \result *) val tresult: ?loc:Location.t -> typ -> term +(** coercion to the given logic type *) +val tlogic_coerce: ?loc:Location.t -> term -> logic_type -> term + (** [true] if the term is \result (potentially enclosed in \at)*) val is_result: term -> bool diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_env.ml frama-c-20150201+sodium+dfsg/cil/src/logic/logic_env.ml --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_env.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_env.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_env.mli frama-c-20150201+sodium+dfsg/cil/src/logic/logic_env.mli --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_env.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_env.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_lexer.mll frama-c-20150201+sodium+dfsg/cil/src/logic/logic_lexer.mll --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_lexer.mll 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_lexer.mll 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -176,6 +176,7 @@ "\\fresh", FRESH; "\\from", FROM; "\\initialized", INITIALIZED; + "\\dangling", DANGLING; "\\inter", INTER; "\\lambda", LAMBDA; "\\let", LET; diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_parser.mly frama-c-20150201+sodium+dfsg/cil/src/logic/logic_parser.mly --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_parser.mly 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_parser.mly 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* INRIA (Institut National de Recherche en Informatique et en */ @@ -37,6 +37,21 @@ let loc_start x = fst x.lexpr_loc let loc_end x = snd x.lexpr_loc + (* Normalize p1 && (p2 && p3) into (p1 && p2) && p3 *) + let rec pland p1 p2 = + match p2.lexpr_node with + | PLand (p3,p4) -> + let loc = (loc_start p1, loc_end p3) in + PLand(loc_info loc (pland p1 p3),p4) + | _ -> PLand(p1,p2) + + let rec plor p1 p2 = + match p2.lexpr_node with + | PLor(p3,p4) -> + let loc = (loc_start p1, loc_end p3) in + PLor(loc_info loc (plor p1 p3),p4) + | _ -> PLor(p1,p2) + let clause_order i name1 name2 = raise (Not_well_formed @@ -241,7 +256,7 @@ %token SIZEOF LAMBDA LET %token TYPEOF BSTYPE %token WITH CONST -%token INITIALIZED +%token INITIALIZED DANGLING %token CUSTOM %nonassoc lowest @@ -328,8 +343,8 @@ /* predicates */ | lexpr IMPLIES lexpr { info (PLimplies ($1, $3)) } | lexpr IFF lexpr { info (PLiff ($1, $3)) } -| lexpr OR lexpr { info (PLor ($1, $3)) } -| lexpr AND lexpr { info (PLand ($1, $3)) } +| lexpr OR lexpr { info (plor $1 $3) } +| lexpr AND lexpr { info (pland $1 $3) } | lexpr HATHAT lexpr { info (PLxor ($1, $3)) } /* terms */ | lexpr AMP lexpr { info (PLbinop ($1, Bbw_and, $3)) } @@ -361,7 +376,7 @@ let relation = loc_info loc (PLrel($1,rel,rhs)) in match oth_rel with None -> relation - | Some oth_relation -> info (PLand(relation,oth_relation)) + | Some oth_relation -> info (pland relation oth_relation) } ; @@ -396,7 +411,7 @@ None -> my_rel | Some rel -> let loc = loc_start $2, loc_end rel in - loc_info loc (PLand(my_rel,rel)) + loc_info loc (pland my_rel rel) in $1,$2,sense,Some oth_rel else begin @@ -449,6 +464,7 @@ ($2,info (PLbinop ($4, Badd, (info (PLrange((Some $6),Some $8))))))) } | INITIALIZED opt_label_1 LPAR lexpr RPAR { info (PLinitialized ($2,$4)) } +| DANGLING opt_label_1 LPAR lexpr RPAR { info (PLdangling ($2,$4)) } | FRESH opt_label_2 LPAR lexpr COMMA lexpr RPAR { info (PLfresh ($2,$4, $6)) } | BASE_ADDR opt_label_1 LPAR lexpr RPAR { info (PLbase_addr ($2,$4)) } | BLOCK_LENGTH opt_label_1 LPAR lexpr RPAR { info (PLblock_length ($2,$4)) } @@ -710,8 +726,7 @@ | type_spec cv { $1 } cast_logic_type: - | type_spec_cv abs_spec_option { $2 $1 } - | type_spec_cv abs_spec cv { $2 $1 } + | type_spec_cv abs_spec_cv_option { $2 $1 } ; logic_rt_type: @@ -724,6 +739,11 @@ | abs_spec { $1 } ; +abs_spec_cv_option: +| /* empty */ %prec TYPENAME { fun t -> t } +| abs_spec_cv { $1 } +; + abs_spec: | tabs { $1 } | stars %prec TYPENAME { $1 } @@ -734,14 +754,36 @@ | abs_spec_bis %prec TYPENAME { $1 } ; +abs_spec_cv: +| tabs { $1 } +| stars_cv %prec TYPENAME { $1 } +| stars_cv tabs { fun t -> $2 ($1 t) } +| stars_cv abs_spec_bis_cv %prec TYPENAME { fun t -> $2 ($1 t) } +| stars_cv abs_spec_bis_cv tabs { fun t -> $2 ($3 ($1 t)) } +| abs_spec_bis_cv tabs { fun t -> $1 ($2 t) } +| abs_spec_bis_cv %prec TYPENAME { $1 } +; + abs_spec_bis: | LPAR abs_spec RPAR { $2 } | abs_spec_bis LPAR abs_param_type_list RPAR { fun t -> $1 (LTarrow($3,t)) }; ; +abs_spec_bis_cv: +| LPAR abs_spec_cv RPAR { $2 } +| abs_spec_bis_cv LPAR abs_param_type_list RPAR { fun t -> $1 (LTarrow($3,t)) }; +; + stars: -| STAR { fun t -> LTpointer t } -| stars STAR { fun t -> $1 (LTpointer t) } +| STAR { fun t -> LTpointer t } +| stars STAR { fun t -> $1 (LTpointer t) } +; + +stars_cv: +| STAR { fun t -> LTpointer t } +| STAR cv { fun t -> LTpointer t } +| stars_cv STAR { fun t -> $1 (LTpointer t) } +| stars_cv STAR cv { fun t -> $1 (LTpointer t) } ; tabs: @@ -1829,6 +1871,7 @@ | VALID_RANGE { () } | VALID_READ { () } | INITIALIZED { () } +| DANGLING { () } | WITH { () } ; diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_preprocess.mli frama-c-20150201+sodium+dfsg/cil/src/logic/logic_preprocess.mli --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_preprocess.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_preprocess.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_preprocess.mll frama-c-20150201+sodium+dfsg/cil/src/logic/logic_preprocess.mll --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_preprocess.mll 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_preprocess.mll 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -24,142 +24,150 @@ { open Lexing - type state = NORMAL | SLASH | INCOMMENT type end_of_buffer = NEWLINE | SPACE | CHAR - let buf = Buffer.create 1024 - let macros = Buffer.create 1024 + let preprocess_buffer = Buffer.create 1024 + let output_buffer = Buffer.create 1024 let beg_of_line = Buffer.create 8 let blacklisted_macros = [ "__STDC__"; "__STDC_HOSTED__"; "assert"] let is_newline = ref CHAR let curr_file = ref "" let curr_line = ref 1 - let is_ghost = ref false - let begin_annot_line = ref 1 + let has_annot = ref false let reset () = - Buffer.clear buf; - Buffer.clear macros; + Buffer.clear preprocess_buffer; + Buffer.clear output_buffer; Buffer.clear beg_of_line; is_newline := CHAR; curr_file := ""; curr_line := 1; - is_ghost := false; - begin_annot_line := 1 + has_annot := false - let backslash = "__BACKSLASH__" + let backslash = "__ANNOT_BACKSLASH__" + let annot_content = "__ANNOT_CONTENT__" - let abort_preprocess reason outfile = + let re_backslash = Str.regexp_string backslash + let re_annot_content = Str.regexp_string annot_content + + (* Delimiters for the various annotations in the preprocessing buffer. + We have one delimiter for the beginning of an annotation (to discard + #defines along the way), and three delimiters for the various ways + an annotation can end: + - on a normal line + - with a newline + - with a newline inside a comment (only for one-line annotations) + When preprocessed annotations are inserted back in the main file, this will + result in distinct translation to preserve line numbers while avoiding + ill-formed annotations. + *) + let annot_beg = "////////////////__ANNOT_BEG__" + let annot_end = "////////////////__ANNOT_END__" + let annot_end_nl = "////////////////__ANNOT_END_NL__" + let annot_end_comment = "////////////////__ANNOT_END_COMMENT__" + + let abort_preprocess reason = let source = {Lexing.dummy_pos with Lexing.pos_fname = !curr_file; pos_lnum = !curr_line;} in Kernel.error ~source - "Can't preprocess annotation: %s\nAnnotation will be kept as is" - reason; - Buffer.output_buffer outfile buf - - let preprocess_annot suffix cpp outfile = - (*Printf.printf "Preprocessing annotation:\n%!"; - Buffer.output_buffer stdout buf; - print_newline(); *) - let debug = - Kernel.debug_atleast 3 || - Kernel.Debug_category.exists (fun x -> x = "parser") + "Can't preprocess annotation: %s\nSome annotations will be kept as is" + reason + + let next_preprocessed file = + let content = Buffer.create 80 in + let rec ignore_content () = + let s = input_line file in + if s <> annot_beg then ignore_content () in - let ppname = - try Extlib.temp_file_cleanup_at_exit ~debug "ppannot" suffix - with Extlib.Temp_file_error s -> - Kernel.abort - "Could not open temporary file for logic pre-processing: %s" s + let rec get_annot first = + let s = input_line file in + if s = annot_end then false, Buffer.contents content + else if s = annot_end_nl then true, Buffer.contents content + else if s = annot_end_comment then begin + Buffer.add_char content '\n'; + false, Buffer.contents content + end else begin + if not first then Buffer.add_char content '\n'; + Buffer.add_string content s; + get_annot false + end in - let ppfile = open_out ppname in - Buffer.output_buffer ppfile macros; - (* NB: the three extra spaces replace the beginning of the annotation - in order to keep the columns count accurate (at least until there's - a macro expansion). - *) - Printf.fprintf ppfile "# %d %s \n " !begin_annot_line !curr_file; - Buffer.output_buffer ppfile beg_of_line; - Buffer.output_buffer ppfile buf; - (* cpp complains if the temp file does not end with a newline *) - Buffer.clear beg_of_line; - if not (!is_newline = NEWLINE) then output_char ppfile '\n'; - close_out ppfile; - let cppname = Extlib.temp_file_cleanup_at_exit ~debug "cppannot" suffix in - let res = Sys.command (cpp ppname cppname) in - if not debug then Extlib.safe_remove ppname; - output_string outfile "/*@"; - if !is_ghost then output_string outfile " ghost\n"; - if res <> 0 then begin - abort_preprocess "Preprocessor call exited with an error" outfile; - if not debug then Extlib.safe_remove cppname - end else begin + let replace_backslash s = Str.global_replace re_backslash "\\\\" s in try - let tmp = open_in_bin cppname in - let tmp_buf = Buffer.create 1024 in - Buffer.clear tmp_buf; - let x = ref (input_char tmp) in - let state = ref NORMAL in - (try - while true do - (* we have to remove the spurious \n at the end of buffer*) - let c = input_char tmp in - (match !x with - '/' -> - (match !state with - NORMAL -> state:=SLASH - | SLASH ->state:=INCOMMENT - | INCOMMENT -> () - ) - | '\n' -> state:=NORMAL - | _ -> (match !state with - SLASH->state:=NORMAL - | NORMAL | INCOMMENT -> ()) - ); - Buffer.add_char tmp_buf !x; - x:=c; - done; - assert false - with - End_of_file -> - if !is_newline <> CHAR - then Buffer.add_char tmp_buf !x; - (* one-line annotations get a new line anyway. *) - if !state = INCOMMENT then - Buffer.add_char tmp_buf '\n'; - let res = Buffer.contents tmp_buf in - let res = - Str.global_replace (Str.regexp_string backslash) "\\\\" res - in - (* Printf.printf "after preprocessing:\n%s%!" res; *) - output_string outfile res; - close_in tmp; - if not debug then Sys.remove cppname) - with - | End_of_file -> - if not debug then (try Sys.remove cppname with Sys_error _ -> ()); - abort_preprocess "Empty result in annotation pre-processing" outfile - | Sys_error e -> - if not debug then (try Sys.remove cppname with Sys_error _ -> ()); - abort_preprocess ("System error: " ^ e) outfile - + ignore_content (); + ignore (input_line file); (* ignore the #line directive *) + let with_nl, content = get_annot true in + with_nl, replace_backslash content + with End_of_file -> + Kernel.fatal + "too few annotations in result file while pre-processing annotations" + + let output_result outfile preprocessed content = + let rec aux = function + | [] -> () + | [s] -> output_string outfile s + | content :: rem -> + output_string outfile content; + output_string outfile "/*@"; + let with_nl, pp_content = next_preprocessed preprocessed in + output_string outfile pp_content; + output_string outfile "*/"; + if with_nl then output_char outfile '\n'; + aux rem + in aux content + + let preprocess_annots suffix cpp outfile = + if !has_annot then begin + let debug = + Kernel.debug_atleast 3 || + Kernel.Debug_category.exists (fun x -> x = "parser") + in + let ppname = + try Extlib.temp_file_cleanup_at_exit ~debug "ppannot" suffix + with Extlib.Temp_file_error s -> + Kernel.abort + "Could not open temporary file for logic pre-processing: %s" s + in + let ppfile = open_out ppname in + Buffer.output_buffer ppfile preprocess_buffer; + close_out ppfile; + let cppname = Extlib.temp_file_cleanup_at_exit ~debug "cppannot" suffix in + let res = Sys.command (cpp ppname cppname) in + let result_file = + if res <> 0 then begin + abort_preprocess "Preprocessor call exited with an error"; + if not debug then Extlib.safe_remove cppname; + ppname + end else cppname + in + let result = open_in result_file in + let content = + Str.split_delim re_annot_content (Buffer.contents output_buffer) + in + output_result outfile result content; + end else begin + Buffer.output_buffer outfile output_buffer end; - Printf.fprintf outfile "*/\n# %d %s\n%!" !curr_line !curr_file; - Buffer.clear buf + flush outfile + + let add_preprocess_line_info () = + Printf.bprintf + preprocess_buffer "# %d %s \n%s " + !curr_line !curr_file (Buffer.contents beg_of_line); + Buffer.clear beg_of_line let make_newline () = incr curr_line; Buffer.clear beg_of_line } -rule main suffix cpp outfile = parse +rule main = parse | ("#define"|"#undef") [' ''\t']* ((['a'-'z''A'-'Z''0'-'9''_'])* as m) - [^'\n']* '\n' { - if not (List.mem m blacklisted_macros) then - Buffer.add_string macros (lexeme lexbuf); - output_char outfile '\n'; - make_newline (); - main suffix cpp outfile lexbuf + let blacklisted = List.mem m blacklisted_macros in + if not blacklisted then + Buffer.add_string preprocess_buffer (lexeme lexbuf); + macro blacklisted lexbuf } | "#" [' ''\t']* "line"? [' ''\t']* (['0'-'9']+ as line) [' ''\t']* (('"' [^'"']+ '"') as file) [^'\n']* "\n" @@ -167,250 +175,281 @@ curr_line := (int_of_string line) -1 with Failure "int_of_string" -> curr_line:= -1); if file <> "" then curr_file := file; - output_string outfile (lexeme lexbuf); + Buffer.add_string output_buffer (lexeme lexbuf); make_newline(); - main suffix cpp outfile lexbuf + main lexbuf } + | "/*@" ('{' | '}' as c) { (* Skip special doxygen comments. Use of '@' + instead of !Clexer.annot_char is intentional *) + Buffer.add_string beg_of_line " "; + Buffer.add_string output_buffer (lexeme lexbuf); + comment c lexbuf;} | "/*" (_ as c) { if c = !Clexer.annot_char then begin is_newline:=CHAR; - begin_annot_line := ! curr_line; - Buffer.clear buf; - maybe_ghost suffix cpp outfile lexbuf + has_annot := true; + Buffer.add_string output_buffer annot_content; + Buffer.add_string preprocess_buffer annot_beg; + Buffer.add_char preprocess_buffer '\n'; + add_preprocess_line_info(); + annot lexbuf end else begin - output_string outfile (lexeme lexbuf); - if c = '\n' then make_newline(); - Buffer.add_string beg_of_line " "; - comment suffix cpp outfile c lexbuf; + if c = '\n' then make_newline() + else Buffer.add_string beg_of_line " "; + Buffer.add_string output_buffer (lexeme lexbuf); + comment c lexbuf; end} + | "//@" ('{' | '}') { (* See comments for "/*@{" above *) + Buffer.add_string output_buffer (lexeme lexbuf); + oneline_comment lexbuf; + } | "//" (_ as c) { if c = !Clexer.annot_char then begin - Buffer.clear buf; - begin_annot_line := !curr_line; is_newline:=CHAR; - maybe_oneline_ghost suffix cpp outfile lexbuf + has_annot:=true; + Buffer.add_string output_buffer annot_content; + Buffer.add_string preprocess_buffer annot_beg; + Buffer.add_char preprocess_buffer '\n'; + add_preprocess_line_info(); + oneline_annot lexbuf end else if c = '\n' then begin make_newline (); - output_string outfile (lexeme lexbuf); - main suffix cpp outfile lexbuf + Buffer.add_string output_buffer (lexeme lexbuf); + main lexbuf end else begin - output_string outfile (lexeme lexbuf); - oneline_comment suffix cpp outfile lexbuf; + Buffer.add_string output_buffer (lexeme lexbuf); + oneline_comment lexbuf; end} - | eof { flush outfile } | '\n' { - make_newline (); - output_char outfile '\n'; - main suffix cpp outfile lexbuf } - | '"' { + make_newline (); Buffer.add_char output_buffer '\n'; main lexbuf } + | eof { } + | '"' { Buffer.add_char beg_of_line ' '; - output_char outfile '"'; - c_string suffix cpp outfile lexbuf } + Buffer.add_char output_buffer '"'; + c_string lexbuf } | "'" { Buffer.add_char beg_of_line ' '; - output_char outfile '\''; - c_char suffix cpp outfile lexbuf } + Buffer.add_char output_buffer '\''; + c_char lexbuf } | _ as c { Buffer.add_char beg_of_line ' '; - output_char outfile c; - main suffix cpp outfile lexbuf } + Buffer.add_char output_buffer c; + main lexbuf } +and macro blacklisted = parse +| "\\\n" { + if not blacklisted then + Buffer.add_string preprocess_buffer (lexeme lexbuf); + make_newline (); + Buffer.add_char output_buffer '\n'; + macro blacklisted lexbuf + } +(* we ignore comments in macro definition, as their expansion + in ACSL annotations would lead to ill-formed ACSL. *) +| "/*" { macro_comment blacklisted lexbuf } +| "\n" { + if not blacklisted then + Buffer.add_char preprocess_buffer '\n'; + make_newline (); + Buffer.add_char output_buffer '\n'; + main lexbuf + } +| _ as c { + if not blacklisted then + Buffer.add_char preprocess_buffer c; + macro blacklisted lexbuf + } +and macro_comment blacklisted = parse +| '\n' { + make_newline (); -and c_string suffix cpp outfile = parse + macro_comment blacklisted lexbuf + } +| "*/" { macro blacklisted lexbuf } +| _ { macro_comment blacklisted lexbuf } +and c_string = parse | "\\\"" { Buffer.add_string beg_of_line " "; - output_string outfile (lexeme lexbuf); - c_string suffix cpp outfile lexbuf } + Buffer.add_string output_buffer (lexeme lexbuf); + c_string lexbuf } | "\"" { Buffer.add_char beg_of_line ' '; - output_char outfile '"'; - main suffix cpp outfile lexbuf } + Buffer.add_char output_buffer '"'; + main lexbuf } | '\n' { make_newline (); - output_char outfile '\n'; - c_string suffix cpp outfile lexbuf + Buffer.add_char output_buffer '\n'; + c_string lexbuf } | "\\\\" { Buffer.add_string beg_of_line " "; - output_string outfile (lexeme lexbuf); - c_string suffix cpp outfile lexbuf } + Buffer.add_string output_buffer (lexeme lexbuf); + c_string lexbuf } | _ as c { Buffer.add_char beg_of_line ' '; - output_char outfile c; - c_string suffix cpp outfile lexbuf } + Buffer.add_char output_buffer c; + c_string lexbuf } (* C syntax allows for multiple char character constants *) -and c_char suffix cpp outfile = parse +and c_char = parse | "\\\'" { Buffer.add_string beg_of_line " "; - output_string outfile (lexeme lexbuf); - c_char suffix cpp outfile lexbuf } + Buffer.add_string output_buffer (lexeme lexbuf); + c_char lexbuf } | "'" { Buffer.add_char beg_of_line ' '; - output_char outfile '\''; - main suffix cpp outfile lexbuf } + Buffer.add_char output_buffer '\''; + main lexbuf } | '\n' { make_newline (); - output_char outfile '\n'; - c_char suffix cpp outfile lexbuf + Buffer.add_char output_buffer '\n'; + c_char lexbuf } | "\\\\" { Buffer.add_string beg_of_line " "; - output_string outfile (lexeme lexbuf); - c_char suffix cpp outfile lexbuf } + Buffer.add_string output_buffer (lexeme lexbuf); + c_char lexbuf } | _ as c { Buffer.add_char beg_of_line ' '; - output_char outfile c; - c_char suffix cpp outfile lexbuf } + Buffer.add_char output_buffer c; + c_char lexbuf } -and maybe_ghost suffix cpp outfile = parse - [' ''\t']+ as space{ - Buffer.add_string buf space; - maybe_ghost suffix cpp outfile lexbuf } - | '\n' { - is_newline := NEWLINE; - incr curr_line; - Buffer.add_char buf '\n'; - maybe_ghost suffix cpp outfile lexbuf - } - | "ghost" - { is_ghost := true; - Buffer.add_string buf " "; - annot suffix cpp outfile lexbuf - } - (* silently skipping an empty annotation *) - | "*/" { main suffix cpp outfile lexbuf } - | _ as c { Buffer.add_char buf c; is_ghost:=false; - annot suffix cpp outfile lexbuf} -and maybe_oneline_ghost suffix cpp outfile = parse - [' ''\t']+ as space{ - Buffer.add_string buf space; - maybe_oneline_ghost suffix cpp outfile lexbuf } - | '\n' { - incr curr_line; - main suffix cpp outfile lexbuf - } - | "ghost" - { is_ghost := true; - Buffer.add_string buf " "; - oneline_annot suffix cpp outfile lexbuf - } - | _ as c - { - Buffer.add_char buf c; - is_ghost:=false; - oneline_annot suffix cpp outfile lexbuf - } -and annot suffix cpp outfile = parse - "*/" { preprocess_annot suffix cpp outfile; - main suffix cpp outfile lexbuf } +and annot = parse + "*/" { + if !is_newline = NEWLINE then + Buffer.add_string preprocess_buffer annot_end_nl + else begin + Buffer.add_char preprocess_buffer '\n'; + Buffer.add_string preprocess_buffer annot_end; + end; + Buffer.add_char preprocess_buffer '\n'; + main lexbuf } | '\n' { is_newline := NEWLINE; incr curr_line; - Buffer.add_char buf '\n'; - annot suffix cpp outfile lexbuf } - | "//" { Buffer.add_string buf "//"; - annot_comment suffix cpp outfile lexbuf } + Buffer.add_char preprocess_buffer '\n'; + annot lexbuf } + | "//" { Buffer.add_string preprocess_buffer "//"; + annot_comment lexbuf } | '@' { if !is_newline = NEWLINE then is_newline:=SPACE; - Buffer.add_char buf ' '; - annot suffix cpp outfile lexbuf } + Buffer.add_char preprocess_buffer ' '; + annot lexbuf } | ' ' { if !is_newline = NEWLINE then is_newline:=SPACE; - Buffer.add_char buf ' '; - annot suffix cpp outfile lexbuf } + Buffer.add_char preprocess_buffer ' '; + annot lexbuf } (* We're not respecting char count here. Maybe using '$' would do it, as cpp is likely to count it as part of an identifier, but this would imply that we can not speak about $ ident in annotations. *) - | '\\' { Buffer.add_string buf backslash; - annot suffix cpp outfile lexbuf } - | '\'' { Buffer.add_char buf '\''; - char suffix annot cpp outfile lexbuf } - | '"' { Buffer.add_char buf '"'; - string suffix annot cpp outfile lexbuf } + | '\\' { + is_newline := CHAR; + Buffer.add_string preprocess_buffer backslash; + annot lexbuf } + | '\'' { + is_newline := CHAR; + Buffer.add_char preprocess_buffer '\''; + char annot lexbuf } + | '"' { + is_newline:=CHAR; + Buffer.add_char preprocess_buffer '"'; + string annot lexbuf } | _ as c { is_newline := CHAR; - Buffer.add_char buf c; - annot suffix cpp outfile lexbuf } + Buffer.add_char preprocess_buffer c; + annot lexbuf } -and annot_comment suffix cpp outfile = parse +and annot_comment = parse | '\n' { incr curr_line; is_newline:=NEWLINE; - Buffer.add_char buf '\n'; - annot suffix cpp outfile lexbuf + Buffer.add_char preprocess_buffer '\n'; + annot lexbuf } - | "*/" { preprocess_annot suffix cpp outfile; - main suffix cpp outfile lexbuf } - | eof { abort_preprocess "eof in the middle of a comment" outfile } + | "*/" { + Buffer.add_char preprocess_buffer '\n'; + Buffer.add_string preprocess_buffer annot_end; + Buffer.add_char preprocess_buffer '\n'; + main lexbuf } + | eof { abort_preprocess "eof in the middle of a comment" } | _ as c { - Buffer.add_char buf c; - annot_comment suffix cpp outfile lexbuf } + Buffer.add_char preprocess_buffer c; annot_comment lexbuf } -and char suffix annot cpp outfile = parse +and char annot = parse | '\n' { incr curr_line; is_newline:=NEWLINE; - Buffer.add_char buf '\n'; - char suffix annot cpp outfile lexbuf + Buffer.add_char preprocess_buffer '\n'; + char annot lexbuf } | '\'' { is_newline:=CHAR; - Buffer.add_char buf '\''; - annot suffix cpp outfile lexbuf } + Buffer.add_char preprocess_buffer '\''; + annot lexbuf } | "\\'" { is_newline:=CHAR; - Buffer.add_string buf "\\'"; - char suffix annot cpp outfile lexbuf } + Buffer.add_string preprocess_buffer "\\'"; + char annot lexbuf } | "\\\\" { is_newline:=CHAR; - Buffer.add_string buf "\\\\"; - char suffix annot cpp outfile lexbuf } - | eof { abort_preprocess "eof while parsing a char literal" outfile } + Buffer.add_string preprocess_buffer "\\\\"; + char annot lexbuf } + | eof { abort_preprocess "eof while parsing a char literal" } | _ as c { is_newline:=CHAR; - Buffer.add_char buf c; - char suffix annot cpp outfile lexbuf } + Buffer.add_char preprocess_buffer c; + char annot lexbuf } -and string suffix annot cpp outfile = parse +and string annot = parse | '\n' { incr curr_line; is_newline:=NEWLINE; - Buffer.add_char buf '\n'; string suffix annot cpp outfile lexbuf + Buffer.add_char preprocess_buffer '\n'; string annot lexbuf } - | '"' { is_newline:=CHAR; Buffer.add_char buf '"'; - annot suffix cpp outfile lexbuf } + | '"' { is_newline:=CHAR; + Buffer.add_char preprocess_buffer '"'; annot lexbuf } | "\\\"" { is_newline:=CHAR; - Buffer.add_string buf "\\\""; - string suffix annot cpp outfile lexbuf } - | eof { abort_preprocess "eof while parsing a string literal" outfile } + Buffer.add_string preprocess_buffer "\\\""; + string annot lexbuf } + | eof { abort_preprocess "eof while parsing a string literal" } | _ as c { is_newline:=CHAR; - Buffer.add_char buf c; - string suffix annot cpp outfile lexbuf } + Buffer.add_char preprocess_buffer c; + string annot lexbuf } -and comment suffix cpp outfile c = +and comment c = parse "/" { Buffer.add_char beg_of_line ' '; - output_string outfile (lexeme lexbuf); + Buffer.add_char output_buffer '/'; if c = '*' then - main suffix cpp outfile lexbuf + main lexbuf else - comment suffix cpp outfile '/' lexbuf + comment '/' lexbuf } - | '\n' { make_newline (); output_char outfile '\n'; - comment suffix cpp outfile '\n' lexbuf } - | eof { abort_preprocess "eof while parsing C comment" outfile} + | '\n' { make_newline (); Buffer.add_char output_buffer '\n'; + comment '\n' lexbuf } + | eof { abort_preprocess "eof while parsing C comment" } | _ as c { Buffer.add_char beg_of_line ' '; - output_char outfile c; - comment suffix cpp outfile c lexbuf} + Buffer.add_char output_buffer c; + comment c lexbuf} -and oneline_annot suffix cpp outfile = parse +and oneline_annot = parse "\n"|eof { incr curr_line; - preprocess_annot suffix cpp outfile; - main suffix cpp outfile lexbuf } - | '@' { Buffer.add_char buf ' '; - oneline_annot suffix cpp outfile lexbuf - } - | '\\' { Buffer.add_string buf backslash; - oneline_annot suffix cpp outfile lexbuf } - | '\'' { Buffer.add_char buf '\''; - char suffix oneline_annot cpp outfile lexbuf } - | '"' { Buffer.add_char buf '"'; - string suffix oneline_annot cpp outfile lexbuf } - | _ as c { Buffer.add_char buf c; - oneline_annot suffix cpp outfile lexbuf } + Buffer.add_char preprocess_buffer '\n'; + Buffer.add_string preprocess_buffer annot_end_nl; + Buffer.add_char preprocess_buffer '\n'; + main lexbuf } + | '\\' { Buffer.add_string preprocess_buffer backslash; + oneline_annot lexbuf } + | '\'' { Buffer.add_char preprocess_buffer '\''; + char oneline_annot lexbuf } + | '"' { Buffer.add_char preprocess_buffer '"'; + string oneline_annot lexbuf } + | "//" { Buffer.add_string preprocess_buffer "//"; + oneline_annot_comment lexbuf } + | _ as c { Buffer.add_char preprocess_buffer c; + oneline_annot lexbuf } + +and oneline_annot_comment = parse + "\n"|eof { + incr curr_line; + Buffer.add_char preprocess_buffer '\n'; + Buffer.add_string preprocess_buffer annot_end_comment; + Buffer.add_char preprocess_buffer '\n'; + main lexbuf } + | _ as c { Buffer.add_char preprocess_buffer c; + oneline_annot_comment lexbuf } -and oneline_comment suffix cpp outfile = +and oneline_comment = parse "\n"|eof { make_newline(); - output_string outfile (lexeme lexbuf); - main suffix cpp outfile lexbuf} - | _ as c { output_char outfile c; - oneline_comment suffix cpp outfile lexbuf} + Buffer.add_string output_buffer (lexeme lexbuf); + main lexbuf} + | _ as c { Buffer.add_char output_buffer c; + oneline_comment lexbuf} { let file suffix cpp filename = @@ -423,7 +462,8 @@ (Filename.basename filename) ".pp" in let ppfile = open_out ppname in - main suffix cpp ppfile lex; + main lex; + preprocess_annots suffix cpp ppfile; close_in inchan; close_out ppfile; ppname diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_print.ml frama-c-20150201+sodium+dfsg/cil/src/logic/logic_print.ml --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_print.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_print.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -120,7 +120,7 @@ | PLapp _ | PLold _ | PLat _ | PLoffset _ | PLbase_addr _ | PLblock_length _ | PLupdate _ | PLinitField _ | PLinitIndex _ - | PLvalid _ | PLvalid_read _ | PLinitialized _ + | PLvalid _ | PLvalid_read _ | PLinitialized _ | PLdangling _ | PLallocable _ | PLfreeable _ | PLfresh _ | PLseparated _ | PLsubtype _ | PLunion _ | PLinter _ -> 10 | PLvar _ | PLconstant _ | PLresult | PLnull | PLtypeof _ | PLtype _ @@ -241,6 +241,9 @@ | PLvalid_read (l,e) -> fprintf fmt "\\valid_read%a(@;@[%a@]@;)" print_label_1 l print_lexpr_plain e | PLinitialized (l,e) -> fprintf fmt "\\initialized%a(@;@[%a@]@;)" print_label_1 l print_lexpr_plain e + | PLdangling (l,e) -> + fprintf fmt "\\dangling%a(@;@[%a@]@;)" + print_label_1 l print_lexpr_plain e | PLseparated l -> fprintf fmt "\\separated(@;@[%a@]@;)" (pp_list ~sep:",@ " print_lexpr_plain) l diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_print.mli frama-c-20150201+sodium+dfsg/cil/src/logic/logic_print.mli --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_print.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_print.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_ptree.mli frama-c-20150201+sodium+dfsg/cil/src/logic/logic_ptree.mli --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_ptree.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_ptree.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -131,7 +131,10 @@ | PLvalid_read of string option * lexpr (** pointer is valid for reading. *) | PLallocable of string option * lexpr (** pointer is valid for malloc. *) | PLfreeable of string option * lexpr (** pointer is valid for free. *) - | PLinitialized of string option * lexpr (** l-value is guaranteed to be initalized *) + | PLinitialized of string option * lexpr (** pointer is guaranteed to be + initialized *) + | PLdangling of string option * lexpr (** pointer is guaranteed to be + dangling *) | PLfresh of (string * string) option * lexpr * lexpr (** expression points to a newly allocated block. *) | PLseparated of lexpr list (** separation predicate. *) diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_typing.ml frama-c-20150201+sodium+dfsg/cil/src/logic/logic_typing.ml --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_typing.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_typing.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -410,6 +410,9 @@ end +let append_init_label env = + Lenv.add_logic_label "Init" Logic_const.init_label env + let append_here_label env = let env = Lenv.add_logic_label "Here" Logic_const.here_label env in Lenv.set_current_logic_label Logic_const.here_label env @@ -441,6 +444,7 @@ let post_state_env kind typ = let env = Lenv.funspec () in + let env = append_init_label env in let env = append_here_label env in let env = append_old_and_post_labels env in (* NB: this allows to have \result and Exits as termination kind *) @@ -449,6 +453,21 @@ let env = enter_post_state env kind in env +type type_namespace = Typedef | Struct | Union | Enum + +module Type_namespace = + Datatype.Make(struct + include Datatype.Serializable_undefined + + let reprs = [Typedef] + let name = "Logic_typing.type_namespace" + type t = type_namespace + let compare : t -> t -> int = Pervasives.compare + let equal : t -> t -> bool = (=) + let hash : t -> int = Hashtbl.hash + end) + + type typing_context = { is_loop: unit -> bool; anonCompFieldName : string; @@ -456,9 +475,8 @@ find_macro : string -> lexpr; find_var : string -> logic_var; find_enum_tag : string -> exp * typ; - find_comp_type : kind:string -> string -> typ; find_comp_field: compinfo -> string -> offset; - find_type : string -> typ; + find_type : type_namespace -> string -> typ; find_label : string -> stmt ref; remove_logic_function : string -> unit; remove_logic_type: string -> unit; @@ -542,12 +560,19 @@ not (Cil.isVoidType ty) | _ -> error loc "not a pointer or array type" + let plain_fun_ptr typ = + match unroll_type typ with + | Ctype (TPtr(ty,_)) -> Cil.isFunctionType ty + | _ -> false + let is_arithmetic_type = plain_or_set plain_arithmetic_type let is_integral_type = plain_or_set plain_integral_type let is_non_void_ptr loc = plain_or_set (plain_non_void_ptr loc) + let is_fun_ptr = plain_or_set plain_fun_ptr + let check_non_void_ptr loc typ = if not (is_non_void_ptr loc typ) then error loc "expecting a non-void pointer" @@ -619,9 +644,8 @@ val find_macro : string -> lexpr val find_var : string -> logic_var val find_enum_tag : string -> exp * typ - val find_comp_type : kind:string -> string -> typ val find_comp_field: compinfo -> string -> offset - val find_type : string -> typ + val find_type : type_namespace -> string -> typ val find_label : string -> stmt ref val remove_logic_function : string -> unit val remove_logic_type: string -> unit @@ -650,7 +674,6 @@ find_macro = C.find_macro; find_var = C.find_var; find_enum_tag = C.find_enum_tag; - find_comp_type = C.find_comp_type; find_comp_field = C.find_comp_field; find_type = C.find_type ; find_label = C.find_label; @@ -771,13 +794,13 @@ Cil.empty_size_cache (),[])) | LTpointer ty -> Ctype (TPtr (c_logic_type loc env ty, [])) | LTenum e -> - (try Ctype (C.find_comp_type "enum" e) + (try Ctype (C.find_type Enum e) with Not_found -> error loc "no such enum %s" e) | LTstruct s -> - (try Ctype (C.find_comp_type "struct" s) + (try Ctype (C.find_type Struct s) with Not_found -> error loc "no such struct %s" s) | LTunion u -> - (try Ctype (C.find_comp_type "union" u) + (try Ctype (C.find_type Union u) with Not_found -> error loc "no such union %s" u) | LTarrow (prms,rt) -> (* For now, our only function types are C function pointers. *) @@ -789,7 +812,7 @@ | LTnamed (id,[]) -> (try Lenv.find_type_var id env with Not_found -> - try Ctype (C.find_type id) with Not_found -> + try Ctype (C.find_type Typedef id) with Not_found -> try let info = C.find_logic_type id in if info.lt_params <> [] then @@ -899,7 +922,7 @@ | Pnot p | Plet (_,p) | Pforall(_,p) | Pexists(_,p) -> needs_at_pred p | Pif(t,p1,p2) -> needs_at t || needs_at_pred p1 || needs_at_pred p2 | Pvalid (_,t) | Pvalid_read (_,t) | Pinitialized (_,t) - | Pallocable(_,t) | Pfreeable(_,t)-> needs_at t + | Pdangling (_, t) | Pallocable(_,t) | Pfreeable(_,t)-> needs_at t | Pfresh (_,_,t,n) -> (needs_at t) && (needs_at n) | Psubtype _ -> false in @@ -1161,15 +1184,16 @@ | Ctype ty1, Ctype ty2 -> if is_same_c_type ty1 ty2 then ot, oterm - else + else if (isIntegralType ty1 && isIntegralType ty2) then begin let sz1 = bitsSizeOf ty1 in let sz2 = bitsSizeOf ty2 in - if (isIntegralType ty1 && isIntegralType ty2 && - (sz1 < sz2 - || (sz1 = sz2 && (isSignedInteger ty1 = isSignedInteger ty2)) - || is_enum_cst oterm nt - )) - || is_implicit_pointer_conversion oterm ty1 ty2 + if (sz1 < sz2 + || (sz1 = sz2 && (isSignedInteger ty1 = isSignedInteger ty2)) + || is_enum_cst oterm nt) + then begin let t, e = c_cast_to ty1 ty2 oterm in Ctype t,e end + else error loc "invalid implicit conversion from '%a' to '%a'" + Cil_printer.pp_typ ty1 Cil_printer.pp_typ ty2 + end else if is_implicit_pointer_conversion oterm ty1 ty2 || (match unrollType ty1, unrollType ty2 with | (TFloat (f1,_), TFloat (f2,_)) -> f1 <= f2 @@ -2138,7 +2162,11 @@ (* access to C variable need a current label *) lv.vreferenced <- true | None -> ()); - old_val info + (match info.lv_type with + | Ctype(TFun _ as t) -> + (* function decays as a pointer *) + TAddrOf (TVar info, TNoOffset), Ctype (TPtr (t,[])) + | _ -> old_val info) with Not_found -> try let e,t = C.find_enum_tag x in @@ -2586,7 +2614,8 @@ (Trange(t1,t2), Ltype(C.find_logic_type "set", [arithmetic_conversion ty1 ty2])) | PLvalid _ | PLvalid_read _ | PLfresh _ | PLallocable _ | PLfreeable _ - | PLinitialized _ | PLexists _ | PLforall _ | PLimplies _ | PLiff _ + | PLinitialized _ | PLdangling _ | PLexists _ | PLforall _ + | PLimplies _ | PLiff _ | PLxor _ | PLsubtype _ | PLseparated _ -> if silent then raise Backtrack; error loc "syntax error (expression expected but predicate found)" @@ -2669,6 +2698,11 @@ | TStartOf lv | TCastE(_,{term_node = TStartOf lv}) | Tat ({term_node = TStartOf lv}, _) -> f lv t + | TAddrOf lv when is_fun_ptr t.term_type -> + f lv + { t with + term_type = type_of_pointed t.term_type; + term_node = TLval lv } | _ -> error t.term_loc "not a left value: %a" Cil_printer.pp_term t in @@ -2844,6 +2878,17 @@ and predicate env p0 = let loc = p0.lexpr_loc in + (* Auxiliary function for valid, valid_read, initialized and specified *) + let predicate_label_non_void_ptr fpred label t = + let l = find_current_logic_label loc env label in + let t = term env t in + let t = mk_logic_pointer_or_StartOf t in + check_non_void_ptr t.term_loc t.term_type; + (* higher-order funs do not mix well with (optional) labels, + hence the binding below. *) + let loc = Some loc in + fpred ?loc (l,t) + in match p0.lexpr_node with | PLfalse -> unamed ~loc Pfalse | PLtrue -> unamed ~loc Ptrue @@ -2932,28 +2977,13 @@ pallocable ~loc:p0.lexpr_loc (l,t) else error loc "subscripted value is neither array nor pointer" | PLvalid_read (l, t) -> - (* validity need a current label to have some semantics *) - let l = find_current_logic_label loc env l in - let loc = t.lexpr_loc in - let t = term env t in - let t = mk_logic_pointer_or_StartOf t in - check_non_void_ptr loc t.term_type; - pvalid_read ~loc:p0.lexpr_loc (l,t) + predicate_label_non_void_ptr pvalid_read l t | PLvalid (l,t) -> - (* validity need a current label to have some semantics *) - let l = find_current_logic_label loc env l in - let loc = t.lexpr_loc in - let t = term env t in - let t = mk_logic_pointer_or_StartOf t in - check_non_void_ptr loc t.term_type; - pvalid ~loc:p0.lexpr_loc (l,t) + predicate_label_non_void_ptr pvalid l t | PLinitialized (l,t) -> - (* initialized need a current label to have some semantics *) - let l = find_current_logic_label loc env l in - let t = term env t in - let t = mk_logic_pointer_or_StartOf t in - check_non_void_ptr t.term_loc t.term_type; - pinitialized ~loc:p0.lexpr_loc (l,t) + predicate_label_non_void_ptr pinitialized l t + | PLdangling (l,t) -> + predicate_label_non_void_ptr pdangling l t | PLold p -> let lab = find_old_label p0.lexpr_loc env in let env = Lenv.set_current_logic_label lab env in @@ -3148,7 +3178,7 @@ | Widen_variables l -> (Widen_variables (List.map (term env) l)) let type_annot loc ti = - let env = append_here_label (Lenv.empty()) in + let env = append_here_label (append_init_label (Lenv.empty())) in let this_type = logic_type loc env ti.this_type in let v = Cil_const.make_logic_var_formal ti.this_name this_type in let env = Lenv.add_var ti.this_name v env in @@ -3214,7 +3244,7 @@ end) let type_spec old_behaviors loc is_stmt_contract result env s = - let env = append_here_label env in + let env = append_here_label (append_init_label env) in let env_with_result = add_result env result in let env_with_result_and_exit_status = add_exit_status env_with_result in (* assigns_env is a bit special: @@ -3360,11 +3390,13 @@ | IPstmt as ip -> ip let code_annot_env () = - let env = append_here_label (append_pre_label (Lenv.empty())) in + let env = append_here_label (append_pre_label (append_init_label + (Lenv.empty()))) in if C.is_loop () then append_loop_labels env else env let loop_annot_env () = - append_loop_labels (append_here_label (append_pre_label (Lenv.empty()))) + append_loop_labels (append_here_label (append_pre_label (append_init_label + (Lenv.empty())))) let code_annot loc current_behaviors current_return_type ca = let annot = match ca with @@ -3682,7 +3714,7 @@ Logic_env.Lemmas.add x def; def | LDinvariant (s, e) -> - let env = append_here_label (Lenv.empty()) in + let env = append_here_label (append_init_label (Lenv.empty())) in let p = predicate env e in let li = Cil_const.make_logic_info s in li.l_labels <- [Logic_const.here_label]; diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_typing.mli frama-c-20150201+sodium+dfsg/cil/src/logic/logic_typing.mli --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_typing.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_typing.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -69,6 +69,12 @@ val empty : unit -> t end +type type_namespace = Typedef | Struct | Union | Enum +(** The different namespaces a C type can belong to, used when we are searching + a type by its name. *) + +module Type_namespace: Datatype.S with type t = type_namespace + (** Functions that can be called when type-checking an extension of ACSL. *) type typing_context = { is_loop: unit -> bool; @@ -77,9 +83,8 @@ find_macro : string -> Logic_ptree.lexpr; find_var : string -> logic_var; find_enum_tag : string -> exp * typ; - find_comp_type : kind:string -> string -> typ; find_comp_field: compinfo -> string -> offset; - find_type : string -> typ; + find_type : type_namespace -> string -> typ; find_label : string -> stmt ref; remove_logic_function : string -> unit; remove_logic_type: string -> unit; @@ -111,12 +116,14 @@ bhv.b_extended <- ("FOO",42, [Logic_const.new_predicate (typing_context.type_predicate - (typing_context.post_state Normal) + (typing_context.post_state [Normal]) p)]) ::bhv.b_extended | _ -> typing_context.error loc "expecting a predicate after keyword FOO" let () = register_behavior_extension "FOO" foo_typer + @plugin development guide + @since Carbon-20101201 *) val register_behavior_extension: @@ -135,9 +142,8 @@ val find_macro : string -> Logic_ptree.lexpr val find_var : string -> logic_var val find_enum_tag : string -> exp * typ - val find_comp_type : kind:string -> string -> typ + val find_type : type_namespace -> string -> typ val find_comp_field: compinfo -> string -> offset - val find_type : string -> typ val find_label : string -> stmt ref val remove_logic_function : string -> unit @@ -218,6 +224,11 @@ (** appends the "Pre" label in the environment *) val append_pre_label: Lenv.t -> Lenv.t +(** appends the "Init" label in the environment + @since Sodium-20150201 +*) +val append_init_label: Lenv.t -> Lenv.t + (** adds a given variable in local environment. *) val add_var: string -> logic_var -> Lenv.t -> Lenv.t diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_utils.ml frama-c-20150201+sodium+dfsg/cil/src/logic/logic_utils.ml --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_utils.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_utils.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -302,26 +302,29 @@ | AddrOf lv -> TAddrOf (lval_to_term_lval ~cast lv) | CastE (ty,e) -> (mk_cast (unrollType ty) (expr_to_term ~cast e)).term_node | BinOp (op, l, r, _) -> - let is_arith_cmp_op op = - match op with - | Cil_types.Lt | Cil_types.Gt - | Cil_types.Le | Cil_types.Ge - | Cil_types.Eq | Cil_types.Ne -> true - | _ -> false + let is_arith_cmp = match op with + | Cil_types.Lt | Cil_types.Gt + | Cil_types.Le | Cil_types.Ge + | Cil_types.Eq | Cil_types.Ne -> true + | _ -> false in let nnode = TBinOp (op,expr_to_term ~cast l,expr_to_term ~cast r) in if (cast && (Cil.isIntegralType e_typ || Cil.isFloatingType e_typ)) - || is_arith_cmp_op op (* BTS 1175 *) + || is_arith_cmp (* BTS 1175 *) then - (mk_cast e_typ (Logic_const.term nnode (typ_to_logic_type e_typ))).term_node + let ty = + if is_arith_cmp then Logic_const.boolean_type + else typ_to_logic_type e_typ + in + (mk_cast e_typ (Logic_const.term nnode ty)).term_node else nnode | UnOp (op, e, _) -> - let nnode = TUnOp (op,expr_to_term ~cast e) in - if cast && (Cil.isIntegralType e_typ || Cil.isFloatingType e_typ) - then - (mk_cast e_typ - (Logic_const.term nnode (typ_to_logic_type e_typ))).term_node - else nnode + let nnode = TUnOp (op,expr_to_term ~cast e) in + if cast && (Cil.isIntegralType e_typ || Cil.isFloatingType e_typ) + then + (mk_cast e_typ + (Logic_const.term nnode (typ_to_logic_type e_typ))).term_node + else nnode | AlignOfE e -> TAlignOfE (expr_to_term ~cast e) | AlignOf typ -> TAlignOf typ | Lval lv -> TLval (lval_to_term_lval ~cast lv) @@ -344,7 +347,7 @@ and offset_to_term_offset ~cast:cast = function | NoOffset -> TNoOffset | Index (e,off) -> - TIndex (expr_to_term ~cast e,offset_to_term_offset ~cast off) + TIndex (expr_to_term ~cast e,offset_to_term_offset ~cast off) | Field (fi,off) -> TField(fi,offset_to_term_offset ~cast off) @@ -574,10 +577,7 @@ match c1, c2 with | CEnum e1, CEnum e2 -> e1.einame = e2.einame && e1.eihost.ename = e2.eihost.ename && - (match - isInteger (constFold true e1.eival), - isInteger (constFold true e2.eival) - with + (match constFoldToInt e1.eival, constFoldToInt e2.eival with | Some i1, Some i2 -> Integer.equal i1 i2 | _ -> false) | CInt64 (i1,k1,_), CInt64(i2,k2,_) -> @@ -736,6 +736,8 @@ | Pvalid_read (l1,t1), Pvalid_read (l2,t2) | Pinitialized (l1,t1), Pinitialized (l2,t2) -> is_same_logic_label l1 l2 && is_same_term t1 t2 + | Pdangling (l1,t1), Pdangling (l2,t2) -> + is_same_logic_label l1 l2 && is_same_term t1 t2 | Pfresh (l1,m1,t1,n1), Pfresh (l2,m2,t2,n2) -> is_same_logic_label l1 l2 && is_same_logic_label m1 m2 && is_same_term t1 t2 && is_same_term n1 n2 @@ -746,7 +748,7 @@ with Invalid_argument _ -> false) | (Pfalse | Ptrue | Papp _ | Prel _ | Pand _ | Por _ | Pimplies _ | Piff _ | Pnot _ | Pif _ | Plet _ | Pforall _ | Pexists _ - | Pat _ | Pvalid _ | Pvalid_read _ | Pinitialized _ + | Pat _ | Pvalid _ | Pvalid_read _ | Pinitialized _ | Pdangling _ | Pfresh _ | Pallocable _ | Pfreeable _ | Psubtype _ | Pxor _ | Pseparated _ ), _ -> false @@ -1048,6 +1050,8 @@ | PLblock_length (l1,e1), PLblock_length (l2,e2) | PLinitialized (l1,e1), PLinitialized (l2,e2) -> l1=l2 && is_same_lexpr e1 e2 + | PLdangling (l1,e1), PLdangling (l2,e2) -> + l1=l2 && is_same_lexpr e1 e2 | PLseparated l1, PLseparated l2 -> is_same_list is_same_lexpr l1 l2 | PLif(c1,t1,e1), PLif(c2,t2,e2) -> @@ -1068,8 +1072,9 @@ | PLtrue | PLinitField _ | PLrel _ | PLand _ | PLor _ | PLxor _ | PLimplies _ | PLiff _ | PLnot _ | PLif _ | PLforall _ | PLexists _ | PLvalid _ | PLvalid_read _ | PLfreeable _ | PLallocable _ - | PLinitialized _ | PLseparated _ | PLfresh _ | PLnamed _ | PLsubtype _ - | PLcomprehension _ | PLunion _ | PLinter _ | PLsingleton _ | PLempty + | PLinitialized _ | PLdangling _ | PLseparated _ | PLfresh _ | PLnamed _ + | PLsubtype _ | PLcomprehension _ | PLunion _ | PLinter _ + | PLsingleton _ | PLempty ),_ -> false let hash_label l = @@ -1513,6 +1518,9 @@ | Pinitialized (l1,t1), Pinitialized (l2,t2) -> let res = compare_logic_label l1 l2 in if res = 0 then compare_term t1 t2 else res + | Pdangling (l1,t1), Pdangling (l2,t2) -> + let res = compare_logic_label l1 l2 in + if res = 0 then compare_term t1 t2 else res | Pallocable _, _ -> 1 | _, Pallocable _ -> -1 | Pfreeable _, _ -> 1 @@ -1523,6 +1531,8 @@ | _, Pvalid_read _ -> -1 | Pinitialized _, _ -> 1 | _, Pinitialized _ -> -1 + | Pdangling _, _ -> 1 + | _, Pdangling _ -> -1 | Pfresh (l1,m1,t1,n1), Pfresh (l2,m2,t2,n2) -> let res = compare_logic_label l1 l2 in if res = 0 then @@ -1733,14 +1743,25 @@ spec.spec_disjoint_behaviors <- tmp.spec_disjoint_behaviors; spec.spec_variant <- tmp.spec_variant -let lhost_c_type = function - | TVar v -> - (match v.lv_type with - | Ctype ty -> ty - | _ -> assert false) +let lhost_c_type thost = + let extract_ctype lty = + let get = function + | Ctype typ -> Some typ + | Ltype _ | Lvar _ | Linteger | Lreal | Larrow _ -> None + in + match Logic_const.plain_or_set get lty with + | None -> + Kernel.fatal "[lhost_c_type] logic type %a does not represent a C type" + Cil_datatype.Logic_type.pretty lty + | Some ty -> + ty + in + match thost with + | TVar v -> extract_ctype v.lv_type | TMem t -> - (match t.term_type with - | Ctype (TPtr(ty,_)) -> ty + let ty = extract_ctype t.term_type in + (match Cil.unrollType ty with + | TPtr(ty, _) -> ty | _ -> assert false) | TResult ty -> ty @@ -1901,6 +1922,187 @@ Logic_const.unamed ?loc (Papp (pi, [], [s])) | _ -> assert false +let is_min_max_function name li = + li.l_var_info.lv_name = name && + match li.l_profile with + | [e] -> + Cil_datatype.Logic_type.equal e.lv_type (Logic_const.make_set_type Linteger) + | _ -> false +let is_max_function li = is_min_max_function "\\max" li +let is_min_function li = is_min_max_function "\\min" li + + +let rec constFoldTermToInt ?(machdep=true) (e: term) : Integer.t option = + match e.term_node with + | TBinOp(bop, e1, e2) -> constFoldBinOpToInt ~machdep bop e1 e2 + | TUnOp(unop, e) -> constFoldUnOpToInt ~machdep unop e + | TConst(LChr c) -> Some (charConstToInt c) + | TConst(LEnum {eival = v}) -> Cil.constFoldToInt ~machdep v + | TConst (Integer (i, _)) -> Some i + | TConst (LReal _ | LWStr _ | LStr _) -> None + | TSizeOf typ -> constFoldSizeOfToInt ~machdep typ + | TSizeOfE t -> begin + match unroll_type t.term_type with + | Ctype typ -> constFoldSizeOfToInt ~machdep typ + | _ -> None + end + | TSizeOfStr s -> Some (Integer.of_int (1 + String.length s)) + | TAlignOf t -> begin + try Some (Integer.of_int (Cil.bytesAlignOf t)) + with Cil.SizeOfError _ -> None + end + | TAlignOfE _ -> None (* exp case is very complex, and possibly incorrect *) + | TCastE (typ, e) -> constFoldCastToInt ~machdep typ e + | Toffset (_, t) -> if machdep then constFoldToffset t else None + | Tif (c, e1, e2) -> begin + match constFoldTermToInt ~machdep c with + | None -> None + | Some i -> + constFoldTermToInt ~machdep (if Integer.is_zero i then e2 else e1) + end + | TLogic_coerce (lt, e) -> + if lt = Linteger then constFoldTermToInt ~machdep e else None + | Tnull -> Some Integer.zero + | Tapp (li, _, [{term_node = (Tunion args | + TLogic_coerce (_, {term_node = Tunion args}))}]) + when is_max_function li -> + constFoldMinMax ~machdep Integer.max args + | Tapp (li, _, [{term_node = (Tunion args | + TLogic_coerce (_, {term_node = Tunion args}))}]) + when is_min_function li -> + constFoldMinMax ~machdep Integer.min args + + | TLval _ | TAddrOf _ | TStartOf _ | Tapp _ | Tlambda _ | TDataCons _ + | Tat _ | Tbase_addr _ | Tblock_length _ | TCoerce _ | TCoerceE _ + | TUpdate _ | Ttypeof _ | Ttype _ | Tempty_set | Tunion _ | Tinter _ + | Tcomprehension _ | Trange _ | Tlet _ -> + None + +and constFoldCastToInt ~machdep typ e = + try + let ik = match Cil.unrollType typ with + | TInt (ik, _) -> ik + | TPtr _ -> theMachine.upointKind + | TEnum (ei,_) -> ei.ekind + | _ -> raise Exit + in + match constFoldTermToInt ~machdep e with + | Some i -> Some (fst (Cil.truncateInteger64 ik i)) + | _ -> None + with Exit -> None + +and constFoldSizeOfToInt ~machdep typ = + if machdep then + try Some (Integer.of_int (bytesSizeOf typ)) + with SizeOfError _ -> None + else None + +and constFoldUnOpToInt ~machdep unop e = + let i = constFoldTermToInt ~machdep e in + match i with + | None -> None + | Some i -> + match unop with + | Neg -> Some (Integer.neg i) + | BNot -> Some (Integer.lognot i) + | LNot -> + Some (if Integer.equal i Integer.zero then Integer.one else Integer.zero) + +and constFoldBinOpToInt ~machdep bop e1 e2 = + match constFoldTermToInt ~machdep e1, constFoldTermToInt ~machdep e2 with + | Some i1, Some i2 -> begin + let comp op = Some (if op i1 i2 then Integer.one else Integer.zero) in + let logic op = + let b1 = not (Integer.is_zero i1) and b2 = not (Integer.is_zero i2) in + Some (if op b1 b2 then Integer.one else Integer.zero) + in + match bop with + | PlusA -> Some (Integer.add i1 i2) + | MinusA -> Some (Integer.sub i1 i2) + | PlusPI | IndexPI | MinusPI | MinusPP -> None + | Mult -> Some (Integer.mul i1 i2) + | Div -> + if Integer.(equal zero i2) && Integer.(is_zero (rem i1 i2)) then None + else Some (Integer.div i1 i2) + | Mod -> if Integer.(equal zero i2) then None else Some (Integer.rem i1 i2) + | BAnd -> Some (Integer.logand i1 i2) + | BOr -> Some (Integer.logor i1 i2) + | BXor -> Some (Integer.logxor i1 i2) + + | Shiftlt when Integer.(ge i2 zero) -> Some (Integer.shift_left i1 i2) + | Shiftrt when Integer.(ge i2 zero) -> Some (Integer.shift_right i1 i2) + | Shiftlt | Shiftrt -> None + + | Cil_types.Eq -> comp Integer.equal + | Cil_types.Ne -> comp (fun i1 i2 -> not (Integer.equal i1 i2)) + | Cil_types.Le -> comp Integer.le + | Cil_types.Ge -> comp Integer.ge + | Cil_types.Lt -> comp Integer.lt + | Cil_types.Gt -> comp Integer.gt + + | LAnd -> logic (&&) + | LOr -> logic (||) + + end + | None, _ | _, None -> None + +(* [t] is the argument of [\offset] *) +and constFoldToffset t = + match t.term_node with + | TStartOf (TVar v, offset) | TAddrOf (TVar v, offset) -> begin + try + let start, _width = bitsLogicOffset v.lv_type offset in + let size_char = Integer.eight in + if Integer.(is_zero (rem start size_char)) then + Some (Integer.div start size_char) + else None (* bitfields *) + with Cil.SizeOfError _ -> None + end + | _ -> None + +(* This function supposes that ~machdep is [true] *) +and bitsLogicOffset ltyp off : Integer.t * Integer.t = + let rec loopOff typ width start = function + | TNoOffset -> start, width + | TIndex(e, off) -> begin + let ei = match constFoldTermToInt e with + | Some i -> i + | None -> raise (SizeOfError ("Index is not constant", typ)) + in + let typ_e = Cil.typeOf_array_elem typ in + let size_e = Integer.of_int (Cil.bitsSizeOf typ_e) in + loopOff typ size_e (Integer.(add start (mul ei size_e))) off + end + | TField(f, off) -> + if f.fcomp.cstruct then begin + (* Force the computation of the fields fsize_in_bits and + foffset_in_bits *) + ignore (Cil.bitsOffset typ (Field (f, NoOffset))); + let size = Integer.of_int (Extlib.the f.fsize_in_bits) in + let offset_f = Integer.of_int (Extlib.the f.foffset_in_bits) in + loopOff f.ftype size (Integer.add start offset_f) off + end + else + (* All union fields start at offset 0 *) + loopOff f.ftype (Integer.of_int (Cil.bitsSizeOf f.ftype)) start off + | TModel _ -> raise (SizeOfError ("bitsLogicOffset on model field", typ)) + in + match unroll_type ltyp with + | Ctype typ -> loopOff typ Integer.zero Integer.zero off + | _ -> raise (SizeOfError ("bitsLogicOffset on logic type", Cil.voidPtrType)) + +(* Handle \min(\union(args)) or \max(\union(args)), depending on [f] *) +and constFoldMinMax ~machdep f args = + match args with + | [] -> None (* meaningless, cannot simplify *) + | arg :: args -> + let aux res t = + match res, constFoldTermToInt ~machdep t with + | None, _ | _, None -> None + | Some i, Some i' -> Some (f i i') + in + List.fold_left aux (constFoldTermToInt ~machdep arg) args + (* Local Variables: compile-command: "make -C ../../.." diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/logic_utils.mli frama-c-20150201+sodium+dfsg/cil/src/logic/logic_utils.mli --- frama-c-20140301+neon+dfsg/cil/src/logic/logic_utils.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/logic_utils.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -93,7 +93,7 @@ (** creates an AddrOf from a TLval. The given logic type is the type of the lval. - @since Neon-20130301 *) + @since Neon-20140301 *) val mk_logic_AddrOf: ?loc:Cil_types.location -> term_lval -> logic_type -> term (** [true] if the term is a pointer. *) @@ -128,7 +128,7 @@ val points_to_valid_string: ?loc:location -> term -> predicate named (** \points_to_valid_string - @since Neon-20130301 *) + @since Neon-20140301 *) (** {3 Conversion from exp to term}*) (** translates a C expression into an "equivalent" logical term. @@ -346,11 +346,16 @@ val extract_contract : code_annotation list -> (string list * funspec) list +(** {2 Constant folding} *) + +val constFoldTermToInt: ?machdep:bool -> term -> Integer.t option + + (** {2 Type-checking hackery} *) (** give complete types to terms that refer to a variable whose type has been completed after its use in an annotation. Internal use only. - @since Neon-20130301 *) + @since Neon-20140301 *) val complete_types: file -> unit (** {2 Parsing hackery} *) diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/utf8_logic.ml frama-c-20150201+sodium+dfsg/cil/src/logic/utf8_logic.ml --- frama-c-20140301+neon+dfsg/cil/src/logic/utf8_logic.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/utf8_logic.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/cil/src/logic/utf8_logic.mli frama-c-20150201+sodium+dfsg/cil/src/logic/utf8_logic.mli --- frama-c-20140301+neon+dfsg/cil/src/logic/utf8_logic.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/logic/utf8_logic.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/cil/src/machdep_ppc_32.ml frama-c-20150201+sodium+dfsg/cil/src/machdep_ppc_32.ml --- frama-c-20140301+neon+dfsg/cil/src/machdep_ppc_32.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/machdep_ppc_32.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,117 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -(* This module was generated automatically by code in Makefile and machdep.c *) -open Cil_types -let gcc = { -(* Generated by code in cil/src/machdep.c *) - version_major = 4; - version_minor = 0; - version = "4.0.1 (Apple Computer, Inc. build 5367)"; - sizeof_short = 2; - sizeof_int = 4; - sizeof_long = 4; - sizeof_longlong = 8; - sizeof_ptr = 4; - sizeof_float = 4; - sizeof_double = 8; - sizeof_longdouble = 16; - sizeof_void = 1; - sizeof_fun = 1; - size_t = "unsigned long"; - wchar_t = "int"; - ptrdiff_t = "int"; - alignof_short = 2; - alignof_int = 4; - alignof_long = 4; - alignof_longlong = 4; - alignof_ptr = 4; - alignof_float = 4; - alignof_double = 4; - alignof_longdouble = 16; - alignof_str = 1; - alignof_fun = 4; - alignof_aligned= 16; - char_is_unsigned = false; - const_string_literals = true; - little_endian = false; - underscore_name = false ; - has__builtin_va_list = true; - __thread_is_keyword = true; -} -let msvc = { -(* Generated by code in cil/src/machdep.c *) - version_major = 4; - version_minor = 0; - version = "4.0.1 (Apple Computer, Inc. build 5367)"; - sizeof_short = 2; - sizeof_int = 4; - sizeof_long = 4; - sizeof_longlong = 8; - sizeof_ptr = 4; - sizeof_float = 4; - sizeof_double = 8; - sizeof_longdouble = 16; - sizeof_void = 1; - sizeof_fun = 1; - size_t = "unsigned long"; - wchar_t = "int"; - ptrdiff_t = "int"; - alignof_short = 2; - alignof_int = 4; - alignof_long = 4; - alignof_longlong = 4; - alignof_ptr = 4; - alignof_float = 4; - alignof_double = 4; - alignof_longdouble = 16; - alignof_str = 1; - alignof_fun = 4; - alignof_aligned= 16; - char_is_unsigned = false; - const_string_literals = true; - little_endian = false; - underscore_name = true ; - has__builtin_va_list = false; - __thread_is_keyword = false; -} diff -Nru frama-c-20140301+neon+dfsg/cil/src/machdeps.ml frama-c-20150201+sodium+dfsg/cil/src/machdeps.ml --- frama-c-20140301+neon+dfsg/cil/src/machdeps.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/machdeps.ml 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,193 @@ +(****************************************************************************) +(* *) +(* Copyright (C) 2001-2003 *) +(* George C. Necula *) +(* Scott McPeak *) +(* Wes Weimer *) +(* Ben Liblit *) +(* All rights reserved. *) +(* *) +(* Redistribution and use in source and binary forms, with or without *) +(* modification, are permitted provided that the following conditions *) +(* are met: *) +(* *) +(* 1. Redistributions of source code must retain the above copyright *) +(* notice, this list of conditions and the following disclaimer. *) +(* *) +(* 2. Redistributions in binary form must reproduce the above copyright *) +(* notice, this list of conditions and the following disclaimer in the *) +(* documentation and/or other materials provided with the distribution. *) +(* *) +(* 3. The names of the contributors may not be used to endorse or *) +(* promote products derived from this software without specific prior *) +(* written permission. *) +(* *) +(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) +(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) +(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) +(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) +(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) +(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) +(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) +(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) +(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) +(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) +(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) +(* POSSIBILITY OF SUCH DAMAGE. *) +(* *) +(* File modified by CEA (Commissariat à l'énergie atomique et aux *) +(* énergies alternatives) *) +(* and INRIA (Institut National de Recherche en Informatique *) +(* et Automatique). *) +(****************************************************************************) + +open Cil_types + +let x86_16 = { + version = + "x86 16 bits mode (gcc like compiler) with big or huge memory model"; + compiler = "generic"; + sizeof_short = 2; + sizeof_int = 2; + sizeof_long = 4; + sizeof_longlong = 8; + sizeof_ptr = 4; + sizeof_float = 4; + sizeof_double = 8; + sizeof_longdouble = 16; + sizeof_void = 1; + sizeof_fun = 1; + size_t = "unsigned int"; + wchar_t = "int"; + ptrdiff_t = "int"; + alignof_short = 2; + alignof_int = 2; + alignof_long = 4; + alignof_longlong = 4; + alignof_ptr = 4; + alignof_float = 2; + alignof_double = 8; + alignof_longdouble = 16; + alignof_str = 1; + alignof_fun = 1; + alignof_aligned= 8; + (* I don't know if attribute aligned is supported by any 16bits + compiler. *) + char_is_unsigned = false; + const_string_literals = true; + little_endian = true; + underscore_name = true ; + has__builtin_va_list = true; + __thread_is_keyword = true; +} + +let gcc_x86_16 = { x86_16 with compiler = "gcc" } + +let x86_32 = { + version = "gcc 4.0.3 - X86-32bits mode"; + compiler = "generic"; + sizeof_short = 2; + sizeof_int = 4; + sizeof_long = 4; + sizeof_longlong = 8; + sizeof_ptr = 4; + sizeof_float = 4; + sizeof_double = 8; + sizeof_longdouble = 12; + sizeof_void = 1; + sizeof_fun = 1; + size_t = "unsigned int"; + wchar_t = "int"; + ptrdiff_t = "int"; + alignof_short = 2; + alignof_int = 4; + alignof_long = 4; + alignof_longlong = 4; + alignof_ptr = 4; + alignof_float = 4; + alignof_double = 4; + alignof_longdouble = 4; + alignof_str = 1; + alignof_fun = 1; + alignof_aligned= 16; + char_is_unsigned = false; + const_string_literals = true; + little_endian = true; + underscore_name = false ; + has__builtin_va_list = true; + __thread_is_keyword = true; +} + +let gcc_x86_32 = { x86_32 with compiler = "gcc" } + +let x86_64 = { + version = "gcc 4.0.3 AMD64"; + compiler = "generic"; + sizeof_short = 2; + sizeof_int = 4; + sizeof_long = 8; + sizeof_longlong = 8; + sizeof_ptr = 8; + sizeof_float = 4; + sizeof_double = 8; + sizeof_longdouble = 16; + sizeof_void = 1; + sizeof_fun = 1; + size_t = "unsigned long"; + wchar_t = "int"; + ptrdiff_t = "long"; + alignof_short = 2; + alignof_int = 4; + alignof_long = 8; + alignof_longlong = 8; + alignof_ptr = 8; + alignof_float = 4; + alignof_double = 8; + alignof_longdouble = 16; + alignof_str = 1; + alignof_fun = 1; + alignof_aligned= 16; + char_is_unsigned = false; + const_string_literals = true; + little_endian = true; + underscore_name = false ; + has__builtin_va_list = true; + __thread_is_keyword = true; +} + +let gcc_x86_64 = { x86_64 with compiler = "gcc" } + +let ppc_32 = { + version = "4.0.1 (Apple Computer, Inc. build 5367)"; + compiler = "standard"; + sizeof_short = 2; + sizeof_int = 4; + sizeof_long = 4; + sizeof_longlong = 8; + sizeof_ptr = 4; + sizeof_float = 4; + sizeof_double = 8; + sizeof_longdouble = 16; + sizeof_void = 1; + sizeof_fun = 1; + size_t = "unsigned long"; + wchar_t = "int"; + ptrdiff_t = "int"; + alignof_short = 2; + alignof_int = 4; + alignof_long = 4; + alignof_longlong = 4; + alignof_ptr = 4; + alignof_float = 4; + alignof_double = 4; + alignof_longdouble = 16; + alignof_str = 1; + alignof_fun = 4; + alignof_aligned= 16; + char_is_unsigned = false; + const_string_literals = true; + little_endian = false; + underscore_name = false ; + has__builtin_va_list = true; + __thread_is_keyword = true; +} diff -Nru frama-c-20140301+neon+dfsg/cil/src/machdeps.mli frama-c-20150201+sodium+dfsg/cil/src/machdeps.mli --- frama-c-20140301+neon+dfsg/cil/src/machdeps.mli 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/machdeps.mli 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,53 @@ +(****************************************************************************) +(* *) +(* Copyright (C) 2001-2003 *) +(* George C. Necula *) +(* Scott McPeak *) +(* Wes Weimer *) +(* Ben Liblit *) +(* All rights reserved. *) +(* *) +(* Redistribution and use in source and binary forms, with or without *) +(* modification, are permitted provided that the following conditions *) +(* are met: *) +(* *) +(* 1. Redistributions of source code must retain the above copyright *) +(* notice, this list of conditions and the following disclaimer. *) +(* *) +(* 2. Redistributions in binary form must reproduce the above copyright *) +(* notice, this list of conditions and the following disclaimer in the *) +(* documentation and/or other materials provided with the distribution. *) +(* *) +(* 3. The names of the contributors may not be used to endorse or *) +(* promote products derived from this software without specific prior *) +(* written permission. *) +(* *) +(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) +(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) +(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) +(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) +(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) +(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) +(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) +(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) +(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) +(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) +(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) +(* POSSIBILITY OF SUCH DAMAGE. *) +(* *) +(* File modified by CEA (Commissariat à l'énergie atomique et aux *) +(* énergies alternatives) *) +(* and INRIA (Institut National de Recherche en Informatique *) +(* et Automatique). *) +(****************************************************************************) + +(** Some predefined {!Cil_types.mach} which specifies machine-dependent + data about C programs. *) + +val x86_16: Cil_types.mach +val gcc_x86_16: Cil_types.mach +val x86_32: Cil_types.mach +val gcc_x86_32: Cil_types.mach +val x86_64: Cil_types.mach +val gcc_x86_64: Cil_types.mach +val ppc_32: Cil_types.mach diff -Nru frama-c-20140301+neon+dfsg/cil/src/machdep_x86_16.ml frama-c-20150201+sodium+dfsg/cil/src/machdep_x86_16.ml --- frama-c-20140301+neon+dfsg/cil/src/machdep_x86_16.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/machdep_x86_16.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,127 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -open Cil_types -let gcc = { -(* Generated by code in cil/src/machdep.c *) - version_major = 1; - version_minor = 0; - version = - "x86 16 bits mode (gcc like compiler) with big or huge memory model"; - sizeof_short = 2; - sizeof_int = 2; - sizeof_long = 4; - sizeof_longlong = 8; - sizeof_ptr = 4; - sizeof_float = 4; - sizeof_double = 8; - sizeof_longdouble = 16; - (*sizeof_wchar = 4;*) - (*sizeof_sizeof = 4;*) - sizeof_void = 1; - sizeof_fun = 1; - alignof_short = 2; - alignof_int = 2; - alignof_long = 4; - alignof_longlong = 4; - alignof_ptr = 4; - alignof_float = 4; - alignof_double = 8; - alignof_longdouble = 16; - alignof_str = 1; - alignof_fun = 1; - alignof_aligned= 8; - (* I don't know if attribute aligned is supported by any 16bits - compiler. *) - char_is_unsigned = false; - const_string_literals = true; - little_endian = true; - underscore_name = true ; - size_t = "unsigned int"; - wchar_t = "int"; - ptrdiff_t = "int"; - has__builtin_va_list = true; - __thread_is_keyword = true; -} - -let msvc = { -(* Generated by code in cil/src/machdep.c *) - version_major = 1; - version_minor = 0; - version = - "x86 16 bits mode (msvc like compiler) with big or huge memory model"; - sizeof_short = 2; - sizeof_int = 2; - sizeof_long = 4; - sizeof_longlong = 8; - sizeof_ptr = 4; - sizeof_float = 4; - sizeof_double = 8; - sizeof_longdouble = 16; - (*sizeof_wchar = 4;*) - (*sizeof_sizeof = 4;*) - sizeof_void = 1; - sizeof_fun = 1; - alignof_short = 2; - alignof_int = 2; - alignof_long = 4; - alignof_longlong = 4; - alignof_ptr = 4; - alignof_float = 4; - alignof_double = 8; - alignof_longdouble = 16; - alignof_str = 1; - alignof_fun = 1; - alignof_aligned= 8; - (* I don't know if attribute aligned is supported by any 16bits - compiler. *) - char_is_unsigned = false; - const_string_literals = true; - little_endian = true; - underscore_name = true ; - size_t = "unsigned int"; - wchar_t = "int"; - ptrdiff_t = "int"; - has__builtin_va_list = false; - __thread_is_keyword = false; -} diff -Nru frama-c-20140301+neon+dfsg/cil/src/machdep_x86_16.mli frama-c-20150201+sodium+dfsg/cil/src/machdep_x86_16.mli --- frama-c-20140301+neon+dfsg/cil/src/machdep_x86_16.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/machdep_x86_16.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -val gcc : Cil_types.mach -val msvc : Cil_types.mach diff -Nru frama-c-20140301+neon+dfsg/cil/src/machdep_x86_32.ml frama-c-20150201+sodium+dfsg/cil/src/machdep_x86_32.ml --- frama-c-20140301+neon+dfsg/cil/src/machdep_x86_32.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/machdep_x86_32.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,118 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -open Cil_types - -let gcc = { -(* Generated by code in cil/src/machdep.c *) - version_major = 4; - version_minor = 0; - version = "gcc 4.0.3 - X86-32bits mode"; - sizeof_short = 2; - sizeof_int = 4; - sizeof_long = 4; - sizeof_longlong = 8; - sizeof_ptr = 4; - sizeof_float = 4; - sizeof_double = 8; - sizeof_longdouble = 12; - sizeof_void = 1; - sizeof_fun = 1; - size_t = "unsigned int"; - wchar_t = "int"; - ptrdiff_t = "int"; - alignof_short = 2; - alignof_int = 4; - alignof_long = 4; - alignof_longlong = 4; - alignof_ptr = 4; - alignof_float = 4; - alignof_double = 4; - alignof_longdouble = 4; - alignof_str = 1; - alignof_fun = 1; - alignof_aligned= 16; - char_is_unsigned = false; - const_string_literals = true; - little_endian = true; - underscore_name = false ; - has__builtin_va_list = true; - __thread_is_keyword = true; -} - -let msvc = { -(* Generated by code in cil/src/machdep.c *) - version_major = 4; - version_minor = 0; - version = "4.0.3 (Ubuntu 4.0.3-1ubuntu5)"; - sizeof_short = 2; - sizeof_int = 4; - sizeof_long = 4; - sizeof_longlong = 8; - sizeof_ptr = 4; - sizeof_float = 4; - sizeof_double = 8; - sizeof_longdouble = 12; - sizeof_void = 1; - sizeof_fun = 1; - size_t = "unsigned int"; - wchar_t = "int"; - ptrdiff_t = "int"; - alignof_short = 2; - alignof_int = 4; - alignof_long = 4; - alignof_longlong = 4; - alignof_ptr = 4; - alignof_float = 4; - alignof_double = 4; - alignof_longdouble = 4; - alignof_str = 1; - alignof_fun = 1; - char_is_unsigned = false; - alignof_aligned= 16; - const_string_literals = true; - little_endian = true; - underscore_name = true ; - has__builtin_va_list = false; - __thread_is_keyword = false; -} diff -Nru frama-c-20140301+neon+dfsg/cil/src/machdep_x86_32.mli frama-c-20150201+sodium+dfsg/cil/src/machdep_x86_32.mli --- frama-c-20140301+neon+dfsg/cil/src/machdep_x86_32.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/machdep_x86_32.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -val gcc : Cil_types.mach -val msvc : Cil_types.mach diff -Nru frama-c-20140301+neon+dfsg/cil/src/machdep_x86_64.ml frama-c-20150201+sodium+dfsg/cil/src/machdep_x86_64.ml --- frama-c-20140301+neon+dfsg/cil/src/machdep_x86_64.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/machdep_x86_64.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,117 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -open Cil_types - -let gcc = { -(* Generated by code in cil/src/machdep.c *) - version_major = 4; - version_minor = 0; - version = "gcc 4.0.3 AMD64"; - sizeof_short = 2; - sizeof_int = 4; - sizeof_long = 8; - sizeof_longlong = 8; - sizeof_ptr = 8; - sizeof_float = 4; - sizeof_double = 8; - sizeof_longdouble = 16; - sizeof_void = 1; - sizeof_fun = 1; - size_t = "unsigned long"; - wchar_t = "int"; - ptrdiff_t = "long"; - alignof_short = 2; - alignof_int = 4; - alignof_long = 8; - alignof_longlong = 8; - alignof_ptr = 8; - alignof_float = 4; - alignof_double = 8; - alignof_longdouble = 16; - alignof_str = 1; - alignof_fun = 1; - alignof_aligned= 16; - char_is_unsigned = false; - const_string_literals = true; - little_endian = true; - underscore_name = false ; - has__builtin_va_list = true; - __thread_is_keyword = true; -} -let msvc = { -(* Generated by code in cil/src/machdep.c *) - version_major = 4; - version_minor = 0; - version = "4.0.3 (Ubuntu 4.0.3-1ubuntu5)"; - sizeof_short = 2; - sizeof_int = 4; - sizeof_long = 8; - sizeof_longlong = 8; - sizeof_ptr = 8; - sizeof_float = 4; - sizeof_double = 8; - sizeof_longdouble = 16; - sizeof_void = 1; - sizeof_fun = 1; - size_t = "unsigned long"; - wchar_t = "int"; - ptrdiff_t = "int"; - alignof_short = 2; - alignof_int = 4; - alignof_long = 8; - alignof_longlong = 8; - alignof_ptr = 8; - alignof_float = 4; - alignof_double = 8; - alignof_longdouble = 16; - alignof_str = 1; - alignof_fun = 1; - alignof_aligned= 16; - char_is_unsigned = false; - const_string_literals = true; - little_endian = true; - underscore_name = true ; - has__builtin_va_list = false; - __thread_is_keyword = false; -} diff -Nru frama-c-20140301+neon+dfsg/cil/src/machdep_x86_64.mli frama-c-20150201+sodium+dfsg/cil/src/machdep_x86_64.mli --- frama-c-20140301+neon+dfsg/cil/src/machdep_x86_64.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/machdep_x86_64.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -(****************************************************************************) -(* *) -(* Copyright (C) 2001-2003 *) -(* George C. Necula *) -(* Scott McPeak *) -(* Wes Weimer *) -(* Ben Liblit *) -(* All rights reserved. *) -(* *) -(* Redistribution and use in source and binary forms, with or without *) -(* modification, are permitted provided that the following conditions *) -(* are met: *) -(* *) -(* 1. Redistributions of source code must retain the above copyright *) -(* notice, this list of conditions and the following disclaimer. *) -(* *) -(* 2. Redistributions in binary form must reproduce the above copyright *) -(* notice, this list of conditions and the following disclaimer in the *) -(* documentation and/or other materials provided with the distribution. *) -(* *) -(* 3. The names of the contributors may not be used to endorse or *) -(* promote products derived from this software without specific prior *) -(* written permission. *) -(* *) -(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *) -(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *) -(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *) -(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *) -(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *) -(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *) -(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *) -(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *) -(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *) -(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *) -(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *) -(* POSSIBILITY OF SUCH DAMAGE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives) *) -(* and INRIA (Institut National de Recherche en Informatique *) -(* et Automatique). *) -(****************************************************************************) - -val gcc : Cil_types.mach -val msvc : Cil_types.mach diff -Nru frama-c-20140301+neon+dfsg/cil/src/mergecil.ml frama-c-20150201+sodium+dfsg/cil/src/mergecil.ml --- frama-c-20140301+neon+dfsg/cil/src/mergecil.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/mergecil.ml 2015-05-29 15:31:43.000000000 +0000 @@ -77,7 +77,7 @@ (* The default value has been changed to false after Boron to fix bts#524. But this behavior is very convenient to parse the Linux kernel. *) let mergeInlinesWithAlphaConvert () = - mergeInlines && Kernel.AgressiveMerging.get () + mergeInlines && Kernel.AggressiveMerging.get () (* when true, merge duplicate definitions of externally-visible functions; @@ -85,7 +85,6 @@ * but only probabilistically accurate *) let mergeGlobals = true - (* Return true if 's' starts with the prefix 'p' *) let prefix p s = let lp = String.length p in @@ -461,9 +460,8 @@ end) let same_int64 e1 e2 = - match (constFold true e1).enode, (constFold true e2).enode with - | Const(CInt64(i, _, _)), Const(CInt64(i', _, _)) -> - Integer.equal i i' + match constFoldToInt e1, constFoldToInt e2 with + | Some i, Some i' -> Integer.equal i i' | _ -> false let compare_int e1 e2 = @@ -830,7 +828,7 @@ else (* GCC allows a function definition to have a more precise integer * type than a prototype that says "int" *) - if not theMachine.msvcMode && oldk = IInt && bitsSizeOf t <= 32 + if Cil.gccMode () && oldk = IInt && bitsSizeOf t <= 32 && (what = CombineFunarg || what = CombineFunret) then k @@ -849,8 +847,8 @@ if oldk == k then oldk else (* GCC allows a function definition to have a more precise integer * type than a prototype that says "double" *) - if not theMachine.msvcMode && oldk = FDouble && k = FFloat - && (what = CombineFunarg || what = CombineFunret) + if Cil.gccMode () && oldk = FDouble && k = FFloat && + (what = CombineFunarg || what = CombineFunret) then k else @@ -1390,8 +1388,8 @@ (* We do not want to turn non-"const" globals into "const" one. That * can happen if one file declares the variable a non-const while * others declare it as "const". *) - if hasAttribute "const" (typeAttrs vi.vtype) != - hasAttribute "const" (typeAttrs oldvi.vtype) then begin + if typeHasAttribute "const" vi.vtype != + typeHasAttribute "const" oldvi.vtype then begin Cil.update_var_type newrep.ndata (typeRemoveAttributes ["const"] newtype); end else Cil.update_var_type newrep.ndata newtype; @@ -2061,6 +2059,11 @@ 67 + 83*(stmtListSum b.bstmts) + 97*(stmtListSum h.bstmts) | TryFinally (b, h, _) -> 103 + 113*(stmtListSum b.bstmts) + 119*(stmtListSum h.bstmts) + | Throw(_,_) -> 137 + | TryCatch (b,l,_) -> + 139 + 149*(stmtListSum b.bstmts) + + 151 * + (List.fold_left (fun acc (_,b) -> acc + stmtListSum b.bstmts) 0 l) in (* disabled 2nd and 3rd measure because they appear to get different @@ -2336,6 +2339,7 @@ (* We apply the renaming *) let vi = processVarinfo fdec.svar l in if fdec.svar != vi then begin + Kernel.debug ~dkey "%s: %d -> %d" vi.vname fdec.svar.vid vi.vid; (try add_alpha_renaming vi (Cil.getFormalsDecl vi) fdec.sformals with Not_found -> ()); fdec.svar <- vi @@ -2360,6 +2364,10 @@ [], false end in + let defn_formals = + try Some (Cil.getFormalsDecl fdec.svar) + with Not_found -> None + in if foundthem then begin let _argl = argsToList args in if List.length oldnames <> List.length fdec.sformals then @@ -2482,7 +2490,15 @@ let curSum = (functionChecksum fdec') in try let _prevFun, prevLoc, prevSum = - (H.find emittedFunDefn fdec'.svar.vname) in + (H.find emittedFunDefn fdec'.svar.vname) + in + (* restore old binding for vi, as we are about to drop + the new definition and its formals. + *) + Cil_datatype.Varinfo.Hashtbl.remove formals_renaming vi; + (* Restore the formals from the old definition. We always have + Some l from getFormalsDecl in case of a defined function. *) + Cil.setFormals fdec (Extlib.the defn_formals); (* previous was found *) if (curSum = prevSum) then Kernel.warning ~current:true @@ -2699,6 +2715,12 @@ let global_merge_spec g = Kernel.debug ~dkey "Merging global %a" Cil_printer.pp_global g; + let rename v spec = + try + let alpha = Cil_datatype.Varinfo.Hashtbl.find formals_renaming v in + ignore (visitCilFunspec alpha spec) + with Not_found -> () + in match g with | GFun(fdec,loc) -> (try @@ -2707,21 +2729,19 @@ let specs = Cil_datatype.Varinfo.Hashtbl.find spec_to_merge fdec.svar in List.iter (fun s -> - Kernel.debug ~dkey "Found spec to merge %a" Cil_printer.pp_funspec s) + Kernel.debug ~dkey "Found spec to merge %a" Cil_printer.pp_funspec s; + rename fdec.svar s; + Kernel.debug ~dkey "After renaming:@\n%a" Cil_printer.pp_funspec s) specs; Kernel.debug ~dkey "Merging with %a" Cil_printer.pp_funspec fdec.sspec ; Cil.CurrentLoc.set loc; + rename fdec.svar fdec.sspec; merge_specs fdec.sspec specs - with Not_found -> - Kernel.debug ~dkey "No spec_to_merge") + with Not_found -> + Kernel.debug ~dkey "No spec_to_merge"; + rename fdec.svar fdec.sspec) | GVarDecl(spec,v,loc) -> Kernel.debug ~dkey "Merging global declaration %a" Cil_printer.pp_global g; - let rename spec = - try - let alpha = Cil_datatype.Varinfo.Hashtbl.find formals_renaming v in - ignore (visitCilFunspec alpha spec) - with Not_found -> () - in (try let specs = Cil_datatype.Varinfo.Hashtbl.find spec_to_merge v in List.iter @@ -2729,17 +2749,17 @@ Kernel.debug ~dkey "Found spec to merge %a" Cil_printer.pp_funspec s) specs; Kernel.debug "Renaming %a" Cil_printer.pp_funspec spec ; - rename spec; + rename v spec; (* The registered specs might also need renaming up to definition's formals instead of declaration's ones. *) - List.iter rename specs; + List.iter (rename v) specs; Kernel.debug ~dkey "Renamed to %a" Cil_printer.pp_funspec spec; Cil.CurrentLoc.set loc; merge_specs spec specs; Kernel.debug ~dkey "Merged into %a" Cil_printer.pp_funspec spec ; with Not_found -> Kernel.debug ~dkey "No spec_to_merge for declaration" ; - rename spec; + rename v spec; Kernel.debug ~dkey "Renamed to %a" Cil_printer.pp_funspec spec ; ) | _ -> () diff -Nru frama-c-20140301+neon+dfsg/cil/src/rmtmps.ml frama-c-20150201+sodium+dfsg/cil/src/rmtmps.ml --- frama-c-20140301+neon+dfsg/cil/src/rmtmps.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/cil/src/rmtmps.ml 2015-05-29 15:31:43.000000000 +0000 @@ -314,43 +314,43 @@ *) let isExportedRoot global = - let result, _reason = match global with + let name, result, reason = match global with | GVar ({vstorage = Static} as v, _, _) when Cil.hasAttribute "FC_BUILTIN" v.vattr -> - true, "FC_BUILTIN attribute" - | GVar ({vstorage = Static}, _, _) -> false, "static variable" - | GVar _ -> - true, "non-static variable" + v.vname, true, "FC_BUILTIN attribute" + | GVar ({vstorage = Static; vname}, _, _) -> vname, false, "static variable" + | GVar (v,_,_) -> + v.vname, true, "non-static variable" | GFun ({svar = v}, _) -> begin if hasExportingAttribute v then - true, "constructor or destructor function" + v.vname,true, "constructor or destructor function" else if v.vstorage = Static then - not !rmUnusedStatic, "static function" + v.vname, not !rmUnusedStatic, "static function" else if v.vinline && v.vstorage != Extern - && (theMachine.msvcMode || !rmUnusedInlines) then - false, "inline function" + && (Cil.msvcMode () || !rmUnusedInlines) then + v.vname, false, "inline function" else - true, "other function" + v.vname, true, "other function" end | GVarDecl(_,v,_) when hasAttribute "alias" v.vattr -> - true, "has GCC alias attribute" + v.vname, true, "has GCC alias attribute" | GVarDecl(_,v,_) when hasAttribute "FC_BUILTIN" v.vattr -> - true, "has FC_BUILTIN attribute" - | GAnnot _ -> true, "global annotation" + v.vname, true, "has FC_BUILTIN attribute" + | GAnnot _ -> "", true, "global annotation" | GType (t, _) when Cil.hasAttribute "FC_BUILTIN" (Cil.typeAttr t.ttype) -> - true, "has FC_BUILTIN attribute" + t.tname, true, "has FC_BUILTIN attribute" | GCompTag (c,_) | GCompTagDecl (c,_) when Cil.hasAttribute "FC_BUILTIN" c.cattr -> - true, "has FC_BUILTIN attribute" + c.cname, true, "has FC_BUILTIN attribute" | GEnumTag (e, _) | GEnumTagDecl (e,_) when Cil.hasAttribute "FC_BUILTIN" e.eattr -> - true, "has FC_BUILTIN attribute" + e.ename, true, "has FC_BUILTIN attribute" | _ -> - false, "neither function nor variable nor annotation" + "", false, "neither function nor variable nor annotation" in - (* trace (dprintf "isExportedRoot %a -> %b, %s@!" - d_shortglobal global result reason);*) + Kernel.debug + ~dkey "isExportedRoot %s -> %B, %s" name result reason; result @@ -417,7 +417,7 @@ SkipChildren method! vinst = function - Asm (_, tmpls, _, _, _, _,_) when theMachine.msvcMode -> + | Asm (_, tmpls, _, _, _, _,_) when Cil.msvcMode () -> (* If we have inline assembly on MSVC, we cannot tell which locals * are referenced. Keep thsem all *) (match !currentFunc with diff -Nru frama-c-20140301+neon+dfsg/config.h.in frama-c-20150201+sodium+dfsg/config.h.in --- frama-c-20140301+neon+dfsg/config.h.in 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/config.h.in 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -49,3 +49,9 @@ #undef TYPE_WCHAR_T #undef TYPE_PTRDIFF_T + +#undef HAVE_BUILTIN_VA_LIST + +#undef THREAD_IS_KEYWORD + +#undef UNDERSCORE_NAME diff -Nru frama-c-20140301+neon+dfsg/configure frama-c-20150201+sodium+dfsg/configure --- frama-c-20140301+neon+dfsg/configure 2014-03-12 15:07:57.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/configure 2015-06-01 13:17:44.000000000 +0000 @@ -627,6 +627,7 @@ EXTERNAL_PLUGINS FC_MCPP DEFAULT_CPP_KEEP_COMMENTS +FRAMAC_GNU_CPP FRAMAC_DEFAULT_CPP LOCAL_MACHDEP CYCLES_PER_USEC @@ -688,8 +689,8 @@ ENABLE_SEMANTIC_CALLGRAPH DYNAMIC_SCOPE ENABLE_SCOPE -DYNAMIC_RTE_ANNOTATION -ENABLE_RTE_ANNOTATION +DYNAMIC_RTEGEN +ENABLE_RTEGEN DYNAMIC_POSTDOMINATORS ENABLE_POSTDOMINATORS DYNAMIC_PDG @@ -779,10 +780,11 @@ enable_option_checking enable_verbosemake enable_unsupported_ocaml -with_ocamlgraph enable_local_ocamlgraph +with_ocamlgraph enable_zarith with_cc +enable_localmachdep enable_mcpp with_cpp with_all_static @@ -796,7 +798,7 @@ enable_occurrence enable_pdg enable_postdominators -enable_rte_annotation +enable_rtegen enable_scope enable_semantic_callgraph enable_slicing @@ -1436,8 +1438,11 @@ --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-verbosemake verbose makefile commands --enable-unsupported-ocaml attempt to compile even against unsupported ocaml version - --enable-local-ocamlgraph allow the user to use the local OcamlGraph version + --enable-local-ocamlgraph force the user to use the local OcamlGraph version. + --disable-local-ocamlgraph force the user to use an installed OCamlGraph version. + --enable-zarith= use ZArith library + --enable-localmachdep enable local machdep configuration --enable-mcpp use Frama-C's mcpp --enable-semantic_constant_folding support for constant propagation plugin (default: yes) @@ -1449,7 +1454,7 @@ --enable-occurrence support for occurrence analysis (default: yes) --enable-pdg support for pdg plugin (default: yes) --enable-postdominators support for postdominators plugin (default: yes) - --enable-rte_annotation support for runtime error annotation (default: yes) + --enable-rtegen support for runtime error annotation (default: yes) --enable-scope support for scope plugin (default: yes) --enable-semantic_callgraph support for semantic callgraph (default: yes) @@ -2271,7 +2276,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # @@ -2366,6 +2371,13 @@ + +# Usage: plugin_disable([plugin],[reason]) + + + + + # Implementation of an ordering $1 < $2: "" < yes < partial < no lt_mark () { first=`echo "$1" | sed -e 's/ .*//' ` @@ -2754,6 +2766,8 @@ exit 2;; 3.12.0*) echo "${ECHO_T}Incompatible version! Use at least OCaml 3.12.1."; exit 2;; + 4.02.0*) echo "${ECHO_T}Incompatible version. Use OCaml 4.02.1."; + exit 2;; 4.*) OCAML_ANNOT_OPTION="-annot -bin-annot";; *) echo "${ECHO_T}Incompatible version!"; exit 2;; esac @@ -3442,6 +3456,15 @@ OCAMLGRAPH_INCLUDE= OCAMLGRAPH_CUSTOM=no +# allow local ocamlgraph +# Check whether --enable-local-ocamlgraph was given. +if test "${enable_local_ocamlgraph+set}" = set; then : + enableval=$enable_local_ocamlgraph; ENABLE_LOCAL_OCAMLGRAPH=$enableval +else + ENABLE_LOCAL_OCAMLGRAPH=auto +fi + + # Check whether --with-ocamlgraph was given. if test "${with_ocamlgraph+set}" = set; then : @@ -3450,10 +3473,11 @@ fi -if test "$OCAMLFIND" = "no" -o "$OCAMLGRAPH_CUSTOM" = "yes"; then +if test "$ENABLE_LOCAL_OCAMLGRAPH" != "yes"; then + if test "$OCAMLFIND" = "no" -o "$OCAMLGRAPH_CUSTOM" = "yes"; then -# check if any ocamlgraph is installed in the right place - as_ac_File=`$as_echo "ac_cv_file_$OCAMLGRAPH_HOME/graph.$OBJ_SUFFIX" | $as_tr_sh` + # check if any ocamlgraph is installed in the right place + as_ac_File=`$as_echo "ac_cv_file_$OCAMLGRAPH_HOME/graph.$OBJ_SUFFIX" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $OCAMLGRAPH_HOME/graph.$OBJ_SUFFIX" >&5 $as_echo_n "checking for $OCAMLGRAPH_HOME/graph.$OBJ_SUFFIX... " >&6; } if eval \${$as_ac_File+:} false; then : @@ -3475,87 +3499,86 @@ fi - if test "$OCAMLGRAPH_EXISTS"="no" -a "$OCAMLGRAPH_CUSTOM" = "yes"; then - as_fn_error $? "unable to find OCamlGraph in custom location $OCAMLGRAPH_HOME. - Please give an appropriate value, or use default OCamlGraph library" "$LINENO" 5; - fi -else - OCAMLGRAPH_HOME=$($OCAMLFIND query ocamlgraph 2>/dev/null \ - | tr -d '\r\n'); - if test "$OCAMLGRAPH_HOME" != ""; then - OCAMLGRAPH_INCLUDE="-I $OCAMLGRAPH_HOME"; - OCAMLGRAPH_EXISTS="yes"; + if test "$OCAMLGRAPH_EXISTS" = "no" -a "$OCAMLGRAPH_CUSTOM" = "yes"; then + as_fn_error $? "unable to find OCamlGraph in custom location $OCAMLGRAPH_HOME. + Please give an appropriate value, or use default OCamlGraph library" "$LINENO" 5; + fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: no package ocamlgraph in ocamlfind" >&5 + OCAMLGRAPH_HOME=$($OCAMLFIND query ocamlgraph 2>/dev/null \ + | tr -d '\r\n'); + if test "$OCAMLGRAPH_HOME" != ""; then + OCAMLGRAPH_INCLUDE="-I $OCAMLGRAPH_HOME"; + OCAMLGRAPH_EXISTS="yes"; + else + { $as_echo "$as_me:${as_lineno-$LINENO}: no package ocamlgraph in ocamlfind" >&5 $as_echo "$as_me: no package ocamlgraph in ocamlfind" >&6;} - fi; -fi + fi; + fi -ocamlgraph_error() { - if test "$OCAMLGRAPH_CUSTOM" = "yes"; then - as_fn_error $? "Custom OCamlGraph library version $OCAMLGRAPH_VERSION is incompatible with - Frama-C. Please provide another location or use default OCamlGraph" "$LINENO" 5; - else - { $as_echo "$as_me:${as_lineno-$LINENO}: OcamlGraph $OCAMLGRAPH_VERSION is incompatible with Frama-C." >&5 + + ocamlgraph_error() { + if test "$OCAMLGRAPH_CUSTOM" = "yes"; then + as_fn_error $? "Custom OCamlGraph library version $OCAMLGRAPH_VERSION is incompatible with + Frama-C. Please provide another location or use default OCamlGraph" "$LINENO" 5; + else + { $as_echo "$as_me:${as_lineno-$LINENO}: OcamlGraph $OCAMLGRAPH_VERSION is incompatible with Frama-C." >&5 $as_echo "$as_me: OcamlGraph $OCAMLGRAPH_VERSION is incompatible with Frama-C." >&6;} - OCAMLGRAPH_EXISTS=no - OCAMLGRAPH_INCLUDE= - :; - fi -} + OCAMLGRAPH_EXISTS=no + OCAMLGRAPH_INCLUDE= + :; + fi + } -# if any, check if it is a compatible version -if test "$OCAMLGRAPH_EXISTS" = "yes"; then - test_ocamlgraph_version='print_string Graph.Version.version;;' - echo $test_ocamlgraph_version > test_ocamlgraph.ml - if $OCAMLC -o test_ocamlgraph $OCAMLGRAPH_INCLUDE graph.cmo \ - test_ocamlgraph.ml 2> /dev/null; \ - then - OCAMLGRAPH_VERSION=`./test_ocamlgraph` - case $OCAMLGRAPH_VERSION in - 1.8.1) ocamlgraph_error;; - 1.8.2) ocamlgraph_error;; - 1.8.3) ocamlgraph_error;; - 1.8.4) { $as_echo "$as_me:${as_lineno-$LINENO}: OcamlGraph $OCAMLGRAPH_VERSION found: great!" >&5 + # if any, check if it is a compatible version + if test "$OCAMLGRAPH_EXISTS" = "yes"; then + test_ocamlgraph_version='print_string Graph.Version.version;;' + echo $test_ocamlgraph_version > test_ocamlgraph.ml + if $OCAMLC -o test_ocamlgraph $OCAMLGRAPH_INCLUDE graph.cmo \ + test_ocamlgraph.ml 2> /dev/null; \ + then + OCAMLGRAPH_VERSION=`./test_ocamlgraph` + case $OCAMLGRAPH_VERSION in + 1.8.1 | 1.8.1+dev \ + | 1.8.2 | 1.8.2+dev \ + | 1.8.3 | 1.8.3+dev \ + | 1.8.4 | 1.8.4+dev) + ocamlgraph_error;; + 1.8.5 | 1.8.6) + { $as_echo "$as_me:${as_lineno-$LINENO}: OcamlGraph $OCAMLGRAPH_VERSION found: great!" >&5 $as_echo "$as_me: OcamlGraph $OCAMLGRAPH_VERSION found: great!" >&6;};; - 1.8.*) { $as_echo "$as_me:${as_lineno-$LINENO}: OcamlGraph $OCAMLGRAPH_VERSION > 1.8.4 found: should be compatible, but no warranty. Use it at your own risk!" >&5 -$as_echo "$as_me: OcamlGraph $OCAMLGRAPH_VERSION > 1.8.4 found: should be compatible, but no warranty. Use it at your own risk!" >&6;};; - *) ocamlgraph_error;; - esac - if test "$OCAMLGRAPH_EXISTS" = "yes"; then # current version is ok - if test "$OCAMLBEST" = "opt"; then - if $OCAMLOPT -o test_ocamlgraph $OCAMLGRAPH_INCLUDE graph.cmxa \ - test_ocamlgraph.ml 2> /dev/null; \ - then - { $as_echo "$as_me:${as_lineno-$LINENO}: OcamlGraph native version is ok" >&5 + 1.8.*) + { $as_echo "$as_me:${as_lineno-$LINENO}: OcamlGraph $OCAMLGRAPH_VERSION > 1.8.5 found: should be compatible, but no warranty. + Consider using --enable-local-ocamlgraph." >&5 +$as_echo "$as_me: OcamlGraph $OCAMLGRAPH_VERSION > 1.8.5 found: should be compatible, but no warranty. + Consider using --enable-local-ocamlgraph." >&6;};; + *) ocamlgraph_error;; + esac + if test "$OCAMLGRAPH_EXISTS" = "yes"; then # current version is ok + if test "$OCAMLBEST" = "opt"; then + if $OCAMLOPT -o test_ocamlgraph $OCAMLGRAPH_INCLUDE graph.cmxa \ + test_ocamlgraph.ml 2> /dev/null; \ + then + { $as_echo "$as_me:${as_lineno-$LINENO}: OcamlGraph native version is ok" >&5 $as_echo "$as_me: OcamlGraph native version is ok" >&6;} - else - { $as_echo "$as_me:${as_lineno-$LINENO}: OcamlGraph native version is not ok" >&5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: OcamlGraph native version is not ok" >&5 $as_echo "$as_me: OcamlGraph native version is not ok" >&6;} + ocamlgraph_error + fi + else ocamlgraph_error fi - else - ocamlgraph_error fi + else + ocamlgraph_error fi - else - ocamlgraph_error + rm -f test_ocamlgraph test_ocamlgraph.ml test_ocamlgraph.cm* fi - rm -f test_ocamlgraph test_ocamlgraph.ml test_ocamlgraph.cm* -fi - -# allow local ocamlgraph -# Check whether --enable-local-ocamlgraph was given. -if test "${enable_local_ocamlgraph+set}" = set; then : - enableval=$enable_local_ocamlgraph; ENABLE_LOCAL_OCAMLGRAPH=$enableval -else - ENABLE_LOCAL_OCAMLGRAPH=yes -fi - +fi; # ENABLE_LOCAL_OCAMLGRAPH != yes # revert back to local version of ocamlgraph if test "$OCAMLGRAPH_EXISTS" = "no"; then - if test "$ENABLE_LOCAL_OCAMLGRAPH" = "yes"; then + if test "$ENABLE_LOCAL_OCAMLGRAPH" != "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: switching to OcamlGraph provided by Frama-C" >&5 $as_echo "$as_me: switching to OcamlGraph provided by Frama-C" >&6;} OCAMLGRAPH_LOCAL=ocamlgraph @@ -5109,6 +5132,13 @@ # Local machdep feature (to generate new platforms) +# Check whether --enable-localmachdep was given. +if test "${enable_localmachdep+set}" = set; then : + enableval=$enable_localmachdep; LOCAL_MACHDEP=$enableval +else + LOCAL_MACHDEP=no +fi + if test "$LOCAL_MACHDEP" = yes ; then @@ -5198,6 +5228,13 @@ HAVE_BUILTIN_VA_LIST=false fi +if test "$HAVE_BUILTIN_VA_LIST" = "true" ;then + cat >>confdefs.h <<_ACEOF +#define HAVE_BUILTIN_VA_LIST 1 +_ACEOF + +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if __thread is a keyword" >&5 $as_echo_n "checking if __thread is a keyword... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -5212,6 +5249,12 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $THREAD_IS_KEYWORD" >&5 $as_echo "$THREAD_IS_KEYWORD" >&6; } +if test "$THREAD_IS_KEYWORD" = "true" ;then + cat >>confdefs.h <<_ACEOF +#define THREAD_IS_KEYWORD 1 +_ACEOF + +fi # Does gcc add underscores to identifiers to make assembly labels? # (I think MSVC always does) @@ -5230,6 +5273,12 @@ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNDERSCORE_NAME" >&5 $as_echo "$UNDERSCORE_NAME" >&6; } +if test "$UNDERSCORE_NAME" = "true" ;then + cat >>confdefs.h <<_ACEOF +#define UNDERSCORE_NAME 1 +_ACEOF + +fi fi # local machdep configuration @@ -5273,14 +5322,161 @@ # $CC. Note that we want to keep comments in the output, so that AC_PROG_CPP # alone is not sufficient. if test -z "$FRAMAC_DEFAULT_CPP"; then -# We should use AC_CHECK_PROG_CPP, but then we would end up with a slightly -# different command line than before for pre-processing (swapping -C and -E) -# and since we have the brilliant idea to put this command line in our -# test oracles, changing that would be painful. - CPP=$CC - CPPFLAGS="-C -E -I."; + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + CPPFLAGS="-C -I."; + if test -n "$GCC"; then FRAMAC_GNU_CPP=true; else FRAMAC_GNU_CPP=false; fi else CPP=$FRAMAC_DEFAULT_CPP; + FRAMAC_GNU_CPP=true; + CPPFLAGS="-dD -nostdinc" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define foo 0 + /* foo */ + +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + FRAMAC_GNU_CPP=true +else + FRAMAC_GNU_CPP=false +fi +rm -f conftest.err conftest.i conftest.$ac_ext CPPFLAGS= fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -5288,21 +5484,32 @@ /* Check whether comments are kept in output */ _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : - if grep -e kept conftest.i; then + if test -e conftest.i; then + if grep -e kept conftest.i; then FRAMAC_DEFAULT_CPP="$CPP $CPPFLAGS"; DEFAULT_CPP_KEEP_COMMENTS=true; else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Default pre-processing command '$CPP' do not preserve - comments. Please use define an appropriate pre-processor + comments. Please define an appropriate pre-processor with --with-cpp, or you will only be able to use ACSL annotations in already pre-processed files" >&5 $as_echo "$as_me: WARNING: Default pre-processing command '$CPP' do not preserve - comments. Please use define an appropriate pre-processor + comments. Please define an appropriate pre-processor with --with-cpp, or you will only be able to use ACSL annotations in already pre-processed files" >&2;} FRAMAC_DEFAULT_CPP=$CPP; DEFAULT_CPP_KEEP_COMMENTS=false; - fi + fi; + else # handling old version of autoconf (<2.67) that does not keep + # preprocessor result in conftest.i + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to check whether $CPP preserves comments. + Assuming everything is fine" >&5 +$as_echo "$as_me: WARNING: Unable to check whether $CPP preserves comments. + Assuming everything is fine" >&2;} + FRAMAC_DEFAULT_CPP="$CPP $CPPFLAGS"; + DEFAULT_CPP_KEEP_COMMENTS=true; + fi + else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to find a working pre-processor. Please define one with --with-cpp, or you will be able @@ -6484,9 +6691,9 @@ FORCE=no -# Check whether --enable-rte_annotation was given. -if test "${enable_rte_annotation+set}" = set; then : - enableval=$enable_rte_annotation; ENABLE=$enableval;FORCE=$enableval +# Check whether --enable-rtegen was given. +if test "${enable_rtegen+set}" = set; then : + enableval=$enable_rtegen; ENABLE=$enableval;FORCE=$enableval else ENABLE=$default @@ -6515,25 +6722,25 @@ #eval ENABLE_DYNAMIC_$up=\$ENABLE if test "$plugin_present" = "no" -a "$FORCE" = "yes"; then - as_fn_error $? "rte_annotation is not available" "$LINENO" 5 + as_fn_error $? "rtegen is not available" "$LINENO" 5 fi -FORCE_RTE_ANNOTATION=$FORCE -PLUGINS_FORCE_LIST=${PLUGINS_FORCE_LIST}" "FORCE_RTE_ANNOTATION +FORCE_RTEGEN=$FORCE +PLUGINS_FORCE_LIST=${PLUGINS_FORCE_LIST}" "FORCE_RTEGEN -ENABLE_RTE_ANNOTATION=$ENABLE -NAME_RTE_ANNOTATION=rte_annotation +ENABLE_RTEGEN=$ENABLE +NAME_RTEGEN=rtegen if test "$default" = "no" -a "$FORCE" = "no"; then - INFO_RTE_ANNOTATION=" (not available by default)" + INFO_RTEGEN=" (not available by default)" fi # Dynamic plug-ins configuration # static plug-in - DYNAMIC_RTE_ANNOTATION=no + DYNAMIC_RTEGEN=no -echo "rte_annotation... $ENABLE" +echo "rtegen... $ENABLE" # kept defined for write_plugin_config. A bit ugly, but not more than # usual autoconf stuff. # m4_undefine([PLUGIN_NAME]) @@ -7411,24 +7618,27 @@ # Check whether --enable-external was given. if test "${enable_external+set}" = set; then : - enableval=$enable_external; if test -d $enableval; then - { $as_echo "$as_me:${as_lineno-$LINENO}: external plug-in $enableval found." >&5 -$as_echo "$as_me: external plug-in $enableval found." >&6;} - EXTRA_EXTERNAL_PLUGINS="$EXTRA_EXTERNAL_PLUGINS $enableval" - olddir=`pwd` - cd $enableval; + enableval=$enable_external; + for dir in $enableval; do + if test -d $dir; then + { $as_echo "$as_me:${as_lineno-$LINENO}: external plug-in $dir found." >&5 +$as_echo "$as_me: external plug-in $dir found." >&6;} + EXTRA_EXTERNAL_PLUGINS="$EXTRA_EXTERNAL_PLUGINS $dir" + olddir=$(pwd) + cd $dir; if test -x ./configure; then - new_section "configure plug-in $enableval" + new_section "configure plug-in $dir" ./configure --prefix=$prefix --datarootdir=$datarootdir \ --exec_prefix=$exec_prefix --bindir=$bindir --libdir=$datadir/frama-c \ --host=$host --build=$build --mandir=$mandir \ || \ - as_fn_error $? "cannot configure requested external plugin in $enableval" "$LINENO" 5 + as_fn_error $? "cannot configure requested external plugin in $dir" "$LINENO" 5 fi; cd $olddir else as_fn_error $? "--enable-external expects an existing directory as argument." "$LINENO" 5 - fi + fi; + done fi @@ -7442,11 +7652,12 @@ - ########################################################################## + + ########################################################################## # # # This file is part of Aorai plug-in of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # INRIA (Institut National de Recherche en Informatique et en # @@ -7585,12 +7796,13 @@ -if test "$ENABLE_AORAI" != "no"; then USE_LTLTOBA=$USE_LTLTOBA" "aorai + +if test "$ENABLE_AORAI" != "no"; then # ltl2ba library @@ -7655,15 +7867,14 @@ - fi - ac_config_files="$ac_config_files src/aorai/Makefile" - if test "$ENABLE_AORAI" != "no"; then + + if test "$ENABLE_AORAI" != "no"; then EXTERNAL_PLUGINS="${EXTERNAL_PLUGINS} src/aorai"; fi @@ -7691,17 +7902,11 @@ - - - - - - - ########################################################################## + ########################################################################## # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # @@ -7842,7 +8047,9 @@ ac_config_files="$ac_config_files src/obfuscator/Makefile" - if test "$ENABLE_OBFUSCATOR" != "no"; then + + + if test "$ENABLE_OBFUSCATOR" != "no"; then EXTERNAL_PLUGINS="${EXTERNAL_PLUGINS} src/obfuscator"; fi @@ -7862,11 +8069,12 @@ - ########################################################################## + + ########################################################################## # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # @@ -8015,7 +8223,9 @@ ac_config_files="$ac_config_files src/report/Makefile" - if test "$ENABLE_REPORT" != "no"; then + + + if test "$ENABLE_REPORT" != "no"; then EXTERNAL_PLUGINS="${EXTERNAL_PLUGINS} src/report"; fi @@ -8031,11 +8241,12 @@ - ########################################################################## + + ########################################################################## # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # @@ -8171,7 +8382,6 @@ -if test "$ENABLE_SECURITY_SLICING" != "no"; then @@ -8217,14 +8427,11 @@ -fi - - ac_config_files="$ac_config_files src/security_slicing/Makefile" - if test "$ENABLE_SECURITY_SLICING" != "no"; then + if test "$ENABLE_SECURITY_SLICING" != "no"; then EXTERNAL_PLUGINS="${EXTERNAL_PLUGINS} src/security_slicing"; fi @@ -8247,11 +8454,12 @@ - ########################################################################## + + ########################################################################## # # # This file is part of WP plug-in of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat a l'energie atomique et aux energies # # alternatives) # # # @@ -8405,7 +8613,6 @@ fi -if test "$ENABLE_WP" != "no"; then @@ -8421,156 +8628,20 @@ - USE_RTE_ANNOTATION=$USE_RTE_ANNOTATION" "wp - USED_WP=$USED_WP" "rte_annotation + USE_RTEGEN=$USE_RTEGEN" "wp + USED_WP=$USED_WP" "rtegen - ## Configuring for WP-COQ - if test "$WPCOQ" = "yes" ; then - # Extract the first word of "coqc", so it can be a program name with args. -set dummy coqc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_COQC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$COQC"; then - ac_cv_prog_COQC="$COQC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_COQC="yes" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_prog_COQC" && ac_cv_prog_COQC="no" -fi -fi -COQC=$ac_cv_prog_COQC -if test -n "$COQC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $COQC" >&5 -$as_echo "$COQC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - if test "$COQC" = "yes" ; then - COQVERSION=`coqc -v | sed -n -e 's|.*version* *\([^ ]*\) .*$|\1|p' ` - case $COQVERSION in - 8.4*|trunk) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: coqc version $COQVERSION found" >&5 -$as_echo "coqc version $COQVERSION found" >&6; } - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: wp needs coq 8.4" >&5 -$as_echo "wp needs coq 8.4" >&6; } - COQC="no" - ;; - esac - else - { $as_echo "$as_me:${as_lineno-$LINENO}: rerun configure to make wp using coq 8.4" >&5 -$as_echo "$as_me: rerun configure to make wp using coq 8.4" >&6;} - fi - else - COQC="no" - fi - ## Configuring for WHY3-COQ - if test "$COQC" = "yes" -a "$WPWHY3COQ" = "yes" ; then - # Extract the first word of "why3", so it can be a program name with args. -set dummy why3; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_WHY3COQC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$WHY3COQC"; then - ac_cv_prog_WHY3COQC="$WHY3COQC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_WHY3COQC="yes" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - test -z "$ac_cv_prog_WHY3COQC" && ac_cv_prog_WHY3COQC="no" -fi -fi -WHY3COQC=$ac_cv_prog_WHY3COQC -if test -n "$WHY3COQC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WHY3COQC" >&5 -$as_echo "$WHY3COQC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - if test "$WHY3COQC" = "yes" ; then - WHY3VERSION=`why3 --version | sed -n -e 's|.*version* *\([^ ]*\) .*$|\1|p' ` - case $WHY3VERSION in - 0.82*) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: why3 version $WHY3VERSION found" >&5 -$as_echo "why3 version $WHY3VERSION found" >&6; } - WHY3LIB=`why3 --print-libdir` - if test -f $WHY3LIB/coq/BuiltIn.vo ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: why3 compiled coq libraries found" >&5 -$as_echo "why3 compiled coq libraries found" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: why3 compiled coq libraries not found in $WHY3LIB" >&5 -$as_echo "why3 compiled coq libraries not found in $WHY3LIB" >&6; } - WHY3COQC="no" - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: wp needs needs why3 0.82" >&5 -$as_echo "wp needs needs why3 0.82" >&6; } - WHY3COQC="no" - ;; - esac - else - { $as_echo "$as_me:${as_lineno-$LINENO}: rerun configure to make wp using why3 0.82" >&5 -$as_echo "$as_me: rerun configure to make wp using why3 0.82" >&6;} - fi - else - WHY3COQC="no" - fi - - - -fi - - - - - ac_config_files="$ac_config_files src/wp/Makefile" - - if test "$ENABLE_WP" != "no"; then + if test "$ENABLE_WP" != "no"; then EXTERNAL_PLUGINS="${EXTERNAL_PLUGINS} src/wp"; fi @@ -8669,7 +8740,6 @@ if test "$HAS_LABLGTK" = "yes"; then - # Gtksourceview ############### REQUIRE_GTKSOURCEVIEW= @@ -9079,6 +9149,168 @@ fi fi + + + + + ac_config_files="$ac_config_files src/aorai/Makefile" + + + + + + + + ac_config_files="$ac_config_files src/security_slicing/Makefile" + + + + +# NB: this would deserve to use plugin_requires mechanism +if test "$ENABLE_WP" != "no"; then + + ## Configuring for WP-COQ + if test "$WPCOQ" = "yes" ; then + # Extract the first word of "coqc", so it can be a program name with args. +set dummy coqc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_COQC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$COQC"; then + ac_cv_prog_COQC="$COQC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_COQC="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_COQC" && ac_cv_prog_COQC="no" +fi +fi +COQC=$ac_cv_prog_COQC +if test -n "$COQC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $COQC" >&5 +$as_echo "$COQC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$COQC" = "yes" ; then + COQVERSION=`coqc -v | sed -n -e 's|.*version* *\([^ ]*\) .*$|\1|p' ` + case $COQVERSION in + 8.4*|trunk) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: coqc version $COQVERSION found" >&5 +$as_echo "coqc version $COQVERSION found" >&6; } + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: wp needs coq 8.4" >&5 +$as_echo "wp needs coq 8.4" >&6; } + COQC="no" + ;; + esac + else + { $as_echo "$as_me:${as_lineno-$LINENO}: rerun configure to make wp using coq 8.4" >&5 +$as_echo "$as_me: rerun configure to make wp using coq 8.4" >&6;} + fi + else + COQC="no" + fi + + + ## Configuring for WHY3-COQ + if test "$COQC" = "yes" -a "$WPWHY3COQ" = "yes" ; then + # Extract the first word of "why3", so it can be a program name with args. +set dummy why3; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_WHY3COQC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$WHY3COQC"; then + ac_cv_prog_WHY3COQC="$WHY3COQC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_WHY3COQC="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_WHY3COQC" && ac_cv_prog_WHY3COQC="no" +fi +fi +WHY3COQC=$ac_cv_prog_WHY3COQC +if test -n "$WHY3COQC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WHY3COQC" >&5 +$as_echo "$WHY3COQC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$WHY3COQC" = "yes" ; then + WHY3VERSION=`why3 --version | sed -n -e 's|.*version* *\([^ ]*\) .*$|\1|p' ` + case $WHY3VERSION in + 0.85*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: why3 version $WHY3VERSION found" >&5 +$as_echo "why3 version $WHY3VERSION found" >&6; } + WHY3LIB=`why3 --print-libdir` + if test -f $WHY3LIB/coq/BuiltIn.vo ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: why3 compiled coq libraries found" >&5 +$as_echo "why3 compiled coq libraries found" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: why3 compiled coq libraries not found in $WHY3LIB" >&5 +$as_echo "why3 compiled coq libraries not found in $WHY3LIB" >&6; } + WHY3COQC="no" + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: wp needs why3 0.85" >&5 +$as_echo "wp needs why3 0.85" >&6; } + WHY3COQC="no" + ;; + esac + else + { $as_echo "$as_me:${as_lineno-$LINENO}: rerun configure to make wp using why3 0.85" >&5 +$as_echo "$as_me: rerun configure to make wp using why3 0.85" >&6;} + fi + else + WHY3COQC="no" + fi + + +fi + + + + + ac_config_files="$ac_config_files src/wp/Makefile" + + + if test -n "$REQUIRE_LABLGTK" -o -n "$USE_LABLGTK" -o "$no" = "yes"; then if test "$HAS_LABLGTK" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $LABLGTKPATH_FOR_CONFIGURE/lablgtk.$LIB_SUFFIX not found." >&5 @@ -9228,7 +9460,7 @@ # compile statically all dynamic plug-ins # except contrary instructions USE_NATIVE_DYNLINK=""; - for plugin in SEMANTIC_CONSTANT_FOLDING FROM_ANALYSIS GUI IMPACT INOUT METRICS OCCURRENCE PDG POSTDOMINATORS RTE_ANNOTATION SCOPE SEMANTIC_CALLGRAPH SLICING SPARECODE SYNTACTIC_CALLGRAPH USERS VALUE_ANALYSIS AORAI OBFUSCATOR REPORT SECURITY_SLICING WP; do + for plugin in SEMANTIC_CONSTANT_FOLDING FROM_ANALYSIS GUI IMPACT INOUT METRICS OCCURRENCE PDG POSTDOMINATORS RTEGEN SCOPE SEMANTIC_CALLGRAPH SLICING SPARECODE SYNTACTIC_CALLGRAPH USERS VALUE_ANALYSIS AORAI OBFUSCATOR REPORT SECURITY_SLICING WP; do n=NAME_$plugin d=DYNAMIC_$plugin s=STATIC_$plugin @@ -9282,7 +9514,7 @@ # compile statically all dynamic plug-ins # except contrary instructions USE_NATIVE_DYNLINK=""; - for plugin in SEMANTIC_CONSTANT_FOLDING FROM_ANALYSIS GUI IMPACT INOUT METRICS OCCURRENCE PDG POSTDOMINATORS RTE_ANNOTATION SCOPE SEMANTIC_CALLGRAPH SLICING SPARECODE SYNTACTIC_CALLGRAPH USERS VALUE_ANALYSIS AORAI OBFUSCATOR REPORT SECURITY_SLICING WP; do + for plugin in SEMANTIC_CONSTANT_FOLDING FROM_ANALYSIS GUI IMPACT INOUT METRICS OCCURRENCE PDG POSTDOMINATORS RTEGEN SCOPE SEMANTIC_CALLGRAPH SLICING SPARECODE SYNTACTIC_CALLGRAPH USERS VALUE_ANALYSIS AORAI OBFUSCATOR REPORT SECURITY_SLICING WP; do n=NAME_$plugin d=DYNAMIC_$plugin s=STATIC_$plugin @@ -9383,6 +9615,8 @@ + + # m4_foreach_w is not supported in some old autoconf versions. # Sadly AC_FOREACH is deprecated now... @@ -10734,7 +10968,7 @@ new_section "summary: plug-ins available" -for plugin in SEMANTIC_CONSTANT_FOLDING FROM_ANALYSIS GUI IMPACT INOUT METRICS OCCURRENCE PDG POSTDOMINATORS RTE_ANNOTATION SCOPE SEMANTIC_CALLGRAPH SLICING SPARECODE SYNTACTIC_CALLGRAPH USERS VALUE_ANALYSIS AORAI OBFUSCATOR REPORT SECURITY_SLICING WP; do +for plugin in SEMANTIC_CONSTANT_FOLDING FROM_ANALYSIS GUI IMPACT INOUT METRICS OCCURRENCE PDG POSTDOMINATORS RTEGEN SCOPE SEMANTIC_CALLGRAPH SLICING SPARECODE SYNTACTIC_CALLGRAPH USERS VALUE_ANALYSIS AORAI OBFUSCATOR REPORT SECURITY_SLICING WP; do n=NAME_$plugin e=ENABLE_$plugin d=DYNAMIC_$plugin diff -Nru frama-c-20140301+neon+dfsg/configure.in frama-c-20150201+sodium+dfsg/configure.in --- frama-c-20140301+neon+dfsg/configure.in 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/configure.in 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # INRIA (Institut National de Recherche en Informatique et en # @@ -127,6 +127,8 @@ exit 2;; 3.12.0*) echo "${ECHO_T}Incompatible version! Use at least OCaml 3.12.1."; exit 2;; + 4.02.0*) echo "${ECHO_T}Incompatible version. Use OCaml 4.02.1."; + exit 2;; 4.*) OCAML_ANNOT_OPTION="-annot -bin-annot";; *) echo "${ECHO_T}Incompatible version!"; exit 2;; esac @@ -284,6 +286,16 @@ OCAMLGRAPH_INCLUDE= OCAMLGRAPH_CUSTOM=no +# allow local ocamlgraph +AC_ARG_ENABLE( + local-ocamlgraph, + [ --enable-local-ocamlgraph force the user to use the local OcamlGraph version. + --disable-local-ocamlgraph force the user to use an installed OCamlGraph version. +], + ENABLE_LOCAL_OCAMLGRAPH=$enableval, + ENABLE_LOCAL_OCAMLGRAPH=auto, # default value +) + AC_ARG_WITH( ocamlgraph, AC_HELP_STRING( @@ -294,89 +306,89 @@ OCAMLGRAPH_CUSTOM=yes], []) -if test "$OCAMLFIND" = "no" -o "$OCAMLGRAPH_CUSTOM" = "yes"; then - -# check if any ocamlgraph is installed in the right place - AC_CHECK_FILE($OCAMLGRAPH_HOME/graph.$OBJ_SUFFIX, - OCAMLGRAPH_EXISTS="yes" OCAMLGRAPH_INCLUDE="-I +ocamlgraph") - - if test "$OCAMLGRAPH_EXISTS"="no" -a "$OCAMLGRAPH_CUSTOM" = "yes"; then - AC_MSG_ERROR( - [unable to find OCamlGraph in custom location $OCAMLGRAPH_HOME. - Please give an appropriate value, or use default OCamlGraph library]); - fi -else - OCAMLGRAPH_HOME=$($OCAMLFIND query ocamlgraph 2>/dev/null \ - | tr -d '\r\n'); - if test "$OCAMLGRAPH_HOME" != ""; then - OCAMLGRAPH_INCLUDE="-I $OCAMLGRAPH_HOME"; - OCAMLGRAPH_EXISTS="yes"; - else - AC_MSG_NOTICE(no package ocamlgraph in ocamlfind) - fi; -fi +if test "$ENABLE_LOCAL_OCAMLGRAPH" != "yes"; then + if test "$OCAMLFIND" = "no" -o "$OCAMLGRAPH_CUSTOM" = "yes"; then -ocamlgraph_error() { - if test "$OCAMLGRAPH_CUSTOM" = "yes"; then - AC_MSG_ERROR( - [Custom OCamlGraph library version $OCAMLGRAPH_VERSION is incompatible with - Frama-C. Please provide another location or use default OCamlGraph]); + # check if any ocamlgraph is installed in the right place + AC_CHECK_FILE($OCAMLGRAPH_HOME/graph.$OBJ_SUFFIX, + OCAMLGRAPH_EXISTS="yes" OCAMLGRAPH_INCLUDE="-I +ocamlgraph") + + if test "$OCAMLGRAPH_EXISTS" = "no" -a "$OCAMLGRAPH_CUSTOM" = "yes"; then + AC_MSG_ERROR( + [unable to find OCamlGraph in custom location $OCAMLGRAPH_HOME. + Please give an appropriate value, or use default OCamlGraph library]); + fi else - AC_MSG_NOTICE([OcamlGraph $OCAMLGRAPH_VERSION is incompatible with Frama-C.]) - OCAMLGRAPH_EXISTS=no - OCAMLGRAPH_INCLUDE= - :; + OCAMLGRAPH_HOME=$($OCAMLFIND query ocamlgraph 2>/dev/null \ + | tr -d '\r\n'); + if test "$OCAMLGRAPH_HOME" != ""; then + OCAMLGRAPH_INCLUDE="-I $OCAMLGRAPH_HOME"; + OCAMLGRAPH_EXISTS="yes"; + else + AC_MSG_NOTICE(no package ocamlgraph in ocamlfind) + fi; fi -} -# if any, check if it is a compatible version -if test "$OCAMLGRAPH_EXISTS" = "yes"; then - test_ocamlgraph_version='print_string Graph.Version.version;;' - echo $test_ocamlgraph_version > test_ocamlgraph.ml - if $OCAMLC -o test_ocamlgraph $OCAMLGRAPH_INCLUDE graph.cmo \ - test_ocamlgraph.ml 2> /dev/null; \ - then - OCAMLGRAPH_VERSION=`./test_ocamlgraph` - case $OCAMLGRAPH_VERSION in - 1.8.1) ocamlgraph_error;; - 1.8.2) ocamlgraph_error;; - 1.8.3) ocamlgraph_error;; - 1.8.4) AC_MSG_NOTICE([OcamlGraph $OCAMLGRAPH_VERSION found: great!]);; - 1.8.*) AC_MSG_NOTICE( - [OcamlGraph $OCAMLGRAPH_VERSION > 1.8.4 found: should be compatible, but no warranty. Use it at your own risk!]);; - *) ocamlgraph_error;; - esac - if test "$OCAMLGRAPH_EXISTS" = "yes"; then # current version is ok - if test "$OCAMLBEST" = "opt"; then - if $OCAMLOPT -o test_ocamlgraph $OCAMLGRAPH_INCLUDE graph.cmxa \ - test_ocamlgraph.ml 2> /dev/null; \ - then - AC_MSG_NOTICE([OcamlGraph native version is ok]) + + ocamlgraph_error() { + if test "$OCAMLGRAPH_CUSTOM" = "yes"; then + AC_MSG_ERROR( + [Custom OCamlGraph library version $OCAMLGRAPH_VERSION is incompatible with + Frama-C. Please provide another location or use default OCamlGraph]); + else + AC_MSG_NOTICE([OcamlGraph $OCAMLGRAPH_VERSION is incompatible with Frama-C.]) + OCAMLGRAPH_EXISTS=no + OCAMLGRAPH_INCLUDE= + :; + fi + } + + # if any, check if it is a compatible version + if test "$OCAMLGRAPH_EXISTS" = "yes"; then + test_ocamlgraph_version='print_string Graph.Version.version;;' + echo $test_ocamlgraph_version > test_ocamlgraph.ml + if $OCAMLC -o test_ocamlgraph $OCAMLGRAPH_INCLUDE graph.cmo \ + test_ocamlgraph.ml 2> /dev/null; \ + then + OCAMLGRAPH_VERSION=`./test_ocamlgraph` + case $OCAMLGRAPH_VERSION in + 1.8.1 | 1.8.1+dev \ + | 1.8.2 | 1.8.2+dev \ + | 1.8.3 | 1.8.3+dev \ + | 1.8.4 | 1.8.4+dev) + ocamlgraph_error;; + 1.8.5 | 1.8.6) + AC_MSG_NOTICE([OcamlGraph $OCAMLGRAPH_VERSION found: great!]);; + 1.8.*) + AC_MSG_NOTICE( + [OcamlGraph $OCAMLGRAPH_VERSION > 1.8.5 found: should be compatible, but no warranty. + Consider using --enable-local-ocamlgraph.]);; + *) ocamlgraph_error;; + esac + if test "$OCAMLGRAPH_EXISTS" = "yes"; then # current version is ok + if test "$OCAMLBEST" = "opt"; then + if $OCAMLOPT -o test_ocamlgraph $OCAMLGRAPH_INCLUDE graph.cmxa \ + test_ocamlgraph.ml 2> /dev/null; \ + then + AC_MSG_NOTICE([OcamlGraph native version is ok]) + else + AC_MSG_NOTICE([OcamlGraph native version is not ok]) + ocamlgraph_error + fi else - AC_MSG_NOTICE([OcamlGraph native version is not ok]) ocamlgraph_error fi - else - ocamlgraph_error fi + else + ocamlgraph_error fi - else - ocamlgraph_error + rm -f test_ocamlgraph test_ocamlgraph.ml test_ocamlgraph.cm* fi - rm -f test_ocamlgraph test_ocamlgraph.ml test_ocamlgraph.cm* -fi - -# allow local ocamlgraph -AC_ARG_ENABLE( - local-ocamlgraph, - [ --enable-local-ocamlgraph allow the user to use the local OcamlGraph version], - ENABLE_LOCAL_OCAMLGRAPH=$enableval, - ENABLE_LOCAL_OCAMLGRAPH=yes, # default value -) +fi; # ENABLE_LOCAL_OCAMLGRAPH != yes # revert back to local version of ocamlgraph if test "$OCAMLGRAPH_EXISTS" = "no"; then - if test "$ENABLE_LOCAL_OCAMLGRAPH" = "yes"; then + if test "$ENABLE_LOCAL_OCAMLGRAPH" != "no"; then AC_MSG_NOTICE([switching to OcamlGraph provided by Frama-C]) OCAMLGRAPH_LOCAL=ocamlgraph OCAMLGRAPH_HOME= @@ -518,6 +530,11 @@ AC_CHECK_HEADERS(unistd.h) # Local machdep feature (to generate new platforms) +AC_ARG_ENABLE( + localmachdep, + [ --enable-localmachdep enable local machdep configuration], + LOCAL_MACHDEP=$enableval, + LOCAL_MACHDEP=no) if test "$LOCAL_MACHDEP" = yes ; then @@ -575,11 +592,18 @@ AC_CHECK_TYPE(__builtin_va_list, HAVE_BUILTIN_VA_LIST=true, HAVE_BUILTIN_VA_LIST=false) +if test "$HAVE_BUILTIN_VA_LIST" = "true" ;then + AC_DEFINE_UNQUOTED(HAVE_BUILTIN_VA_LIST, 1) +fi + AC_MSG_CHECKING([if __thread is a keyword]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([int main(int __thread) { return 0; }])], THREAD_IS_KEYWORD=false, THREAD_IS_KEYWORD=true) AC_MSG_RESULT($THREAD_IS_KEYWORD) +if test "$THREAD_IS_KEYWORD" = "true" ;then + AC_DEFINE_UNQUOTED(THREAD_IS_KEYWORD, 1) +fi # Does gcc add underscores to identifiers to make assembly labels? # (I think MSVC always does) @@ -588,6 +612,9 @@ UNDERSCORE_NAME=true, UNDERSCORE_NAME=false) AC_MSG_RESULT($UNDERSCORE_NAME) +if test "$UNDERSCORE_NAME" = "true" ;then + AC_DEFINE_UNQUOTED(UNDERSCORE_NAME, 1) +fi fi # local machdep configuration @@ -625,29 +652,43 @@ # $CC. Note that we want to keep comments in the output, so that AC_PROG_CPP # alone is not sufficient. if test -z "$FRAMAC_DEFAULT_CPP"; then -# We should use AC_CHECK_PROG_CPP, but then we would end up with a slightly -# different command line than before for pre-processing (swapping -C and -E) -# and since we have the brilliant idea to put this command line in our -# test oracles, changing that would be painful. - CPP=$CC - CPPFLAGS="-C -E -I."; + AC_PROG_CPP + CPPFLAGS="-C -I."; + if test -n "$GCC"; then FRAMAC_GNU_CPP=true; else FRAMAC_GNU_CPP=false; fi else CPP=$FRAMAC_DEFAULT_CPP; + FRAMAC_GNU_CPP=true; + CPPFLAGS="-dD -nostdinc" + AC_PREPROC_IFELSE( + [AC_LANG_SOURCE([#define foo 0 + /* foo */ + ])], + FRAMAC_GNU_CPP=true, + FRAMAC_GNU_CPP=false) CPPFLAGS= fi AC_PREPROC_IFELSE( [AC_LANG_SOURCE([/* Check whether comments are kept in output */])], - [if grep -e kept conftest.i; then + [if test -e conftest.i; then + if grep -e kept conftest.i; then FRAMAC_DEFAULT_CPP="$CPP $CPPFLAGS"; DEFAULT_CPP_KEEP_COMMENTS=true; else AC_MSG_WARN([Default pre-processing command '$CPP' do not preserve - comments. Please use define an appropriate pre-processor + comments. Please define an appropriate pre-processor with --with-cpp, or you will only be able to use ACSL annotations in already pre-processed files]) FRAMAC_DEFAULT_CPP=$CPP; DEFAULT_CPP_KEEP_COMMENTS=false; - fi], + fi; + else # handling old version of autoconf (<2.67) that does not keep + # preprocessor result in conftest.i + AC_MSG_WARN([Unable to check whether $CPP preserves comments. + Assuming everything is fine]) + FRAMAC_DEFAULT_CPP="$CPP $CPPFLAGS"; + DEFAULT_CPP_KEEP_COMMENTS=true; + fi + ], [AC_MSG_WARN([Unable to find a working pre-processor. Please define one with --with-cpp, or you will be able to launch Frama-C only on pre-processed files])]; @@ -793,7 +834,7 @@ # rte ##### -check_plugin(rte_annotation,src/rte, +check_plugin(rtegen,src/rte, [support for runtime error annotation],yes,no) # scope @@ -864,28 +905,32 @@ [[ --enable-external=plugin allows to compile directly from Frama-C kernel some external plug-ins.]], -[ if test -d $enableval; then - AC_MSG_NOTICE([external plug-in $enableval found.]) - EXTRA_EXTERNAL_PLUGINS="$EXTRA_EXTERNAL_PLUGINS $enableval" - olddir=`pwd` - cd $enableval; +[ + for dir in $enableval; do + if test -d $dir; then + AC_MSG_NOTICE([external plug-in $dir found.]) + EXTRA_EXTERNAL_PLUGINS="$EXTRA_EXTERNAL_PLUGINS $dir" + olddir=$(pwd) + cd $dir; if test -x ./configure; then - new_section "configure plug-in $enableval" + new_section "configure plug-in $dir" ./configure --prefix=$prefix --datarootdir=$datarootdir \ --exec_prefix=$exec_prefix --bindir=$bindir --libdir=$datadir/frama-c \ --host=$host --build=$build --mandir=$mandir \ || \ - AC_MSG_ERROR([cannot configure requested external plugin in $enableval]) + AC_MSG_ERROR([cannot configure requested external plugin in $dir]) fi; cd $olddir else AC_MSG_ERROR([--enable-external expects an existing directory as argument.]) - fi + fi; + done ]) define([KNOWN_SRC_DIRS], KNOWN_SRC_DIRS src/kernel src/project src/logic src/dummy src/toplevel \ - src/lib src/misc src/qed src/type src/printer) + src/lib src/misc src/qed src/type src/printer \ + src/ai src/memory_state) AC_FOREACH([__plugin],m4_esyscmd([ls src]), [ m4_if(m4_index(KNOWN_SRC_DIRS,__plugin),[-1], @@ -899,15 +944,25 @@ m4_if(config_file,[no], [ m4_syscmd(test -r src/__plugin/Makefile) m4_if(m4_sysval,[0], - [ check_plugin(__plugin,src/__plugin, - [support for __plugin plug-in],yes,yes) - if test "$[ENABLE_]tovarname(__plugin)" != "no"; then - EXTERNAL_PLUGINS="$EXTERNAL_PLUGINS src/__plugin"; - fi])], - [ m4_define([plugin_prefix],src/__plugin) - m4_include(config_file) - m4_syscmd(cd src/__plugin && [FRAMAC_SHARE]=../../share autoconf) - ]) + [ m4_syscmd(test "$DISTRIB_CONF" = "yes" && \ + grep -q -e "PLUGIN_DISTRIBUTED *:= *no" \ + src/__plugin/Makefile + ) + m4_if(m4_sysval,[0],, + [ check_plugin(__plugin,src/__plugin, + [support for __plugin plug-in],yes,yes) + if test "$[ENABLE_]tovarname(__plugin)" != "no"; then + EXTERNAL_PLUGINS="$EXTERNAL_PLUGINS src/__plugin"; + fi])])], + [ m4_syscmd(test "$DISTRIB_CONF" = "yes" && \ + grep -q -e "PLUGIN_DISTRIBUTED:=no" \ + src/__plugin/Makefile.in) + m4_if(m4_sysval,[0],, + [ m4_define([plugin_prefix],src/__plugin) + m4_include(config_file) + m4_syscmd(cd src/__plugin && + [FRAMAC_SHARE]=../../share autoconf)]) + ]) ]) ]) @@ -944,7 +999,6 @@ if test "$HAS_LABLGTK" = "yes"; then - # Gtksourceview ############### REQUIRE_GTKSOURCEVIEW= @@ -1098,8 +1152,10 @@ AC_SUBST(LOCAL_MACHDEP) AC_SUBST(datarootdir) AC_SUBST(FRAMAC_DEFAULT_CPP) +AC_SUBST(FRAMAC_GNU_CPP) AC_SUBST(DEFAULT_CPP_KEEP_COMMENTS) AC_SUBST(FC_MCPP) +AC_SUBST(CC) AC_SUBST(EXTERNAL_PLUGINS) diff -Nru frama-c-20140301+neon+dfsg/debian/changelog frama-c-20150201+sodium+dfsg/debian/changelog --- frama-c-20140301+neon+dfsg/debian/changelog 2014-04-29 17:16:49.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/debian/changelog 2015-09-01 19:34:32.000000000 +0000 @@ -1,3 +1,26 @@ +frama-c (20150201+sodium+dfsg-2) unstable; urgency=medium + + * frama-c package must Breaks/Replaces older frama-c-base package + (<< 20150201+sodium+dfsg-1~) since files were moved from the + latter to the former (Closes: #797695). + * Do not try to install plugins on bytecode architectures since they + are provided only on native architectures. This is needed to fix + FTBFS on bytecode architectures. + + -- Mehdi Dogguy Tue, 01 Sep 2015 19:34:32 +0000 + +frama-c (20150201+sodium+dfsg-1) unstable; urgency=medium + + * New upstream release (Closes: #797473). + - Refrech patches. + - Drop 0004-Port-to-OCamlgraph-1.8.5.patch: Integrated upstream. + * Bump Standards-Version to 3.9.6, no changes needed. + * Disable DH_VERBOSE in d/rules. + * Install GUI plugins and modules using GTK2 in frama-c package + only (Closes: #792612). + + -- Mehdi Dogguy Mon, 31 Aug 2015 22:18:00 +0000 + frama-c (20140301+neon+dfsg-3) unstable; urgency=medium * Add a call to autoconf prior to configure. diff -Nru frama-c-20140301+neon+dfsg/debian/control frama-c-20150201+sodium+dfsg/debian/control --- frama-c-20140301+neon+dfsg/debian/control 2014-04-29 17:16:49.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/debian/control 2015-09-01 19:20:42.000000000 +0000 @@ -14,7 +14,7 @@ libocamlgraph-viewer-ocaml-dev (>> 1.8.5~), liblablgtk2-gnome-ocaml-dev (>= 2.14.0+dfsg-2~), liblablgtksourceview2-ocaml-dev (>= 2.14.0+dfsg-2~) -Standards-Version: 3.9.2 +Standards-Version: 3.9.6 Homepage: http://frama-c.com/ Vcs-Browser: http://git.debian.org/?p=pkg-ocaml-maint/packages/frama-c.git Vcs-Git: git://git.debian.org/git/pkg-ocaml-maint/packages/frama-c.git @@ -30,6 +30,10 @@ emacs | emacsen Recommends: why (>= 2.19+dfsg-2), +Breaks: + frama-c-base (<< 20150201+sodium+dfsg-1~) +Replaces: + frama-c-base (<< 20150201+sodium+dfsg-1~) Description: Framework for source code analysis of software written in C Frama-C is a framework dedicated to the analysis of the source code of software written in C. diff -Nru frama-c-20140301+neon+dfsg/debian/frama-c-base.install.in frama-c-20150201+sodium+dfsg/debian/frama-c-base.install.in --- frama-c-20140301+neon+dfsg/debian/frama-c-base.install.in 2014-04-29 17:16:49.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/debian/frama-c-base.install.in 2015-09-01 19:29:49.000000000 +0000 @@ -1,4 +1,5 @@ - usr/lib + usr/lib/frama-c/*.* +OPT: usr/lib/frama-c/plugins/*.* usr/share usr/bin/frama-c OPT: usr/bin/frama-c.byte diff -Nru frama-c-20140301+neon+dfsg/debian/frama-c.install frama-c-20150201+sodium+dfsg/debian/frama-c.install --- frama-c-20140301+neon+dfsg/debian/frama-c.install 2014-04-29 17:16:49.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/debian/frama-c.install 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -usr/bin/frama-c-gui diff -Nru frama-c-20140301+neon+dfsg/debian/frama-c.install.in frama-c-20150201+sodium+dfsg/debian/frama-c.install.in --- frama-c-20140301+neon+dfsg/debian/frama-c.install.in 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/debian/frama-c.install.in 2015-09-01 19:34:01.000000000 +0000 @@ -0,0 +1,2 @@ + usr/bin/frama-c-gui +OPT: usr/lib/frama-c/plugins/gui diff -Nru frama-c-20140301+neon+dfsg/debian/patches/0001-Fix-spelling-error-in-binary.patch frama-c-20150201+sodium+dfsg/debian/patches/0001-Fix-spelling-error-in-binary.patch --- frama-c-20140301+neon+dfsg/debian/patches/0001-Fix-spelling-error-in-binary.patch 2014-04-29 17:16:49.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/debian/patches/0001-Fix-spelling-error-in-binary.patch 2015-08-31 21:02:06.000000000 +0000 @@ -3,66 +3,171 @@ Subject: Fix spelling-error-in-binary --- - Changelog | 4 ++-- - cil/src/frontc/cabs2cil.ml | 4 ++-- - man/frama-c.1 | 2 +- - 3 files changed, 5 insertions(+), 5 deletions(-) + cil/src/frontc/cparser.mly | 2 +- + cil/src/logic/logic_typing.ml | 2 +- + cil/src/logic/logic_utils.mli | 2 +- + src/ai/trace.ml | 2 +- + src/gui/filetree.ml | 2 +- + src/kernel/exn_flow.ml | 2 +- + src/kernel/file.ml | 2 +- + src/lib/bitvector.ml | 2 +- + src/memory_state/cvalue.mli | 2 +- + src/memory_state/lmap_sig.mli | 2 +- + src/value/eval_annots.ml | 2 +- + tests/spec/oracle/preprocess_string.res.oracle | 2 +- + 12 files changed, 12 insertions(+), 12 deletions(-) -diff --git a/Changelog b/Changelog -index b551baf..849fd3c 100644 ---- a/Changelog -+++ b/Changelog -@@ -589,7 +589,7 @@ o! Kernel [2012/11/24] Various types whose names started by t_ in - o Rte [2012/11/23] Export function "exp_annotations" to get RTEs of a C - expression as annotations. - o*!Kernel [2012/11/23] Added TLogic_coerce constructor to mark -- explicitely a conversion from a C type to a logical one -+ explicitly a conversion from a C type to a logical one - (in particular floating point -> real and integral -> integer). - Fixes issue #1309. - o! Kernel [2012/11/22] Remove unintuitive ?prj argument from Cil visitors, -@@ -1607,7 +1607,7 @@ o* Cil [2010/12/20] Fixed bug #645. Ast_info.constant_expr, - mkAddrOrStartOf,mkString,parseInt,sizeOf] no longer use - an optional argument ?loc. It is now a non optional labeled - argument. Previous default value of loc was -- ~loc:Cil_datatype.Location.unkown which is most of the time -+ ~loc:Cil_datatype.Location.unknown which is most of the time - not accurate. - - ################################### -diff --git a/cil/src/frontc/cabs2cil.ml b/cil/src/frontc/cabs2cil.ml -index e803678..2699ae8 100644 ---- a/cil/src/frontc/cabs2cil.ml -+++ b/cil/src/frontc/cabs2cil.ml -@@ -2318,7 +2318,7 @@ let makeGlobalVarinfo (isadef: bool) (vi: varinfo) : varinfo * bool = - * local. This can happen when we declare an extern variable with - * global scope but we are in a local scope. *) - -- (* We lookup in the environement. If this is extern inline then the name -+ (* We lookup in the environment. If this is extern inline then the name - * was already changed to foo__extinline. We lookup with the old name *) - let lookupname = - if vi.vstorage = Static then -@@ -3517,7 +3517,7 @@ let default_argument_promotion idx exp = - "implicit prototype cannot have variadic arguments" - | TNamed _ -> assert false (* unrollType *) - in -- (* if we make a promotion, take it explicitely -+ (* if we make a promotion, take it explicitly - into account in the argument itself *) - let (_,e) = castTo arg_type typ exp in - (name,typ,[]), e -diff --git a/man/frama-c.1 b/man/frama-c.1 -index 6e46d24..ae537d7 100644 ---- a/man/frama-c.1 -+++ b/man/frama-c.1 -@@ -395,7 +395,7 @@ removes break, continue and switch statement before analyses. Defaults to - no. - .TP - .B -then --allows to compose analyzes: a first run of Frama-C will occur with the -+allows one to compose analyzes: a first run of Frama-C will occur with the - options before - .B -then - and a second run will be done with the options after --- +diff --git a/cil/src/frontc/cparser.mly b/cil/src/frontc/cparser.mly +index 784db05..9d75dde 100644 +--- a/cil/src/frontc/cparser.mly ++++ b/cil/src/frontc/cparser.mly +@@ -614,7 +614,7 @@ unary_expression: /*(* 6.5.3 *)*/ + { make_expr (UNARY (NOT, $2)) } + | TILDE cast_expression + { make_expr (UNARY (BNOT, $2)) } +-/* (* GCC allows to take address of a label (see COMPGOTO statement) *) */ ++/* (* GCC allows one to take address of a label (see COMPGOTO statement) *) */ + | AND_AND id_or_typename_as_id { make_expr (LABELADDR $2) } + ; + +diff --git a/cil/src/logic/logic_typing.ml b/cil/src/logic/logic_typing.ml +index 7a4c2af..75294b0 100644 +--- a/cil/src/logic/logic_typing.ml ++++ b/cil/src/logic/logic_typing.ml +@@ -447,7 +447,7 @@ let post_state_env kind typ = + let env = append_init_label env in + let env = append_here_label env in + let env = append_old_and_post_labels env in +- (* NB: this allows to have \result and Exits as termination kind *) ++ (* NB: this allows one to have \result and Exits as termination kind *) + let env = add_result env typ in + let env = add_exit_status env in + let env = enter_post_state env kind in +diff --git a/cil/src/logic/logic_utils.mli b/cil/src/logic/logic_utils.mli +index 0d7bf9e..cb31198 100644 +--- a/cil/src/logic/logic_utils.mli ++++ b/cil/src/logic/logic_utils.mli +@@ -319,7 +319,7 @@ val merge_funspec : + val clear_funspec: funspec -> unit + + (** {2 Discriminating code_annotations} *) +-(** Functions below allows to test a special kind of code_annotation. ++(** Functions below allows one to test a special kind of code_annotation. + Use them in conjunction with {!Annotations.get_filter} to retrieve + a particular kind of annotations associated to a statement. *) + +diff --git a/src/ai/trace.ml b/src/ai/trace.ml +index 86f609b..fb5e830 100644 +--- a/src/ai/trace.ml ++++ b/src/ai/trace.ml +@@ -31,7 +31,7 @@ let empty_execution_count = (0,0);; + (* Nodes in the intra-procedural trace graph. They are identified by + the stmt that begin them, together with an approximation of the + number of times the block has been executed. The execution count +- allows to differentiate multiple executions of the same basic ++ allows one to differentiate multiple executions of the same basic + block, which helps maintaining precise traces. + + The start of the trace is identified with a special element +diff --git a/src/gui/filetree.ml b/src/gui/filetree.ml +index e5c2e78..8f6f4e1 100644 +--- a/src/gui/filetree.ml ++++ b/src/gui/filetree.ml +@@ -337,7 +337,7 @@ end + + module MODEL=MAKE(MYTREE) + +-(* Primitives to handle the filetree menu (which allows to hide some ++(* Primitives to handle the filetree menu (which allows one to hide some + entries) *) + module MenusHide = struct + let hide key () = Configuration.find_bool ~default:false key +diff --git a/src/kernel/exn_flow.ml b/src/kernel/exn_flow.ml +index 69c639d..f2968ff 100644 +--- a/src/kernel/exn_flow.ml ++++ b/src/kernel/exn_flow.ml +@@ -632,7 +632,7 @@ object(self) + + method private guard_post_cond (kind,pred as orig) = + match kind with +- (* If we exit explicitely with exit, ++ (* If we exit explicitly with exit, + we haven't seen an uncaught exception anyway. *) + | Exits | Breaks | Continues -> orig + | Returns | Normal -> +diff --git a/src/kernel/file.ml b/src/kernel/file.ml +index 7970f82..cde0b06 100644 +--- a/src/kernel/file.ml ++++ b/src/kernel/file.ml +@@ -1104,7 +1104,7 @@ let parse = function + "your preprocessor is not known to handle option `%s'. \ + If pre-processing fails because of it, please add \ + -no-cpp-gnu-like option to Frama-C's command-line. \ +- If you do not want to see this warning again, use explicitely \ ++ If you do not want to see this warning again, use explicitly \ + -cpp-gnu-like option." + opt; + opt +diff --git a/src/lib/bitvector.ml b/src/lib/bitvector.ml +index 66bf84f..8f0007e 100644 +--- a/src/lib/bitvector.ml ++++ b/src/lib/bitvector.ml +@@ -34,7 +34,7 @@ + bitvector, which has to be provided in some informations (such as + concat). We rely on the invariant that the extra bits are set to + 0 (this is important e.g. for equality testing). An alternative +- design could have been not to explicitely ignore these extra bits ++ design could have been not to explicitly ignore these extra bits + in operations that are sensitive to them, but this seems more + error-prone. *) + +diff --git a/src/memory_state/cvalue.mli b/src/memory_state/cvalue.mli +index d6aa362..170a5c6 100644 +--- a/src/memory_state/cvalue.mli ++++ b/src/memory_state/cvalue.mli +@@ -237,7 +237,7 @@ module Model: sig + [loc] in [state]. If [loc] is not writable, {!bottom} is returned. + The returned boolean indicates that the location may be invalid. + For this function, [v] is an initialized value; the function +- {!add_binding_unspecified} allows to write a possibly unspecified ++ {!add_binding_unspecified} allows one to write a possibly unspecified + value to [state]. *) + val add_binding : + exact:bool -> t -> location -> V.t -> bool * t +diff --git a/src/memory_state/lmap_sig.mli b/src/memory_state/lmap_sig.mli +index 972a9e7..b6c6590 100644 +--- a/src/memory_state/lmap_sig.mli ++++ b/src/memory_state/lmap_sig.mli +@@ -89,7 +89,7 @@ val find_base : Base.t -> t -> offsetmap_top_bottom + val find_base_or_default : Base.t -> t -> offsetmap_top_bottom + (** Same as [find_base], but return the default values for bases + that are not currently present in the map. Prefer the use of this function +- to [find_base], unless you explicitely want to see if the base is bound. *) ++ to [find_base], unless you explicitly want to see if the base is bound. *) + + + (** {2 Binding variables} *) +diff --git a/src/value/eval_annots.ml b/src/value/eval_annots.ml +index c57a00d..0b08287 100644 +--- a/src/value/eval_annots.ml ++++ b/src/value/eval_annots.ml +@@ -324,7 +324,7 @@ let check_fct_assigns kf ab ~pre_state found_froms = + let source = fst (asgn.it_content.term_loc) in + let ip = Property.ip_of_from kf Kglobal bol from in + (* Note: narrowing the stated assigns (in [assigns_zone]) +- with the ones really found (in [outputs]) allows to ++ with the ones really found (in [outputs]) allows one to + have less dependencies. But this is sound only if the + assigns from express a weak update. + +diff --git a/tests/spec/oracle/preprocess_string.res.oracle b/tests/spec/oracle/preprocess_string.res.oracle +index 064fa94..b2ec6eb 100644 +--- a/tests/spec/oracle/preprocess_string.res.oracle ++++ b/tests/spec/oracle/preprocess_string.res.oracle +@@ -1,5 +1,5 @@ + [kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +-[kernel] warning: your preprocessor is not known to handle option ` -nostdinc'. If pre-processing fails because of it, please add -no-cpp-gnu-like option to Frama-C's command-line. If you do not want to see this warning again, use explicitely -cpp-gnu-like option. ++[kernel] warning: your preprocessor is not known to handle option ` -nostdinc'. If pre-processing fails because of it, please add -no-cpp-gnu-like option to Frama-C's command-line. If you do not want to see this warning again, use explicitly -cpp-gnu-like option. + [kernel] Parsing tests/spec/preprocess_string.c (with preprocessing) + /* Generated by Frama-C */ + /*@ ensures *("/*"+0) ≡ '/'; */ diff -Nru frama-c-20140301+neon+dfsg/debian/patches/0002-Use-bin-cp-instead-of-usr-bin-install.patch frama-c-20150201+sodium+dfsg/debian/patches/0002-Use-bin-cp-instead-of-usr-bin-install.patch --- frama-c-20140301+neon+dfsg/debian/patches/0002-Use-bin-cp-instead-of-usr-bin-install.patch 2014-04-29 17:16:49.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/debian/patches/0002-Use-bin-cp-instead-of-usr-bin-install.patch 2015-08-31 21:02:06.000000000 +0000 @@ -3,14 +3,14 @@ Subject: Use /bin/cp instead of /usr/bin/install --- - share/Makefile.common | 2 +- + share/Makefile.common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/Makefile.common b/share/Makefile.common -index 8580d75..f4cc748 100644 +index 583a23a..8c91ef6 100644 --- a/share/Makefile.common +++ b/share/Makefile.common -@@ -138,7 +138,7 @@ CHMOD_RW= sh -c \ +@@ -148,7 +148,7 @@ CHMOD_RW= sh -c \ 'for f in "$$@"; do \ if test -e $$f; then chmod u+w $$f; fi \ done' chmod_rw @@ -19,4 +19,3 @@ #follow symbolic link CP_L = cp -fL ECHO = echo --- diff -Nru frama-c-20140301+neon+dfsg/debian/patches/0003-Disable-CHMOD_RO-invocations.patch frama-c-20150201+sodium+dfsg/debian/patches/0003-Disable-CHMOD_RO-invocations.patch --- frama-c-20140301+neon+dfsg/debian/patches/0003-Disable-CHMOD_RO-invocations.patch 2014-04-29 17:16:49.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/debian/patches/0003-Disable-CHMOD_RO-invocations.patch 2015-08-31 21:02:06.000000000 +0000 @@ -3,14 +3,14 @@ Subject: Disable CHMOD_RO invocations --- - share/Makefile.common | 2 +- + share/Makefile.common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/Makefile.common b/share/Makefile.common -index f4cc748..eb169e4 100644 +index 8c91ef6..f7654a3 100644 --- a/share/Makefile.common +++ b/share/Makefile.common -@@ -133,7 +133,7 @@ external_make = \ +@@ -143,7 +143,7 @@ external_make = \ CAT = cat CHMOD = chmod @@ -19,4 +19,3 @@ CHMOD_RW= sh -c \ 'for f in "$$@"; do \ if test -e $$f; then chmod u+w $$f; fi \ --- diff -Nru frama-c-20140301+neon+dfsg/debian/patches/0004-Don-t-fail-during-the-configure-on-bytecode-architec.patch frama-c-20150201+sodium+dfsg/debian/patches/0004-Don-t-fail-during-the-configure-on-bytecode-architec.patch --- frama-c-20140301+neon+dfsg/debian/patches/0004-Don-t-fail-during-the-configure-on-bytecode-architec.patch 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/debian/patches/0004-Don-t-fail-during-the-configure-on-bytecode-architec.patch 2015-08-31 21:02:06.000000000 +0000 @@ -0,0 +1,21 @@ +From: Mehdi Dogguy +Date: Mon, 31 Aug 2015 13:20:47 +0000 +Subject: Don't fail during the configure on bytecode architectures + +--- + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/configure.in b/configure.in +index 9f5f9d8..164f1bc 100644 +--- a/configure.in ++++ b/configure.in +@@ -376,7 +376,7 @@ if test "$ENABLE_LOCAL_OCAMLGRAPH" != "yes"; then + ocamlgraph_error + fi + else +- ocamlgraph_error ++ echo "Upstream .oO(I'm too lazy to write a test for the pure bytecode case)" + fi + fi + else diff -Nru frama-c-20140301+neon+dfsg/debian/patches/0004-Port-to-OCamlgraph-1.8.5.patch frama-c-20150201+sodium+dfsg/debian/patches/0004-Port-to-OCamlgraph-1.8.5.patch --- frama-c-20140301+neon+dfsg/debian/patches/0004-Port-to-OCamlgraph-1.8.5.patch 2014-04-29 17:16:49.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/debian/patches/0004-Port-to-OCamlgraph-1.8.5.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,254 +0,0 @@ -From: Mehdi Dogguy -Date: Sun, 27 Apr 2014 13:46:16 +0200 -Subject: Port to OCamlgraph 1.8.5 - ---- - src/impact/reason_graph.ml | 2 +- - src/kernel/stmts_graph.ml | 10 +++++----- - src/logic/property_status.ml | 8 ++++---- - src/misc/service_graph.ml | 4 ++-- - src/pdg_types/pdgTypes.ml | 6 +++--- - src/postdominators/print.ml | 2 +- - src/semantic_callgraph/register.ml | 4 ++-- - src/slicing/printSlice.ml | 10 +++++----- - src/syntactic_callgraph/register.ml | 4 ++-- - src/wp/cil2cfg.ml | 12 ++++++------ - 10 files changed, 31 insertions(+), 31 deletions(-) - -diff --git a/src/impact/reason_graph.ml b/src/impact/reason_graph.ml -index eabacb0..ce19b4a 100644 ---- a/src/impact/reason_graph.ml -+++ b/src/impact/reason_graph.ml -@@ -139,7 +139,7 @@ module Printer (X: AdditionalInfo) = struct - - let graph_attributes _ = [`Label "Impact graph"] - -- let default_vertex_attributes _g = [`Style [`Filled]; `Shape `Box] -+ let default_vertex_attributes _g = [`Style `Filled; `Shape `Box] - let default_edge_attributes _g = [] - - let vertex_attributes v = -diff --git a/src/kernel/stmts_graph.ml b/src/kernel/stmts_graph.ml -index a8fe121..16059c3 100644 ---- a/src/kernel/stmts_graph.ml -+++ b/src/kernel/stmts_graph.ml -@@ -157,12 +157,12 @@ module TP = struct - - let vertex_attributes s = - match s.skind with -- | Loop _ -> [`Color 0xFF0000; `Style [`Filled]] -- | If _ -> [`Color 0x00FF00; `Style [`Filled]; `Shape `Diamond] -- | Return _ -> [`Color 0x0000FF; `Style [`Filled]] -+ | Loop _ -> [`Color 0xFF0000; `Style `Filled] -+ | If _ -> [`Color 0x00FF00; `Style `Filled; `Shape `Diamond] -+ | Return _ -> [`Color 0x0000FF; `Style `Filled] - | Block _ -> [`Shape `Box; `Fontsize 8] -- | Goto _ -> [`Shape `Diamond; `Color 0x00FFFF ; `Style [`Filled]] -- | Instr (Skip _) -> [`Color 0x00FFFF ; `Style [`Filled]] -+ | Goto _ -> [`Shape `Diamond; `Color 0x00FFFF ; `Style `Filled] -+ | Instr (Skip _) -> [`Color 0x00FFFF ; `Style `Filled] - | _ -> [] - let default_vertex_attributes _ = [] - -diff --git a/src/logic/property_status.ml b/src/logic/property_status.ml -index f7c278d..47485f6 100644 ---- a/src/logic/property_status.ml -+++ b/src/logic/property_status.ml -@@ -1481,12 +1481,12 @@ module Consolidation_graph = struct - let s = get_status p in - let color = status_color p s in - let style = match s with -- | Never_tried -> [`Style [`Bold]; `Width 0.8 ] -- | _ -> [`Style [`Filled]] -+ | Never_tried -> [`Style `Bold; `Width 0.8 ] -+ | _ -> [`Style `Filled] - in - style @ [ label v; `Color color; `Shape `Box ] - | Emitter _ as v -> -- [ label v; `Shape `Diamond; `Color 0xb0c4de; `Style [`Filled] ] -+ [ label v; `Shape `Diamond; `Color 0xb0c4de; `Style `Filled ] - | Tuning_parameter _ as v -> - [ label v; (*`Style `Dotted;*) `Color 0xb0c4de; ] - (*| Correctness_parameter _ (*as v*) -> assert false (*[ label v; `Color 0xb0c4de ]*)*) -@@ -1495,7 +1495,7 @@ module Consolidation_graph = struct - | None -> [] - | Some s -> - let c = emitted_status_color s in -- [ `Color c; `Fontcolor c; `Style [`Bold] ] -+ [ `Color c; `Fontcolor c; `Style `Bold ] - - let default_vertex_attributes _ = [] - let default_edge_attributes _ = [] -diff --git a/src/misc/service_graph.ml b/src/misc/service_graph.ml -index 4f866c5..d158028 100644 ---- a/src/misc/service_graph.ml -+++ b/src/misc/service_graph.ml -@@ -289,7 +289,7 @@ Src root:%s in %s (is_root:%b) Dst:%s in %s (is_root:%b) [2d case]" - color e - else - match CallG.E.label e with -- | Inter_services -> [ `Style [`Invis] ] -+ | Inter_services -> [ `Style `Invis ] - | Inter_functions | Both -> color e - - let default_edge_attributes _ = [] -@@ -303,7 +303,7 @@ Src root:%s in %s (is_root:%b) Dst:%s in %s (is_root:%b) [2d case]" - sg_attributes = - [ `Label ("S " ^ cs); - `Color (Extlib.number_to_color id); -- `Style [`Bold] ] } -+ `Style `Bold ] } - - end - -diff --git a/src/pdg_types/pdgTypes.ml b/src/pdg_types/pdgTypes.ml -index 05754e4..74cdebf 100644 ---- a/src/pdg_types/pdgTypes.ml -+++ b/src/pdg_types/pdgTypes.ml -@@ -626,7 +626,7 @@ module Pdg = struct - - let graph_attributes _ = [`Rankdir `TopToBottom ] - -- let default_vertex_attributes _ = [`Style [`Filled]] -+ let default_vertex_attributes _ = [`Style `Filled] - let vertex_name v = string_of_int (Node.id v) - - let vertex_attributes v = -@@ -711,13 +711,13 @@ module Pdg = struct - if Dpd.is_ctrl d then (`Arrowtail `Odot)::attrib else attrib - in - let attrib = -- if Dpd.is_addr d then (`Style [`Dotted])::attrib else attrib -+ if Dpd.is_addr d then (`Style `Dotted)::attrib else attrib - in - attrib - - let get_subgraph v = - let mk_subgraph name attrib = -- let attrib = (`Style [`Filled]) :: attrib in -+ let attrib = (`Style `Filled) :: attrib in - Some { Graph.Graphviz.DotAttributes.sg_name= name; - sg_parent = None; - sg_attributes = attrib } -diff --git a/src/postdominators/print.ml b/src/postdominators/print.ml -index f2e3a25..15f4ff2 100644 ---- a/src/postdominators/print.ml -+++ b/src/postdominators/print.ml -@@ -63,7 +63,7 @@ module Printer = struct - - let graph_attributes (title, _) = [`Label title] - -- let default_vertex_attributes _g = [`Style [`Filled]] -+ let default_vertex_attributes _g = [`Style `Filled] - let default_edge_attributes _g = [] - - let vertex_attributes (s, has_postdom) = -diff --git a/src/semantic_callgraph/register.ml b/src/semantic_callgraph/register.ml -index 1c79dcc..071f061 100644 ---- a/src/semantic_callgraph/register.ml -+++ b/src/semantic_callgraph/register.ml -@@ -102,8 +102,8 @@ module Service = - let name = Kernel_function.get_name - let attributes v = - [ `Style -- [if Kernel_function.is_definition v then `Bold -- else `Dotted] ] -+ (if Kernel_function.is_definition v then `Bold -+ else `Dotted) ] - let entry_point () = - try Some (fst (Globals.entry_point ())) - with Globals.No_such_entry_point _ -> None -diff --git a/src/slicing/printSlice.ml b/src/slicing/printSlice.ml -index c5363f9..211e0bb 100644 ---- a/src/slicing/printSlice.ml -+++ b/src/slicing/printSlice.ml -@@ -227,7 +227,7 @@ module PrintProject = struct - - let graph_attributes (name, _) = [`Label name] - -- let default_vertex_attributes _ = [`Style [`Filled]] -+ let default_vertex_attributes _ = [`Style `Filled] - - let vertex_name v = match v with - | Src fi -> SlicingMacros.fi_name fi -@@ -280,16 +280,16 @@ module PrintProject = struct - - let edge_attributes (e, call) = - let attrib = match e with -- | (Src _, Src _) -> [`Style [`Invis]] -- | (OptSliceCallers _, _) -> [`Style [`Invis]] -- | (_, OptSliceCallers _) -> [`Style [`Invis]] -+ | (Src _, Src _) -> [`Style `Invis] -+ | (OptSliceCallers _, _) -> [`Style `Invis] -+ | (_, OptSliceCallers _) -> [`Style `Invis] - | _ -> [] - in match call with None -> attrib - | Some call -> (`Label (string_of_int call.sid)):: attrib - - let get_subgraph v = - let mk_subgraph name attrib = -- let attrib = (*(`Label name) ::*) (`Style [`Filled]) :: attrib in -+ let attrib = (*(`Label name) ::*) (`Style `Filled) :: attrib in - Some { Graph.Graphviz.DotAttributes.sg_name= name; - sg_parent = None; - sg_attributes = attrib } -diff --git a/src/syntactic_callgraph/register.ml b/src/syntactic_callgraph/register.ml -index d4669c4..d41980e 100644 ---- a/src/syntactic_callgraph/register.ml -+++ b/src/syntactic_callgraph/register.ml -@@ -37,8 +37,8 @@ module Service = - let name v = nodeName v.cnInfo - let attributes v = - [ match v.cnInfo with -- | NIVar (_,b) when not !b -> `Style [`Dotted] -- | _ -> `Style [`Bold] ] -+ | NIVar (_,b) when not !b -> `Style `Dotted -+ | _ -> `Style `Bold ] - let equal v1 v2 = id v1 = id v2 - let compare v1 v2 = - let i1 = id v1 in -diff --git a/src/wp/cil2cfg.ml b/src/wp/cil2cfg.ml -index 6d8cf09..ba5f410 100644 ---- a/src/wp/cil2cfg.ml -+++ b/src/wp/cil2cfg.ml -@@ -1278,9 +1278,9 @@ module Printer (PE : sig val edge_txt : edge -> string end) = struct - | Vstart | Vend | Vexit -> [`Color 0x0000FF; `Shape `Doublecircle] - | VfctIn | VfctOut -> [`Color 0x0000FF; `Shape `Box] - | VblkIn _ | VblkOut _ -> [`Shape `Box] -- | Vloop _ | Vloop2 _ -> [`Color 0xFF0000; `Style [`Filled]] -+ | Vloop _ | Vloop2 _ -> [`Color 0xFF0000; `Style `Filled] - | Vtest _ | Vswitch _ -> -- [`Color 0x00FF00; `Style [`Filled]; `Shape `Diamond] -+ [`Color 0x00FF00; `Style `Filled; `Shape `Diamond] - | Vcall _ | Vstmt _ -> [] - in (`Label (String.escaped label))::attr - -@@ -1290,15 +1290,15 @@ module Printer (PE : sig val edge_txt : edge -> string end) = struct - let attr = [] in - let attr = (`Label (String.escaped (PE.edge_txt e)))::attr in - let attr = -- if is_back_edge e then (`Constraint false)::(`Style [`Bold])::attr -+ if is_back_edge e then (`Constraint false)::(`Style `Bold)::attr - else attr - in - let attr = match (edge_type e) with - | Ethen | EbackThen -> (`Color 0x00FF00)::attr - | Eelse | EbackElse -> (`Color 0xFF0000)::attr -- | Ecase [] -> (`Color 0x0000FF)::(`Style [`Dashed])::attr -+ | Ecase [] -> (`Color 0x0000FF)::(`Style `Dashed)::attr - | Ecase _ -> (`Color 0x0000FF)::attr -- | Enext -> (`Style [`Dotted])::attr -+ | Enext -> (`Style `Dotted)::attr - | Eback -> attr (* see is_back_edge above *) - | Enone -> attr - in -@@ -1308,7 +1308,7 @@ module Printer (PE : sig val edge_txt : edge -> string end) = struct - - let get_subgraph v = - let mk_subgraph name attrib = -- let attrib = (`Style [`Filled]) :: attrib in -+ let attrib = (`Style `Filled) :: attrib in - Some { Graph.Graphviz.DotAttributes.sg_name= name; - sg_parent = None; - sg_attributes = attrib } --- diff -Nru frama-c-20140301+neon+dfsg/debian/patches/0005-Don-t-fail-during-the-configure-on-bytecode-architec.patch frama-c-20150201+sodium+dfsg/debian/patches/0005-Don-t-fail-during-the-configure-on-bytecode-architec.patch --- frama-c-20140301+neon+dfsg/debian/patches/0005-Don-t-fail-during-the-configure-on-bytecode-architec.patch 2014-04-29 17:16:49.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/debian/patches/0005-Don-t-fail-during-the-configure-on-bytecode-architec.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -From: Mehdi Dogguy -Date: Mon, 28 Apr 2014 21:25:50 +0200 -Subject: Don't fail during the configure on bytecode architectures - ---- - configure.in | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/configure.in b/configure.in -index 81acf76..4d047d4 100644 ---- a/configure.in -+++ b/configure.in -@@ -357,7 +357,7 @@ if test "$OCAMLGRAPH_EXISTS" = "yes"; then - ocamlgraph_error - fi - else -- ocamlgraph_error -+ echo "Upstream .oO(I'm too lazy to write a test for the pure bytecode case)" - fi - fi - else --- diff -Nru frama-c-20140301+neon+dfsg/debian/patches/series frama-c-20150201+sodium+dfsg/debian/patches/series --- frama-c-20140301+neon+dfsg/debian/patches/series 2014-04-29 17:16:49.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/debian/patches/series 2015-08-31 21:02:06.000000000 +0000 @@ -1,5 +1,4 @@ 0001-Fix-spelling-error-in-binary.patch 0002-Use-bin-cp-instead-of-usr-bin-install.patch 0003-Disable-CHMOD_RO-invocations.patch -0004-Port-to-OCamlgraph-1.8.5.patch -0005-Don-t-fail-during-the-configure-on-bytecode-architec.patch +0004-Don-t-fail-during-the-configure-on-bytecode-architec.patch diff -Nru frama-c-20140301+neon+dfsg/debian/rules frama-c-20150201+sodium+dfsg/debian/rules --- frama-c-20140301+neon+dfsg/debian/rules 2014-04-29 17:16:49.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/debian/rules 2015-08-31 22:16:20.000000000 +0000 @@ -1,11 +1,12 @@ #!/usr/bin/make -f # -*- makefile -*- -export DH_VERBOSE=1 +#export DH_VERBOSE=1 include /usr/share/ocaml/ocamlvars.mk FRAMA_DIR=$(CURDIR)/debian/tmp +FRAMA_GUI_DIR=$(CURDIR)/debian/frama-c/usr/lib/frama-c override_dh_auto_configure: mkdir -p lib/plugins @@ -24,20 +25,33 @@ CFLAGS="$(CFLAGS)" \ LDFLAGS="-Wl,-z,defs" +FRAMA_GUI_LIBS=$(patsubst src/gui/%.ml, $(FRAMA_DIR)/usr/lib/frama-c/%, $(wildcard src/gui/*.ml)) + override_dh_auto_install: $(MAKE) prefix=$(FRAMA_DIR)/usr FRAMAC_DATADIR=$(FRAMA_DIR)/usr/share/frama-c install # Fix permission of .c and .h files (they don't have to be executable) find debian/ -name "*.c" -or -name "*.h" -exec chmod a-x '{}' \; + # Install icons and desktop menu entry cp debian/icons/frama-c.svg $(CURDIR)/debian/frama-c/usr/share/icons/hicolor/scalable/apps/ cp debian/icons/frama-c.xpm $(CURDIR)/debian/frama-c/usr/share/pixmaps/ cp debian/frama-c.desktop $(CURDIR)/debian/frama-c/usr/share/applications/ + # Remove useless binaries $(RM) -f $(CURDIR)/debian/frama-c/usr/bin/frama-c-gui.byte $(RM) -f $(CURDIR)/debian/frama-c/usr/bin/ptests.byte # Same file as frama-c.1. We use a symlink instead of copying the file twice $(RM) -f $(FRAMA_DIR)/usr/share/man/man1/frama-c-gui.1 + # On Bytecode architectures, bin/frama-c.byte is sam as bin/frama-c ifeq ($(OCAML_OPT_ARCH),) $(RM) -f $(CURDIR)/debian/frama-c/usr/bin/frama-c.byte endif + # Move GUI related objects in the appropriate package + mkdir -p $(FRAMA_GUI_DIR) + mv $(patsubst %, %.cmo, $(FRAMA_GUI_LIBS)) $(FRAMA_GUI_DIR) + mv $(patsubst %, %.cmi, $(FRAMA_GUI_LIBS)) $(FRAMA_GUI_DIR) +ifeq ($(OCAML_HAVE_OCAMLOPT),yes) + mv $(patsubst %, %.cmx, $(FRAMA_GUI_LIBS)) $(FRAMA_GUI_DIR) + mv $(patsubst %, %.o, $(FRAMA_GUI_LIBS)) $(FRAMA_GUI_DIR) +endif override_dh_auto_clean: touch .depend diff -Nru frama-c-20140301+neon+dfsg/doc/code/docgen_ge400.ml frama-c-20150201+sodium+dfsg/doc/code/docgen_ge400.ml --- frama-c-20140301+neon+dfsg/doc/code/docgen_ge400.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/docgen_ge400.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/doc/code/docgen_lt400.ml frama-c-20150201+sodium+dfsg/doc/code/docgen_lt400.ml --- frama-c-20140301+neon+dfsg/doc/code/docgen_lt400.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/docgen_lt400.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/doc/code/intro_kernel_plugin.txt frama-c-20150201+sodium+dfsg/doc/code/intro_kernel_plugin.txt --- frama-c-20140301+neon+dfsg/doc/code/intro_kernel_plugin.txt 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/intro_kernel_plugin.txt 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ @ignore @ignore This file is part of Frama-C. @ignore -@ignore Copyright (C) 2007-2014 +@ignore Copyright (C) 2007-2015 @ignore CEA (Commissariat à l'énergie atomique et aux énergies @ignore alternatives) @ignore diff -Nru frama-c-20140301+neon+dfsg/doc/code/intro_occurrence.txt frama-c-20150201+sodium+dfsg/doc/code/intro_occurrence.txt --- frama-c-20140301+neon+dfsg/doc/code/intro_occurrence.txt 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/intro_occurrence.txt 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ @ignore @ignore This file is part of Frama-C. @ignore -@ignore Copyright (C) 2007-2014 +@ignore Copyright (C) 2007-2015 @ignore CEA (Commissariat à l'énergie atomique et aux énergies @ignore alternatives) @ignore diff -Nru frama-c-20140301+neon+dfsg/doc/code/intro_pdg.txt frama-c-20150201+sodium+dfsg/doc/code/intro_pdg.txt --- frama-c-20140301+neon+dfsg/doc/code/intro_pdg.txt 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/intro_pdg.txt 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ @ignore @ignore This file is part of Frama-C. @ignore -@ignore Copyright (C) 2007-2014 +@ignore Copyright (C) 2007-2015 @ignore CEA (Commissariat à l'énergie atomique et aux énergies @ignore alternatives) @ignore diff -Nru frama-c-20140301+neon+dfsg/doc/code/intro_plugin_D_and_S.txt frama-c-20150201+sodium+dfsg/doc/code/intro_plugin_D_and_S.txt --- frama-c-20140301+neon+dfsg/doc/code/intro_plugin_D_and_S.txt 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/intro_plugin_D_and_S.txt 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ @ignore @ignore This file is part of Frama-C. @ignore -@ignore Copyright (C) 2007-2014 +@ignore Copyright (C) 2007-2015 @ignore CEA (Commissariat à l'énergie atomique et aux énergies @ignore alternatives) @ignore diff -Nru frama-c-20140301+neon+dfsg/doc/code/intro_plugin_default.txt frama-c-20150201+sodium+dfsg/doc/code/intro_plugin_default.txt --- frama-c-20140301+neon+dfsg/doc/code/intro_plugin_default.txt 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/intro_plugin_default.txt 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ @ignore @ignore This file is part of Frama-C. @ignore -@ignore Copyright (C) 2007-2014 +@ignore Copyright (C) 2007-2015 @ignore CEA (Commissariat à l'énergie atomique et aux énergies @ignore alternatives) @ignore diff -Nru frama-c-20140301+neon+dfsg/doc/code/intro_plugin.txt frama-c-20150201+sodium+dfsg/doc/code/intro_plugin.txt --- frama-c-20140301+neon+dfsg/doc/code/intro_plugin.txt 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/intro_plugin.txt 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ @ignore @ignore This file is part of Frama-C. @ignore -@ignore Copyright (C) 2007-2014 +@ignore Copyright (C) 2007-2015 @ignore CEA (Commissariat à l'énergie atomique et aux énergies @ignore alternatives) @ignore diff -Nru frama-c-20140301+neon+dfsg/doc/code/intro_scope.txt frama-c-20150201+sodium+dfsg/doc/code/intro_scope.txt --- frama-c-20140301+neon+dfsg/doc/code/intro_scope.txt 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/intro_scope.txt 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ @ignore @ignore This file is part of Frama-C. @ignore -@ignore Copyright (C) 2007-2014 +@ignore Copyright (C) 2007-2015 @ignore CEA (Commissariat à l'énergie atomique et aux énergies @ignore alternatives) @ignore diff -Nru frama-c-20140301+neon+dfsg/doc/code/intro_slicing.txt frama-c-20150201+sodium+dfsg/doc/code/intro_slicing.txt --- frama-c-20140301+neon+dfsg/doc/code/intro_slicing.txt 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/intro_slicing.txt 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ @ignore @ignore This file is part of Frama-C. @ignore -@ignore Copyright (C) 2007-2014 +@ignore Copyright (C) 2007-2015 @ignore CEA (Commissariat à l'énergie atomique et aux énergies @ignore alternatives) @ignore diff -Nru frama-c-20140301+neon+dfsg/doc/code/intro_sparecode.txt frama-c-20150201+sodium+dfsg/doc/code/intro_sparecode.txt --- frama-c-20140301+neon+dfsg/doc/code/intro_sparecode.txt 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/intro_sparecode.txt 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ @ignore @ignore This file is part of Frama-C. @ignore -@ignore Copyright (C) 2007-2014 +@ignore Copyright (C) 2007-2015 @ignore CEA (Commissariat à l'énergie atomique et aux énergies @ignore alternatives) @ignore diff -Nru frama-c-20140301+neon+dfsg/doc/code/intro_wp.txt frama-c-20150201+sodium+dfsg/doc/code/intro_wp.txt --- frama-c-20140301+neon+dfsg/doc/code/intro_wp.txt 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/intro_wp.txt 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ @ignore @ignore This file is part of WP plug-in of Frama-C. @ignore -@ignore Copyright (C) 2007-2014 +@ignore Copyright (C) 2007-2015 @ignore CEA (Commissariat a l'energie atomique et aux energies @ignore alternatives) @ignore diff -Nru frama-c-20140301+neon+dfsg/doc/code/print_api/grammar.mly frama-c-20150201+sodium+dfsg/doc/code/print_api/grammar.mly --- frama-c-20140301+neon+dfsg/doc/code/print_api/grammar.mly 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/print_api/grammar.mly 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/doc/code/print_api/lexer.mll frama-c-20150201+sodium+dfsg/doc/code/print_api/lexer.mll --- frama-c-20140301+neon+dfsg/doc/code/print_api/lexer.mll 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/print_api/lexer.mll 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/doc/code/print_api/Makefile frama-c-20150201+sodium+dfsg/doc/code/print_api/Makefile --- frama-c-20140301+neon+dfsg/doc/code/print_api/Makefile 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/print_api/Makefile 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # diff -Nru frama-c-20140301+neon+dfsg/doc/code/print_api/print_interface.ml frama-c-20150201+sodium+dfsg/doc/code/print_api/print_interface.ml --- frama-c-20140301+neon+dfsg/doc/code/print_api/print_interface.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/print_api/print_interface.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -273,11 +273,11 @@ in let rec print_types fmt sp = function | [] -> () - | (h, long_h) :: q -> + | (h, long_h) :: q -> Format.fprintf fmt "@\n%stype %s@\n%s \ (** @@call by writing [T.ty] where [T] has previously been defined by: \ -[let module T = Type.Make(struct let name = %s end)] *)" - sp h sp long_h; +[module T = Type.Abstract(struct let name = %s end)]. Be careful to replace occurrences of %s by T.ty anywhere else in this doc. *)" + sp h sp long_h long_h; print_types fmt sp q in let rec print_one_plugin fmt i key1 = diff -Nru frama-c-20140301+neon+dfsg/doc/code/style.css frama-c-20150201+sodium+dfsg/doc/code/style.css --- frama-c-20140301+neon+dfsg/doc/code/style.css 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/style.css 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/doc/code/toc_head.htm frama-c-20150201+sodium+dfsg/doc/code/toc_head.htm --- frama-c-20140301+neon+dfsg/doc/code/toc_head.htm 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/toc_head.htm 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ - + diff -Nru frama-c-20140301+neon+dfsg/doc/code/toc_tail.htm frama-c-20150201+sodium+dfsg/doc/code/toc_tail.htm --- frama-c-20140301+neon+dfsg/doc/code/toc_tail.htm 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/code/toc_tail.htm 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ - + diff -Nru frama-c-20140301+neon+dfsg/doc/Makefile frama-c-20150201+sodium+dfsg/doc/Makefile --- frama-c-20140301+neon+dfsg/doc/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/Makefile 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,83 @@ +########################################################################## +# # +# This file is part of Frama-C. # +# # +# Copyright (C) 2007-2015 # +# 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 just download the manuals in the released version + +all:download + + +FRAMAC_SRC=.. +MAKECONFIG_DIR=$(FRAMAC_SRC)/share + +include $(FRAMAC_SRC)/share/Makefile.common + +DOCDIR ?= "$(DESTDIR)${prefix}/share/doc" +FRAMAC_DOCDIR ?= $(DOCDIR)/frama-c + +################### +# Frama-C Version # +################### + +VERSION=$(shell $(SED) -e 's/\\(.*\\)/\\1/' $(FRAMAC_SRC)/VERSION) + +ifeq ($(findstring +dev,$(VERSION)),+dev) +DEVELOPMENT=yes +else +DEVELOPMENT=no +endif + +### + +.PHONY: force + + +MANUALS=acsl + +#MANUALS that depend on the frama-c version +VERSIONED_MANUALS=acsl-implementation aorai-manual rte-manual \ + wp-manual metrics-manual user-manual \ + plugin-development-guide value-analysis + +FILES= $(addprefix manuals/, \ + $(addsuffix -$(VERSION).pdf, $(VERSIONED_MANUALS)) \ + $(addsuffix .pdf, $(MANUALS)) \ + ) + + +ifeq ($(DEVELOPMENT),yes) + +download: force + @echo "You can't download the manuals in this way for the development version" + +else + +download: force + $(MKDIR) manuals + wget -nv -N -P manuals \ + $(addprefix http://frama-c.com/download/,$(addsuffix -$(VERSION).pdf, $(VERSIONED_MANUALS))) \ + $(addprefix http://frama-c.com/download/,$(addsuffix .pdf, $(MANUALS))) + +endif + +install: + $(MKDIR) $(FRAMAC_DOCDIR) + $(CP) $(FILES) $(FRAMAC_DOCDIR) diff -Nru frama-c-20140301+neon+dfsg/doc/README frama-c-20150201+sodium+dfsg/doc/README --- frama-c-20140301+neon+dfsg/doc/README 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/doc/README 2015-05-28 08:53:20.000000000 +0000 @@ -1,6 +1,7 @@ -This is the main source of documentation for the Frama-C distribution. +The main source of documentation for the Frama-C distribution can be downloaded +by running `make` in the directory of this README. -The manuals directory contains the following manuals +Then the manuals directory will contain the following manuals * acsl is the reference manual of the specification manual * acsl-implementation is a copy of the ACSL reference manual with some implementation-specific remarks. In particular, it explains which diff -Nru frama-c-20140301+neon+dfsg/external/hptmap.ml frama-c-20150201+sodium+dfsg/external/hptmap.ml --- frama-c-20140301+neon+dfsg/external/hptmap.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/external/hptmap.ml 2015-05-29 15:31:43.000000000 +0000 @@ -69,25 +69,41 @@ type ('key, 'value) tree = | Empty - | Leaf of 'key * 'value * bool + | Leaf of 'key * 'value * tag | Branch of int (** prefix *) * Big_Endian.mask * ('key, 'value) tree * ('key, 'value) tree * tag +let hash_generic tr = + match tr with + | Empty -> 27 + | Leaf (_, _, tag) + | Branch (_, _, _, _, tag) -> Tag_comp.get_tag tag + module type Id_Datatype = sig include Datatype.S val id: t -> int end +module type V = sig + include Datatype.S + val pretty_debug: t Pretty_utils.formatter +end + module Shape(Key: Id_Datatype) = struct type 'b t = (Key.t, 'b) tree end +type cache_type = +| NoCache +| PersistentCache of string +| TemporaryCache of string + module Make (Key: Id_Datatype) - (V : Datatype.S) + (V : V) (Compositional_bool : sig val e: bool val f : Key.t -> V.t -> bool @@ -114,8 +130,9 @@ let rec pretty_debug fmt = function | Empty -> Format.fprintf fmt "Empty" | Leaf (k, v, comp) as t -> - Format.fprintf fmt "K<%d> (%a -> %a, %b)" - (Extlib.address_of_value t) Key.pretty k V.pretty v comp + Format.fprintf fmt "K<%d> (%a -><%d> %a, %a)" + (Extlib.address_of_value t) Key.pretty k + (Extlib.address_of_value v) V.pretty_debug v Tag_comp.pretty comp | Branch (prefix, mask, t1, t2, tag) -> Format.fprintf fmt"B@[@[(p%d, m%d, t%a)@]@ @[%a@]@ @[%a@]@]" prefix mask Tag_comp.pretty tag pretty_debug t1 pretty_debug t2 @@ -125,7 +142,8 @@ if Key.compare == Datatype.undefined || V.compare == Datatype.undefined then ( - Kernel.debug "(%s, %s) ptmap, missing comparison function: %b %b" + Cmdline.Kernel_log.debug + "(%s, %s) ptmap, missing comparison function: %b %b" (Type.name Key.ty) (Type.name V.ty) (Key.compare == Datatype.undefined) (V.compare == Datatype.undefined); @@ -161,7 +179,7 @@ let compositional_bool t = match t with Empty -> Compositional_bool.e - | Leaf (_,_,c) -> c + | Leaf (_,_,tc) | Branch (_,_,_,_,tc) -> Tag_comp.get_comp tc let rec min_binding t = @@ -229,8 +247,14 @@ let current_tag = ref current_tag_before_initial_values let initial_values = + let tc k v = + let b = Compositional_bool.f k v in + let tag = !current_tag in + incr current_tag; + Tag_comp.encode tag b + in List.map - (function [k,v] -> Leaf (k, v, Compositional_bool.f k v) + (function [k,v] -> Leaf (k, v, tc k v) | [] -> Empty | _ -> assert false) Initial_Values.v @@ -256,7 +280,7 @@ let reprs = [ Empty ] let equal = ( == ) let compare = compare - let hash = hash + let hash = hash_generic let rehash x = !rehash_ref x let copy = Datatype.undefined let internal_pretty_code = Datatype.pp_fail @@ -283,26 +307,18 @@ let self = PatriciaHashconsTbl.self -(* let inform_counter = ref 0 - - let inform() = - let n = succ !inform_counter in - inform_counter := n; - if n land 16383 = 0 - then - let c = PatriciaHashconsTbl.count () in - Format.printf "%6d nodes %s@." c name -*) - let wrap_Leaf k v = - (* inform(); *) + (* The test k < p+m and the implementation of [highest_bit] do not work + with negative keys. *) assert (Key.id k >= 0); - (* The test k < p+m - and the implementation of [highest_bit] - do not work with negative keys. *) - let new_tr = Leaf (k, v, Compositional_bool.f k v) in - PatriciaHashconsTbl.merge new_tr + let b = Compositional_bool.f k v in + let tag = !current_tag in + let new_tr = Leaf (k, v, Tag_comp.encode tag b) in + let result = PatriciaHashconsTbl.merge new_tr in + if result == new_tr + then current_tag := (succ tag) land max_int ; + result let wrap_Branch p m l r = let open Compositional_bool in @@ -322,19 +338,29 @@ then current_tag := (succ tag) land max_int ; result - let rehash_node = function - | Empty -> Empty - | Leaf (k, v, _) -> wrap_Leaf k v - | Branch (p,m,l,r,_) -> wrap_Branch p m l r - - let () = rehash_ref := rehash_node - (* This reference will contain a list of functions that will clear all the transient caches used in this module *) let clear_caches = ref [] + (* The auxiliary function [match_prefix] tells whether a given key has a + given prefix. More specifically, [match_prefix k p m] returns [true] if + and only if the key [k] has prefix [p] up to bit [m]. + + Throughout our implementation of Patricia trees, prefixes are assumed to + be in normal form, i.e. their irrelevant bits are set to some + predictable value. Formally, we assume + [Big_Endian.mask p m] equals [p] whenever + [p] is a prefix with [m] relevant bits. This allows implementing + [match_prefix] using only one call to [Big_Endian.mask]. + On the other hand, this + requires normalizing prefixes, as done e.g. in [join] below, where + [Big_Endian.mask p0 m] has to be used instead of [p0]. *) + let match_prefix k p m = + Big_Endian.mask k m = p + + (* [find k m] looks up the value associated to the key [k] in the map [m], and raises [Not_found] if no value is bound to [k]. @@ -343,7 +369,6 @@ query for a non-existent key shall be detected only when finally reaching a leaf, rather than higher up in the tree. This strategy is better when (most) queries are expected to be successful. *) - let find key htr = let id = Key.id key in let rec find htr = @@ -360,6 +385,26 @@ in find htr + (* Similar to [find], but checks the prefix found at the current node *) + let find_check_missing key htr = + let id = Key.id key in + let rec find htr = + match htr with + | Empty -> + raise Not_found + | Leaf (key', data, _) -> + if Key.equal key key' then + data + else + raise Not_found + | Branch (prefix, mask, tree0, tree1, _) -> + if match_prefix id prefix mask then + find (if (id land mask) = 0 then tree0 else tree1) + else raise Not_found + in + find htr + + let find_key key htr = let id = Key.id key in let rec find htr = @@ -371,8 +416,10 @@ key' else raise Not_found - | Branch (_, mask, tree0, tree1, _) -> + | Branch (prefix, mask, tree0, tree1, _) -> + if match_prefix id prefix mask then find (if (id land mask) = 0 then tree0 else tree1) + else raise Not_found in find htr @@ -384,8 +431,10 @@ false | Leaf (key', _, _) -> Key.equal key key' - | Branch (_, mask, tree0, tree1, _) -> + | Branch (prefix, mask, tree0, tree1, _) -> + if match_prefix id prefix mask then find (if (id land mask) = 0 then tree0 else tree1) + else false in find htr @@ -425,22 +474,6 @@ else wrap_Branch p m t1 t0 - (* The auxiliary function [match_prefix] tells whether a given key has a - given prefix. More specifically, [match_prefix k p m] returns [true] if - and only if the key [k] has prefix [p] up to bit [m]. - - Throughout our implementation of Patricia trees, prefixes are assumed to - be in normal form, i.e. their irrelevant bits are set to some - predictable value. Formally, we assume - [Big_Endian.mask p m] equals [p] whenever - [p] is a prefix with [m] relevant bits. This allows implementing - [match_prefix] using only one call to [Big_Endian.mask]. - On the other hand, this - requires normalizing prefixes, as done e.g. in [join] above, where - [Big_Endian.mask p0 m] has to be used instead of [p0]. *) - let match_prefix k p m = - Big_Endian.mask k m = p - let pretty_prefix (p,m) fmt tree = let rec pretty_prefix_aux tree = match tree with @@ -511,7 +544,9 @@ match t with Empty -> None | Leaf (k, _, c) -> - if Key.id k = p && m = -1 && c then Some t else None + if Key.id k = p && m = -1 && (Tag_comp.get_comp c) + then Some t + else None | Branch (p1, m1, l, r, tc) -> if p1 = p && m1 = m then (if Tag_comp.get_comp tc then Some t else None) @@ -601,12 +636,16 @@ else raise Not_found | Branch (prefix, mask, tree0, tree1, _) -> + if match_prefix id prefix mask then if (id land mask) = 0 then let rtree0 = remove tree0 in match rtree0 with | Empty -> tree1 | _ -> + if rtree0 == tree0 then + htr + else wrap_Branch prefix mask rtree0 tree1 else let rtree1 = remove tree1 in @@ -614,7 +653,12 @@ | Empty -> tree0 | _ -> + if rtree1 == tree1 then + htr + else wrap_Branch prefix mask tree0 rtree1 + else + raise Not_found in try remove m @@ -721,6 +765,21 @@ | Branch (_, _, tree0, tree1, _) -> fold_rev f tree0 (fold_rev f tree1 accu) + let rehash_node = function + | Empty -> Empty + | Leaf (k, v, _) -> wrap_Leaf k v + | Branch (p,m,l,r,_) -> + if Descr.is_abstract Key.descr then + (* The keys id have not been modified during de-marshalling. + The shapes of [l] and [r] are compatible, just merge them. *) + wrap_Branch p m l r + else + (* The ids may have been modified, the trees can overlap. Rebuild + everything from scratch. *) + fold add l r + + let () = rehash_ref := rehash_node + let rec for_all f m = match m with @@ -739,9 +798,16 @@ | Empty -> Empty | Leaf (key, data, _) -> - wrap_Leaf key (f data) + let data' = f data in + if data == data' then htr + else + wrap_Leaf key data' | Branch (p, m, tree0, tree1, _) -> - wrap_Branch p m (map f tree0) (map f tree1) + let tree0' = map f tree0 in + let tree1' = map f tree1 in + if tree0' == tree0 && tree1' == tree1 then htr + else + wrap_Branch p m tree0' tree1' let rec map' f htr = match htr with | Empty -> @@ -776,41 +842,55 @@ else wrap_Branch p m tree0' tree1' - let generic_fine_add decide k d m = + let generic_fine_add empty_neutral decide k d m = (* there is an implicit argument which is a tree with a single binding. Where the calls to [decide] are concerned, this implicit tree is the second one *) - let id = Key.id k in let rec add t = match t with - | Empty -> + | Empty -> wrap_Leaf k (decide k None (Some d)) - | Leaf (k0, d0, _) -> + | Leaf (k0, d0, _) -> if Key.equal k k0 then let d' = decide k (Some d0) (Some d) in if d'==d0 then t else wrap_Leaf k d' else - let endo = - let decided = decide k0 (Some d0) None in - if decided == d0 then t else wrap_Leaf k0 decided - in - join id (wrap_Leaf k (decide k None (Some d))) (Key.id k0) endo - | Branch (p, m, t0, t1, _) -> - if match_prefix id p m then - if (id land m) = 0 then + if empty_neutral then + join (Key.id k) (wrap_Leaf k d) (Key.id k0) t + else + let t' = + let decided = decide k0 (Some d0) None in + if decided == d0 then t else wrap_Leaf k0 decided + in + join (Key.id k) (wrap_Leaf k (decide k None (Some d))) + (Key.id k0) t' + | Branch (p, m, t0, t1, _) -> + let k_id = Key.id k in + if match_prefix k_id p m then + if (k_id land m) = 0 then let a_t0 = add t0 in - let endo = endo_map (fun k x -> decide k (Some x) None) t1 in - if a_t0 == t0 && endo == t1 then t - else wrap_Branch p m a_t0 endo + let t1' = + if empty_neutral + then t1 + else endo_map (fun k x -> decide k (Some x) None) t1 + in + if a_t0 == t0 && t1' == t1 then t + else wrap_Branch p m a_t0 t1' else let a_t1 = add t1 in - let endo = endo_map (fun k x -> decide k (Some x) None) t0 + let t0' = + if empty_neutral + then t0 + else endo_map (fun k x -> decide k (Some x) None) t0 in - if a_t1 == t1 && endo == t0 then t - else wrap_Branch p m endo a_t1 + if a_t1 == t1 && t0' == t0 then t + else wrap_Branch p m t0' a_t1 else - let endo = endo_map (fun k x -> decide k (Some x) None) t in - join id (wrap_Leaf k (decide k None (Some d))) p endo + if empty_neutral then + join k_id (wrap_Leaf k d) p t + else + let t' = endo_map (fun k x -> decide k (Some x) None) t in + join k_id (wrap_Leaf k (decide k None (Some d))) p t' in add m @@ -828,46 +908,61 @@ let sentinel = Empty end - let symmetric_merge ~cache:_ ~decide_none ~decide_some = + let symmetric_merge ~cache:_ ~empty_neutral ~decide_none ~decide_some = let symmetric_fine_add k d m = (* this function to be called when one of the trees is a single binding *) - let id = Key.id k in let rec add t = match t with | Empty -> + if empty_neutral then + wrap_Leaf k d + else wrap_Leaf k (decide_none k d ) | Leaf (k0, d0, _) -> if Key.equal k k0 then let d' = decide_some d0 d in if d'==d0 then t else wrap_Leaf k d' else - let endo = - let decid = decide_none k0 d0 in - if decid == d0 then t else wrap_Leaf k0 decid - in - join id (wrap_Leaf k (decide_none k d)) (Key.id k0) endo + if empty_neutral then + join (Key.id k) (wrap_Leaf k d) (Key.id k0) t + else + let endo = + let decid = decide_none k0 d0 in + if decid == d0 then t else wrap_Leaf k0 decid + in + join (Key.id k) (wrap_Leaf k (decide_none k d)) + (Key.id k0) endo | Branch (p, m, t0, t1, _) -> - if match_prefix id p m then - if (id land m) = 0 then + let k_id = Key.id k in + if match_prefix k_id p m then + if (k_id land m) = 0 then let a_t0 = add t0 in - let endo = endo_map decide_none t1 in - if a_t0 == t0 && endo == t1 then t - else wrap_Branch p m a_t0 endo + let t1' = + if empty_neutral then t1 + else endo_map decide_none t1 + in + if a_t0 == t0 && t1' == t1 then t + else wrap_Branch p m a_t0 t1' else let a_t1 = add t1 in - let endo = endo_map decide_none t0 + let t0' = + if empty_neutral then t0 + else endo_map decide_none t0 in - if a_t1 == t1 && endo == t0 then t - else wrap_Branch p m endo a_t1 + if a_t1 == t1 && t0' == t0 then t + else wrap_Branch p m t0' a_t1 else - let endo = endo_map decide_none t in - join id (wrap_Leaf k (decide_none k d)) p endo in - + if empty_neutral then + join k_id (wrap_Leaf k d) p t + else + let t' = endo_map decide_none t in + join k_id (wrap_Leaf k (decide_none k d)) p t' + in add m in let module SymmetricCache = - Binary_cache.Make_Symmetric(Cacheable)(R) + Binary_cache.Symmetric_Binary(Cacheable)(R) in clear_caches := SymmetricCache.clear :: !clear_caches; let rec union s t = @@ -876,22 +971,18 @@ and uncached_union s t = match s, t with | Empty, t | t, Empty -> - endo_map decide_none t + if empty_neutral then t else endo_map decide_none t | Leaf(key, value, _), t | t, Leaf(key, value, _) -> symmetric_fine_add key value t | Branch(p, m, s0, s1, _), Branch(q, n, t0, t1, _) -> - if (p = q) && (m = n) - then + if (p = q) && (m = n) then (* The trees have the same prefix. Merge their sub-trees. *) let u0 = union s0 t0 and u1 = union s1 t1 in if t0 == u0 && t1 == u1 then t else wrap_Branch p m u0 u1 - else if (Big_Endian.shorter m n) && (match_prefix q p m) then - (* [q] contains [p]. Merge [t] with a sub-tree of [s]. *) - if (q land m) = 0 then let s0_t = union s0 t in let s1_e = union s1 Empty in @@ -902,11 +993,8 @@ let s1_t = union s1 t in if s0_e == s0 && s1_t == s1 then s else wrap_Branch p m s0_e s1_t - else if (Big_Endian.shorter n m) && (match_prefix p q n) then - (* [p] contains [q]. Merge [s] with a sub-tree of [t]. *) - if (p land n) = 0 then let s_t0 = union s t0 in let e_t1 = union Empty t1 in @@ -920,11 +1008,12 @@ else (* The prefixes disagree. *) join p (union s Empty) q (union Empty t) - in union + in + union let symmetric_inter ~cache:_ ~decide_some = let module SymmetricCache = - Binary_cache.Make_Symmetric(Cacheable)(R) + Binary_cache.Symmetric_Binary(Cacheable)(R) in clear_caches := SymmetricCache.clear :: !clear_caches; let rec inter s t = @@ -1019,33 +1108,41 @@ wrap_Branch p m (from_shape f t1) (from_shape f t2) - let generic_merge ~cache ~decide ~idempotent = + let generic_merge ~cache ~decide ~idempotent ~empty_neutral = let _name, do_cache = cache in let cache_merge = if do_cache then begin - let module Cache = Binary_cache.Make_Asymmetric(Cacheable)(R) in + let module Cache = + Binary_cache.Arity_Two(Cacheable)(Cacheable)(R) + in clear_caches := Cache.clear :: !clear_caches; Cache.merge end else fun f x y -> f x y in - let rec union s t = - if idempotent then - if s==t then s else cache_merge compute s t + let rec union s t = + if idempotent && s == t then s else - if s==Empty && t==Empty then s else cache_merge compute s t + cache_merge compute s t and compute s t = match s, t with + | Empty, Empty -> Empty + | Empty, _ -> - endo_map (fun k x -> decide k None (Some x)) t + if empty_neutral then t + else + endo_map (fun k x -> decide k None (Some x)) t | (Leaf _ | Branch _), Empty -> - endo_map (fun k x -> decide k (Some x) None) s + if empty_neutral then s + else + endo_map (fun k x -> decide k (Some x) None) s | Leaf(key, value, _), _ -> - generic_fine_add (fun k v1 v2 -> decide k v2 v1) key value t + generic_fine_add + empty_neutral (fun k v1 v2 -> decide k v2 v1) key value t | Branch _, Leaf(key, value, _) -> - generic_fine_add decide key value s + generic_fine_add empty_neutral decide key value s | Branch(p, m, s0, s1, _), Branch(q, n, t0, t1, _) -> if (p = q) && (m = n) then @@ -1082,7 +1179,84 @@ (* The prefixes disagree. *) join p (union s Empty) q (union Empty t) in - union + union + + let fold2_join_heterogeneous (type arg) (type result) ~cache ~empty_left ~empty_right ~both ~join ~empty = + let cache_merge = match cache with + | NoCache -> (fun f x y -> f x y) + | PersistentCache _name | TemporaryCache _name -> + let module Arg = struct + type t = (Key.t, arg) tree + let hash : t -> int = hash_generic + let sentinel : t = Empty + let equal : t -> t -> bool = (==) + end in + let module Result = struct + type t = result + let sentinel : t = empty + end in + let module Cache = Binary_cache.Arity_Two(Cacheable)(Arg)(Result) in + (match cache with + | PersistentCache _ -> + clear_caches := Cache.clear :: !clear_caches + | _ -> ()); + Cache.merge + in + let rec compute s t = cache_merge aux s t + and aux s t = + match s, t with + | Empty, Empty -> empty + | Empty, t -> empty_left t + | s, Empty -> empty_right s + + | Leaf (ks, vs, _), Leaf (kt, vt, _) -> + if Key.equal ks kt then + both ks vs vt + else + join (empty_left t) (empty_right s) + + | Branch (p, m, s0, s1, _), Leaf(kt, _, _) -> + let k_id = Key.id kt in + if match_prefix k_id p m then + if (k_id land m) = 0 then + join (compute s0 t) (empty_right s1) + else + join (compute s1 t) (empty_right s0) + else + join (empty_right s) (empty_left t) + + | Leaf (ks, _, _), Branch(q, n, t0, t1, _) -> + let k_id = Key.id ks in + if match_prefix k_id q n then + if (k_id land n) = 0 then + join (compute s t0) (empty_left t1) + else + join (compute s t1) (empty_left t0) + else + join (empty_right s) (empty_left t) + + | Branch(p, m, s0, s1, _), Branch(q, n, t0, t1, _) -> + if (p = q) && (m = n) then + (* The trees have the same prefix. recurse on the sub-trees *) + join (compute s0 t0) (compute s1 t1) + else if (Big_Endian.shorter m n) && (match_prefix q p m) then + (* [q] contains [p]. Merge [t] with a sub-tree of [s]. *) + if (q land m) = 0 then + join (compute s0 t) (empty_right s1) + else + join (compute s1 t) (empty_right s0) + else if (Big_Endian.shorter n m) && (match_prefix p q n) then + (* [p] contains [q]. Merge [s] with a sub-tree of [t]. *) + if (p land n) = 0 then + join (compute s t0) (empty_left t1) + else + join (compute s t1) (empty_left t0) + else + (* The prefixes disagree. *) + join (empty_right s) (empty_left t) + in + fun s t -> compute s t + type decide_fast = Done | Unknown @@ -1180,7 +1354,7 @@ let generic_predicate exn ~cache:_ ~decide_fast ~decide_fst ~decide_snd ~decide_both = let module Cache = - Binary_cache.Make_Binary(Cacheable)(Cacheable) + Binary_cache.Binary_Predicate(Cacheable)(Cacheable) in clear_caches := Cache.clear :: !clear_caches; make_predicate Cache.merge exn @@ -1188,7 +1362,7 @@ let generic_symmetric_predicate exn ~decide_fast ~decide_one ~decide_both = let module Cache = - Binary_cache.Make_Symmetric_Binary(Cacheable) + Binary_cache.Symmetric_Binary_Predicate(Cacheable) in clear_caches := Cache.clear :: !clear_caches; make_predicate Cache.merge exn @@ -1276,17 +1450,14 @@ in aux' - type cache_type = - | NoCache - | PersistentCache of string - | TemporaryCache of string - let binary_predicate ct pt ~decide_fast ~decide_fst ~decide_snd ~decide_both = let cache_merge = match ct with | NoCache -> (fun f x y -> f x y) | PersistentCache _name | TemporaryCache _name -> - let module Cache = Binary_cache.Make_Binary(Cacheable)(Cacheable) in + let module Cache = + Binary_cache.Binary_Predicate(Cacheable)(Cacheable) + in (match ct with | PersistentCache _ -> clear_caches := Cache.clear :: !clear_caches @@ -1300,7 +1471,7 @@ let cache_merge = match ct with | NoCache -> (fun f x y -> f x y) | PersistentCache _name | TemporaryCache _name -> - let module Cache = Binary_cache.Make_Symmetric_Binary(Cacheable) in + let module Cache = Binary_cache.Symmetric_Binary_Predicate(Cacheable) in (match ct with | PersistentCache _ -> clear_caches := Cache.clear :: !clear_caches @@ -1391,6 +1562,9 @@ else (Empty, None, Empty) | Branch(_, mask, l, r, _) -> + (* TODO: this function is suboptimal because it recurses even when + the key will never be found: missing + [if match_prefix id prefix mask then] *) if (id land mask) = 0 then let (ll, pres, rl) = aux l in (ll, pres, union rl r) else diff -Nru frama-c-20140301+neon+dfsg/external/hptmap.mli frama-c-20150201+sodium+dfsg/external/hptmap.mli --- frama-c-20140301+neon+dfsg/external/hptmap.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/external/hptmap.mli 2015-05-29 15:31:43.000000000 +0000 @@ -37,6 +37,12 @@ [equal k1 k2 ==> id k1 = id k2] *) end +(** Values stored in the map *) +module type V = sig + include Datatype.S + val pretty_debug: t Pretty_utils.formatter +end + (** This functor exports the {i shape} of the maps indexed by keys [Key]. Those shapes can be used by various functions to efficiently build new maps whose shape are already known. *) @@ -44,9 +50,22 @@ type 'value t end +(** Some functions of this module may optionally use internal caches. It is + the responsibility of the use to choose whether or not to use a cache, + and whether this cache will be garbage-collectable by OCaml. *) +type cache_type = +| NoCache (** The results of the function will not be cached. *) +| PersistentCache of string +(** The results of the function will be cached, and the function that uses + the cache is a permanent closure (at the toplevel of an OCaml module).*) +| TemporaryCache of string +(** The results of the function will be cached, but the function itself + is a local function which is garbage-collectable. *) + + module Make (Key : Id_Datatype) - (V : Datatype.S (** Values stored in the map. *)) + (V : V) (Compositional_bool : sig (** A boolean information is maintained for each tree, by composing the boolean on the subtrees and the value information present on each leaf. @@ -95,7 +114,17 @@ for [k], it is overridden. *) val find : key -> t -> V.t + val find_check_missing: key -> t -> V.t + (** Both [find key m] and [find_check_missing key m] return the value + bound to [key] in [m], or raise [Not_found] is [key] is unbound. + [find] is optimised for the case where [key] is bound in [m], whereas + [find_check_missing] is more efficient for the cases where [m] + is big and [key] is missing. *) + val find_key : key -> t -> key + (** This function is useful where there are multiple distinct keys that + are equal for [Key.equal]. *) + val remove : key -> t -> t (** [remove k m] returns the map [m] deprived from any binding involving [k]. *) @@ -130,20 +159,23 @@ cache:(string * bool) -> decide:(Key.t -> V.t option -> V.t option -> V.t) -> idempotent:bool -> + empty_neutral:bool -> t -> t -> t (** Merge of two trees, parameterized by a merge function. If [idempotent] - holds, the function must verify [merge x x == x]. If [snd cache] is - [true], an internal cache is used; thus the merge function must be pure. + holds, the function must verify [merge k (Some x) (Some x) = x]. If + [empty_neutral] holds, the function must verify [merge None (Some v) = v] + and [merge (Some v) None = v]. If [snd cache] is [true], an internal + cache is used; thus the merge function must be pure. *) val symmetric_merge : cache:(string * 'a) -> + empty_neutral:bool -> decide_none:(Key.t -> V.t -> V.t) -> decide_some:(V.t -> V.t -> V.t) -> t -> t -> t - (** Merge of two trees, parameterized by a merge function which is supposed - to verify [merge x y == merge y x], [merge x x == x], and which must - be pure (as an internal cache is used). *) + (** Same as [generic_merge], but we also assume that [merge x y = merge y x] + holds. *) val symmetric_inter : cache:(string * 'a) -> @@ -202,17 +234,6 @@ is uncertain, and that the more aggressive analysis should be used. *) type predicate_result = PTrue | PFalse | PUnknown - (** Some functions of this module may optionally use internal caches. It is - the responsibility of the use to choose whether or not to use a cache, - and whether this cache will be garbage-collectable by OCaml. *) - type cache_type = - | NoCache (** The results of the function will not be cached. *) - | PersistentCache of string - (** The results of the function will be cached, and the function that uses - the cache is a permanent closure (at the toplevel of an OCaml module).*) - | TemporaryCache of string - (** The results of the function will be cached, but the function itself - is a local function which is garbage-collectable. *) val binary_predicate: cache_type -> @@ -304,6 +325,26 @@ (** Export the map as a value suitable for functions {!inter_with_shape} and {!from_shape} *) + val fold2_join_heterogeneous: + cache:cache_type -> + empty_left:('a Shape(Key).t -> 'b) -> + empty_right:(t -> 'b) -> + both:(Key.t -> V.t -> 'a -> 'b) -> + join:('b -> 'b -> 'b) -> + empty:'b -> + t -> 'a Shape(Key).t -> + 'b +(** [fold2_join_heterogeneous ~cache ~empty_left ~empty_right ~both + ~join ~empty m1 m2] iterates simultaneously on [m1] and [m2]. If a subtree + [t] is present in [m1] but not in [m2] (resp. in [m2] but not in [m1]), + [empty_right t] (resp. [empty_left t]) is called. If a key [k] is present + in both trees, and bound to to [v1] and [v2] respectively, [both k v1 v2] is + called. If both trees are empty, [empty] is returned. The values of type + ['b] returned by the auxiliary functions are merged using [join], which is + called in an unspecified order. The results of the function may be cached, + depending on [cache]. *) + + (**/**) (* Undocumented. *) val hash_debug : t -> int val pretty_debug: Format.formatter -> t -> unit diff -Nru frama-c-20140301+neon+dfsg/external/unz.ml frama-c-20150201+sodium+dfsg/external/unz.ml --- frama-c-20140301+neon+dfsg/external/unz.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/external/unz.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/external/unz.mli frama-c-20150201+sodium+dfsg/external/unz.mli --- frama-c-20140301+neon+dfsg/external/unz.mli 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/external/unz.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/INSTALL frama-c-20150201+sodium+dfsg/INSTALL --- frama-c-20140301+neon+dfsg/INSTALL 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/INSTALL 2015-05-28 08:53:23.000000000 +0000 @@ -24,17 +24,6 @@ AUTOMATIC INSTALLATION =============================================================================== --------- -Mac OS X --------- - -Download the auto-installer from - http://frama-c.com/download.html - -Then just run it! - -Note: this auto-installer is **not** provided for each Frama-C version. - ---------------------------------------------------- Debian >= Squeeze 6.0 and Ubuntu >= Lucid Lynx 10.04 ---------------------------------------------------- @@ -47,6 +36,8 @@ or, if you don't want the Gtk-based GUI: sudo apt-get install frama-c-base +It might be **not** up-to-date with the latest Frama-C release. + ------------ Fedora >= 13 ------------ @@ -55,6 +46,8 @@ yum install frama-c +It might be **not** up-to-date with the latest Frama-C release. + ---- Opam ---- @@ -69,14 +62,41 @@ separately. These are C libraries with OCaml bindings that are used by the GUI. Opam manages the binding but not the external libraries yet. ----- -Wodi ----- +----------------- +Wodi (Windows OS) +----------------- Wodi (http://wodi.forge.ocamlcore.org/) is a package manager for OCaml libraries and applications that specifically target the Windows platform. It features a GUI, so that you just have to select the Frama-C package from there. +-------- +Mac OS X +-------- + +OPAM works perfectly on Mac OS via Homebrew. +Recommended installation: + +# General Mac-OS Tools for OCaml: +> xcode-select --install +> open http://brew.sh +> brew install git autoconf meld opam + +# Graphical User Interface: +> brew install gtk+ --with-jasper +> brew install gtksourceview libgnomecanvas graphviz +> opam install lablgtk ocamlgraph + +# Recommended for Frama-C: +> brew install gmp +> opam install zarith + +# Necessary for Frama-C/WP: +> opam install alt-ergo + +# Also recommended for Frama-C/WP: +> opam install altgr-ergo coq coqide why3 + =============================================================================== The remainder of these installation instructions is for building Frama-C from source. @@ -108,17 +128,18 @@ =============================================================================== - GNU make version >= 3.81 -- Objective Caml >= 3.12.1; +- Objective Caml >= 3.12.1 (except 4.02.0); - a C compiler with standard C and POSIX headers and libraries The Frama-C GUI also requires: - Gtk (>= 2.4) - GtkSourceView 2.x - GnomeCanvas 2.x -- LablGtk >= 2.14.0 +- LablGtk >= 2.14.0 (and >= 2.18.2 if you use OCaml >= 4.02.1) -If OcamlGraph 1.8.5 [1] is already installed, then it will be used by Frama-C. -Otherwise the distributed local copy (directory ocamlgraph) will be used. +If OcamlGraph 1.8.5 or 1.8.6 [1] is already installed, then it will be used by +Frama-C. Otherwise the distributed local copy (file ocamlgraph.tar.gz) will be +used. If Zarith [2] is installed, it will be used by Frama-C. Otherwise another equivalent less efficient library will be use. @@ -133,10 +154,11 @@ Ubuntu >= Lucid Lynx 10.04 -------------------------- -If you are using Ubuntu >= Lucid Lynx 10.04 then an optimal list of packages is -installed by: +If you are using Ubuntu >= Precise Pangolin 12.04 then an optimal list of +packages is installed by: sudo apt-get install ocaml ocaml-native-compilers graphviz \ + libzarith-ocaml-dev \ liblablgtksourceview2-ocaml-dev liblablgtk2-gnome-ocaml-dev ------------------- @@ -203,7 +225,7 @@ - frama-c-gui if available - frama-c.byte bytecode version of frama-c - frama-c-gui.byte bytecode version of frama-c-gui, if available -- ptests.byte testing tools for Frama-c +- ptests.opt testing tools for Frama-c - frama-c.toplevel if 'make top' previously done Shared files: (usually in /usr/local/share/frama-c and subdirectories) diff -Nru frama-c-20140301+neon+dfsg/INSTALL_WITH_WHY frama-c-20150201+sodium+dfsg/INSTALL_WITH_WHY --- frama-c-20140301+neon+dfsg/INSTALL_WITH_WHY 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/INSTALL_WITH_WHY 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ - ------------------------------------------- - INSTALLATION INSTRUCTIONS for FRAMA_C + WHY - ------------------------------------------- - -This file is useful only for source distributions including both Frama-C and -Why (like http://frama-c.com/download/frama-c-Boron-20100401-why-2.24.tar.gz -for instance). - -Thus it is useless in any other context. - -Note: such a file is **not** provided for each Frama-C version. - -=============================================================================== - SUMMARY -=============================================================================== - -0) Summary -1) Installation Instructions -2) Additional Instructions -3) Have Fun With Frama-C and Why! - -=============================================================================== - INSTALLATION INSTRUCTIONS -=============================================================================== - -Run the following commands from the directory containing the Frama-C source. - -./configure -make -make install (may require superuser right) -cd why -./configure -make -make install (may require superuser right) - -=============================================================================== - ADDITIONAL INSTRUCTIONS -=============================================================================== - -Please refer to the specific installation instructions for Frama-C and Why: -- file INSTALL of Frama-C -- file INSTALL of Why - -=============================================================================== - HAVE FUN WITH FRAMA-C AND WHY! -=============================================================================== diff -Nru frama-c-20140301+neon+dfsg/Makefile frama-c-20150201+sodium+dfsg/Makefile --- frama-c-20140301+neon+dfsg/Makefile 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/Makefile 2015-06-01 13:14:21.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # @@ -26,6 +26,12 @@ MAKECONFIG_DIR=share include share/Makefile.common +include share/Makefile.dynamic_config.internal + +#Check share/Makefile.config available +ifndef FRAMAC_TOP_SRCDIR +$(error "You should run ./configure first") +endif ################### # Frama-C Version # @@ -44,8 +50,7 @@ ########################### # the directory where compiled plugin files are stored -PLUGIN_LIB_DIR = lib/plugins -PLUGIN_GUI_LIB_DIR= lib/plugins/gui +PLUGIN_GUI_LIB_DIR= $(PLUGIN_LIB_DIR)/gui # the directory where the other Makefiles are FRAMAC_SHARE = share @@ -57,6 +62,7 @@ # initialized them as "simply extended variables" (with :=) # for a correct behavior of += (see section 6.6 of GNU Make manual) PLUGIN_LIST := +PLUGIN_GENERATED_LIST:= PLUGIN_DYN_EXISTS:="no" PLUGIN_DYN_LIST := PLUGIN_CMO_LIST := @@ -98,10 +104,6 @@ # plugins CONFIG_DISTRIB_BIN:= -# additional compilation targets for 'make all'. -# cannot be delayed after 'make all' -EXTRAS = ptests - # Directories containing some source code SRC_DIRS= ptests $(PLUGIN_LIB_DIR) @@ -136,16 +138,16 @@ ifeq ($(WARN_ERROR_ALL),yes) DEV_FLAGS=$(FLAGS) -warn-error +a else -DEV_FLAGS=$(FLAGS) -warn-error +a-32-33-34-35-36-37-38-39 +DEV_FLAGS=$(FLAGS) -warn-error +a-3-32-33-34-35-36-37-38-39 endif #WARN_ERROR_ALL else DEV_FLAGS=$(FLAGS) endif #DEVELOPMENT BFLAGS = $(DEV_FLAGS) $(DEBUG) $(INCLUDES) $(COVERAGE_COMPILER_BYTE) \ - $(OCAMLVIZ_COMPILER_BYTE) $(OUNIT_COMPILER_BYTE) + $(OUNIT_COMPILER_BYTE) OFLAGS = $(DEV_FLAGS) $(DEBUG) $(INCLUDES) $(COVERAGE_COMPILER_OPT) \ - $(GPROFOPT) $(OCAMLVIZ_COMPILER_OPT) $(OUNIT_COMPILER_OPT) -compact + $(GPROFOPT) $(OUNIT_COMPILER_OPT) -compact BLINKFLAGS += $(BFLAGS) -linkall -custom OLINKFLAGS += $(OFLAGS) -linkall @@ -153,6 +155,10 @@ DOC_FLAGS= -colorize-code -stars -inv-merge-ml-mli -m A -hide-warnings \ $(INCLUDES) $(GUI_INCLUDES) +ifeq ($(HAS_OCAML402),yes) + DOC_FLAGS += -w -3 +endif + # Libraries generated by Frama-C GEN_BYTE_LIBS= GEN_OPT_LIBS= @@ -172,7 +178,7 @@ ICONS:= $(addprefix share/, \ frama-c.ico frama-c.gif unmark.png ) -FEEDBACK_ICONS:= $(addprefix share/feedback/, \ +FEEDBACK_ICONS_NAMES:= \ never_tried.png \ unknown.png \ surely_valid.png \ @@ -185,15 +191,20 @@ valid_but_dead.png \ inconsistent.png \ switch-on.png \ - switch-off.png ) + switch-off.png + +FEEDBACK_ICONS_DEFAULT:= \ + $(addprefix share/theme/default/, $(FEEDBACK_ICONS_NAMES)) +FEEDBACK_ICONS_COLORBLIND:= \ + $(addprefix share/theme/colorblind/, $(FEEDBACK_ICONS_NAMES)) ROOT_LIBC_DIR:= share/libc -LIBC_SUBDIRS:= . sys netinet linux net arpa -LIBC_DIR:= $(addprefix $(ROOT_LIBC_DIR)/, $(LIBC_SUBDIRS)) +LIBC_SUBDIRS:= sys netinet linux net arpa +LIBC_DIR:= $(ROOT_LIBC_DIR) $(addprefix $(ROOT_LIBC_DIR)/, $(LIBC_SUBDIRS)) FREE_LIBC:= \ share/*.h share/*.c \ $(addsuffix /*.h, $(LIBC_DIR)) \ - $(ROOT_LIBC_DIR)/./__fc_builtin_for_normalization.i + $(ROOT_LIBC_DIR)/__fc_builtin_for_normalization.i NONFREE_LIBC:= $(addsuffix /*.[ci], $(LIBC_DIR)) @@ -234,15 +245,18 @@ # itself, rather than copied: otherwise, it could include references to # non-distributed plug-ins. DISTRIB_FILES:= cil/*/*.ml* cil/*/*.in \ - $(filter-out cil/src/frontc/cparser.ml cil/src/frontc/cparser.mli \ - cil/src/logic/logic_lexer.ml cil/src/logic/logic_parser.mli \ - cil/src/logic/logic_parser.ml cil/src/frontc/clexer.ml \ - cil/src/logic/logic_preprocess.ml, \ - $(wildcard cil/src/*/*.ml*)) \ + $(filter-out $(CIL_PATH)/frontc/cparser.ml \ + $(CIL_PATH)/frontc/cparser.mli \ + $(CIL_PATH)/logic/logic_lexer.ml \ + $(CIL_PATH)/logic/logic_parser.mli \ + $(CIL_PATH)/logic/logic_parser.ml \ + $(CIL_PATH)/frontc/clexer.ml \ + $(CIL_PATH)/logic/logic_preprocess.ml, \ + $(wildcard $(CIL_PATH)/*/*.ml*)) \ bin/*2*.sh \ share/frama-c.WIN32.rc share/frama-c.Unix.rc \ - $(ICONS) $(FEEDBACK_ICONS) \ - man/frama-c.1 doc/manuals/*.pdf doc/README \ + $(ICONS) $(FEEDBACK_ICONS_DEFAULT) $(FEEDBACK_ICONS_COLORBLIND) \ + man/frama-c.1 doc/README \ doc/code/docgen_*.ml \ doc/code/*.css doc/code/intro_plugin.txt \ doc/code/intro_plugin_D_and_S.txt \ @@ -252,13 +266,15 @@ doc/code/intro_slicing.txt doc/code/intro_sparecode.txt \ doc/code/intro_wp.txt doc/code/toc_head.htm \ doc/code/toc_tail.htm \ - doc/code/print_api/*.ml* doc/code/print_api/Makefile \ - tests/*/*.c tests/*/*.i tests/*/*.h tests/*/*.ml \ + $(filter-out \ + $(addprefix doc/code/print_api/, \ + dynamic_plugins.mli grammar.ml grammar.mli lexer.ml), \ + $(wildcard doc/code/print_api/*.ml*)) \ + doc/code/print_api/Makefile \ + doc/Makefile \ $(filter-out ptests/ptests_config.ml, $(wildcard ptests/*.ml*)) \ - configure.in Makefile \ - share/Makefile.plugin share/Makefile.dynamic \ - share/Makefile.dynamic_config.internal \ - share/Makefile.dynamic_config.external Changelog config.h.in \ + configure.in Makefile Makefile.generating \ + Changelog config.h.in \ VERSION licenses/* \ $(FREE_LIBC) \ share/acsl.el share/configure.ac \ @@ -279,7 +295,11 @@ src/printer/*.ml* src/toplevel/toplevel_config.ml src/type/*.ml* \ bin/sed_get_make_major bin/sed_get_make_minor \ INSTALL INSTALL_WITH_WHY .make-clean \ - .make-clean-stamp .make-ocamlgraph-stamp .force-reconfigure + .make-clean-stamp .make-ocamlgraph-stamp .force-reconfigure \ + opam/* opam/files/* + +DISTRIB_TESTS=$(filter-out tests/non-free/%, $(shell git ls-files tests src/aorai/tests src/report/tests src/wp/tests)) + # files that are needed to compile API documentation of external plugins DOC_GEN_FILES:=$(addprefix doc/code/, \ @@ -292,25 +312,19 @@ # Main targets # ################ +# additional compilation targets for 'make all'. +# cannot be delayed after 'make all' +EXTRAS = ptests bin/frama-c-config$(EXE) + ifneq ($(ENABLE_GUI),no) ifeq ($(HAS_LABLGTK),yes) EXTRAS += gui endif endif -all:: byte $(OCAMLBEST) $(EXTRAS) +all:: byte $(OCAMLBEST) $(EXTRAS) plugins_ptests_config .PHONY: top opt byte dist bdist archclean rebuild -top: bin/toplevel.top$(EXE) - $(MAKE) install-kernel-byte FRAMAC_LIBDIR=lib/fc - -byte:: bin/toplevel.byte$(EXE) \ - share/Makefile.dynamic_config share/Makefile.kernel - $(MAKE) install-kernel-byte FRAMAC_LIBDIR=lib/fc - -opt:: bin/toplevel.opt$(EXE) \ - share/Makefile.dynamic_config share/Makefile.kernel - $(MAKE) install-kernel-opt FRAMAC_LIBDIR=lib/fc dist: clean $(QUIET_MAKE) OPTIM="-unsafe -noassert" DEBUG="" all @@ -340,58 +354,35 @@ .PHONY:merlin merlin: #create Merlin file - find `echo "src cil external" | xargs -n 1 -d ' ' readlink -f` \( -name .svn -name tests -o -name doc -o -name result -o -name -o -name oracle -o -name "*.cache" \) -prune -o \( -type d -printf "B %p\nS %p\n" \) > .merlin + find `echo "src cil external" | xargs -n 1 -d ' ' readlink -f` \( -name .svn -o -name tests -o -name doc -o -name result -o -name -o -name oracle -o -name "*.cache" -o -name .git \) -prune -o \( -type d -printf "B %p\nS %p\n" \) > .merlin echo $(OCAMLGRAPH_MERLIN) >> .merlin echo "PKG zarith" >> .merlin + echo "PKG lablgtk2" >> .merlin -############ -# Coverage # -############ - -USE_COVERAGE_TOOL=no -ifeq ($(USE_COVERAGE_TOOL),yes) -COVERAGE_PATH=. -COVERAGE_PREPRO=camlp4o -no_quot -filter $(COVERAGE_PATH)/coverage_filter.cmo -COVERAGE_COMPILER_BYTE=-I $(COVERAGE_PATH) -pp "$(COVERAGE_PREPRO)" -COVERAGE_COMPILER_OPT=-I $(COVERAGE_PATH) -pp "$(COVERAGE_PREPRO)" -COVERAGE_LIB_BYTE=coverage.cma -COVERAGE_LIB_OPT=coverage.cmxa -endif - -INCLUDES+=$(COVERAGE_COMPILER_BYTE) -INCLUDES_FOR_OCAMLDEP+=$(COVERAGE_COMPILER_BYTE) -GEN_BYTE_LIBS+=$(COVERAGE_LIB_BYTE) -GEN_OPT_LIBS+=$(COVERAGE_LIB_OPT) -SRC_DIRS+=$(COVERAGE_PATH) - -######################## -# Ocamlviz (profiling) # -######################## - -# To use OCamlviz you need to fix its makefile :-( -# In $(OCAMLVIZ_PATH)/Makefile.in change the line -# OCAMLVIZCMO = $(PROTOCOLCMO) src/monitor_impl.cmo src/ocamlviz.cmo src/ocamlviz_threads.cmo -# into -# OCAMLVIZCMO = $(PROTOCOLCMO) src/monitor_impl.cmo src/ocamlviz.cmo -# and -# cp -f src/ocamlviz.mli src/ocamlviz.cmi src/ocamlviz_threads.cmi $(OCAMLLIB) -# into -# cp -f src/ocamlviz.mli src/ocamlviz.cmi $(OCAMLLIB) -# -# Then run "./configure && make && make install" in $(OCAMLVIZ_PATH) -# Only one instance of Frama-C can be launched at a time when Ocamlviz is on. -USE_OCAMLVIZ_TOOL=no -ifeq ($(USE_OCAMLVIZ_TOOL),yes) -OCAMLVIZ_PATH=~/src/ocamlviz -OCAMLVIZ_COMPILER_BYTE=-I $(OCAMLVIZ_PATH)/src # -pp "camlp4 pa_o.cmo str.cma $(OCAMLVIZ_PATH)/camlp4/pa_ocamlviz.cmo pr_o.cmo" -# Seems really broken and generates fatal warnings -OCAMLVIZ_COMPILER_OPT=-I $(OCAMLVIZ_PATH)/src -OCAMLVIZ_LIB_BYTE=~/lib/ocaml/libocamlviz.cma -OCAMLVIZ_LIB_OPT=~/lib/ocaml/libocamlviz.cmxa -endif - -BYTE_LIBS+=$(OCAMLVIZ_LIB_BYTE) -OPT_LIBS+=$(OCAMLVIZ_LIB_OPT) +#Create link in share for local execution if +.PHONY:create_share_link +create_share_link: share/.gitignore + +share/.gitignore: share/Makefile.config + if test -f $@; then \ + for link in $$(cat $@); do rm -f share$$link; done; \ + fi + $(foreach dir,$(EXTERNAL_PLUGINS),\ + echo -n "Looking for $(dir)/share: "; \ + if test -d $(dir)/share; then \ + echo adding link; \ + ln -s $(realpath $(dir)/share) share/$(notdir $(dir)); \ + echo /$(notdir $(dir)) >> $@.tmp; \ + else \ + echo no directory; \ + fi; ) + mv $@.tmp $@ + +clean:: + if test -f share/.gitignore; then \ + for link in $$(cat share/.gitignore); do rm -f share$$link; done; \ + rm share/.gitignore; \ + fi ######### # OUnit # @@ -565,14 +556,12 @@ BYTE_LIBS+= zarith.cma OPT_LIBS+= zarith.cmxa INCLUDES+= -I $(ZARITH_PATH) -src/lib/integer.ml: src/lib/integer.ml.zarith \ - share/Makefile.config.in Makefile +src/lib/integer.ml: src/lib/integer.ml.zarith share/Makefile.config $(PRINT_CP) $@ $(CP) $< $@ $(CHMOD_RO) $@ else -src/lib/integer.ml: src/lib/integer.ml.bigint \ - share/Makefile.config.in Makefile +src/lib/integer.ml: src/lib/integer.ml.bigint share/Makefile.config $(PRINT_CP) $@ $(CP) $< $@ $(CHMOD_RO) $@ @@ -591,8 +580,7 @@ ifeq ($(USABLE_NATIVE_DYNLINK),yes) # native dynlink works -src/lib/dynlink_common_interface.ml: src/lib/dynlink_311_or_higher.ml \ - share/Makefile.config Makefile +src/lib/dynlink_common_interface.ml: src/lib/dynlink_311_or_higher.ml share/Makefile.config $(PRINT_MAKING) $@ $(CP) $< $@ $(CHMOD_RO) $@ @@ -600,8 +588,7 @@ else # native dynlink doesn't work ifeq ($(NATIVE_DYNLINK),yes) # native dynlink does exist but doesn't work -src/lib/dynlink_common_interface.ml: src/lib/bad_dynlink_311_or_higher.ml \ - share/Makefile.config Makefile +src/lib/dynlink_common_interface.ml: src/lib/bad_dynlink_311_or_higher.ml share/Makefile.config $(PRINT_MAKING) $@ $(CP) $< $@ $(CHMOD_RO) $@ @@ -609,8 +596,7 @@ else # no dynlink at all (for instance no native compiler) # Just for ocamldep -src/lib/dynlink_common_interface.ml: src/lib/dynlink_311_or_higher.ml \ - share/Makefile.config Makefile +src/lib/dynlink_common_interface.ml: src/lib/dynlink_311_or_higher.ml share/Makefile.config $(PRINT_MAKING) $@ $(CP) $< $@ $(CHMOD_RO) $@ @@ -619,17 +605,14 @@ # the file dynlink_common_interface.ml does not provide from the same file # in these cases. -src/lib/dynlink_common_interface.cmo: src/lib/dynlink_311_or_higher.ml \ - share/Makefile.config Makefile +src/lib/dynlink_common_interface.cmo: src/lib/dynlink_311_or_higher.ml share/Makefile.config $(PRINT_MAKING) src/lib/dynlink_common_interface.ml $(CP) $< src/lib/dynlink_common_interface.ml $(CHMOD_RO) src/lib/dynlink_common_interface.ml $(PRINT_OCAMLC) $@ $(OCAMLC) -c $(BFLAGS) src/lib/dynlink_common_interface.ml -src/lib/dynlink_common_interface.cmx: src/lib/no_dynlink_opt.ml \ - share/Makefile.config \ - Makefile +src/lib/dynlink_common_interface.cmx: src/lib/no_dynlink_opt.ml share/Makefile.config $(PRINT_MAKING) src/lib/dynlink_common_interface.ml $(CP) $< src/lib/dynlink_common_interface.ml $(CHMOD_RO) src/lib/dynlink_common_interface.ml @@ -656,6 +639,9 @@ MODULES_NODOC+=external/unz.mli endif +VERY_FIRST_CMO = src/kernel/frama_c_init.cmo +CMO += $(VERY_FIRST_CMO) + EXTERNAL_LIB_CMO:= $(patsubst %, external/%.cmo, $(EXTERNAL_LIB_CMO)) CMO += $(EXTERNAL_LIB_CMO) @@ -712,8 +698,13 @@ # Kernel files usable by Cil PRE_KERNEL_CMO= \ + src/lib/binary_cache \ + external/hptmap \ + src/lib/hptset \ + $(CIL_PATH)/cil_datatype \ src/kernel/typed_parameter \ src/kernel/dynamic \ + src/kernel/parameter_category \ src/kernel/parameter_customize \ src/kernel/parameter_state \ src/kernel/parameter_builder \ @@ -722,9 +713,6 @@ src/kernel/emitter \ src/lib/floating_point \ src/lib/rangemap \ - src/lib/binary_cache \ - external/hptmap \ - src/lib/hptset \ src/printer/printer_builder PRE_KERNEL_CMO:= $(patsubst %, %.cmo, $(PRE_KERNEL_CMO)) @@ -735,56 +723,13 @@ # Cil ##### -ifeq ("$(LOCAL_MACHDEP)","yes") - -# Create the machine dependency module -# If the cl command cannot be run then the MSVC part will be identical to GCC -.PHONY : machdep $(CIL_PATH)/local_machdep.ml -machdep: $(CIL_PATH)/local_machdep.ml -bin/machdep.exe: machdep - -$(CIL_PATH)/local_machdep.ml : cil/src/machdep.c configure.in Makefile - $(PRINT_MAKING) $@ - $(RM) $@ - $(ECHO) "(* This module was generated automatically by code in Makefile and machdep.c *)" >$@ -# Now generate the type definition - $(ECHO) "open Cil_types" >> $@ - if gcc -D_GNUCC $< -o bin/machdep.exe ;then \ - $(ECHO) "machdep.exe created succesfully."; \ - else \ - $(RM) $@; exit 1; \ - fi - $(ECHO) "let gcc = {" >>$@ - ./bin/machdep.exe >>$@ - $(ECHO) " underscore_name = $(UNDERSCORE_NAME) ;" >> $@ - $(ECHO) "}" >>$@ - if cl /D_MSVC $< /Febin/machdep.exe /Fobin/machdep.obj ;then \ - $(ECHO) "let hasMSVC = true" >>$@; \ - else \ - $(ECHO) "let hasMSVC = false" >>$@; \ - fi - $(ECHO) "let msvc = {" >>$@ - ./bin/machdep.exe >>$@ - $(ECHO) " underscore_name = true ;" >> $@ - $(ECHO) "}" >>$@ - $(ECHO) \ - "let gccHas__builtin_va_list = $(HAVE_BUILTIN_VA_LIST)" >>$@ - $(ECHO) "let __thread_is_keyword = $(THREAD_IS_KEYWORD)" >>$@ - $(ECHO) \ - "$@ generated. You may have this file merged into Frama-C by developers." - $(CHMOD_RO) $@ - -endif - # .cmo files of cil -CIL_CMO = cil/src/cilmsg.cmo cil/ocamlutil/alpha.cmo \ +CIL_CMO = $(CIL_PATH)/cilmsg.cmo cil/ocamlutil/alpha.cmo \ cil/ocamlutil/cilconfig.cmo \ $(addprefix $(CIL_PATH)/, \ - cil_datatype.cmo \ cil_state_builder.cmo \ logic/utf8_logic.cmo \ - machdep_x86_16.cmo machdep_x86_32.cmo \ - machdep_x86_64.cmo machdep_ppc_32.cmo \ + machdeps.cmo \ cil_const.cmo \ logic/logic_env.cmo escape.cmo \ logic/logic_const.cmo cil.cmo) \ @@ -792,14 +737,14 @@ src/printer/cil_descriptive_printer.cmo \ $(addprefix $(CIL_PATH)/, \ frontc/errorloc.cmo \ - frontc/cabs.cmo ext/expcompare.cmo \ + frontc/cabs.cmo \ frontc/cabs_debug.cmo \ frontc/cabshelper.cmo \ logic/logic_utils.cmo logic/logic_builtin.cmo \ logic/logic_print.cmo logic/logic_parser.cmo \ logic/logic_lexer.cmo frontc/lexerhack.cmo \ mergecil.cmo rmtmps.cmo logic/logic_typing.cmo \ - frontc/cprint.cmo frontc/cabscond.cmo \ + frontc/cprint.cmo \ frontc/cabsvisit.cmo frontc/cabs2cil.cmo \ frontc/clexer.cmo frontc/cparser.cmo \ logic/logic_preprocess.cmo \ @@ -814,24 +759,19 @@ MLI_ONLY+= $(CIL_PATH)/cil_types.mli $(CIL_PATH)/logic/logic_ptree.mli \ src/printer/printer_api.mli NO_MLI+= \ - cil/src/machdep_ppc_32.mli \ - cil/src/machdep_x86_16.mli \ - cil/src/machdep_x86_32.mli \ - cil/src/machdep_x86_64.mli \ - cil/src/frontc/cabs.mli \ - cil/src/frontc/cabs_debug.mli \ - cil/src/ext/expcompare.mli \ - cil/src/logic/logic_lexer.mli \ - cil/src/frontc/lexerhack.mli \ - cil/src/ext/usedef.mli \ - cil/src/ext/liveness.mli \ - cil/src/ext/reachingdefs.mli \ - cil/src/ext/availexpslv.mli \ - cil/src/ext/rmciltmps.mli -MODULES_NODOC+= cil/src/machdep_ppc_32.ml \ - cil/src/machdep_x86_16.ml \ - cil/src/machdep_x86_32.ml \ - cil/src/machdep_x86_64.ml \ + $(CIL_PATH)/machdep_ppc_32.mli \ + $(CIL_PATH)/machdep_x86_16.mli \ + $(CIL_PATH)/machdep_x86_32.mli \ + $(CIL_PATH)/machdep_x86_64.mli \ + $(CIL_PATH)/frontc/cabs.mli \ + $(CIL_PATH)/frontc/cabs_debug.mli \ + $(CIL_PATH)/logic/logic_lexer.mli \ + $(CIL_PATH)/frontc/lexerhack.mli \ + +MODULES_NODOC+= $(CIL_PATH)/machdep_ppc_32.ml \ + $(CIL_PATH)/machdep_x86_16.ml \ + $(CIL_PATH)/machdep_x86_32.ml \ + $(CIL_PATH)/machdep_x86_64.ml \ GENERATED += $(addprefix $(CIL_PATH)/, \ frontc/clexer.ml frontc/cparser.ml frontc/cparser.mli \ @@ -845,15 +785,13 @@ # Buckx ####### -CMO += src/buckx/buckx.cmo - GEN_BUCKX=src/buckx/buckx_c.o GEN_BYTE_LIBS+= $(GEN_BUCKX) GEN_OPT_LIBS+= $(GEN_BUCKX) src/buckx/buckx_c.o: src/buckx/buckx_c.c - $(PRINT_OCAMLC) $@ - $(OCAMLC) $(BFLAGS) -ccopt "-O3 -fno-pic -fomit-frame-pointer -o $@" $< + $(PRINT_CC) $@ + $(CC) -c -I$(call winpath, $(OCAMLLIB)) -O3 -Wall $(GEN_BUCKX_CFLAGS) -o $@ $< # Main part of the kernel ######################### @@ -869,15 +807,9 @@ src/logic/annotations.cmo \ src/printer/printer.cmo \ src/kernel/stmts_graph.cmo \ - cil/src/ext/ordered_stmt.cmo \ - cil/src/ext/dataflows.cmo \ - cil/src/ext/dataflow2.cmo \ - cil/src/ext/usedef.cmo \ - cil/src/ext/liveness.cmo \ - cil/src/ext/reachingdefs.cmo \ - cil/src/ext/availexpslv.cmo \ - cil/src/ext/rmciltmps.cmo \ - cil/src/ext/deadcodeelim.cmo \ + $(CIL_PATH)/ext/ordered_stmt.cmo \ + $(CIL_PATH)/ext/dataflows.cmo \ + $(CIL_PATH)/ext/dataflow2.cmo \ src/kernel/dominators.cmo \ src/logic/description.cmo \ src/logic/statuses_by_call.cmo \ @@ -889,26 +821,24 @@ src/misc/service_graph.cmo \ src/ai/ival.cmo \ src/misc/bit_utils.cmo \ - src/ai/lattice_Interval_Set.cmo \ src/ai/base.cmo \ src/ai/origin.cmo \ src/ai/map_Lattice.cmo \ src/ai/trace.cmo \ - src/memory_state/locations.cmo \ src/memory_state/value_messages.cmo \ src/kernel/cilE.cmo \ - src/memory_state/int_Interv.cmo \ - src/memory_state/int_Interv_Map.cmo \ src/memory_state/tr_offset.cmo \ src/memory_state/offsetmap.cmo \ - src/memory_state/offsetmap_bitwise.cmo \ + src/ai/int_Intervals.cmo \ + src/memory_state/locations.cmo \ + src/memory_state/precise_locs.cmo \ src/memory_state/lmap.cmo \ src/memory_state/lmap_bitwise.cmo \ src/memory_state/function_Froms.cmo \ src/memory_state/cvalue.cmo \ src/memory_state/widen_type.cmo \ src/kernel/visitor.cmo \ - cil/src/frontc/cabsbranches.cmo \ + src/kernel/clone.cmo \ src/kernel/loop.cmo \ $(PLUGIN_TYPES_CMO_LIST) \ src/memory_state/value_types.cmo \ @@ -916,6 +846,7 @@ src/kernel/command.cmo \ src/kernel/task.cmo \ src/kernel/file.cmo \ + src/kernel/exn_flow.cmo \ src/logic/translate_lightweight.cmo \ src/kernel/unroll_loops.cmo \ src/misc/filter.cmo \ @@ -926,12 +857,12 @@ CMO += $(KERNEL_CMO) -MLI_ONLY+= src/ai/lattice_type.mli \ +MLI_ONLY+= src/ai/lattice_type.mli src/ai/int_Intervals_sig.mli \ src/memory_state/offsetmap_lattice_with_isotropy.mli \ - src/memory_state/offsetmap_sig.mli src/memory_state/lmap_sig.mli + src/memory_state/offsetmap_sig.mli src/memory_state/lmap_sig.mli \ + src/memory_state/offsetmap_bitwise_sig.mli -NO_MLI+= src/ai/map_Lattice.mli src/memory_state/value_messages.mli \ - src/memory_state/int_Interv_Map.mli +NO_MLI+= src/ai/map_Lattice.mli src/memory_state/value_messages.mli # Common startup module # All link command should add it as last linked module and depend on it. @@ -1012,14 +943,14 @@ # Value analysis # ################## -PLUGIN_ENABLE:=$(ENABLE_VALUE_ANALYSIS) +PLUGIN_ENABLE:=$(ENABLE_VALUE) PLUGIN_NAME:=Value PLUGIN_DIR:=src/value -PLUGIN_CMO:= kf_state split_strategy value_parameters \ +PLUGIN_CMO:= split_strategy value_parameters \ stop_at_nth value_perf value_util \ library_functions mark_noresults separate \ - state_set state_imp value_results current_table widen warn \ - precise_locs eval_op eval_exprs non_linear initial_state \ + state_set state_imp value_results widen valarms warn \ + eval_op eval_exprs non_linear initial_state \ locals_scoping builtins \ eval_terms eval_annots mem_exec function_args \ split_return eval_stmt per_stmt_slevel eval_slevel \ @@ -1051,7 +982,7 @@ # Runtime Error Annotation Generation analysis # ################################################ -PLUGIN_ENABLE:=$(ENABLE_RTE_ANNOTATION) +PLUGIN_ENABLE:=$(ENABLE_RTEGEN) PLUGIN_NAME:=RteGen PLUGIN_DIR:=src/rte PLUGIN_CMO:= options generator rte visit register @@ -1064,7 +995,7 @@ # From analysis # ################# -PLUGIN_ENABLE:=$(ENABLE_FROM_ANALYSIS) +PLUGIN_ENABLE:=$(ENABLE_FROM) PLUGIN_NAME:=From PLUGIN_DIR:=src/from PLUGIN_CMO:= from_parameters from_compute \ @@ -1094,7 +1025,7 @@ # Constant propagation # ######################## -PLUGIN_ENABLE:=$(ENABLE_SEMANTIC_CONSTANT_FOLDING) +PLUGIN_ENABLE:=$(ENABLE_CONSTANT_PROPAGATION) PLUGIN_NAME:=Constant_Propagation PLUGIN_DIR:=src/constant_propagation PLUGIN_CMO:= propagationParameters \ @@ -1126,7 +1057,7 @@ PLUGIN_NAME:=Inout PLUGIN_DIR:=src/inout PLUGIN_CMO:= inout_parameters cumulative_analysis \ - operational_inputs outputs inputs derefs access_path register + operational_inputs outputs inputs derefs register PLUGIN_TYPES_CMO:=src/memory_state/inout_type PLUGIN_HAS_MLI:=yes PLUGIN_NO_TEST:=yes @@ -1263,13 +1194,11 @@ ##################### define INCLUDE_PLUGIN -FRAMAC_INTERNAL:=yes FRAMAC_MAKE:=yes -FRAMAC_SHARE:=./share -FRAMAC_PLUGIN:=lib/plugins -FRAMAC_PLUGIN_GUI:=lib/plugins/gui +FRAMAC_SHARE:=$(FRAMAC_TOP_SRCDIR)/share +FRAMAC_PLUGIN:=$(FRAMAC_TOP_SRCDIR)/lib/plugins +FRAMAC_PLUGIN_GUI:=$(FRAMAC_TOP_SRCDIR)/lib/plugins/gui PLUGIN_DIR:=$(1) -FRAMAC_LIB:=lib/fc include $(1)/Makefile endef @@ -1321,18 +1250,13 @@ $(PRINT_OCAMLCP) $@ $(OCAMLCP) $(BFLAGS) -o $@ $(BYTE_LIBS) $(ALL_BATCH_CMO) -src/toplevel/toplevel_boot.ml: src/toplevel/toplevel_config.ml \ - src/kernel/boot.ml Makefile - cp src/toplevel/toplevel_config.ml $@ - sed -e "s/~quit:true/~quit:false/" src/kernel/boot.ml >> $@ - GENERATED+= src/toplevel/toplevel_boot.ml bin/toplevel.top$(EXE): $(filter-out src/kernel/boot.ml, $(ALL_BATCH_CMO)) \ src/toplevel/toplevel_boot.cmo \ $(GEN_BYTE_LIBS) $(PLUGIN_DYN_CMO_LIST) $(PRINT_OCAMLMKTOP) $@ - $(OCAMLMKTOP) $(BFLAGS) -custom -o $@ $(BYTE_LIBS) \ + $(OCAMLMKTOP) $(BFLAGS) -warn-error -31 -custom -o $@ $(BYTE_LIBS) \ $(patsubst src/kernel/boot.cmo, src/toplevel/toplevel_boot.cmo, \ $(ALL_BATCH_CMO)) @@ -1341,32 +1265,28 @@ $(PRINT_LINKING) $@ $(OCAMLOPT) $(OLINKFLAGS) -o $@ $(OPT_LIBS) $(ALL_BATCH_CMX) -share/Makefile.kernel: Makefile share/Makefile.config share/Makefile.common +################## +# Frama-C-config # +################## + +src/kernel/frama_c_config.ml: src/kernel/config.ml \ + src/kernel/frama_c_config.ml.in $(PRINT_MAKING) $@ $(RM) $@ - $(ECHO) "# This makefile was automatically generated." > $@ - $(ECHO) "# Do not modify." >> $@ - $(ECHO) "ifeq (\$$(FRAMAC_INTERNAL),yes)" >> $@ - $(ECHO) "DYN_BLINKFLAGS=$(filter-out $(INCLUDES), $(BLINKFLAGS)) $(foreach d, $(INCLUDES:-I%=%), -I $(FRAMAC_TOP_SRCDIR)/$(d))" >> $@ - $(ECHO) "DYN_GEN_BYTE_LIBS=$(addprefix $(FRAMAC_TOP_SRCDIR)/, $(GEN_BYTE_LIBS))" >> $@ - $(ECHO) "DYN_BYTE_LIBS=$(filter-out $(GEN_BYTE_LIBS), $(BYTE_LIBS))" >> $@ - $(ECHO) "DYN_ALL_BATCH_CMO=$(addprefix $(FRAMAC_TOP_SRCDIR)/, $(notdir $(ALL_BATCH_CMO)))" >> $@ - $(ECHO) "DYN_OLINKFLAGS=$(filter-out $(INCLUDES), $(OLINKFLAGS)) $(foreach d, $(INCLUDES:-I%=%), -I $(FRAMAC_TOP_SRCDIR)/$(d))" >> $@ - $(ECHO) "DYN_GEN_OPT_LIBS=$(addprefix $(FRAMAC_TOP_SRCDIR)/, $(GEN_OPT_LIBS))" >> $@ - $(ECHO) "DYN_OPT_LIBS=$(filter-out $(GEN_OPT_LIBS), $(OPT_LIBS))" >> $@ - $(ECHO) "DYN_ALL_BATCH_CMX=$(addprefix $(FRAMAC_TOP_SRCDIR)/, $(ALL_BATCH_CMX))" >> $@ - $(ECHO) "else" >> $@ - $(ECHO) "DYN_BLINKFLAGS=$(filter-out $(INCLUDES), $(BLINKFLAGS)) $(addprefix -I ,$(filter +%,$(INCLUDES)))" >> $@ - $(ECHO) "DYN_GEN_BYTE_LIBS=$(addprefix $(FRAMAC_LIBDIR)/, $(notdir $(GEN_BYTE_LIBS)))" >> $@ - $(ECHO) "DYN_BYTE_LIBS=$(filter-out $(GEN_BYTE_LIBS), $(BYTE_LIBS))" >> $@ - $(ECHO) "DYN_ALL_BATCH_CMO=$(addprefix $(FRAMAC_LIBDIR)/, $(notdir $(ALL_BATCH_CMO)))" >> $@ - $(ECHO) "DYN_OLINKFLAGS=$(filter-out $(INCLUDES), $(OLINKFLAGS)) $(addprefix -I ,$(filter +%,$(INCLUDES)))" >> $@ - $(ECHO) "DYN_GEN_OPT_LIBS=$(addprefix $(FRAMAC_LIBDIR)/, $(notdir $(GEN_OPT_LIBS)))" >> $@ - $(ECHO) "DYN_OPT_LIBS=$(filter-out $(GEN_OPT_LIBS), $(OPT_LIBS))" >> $@ - $(ECHO) "DYN_ALL_BATCH_CMX=$(addprefix $(FRAMAC_LIBDIR)/, $(notdir $(ALL_BATCH_CMX)))" >> $@ - $(ECHO) "endif" >> $@ + $(ECHO) "module Filepath = struct let add_symbolic_dir _ _ = () end" > $@ + $(CAT) $^ >> $@ $(CHMOD_RO) $@ +GENERATED+= src/kernel/frama_c_config.ml + +bin/frama-c-config$(EXE): src/kernel/frama_c_config.ml +ifeq ($(OCAMLBEST),opt) + $(OCAMLOPT) $< -o $@ +else + $(OCAMLC) $< -o $@ +endif + + ####### # GUI # ####### @@ -1387,10 +1307,6 @@ OPT_GUI_LIBS += lablgnomecanvas.cmxa endif -ifeq ($(HAS_LABLGTK),yes) -EXTRAS += gui -endif - ifeq ($(HAS_GTKSOURCEVIEW),yes) ifeq ($(HAS_LEGACY_GTKSOURCEVIEW),yes) GUI_INCLUDES += -I $(LABLGTK_PATH)/lablgtksourceview @@ -1459,11 +1375,9 @@ .PHONY:gui gui:: bin/viewer.byte$(EXE) share/Makefile.dynamic_config share/Makefile.kernel - $(MAKE) install-gui-byte FRAMAC_LIBDIR=lib/fc ifeq ($(OCAMLBEST),opt) gui:: bin/viewer.opt$(EXE) - $(MAKE) install-gui-opt FRAMAC_LIBDIR=lib/fc endif ALL_GUI_CMO= $(ALL_CMO) $(GRAPH_GUICMO) $(GUICMO) @@ -1540,42 +1454,19 @@ CONFIG_PLUGIN_CMO=$(PLUGIN_GUI_CMO_LIST) endif -$(CONFIG_FILE): VERSION share/Makefile.config Makefile - $(PRINT_MAKING) $@ - $(RM) $@ - $(ECHO) "(* This file is generated by Makefile. Do not modify. *)" \ - > $@ - $(ECHO) "let version = \""$(VERSION)"\"" >> $@ - $(ECHO) "let date = \""`LC_ALL=C date`"\"" >> $@ - $(ECHO) "let is_gui = ref false" >> $@ - $(ECHO) "let ocamlc = \""$(OCAMLC)"\"" >> $@ - $(ECHO) "let ocamlopt = \""$(OCAMLOPT)"\"" >> $@ - $(ECHO) "let datadir = try Sys.getenv \"FRAMAC_SHARE\" with Not_found -> \"$(FRAMAC_DATADIR)\"" >> $@ - $(ECHO) "let () = Filepath.add_symbolic_dir \"FRAMAC_SHARE\" datadir" \ - >> $@ - $(ECHO) "let libdir = try Sys.getenv \"FRAMAC_LIB\" with Not_found -> \"$(FRAMAC_LIBDIR)\"" >> $@ - $(ECHO) "let () = Filepath.add_symbolic_dir \"FRAMAC_LIB\" libdir" \ - >> $@ - $(ECHO) "let plugin_dir = try Sys.getenv \"FRAMAC_PLUGIN\" with Not_found -> try (Sys.getenv \"FRAMAC_LIB\") ^ \"/plugins\" with Not_found -> \"$(FRAMAC_PLUGINDIR)\"" >> $@ - $(ECHO) "let () = Filepath.add_symbolic_dir \"FRAMAC_PLUGIN\" plugin_dir" >> $@ - $(ECHO) "let preprocessor = try Sys.getenv \"CPP\" with Not_found -> \"$(FRAMAC_DEFAULT_CPP)\"" >> $@ -# Suppose that if CPP is set, it has a meaningful value. - $(ECHO) "let preprocessor_keep_comments = try (ignore (Sys.getenv \"CPP\"); true) with Not_found -> $(DEFAULT_CPP_KEEP_COMMENTS)" >> $@ - $(ECHO) "let static_plugins = [" \ - $(subst $(space),"; ",$(foreach p,$(PLUGIN_LIST),\"$(notdir $p)\")) \ - "]" >> $@ - $(ECHO) "let static_gui_plugins = [" \ - $(subst $(space),"; ",$(foreach p,$(CONFIG_PLUGIN_CMO),\"$(notdir $(patsubst %.cmo,%,$p))\")) \ - "]" >> $@ - $(ECHO) "let compilation_unit_names = [" \ - $(subst $(space),"; ",$(foreach p,$(CONFIG_CMO),\"$(notdir $(patsubst %.cmo,%,$p))\")) \ - "]" >> $@ ifeq ($(HAS_DOT),yes) - $(ECHO) "let dot = Some \"$(DOT)\"" >> $@ +OPTDOT=Some \"$(DOT)\" else - $(ECHO) "let dot = None" >> $@ +OPTDOT=None endif - $(CHMOD_RO) $@ + +STATIC_PLUGINS=$(foreach p,$(PLUGIN_LIST),\"$(notdir $p)\"; ) + +STATIC_GUI_PLUGINS=\ + $(foreach p,$(CONFIG_PLUGIN_CMO),\"$(notdir $(patsubst %.cmo,%,$p))\"; ) + +COMPILATION_UNITS=\ + $(foreach p,$(CONFIG_CMO),\"$(notdir $(patsubst %.cmo,%,$p))\"; ) ######### # Tests # @@ -1587,28 +1478,18 @@ PTESTS_FILES=ptests_config.cmi ptests_config.cmo endif -.PHONY: tests oracles btests tests_dist libc_tests +.PHONY: tests oracles btests tests_dist libc_tests plugins_ptests_config external_tests \ + update_external_tests + tests:: byte opt ptests $(PRINT_EXEC) ptests - time -p ./bin/ptests.$(PTESTSBEST)$(EXE) $(PTESTS_OPTS) \ - -make "$(MAKE)" $(PLUGIN_TESTS_LIST) - $(MAKE) external_tests + time -p $(PTESTS) $(PTESTS_OPTS) -make "$(MAKE)" $(PLUGIN_TESTS_LIST) external_tests: byte opt ptests - for plugin in $(EXTERNAL_PLUGINS); do \ - if $(call external_make,$$plugin,run_tests) 2> /dev/null; \ - then \ - $(call external_make,$$plugin,tests); \ - fi \ - done +tests:: external_tests -update_external_tests: - for plugin in $(EXTERNAL_PLUGINS); do \ - if $(call external_make,$$plugin,run_tests) 2> /dev/null; \ - then \ - PTESTS_OPTS="-update" $(call external_make,$$plugin,tests); \ - fi \ - done +update_external_tests: PTESTS_OPTS="-update" +update_external_tests: external_tests oracles: byte opt ptests $(PRINT_MAKING) oracles @@ -1641,7 +1522,7 @@ find doc/speclang -name \*.c -exec ./bin/toplevel.byte$(EXE) {} \; > /dev/null # Non-plugin test directories containing some ML files to compile -TEST_DIRS_AS_PLUGIN=dynamic dynamic_plugin journal saveload spec misc syntax +TEST_DIRS_AS_PLUGIN=dynamic dynamic_plugin journal saveload spec misc syntax pretty_printing non-free libc PLUGIN_TESTS_LIST += $(TEST_DIRS_AS_PLUGIN) $(foreach d,$(TEST_DIRS_AS_PLUGIN),$(eval $(call COMPILE_TESTS_ML_FILES,$d,,))) @@ -1704,7 +1585,9 @@ .PHONY: wc doc doc-distrib wc: - ocamlwc -p external/*.ml* cil/*/*.ml cil/*/*.ml[ily] cil/src/*/*.ml[ily] cil/src/*/*.ml[ly] src/*/*.ml src/*/*.ml[iyl] + ocamlwc -p external/*.ml* cil/*/*.ml cil/*/*.ml[ily] \ + $(CIL_PATH)/*/*.ml[ily] $(CIL_PATH)/*/*.ml[ly] \ + src/*/*.ml src/*/*.ml[iyl] # private targets, useful for recompiling the doc without dependencies # (too long!) @@ -1718,12 +1601,12 @@ GENERATED+=$(DOC_DIR)/docgen.ml ifeq ($(HAS_OCAML4),yes) -$(DOC_DIR)/docgen.ml: $(DOC_DIR)/docgen_ge400.ml share/Makefile.config Makefile +$(DOC_DIR)/docgen.ml: $(DOC_DIR)/docgen_ge400.ml share/Makefile.config $(RM) $@ $(CP) $< $@ $(CHMOD_RO) $@ else -$(DOC_DIR)/docgen.ml: $(DOC_DIR)/docgen_lt400.ml share/Makefile.config Makefile +$(DOC_DIR)/docgen.ml: $(DOC_DIR)/docgen_lt400.ml share/Makefile.config $(RM) $@ $(CP) $< $@ $(CHMOD_RO) $@ @@ -1792,18 +1675,25 @@ -t "Frama-C Kernel" \ -sort -css-style ../style.css \ -g $(DOC_PLUGIN) \ - -d $(DOC_DIR)/html -dump $(DOC_DIR)/kernel-doc.ocamldoc \ - $(MODULES_TODOC) + -d $(DOC_DIR)/html -dump $@ \ + $(MODULES_TODOC); \ + RES=$$?; \ + if test $$RES -ne 0; then \ + $(RM) $@; \ + exit $$RES; \ + fi + DYN_MLI_DIR := doc/code/print_api .PHONY: doc-dynamic +doc-dynamic: PLUGIN_LIB_DIR=$(DYN_MLI_DIR) doc-dynamic: doc-kernel $(RM) $(DYN_MLI_DIR)/dynamic_plugins.mli $(call external_make,$(DYN_MLI_DIR),clean) $(call external_make,$(DYN_MLI_DIR),depend) $(call external_make,$(DYN_MLI_DIR),byte) FRAMAC_PLUGIN=lib/plugins FRAMAC_LIB=lib/fc FRAMAC_SHARE=share \ - ./bin/toplevel.byte -load-module Print_api \ + ./bin/toplevel.byte -load-module $(DYN_MLI_DIR)/Print_api \ -print_api $(call winpath, $(FRAMAC_TOP_SRCDIR)/$(DYN_MLI_DIR)) $(PRINT_DOC) Dynamically registered plugins Documentation $(MKDIR) $(DOC_DIR)/dynamic_plugins @@ -1848,32 +1738,14 @@ $(QUIET_MAKE) doc DOC_NOT_FOR_DISTRIB= $(QUIET_MAKE) doc-tgz -# Could be optimized -.PHONY: db_doc -db_doc doc/db/db.pdf: doc/db/main.tex doc/db/main.bib doc/db/db.tex - $(PRINT_MAKING) doc/db/db.pdf - cd $(dir $@); \ - pdflatex $(notdir $<); bibtex main; \ - pdflatex $(notdir $<); pdflatex $(notdir $<); \ - mv main.pdf $(notdir $@) - #find src -name "*.ml[i]" -o -name "*.ml" -maxdepth 3 | sort -r | xargs dots: $(ALL_CMO) $(PRINT_DOC) callgraph - $(OCAMLDOC) $(INCLUDES) -o doc/call_graph.dot \ + $(OCAMLDOC) $(DOC_FLAGS) $(INCLUDES) -o doc/call_graph.dot \ -dot -dot-include-all -dot-reduce $(MODULES_TODOC) $(QUIET_MAKE) doc/call_graph.svg $(QUIET_MAKE) doc/call_graph.ps -datatype_dependencies.dot computation_dependencies.dot: ./bin/toplevel.byte$(EXE) - $(PRINT_MAKING) $@ - ./bin/toplevel.byte$(EXE) -project-debug -dump \ - > /dev/null 2> /dev/null - -.PHONY:display_dependencies -display_dependencies: datatype_dependencies.svg computation_dependencies.svg - inkscape datatype_dependencies.svg computation_dependencies.svg & - # Checking consistency with the current implementation ###################################################### @@ -1911,70 +1783,55 @@ in $(CHECK_API_DIR)/summary.txt $(RM) code_file -# Oug (M. Guesdon's tool: could probably be deleted) -##### - -oug: - echo $(ALL_CMX) $(STARTUP_CMX) > cmx.files - rpl ".cmx" ".ml" cmx.files - cp cmx.files ml0.files - rpl ".ml" ".mli" cmx.files - cat cmx.files >> ml0.files - (ls -U `cat ml0.files` | grep -v sparecode > ml.files | true) - cp ml.files files - oug.x --debug 0 -I `ocamlc -where` $(INCLUDES) -I src/value -I src/pdg -I src/slicing -I src/security_slicing -I $(LABLGTK_PATH) --no-reduce --dump dump.oug `cat files` - oug.x --load dump.oug --no-reduce --useless-elements useless.txt --aliases-used --print-loc --progress - oug.x --load dump.oug --useless-elements useless-reduced.txt --aliases-used --print-loc --progress - -metrics: - $(PRINT) Computing metrics - ocamlmetrics -max-mi 75 -worst-modules 10 -worst-functions 25 \ - $(filter-out $(GENERATED), $(patsubst cil/%,, $(patsubst lib/%,,$(ALL_CMO:.cmo=.ml)))) \ - > doc/metrics.html - ################ # Installation # ################ -FILTER_INTERFACE_DIRS:=lib/plugins src/gui +FILTER_INTERFACE_DIRS:=src/gui $(ZARITH_PATH) ifeq ("$(OCAMLGRAPH_LOCAL)","") FILTER_INTERFACE_DIRS+= $(OCAMLGRAPH_HOME) endif -.PHONY: install-kernel-byte install-kernel-opt install-gui-byte install-gui-opt - -install-kernel-byte: - $(PRINT_CP) bytecode kernel API - $(MKDIR) $(FRAMAC_LIBDIR) # line below does not work if INCLUDES contains twice the same directory # Do not attempt to copy gui interfaces if gui is disabled - $(CP) $(wildcard $(foreach d,$(filter-out $(FILTER_INTERFACE_DIRS),$(INCLUDES:-I%=%)), $(d)/*.cmi)) $(FRAMAC_LIBDIR) - $(CP) $(ALL_BATCH_CMO) $(filter-out %.o, $(GEN_BYTE_LIBS:.cmo=.cmi)) \ - $(GEN_BYTE_LIBS) $(FRAMAC_LIBDIR) - -install-kernel-opt: - $(PRINT_CP) native kernel API - $(CP) $(ALL_BATCH_CMX) \ +#Byte +# $(sort ...) is a quick fix for duplicated graph.cmi +LIB_BYTE_TO_INSTALL=\ + $(sort \ + $(filter-out \ + $(patsubst %.cma,%.cmi,$(PLUGIN_DYN_CMO_LIST:.cmo=.cmi)), \ + $(wildcard $(foreach d,$(filter-out $(FILTER_INTERFACE_DIRS),$(INCLUDES:-I%=%)), $(d)/*.cmi))) \ + $(ALL_BATCH_CMO) \ + $(filter-out %.o, $(GEN_BYTE_LIBS:.cmo=.cmi)) \ + $(GEN_BYTE_LIBS) \ + ) + +#Byte GUI +ifneq ("$(ENABLE_GUI)","no") +LIB_BYTE_TO_INSTALL+=$(SINGLE_GUI_CMI) $(SINGLE_GUI_CMO) +endif + +#Opt +ifeq ("$(OCAMLBEST)","opt") +LIB_OPT_TO_INSTALL +=\ + $(ALL_BATCH_CMX) \ $(filter %.a,$(ALL_BATCH_CMX:.cmxa=.a)) \ $(filter %.o,$(ALL_BATCH_CMX:.cmx=.o)) \ - $(FRAMAC_LIBDIR) - $(CP) $(filter-out %.o, $(GEN_OPT_LIBS)) \ - $(filter %.o,$(GEN_OPT_LIBS:.cmx=.o)) $(FRAMAC_LIBDIR) + $(filter-out %.o, $(GEN_OPT_LIBS)) \ + $(filter-out $(GEN_BYTE_LIBS), $(filter %.o,$(GEN_OPT_LIBS:.cmx=.o))) -install-gui-byte: - $(PRINT_CP) bytecode gui API - $(MKDIR) $(FRAMAC_LIBDIR) - if [ "$(ENABLE_GUI)" != "no" ]; then \ - $(CP) $(SINGLE_GUI_CMI) $(SINGLE_GUI_CMO) $(FRAMAC_LIBDIR); \ - fi +#Opt GUI +ifneq ("$(ENABLE_GUI)","no") +LIB_OPT_TO_INSTALL += $(SINGLE_GUI_CMX) $(SINGLE_GUI_CMX:.cmx=.o) +endif + +endif -install-gui-opt: - $(PRINT_CP) native gui API +install-lib: + $(PRINT_CP) kernel API $(MKDIR) $(FRAMAC_LIBDIR) - if [ "$(ENABLE_GUI)" != "no" -a "$(OCAMLBEST)" = "opt" ]; then \ - $(CP) $(SINGLE_GUI_CMX) $(SINGLE_GUI_CMX:.cmx=.o) $(FRAMAC_LIBDIR); \ - fi + $(CP) $(LIB_BYTE_TO_INSTALL) $(LIB_OPT_TO_INSTALL) $(FRAMAC_LIBDIR) install-doc-code: $(PRINT_CP) API documentation @@ -1986,12 +1843,13 @@ | (cd $(FRAMAC_DATADIR)/doc ; tar xf -)) .PHONY: install -install:: +install:: install-lib $(PRINT_MAKING) destination directories $(MKDIR) $(BINDIR) $(MKDIR) $(MANDIR)/man1 $(MKDIR) $(FRAMAC_PLUGINDIR)/gui - $(MKDIR) $(FRAMAC_DATADIR)/feedback + $(MKDIR) $(FRAMAC_DATADIR)/theme/default + $(MKDIR) $(FRAMAC_DATADIR)/theme/colorblind $(MKDIR) $(FRAMAC_DATADIR)/libc/sys $(MKDIR) $(FRAMAC_DATADIR)/libc/netinet $(MKDIR) $(FRAMAC_DATADIR)/libc/linux @@ -2005,7 +1863,8 @@ share/configure.ac \ $(FRAMAC_DATADIR) $(CP) share/frama-c.rc $(ICONS) $(FRAMAC_DATADIR) - $(CP) $(FEEDBACK_ICONS) $(FRAMAC_DATADIR)/feedback + $(CP) $(FEEDBACK_ICONS_DEFAULT) $(FRAMAC_DATADIR)/theme/default + $(CP) $(FEEDBACK_ICONS_COLORBLIND) $(FRAMAC_DATADIR)/theme/colorblind if [ -d $(EMACS_DATADIR) ]; then \ $(CP) share/acsl.el $(EMACS_DATADIR); \ fi @@ -2033,17 +1892,11 @@ fi $(CP) bin/ptests.$(PTESTSBEST)$(EXE) \ $(BINDIR)/ptests.$(PTESTSBEST)$(EXE) + if [ -x bin/frama-c-config$(EXE) ] ; then \ + $(CP) bin/frama-c-config$(EXE) $(BINDIR); \ + fi $(PRINT_CP) config files $(CP) $(addprefix ptests/,$(PTESTS_FILES)) $(FRAMAC_LIBDIR) - $(PRINT_CP) manuals - if [ -d doc/manuals ]; then \ - $(MKDIR) $(FRAMAC_DATADIR)/manuals ; \ - if [ -h doc/manuals/acsl.pdf ]; then \ - $(CP_L) doc/manuals/*.pdf $(FRAMAC_DATADIR)/manuals ; \ - else \ - $(CP) doc/manuals/*.pdf $(FRAMAC_DATADIR)/manuals ; \ - fi \ - fi $(PRINT_CP) API documentation $(MKDIR) $(FRAMAC_DATADIR)/doc/code $(CP) $(wildcard $(DOC_GEN_FILES)) $(FRAMAC_DATADIR)/doc/code @@ -2060,11 +1913,6 @@ $(PLUGIN_DYN_GUI_CMO_LIST) $(PLUGIN_DYN_GUI_CMX_LIST) \ $(FRAMAC_PLUGINDIR)/gui; \ fi - $(MAKE) install-kernel-byte - $(MAKE) install-gui-byte - if [ "$(OCAMLBEST)" = "opt" ]; then \ - $(MAKE) install-kernel-opt install-gui-opt; \ - fi $(PRINT_CP) man pages $(CP) man/frama-c.1 $(MANDIR)/man1/frama-c.1 $(CP) man/frama-c.1 $(MANDIR)/man1/frama-c-gui.1 @@ -2094,13 +1942,21 @@ # Kernel licences ################# +CEA_CIL = $(CIL_PATH)/frontc/cabs_debug.ml \ + $(CIL_PATH)/frontc/cabs_debug.mli \ + $(CIL_PATH)/ext/ordered_stmt.ml* \ + $(CIL_PATH)/cil_state_builder.ml* \ + $(CIL_PATH)/ext/dataflow2.ml* \ + $(CIL_PATH)/cil_datatype.ml* \ + +CIL = $(filter-out $(CEA_CIL), \ + $(wildcard cil/ocamlutil/*.ml* \ + $(CIL_PATH)/*.ml* \ + $(CIL_PATH)/ext/*.ml* \ + $(CIL_PATH)/frontc/*.ml*)) \ + $(CIL_PATH)/machdep.c -CIL = cil/ocamlutil/*.ml* \ - cil/src/*.ml* \ - cil/src/ext/*.ml* \ - cil/src/frontc/*.ml* - -CEA_INRIA_LGPL = configure.in cil/src/logic/*.ml* +CEA_INRIA_LGPL = configure.in $(CIL_PATH)/logic/*.ml* MODIFIED_WHY3+=external/sysutil.ml* MODIFIED_OCAMLGRAPH=src/project/state_topological.ml* @@ -2111,7 +1967,7 @@ INRIA_BSD= external/unmarshal*.ml* INSA_INRIA_LGPL= -CEA_LGPL= Makefile \ +CEA_LGPL= Makefile Makefile.generating \ share/Makefile.config.in share/Makefile.common share/Makefile.generic \ share/Makefile.plugin share/Makefile.dynamic \ share/Makefile.dynamic_config.internal \ @@ -2146,7 +2002,6 @@ $(patsubst %.cmo, %.ml*, \ $(filter-out src/project/state_topological.cmo, $(PROJECT_CMO))) \ src/project/project_skeleton.ml* \ - src/project/state.ml* \ src/security_slicing/*.ml* \ src/security_slicing/configure.ac src/security_slicing/Makefile.in \ src/semantic_callgraph/*.ml* \ @@ -2158,9 +2013,9 @@ src/dummy/*/*.ml* \ src/dummy/*/Makefile \ src/rte/*.ml* \ - src/report/*.ml* \ - cil/src/frontc/cabs_debug.ml \ + $(CEA_CIL) \ ptests/*.ml* \ + doc/Makefile \ doc/code/docgen_*.ml \ doc/code/style.css \ doc/code/intro_plugin.txt \ @@ -2172,10 +2027,11 @@ man/frama-c.1 \ bin/lithium2beryllium.sh bin/boron2carbon.sh bin/carbon2nitrogen.sh \ bin/nitrogen2oxygen.sh bin/oxygen2fluorine.sh bin/fluorine2neon.sh \ + bin/neon2sodium.sh \ $(FREE_LIBC) CEA_PROPRIETARY:= \ - src/value/builtins_nonfree*.ml* \ + src/*/*nonfree*.ml* \ src/finder/*.ml* src/finder/configure.ac src/finder/Makefile.in \ $(filter-out $(wildcard $(FREE_LIBC)), $(wildcard $(NONFREE_LIBC))) @@ -2207,10 +2063,12 @@ NO_CHECK_HEADERS=tests/*/* doc/manuals/*.pdf \ doc/README cil/LICENSE cil/CHANGES Changelog .make* \ + src/wp/Changelog \ .force-reconfigure \ licenses/* VERSION INSTALL bin/sed* \ - share/Makefile.kernel $(ICONS) $(FEEDBACK_ICONS) \ - INSTALL_WITH_WHY + share/Makefile.kernel $(ICONS) $(FEEDBACK_ICONS_DEFAULT) \ + $(FEEDBACK_ICONS_COLORBLIND) \ + INSTALL_WITH_WHY opam/* opam/files/* .PHONY: check-headers check-headers-xunit check-headers: $(GENERATED) @@ -2276,7 +2134,7 @@ share/Makefile.config: share/Makefile.config.in config.status $(PRINT_MAKING) $@ - ./config.status + ./config.status --file $@ share/Makefile.dynamic_config: share/Makefile.dynamic_config.internal $(PRINT_MAKING) $@ @@ -2290,9 +2148,7 @@ configure: configure.in .force-reconfigure $(PRINT_MAKING) $@ - rm -fr autom4te.conf - autoconf - touch configure + autoconf -f # If 'make clean' has to be performed after 'svn update': # change '.make-clean-stamp' before 'svn commit' @@ -2330,7 +2186,7 @@ $(RM) $(DOC_DIR)/docgen.cm* $(DOC_DIR)/*~ $(RM) doc/db/*~ doc/db/ocamldoc.sty doc/db/db.tex $(RM) doc/training/*/*.cm* - $(MAKE) --silent -C $(DYN_MLI_DIR) clean + $(MAKE) FRAMAC_SHARE=$(FRAMAC_SHARE) FRAMAC_LIBDIR=$(FRAMAC_LIBDIR) --silent -C $(DYN_MLI_DIR) clean if [ -f doc/developer/Makefile ]; then \ $(MAKE) --silent -C doc/developer clean; \ fi @@ -2364,9 +2220,10 @@ done $(PRINT_RM) generated files $(RM) $(GENERATED) - $(RM) ptests_config.* # temporary clean-up of svn version $(PRINT_RM) binaries - $(RM) bin/*.byte$(EXE) bin/*.opt$(EXE) bin/*.top$(EXE) + $(RM) bin/toplevel.byte$(EXE) bin/viewer.byte$(EXE) \ + bin/ptests.byte$(EXE) bin/*.opt$(EXE) bin/*.top$(EXE) + $(RM) bin/frama-c-config$(EXE) smartclean: $(MAKE) -f share/Makefile.clean smartclean @@ -2381,7 +2238,7 @@ # Do NOT use :: for this rule: it is mandatory to remove share/Makefile.config # as the very last step performed by make (who'll otherwise try to regenerate # it in the middle of cleaning) -dist-clean distclean: clean clean-doc distclean-ocamlgraph distclean-mcpp \ +dist-clean distclean: clean clean-doc distclean-ocamlgraph \ $(PLUGIN_LIST:=_DIST_CLEAN) \ $(PLUGIN_DYN_LIST:=_DIST_CLEAN) $(PRINT_RM) config @@ -2415,22 +2272,21 @@ # Depend # ########## -GENERATED+=ptests/ptests_config.ml PLUGIN_DEP_LIST:=$(PLUGIN_LIST) $(PLUGIN_DYN_LIST) .PHONY: depend depend:: $(PLUGIN_DEP_LIST:%=%_DEP_REDO) -$(ALL_CMO:.cmo=.cmi) $(ALL_CMO) $(ALL_CMX): $(GRAPH_LIB) | .depend +#$(ALL_CMO:.cmo=.cmi) $(ALL_CMO) $(ALL_CMX): $(GRAPH_LIB) GENERATED_FOR_OCAMLDEP:= $(filter-out $(GRAPH_LIB), $(GENERATED)) .depend depend:: $(GENERATED_FOR_OCAMLDEP) \ share/Makefile.dynamic_config share/Makefile.kernel \ - $(PLUGIN_DEP_LIST:%=%_DEP) + $(PLUGIN_DEP_LIST:%=%_DEP) $(GRAPH_LIB) $(PRINT_MAKING) .depend - $(CHMOD_RW) .depend + $(RM) .depend if test "$(PLUGIN_DEP_LIST)" != " "; then \ $(CAT) $(foreach d, $(PLUGIN_DEP_LIST), $(dir $d).depend) \ > .depend; \ @@ -2440,7 +2296,13 @@ $(OCAMLDEP) $(DEP_FLAGS) $(FILES_FOR_OCAMLDEP) >> .depend $(CHMOD_RO) .depend +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(MAKECMDGOALS),distclean) +ifneq ($(MAKECMDGOALS),smartclean) include .depend +endif +endif +endif ##################### # ptest development # @@ -2450,12 +2312,16 @@ PTESTS_SRC=ptests/ptests_config.ml ptests/ptests.ml +# Do not generate tests/ptests_config if we are compiling a distribution +# that does not contain a 'tests' dir +PTESTS_CONFIG:= $(shell if test -d tests; then echo tests/ptests_config; fi) + ifeq ($(NATIVE_THREADS),yes) THREAD=-thread -ptests: bin/ptests.$(PTESTSBEST)$(EXE) +ptests: bin/ptests.$(PTESTSBEST)$(EXE) $(PTESTS_CONFIG) else THREAD=-vmthread -ptests: bin/ptests.byte$(EXE) +ptests: bin/ptests.byte$(EXE) $(PTESTS_CONFIG) endif bin/ptests.byte$(EXE): $(PTESTS_SRC) @@ -2468,44 +2334,14 @@ $(OCAMLOPT) -I ptests -dtypes $(THREAD) -o $@ \ unix.cmxa threads.cmxa str.cmxa dynlink.cmxa $^ -# "let default_suites = ref [" $(PLUGIN_TESTS_LIST:%='"%";') "];;" >> $@ - -ptests/ptests_config.ml: Makefile share/Makefile.config - $(PRINT_MAKING) $@ - $(RM) $@ - $(TOUCH) $@; - $(ECHO) \ - "let default_suites : string list ref = ref [" $(PLUGIN_TESTS_LIST:%='"%";') "];;" >> $@ - $(ECHO) \ - "let no_native_dynlink = " \ - $(subst yes,false,$(subst no,true,$(USABLE_NATIVE_DYNLINK))) ";;" \ - >> $@ - $(ECHO) \ - "let toplevel_path = ref \"bin/toplevel.$(OCAMLBEST)$(EXE)\";;" >> $@ - $(ECHO) \ - "let framac_session = ref Filename.current_dir_name;;" >> $@ - $(ECHO) \ - "let framac_share = ref (Filename.concat Filename.current_dir_name \ -\"share\");;" >> $@ - $(ECHO) \ - "let framac_plugin = ref \ -(Filename.concat (Filename.concat Filename.current_dir_name \"lib\")\ - \"plugins\");;" >> $@ - $(ECHO) \ - "let framac_plugin_gui = ref \ -(Filename.concat !framac_plugin \"gui\");;" >> $@ - $(ECHO) \ - "let framac_lib = ref \ -(Filename.concat (Filename.concat Filename.current_dir_name \"lib\")\ -\"fc\");;" >> $@ - $(CHMOD_RO) $@ - -GENERATED+=ptests/ptests_config.ml +GENERATED+=ptests/ptests_config.ml tests/ptests_config ####################### # Source distribution # ####################### +.PHONY: src-distrib bin-distrib + STANDALONE_PLUGINS_FILES = \ $(addprefix src/dummy/hello_world/, hello_world.ml Makefile) \ $(addprefix src/dummy/untyped_metrics/, count_for.ml Makefile) @@ -2513,39 +2349,69 @@ DISTRIB_FILES += $(PLUGIN_DISTRIBUTED_LIST) $(PLUGIN_DIST_EXTERNAL_LIST) \ $(PLUGIN_DIST_DOC_LIST) $(STANDALONE_PLUGINS_FILES) -EXPORT=frama-c-$(VERSION) - NONFREE=no ifeq ($(NONFREE),no) -DISTRIB_FILES := $(filter-out src/value/builtins_nonfree%, \ +DISTRIB_FILES := $(filter-out \ + src/value/builtins_nonfree% src/report/csv_nonfree%, \ $(wildcard $(DISTRIB_FILES))) else DISTRIB_FILES:=$(DISTRIB_FILES) $(NONFREE_LIBC) endif -src-distrib: src-distrib-ocamlgraph - $(MAKE) clean - $(PRINT_TAR) tmp-distrib - $(TAR) chf tmp.tar --exclude="*/non-free/*" $(wildcard $(DISTRIB_FILES)) - $(PRINT_MAKING) export directories - $(MKDIR) $(EXPORT)/bin - $(MKDIR) $(EXPORT)/lib/plugins - $(MKDIR) $(EXPORT)/lib/gui - $(MKDIR) $(EXPORT)/external - $(PRINT_UNTAR) tmp-distrib - cd $(EXPORT); $(TAR) xf ../tmp.tar; autoconf; \ - rm -rf autom4te.cache src/*/autom4te.cache - $(PRINT_RM) tmp-distrib - $(RM) tmp.tar - $(PRINT_MAKING) test directories - for dir in $(EXPORT)/tests/*; do \ - $(MKDIR) $$dir/result; \ - $(MKDIR) $$dir/oracle; \ - done - $(PRINT_MAKING) archive - $(TAR) czf frama-c-src.tar.gz $(EXPORT) - $(PRINT) Cleaning - $(RM) -fr $(EXPORT) +DISTRIB_FILES:=$(filter-out $(GENERATED) $(PLUGIN_GENERATED_LIST), \ + $(wildcard $(DISTRIB_FILES))) + +DISTRIB_DIR=tmp +ifeq ("$(CLIENT)","") +VERSION_NAME=$(VERSION) +else +VERSION_NAME=$(VERSION)-$(CLIENT) +endif + +DISTRIB?=frama-c-$(VERSION_NAME) +CLIENT_DIR=$(DISTRIB_DIR)/$(DISTRIB) + +ifeq ($(NONFREE),no) +EXCLUDE=--exclude \"*/non-free/*\" +else +EXCLUDE= +endif + +# useful parameters: +# CLIENT: name of the client (in the version number, the archive name, etc) +# DISTRIB: name of the generated tarball and of the root tarball directory +# NONFREE: set it to 'yes' if you want to deliver the non-free part of Frama-C +src-distrib: +ifeq ("$(CLIENT)","") + $(PRINT_BUILD) "$(DISTRIB) (non-free: $(NONFREE))" +else + $(PRINT_BUILD) "distrib $(DISTRIB) for $(CLIENT) (non-free: $(NONFREE))" +endif + $(RM) -r $(CLIENT_DIR) + $(MKDIR) -p $(CLIENT_DIR) + $(TAR) -cf - $(DISTRIB_FILES) $(DISTRIB_TESTS) ocamlgraph.tar.gz | $(TAR) -C $(CLIENT_DIR) -xf - + $(PRINT_MAKING) files + (cd $(CLIENT_DIR) ; \ + echo "$(VERSION_NAME)" > VERSION && \ + DISTRIB_CONF=yes autoconf > ../../.log.autoconf 2>&1) + $(MKDIR) $(CLIENT_DIR)/bin + $(MKDIR) $(CLIENT_DIR)/lib/plugins + $(MKDIR) $(CLIENT_DIR)/lib/gui + $(MKDIR) $(CLIENT_DIR)/external + $(MKDIR) $(CLIENT_DIR)/tests/non-free + $(RM) ../$(DISTRIB).tar.gz + $(PRINT_TAR) $(DISTRIB).tar.gz + (cd $(DISTRIB_DIR); $(TAR) zcf ../$(DISTRIB).tar.gz \ + $(EXCLUDE) \ + --exclude "*autom4te.cache*" \ + $(DISTRIB) \ + ) + $(PRINT_RM) $(DISTRIB_DIR) + $(RM) -r $(DISTRIB_DIR) + +clean-distrib: dist-clean + $(PRINT_RM) distrib + $(RM) -r $(DISTRIB_DIR) $(DISTRIB).tar.gz bin-distrib: depend configure Makefile $(PRINT_MAKING) bin-distrib @@ -2554,46 +2420,45 @@ $(QUIET_MAKE) DESTDIR=$(FRAMAC_SRC)/$(VERSION) install $(CP) README $(VERSION) -clean-distrib: dist-clean - $(PRINT_RM) distrib - $(RM) -r $(EXPORT) $(EXPORT).tar.gz +create_lib_to_install_list = $(addprefix $(FRAMAC_LIB)/,$(call map,notdir,$(1))) -ifeq ($(OCAMLGRAPH_LOCAL),"") -src-distrib-ocamlgraph: - $(PRINT_MAKING) distrib-ocamlgraph - @ $(ECHO) "Cannot make distrib tar ball without local ocamlgraph installation" - @ exit 2 -else -src-distrib-ocamlgraph: - $(PRINT_MAKING) distrib-ocamlgraph - $(MKDIR) $(EXPORT) - $(CP) ocamlgraph.tar.gz $(EXPORT) -endif +byte:: bin/toplevel.byte$(EXE) \ + share/Makefile.dynamic_config share/Makefile.kernel \ + $(call create_lib_to_install_list,$(LIB_BYTE_TO_INSTALL)) -# Compiling Frama-C's mcpp +opt:: bin/toplevel.opt$(EXE) \ + share/Makefile.dynamic_config share/Makefile.kernel \ + $(call create_lib_to_install_list,$(LIB_OPT_TO_INSTALL)) \ + $(filter %.o %.cmi, $(call create_lib_to_install_list,$(LIB_BYTE_TO_INSTALL))) -# force "make mcpp" to be executed for all SVN users -force-mcpp: - expr `$(CAT) .make-mcpp-stamp` + 1 > .make-mcpp-stamp +top: bin/toplevel.top$(EXE) \ + $(call create_lib_to_install_list,$(LIB_BYTE_TO_INSTALL)) -bin/frama-c-mcpp$(EXE): .make-mcpp-stamp - $(PRINT_MAKING) Frama-C\'s mcpp - $(QUIET_MAKE) -C mcpp - $(CP) mcpp/src/mcpp$(EXE) $@ -distclean-mcpp: - if test -f mcpp/Makefile ; then $(QUIET_MAKE) -C mcpp clean ; fi +################## +# Copy in lib/fc # +################## -ifneq ($(FC_MCPP),no) -all:: bin/frama-c-mcpp$(EXE) -install:: - $(MKDIR) $(BINDIR) - $(PRINT_CP) frama-c-mcpp$(EXE) - $(CP) bin/frama-c-mcpp$(EXE) $(BINDIR) -uninstall:: - $(PRINT_RM) frama-c-mcpp$(EXE) - $(RM) $(BINDIR)/frama-c-mcpp$(EXE) -endif +define copy_in_lib +$(FRAMAC_LIB)/$(notdir $(1)): $(1) + $(MKDIR) $(FRAMAC_LIB) + $(CP) $$< $$@ + +endef +$(eval $(foreach file, $(LIB_BYTE_TO_INSTALL), $(call copy_in_lib, $(file)))) +$(eval $(foreach file, $(LIB_OPT_TO_INSTALL), $(call copy_in_lib, $(file)))) + + +################### +# Generating part # +################### +# It is in another file in order to have a dependency only on Makefile.generating + +include Makefile.generating + +################ +# Generic part # +################ include share/Makefile.generic diff -Nru frama-c-20140301+neon+dfsg/Makefile.generating frama-c-20150201+sodium+dfsg/Makefile.generating --- frama-c-20140301+neon+dfsg/Makefile.generating 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/Makefile.generating 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,145 @@ +########################################################################## +# # +# This file is part of Frama-C. # +# # +# Copyright (C) 2007-2015 # +# 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). # +# # +########################################################################## + +ptests/ptests_config.ml: Makefile.generating share/Makefile.config + $(PRINT_MAKING) $@ + $(RM) $@ + $(TOUCH) $@ + $(ECHO) \ + "let no_native_dynlink = " \ + $(subst yes,false,$(subst no,true,$(USABLE_NATIVE_DYNLINK))) ";;" \ + >> $@ + $(CHMOD_RO) $@ + +tests/ptests_config: Makefile.generating share/Makefile.config + $(PRINT_MAKING) $@ + $(RM) $@ + $(TOUCH) $@ + $(ECHO) "DEFAULT_SUITES=$(PLUGIN_TESTS_LIST)" >> $@ + $(ECHO) "TOPLEVEL_PATH=bin/toplevel.$(OCAMLBEST)$(EXE)" >> $@ + $(ECHO) "OCAMLRUNPARAM=" >> $@ + $(ECHO) "FRAMAC_SESSION=." >> $@ + $(ECHO) "FRAMAC_SHARE=./share" >> $@ + $(ECHO) "FRAMAC_PLUGIN=./lib/plugins" >> $@ + $(ECHO) "FRAMAC_PLUGIN_GUI=./lib/plugins/gui" >> $@ + $(ECHO) "FRAMAC_LIB=./lib/fc" >> $@ + $(CHMOD_RO) $@ + +share/Makefile.kernel: Makefile.generating share/Makefile.config share/Makefile.common + $(PRINT_MAKING) $@ + $(RM) $@ + $(ECHO) "# This makefile was automatically generated." > $@ + $(ECHO) "# Do not modify." >> $@ + $(ECHO) "ifeq (\$$(FRAMAC_INTERNAL),yes)" >> $@ + $(ECHO) "DYN_BLINKFLAGS=$(filter-out $(INCLUDES), $(BLINKFLAGS)) $(foreach d, $(INCLUDES:-I%=%), -I $(FRAMAC_TOP_SRCDIR)/$(d))" >> $@ + $(ECHO) "DYN_GEN_BYTE_LIBS=$(addprefix $(FRAMAC_TOP_SRCDIR)/, $(GEN_BYTE_LIBS))" >> $@ + $(ECHO) "DYN_BYTE_LIBS=$(filter-out $(GEN_BYTE_LIBS), $(BYTE_LIBS))" >> $@ + $(ECHO) "DYN_ALL_BATCH_CMO=$(addprefix $(FRAMAC_TOP_SRCDIR)/, $(notdir $(ALL_BATCH_CMO)))" >> $@ + $(ECHO) "DYN_OLINKFLAGS=$(filter-out $(INCLUDES), $(OLINKFLAGS)) $(foreach d, $(INCLUDES:-I%=%), -I $(FRAMAC_TOP_SRCDIR)/$(d))" >> $@ + $(ECHO) "DYN_GEN_OPT_LIBS=$(addprefix $(FRAMAC_TOP_SRCDIR)/, $(GEN_OPT_LIBS))" >> $@ + $(ECHO) "DYN_OPT_LIBS=$(filter-out $(GEN_OPT_LIBS), $(OPT_LIBS))" >> $@ + $(ECHO) "DYN_ALL_BATCH_CMX=$(addprefix $(FRAMAC_TOP_SRCDIR)/, $(ALL_BATCH_CMX))" >> $@ + $(ECHO) "else" >> $@ + $(ECHO) "DYN_BLINKFLAGS=$(filter-out $(INCLUDES), $(BLINKFLAGS)) $(addprefix -I ,$(filter +%,$(INCLUDES)))" >> $@ + $(ECHO) "DYN_GEN_BYTE_LIBS=$(addprefix $(FRAMAC_LIBDIR)/, $(notdir $(GEN_BYTE_LIBS)))" >> $@ + $(ECHO) "DYN_BYTE_LIBS=$(filter-out $(GEN_BYTE_LIBS), $(BYTE_LIBS))" >> $@ + $(ECHO) "DYN_ALL_BATCH_CMO=$(addprefix $(FRAMAC_LIBDIR)/, $(notdir $(ALL_BATCH_CMO)))" >> $@ + $(ECHO) "DYN_OLINKFLAGS=$(filter-out $(INCLUDES), $(OLINKFLAGS)) $(addprefix -I ,$(filter +%,$(INCLUDES)))" >> $@ + $(ECHO) "DYN_GEN_OPT_LIBS=$(addprefix $(FRAMAC_LIBDIR)/, $(notdir $(GEN_OPT_LIBS)))" >> $@ + $(ECHO) "DYN_OPT_LIBS=$(filter-out $(GEN_OPT_LIBS), $(OPT_LIBS))" >> $@ + $(ECHO) "DYN_ALL_BATCH_CMX=$(addprefix $(FRAMAC_LIBDIR)/, $(notdir $(ALL_BATCH_CMX)))" >> $@ + $(ECHO) "endif" >> $@ + $(CHMOD_RO) $@ + +$(CONFIG_FILE): $(CONFIG_FILE).in VERSION share/Makefile.config Makefile.generating configure.in + $(PRINT_MAKING) $@ + $(RM) $@ + $(SED) \ + -e "s|@VERSION@|$(VERSION)|" \ + -e "s|@CURR_DATE@|$$(LC_ALL=C date)|" \ + -e "s|@OCAMLC@|$(OCAMLC)|" \ + -e "s|@OCAMLOPT@|$(OCAMLOPT)|" \ + -e "s|@FRAMAC_DATADIR@|$(FRAMAC_DATADIR)|" \ + -e "s|@FRAMAC_LIBDIR@|$(FRAMAC_LIBDIR)|" \ + -e "s|@FRAMAC_TOP_SRCDIR@|$(FRAMAC_TOP_SRCDIR)|" \ + -e "s|@FRAMAC_PLUGINDIR@|$(FRAMAC_PLUGINDIR)|" \ + -e "s|@FRAMAC_DEFAULT_CPP@|$(FRAMAC_DEFAULT_CPP)|" \ + -e "s|@FRAMAC_GNU_CPP@|$(FRAMAC_GNU_CPP)|" \ + -e "s|@DEFAULT_CPP_KEEP_COMMENTS@|$(DEFAULT_CPP_KEEP_COMMENTS)|" \ + -e "s|@STATIC_PLUGINS@|$(STATIC_PLUGINS)|" \ + -e "s|@STATIC_GUI_PLUGINS@|$(STATIC_GUI_PLUGINS)|" \ + -e "s|@COMPILATION_UNITS@|$(COMPILATION_UNITS)|" \ + -e "s|@OPTDOT@|$(OPTDOT)|" \ + -e "s|@EXE@|$(EXE)|" \ + $< > $@ + $(CHMOD_RO) $@ + +src/toplevel/toplevel_boot.ml: src/toplevel/toplevel_config.ml \ + src/kernel/boot.ml Makefile.generating + cp src/toplevel/toplevel_config.ml $@ + sed -e "s/~quit:true/~quit:false/" src/kernel/boot.ml >> $@ + +ifeq ("$(LOCAL_MACHDEP)","yes") + +# Create the machine dependency module +# If the cl command cannot be run then the MSVC part will be identical to GCC +.PHONY : machdep $(CIL_PATH)/local_machdep.ml +machdep: $(CIL_PATH)/local_machdep.ml +bin/machdep.exe: machdep + +$(CIL_PATH)/local_machdep.ml: $(CIL_PATH)/machdep.c configure.in Makefile.generating + $(PRINT_MAKING) $@ + $(RM) $@ + $(ECHO) "(* This module was generated automatically by code in Makefile and machdep.c *)" >$@ +# Now generate the type definition + $(ECHO) "open Cil_types" >> $@ + if $(CC) -D_GNUCC $< -o bin/machdep.exe ;then \ + $(ECHO) "machdep.exe created succesfully."; \ + else \ + $(RM) $@; exit 1; \ + fi + $(ECHO) "let gcc = {" >>$@ + ./bin/machdep.exe >>$@ + $(ECHO) " underscore_name = $(UNDERSCORE_NAME) ;" >> $@ + $(ECHO) "}" >>$@ + if cl /D_MSVC $< /Febin/machdep.exe /Fobin/machdep.obj ;then \ + $(ECHO) "let hasMSVC = true" >>$@; \ + else \ + $(ECHO) "let hasMSVC = false" >>$@; \ + fi + $(ECHO) "let msvc = {" >>$@ + ./bin/machdep.exe >>$@ + $(ECHO) " underscore_name = true ;" >> $@ + $(ECHO) "}" >>$@ + $(ECHO) \ + "let gccHas__builtin_va_list = $(HAVE_BUILTIN_VA_LIST)" >>$@ + $(ECHO) "let __thread_is_keyword = $(THREAD_IS_KEYWORD)" >>$@ + $(ECHO) \ + "$@ generated. You may have this file merged into Frama-C by developers." + $(CHMOD_RO) $@ + +endif + + +# Local Variables: +# mode: makefile +# End: diff -Nru frama-c-20140301+neon+dfsg/.make-ocamlgraph-stamp frama-c-20150201+sodium+dfsg/.make-ocamlgraph-stamp --- frama-c-20140301+neon+dfsg/.make-ocamlgraph-stamp 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/.make-ocamlgraph-stamp 2015-05-28 08:53:23.000000000 +0000 @@ -1 +1 @@ -83 +85 diff -Nru frama-c-20140301+neon+dfsg/man/frama-c.1 frama-c-20150201+sodium+dfsg/man/frama-c.1 --- frama-c-20140301+neon+dfsg/man/frama-c.1 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/man/frama-c.1 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ .\" .\" This file is part of Frama-C. .\" -.\" Copyright (C) 2007-2014 +.\" Copyright (C) 2007-2015 .\" CEA (Commissariat à l'énergie atomique et aux énergies .\" alternatives) .\" @@ -395,7 +395,7 @@ no. .TP .B -then -allows to compose analyzes: a first run of Frama-C will occur with the +allows one to compose analyzes: a first run of Frama-C will occur with the options before .B -then and a second run will be done with the options after diff -Nru frama-c-20140301+neon+dfsg/opam/descr frama-c-20150201+sodium+dfsg/opam/descr --- frama-c-20140301+neon+dfsg/opam/descr 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/opam/descr 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,9 @@ +Platform dedicated to the static analysis of source code written in C +Frama-C is a suite of tools dedicated to the analysis of the source +code of software written in C. Neon version. + +Frama-C gathers several static analysis techniques in a single +collaborative framework. The collaborative approach of Frama-C allows +static analyzers to build upon the results already computed by other +analyzers in the framework. Thanks to this approach, Frama-C provides +sophisticated tools, such as a slicer and dependency analysis. diff -Nru frama-c-20140301+neon+dfsg/opam/files/run_autoconf_if_needed.ml frama-c-20150201+sodium+dfsg/opam/files/run_autoconf_if_needed.ml --- frama-c-20140301+neon+dfsg/opam/files/run_autoconf_if_needed.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/opam/files/run_autoconf_if_needed.ml 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,5 @@ + + +let () = + if not (Sys.file_exists "configure") then + exit (Sys.command "autoconf") diff -Nru frama-c-20140301+neon+dfsg/opam/opam frama-c-20150201+sodium+dfsg/opam/opam --- frama-c-20140301+neon+dfsg/opam/opam 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/opam/opam 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,77 @@ +opam-version: "1.2.0" +name: "frama-c" +version: "20150201" +maintainer: "francois.bobot@cea.fr" +authors: [ + "Patrick Baudin" + "François Bobot" + "Richard Bonichon" + "Loïc Correnson" + "Pascal Cuoq" + "Zaynah Dargaye" + "Jean-Christophe Filliâtre" + "Philippe Herrmann" + "Florent Kirchner" + "Matthieu Lemerre" + "Claude Marché" + "Benjamin Monate" + "Yannick Moy" + "Anne Pacalet" + "Virgile Prevosto" + "Julien Signoles" + "Boris Yakobowski" +] +homepage: "http://frama-c.com/" +license: "GNU Lesser General Public License version 2.1" +doc: ["http://frama-c.com/download/user-manual-Sodium-20150201.pdf"] +bug-reports: "https://bts.frama-c.com/" +tags: [ + "deductive" + "program verification" + "formal specification" + "automated theorem prover" + "interactive theorem prover" + "C" + "plugins" + "abstract interpretation" + "slicing" + "weakest precondition" + "ACSL" + "dataflow analysis" +] + +build: [ + ["ocaml" "run_autoconf_if_needed.ml"] #when used in pinned mode the configure *can* not yet be generated + ["./configure" "--prefix" prefix] + [make] + [make "install"] +] + +remove: [ + ["ocaml" "run_autoconf_if_needed.ml"] #when used in pinned mode the configure *can* not yet be generated + ["./configure" "--prefix" prefix] + [make "uninstall"] + ["rm" "-rf" frama-c:doc] +] + +build-doc: [ + [make "-C" "doc" "download"] + [make "-C" "doc" "FRAMAC_DOCDIR=%{frama-c:doc}%" "install"] +] + +build-test: [ + [make "PTESTS_OPTS=-error-code" "tests"] +] + +depends: [ + "ocamlgraph" { = "1.8.5" | = "1.8.6" } + "lablgtk" { >= "2.18.2" } #for ocaml >= 4.02.1 + "conf-gtksourceview" + "conf-gnomecanvas" +] + +conflicts: [ + "why3" { < "0.85" } +] + +available: [ ocaml-version >= "3.12" & ocaml-version != "4.02.0" ] diff -Nru frama-c-20140301+neon+dfsg/ptests/mmap.ml frama-c-20150201+sodium+dfsg/ptests/mmap.ml --- frama-c-20140301+neon+dfsg/ptests/mmap.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/ptests/mmap.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -open Bigarray -open Unix -let compare_files f f' = - let fd = Unix.openfile f [Unix.O_RDONLY] 0o000 in - let fd' = Unix.openfile f' [Unix.O_RDONLY] 0o000 in - let size_byte = (Unix.fstat fd).st_size in - let size_byte' = (Unix.fstat fd').st_size in - if size_byte' <> size_byte then false - else - (try - let initial_padding = size_byte mod 8 in - for i = 1 to initial_padding do - let s = "_" in - let s' = "_" in - assert (Unix.read fd s 0 1=1); - assert (Unix.read fd' s' 0 1=1); - if s <> s' then raise Not_found - done; - let size_bigarray = size_byte / 8 in - let mapped = Array1.map_file fd int64 c_layout false size_bigarray in - let mapped' = Array1.map_file fd' int64 c_layout false size_bigarray in - mapped = mapped' - with Not_found -> false) - -let () = Format.printf "GOT:%b@." (compare_files "/tmp/big.mmap" "/tmp/big.mmap") diff -Nru frama-c-20140301+neon+dfsg/ptests/ptests.ml frama-c-20150201+sodium+dfsg/ptests/ptests.ml --- frama-c-20140301+neon+dfsg/ptests/ptests.ml 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/ptests/ptests.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -92,20 +92,23 @@ Format.fprintf fmt "@]" let default_env var value = - try ignore (Unix.getenv var) with Not_found -> add_env var value - -let test_paths = [ "tests"; "../../tests" ] + try + let v = Unix.getenv var in + add_default_env (var ^ " (set from outside)") v + with Not_found -> add_env var value -exception Path of string let test_path = - try - List.iter - (fun p -> if Sys.file_exists p && Sys.is_directory p then raise (Path p)) - test_paths; - Format.eprintf "No test path found@."; - exit 1 - with Path p -> - p + if Sys.file_exists "tests" && Sys.is_directory "tests" then "tests" + else + if try Array.iter (fun x -> if x = "-help" then raise Exit) Sys.argv; false + with Exit -> true + then + (* no error when "-help" is specified on the command line *) + "" + else begin + Format.eprintf "No test path found. Aborting@."; + exit 1 + end (** the name of the directory-wide configuration file*) let dir_config_file = "test_config" @@ -149,10 +152,6 @@ Filename.parent_dir_name) *) -let ptests_config = - "ptests_local_config." - ^ if Ptests_config.no_native_dynlink then "cmo" else "cmxs" - (** Command-line flags *) type behavior = Examine | Update | Run | Show @@ -191,28 +190,55 @@ let make_test_suite s = suites := s :: !suites +(* Those variables are read from a ptests_config file *) +let default_suites = ref [] +let toplevel_path = ref "" + +let parse_config_line = + let regexp_blank = Str.regexp "[ ]+" in + fun (key, value) -> + match key with + | "DEFAULT_SUITES" -> + let l = Str.split regexp_blank value in + default_suites := l + | "TOPLEVEL_PATH" -> + toplevel_path := value + | _ -> default_env key value (* Environnement variable that Frama-C reads*) + let () = - if Sys.file_exists ptests_config then + let config = "tests/ptests_config" in + if Sys.file_exists config then begin try - Dynlink.loadfile ptests_config - with Dynlink.Error e -> - Format.eprintf "Could not load dynamic configuration %s: %s@." - ptests_config (Dynlink.error_message e) -;; + (*Parse the plugin configuration file for tests. Format is 'Key=value' *) + let ch = open_in config in + let regexp = Str.regexp "\\([^=]+\\)=\\(.*\\)" in + while true do + let line = input_line ch in + if Str.string_match regexp line 0 then + let key = Str.matched_group 1 line in + let value = Str.matched_group 2 line in + parse_config_line (key, value) + else begin + Format.eprintf "Cannot interpret line '%s' in ptests_config@." line; + exit 1 + end + done + with + | End_of_file -> + if !toplevel_path = "" then begin + Format.eprintf "Missign TOPLEVEL_PATH variable. Aborting.@."; + exit 1 + end + end + else begin + Format.eprintf + "Cannot find configuration file tests/ptests_config. Aborting.@."; + exit 1 + end let () = - default_env "FRAMAC_SESSION" !Ptests_config.framac_session; - default_env "FRAMAC_SHARE" !Ptests_config.framac_share; - default_env "FRAMAC_PLUGIN" !Ptests_config.framac_plugin; - default_env "FRAMAC_LIB" !Ptests_config.framac_lib; - default_env "FRAMAC_PLUGIN_GUI" !Ptests_config.framac_plugin_gui; - default_env "OCAMLRUNPARAM" ""; - default_env "FRAMAC_OPT" !Ptests_config.toplevel_path; - default_env "FRAMAC_BYTE" (opt_to_byte !Ptests_config.toplevel_path); Unix.putenv "LC_ALL" "C" (* some oracles, especially in Jessie, depend on the locale *) -;; - let example_msg = Format.sprintf "@.@[\ @@ -305,6 +331,10 @@ make_test_suite umsg ;; +let fail s = + Format.printf "Error: %s@." s; + exit 2 + (* redefine name if special configuration expected *) let redefine_name name = if !special_config = "" then name else @@ -320,9 +350,9 @@ val get: t -> string - val create: string (** dirname *) -> t - (** create the needed subdirectories if absent. - Fail if the given dirname doesn't exists *) + val create: ?with_subdir:bool -> string (** dirname *) -> t + (** By default, creates the needed subdirectories if absent. + Anyway, fails if the given dirname doesn't exists *) val make_oracle_file: t -> string -> string val make_result_file: t -> string -> string @@ -336,8 +366,7 @@ if not (Sys.file_exists dir) then Unix.mkdir dir 0o750 (** rwxr-w--- *) else if not (Sys.is_directory dir) - then failwith (Printf.sprintf "The file %s exists but is not a directory" dir) - + then fail (Printf.sprintf "the file %s exists but is not a directory" dir) let oracle_dirname = redefine_name "oracle" let result_dirname = redefine_name "result" @@ -346,11 +375,13 @@ let make_oracle_file = gen_make_file oracle_dirname let make_file = Filename.concat - let create dir = + let create ?(with_subdir=true) dir = if not (Sys.file_exists dir && Sys.is_directory dir) - then failwith (Printf.sprintf "The directory %s must be an existing directory" dir); - create_if_absent (Filename.concat dir result_dirname); - create_if_absent (Filename.concat dir oracle_dirname); + then fail (Printf.sprintf "the directory %s must be an existing directory" dir); + if (with_subdir) then begin + create_if_absent (Filename.concat dir result_dirname); + create_if_absent (Filename.concat dir oracle_dirname) + end; dir end @@ -388,15 +419,15 @@ } let default_macros () = - StringMap.add "frama-c" !Ptests_config.toplevel_path StringMap.empty + StringMap.add "frama-c" !toplevel_path StringMap.empty let default_config () = { dc_test_regexp = test_file_regexp ; dc_macros = default_macros (); dc_execnow = []; dc_filter = None ; - dc_default_toplevel = !Ptests_config.toplevel_path; - dc_toplevels = [ !Ptests_config.toplevel_path, default_options ]; + dc_default_toplevel = !toplevel_path; + dc_toplevels = [ !toplevel_path, default_options ]; dc_dont_run = false; dc_is_explicit_test = false } @@ -478,8 +509,8 @@ aux { ex_cmd = s; ex_log = []; ex_bin = []; ex_dir = dir } (* the default toplevel for the current level of options. *) -let current_default_toplevel = ref !Ptests_config.toplevel_path -let current_default_cmds = ref [!Ptests_config.toplevel_path,default_options] +let current_default_toplevel = ref !toplevel_path +let current_default_cmds = ref [!toplevel_path,default_options] let make_custom_opts = let space = Str.regexp " " in @@ -713,7 +744,7 @@ (Filename.chop_extension command.file) with Invalid_argument _ -> - failwith ("This test file does not have any extension: " ^ + fail ("this test file does not have any extension: " ^ command.file) let gen_prefix gen_file cmd = @@ -1015,6 +1046,9 @@ else execnow.ex_cmd in + if !verbosity >= 1 then begin + lock_printf "%% launch %s" cmd; + end; let r = launch cmd in continue r end @@ -1222,7 +1256,7 @@ if Sys.file_exists general_config_file then begin let scan_buffer = Scanf.Scanning.from_file general_config_file in - scan_options (SubDir.create Filename.current_dir_name) scan_buffer (default_config ()) + scan_options (SubDir.create ~with_subdir:false Filename.current_dir_name) scan_buffer (default_config ()) end else default_config () @@ -1232,7 +1266,7 @@ match !suites with [] -> let priority = "idct" in - let default = !Ptests_config.default_suites in + let default = !default_suites in if List.mem priority default then priority :: (List.filter (fun name -> name <> priority) default) else default diff -Nru frama-c-20140301+neon+dfsg/share/acsl.el frama-c-20150201+sodium+dfsg/share/acsl.el --- frama-c-20140301+neon+dfsg/share/acsl.el 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/acsl.el 2015-05-28 08:53:23.000000000 +0000 @@ -5,7 +5,7 @@ ; Copyright (C) 2008-2011 ; ; Pierre Roux ; ; ; -; Copyright (C) 2009-2014 ; +; Copyright (C) 2009-2015 ; ; CEA LIST ; ; ; ; you can redistribute it and/or modify it under the terms of the GNU ; diff -Nru frama-c-20140301+neon+dfsg/share/builtin.c frama-c-20150201+sodium+dfsg/share/builtin.c --- frama-c-20140301+neon+dfsg/share/builtin.c 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/builtin.c 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/builtin.h frama-c-20150201+sodium+dfsg/share/builtin.h --- frama-c-20140301+neon+dfsg/share/builtin.h 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/builtin.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -68,7 +68,7 @@ /*@ assigns ((char*)dest)[0..n-1] \from ((char*)src)[0..n-1]; assigns \result \from dest; */ -void* Frama_C_memcpy(char *dest, const char *src, unsigned long n); +void* Frama_C_memcpy(char *dest, const char *src, size_t n); /*@ assigns \result \from ((char*)s1)[0..n-1], ((char*)s2)[0..n-1]; */ int Frama_C_memcmp(const char *s1, const char *s2, size_t n); diff -Nru frama-c-20140301+neon+dfsg/share/configure.ac frama-c-20150201+sodium+dfsg/share/configure.ac --- frama-c-20140301+neon+dfsg/share/configure.ac 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/configure.ac 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # @@ -363,6 +363,29 @@ m4_undefine([USE]) m4_undefine([USED]) ]) + +# Usage: plugin_disable([plugin],[reason]) +define([plugin_disable], + [m4_define([PLUGIN_NAME],$1) + m4_define([MSG],$2) + m4_define([UP],[tovarname(PLUGIN_NAME)]) + if test "[FORCE_]UP" = "yes"; then + AC_MSG_ERROR([PLUGIN_NAME requested but MSG]); + else + AC_MSG_WARN([PLUGIN_NAME disabled because MSG]); + [ENABLE_]UP=no; + [INFO_]UP=", MSG" + fi]) + +define([has_pushed],0) +define([after_plugin_dependencies],[ + define([has_pushed],1) + m4_divert_push(frama_c_configure_tool)]) +define([end_after_plugin_dependencies],[ + m4_if(has_pushed,1, + [m4_divert_pop(frama_c_configure_tool)] + m4_define([has_pushed],0) + )]) # Implementation of an ordering $1 < $2: "" < yes < partial < no lt_mark () { first=`echo "$1" | sed -e 's/ .*//' ` @@ -591,9 +614,10 @@ compute_plugin_dependencies]) define([check_plugin_dependencies], - [m4_ifdef([FRAMAC_MAIN_AUTOCONF],, - [m4_undivert(frama_c_configure_tool) - compute_plugin_dependencies])]) + [m4_ifdef([FRAMAC_MAIN_AUTOCONF], + [after_plugin_dependencies], + [m4_undivert(frama_c_configure_tool) + compute_plugin_dependencies])]) define([write_plugin_summary], [ @@ -627,6 +651,7 @@ AC_CONFIG_FILES(plugin_files,files_chmod) m4_ifdef( [FRAMAC_MAIN_AUTOCONF], + [end_after_plugin_dependencies] if test "$[ENABLE_]tovarname(PLUGIN_NAME)" != "no"; then [EXTERNAL_PLUGINS="${EXTERNAL_PLUGINS} plugin_prefix"]; fi, Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/feedback/considered_valid.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/feedback/considered_valid.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/feedback/inconsistent.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/feedback/inconsistent.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/feedback/invalid_but_dead.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/feedback/invalid_but_dead.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/feedback/invalid_under_hyp.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/feedback/invalid_under_hyp.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/feedback/never_tried.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/feedback/never_tried.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/feedback/surely_invalid.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/feedback/surely_invalid.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/feedback/surely_valid.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/feedback/surely_valid.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/feedback/switch-off.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/feedback/switch-off.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/feedback/switch-on.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/feedback/switch-on.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/feedback/unknown_but_dead.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/feedback/unknown_but_dead.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/feedback/unknown.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/feedback/unknown.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/feedback/valid_but_dead.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/feedback/valid_but_dead.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/feedback/valid_under_hyp.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/feedback/valid_under_hyp.png differ diff -Nru frama-c-20140301+neon+dfsg/share/frama-c.Unix.rc frama-c-20150201+sodium+dfsg/share/frama-c.Unix.rc --- frama-c-20140301+neon+dfsg/share/frama-c.Unix.rc 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/frama-c.Unix.rc 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # diff -Nru frama-c-20140301+neon+dfsg/share/frama-c.WIN32.rc frama-c-20150201+sodium+dfsg/share/frama-c.WIN32.rc --- frama-c-20140301+neon+dfsg/share/frama-c.WIN32.rc 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/frama-c.WIN32.rc 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # diff -Nru frama-c-20140301+neon+dfsg/share/libc/arpa/inet.h frama-c-20150201+sodium+dfsg/share/libc/arpa/inet.h --- frama-c-20140301+neon+dfsg/share/libc/arpa/inet.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/arpa/inet.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/assert.h frama-c-20150201+sodium+dfsg/share/libc/assert.h --- frama-c-20140301+neon+dfsg/share/libc/assert.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/assert.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/byteswap.h frama-c-20150201+sodium+dfsg/share/libc/byteswap.h --- frama-c-20140301+neon+dfsg/share/libc/byteswap.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/byteswap.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/complex.h frama-c-20150201+sodium+dfsg/share/libc/complex.h --- frama-c-20140301+neon+dfsg/share/libc/complex.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/complex.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/ctype.h frama-c-20150201+sodium+dfsg/share/libc/ctype.h --- frama-c-20140301+neon+dfsg/share/libc/ctype.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/ctype.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/dirent.h frama-c-20150201+sodium+dfsg/share/libc/dirent.h --- frama-c-20140301+neon+dfsg/share/libc/dirent.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/dirent.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -23,7 +23,7 @@ #ifndef __FC_DIRENT_H #define __FC_DIRENT_H -typedef struct __FC_DIR_T { unsigned int __fc_dir_contents; } DIR; +#include "errno.h" #include "__fc_define_ino_t.h" #include "__fc_define_off_t.h" @@ -37,17 +37,49 @@ char d_name[256]; /* filename */ }; +typedef struct DIR { + unsigned int __fc_dir_id; + unsigned int __fc_dir_position; + struct stat* __fc_dir_inode; + struct dirent ** __fc_dir_entries; +} DIR; + +DIR __fc_opendir[__FC_FOPEN_MAX]; +const DIR* _p__fc_opendir = __fc_opendir; + int alphasort(const struct dirent **, const struct dirent **); -int closedir(DIR *); + +/*@ + requires \subset(dirp,&__fc_opendir[0..]); + assigns \result \from dirp, *dirp, _p__fc_opendir; + assigns __FC_errno \from dirp, *dirp, _p__fc_opendir; + assigns *dirp \from dirp, *dirp, _p__fc_opendir; + ensures (\result == 0 && dirp->__fc_dir_inode == \null) + || \result == -1; +*/ +int closedir(DIR *dirp); int dirfd(DIR *); DIR *fdopendir(int); -/*@ assigns \result \from path[0..]; */ +/*@ + assigns \result \from path[0..], _p__fc_opendir; + assigns __FC_errno \from path[0..], _p__fc_opendir; + ensures \result == \null || \valid(\result); + ensures \result != \null ==> + \result == &__fc_opendir[\result->__fc_dir_id]; + ensures \result != \null ==> \result->__fc_dir_inode != \null; +*/ DIR *opendir(const char *path); -/*@ assigns \result \from *DIR; - assigns *DIR \from *DIR; */ -struct dirent *readdir(DIR *DIR); +/*@ + requires \subset(dirp, &__fc_opendir[0..]); + assigns \result \from *dirp, _p__fc_opendir; + assigns dirp->__fc_dir_position \from dirp->__fc_dir_position; + assigns __FC_errno \from dirp, *dirp, _p__fc_opendir; + ensures \result == \null || \valid(\result); +*/ +struct dirent *readdir(DIR *dirp); + int readdir_r(DIR * dirp, struct dirent * entry, struct dirent ** result); void rewinddir(DIR *); diff -Nru frama-c-20140301+neon+dfsg/share/libc/dlfcn.h frama-c-20150201+sodium+dfsg/share/libc/dlfcn.h --- frama-c-20140301+neon+dfsg/share/libc/dlfcn.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/dlfcn.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/endian.h frama-c-20150201+sodium+dfsg/share/libc/endian.h --- frama-c-20140301+neon+dfsg/share/libc/endian.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/endian.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/errno.h frama-c-20150201+sodium+dfsg/share/libc/errno.h --- frama-c-20140301+neon+dfsg/share/libc/errno.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/errno.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_builtin_for_normalization.i frama-c-20150201+sodium+dfsg/share/libc/__fc_builtin_for_normalization.i --- frama-c-20140301+neon+dfsg/share/libc/__fc_builtin_for_normalization.i 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_builtin_for_normalization.i 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_builtin.h frama-c-20150201+sodium+dfsg/share/libc/__fc_builtin.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_builtin.h 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_builtin.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -27,6 +27,13 @@ extern int Frama_C_entropy_source; +/*@ requires \valid(p + (0 .. l-1)); + assigns p[0 .. l-1] \from Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + ensures \initialized(p + (0 .. l-1)); +*/ +void Frama_C_make_unknown(char *p, size_t l); + /*@ assigns \result \from a, b, Frama_C_entropy_source; assigns Frama_C_entropy_source \from Frama_C_entropy_source; ensures \result == a || \result == b ; @@ -45,34 +52,55 @@ */ int Frama_C_interval(int min, int max); +/*@ assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + ensures min <= \result <= max ; + */ +int Frama_C_interval_split(int min, int max); + /*@ assigns \result \from min, max, Frama_C_entropy_source; assigns Frama_C_entropy_source \from Frama_C_entropy_source; ensures min <= \result <= max ; */ unsigned char Frama_C_unsigned_char_interval - (unsigned char min, unsigned char max); + (unsigned char min, unsigned char max); + +/*@ + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + ensures min <= \result <= max ; + */ +char Frama_C_char_interval(char min, char max); + +/*@ + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + ensures min <= \result <= max ; + */ +unsigned short Frama_C_unsigned_short_interval(unsigned short min, unsigned short max); /*@ assigns \result \from min, max, Frama_C_entropy_source; assigns Frama_C_entropy_source \from Frama_C_entropy_source; ensures min <= \result <= max ; */ -char Frama_C_char_interval(char min, char max); +short Frama_C_short_interval(short min, short max); + /*@ assigns \result \from min, max, Frama_C_entropy_source; assigns Frama_C_entropy_source \from Frama_C_entropy_source; ensures min <= \result <= max ; */ -unsigned short Frama_C_unsigned_short_interval(unsigned short min, unsigned short max); +unsigned int Frama_C_unsigned_int_interval(unsigned int min, unsigned int max); /*@ assigns \result \from min, max, Frama_C_entropy_source; assigns Frama_C_entropy_source \from Frama_C_entropy_source; ensures min <= \result <= max ; */ -short Frama_C_short_interval(short min, short max); +int Frama_C_int_interval(int min, int max); /*@ @@ -80,14 +108,15 @@ assigns Frama_C_entropy_source \from Frama_C_entropy_source; ensures min <= \result <= max ; */ -unsigned int Frama_C_unsigned_int_interval(unsigned int min, unsigned int max); +unsigned long Frama_C_unsigned_long_interval + (unsigned long min, unsigned long max); /*@ assigns \result \from min, max, Frama_C_entropy_source; assigns Frama_C_entropy_source \from Frama_C_entropy_source; ensures min <= \result <= max ; */ -int Frama_C_int_interval(int min, int max); +long Frama_C_long_interval(long min, long max); /*@ @@ -96,14 +125,14 @@ ensures min <= \result <= max ; */ unsigned long long Frama_C_unsigned_long_long_interval - (unsigned long long min, unsigned long long max); + (unsigned long long min, unsigned long long max); /*@ assigns \result \from min, max, Frama_C_entropy_source; assigns Frama_C_entropy_source \from Frama_C_entropy_source; ensures min <= \result <= max ; */ -long long Frama_C_long_long_interval(long long min, long long max); +long long Frama_C_long_long_interval(long long min, long long max); /*@ assigns \result \from min, max, Frama_C_entropy_source; diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_blkcnt_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_blkcnt_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_blkcnt_t.h 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_blkcnt_t.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_blksize_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_blksize_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_blksize_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_blksize_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_dev_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_dev_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_dev_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_dev_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_fd_set_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_fd_set_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_fd_set_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_fd_set_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_file.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_file.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_file.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_file.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -24,14 +24,17 @@ #define __FC_DEFINE_FILE #include "__fc_define_stat.h" +#include "__fc_define_fpos_t.h" + struct __fc_FILE { unsigned int __fc_stdio_id; - unsigned int __fc_maxsz; - unsigned int __fc_writepos; - unsigned int __fc_readpos; - int __fc_is_a_socket; - int mode; // O_RDONLY 1 | O_RDWR 2 | O_WRONLY 3 - struct stat* __fc_inode; + fpos_t __fc_position; + char __fc_error; + char __fc_eof; + int __fc_flags; // O_RDONLY 1 | O_RDWR 2 | O_WRONLY 3 + more flags. + struct stat* __fc_inode; + unsigned char * __fc_real_data; + int __fc_real_data_max_size; }; typedef struct __fc_FILE FILE; diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_fpos_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_fpos_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_fpos_t.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_fpos_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,29 @@ +/**************************************************************************/ +/* */ +/* This file is part of Frama-C. */ +/* */ +/* Copyright (C) 2007-2015 */ +/* 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_FPOS_T +#define __FC_DEFINE_FPOS_T + +struct __fc_pos_t { unsigned long __fc_stdio_position; }; +typedef struct __fc_pos_t fpos_t; + +#endif diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_id_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_id_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_id_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_id_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_ino_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_ino_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_ino_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_ino_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_intptr_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_intptr_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_intptr_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_intptr_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_iovec.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_iovec.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_iovec.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_iovec.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_mode_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_mode_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_mode_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_mode_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -24,31 +24,35 @@ #define __FC_DEFINE_MODE_T typedef unsigned int mode_t; -/* POSIX symbolic values */ -#define S_IFMT (1<<1) -#define S_IFBLK (1<<2) -#define S_IFCHR (1<<3) -#define S_IFIFO (1<<4) -#define S_IFREG (1<<5) -#define S_IFDIR (1<<6) -#define S_IFLNK (1<<7) -#define S_IFSOCK (1<<8) - -#define S_IRWXU (S_IRUSR|S_IWUSR|S_IXUSR) -#define S_IRUSR (1<<9) -#define S_IWUSR (1<<10) -#define S_IXUSR (1<<11) -#define S_IRWXG (S_IRGRP|S_IWGRP|S_IXGRP) -#define S_IRGRP (1<<12) -#define S_IWGRP (1<<13) -#define S_IXGRP (1<<14) -#define S_IRWXO (S_IROTH|S_IWOTH|S_IXOTH) -#define S_IROTH (1<<15) -#define S_IWOTH (1<<16) -#define S_IXOTH (1<<17) -#define S_ISUID (1<<18) -#define S_ISGID (1<<19) -#define S_ISVTX (1<<20) + +#define S_IFMT 0170000 + +#define S_IFBLK 0060000 +#define S_IFCHR 0020000 +#define S_IFIFO 0010000 +#define S_IFREG 0100000 +#define S_IFDIR 0040000 +#define S_IFLNK 0120000 +#define S_IFSOCK 0140000 + +#define S_IRUSR 00400 +#define S_IWUSR 00200 +#define S_IXUSR 00100 +#define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) + +#define S_IRGRP 00040 +#define S_IWGRP 00020 +#define S_IXGRP 00010 +#define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) + +#define S_IROTH 00004 +#define S_IWOTH 00002 +#define S_IXOTH 00001 +#define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) + +#define S_ISUID 0004000 +#define S_ISGID 0002000 +#define S_ISVTX 0001000 #define S_IEXEC S_IXUSR #define S_IWRITE S_IWUSR @@ -60,6 +64,7 @@ #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) #define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) +#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) #endif diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_nlink_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_nlink_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_nlink_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_nlink_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_null.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_null.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_null.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_null.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_off_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_off_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_off_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_off_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -22,6 +22,10 @@ #ifndef __FC_DEFINE_OFF_T #define __FC_DEFINE_OFF_T + +#include "__fc_machdep.h" + typedef long int off_t; +typedef __INT64_T off64_t; #endif diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_pid_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_pid_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_pid_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_pid_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_restrict.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_restrict.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_restrict.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_restrict.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_sa_family_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_sa_family_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_sa_family_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_sa_family_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_seek_macros.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_seek_macros.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_seek_macros.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_seek_macros.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_sigset_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_sigset_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_sigset_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_sigset_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_size_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_size_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_size_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_size_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_sockaddr.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_sockaddr.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_sockaddr.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_sockaddr.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_ssize_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_ssize_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_ssize_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_ssize_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_stat.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_stat.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_stat.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_stat.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -65,8 +65,6 @@ time_t st_ctime; blksize_t st_blksize; blkcnt_t st_blocks; - char * __fc_real_data; - int __fc_real_data_max_size; }; #endif diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_suseconds_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_suseconds_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_suseconds_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_suseconds_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_timespec.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_timespec.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_timespec.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_timespec.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_time_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_time_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_time_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_time_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_uid_and_gid.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_uid_and_gid.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_uid_and_gid.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_uid_and_gid.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_useconds_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_useconds_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_useconds_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_useconds_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_wchar_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_wchar_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_wchar_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_wchar_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -23,5 +23,8 @@ #ifndef __FC_DEFINE_WCHAR_T #define __FC_DEFINE_WCHAR_T #include "__fc_machdep.h" +#if !defined(__cplusplus) +/* wchar_t is a keyword in C++ and shall not be a typedef. */ typedef __WCHAR_T wchar_t; #endif +#endif diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_define_wint_t.h frama-c-20150201+sodium+dfsg/share/libc/__fc_define_wint_t.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_define_wint_t.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_define_wint_t.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_machdep.h frama-c-20150201+sodium+dfsg/share/libc/__fc_machdep.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_machdep.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_machdep.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -23,11 +23,16 @@ #ifndef __FC_MACHDEP #define __FC_MACHDEP +// Default machdep is x86_32 #ifndef __FC_MACHDEP_X86_64 #ifndef __FC_MACHDEP_X86_16 +#ifndef __FC_MACHDEP_X86_32 +#ifndef __FC_MACHDEP_PPC_32 #define __FC_MACHDEP_X86_32 #endif #endif +#endif +#endif #ifdef __FC_MACHDEP_X86_32 #define __FC_FORCE_INCLUDE_MACHDEP__ @@ -42,8 +47,8 @@ #define __SIZEOF_LONG 4 #define __SIZEOF_LONGLONG 8 #define __CHAR_BIT 8 -#define __SIZE_T unsigned int #define __PTRDIFF_T int +#define __SIZE_T unsigned int #define __FC_LONG_MAX 2147483647L #define __FC_ULONG_MAX 4294967295UL @@ -81,8 +86,8 @@ #define __SIZEOF_LONG 8 #define __SIZEOF_LONGLONG 8 #define __CHAR_BIT 8 -#define __SIZE_T unsigned long #define __PTRDIFF_T long +#define __SIZE_T unsigned long #define __FC_LONG_MAX 9223372036854775807L #define __FC_ULONG_MAX 18446744073709551615UL @@ -119,8 +124,8 @@ #define __SIZEOF_LONG 4 #define __SIZEOF_LONGLONG 8 #define __CHAR_BIT 8 -#define __SIZE_T unsigned long #define __PTRDIFF_T long +#define __SIZE_T unsigned long #define __FC_LONG_MAX 2147483647L #define __FC_ULONG_MAX 4294967295UL @@ -144,9 +149,48 @@ #define __FC_PTRDIFF_MIN __FC_LONG_MIN #define __FC_PTRDIFF_MAX __FC_LONG_MAX #else +#ifdef __FC_MACHDEP_X86_32 +#define __FC_FORCE_INCLUDE_MACHDEP__ +#include "__fc_machdep_linux_gcc_shared.h" +#undef __FC_FORCE_INCLUDE_MACHDEP__ +#define __FC_BYTE_ORDER __BIG_ENDIAN +/* Required */ +#undef __CHAR_UNSIGNED__ +#define __WORDSIZE 32 +#define __SIZEOF_SHORT 2 +#define __SIZEOF_INT 4 +#define __SIZEOF_LONG 4 +#define __SIZEOF_LONGLONG 8 +#define __CHAR_BIT 8 +#define __PTRDIFF_T int +#define __SIZE_T unsigned int +#define __FC_LONG_MAX 2147483647L +#define __FC_ULONG_MAX 4294967295UL + +/* Optional */ +#define __INTPTR_T signed int +#define __UINTPTR_T unsigned int +#define __INT32_T signed int +#define __UINT32_T unsigned int +#define __INT64_T signed long long +#define __UINT64_T unsigned long long -#error Must define __FC_MACHDEP_X86_32 or __FC_MACHDEP_X86_64 or \ - __FC_MACHDEP_X86_16. +/* Required */ +#define __INT_LEAST32_T signed int +#define __UINT_LEAST32_T unsigned int +#define __INT_FAST32_T signed int +#define __UINT_FAST32_T unsigned int + +/* POSIX */ +#define __SSIZE_T int +/* stdint.h */ +#define __FC_PTRDIFF_MIN __FC_INT_MIN +#define __FC_PTRDIFF_MAX __FC_INT_MAX + +#else +#error Must define __FC_MACHDEP_X86_32 or __FC_MACHDEP_X86_64 \ + __FC_MACHDEP_X86_16 or __FC_MACHDEP_PPC_32. +#endif #endif #endif #endif diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_machdep_linux_gcc_shared.h frama-c-20150201+sodium+dfsg/share/libc/__fc_machdep_linux_gcc_shared.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_machdep_linux_gcc_shared.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_machdep_linux_gcc_shared.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -69,6 +69,7 @@ #define __FC_LLONG_MIN (-LLONG_MAX -1LL) #define __FC_LLONG_MAX 9223372036854775807LL #define __FC_ULLONG_MAX 18446744073709551615ULL +#define __FC_PATH_MAX 256 /* Unused at this time */ #define __FC_umax(n) ((uint##n##_t)(-1)) diff -Nru frama-c-20140301+neon+dfsg/share/libc/fcntl.h frama-c-20150201+sodium+dfsg/share/libc/fcntl.h --- frama-c-20140301+neon+dfsg/share/libc/fcntl.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/fcntl.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_select.h frama-c-20150201+sodium+dfsg/share/libc/__fc_select.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_select.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_select.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/__fc_string_axiomatic.h frama-c-20150201+sodium+dfsg/share/libc/__fc_string_axiomatic.h --- frama-c-20140301+neon+dfsg/share/libc/__fc_string_axiomatic.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/__fc_string_axiomatic.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -29,13 +29,13 @@ #include "__fc_define_wchar_t.h" /*@ axiomatic MemCmp { - @ logic ℤ memcmp{L}(char *s1, char *s2, ℤ n) - @ reads s1[0..n - 1], s2[0..n - 1]; + @ logic ℤ memcmp{L1,L2}(char *s1, char *s2, ℤ n) + @ reads \at(s1[0..n - 1],L1), \at(s2[0..n - 1],L2); @ - @ axiom memcmp_zero{L}: + @ axiom memcmp_zero{L1,L2}: @ \forall char *s1, *s2; \forall ℤ n; - @ memcmp(s1,s2,n) == 0 - @ <==> \forall ℤ i; 0 <= i < n ==> s1[i] == s2[i]; + @ memcmp{L1,L2}(s1,s2,n) == 0 + @ <==> \forall ℤ i; 0 <= i < n ==> \at(s1[i],L1) == \at(s2[i],L2); @ @ } @*/ @@ -110,20 +110,20 @@ @ @ axiom memcmp_strlen_left{L}: @ \forall char *s1, *s2; \forall ℤ n; - @ memcmp(s1,s2,n) == 0 && strlen(s1) < n ==> strlen(s1) == strlen(s2); + @ memcmp{L,L}(s1,s2,n) == 0 && strlen(s1) < n ==> strlen(s1) == strlen(s2); @ @ axiom memcmp_strlen_right{L}: @ \forall char *s1, *s2; \forall ℤ n; - @ memcmp(s1,s2,n) == 0 && strlen(s2) < n ==> strlen(s1) == strlen(s2); + @ memcmp{L,L}(s1,s2,n) == 0 && strlen(s2) < n ==> strlen(s1) == strlen(s2); @ @ axiom memcmp_strlen_shift_left{L}: @ \forall char *s1, *s2; \forall ℤ k, n; - @ memcmp(s1,s2 + k,n) == 0 && 0 <= k && strlen(s1) < n ==> + @ memcmp{L,L}(s1,s2 + k,n) == 0 && 0 <= k && strlen(s1) < n ==> @ 0 <= strlen(s2) <= k + strlen(s1); @ @ axiom memcmp_strlen_shift_right{L}: @ \forall char *s1, *s2; \forall ℤ k, n; - @ memcmp(s1 + k,s2,n) == 0 && 0 <= k && strlen(s2) < n ==> + @ memcmp{L,L}(s1 + k,s2,n) == 0 && 0 <= k && strlen(s2) < n ==> @ 0 <= strlen(s1) <= k + strlen(s2); @ } @*/ diff -Nru frama-c-20140301+neon+dfsg/share/libc/features.h frama-c-20150201+sodium+dfsg/share/libc/features.h --- frama-c-20140301+neon+dfsg/share/libc/features.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/features.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/fenv.h frama-c-20150201+sodium+dfsg/share/libc/fenv.h --- frama-c-20140301+neon+dfsg/share/libc/fenv.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/fenv.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/float.h frama-c-20150201+sodium+dfsg/share/libc/float.h --- frama-c-20140301+neon+dfsg/share/libc/float.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/float.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/getopt.h frama-c-20150201+sodium+dfsg/share/libc/getopt.h --- frama-c-20140301+neon+dfsg/share/libc/getopt.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/getopt.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/glob.h frama-c-20150201+sodium+dfsg/share/libc/glob.h --- frama-c-20140301+neon+dfsg/share/libc/glob.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/glob.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/grp.h frama-c-20150201+sodium+dfsg/share/libc/grp.h --- frama-c-20140301+neon+dfsg/share/libc/grp.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/grp.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/iconv.h frama-c-20150201+sodium+dfsg/share/libc/iconv.h --- frama-c-20140301+neon+dfsg/share/libc/iconv.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/iconv.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/ifaddrs.h frama-c-20150201+sodium+dfsg/share/libc/ifaddrs.h --- frama-c-20140301+neon+dfsg/share/libc/ifaddrs.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/ifaddrs.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/inttypes.h frama-c-20150201+sodium+dfsg/share/libc/inttypes.h --- frama-c-20140301+neon+dfsg/share/libc/inttypes.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/inttypes.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/iso646.h frama-c-20150201+sodium+dfsg/share/libc/iso646.h --- frama-c-20140301+neon+dfsg/share/libc/iso646.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/iso646.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/libgen.h frama-c-20150201+sodium+dfsg/share/libc/libgen.h --- frama-c-20140301+neon+dfsg/share/libc/libgen.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/libgen.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/libintl.h frama-c-20150201+sodium+dfsg/share/libc/libintl.h --- frama-c-20140301+neon+dfsg/share/libc/libintl.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/libintl.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/limits.h frama-c-20150201+sodium+dfsg/share/libc/limits.h --- frama-c-20140301+neon+dfsg/share/libc/limits.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/limits.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -76,5 +76,9 @@ /* Maximum value an `unsigned long long int' can hold. (Minimum is 0.) */ # define ULLONG_MAX __FC_ULLONG_MAX +/* Maximum number of bytes in a pathname, including the terminating + null character. (Minimum is 256.) */ +#define PATH_MAX __FC_PATH_MAX + #endif diff -Nru frama-c-20140301+neon+dfsg/share/libc/linux/fs.h frama-c-20150201+sodium+dfsg/share/libc/linux/fs.h --- frama-c-20140301+neon+dfsg/share/libc/linux/fs.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/linux/fs.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/linux/if_addr.h frama-c-20150201+sodium+dfsg/share/libc/linux/if_addr.h --- frama-c-20140301+neon+dfsg/share/libc/linux/if_addr.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/linux/if_addr.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/linux/if_netlink.h frama-c-20150201+sodium+dfsg/share/libc/linux/if_netlink.h --- frama-c-20140301+neon+dfsg/share/libc/linux/if_netlink.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/linux/if_netlink.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/linux/netlink.h frama-c-20150201+sodium+dfsg/share/libc/linux/netlink.h --- frama-c-20140301+neon+dfsg/share/libc/linux/netlink.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/linux/netlink.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/linux/rtnetlink.h frama-c-20150201+sodium+dfsg/share/libc/linux/rtnetlink.h --- frama-c-20140301+neon+dfsg/share/libc/linux/rtnetlink.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/linux/rtnetlink.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/locale.h frama-c-20150201+sodium+dfsg/share/libc/locale.h --- frama-c-20140301+neon+dfsg/share/libc/locale.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/locale.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -85,6 +85,7 @@ }; #include "__fc_define_null.h" +#include "__fc_string_axiomatic.h" #define LC_ALL 0 #define LC_COLLATE 1 @@ -97,7 +98,7 @@ extern char*__frama_c_locale_names[]; /*@ - requires \valid(locale); + requires locale == \null || valid_string(locale); assigns __frama_c_locale \from category, locale[..]; assigns \result \from __frama_c_locale,category, locale[..]; ensures \result==\null diff -Nru frama-c-20140301+neon+dfsg/share/libc/math.h frama-c-20150201+sodium+dfsg/share/libc/math.h --- frama-c-20140301+neon+dfsg/share/libc/math.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/math.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/net/if.h frama-c-20150201+sodium+dfsg/share/libc/net/if.h --- frama-c-20140301+neon+dfsg/share/libc/net/if.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/net/if.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/netdb.h frama-c-20150201+sodium+dfsg/share/libc/netdb.h --- frama-c-20140301+neon+dfsg/share/libc/netdb.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/netdb.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/netinet/in.h frama-c-20150201+sodium+dfsg/share/libc/netinet/in.h --- frama-c-20140301+neon+dfsg/share/libc/netinet/in.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/netinet/in.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/netinet/in_systm.h frama-c-20150201+sodium+dfsg/share/libc/netinet/in_systm.h --- frama-c-20140301+neon+dfsg/share/libc/netinet/in_systm.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/netinet/in_systm.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/netinet/ip.h frama-c-20150201+sodium+dfsg/share/libc/netinet/ip.h --- frama-c-20140301+neon+dfsg/share/libc/netinet/ip.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/netinet/ip.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/netinet/ip_icmp.h frama-c-20150201+sodium+dfsg/share/libc/netinet/ip_icmp.h --- frama-c-20140301+neon+dfsg/share/libc/netinet/ip_icmp.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/netinet/ip_icmp.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/nl_types.h frama-c-20150201+sodium+dfsg/share/libc/nl_types.h --- frama-c-20140301+neon+dfsg/share/libc/nl_types.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/nl_types.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/pwd.h frama-c-20150201+sodium+dfsg/share/libc/pwd.h --- frama-c-20140301+neon+dfsg/share/libc/pwd.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/pwd.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/regex.h frama-c-20150201+sodium+dfsg/share/libc/regex.h --- frama-c-20140301+neon+dfsg/share/libc/regex.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/regex.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/setjmp.h frama-c-20150201+sodium+dfsg/share/libc/setjmp.h --- frama-c-20140301+neon+dfsg/share/libc/setjmp.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/setjmp.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/signal.h frama-c-20150201+sodium+dfsg/share/libc/signal.h --- frama-c-20140301+neon+dfsg/share/libc/signal.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/signal.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/stdarg.h frama-c-20150201+sodium+dfsg/share/libc/stdarg.h --- frama-c-20140301+neon+dfsg/share/libc/stdarg.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/stdarg.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/stdbool.h frama-c-20150201+sodium+dfsg/share/libc/stdbool.h --- frama-c-20140301+neon+dfsg/share/libc/stdbool.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/stdbool.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/stddef.h frama-c-20150201+sodium+dfsg/share/libc/stddef.h --- frama-c-20140301+neon+dfsg/share/libc/stddef.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/stddef.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -25,6 +25,9 @@ #include "__fc_machdep.h" typedef __PTRDIFF_T ptrdiff_t; #include "__fc_define_size_t.h" +#ifdef __GNU_C__ +#include "__fc_define_ssize_t.h" +#endif #include "__fc_define_wchar_t.h" #include "__fc_define_null.h" #define offsetof(type, member) __builtin_offsetof(type,member) diff -Nru frama-c-20140301+neon+dfsg/share/libc/stdint.h frama-c-20150201+sodium+dfsg/share/libc/stdint.h --- frama-c-20140301+neon+dfsg/share/libc/stdint.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/stdint.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/stdio.h frama-c-20150201+sodium+dfsg/share/libc/stdio.h --- frama-c-20140301+neon+dfsg/share/libc/stdio.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/stdio.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -25,15 +25,12 @@ #define __FC_STDIO #include "__fc_machdep.h" #include "stdarg.h" +#include "stddef.h" #include "errno.h" #include "__fc_define_stat.h" -#include "__fc_define_size_t.h" #include "__fc_define_restrict.h" +#include "__fc_define_fpos_t.h" #include "__fc_define_file.h" - -struct __fc_pos_t { unsigned long __fc_stdio_position; }; -typedef struct __fc_pos_t fpos_t; - #include "__fc_define_null.h" #define _IOFBF 0 @@ -88,13 +85,14 @@ */ int fflush(FILE *stream); -FILE __fc_fopen[2]; /* TODO: use __FC_FOPEN_MAX for size. Currently not - possible because it is not possible to say that fopen - returns one of the elements of __fc_fopen. */ +FILE __fc_fopen[__FC_FOPEN_MAX]; const FILE* _p__fc_fopen = __fc_fopen; -/*@ assigns \result \from filename[..],mode[..], _p__fc_fopen; - ensures \result==\null || ((\result == &__fc_fopen[0] || \result == &__fc_fopen[1]) && \fresh(\result,sizeof(FILE))) ; +/*@ + assigns \result \from filename[..],mode[..], _p__fc_fopen; + ensures + \result==\null + || (\valid(\result) && (\subset(\result,&__fc_fopen[0..]))) ; */ FILE *fopen(const char * restrict filename, const char * restrict mode); diff -Nru frama-c-20140301+neon+dfsg/share/libc/stdlib.h frama-c-20150201+sodium+dfsg/share/libc/stdlib.h --- frama-c-20140301+neon+dfsg/share/libc/stdlib.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/stdlib.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -63,54 +63,87 @@ long long int atoll(const char *nptr); /* See ISO C: 7.20.1.3 to complete these specifications */ -/*@ assigns \result,*endptr \from nptr[0..],nptr ; */ + +/*@ assigns \result \from nptr[0..]; + assigns *endptr \from nptr, nptr[0..]; +*/ double strtod(const char * restrict nptr, char ** restrict endptr); -/*@ assigns \result,*endptr \from nptr[0..],nptr ; */ + +/*@ assigns \result \from nptr[0..]; + assigns *endptr \from nptr, nptr[0..]; +*/ float strtof(const char * restrict nptr, char ** restrict endptr); -/*@ assigns \result,*endptr \from nptr[0..],nptr ; */ + +/*@ assigns \result \from nptr[0..]; + assigns *endptr \from nptr, nptr[0..]; +*/ long double strtold(const char * restrict nptr, char ** restrict endptr); /* TODO: See ISO C 7.20.1.4 to complete these specifications */ -/*@ assigns \result,*endptr \from nptr[0..]; */ +/*@ assigns \result \from nptr[0..], base; + assigns *endptr \from nptr, nptr[0..], base; +*/ long int strtol( const char * restrict nptr, char ** restrict endptr, int base); -/*@ assigns \result,*endptr \from nptr[0..]; */ + +/*@ assigns \result \from nptr[0..], base; + assigns *endptr \from nptr, nptr[0..], base; +*/ long long int strtoll( const char * restrict nptr, char ** restrict endptr, int base); -/*@ assigns \result,*endptr \from nptr[0..]; */ + +/*@ assigns \result \from nptr[0..], base; + assigns *endptr \from nptr, nptr[0..], base; +*/ unsigned long int strtoul( const char * restrict nptr, char ** restrict endptr, int base); -/*@ assigns \result,*endptr \from nptr[0..]; */ + +/*@ assigns \result \from nptr[0..], base; + assigns *endptr \from nptr, nptr[0..], base; +*/ unsigned long long int strtoull( const char * restrict nptr, char ** restrict endptr, int base); -int __fc_random_counter __attribute__((unused)); +int __fc_random_counter __attribute__((unused)) __attribute__((FRAMA_C_MODEL)); const unsigned long __fc_rand_max = __FC_RAND_MAX; /* ISO C: 7.20.2 */ /*@ assigns \result \from __fc_random_counter ; - @ assigns __fc_random_counter ; + @ assigns __fc_random_counter \from __fc_random_counter ; @ ensures 0 <= \result <= __fc_rand_max ; */ int rand(void); +#ifdef _POSIX_C_SOURCE +# if _POSIX_C_SOURCE >= 200112L +/*@ assigns \result \from __fc_random_counter ; + @ assigns __fc_random_counter \from __fc_random_counter ; + @ ensures 0 <= \result < 2147483648 ; +*/ +long int lrand48 (void); + +/*@ assigns __fc_random_counter \from seed ; */ +void srand48 (long int seed); +# endif +#endif + /*@ assigns __fc_random_counter \from seed ; */ void srand(unsigned int seed); /* ISO C: 7.20.3.1 */ void *calloc(size_t nmemb, size_t size); -/*@ ghost extern int __fc_heap_status; */ +/*@ ghost extern int __fc_heap_status __attribute__((FRAMA_C_MODEL)); */ /*@ axiomatic dynamic_allocation { @ predicate is_allocable(size_t n) // Can a block of n bytes be allocated? @ reads __fc_heap_status; @@ -187,11 +220,18 @@ */ void _Exit(int status); -/*@ assigns \nothing ; +/*@ + assigns \result \from name; ensures \result == \null || \valid(\result) ; */ char *getenv(const char *name); +int putenv(char *string); + +int setenv(const char *name, const char *value, int overwrite); + +int unsetenv(const char *name); + /*@ assigns \nothing; ensures \false; */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/string.h frama-c-20150201+sodium+dfsg/share/libc/string.h --- frama-c-20140301+neon+dfsg/share/libc/string.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/string.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -33,7 +33,7 @@ /*@ requires \valid_read(((char*)s1)+(0..n - 1)); @ requires \valid_read(((char*)s2)+(0..n - 1)); @ assigns \result \from ((char*)s1)[0.. n-1], ((char*)s2)[0.. n-1]; - @ ensures \result == memcmp((char*)s1,(char*)s2,n); + @ ensures \result == memcmp{Pre,Pre}((char*)s1,(char*)s2,n); @*/ extern int memcmp (const void *s1, const void *s2, size_t n); @@ -56,7 +56,7 @@ @ requires \separated(((char *)dest)+(0..n-1),((char *)src)+(0..n-1)); @ assigns ((char*)dest)[0..n - 1] \from ((char*)src)[0..n-1]; @ assigns \result \from dest; - @ ensures memcmp((char*)dest,(char*)src,n) == 0; + @ ensures memcmp{Post,Pre}((char*)dest,(char*)src,n) == 0; @ ensures \result == dest; @*/ extern void *memcpy(void *restrict dest, @@ -66,7 +66,7 @@ @ requires valid_src: \valid_read(((char*)src)+(0..n - 1)); @ assigns ((char*)dest)[0..n - 1] \from ((char*)src)[0..n-1]; @ assigns \result \from dest; - @ ensures memcmp((char*)dest,(char*)src,n) == 0; + @ ensures memcmp{Post,Pre}((char*)dest,(char*)src,n) == 0; @ ensures \result == dest; @*/ extern void *memmove(void *dest, const void *src, size_t n); @@ -89,22 +89,29 @@ @*/ extern size_t strlen (const char *s); -/*@ requires valid_string_src: valid_string(s1); - @ requires valid_string_src: valid_string(s2); +/*@ requires valid_string_src: valid_string(s); // over-strong + @ assigns \result \from s[0..]; + @ ensures \result == strlen(s) || \result == n; + @*/ +extern size_t strnlen (const char *s, size_t n); + +/*@ requires valid_string_s1: valid_string(s1); + @ requires valid_string_s2: valid_string(s2); @ assigns \result \from s1[0..], s2[0..]; @ ensures \result == strcmp(s1,s2); @*/ extern int strcmp (const char *s1, const char *s2); -/*@ requires valid_string_src: valid_string(s1); - @ requires valid_string_src: valid_string(s2); +/*@ requires valid_string_s1: valid_string(s1); // over-strong + @ requires valid_string_s2: valid_string(s2); // over-strong @ assigns \result \from s1[0 .. n-1], s2[0 ..n-1]; @ ensures \result == strncmp(s1,s2,n); @*/ extern int strncmp (const char *s1, const char *s2, size_t n); -/*@ requires valid_string(s1) && valid_string(s2); - @ assigns \nothing; +/*@ requires valid_string_s1: valid_string(s1); // over-strong + @ requires valid_string_s2: valid_string(s2); // over-strong + @ assigns \result \from s1[0..], s2[0..]; @*/ extern int strcoll (const char *s1, const char *s2); @@ -140,34 +147,41 @@ @*/ extern char *strrchr(const char *s, int c); -/*@ requires valid_string(s) && valid_string(reject); - @ assigns \nothing; +/*@ requires valid_string_src: valid_string(s); + @ requires valid_string_reject: valid_string(reject); + @ assigns \result \from s[0..], reject[0..]; @ ensures 0 <= \result <= strlen(s); @*/ extern size_t strcspn(const char *s, const char *reject); -/*@ requires valid_string(s) && valid_string(accept); - @ assigns \nothing; +/*@ requires valid_string_src: valid_string(s); + @ requires valid_string_accept: valid_string(accept); + @ assigns \result \from s[0..], accept[0..]; @ ensures 0 <= \result <= strlen(s); @*/ extern size_t strspn(const char *s, const char *accept); -/*@ requires valid_string(s) && valid_string(accept); - @ assigns \nothing; +/*@ requires valid_string_src: valid_string(s); + @ requires valid_string_accept: valid_string(accept); + @ assigns \result \from s, s[0..], accept[0..]; @ ensures \result == 0 || \base_addr(\result) == \base_addr(s); @*/ extern char *strpbrk(const char *s, const char *accept); -/*@ requires valid_string(haystack) && valid_string(needle); +/*@ requires valid_string_haystack: valid_string(haystack); + @ requires valid_string_needle: valid_string(needle); @ assigns \result \from haystack, haystack[0..], needle, needle[0..]; @ ensures \result == 0 @ || (\base_addr(\result) == \base_addr(haystack) - @ && memcmp(\result,needle,strlen(needle)) == 0); + @ && memcmp{Pre,Pre}(\result,needle,strlen(needle)) == 0); @*/ extern char *strstr(const char *haystack, const char *needle); -/*@ requires (valid_string(s) || s == \null) && valid_string(delim); - @ assigns \nothing; +/*@ requires valid_string_src: valid_string_or_null(s); + @ requires valid_string_delim: valid_string(delim); + @ assigns \result \from s, s[0..], delim[0..]; + @ ensures \result == \null + || \base_addr(\result) == \base_addr(s); @*/ extern char *strtok(char *restrict s, const char *restrict delim); @@ -197,16 +211,16 @@ /*@ @ requires valid_string_src: valid_string(src); @ // FIXME: min(...) requires room_nstring: \valid(dest+(0 .. n)); - @ assigns dest[0..n - 1]; + @ assigns dest[0..n - 1] \from src[0..n-1]; + @ assigns \result \from dest; @ ensures \result == dest; @ behavior complete: @ assumes strlen(src) < n; - @ assigns dest[0..n - 1]; @ ensures strcmp(dest,src) == 0; @ behavior partial: @ assumes n <= strlen(src); @ assigns dest[0..n - 1]; - @ ensures memcmp(dest,src,n) == 0; + @ ensures memcmp{Post,Post}(dest,src,n) == 0; @*/ extern char *strncpy(char *restrict dest, const char *restrict src, size_t n); @@ -228,21 +242,27 @@ @ requires valid_string_dst: valid_string(dest); @ requires room_string: \valid(dest + (strlen(dest) .. strlen(dest) + n)) ; @ assigns dest[strlen(dest) .. strlen(dest) + n] \from src[0..n]; + @ assigns \result \from dest; @ ensures \result == dest; @ behavior complete: @ assumes valid_string(src) && strlen(src) <= n; @ assigns dest[strlen(dest)..strlen(dest) + strlen(src)] @ \from src[0..strlen(src)]; + @ assigns \result \from dest; @ ensures strlen(dest) == \old(strlen(dest) + strlen(src)); @ behavior partial: @ assumes ! (valid_string(src) && strlen(src) <= n); + @ assigns dest[strlen(dest)..strlen(dest) + n] + @ \from src[0..strlen(src)]; + @ assigns \result \from dest; @ ensures strlen(dest) == \old(strlen(dest)) + n; @*/ extern char *strncat(char *restrict dest, const char *restrict src, size_t n); -/*@ requires \valid(dest+(0..n - 1)); +/*@ requires valid_dest: \valid(dest+(0..n - 1)); @ requires valid_string_src: valid_string(src); - @ assigns dest[0..n - 1]; + @ assigns dest[0..n - 1] \from src[0..], n; + @ assigns \result \from dest; @*/ extern size_t strxfrm (char *restrict dest, const char *restrict src, size_t n); @@ -250,13 +270,13 @@ // Allocate strings /*@ requires valid_string_src: valid_string(s); - @ assigns \nothing; + @ assigns \result; // FIXME @ ensures \valid(\result+(0..strlen(s))) && strcmp(\result,s) == 0; @*/ extern char *strdup (const char *s); /*@ requires valid_string_src: valid_string(s); // FIXME - @ assigns \nothing; + @ assigns \result; // FIXME @ ensures \valid(\result+(0..minimum(strlen(s),n))) @ && valid_string(\result) && strlen(\result) <= n @ && strncmp(\result,s,n) == 0; diff -Nru frama-c-20140301+neon+dfsg/share/libc/strings.h frama-c-20150201+sodium+dfsg/share/libc/strings.h --- frama-c-20140301+neon+dfsg/share/libc/strings.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/strings.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -25,7 +25,11 @@ #include "__fc_define_size_t.h" int bcmp(const void *, const void *, size_t); void bcopy(const void *, void *, size_t); -void bzero(void *, size_t); + + +/*@ requires \valid (((char*) s)+(0 .. n-1)); + assigns ((char*) s)[0 .. n-1]; */ +void bzero(void *s, size_t n); int ffs(int); char *index(const char *, int); char *rindex(const char *, int); diff -Nru frama-c-20140301+neon+dfsg/share/libc/sys/ioctl.h frama-c-20150201+sodium+dfsg/share/libc/sys/ioctl.h --- frama-c-20140301+neon+dfsg/share/libc/sys/ioctl.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/sys/ioctl.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/sys/param.h frama-c-20150201+sodium+dfsg/share/libc/sys/param.h --- frama-c-20140301+neon+dfsg/share/libc/sys/param.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/sys/param.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/sys/resource.h frama-c-20150201+sodium+dfsg/share/libc/sys/resource.h --- frama-c-20140301+neon+dfsg/share/libc/sys/resource.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/sys/resource.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/sys/select.h frama-c-20150201+sodium+dfsg/share/libc/sys/select.h --- frama-c-20140301+neon+dfsg/share/libc/sys/select.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/sys/select.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/sys/socket.h frama-c-20150201+sodium+dfsg/share/libc/sys/socket.h --- frama-c-20140301+neon+dfsg/share/libc/sys/socket.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/sys/socket.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -85,6 +85,7 @@ #define AF_HYLINK 15 /* NSC Hyperchannel */ #define AF_APPLETALK 16 /* AppleTalk */ #define AF_NETBIOS 17 /* NetBios-style addresses */ +#define AF_INET6 18 /* IP version 6 */ #define AF_MAX 32 /* @@ -139,6 +140,12 @@ int getsockopt(int, int, int, void *, socklen_t *); int listen(int, int); +/* Flags for passing to recv() and others */ +#define MSG_OOB 1 +#define MSG_PEEK 2 +#define MSG_DONTROUTE 4 +#define MSG_DONTWAIT 64 + /*@ ensures -1 <= \result <= length ; assigns ((char*)buffer)[0 .. length-1] ; diff -Nru frama-c-20140301+neon+dfsg/share/libc/sys/stat.h frama-c-20150201+sodium+dfsg/share/libc/sys/stat.h --- frama-c-20140301+neon+dfsg/share/libc/sys/stat.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/sys/stat.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/sys/sysctl.h frama-c-20150201+sodium+dfsg/share/libc/sys/sysctl.h --- frama-c-20140301+neon+dfsg/share/libc/sys/sysctl.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/sys/sysctl.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/sys/time.h frama-c-20150201+sodium+dfsg/share/libc/sys/time.h --- frama-c-20140301+neon+dfsg/share/libc/sys/time.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/sys/time.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/sys/types.h frama-c-20150201+sodium+dfsg/share/libc/sys/types.h --- frama-c-20140301+neon+dfsg/share/libc/sys/types.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/sys/types.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -39,4 +39,5 @@ #include "../__fc_define_off_t.h" typedef unsigned int u_int; typedef unsigned char u_char; +dev_t makedev(int maj, int min); #endif diff -Nru frama-c-20140301+neon+dfsg/share/libc/sys/uio.h frama-c-20150201+sodium+dfsg/share/libc/sys/uio.h --- frama-c-20140301+neon+dfsg/share/libc/sys/uio.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/sys/uio.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -27,7 +27,7 @@ #include "../__fc_define_size_t.h" #include "../__fc_define_iovec.h" -/*@ requires \valid( &iov[0..iovcnt-1] ); +/*@ requires \valid_read( &iov[0..iovcnt-1] ); // Value cannot yet interpret the precise assigns clause; we use the weaker one as a fallback. //@ assigns { ((char *) iov[i].iov_base)[0..iov[i].iov_len - 1] | integer i; 0 <= i < iovcnt }; @ assigns ((char *) iov[0..iovcnt -1].iov_base)[0..]; diff -Nru frama-c-20140301+neon+dfsg/share/libc/sys/un.h frama-c-20150201+sodium+dfsg/share/libc/sys/un.h --- frama-c-20140301+neon+dfsg/share/libc/sys/un.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/sys/un.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/sys/wait.h frama-c-20150201+sodium+dfsg/share/libc/sys/wait.h --- frama-c-20140301+neon+dfsg/share/libc/sys/wait.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/sys/wait.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/syslog.h frama-c-20150201+sodium+dfsg/share/libc/syslog.h --- frama-c-20140301+neon+dfsg/share/libc/syslog.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/syslog.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/termios.h frama-c-20150201+sodium+dfsg/share/libc/termios.h --- frama-c-20140301+neon+dfsg/share/libc/termios.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/termios.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/tgmath.h frama-c-20150201+sodium+dfsg/share/libc/tgmath.h --- frama-c-20140301+neon+dfsg/share/libc/tgmath.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/tgmath.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/time.h frama-c-20150201+sodium+dfsg/share/libc/time.h --- frama-c-20140301+neon+dfsg/share/libc/time.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/time.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -61,9 +61,13 @@ #define CLOCK_REALTIME 666 +#define CLOCK_MONOTONIC 1 #define TIMER_ABSTIME 0 -/*@ assigns \nothing ; */ +unsigned int __fc_time_model __attribute__((FRAMA_C_MODEL)); + +/*@ assigns __fc_time_model \from __fc_time_model; + assigns \result \from __fc_time_model; */ clock_t clock(void); /*@ assigns \result \from time1, time0; */ @@ -72,7 +76,8 @@ /*@ assigns *timeptr, \result \from *timeptr; */ time_t mktime(struct tm *timeptr); -/*@ assigns *timer, \result \from \nothing; */ +/*@ assigns __fc_time_model \from __fc_time_model; + assigns *timer, \result \from __fc_time_model; */ time_t time(time_t *timer); char *asctime(const struct tm *timeptr); diff -Nru frama-c-20140301+neon+dfsg/share/libc/uchar.h frama-c-20150201+sodium+dfsg/share/libc/uchar.h --- frama-c-20140301+neon+dfsg/share/libc/uchar.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/uchar.h 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/unistd.h frama-c-20150201+sodium+dfsg/share/libc/unistd.h --- frama-c-20140301+neon+dfsg/share/libc/unistd.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/unistd.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ @@ -752,6 +752,7 @@ pid_t getpid(void); pid_t getppid(void); pid_t getsid(pid_t); +/*@ assigns \result \from \nothing; */ uid_t getuid(void); char *getwd(char *); int isatty(int); diff -Nru frama-c-20140301+neon+dfsg/share/libc/wchar.h frama-c-20150201+sodium+dfsg/share/libc/wchar.h --- frama-c-20140301+neon+dfsg/share/libc/wchar.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/wchar.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc/wctype.h frama-c-20150201+sodium+dfsg/share/libc/wctype.h --- frama-c-20140301+neon+dfsg/share/libc/wctype.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc/wctype.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc.c frama-c-20150201+sodium+dfsg/share/libc.c --- frama-c-20140301+neon+dfsg/share/libc.c 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc.c 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/libc.h frama-c-20150201+sodium+dfsg/share/libc.h --- frama-c-20140301+neon+dfsg/share/libc.h 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/libc.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/machine.h frama-c-20150201+sodium+dfsg/share/machine.h --- frama-c-20140301+neon+dfsg/share/machine.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/machine.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/Makefile.common frama-c-20150201+sodium+dfsg/share/Makefile.common --- frama-c-20140301+neon+dfsg/share/Makefile.common 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/Makefile.common 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # @@ -46,7 +46,7 @@ ifeq ($(OCAMLWIN32),yes) ifneq ($(CYGPATH),no) -winpath=$(shell $(CYGPATH) -m $(1)) +winpath=$(shell $(CYGPATH) -m "$(1)") else winpath=$(1) endif #CYGPATH @@ -63,8 +63,18 @@ # the condition ifneq ($(findstring 3.12,$(OCAMLVERSION)),) # 3.12 HAS_OCAML4 = no + HAS_OCAML402 = no else # >=4 HAS_OCAML4 = yes + ifneq ($(findstring 4.00,$(OCAMLVERSION)),) # 4.00 + HAS_OCAML402 = no + else + ifneq ($(findstring 4.01,$(OCAMLVERSION)),) # 4.01 + HAS_OCAML402 = no + else # >= 4.02 + HAS_OCAML402 = yes + endif + endif endif # All warnings are activated by default: this could grow up the chance of @@ -72,7 +82,7 @@ # BUT that is only the case of the SVN version since the distrib is not # compiled with -warn-error. # See BTS #310 and #638. -WARNINGS= -w +a-4-6-9-41-44-45 #-strict-sequence +WARNINGS= -w +a-3-4-6-9-41-44-45-48 FLAGS = $(WARNINGS) $(OCAML_ANNOT_OPTION) $(OPTIM) DEBUG = -g @@ -153,6 +163,19 @@ RM = rm -f TAR = tar TOUCH = touch +GIT = git + +################## +# Make commands # +################## + +map=$(foreach a,$(2),$(call $(1),$(a))) + +define assert_defined +ifndef $(1) +$$(error Undefined variable $(1) please report.) +endif +endef ########################### # Command pretty printing # @@ -170,6 +193,7 @@ PRINT_PACKING =$(PRINT) 'Packing '# PRINT_LINKING =$(PRINT) 'Linking '# PRINT_INFERRING =$(PRINT) 'Inferring '# +PRINT_CC =$(PRINT) 'CC '# PRINT_MAKING =$(PRINT) 'Generating '# PRINT_MV =$(PRINT) 'Moving to '# diff -Nru frama-c-20140301+neon+dfsg/share/Makefile.config.in frama-c-20150201+sodium+dfsg/share/Makefile.config.in --- frama-c-20140301+neon+dfsg/share/Makefile.config.in 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/Makefile.config.in 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # @@ -54,8 +54,10 @@ FRAMAC_DATADIR ?=$(DATADIR)/frama-c EMACS_DATADIR ?=$(DATADIR)/emacs/site-lisp FRAMAC_DEFAULT_CPP ?=@FRAMAC_DEFAULT_CPP@ +FRAMAC_GNU_CPP ?=@FRAMAC_GNU_CPP@ DEFAULT_CPP_KEEP_COMMENTS?=@DEFAULT_CPP_KEEP_COMMENTS@ FC_MCPP ?=@FC_MCPP@ +CC =@CC@ ############### # Ocaml stuff # @@ -140,7 +142,7 @@ EXTERNAL_PLUGINS ?=@EXTERNAL_PLUGINS@ # Integrated plugins -ENABLE_FROM_ANALYSIS ?=@ENABLE_FROM_ANALYSIS@ +ENABLE_FROM ?=@ENABLE_FROM_ANALYSIS@ ENABLE_GUI ?=@ENABLE_GUI@ ENABLE_IMPACT ?=@ENABLE_IMPACT@ ENABLE_INOUT ?=@ENABLE_INOUT@ @@ -148,16 +150,15 @@ ENABLE_OCCURRENCE ?=@ENABLE_OCCURRENCE@ ENABLE_PDG ?=@ENABLE_PDG@ ENABLE_POSTDOMINATORS ?=@ENABLE_POSTDOMINATORS@ -ENABLE_REPORT ?=@ENABLE_REPORT@ -ENABLE_RTE_ANNOTATION ?=@ENABLE_RTE_ANNOTATION@ +ENABLE_RTEGEN ?=@ENABLE_RTEGEN@ ENABLE_SCOPE ?=@ENABLE_SCOPE@ ENABLE_SEMANTIC_CALLGRAPH ?=@ENABLE_SEMANTIC_CALLGRAPH@ -ENABLE_SEMANTIC_CONSTANT_FOLDING ?=@ENABLE_SEMANTIC_CONSTANT_FOLDING@ +ENABLE_CONSTANT_PROPAGATION ?=@ENABLE_SEMANTIC_CONSTANT_FOLDING@ ENABLE_SLICING ?=@ENABLE_SLICING@ ENABLE_SPARECODE ?=@ENABLE_SPARECODE@ ENABLE_SYNTACTIC_CALLGRAPH ?=@ENABLE_SYNTACTIC_CALLGRAPH@ ENABLE_USERS ?=@ENABLE_USERS@ -ENABLE_VALUE_ANALYSIS ?=@ENABLE_VALUE_ANALYSIS@ +ENABLE_VALUE ?=@ENABLE_VALUE_ANALYSIS@ ########################################################################## diff -Nru frama-c-20140301+neon+dfsg/share/Makefile.dynamic frama-c-20150201+sodium+dfsg/share/Makefile.dynamic --- frama-c-20140301+neon+dfsg/share/Makefile.dynamic 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/Makefile.dynamic 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # @@ -40,34 +40,17 @@ endif #Do not generate documentation for this. -PLUGIN_UNDOC:=$(PLUGIN_UNDOC) ptests_local_config.ml +PLUGIN_UNDOC:=$(PLUGIN_UNDOC) ifeq ($(FRAMAC_MAKE),yes) PLUGIN_RESET :=yes -.PHONY: $(PLUGIN_DIR)/TESTS $(PLUGIN_NAME)_TESTS - -$(PLUGIN_NAME)_TESTS: $(PLUGIN_DIR)/TESTS - -$(PLUGIN_DIR)/TESTS: - $(call external_make, $(dir $@), tests) - else PLUGIN_RESET :=no include $(MAKECONFIG_DIR)/Makefile.common include $(MAKECONFIG_DIR)/Makefile.dynamic_config -#special goal for use by frama-c's main Makefile. -run_tests: -ifndef PLUGIN_NO_DEFAULT_TEST -ifndef PLUGIN_NO_TEST - true -else - false -endif # PLUGIN_NO_TEST -else - false -endif #PLUGIN_NO_DEFAULT_TEST +tests:: external_tests ifeq ($(PLUGIN_ENABLE),no) tests:: @@ -111,89 +94,74 @@ $($(@:%_INSTALL_DOC=%_DOC_DIR))/*.png)) \ $(DOC_DIR)/$(@:%_INSTALL_DOC=%) +endif #PLUGIN_ENABLE +endif #FRAMAC_MAKE + +#Must be defined before section TESTS, because function call in make +#replace not only $(1) but all the other $(..) +PLUGIN_LIB_DIR ?= $(PLUGIN_DIR) +PLUGIN_GUI_LIB_DIR ?= $(PLUGIN_DIR)/gui +PLUGIN_INSTALL_DIR ?=$(DESTDIR)$(FRAMAC_PLUGINDIR) -ifndef PLUGIN_INTERNAL_TEST -ifndef PLUGIN_NO_TEST -PTESTS_DEP=$(PLUGIN_DIR)/Makefile +######################## TESTS ################# +.PHONY: $(PLUGIN_NAME)_TESTS plugins_ptests_config -ifeq ($(FRAMAC_INTERNAL),yes) -$(PLUGIN_DIR)/ptests_local_config.cmo: BFLAGS="-I $(call winpath,$(FRAMAC_SRC))/ptests" -g -$(PLUGIN_DIR)/ptests_local_config.cmo: $(FRAMAC_SRC)/bin/ptests.byte +$(eval $(call assert_defined,PLUGIN_LIB_DIR)) +$(eval $(call assert_defined,FRAMAC_SHARE)) +$(eval $(call assert_defined,FRAMAC_LIB)) + +# Do not generate tests-related rules when PLUGIN_NO_TEST is set to 'no' but +# there is no 'tests' directory. Typically useful for plugins released without +# their tests. +HAS_TESTS_DIR:=$(shell if test \! -d $(PLUGIN_DIR)/tests; then echo KO; fi) -# do not use the default rule: this file mustn't be compiled with -c -# (incompatible with -shared) -$(PLUGIN_DIR)/ptests_local_config.cmxs: $(PLUGIN_DIR)/ptests_local_config.ml \ - $(FRAMAC_SRC)/bin/ptests.opt - $(OCAMLOPT) -I $(call winpath,$(FRAMAC_SRC))/ptests -g -shared -o $@ $< +ifneq (,$(HAS_TESTS_DIR)$(PLUGIN_INTERNAL_TEST)$(PLUGIN_NO_TEST)) +$(PLUGIN_NAME)_TESTS: -PTESTS_DEP+=$(FRAMAC_SHARE)/Makefile.dynamic \ - $(FRAMAC_SHARE)/Makefile.dynamic_config else -$(PLUGIN_DIR)/ptests_local_config.cmo: BFLAGS=$(FRAMAC_INCLUDES) +PTESTS_DEP:=$(PLUGIN_DIR)/Makefile + +plugins_ptests_config: $(PLUGIN_DIR)/tests/ptests_config -# do not use the default rule: this file mustn't be compiled with -c -# (incompatible with -shared) -$(PLUGIN_DIR)/ptests_local_config.cmxs: $(PLUGIN_DIR)/ptests_local_config.ml - $(OCAMLOPT) $(FRAMAC_INCLUDES) -shared -o $@ \ - $(call winpath,$(FRAMAC_LIBDIR))/ptests_config.cmx \ - $< -endif #FRAMAC_INTERNAL - -$(PLUGIN_DIR)/ptests_local_config.ml: $(PTESTS_DEP) - $(PRINT_MAKING) $@ - $(CHMOD_RW) $@ - $(ECHO) \ - "Ptests_config.default_suites:= [" $(PLUGIN_TESTS_DIRS:%='"%";') "];;" > $@ +define TESTS_template +$(PLUGIN_DIR)/tests/ptests_config: $(PTESTS_DEP) + $(PRINT_MAKING) $$@ + $(MKDIR) tests + $(RM) $$@ + $(ECHO) "DEFAULT_SUITES=" $(PLUGIN_TESTS_DIRS) > $$@ if test "$(USABLE_NATIVE_DYNLINK)" = "yes" \ - -o "$(FRAMAC_INTERNAL)" = "yes"; then \ - $(ECHO) \ - "Ptests_config.toplevel_path :=\"$(FRAMAC_OPT)\";;" >> $@; \ - else \ - $(ECHO) "Ptests_config.toplevel_path :=" >> $@; \ - $(ECHO) " Filename.concat Filename.current_dir_name" >> $@; \ - $(ECHO) " \"frama-c-$(PLUGIN_NAME).$(OCAMLBEST)$(EXE)\";;" >> $@; \ - fi - $(ECHO) \ - "Ptests_config.framac_share :=\"$(FRAMAC_SHARE)\";;" >> $@ - $(ECHO) \ - "Ptests_config.framac_plugin :=\"$(PLUGIN_LIB_DIR)\";;" >> $@ - $(ECHO) \ - "Ptests_config.framac_plugin_gui :=\"$(PLUGIN_GUI_LIB_DIR)\";;" >> $@ - $(ECHO) \ - "Ptests_config.framac_lib :=\"$(FRAMAC_LIB)\";;" >> $@ - $(CHMOD_RO) $@ + -o "$(FRAMAC_INTERNAL)" = "yes"; then \ + $(ECHO) "TOPLEVEL_PATH=$(FRAMAC_OPT)" >> $$@; \ + else \ + $(ECHO) "TOPLEVEL_PATH=./frama-c-$(PLUGIN_NAME).$(OCAMLBEST)$(EXE)\";;" >> $$@; \ + fi + $(ECHO) "FRAMAC_SHARE=$(FRAMAC_SHARE)" >> $$@ + $(ECHO) "FRAMAC_PLUGIN=$(PLUGIN_LIB_DIR)" >> $$@ + $(ECHO) "FRAMAC_PLUGIN_GUI=$(PLUGIN_GUI_LIB_DIR)" >> $$@ + $(ECHO) "FRAMAC_LIB=$(FRAMAC_LIB)" >> $$@ + $(ECHO) "OCAMLRUNPARAM=" >> $$@ + $(CHMOD_RO) $$@ -$(PLUGIN_NAME)_PTESTS_OPTS:=$(PLUGIN_PTESTS_OPTS) +# $(PLUGIN_NAME)_DEFAULT_TESTS allows plugins to define rules that at +# the same time depend on $(PLUGIN_NAME)_DEFAULT_TESTS and +# $(PLUGIN_NAME)_TESTS depend on them -ifeq ($(PTESTSBEST),opt) -PLC_EXT=.cmxs -else -PLC_EXT=.cmo -endif -PTESTS_LOCAL_CONFIG:=$(PLUGIN_DIR)/ptests_local_config$(PLC_EXT) +.PHONY: $(PLUGIN_NAME)_DEFAULT_TESTS -.PHONY: plugin-test/$(PLUGIN_NAME) -plugin-test/$(PLUGIN_NAME): $(TARGETS) $(TARGETS_GUI) \ - $(PTESTS_LOCAL_CONFIG) - $(PRINT) TESTING PLUG-IN $(notdir $@) - cd $($(notdir $@)_DIR) && \ - time -p $(PTESTS) $(PTESTS_OPTS) $($(notdir $@)_PTESTS_OPTS) +$(PLUGIN_NAME)_DEFAULT_TESTS: $$(TARGETS) $$(TARGETS_GUI) $(PLUGIN_DIR)/tests/ptests_config + $(PRINT) TESTING PLUG-IN $(PLUGIN_NAME) + cd $(PLUGIN_DIR) && \ + time -p $(PTESTS) $(PTESTS_OPTS) $(PLUGIN_PTESTS_OPTS) -tests:: plugin-test/$(PLUGIN_NAME) +$(PLUGIN_NAME)_TESTS: $(PLUGIN_NAME)_DEFAULT_TESTS -else -tests:: -endif #PLUGIN_NO_TEST -else -tests:: -endif #PLUGIN_INTERNAL_TEST +endef +$(eval $(call TESTS_template)) -endif #PLUGIN_ENABLE -endif #FRAMAC_MAKE +external_tests: $(PLUGIN_NAME)_TESTS -PLUGIN_LIB_DIR ?= $(PLUGIN_DIR) -PLUGIN_GUI_LIB_DIR ?= $(PLUGIN_DIR)/gui -PLUGIN_INSTALL_DIR ?=$(DESTDIR)$(FRAMAC_PLUGINDIR) +endif +################################################ PLUGIN_FLAGS:=$(FLAGS) $(DEBUG) $(FRAMAC_INCLUDES) $(OCAMLGRAPH_INCLUDE) PLUGIN_BFLAGS:=$(PLUGIN_FLAGS) $(PLUGIN_BFLAGS) @@ -257,7 +225,7 @@ clean:: $(PLUGIN_NAME)_CLEAN_DYNAMIC $(PLUGIN_NAME)_CLEAN_DYNAMIC: - $(RM) $($(patsubst %_CLEAN_DYNAMIC,%_DIR,$@))/ptests_local_config.ml + $(RM) $($(patsubst %_CLEAN_DYNAMIC,%_DIR,$@))/tests/ptests_config $(RM) frama-c-$($(patsubst %_CLEAN_DYNAMIC,,$@)) \ frama-c-$($(patsubst %_CLEAN_DYNAMIC,,$@)).byte @@ -270,7 +238,7 @@ else STATIC= endif -all:: $(PLUGIN_DIR)/.depend byte $(OCAMLBEST) gui $(STATIC) +all:: $(PLUGIN_DIR)/.depend byte $(OCAMLBEST) gui $(STATIC) plugins_ptests_config ifneq ($(PLUGIN_ENABLE),no) install:: @@ -312,7 +280,7 @@ $(PRINT_RM) installed $(PLUGIN_NAME) libraries $(RM) $(PLUGIN_INSTALL_DIR)/$(PLUGIN_NAME).* $(PRINT_RM) installed $(PLUGIN_NAME) dependencies - $(RM) $(PLUGIN_INSTALL_DIR)/dependencies/$(PLUGIN_NAME)_dependencies.* + $(RM) $(PLUGIN_INSTALL_DIR)/dependencies/$(PLUGIN_NAME)_dependencies.* $(PRINT_RM) installed $(PLUGIN_NAME) binaries $(RM) $(BINDIR)/frama-c-$(PLUGIN_NAME).opt$(EXE) \ $(BINDIR)/frama-c-$(PLUGIN_NAME).byte$(EXE) diff -Nru frama-c-20140301+neon+dfsg/share/Makefile.dynamic_config.external frama-c-20150201+sodium+dfsg/share/Makefile.dynamic_config.external --- frama-c-20140301+neon+dfsg/share/Makefile.dynamic_config.external 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/Makefile.dynamic_config.external 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # diff -Nru frama-c-20140301+neon+dfsg/share/Makefile.dynamic_config.internal frama-c-20150201+sodium+dfsg/share/Makefile.dynamic_config.internal --- frama-c-20140301+neon+dfsg/share/Makefile.dynamic_config.internal 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/Makefile.dynamic_config.internal 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # @@ -24,7 +24,7 @@ export FRAMAC_PLUGIN_TEST=$(FRAMAC_TOP_SRCDIR)/lib/plugins export FRAMAC_PLUGIN_GUI_TEST=$(FRAMAC_TOP_SRCDIR)/lib/plugins/gui export FRAMAC_OPT=$(FRAMAC_TOP_SRCDIR)/bin/toplevel.opt$(EXE) -#export FRAMAC_BYTE=$(FRAMAC_SRC)/bin/toplevel.byte$(EXE) +export FRAMAC_BYTE=$(FRAMAC_TOP_SRCDIR)/bin/toplevel.byte$(EXE) export FRAMAC_INCLUDES=$(addprefix -I $(call winpath,$(FRAMAC_TOP_SRCDIR))/,$(FRAMAC_SRC_DIRS) lib) export PTESTS=$(FRAMAC_TOP_SRCDIR)/bin/ptests.$(PTESTSBEST)$(EXE) export PLUGIN_LIB_DIR=$(FRAMAC_TOP_SRCDIR)/lib/plugins diff -Nru frama-c-20140301+neon+dfsg/share/Makefile.generic frama-c-20150201+sodium+dfsg/share/Makefile.generic --- frama-c-20140301+neon+dfsg/share/Makefile.generic 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/Makefile.generic 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # @@ -94,13 +94,13 @@ .mll.ml: $(PRINT_OCAMLLEX) $@ - $(CHMOD_RW) $@ + $(RM) $@ $(OCAMLLEX) $< $(CHMOD_RO) $@ %.mli %.ml: %.mly $(PRINT_OCAMLYACC) $@ - $(CHMOD_RW) $(<:.mly=.ml) $(<:.mly=.mli) + $(RM) $(<:.mly=.ml) $(<:.mly=.mli) $(OCAMLYACC) -v $< $(CHMOD_RO) $(<:.mly=.ml) $(<:.mly=.mli) diff -Nru frama-c-20140301+neon+dfsg/share/Makefile.plugin frama-c-20150201+sodium+dfsg/share/Makefile.plugin --- frama-c-20140301+neon+dfsg/share/Makefile.plugin 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/Makefile.plugin 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # @@ -200,7 +200,7 @@ PLUGIN_OPT:=`echo "$(PLUGIN_NAME)" | tr 'A-Z' 'a-z' ` -ifeq ("$(PLUGIN_DISTRIB_BIN)","yes") +ifneq ("$(PLUGIN_DISTRIB_BIN)","no") CONFIG_DISTRIB_BIN += "--enable-$(PLUGIN_OPT)" ifeq ("$(PLUGIN_HAS_EXT_DOC)","yes") PLUGIN_BIN_DOC_LIST+=doc/plugins/$(PLUGIN_BASE).pdf @@ -485,6 +485,7 @@ TARGET_GUI_MLI:= $(PLUGIN_LIB_DIR)/gui/$(PLUGIN_NAME).mli TARGET_GUI_CMI:= $(TARGET_GUI_MLI:.mli=.cmi) +$(TARGET_GUI_CMI): BFLAGS:=$($(NAME_GUI_BFLAGS)) PLUGIN_GENERATED+= $(TARGET_GUI_MLI) @@ -787,7 +788,7 @@ .PHONY: $(PLUGIN_DIR)/$(PLUGIN_NAME)_DEP_REDO $(PLUGIN_DIR)/$(PLUGIN_NAME)_DEP_REDO: $(PLUGIN_GENERATED) $(TARGET_MLI) $(TARGET_GUI_MLI) $(PRINT_DEP) $(dir $@).depend - $(CHMOD_RW) $(dir $@).depend + $(RM) $(dir $@).depend $(OCAMLDEP) $(INCLUDES_FOR_OCAMLDEP) \ $($(patsubst %_DEP_REDO,%_DEPFLAGS,$(basename $(notdir $@)))) \ $(patsubst ./%,%, \ @@ -804,7 +805,7 @@ # Otherwise do it only if necessary $(PLUGIN_DIR)/$(PLUGIN_NAME)_DEP: $(PLUGIN_GENERATED) $(TARGET_MLI) $(TARGET_GUI_MLI) $(PRINT_DEP) $(dir $@).depend - $(CHMOD_RW) $(dir $@).depend + $(RM) $(dir $@).depend $(OCAMLDEP) $(INCLUDES_FOR_OCAMLDEP) \ $($(basename $(notdir $@))FLAGS) \ $(patsubst ./%,%, \ @@ -817,6 +818,25 @@ $(CHMOD_RO) $(dir $@).depend # touch above = Do not recompute dependances each times +########## +# Merlin # +########## + +ifneq ($(FRAMAC_MAKE),yes) + +.PHONY: merlin_plugin + +merlin_plugin: + echo "B $(FRAMAC_LIBDIR)" > .merlin + echo "B $(FRAMAC_LIBDIR)/plugins" >> .merlin + echo "B $(FRAMAC_LIBDIR)/plugins/gui" >> .merlin + echo "PKG ocamlgraph" >> .merlin + echo "PKG zarith" >> .merlin + echo "PKG lablgtk2" >> .merlin + +endif + + ############ # Cleaning # ############ @@ -851,7 +871,7 @@ .PHONY: $(PLUGIN_DIR)/$(PLUGIN_NAME)_DIST_CLEAN $(PLUGIN_DIR)/$(PLUGIN_NAME)_DIST_CLEAN: - $(RM) $(dir $@)/ptests_local_config.* + $(RM) $(dir $@)/tests/ptests_config .PHONY: $(PLUGIN_DIR)/$(PLUGIN_NAME)_CLEAN_DOC $($(PLUGIN_NAME)_DOC_DIR) $(PLUGIN_DIR)/$(PLUGIN_NAME)_CLEAN_DOC: $($(PLUGIN_NAME)_DOC_DIR) @@ -859,7 +879,10 @@ $(RM) -r $< $(RM) $(DOC_DIR)/$(notdir $(patsubst %_CLEAN_DOC,%,$@).toc) -# Global lists seen in Makefile.in +# Global lists seen in Makefile + +PLUGIN_GENERATED_LIST += $(PLUGIN_GENERATED) + ifeq ($(PLUGIN_DYNAMIC),yes) #dynamic plugin PLUGIN_DYN_EXISTS:=yes diff -Nru frama-c-20140301+neon+dfsg/share/math.c frama-c-20150201+sodium+dfsg/share/math.c --- frama-c-20140301+neon+dfsg/share/math.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/math.c 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/share/math.h frama-c-20150201+sodium+dfsg/share/math.h --- frama-c-20140301+neon+dfsg/share/math.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/share/math.h 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/colorblind/considered_valid.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/colorblind/considered_valid.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/colorblind/inconsistent.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/colorblind/inconsistent.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/colorblind/invalid_but_dead.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/colorblind/invalid_but_dead.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/colorblind/invalid_under_hyp.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/colorblind/invalid_under_hyp.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/colorblind/never_tried.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/colorblind/never_tried.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/colorblind/surely_invalid.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/colorblind/surely_invalid.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/colorblind/surely_valid.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/colorblind/surely_valid.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/colorblind/switch-off.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/colorblind/switch-off.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/colorblind/switch-on.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/colorblind/switch-on.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/colorblind/unknown_but_dead.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/colorblind/unknown_but_dead.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/colorblind/unknown.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/colorblind/unknown.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/colorblind/valid_but_dead.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/colorblind/valid_but_dead.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/colorblind/valid_under_hyp.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/colorblind/valid_under_hyp.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/default/considered_valid.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/default/considered_valid.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/default/inconsistent.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/default/inconsistent.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/default/invalid_but_dead.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/default/invalid_but_dead.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/default/invalid_under_hyp.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/default/invalid_under_hyp.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/default/never_tried.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/default/never_tried.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/default/surely_invalid.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/default/surely_invalid.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/default/surely_valid.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/default/surely_valid.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/default/switch-off.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/default/switch-off.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/default/switch-on.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/default/switch-on.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/default/unknown_but_dead.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/default/unknown_but_dead.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/default/unknown.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/default/unknown.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/default/valid_but_dead.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/default/valid_but_dead.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/share/theme/default/valid_under_hyp.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/share/theme/default/valid_under_hyp.png differ diff -Nru frama-c-20140301+neon+dfsg/src/ai/abstract_interp.ml frama-c-20150201+sodium+dfsg/src/ai/abstract_interp.ml --- frama-c-20140301+neon+dfsg/src/ai/abstract_interp.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/abstract_interp.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -534,7 +534,7 @@ module Int = struct include (Integer: module type of Integer with type t = Integer.t) - include (Datatype.Big_int: Datatype.S_with_collections with type t:=Integer.t) + include (Datatype.Integer: Datatype.S_with_collections with type t:=Integer.t) let pretty fmt v = if not (Kernel.BigIntsHex.is_default ()) then diff -Nru frama-c-20140301+neon+dfsg/src/ai/abstract_interp.mli frama-c-20150201+sodium+dfsg/src/ai/abstract_interp.mli --- frama-c-20140301+neon+dfsg/src/ai/abstract_interp.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/abstract_interp.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/ai/base.ml frama-c-20150201+sodium+dfsg/src/ai/base.ml --- frama-c-20140301+neon+dfsg/src/ai/base.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/base.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -27,7 +27,6 @@ type validity = | Known of Int.t * Int.t | Unknown of Int.t * Int.t option * Int.t - | Periodic of Int.t * Int.t * Int.t | Invalid let pretty_validity fmt v = @@ -37,10 +36,6 @@ Int.pretty b (Pretty_utils.pp_opt Int.pretty) k Int.pretty e | Known (b,e) -> Format.fprintf fmt "Known %a-%a" Int.pretty b Int.pretty e | Invalid -> Format.fprintf fmt "Invalid" - | Periodic (b,e,p) -> - Format.fprintf fmt "Periodic %a-%a (%a)" - Int.pretty b Int.pretty e - Int.pretty p module Validity = Datatype.Make (struct @@ -48,9 +43,31 @@ let name = "Base.validity" let structural_descr = Structural_descr.t_abstract let reprs = [ Known (Int.zero, Int.one) ] - let equal = Datatype.undefined - let compare = Datatype.undefined - let hash = Datatype.undefined + + let compare v1 v2 = match v1, v2 with + | Unknown (b1, m1, e1), Unknown (b2, m2, e2) -> + let c = Int.compare b1 b2 in + if c = 0 then + let c = Extlib.opt_compare Int.compare m1 m2 in + if c = 0 then Int.compare e1 e2 else 0 + else c + | Invalid, Invalid -> 0 + | Known (b1, e1), Known (b2, e2) -> + let c = Int.compare b1 b2 in + if c = 0 then Int.compare e1 e2 else 0 + | Known _, (Unknown _ | Invalid) + | Unknown _, Invalid -> -1 + | Invalid, (Unknown _ | Known _) + | Unknown _, Known _ -> 1 + + let equal = Datatype.from_compare + + let hash v = match v with + | Invalid -> 37 + | Known (b, e) -> Hashtbl.hash (3, Int.hash b, Int.hash e) + | Unknown (b, m, e) -> + Hashtbl.hash (7, Int.hash b, Extlib.opt_hash Int.hash m, Int.hash e) + let pretty = pretty_validity let mem_project = Datatype.never_any_project let internal_pretty_code = Datatype.pp_fail @@ -81,11 +98,6 @@ let is_null x = match x with Null -> true | _ -> false -let _is_special_variable v = - match v with - Var (s,_) when s.vlogic -> true - | _ -> false - let pretty fmt t = match t with | String (_, CSString s) -> Format.fprintf fmt "%S" s @@ -199,8 +211,9 @@ let is_read_only base = match base with - String _ -> true - | _ -> false (* TODO: completely const types *) + | String _ -> true + | Var (v,_) -> Kernel.ConstReadonly.get () && typeHasQualifier "const" v.vtype + | _ -> false let is_valid_offset ~for_writing size base offset = if for_writing && (is_read_only base) @@ -208,8 +221,8 @@ match validity base with | Invalid -> raise Not_valid_offset | Known (min_valid,max_valid) - | Periodic (min_valid, max_valid, _) | Unknown (min_valid, Some max_valid, _) -> + if not (Ival.is_bottom offset) then let min = Ival.min_int offset in begin match min with | None -> raise Not_valid_offset @@ -229,8 +242,7 @@ | Unknown (_, None, _) -> raise Not_valid_offset let validity_max_offset = function - | Known (_, ma) - | Periodic (_, ma, _) -> Ival.inject_singleton ma + | Known (_, ma) -> Ival.inject_singleton ma | Unknown (mi, None, ma) -> Ival.inject_range (Some mi) (Some ma) | Unknown (_, Some mi, ma) -> Ival.inject_range (Some (Int.succ mi)) (Some ma) | Invalid -> Ival.bottom @@ -259,14 +271,14 @@ let is_any_formal_or_local v = match v with - | Var (v,_) | Initialized_Var (v,_) -> not v.vlogic && not v.vglob + | Var (v,_) | Initialized_Var (v,_) -> v.vsource && not v.vglob | CLogic_Var _ -> false | Null | String _ -> false let is_any_local v = match v with | Var (v,_) | Initialized_Var (v,_) -> - not v.vlogic && not v.vglob && not v.vformal + v.vsource && not v.vglob && not v.vformal | CLogic_Var _ -> false | Null | String _ -> false @@ -323,11 +335,9 @@ Unknown (Int.zero, None, Bit_utils.max_bit_address ()) let valid_range = function - | Invalid -> Lattice_Interval_Set.Int_Intervals.bottom - | Periodic (min_valid, max_valid, _) + | Invalid -> None | Known (min_valid,max_valid) - | Unknown (min_valid,_,max_valid)-> - Lattice_Interval_Set.Int_Intervals.inject_bounds min_valid max_valid + | Unknown (min_valid,_,max_valid)-> Some (min_valid, max_valid) module Base = struct @@ -354,12 +364,14 @@ module Hptset = Hptset.Make (Base) - (struct let v = [ [ ] ] end) + (struct let v = [ [ ]; [Null] ] end) (struct let l = [ Ast.self ] end) let () = Ast.add_monotonic_state Hptset.self let () = Ast.add_hook_on_update Hptset.clear_caches -module VarinfoLogic = +let null_set = Hptset.singleton Null + +module VarinfoNotSource = Cil_state_builder.Varinfo_hashtbl (Base) (struct @@ -367,39 +379,11 @@ let dependencies = [ Ast.self ] let size = 89 end) -let () = Ast.add_monotonic_state VarinfoLogic.self - -let regexp = Str.regexp "Frama_C_periodic[^0-9]*\\([0-9]+\\)" +let () = Ast.add_monotonic_state VarinfoNotSource.self -let create_varinfo varinfo = - assert (not varinfo.vlogic); +let base_of_varinfo varinfo = + assert varinfo.vsource; let validity = validity_from_type varinfo in - let name = varinfo.vname in - let periodic period = - Kernel.feedback ~current:true ~once:true - "Periodic variable %s of period %d@." name period; - match validity with - | Known(mn, mx) -> - assert (Int.is_zero mn); - Periodic(mn, mx, Int.of_int period) - | _ -> assert false - in - let validity = - if Str.string_match regexp name 0 then - let period = Str.matched_group 1 name in - let period = int_of_string period in - periodic period - else - match Cil.unrollType varinfo.vtype with - | TArray (typ, _, _, attrs) when - Cil.hasAttribute "Frama_C_periodic" varinfo.vattr || - Cil.hasAttribute "Frama_C_periodic" attrs -> - (try - let size = Cil.bitsSizeOf typ in - periodic size - with Cil.SizeOfError _ -> validity) - | _ -> validity - in Var (varinfo, validity) module Validities = @@ -414,18 +398,18 @@ end) let () = Ast.add_monotonic_state Validities.self -let of_varinfo_aux = Validities.memo create_varinfo +let of_varinfo_aux = Validities.memo base_of_varinfo let register_memory_var varinfo validity = - assert (varinfo.vlogic && not (VarinfoLogic.mem varinfo)); + assert (not varinfo.vsource && not (VarinfoNotSource.mem varinfo)); let base = Var (varinfo,validity) in - VarinfoLogic.add varinfo base; + VarinfoNotSource.add varinfo base; base let register_initialized_var varinfo validity = - assert varinfo.vlogic; + assert (not varinfo.vsource); let base = Initialized_Var (varinfo,validity) in - VarinfoLogic.add varinfo base; + VarinfoNotSource.add varinfo base; base let of_c_logic_var lv = @@ -435,8 +419,13 @@ | _ -> Kernel.fatal "Logic variable with a non-C type %s" lv.lv_name let of_varinfo varinfo = - if varinfo.vlogic then VarinfoLogic.find varinfo - else of_varinfo_aux varinfo + if varinfo.vsource + then of_varinfo_aux varinfo + else + try VarinfoNotSource.find varinfo + with Not_found -> + Kernel.fatal "Querying base for unknown non-source variable %a" + Printer.pp_varinfo varinfo exception Not_a_C_variable diff -Nru frama-c-20140301+neon+dfsg/src/ai/base.mli frama-c-20150201+sodium+dfsg/src/ai/base.mli --- frama-c-20140301+neon+dfsg/src/ai/base.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/base.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -51,10 +51,6 @@ - potentially valid between k+1 and e: Accesses on potentially valid parts will succeed, but will also raise an alarm. *) - | Periodic of Int.t * Int.t (** min-max bounds*) * Int.t (** Period *) - (** Valid between the two bounds, and considered as a repetition - of the given period. Only one period is stored; consequently, - strong updates are impossible. *) | Invalid (** Valid nowhere. Typically used for the NULL base, or for function pointers. *) @@ -71,6 +67,7 @@ module SetLattice: Lattice_type.Lattice_Hashconsed_Set with module O = Hptset +module Validity: Datatype.S with type t = validity (** [pretty_addr fmt base] pretty-prints the name of [base] on [fmt], with a leading ampersand if it is a variable *) @@ -86,7 +83,7 @@ val pretty_validity : Format.formatter -> validity -> unit val validity : t -> validity val validity_from_type : Cil_types.varinfo -> validity -val valid_range: validity -> Lattice_Interval_Set.Int_Intervals.t +val valid_range: validity -> Int_Intervals_sig.itv option (** {2 Finding bases} *) @@ -120,6 +117,8 @@ val null : t val is_null : t -> bool +val null_set: Hptset.t +(** Set containing only the base {!null}. *) val min_valid_absolute_address: unit -> Int.t val max_valid_absolute_address: unit -> Int.t @@ -157,8 +156,7 @@ val register_memory_var : Cil_types.varinfo -> validity -> t (** Memory variables are variables not present in the source of the program. They are created only to fill the contents of another variable, or - through dynamic allocation. Their field [vlogic] is set to true. *) - (* TODO: change name of [vlogic] field. *) + through dynamic allocation. Their field [vsource] is set to false. *) (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/ai/int_Base.ml frama-c-20150201+sodium+dfsg/src/ai/int_Base.ml --- frama-c-20140301+neon+dfsg/src/ai/int_Base.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/int_Base.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -48,8 +48,8 @@ type t = i (*= Top | Value of Integer.t *) let name = "Int_Base.t" let structural_descr = - Structural_descr.t_sum [| [| Datatype.Big_int.packed_descr |] |] - let reprs = Top :: List.map (fun v -> Value v) Datatype.Big_int.reprs + Structural_descr.t_sum [| [| Datatype.Integer.packed_descr |] |] + let reprs = Top :: List.map (fun v -> Value v) Datatype.Integer.reprs let equal = equal let compare = compare let hash = hash diff -Nru frama-c-20140301+neon+dfsg/src/ai/int_Base.mli frama-c-20150201+sodium+dfsg/src/ai/int_Base.mli --- frama-c-20140301+neon+dfsg/src/ai/int_Base.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/int_Base.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/ai/int_Intervals.ml frama-c-20150201+sodium+dfsg/src/ai/int_Intervals.ml --- frama-c-20140301+neon+dfsg/src/ai/int_Intervals.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/int_Intervals.ml 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,29 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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 Offsetmap.Int_Intervals + +(* +Local Variables: +compile-command: "make -C ../.." +End: +*) diff -Nru frama-c-20140301+neon+dfsg/src/ai/int_Intervals.mli frama-c-20150201+sodium+dfsg/src/ai/int_Intervals.mli --- frama-c-20140301+neon+dfsg/src/ai/int_Intervals.mli 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/int_Intervals.mli 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,38 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) + +(** Sets of intervals with a lattice structure. Consecutive intervals are + automatically fused. *) + +(* For compilation reasons, the type of this module is in + {!Int_Intervals_sig}, and the implementation is in + {!Offsetmap.Int_Intervals}. *) + +include module type of Int_Intervals_sig + with type t = Offsetmap.Int_Intervals.t + + +(* +Local Variables: +compile-command: "make -C ../.. byte" +End: +*) diff -Nru frama-c-20140301+neon+dfsg/src/ai/int_Intervals_sig.mli frama-c-20150201+sodium+dfsg/src/ai/int_Intervals_sig.mli --- frama-c-20140301+neon+dfsg/src/ai/int_Intervals_sig.mli 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/int_Intervals_sig.mli 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,79 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) + +(** Sets of intervals with a lattice structure. Consecutive intervals are + automatically fused. *) + +open Abstract_interp + +type itv = Int.t * Int.t + +include Lattice_type.Full_Lattice +include Lattice_type.With_Error_Top + +val is_top: t -> bool + +val inject_bounds: Int.t -> Int.t -> t +val inject_itv: itv -> t +val inject: itv list -> t +val from_ival_size: Ival.t -> Int_Base.t -> t + (** Conversion from an ival, which represents the beginning of + each interval. The size if taken from the [Int_Base.t] argument. + If the result contains more than [-plevel] arguments, it is + automatically over-approximated. *) + +val from_ival_size_under: Ival.t -> Int_Base.t -> t + (** Same as [from_ival_size], except that the result is an under-approximation + if the ival points to too many locations *) + +val project_set: t -> itv list +(** May raise [Error_Top]. + As intervals are not represented as lists, this function has an overhead. + Use iterators whenever possible instead. *) + +val project_singleton: t -> itv option + +(** Iterators *) +val fold: (itv -> 'a -> 'a) -> t -> 'a -> 'a +(** May raise [Error_Top] *) +val iter: (itv -> unit) -> t -> unit +(** May raise [Error_Top] *) + +val pretty_typ: Cil_types.typ option -> t Pretty_utils.formatter + (** Pretty-printer that supposes the intervals are subranges of + a C type, and use the type to print nice offsets *) + +val range_covers_whole_type: Cil_types.typ -> t -> bool + (** Does the interval cover the entire range of bits that are valid + for the given type. *) + + +(**/**) + +val pretty_debug: t Pretty_utils.formatter + + +(* +Local Variables: +compile-command: "make -C ../.. byte" +End: +*) diff -Nru frama-c-20140301+neon+dfsg/src/ai/ival.ml frama-c-20150201+sodium+dfsg/src/ai/ival.ml --- frama-c-20140301+neon+dfsg/src/ai/ival.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/ival.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -41,6 +41,12 @@ let get_small_cardinal () = !small_cardinal +(* Set to true to log imprecisely-implemented transfer functions. *) +let log_imprecision = false +let log_imprecision s = + if log_imprecision then + Kernel.result ~once:true ~current:true "Imprecise transfer function: %s" s + exception Can_not_subdiv let can_not_subdiv = Can_not_subdiv @@ -50,6 +56,7 @@ let packed_descr = Structural_descr.p_float + (* OCaml compare does not distinguish -0. and 0. This one does. *) external compare : float -> float -> int = "float_compare_total" "noalloc" (* The Caml version below is fine but the C version is faster and @@ -137,10 +144,11 @@ sqrt let sqrt = wrap_un sqrt - let cos = wrap_un cos let sin = wrap_un sin let exp = wrap_un exp + let log = wrap_un log + let log10 = wrap_un log10 let minus_one = -1.0 let one = 1.0 @@ -219,6 +227,8 @@ let classify_float = Pervasives.classify_float end +module F_Set = Set.Make(F) (* Uses our really total compare function *) + module Float_abstract = struct exception Bottom @@ -228,7 +238,7 @@ let denormal_treatment = Denormals let _ = DenormalsandFTZ (* VP: silence warning about unused DenormalsandFTZ *) - module Private_Couple : sig + module FRange : sig type t = private I of F.t * F.t val inject : F.t -> F.t -> t val inject_r : F.t -> F.t -> (bool * t) @@ -238,57 +248,58 @@ type t = I of F.t * F.t let inject b e = - assert - ( if not (F.le b e) - then begin - Format.printf "assertion 0936 failed.@\n%a .. %a@." - (F.pretty_normal ~use_hex:true) b - (F.pretty_normal ~use_hex:true) e; - false - end - else true); + if not (F.le b e) then + Kernel.abort "Invali bounds for float interval@\n%a .. %a@." + (F.pretty_normal ~use_hex:true) b (F.pretty_normal ~use_hex:true) e; I(b, e) let inject_r b e = - if F.is_neg_infinity e || F.is_infinity b - then raise Bottom; - - let c = F.classify_float e in - let overflow_alarm, e = - match c with - FP_infinite | FP_subnormal -> + if F.is_neg_infinity e || F.is_infinity b then raise Bottom; + let infinite_e, e = + match F.classify_float e with + | FP_infinite -> let pos = F.le_ieee F.zero e in - ( match c, pos with - FP_infinite, true -> true, F.max_float - | FP_infinite, false -> raise Bottom - | _, true when denormal_treatment = FTZ -> - false, F.zero - | _, false when denormal_treatment <> Denormals -> - false, F.minus_zero - | _ -> false, e) - - | _ -> false, e - in - let c = F.classify_float b in - let overflow_alarm, b = - match c with - FP_infinite | FP_subnormal -> - let pos = F.le_ieee F.zero b in - ( match c, pos with - FP_infinite, true -> raise Bottom - | FP_infinite, false -> true, F.most_negative_float - | _, false when denormal_treatment = FTZ -> - overflow_alarm, F.minus_zero - | _, true when denormal_treatment <> Denormals -> - overflow_alarm, F.zero - | _ -> overflow_alarm, b) - | _ -> overflow_alarm, b + if pos then + true, F.max_float + else + raise Bottom + | FP_subnormal -> + let pos = F.le_ieee F.zero e in begin + match pos with + | true when denormal_treatment = FTZ -> + false, F.zero + | false when denormal_treatment <> Denormals -> + false, F.minus_zero + | _ -> false, e + end + | FP_normal | FP_zero -> false, e + | FP_nan -> assert false in - overflow_alarm, inject b e + let infinite_b, b = + match F.classify_float b with + | FP_infinite -> + let pos = F.le_ieee F.zero b in + if pos then + raise Bottom + else + true, F.most_negative_float + | FP_subnormal -> + let pos = F.le_ieee F.zero b in begin + match pos with + | false when denormal_treatment = FTZ -> + false, F.minus_zero + | true when denormal_treatment <> Denormals -> + false, F.zero + | _ -> false, b + end + | FP_normal | FP_zero -> false, b + | FP_nan -> assert false + in + infinite_b || infinite_e, inject b e end - type t = Private_Couple.t + type t = FRange.t (* open Private_Couple *) (* Workaround for Ocaml bug 5718 *) let structural_descr = @@ -296,23 +307,23 @@ let packed_descr = Structural_descr.pack structural_descr - let inject = Private_Couple.inject + let inject = FRange.inject - let inject_r = Private_Couple.inject_r + let inject_r = FRange.inject_r - let min_and_max_float (Private_Couple.I(b,e)) = b, e + let min_and_max_float (FRange.I(b,e)) = b, e let top = inject F.most_negative_float F.max_float exception Nan_or_infinite = F.Nan_or_infinite - let compare (Private_Couple.I(b1,e1)) (Private_Couple.I(b2,e2)) = + let compare (FRange.I(b1,e1)) (FRange.I(b2,e2)) = let r = F.compare b1 b2 in if r <> 0 then r else F.compare e1 e2 - let pretty fmt (Private_Couple.I(b,e)) = + let pretty fmt (FRange.I(b,e)) = if F.equal b e then - Format.fprintf fmt "%a" F.pretty b + Format.fprintf fmt "{%a}" F.pretty b else begin if (Kernel.FloatRelative.get()) then begin @@ -328,27 +339,27 @@ F.pretty e end - let hash (Private_Couple.I(b,e)) = + let hash (FRange.I(b,e)) = F.hash b + (5 * F.hash e) let inject_singleton x = inject x x let zero = inject_singleton F.zero - let compare_min (Private_Couple.I(m1,_)) (Private_Couple.I(m2,_)) = + let compare_min (FRange.I(m1,_)) (FRange.I(m2,_)) = F.compare m1 m2 - let compare_max (Private_Couple.I(_, m1)) (Private_Couple.I(_, m2)) = + let compare_max (FRange.I(_, m1)) (FRange.I(_, m2)) = F.compare m2 m1 - let is_included (Private_Couple.I(b1, e1)) (Private_Couple.I(b2, e2)) = + let is_included (FRange.I(b1, e1)) (FRange.I(b2, e2)) = F.le b2 b1 && F.le e1 e2 - let join (Private_Couple.I(b1, e1)) (Private_Couple.I(b2, e2)) = + let join (FRange.I(b1, e1)) (FRange.I(b2, e2)) = inject (F.min b1 b2) (F.max e1 e2) (*@ raises [Bottom] *) - let meet (Private_Couple.I(b1, e1)) (Private_Couple.I(b2, e2)) = + let meet (FRange.I(b1, e1)) (FRange.I(b2, e2)) = if F.le b2 e1 && F.le b1 e2 then inject (F.max b1 b2) (F.min e1 e2) @@ -356,7 +367,7 @@ let contains_zero = is_included zero - let fold_split n f (Private_Couple.I(b, e)) acc = + let fold_split n f (FRange.I(b, e)) acc = let bound = ref b in let acc = ref acc in begin try @@ -373,27 +384,27 @@ pretty (!bound, e); *) f (inject !bound e) !acc - let contains_a_zero (Private_Couple.I(b, e)) = + let contains_a_zero (FRange.I(b, e)) = F.le_ieee b F.zero && F.le_ieee F.zero e let is_zero f = 0 = compare zero f - let is_singleton (Private_Couple.I(b, e)) = F.equal b e + let is_singleton (FRange.I(b, e)) = F.equal b e - let neg_float v = - let Private_Couple.I(b, e) = v in + let neg (FRange.I(b, e)) = inject (F.neg e) (F.neg b) (* do not round because exact operation *) type rounding_mode = Any | Nearest_Even + type float_kind = Float32 | Float64 + let top_single_precision_float = inject F.most_negative_single_precision_float F.max_single_precision_float - let round_to_single_precision_float - ~rounding_mode (Private_Couple.I(b, e) as _arg) = + let round_to_single_precision_float ~rounding_mode (FRange.I(b, e)) = if rounding_mode = Any then Floating_point.set_round_downward () else Floating_point.set_round_nearest_even (); @@ -426,18 +437,13 @@ | _ -> false, e in infb || infe, inject b e - (* in - Format.printf "Casting double -> float %a -> %B %a@." - pretty _arg - fl - pretty _res; - fl, _res - *) + (* Format.printf "Casting double -> float %a -> %B %a@." + pretty _arg fl pretty _res; fl, _res *) (* Bitwise reinterpretation of a double to a 64-bit integer. signedness of the integer is defined by ~signed *) - let bits_of_float64 ~signed (Private_Couple.I(l, u)) = + let bits_of_float64 ~signed (FRange.I(l, u)) = if F.is_negative u then begin if signed then @@ -462,7 +468,7 @@ (* Bitwise reinterpretation of a float to a 32-bit integer. signedness of the integer is defined by ~signed *) - let bits_of_float32 ~signed (Private_Couple.I(l, u)) = + let bits_of_float32 ~signed (FRange.I(l, u)) = assert (F.equal l (Floating_point.round_to_single_precision_float l)); assert (F.equal u (Floating_point.round_to_single_precision_float u)); if F.is_negative u @@ -490,9 +496,7 @@ - let add_float rounding_mode v1 v2 = - let Private_Couple.I(b1, e1) = v1 in - let Private_Couple.I(b2, e2) = v2 in + let add rounding_mode (FRange.I(b1, e1)) (FRange.I(b2, e2)) = if rounding_mode = Any then Floating_point.set_round_downward () else Floating_point.set_round_nearest_even (); @@ -502,11 +506,9 @@ let es = F.add e1 e2 in inject_r bs es - let sub_float rounding_mode v1 v2 = add_float rounding_mode v1 (neg_float v2) + let sub rounding_mode v1 v2 = add rounding_mode v1 (neg v2) - let mult_float rounding_mode v1 v2 = - let Private_Couple.I(b1, e1) = v1 in - let Private_Couple.I(b2, e2) = v2 in + let mul rounding_mode (FRange.I(b1, e1)) (FRange.I(b2, e2)) = if rounding_mode = Any then Floating_point.set_round_downward () else Floating_point.set_round_nearest_even (); @@ -530,8 +532,7 @@ in inject_r min max - let div_float rounding_mode - (Private_Couple.I(b1, e1)) (Private_Couple.I(b2, e2) as v2) = + let div rounding_mode (FRange.I(b1, e1)) (FRange.I(b2, e2) as v2) = if contains_a_zero v2 then raise Nan_or_infinite; if rounding_mode = Any @@ -556,7 +557,7 @@ in inject_r min max - let sqrt_float rounding_mode (Private_Couple.I(b, e)) = + let sqrt rounding_mode (FRange.I(b, e)) = if rounding_mode = Any then Floating_point.set_round_downward () else Floating_point.set_round_nearest_even (); @@ -569,116 +570,113 @@ true, F.minus_zero end in - if rounding_mode = Any - then Floating_point.set_round_upward (); + if rounding_mode = Any then Floating_point.set_round_upward (); let max = F.sqrt e in + if rounding_mode = Any then Floating_point.set_round_nearest_even (); alarm, inject min max let minus_one_one = inject F.minus_one F.one - let cos_float v = - Floating_point.set_round_nearest_even (); - match v with - Private_Couple.I(b, e) when F.equal b e -> - let c = F.cos b in - inject c c - | _ -> - minus_one_one + let cos (FRange.I(b, e)) = + if F.equal b e then begin + Floating_point.set_round_nearest_even (); + let c = F.cos b in + inject c c + end + else minus_one_one + + let sin (FRange.I(b, e)) = + if F.equal b e then begin + Floating_point.set_round_nearest_even (); + let c = F.sin b in + inject c c + end + else minus_one_one - let sin_float v = + let cos_precise (FRange.I(b, e)) = Floating_point.set_round_nearest_even (); - match v with - | Private_Couple.I(b, e) when F.equal b e -> let c = F.sin b in inject c c - | _ -> minus_one_one + if F.equal b e + then + let c = F.cos b in + inject c c + else if F.le_ieee b F.minus_ff || F.le_ieee F.ff e + then minus_one_one + else begin + let allpos = F.le_ieee F.zero b in + let allneg = F.le_ieee e F.zero in + if F.le_ieee F.m_minus_pi b && F.le_ieee e F.m_pi + then begin + if allpos + then + inject (F.cos e) (F.cos b) + else if allneg + then + inject (F.cos b) (F.cos e) + else + inject (F.min (F.cos b) (F.cos e)) F.one + end + else if allpos || allneg + then inject F.minus_one (F.max (F.cos b) (F.cos e)) + else minus_one_one + end - let cos_float_precise v = + let sin_precise (FRange.I(b, e)) = Floating_point.set_round_nearest_even (); - match v with - | Private_Couple.I(b, e) -> - if F.equal b e - then - let c = F.cos b in - inject c c - else if F.le_ieee b F.minus_ff || F.le_ieee F.ff e - then minus_one_one - else begin - let allpos = F.le_ieee F.zero b in - let allneg = F.le_ieee e F.zero in - if F.le_ieee F.m_minus_pi b && F.le_ieee e F.m_pi - then begin - if allpos - then - inject (F.cos e) (F.cos b) - else if allneg - then - inject (F.cos b) (F.cos e) - else - inject (F.min (F.cos b) (F.cos e)) F.one - end - else if allpos || allneg - then inject F.minus_one (F.max (F.cos b) (F.cos e)) - else minus_one_one - end + if F.equal b e + then let c = F.sin b in inject c c + else if F.le_ieee b F.minus_ff || F.le_ieee F.ff e + then minus_one_one + else if F.le_ieee e F.m_pi_2 + then begin + if F.le_ieee F.m_minus_pi_2 b + then inject (F.sin b) (F.sin e) + else if F.le_ieee e F.m_minus_pi_2 + then inject (F.sin e) (F.sin b) + else inject F.minus_one (F.max (F.sin b) (F.sin e)) + end + else if F.le_ieee F.m_pi_2 b + then + inject (F.sin e) (F.sin b) + else if F.le_ieee F.m_minus_pi_2 b + then + inject (F.min (F.sin b) (F.sin e)) F.one + else minus_one_one - let sin_float_precise v = + (** See discussion in the .mli about [rounding_mode] *) + let exp rounding_mode (FRange.I(b, e)) = + if rounding_mode = Any + then Floating_point.set_round_downward () + else Floating_point.set_round_nearest_even (); + let min = F.exp b in + if rounding_mode = Any then Floating_point.set_round_upward (); + let max = F.exp e in Floating_point.set_round_nearest_even (); - match v with - | Private_Couple.I(b, e) -> - if F.equal b e - then let c = F.sin b in inject c c - else if F.le_ieee b F.minus_ff || F.le_ieee F.ff e - then minus_one_one - else if F.le_ieee e F.m_pi_2 - then begin - if F.le_ieee F.m_minus_pi_2 b - then inject (F.sin b) (F.sin e) - else if F.le_ieee e F.m_minus_pi_2 - then inject (F.sin e) (F.sin b) - else inject F.minus_one (F.max (F.sin b) (F.sin e)) - end - else if F.le_ieee F.m_pi_2 b - then - inject (F.sin e) (F.sin b) - else if F.le_ieee F.m_minus_pi_2 b - then - inject (F.min (F.sin b) (F.sin e)) F.one - else minus_one_one - - let exp_float v = - match v with - Private_Couple.I(b, e) -> - inject (F.exp b) (F.exp e) + inject_r min max - let widen (Private_Couple.I(b1,e1)) (Private_Couple.I(b2, e2)) = + let widen (FRange.I(b1,e1)) (FRange.I(b2, e2)) = assert (F.le b2 b1); assert (F.le e1 e2); let b = if F.equal b2 b1 then b2 else F.widen_down b2 in let e = if F.equal e2 e1 then e2 else F.widen_up e2 in inject b e - let equal_float_ieee f1 f2 = - let Private_Couple.I(b1, e1) = f1 in - let Private_Couple.I(b2, e2) = f2 in - let intersects = - F.le_ieee b1 e2 && F.le_ieee b2 e1 - in - if not intersects - then true, false - else if F.equal_ieee b1 e1 && F.equal_ieee b2 e2 - then false, true - else true, true - - let maybe_le_ieee_float f1 f2 = - let Private_Couple.I(b1, _e1) = f1 in - let Private_Couple.I(_b2, e2) = f2 in - F.le_ieee b1 e2 - - let maybe_lt_ieee_float f1 f2 = - let Private_Couple.I(b1, _e1) = f1 in - let Private_Couple.I(_b2, e2) = f2 in - F.lt_ieee b1 e2 + let equal_float_ieee (FRange.I(b1, e1)) (FRange.I(b2, e2)) = + let intersects = + F.le_ieee b1 e2 && F.le_ieee b2 e1 + in + if not intersects + then true, false + else if F.equal_ieee b1 e1 && F.equal_ieee b2 e2 + then false, true + else true, true + + let maybe_le_ieee_float (FRange.I(b1, _e1)) (FRange.I(_b2, e2)) = + F.le_ieee b1 e2 + + let maybe_lt_ieee_float (FRange.I(b1, _e1)) (FRange.I(_b2, e2)) = + F.lt_ieee b1 e2 - let diff (Private_Couple.I(b1, e1) as f1) (Private_Couple.I(b2, e2)) = + let diff (FRange.I(b1, e1) as f1) (FRange.I(b2, e2)) = if F.le b2 b1 && F.le e1 e2 then raise Bottom else if F.le b2 e1 && F.le e1 e2 @@ -687,16 +685,21 @@ then inject e2 e1 else f1 - let filter_le_f allmodes ~typ_loc (Private_Couple.I(b1, e1) as f1) e2 = + let filter_le_f allmodes fkind (FRange.I(b1, e1) as f1) e2 = let e2 = if F.equal_ieee F.zero e2 then F.zero else - ( match allmodes, typ_loc with - false, Cil_types.TFloat (Cil_types.FFloat, _) -> - Floating_point.set_round_downward (); - Floating_point.round_to_single_precision_float e2 - | _ -> e2 ) + match fkind with + | Float32 -> + (* Preserve the invariant that the returned interval has 32bits + floating-point bounds *) + if allmodes then + Floating_point.set_round_upward () (* conservative direction *) + else + Floating_point.set_round_downward () (* precise direction *); + Floating_point.round_to_single_precision_float e2 + | Float64 -> e2 in if not (F.le b1 e2) then raise Bottom @@ -704,10 +707,10 @@ then f1 else inject b1 e2 - let filter_le allmodes ~typ_loc f1 (Private_Couple.I(_b2, e2) as _f2) = - filter_le_f allmodes ~typ_loc f1 e2 + let filter_le allmodes fkind f1 (FRange.I(_b2, e2) as _f2) = + filter_le_f allmodes fkind f1 e2 - let filter_lt allmodes ~typ_loc (Private_Couple.I(b1, _e1) as f1) (Private_Couple.I(_b2, e2)) = + let filter_lt allmodes fkind (FRange.I(b1, _e1) as f1) (FRange.I(_b2, e2)) = if F.le_ieee e2 b1 then raise Bottom else @@ -718,18 +721,21 @@ then F.neg_min_denormal else F.round_down e2 in - filter_le_f allmodes ~typ_loc f1 e2 + filter_le_f allmodes fkind f1 e2 - let filter_ge_f allmodes ~typ_loc (Private_Couple.I(b1, e1) as f1) b2 = + let filter_ge_f allmodes fkind (FRange.I(b1, e1) as f1) b2 = let b2 = if F.equal_ieee F.minus_zero b2 then F.minus_zero else - ( match allmodes, typ_loc with - false, Cil_types.TFloat (Cil_types.FFloat, _) -> - Floating_point.set_round_upward (); - Floating_point.round_to_single_precision_float b2 - | _ -> b2 ) + match fkind with + | Float32 -> (* see comments in filter_le_f *) + if allmodes then + Floating_point.set_round_downward () + else + Floating_point.set_round_upward (); + Floating_point.round_to_single_precision_float b2 + | Float64 -> b2 in if not (F.le b2 e1) then raise Bottom @@ -737,10 +743,10 @@ then f1 else inject b2 e1 - let filter_ge allmodes ~typ_loc f1 (Private_Couple.I(b2, _e2)) = - filter_ge_f allmodes ~typ_loc f1 b2 + let filter_ge allmodes fkind f1 (FRange.I(b2, _e2)) = + filter_ge_f allmodes fkind f1 b2 - let filter_gt allmodes ~typ_loc (Private_Couple.I(_b1, e1) as f1) (Private_Couple.I(b2, _e2)) = + let filter_gt allmodes fkind (FRange.I(_b1, e1) as f1) (FRange.I(b2, _e2)) = if F.le_ieee e1 b2 then raise Bottom else @@ -751,9 +757,43 @@ then F.min_denormal else F.round_up b2 in - filter_ge_f allmodes ~typ_loc f1 b2 + filter_ge_f allmodes fkind f1 b2 - let subdiv_float_interval ~size (Private_Couple.I(l, u) as i) = + let filter_le_ge_lt_gt op allmodes fkind f1 f2 = match op with + | Cil_types.Le -> filter_le allmodes fkind f1 f2 + | Cil_types.Ge -> filter_ge allmodes fkind f1 f2 + | Cil_types.Lt -> filter_le allmodes fkind f1 f2 + | Cil_types.Gt -> filter_ge allmodes fkind f1 f2 + | _ -> f1 + + + let pos_double = inject 0. 0. + + (** See discussion in the .mli about [rounding_mode] *) + let log_float_aux flog rounding_mode (FRange.I(b, e) as v) = + if rounding_mode = Any + then Floating_point.set_round_downward () + else Floating_point.set_round_nearest_even (); + let alarm, min = + if F.lt_ieee F.zero b + then false, flog b + else begin + (* we want to compute the smallest denormal bigger than zero -> use + allroundingmodes=false. This reduction may raise Bottom *) + let FRange.I(b_reduced, _) = filter_gt false Float64 v pos_double in + true, flog b_reduced + end + in + if rounding_mode = Any then Floating_point.set_round_upward (); + let max = flog e in + Floating_point.set_round_nearest_even (); + let alarm', r = inject_r min max in + (alarm || alarm' (* alarm' should always be false*)), r + + let log = log_float_aux F.log + let log10 = log_float_aux F.log10 + + let subdiv_float_interval ~size (FRange.I(l, u) as i) = let midpoint = F.avg l u in let midpointl, midpointu = if size <> 32 && size <> 64 @@ -808,7 +848,7 @@ module Widen_Arithmetic_Value_Set = struct - include Datatype.Big_int.Set + include Datatype.Integer.Set let pretty fmt s = if is_empty s then Format.fprintf fmt "{}" @@ -970,12 +1010,12 @@ Array.iter Int.pretty fmt s end -let compare_elt_min elt min = +let min_le_elt min elt = match min with | None -> true | Some m -> Int.le m elt -let compare_elt_max elt max = +let max_ge_elt max elt = match max with | None -> true | Some m -> Int.ge m elt @@ -1034,6 +1074,7 @@ let zero = small_nums.(0) let one = small_nums.(1) +let minus_one = Set [| Int.minus_one |] let zero_or_one = Set [| Int.zero ; Int.one |] let is_zero x = x == zero @@ -1103,9 +1144,7 @@ | Top _ | Set _ -> raise Float_abstract.Nan_or_infinite let in_interval x min max r modu = - (Int.equal (Int.pos_rem x modu) r) && - (compare_elt_min x min) && - (compare_elt_max x max) + Int.equal (Int.pos_rem x modu) r && min_le_elt min x && max_ge_elt max x let array_mem v a = let l = Array.length a in @@ -1212,6 +1251,7 @@ let inject_range min max = inject_top min max Int.zero Int.one let top_float = Float Float_abstract.top +let top_single_precision_float = Float Float_abstract.top_single_precision_float let unsafe_make_top_from_set_4 s = if debug_cardinal then assert (O.cardinal s >= 2); @@ -1313,37 +1353,7 @@ exception Unforceable -let force_float kind i = - match i with - Float _ -> false, i - | Set _ when is_zero i -> false, i - | Top _ | Set _ -> - ( match kind with - Cil_types.FDouble -> - ( try - ( match min_and_max i with - Some mn, Some mx -> - let mn, mx = - if Int.le Int.zero mn && Int.le mx Int.bits_of_max_float - then mn, mx - else if Int.le Int.min_int64 mn && - Int.le mx Int.bits_of_most_negative_float - then mx, mn - else raise Unforceable - in - let red, fa = - Float_abstract.inject_r - (Int64.float_of_bits (Int.to_int64 mn)) - (Int64.float_of_bits (Int.to_int64 mx)) - in - assert (not red); - let f = inject_float fa in - (* Format.printf "cv: %a -> %a@." pretty i pretty f; *) - false, f - | _, _ -> true, top_float) - with Unforceable -> - true, top_float ) - | _ -> false, i) + let compare_min_int t1 t2 = let m1, _ = min_and_max t1 in @@ -1360,8 +1370,8 @@ let _, m2 = min_and_max t2 in match m1, m2 with None, None -> 0 - | None, Some _ -> 1 - | Some _, None -> -1 + | None, Some _ -> -1 + | Some _, None -> 1 | Some m1, Some m2 -> Int.compare m2 m1 @@ -1416,7 +1426,7 @@ result let compute_first_common mn1 mn2 r modu = - if mn1 == None && mn2 == None + if mn1 = None && mn2 = None then None else let m = @@ -1429,7 +1439,7 @@ Some (Int.round_up_to_r m r modu) let compute_last_common mx1 mx2 r modu = - if mx1 == None && mx2 == None + if mx1 = None && mx2 = None then None else let m = @@ -1613,6 +1623,7 @@ let narrow v1 v2 = match v1, v2 with + | _, Set [||] | Set [||], _ -> bottom | Float _, Float _ | (Top _| Set _), (Top _ | Set _) -> meet v1 v2 (* meet is exact *) | v, (Top _ as t) | (Top _ as t), v when equal t top -> v @@ -1624,7 +1635,81 @@ (* ill-typed case. It is better to keep the operation symmetric *) top -let link _ = assert false +(* Given a set of elements that is an under-approximation, returns an + ival (while maintaining the ival invariants that the "Set" + constructor is used only for small sets of elements. *) +let set_to_ival_under set = + let card = Int.Set.cardinal set in + if card <= !small_cardinal + then + (let a = Array.create card Int.zero in + ignore(Int.Set.fold (fun elt i -> + Array.set a i elt; + i + 1) set 0); + share_array a card) + else + (* If by chance the set is contiguous. *) + if (Int.equal + (Int.sub (Int.Set.max_elt set) (Int.Set.min_elt set)) + (Int.of_int (card - 1))) + then Top( Some(Int.Set.min_elt set), + Some(Int.Set.max_elt set), + Int.one, + Int.zero) + (* Else: arbitrarily drop some elements of the under approximation. *) + else + let a = Array.create !small_cardinal Int.zero in + log_imprecision "set_to_ival_under"; + try + ignore(Int.Set.fold (fun elt i -> + if i = !small_cardinal then raise Exit; + Array.set a i elt; + i + 1) set 0); + assert false + with Exit -> Set a +;; + +let link v1 v2 = match v1, v2 with + | Set a1, Set a2 -> + let s1 = Array.fold_right Int.Set.add a1 Int.Set.empty in + let s2 = Array.fold_right Int.Set.add a2 s1 in + set_to_ival_under s2 + | Top(mn1,mx1,r1,m1), Top(mn2,mx2,r2,m2) -> + if Int.equal r1 r2 && Int.equal m1 m2 + then + let min = match mn1,mn2 with + | Some(a), Some(b) -> Some(Int.min a b) + | _ -> None in + let max = match mx1,mx2 with + | Some(a), Some(b) -> Some(Int.max a b) + | _ -> None in + inject_top min max r1 m1 + else v1 (* No best abstraction anyway. *) + | Top(mn,mx,r,m), Set s | Set s, Top(mn,mx,r,m) -> + let max = match mx with + | None -> None + | Some(max) -> + let curmax = ref max in + for i = 0 to (Array.length s) - 1 do + let elt = s.(i) in + if Int.equal elt (Int.add !curmax m) + then curmax := elt + done; + Some(!curmax) in + let min = match mn with + | None -> None + | Some(min) -> + let curmin = ref min in + for i = (Array.length s) - 1 downto 0 do + let elt = s.(i) in + if Int.equal elt (Int.sub !curmin m) + then curmin := elt + done; + Some(!curmin) in + inject_top min max r m + | _ -> bottom +;; + let join v1 v2 = let result = @@ -1851,8 +1936,12 @@ rem_is_included r1 m1 r2 m2 | Top _, Set _ -> false (* Top _ represents more elements than can be represented by Set _ *) + | Set [||], Top _ -> true | Set s, Top(min, max, r, modu) -> - array_for_all (fun x -> in_interval x min max r modu) s + (* Inclusion of bounds is needed for the entire inclusion *) + min_le_elt min s.(0) && max_ge_elt max s.(Array.length s-1) + && (Int.equal Int.one modu || (*Top side contains all integers, we're done*) + array_for_all (fun x -> Int.equal (Int.pos_rem x modu) r) s) | Set s1, Set s2 -> array_subset s1 s2 | Float(f1), Float(f2) -> Float_abstract.is_included f1 f2 @@ -1884,8 +1973,8 @@ (array_for_all (fun e -> let psize = Int.pred size in - (not (compare_elt_min (Int.add e psize) mi)) || - (not (compare_elt_max (Int.sub e psize) ma)) || + (not (min_le_elt mi (Int.add e psize))) || + (not (max_ge_elt ma (Int.sub e psize))) || ( Int.ge modu size && let re = Int.pos_rem (Int.sub e r) modu in Int.is_zero re || @@ -2040,7 +2129,7 @@ let add_singleton_int i v = match v with - | Float _ -> top + | Float _ -> assert false | Set s -> apply_bin_1_strict_incr Int.add i s | Top (mn, mx, r, m) -> let incr v = Int.add i v in @@ -2052,7 +2141,7 @@ let rec add_int v1 v2 = match v1,v2 with - Float _, _ | _, Float _ -> top + | Float _, _ | _, Float _ -> assert false | Set [| x |], Set s | Set s, Set [| x |]-> apply_bin_1_strict_incr Int.add x s | Set s1, Set s2 -> @@ -2060,6 +2149,8 @@ | Top(mn1,mx1,r1,m1), Top(mn2,mx2,r2,m2) -> let m = Int.pgcd m1 m2 in let r = Int.rem (Int.add r1 r2) m in + (* ML: min1+min2 % modu = max1 + max2 % modu = r1 + r2 % modu; + no need to trim the bounds here. *) let mn = try Some (Int.round_up_to_r (opt2 Int.add mn1 mn2) r m) @@ -2081,10 +2172,54 @@ else add_int t (unsafe_make_top_from_array s) - (* TODO rename to neg_int *) -let neg v = +let add_int_under v1 v2 = match v1,v2 with + | Float _, _ | _, Float _ -> assert false + | Set [| x |], Set s | Set s, Set [| x |]-> + apply_bin_1_strict_incr Int.add x s + | Set s1, Set s2 -> + let set = + Array.fold_left (fun acc i1 -> + Array.fold_left (fun acc i2 -> + Int.Set.add (Int.add i1 i2) acc) acc s2) + Int.Set.empty s1 + in set_to_ival_under set + | Top(min1,max1,r1,modu1) , Top(min2,max2,r2,modu2) + when Int.equal modu1 modu2 -> + (* Note: min1+min2 % modu = max1 + max2 % modu = r1 + r2 % modu; + no need to trim the bounds here. *) + let r = Int.rem (Int.add r1 r2) modu1 in + let min = match min1, min2 with + | Some min1, Some min2 -> Some (Int.add min1 min2) + | _ -> None in + let max = match max1, max2 with + | Some max1, Some max2 -> Some (Int.add max1 max2) + | _ -> None in + inject_top min max r modu1 + + (* In many cases, there is no best abstraction; for instance when + modu1 divides modu2, a part of the resulting interval is + congruent to modu1, and a larger part is congruent to modu2. In + general, one can take the intersection. In any case, this code + should be rarely called. *) + | Top _, Top _ -> bottom + | Set s, (Top _ as t) | (Top _ as t), Set s -> + let l = Array.length s in + if l = 0 + then bottom + else if l = 1 + then (* only one element: precise. *) + add_singleton_int s.(0) t + else begin + log_imprecision "add_int_under"; + (* Not worse than another computation. *) + add_singleton_int s.(0) t + end +;; + + +let neg_int v = match v with - | Float _ -> top + | Float _ -> assert false | Set s -> map_set_strict_decr Int.neg s | Top(mn,mx,r,m) -> share_top @@ -2093,7 +2228,8 @@ (Int.pos_rem (Int.neg r) m) m -let sub v1 v2 = add_int v1 (neg v2) +let sub_int v1 v2 = add_int v1 (neg_int v2) +let sub_int_under v1 v2 = add_int_under v1 (neg_int v2) type ext_value = Ninf | Pinf | Val of Int.t let inject_min = function None -> Ninf | Some m -> Val m @@ -2314,9 +2450,7 @@ | Float _ -> top | Top(mn1,mx1,r1,m1) -> let incr = Int.mul f in - if Int.is_zero f - then singleton_zero - else if Int.gt f Int.zero + if Int.gt f Int.zero then let modu = incr m1 in share_top @@ -2332,7 +2466,9 @@ then apply_bin_1_strict_incr Int.mul f s else apply_bin_1_strict_decr Int.mul f s -let scale_div ~pos f v = + + +let scale_div_common ~pos f v degenerate_ival degenerate_float = assert (not (Int.is_zero f)); let div_f = if pos @@ -2353,7 +2489,7 @@ let r = if negative then Int.sub r1 m1 else r1 in (Int.pos_rem (div_f r) modu), modu else (* degeneration*) - Int.zero, Int.one + degenerate_ival r1 m1 in let divf_mn1 = opt1 div_f mn1 in let divf_mx1 = opt1 div_f mx1 in @@ -2369,7 +2505,20 @@ map_set_decr div_f s else map_set_incr div_f s - | Float _ -> top + | Float _ -> degenerate_float + +let scale_div ~pos f v = + scale_div_common ~pos f v (fun _ _ -> Int.zero, Int.one) top +;; + +let scale_div_under ~pos f v = + try + (* TODO: a more precise result could be obtained by transforming + Top(min,max,r,m) into Top(min,max,r/f,m/gcd(m,f)). But this is + more complex to implement when pos or f is negative. *) + scale_div_common ~pos f v (fun _r _m -> raise Exit) bottom + with Exit -> bottom +;; let div_set x sy = Array.fold_left @@ -2515,8 +2664,8 @@ Int.ge set.(s-1) Int.one, Some (Int.max (Int.abs set.(0)) (Int.abs set.(s-1))) | Top (mn, mx, _, _) -> - compare_elt_min Int.minus_one mn, - compare_elt_max Int.one mx, + min_le_elt mn Int.minus_one, + max_ge_elt mx Int.one, (match mn, mx with | Some mn, Some mx -> Some (Int.max (Int.abs mn) (Int.abs mx)) | _ -> None) @@ -2620,7 +2769,12 @@ else best_effort r m | Top (_,_,r,m) -> best_effort r m - | Set s -> map_set_exnsafe rem_f s + | Set s -> begin + let all = + create_all_values ~size:(Int.to_int size) ~signed ~modu:Int.one + in + if is_included value all then value else map_set_exnsafe rem_f s + end | Float f -> let low, high = if Int.equal size big_int_64 @@ -2642,8 +2796,6 @@ pretty result; *) if equal result value then value else result -let top_single_precision_float = Float Float_abstract.top_single_precision_float - let cast_float ~rounding_mode v = match v with | Float f -> @@ -2719,41 +2871,24 @@ (* Format.printf "mul. result : %a@\n" pretty result;*) result -let shift_left ~size x y = - try - let min = smallest_above Int.zero y in - let min = Int.two_power min in - let max = match size with - | None -> - (match max_int y with Some v -> v | None -> raise No_such_element) - | Some size -> largest_below (Int.pred size) y - in - let max = Int.two_power max in - let factor = inject_top (Some min) (Some max) Int.zero min in - (* Format.printf "shift_left %a factor:%a@." pretty y pretty factor; *) - mul factor x - with No_such_element -> - bottom +(** Computes [x (op) ({y >= 0} * 2^n)], as an auxiliary function for + [shift_left] and [shift_right]. [op] and [scale] must verify + [scale a b == op (inject_singleton a) b] *) +let shift_aux scale op (x: tt) (y: tt) = + let y = narrow (inject_range (Some Int.zero) None) y in + match y with + | Set s -> + Array.fold_left (fun acc n -> join acc (scale (Int.two_power n) x)) bottom s + | _ -> + let min_factor = Extlib.opt_map Int.two_power (min_int y) in + let max_factor = Extlib.opt_map Int.two_power (max_int y) in + let modu = match min_factor with None -> Int.one | Some m -> m in + let factor = inject_top min_factor max_factor Int.zero modu in + op x factor + +let shift_right x y = shift_aux (scale_div ~pos:true) div x y +let shift_left x y = shift_aux scale mul x y -let shift_right ~size x y = - let result = - try - let min = smallest_above Int.zero y in - let max = match size with - | None -> - (match max_int y with Some v -> v | None -> raise No_such_element) - | Some size -> largest_below (Int.pred size) y - in - Int.fold - (fun n acc -> join acc (scale_div ~pos:true (Int.two_power n) x)) - ~inf:min ~sup:max ~step:Int.one - bottom - with No_such_element -> - bottom - in - (* Format.printf "shift_right %a >> %a -> %a@." - pretty x pretty y pretty result; *) - result let interp_boolean ~contains_zero ~contains_non_zero = match contains_zero, contains_non_zero with @@ -2777,10 +2912,12 @@ let filter_lt_int max v = filter_le_int (opt1 Int.pred max) v let filter_gt_int min v = filter_ge_int (opt1 Int.succ min) v -let filter_le v1 v2 = filter_le_int (max_int v2) v1 -let filter_ge v1 v2 = filter_ge_int (min_int v2) v1 -let filter_lt v1 v2 = filter_lt_int (max_int v2) v1 -let filter_gt v1 v2 = filter_gt_int (min_int v2) v1 +let filter_le_ge_lt_gt_int op i1 i2 = match op with + | Cil_types.Le -> filter_le_int (max_int i2) i1 + | Cil_types.Ge -> filter_ge_int (min_int i2) i1 + | Cil_types.Lt -> filter_lt_int (max_int i2) i1 + | Cil_types.Gt -> filter_gt_int (min_int i2) i1 + | _ -> i1 let filter_float filter v1 v2 = try @@ -2788,23 +2925,19 @@ let f2 = project_float v2 in inject_float (filter f1 f2) with - Float_abstract.Nan_or_infinite -> v1 + | Float_abstract.Nan_or_infinite -> v1 | Float_abstract.Bottom -> bottom -let filter_le_float allmodes ~typ_loc = - filter_float (Float_abstract.filter_le allmodes ~typ_loc) -let filter_ge_float allmodes ~typ_loc = - filter_float (Float_abstract.filter_ge allmodes ~typ_loc) -let filter_lt_float allmodes ~typ_loc = - filter_float (Float_abstract.filter_lt allmodes ~typ_loc) -let filter_gt_float allmodes ~typ_loc = - filter_float (Float_abstract.filter_gt allmodes ~typ_loc) - -let diff _ _ = assert false +let filter_le_ge_lt_gt_float op allmodes fkind f1 f2 = match op with + | Cil_types.Le -> filter_float (Float_abstract.filter_le allmodes fkind) f1 f2 + | Cil_types.Ge -> filter_float (Float_abstract.filter_ge allmodes fkind) f1 f2 + | Cil_types.Lt -> filter_float (Float_abstract.filter_lt allmodes fkind) f1 f2 + | Cil_types.Gt -> filter_float (Float_abstract.filter_gt allmodes fkind) f1 f2 + | _ -> f1 let diff_if_one value rem = match rem, value with - Set [| v |], Set a -> + | Set [| v |], Set a -> let index = array_mem v a in if index >= 0 then @@ -2836,6 +2969,10 @@ | _ -> value (* TODO: more cases: Float *) +let diff value rem = + log_imprecision "Ival.diff"; + diff_if_one value rem + let rec extract_bits ~start ~stop ~size v = match v with | Set s -> @@ -2883,6 +3020,17 @@ (cast ~size ~signed:false ~value:v) (create_all_values ~size:siz ~signed:false ~modu:Int.one) +let compare_min_max min max = + match min, max with + | None,_ -> -1 + | _,None -> -1 + | Some min, Some max -> Int.compare min max + +let compare_max_min max min = + match max, min with + | None,_ -> 1 + | _,None -> 1 + | Some max, Some min -> Int.compare max min let compare_C f v1 v2 = let min1 = min_int v1 in @@ -2928,22 +3076,30 @@ let cast_float_to_int ~signed ~size iv = let all = create_all_values ~size ~signed ~modu:Int.one in + let min_all = Extlib.the (min_int all) in + let max_all = Extlib.the (max_int all) in try - let f = project_float iv in - let Float_abstract.Private_Couple.I(min,max) = f in - let min_int = Floating_point.truncate_to_integer min in - let max_int = Floating_point.truncate_to_integer max in + let Float_abstract.FRange.I(min,max) = project_float iv in + let min_int, ov_min = + try + Floating_point.truncate_to_integer min, false + with Floating_point.Float_Non_representable_as_Int64 sign -> + min_all, (sign = Floating_point.Neg) + in + let max_int, ov_max = + try + Floating_point.truncate_to_integer max, false + with Floating_point.Float_Non_representable_as_Int64 sign -> + max_all, (sign = Floating_point.Pos) + in assert (Int.compare min_int max_int <= 0); + let ov_min = ov_min || Int.lt min_int min_all in + let ov_max = ov_max || Int.gt max_int max_all in let r = inject_range (Some min_int) (Some max_int) in - if is_included r all - then false, false, r - else false, true, (narrow r all) + false, (ov_min, ov_max), (narrow r all) with - | Floating_point.Float_Non_representable_as_Int64 -> - (* raised by Floating_point.truncate_to_integer *) - false, true, all | Float_abstract.Nan_or_infinite -> (* raised by project_float *) - true, true, all + true, (true, true), all let cast_float_to_int_inverse ~single_precision i = match min_and_max i with @@ -2980,7 +3136,10 @@ let of_int64 i = inject_singleton (Int.of_int64 i) -let negbil = Int.neg Int.billion_one +(* These are the bounds of the range of integers that can be represented + exactly as 64 bits double values *) +let double_min_exact_integer = Int.neg (Int.two_power_of_int 53) +let double_max_exact_integer = Int.two_power_of_int 53 let cast_int_to_float rounding_mode v = match min_and_max v with @@ -2990,21 +3149,94 @@ Floating_point.set_round_nearest_even (); (* PC: Do not even ask *) let b = F.of_float (Int.to_float min) in let e = F.of_float (Int.to_float max) in + (* Note that conversion from integer to float in modes other than + round-to-nearest is unavailable when using Big_int and Linux because + 1- Big_int implements the conversion to float with a conversion from + the integer to a decimal representation (!) followed by strtod() + 2- Linux does not honor the FPU direction flag in strtod(), as it + arguably should http://stackoverflow.com/a/2595848/139746 *) if rounding_mode = Float_abstract.Nearest_Even - || (Int.le negbil min) && (Int.le max Int.billion_one) - (* PC: No, really, don't ask *) + || (Int.le double_min_exact_integer min + && Int.le max double_max_exact_integer) then true (* ok *), inject_float (Float_abstract.inject b e) else begin - let b = F.round_down b - in - let e = F.round_up e - in + let b = F.round_down b in + let e = F.round_up e in true, inject_float (Float_abstract.inject b e) end with - F.Nan_or_infinite | Floating_point.Float_Non_representable_as_Int64 -> + | F.Nan_or_infinite + | Floating_point.Float_Non_representable_as_Int64 _ -> false, top_float) +let force_float kind i = + match i with + | Float _ -> false, i + | Set _ when is_zero i -> false, i + | Set _ when is_bottom i -> true, i + | Top _ | Set _ -> + (* Convert a range of integers to a range of floats. Float are ordered this + way : if [min_i], [max_i] are the bounds of the signed integer type that + has the same number of bits as the floating point type, and [min_f] + [max_f] are the integer representation of the most negative and most + positive finite float of the type, and < is signed integer comparison, + we have: min_i < min_f < min_f+1 < -1 < 0 < max_f < max_f+1 < max_i + | | | | | | | | + --finite-- -not finite- -finite- -not finite- + | | |<---------> | | |<---------> + -0. -max +inf NaNs +0. max +inf NaNs + The float are of the same sign as the integer they convert into. + Furthermore, the conversion function is increasing on the positive + interval, and decreasing on the negative one. *) + let reinterpret size conv min_f max_f = + let i = cast ~size:(Integer.of_int size) ~signed:true ~value:i in + match min_and_max i with + | Some mn, Some mx -> + let range mn mx = + let red, fa = Float_abstract.inject_r mn mx in + assert (not red); + inject_float fa + in + if Int.le Int.zero mn && Int.le mx max_f + then range (conv mn) (conv mx) + else if Int.le mx min_f + then range (conv mx) (conv mn) + else begin + match i with + | Set a -> + let s = ref F_Set.empty in + for i = 0 to Array.length a - 1 do + let f = conv a.(i) in + if (Int.le Int.zero a.(i) && Int.le a.(i) max_f) || + Int.le a.(i) min_f + then s := F_Set.add f !s + else raise Unforceable + done; + (* cannot fail, [i] is not bottom, hence [a] is not empty *) + let mn, mx = F_Set.min_elt !s, F_Set.max_elt !s in + range mn mx + | _ -> raise Unforceable + end + | _, _ -> raise Unforceable + in + let open Floating_point in + match kind with + | Cil_types.FDouble -> begin + let conv v = Int64.float_of_bits (Int.to_int64 v) in + try + false, + reinterpret 64 conv bits_of_most_negative_double bits_of_max_double + with Unforceable -> true, top_float + end + | Cil_types.FFloat -> begin + let conv v = Int32.float_of_bits (Int64.to_int32 (Int.to_int64 v)) in + try + false, + reinterpret 32 conv bits_of_most_negative_float bits_of_max_float + with Unforceable -> true, top_single_precision_float + end + | Cil_types.FLongDouble -> true, top_float + let set_bits mn mx = match mn, mx with Some mn, Some mx -> @@ -3029,6 +3261,124 @@ (* assert (O.cardinal o = s); *) inject_ps (Pre_set (o, s)) +let bitwise_and_intervals ~size ~signed v1 v2 = + let max_int_v1, max_int_v2 as max_int_v1_v2 = max_int v1, max_int v2 in + let min_int_v1, min_int_v2 as min_int_v1_v2 = min_int v1, min_int v2 in + let half_range = Int.two_power_of_int (pred size) in + let minint = Int.neg half_range in + let vmax = + match max_int_v1_v2 with + | Some maxv1, Some maxv2 -> + if Int.lt maxv1 Int.zero && Int.lt maxv2 Int.zero + then begin + Some (match min_int_v1_v2 with + Some minv1, Some minv2 -> + pos_max_land minv1 maxv1 minv2 maxv2 + | _ -> assert false) + end + else + let max1 = (* improved min of maxv1 and maxv2*) + try + let bi1 = smallest_above Int.zero v1 in + let bi2 = smallest_above Int.zero v2 in + pos_max_land bi1 maxv1 bi2 maxv2 + with No_such_element -> minint + in + let max2 = (* improved min of maxv1 and altmax2*) + try + let altmax2 = + Int.add half_range (largest_below Int.minus_one v2) + in + let bi1 = smallest_above Int.zero v1 in + let bi2 = + Int.add half_range (smallest_above minint v2) + in + pos_max_land bi1 maxv1 bi2 altmax2 + with No_such_element -> minint + in + let max3 = (* improved min of maxv2 and altmax1*) + try + let altmax1 = + Int.add half_range (largest_below Int.minus_one v1) + in + let bi2 = smallest_above Int.zero v2 in + let bi1 = + Int.add half_range (smallest_above minint v1) + in + pos_max_land bi2 maxv2 bi1 altmax1 + with No_such_element -> minint + in + (* Format.printf "bitwise_and v1 %a v2 %a maxv1 %a maxv2 %a \ + max1 max2 max3 %a %a %a@." + pretty v1 pretty v2 + Int.pretty maxv1 Int.pretty maxv2 + Int.pretty max1 Int.pretty max2 Int.pretty max3; *) + Some (Int.max max1 (Int.max max2 max3)) + | _ -> None + in + let somenegativev1 = intersects v1 negative in + let somenegativev2 = intersects v2 negative in + let vmin = + if somenegativev1 && somenegativev2 + then Some minint + else if somenegativev1 || somenegativev2 + then some_zero + else begin + let bits1 = set_bits min_int_v1 max_int_v1 in + let bits2 = set_bits min_int_v2 max_int_v2 in + let min_a = Int.logand bits1 bits2 in + let min_a = + if not signed + then + let rec find_mask x bit acc = + if Int.is_zero (Int.logand x bit) + then acc + else + find_mask + x + (Int.shift_right bit Int.one) + (Int.logor bit acc) + in + match min_int_v1_v2 with + Some m1, Some m2 -> + let mask1 = find_mask bits1 half_range Int.zero in + let min_b = Int.logand mask1 m2 in + let mask2 = find_mask bits2 half_range Int.zero in + let min_c = Int.logand mask2 m1 in + (* Format.printf + "bitwise_and v1 %a v2 %a min_b %a min_c %a@." + pretty v1 pretty v2 + Int.pretty min_b Int.pretty min_c; *) + Int.max (Int.max min_a min_b) min_c + | _ -> assert false + else min_a + in + (* Format.printf "bitwise_and v1 %a v2 %a bits1 %a bits2 %a@." + pretty v1 pretty v2 + Int.pretty bits1 Int.pretty bits2; *) + Some min_a + end + in + vmin, vmax + +(* [common_low_bits v] returns the common pattern between the + least-significant bits of all the elements of the Ival [v]. + The pattern is in the form [lower_bits, mask] where [mask] + indicates the consecutive least significant bits that are + common between all elements, and + [lower_bits] indicates their values. *) +let common_low_bits ~size v = + match v with + | Float _ -> assert false + | Top(_,_,r,m) -> + if Int.is_zero (Int.logand m (Int.pred m)) + then (* m is a power of two *) + r, Int.pred m + else Int.zero, Int.zero (* TODO *) + | Set [| v |] -> + v, Int.pred (Int.two_power_of_int size) + | Set _ -> Int.zero, Int.zero (* TODO *) + let bitwise_and ~size ~signed v1 v2 = if is_bottom v1 || is_bottom v2 then bottom @@ -3044,129 +3394,46 @@ | _ -> v2 in match v1, v2 with - Float _, _ | _, Float _ -> assert false - | Top _, other | other, Top _ -> - let half_range = Int.two_power_of_int (pred size) in - let minint = Int.neg half_range in - let max_int_v1, max_int_v2 as max_int_v1_v2 = max_int v1, max_int v2 in - let min_int_v1, min_int_v2 as min_int_v1_v2 = min_int v1, min_int v2 in - let vmax = - match max_int_v1_v2 with - Some maxv1, Some maxv2 -> - if Int.lt maxv1 Int.zero && Int.lt maxv2 Int.zero - then begin - Some (match min_int_v1_v2 with - Some minv1, Some minv2 -> - pos_max_land minv1 maxv1 minv2 maxv2 - | _ -> assert false) - end - else - let max1 = (* improved min of maxv1 and maxv2*) - try - let bi1 = smallest_above Int.zero v1 in - let bi2 = smallest_above Int.zero v2 in - pos_max_land bi1 maxv1 bi2 maxv2 - with No_such_element -> minint - in - let max2 = (* improved min of maxv1 and altmax2*) - try - let altmax2 = - Int.add half_range (largest_below Int.minus_one v2) - in - let bi1 = smallest_above Int.zero v1 in - let bi2 = - Int.add half_range (smallest_above minint v2) - in - pos_max_land bi1 maxv1 bi2 altmax2 - with No_such_element -> minint - in - let max3 = (* improved min of maxv2 and altmax1*) - try - let altmax1 = - Int.add half_range (largest_below Int.minus_one v1) - in - let bi2 = smallest_above Int.zero v2 in - let bi1 = - Int.add half_range (smallest_above minint v1) - in - pos_max_land bi2 maxv2 bi1 altmax1 - with No_such_element -> minint - in - (* Format.printf "bitwise_and v1 %a v2 %a maxv1 %a maxv2 %a \ - max1 max2 max3 %a %a %a@." - pretty v1 pretty v2 - Int.pretty maxv1 Int.pretty maxv2 - Int.pretty max1 Int.pretty max2 Int.pretty max3; *) - Some (Int.max max1 (Int.max max2 max3)) - | _ -> None - in - let somenegativev1 = intersects v1 negative in - let somenegativev2 = intersects v2 negative in - let vmin = - if somenegativev1 && somenegativev2 - then Some minint - else if somenegativev1 || somenegativev2 - then some_zero - else begin - let bits1 = set_bits min_int_v1 max_int_v1 in - let bits2 = set_bits min_int_v2 max_int_v2 in - let min_a = Int.logand bits1 bits2 in - let min_a = - if not signed - then - let rec find_mask x bit acc = - if Int.is_zero (Int.logand x bit) - then acc - else - find_mask - x - (Int.shift_right bit Int.one) - (Int.logor bit acc) - in - match min_int_v1_v2 with - Some m1, Some m2 -> - let mask1 = find_mask bits1 half_range Int.zero in - let min_b = Int.logand mask1 m2 in - let mask2 = find_mask bits2 half_range Int.zero in - let min_c = Int.logand mask2 m1 in -(* Format.printf - "bitwise_and v1 %a v2 %a min_b %a min_c %a@." - pretty v1 pretty v2 - Int.pretty min_b Int.pretty min_c; *) - Int.max (Int.max min_a min_b) min_c - | _ -> assert false - else min_a - in -(* Format.printf "bitwise_and v1 %a v2 %a bits1 %a bits2 %a@." - pretty v1 pretty v2 - Int.pretty bits1 Int.pretty bits2; *) - Some min_a - end - in - let result = inject_top vmin vmax Int.zero Int.one in - ( match other with - Top _ | Float _ -> result - | Set s -> - if - array_for_all - (fun elt -> - Int.ge elt Int.zero && - Int.popcount elt <= !small_cardinal_log) - s - then - let result2 = - Array.fold_left - (fun acc elt -> - join - (sub_bits elt) - acc) - bottom - s - in - narrow result result2 - else result) + | Float _, _ | _, Float _ -> assert false | Set s1, Set s2 -> - apply2_v Int.logand s1 s2 + apply2_v Int.logand s1 s2 + | Top _, other | other, Top _ -> + let min, max = bitwise_and_intervals ~signed ~size v1 v2 in + let lower_bits1, mask1 = common_low_bits ~size v1 in + let lower_bits2, mask2 = common_low_bits ~size v2 in + let mask = Int.logand mask1 mask2 in + let modu = Int.succ mask in + let r = Int.logand lower_bits1 (Int.logand lower_bits2 mask) in + let min = match min with + | Some min -> Some (Int.round_up_to_r ~min ~r ~modu) + | _ -> min + in + let max = match max with + | Some max -> Some (Int.round_down_to_r ~max ~r ~modu) + | _ -> max + in + let result = inject_top min max r modu in + ( match other with + Top _ | Float _ -> result + | Set s -> + if + array_for_all + (fun elt -> + Int.ge elt Int.zero && + Int.popcount elt <= !small_cardinal_log) + s + then + let result2 = + Array.fold_left + (fun acc elt -> + join + (sub_bits elt) + acc) + bottom + s + in + narrow result result2 + else result) let pretty_debug = pretty let name = "ival" diff -Nru frama-c-20140301+neon+dfsg/src/ai/ival.mli frama-c-20150201+sodium+dfsg/src/ai/ival.mli --- frama-c-20140301+neon+dfsg/src/ai/ival.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/ival.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -25,6 +25,8 @@ Frama-C versions. Contact us if you need stable APIs. @plugin development guide *) +open Abstract_interp + module F : sig type t val of_float : float -> t @@ -46,23 +48,28 @@ exception Bottom type rounding_mode = Any | Nearest_Even + type float_kind = + | Float32 (** 32 bits float (a.k.a 'float' C type) *) + | Float64 (** 64 bits float (a.k.a 'double' C type) *) + (** [inject] creates an abstract float interval. - Does not handle infinites. + Does not handle infinites or NaN. Does not enlarge subnormals to handle flush-to-zero modes *) val inject : F.t -> F.t -> t - (** [inject_r] creates an abstract float interval. - It handles infinites and flush-to-zero. - the returned boolean is true if there was reduction *) - val inject_r : F.t -> F.t -> bool * t + (** [inject_r] creates an abstract float interval. It handles infinites and + flush-to-zero, but not NaN. The returned boolean is true if a bound was + infinite. May raise {!Bottom} when no part of the result would be + finite. *) + val inject_r : F.t -> F.t -> bool (* not finite *) * t val inject_singleton : F.t -> t val min_and_max_float : t -> F.t * F.t val top : t - val add_float : rounding_mode -> t -> t -> bool * t - val sub_float : rounding_mode -> t -> t -> bool * t - val mult_float : rounding_mode -> t -> t -> bool * t - val div_float : rounding_mode -> t -> t -> bool * t + val add : rounding_mode -> t -> t -> bool * t + val sub : rounding_mode -> t -> t -> bool * t + val mul : rounding_mode -> t -> t -> bool * t + val div : rounding_mode -> t -> t -> bool * t val contains_zero : t -> bool val compare : t -> t -> int val pretty : Format.formatter -> t -> unit @@ -76,28 +83,52 @@ val contains_a_zero : t -> bool val is_singleton : t -> bool - val neg_float : t -> t - val sqrt_float : rounding_mode -> t -> bool * t + val minus_one_one : t - val cos_float : t -> t - val cos_float_precise : t -> t - val sin_float : t -> t - val sin_float_precise : t -> t - val exp_float : t -> t + + val neg : t -> t + + val cos : t -> t + val cos_precise : t -> t + val sin : t -> t + val sin_precise : t -> t + + val sqrt : rounding_mode -> t -> bool * t + + (** Discussion regarding -all-rounding-modes and the functions below. + + Support for fesetround(FE_UPWARD) and fesetround(FE_DOWNWARD) seems to + be especially poor, including in not-so-old versions of Glibc + (https://sourceware.org/bugzilla/show_bug.cgi?id=3976). The code for + {!exp}, {!log} and {!log10} is correct wrt. -all-rounding-modes ONLY + if the C implementation of these functions is correct in directed + rounding modes. Otherwise, anything could happen, including crashes. For + now, unless the Libc is known to be reliable, these functions should be + called with [rounding_mode=Nearest_Even] only *) + + val exp : rounding_mode -> t -> bool * t + val log: rounding_mode -> t -> bool * t + val log10: rounding_mode -> t -> bool * t + (** All three functions may raise {!Bottom}. Can only be called to approximate + a computation on double (float64). *) + val widen : t -> t -> t val equal_float_ieee : t -> t -> bool * bool val maybe_le_ieee_float : t -> t -> bool val maybe_lt_ieee_float : t -> t -> bool val diff : t -> t -> t - val filter_le : bool -> typ_loc:Cil_types.typ -> t -> t -> t - val filter_ge : bool -> typ_loc:Cil_types.typ -> t -> t -> t - val filter_lt : bool -> typ_loc:Cil_types.typ -> t -> t -> t - val filter_gt : bool -> typ_loc:Cil_types.typ -> t -> t -> t + + val filter_le_ge_lt_gt : Cil_types.binop -> bool -> float_kind -> t -> t -> t + (** [filter_le_ge_lt_gt op allroundingmodes fkind f1 f2] attemps to reduce + [f1] into [f1'] so that the relation [f1' op f2] holds. [fkind] is + the type of [f1] and [f1'] (not necessarily of [f2]). If + [allroundingmodes] is set, all possible rounding modes are taken into + acount. [op] must be [Le], [Ge], [Lt] or [Gt] *) end type tt = private - | Set of Abstract_interp.Int.t array + | Set of Int.t array | Float of Float_abstract.t (** [Top(min, max, rest, modulo)] represents the interval between [min] and [max], congruent to [rest] modulo [modulo]. A value of @@ -105,8 +136,22 @@ (resp. +infinity). [modulo] is > 0, and [0 <= rest < modulo]. Actual [Top] is thus represented by Top(None,None,Int.zero,Int.one) *) - | Top of Abstract_interp.Int.t option * Abstract_interp.Int.t option * - Abstract_interp.Int.t * Abstract_interp.Int.t + | Top of Int.t option * Int.t option * Int.t * Int.t + +(** {2 General guidelines of this module} + + - Functions suffixed by [_int] expect arguments that are integers. Hence, + they will fail on an ival with constructor [Float]. Conversely, [_float] + suffixed functions expect float arguments: the constructor [Float], or + the singleton set [ [| Int.zero |] ], that can be tested by {!is_zero}. + The function {!force_float} forces a bit-level conversion from the integer + representation to the floating-point one. + + - see the comment in {!Lattice_type} about over- and under-approximations, + and exact operations. +*) + + module Widen_Hints : sig include FCSet.S with type elt = Integer.t @@ -118,6 +163,7 @@ val hints_for_signed_int_types: unit -> t end +exception Error_Bottom include Datatype.S_with_collections with type t = tt include Lattice_type.Full_AI_Lattice_with_cardinality @@ -128,11 +174,16 @@ val partially_overlaps : size:Abstract_interp.Int.t -> t -> t -> bool val add_int : t -> t -> t -(** Overapproximation of the addition of two integer (ie. not [Float]) ivals. *) +(** Addition of two integer (ie. not [Float]) ivals. *) +val add_int_under : t -> t -> t +(** Underapproximation of the same operation *) val add_singleton_int: Integer.t -> t -> t -(** Overapproximation of the addition of an integer ival with an integer *) -val neg : t -> t -val sub : t -> t -> t +(** Addition of an integer ival with an integer. Exact operation. *) + +val neg_int : t -> t +(** Negation of an integer ival. Exact operation. *) +val sub_int : t -> t -> t +val sub_int_under: t -> t -> t val min_int : t -> Abstract_interp.Int.t option (** A [None] result means the argument is unbounded. *) @@ -153,6 +204,7 @@ val zero : t val one : t +val minus_one : t val is_zero : t -> bool val is_one : t -> bool @@ -161,7 +213,11 @@ val top_single_precision_float : t val project_float : t -> Float_abstract.t (** @raise F.Nan_or_infinite when the float may be Nan or infinite. *) + val force_float: Cil_types.fkind -> t -> bool * t + (** Reinterpret the given value as a float of the given kind. If the + returned boolean is [true], some of the values may not be representable + as finite floats. *) val in_interval : Abstract_interp.Int.t -> @@ -242,19 +298,38 @@ val subdiv : size:int -> t -> t * t +(** [compare_min_float m1 m2] returns 1 if the float interval [m1] has a + better min bound (i.e. greater) than the float interval [m2]. *) val compare_min_float : t -> t -> int +(** [compare_max_float m1 m2] returns 1 if the float interval [m1] has a + better max bound (i.e. lower) than the float interval [m2]. *) val compare_max_float : t -> t -> int +(** [compare_min_int m1 m2] returns 1 if the int interval [m1] has a + better min bound (i.e. greater) than the int interval [m2]. *) val compare_min_int : t -> t -> int +(** [compare_max_int m1 m2] returns 1 if the int interval [m1] has a + better max bound (i.e. lower) than the int interval [m2]. *) val compare_max_int : t -> t -> int - val scale : Abstract_interp.Int.t -> t -> t +(** [scale f v] returns the interval of elements [x * f] for [x] in [v]. + The operation is exact, except when [v] is a float. *) + val scale_div : pos:bool -> Abstract_interp.Int.t -> t -> t (** [scale_div ~pos:false f v] is an over-approximation of the set of elements [x / f] for [x] in [v]. [scale_div ~pos:true f v] is an over-approximation of the set of elements [x pos_div f] for [x] in [v]. *) + +val scale_div_under : pos:bool -> Abstract_interp.Int.t -> t -> t +(** [scale_div_under ~pos:false f v] is an under-approximation of the + set of elements [x / f] for [x] in [v]. + + [scale_div_under ~pos:true f v] is an under-approximation of the + set of elements [x pos_div f] for [x] in [v]. *) + + val negative : t val div : t -> t -> t val scale_rem : pos:bool -> Abstract_interp.Int.t -> t -> t @@ -266,8 +341,8 @@ val c_rem : t -> t -> t val mul : t -> t -> t -val shift_left : size:Abstract_interp.Int.t option -> t -> t -> t -val shift_right : size:Abstract_interp.Int.t option -> t -> t -> t +val shift_left: t -> t -> t +val shift_right: t -> t -> t val interp_boolean : contains_zero:bool -> contains_non_zero:bool -> t (** Extract bits from [start] to [stop] from the given Ival, [start] @@ -278,34 +353,43 @@ val create_all_values : modu:Abstract_interp.Int.t -> signed:bool -> size:int -> t val all_values : size:Abstract_interp.Int.t -> t -> bool -val filter_le_int : Abstract_interp.Int.t option -> t -> t -val filter_ge_int : Abstract_interp.Int.t option -> t -> t -val filter_lt_int : Abstract_interp.Int.t option -> t -> t -val filter_gt_int : Abstract_interp.Int.t option -> t -> t -val filter_le : t -> t -> t -val filter_ge : t -> t -> t -val filter_lt : t -> t -> t -val filter_gt : t -> t -> t -val filter_le_float : bool -> typ_loc:Cil_types.typ -> t -> t -> t -val filter_ge_float : bool -> typ_loc:Cil_types.typ -> t -> t -> t -val filter_lt_float : bool -> typ_loc:Cil_types.typ -> t -> t -> t -val filter_gt_float : bool -> typ_loc:Cil_types.typ -> t -> t -> t + +val filter_le_ge_lt_gt_int : Cil_types.binop -> t -> t -> t +(** [filter_le_ge_lt_gt_int op i1 i2] reduces [i1] into [i1'] so that + [i1' op i2] holds. [i1] is assumed to be an integer *) + +val filter_le_ge_lt_gt_float : + Cil_types.binop -> bool -> Float_abstract.float_kind -> t -> t -> t +(** Same as [Float_abstract.filter_le_ge_lt_gt], except that the arguments + are now of type {!t}. The first argument must be a floating-point value. +*) + +(** In the results of [min_int] and [max_int], [None] represents the +corresponding infinity. [compare_max_min ma mi] compares [ma] to [mi], +interpreting [None] for [ma] as +infinity and [None] for [mi] as +-infinity. *) +val compare_max_min : Integer.t option -> Integer.t option -> int +(** In the results of [min_int] and [max_int], [None] represents the +corresponding infinity. [compare_min_max mi ma] compares [ma] to [ma], +interpreting [None] for [ma] as +infinity and [None] for [mi] as +-infinity. *) +val compare_min_max : Integer.t option -> Integer.t option -> int val compare_C : - (Abstract_interp.Int.t option -> - Abstract_interp.Int.t option -> - Abstract_interp.Int.t option -> Abstract_interp.Int.t option -> 'a) -> + (Integer.t option -> + Integer.t option -> + Integer.t option -> Integer.t option -> 'a) -> t -> t -> 'a val max_max : - Abstract_interp.Int.t option -> - Abstract_interp.Int.t option -> Abstract_interp.Int.t option + Integer.t option -> + Integer.t option -> Integer.t option val scale_int_base : Int_Base.t -> t -> t val cast_float_to_int : - signed:bool -> size:int -> t -> (** Top *) bool * (** Overflow *) bool * t + signed:bool -> size:int -> t -> (** non-finite *) bool * (** Overflow, in each direction *) (bool * bool) * t val cast_float_to_int_inverse : single_precision:bool -> tt -> tt val of_int : int -> t val of_int64 : int64 -> t val cast_int_to_float : Float_abstract.rounding_mode -> t -> bool * t -val cast : size:Abstract_interp.Int.t -> signed:bool -> value:t -> t +val cast : size:Integer.t -> signed:bool -> value:t -> t val cast_float : rounding_mode:Float_abstract.rounding_mode -> t -> bool * t val cast_double : t -> bool * t val pretty_debug : Format.formatter -> t -> unit diff -Nru frama-c-20140301+neon+dfsg/src/ai/lattice_Interval_Set.ml frama-c-20150201+sodium+dfsg/src/ai/lattice_Interval_Set.ml --- frama-c-20140301+neon+dfsg/src/ai/lattice_Interval_Set.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/lattice_Interval_Set.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,502 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -open Abstract_interp - -module V = Int - -module Interval = Datatype.Pair(V)(V) -type itv = Interval.t - - -let plevel = ref 200 - -module Unhashconsed_Int_Intervals = struct - - exception Error_Top - - type tt = Top | Set of itv list - - let bottom = Set [] - let top = Top - - let _check t = - assert ( - match t with - | Top -> true - | Set s -> - let last_stop = ref None in - List.for_all - (fun (a,b) -> V.compare a b <= 0 && - match !last_stop with - None -> last_stop := Some b; true - | Some l -> last_stop := Some b; V.gt a l) - s) ; - t - - let hash l = match l with - | Top -> 667 - | Set l -> - List.fold_left - (fun acc p -> 371 * acc + Interval.hash p) - 443 - l - -(* - let cardinal_zero_or_one v = - match v with - | Top -> false - | Set [x,y] -> V.equal x y - | Set _ -> false - - let cardinal_less_than v n = - match v with - | Top -> raise Not_less_than - | Set l -> - let nn = V.of_int n in - let rec aux l card = match l with - | [] -> card - | (x,y)::t -> - let card = V.add card (V.length x y) in - if V.gt card nn - then raise Not_less_than - else aux t card - in - V.to_int (aux l V.zero) -*) - - let compare e1 e2 = - if e1 == e2 then 0 - else - match e1,e2 with - | Top,_ -> 1 - | _, Top -> -1 - | Set e1, Set e2 -> - Extlib.list_compare Interval.compare e1 e2 - - let equal e1 e2 = compare e1 e2 = 0 - - let pretty fmt t = - match t with - | Top -> Format.fprintf fmt "TopISet" - | Set s -> - if s==[] then Format.fprintf fmt "BottomISet" - else - Pretty_utils.pp_iter - ~pre:"@[{" ~suf:"}@]" ~sep:";@ " - List.iter - (fun fmt (b,e) -> - Format.fprintf fmt "[%a..%a]" V.pretty b V.pretty e) - fmt s - - let meet v1 v2 = - if v1 == v2 then v1 - else - (match v1,v2 with - | Top, v | v, Top -> v - | Set s1 , Set s2 -> Set ( - let rec aux acc (l1:itv list) (l2:itv list) = match l1,l2 with - | [],_|_,[] -> List.rev acc - | (((b1,e1)) as i1)::r1, - (((b2,e2)) as i2)::r2 -> - let c = V.compare b1 b2 in - if c = 0 then (* intervals start at the same value *) - let ce = V.compare e1 e2 in - if ce=0 then - aux ((b1,e1)::acc) r1 r2 (* same intervals *) - else - (* one interval is included in the other *) - let min,not_min,min_tail,not_min_tail = - if ce > 0 then i2,i1,r2,r1 else - i1,i2,r1,r2 - in - aux ((min)::acc) min_tail - ((( - (snd (min), - snd (not_min)))):: - not_min_tail) - else (* intervals start at different values *) - let _min,min_end,not_min_begin,min_tail,not_min_from = - if c > 0 - then b2,e2,b1,r2,l1 - else b1,e1,b2,r1,l2 - in - let c_min = V.compare min_end not_min_begin in - if c_min >= 0 then - (* intersecting intervals *) - aux acc - (( - (not_min_begin,min_end)) - ::min_tail) - not_min_from - else - (* disjoint intervals *) - aux acc min_tail not_min_from - in aux [] s1 s2)) - - let join v1 v2 = - if v1 == v2 then v1 - else - (match v1,v2 with - | Top, _ | _, Top -> Top - | Set (s1:itv list) , Set (s2:itv list) -> - let rec aux (l1:itv list) (l2:itv list) = match l1,l2 with - | [],l|l,[] -> l - | (b1,e1)::r1,(b2,e2)::r2 -> - let c = V.compare b1 b2 in - let min_begin,min_end,min_tail,not_min_from = - if c >= 0 then b2,e2,r2,l1 - else b1,e1,r1,l2 - in - let rec enlarge_interval stop l1 look_in_me = - match look_in_me with - | [] -> stop,l1,[] - | ((b,e))::r -> - if V.compare stop (V.pred b) >= 0 - then - if V.compare stop e >= 0 - then enlarge_interval stop l1 r - else enlarge_interval e r l1 - else stop,l1,look_in_me - in - let stop,new_l1,new_l2 = - enlarge_interval - min_end - min_tail - not_min_from - in ((min_begin,stop)):: - (aux new_l1 new_l2) - in Set (aux s1 s2)) - - let inject l = (Set l) - - let inject_one ~size ~value = - (inject [value,V.add value (V.pred size)]) - - let inject_bounds min max = - if V.le min max - then inject [min,max] - else bottom - - let is_included t1 t2 = - (t1 == t2) || - match t1,t2 with - | _,Top -> true - | Top,_ -> false - | Set s1,Set s2 -> - let rec aux l1 l2 = match l1 with - | [] -> true - | i::r -> - let rec find (b,e as arg) l = - match l with - | [] -> raise Not_found - | (b',e')::r -> - if V.compare b b' >= 0 - && V.compare e' e >= 0 - then l - else if V.compare e' b >= 0 then - raise Not_found - else find arg r - in - try aux r (find i l2) - with Not_found -> false - in - aux s1 s2 - - let link t1 t2 = join t1 t2 (* join is in fact an exact union *) - - let intersects t1 t2 = - let m = meet t1 t2 in - not (equal m bottom) - - let fold f v acc = - match v with - | Top -> raise Error_Top - | Set s -> - List.fold_right f s acc - - let narrow = meet - - include Datatype.Make - (struct - type t = tt - let name = Interval.name ^ " lattice_interval_set" - let structural_descr = - Structural_descr.t_sum - [| [| Structural_descr.pack - (Structural_descr.t_list (Descr.str Interval.descr)) |] |] - let reprs = Top :: List.map (fun o -> Set [ o ]) Interval.reprs - let equal = equal - let compare = compare - let hash = hash - let rehash = Datatype.identity - let copy = Datatype.undefined - let internal_pretty_code = Datatype.undefined - let pretty = pretty - let varname = Datatype.undefined - let mem_project = Datatype.never_any_project - end) - let () = Type.set_ml_name ty None - - let pretty_typ typ fmt i = - let typ = - match typ with - Some t -> t - | None -> - Cil_types.TArray - (Cil_types.TInt(Cil_types.IUChar,[]), - Some (Cil.kinteger64 - ~loc:(Cil.CurrentLoc.get ()) - Cil_types.IULongLong - (Integer.of_int64 922337203685477580L) - (* See Cuoq for rational *)), - Cil.empty_size_cache (), - []) - in - match i with - | Top -> Format.fprintf fmt "[..]" - | Set s -> - if s=[] then Format.fprintf fmt "BottomISet" - else begin - let pp_one fmt (b,e)= - assert (Int.le b e) ; - ignore (Bit_utils.pretty_bits typ - ~use_align:false - ~align:Rel.zero - ~rh_size:Int.one - ~start:b ~stop:e fmt) in - let pp_stmt fmt r = Format.fprintf fmt "%a;@ " pp_one r in - match s with - | [] -> Format.pp_print_string fmt "{}" - | [r] -> pp_one fmt r - | s -> - Format.fprintf fmt "@[{" ; - List.iter (pp_stmt fmt) s ; - Format.fprintf fmt "}@]" ; - end - - let from_ival_size_aux ival size = - let max_elt_int = !plevel in - let max_elt = Int.of_int max_elt_int in - let add_offset x acc = join (inject_one ~value:x ~size) acc in - match ival with - | Ival.Top(None, _, _, _) - | Ival.Top(_, None, _, _) | Ival.Float _ -> top - | Ival.Top(Some mn, Some mx, _r, m) -> - if Int.le m size - then inject_one ~value:mn ~size:(Int.add (Int.sub mx mn) size) - else - let elts = Int.native_div (Int.sub mx mn) m in - if Int.gt elts max_elt then begin - (* too many elements to enumerate *) - Kernel.result ~once:true ~current:true - "more than %d(%a) elements to enumerate. Approximating." - max_elt_int Int.pretty elts; - inject_bounds mn (Int.pred (Int.add mx size)) - end - else Int.fold add_offset ~inf:mn ~sup:mx ~step:m bottom - | Ival.Set(s) -> - Array.fold_right - add_offset - s - bottom - - let from_ival_size ival size = - match size with - | Int_Base.Top -> top - | Int_Base.Value int -> from_ival_size_aux ival int - - let diff x y = - if x == y - then bottom - else - ( match x, y with - | _, Top -> bottom - | Top, _ -> Top - | Set sx , Set sy -> Set ( - let rec aux acc (l1:itv list) (l2:itv list) = - match l1 with - | [] -> List.rev acc (* nothing left *) - | (l, u as itv)::tail -> - let rec relevant_rhs rhs = - match rhs with - | (_, ur) :: tail when Int.lt ur l-> relevant_rhs tail - | _ -> rhs - in - let l2 = relevant_rhs l2 in - match l2 with - [] -> List.rev_append acc l1 (* nothing left to remove *) - | (lr, ur) :: _ -> - if Int.lt u lr - then - aux (itv :: acc) tail l2 - else - let l1 = - if Int.lt ur u then (Int.succ ur, u) :: tail else tail - in - let acc = - if Int.lt l lr - then - (l, Int.pred lr) :: acc - else acc - in - aux acc l1 l2 - in - aux [] sx sy)) -end - -module Int_Intervals = struct - - type tt = - { h:int; - v: Unhashconsed_Int_Intervals.t; - tag:int } - - exception Error_Top = Unhashconsed_Int_Intervals.Error_Top - - let id { tag=id } = id - - let pretty_debug fmt x = Unhashconsed_Int_Intervals.pretty fmt x.v - let pretty = pretty_debug - - let hash_internal {h=h} = h - - let equal_internal {v=v;h=h} {v=v';h=h'} = - h = h' && Unhashconsed_Int_Intervals.equal v v' - - let name = "int_intervals" - - module IntIntervalsHashtbl = - Buckx.MakeBig - (struct - type t = tt - let equal = equal_internal - let hash = hash_internal - let pretty = pretty - let id = name - end) - - let table = IntIntervalsHashtbl.create 139 - let current_tag = ref 0 ;; - - let wrap x = - let tag = !current_tag in - let new_i = - { h = Unhashconsed_Int_Intervals.hash x; - v = x; - tag = tag} - in - let result = IntIntervalsHashtbl.merge table new_i in - if result == new_i then current_tag := succ tag; - result - -(* initial values go here *) - let top = wrap Unhashconsed_Int_Intervals.top - let bottom = wrap Unhashconsed_Int_Intervals.bottom -(* end of initial values *) - - let compare_itvs i1 i2 = Unhashconsed_Int_Intervals.compare i1.v i2.v - - (* Purely for implementation purposes, nothing to do with the ordering - induced by the underlying lattice *) - let compare i1 i2 = Datatype.Int.compare i1.tag i2.tag - - include - Datatype.Make - (struct - type t = tt - let structural_descr = - Structural_descr.t_record - [| Structural_descr.p_int; - Unhashconsed_Int_Intervals.packed_descr; - Structural_descr.p_int |] - let reprs = [ top; bottom ] - let name = "Lattice_Interval_Set.Int_Intervals" - let compare = compare - let equal = ( == ) - let copy = Datatype.undefined - let hash x = x.h - let rehash x = wrap x.v - let internal_pretty_code = Datatype.undefined - let pretty = pretty - let varname = Datatype.undefined - let mem_project = Datatype.never_any_project - end) - - let diff x y = wrap (Unhashconsed_Int_Intervals.diff x.v y.v) - - let meet x y = wrap (Unhashconsed_Int_Intervals.meet x.v y.v) - let link x y = wrap (Unhashconsed_Int_Intervals.link x.v y.v) - let join x y = wrap (Unhashconsed_Int_Intervals.join x.v y.v) - let narrow x y = wrap (Unhashconsed_Int_Intervals.narrow x.v y.v) - -(* - THERE IS ONLY ONE HASHCONSING TABLE FOR Int_intervals. - IT IS SHARED BETWEEN PROJECTS -*) - - let intersects x y = - Unhashconsed_Int_Intervals.intersects x.v y.v - - let is_included x y = - Unhashconsed_Int_Intervals.is_included x.v y.v - - let join_and_is_included a b = - let ab = join a b in (ab, equal a b) - - let inject i = - wrap (Unhashconsed_Int_Intervals.inject i) - - let pretty_typ typ fmt x = - Unhashconsed_Int_Intervals.pretty_typ typ fmt x.v - - let from_ival_size iv s = - wrap (Unhashconsed_Int_Intervals.from_ival_size iv s) - - let fold f x acc = - Unhashconsed_Int_Intervals.fold f x.v acc - - let is_top x = equal x top - - exception Not_a_set - - let project_set x = - match x.v with - Unhashconsed_Int_Intervals.Top -> raise Not_a_set - | Unhashconsed_Int_Intervals.Set s -> s - - let project_singleton x = - match x.v with - | Unhashconsed_Int_Intervals.Top -> None - | Unhashconsed_Int_Intervals.Set [e] -> Some e - | Unhashconsed_Int_Intervals.Set _ -> None - - let inject_bounds b e = - wrap (Unhashconsed_Int_Intervals.inject_bounds b e) - -end - -(* -Local Variables: -compile-command: "make -C ../.." -End: -*) diff -Nru frama-c-20140301+neon+dfsg/src/ai/lattice_Interval_Set.mli frama-c-20150201+sodium+dfsg/src/ai/lattice_Interval_Set.mli --- frama-c-20140301+neon+dfsg/src/ai/lattice_Interval_Set.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/lattice_Interval_Set.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -(** Sets of disjoint intervals with a lattice structure. Consecutive - intervals are automatically fused. Current implementation uses a - sorted list. *) - -open Abstract_interp - -type itv = Int.t * Int.t - - -module Int_Intervals : sig - include Lattice_type.Full_Lattice - include Lattice_type.With_Error_Top - - val id: t -> int - - val is_top: t -> bool - - val inject_bounds: Int.t -> Int.t -> t - val inject: itv list -> t - val from_ival_size: Ival.t -> Int_Base.t -> t - (** Conversion from an ival, which represents the beginning of - each interval. The size if taken from the [Int_Base.t] argument. - If the result contains more than [-plevel] arguments, it is - automatically approximated. *) - - exception Not_a_set - val project_set: t -> itv list - (** may raise [Not_a_set] *) - - val project_singleton: t -> itv option - - (** Iterators *) - val fold: (itv -> 'a -> 'a) -> t -> 'a -> 'a - - val pretty_typ: Cil_types.typ option -> t Pretty_utils.formatter - (** Pretty-printer that supposes the intervals are subranges of - a C type, and use the type to print nice offsets *) - - val compare_itvs: t -> t -> int - (** Comparison that lifts the standard order between two intervals - to lattices. If you want constant-time comparison, use [compare]. *) - -end - -(**/**) (* This is automatically set by the Value plugin. Do not call. *) -val plevel: int ref -(**/**) - - -(* -Local Variables: -compile-command: "make -C ../.. byte" -End: -*) diff -Nru frama-c-20140301+neon+dfsg/src/ai/lattice_type.mli frama-c-20150201+sodium+dfsg/src/ai/lattice_type.mli --- frama-c-20140301+neon+dfsg/src/ai/lattice_type.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/lattice_type.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -65,6 +65,26 @@ val meet: t -> t -> t (** under-approximation of intersection *) end +(** {2 Over- and under-approximations} + + Nearly all abstract operations implemented in the lattices of Frama-C + are *over-approximations*: the (abstract) operation assumes that its operands + are already over-approximations, and returns a result that over-approximates + (abstracts) the results that would have been given by the concrete operation + on the concretization of the arguments. + + Conversely, some functions, suffixed by [_under] assumes that their arguments + are under-approximations, and returns a result that under-approximates the + concrete operation. The functions [link] and [meet] in + {With_Under_Approximation} are exceptions, that are not suffixed by [_under]. + + Finally, some functions are *exact*, in the sense that they preserve the + concretization of the concrete function. Hence, they implement + over-approximations when given over-approximated arguments, and + under-approximations when given under-approximated ones. This 'exact' + property is usually mentioned in the comments for the function. *) + + module type With_Intersects = sig type t val intersects: t -> t -> bool diff -Nru frama-c-20140301+neon+dfsg/src/ai/map_Lattice.ml frama-c-20150201+sodium+dfsg/src/ai/map_Lattice.ml --- frama-c-20140301+neon+dfsg/src/ai/map_Lattice.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/map_Lattice.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -35,7 +35,10 @@ module Make_without_cardinal (K : Key) (Top_Param : Lattice_type.Lattice_Hashconsed_Set with type O.elt=K.t) - (V : Lattice_type.Full_Lattice) + (V : sig + include Lattice_type.Full_Lattice + val pretty_debug: t Pretty_utils.formatter + end) (Comp: sig (** See {!Hptmap} for the documentation of this option *) val e: bool val f : K.t -> V.t -> bool @@ -43,11 +46,6 @@ val default:bool end) (L: sig val v : (K.t * V.t) list list end) - (Null_Behavior: sig - val null : K.t - val is_null : K.t -> bool - val zone: bool - end) = struct @@ -56,7 +54,7 @@ (K) (V) (Comp) - (struct let v = [] :: [Null_Behavior.null,V.top]::L.v end) + (struct let v = [] :: L.v end) (struct let l = [ Ast.self ] end) (* TODO: this should be an argument of the functor *) let () = Ast.add_monotonic_state M.self @@ -65,9 +63,8 @@ type map_t = M.t type tt = Top of Top_Param.t * Origin.t | Map of map_t - (* Invariant : - [Top (s,_)] ok if [Top_Param.null] is not in [s] - [Top (emptyset,_)] is injected to [Map (Null,Top)] *) + (** No function of this module creates a [Top] out of a [Map]. [Top] are + always derived from an existing [Top] value. *) let top = Top(Top_Param.top, Origin.top) @@ -86,27 +83,16 @@ then M.remove k m else M.add k v m + let add k v m = match m with + | Top (Top_Param.Top, _) -> m + | Top (Top_Param.Set s, o) -> Top (Top_Param.(inject (O.add k s)), o) + | Map m -> Map (add_or_bottom k v m) + let bottom = Map M.empty let inject k v = Map (add_or_bottom k v M.empty) - let top_int = inject Null_Behavior.null V.top - - let inject_top_origin origin t = - if Null_Behavior.zone - then - Top (Top_Param.inject t, origin) - else - let s = Top_Param.O.remove Null_Behavior.null t in - if Top_Param.O.is_empty s - then top_int - else Top (Top_Param.inject s, origin) - - let is_in_topset set elt = - (Null_Behavior.is_null elt && not Null_Behavior.zone) || - Top_Param.O.mem elt set - let pretty fmt m = match m with | Top (t, a) -> @@ -122,10 +108,22 @@ (fun fmt (k, v) -> Format.fprintf fmt "%a -> %a" K.pretty k V.pretty v) fmt m + let pretty_debug fmt m = + match m with + | Top (t, a) -> + Format.fprintf fmt "@[{{ mix of %a.@ Origin: %a}}@]" + Top_Param.pretty t + Origin.pretty a + | Map m -> + M.pretty_debug fmt m + let find_or_bottom k m = try - M.find k m + M.find_check_missing k m (* locations are usually small, so the difference + between [M.find] and [M.find_check_missing] is usually unimportant. + However, [find_check_missing] is more efficient when we query NULL, + which is a very common case. *) with Not_found -> V.bottom @@ -146,9 +144,6 @@ exception Error_Top - let decide_none _k v = v - let decide_some v1 v2 = V.join v1 v2 - let equal m1 m2 = m1 == m2 || match m1, m2 with @@ -186,9 +181,12 @@ let check_join_assert = ref 0 let join = + let decide_none _k v = v in + let decide_some v1 v2 = V.join v1 v2 in + let name = Printf.sprintf "Map_Lattice(%s).join" V.name in let symmetric_merge = M.symmetric_merge - ~cache:("map_Lattice", ()) ~decide_none ~decide_some + ~cache:(name, ()) ~empty_neutral:true ~decide_none ~decide_some in fun m1 m2 -> if m1 == m2 then m1 else @@ -198,15 +196,12 @@ | Top (Top_Param.Top,_) as x, Map _ | Map _, (Top (Top_Param.Top,_) as x) -> x - | Top (Top_Param.Set t,a), Map m | Map m, Top (Top_Param.Set t,a) -> - inject_top_origin a - (M.fold - (fun k _ acc -> Top_Param.O.add k acc) - m - t) + | Top (Top_Param.Set t, o), Map m | Map m, Top (Top_Param.Set t, o) -> + let s = M.fold (fun k _ acc -> Top_Param.O.add k acc) m t in + Top (Top_Param.inject s, o) | Map mm1, Map mm2 -> let mresult = symmetric_merge mm1 mm2 in - assert ( + assert (true || let n = succ !check_join_assert in check_join_assert := n; n land 63 <> 0 || @@ -219,9 +214,10 @@ else begin let pp_one fmt mm = Format.fprintf fmt "%a (%d;%x)@." - M.pretty mm (M.hash mm) (Extlib.address_of_value mm) + M.pretty_debug mm (M.hash mm) + (Extlib.address_of_value mm) in - Format.printf "Map_Lattice.join incorrect@. %a+%a->@.#%a&%a" + Format.printf "Map_Lattice.join incorrect@. %a+%a->@. %a/%a" pp_one mm1 pp_one mm2 pp_one mresult pp_one mr'; false; end); @@ -249,19 +245,24 @@ (** Over-approximation of the filter (in the case [Top Top])*) let filter_base f m = match m with - | Top (t, a) -> - (try - inject_top_origin a - (Top_Param.fold - (fun v acc -> if f v then Top_Param.O.add v acc else acc) - t - Top_Param.O.empty) - with Top_Param.Error_Top -> top) + | Top (t, o) -> begin + try + let add v acc = if f v then Top_Param.O.add v acc else acc in + let s = Top_Param.fold add t Top_Param.O.empty in + Top (Top_Param.inject s, o) + with Top_Param.Error_Top -> top + end | Map m -> Map (M.fold (fun k _ acc -> if f k then acc else M.remove k acc) m m) - let meet m1 m2 = - if m1 == m2 then m1 else + let meet = + let decide_some _k v1 v2 = + let r = V.meet v1 v2 in + if V.equal V.bottom r then None else Some r + in + let name = Printf.sprintf "Map_Lattice(%s).meet" V.name in + let merge = M.symmetric_inter ~cache:(name, ()) ~decide_some in + fun m1 m2 -> match m1, m2 with | Top (x1, a1), Top (x2, a2) -> let meet_topparam = Top_Param.meet x1 x2 in @@ -270,24 +271,24 @@ | (Map _ as x),Top (Top_Param.Top, _) -> x | Top (Top_Param.Set set, _), (Map _ as x) | (Map _ as x), Top (Top_Param.Set set, _) -> - filter_base (fun v -> is_in_topset set v) x - | Map m1, Map m2 -> - let merge_key k v acc = - add_or_bottom k (V.meet v (find_or_bottom k m2)) acc - in - Map (M.fold merge_key m1 M.empty) - + filter_base (fun v -> Top_Param.O.mem v set) x + | Map m1, Map m2 -> Map (merge m1 m2) - let narrow m1 m2 = + let narrow = let compute_origin_narrow x1 a1 x2 a2 = if Top_Param.equal x1 x2 then Origin.narrow a1 a2 (* equals a1 currently*) else if Top_Param.is_included x1 x2 then a1 else if Top_Param.is_included x2 x1 then a2 else Origin.top in - let r = - if m1 == m2 then m1 else - match m1, m2 with + let decide_some _k v1 v2 = + let r = V.narrow v1 v2 in + if V.equal V.bottom r then None else Some r + in + let name = Printf.sprintf "Map_Lattice(%s).narrow" V.name in + let merge = M.symmetric_inter ~cache:(name, ()) ~decide_some in + fun m1 m2 -> + match m1, m2 with | Top (x1, a1), Top (x2, a2) -> Top (Top_Param.narrow x1 x2, compute_origin_narrow x1 a1 x2 a2) @@ -295,24 +296,8 @@ | (Map _ as x),Top (Top_Param.Top, _) -> x | Top (Top_Param.Set set, _), (Map _ as x) | (Map _ as x), Top (Top_Param.Set set, _) -> - filter_base (fun v -> is_in_topset set v) x - | Map m1, Map m2 -> - let merge_key k v acc = - add_or_bottom k (V.narrow v (find_or_bottom k m2)) acc in - Map (M.fold merge_key m1 M.empty) - in -(* Format.printf "Map_Lattice.narrow %a and %a ===> %a@\n" - pretty x pretty y pretty r; *) - r - - let equal m1 m2 = - m1 == m2 || - match m1, m2 with - | Top (s, a), Top (s', a') -> - Top_Param.equal s s' && Origin.equal a a' - | Map m1, Map m2 -> - M.equal m1 m2 - | _ -> false + filter_base (fun v -> Top_Param.O.mem v set) x + | Map m1, Map m2 -> Map (merge m1 m2) let is_included = let name = @@ -323,7 +308,7 @@ let decide_both _ v1 v2 = V.is_included v1 v2 in let decide_fast = M.decide_fast_inclusion in let map_is_included = - M.binary_predicate (M.PersistentCache name) M.UniversalPredicate + M.binary_predicate (Hptmap.PersistentCache name) M.UniversalPredicate ~decide_fast ~decide_fst ~decide_snd ~decide_both in fun m1 m2 -> @@ -333,36 +318,30 @@ Origin.is_included a a' | Map _, Top (Top_Param.Top, _) -> true | Map m, Top (Top_Param.Set set, _) -> - M.for_all (fun k _ -> is_in_topset set k) m + M.for_all (fun k _ -> Top_Param.O.mem k set) m | Top _, Map _ -> false | Map m1, Map m2 -> map_is_included m1 m2) let join_and_is_included a b = let ab = join a b in (ab, equal a b) - (* under-approximation of union *) - let link m1 m2 = - if is_included m1 m2 then m2 (* exact *) - else if is_included m2 m1 then m1 (* exact *) - else match m1, m2 with + let link = + let decide_none _k v = v in + let decide_some v1 v2 = V.link v1 v2 in + let name = Printf.sprintf "Map_Lattice(%s).link" V.name in + let merge = + M.symmetric_merge + ~cache:(name, ()) ~empty_neutral:true ~decide_none ~decide_some + in + fun m1 m2 -> match m1, m2 with | Top _, Map _ -> m1 (* may be approximated *) | Map _, Top _ -> m2 (* may be approximated *) | Top (s,_), Top (s',_) -> if Top_Param.is_included s s' then m2 (* may be approximated *) else if Top_Param.is_included s' s then m1 (* may be approximated *) else m1 (* very approximated *) - | Map mm1, Map mm2 -> - let map = - M.fold - (fun k v1 acc -> - let v2 = find_or_bottom k mm2 in - let link_v = V.link v1 v2 in - M.add k link_v acc) - mm1 - mm2 - in - Map map + | Map mm1, Map mm2 -> Map (merge mm1 mm2) let intersects = let name = @@ -370,7 +349,7 @@ in let map_intersects = M.symmetric_binary_predicate - (M.PersistentCache name) M.ExistentialPredicate + (Hptmap.PersistentCache name) M.ExistentialPredicate ~decide_fast:M.decide_fast_intersection ~decide_one:(fun _ _ -> false) ~decide_both:(fun _ x y -> V.intersects x y) @@ -378,11 +357,11 @@ fun mm1 mm2 -> match mm1, mm2 with | Top (s1, _), Top (s2, _) -> - not Null_Behavior.zone || Top_Param.intersects s1 s2 + Top_Param.intersects s1 s2 | Top (Top_Param.Top, _), Map m | Map m, Top (Top_Param.Top, _) -> not (M.equal m M.empty) | Top (Top_Param.Set s, _), Map m | Map m, Top (Top_Param.Set s, _) -> - M.exists (fun b _ -> is_in_topset s b) m + M.exists (fun b _ -> Top_Param.O.mem b s) m | Map m1, Map m2 -> map_intersects m1 m2 (** if there is only one key [k] in map [m], then returns the pair [k,v] @@ -427,10 +406,7 @@ let fold_bases f m acc = match m with - Top(Top_Param.Set t, _) -> - let acc = if Null_Behavior.zone then acc - else f Null_Behavior.null acc - in + | Top(Top_Param.Set t, _) -> Top_Param.O.fold f t acc | Top(Top_Param.Top, _) -> raise Error_Top @@ -453,14 +429,8 @@ let fold_topset_ok f m acc = match m with - Top(Top_Param.Set t, _) -> - let acc = - if Null_Behavior.zone then acc else f Null_Behavior.null V.top acc - in - Top_Param.O.fold - (fun x acc -> f x V.top acc) - t - acc + | Top(Top_Param.Set t, _) -> + Top_Param.O.fold (fun x acc -> f x V.top acc) t acc | Top(Top_Param.Top, _) -> raise Error_Top | Map m -> @@ -494,7 +464,10 @@ module Make (K : Key) (Top_Param : Lattice_type.Lattice_Hashconsed_Set with type O.elt=K.t) - (V : Lattice_type.Full_AI_Lattice_with_cardinality) + (V : sig + include Lattice_type.Full_AI_Lattice_with_cardinality + val pretty_debug: t Pretty_utils.formatter + end) (Comp: sig (** See {!Hptmap} for the documentation of this option *) val e: bool val f : K.t -> V.t -> bool @@ -502,14 +475,9 @@ val default:bool end) (L: sig val v : (K.t * V.t) list list end) - (Null_Behavior: sig - val null : K.t - val is_null : K.t -> bool - val zone: bool - end) = struct - include Make_without_cardinal(K)(Top_Param)(V)(Comp)(L)(Null_Behavior) + include Make_without_cardinal(K)(Top_Param)(V)(Comp)(L) type widen_hint = K.t -> V.widen_hint @@ -530,6 +498,7 @@ ~cache:("", false (* No cache, because of wh *)) ~decide ~idempotent:true + ~empty_neutral:true in fun m1 m2 -> match m1, m2 with diff -Nru frama-c-20140301+neon+dfsg/src/ai/origin.ml frama-c-20150201+sodium+dfsg/src/ai/origin.ml --- frama-c-20140301+neon+dfsg/src/ai/origin.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/origin.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/ai/origin.mli frama-c-20150201+sodium+dfsg/src/ai/origin.mli --- frama-c-20140301+neon+dfsg/src/ai/origin.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/origin.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/ai/trace.ml frama-c-20150201+sodium+dfsg/src/ai/trace.ml --- frama-c-20140301+neon+dfsg/src/ai/trace.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/trace.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -244,6 +244,43 @@ | Traces t1, Traces t2 -> Traces (join_intra t1 t2) ;; +(* Note: mechanically translated from join_intra. *) +let narrow_intra t1 t2 = + (* Kernel.debug "narrowing %a@. with %a@." pretty_intra t1 pretty_intra t2; *) + assert (t1.current_kf == t2.current_kf); + assert (match t1.current_stmt,t2.current_stmt with + | Some({sid=sid1}), Some { sid = sid2 } when sid1 == sid2 -> true + | _ -> false); + assert (compatible_trace_node t1.current_node t2.current_node); + let merged_dag = + let merge_fun _key set1 set2 = match set1, set2 with + | Some set1, Some set2 -> Some (Trace_Node_Set.inter set1 set2) + | None, _ | _, None -> None + in + Trace_Node_Map.merge merge_fun t1.dag t2.dag + in + let merged_execution_count = + let narrow_execution_count (a1,b1) (a2,b2) = (max a1 a2, min b1 b2) in + let merge_fun _key iv1 iv2 = match iv1, iv2 with + | Some iv1, Some iv2 -> Some (narrow_execution_count iv1 iv2) + | None, _ | _, None -> None + in + Cil_datatype.Stmt.Map.merge merge_fun t1.execution_count t2.execution_count + in + { dag = merged_dag; + current_kf = t1.current_kf; current_stmt = t1.current_stmt; + current_node = t1.current_node; + execution_count = merged_execution_count + } +;; + +let narrow t1 t2 = match t1,t2 with + | Top, t | t, Top -> t + | Bottom, _ | _, Bottom -> Bottom + | Traces t1, Traces t2 -> Traces (narrow_intra t1 t2) +;; + + (****************************************************************) (* Precedence. *) @@ -422,3 +459,9 @@ execution_count = Cil_datatype.Stmt.Map.empty } ;; + +(* +Local Variables: +compile-command: "make -C ../.." +End: +*) diff -Nru frama-c-20140301+neon+dfsg/src/ai/trace.mli frama-c-20150201+sodium+dfsg/src/ai/trace.mli --- frama-c-20140301+neon+dfsg/src/ai/trace.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/ai/trace.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,25 +20,36 @@ (* *) (**************************************************************************) +(** Traces. *) + +(* [JS 2015/01/27] would be nice to better define what lattice this module + defines. *) + open Cil_types -(* Type of traces. *) +(** Type of traces. *) type t;; val pretty : Format.formatter -> t -> unit;; -(* No trace. Should be used only as a base case for a no-op join. *) +(** No trace. Should be used only as a base case for a no-op join. *) val bottom: t;; -(* Unknown trace. Should be used only to forget a trace. *) + +(** Unknown trace. Should be used only to forget a trace. *) val top: t;; val join: t -> t -> t;; +val narrow: t -> t -> t;; -(* Create a trace, or add an element at the end of a trace. *) +(** Create a trace, or add an element at the end of a trace. *) val initial: kernel_function -> t;; val add_disjunction: Property.t -> predicate named -> t -> t;; val add_statement: stmt -> t -> t;; -(* Set to false to set all traces to top. *) +(** Set to false to set all traces to top. *) val set_compute_trace: bool -> unit;; - +(* +Local Variables: +compile-command: "make -C ../.." +End: +*) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/aorai_dataflow.ml frama-c-20150201+sodium+dfsg/src/aorai/aorai_dataflow.ml --- frama-c-20140301+neon+dfsg/src/aorai/aorai_dataflow.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/aorai_dataflow.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -540,7 +540,7 @@ end else begin let module Init = struct - let kf = kf + let kf = kf let stack = (kf, ref false) :: stack let initial_state = match Kernel_function.find_first_stmt kf with diff -Nru frama-c-20140301+neon+dfsg/src/aorai/aorai_dataflow.mli frama-c-20150201+sodium+dfsg/src/aorai/aorai_dataflow.mli --- frama-c-20140301+neon+dfsg/src/aorai/aorai_dataflow.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/aorai_dataflow.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/Aorai.mli frama-c-20150201+sodium+dfsg/src/aorai/Aorai.mli --- frama-c-20140301+neon+dfsg/src/aorai/Aorai.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/Aorai.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/aorai_option.ml frama-c-20150201+sodium+dfsg/src/aorai/aorai_option.ml --- frama-c-20140301+neon+dfsg/src/aorai/aorai_option.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/aorai_option.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -31,7 +31,7 @@ end) module Ltl_File = - EmptyString + Empty_string (struct let option_name = "-aorai-ltl" let arg_name = "" @@ -39,7 +39,7 @@ end) module To_Buchi = - EmptyString + Empty_string (struct let option_name = "-aorai-to-buchi" let arg_name = "f" @@ -48,7 +48,7 @@ end) module Buchi = - EmptyString + Empty_string (struct let option_name = "-aorai-buchi" let arg_name = "f" @@ -57,7 +57,7 @@ end) module Ya = - EmptyString + Empty_string (struct let option_name = "-aorai-automata" let arg_name = "f" @@ -74,7 +74,7 @@ end) module Output_C_File = - EmptyString + Empty_string (struct let option_name = "-aorai-output-c-file" let arg_name = "" diff -Nru frama-c-20140301+neon+dfsg/src/aorai/aorai_option.mli frama-c-20150201+sodium+dfsg/src/aorai/aorai_option.mli --- frama-c-20140301+neon+dfsg/src/aorai/aorai_option.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/aorai_option.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/aorai_register.ml frama-c-20150201+sodium+dfsg/src/aorai/aorai_register.ml --- frama-c-20140301+neon+dfsg/src/aorai/aorai_register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/aorai_register.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -365,7 +365,7 @@ (* Step 2 : Work in our own project, initialized by a copy of the main one. *) let work_prj = - File.create_project_from_visitor "aorai_tmp" + File.create_project_from_visitor ~last:false "aorai_tmp" (fun prj -> new Visitor.frama_c_copy prj) in Project.copy ~selection:(Parameter_state.get_selection ()) work_prj; diff -Nru frama-c-20140301+neon+dfsg/src/aorai/aorai_utils.ml frama-c-20150201+sodium+dfsg/src/aorai/aorai_utils.ml --- frama-c-20140301+neon+dfsg/src/aorai/aorai_utils.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/aorai_utils.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -652,7 +652,7 @@ let f = Extlib.the self#current_func in let name = Data_for_aorai.loopInit ^ "_" ^ (string_of_int stmt.sid) in let var = - Cil.makeLocalVar f ~scope ~generated:true name Cil.intType + Cil.makeLocalVar f ~scope name Cil.intType in Data_for_aorai.set_varinfo name var | _ -> () diff -Nru frama-c-20140301+neon+dfsg/src/aorai/aorai_utils.mli frama-c-20150201+sodium+dfsg/src/aorai/aorai_utils.mli --- frama-c-20140301+neon+dfsg/src/aorai/aorai_utils.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/aorai_utils.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -79,7 +79,7 @@ assigning auxiliary variable depending on the possible transitions made in the function. @since Nitrogen-20111001 - @since Neon-20130301 adds kf argument + @since Neon-20140301 adds kf argument *) val aorai_assigns: Data_for_aorai.state -> @@ -122,7 +122,7 @@ (** Possible values of the given auxiliary variable under the current path, [start]ing from the given point - @since Neon-20130301 add logic_label argument + @since Neon-20140301 add logic_label argument *) val update_to_pred: start: Cil_types.logic_label -> diff -Nru frama-c-20140301+neon+dfsg/src/aorai/aorai_visitors.ml frama-c-20150201+sodium+dfsg/src/aorai/aorai_visitors.ml --- frama-c-20140301+neon+dfsg/src/aorai/aorai_visitors.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/aorai_visitors.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/bool3.ml frama-c-20150201+sodium+dfsg/src/aorai/bool3.ml --- frama-c-20140301+neon+dfsg/src/aorai/bool3.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/bool3.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/bool3.mli frama-c-20150201+sodium+dfsg/src/aorai/bool3.mli --- frama-c-20140301+neon+dfsg/src/aorai/bool3.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/bool3.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/configure frama-c-20150201+sodium+dfsg/src/aorai/configure --- frama-c-20140301+neon+dfsg/src/aorai/configure 2014-03-12 15:07:56.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/configure 2015-06-01 13:17:43.000000000 +0000 @@ -1795,6 +1795,13 @@ + +# Usage: plugin_disable([plugin],[reason]) + + + + + # Implementation of an ordering $1 < $2: "" < yes < partial < no lt_mark () { first=`echo "$1" | sed -e 's/ .*//' ` @@ -2130,12 +2137,13 @@ -if test "$ENABLE_AORAI" != "no"; then USE_LTLTOBA=$USE_LTLTOBA" "aorai + +if test "$ENABLE_AORAI" != "no"; then # ltl2ba library @@ -2200,6 +2208,8 @@ +fi + if test -n "$REQUIRE_LTLTOBA" -o -n "$USE_LTLTOBA" -o "$no" = "yes"; then if test "$HAS_LTLTOBA" = "no"; then @@ -2250,7 +2260,6 @@ # main call compute_dependency -fi diff -Nru frama-c-20140301+neon+dfsg/src/aorai/configure.ac frama-c-20150201+sodium+dfsg/src/aorai/configure.ac --- frama-c-20140301+neon+dfsg/src/aorai/configure.ac 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/configure.ac 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Aorai plug-in of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # INRIA (Institut National de Recherche en Informatique et en # @@ -38,11 +38,13 @@ check_plugin(aorai,PLUGIN_RELATIVE_PATH(plugin_file),[support for Aorai plug-in],yes,yes) +plugin_use_external(aorai,ltltoba) + if test "$ENABLE_AORAI" != "no"; then - plugin_use_external(aorai,ltltoba) # ltl2ba library configure_tool([LTLTOBA],[ltl2ba],[ltl2ba not found.],no) - check_plugin_dependencies fi +check_plugin_dependencies + write_plugin_config(Makefile) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/data_for_aorai.ml frama-c-20150201+sodium+dfsg/src/aorai/data_for_aorai.ml --- frama-c-20140301+neon+dfsg/src/aorai/data_for_aorai.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/data_for_aorai.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) @@ -653,11 +653,10 @@ let find_macro _ = raise Not_found let find_var _ = raise Not_found let find_enum_tag _ = raise Not_found - let find_comp_type ~kind:_ _ = raise Not_found let find_comp_field info s = let field = Cil.getCompField info s in Field(field,NoOffset) - let find_type _ = raise Not_found + let find_type _ _ = raise Not_found let find_label _ = raise Not_found include Logic_env diff -Nru frama-c-20140301+neon+dfsg/src/aorai/data_for_aorai.mli frama-c-20150201+sodium+dfsg/src/aorai/data_for_aorai.mli --- frama-c-20140301+neon+dfsg/src/aorai/data_for_aorai.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/data_for_aorai.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/logic_simplification.ml frama-c-20150201+sodium+dfsg/src/aorai/logic_simplification.ml --- frama-c-20140301+neon+dfsg/src/aorai/logic_simplification.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/logic_simplification.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/logic_simplification.mli frama-c-20150201+sodium+dfsg/src/aorai/logic_simplification.mli --- frama-c-20140301+neon+dfsg/src/aorai/logic_simplification.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/logic_simplification.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/ltlast.mli frama-c-20150201+sodium+dfsg/src/aorai/ltlast.mli --- frama-c-20140301+neon+dfsg/src/aorai/ltlast.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/ltlast.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/ltllexer.ml frama-c-20150201+sodium+dfsg/src/aorai/ltllexer.ml --- frama-c-20140301+neon+dfsg/src/aorai/ltllexer.ml 2014-03-12 15:07:54.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/ltllexer.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,1190 +0,0 @@ -# 30 "src/aorai/ltllexer.mll" - - - open Ltlparser - open Lexing - - let loc lexbuf = (lexeme_start_p lexbuf, lexeme_end_p lexbuf) - - (*let lex_error lexbuf s = ()*) - (* Creport.raise_located (loc lexbuf) (AnyMessage ("lexical error: " ^ s)) - *) - - let buf = Buffer.create 1024 - - let newline lexbuf = - let pos = lexbuf.lex_curr_p in - lexbuf.lex_curr_p <- - { pos with pos_lnum = pos.pos_lnum + 1; pos_bol = pos.pos_cnum } - - (* Update the current location with file name and line number. *) - -(* let update_loc lexbuf file line absolute chars = - let pos = lexbuf.lex_curr_p in - let new_file = match file with - | None -> pos.pos_fname - | Some s -> s - in - lexbuf.lex_curr_p <- - { pos with - pos_fname = new_file; - pos_lnum = if absolute then line else pos.pos_lnum + line; - pos_bol = pos.pos_cnum - chars; - } -*) - exception Error of (Lexing.position * Lexing.position) * string - - let raise_located loc e = raise (Error (loc, e)) - - -# 41 "src/aorai/ltllexer.ml" -let __ocaml_lex_tables = { - Lexing.lex_base = - "\000\000\215\255\216\255\077\000\152\000\219\255\002\000\162\000\ - \237\000\227\255\228\255\229\255\231\255\232\255\016\000\056\001\ - \235\255\003\000\071\001\031\000\001\000\011\000\033\000\075\000\ - \252\255\253\255\146\001\221\001\040\002\115\002\190\002\009\003\ - \084\003\159\003\234\003\241\255\251\255\034\000\250\255\249\255\ - \248\255\236\255\053\004\128\004\203\004\022\005\097\005\172\005\ - \247\005\066\006\141\006\216\006\237\255\035\007\230\255\129\000\ - \222\255\221\255\045\007\120\007\195\007\014\008\089\008\164\008\ - \239\008\058\009\133\009\208\009\027\010\102\010\177\010\252\010\ - \071\011\146\011\221\011\040\012\131\000\252\255\253\255\254\255\ - \012\000\255\255"; - Lexing.lex_backtrk = - "\255\255\255\255\255\255\038\000\037\000\255\255\035\000\038\000\ - \038\000\255\255\255\255\255\255\255\255\255\255\022\000\021\000\ - \255\255\016\000\038\000\008\000\029\000\040\000\015\000\040\000\ - \255\255\255\255\038\000\038\000\038\000\038\000\000\000\038\000\ - \038\000\038\000\001\000\255\255\255\255\017\000\255\255\255\255\ - \255\255\255\255\038\000\038\000\038\000\038\000\038\000\009\000\ - \010\000\011\000\012\000\013\000\255\255\037\000\255\255\255\255\ - \255\255\255\255\038\000\038\000\030\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\032\000\038\000\ - \038\000\038\000\038\000\031\000\255\255\255\255\255\255\255\255\ - \003\000\255\255"; - Lexing.lex_default = - "\001\000\000\000\000\000\255\255\255\255\000\000\255\255\255\255\ - \255\255\000\000\000\000\000\000\000\000\000\000\255\255\255\255\ - \000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\000\000\000\000\255\255\000\000\000\000\ - \000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\000\000\255\255\000\000\055\000\ - \000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\077\000\000\000\000\000\000\000\ - \255\255\000\000"; - Lexing.lex_trans = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\006\000\005\000\006\000\006\000\006\000\006\000\006\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \006\000\019\000\006\000\000\000\000\000\012\000\020\000\040\000\ - \025\000\024\000\013\000\016\000\000\000\015\000\011\000\014\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\056\000\081\000\022\000\023\000\017\000\055\000\ - \052\000\003\000\003\000\008\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\007\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\010\000\041\000\009\000\037\000\018\000\ - \038\000\003\000\003\000\003\000\003\000\003\000\026\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\027\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\021\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\039\000\ - \035\000\036\000\000\000\057\000\000\000\078\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\003\000\080\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\003\000\003\000\003\000\003\000\071\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \002\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\058\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\003\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\000\000\000\000\000\000\000\000\054\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\255\255\000\000\079\000\000\000\000\000\000\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\045\000\046\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\043\000\003\000\003\000\044\000\003\000\003\000\042\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\003\000\000\000\031\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\003\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\028\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\029\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\003\000\000\000\003\000\003\000\003\000\003\000\ - \030\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \003\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\032\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\003\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\033\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ - \003\000\003\000\003\000\003\000\034\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\051\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\050\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\049\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\048\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \047\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\003\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\003\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\059\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\003\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\060\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\061\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\062\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\063\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \003\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\064\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\065\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\003\000\003\000\003\000\003\000\066\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\067\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\003\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\068\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\069\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\003\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\070\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \003\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \072\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\003\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\073\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\074\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\075\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\003\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000"; - Lexing.lex_check = - "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\000\000\000\000\006\000\000\000\000\000\006\000\006\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \000\000\000\000\006\000\255\255\255\255\000\000\000\000\020\000\ - \000\000\000\000\000\000\000\000\255\255\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\014\000\080\000\000\000\000\000\000\000\014\000\ - \017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\019\000\000\000\022\000\000\000\ - \037\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\255\255\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\021\000\ - \023\000\023\000\255\255\055\000\255\255\076\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \255\255\255\255\255\255\255\255\003\000\076\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\255\255\255\255\255\255\ - \000\000\007\000\255\255\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\008\000\008\000\008\000\ - \008\000\008\000\008\000\008\000\008\000\008\000\008\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\008\000\008\000\ - \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ - \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ - \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ - \255\255\255\255\255\255\255\255\008\000\255\255\008\000\008\000\ - \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ - \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ - \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\255\255\255\255\255\255\255\255\015\000\018\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\055\000\255\255\076\000\255\255\255\255\255\255\255\255\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\255\255\255\255\255\255\255\255\018\000\255\255\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\255\255\255\255\255\255\ - \255\255\026\000\255\255\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \255\255\255\255\255\255\255\255\027\000\255\255\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\255\255\255\255\255\255\255\255\028\000\ - \255\255\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\255\255\255\255\ - \255\255\255\255\029\000\255\255\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\255\255\255\255\255\255\255\255\030\000\255\255\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\255\255\255\255\255\255\255\255\ - \031\000\255\255\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\255\255\ - \255\255\255\255\255\255\032\000\255\255\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\255\255\255\255\255\255\255\255\033\000\255\255\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\034\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\034\000\034\000\255\255\255\255\255\255\ - \255\255\034\000\255\255\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\034\000\034\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \255\255\255\255\255\255\255\255\042\000\255\255\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\255\255\255\255\255\255\255\255\043\000\ - \255\255\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\255\255\255\255\ - \255\255\255\255\044\000\255\255\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\045\000\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\255\255\255\255\255\255\255\255\045\000\255\255\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\255\255\255\255\255\255\255\255\ - \046\000\255\255\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\047\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\255\255\ - \255\255\255\255\255\255\047\000\255\255\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\255\255\255\255\255\255\255\255\048\000\255\255\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\255\255\255\255\255\255\ - \255\255\049\000\255\255\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\050\000\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \255\255\255\255\255\255\255\255\050\000\255\255\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\255\255\255\255\255\255\255\255\051\000\ - \255\255\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \255\255\255\255\255\255\255\255\058\000\255\255\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\255\255\255\255\255\255\255\255\059\000\ - \255\255\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\255\255\255\255\ - \255\255\255\255\060\000\255\255\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\061\000\061\000\ - \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\061\000\ - \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ - \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ - \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ - \061\000\255\255\255\255\255\255\255\255\061\000\255\255\061\000\ - \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ - \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ - \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ - \061\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ - \062\000\062\000\062\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\062\000\062\000\062\000\062\000\062\000\062\000\ - \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ - \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ - \062\000\062\000\062\000\062\000\255\255\255\255\255\255\255\255\ - \062\000\255\255\062\000\062\000\062\000\062\000\062\000\062\000\ - \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ - \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ - \062\000\062\000\062\000\062\000\063\000\063\000\063\000\063\000\ - \063\000\063\000\063\000\063\000\063\000\063\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\063\000\063\000\063\000\ - \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ - \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ - \063\000\063\000\063\000\063\000\063\000\063\000\063\000\255\255\ - \255\255\255\255\255\255\063\000\255\255\063\000\063\000\063\000\ - \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ - \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ - \063\000\063\000\063\000\063\000\063\000\063\000\063\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \064\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \064\000\064\000\255\255\255\255\255\255\255\255\064\000\255\255\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \064\000\064\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\255\255\255\255\255\255\ - \255\255\065\000\255\255\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\066\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ - \255\255\255\255\255\255\255\255\066\000\255\255\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\255\255\255\255\255\255\255\255\067\000\ - \255\255\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\255\255\255\255\ - \255\255\255\255\068\000\255\255\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\255\255\255\255\255\255\255\255\069\000\255\255\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\255\255\255\255\255\255\255\255\ - \070\000\255\255\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\255\255\ - \255\255\255\255\255\255\071\000\255\255\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \072\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \072\000\072\000\255\255\255\255\255\255\255\255\072\000\255\255\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \072\000\072\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\073\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\073\000\073\000\255\255\255\255\255\255\ - \255\255\073\000\255\255\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\073\000\073\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \255\255\255\255\255\255\255\255\074\000\255\255\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\075\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\075\000\075\000\255\255\255\255\255\255\255\255\075\000\ - \255\255\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\075\000\075\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255"; - Lexing.lex_base_code = - ""; - Lexing.lex_backtrk_code = - ""; - Lexing.lex_default_code = - ""; - Lexing.lex_trans_code = - ""; - Lexing.lex_check_code = - ""; - Lexing.lex_code = - ""; -} - -let rec token lexbuf = - __ocaml_lex_token_rec lexbuf 0 -and __ocaml_lex_token_rec lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 77 "src/aorai/ltllexer.mll" - ( LTL_TRUE ) -# 946 "src/aorai/ltllexer.ml" - - | 1 -> -# 78 "src/aorai/ltllexer.mll" - ( LTL_FALSE ) -# 951 "src/aorai/ltllexer.ml" - - | 2 -> -# 79 "src/aorai/ltllexer.mll" - ( LTL_LPAREN ) -# 956 "src/aorai/ltllexer.ml" - - | 3 -> -# 80 "src/aorai/ltllexer.mll" - ( LTL_RPAREN ) -# 961 "src/aorai/ltllexer.ml" - - | 4 -> -# 83 "src/aorai/ltllexer.mll" - ( LTL_IMPLIES ) -# 966 "src/aorai/ltllexer.ml" - - | 5 -> -# 84 "src/aorai/ltllexer.mll" - ( LTL_LEFT_RIGHT_ARROW ) -# 971 "src/aorai/ltllexer.ml" - - | 6 -> -# 85 "src/aorai/ltllexer.mll" - ( LTL_OR ) -# 976 "src/aorai/ltllexer.ml" - - | 7 -> -# 86 "src/aorai/ltllexer.mll" - ( LTL_AND ) -# 981 "src/aorai/ltllexer.ml" - - | 8 -> -# 87 "src/aorai/ltllexer.mll" - ( LTL_NOT ) -# 986 "src/aorai/ltllexer.ml" - - | 9 -> -# 88 "src/aorai/ltllexer.mll" - ( LTL_GLOBALLY ) -# 991 "src/aorai/ltllexer.ml" - - | 10 -> -# 89 "src/aorai/ltllexer.mll" - ( LTL_FATALLY ) -# 996 "src/aorai/ltllexer.ml" - - | 11 -> -# 90 "src/aorai/ltllexer.mll" - ( LTL_UNTIL ) -# 1001 "src/aorai/ltllexer.ml" - - | 12 -> -# 91 "src/aorai/ltllexer.mll" - ( LTL_RELEASE ) -# 1006 "src/aorai/ltllexer.ml" - - | 13 -> -# 92 "src/aorai/ltllexer.mll" - ( LTL_NEXT ) -# 1011 "src/aorai/ltllexer.ml" - - | 14 -> -# 96 "src/aorai/ltllexer.mll" - ( LTL_EQ ) -# 1016 "src/aorai/ltllexer.ml" - - | 15 -> -# 97 "src/aorai/ltllexer.mll" - ( LTL_LT ) -# 1021 "src/aorai/ltllexer.ml" - - | 16 -> -# 98 "src/aorai/ltllexer.mll" - ( LTL_GT ) -# 1026 "src/aorai/ltllexer.ml" - - | 17 -> -# 99 "src/aorai/ltllexer.mll" - ( LTL_LE ) -# 1031 "src/aorai/ltllexer.ml" - - | 18 -> -# 100 "src/aorai/ltllexer.mll" - ( LTL_GE ) -# 1036 "src/aorai/ltllexer.ml" - - | 19 -> -# 101 "src/aorai/ltllexer.mll" - ( LTL_NEQ ) -# 1041 "src/aorai/ltllexer.ml" - - | 20 -> -# 104 "src/aorai/ltllexer.mll" - ( LTL_PLUS ) -# 1046 "src/aorai/ltllexer.ml" - - | 21 -> -# 105 "src/aorai/ltllexer.mll" - ( LTL_MINUS ) -# 1051 "src/aorai/ltllexer.ml" - - | 22 -> -# 106 "src/aorai/ltllexer.mll" - ( LTL_DIV ) -# 1056 "src/aorai/ltllexer.ml" - - | 23 -> -# 107 "src/aorai/ltllexer.mll" - ( LTL_STAR ) -# 1061 "src/aorai/ltllexer.ml" - - | 24 -> -# 108 "src/aorai/ltllexer.mll" - ( LTL_MODULO) -# 1066 "src/aorai/ltllexer.ml" - - | 25 -> -# 111 "src/aorai/ltllexer.mll" - ( LTL_RIGHT_ARROW ) -# 1071 "src/aorai/ltllexer.ml" - - | 26 -> -# 112 "src/aorai/ltllexer.mll" - ( LTL_DOT ) -# 1076 "src/aorai/ltllexer.ml" - - | 27 -> -# 113 "src/aorai/ltllexer.mll" - ( LTL_LEFT_SQUARE) -# 1081 "src/aorai/ltllexer.ml" - - | 28 -> -# 114 "src/aorai/ltllexer.mll" - ( LTL_RIGHT_SQUARE) -# 1086 "src/aorai/ltllexer.ml" - - | 29 -> -# 115 "src/aorai/ltllexer.mll" - ( LTL_ADRESSE ) -# 1091 "src/aorai/ltllexer.ml" - - | 30 -> -# 116 "src/aorai/ltllexer.mll" - ( LTL_CALL ) -# 1096 "src/aorai/ltllexer.ml" - - | 31 -> -# 117 "src/aorai/ltllexer.mll" - ( LTL_RETURN ) -# 1101 "src/aorai/ltllexer.ml" - - | 32 -> -# 118 "src/aorai/ltllexer.mll" - ( LTL_CALL_OR_RETURN ) -# 1106 "src/aorai/ltllexer.ml" - - | 33 -> -# 121 "src/aorai/ltllexer.mll" - ( comment lexbuf; token lexbuf ) -# 1111 "src/aorai/ltllexer.ml" - - | 34 -> -# 122 "src/aorai/ltllexer.mll" - ( newline lexbuf; token lexbuf ) -# 1116 "src/aorai/ltllexer.ml" - - | 35 -> -# 125 "src/aorai/ltllexer.mll" - ( token lexbuf ) -# 1121 "src/aorai/ltllexer.ml" - - | 36 -> -# 126 "src/aorai/ltllexer.mll" - ( newline lexbuf; token lexbuf ) -# 1126 "src/aorai/ltllexer.ml" - - | 37 -> -# 129 "src/aorai/ltllexer.mll" - ( LTL_INT (lexeme lexbuf) ) -# 1131 "src/aorai/ltllexer.ml" - - | 38 -> -# 130 "src/aorai/ltllexer.mll" - ( LTL_LABEL (lexeme lexbuf) ) -# 1136 "src/aorai/ltllexer.ml" - - | 39 -> -# 133 "src/aorai/ltllexer.mll" - ( EOF ) -# 1141 "src/aorai/ltllexer.ml" - - | 40 -> -# 134 "src/aorai/ltllexer.mll" - ( - raise_located (loc lexbuf) - (Format.sprintf "Illegal_character %s\n" (lexeme lexbuf)) - ) -# 1149 "src/aorai/ltllexer.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_token_rec lexbuf __ocaml_lex_state - -and comment lexbuf = - __ocaml_lex_comment_rec lexbuf 76 -and __ocaml_lex_comment_rec lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 140 "src/aorai/ltllexer.mll" - ( () ) -# 1160 "src/aorai/ltllexer.ml" - - | 1 -> -# 141 "src/aorai/ltllexer.mll" - ( raise_located (loc lexbuf) "Unterminated_comment\n" ) -# 1165 "src/aorai/ltllexer.ml" - - | 2 -> -# 142 "src/aorai/ltllexer.mll" - ( newline lexbuf; comment lexbuf ) -# 1170 "src/aorai/ltllexer.ml" - - | 3 -> -# 143 "src/aorai/ltllexer.mll" - ( comment lexbuf ) -# 1175 "src/aorai/ltllexer.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_comment_rec lexbuf __ocaml_lex_state - -;; - -# 146 "src/aorai/ltllexer.mll" - - let parse c = - let lb = from_channel c in - try - Ltlparser.ltl token lb - with - Parsing.Parse_error - | Invalid_argument _ -> raise_located (loc lb) "Syntax error" - -# 1191 "src/aorai/ltllexer.ml" diff -Nru frama-c-20140301+neon+dfsg/src/aorai/ltllexer.mll frama-c-20150201+sodium+dfsg/src/aorai/ltllexer.mll --- frama-c-20140301+neon+dfsg/src/aorai/ltllexer.mll 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/ltllexer.mll 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/ltl_output.ml frama-c-20150201+sodium+dfsg/src/aorai/ltl_output.ml --- frama-c-20140301+neon+dfsg/src/aorai/ltl_output.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/ltl_output.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/ltl_output.mli frama-c-20150201+sodium+dfsg/src/aorai/ltl_output.mli --- frama-c-20140301+neon+dfsg/src/aorai/ltl_output.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/ltl_output.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/ltlparser.ml frama-c-20150201+sodium+dfsg/src/aorai/ltlparser.ml --- frama-c-20140301+neon+dfsg/src/aorai/ltlparser.ml 2014-03-12 15:07:54.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/ltlparser.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,677 +0,0 @@ -type token = - | LTL_TRUE - | LTL_FALSE - | LTL_LPAREN - | LTL_RPAREN - | LTL_OR - | LTL_IMPLIES - | LTL_LEFT_RIGHT_ARROW - | LTL_AND - | LTL_NOT - | LTL_GLOBALLY - | LTL_FATALLY - | LTL_UNTIL - | LTL_RELEASE - | LTL_NEXT - | LTL_EQ - | LTL_LT - | LTL_GT - | LTL_LE - | LTL_GE - | LTL_NEQ - | LTL_PLUS - | LTL_MINUS - | LTL_DIV - | LTL_STAR - | LTL_MODULO - | LTL_RIGHT_ARROW - | LTL_DOT - | LTL_LEFT_SQUARE - | LTL_RIGHT_SQUARE - | LTL_ADRESSE - | LTL_CALL - | LTL_RETURN - | LTL_CALL_OR_RETURN - | LTL_INT of (string) - | LTL_LABEL of (string) - | EOF - -open Parsing;; -let _ = parse_error;; -# 30 "src/aorai/ltlparser.mly" -open Promelaast -open Logic_ptree - -let observed_expressions=Hashtbl.create 97 - -let ident_count=ref 0 -let get_fresh_ident () = - ident_count:=!ident_count+1; - ("buchfreshident"^(string_of_int !ident_count)) -# 52 "src/aorai/ltlparser.ml" -let yytransl_const = [| - 257 (* LTL_TRUE *); - 258 (* LTL_FALSE *); - 259 (* LTL_LPAREN *); - 260 (* LTL_RPAREN *); - 261 (* LTL_OR *); - 262 (* LTL_IMPLIES *); - 263 (* LTL_LEFT_RIGHT_ARROW *); - 264 (* LTL_AND *); - 265 (* LTL_NOT *); - 266 (* LTL_GLOBALLY *); - 267 (* LTL_FATALLY *); - 268 (* LTL_UNTIL *); - 269 (* LTL_RELEASE *); - 270 (* LTL_NEXT *); - 271 (* LTL_EQ *); - 272 (* LTL_LT *); - 273 (* LTL_GT *); - 274 (* LTL_LE *); - 275 (* LTL_GE *); - 276 (* LTL_NEQ *); - 277 (* LTL_PLUS *); - 278 (* LTL_MINUS *); - 279 (* LTL_DIV *); - 280 (* LTL_STAR *); - 281 (* LTL_MODULO *); - 282 (* LTL_RIGHT_ARROW *); - 283 (* LTL_DOT *); - 284 (* LTL_LEFT_SQUARE *); - 285 (* LTL_RIGHT_SQUARE *); - 286 (* LTL_ADRESSE *); - 287 (* LTL_CALL *); - 288 (* LTL_RETURN *); - 289 (* LTL_CALL_OR_RETURN *); - 0 (* EOF *); - 0|] - -let yytransl_block = [| - 290 (* LTL_INT *); - 291 (* LTL_LABEL *); - 0|] - -let yylhs = "\255\255\ -\001\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ -\002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ -\002\000\002\000\003\000\003\000\003\000\003\000\003\000\003\000\ -\003\000\004\000\004\000\004\000\005\000\005\000\005\000\005\000\ -\006\000\006\000\006\000\006\000\007\000\007\000\007\000\008\000\ -\008\000\009\000\009\000\009\000\009\000\000\000" - -let yylen = "\002\000\ -\002\000\001\000\001\000\003\000\002\000\002\000\003\000\003\000\ -\002\000\003\000\003\000\002\000\003\000\003\000\004\000\004\000\ -\004\000\001\000\003\000\003\000\003\000\003\000\003\000\003\000\ -\001\000\003\000\003\000\001\000\003\000\003\000\003\000\001\000\ -\001\000\002\000\001\000\003\000\003\000\003\000\001\000\004\000\ -\001\000\002\000\002\000\001\000\003\000\002\000" - -let yydefred = "\000\000\ -\000\000\000\000\002\000\003\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\033\000\ -\044\000\046\000\000\000\018\000\000\000\000\000\032\000\000\000\ -\000\000\041\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\034\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\004\000\036\000\045\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\019\000\020\000\021\000\022\000\023\000\ -\024\000\026\000\027\000\029\000\030\000\031\000\037\000\038\000\ -\000\000\015\000\016\000\017\000\000\000\040\000" - -let yydgoto = "\002\000\ -\018\000\019\000\020\000\021\000\022\000\023\000\024\000\025\000\ -\026\000" - -let yysindex = "\010\000\ -\066\255\000\000\000\000\000\000\066\255\066\255\066\255\066\255\ -\066\255\224\254\002\255\002\255\027\255\031\255\063\255\000\000\ -\000\000\000\000\131\000\000\000\045\255\070\255\000\000\014\255\ -\243\254\000\000\102\255\067\255\012\255\039\255\039\255\039\255\ -\039\255\000\000\002\255\014\255\014\255\007\255\037\255\043\255\ -\066\255\066\255\066\255\066\255\066\255\066\255\000\000\001\255\ -\001\255\001\255\001\255\001\255\001\255\001\255\001\255\001\255\ -\001\255\001\255\046\255\054\255\001\255\000\000\000\000\000\000\ -\012\255\098\255\099\255\100\255\111\255\111\255\111\255\016\255\ -\039\255\039\255\001\255\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\082\255\000\000\000\000\000\000\108\255\000\000" - -let yyrindex = "\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\122\000\105\000\000\000\079\000\ -\001\000\000\000\000\000\120\255\157\255\141\000\146\000\151\000\ -\156\000\000\000\000\000\027\000\053\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\006\000\007\000\008\000\171\000\ -\161\000\166\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000" - -let yygindex = "\000\000\ -\000\000\013\000\000\000\251\255\000\000\212\255\254\255\000\000\ -\000\000" - -let yytablesize = 434 -let yytable = "\028\000\ -\039\000\034\000\029\000\075\000\035\000\010\000\013\000\014\000\ -\036\000\037\000\001\000\084\000\085\000\086\000\061\000\064\000\ -\089\000\027\000\030\000\031\000\032\000\033\000\010\000\044\000\ -\011\000\011\000\043\000\045\000\046\000\038\000\012\000\012\000\ -\065\000\039\000\016\000\017\000\017\000\059\000\060\000\059\000\ -\060\000\066\000\076\000\077\000\078\000\079\000\080\000\081\000\ -\082\000\083\000\045\000\046\000\042\000\069\000\070\000\071\000\ -\072\000\073\000\074\000\048\000\049\000\050\000\051\000\052\000\ -\053\000\040\000\003\000\004\000\005\000\093\000\063\000\067\000\ -\029\000\000\000\006\000\007\000\008\000\068\000\035\000\009\000\ -\087\000\048\000\049\000\050\000\051\000\052\000\053\000\010\000\ -\088\000\011\000\054\000\055\000\056\000\057\000\058\000\012\000\ -\013\000\014\000\015\000\016\000\017\000\090\000\091\000\092\000\ -\028\000\062\000\041\000\042\000\043\000\044\000\094\000\063\000\ -\000\000\045\000\046\000\041\000\042\000\043\000\044\000\000\000\ -\000\000\025\000\045\000\046\000\025\000\025\000\025\000\025\000\ -\000\000\000\000\047\000\025\000\025\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\ -\000\000\005\000\000\000\000\000\000\000\000\000\006\000\000\000\ -\000\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\ -\007\000\035\000\035\000\035\000\035\000\008\000\000\000\000\000\ -\035\000\035\000\011\000\035\000\035\000\035\000\035\000\035\000\ -\035\000\035\000\035\000\035\000\035\000\035\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\039\000\039\000\039\000\039\000\ -\039\000\010\000\013\000\014\000\039\000\039\000\000\000\039\000\ -\039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ -\039\000\039\000\039\000\039\000\000\000\039\000\043\000\043\000\ -\043\000\043\000\043\000\000\000\000\000\000\000\043\000\043\000\ -\000\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ -\043\000\043\000\043\000\043\000\000\000\000\000\043\000\043\000\ -\042\000\042\000\042\000\042\000\042\000\000\000\000\000\000\000\ -\042\000\042\000\000\000\042\000\042\000\042\000\042\000\042\000\ -\042\000\042\000\042\000\042\000\042\000\042\000\000\000\000\000\ -\042\000\042\000\035\000\035\000\035\000\035\000\035\000\000\000\ -\000\000\000\000\035\000\035\000\000\000\035\000\035\000\035\000\ -\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ -\000\000\000\000\000\000\035\000\028\000\028\000\028\000\028\000\ -\028\000\000\000\000\000\000\000\028\000\028\000\000\000\028\000\ -\028\000\028\000\028\000\028\000\028\000\025\000\025\000\025\000\ -\025\000\025\000\000\000\000\000\000\000\025\000\025\000\041\000\ -\042\000\043\000\044\000\000\000\000\000\000\000\045\000\046\000\ -\012\000\012\000\012\000\012\000\012\000\005\000\005\000\005\000\ -\005\000\005\000\006\000\006\000\006\000\006\000\006\000\009\000\ -\009\000\009\000\009\000\009\000\007\000\007\000\007\000\007\000\ -\007\000\008\000\008\000\008\000\008\000\008\000\011\000\011\000\ -\011\000\011\000" - -let yycheck = "\005\000\ -\000\000\034\001\005\000\003\001\003\001\000\000\000\000\000\000\ -\011\000\012\000\001\000\056\000\057\000\058\000\028\001\004\001\ -\061\000\005\000\006\000\007\000\008\000\009\000\022\001\008\001\ -\024\001\024\001\000\000\012\001\013\001\003\001\030\001\030\001\ -\035\000\003\001\034\001\035\001\035\001\026\001\027\001\026\001\ -\027\001\035\001\048\000\049\000\050\000\051\000\052\000\053\000\ -\054\000\055\000\012\001\013\001\000\000\041\000\042\000\043\000\ -\044\000\045\000\046\000\015\001\016\001\017\001\018\001\019\001\ -\020\001\003\001\001\001\002\001\003\001\075\000\004\001\035\001\ -\075\000\255\255\009\001\010\001\011\001\035\001\000\000\014\001\ -\035\001\015\001\016\001\017\001\018\001\019\001\020\001\022\001\ -\035\001\024\001\021\001\022\001\023\001\024\001\025\001\030\001\ -\031\001\032\001\033\001\034\001\035\001\004\001\004\001\004\001\ -\000\000\004\001\005\001\006\001\007\001\008\001\029\001\004\001\ -\255\255\012\001\013\001\005\001\006\001\007\001\008\001\255\255\ -\255\255\000\000\012\001\013\001\005\001\006\001\007\001\008\001\ -\255\255\255\255\000\000\012\001\013\001\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\000\000\255\255\255\255\255\255\ -\255\255\000\000\255\255\255\255\255\255\255\255\000\000\255\255\ -\255\255\255\255\255\255\000\000\255\255\255\255\255\255\255\255\ -\000\000\005\001\006\001\007\001\008\001\000\000\255\255\255\255\ -\012\001\013\001\000\000\015\001\016\001\017\001\018\001\019\001\ -\020\001\021\001\022\001\023\001\024\001\025\001\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\004\001\005\001\006\001\007\001\ -\008\001\004\001\004\001\004\001\012\001\013\001\255\255\015\001\ -\016\001\017\001\018\001\019\001\020\001\021\001\022\001\023\001\ -\024\001\025\001\026\001\027\001\255\255\029\001\004\001\005\001\ -\006\001\007\001\008\001\255\255\255\255\255\255\012\001\013\001\ -\255\255\015\001\016\001\017\001\018\001\019\001\020\001\021\001\ -\022\001\023\001\024\001\025\001\255\255\255\255\028\001\029\001\ -\004\001\005\001\006\001\007\001\008\001\255\255\255\255\255\255\ -\012\001\013\001\255\255\015\001\016\001\017\001\018\001\019\001\ -\020\001\021\001\022\001\023\001\024\001\025\001\255\255\255\255\ -\028\001\029\001\004\001\005\001\006\001\007\001\008\001\255\255\ -\255\255\255\255\012\001\013\001\255\255\015\001\016\001\017\001\ -\018\001\019\001\020\001\021\001\022\001\023\001\024\001\025\001\ -\255\255\255\255\255\255\029\001\004\001\005\001\006\001\007\001\ -\008\001\255\255\255\255\255\255\012\001\013\001\255\255\015\001\ -\016\001\017\001\018\001\019\001\020\001\004\001\005\001\006\001\ -\007\001\008\001\255\255\255\255\255\255\012\001\013\001\005\001\ -\006\001\007\001\008\001\255\255\255\255\255\255\012\001\013\001\ -\004\001\005\001\006\001\007\001\008\001\004\001\005\001\006\001\ -\007\001\008\001\004\001\005\001\006\001\007\001\008\001\004\001\ -\005\001\006\001\007\001\008\001\004\001\005\001\006\001\007\001\ -\008\001\004\001\005\001\006\001\007\001\008\001\004\001\005\001\ -\006\001\007\001" - -let yynames_const = "\ - LTL_TRUE\000\ - LTL_FALSE\000\ - LTL_LPAREN\000\ - LTL_RPAREN\000\ - LTL_OR\000\ - LTL_IMPLIES\000\ - LTL_LEFT_RIGHT_ARROW\000\ - LTL_AND\000\ - LTL_NOT\000\ - LTL_GLOBALLY\000\ - LTL_FATALLY\000\ - LTL_UNTIL\000\ - LTL_RELEASE\000\ - LTL_NEXT\000\ - LTL_EQ\000\ - LTL_LT\000\ - LTL_GT\000\ - LTL_LE\000\ - LTL_GE\000\ - LTL_NEQ\000\ - LTL_PLUS\000\ - LTL_MINUS\000\ - LTL_DIV\000\ - LTL_STAR\000\ - LTL_MODULO\000\ - LTL_RIGHT_ARROW\000\ - LTL_DOT\000\ - LTL_LEFT_SQUARE\000\ - LTL_RIGHT_SQUARE\000\ - LTL_ADRESSE\000\ - LTL_CALL\000\ - LTL_RETURN\000\ - LTL_CALL_OR_RETURN\000\ - EOF\000\ - " - -let yynames_block = "\ - LTL_INT\000\ - LTL_LABEL\000\ - " - -let yyact = [| - (fun _ -> failwith "parser") -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 1 : 'formula) in - Obj.repr( -# 84 "src/aorai/ltlparser.mly" - ((_1,observed_expressions)) -# 325 "src/aorai/ltlparser.ml" - : (Ltlast.formula * (string, (Logic_ptree.relation * Promelaast.expression * Promelaast.expression)) Hashtbl.t))) -; (fun __caml_parser_env -> - Obj.repr( -# 90 "src/aorai/ltlparser.mly" - (Ltlast.LTrue) -# 331 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - Obj.repr( -# 92 "src/aorai/ltlparser.mly" - (Ltlast.LFalse) -# 337 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'formula) in - Obj.repr( -# 94 "src/aorai/ltlparser.mly" - ( _2 ) -# 344 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'formula) in - Obj.repr( -# 97 "src/aorai/ltlparser.mly" - ( Ltlast.LGlobally(_2) ) -# 351 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'formula) in - Obj.repr( -# 99 "src/aorai/ltlparser.mly" - ( Ltlast.LFatally(_2) ) -# 358 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'formula) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'formula) in - Obj.repr( -# 101 "src/aorai/ltlparser.mly" - ( Ltlast.LUntil(_1,_3) ) -# 366 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'formula) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'formula) in - Obj.repr( -# 103 "src/aorai/ltlparser.mly" - ( Ltlast.LRelease(_1,_3) ) -# 374 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'formula) in - Obj.repr( -# 105 "src/aorai/ltlparser.mly" - ( Ltlast.LNext(_2) ) -# 381 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'formula) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'formula) in - Obj.repr( -# 108 "src/aorai/ltlparser.mly" - ( Ltlast.LOr(_1,_3) ) -# 389 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'formula) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'formula) in - Obj.repr( -# 110 "src/aorai/ltlparser.mly" - ( Ltlast.LAnd(_1,_3) ) -# 397 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'formula) in - Obj.repr( -# 112 "src/aorai/ltlparser.mly" - ( Ltlast.LNot(_2) ) -# 404 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'formula) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'formula) in - Obj.repr( -# 114 "src/aorai/ltlparser.mly" - ( Ltlast.LImplies(_1,_3) ) -# 412 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'formula) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'formula) in - Obj.repr( -# 116 "src/aorai/ltlparser.mly" - ( Ltlast.LIff(_1,_3) ) -# 420 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - let _3 = (Parsing.peek_val __caml_parser_env 1 : string) in - Obj.repr( -# 119 "src/aorai/ltlparser.mly" - ( Ltlast.LCall(_3)) -# 427 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - let _3 = (Parsing.peek_val __caml_parser_env 1 : string) in - Obj.repr( -# 121 "src/aorai/ltlparser.mly" - ( Ltlast.LReturn(_3)) -# 434 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - let _3 = (Parsing.peek_val __caml_parser_env 1 : string) in - Obj.repr( -# 123 "src/aorai/ltlparser.mly" - ( Ltlast.LCallOrReturn(_3)) -# 441 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'logic_relation) in - Obj.repr( -# 127 "src/aorai/ltlparser.mly" - ( - let id = get_fresh_ident () in - Hashtbl.add observed_expressions id _1; - Ltlast.LIdent(id) - ) -# 452 "src/aorai/ltlparser.ml" - : 'formula)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 135 "src/aorai/ltlparser.mly" - ( Eq, _1 , _3) -# 460 "src/aorai/ltlparser.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 136 "src/aorai/ltlparser.mly" - ( Lt, _1, _3 ) -# 468 "src/aorai/ltlparser.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 137 "src/aorai/ltlparser.mly" - ( Gt, _1, _3 ) -# 476 "src/aorai/ltlparser.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 138 "src/aorai/ltlparser.mly" - ( Le, _1, _3 ) -# 484 "src/aorai/ltlparser.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 139 "src/aorai/ltlparser.mly" - ( Ge, _1, _3 ) -# 492 "src/aorai/ltlparser.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 140 "src/aorai/ltlparser.mly" - ( Neq, _1, _3 ) -# 500 "src/aorai/ltlparser.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 141 "src/aorai/ltlparser.mly" - ( Neq, _1, PCst (IntConstant "0") ) -# 507 "src/aorai/ltlparser.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_mul) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 145 "src/aorai/ltlparser.mly" - ( PBinop(Badd,_1,_3) ) -# 515 "src/aorai/ltlparser.ml" - : 'arith_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_mul) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 146 "src/aorai/ltlparser.mly" - ( PBinop(Bsub,_1,_3) ) -# 523 "src/aorai/ltlparser.ml" - : 'arith_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation_mul) in - Obj.repr( -# 147 "src/aorai/ltlparser.mly" - ( _1 ) -# 530 "src/aorai/ltlparser.ml" - : 'arith_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_mul) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'access_or_const) in - Obj.repr( -# 152 "src/aorai/ltlparser.mly" - ( PBinop(Bdiv,_1,_3) ) -# 538 "src/aorai/ltlparser.ml" - : 'arith_relation_mul)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_mul) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'access_or_const) in - Obj.repr( -# 153 "src/aorai/ltlparser.mly" - ( PBinop(Bmul,_1,_3) ) -# 546 "src/aorai/ltlparser.ml" - : 'arith_relation_mul)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_mul) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'access_or_const) in - Obj.repr( -# 154 "src/aorai/ltlparser.mly" - ( PBinop(Bmod,_1,_3)) -# 554 "src/aorai/ltlparser.ml" - : 'arith_relation_mul)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'access_or_const) in - Obj.repr( -# 155 "src/aorai/ltlparser.mly" - ( _1 ) -# 561 "src/aorai/ltlparser.ml" - : 'arith_relation_mul)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 160 "src/aorai/ltlparser.mly" - ( PCst (IntConstant _1) ) -# 568 "src/aorai/ltlparser.ml" - : 'access_or_const)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 161 "src/aorai/ltlparser.mly" - ( PUnop (Uminus,PCst (IntConstant _2)) ) -# 575 "src/aorai/ltlparser.ml" - : 'access_or_const)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'access) in - Obj.repr( -# 162 "src/aorai/ltlparser.mly" - ( _1 ) -# 582 "src/aorai/ltlparser.ml" - : 'access_or_const)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'arith_relation) in - Obj.repr( -# 163 "src/aorai/ltlparser.mly" - ( _2 ) -# 589 "src/aorai/ltlparser.ml" - : 'access_or_const)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'access) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 169 "src/aorai/ltlparser.mly" - ( PField (PUnop(Ustar,_1),_3) ) -# 597 "src/aorai/ltlparser.ml" - : 'access)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'access) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 170 "src/aorai/ltlparser.mly" - ( PField(_1,_3) ) -# 605 "src/aorai/ltlparser.ml" - : 'access)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'access_array) in - Obj.repr( -# 171 "src/aorai/ltlparser.mly" - (_1) -# 612 "src/aorai/ltlparser.ml" - : 'access)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 3 : 'access_array) in - let _3 = (Parsing.peek_val __caml_parser_env 1 : 'access_or_const) in - Obj.repr( -# 175 "src/aorai/ltlparser.mly" - ( PArrget(_1,_3) ) -# 620 "src/aorai/ltlparser.ml" - : 'access_array)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'access_leaf) in - Obj.repr( -# 176 "src/aorai/ltlparser.mly" - (_1) -# 627 "src/aorai/ltlparser.ml" - : 'access_array)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'access) in - Obj.repr( -# 180 "src/aorai/ltlparser.mly" - ( PUnop (Uamp,_2) ) -# 634 "src/aorai/ltlparser.ml" - : 'access_leaf)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'access) in - Obj.repr( -# 181 "src/aorai/ltlparser.mly" - ( PUnop (Ustar, _2 ) ) -# 641 "src/aorai/ltlparser.ml" - : 'access_leaf)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 182 "src/aorai/ltlparser.mly" - ( PVar _1 ) -# 648 "src/aorai/ltlparser.ml" - : 'access_leaf)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'access) in - Obj.repr( -# 183 "src/aorai/ltlparser.mly" - ( _2 ) -# 655 "src/aorai/ltlparser.ml" - : 'access_leaf)) -(* Entry ltl *) -; (fun __caml_parser_env -> raise (Parsing.YYexit (Parsing.peek_val __caml_parser_env 0))) -|] -let yytables = - { Parsing.actions=yyact; - Parsing.transl_const=yytransl_const; - Parsing.transl_block=yytransl_block; - Parsing.lhs=yylhs; - Parsing.len=yylen; - Parsing.defred=yydefred; - Parsing.dgoto=yydgoto; - Parsing.sindex=yysindex; - Parsing.rindex=yyrindex; - Parsing.gindex=yygindex; - Parsing.tablesize=yytablesize; - Parsing.table=yytable; - Parsing.check=yycheck; - Parsing.error_function=parse_error; - Parsing.names_const=yynames_const; - Parsing.names_block=yynames_block } -let ltl (lexfun : Lexing.lexbuf -> token) (lexbuf : Lexing.lexbuf) = - (Parsing.yyparse yytables 1 lexfun lexbuf : (Ltlast.formula * (string, (Logic_ptree.relation * Promelaast.expression * Promelaast.expression)) Hashtbl.t)) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/ltlparser.mli frama-c-20150201+sodium+dfsg/src/aorai/ltlparser.mli --- frama-c-20140301+neon+dfsg/src/aorai/ltlparser.mli 2014-03-12 15:07:54.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/ltlparser.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -type token = - | LTL_TRUE - | LTL_FALSE - | LTL_LPAREN - | LTL_RPAREN - | LTL_OR - | LTL_IMPLIES - | LTL_LEFT_RIGHT_ARROW - | LTL_AND - | LTL_NOT - | LTL_GLOBALLY - | LTL_FATALLY - | LTL_UNTIL - | LTL_RELEASE - | LTL_NEXT - | LTL_EQ - | LTL_LT - | LTL_GT - | LTL_LE - | LTL_GE - | LTL_NEQ - | LTL_PLUS - | LTL_MINUS - | LTL_DIV - | LTL_STAR - | LTL_MODULO - | LTL_RIGHT_ARROW - | LTL_DOT - | LTL_LEFT_SQUARE - | LTL_RIGHT_SQUARE - | LTL_ADRESSE - | LTL_CALL - | LTL_RETURN - | LTL_CALL_OR_RETURN - | LTL_INT of (string) - | LTL_LABEL of (string) - | EOF - -val ltl : - (Lexing.lexbuf -> token) -> Lexing.lexbuf -> (Ltlast.formula * (string, (Logic_ptree.relation * Promelaast.expression * Promelaast.expression)) Hashtbl.t) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/ltlparser.mly frama-c-20150201+sodium+dfsg/src/aorai/ltlparser.mly --- frama-c-20140301+neon+dfsg/src/aorai/ltlparser.mly 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/ltlparser.mly 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Aorai plug-in of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* INRIA (Institut National de Recherche en Informatique et en */ diff -Nru frama-c-20140301+neon+dfsg/src/aorai/Makefile.in frama-c-20150201+sodium+dfsg/src/aorai/Makefile.in --- frama-c-20140301+neon+dfsg/src/aorai/Makefile.in 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/Makefile.in 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Aorai plug-in of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # INRIA (Institut National de Recherche en Informatique et en # @@ -96,7 +96,7 @@ $(Aorai_DIR)/Makefile: $(Aorai_DIR)/Makefile.in \ $(CONFIG_STATUS_DIR)/config.status - cd $(CONFIG_STATUS_DIR) && ./config.status + cd $(CONFIG_STATUS_DIR) && ./config.status --file $@ headers:: $(SED) $(FRAMAC_SRC)/headers/INSA_INRIA_LGPL \ diff -Nru frama-c-20140301+neon+dfsg/src/aorai/path_analysis.ml frama-c-20150201+sodium+dfsg/src/aorai/path_analysis.ml --- frama-c-20140301+neon+dfsg/src/aorai/path_analysis.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/path_analysis.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/promelaast.mli frama-c-20150201+sodium+dfsg/src/aorai/promelaast.mli --- frama-c-20140301+neon+dfsg/src/aorai/promelaast.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/promelaast.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/promelalexer.ml frama-c-20150201+sodium+dfsg/src/aorai/promelalexer.ml --- frama-c-20140301+neon+dfsg/src/aorai/promelalexer.ml 2014-03-12 15:07:54.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/promelalexer.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,1401 +0,0 @@ -# 30 "src/aorai/promelalexer.mll" - - open Promelaparser - open Lexing - - exception Error of (Lexing.position * Lexing.position) * string - - let loc lexbuf = (lexeme_start_p lexbuf, lexeme_end_p lexbuf) - - let raise_located loc e = raise (Error (loc, e)) - - let buf = Buffer.create 1024 - - let newline lexbuf = - let pos = lexbuf.lex_curr_p in - lexbuf.lex_curr_p <- - { pos with pos_lnum = pos.pos_lnum + 1; pos_bol = pos.pos_cnum } - -# 20 "src/aorai/promelalexer.ml" -let __ocaml_lex_tables = { - Lexing.lex_base = - "\000\000\224\255\225\255\226\255\078\000\160\000\235\000\001\000\ - \236\255\002\000\238\255\001\000\012\000\000\000\243\255\244\255\ - \245\255\246\255\247\255\002\000\054\001\129\001\204\001\023\002\ - \098\002\173\002\248\002\067\003\142\003\217\003\036\004\111\004\ - \186\004\005\005\080\005\155\005\230\005\049\006\124\006\199\006\ - \018\007\093\007\168\007\243\007\062\008\249\255\242\255\240\255\ - \239\255\040\000\235\255\234\255\137\008\212\008\031\009\106\009\ - \181\009\000\010\075\010\150\010\225\010\044\011\119\011\194\011\ - \013\012\088\012\163\012\238\012\057\013\132\013\207\013\026\014\ - \101\014\176\014\251\014\070\015\145\015\220\015\039\016\194\015\ - \252\255\253\255\254\255\004\000\255\255"; - Lexing.lex_backtrk = - "\255\255\255\255\255\255\255\255\028\000\028\000\028\000\031\000\ - \255\255\018\000\255\255\031\000\031\000\031\000\255\255\255\255\ - \255\255\255\255\255\255\007\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\000\000\028\000\028\000\028\000\ - \001\000\002\000\028\000\003\000\028\000\028\000\014\000\028\000\ - \028\000\004\000\028\000\028\000\005\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\028\000\028\000\028\000\028\000\ - \028\000\028\000\022\000\022\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\024\000\024\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\023\000\023\000\255\255\ - \255\255\255\255\255\255\003\000\255\255"; - Lexing.lex_default = - "\001\000\000\000\000\000\000\000\255\255\255\255\255\255\255\255\ - \000\000\255\255\000\000\255\255\255\255\255\255\000\000\000\000\ - \000\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\000\000\000\000\000\000\ - \000\000\049\000\000\000\000\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\080\000\ - \000\000\000\000\000\000\255\255\000\000"; - Lexing.lex_trans = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\009\000\008\000\009\000\009\000\009\000\009\000\009\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \009\000\010\000\009\000\000\000\000\000\000\000\011\000\048\000\ - \017\000\016\000\000\000\050\000\000\000\013\000\000\000\007\000\ - \049\000\002\000\051\000\084\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\019\000\018\000\045\000\000\000\046\000\000\000\ - \000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\000\000\000\000\000\000\000\000\004\000\ - \000\000\004\000\004\000\006\000\004\000\004\000\022\000\021\000\ - \004\000\023\000\004\000\004\000\004\000\004\000\024\000\004\000\ - \004\000\004\000\005\000\020\000\025\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\015\000\012\000\014\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \047\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\000\000\000\000\000\000\000\000\004\000\000\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\000\000\000\000\000\000\000\000\004\000\ - \003\000\004\000\004\000\004\000\004\000\070\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\ - \255\255\000\000\000\000\000\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\000\000\000\000\ - \000\000\000\000\004\000\000\000\052\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\000\000\000\000\000\000\000\000\004\000\000\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\042\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\000\000\000\000\000\000\000\000\ - \004\000\000\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \039\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\000\000\ - \000\000\000\000\000\000\004\000\000\000\034\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\035\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\000\000\000\000\000\000\000\000\004\000\000\000\ - \004\000\004\000\004\000\004\000\004\000\033\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\ - \000\000\004\000\000\000\004\000\004\000\004\000\004\000\029\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \000\000\000\000\000\000\000\000\004\000\000\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\026\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\000\000\000\000\000\000\000\000\004\000\ - \000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\027\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\000\000\000\000\ - \000\000\000\000\004\000\000\000\004\000\004\000\004\000\004\000\ - \028\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\000\000\000\000\000\000\000\000\004\000\000\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\000\000\000\000\000\000\000\000\ - \004\000\000\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\030\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\000\000\ - \000\000\000\000\000\000\004\000\000\000\004\000\004\000\004\000\ - \004\000\031\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\000\000\000\000\000\000\000\000\004\000\000\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\032\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\ - \000\000\004\000\000\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \000\000\000\000\000\000\000\000\004\000\000\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\000\000\000\000\000\000\000\000\004\000\ - \000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\036\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\000\000\000\000\ - \000\000\000\000\004\000\000\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\000\000\000\000\000\000\000\000\004\000\000\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\037\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\000\000\000\000\000\000\000\000\ - \004\000\000\000\004\000\004\000\004\000\004\000\038\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\000\000\ - \000\000\000\000\000\000\004\000\000\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\000\000\000\000\000\000\000\000\004\000\000\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\040\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\ - \000\000\004\000\000\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\041\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \000\000\000\000\000\000\000\000\004\000\000\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\000\000\000\000\000\000\000\000\004\000\ - \000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\043\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\000\000\000\000\ - \000\000\000\000\004\000\000\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\044\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\000\000\000\000\000\000\000\000\004\000\000\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\000\000\000\000\000\000\000\000\ - \004\000\000\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\053\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\000\000\ - \000\000\000\000\000\000\004\000\000\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \054\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\000\000\000\000\000\000\000\000\004\000\000\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\055\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\ - \000\000\004\000\000\000\004\000\004\000\004\000\004\000\004\000\ - \057\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\056\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \000\000\000\000\000\000\000\000\004\000\000\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\060\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\000\000\000\000\000\000\000\000\058\000\ - \000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\000\000\000\000\ - \000\000\000\000\058\000\000\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\000\000\000\000\000\000\000\000\059\000\000\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\000\000\000\000\000\000\000\000\ - \004\000\000\000\004\000\004\000\004\000\004\000\061\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\000\000\ - \000\000\000\000\000\000\004\000\000\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \062\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\000\000\000\000\000\000\000\000\004\000\000\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\063\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\ - \000\000\004\000\000\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\064\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \000\000\000\000\000\000\000\000\004\000\000\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\065\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\000\000\000\000\000\000\000\000\004\000\ - \000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\066\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\000\000\000\000\ - \000\000\000\000\004\000\000\000\004\000\004\000\004\000\004\000\ - \004\000\067\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\000\000\000\000\000\000\000\000\068\000\000\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\000\000\000\000\000\000\000\000\ - \068\000\000\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\000\000\ - \000\000\000\000\000\000\069\000\000\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\000\000\000\000\000\000\000\000\004\000\000\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\071\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\ - \000\000\004\000\000\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\072\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \000\000\000\000\000\000\000\000\004\000\000\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\073\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\000\000\000\000\000\000\000\000\004\000\ - \000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\074\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\000\000\000\000\ - \000\000\000\000\004\000\000\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\075\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\000\000\000\000\000\000\000\000\004\000\000\000\004\000\ - \004\000\004\000\004\000\004\000\076\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\000\000\081\000\000\000\000\000\000\000\ - \000\000\000\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\083\000\000\000\000\000\000\000\ - \077\000\000\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\000\000\ - \000\000\000\000\000\000\077\000\000\000\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\000\000\000\000\000\000\000\000\078\000\000\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\082\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - "; - Lexing.lex_check = - "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\000\000\000\000\009\000\000\000\000\000\009\000\009\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \000\000\000\000\009\000\255\255\255\255\255\255\000\000\011\000\ - \000\000\000\000\255\255\007\000\255\255\000\000\255\255\000\000\ - \007\000\000\000\049\000\083\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\000\000\000\000\019\000\255\255\013\000\255\255\ - \255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\255\255\255\255\255\255\255\255\000\000\ - \255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \012\000\255\255\255\255\255\255\255\255\255\255\255\255\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\255\255\255\255\255\255\255\255\004\000\255\255\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\255\255\255\255\255\255\255\255\005\000\ - \000\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\255\255\255\255\255\255\ - \049\000\255\255\255\255\255\255\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\255\255\255\255\ - \255\255\255\255\006\000\255\255\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\020\000\020\000\ - \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\020\000\ - \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\ - \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\ - \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\ - \020\000\255\255\255\255\255\255\255\255\020\000\255\255\020\000\ - \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\ - \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\ - \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\ - \020\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\ - \021\000\021\000\021\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\021\000\021\000\021\000\021\000\021\000\021\000\ - \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\ - \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\ - \021\000\021\000\021\000\021\000\255\255\255\255\255\255\255\255\ - \021\000\255\255\021\000\021\000\021\000\021\000\021\000\021\000\ - \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\ - \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\ - \021\000\021\000\021\000\021\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\022\000\255\255\ - \255\255\255\255\255\255\022\000\255\255\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\022\000\023\000\ - \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ - \023\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ - \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ - \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ - \023\000\023\000\255\255\255\255\255\255\255\255\023\000\255\255\ - \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ - \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ - \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ - \023\000\023\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\255\255\255\255\255\255\ - \255\255\024\000\255\255\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \255\255\255\255\255\255\255\255\025\000\255\255\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\255\255\255\255\255\255\255\255\026\000\ - \255\255\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\255\255\255\255\ - \255\255\255\255\027\000\255\255\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\255\255\255\255\255\255\255\255\028\000\255\255\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\255\255\255\255\255\255\255\255\ - \029\000\255\255\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\255\255\ - \255\255\255\255\255\255\030\000\255\255\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\255\255\255\255\255\255\255\255\031\000\255\255\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\255\255\255\255\255\255\ - \255\255\032\000\255\255\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \255\255\255\255\255\255\255\255\033\000\255\255\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\255\255\255\255\255\255\255\255\034\000\ - \255\255\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\035\000\035\000\035\000\035\000\035\000\ - \035\000\035\000\035\000\035\000\035\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\035\000\035\000\035\000\035\000\ - \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ - \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ - \035\000\035\000\035\000\035\000\035\000\035\000\255\255\255\255\ - \255\255\255\255\035\000\255\255\035\000\035\000\035\000\035\000\ - \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ - \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ - \035\000\035\000\035\000\035\000\035\000\035\000\036\000\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\255\255\255\255\255\255\255\255\036\000\255\255\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\255\255\255\255\255\255\255\255\ - \037\000\255\255\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\038\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\255\255\ - \255\255\255\255\255\255\038\000\255\255\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\255\255\255\255\255\255\255\255\039\000\255\255\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\040\000\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\255\255\255\255\255\255\ - \255\255\040\000\255\255\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \255\255\255\255\255\255\255\255\041\000\255\255\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\255\255\255\255\255\255\255\255\042\000\ - \255\255\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\255\255\255\255\ - \255\255\255\255\043\000\255\255\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\255\255\255\255\255\255\255\255\044\000\255\255\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\255\255\255\255\255\255\255\255\ - \052\000\255\255\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\255\255\ - \255\255\255\255\255\255\053\000\255\255\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\054\000\ - \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ - \054\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ - \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ - \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ - \054\000\054\000\255\255\255\255\255\255\255\255\054\000\255\255\ - \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ - \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ - \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ - \054\000\054\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\255\255\255\255\255\255\ - \255\255\055\000\255\255\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \255\255\255\255\255\255\255\255\056\000\255\255\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ - \057\000\057\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ - \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ - \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ - \057\000\057\000\057\000\255\255\255\255\255\255\255\255\057\000\ - \255\255\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ - \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ - \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ - \057\000\057\000\057\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\255\255\255\255\ - \255\255\255\255\058\000\255\255\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\255\255\255\255\255\255\255\255\059\000\255\255\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\255\255\255\255\255\255\255\255\ - \060\000\255\255\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\061\000\061\000\061\000\061\000\ - \061\000\061\000\061\000\061\000\061\000\061\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\061\000\061\000\061\000\ - \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ - \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ - \061\000\061\000\061\000\061\000\061\000\061\000\061\000\255\255\ - \255\255\255\255\255\255\061\000\255\255\061\000\061\000\061\000\ - \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ - \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ - \061\000\061\000\061\000\061\000\061\000\061\000\061\000\062\000\ - \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ - \062\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ - \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ - \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ - \062\000\062\000\255\255\255\255\255\255\255\255\062\000\255\255\ - \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ - \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ - \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ - \062\000\062\000\063\000\063\000\063\000\063\000\063\000\063\000\ - \063\000\063\000\063\000\063\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\063\000\063\000\063\000\063\000\063\000\ - \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ - \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ - \063\000\063\000\063\000\063\000\063\000\255\255\255\255\255\255\ - \255\255\063\000\255\255\063\000\063\000\063\000\063\000\063\000\ - \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ - \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ - \063\000\063\000\063\000\063\000\063\000\064\000\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \255\255\255\255\255\255\255\255\064\000\255\255\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\255\255\255\255\255\255\255\255\065\000\ - \255\255\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\066\000\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\255\255\255\255\ - \255\255\255\255\066\000\255\255\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\255\255\255\255\255\255\255\255\067\000\255\255\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\255\255\255\255\255\255\255\255\ - \068\000\255\255\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\255\255\ - \255\255\255\255\255\255\069\000\255\255\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\255\255\255\255\255\255\255\255\070\000\255\255\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\255\255\255\255\255\255\ - \255\255\071\000\255\255\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\072\000\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \255\255\255\255\255\255\255\255\072\000\255\255\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\255\255\255\255\255\255\255\255\073\000\ - \255\255\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\255\255\255\255\ - \255\255\255\255\074\000\255\255\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\075\000\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\255\255\255\255\255\255\255\255\075\000\255\255\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ - \076\000\076\000\076\000\255\255\079\000\255\255\255\255\255\255\ - \255\255\255\255\076\000\076\000\076\000\076\000\076\000\076\000\ - \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ - \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ - \076\000\076\000\076\000\076\000\079\000\255\255\255\255\255\255\ - \076\000\255\255\076\000\076\000\076\000\076\000\076\000\076\000\ - \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ - \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ - \076\000\076\000\076\000\076\000\077\000\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\255\255\ - \255\255\255\255\255\255\077\000\255\255\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\255\255\255\255\255\255\255\255\078\000\255\255\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\079\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - "; - Lexing.lex_base_code = - ""; - Lexing.lex_backtrk_code = - ""; - Lexing.lex_default_code = - ""; - Lexing.lex_trans_code = - ""; - Lexing.lex_check_code = - ""; - Lexing.lex_code = - ""; -} - -let rec token lexbuf = - __ocaml_lex_token_rec lexbuf 0 -and __ocaml_lex_token_rec lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 53 "src/aorai/promelalexer.mll" - ( PROMELA_TRUE ) -# 1181 "src/aorai/promelalexer.ml" - - | 1 -> -# 54 "src/aorai/promelalexer.mll" - ( PROMELA_NEVER ) -# 1186 "src/aorai/promelalexer.ml" - - | 2 -> -# 55 "src/aorai/promelalexer.mll" - ( PROMELA_IF ) -# 1191 "src/aorai/promelalexer.ml" - - | 3 -> -# 56 "src/aorai/promelalexer.mll" - ( PROMELA_FI ) -# 1196 "src/aorai/promelalexer.ml" - - | 4 -> -# 57 "src/aorai/promelalexer.mll" - ( PROMELA_GOTO ) -# 1201 "src/aorai/promelalexer.ml" - - | 5 -> -# 58 "src/aorai/promelalexer.mll" - ( PROMELA_SKIP ) -# 1206 "src/aorai/promelalexer.ml" - - | 6 -> -# 59 "src/aorai/promelalexer.mll" - ( PROMELA_DOUBLE_COLON ) -# 1211 "src/aorai/promelalexer.ml" - - | 7 -> -# 60 "src/aorai/promelalexer.mll" - ( PROMELA_COLON ) -# 1216 "src/aorai/promelalexer.ml" - - | 8 -> -# 61 "src/aorai/promelalexer.mll" - ( PROMELA_SEMICOLON ) -# 1221 "src/aorai/promelalexer.ml" - - | 9 -> -# 62 "src/aorai/promelalexer.mll" - ( PROMELA_LPAREN ) -# 1226 "src/aorai/promelalexer.ml" - - | 10 -> -# 63 "src/aorai/promelalexer.mll" - ( PROMELA_RPAREN ) -# 1231 "src/aorai/promelalexer.ml" - - | 11 -> -# 64 "src/aorai/promelalexer.mll" - ( PROMELA_LBRACE ) -# 1236 "src/aorai/promelalexer.ml" - - | 12 -> -# 65 "src/aorai/promelalexer.mll" - ( PROMELA_RBRACE ) -# 1241 "src/aorai/promelalexer.ml" - - | 13 -> -# 66 "src/aorai/promelalexer.mll" - ( PROMELA_RIGHT_ARROW ) -# 1246 "src/aorai/promelalexer.ml" - - | 14 -> -# 67 "src/aorai/promelalexer.mll" - ( PROMELA_FALSE ) -# 1251 "src/aorai/promelalexer.ml" - - | 15 -> -# 68 "src/aorai/promelalexer.mll" - ( PROMELA_OR ) -# 1256 "src/aorai/promelalexer.ml" - - | 16 -> -# 69 "src/aorai/promelalexer.mll" - ( PROMELA_AND ) -# 1261 "src/aorai/promelalexer.ml" - - | 17 -> -# 70 "src/aorai/promelalexer.mll" - ( PROMELA_NOT ) -# 1266 "src/aorai/promelalexer.ml" - - | 18 -> -# 71 "src/aorai/promelalexer.mll" - ( token lexbuf ) -# 1271 "src/aorai/promelalexer.ml" - - | 19 -> -# 72 "src/aorai/promelalexer.mll" - ( newline lexbuf; token lexbuf ) -# 1276 "src/aorai/promelalexer.ml" - - | 20 -> -# 73 "src/aorai/promelalexer.mll" - ( comment lexbuf; token lexbuf ) -# 1281 "src/aorai/promelalexer.ml" - - | 21 -> -# 74 "src/aorai/promelalexer.mll" - ( newline lexbuf; token lexbuf ) -# 1286 "src/aorai/promelalexer.ml" - - | 22 -> -# 77 "src/aorai/promelalexer.mll" - ( let s=(lexeme lexbuf) in - let s=String.sub s 7 ((String.length s)-7) in - PROMELA_CALLOF s ) -# 1293 "src/aorai/promelalexer.ml" - - | 23 -> -# 81 "src/aorai/promelalexer.mll" - ( let s=(lexeme lexbuf) in - let s=String.sub s 9 ((String.length s)-9) in - PROMELA_RETURNOF s ) -# 1300 "src/aorai/promelalexer.ml" - - | 24 -> -# 85 "src/aorai/promelalexer.mll" - ( let s=(lexeme lexbuf) in - let s=String.sub s 15 ((String.length s)-15) in - PROMELA_CALLORRETURNOF s ) -# 1307 "src/aorai/promelalexer.ml" - - | 25 -> -# 90 "src/aorai/promelalexer.mll" - ( raise_located (loc lexbuf) "Illegal fonction name in Promela file." ) -# 1312 "src/aorai/promelalexer.ml" - - | 26 -> -# 91 "src/aorai/promelalexer.mll" - ( raise_located (loc lexbuf) "Illegal fonction name in Promela file." ) -# 1317 "src/aorai/promelalexer.ml" - - | 27 -> -# 92 "src/aorai/promelalexer.mll" - ( raise_located (loc lexbuf) "Illegal fonction name in Promela file." ) -# 1322 "src/aorai/promelalexer.ml" - - | 28 -> -# 96 "src/aorai/promelalexer.mll" - ( let s = lexeme lexbuf in - PROMELA_LABEL s ) -# 1328 "src/aorai/promelalexer.ml" - - | 29 -> -# 98 "src/aorai/promelalexer.mll" - ( EOF ) -# 1333 "src/aorai/promelalexer.ml" - - | 30 -> -# 100 "src/aorai/promelalexer.mll" - ( PROMELA_TRUE ) -# 1338 "src/aorai/promelalexer.ml" - - | 31 -> -# 101 "src/aorai/promelalexer.mll" - ( Aorai_option.error "Illegal_character : '%s'\n" (lexeme lexbuf); - raise Parsing.Parse_error) -# 1344 "src/aorai/promelalexer.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_token_rec lexbuf __ocaml_lex_state - -and comment lexbuf = - __ocaml_lex_comment_rec lexbuf 79 -and __ocaml_lex_comment_rec lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 108 "src/aorai/promelalexer.mll" - ( () ) -# 1355 "src/aorai/promelalexer.ml" - - | 1 -> -# 109 "src/aorai/promelalexer.mll" - ( Aorai_option.error "Unterminated_comment\n" (*lex_error lexbuf "Unterminated_comment"*) ) -# 1360 "src/aorai/promelalexer.ml" - - | 2 -> -# 110 "src/aorai/promelalexer.mll" - ( newline lexbuf; comment lexbuf ) -# 1365 "src/aorai/promelalexer.ml" - - | 3 -> -# 111 "src/aorai/promelalexer.mll" - ( comment lexbuf ) -# 1370 "src/aorai/promelalexer.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_comment_rec lexbuf __ocaml_lex_state - -;; - -# 114 "src/aorai/promelalexer.mll" - - let parse c = - let lb = from_channel c in - try - Promelaparser.promela token lb - with - Parsing.Parse_error - | Invalid_argument _ -> - let (a,b)=(loc lb) in - Aorai_option.error "Syntax error (l%d c%d -> l%dc%d)" a.pos_lnum (a.pos_cnum-a.pos_bol) b.pos_lnum (b.pos_cnum-b.pos_bol); -(* Format.print_string "Syntax error (" ; *) -(* Format.print_string "l" ; *) -(* Format.print_int a.pos_lnum ; *) -(* Format.print_string "c" ; *) -(* Format.print_int (a.pos_cnum-a.pos_bol) ;*) -(* Format.print_string " -> l" ; *) -(* Format.print_int b.pos_lnum ; *) -(* Format.print_string "c" ; *) -(* Format.print_int (b.pos_cnum-b.pos_bol) ;*) -(* Format.print_string ")\n" ; *) - raise_located (loc lb) "Syntax error" - - - - -# 1402 "src/aorai/promelalexer.ml" diff -Nru frama-c-20140301+neon+dfsg/src/aorai/promelalexer.mll frama-c-20150201+sodium+dfsg/src/aorai/promelalexer.mll --- frama-c-20140301+neon+dfsg/src/aorai/promelalexer.mll 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/promelalexer.mll 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/promelalexer_withexps.ml frama-c-20150201+sodium+dfsg/src/aorai/promelalexer_withexps.ml --- frama-c-20140301+neon+dfsg/src/aorai/promelalexer_withexps.ml 2014-03-12 15:07:54.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/promelalexer_withexps.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,1494 +0,0 @@ -# 30 "src/aorai/promelalexer_withexps.mll" - - open Promelaparser_withexps - open Lexing - - exception Error of (Lexing.position * Lexing.position) * string - - let loc lexbuf = (lexeme_start_p lexbuf, lexeme_end_p lexbuf) - - let raise_located loc e = raise (Error (loc, e)) - - let buf = Buffer.create 1024 - - let newline lexbuf = - let pos = lexbuf.lex_curr_p in - lexbuf.lex_curr_p <- - { pos with pos_lnum = pos.pos_lnum + 1; pos_bol = pos.pos_cnum } - - -# 21 "src/aorai/promelalexer_withexps.ml" -let __ocaml_lex_tables = { - Lexing.lex_base = - "\000\000\208\255\210\255\078\000\212\255\213\255\214\255\215\255\ - \216\255\219\255\002\000\003\000\031\000\153\000\163\000\238\000\ - \094\000\235\255\002\000\033\000\001\000\013\000\057\001\242\255\ - \243\255\244\255\003\000\247\255\038\000\072\001\147\001\222\001\ - \041\002\116\002\191\002\010\003\085\003\160\003\235\003\054\004\ - \129\004\204\004\023\005\098\005\173\005\248\005\067\006\142\006\ - \217\006\036\007\111\007\186\007\005\008\080\008\249\255\246\255\ - \155\008\241\255\239\255\238\255\220\255\130\000\234\255\233\255\ - \165\008\240\008\059\009\134\009\209\009\028\010\103\010\178\010\ - \253\010\072\011\147\011\222\011\041\012\116\012\191\012\010\013\ - \085\013\160\013\235\013\054\014\129\014\204\014\023\015\098\015\ - \173\015\248\015\067\016\225\255\222\255\221\255\132\000\252\255\ - \253\255\254\255\091\000\255\255"; - Lexing.lex_backtrk = - "\255\255\255\255\255\255\044\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\032\000\031\000\047\000\029\000\044\000\044\000\ - \038\000\255\255\019\000\018\000\047\000\047\000\037\000\255\255\ - \255\255\255\255\010\000\255\255\007\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\000\000\044\000\044\000\ - \044\000\001\000\002\000\044\000\003\000\044\000\044\000\015\000\ - \044\000\044\000\004\000\044\000\044\000\005\000\255\255\255\255\ - \029\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \044\000\044\000\044\000\044\000\044\000\044\000\023\000\023\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \025\000\025\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\024\000\024\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\003\000\255\255"; - Lexing.lex_default = - "\001\000\000\000\000\000\255\255\000\000\000\000\000\000\000\000\ - \000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\000\000\255\255\255\255\255\255\255\255\255\255\000\000\ - \000\000\000\000\255\255\000\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\000\000\000\000\ - \255\255\000\000\000\000\000\000\000\000\061\000\000\000\000\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\000\000\000\000\000\000\095\000\000\000\ - \000\000\000\000\255\255\000\000"; - Lexing.lex_trans = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\018\000\017\000\018\000\018\000\018\000\018\000\018\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \018\000\019\000\018\000\000\000\000\000\007\000\020\000\059\000\ - \026\000\025\000\008\000\009\000\055\000\022\000\006\000\016\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\028\000\027\000\011\000\012\000\010\000\093\000\ - \092\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\005\000\091\000\004\000\060\000\003\000\ - \054\000\003\000\003\000\015\000\003\000\003\000\031\000\030\000\ - \003\000\032\000\003\000\003\000\003\000\003\000\033\000\003\000\ - \003\000\003\000\014\000\029\000\034\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\024\000\021\000\023\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \062\000\058\000\099\000\000\000\063\000\061\000\096\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\003\000\098\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \002\000\000\000\003\000\000\000\003\000\003\000\003\000\003\000\ - \082\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\003\000\000\000\064\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\000\000\000\000\000\000\000\000\057\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\255\255\000\000\097\000\000\000\000\000\000\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\051\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\003\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\048\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\003\000\000\000\043\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\044\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \003\000\000\000\003\000\003\000\003\000\003\000\003\000\042\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\003\000\000\000\003\000\003\000\003\000\ - \003\000\038\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\035\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\036\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\003\000\000\000\003\000\003\000\ - \003\000\003\000\037\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\003\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\039\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ - \003\000\003\000\003\000\040\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \003\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\041\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\003\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\045\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\003\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\046\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\003\000\000\000\003\000\003\000\003\000\003\000\ - \047\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \003\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\049\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\003\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\050\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\052\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\003\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\053\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\056\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\003\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\065\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\066\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\003\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\067\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\069\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \068\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \003\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\072\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\070\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\000\000\000\000\000\000\000\000\070\000\000\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\000\000\000\000\000\000\ - \000\000\071\000\000\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\003\000\000\000\003\000\003\000\ - \003\000\003\000\073\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\074\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\003\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \075\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \076\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \003\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\077\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\003\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\078\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\079\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\080\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\080\000\080\000\ - \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\ - \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\ - \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\ - \000\000\000\000\000\000\000\000\080\000\000\000\080\000\080\000\ - \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\ - \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\ - \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\000\000\000\000\000\000\000\000\081\000\ - \000\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\003\000\000\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\083\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\084\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \003\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\085\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\003\000\000\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\086\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\087\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \000\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \088\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\000\000\000\000\000\000\089\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\ - \090\000\090\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ - \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ - \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ - \089\000\089\000\089\000\000\000\000\000\000\000\000\000\089\000\ - \000\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ - \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ - \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ - \089\000\089\000\089\000\090\000\090\000\090\000\090\000\090\000\ - \090\000\090\000\090\000\090\000\090\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\090\000\090\000\090\000\090\000\ - \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\ - \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\ - \090\000\090\000\090\000\090\000\090\000\090\000\000\000\000\000\ - \000\000\000\000\090\000\000\000\090\000\090\000\090\000\090\000\ - \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\ - \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\ - \090\000\090\000\090\000\090\000\090\000\090\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000"; - Lexing.lex_check = - "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\000\000\000\000\018\000\000\000\000\000\018\000\018\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \000\000\000\000\018\000\255\255\255\255\000\000\000\000\020\000\ - \000\000\000\000\000\000\000\000\026\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\010\000\ - \011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\012\000\000\000\019\000\000\000\ - \028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \016\000\021\000\098\000\255\255\061\000\016\000\094\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\255\255\255\255\255\255\255\255\003\000\094\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\014\000\014\000\014\000\014\000\014\000\ - \014\000\014\000\014\000\014\000\014\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\014\000\014\000\014\000\014\000\ - \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\ - \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\ - \014\000\014\000\014\000\014\000\014\000\014\000\255\255\255\255\ - \000\000\255\255\014\000\255\255\014\000\014\000\014\000\014\000\ - \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\ - \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\ - \014\000\014\000\014\000\014\000\014\000\014\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\255\255\255\255\255\255\255\255\015\000\255\255\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\255\255\255\255\255\255\255\255\022\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\061\000\255\255\094\000\255\255\255\255\255\255\ - \255\255\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\255\255\255\255\255\255\255\255\029\000\ - \255\255\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\255\255\255\255\ - \255\255\255\255\030\000\255\255\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\255\255\255\255\255\255\255\255\031\000\255\255\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\255\255\255\255\255\255\255\255\ - \032\000\255\255\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\255\255\ - \255\255\255\255\255\255\033\000\255\255\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\034\000\ - \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\255\255\255\255\255\255\255\255\034\000\255\255\ - \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ - \034\000\034\000\035\000\035\000\035\000\035\000\035\000\035\000\ - \035\000\035\000\035\000\035\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\035\000\035\000\035\000\035\000\035\000\ - \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ - \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ - \035\000\035\000\035\000\035\000\035\000\255\255\255\255\255\255\ - \255\255\035\000\255\255\035\000\035\000\035\000\035\000\035\000\ - \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ - \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ - \035\000\035\000\035\000\035\000\035\000\036\000\036\000\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\036\000\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \255\255\255\255\255\255\255\255\036\000\255\255\036\000\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\255\255\255\255\255\255\255\255\037\000\ - \255\255\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\038\000\038\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\038\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\255\255\255\255\ - \255\255\255\255\038\000\255\255\038\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\255\255\255\255\255\255\255\255\039\000\255\255\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\040\000\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\255\255\255\255\255\255\255\255\ - \040\000\255\255\040\000\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\255\255\ - \255\255\255\255\255\255\041\000\255\255\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\255\255\255\255\255\255\255\255\042\000\255\255\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\255\255\255\255\255\255\ - \255\255\043\000\255\255\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \255\255\255\255\255\255\255\255\044\000\255\255\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\045\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\045\000\045\000\255\255\255\255\255\255\255\255\045\000\ - \255\255\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\045\000\045\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\255\255\255\255\ - \255\255\255\255\046\000\255\255\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ - \047\000\255\255\255\255\255\255\255\255\047\000\255\255\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ - \047\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\048\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\048\000\048\000\255\255\255\255\255\255\255\255\ - \048\000\255\255\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\048\000\048\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\049\000\255\255\ - \255\255\255\255\255\255\049\000\255\255\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\049\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \050\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \050\000\050\000\255\255\255\255\255\255\255\255\050\000\255\255\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \050\000\050\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\051\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\051\000\051\000\255\255\255\255\255\255\ - \255\255\051\000\255\255\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\051\000\051\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \255\255\255\255\255\255\255\255\052\000\255\255\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\255\255\255\255\255\255\255\255\053\000\ - \255\255\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\056\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\064\000\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \255\255\255\255\255\255\255\255\064\000\255\255\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\255\255\255\255\255\255\255\255\065\000\ - \255\255\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\066\000\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\255\255\255\255\ - \255\255\255\255\066\000\255\255\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ - \066\000\066\000\066\000\066\000\066\000\066\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\255\255\255\255\255\255\255\255\067\000\255\255\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\255\255\255\255\255\255\255\255\ - \068\000\255\255\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\255\255\ - \255\255\255\255\255\255\069\000\255\255\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\255\255\255\255\255\255\255\255\070\000\255\255\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\255\255\255\255\255\255\ - \255\255\071\000\255\255\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\072\000\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \255\255\255\255\255\255\255\255\072\000\255\255\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ - \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\255\255\255\255\255\255\255\255\073\000\ - \255\255\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\ - \073\000\073\000\073\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\255\255\255\255\ - \255\255\255\255\074\000\255\255\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\075\000\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\255\255\255\255\255\255\255\255\075\000\255\255\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\ - \075\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ - \076\000\076\000\076\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\076\000\076\000\076\000\076\000\076\000\076\000\ - \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ - \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ - \076\000\076\000\076\000\076\000\255\255\255\255\255\255\255\255\ - \076\000\255\255\076\000\076\000\076\000\076\000\076\000\076\000\ - \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ - \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ - \076\000\076\000\076\000\076\000\077\000\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\255\255\ - \255\255\255\255\255\255\077\000\255\255\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\ - \077\000\077\000\077\000\077\000\077\000\077\000\077\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\255\255\255\255\255\255\255\255\078\000\255\255\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\255\255\255\255\255\255\ - \255\255\079\000\255\255\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\080\000\080\000\080\000\ - \080\000\080\000\080\000\080\000\080\000\080\000\080\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\080\000\080\000\ - \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\ - \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\ - \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\ - \255\255\255\255\255\255\255\255\080\000\255\255\080\000\080\000\ - \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\ - \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\ - \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\255\255\255\255\255\255\255\255\081\000\ - \255\255\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\082\000\082\000\082\000\082\000\082\000\ - \082\000\082\000\082\000\082\000\082\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\082\000\082\000\082\000\082\000\ - \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ - \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ - \082\000\082\000\082\000\082\000\082\000\082\000\255\255\255\255\ - \255\255\255\255\082\000\255\255\082\000\082\000\082\000\082\000\ - \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ - \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ - \082\000\082\000\082\000\082\000\082\000\082\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\255\255\255\255\255\255\255\255\083\000\255\255\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\ - \084\000\084\000\084\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\084\000\084\000\084\000\084\000\084\000\084\000\ - \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\ - \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\ - \084\000\084\000\084\000\084\000\255\255\255\255\255\255\255\255\ - \084\000\255\255\084\000\084\000\084\000\084\000\084\000\084\000\ - \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\ - \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\ - \084\000\084\000\084\000\084\000\085\000\085\000\085\000\085\000\ - \085\000\085\000\085\000\085\000\085\000\085\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\085\000\085\000\085\000\ - \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\ - \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\ - \085\000\085\000\085\000\085\000\085\000\085\000\085\000\255\255\ - \255\255\255\255\255\255\085\000\255\255\085\000\085\000\085\000\ - \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\ - \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\ - \085\000\085\000\085\000\085\000\085\000\085\000\085\000\086\000\ - \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\ - \086\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\ - \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\ - \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\ - \086\000\086\000\255\255\255\255\255\255\255\255\086\000\255\255\ - \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\ - \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\ - \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\ - \086\000\086\000\087\000\087\000\087\000\087\000\087\000\087\000\ - \087\000\087\000\087\000\087\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\087\000\087\000\087\000\087\000\087\000\ - \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\ - \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\ - \087\000\087\000\087\000\087\000\087\000\255\255\255\255\255\255\ - \255\255\087\000\255\255\087\000\087\000\087\000\087\000\087\000\ - \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\ - \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\ - \087\000\087\000\087\000\087\000\087\000\088\000\088\000\088\000\ - \088\000\088\000\088\000\088\000\088\000\088\000\088\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\088\000\088\000\ - \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\ - \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\ - \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\ - \255\255\255\255\255\255\255\255\088\000\255\255\088\000\088\000\ - \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\ - \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\ - \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\ - \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ - \089\000\089\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ - \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ - \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ - \089\000\089\000\089\000\255\255\255\255\255\255\255\255\089\000\ - \255\255\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ - \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ - \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\ - \089\000\089\000\089\000\090\000\090\000\090\000\090\000\090\000\ - \090\000\090\000\090\000\090\000\090\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\090\000\090\000\090\000\090\000\ - \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\ - \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\ - \090\000\090\000\090\000\090\000\090\000\090\000\255\255\255\255\ - \255\255\255\255\090\000\255\255\090\000\090\000\090\000\090\000\ - \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\ - \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\ - \090\000\090\000\090\000\090\000\090\000\090\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255"; - Lexing.lex_base_code = - ""; - Lexing.lex_backtrk_code = - ""; - Lexing.lex_default_code = - ""; - Lexing.lex_trans_code = - ""; - Lexing.lex_check_code = - ""; - Lexing.lex_code = - ""; -} - -let rec token lexbuf = - __ocaml_lex_token_rec lexbuf 0 -and __ocaml_lex_token_rec lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 57 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_TRUE ) -# 1194 "src/aorai/promelalexer_withexps.ml" - - | 1 -> -# 58 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_NEVER ) -# 1199 "src/aorai/promelalexer_withexps.ml" - - | 2 -> -# 59 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_IF ) -# 1204 "src/aorai/promelalexer_withexps.ml" - - | 3 -> -# 60 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_FI ) -# 1209 "src/aorai/promelalexer_withexps.ml" - - | 4 -> -# 61 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_GOTO ) -# 1214 "src/aorai/promelalexer_withexps.ml" - - | 5 -> -# 62 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_SKIP ) -# 1219 "src/aorai/promelalexer_withexps.ml" - - | 6 -> -# 63 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_DOUBLE_COLON ) -# 1224 "src/aorai/promelalexer_withexps.ml" - - | 7 -> -# 64 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_COLON ) -# 1229 "src/aorai/promelalexer_withexps.ml" - - | 8 -> -# 65 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_SEMICOLON ) -# 1234 "src/aorai/promelalexer_withexps.ml" - - | 9 -> -# 66 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_FUNC ) -# 1239 "src/aorai/promelalexer_withexps.ml" - - | 10 -> -# 67 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_LPAREN ) -# 1244 "src/aorai/promelalexer_withexps.ml" - - | 11 -> -# 68 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_RPAREN ) -# 1249 "src/aorai/promelalexer_withexps.ml" - - | 12 -> -# 69 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_LBRACE ) -# 1254 "src/aorai/promelalexer_withexps.ml" - - | 13 -> -# 70 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_RBRACE ) -# 1259 "src/aorai/promelalexer_withexps.ml" - - | 14 -> -# 71 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_RIGHT_ARROW ) -# 1264 "src/aorai/promelalexer_withexps.ml" - - | 15 -> -# 72 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_FALSE ) -# 1269 "src/aorai/promelalexer_withexps.ml" - - | 16 -> -# 73 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_OR ) -# 1274 "src/aorai/promelalexer_withexps.ml" - - | 17 -> -# 74 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_AND ) -# 1279 "src/aorai/promelalexer_withexps.ml" - - | 18 -> -# 75 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_NOT ) -# 1284 "src/aorai/promelalexer_withexps.ml" - - | 19 -> -# 76 "src/aorai/promelalexer_withexps.mll" - ( token lexbuf ) -# 1289 "src/aorai/promelalexer_withexps.ml" - - | 20 -> -# 77 "src/aorai/promelalexer_withexps.mll" - ( newline lexbuf; token lexbuf ) -# 1294 "src/aorai/promelalexer_withexps.ml" - - | 21 -> -# 78 "src/aorai/promelalexer_withexps.mll" - ( comment lexbuf; token lexbuf ) -# 1299 "src/aorai/promelalexer_withexps.ml" - - | 22 -> -# 79 "src/aorai/promelalexer_withexps.mll" - ( newline lexbuf; token lexbuf ) -# 1304 "src/aorai/promelalexer_withexps.ml" - - | 23 -> -# 82 "src/aorai/promelalexer_withexps.mll" - ( let s=(lexeme lexbuf) in - let s=String.sub s 7 ((String.length s)-7) in - PROMELA_CALLOF s ) -# 1311 "src/aorai/promelalexer_withexps.ml" - - | 24 -> -# 86 "src/aorai/promelalexer_withexps.mll" - ( let s=(lexeme lexbuf) in - let s=String.sub s 9 ((String.length s)-9) in - PROMELA_RETURNOF s ) -# 1318 "src/aorai/promelalexer_withexps.ml" - - | 25 -> -# 90 "src/aorai/promelalexer_withexps.mll" - ( let s=(lexeme lexbuf) in - let s=String.sub s 15 ((String.length s)-15) in - PROMELA_CALLORRETURNOF s ) -# 1325 "src/aorai/promelalexer_withexps.ml" - - | 26 -> -# 95 "src/aorai/promelalexer_withexps.mll" - ( raise_located (loc lexbuf) "Illegal fonction name in Promela file." ) -# 1330 "src/aorai/promelalexer_withexps.ml" - - | 27 -> -# 96 "src/aorai/promelalexer_withexps.mll" - ( raise_located (loc lexbuf) "Illegal fonction name in Promela file." ) -# 1335 "src/aorai/promelalexer_withexps.ml" - - | 28 -> -# 97 "src/aorai/promelalexer_withexps.mll" - ( raise_located (loc lexbuf) "Illegal fonction name in Promela file." ) -# 1340 "src/aorai/promelalexer_withexps.ml" - - | 29 -> -# 100 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_INT (lexeme lexbuf) ) -# 1345 "src/aorai/promelalexer_withexps.ml" - - | 30 -> -# 104 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_EQ ) -# 1350 "src/aorai/promelalexer_withexps.ml" - - | 31 -> -# 105 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_LT ) -# 1355 "src/aorai/promelalexer_withexps.ml" - - | 32 -> -# 106 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_GT ) -# 1360 "src/aorai/promelalexer_withexps.ml" - - | 33 -> -# 107 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_LE ) -# 1365 "src/aorai/promelalexer_withexps.ml" - - | 34 -> -# 108 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_GE ) -# 1370 "src/aorai/promelalexer_withexps.ml" - - | 35 -> -# 109 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_NEQ ) -# 1375 "src/aorai/promelalexer_withexps.ml" - - | 36 -> -# 112 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_PLUS ) -# 1380 "src/aorai/promelalexer_withexps.ml" - - | 37 -> -# 113 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_MINUS ) -# 1385 "src/aorai/promelalexer_withexps.ml" - - | 38 -> -# 114 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_DIV ) -# 1390 "src/aorai/promelalexer_withexps.ml" - - | 39 -> -# 115 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_STAR ) -# 1395 "src/aorai/promelalexer_withexps.ml" - - | 40 -> -# 116 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_MODULO) -# 1400 "src/aorai/promelalexer_withexps.ml" - - | 41 -> -# 120 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_DOT ) -# 1405 "src/aorai/promelalexer_withexps.ml" - - | 42 -> -# 121 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_LEFT_SQUARE) -# 1410 "src/aorai/promelalexer_withexps.ml" - - | 43 -> -# 122 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_RIGHT_SQUARE) -# 1415 "src/aorai/promelalexer_withexps.ml" - - | 44 -> -# 128 "src/aorai/promelalexer_withexps.mll" - ( let s = lexeme lexbuf in - PROMELA_LABEL s ) -# 1421 "src/aorai/promelalexer_withexps.ml" - - | 45 -> -# 130 "src/aorai/promelalexer_withexps.mll" - ( EOF ) -# 1426 "src/aorai/promelalexer_withexps.ml" - - | 46 -> -# 132 "src/aorai/promelalexer_withexps.mll" - ( PROMELA_TRUE ) -# 1431 "src/aorai/promelalexer_withexps.ml" - - | 47 -> -# 133 "src/aorai/promelalexer_withexps.mll" - ( Aorai_option.error "Illegal_character : '%s'\n" (lexeme lexbuf); - raise Parsing.Parse_error) -# 1437 "src/aorai/promelalexer_withexps.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_token_rec lexbuf __ocaml_lex_state - -and comment lexbuf = - __ocaml_lex_comment_rec lexbuf 94 -and __ocaml_lex_comment_rec lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 140 "src/aorai/promelalexer_withexps.mll" - ( () ) -# 1448 "src/aorai/promelalexer_withexps.ml" - - | 1 -> -# 141 "src/aorai/promelalexer_withexps.mll" - ( Aorai_option.warning "Unterminated_comment\n" (*lex_error lexbuf "Unterminated_comment"*) ) -# 1453 "src/aorai/promelalexer_withexps.ml" - - | 2 -> -# 142 "src/aorai/promelalexer_withexps.mll" - ( newline lexbuf; comment lexbuf ) -# 1458 "src/aorai/promelalexer_withexps.ml" - - | 3 -> -# 143 "src/aorai/promelalexer_withexps.mll" - ( comment lexbuf ) -# 1463 "src/aorai/promelalexer_withexps.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_comment_rec lexbuf __ocaml_lex_state - -;; - -# 146 "src/aorai/promelalexer_withexps.mll" - - let parse c = - let lb = from_channel c in - try - Promelaparser_withexps.promela token lb - with - Parsing.Parse_error - | Invalid_argument _ -> - let (a,b)=(loc lb) in - Aorai_option.error "Syntax error (l%d c%d -> l%dc%d)" a.pos_lnum (a.pos_cnum-a.pos_bol) b.pos_lnum (b.pos_cnum-b.pos_bol); -(* Format.print_string "Syntax error (" ; *) -(* Format.print_string "l" ; *) -(* Format.print_int a.pos_lnum ; *) -(* Format.print_string "c" ; *) -(* Format.print_int (a.pos_cnum-a.pos_bol) ;*) -(* Format.print_string " -> l" ; *) -(* Format.print_int b.pos_lnum ; *) -(* Format.print_string "c" ; *) -(* Format.print_int (b.pos_cnum-b.pos_bol) ;*) -(* Format.print_string ")\n" ; *) - raise_located (loc lb) "Syntax error" - - - - -# 1495 "src/aorai/promelalexer_withexps.ml" diff -Nru frama-c-20140301+neon+dfsg/src/aorai/promelalexer_withexps.mll frama-c-20150201+sodium+dfsg/src/aorai/promelalexer_withexps.mll --- frama-c-20140301+neon+dfsg/src/aorai/promelalexer_withexps.mll 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/promelalexer_withexps.mll 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/promelaoutput.ml frama-c-20150201+sodium+dfsg/src/aorai/promelaoutput.ml --- frama-c-20140301+neon+dfsg/src/aorai/promelaoutput.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/promelaoutput.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/promelaoutput.mli frama-c-20150201+sodium+dfsg/src/aorai/promelaoutput.mli --- frama-c-20140301+neon+dfsg/src/aorai/promelaoutput.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/promelaoutput.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/promelaparser.ml frama-c-20150201+sodium+dfsg/src/aorai/promelaparser.ml --- frama-c-20140301+neon+dfsg/src/aorai/promelaparser.ml 2014-03-12 15:07:54.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/promelaparser.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,479 +0,0 @@ -type token = - | PROMELA_OR - | PROMELA_AND - | PROMELA_NOT - | PROMELA_TRUE - | PROMELA_FALSE - | PROMELA_NEVER - | PROMELA_IF - | PROMELA_FI - | PROMELA_GOTO - | PROMELA_SKIP - | PROMELA_LABEL of (string) - | PROMELA_COLON - | PROMELA_SEMICOLON - | PROMELA_DOUBLE_COLON - | PROMELA_LBRACE - | PROMELA_RBRACE - | PROMELA_LPAREN - | PROMELA_RPAREN - | PROMELA_RIGHT_ARROW - | PROMELA_CALLOF of (string) - | PROMELA_RETURNOF of (string) - | PROMELA_CALLORRETURNOF of (string) - | EOF - -open Parsing;; -let _ = parse_error;; -# 30 "src/aorai/promelaparser.mly" -open Promelaast -open Bool3 - -let observed_states=Hashtbl.create 1 - -let to_seq c = - [{ condition = Some c; nested = []; - min_rep = Some (PCst (Logic_ptree.IntConstant "1")); - max_rep = Some (PCst (Logic_ptree.IntConstant "1")); - }] - -# 41 "src/aorai/promelaparser.ml" -let yytransl_const = [| - 257 (* PROMELA_OR *); - 258 (* PROMELA_AND *); - 259 (* PROMELA_NOT *); - 260 (* PROMELA_TRUE *); - 261 (* PROMELA_FALSE *); - 262 (* PROMELA_NEVER *); - 263 (* PROMELA_IF *); - 264 (* PROMELA_FI *); - 265 (* PROMELA_GOTO *); - 266 (* PROMELA_SKIP *); - 268 (* PROMELA_COLON *); - 269 (* PROMELA_SEMICOLON *); - 270 (* PROMELA_DOUBLE_COLON *); - 271 (* PROMELA_LBRACE *); - 272 (* PROMELA_RBRACE *); - 273 (* PROMELA_LPAREN *); - 274 (* PROMELA_RPAREN *); - 275 (* PROMELA_RIGHT_ARROW *); - 0 (* EOF *); - 0|] - -let yytransl_block = [| - 267 (* PROMELA_LABEL *); - 276 (* PROMELA_CALLOF *); - 277 (* PROMELA_RETURNOF *); - 278 (* PROMELA_CALLORRETURNOF *); - 0|] - -let yylhs = "\255\255\ -\001\000\001\000\002\000\002\000\003\000\004\000\004\000\006\000\ -\005\000\005\000\005\000\005\000\007\000\007\000\008\000\009\000\ -\009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ -\009\000\000\000" - -let yylen = "\002\000\ -\005\000\006\000\003\000\001\000\002\000\002\000\001\000\002\000\ -\003\000\001\000\001\000\004\000\002\000\001\000\005\000\001\000\ -\001\000\001\000\001\000\001\000\002\000\003\000\003\000\003\000\ -\001\000\002\000" - -let yydefred = "\000\000\ -\000\000\000\000\000\000\026\000\000\000\000\000\000\000\004\000\ -\000\000\000\000\008\000\000\000\000\000\011\000\000\000\010\000\ -\005\000\006\000\000\000\003\000\001\000\000\000\000\000\014\000\ -\002\000\000\000\019\000\000\000\025\000\000\000\017\000\018\000\ -\016\000\000\000\009\000\000\000\013\000\020\000\021\000\012\000\ -\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\ -\015\000" - -let yydgoto = "\002\000\ -\004\000\007\000\008\000\009\000\017\000\010\000\023\000\024\000\ -\034\000" - -let yysindex = "\012\000\ -\029\255\000\000\026\255\000\000\038\255\039\255\027\255\000\000\ -\037\255\038\255\000\000\015\255\052\000\000\000\040\255\000\000\ -\000\000\000\000\055\000\000\000\000\000\253\254\022\255\000\000\ -\000\000\017\255\000\000\048\255\000\000\017\255\000\000\000\000\ -\000\000\004\255\000\000\017\255\000\000\000\000\000\000\000\000\ -\014\255\017\255\017\255\049\255\000\000\002\255\055\255\050\255\ -\000\000" - -let yyrindex = "\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\043\255\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\008\255\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\249\254\006\255\000\000\ -\000\000" - -let yygindex = "\000\000\ -\000\000\000\000\047\000\050\000\000\000\000\000\000\000\039\000\ -\003\000" - -let yytablesize = 62 -let yytable = "\026\000\ -\027\000\028\000\042\000\043\000\042\000\043\000\022\000\029\000\ -\020\000\020\000\023\000\023\000\001\000\030\000\042\000\043\000\ -\031\000\032\000\033\000\026\000\027\000\038\000\044\000\022\000\ -\022\000\006\000\020\000\029\000\039\000\035\000\019\000\045\000\ -\041\000\030\000\003\000\036\000\031\000\032\000\033\000\012\000\ -\005\000\014\000\013\000\015\000\046\000\047\000\016\000\007\000\ -\006\000\007\000\011\000\021\000\007\000\022\000\025\000\040\000\ -\043\000\048\000\020\000\018\000\049\000\037\000" - -let yycheck = "\003\001\ -\004\001\005\001\001\001\002\001\001\001\002\001\001\001\011\001\ -\001\001\002\001\018\001\019\001\001\000\017\001\001\001\002\001\ -\020\001\021\001\022\001\003\001\004\001\005\001\019\001\018\001\ -\019\001\011\001\019\001\011\001\026\000\008\001\016\001\018\001\ -\030\000\017\001\006\001\014\001\020\001\021\001\022\001\013\001\ -\015\001\005\001\016\001\007\001\042\000\043\000\010\001\005\001\ -\011\001\007\001\012\001\000\000\010\001\014\001\000\000\008\001\ -\002\001\009\001\012\000\010\000\011\001\023\000" - -let yynames_const = "\ - PROMELA_OR\000\ - PROMELA_AND\000\ - PROMELA_NOT\000\ - PROMELA_TRUE\000\ - PROMELA_FALSE\000\ - PROMELA_NEVER\000\ - PROMELA_IF\000\ - PROMELA_FI\000\ - PROMELA_GOTO\000\ - PROMELA_SKIP\000\ - PROMELA_COLON\000\ - PROMELA_SEMICOLON\000\ - PROMELA_DOUBLE_COLON\000\ - PROMELA_LBRACE\000\ - PROMELA_RBRACE\000\ - PROMELA_LPAREN\000\ - PROMELA_RPAREN\000\ - PROMELA_RIGHT_ARROW\000\ - EOF\000\ - " - -let yynames_block = "\ - PROMELA_LABEL\000\ - PROMELA_CALLOF\000\ - PROMELA_RETURNOF\000\ - PROMELA_CALLORRETURNOF\000\ - " - -let yyact = [| - (fun _ -> failwith "parser") -; (fun __caml_parser_env -> - let _3 = (Parsing.peek_val __caml_parser_env 2 : 'states) in - Obj.repr( -# 69 "src/aorai/promelaparser.mly" - ( - let states= - Hashtbl.fold (fun _ st l -> - if st.acceptation=Undefined || st.init=Undefined then - begin - Aorai_option.abort - "Error: the state %s is used but never defined" st.name; - end; - st::l - ) observed_states [] - in - (states , _3) - ) -# 187 "src/aorai/promelaparser.ml" - : Promelaast.parsed_automaton)) -; (fun __caml_parser_env -> - let _3 = (Parsing.peek_val __caml_parser_env 3 : 'states) in - Obj.repr( -# 83 "src/aorai/promelaparser.mly" - ( - let states= - Hashtbl.fold (fun _ st l -> - if st.acceptation=Undefined || st.init=Undefined then - begin - Aorai_option.abort - "Error: the state %s is used but never defined" st.name; - end; - st::l - ) observed_states [] - in - (states , _3) ) -# 205 "src/aorai/promelaparser.ml" - : Promelaast.parsed_automaton)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'states) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'state) in - Obj.repr( -# 98 "src/aorai/promelaparser.mly" - ( - _1@_3 - ) -# 215 "src/aorai/promelaparser.ml" - : 'states)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'state) in - Obj.repr( -# 101 "src/aorai/promelaparser.mly" - ( _1 ) -# 222 "src/aorai/promelaparser.ml" - : 'states)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 1 : 'state_labels) in - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'state_body) in - Obj.repr( -# 105 "src/aorai/promelaparser.mly" - ( - let (stl,trans)=_1 in - let (trl,force_final)=_2 in - if force_final then - begin - List.iter (fun s -> - try - (Hashtbl.find observed_states s.name).acceptation <- True - with - | Not_found -> assert false - (* This state has to be in the hashtable -- by construction *) - ) stl - end; - if trl=[] then - trans - else - let tr_list= - List.fold_left (fun l1 (cr,stop_st) -> - List.fold_left (fun l2 st -> - {start=st;stop=stop_st;cross=Seq (to_seq cr);numt=(-1)}::l2 - ) l1 stl - ) [] trl - in - (List.rev tr_list)@trans - ) -# 254 "src/aorai/promelaparser.ml" - : 'state)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 1 : 'label) in - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'state_labels) in - Obj.repr( -# 133 "src/aorai/promelaparser.mly" - ( - let (stl1,trl1)=_1 in - let (stl2,trl2)=_2 in - (stl1@stl2,trl1@trl2) - ) -# 266 "src/aorai/promelaparser.ml" - : 'state_labels)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'label) in - Obj.repr( -# 138 "src/aorai/promelaparser.mly" - ( _1 ) -# 273 "src/aorai/promelaparser.ml" - : 'state_labels)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 1 : string) in - Obj.repr( -# 142 "src/aorai/promelaparser.mly" - ( - begin - (* Step 0 : trans is the set of new transitions and old is the description of the current state *) - let trans = ref [] in - (* Promela Label is a state. According to its name, we will try to give him its properties (init / accept) *) - (* Firstly, if this state is still referenced, then we get it back. Else, we make a new "empty" state *) - let old= - try - Hashtbl.find observed_states _1 - with - | Not_found -> - let s = Data_for_aorai.new_state _1 in - Hashtbl.add observed_states _1 s; - s - in - (* Step 1 : setting up the acceptance status *) - (* Default status : Non acceptation state *) - old.acceptation <- False; - - (* Accept_all state means acceptance state with a - reflexive transition without cross condition *) - (* This case is not exclusive with the following. - Acceptation status is set in this last. *) - if (String.length _1>=10) && - (String.compare (String.sub _1 0 10) "accept_all")=0 - then - trans:= - {start=old;stop=old;cross=Seq (to_seq PTrue);numt=(-1)} :: - !trans; - (* If the name includes accept then - this state is an acceptation one. *) - if (String.length _1>=7) && - (String.compare (String.sub _1 0 7) "accept_")=0 - then - old.acceptation <- True; - - (* Step 2 : setting up the init status *) - (* If the state name ended with "_init" then - it is an initial state. Else, it is not. *) - if (String.length _1>=5) && - (String.compare (String.sub _1 ((String.length _1)-5) 5) - "_init" ) = 0 - then - old.init <- True - else - old.init <- False; - ([old],!trans) - end - ) -# 328 "src/aorai/promelaparser.ml" - : 'label)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'transitions) in - Obj.repr( -# 195 "src/aorai/promelaparser.mly" - ( (_2,false) ) -# 335 "src/aorai/promelaparser.ml" - : 'state_body)) -; (fun __caml_parser_env -> - Obj.repr( -# 196 "src/aorai/promelaparser.mly" - ( ([],false) ) -# 341 "src/aorai/promelaparser.ml" - : 'state_body)) -; (fun __caml_parser_env -> - Obj.repr( -# 197 "src/aorai/promelaparser.mly" - ( ([],true) ) -# 347 "src/aorai/promelaparser.ml" - : 'state_body)) -; (fun __caml_parser_env -> - Obj.repr( -# 198 "src/aorai/promelaparser.mly" - ( ([],true) ) -# 353 "src/aorai/promelaparser.ml" - : 'state_body)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 1 : 'transitions) in - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'transition) in - Obj.repr( -# 203 "src/aorai/promelaparser.mly" - ( _1@[_2] ) -# 361 "src/aorai/promelaparser.ml" - : 'transitions)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'transition) in - Obj.repr( -# 204 "src/aorai/promelaparser.mly" - ( [_1] ) -# 368 "src/aorai/promelaparser.ml" - : 'transitions)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 3 : 'guard) in - let _5 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 208 "src/aorai/promelaparser.mly" - ( - let s= - try - Hashtbl.find observed_states _5 - with - Not_found -> - let r = Data_for_aorai.new_state _5 in - Hashtbl.add observed_states _5 r; - r - in - (_2,s) - ) -# 387 "src/aorai/promelaparser.ml" - : 'transition)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 223 "src/aorai/promelaparser.mly" - ( POr(PCall (_1,None), PReturn _1) ) -# 394 "src/aorai/promelaparser.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 224 "src/aorai/promelaparser.mly" - ( PCall (_1,None) ) -# 401 "src/aorai/promelaparser.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 225 "src/aorai/promelaparser.mly" - ( PReturn _1 ) -# 408 "src/aorai/promelaparser.ml" - : 'guard)) -; (fun __caml_parser_env -> - Obj.repr( -# 226 "src/aorai/promelaparser.mly" - ( PTrue ) -# 414 "src/aorai/promelaparser.ml" - : 'guard)) -; (fun __caml_parser_env -> - Obj.repr( -# 227 "src/aorai/promelaparser.mly" - ( PFalse ) -# 420 "src/aorai/promelaparser.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'guard) in - Obj.repr( -# 228 "src/aorai/promelaparser.mly" - ( PNot _2 ) -# 427 "src/aorai/promelaparser.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'guard) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'guard) in - Obj.repr( -# 229 "src/aorai/promelaparser.mly" - ( PAnd (_1,_3) ) -# 435 "src/aorai/promelaparser.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'guard) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'guard) in - Obj.repr( -# 230 "src/aorai/promelaparser.mly" - ( POr (_1,_3) ) -# 443 "src/aorai/promelaparser.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'guard) in - Obj.repr( -# 231 "src/aorai/promelaparser.mly" - ( _2 ) -# 450 "src/aorai/promelaparser.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 233 "src/aorai/promelaparser.mly" - ( PRel (Logic_ptree.Neq,PVar _1,PCst(Logic_ptree.IntConstant "0")) ) -# 457 "src/aorai/promelaparser.ml" - : 'guard)) -(* Entry promela *) -; (fun __caml_parser_env -> raise (Parsing.YYexit (Parsing.peek_val __caml_parser_env 0))) -|] -let yytables = - { Parsing.actions=yyact; - Parsing.transl_const=yytransl_const; - Parsing.transl_block=yytransl_block; - Parsing.lhs=yylhs; - Parsing.len=yylen; - Parsing.defred=yydefred; - Parsing.dgoto=yydgoto; - Parsing.sindex=yysindex; - Parsing.rindex=yyrindex; - Parsing.gindex=yygindex; - Parsing.tablesize=yytablesize; - Parsing.table=yytable; - Parsing.check=yycheck; - Parsing.error_function=parse_error; - Parsing.names_const=yynames_const; - Parsing.names_block=yynames_block } -let promela (lexfun : Lexing.lexbuf -> token) (lexbuf : Lexing.lexbuf) = - (Parsing.yyparse yytables 1 lexfun lexbuf : Promelaast.parsed_automaton) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/promelaparser.mli frama-c-20150201+sodium+dfsg/src/aorai/promelaparser.mli --- frama-c-20140301+neon+dfsg/src/aorai/promelaparser.mli 2014-03-12 15:07:54.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/promelaparser.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -type token = - | PROMELA_OR - | PROMELA_AND - | PROMELA_NOT - | PROMELA_TRUE - | PROMELA_FALSE - | PROMELA_NEVER - | PROMELA_IF - | PROMELA_FI - | PROMELA_GOTO - | PROMELA_SKIP - | PROMELA_LABEL of (string) - | PROMELA_COLON - | PROMELA_SEMICOLON - | PROMELA_DOUBLE_COLON - | PROMELA_LBRACE - | PROMELA_RBRACE - | PROMELA_LPAREN - | PROMELA_RPAREN - | PROMELA_RIGHT_ARROW - | PROMELA_CALLOF of (string) - | PROMELA_RETURNOF of (string) - | PROMELA_CALLORRETURNOF of (string) - | EOF - -val promela : - (Lexing.lexbuf -> token) -> Lexing.lexbuf -> Promelaast.parsed_automaton diff -Nru frama-c-20140301+neon+dfsg/src/aorai/promelaparser.mly frama-c-20150201+sodium+dfsg/src/aorai/promelaparser.mly --- frama-c-20140301+neon+dfsg/src/aorai/promelaparser.mly 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/promelaparser.mly 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Aorai plug-in of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* INRIA (Institut National de Recherche en Informatique et en */ diff -Nru frama-c-20140301+neon+dfsg/src/aorai/promelaparser_withexps.ml frama-c-20150201+sodium+dfsg/src/aorai/promelaparser_withexps.ml --- frama-c-20140301+neon+dfsg/src/aorai/promelaparser_withexps.ml 2014-03-12 15:07:54.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/promelaparser_withexps.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,790 +0,0 @@ -type token = - | PROMELA_OR - | PROMELA_AND - | PROMELA_NOT - | PROMELA_TRUE - | PROMELA_FALSE - | PROMELA_NEVER - | PROMELA_IF - | PROMELA_FI - | PROMELA_GOTO - | PROMELA_SKIP - | PROMELA_LABEL of (string) - | PROMELA_INT of (string) - | PROMELA_COLON - | PROMELA_SEMICOLON - | PROMELA_DOUBLE_COLON - | PROMELA_LBRACE - | PROMELA_RBRACE - | PROMELA_LPAREN - | PROMELA_RPAREN - | PROMELA_RIGHT_ARROW - | PROMELA_EQ - | PROMELA_LT - | PROMELA_GT - | PROMELA_LE - | PROMELA_GE - | PROMELA_NEQ - | PROMELA_PLUS - | PROMELA_MINUS - | PROMELA_DIV - | PROMELA_STAR - | PROMELA_MODULO - | PROMELA_DOT - | PROMELA_LEFT_SQUARE - | PROMELA_RIGHT_SQUARE - | PROMELA_CALLOF of (string) - | PROMELA_RETURNOF of (string) - | PROMELA_CALLORRETURNOF of (string) - | EOF - | PROMELA_FUNC - -open Parsing;; -let _ = parse_error;; -# 30 "src/aorai/promelaparser_withexps.mly" -open Logic_ptree -open Promelaast -open Bool3 - - -let observed_states=Hashtbl.create 1 - -let to_seq c = - [{ condition = Some c; nested = []; - min_rep = Some (PCst (IntConstant "1")); - max_rep = Some (PCst (IntConstant "1")); - }] -# 58 "src/aorai/promelaparser_withexps.ml" -let yytransl_const = [| - 257 (* PROMELA_OR *); - 258 (* PROMELA_AND *); - 259 (* PROMELA_NOT *); - 260 (* PROMELA_TRUE *); - 261 (* PROMELA_FALSE *); - 262 (* PROMELA_NEVER *); - 263 (* PROMELA_IF *); - 264 (* PROMELA_FI *); - 265 (* PROMELA_GOTO *); - 266 (* PROMELA_SKIP *); - 269 (* PROMELA_COLON *); - 270 (* PROMELA_SEMICOLON *); - 271 (* PROMELA_DOUBLE_COLON *); - 272 (* PROMELA_LBRACE *); - 273 (* PROMELA_RBRACE *); - 274 (* PROMELA_LPAREN *); - 275 (* PROMELA_RPAREN *); - 276 (* PROMELA_RIGHT_ARROW *); - 277 (* PROMELA_EQ *); - 278 (* PROMELA_LT *); - 279 (* PROMELA_GT *); - 280 (* PROMELA_LE *); - 281 (* PROMELA_GE *); - 282 (* PROMELA_NEQ *); - 283 (* PROMELA_PLUS *); - 284 (* PROMELA_MINUS *); - 285 (* PROMELA_DIV *); - 286 (* PROMELA_STAR *); - 287 (* PROMELA_MODULO *); - 288 (* PROMELA_DOT *); - 289 (* PROMELA_LEFT_SQUARE *); - 290 (* PROMELA_RIGHT_SQUARE *); - 0 (* EOF *); - 294 (* PROMELA_FUNC *); - 0|] - -let yytransl_block = [| - 267 (* PROMELA_LABEL *); - 268 (* PROMELA_INT *); - 291 (* PROMELA_CALLOF *); - 292 (* PROMELA_RETURNOF *); - 293 (* PROMELA_CALLORRETURNOF *); - 0|] - -let yylhs = "\255\255\ -\001\000\001\000\002\000\002\000\003\000\004\000\004\000\006\000\ -\005\000\005\000\005\000\005\000\007\000\007\000\008\000\009\000\ -\009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ -\009\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ -\011\000\011\000\011\000\012\000\012\000\012\000\012\000\013\000\ -\013\000\013\000\013\000\014\000\014\000\015\000\015\000\016\000\ -\016\000\016\000\016\000\000\000" - -let yylen = "\002\000\ -\005\000\006\000\003\000\001\000\002\000\002\000\001\000\002\000\ -\003\000\001\000\001\000\004\000\002\000\001\000\005\000\001\000\ -\001\000\001\000\001\000\001\000\002\000\003\000\003\000\003\000\ -\001\000\003\000\003\000\003\000\003\000\003\000\003\000\001\000\ -\003\000\003\000\001\000\003\000\003\000\003\000\001\000\001\000\ -\002\000\001\000\003\000\003\000\001\000\004\000\001\000\002\000\ -\004\000\001\000\003\000\002\000" - -let yydefred = "\000\000\ -\000\000\000\000\000\000\052\000\000\000\000\000\000\000\004\000\ -\000\000\000\000\008\000\000\000\000\000\011\000\000\000\010\000\ -\005\000\006\000\000\000\003\000\001\000\000\000\000\000\014\000\ -\002\000\000\000\019\000\000\000\000\000\040\000\000\000\000\000\ -\000\000\017\000\018\000\016\000\000\000\025\000\000\000\000\000\ -\039\000\000\000\000\000\047\000\009\000\000\000\013\000\020\000\ -\021\000\012\000\000\000\000\000\000\000\000\000\041\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\024\000\043\000\051\000\000\000\000\000\000\000\ -\000\000\000\000\026\000\027\000\028\000\029\000\030\000\031\000\ -\033\000\034\000\036\000\037\000\038\000\044\000\000\000\049\000\ -\015\000\000\000\046\000" - -let yydgoto = "\002\000\ -\004\000\007\000\008\000\009\000\017\000\010\000\023\000\024\000\ -\037\000\038\000\039\000\040\000\041\000\042\000\043\000\044\000" - -let yysindex = "\003\000\ -\014\255\000\000\041\255\000\000\085\255\126\255\002\255\000\000\ -\139\255\085\255\000\000\001\255\148\000\000\000\143\255\000\000\ -\000\000\000\000\159\000\000\000\000\000\010\255\250\254\000\000\ -\000\000\038\255\000\000\182\255\164\255\000\000\038\255\192\255\ -\037\255\000\000\000\000\000\000\104\255\000\000\039\255\124\255\ -\000\000\173\255\176\255\000\000\000\000\038\255\000\000\000\000\ -\000\000\000\000\178\255\006\255\076\255\075\255\000\000\037\255\ -\173\255\038\255\038\255\202\255\255\254\255\254\255\254\255\254\ -\255\254\255\254\255\254\255\254\255\254\255\254\255\254\201\255\ -\255\254\203\255\000\000\000\000\000\000\075\255\052\255\211\255\ -\204\255\255\254\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\183\255\000\000\ -\000\000\197\255\000\000" - -let yyrindex = "\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\140\255\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\186\255\057\255\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\004\255\172\255\ -\000\000\141\255\091\255\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\068\255\155\255\000\000\000\000\ -\107\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\084\255\188\255\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000" - -let yygindex = "\000\000\ -\000\000\000\000\206\000\209\000\000\000\000\000\000\000\197\000\ -\013\000\000\000\225\255\000\000\130\000\226\255\000\000\000\000" - -let yytablesize = 220 -let yytable = "\053\000\ -\054\000\045\000\057\000\001\000\032\000\032\000\058\000\059\000\ -\046\000\029\000\030\000\006\000\026\000\027\000\028\000\012\000\ -\082\000\019\000\013\000\003\000\029\000\030\000\032\000\032\000\ -\075\000\078\000\032\000\031\000\033\000\083\000\084\000\085\000\ -\086\000\087\000\088\000\089\000\090\000\032\000\049\000\033\000\ -\026\000\027\000\048\000\052\000\034\000\035\000\036\000\029\000\ -\029\000\030\000\098\000\054\000\058\000\059\000\056\000\031\000\ -\005\000\050\000\050\000\061\000\062\000\063\000\064\000\065\000\ -\066\000\032\000\033\000\033\000\032\000\032\000\079\000\080\000\ -\034\000\035\000\036\000\050\000\050\000\050\000\050\000\050\000\ -\050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ -\050\000\050\000\050\000\045\000\045\000\077\000\076\000\006\000\ -\061\000\062\000\063\000\064\000\065\000\066\000\023\000\023\000\ -\058\000\059\000\072\000\048\000\048\000\045\000\045\000\045\000\ -\045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ -\045\000\045\000\045\000\060\000\045\000\048\000\048\000\048\000\ -\048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ -\048\000\048\000\011\000\048\000\048\000\042\000\042\000\014\000\ -\007\000\015\000\007\000\021\000\016\000\007\000\067\000\068\000\ -\069\000\070\000\071\000\042\000\042\000\022\000\025\000\042\000\ -\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ -\042\000\042\000\042\000\042\000\035\000\035\000\042\000\042\000\ -\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ -\042\000\042\000\020\000\020\000\022\000\050\000\035\000\035\000\ -\035\000\035\000\035\000\035\000\035\000\035\000\091\000\092\000\ -\093\000\051\000\095\000\055\000\072\000\020\000\022\000\022\000\ -\073\000\074\000\081\000\094\000\059\000\096\000\097\000\076\000\ -\099\000\020\000\018\000\047\000" - -let yycheck = "\031\000\ -\031\000\008\001\033\000\001\000\001\001\002\001\001\001\002\001\ -\015\001\011\001\012\001\011\001\003\001\004\001\005\001\014\001\ -\018\001\017\001\017\001\006\001\011\001\012\001\019\001\020\001\ -\019\001\056\000\028\001\018\001\030\001\061\000\062\000\063\000\ -\064\000\065\000\066\000\067\000\068\000\028\001\026\000\030\001\ -\003\001\004\001\005\001\031\000\035\001\036\001\037\001\011\001\ -\011\001\012\001\082\000\082\000\001\001\002\001\018\001\018\001\ -\016\001\001\001\002\001\021\001\022\001\023\001\024\001\025\001\ -\026\001\028\001\030\001\030\001\001\001\002\001\058\000\059\000\ -\035\001\036\001\037\001\019\001\020\001\021\001\022\001\023\001\ -\024\001\025\001\026\001\027\001\028\001\029\001\030\001\031\001\ -\032\001\033\001\034\001\001\001\002\001\019\001\019\001\011\001\ -\021\001\022\001\023\001\024\001\025\001\026\001\019\001\020\001\ -\001\001\002\001\032\001\001\001\002\001\019\001\020\001\021\001\ -\022\001\023\001\024\001\025\001\026\001\027\001\028\001\029\001\ -\030\001\031\001\032\001\020\001\034\001\019\001\020\001\021\001\ -\022\001\023\001\024\001\025\001\026\001\027\001\028\001\029\001\ -\030\001\031\001\013\001\033\001\034\001\001\001\002\001\005\001\ -\005\001\007\001\007\001\000\000\010\001\010\001\027\001\028\001\ -\029\001\030\001\031\001\001\001\002\001\015\001\000\000\019\001\ -\020\001\021\001\022\001\023\001\024\001\025\001\026\001\027\001\ -\028\001\029\001\030\001\031\001\001\001\002\001\034\001\021\001\ -\022\001\023\001\024\001\025\001\026\001\027\001\028\001\029\001\ -\030\001\031\001\001\001\002\001\001\001\008\001\019\001\020\001\ -\021\001\022\001\023\001\024\001\025\001\026\001\069\000\070\000\ -\071\000\038\001\073\000\012\001\032\001\020\001\019\001\020\001\ -\033\001\032\001\009\001\011\001\002\001\011\001\011\001\019\001\ -\034\001\012\000\010\000\023\000" - -let yynames_const = "\ - PROMELA_OR\000\ - PROMELA_AND\000\ - PROMELA_NOT\000\ - PROMELA_TRUE\000\ - PROMELA_FALSE\000\ - PROMELA_NEVER\000\ - PROMELA_IF\000\ - PROMELA_FI\000\ - PROMELA_GOTO\000\ - PROMELA_SKIP\000\ - PROMELA_COLON\000\ - PROMELA_SEMICOLON\000\ - PROMELA_DOUBLE_COLON\000\ - PROMELA_LBRACE\000\ - PROMELA_RBRACE\000\ - PROMELA_LPAREN\000\ - PROMELA_RPAREN\000\ - PROMELA_RIGHT_ARROW\000\ - PROMELA_EQ\000\ - PROMELA_LT\000\ - PROMELA_GT\000\ - PROMELA_LE\000\ - PROMELA_GE\000\ - PROMELA_NEQ\000\ - PROMELA_PLUS\000\ - PROMELA_MINUS\000\ - PROMELA_DIV\000\ - PROMELA_STAR\000\ - PROMELA_MODULO\000\ - PROMELA_DOT\000\ - PROMELA_LEFT_SQUARE\000\ - PROMELA_RIGHT_SQUARE\000\ - EOF\000\ - PROMELA_FUNC\000\ - " - -let yynames_block = "\ - PROMELA_LABEL\000\ - PROMELA_INT\000\ - PROMELA_CALLOF\000\ - PROMELA_RETURNOF\000\ - PROMELA_CALLORRETURNOF\000\ - " - -let yyact = [| - (fun _ -> failwith "parser") -; (fun __caml_parser_env -> - let _3 = (Parsing.peek_val __caml_parser_env 2 : 'states) in - Obj.repr( -# 80 "src/aorai/promelaparser_withexps.mly" - ( - let states= - Hashtbl.fold (fun _ st l -> - if st.acceptation=Undefined || st.init=Undefined then - begin - Format.print_string ("Error: the state '"^(st.name)^"' is used but never defined.\n"); - exit 1 - end; - st::l - ) observed_states [] - in - (states , _3) - ) -# 300 "src/aorai/promelaparser_withexps.ml" - : Promelaast.parsed_automaton)) -; (fun __caml_parser_env -> - let _3 = (Parsing.peek_val __caml_parser_env 3 : 'states) in - Obj.repr( -# 94 "src/aorai/promelaparser_withexps.mly" - ( - let states= - Hashtbl.fold (fun _ st l -> - if st.acceptation=Undefined || st.init=Undefined then - begin - Aorai_option.abort - "Error: state %s is used bug never defined" st.name - end; - st::l - ) observed_states [] - in - (states , _3) ) -# 318 "src/aorai/promelaparser_withexps.ml" - : Promelaast.parsed_automaton)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'states) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'state) in - Obj.repr( -# 109 "src/aorai/promelaparser_withexps.mly" - ( _1@_3 ) -# 326 "src/aorai/promelaparser_withexps.ml" - : 'states)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'state) in - Obj.repr( -# 110 "src/aorai/promelaparser_withexps.mly" - ( _1 ) -# 333 "src/aorai/promelaparser_withexps.ml" - : 'states)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 1 : 'state_labels) in - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'state_body) in - Obj.repr( -# 114 "src/aorai/promelaparser_withexps.mly" - ( - let (stl,trans)=_1 in - let (trl,force_final)=_2 in - if force_final then - begin - List.iter (fun s -> - try - (Hashtbl.find observed_states s.name).acceptation <- True - with - | Not_found -> assert false - (* This state has to be in the hashtable -- by construction *) - ) stl - end; - if trl=[] then - trans - else - let tr_list= - List.fold_left (fun l1 (cr,stop_st) -> - List.fold_left (fun l2 st -> - {start=st;stop=stop_st;cross=Seq (to_seq cr);numt=(-1)}::l2 - ) l1 stl - ) [] trl - in - (List.rev tr_list)@trans - ) -# 365 "src/aorai/promelaparser_withexps.ml" - : 'state)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 1 : 'label) in - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'state_labels) in - Obj.repr( -# 142 "src/aorai/promelaparser_withexps.mly" - ( - let (stl1,trl1)=_1 in - let (stl2,trl2)=_2 in - (stl1@stl2,trl1@trl2) - ) -# 377 "src/aorai/promelaparser_withexps.ml" - : 'state_labels)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'label) in - Obj.repr( -# 147 "src/aorai/promelaparser_withexps.mly" - ( _1 ) -# 384 "src/aorai/promelaparser_withexps.ml" - : 'state_labels)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 1 : string) in - Obj.repr( -# 151 "src/aorai/promelaparser_withexps.mly" - ( - begin - (* Step 0 : trans is the set of new transitions and old - is the description of the current state *) - let trans = ref [] in - (* Promela Label is a state. According to its name, - we will try to give him its properties (init / accept) *) - (* Firstly, if this state is still referenced, - then we get it back. Else, we make a new "empty" state *) - let old= - try - Hashtbl.find observed_states _1 - with - | Not_found -> - let s = Data_for_aorai.new_state _1 in - Hashtbl.add observed_states _1 s; - s - in - (* Step 1 : setting up the acceptance status *) - (* Default status : Non acceptation state *) - old.acceptation <- False; - - (* Accept_all state means acceptance state with a - reflexive transition without cross condition *) - (* This case is not exclusive with the following. - Acceptation status is set in this last. *) - if (String.length _1>=10) && - (String.compare (String.sub _1 0 10) "accept_all")=0 - then - trans:= - {start=old;stop=old;cross=Seq (to_seq PTrue);numt=(-1)}::!trans; - - (* If the name includes accept then this state is - an acceptation one. *) - if (String.length _1>=7) && - (String.compare (String.sub _1 0 7) "accept_")=0 - then - old.acceptation <- True; - - (* Step 2 : setting up the init status *) - (* If the state name ended with "_init" then - it is an initial state. Else, it is not. *) - if (String.length _1>=5) && - (String.compare - (String.sub _1 ((String.length _1)-5) 5) "_init" ) = 0 - then - old.init <- True - else - old.init <- False; - - ([old],!trans) - end - ) -# 443 "src/aorai/promelaparser_withexps.ml" - : 'label)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'transitions) in - Obj.repr( -# 208 "src/aorai/promelaparser_withexps.mly" - ( (_2,false) ) -# 450 "src/aorai/promelaparser_withexps.ml" - : 'state_body)) -; (fun __caml_parser_env -> - Obj.repr( -# 209 "src/aorai/promelaparser_withexps.mly" - ( ([],false) ) -# 456 "src/aorai/promelaparser_withexps.ml" - : 'state_body)) -; (fun __caml_parser_env -> - Obj.repr( -# 210 "src/aorai/promelaparser_withexps.mly" - ( ([],true) ) -# 462 "src/aorai/promelaparser_withexps.ml" - : 'state_body)) -; (fun __caml_parser_env -> - Obj.repr( -# 211 "src/aorai/promelaparser_withexps.mly" - ( ([],true) ) -# 468 "src/aorai/promelaparser_withexps.ml" - : 'state_body)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 1 : 'transitions) in - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'transition) in - Obj.repr( -# 216 "src/aorai/promelaparser_withexps.mly" - ( _1@[_2] ) -# 476 "src/aorai/promelaparser_withexps.ml" - : 'transitions)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'transition) in - Obj.repr( -# 217 "src/aorai/promelaparser_withexps.mly" - ( [_1] ) -# 483 "src/aorai/promelaparser_withexps.ml" - : 'transitions)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 3 : 'guard) in - let _5 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 222 "src/aorai/promelaparser_withexps.mly" - ( - let s= - try - Hashtbl.find observed_states _5 - with - Not_found -> - let r = Data_for_aorai.new_state _5 in - Hashtbl.add observed_states _5 r; - r - in - (_2,s) - ) -# 502 "src/aorai/promelaparser_withexps.ml" - : 'transition)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 237 "src/aorai/promelaparser_withexps.mly" - ( POr(PCall (_1,None), PReturn _1) ) -# 509 "src/aorai/promelaparser_withexps.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 238 "src/aorai/promelaparser_withexps.mly" - ( PCall (_1,None) ) -# 516 "src/aorai/promelaparser_withexps.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 239 "src/aorai/promelaparser_withexps.mly" - ( PReturn _1 ) -# 523 "src/aorai/promelaparser_withexps.ml" - : 'guard)) -; (fun __caml_parser_env -> - Obj.repr( -# 240 "src/aorai/promelaparser_withexps.mly" - ( PTrue ) -# 529 "src/aorai/promelaparser_withexps.ml" - : 'guard)) -; (fun __caml_parser_env -> - Obj.repr( -# 241 "src/aorai/promelaparser_withexps.mly" - ( PFalse ) -# 535 "src/aorai/promelaparser_withexps.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'guard) in - Obj.repr( -# 242 "src/aorai/promelaparser_withexps.mly" - ( PNot _2 ) -# 542 "src/aorai/promelaparser_withexps.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'guard) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'guard) in - Obj.repr( -# 243 "src/aorai/promelaparser_withexps.mly" - ( PAnd (_1,_3) ) -# 550 "src/aorai/promelaparser_withexps.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'guard) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'guard) in - Obj.repr( -# 244 "src/aorai/promelaparser_withexps.mly" - ( POr (_1,_3) ) -# 558 "src/aorai/promelaparser_withexps.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'guard) in - Obj.repr( -# 245 "src/aorai/promelaparser_withexps.mly" - ( _2 ) -# 565 "src/aorai/promelaparser_withexps.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'logic_relation) in - Obj.repr( -# 246 "src/aorai/promelaparser_withexps.mly" - ( _1 ) -# 572 "src/aorai/promelaparser_withexps.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 250 "src/aorai/promelaparser_withexps.mly" - ( PRel(Eq, _1, _3) ) -# 580 "src/aorai/promelaparser_withexps.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 251 "src/aorai/promelaparser_withexps.mly" - ( PRel(Lt, _1, _3) ) -# 588 "src/aorai/promelaparser_withexps.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 252 "src/aorai/promelaparser_withexps.mly" - ( PRel(Gt, _1, _3) ) -# 596 "src/aorai/promelaparser_withexps.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 253 "src/aorai/promelaparser_withexps.mly" - ( PRel(Le, _1, _3) ) -# 604 "src/aorai/promelaparser_withexps.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 254 "src/aorai/promelaparser_withexps.mly" - ( PRel(Ge, _1, _3) ) -# 612 "src/aorai/promelaparser_withexps.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 255 "src/aorai/promelaparser_withexps.mly" - ( PRel(Neq,_1, _3) ) -# 620 "src/aorai/promelaparser_withexps.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 256 "src/aorai/promelaparser_withexps.mly" - ( PRel(Neq,_1, PCst(IntConstant "0")) ) -# 627 "src/aorai/promelaparser_withexps.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_mul) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 262 "src/aorai/promelaparser_withexps.mly" - ( PBinop(Badd, _1 , _3)) -# 635 "src/aorai/promelaparser_withexps.ml" - : 'arith_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_mul) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 264 "src/aorai/promelaparser_withexps.mly" - ( PBinop(Bsub,_1,_3) ) -# 643 "src/aorai/promelaparser_withexps.ml" - : 'arith_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation_mul) in - Obj.repr( -# 265 "src/aorai/promelaparser_withexps.mly" - ( _1 ) -# 650 "src/aorai/promelaparser_withexps.ml" - : 'arith_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_mul) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'access_or_const) in - Obj.repr( -# 271 "src/aorai/promelaparser_withexps.mly" - ( PBinop(Bdiv,_1,_3) ) -# 658 "src/aorai/promelaparser_withexps.ml" - : 'arith_relation_mul)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_mul) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'access_or_const) in - Obj.repr( -# 273 "src/aorai/promelaparser_withexps.mly" - ( PBinop(Bmul,_1,_3) ) -# 666 "src/aorai/promelaparser_withexps.ml" - : 'arith_relation_mul)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_mul) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'access_or_const) in - Obj.repr( -# 275 "src/aorai/promelaparser_withexps.mly" - ( PBinop(Bmod,_1,_3) ) -# 674 "src/aorai/promelaparser_withexps.ml" - : 'arith_relation_mul)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'access_or_const) in - Obj.repr( -# 276 "src/aorai/promelaparser_withexps.mly" - ( _1 ) -# 681 "src/aorai/promelaparser_withexps.ml" - : 'arith_relation_mul)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 280 "src/aorai/promelaparser_withexps.mly" - ( PCst(IntConstant _1) ) -# 688 "src/aorai/promelaparser_withexps.ml" - : 'access_or_const)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 282 "src/aorai/promelaparser_withexps.mly" - ( PUnop (Uminus, PCst (IntConstant _2)) ) -# 695 "src/aorai/promelaparser_withexps.ml" - : 'access_or_const)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'access) in - Obj.repr( -# 283 "src/aorai/promelaparser_withexps.mly" - ( _1 ) -# 702 "src/aorai/promelaparser_withexps.ml" - : 'access_or_const)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'arith_relation) in - Obj.repr( -# 284 "src/aorai/promelaparser_withexps.mly" - ( _2 ) -# 709 "src/aorai/promelaparser_withexps.ml" - : 'access_or_const)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'access) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 288 "src/aorai/promelaparser_withexps.mly" - ( PField (_1,_3) ) -# 717 "src/aorai/promelaparser_withexps.ml" - : 'access)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'access_array) in - Obj.repr( -# 289 "src/aorai/promelaparser_withexps.mly" - (_1) -# 724 "src/aorai/promelaparser_withexps.ml" - : 'access)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 3 : 'access_array) in - let _3 = (Parsing.peek_val __caml_parser_env 1 : 'access_or_const) in - Obj.repr( -# 293 "src/aorai/promelaparser_withexps.mly" - ( PArrget(_1,_3) ) -# 732 "src/aorai/promelaparser_withexps.ml" - : 'access_array)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'access_leaf) in - Obj.repr( -# 294 "src/aorai/promelaparser_withexps.mly" - (_1) -# 739 "src/aorai/promelaparser_withexps.ml" - : 'access_array)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'access) in - Obj.repr( -# 297 "src/aorai/promelaparser_withexps.mly" - ( PUnop(Ustar,_2) ) -# 746 "src/aorai/promelaparser_withexps.ml" - : 'access_leaf)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 3 : string) in - let _4 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 298 "src/aorai/promelaparser_withexps.mly" - ( PPrm(_1,_4) ) -# 754 "src/aorai/promelaparser_withexps.ml" - : 'access_leaf)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 299 "src/aorai/promelaparser_withexps.mly" - ( PVar _1 ) -# 761 "src/aorai/promelaparser_withexps.ml" - : 'access_leaf)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'access) in - Obj.repr( -# 300 "src/aorai/promelaparser_withexps.mly" - ( _2 ) -# 768 "src/aorai/promelaparser_withexps.ml" - : 'access_leaf)) -(* Entry promela *) -; (fun __caml_parser_env -> raise (Parsing.YYexit (Parsing.peek_val __caml_parser_env 0))) -|] -let yytables = - { Parsing.actions=yyact; - Parsing.transl_const=yytransl_const; - Parsing.transl_block=yytransl_block; - Parsing.lhs=yylhs; - Parsing.len=yylen; - Parsing.defred=yydefred; - Parsing.dgoto=yydgoto; - Parsing.sindex=yysindex; - Parsing.rindex=yyrindex; - Parsing.gindex=yygindex; - Parsing.tablesize=yytablesize; - Parsing.table=yytable; - Parsing.check=yycheck; - Parsing.error_function=parse_error; - Parsing.names_const=yynames_const; - Parsing.names_block=yynames_block } -let promela (lexfun : Lexing.lexbuf -> token) (lexbuf : Lexing.lexbuf) = - (Parsing.yyparse yytables 1 lexfun lexbuf : Promelaast.parsed_automaton) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/promelaparser_withexps.mli frama-c-20150201+sodium+dfsg/src/aorai/promelaparser_withexps.mli --- frama-c-20140301+neon+dfsg/src/aorai/promelaparser_withexps.mli 2014-03-12 15:07:54.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/promelaparser_withexps.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -type token = - | PROMELA_OR - | PROMELA_AND - | PROMELA_NOT - | PROMELA_TRUE - | PROMELA_FALSE - | PROMELA_NEVER - | PROMELA_IF - | PROMELA_FI - | PROMELA_GOTO - | PROMELA_SKIP - | PROMELA_LABEL of (string) - | PROMELA_INT of (string) - | PROMELA_COLON - | PROMELA_SEMICOLON - | PROMELA_DOUBLE_COLON - | PROMELA_LBRACE - | PROMELA_RBRACE - | PROMELA_LPAREN - | PROMELA_RPAREN - | PROMELA_RIGHT_ARROW - | PROMELA_EQ - | PROMELA_LT - | PROMELA_GT - | PROMELA_LE - | PROMELA_GE - | PROMELA_NEQ - | PROMELA_PLUS - | PROMELA_MINUS - | PROMELA_DIV - | PROMELA_STAR - | PROMELA_MODULO - | PROMELA_DOT - | PROMELA_LEFT_SQUARE - | PROMELA_RIGHT_SQUARE - | PROMELA_CALLOF of (string) - | PROMELA_RETURNOF of (string) - | PROMELA_CALLORRETURNOF of (string) - | EOF - | PROMELA_FUNC - -val promela : - (Lexing.lexbuf -> token) -> Lexing.lexbuf -> Promelaast.parsed_automaton diff -Nru frama-c-20140301+neon+dfsg/src/aorai/promelaparser_withexps.mly frama-c-20150201+sodium+dfsg/src/aorai/promelaparser_withexps.mly --- frama-c-20140301+neon+dfsg/src/aorai/promelaparser_withexps.mly 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/promelaparser_withexps.mly 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Aorai plug-in of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* INRIA (Institut National de Recherche en Informatique et en */ diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/Aorai_test.ml frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/Aorai_test.ml --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/Aorai_test.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/Aorai_test.ml 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,69 @@ +(* Small script to test that the code generated by aorai can be parsed again + * by frama-c. + *) + +open Kernel + +include Plugin.Register +(struct + let name = "aorai testing module" + let shortname = "aorai-test" + let help = "utility script for aorai regtests" + end) + +module TestNumber = + Zero + (struct + let option_name = "-aorai-test-number" + let help = "test number when multiple tests are run over the same file" + let arg_name = "n" + end) + +let tmpfile = ref (Filename.temp_file "aorai_test" ".i") + +let tmpfile_set = ref false + +let ok = ref false + +let () = + at_exit (fun () -> + if Debug.get () >= 1 || not !ok then + result "Keeping temp file %s" !tmpfile + else + try Sys.remove !tmpfile with Sys_error _ -> ()) + +let set_tmpfile _ l = + if not !tmpfile_set then + begin + let name = List.hd l in + let name = Filename.basename name in + let name = Filename.chop_extension name in + tmpfile := (Filename.get_temp_dir_name()) ^ "/aorai_" ^ name ^ + (string_of_int (TestNumber.get())) ^ ".i"; + tmpfile_set := true + end + +let () = Kernel.Files.add_set_hook set_tmpfile + +let extend () = + let myrun = + let run = !Db.Toplevel.run in + fun f -> + let my_project = Project.create "Reparsing" in + run f; + let chan = open_out !tmpfile in + let fmt = Format.formatter_of_out_channel chan in + File.pretty_ast ~prj:(Project.from_unique_name "aorai") ~fmt (); + close_out chan; + Project.set_current my_project; + Files.append_after [ !tmpfile ]; + Constfold.off (); + File.pretty_ast (); + ok:=true (* no error, we can erase the file *) + + in + Db.Toplevel.run := myrun + +let () = extend () + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/assigns.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/assigns.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/assigns.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/assigns.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,22 @@ +/* run.config + EXECNOW: make -s tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/assigns.ya -aorai-test 1 -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ + OPT: -aorai-automata tests/aorai/assigns_det.ya -aorai-test 1 -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ + OPT: -aorai-automata tests/aorai/assigns.ya -load-script tests/aorai/name_projects.ml -aorai-test 1 -then -print +*/ + +int X; + +void f(void) { X++; } + +/*@ assigns X; + behavior foo: + assigns X; +*/ +int main () { + //@ assigns X; + X++; + //@ assigns X; + f(); + return X; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/assigns_det.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/assigns_det.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/assigns_det.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/assigns_det.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,13 @@ +%init: S1; +%accept: S2; +%deterministic; + +S1: { CALL(main) } -> Sf; + +Sf: { CALL(f) } -> S_in_f; + +S_in_f: { RETURN(f) } -> in_main; + +in_main: { RETURN(main) } -> S2; + +S2: -> S2; \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/assigns.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/assigns.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/assigns.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/assigns.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,12 @@ +%init: S1; +%accept: S2; + +S1: { CALL(main) } -> Sf; + +Sf: { CALL(f) } -> S_in_f; + +S_in_f: { RETURN(f) } -> in_main; + +in_main: { RETURN(main) } -> S2; + +S2: -> S2; \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/bts1289-2.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/bts1289-2.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/bts1289-2.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/bts1289-2.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,7 @@ +%init: init; +%accept: S; +init: { CALL(main) } -> S; +S: { a() } -> T + | { RETURN(main) } -> S; +T: { a() } -> S; + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/bts1289.i frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/bts1289.i --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/bts1289.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/bts1289.i 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,15 @@ +/* run.config + EXECNOW: make -s tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/bts1289.ya -load-module tests/aorai/Aorai_test.cmxs -aorai-test 1 -aorai-test-number @PTEST_NUMBER@ + OPT: -aorai-automata tests/aorai/bts1289-2.ya -load-module tests/aorai/Aorai_test.cmxs -aorai-test 1 -aorai-test-number @PTEST_NUMBER@ + */ + +void a(void) {} + +void main(void) +{ + //@ loop assigns i; + for (int i=0; i<10; ++i) + a(); +} + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/bts1289.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/bts1289.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/bts1289.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/bts1289.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,5 @@ +%init: S; +%accept: S; +S: { CALL(a) } -> T; +T: { CALL(a) } -> S; + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/call_tree.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/call_tree.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/call_tree.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/call_tree.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,15 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + DONTRUN: small example related to U3CAT's WP2 +*/ +int x; + +void f(void) { x = 2; } + +void g(void) { x++; } + +int main() { + if (!x) { f(); } + g(); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/call_tree.ltl frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/call_tree.ltl --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/call_tree.ltl 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/call_tree.ltl 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1 @@ +CALL(main) && _X_ ((x == 0 && CALL(f) && _X_ (RETURN(f) && _X_ (CALL(g) && _X_ RETURN(g)))) || (x!=0 && (CALL(g) && _X_ RETURN(g)))) \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/deterministic.i frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/deterministic.i --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/deterministic.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/deterministic.i 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,28 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/deterministic.ya -aorai-test 1 -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + +int X; +int Y; + +void g(int x) { + Y=x; +} + +int f(int x) { + X=x; + g(X); + X++; + g(X); + return 0; +} + +int real_main (int c) { + if (c) f(4); + return 0; +} + +int main (int c) { + return real_main(c); +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/deterministic.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/deterministic.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/deterministic.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/deterministic.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,22 @@ +%init: Si; +%accept: Sf; +%deterministic; + +Si: { CALL(main) } -> S0; + +S0: { real_main().c == 0 } -> S2 + | { real_main().c != 0 } -> S1; + +S1: { f().x == 4 } -> S3 + | { f().return == 0 && X == 5 } -> S2; + +S2: { RETURN(real_main) } -> Sf; + +S3: { g().x == 4 } -> S4 + | { g().x == 5 } -> S5; + +S4: { RETURN(g) } -> S3; + +S5: { RETURN(g) } -> S1; + +Sf: -> Sf; \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/formals.i frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/formals.i --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/formals.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/formals.i 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,10 @@ +/* run.config +EXECNOW: make -s tests/aorai/Aorai_test.cmxs +OPT: -aorai-automata tests/aorai/formals.ya -aorai-test 1 -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + +int f(int x) { return x; } + +int g(int y) { return y; } + +int main() { f(1); g(2); } diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/formals.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/formals.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/formals.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/formals.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,11 @@ +%init: init; +%accept: OK; +%deterministic; + +init: { CALL(main) } -> main; + +main: +{ [f{{x==1}}(){{ x == 1}};g(){{y==2}}] } -> OK +| { f{{x==3}}(){{x==3}} } -> OK; + +OK: -> OK; diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/generate_assigns_bts1290.i frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/generate_assigns_bts1290.i --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/generate_assigns_bts1290.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/generate_assigns_bts1290.i 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,10 @@ +/* run.config + EXECNOW: make -s tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/generate_assigns_bts1290.ya -load-module tests/aorai/Aorai_test.cmxs -aorai-test 1 -aorai-test-number @PTEST_NUMBER@ + */ +void main(void) +{ + //@ loop assigns i; + for (int i=0; i<10; ++i) + ; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/generate_assigns_bts1290.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/generate_assigns_bts1290.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/generate_assigns_bts1290.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/generate_assigns_bts1290.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,3 @@ +%init: S; +%accept: S; +S: -> S; diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/goto.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/goto.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/goto.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/goto.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,55 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-ltl tests/aorai/goto.ltl -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + +int status=0; +int rr=1; +//@ global invariant inv : 0<=rr<=5000; + +/*@ requires rr<5000; + @ behavior j : + @ ensures rr<5001; +*/ +void opa() { + rr++; +} + +void opb () { + status=1; +} + +void opc () { + rr=60000; +} + +int main(){ + + if (rr<5000) goto L; + opc(); + + L4: + goto L5; + + L: + opa(); + goto L2; + opc(); + + L6: + return 1; + + L3: + goto L4; + + opc(); + goto L2; + + L2 : + goto L3; + + + L5: + opb(); + goto L6; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/goto.ltl frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/goto.ltl --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/goto.ltl 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/goto.ltl 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1 @@ +CALL(main) && _X_ (CALL(opa) && _X_ (!RETURN(opb) && _X_ (!CALL(opa) && _X_ (RETURN(opb) && _X_ (RETURN(main)))))) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/hoare_seq.i frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/hoare_seq.i --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/hoare_seq.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/hoare_seq.i 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,15 @@ +/* run.config +EXECNOW: make -s tests/aorai/Aorai_test.cmxs +OPT: -aorai-automata tests/aorai/hoare_seq.ya -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test -aorai-test-number @PTEST_NUMBER@ +*/ + +void f(void) { } + +/*@ behavior bhv: + assumes c > 0; + ensures \result == 0; +*/ +int main(int c) { + if (c <= 0) { f (); } + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/hoare_seq.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/hoare_seq.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/hoare_seq.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/hoare_seq.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,7 @@ +%init: S0; +%accept: Sf; + +S0: { main::bhv() } -> Sf + | { main {{ c <= 0 }} (f()) {{ \result == 0 }} } -> Sf; + +Sf: -> Sf; diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/loop_bts1050.i frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/loop_bts1050.i --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/loop_bts1050.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/loop_bts1050.i 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,19 @@ +/* run.config + EXECNOW: make -s tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/loop_bts1050.ya -aorai-test 1 -load-module tests/aorai/Aorai_test.cmxs -aorai-acceptance -aorai-test-number @PTEST_NUMBER@ + +*/ +void f(){}; + +void g(){}; + +int main(int c){ + if (c<0){ c = 0;} + if (c>0){ c = 5;} + while (c){ + f(); + g(); + c--; + } + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/loop_bts1050.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/loop_bts1050.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/loop_bts1050.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/loop_bts1050.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,5 @@ +%init : S0; +%accept : Sf; + +S0 : {[ main( [ f(); g() ]{0,5} ) ]} -> Sf; +Sf: -> Sf; diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/name_projects.ml frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/name_projects.ml --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/name_projects.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/name_projects.ml 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,5 @@ +let run () = + let print_one p = Kernel.feedback "Found %a" Project.pretty p in + Project.iter_on_projects print_one + +let () = Cmdline.at_normal_exit run diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/not_prm.i frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/not_prm.i --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/not_prm.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/not_prm.i 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,8 @@ +/* run.config + EXECNOW: make -s tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/not_prm.ya -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test -main f -aorai-test-number @PTEST_NUMBER@ +*/ + +int f(int x) { + return x; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/not_prm.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/not_prm.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/not_prm.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/not_prm.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,6 @@ +%init: S0; +%accept: Sf; + +S0: { !f().x < 4 } -> Sf; + +Sf: -> Sf; diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/assigns.1.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/assigns.1.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/assigns.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/assigns.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,178 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/assigns.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_assigns1.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_States { + aorai_reject_state = -2, + S1 = 0, + S2 = 1, + S_in_f = 2, + Sf = 3, + in_main = 4 +}; +enum aorai_ListOper { + op_f = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ lemma in_main_deterministic_trans{L}: \true; + */ +/*@ lemma Sf_deterministic_trans{L}: \true; + */ +/*@ lemma S_in_f_deterministic_trans{L}: \true; + */ +/*@ lemma S2_deterministic_trans{L}: \true; + */ +/*@ lemma S1_deterministic_trans{L}: \true; + */ +int X; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int aorai_CurStates = S1; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_S1_out: + ensures aorai_CurStates ≢ S1; + + behavior buch_state_S2_out: + ensures aorai_CurStates ≢ S2; + + behavior buch_state_S_in_f_in: + assumes aorai_CurStates ≡ Sf; + ensures aorai_CurStates ≡ S_in_f; + + behavior buch_state_S_in_f_out: + assumes aorai_CurStates ≢ Sf; + ensures aorai_CurStates ≢ S_in_f; + + behavior buch_state_Sf_out: + ensures aorai_CurStates ≢ Sf; + + behavior buch_state_in_main_out: + ensures aorai_CurStates ≢ in_main; + */ +extern void f_pre_func(void); + +/*@ requires aorai_CurStates ≡ S_in_f; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_S1_out: + ensures aorai_CurStates ≢ S1; + + behavior buch_state_S2_out: + ensures aorai_CurStates ≢ S2; + + behavior buch_state_S_in_f_out: + ensures aorai_CurStates ≢ S_in_f; + + behavior buch_state_Sf_out: + ensures aorai_CurStates ≢ Sf; + + behavior buch_state_in_main_in: + assumes aorai_CurStates ≡ S_in_f; + ensures aorai_CurStates ≡ in_main; + + behavior buch_state_in_main_out: + assumes aorai_CurStates ≢ S_in_f; + ensures aorai_CurStates ≢ in_main; + */ +extern void f_post_func(void); + +/*@ requires aorai_CurStates ≡ Sf; + + behavior Buchi_property_behavior: + ensures aorai_CurStates ≡ in_main; + */ +void f(void) +{ + f_pre_func(); + X ++; + f_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_S1_out: + ensures aorai_CurStates ≢ S1; + + behavior buch_state_S2_out: + ensures aorai_CurStates ≢ S2; + + behavior buch_state_S_in_f_out: + ensures aorai_CurStates ≢ S_in_f; + + behavior buch_state_Sf_in: + assumes aorai_CurStates ≡ S1; + ensures aorai_CurStates ≡ Sf; + + behavior buch_state_Sf_out: + assumes aorai_CurStates ≢ S1; + ensures aorai_CurStates ≢ Sf; + + behavior buch_state_in_main_out: + ensures aorai_CurStates ≢ in_main; + */ +extern void main_pre_func(void); + +/*@ requires aorai_CurStates ≡ in_main; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_S1_out: + ensures aorai_CurStates ≢ S1; + + behavior buch_state_S2_in: + assumes aorai_CurStates ≡ in_main; + ensures aorai_CurStates ≡ S2; + + behavior buch_state_S2_out: + assumes aorai_CurStates ≢ in_main; + ensures aorai_CurStates ≢ S2; + + behavior buch_state_S_in_f_out: + ensures aorai_CurStates ≢ S_in_f; + + behavior buch_state_Sf_out: + ensures aorai_CurStates ≢ Sf; + + behavior buch_state_in_main_out: + ensures aorai_CurStates ≢ in_main; + */ +extern void main_post_func(int res); + +/*@ requires aorai_CurStates ≡ S1; + assigns X, aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior foo: + assigns X, aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior Buchi_property_behavior: + ensures aorai_CurStates ≡ S2; + */ +int main(void) +{ + main_pre_func(); + /*@ assigns X; */ + X ++; + /*@ assigns X, aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; */ + f(); + main_post_func(X); + return X; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/assigns.2.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/assigns.2.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/assigns.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/assigns.2.res.oracle 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/assigns.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +/* Generated by Frama-C */ +int X; +void f(void) +{ + X ++; + return; +} + +/*@ assigns X; + + behavior foo: + assigns X; */ +int main(void) +{ + /*@ assigns X; */ + X ++; + /*@ assigns X; */ + f(); + return X; +} + + +[kernel] Found project "default" +[kernel] Found project "aorai" diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/assigns.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/assigns.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/assigns.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/assigns.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,178 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/assigns.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_assigns0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_f = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +int X; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int S1 = 1; */ +/*@ ghost int S2 = 0; */ +/*@ ghost int S_in_f = 0; */ +/*@ ghost int Sf = 0; */ +/*@ ghost int in_main = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S_in_f, Sf, + in_main; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_S_in_f_in: + assumes 1 ≡ Sf; + ensures 1 ≡ S_in_f; + + behavior buch_state_S_in_f_out: + assumes 0 ≡ Sf; + ensures 0 ≡ S_in_f; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_in_main_out: + ensures 0 ≡ in_main; + */ +extern void f_pre_func(void); + +/*@ requires + 1 ≡ S_in_f ∧ 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ Sf ∧ 0 ≡ in_main; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S_in_f, Sf, + in_main; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_S_in_f_out: + ensures 0 ≡ S_in_f; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_in_main_in: + assumes 1 ≡ S_in_f; + ensures 1 ≡ in_main; + + behavior buch_state_in_main_out: + assumes 0 ≡ S_in_f; + ensures 0 ≡ in_main; + */ +extern void f_post_func(void); + +/*@ requires + 1 ≡ Sf ∧ 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S_in_f ∧ 0 ≡ in_main; + + behavior Buchi_property_behavior: + ensures 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S_in_f ∧ 0 ≡ Sf; + ensures 1 ≡ in_main; + */ +void f(void) +{ + f_pre_func(); + X ++; + f_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S_in_f, Sf, + in_main; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_S_in_f_out: + ensures 0 ≡ S_in_f; + + behavior buch_state_Sf_in: + assumes 1 ≡ S1; + ensures 1 ≡ Sf; + + behavior buch_state_Sf_out: + assumes 0 ≡ S1; + ensures 0 ≡ Sf; + + behavior buch_state_in_main_out: + ensures 0 ≡ in_main; + */ +extern void main_pre_func(void); + +/*@ requires + 1 ≡ in_main ∧ 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S_in_f ∧ 0 ≡ Sf; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S_in_f, Sf, + in_main; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_in: + assumes 1 ≡ in_main; + ensures 1 ≡ S2; + + behavior buch_state_S2_out: + assumes 0 ≡ in_main; + ensures 0 ≡ S2; + + behavior buch_state_S_in_f_out: + ensures 0 ≡ S_in_f; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_in_main_out: + ensures 0 ≡ in_main; + */ +extern void main_post_func(int res); + +/*@ requires + 1 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S_in_f ∧ 0 ≡ Sf ∧ 0 ≡ in_main; + assigns X, aorai_CurOpStatus, aorai_CurOperation, S1, S2, S_in_f, Sf, + in_main; + + behavior foo: + assigns X, aorai_CurOpStatus, aorai_CurOperation, S1, S2, S_in_f, Sf, + in_main; + + behavior Buchi_property_behavior: + ensures 0 ≡ S1 ∧ 0 ≡ S_in_f ∧ 0 ≡ Sf ∧ 0 ≡ in_main; + ensures 1 ≡ S2; + */ +int main(void) +{ + main_pre_func(); + /*@ assigns X; */ + X ++; + /*@ assigns X, aorai_CurOpStatus, aorai_CurOperation, S1, S2, S_in_f, Sf, + in_main; + */ + f(); + main_post_func(X); + return X; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/bts1289.1.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/bts1289.1.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/bts1289.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/bts1289.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,228 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/bts1289.i (no preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_bts12891.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_a = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int S = 0; */ +/*@ ghost int T = 0; */ +/*@ ghost int aorai_intermediate_state = 0; */ +/*@ ghost int aorai_intermediate_state_0 = 0; */ +/*@ ghost int init = 1; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_a; + assigns aorai_CurOpStatus, aorai_CurOperation, S, T, + aorai_intermediate_state, aorai_intermediate_state_0, init; + + behavior buch_state_S_out: + ensures 0 ≡ S; + + behavior buch_state_T_out: + ensures 0 ≡ T; + + behavior buch_state_aorai_intermediate_state_in: + assumes 1 ≡ S; + ensures 1 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_out: + assumes 0 ≡ S; + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_in: + assumes 1 ≡ T; + ensures 1 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_0_out: + assumes 0 ≡ T; + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_init_out: + ensures 0 ≡ init; + */ +extern void a_pre_func(void); + +/*@ requires + (1 ≡ aorai_intermediate_state ∨ 1 ≡ aorai_intermediate_state_0) ∧ + 0 ≡ S ∧ 0 ≡ T ∧ 0 ≡ init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_a; + assigns aorai_CurOpStatus, aorai_CurOperation, S, T, + aorai_intermediate_state, aorai_intermediate_state_0, init; + + behavior buch_state_S_in: + assumes 1 ≡ aorai_intermediate_state_0; + ensures 1 ≡ S; + + behavior buch_state_S_out: + assumes 0 ≡ aorai_intermediate_state_0; + ensures 0 ≡ S; + + behavior buch_state_T_in: + assumes 1 ≡ aorai_intermediate_state; + ensures 1 ≡ T; + + behavior buch_state_T_out: + assumes 0 ≡ aorai_intermediate_state; + ensures 0 ≡ T; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_init_out: + ensures 0 ≡ init; + */ +extern void a_post_func(void); + +/*@ requires + (1 ≡ S ∨ 1 ≡ T) ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_0 ∧ 0 ≡ init; + requires 1 ≡ T ∨ 0 ≡ T; + requires 1 ≡ S ∨ 0 ≡ S; + + behavior Buchi_behavior_in_0: + assumes 1 ≡ S; + ensures 1 ≡ T; + + behavior Buchi_behavior_in_1: + assumes 1 ≡ T; + ensures 1 ≡ S; + + behavior Buchi_behavior_out_0: + assumes 0 ≡ T; + ensures 0 ≡ S; + + behavior Buchi_behavior_out_1: + assumes 0 ≡ S; + ensures 0 ≡ T; + + behavior Buchi_behavior_out_2: + ensures 0 ≡ aorai_intermediate_state; + + behavior Buchi_behavior_out_3: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior Buchi_behavior_out_4: + ensures 0 ≡ init; + */ +void a(void) +{ + a_pre_func(); + a_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S, T, + aorai_intermediate_state, aorai_intermediate_state_0, init; + + behavior buch_state_S_in: + assumes 1 ≡ init; + ensures 1 ≡ S; + + behavior buch_state_S_out: + assumes 0 ≡ init; + ensures 0 ≡ S; + + behavior buch_state_T_out: + ensures 0 ≡ T; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_init_out: + ensures 0 ≡ init; + */ +extern void main_pre_func(void); + +/*@ requires + 1 ≡ S ∧ 0 ≡ T ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_0 ∧ 0 ≡ init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S, T, + aorai_intermediate_state, aorai_intermediate_state_0, init; + + behavior buch_state_S_in: + assumes 1 ≡ S; + ensures 1 ≡ S; + + behavior buch_state_S_out: + assumes 0 ≡ S; + ensures 0 ≡ S; + + behavior buch_state_T_out: + ensures 0 ≡ T; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_init_out: + ensures 0 ≡ init; + */ +extern void main_post_func(void); + +/*@ requires + 1 ≡ init ∧ 0 ≡ S ∧ 0 ≡ T ∧ + 0 ≡ aorai_intermediate_state ∧ 0 ≡ aorai_intermediate_state_0; + + behavior Buchi_property_behavior: + ensures + 0 ≡ T ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_0 ∧ 0 ≡ init; + ensures 1 ≡ S; + */ +void main(void) +{ + int aorai_Loop_Init_16; + int i; + main_pre_func(); + i = 0; + /*@ ghost aorai_Loop_Init_16 = 1; */ + aorai_loop_16: + /*@ loop invariant Aorai: 1 ≡ S ∨ 0 ≡ S; + loop invariant Aorai: 1 ≡ T ∨ 0 ≡ T; + loop invariant Aorai: 0 ≡ aorai_intermediate_state; + loop invariant Aorai: 0 ≡ aorai_intermediate_state_0; + loop invariant Aorai: 0 ≡ init; + loop invariant Aorai: 1 ≡ S ∨ 1 ≡ T; + loop invariant + Aorai: aorai_Loop_Init_16 ≢ 0 ⇒ \at(1 ≡ init,Pre) ⇒ 0 ≡ T; + loop assigns i, aorai_Loop_Init_16, aorai_CurOpStatus, + aorai_CurOperation, S, T, aorai_intermediate_state, + aorai_intermediate_state_0, init; + loop assigns aorai_Loop_Init_16 \from \nothing; + */ + while (1) { + if (! (i < 10)) goto while_0_break; + /*@ ghost aorai_Loop_Init_16 = 0; */ + a(); + i ++; + } + while_0_break: ; + main_post_func(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/bts1289.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/bts1289.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/bts1289.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/bts1289.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,77 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/bts1289.i (no preprocessing) +[aorai] Welcome to the Aorai plugin +[aorai] warning: Call to main does not follow automaton's specification. This path is assumed to be dead +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_bts12890.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_a = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_a; + assigns aorai_CurOpStatus, aorai_CurOperation; + */ +extern void a_pre_func(void); + +/*@ requires \false; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_a; + assigns aorai_CurOpStatus, aorai_CurOperation; + */ +extern void a_post_func(void); + +/*@ requires \false; */ +void a(void) +{ + a_pre_func(); + a_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation; + */ +extern void main_pre_func(void); + +/*@ requires \false; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation; + */ +extern void main_post_func(void); + +/*@ requires \false; */ +void main(void) +{ + int aorai_Loop_Init_16; + int i; + main_pre_func(); + i = 0; + /*@ ghost aorai_Loop_Init_16 = 1; */ + aorai_loop_16: + /*@ loop assigns i, aorai_Loop_Init_16, aorai_CurOpStatus, + aorai_CurOperation; + loop assigns aorai_Loop_Init_16 \from \nothing; + */ + while (1) { + if (! (i < 10)) goto while_0_break; + /*@ ghost aorai_Loop_Init_16 = 0; */ + a(); + i ++; + } + while_0_break: ; + main_post_func(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/deterministic.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/deterministic.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/deterministic.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/deterministic.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,437 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/deterministic.i (no preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_deterministic0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_States { + aorai_reject_state = -2, + S0 = 0, + S1 = 1, + S2 = 2, + S3 = 3, + S4 = 4, + S5 = 5, + Sf = 6, + Si = 7 +}; +enum aorai_ListOper { + op_f = 3, + op_g = 2, + op_main = 1, + op_real_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ lemma Si_deterministic_trans{L}: \true; + */ +/*@ lemma Sf_deterministic_trans{L}: \true; + */ +/*@ lemma S5_deterministic_trans{L}: \true; + */ +/*@ lemma S4_deterministic_trans{L}: \true; + */ +/*@ lemma S2_deterministic_trans{L}: \true; + */ +int X; +int Y; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; */ +/*@ +lemma S3_deterministic_trans{L}: + ∀ int x; + ¬(\at(aorai_CurOperation,L) ≡ op_g ∧ + \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧ x ≡ 5 ∧ + \at(aorai_CurOperation,L) ≡ op_g ∧ + \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧ x ≡ 4); + */ +/*@ +lemma S1_deterministic_trans{L}: + ∀ int __retres_f, int x; + ¬(\at(X,L) ≡ 5 ∧ \at(aorai_CurOperation,L) ≡ op_f ∧ + \at(aorai_CurOpStatus,L) ≡ aorai_Terminated ∧ __retres_f ≡ 0 ∧ + \at(aorai_CurOperation,L) ≡ op_f ∧ + \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧ x ≡ 4); + */ +/*@ +lemma S0_deterministic_trans{L}: + ∀ int c; + ¬(\at(aorai_CurOperation,L) ≡ op_real_main ∧ + \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧ c ≢ 0 ∧ + \at(aorai_CurOperation,L) ≡ op_real_main ∧ + \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧ c ≡ 0); + */ +/*@ ghost int aorai_CurStates = Si; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_g; + assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_S0_out: + ensures aorai_CurStates ≢ S0; + + behavior buch_state_S1_out: + ensures aorai_CurStates ≢ S1; + + behavior buch_state_S2_out: + ensures aorai_CurStates ≢ S2; + + behavior buch_state_S3_out: + ensures aorai_CurStates ≢ S3; + + behavior buch_state_S4_in: + assumes aorai_CurStates ≡ S3 ∧ x ≡ 4; + ensures aorai_CurStates ≡ S4; + + behavior buch_state_S4_out: + assumes aorai_CurStates ≢ S3 ∨ ¬(x ≡ 4); + ensures aorai_CurStates ≢ S4; + + behavior buch_state_S5_in: + assumes aorai_CurStates ≡ S3 ∧ x ≡ 5; + ensures aorai_CurStates ≡ S5; + + behavior buch_state_S5_out: + assumes aorai_CurStates ≢ S3 ∨ ¬(x ≡ 5); + ensures aorai_CurStates ≢ S5; + + behavior buch_state_Sf_out: + ensures aorai_CurStates ≢ Sf; + + behavior buch_state_Si_out: + ensures aorai_CurStates ≢ Si; + */ +extern void g_pre_func(int x); + +/*@ requires aorai_CurStates ≡ S4 ∨ aorai_CurStates ≡ S5; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_g; + assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_S0_out: + ensures aorai_CurStates ≢ S0; + + behavior buch_state_S1_in: + assumes aorai_CurStates ≡ S5; + ensures aorai_CurStates ≡ S1; + + behavior buch_state_S1_out: + assumes aorai_CurStates ≢ S5; + ensures aorai_CurStates ≢ S1; + + behavior buch_state_S2_out: + ensures aorai_CurStates ≢ S2; + + behavior buch_state_S3_in: + assumes aorai_CurStates ≡ S4; + ensures aorai_CurStates ≡ S3; + + behavior buch_state_S3_out: + assumes aorai_CurStates ≢ S4; + ensures aorai_CurStates ≢ S3; + + behavior buch_state_S4_out: + ensures aorai_CurStates ≢ S4; + + behavior buch_state_S5_out: + ensures aorai_CurStates ≢ S5; + + behavior buch_state_Sf_out: + ensures aorai_CurStates ≢ Sf; + + behavior buch_state_Si_out: + ensures aorai_CurStates ≢ Si; + */ +extern void g_post_func(void); + +/*@ requires aorai_CurStates ≡ S3; + requires aorai_CurStates ≡ S3 ⇒ x ≡ 4 ∨ x ≡ 5; + + behavior Buchi_behavior_in_1: + assumes aorai_CurStates ≡ S3 ∧ x ≡ 5; + ensures aorai_CurStates ≡ S1; + + behavior Buchi_behavior_in_0: + assumes aorai_CurStates ≡ S3 ∧ x ≡ 4; + ensures aorai_CurStates ≡ S3; + */ +void g(int x) +{ + g_pre_func(x); + Y = x; + g_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_S0_out: + ensures aorai_CurStates ≢ S0; + + behavior buch_state_S1_out: + ensures aorai_CurStates ≢ S1; + + behavior buch_state_S2_out: + ensures aorai_CurStates ≢ S2; + + behavior buch_state_S3_in: + assumes aorai_CurStates ≡ S1 ∧ x ≡ 4; + ensures aorai_CurStates ≡ S3; + + behavior buch_state_S3_out: + assumes aorai_CurStates ≢ S1 ∨ ¬(x ≡ 4); + ensures aorai_CurStates ≢ S3; + + behavior buch_state_S4_out: + ensures aorai_CurStates ≢ S4; + + behavior buch_state_S5_out: + ensures aorai_CurStates ≢ S5; + + behavior buch_state_Sf_out: + ensures aorai_CurStates ≢ Sf; + + behavior buch_state_Si_out: + ensures aorai_CurStates ≢ Si; + */ +extern void f_pre_func(int x); + +/*@ requires aorai_CurStates ≡ S1; + requires aorai_CurStates ≡ S1 ⇒ res ≡ 0 ∧ X ≡ 5; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_S0_out: + ensures aorai_CurStates ≢ S0; + + behavior buch_state_S1_out: + ensures aorai_CurStates ≢ S1; + + behavior buch_state_S2_in: + assumes aorai_CurStates ≡ S1 ∧ X ≡ 5 ∧ res ≡ 0; + ensures aorai_CurStates ≡ S2; + + behavior buch_state_S2_out: + assumes aorai_CurStates ≢ S1 ∨ ¬(X ≡ 5 ∧ res ≡ 0); + ensures aorai_CurStates ≢ S2; + + behavior buch_state_S3_out: + ensures aorai_CurStates ≢ S3; + + behavior buch_state_S4_out: + ensures aorai_CurStates ≢ S4; + + behavior buch_state_S5_out: + ensures aorai_CurStates ≢ S5; + + behavior buch_state_Sf_out: + ensures aorai_CurStates ≢ Sf; + + behavior buch_state_Si_out: + ensures aorai_CurStates ≢ Si; + */ +extern void f_post_func(int res); + +/*@ requires aorai_CurStates ≡ S1; + requires aorai_CurStates ≡ S1 ⇒ x ≡ 4; + + behavior Buchi_property_behavior: + ensures aorai_CurStates ≡ S2 ⇒ \result ≡ 0 ∧ X ≡ 5; + ensures aorai_CurStates ≡ S2; + */ +int f(int x) +{ + int __retres; + f_pre_func(x); + X = x; + g(X); + X ++; + g(X); + __retres = 0; + f_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_real_main; + assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_S0_out: + ensures aorai_CurStates ≢ S0; + + behavior buch_state_S1_in: + assumes aorai_CurStates ≡ S0 ∧ c ≢ 0; + ensures aorai_CurStates ≡ S1; + + behavior buch_state_S1_out: + assumes aorai_CurStates ≢ S0 ∨ c ≡ 0; + ensures aorai_CurStates ≢ S1; + + behavior buch_state_S2_in: + assumes aorai_CurStates ≡ S0 ∧ c ≡ 0; + ensures aorai_CurStates ≡ S2; + + behavior buch_state_S2_out: + assumes aorai_CurStates ≢ S0 ∨ ¬(c ≡ 0); + ensures aorai_CurStates ≢ S2; + + behavior buch_state_S3_out: + ensures aorai_CurStates ≢ S3; + + behavior buch_state_S4_out: + ensures aorai_CurStates ≢ S4; + + behavior buch_state_S5_out: + ensures aorai_CurStates ≢ S5; + + behavior buch_state_Sf_out: + ensures aorai_CurStates ≢ Sf; + + behavior buch_state_Si_out: + ensures aorai_CurStates ≢ Si; + */ +extern void real_main_pre_func(int c); + +/*@ requires aorai_CurStates ≡ S2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_real_main; + assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_S0_out: + ensures aorai_CurStates ≢ S0; + + behavior buch_state_S1_out: + ensures aorai_CurStates ≢ S1; + + behavior buch_state_S2_out: + ensures aorai_CurStates ≢ S2; + + behavior buch_state_S3_out: + ensures aorai_CurStates ≢ S3; + + behavior buch_state_S4_out: + ensures aorai_CurStates ≢ S4; + + behavior buch_state_S5_out: + ensures aorai_CurStates ≢ S5; + + behavior buch_state_Sf_in: + assumes aorai_CurStates ≡ S2; + ensures aorai_CurStates ≡ Sf; + + behavior buch_state_Sf_out: + assumes aorai_CurStates ≢ S2; + ensures aorai_CurStates ≢ Sf; + + behavior buch_state_Si_out: + ensures aorai_CurStates ≢ Si; + */ +extern void real_main_post_func(int res); + +/*@ requires aorai_CurStates ≡ S0; + requires aorai_CurStates ≡ S0 ⇒ c ≢ 0 ∨ c ≡ 0; + + behavior Buchi_property_behavior: + ensures aorai_CurStates ≡ Sf; + */ +int real_main(int c) +{ + int __retres; + real_main_pre_func(c); + if (c) f(4); + __retres = 0; + real_main_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_S0_in: + assumes aorai_CurStates ≡ Si; + ensures aorai_CurStates ≡ S0; + + behavior buch_state_S0_out: + assumes aorai_CurStates ≢ Si; + ensures aorai_CurStates ≢ S0; + + behavior buch_state_S1_out: + ensures aorai_CurStates ≢ S1; + + behavior buch_state_S2_out: + ensures aorai_CurStates ≢ S2; + + behavior buch_state_S3_out: + ensures aorai_CurStates ≢ S3; + + behavior buch_state_S4_out: + ensures aorai_CurStates ≢ S4; + + behavior buch_state_S5_out: + ensures aorai_CurStates ≢ S5; + + behavior buch_state_Sf_out: + ensures aorai_CurStates ≢ Sf; + + behavior buch_state_Si_out: + ensures aorai_CurStates ≢ Si; + */ +extern void main_pre_func(int c); + +/*@ requires aorai_CurStates ≡ Sf; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_S0_out: + ensures aorai_CurStates ≢ S0; + + behavior buch_state_S1_out: + ensures aorai_CurStates ≢ S1; + + behavior buch_state_S2_out: + ensures aorai_CurStates ≢ S2; + + behavior buch_state_S3_out: + ensures aorai_CurStates ≢ S3; + + behavior buch_state_S4_out: + ensures aorai_CurStates ≢ S4; + + behavior buch_state_S5_out: + ensures aorai_CurStates ≢ S5; + + behavior buch_state_Sf_in: + assumes aorai_CurStates ≡ Sf; + ensures aorai_CurStates ≡ Sf; + + behavior buch_state_Sf_out: + assumes aorai_CurStates ≢ Sf; + ensures aorai_CurStates ≢ Sf; + + behavior buch_state_Si_out: + ensures aorai_CurStates ≢ Si; + */ +extern void main_post_func(int res); + +/*@ requires aorai_CurStates ≡ Si; + + behavior Buchi_property_behavior: + ensures aorai_CurStates ≡ Sf; + */ +int main(int c) +{ + int tmp; + main_pre_func(c); + tmp = real_main(c); + main_post_func(tmp); + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/formals.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/formals.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/formals.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/formals.res.oracle 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,501 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/formals.i (no preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_formals0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_States { + aorai_reject_state = -2, + OK = 0, + aorai_intermediate_state = 1, + aorai_intermediate_state_0 = 2, + aorai_intermediate_state_1 = 3, + aorai_intermediate_state_2 = 4, + aorai_reject = 5, + init = 6, + main_0 = 7 +}; +enum aorai_ListOper { + op_f = 2, + op_g = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ lemma init_deterministic_trans{L}: \true; + */ +/*@ lemma aorai_reject_deterministic_trans{L}: \true; + */ +/*@ lemma OK_deterministic_trans{L}: \true; + */ +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; */ +/*@ +lemma main_0_deterministic_trans{L}: + ∀ int x; + ¬(x ≡ 3 ∧ \at(aorai_CurOperation,L) ≡ op_f ∧ + \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧ x ≡ 1 ∧ + \at(aorai_CurOperation,L) ≡ op_f ∧ + \at(aorai_CurOpStatus,L) ≡ aorai_Called); + */ +/*@ +lemma aorai_intermediate_state_0_deterministic_trans{L}: + ¬(\at(aorai_CurOperation,L) ≡ op_g ∧ + \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧ + ¬(\at(aorai_CurOperation,L) ≡ op_g ∧ + \at(aorai_CurOpStatus,L) ≡ aorai_Called)); + */ +/*@ ghost int aorai_CurStates = init; */ +/*@ ghost int aorai_x_0 = 0; */ +/*@ +lemma aorai_intermediate_state_2_deterministic_trans{L}: + ¬(\at(aorai_x_0,L) ≡ 3 ∧ \at(aorai_CurOperation,L) ≡ op_f ∧ + \at(aorai_CurOpStatus,L) ≡ aorai_Terminated ∧ + (¬(\at(aorai_CurOperation,L) ≡ op_f ∧ + \at(aorai_CurOpStatus,L) ≡ aorai_Terminated) ∨ + \at(aorai_x_0,L) ≢ 3)); + */ +/*@ ghost int aorai_y = 0; */ +/*@ +lemma aorai_intermediate_state_1_deterministic_trans{L}: + ¬(\at(aorai_y,L) ≡ 2 ∧ \at(aorai_CurOperation,L) ≡ op_g ∧ + \at(aorai_CurOpStatus,L) ≡ aorai_Terminated ∧ + (¬(\at(aorai_CurOperation,L) ≡ op_g ∧ + \at(aorai_CurOpStatus,L) ≡ aorai_Terminated) ∨ + \at(aorai_y,L) ≢ 2)); + */ +/*@ ghost int aorai_x = 0; */ +/*@ +lemma aorai_intermediate_state_deterministic_trans{L}: + ¬(\at(aorai_x,L) ≡ 1 ∧ \at(aorai_CurOperation,L) ≡ op_f ∧ + \at(aorai_CurOpStatus,L) ≡ aorai_Terminated ∧ + (¬(\at(aorai_CurOperation,L) ≡ op_f ∧ + \at(aorai_CurOpStatus,L) ≡ aorai_Terminated) ∨ + \at(aorai_x,L) ≢ 1)); + */ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_x_0, aorai_x, aorai_CurOpStatus, aorai_CurOperation, + aorai_CurStates; + + behavior buch_state_OK_out: + ensures aorai_CurStates ≢ OK; + + behavior buch_state_aorai_intermediate_state_in_0: + assumes aorai_CurStates ≡ main_0 ∧ x ≡ 1; + ensures aorai_CurStates ≡ aorai_intermediate_state; + ensures aorai_x ≡ \old(x); + + behavior buch_state_aorai_intermediate_state_out: + assumes aorai_CurStates ≢ main_0 ∨ ¬(x ≡ 1); + ensures aorai_CurStates ≢ aorai_intermediate_state; + ensures aorai_x ≡ \old(aorai_x); + + behavior buch_state_aorai_intermediate_state_0_out: + ensures aorai_CurStates ≢ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures aorai_CurStates ≢ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_in_0: + assumes aorai_CurStates ≡ main_0 ∧ x ≡ 3; + ensures aorai_CurStates ≡ aorai_intermediate_state_2; + ensures aorai_x_0 ≡ \old(x); + + behavior buch_state_aorai_intermediate_state_2_out: + assumes aorai_CurStates ≢ main_0 ∨ ¬(x ≡ 3); + ensures aorai_CurStates ≢ aorai_intermediate_state_2; + ensures aorai_x_0 ≡ \old(aorai_x_0); + + behavior buch_state_aorai_reject_out: + ensures aorai_CurStates ≢ aorai_reject; + + behavior buch_state_init_out: + ensures aorai_CurStates ≢ init; + + behavior buch_state_main_0_out: + ensures aorai_CurStates ≢ main_0; + */ +extern void f_pre_func(int x); + +/*@ requires + aorai_CurStates ≡ aorai_intermediate_state ∨ + aorai_CurStates ≡ aorai_intermediate_state_2; + requires + aorai_CurStates ≡ aorai_intermediate_state ⇒ + aorai_x ≡ 1 ∨ aorai_x ≢ 1; + requires + aorai_CurStates ≡ aorai_intermediate_state_2 ⇒ + aorai_x_0 ≡ 3 ∨ aorai_x_0 ≢ 3; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_OK_in: + assumes + aorai_CurStates ≡ aorai_intermediate_state_2 ∧ aorai_x_0 ≡ 3; + ensures aorai_CurStates ≡ OK; + + behavior buch_state_OK_out: + assumes + aorai_CurStates ≢ aorai_intermediate_state_2 ∨ + ¬(aorai_x_0 ≡ 3); + ensures aorai_CurStates ≢ OK; + + behavior buch_state_aorai_intermediate_state_out: + ensures aorai_CurStates ≢ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_in: + assumes aorai_CurStates ≡ aorai_intermediate_state ∧ aorai_x ≡ 1; + ensures aorai_CurStates ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_0_out: + assumes + aorai_CurStates ≢ aorai_intermediate_state ∨ ¬(aorai_x ≡ 1); + ensures aorai_CurStates ≢ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures aorai_CurStates ≢ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures aorai_CurStates ≢ aorai_intermediate_state_2; + + behavior buch_state_aorai_reject_in: + assumes + (aorai_CurStates ≡ aorai_intermediate_state_2 ∧ aorai_x_0 ≢ 3) ∨ + (aorai_CurStates ≡ aorai_intermediate_state ∧ aorai_x ≢ 1); + ensures aorai_CurStates ≡ aorai_reject; + + behavior buch_state_aorai_reject_out: + assumes + (aorai_CurStates ≢ aorai_intermediate_state_2 ∨ + ¬(aorai_x_0 ≢ 3)) ∧ + (aorai_CurStates ≢ aorai_intermediate_state ∨ ¬(aorai_x ≢ 1)); + ensures aorai_CurStates ≢ aorai_reject; + + behavior buch_state_init_out: + ensures aorai_CurStates ≢ init; + + behavior buch_state_main_0_out: + ensures aorai_CurStates ≢ main_0; + */ +extern void f_post_func(int res); + +/*@ requires aorai_CurStates ≡ main_0; + requires aorai_CurStates ≡ main_0 ⇒ x ≡ 1 ∨ x ≡ 3; + ensures + aorai_CurStates ≡ aorai_intermediate_state_0 ∨ + aorai_CurStates ≡ OK; + ensures + \old(aorai_CurStates ≡ main_0) ⇒ + aorai_CurStates ≢ OK ∧ aorai_CurStates ≢ aorai_reject ⇒ + aorai_x_0 ≡ \old(aorai_x_0); + ensures + \old(aorai_CurStates ≡ main_0) ⇒ + aorai_CurStates ≢ aorai_intermediate_state_0 ∧ + aorai_CurStates ≢ aorai_reject ⇒ aorai_x ≡ \old(aorai_x); + + behavior Buchi_behavior_in_1: + assumes aorai_CurStates ≡ main_0 ∧ x ≡ 3; + ensures + (aorai_CurStates ≡ OK ⇒ aorai_x_0 ≡ 3) ∧ + (aorai_CurStates ≡ aorai_intermediate_state_0 ⇒ aorai_x ≡ 1) ∧ + (aorai_CurStates ≡ aorai_reject ⇒ + aorai_x ≢ 1 ∨ aorai_x_0 ≢ 3); + ensures aorai_CurStates ≡ OK ∨ aorai_CurStates ≡ aorai_reject; + ensures + \at(aorai_CurStates ≡ main_0,Pre) ∧ + aorai_CurStates ≡ aorai_reject ⇒ + aorai_x_0 ≡ \at(x,Pre)+0 ∨ aorai_x_0 ≡ \at(aorai_x_0,Pre)+0; + ensures + \at(aorai_CurStates ≡ main_0,Pre) ∧ + aorai_CurStates ≡ aorai_reject ⇒ + aorai_x ≡ \at(x,Pre)+0 ∨ aorai_x ≡ \at(aorai_x,Pre)+0; + ensures + \at(aorai_CurStates ≡ main_0,Pre) ∧ aorai_CurStates ≡ OK ⇒ + aorai_x_0 ≡ \at(x,Pre)+0; + + behavior Buchi_behavior_in_0: + assumes aorai_CurStates ≡ main_0 ∧ x ≡ 1; + ensures + (aorai_CurStates ≡ OK ⇒ aorai_x_0 ≡ 3) ∧ + (aorai_CurStates ≡ aorai_intermediate_state_0 ⇒ aorai_x ≡ 1) ∧ + (aorai_CurStates ≡ aorai_reject ⇒ + aorai_x ≢ 1 ∨ aorai_x_0 ≢ 3); + ensures + aorai_CurStates ≡ aorai_intermediate_state_0 ∨ + aorai_CurStates ≡ aorai_reject; + ensures + \at(aorai_CurStates ≡ main_0,Pre) ∧ + aorai_CurStates ≡ aorai_reject ⇒ + aorai_x_0 ≡ \at(x,Pre)+0 ∨ aorai_x_0 ≡ \at(aorai_x_0,Pre)+0; + ensures + \at(aorai_CurStates ≡ main_0,Pre) ∧ + aorai_CurStates ≡ aorai_reject ⇒ + aorai_x ≡ \at(x,Pre)+0 ∨ aorai_x ≡ \at(aorai_x,Pre)+0; + ensures + \at(aorai_CurStates ≡ main_0,Pre) ∧ + aorai_CurStates ≡ aorai_intermediate_state_0 ⇒ + aorai_x ≡ \at(x,Pre)+0; + */ +int f(int x) +{ + f_pre_func(x); + f_post_func(x); + return x; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_g; + assigns aorai_y, aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_OK_in: + assumes aorai_CurStates ≡ OK; + ensures aorai_CurStates ≡ OK; + + behavior buch_state_OK_out: + assumes aorai_CurStates ≢ OK; + ensures aorai_CurStates ≢ OK; + + behavior buch_state_aorai_intermediate_state_out: + ensures aorai_CurStates ≢ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures aorai_CurStates ≢ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_in_0: + assumes aorai_CurStates ≡ aorai_intermediate_state_0; + ensures aorai_CurStates ≡ aorai_intermediate_state_1; + ensures aorai_y ≡ \old(y); + + behavior buch_state_aorai_intermediate_state_1_out: + assumes aorai_CurStates ≢ aorai_intermediate_state_0; + ensures aorai_CurStates ≢ aorai_intermediate_state_1; + ensures aorai_y ≡ \old(aorai_y); + + behavior buch_state_aorai_intermediate_state_2_out: + ensures aorai_CurStates ≢ aorai_intermediate_state_2; + + behavior buch_state_aorai_reject_in: + assumes aorai_CurStates ≡ aorai_reject; + ensures aorai_CurStates ≡ aorai_reject; + + behavior buch_state_aorai_reject_out: + assumes aorai_CurStates ≢ aorai_reject; + ensures aorai_CurStates ≢ aorai_reject; + + behavior buch_state_init_out: + ensures aorai_CurStates ≢ init; + + behavior buch_state_main_0_out: + ensures aorai_CurStates ≢ main_0; + */ +extern void g_pre_func(int y); + +/*@ requires + aorai_CurStates ≡ OK ∨ + aorai_CurStates ≡ aorai_intermediate_state_1; + requires + aorai_CurStates ≡ aorai_intermediate_state_1 ⇒ + aorai_y ≡ 2 ∨ aorai_y ≢ 2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_g; + assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_OK_in: + assumes + (aorai_CurStates ≡ aorai_intermediate_state_1 ∧ aorai_y ≡ 2) ∨ + aorai_CurStates ≡ OK; + ensures aorai_CurStates ≡ OK; + + behavior buch_state_OK_out: + assumes + (aorai_CurStates ≢ aorai_intermediate_state_1 ∨ ¬(aorai_y ≡ 2)) ∧ + aorai_CurStates ≢ OK; + ensures aorai_CurStates ≢ OK; + + behavior buch_state_aorai_intermediate_state_out: + ensures aorai_CurStates ≢ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures aorai_CurStates ≢ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures aorai_CurStates ≢ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures aorai_CurStates ≢ aorai_intermediate_state_2; + + behavior buch_state_aorai_reject_in: + assumes + aorai_CurStates ≡ aorai_reject ∨ + (aorai_CurStates ≡ aorai_intermediate_state_1 ∧ aorai_y ≢ 2); + ensures aorai_CurStates ≡ aorai_reject; + + behavior buch_state_aorai_reject_out: + assumes + aorai_CurStates ≢ aorai_reject ∧ + (aorai_CurStates ≢ aorai_intermediate_state_1 ∨ ¬(aorai_y ≢ 2)); + ensures aorai_CurStates ≢ aorai_reject; + + behavior buch_state_init_out: + ensures aorai_CurStates ≢ init; + + behavior buch_state_main_0_out: + ensures aorai_CurStates ≢ main_0; + */ +extern void g_post_func(int res); + +/*@ requires + aorai_CurStates ≡ OK ∨ + aorai_CurStates ≡ aorai_intermediate_state_0; + requires + aorai_CurStates ≡ aorai_reject ∨ aorai_CurStates ≢ aorai_reject; + requires + aorai_CurStates ≡ aorai_intermediate_state_0 ∨ + aorai_CurStates ≢ aorai_intermediate_state_0; + requires aorai_CurStates ≡ OK ∨ aorai_CurStates ≢ OK; + ensures aorai_CurStates ≡ OK; + + behavior Buchi_behavior_in_2: + assumes aorai_CurStates ≡ aorai_reject; + ensures aorai_CurStates ≡ aorai_reject; + + behavior Buchi_behavior_in_1: + assumes aorai_CurStates ≡ aorai_intermediate_state_0; + ensures aorai_CurStates ≡ OK ∨ aorai_CurStates ≡ aorai_reject; + ensures + \at(aorai_CurStates ≡ aorai_intermediate_state_0,Pre) ∧ + aorai_CurStates ≡ aorai_reject ⇒ aorai_y ≡ \at(y,Pre)+0; + ensures + \at(aorai_CurStates ≡ aorai_intermediate_state_0,Pre) ∧ + aorai_CurStates ≡ OK ⇒ aorai_y ≡ \at(y,Pre)+0; + + behavior Buchi_behavior_in_0: + assumes aorai_CurStates ≡ OK; + ensures aorai_CurStates ≡ OK; + */ +int g(int y) +{ + g_pre_func(y); + g_post_func(y); + return y; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_OK_out: + ensures aorai_CurStates ≢ OK; + + behavior buch_state_aorai_intermediate_state_out: + ensures aorai_CurStates ≢ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures aorai_CurStates ≢ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures aorai_CurStates ≢ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures aorai_CurStates ≢ aorai_intermediate_state_2; + + behavior buch_state_aorai_reject_out: + ensures aorai_CurStates ≢ aorai_reject; + + behavior buch_state_init_out: + ensures aorai_CurStates ≢ init; + + behavior buch_state_main_0_in: + assumes aorai_CurStates ≡ init; + ensures aorai_CurStates ≡ main_0; + + behavior buch_state_main_0_out: + assumes aorai_CurStates ≢ init; + ensures aorai_CurStates ≢ main_0; + */ +extern void main_pre_func(void); + +/*@ requires aorai_CurStates ≡ OK; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates; + + behavior buch_state_OK_in: + assumes aorai_CurStates ≡ OK; + ensures aorai_CurStates ≡ OK; + + behavior buch_state_OK_out: + assumes aorai_CurStates ≢ OK; + ensures aorai_CurStates ≢ OK; + + behavior buch_state_aorai_intermediate_state_out: + ensures aorai_CurStates ≢ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures aorai_CurStates ≢ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures aorai_CurStates ≢ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures aorai_CurStates ≢ aorai_intermediate_state_2; + + behavior buch_state_aorai_reject_in: + assumes aorai_CurStates ≡ aorai_reject; + ensures aorai_CurStates ≡ aorai_reject; + + behavior buch_state_aorai_reject_out: + assumes aorai_CurStates ≢ aorai_reject; + ensures aorai_CurStates ≢ aorai_reject; + + behavior buch_state_init_out: + ensures aorai_CurStates ≢ init; + + behavior buch_state_main_0_out: + ensures aorai_CurStates ≢ main_0; + */ +extern void main_post_func(int res); + +/*@ requires aorai_CurStates ≡ init; + ensures aorai_CurStates ≡ OK; + + behavior Buchi_property_behavior: + ensures aorai_CurStates ≡ OK ∨ aorai_CurStates ≡ aorai_reject; + ensures + \at(aorai_CurStates ≡ init,Pre) ∧ + aorai_CurStates ≡ aorai_reject ⇒ + aorai_x_0 ≡ \at(1,Pre)+0 ∨ aorai_x_0 ≡ \at(aorai_x_0,Pre)+0; + ensures + \at(aorai_CurStates ≡ init,Pre) ∧ + aorai_CurStates ≡ aorai_reject ⇒ + aorai_y ≡ \at(2,Pre)+0 ∨ aorai_y ≡ \at(aorai_y,Pre)+0; + ensures + \at(aorai_CurStates ≡ init,Pre) ∧ + aorai_CurStates ≡ aorai_reject ⇒ + aorai_x ≡ \at(1,Pre)+0 ∨ aorai_x ≡ \at(aorai_x,Pre)+0; + ensures + \at(aorai_CurStates ≡ init,Pre) ∧ aorai_CurStates ≡ OK ⇒ + aorai_x_0 ≡ \at(1,Pre)+0 ∨ aorai_x_0 ≡ \at(aorai_x_0,Pre)+0; + ensures + \at(aorai_CurStates ≡ init,Pre) ∧ aorai_CurStates ≡ OK ⇒ + aorai_y ≡ \at(2,Pre)+0 ∨ aorai_y ≡ \at(aorai_y,Pre)+0; + ensures + \at(aorai_CurStates ≡ init,Pre) ∧ aorai_CurStates ≡ OK ⇒ + aorai_x ≡ \at(1,Pre)+0 ∨ aorai_x ≡ \at(aorai_x,Pre)+0; + */ +int main(void) +{ + int __retres; + main_pre_func(); + f(1); + g(2); + __retres = 0; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/generate_assigns_bts1290.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/generate_assigns_bts1290.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/generate_assigns_bts1290.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/generate_assigns_bts1290.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,77 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/generate_assigns_bts1290.i (no preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_generate_assigns_bts12900.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int S = 1; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S; + + behavior buch_state_S_in: + assumes 1 ≡ S; + ensures 1 ≡ S; + + behavior buch_state_S_out: + assumes 0 ≡ S; + ensures 0 ≡ S; + */ +extern void main_pre_func(void); + +/*@ requires 1 ≡ S; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S; + + behavior buch_state_S_in: + assumes 1 ≡ S; + ensures 1 ≡ S; + + behavior buch_state_S_out: + assumes 0 ≡ S; + ensures 0 ≡ S; + */ +extern void main_post_func(void); + +/*@ requires 1 ≡ S; + + behavior Buchi_property_behavior: + ensures \true; + ensures 1 ≡ S; + */ +void main(void) +{ + int aorai_Loop_Init_11; + int i; + main_pre_func(); + i = 0; + /*@ ghost aorai_Loop_Init_11 = 1; */ + aorai_loop_11: + /*@ loop invariant Aorai: 1 ≡ S; + loop assigns i, aorai_Loop_Init_11, aorai_CurOpStatus, + aorai_CurOperation, S; + loop assigns aorai_Loop_Init_11 \from \nothing; + */ + while (1) { + if (! (i < 10)) goto while_0_break; + /*@ ghost aorai_Loop_Init_11 = 0; */ + i ++; + } + while_0_break: ; + main_post_func(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/goto.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/goto.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/goto.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/goto.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,412 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/goto.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +tests/aorai/goto.c:29:[aorai] warning: Call to opc does not follow automaton's specification. This path is assumed to be dead +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_goto0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_main = 3, + op_opa = 2, + op_opb = 1, + op_opc = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +int status = 0; +int rr = 1; +/*@ global invariant inv: 0 ≤ rr ≤ 5000; + */ +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int accept_S2 = 0; */ +/*@ ghost int accept_S3 = 0; */ +/*@ ghost int accept_S4 = 0; */ +/*@ ghost int accept_S5 = 0; */ +/*@ ghost int accept_S6 = 0; */ +/*@ ghost int accept_all = 0; */ +/*@ ghost int accept_init = 1; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_opa; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S2, accept_S3, + accept_S4, accept_S5, accept_S6, accept_all, accept_init; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_in: + assumes 1 ≡ accept_S2; + ensures 1 ≡ accept_S3; + + behavior buch_state_accept_S3_out: + assumes 0 ≡ accept_S2; + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_S6_out: + ensures 0 ≡ accept_S6; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void opa_pre_func(void); + +/*@ requires + 1 ≡ accept_S3 ∧ 0 ≡ accept_S2 ∧ 0 ≡ accept_S4 ∧ + 0 ≡ accept_S5 ∧ 0 ≡ accept_S6 ∧ 0 ≡ accept_all ∧ + 0 ≡ accept_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_opa; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S2, accept_S3, + accept_S4, accept_S5, accept_S6, accept_all, accept_init; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_in: + assumes 1 ≡ accept_S3; + ensures 1 ≡ accept_S4; + + behavior buch_state_accept_S4_out: + assumes 0 ≡ accept_S3; + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_S6_out: + ensures 0 ≡ accept_S6; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void opa_post_func(void); + +/*@ requires + 1 ≡ accept_S2 ∧ 0 ≡ accept_S3 ∧ 0 ≡ accept_S4 ∧ + 0 ≡ accept_S5 ∧ 0 ≡ accept_S6 ∧ 0 ≡ accept_all ∧ + 0 ≡ accept_init; + requires rr < 5000; + + behavior j: + ensures rr < 5001; + + behavior Buchi_property_behavior: + ensures + 0 ≡ accept_S2 ∧ 0 ≡ accept_S3 ∧ 0 ≡ accept_S5 ∧ + 0 ≡ accept_S6 ∧ 0 ≡ accept_all ∧ 0 ≡ accept_init; + ensures 1 ≡ accept_S4; + */ +void opa(void) +{ + opa_pre_func(); + rr ++; + opa_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_opb; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S2, accept_S3, + accept_S4, accept_S5, accept_S6, accept_all, accept_init; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_in: + assumes 1 ≡ accept_S4; + ensures 1 ≡ accept_S5; + + behavior buch_state_accept_S5_out: + assumes 0 ≡ accept_S4; + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_S6_out: + ensures 0 ≡ accept_S6; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void opb_pre_func(void); + +/*@ requires + 1 ≡ accept_S5 ∧ 0 ≡ accept_S2 ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S4 ∧ 0 ≡ accept_S6 ∧ 0 ≡ accept_all ∧ + 0 ≡ accept_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_opb; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S2, accept_S3, + accept_S4, accept_S5, accept_S6, accept_all, accept_init; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_S6_in: + assumes 1 ≡ accept_S5; + ensures 1 ≡ accept_S6; + + behavior buch_state_accept_S6_out: + assumes 0 ≡ accept_S5; + ensures 0 ≡ accept_S6; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void opb_post_func(void); + +/*@ requires + 1 ≡ accept_S4 ∧ 0 ≡ accept_S2 ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S5 ∧ 0 ≡ accept_S6 ∧ 0 ≡ accept_all ∧ + 0 ≡ accept_init; + + behavior Buchi_property_behavior: + ensures + 0 ≡ accept_S2 ∧ 0 ≡ accept_S3 ∧ 0 ≡ accept_S4 ∧ + 0 ≡ accept_S5 ∧ 0 ≡ accept_all ∧ 0 ≡ accept_init; + ensures 1 ≡ accept_S6; + */ +void opb(void) +{ + opb_pre_func(); + status = 1; + opb_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_opc; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S2, accept_S3, + accept_S4, accept_S5, accept_S6, accept_all, accept_init; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_S6_out: + ensures 0 ≡ accept_S6; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void opc_pre_func(void); + +/*@ requires \false; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_opc; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S2, accept_S3, + accept_S4, accept_S5, accept_S6, accept_all, accept_init; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_S6_out: + ensures 0 ≡ accept_S6; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void opc_post_func(void); + +/*@ requires \false; + + behavior Buchi_behavior_out_0: + ensures 0 ≡ accept_S2; + + behavior Buchi_behavior_out_1: + ensures 0 ≡ accept_S3; + + behavior Buchi_behavior_out_2: + ensures 0 ≡ accept_S4; + + behavior Buchi_behavior_out_3: + ensures 0 ≡ accept_S5; + + behavior Buchi_behavior_out_4: + ensures 0 ≡ accept_S6; + + behavior Buchi_behavior_out_5: + ensures 0 ≡ accept_all; + + behavior Buchi_behavior_out_6: + ensures 0 ≡ accept_init; + */ +void opc(void) +{ + opc_pre_func(); + rr = 60000; + opc_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S2, accept_S3, + accept_S4, accept_S5, accept_S6, accept_all, accept_init; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ accept_init; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ accept_init; + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_S6_out: + ensures 0 ≡ accept_S6; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void main_pre_func(void); + +/*@ requires + 1 ≡ accept_S6 ∧ 0 ≡ accept_S2 ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S4 ∧ 0 ≡ accept_S5 ∧ 0 ≡ accept_all ∧ + 0 ≡ accept_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S2, accept_S3, + accept_S4, accept_S5, accept_S6, accept_all, accept_init; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_S6_out: + ensures 0 ≡ accept_S6; + + behavior buch_state_accept_all_in: + assumes 1 ≡ accept_S6; + ensures 1 ≡ accept_all; + + behavior buch_state_accept_all_out: + assumes 0 ≡ accept_S6; + ensures 0 ≡ accept_all; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void main_post_func(int res); + +/*@ requires + 1 ≡ accept_init ∧ 0 ≡ accept_S2 ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S4 ∧ 0 ≡ accept_S5 ∧ 0 ≡ accept_S6 ∧ + 0 ≡ accept_all; + + behavior aorai_acceptance: + ensures + 1 ≡ accept_S2 ∨ 1 ≡ accept_S3 ∨ 1 ≡ accept_S4 ∨ + 1 ≡ accept_S5 ∨ 1 ≡ accept_S6 ∨ 1 ≡ accept_all ∨ + 1 ≡ accept_init; + + behavior Buchi_property_behavior: + ensures + 0 ≡ accept_S2 ∧ 0 ≡ accept_S3 ∧ 0 ≡ accept_S4 ∧ + 0 ≡ accept_S5 ∧ 0 ≡ accept_S6 ∧ 0 ≡ accept_init; + ensures 1 ≡ accept_all; + */ +int main(void) +{ + int __retres; + main_pre_func(); + if (rr < 5000) goto L; + opc(); + L4: goto L5; + L: opa(); + goto L2; + opc(); + L6: __retres = 1; + goto return_label; + L3: goto L4; + opc(); + goto L2; + L2: goto L3; + L5: opb(); + goto L6; + return_label: main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/hoare_seq.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/hoare_seq.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/hoare_seq.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/hoare_seq.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,287 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/hoare_seq.i (no preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_hoare_seq0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_f = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int S0 = 1; */ +/*@ ghost int Sf = 0; */ +/*@ ghost int aorai_intermediate_state = 0; */ +/*@ ghost int aorai_intermediate_state_0 = 0; */ +/*@ ghost int aorai_intermediate_state_1 = 0; */ +/*@ ghost int aorai_intermediate_state_2 = 0; */ +/*@ ghost int aorai_reject = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_reject; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_in: + assumes 1 ≡ aorai_intermediate_state_0; + ensures 1 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_1_out: + assumes 0 ≡ aorai_intermediate_state_0; + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_reject_in: + assumes 1 ≡ aorai_intermediate_state; + ensures 1 ≡ aorai_reject; + + behavior buch_state_aorai_reject_out: + assumes 0 ≡ aorai_intermediate_state; + ensures 0 ≡ aorai_reject; + */ +extern void f_pre_func(void); + +/*@ requires + 1 ≡ aorai_intermediate_state_1 ∧ 0 ≡ S0 ∧ 0 ≡ Sf ∧ + 0 ≡ aorai_intermediate_state ∧ 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_reject; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_in: + assumes 1 ≡ aorai_intermediate_state_1; + ensures 1 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_2_out: + assumes 0 ≡ aorai_intermediate_state_1; + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_reject_in: + assumes 1 ≡ aorai_reject; + ensures 1 ≡ aorai_reject; + + behavior buch_state_aorai_reject_out: + assumes 0 ≡ aorai_reject; + ensures 0 ≡ aorai_reject; + */ +extern void f_post_func(void); + +/*@ requires + 1 ≡ aorai_intermediate_state_0 ∧ 0 ≡ S0 ∧ 0 ≡ Sf ∧ + 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_reject; + requires + 1 ≡ aorai_intermediate_state_0 ∨ 0 ≡ aorai_intermediate_state_0; + requires + 1 ≡ aorai_intermediate_state ∨ 0 ≡ aorai_intermediate_state; + ensures 1 ≡ aorai_intermediate_state_2; + + behavior Buchi_behavior_in_0: + assumes 1 ≡ aorai_intermediate_state_0; + ensures 1 ≡ aorai_intermediate_state_2; + + behavior Buchi_behavior_in_1: + assumes 1 ≡ aorai_intermediate_state; + ensures 1 ≡ aorai_reject; + + behavior Buchi_behavior_out_0: + ensures 0 ≡ S0; + + behavior Buchi_behavior_out_1: + ensures 0 ≡ Sf; + + behavior Buchi_behavior_out_2: + ensures 0 ≡ aorai_intermediate_state; + + behavior Buchi_behavior_out_3: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior Buchi_behavior_out_4: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior Buchi_behavior_out_5: + assumes 0 ≡ aorai_intermediate_state_0; + ensures 0 ≡ aorai_intermediate_state_2; + + behavior Buchi_behavior_out_6: + assumes 0 ≡ aorai_intermediate_state; + ensures 0 ≡ aorai_reject; + */ +void f(void) +{ + f_pre_func(); + f_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_reject; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_in: + assumes 1 ≡ S0 ∧ c > 0; + ensures 1 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_out: + assumes 0 ≡ S0 ∨ ¬(c > 0); + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_in: + assumes 1 ≡ S0 ∧ c ≤ 0; + ensures 1 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_0_out: + assumes 0 ≡ S0 ∨ ¬(c ≤ 0); + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_reject_out: + ensures 0 ≡ aorai_reject; + */ +extern void main_pre_func(int c); + +/*@ requires + (1 ≡ aorai_intermediate_state ∨ 1 ≡ aorai_intermediate_state_0 ∨ + 1 ≡ aorai_intermediate_state_2) ∧ + 0 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state_1; + requires 1 ≡ aorai_intermediate_state_2 ⇒ res ≡ 0 ∨ res ≢ 0; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_reject; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_in: + assumes + (1 ≡ aorai_intermediate_state_2 ∧ res ≡ 0) ∨ + 1 ≡ aorai_intermediate_state; + ensures 1 ≡ Sf; + + behavior buch_state_Sf_out: + assumes + (0 ≡ aorai_intermediate_state_2 ∨ ¬(res ≡ 0)) ∧ + 0 ≡ aorai_intermediate_state; + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_reject_in: + assumes + 1 ≡ aorai_reject ∨ + (1 ≡ aorai_intermediate_state_2 ∧ res ≢ 0) ∨ + 1 ≡ aorai_intermediate_state_0; + ensures 1 ≡ aorai_reject; + + behavior buch_state_aorai_reject_out: + assumes + 0 ≡ aorai_reject ∧ + (0 ≡ aorai_intermediate_state_2 ∨ res ≡ 0) ∧ + 0 ≡ aorai_intermediate_state_0; + ensures 0 ≡ aorai_reject; + */ +extern void main_post_func(int res); + +/*@ requires + 1 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_reject; + requires 1 ≡ S0 ⇒ c > 0 ∨ c ≤ 0; + ensures 1 ≡ Sf; + + behavior bhv: + assumes c > 0; + ensures \result ≡ 0; + + behavior aorai_acceptance: + ensures 1 ≡ Sf; + + behavior Buchi_property_behavior: + ensures 1 ≡ Sf ∨ 0 ≡ Sf; + ensures 1 ≡ aorai_reject ∨ 0 ≡ aorai_reject; + ensures + 0 ≡ S0 ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ 0 ≡ aorai_intermediate_state_2; + ensures 1 ≡ Sf ∨ 1 ≡ aorai_reject; + */ +int main(int c) +{ + int __retres; + main_pre_func(c); + if (c <= 0) f(); + __retres = 0; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/loop_bts1050.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/loop_bts1050.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/loop_bts1050.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/loop_bts1050.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,383 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/loop_bts1050.i (no preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_loop_bts10500.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_f = 2, + op_g = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int S0 = 1; */ +/*@ ghost int Sf = 0; */ +/*@ ghost int aorai_intermediate_state = 0; */ +/*@ ghost int aorai_intermediate_state_0 = 0; */ +/*@ ghost int aorai_intermediate_state_1 = 0; */ +/*@ ghost int aorai_intermediate_state_2 = 0; */ +/*@ ghost int aorai_intermediate_state_3 = 0; */ +/*@ ghost int aorai_counter = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_counter, aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_in_0: + assumes 1 ≡ aorai_intermediate_state_0 ∧ aorai_counter < 5; + ensures 1 ≡ aorai_intermediate_state_1; + ensures aorai_counter ≡ \old(aorai_counter)+1; + + behavior buch_state_aorai_intermediate_state_1_in_1: + assumes 1 ≡ aorai_intermediate_state; + ensures 1 ≡ aorai_intermediate_state_1; + ensures aorai_counter ≡ 1; + + behavior buch_state_aorai_intermediate_state_1_out: + assumes + (0 ≡ aorai_intermediate_state_0 ∨ ¬(aorai_counter < 5)) ∧ + 0 ≡ aorai_intermediate_state; + ensures 0 ≡ aorai_intermediate_state_1; + ensures aorai_counter ≡ \old(aorai_counter); + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_out: + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void f_pre_func(void); + +/*@ requires + 1 ≡ aorai_intermediate_state_1 ∧ 0 ≡ S0 ∧ 0 ≡ Sf ∧ + 0 ≡ aorai_intermediate_state ∧ 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_in: + assumes 1 ≡ aorai_intermediate_state_1; + ensures 1 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_2_out: + assumes 0 ≡ aorai_intermediate_state_1; + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_out: + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void f_post_func(void); + +/*@ requires + (1 ≡ aorai_intermediate_state ∨ 1 ≡ aorai_intermediate_state_0) ∧ + 0 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + requires 1 ≡ aorai_intermediate_state_0 ⇒ aorai_counter < 5; + requires + 0 ≡ aorai_intermediate_state ∨ 0 ≡ aorai_intermediate_state_0; + requires + 1 ≡ aorai_intermediate_state_0 ∨ 0 ≡ aorai_intermediate_state_0; + requires + 1 ≡ aorai_intermediate_state ∨ 0 ≡ aorai_intermediate_state; + + behavior Buchi_property_behavior: + ensures + 0 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ 0 ≡ aorai_intermediate_state_3; + ensures 1 ≡ aorai_intermediate_state_2; + ensures + \at(1 ≡ aorai_intermediate_state_0,Pre) ∧ + 1 ≡ aorai_intermediate_state_2 ⇒ + aorai_counter ≡ \at(aorai_counter,Pre)+1; + ensures + \at(1 ≡ aorai_intermediate_state,Pre) ∧ + 1 ≡ aorai_intermediate_state_2 ⇒ aorai_counter ≡ 1; + */ +void f(void) +{ + f_pre_func(); + f_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_g; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_in: + assumes 1 ≡ aorai_intermediate_state_2; + ensures 1 ≡ aorai_intermediate_state_3; + + behavior buch_state_aorai_intermediate_state_3_out: + assumes 0 ≡ aorai_intermediate_state_2; + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void g_pre_func(void); + +/*@ requires + 1 ≡ aorai_intermediate_state_3 ∧ 0 ≡ S0 ∧ 0 ≡ Sf ∧ + 0 ≡ aorai_intermediate_state ∧ 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ 0 ≡ aorai_intermediate_state_2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_g; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_in: + assumes 1 ≡ aorai_intermediate_state_3; + ensures 1 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_0_out: + assumes 0 ≡ aorai_intermediate_state_3; + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_out: + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void g_post_func(void); + +/*@ requires + 1 ≡ aorai_intermediate_state_2 ∧ 0 ≡ S0 ∧ 0 ≡ Sf ∧ + 0 ≡ aorai_intermediate_state ∧ 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ 0 ≡ aorai_intermediate_state_3; + + behavior Buchi_property_behavior: + ensures + 0 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + ensures 1 ≡ aorai_intermediate_state_0; + */ +void g(void) +{ + g_pre_func(); + g_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_in: + assumes 1 ≡ S0; + ensures 1 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_out: + assumes 0 ≡ S0; + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_out: + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void main_pre_func(int c); + +/*@ requires + (1 ≡ aorai_intermediate_state ∨ 1 ≡ aorai_intermediate_state_0) ∧ + 0 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_in: + assumes + 1 ≡ aorai_intermediate_state_0 ∨ 1 ≡ aorai_intermediate_state; + ensures 1 ≡ Sf; + + behavior buch_state_Sf_out: + assumes + 0 ≡ aorai_intermediate_state_0 ∧ 0 ≡ aorai_intermediate_state; + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_out: + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void main_post_func(int res); + +/*@ requires + 1 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + + behavior aorai_acceptance: + ensures 1 ≡ Sf; + + behavior Buchi_property_behavior: + ensures + 0 ≡ S0 ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + ensures 1 ≡ Sf; + ensures + \at(1 ≡ S0,Pre) ∧ 1 ≡ Sf ⇒ + (1 ≤ aorai_counter ≤ 5) ∨ + aorai_counter ≡ \at(aorai_counter,Pre)+0; + */ +int main(int c) +{ + int aorai_Loop_Init_37; + int __retres; + main_pre_func(c); + if (c < 0) c = 0; + if (c > 0) c = 5; + /*@ ghost aorai_Loop_Init_37 = 1; */ + aorai_loop_37: + /*@ loop invariant Aorai: 0 ≡ S0; + loop invariant Aorai: 0 ≡ Sf; + loop invariant + Aorai: + 1 ≡ aorai_intermediate_state ∨ 0 ≡ aorai_intermediate_state; + loop invariant + Aorai: + 1 ≡ aorai_intermediate_state_0 ∨ + 0 ≡ aorai_intermediate_state_0; + loop invariant Aorai: 0 ≡ aorai_intermediate_state_1; + loop invariant Aorai: 0 ≡ aorai_intermediate_state_2; + loop invariant Aorai: 0 ≡ aorai_intermediate_state_3; + loop invariant + Aorai: + 1 ≡ aorai_intermediate_state ∨ + 1 ≡ aorai_intermediate_state_0; + loop invariant + Aorai: + aorai_Loop_Init_37 ≢ 0 ⇒ + \at(1 ≡ S0,Pre) ⇒ 0 ≡ aorai_intermediate_state_0; + loop invariant + Aorai: aorai_Loop_Init_37 ≡ 0 ⇒ 0 ≡ aorai_intermediate_state; + loop invariant + Aorai: + \at(1 ≡ aorai_intermediate_state,aorai_loop_37) ∧ + 1 ≡ aorai_intermediate_state_0 ⇒ 1 ≤ aorai_counter ≤ 5; + */ + while (1) { + if (! c) goto while_0_break; + /*@ ghost aorai_Loop_Init_37 = 0; */ + f(); + g(); + c --; + } + while_0_break: ; + __retres = 0; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/not_prm.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/not_prm.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/not_prm.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/not_prm.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,72 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/not_prm.i (no preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_not_prm0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_f = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_f; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int S0 = 1; */ +/*@ ghost int Sf = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_in: + assumes 1 ≡ S0 ∧ x ≥ 4; + ensures 1 ≡ Sf; + + behavior buch_state_Sf_out: + assumes 0 ≡ S0 ∨ ¬(x ≥ 4); + ensures 0 ≡ Sf; + */ +extern void f_pre_func(int x); + +/*@ requires 1 ≡ Sf ∧ 0 ≡ S0; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_in: + assumes 1 ≡ Sf; + ensures 1 ≡ Sf; + + behavior buch_state_Sf_out: + assumes 0 ≡ Sf; + ensures 0 ≡ Sf; + */ +extern void f_post_func(int res); + +/*@ requires 1 ≡ S0 ∧ 0 ≡ Sf; + requires 1 ≡ S0 ⇒ x ≥ 4; + + behavior aorai_acceptance: + ensures 1 ≡ Sf; + + behavior Buchi_property_behavior: + ensures 0 ≡ S0; + ensures 1 ≡ Sf; + */ +int f(int x) +{ + f_pre_func(x); + f_post_func(x); + return x; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/other.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/other.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/other.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/other.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,391 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/other.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_other0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_f = 2, + op_g = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +int x = 0; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int init = 1; */ +/*@ ghost int last = 0; */ +/*@ ghost int step1 = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, init, last, step1; + + behavior buch_state_init_in: + assumes (1 ≡ last ∧ x ≡ 4) ∨ (1 ≡ init ∧ x ≢ 3); + ensures 1 ≡ init; + + behavior buch_state_init_out: + assumes (0 ≡ last ∨ ¬(x ≡ 4)) ∧ (0 ≡ init ∨ ¬(x ≢ 3)); + ensures 0 ≡ init; + + behavior buch_state_last_in: + assumes + (1 ≡ step1 ∧ x ≡ 4) ∨ (1 ≡ last ∧ x ≢ 4 ∧ x ≢ 3); + ensures 1 ≡ last; + + behavior buch_state_last_out: + assumes + (0 ≡ step1 ∨ ¬(x ≡ 4)) ∧ + (0 ≡ last ∨ ¬(x ≢ 4 ∧ x ≢ 3)); + ensures 0 ≡ last; + + behavior buch_state_step1_in: + assumes + (1 ≡ step1 ∧ x ≢ 4) ∨ (1 ≡ last ∧ x ≡ 3) ∨ + (1 ≡ init ∧ x ≡ 3); + ensures 1 ≡ step1; + + behavior buch_state_step1_out: + assumes + (0 ≡ step1 ∨ ¬(x ≢ 4)) ∧ (0 ≡ last ∨ ¬(x ≡ 3)) ∧ + (0 ≡ init ∨ ¬(x ≡ 3)); + ensures 0 ≡ step1; + */ +extern void f_pre_func(void); + +/*@ requires 1 ≡ init ∨ 1 ≡ last ∨ 1 ≡ step1; + requires 1 ≡ last ⇒ x ≡ 4 ∨ (x ≢ 4 ∧ x ≢ 3) ∨ x ≡ 3; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, init, last, step1; + + behavior buch_state_init_in: + assumes (1 ≡ last ∧ x ≡ 4) ∨ (1 ≡ init ∧ x ≢ 3); + ensures 1 ≡ init; + + behavior buch_state_init_out: + assumes (0 ≡ last ∨ ¬(x ≡ 4)) ∧ (0 ≡ init ∨ ¬(x ≢ 3)); + ensures 0 ≡ init; + + behavior buch_state_last_in: + assumes + (1 ≡ step1 ∧ x ≡ 4) ∨ (1 ≡ last ∧ x ≢ 4 ∧ x ≢ 3); + ensures 1 ≡ last; + + behavior buch_state_last_out: + assumes + (0 ≡ step1 ∨ ¬(x ≡ 4)) ∧ + (0 ≡ last ∨ ¬(x ≢ 4 ∧ x ≢ 3)); + ensures 0 ≡ last; + + behavior buch_state_step1_in: + assumes + (1 ≡ step1 ∧ x ≢ 4) ∨ (1 ≡ last ∧ x ≡ 3) ∨ + (1 ≡ init ∧ x ≡ 3); + ensures 1 ≡ step1; + + behavior buch_state_step1_out: + assumes + (0 ≡ step1 ∨ ¬(x ≢ 4)) ∧ (0 ≡ last ∨ ¬(x ≡ 3)) ∧ + (0 ≡ init ∨ ¬(x ≡ 3)); + ensures 0 ≡ step1; + */ +extern void f_post_func(void); + +/*@ requires 1 ≡ init ∨ 1 ≡ last ∨ 1 ≡ step1; + requires 1 ≡ last ⇒ x ≡ 4 ∨ (x ≢ 4 ∧ x ≢ 3) ∨ x ≡ 3; + requires 1 ≡ step1 ∨ 0 ≡ step1; + requires 1 ≡ last ∨ 0 ≡ last; + requires 1 ≡ init ∨ 0 ≡ init; + + behavior Buchi_behavior_in_0: + assumes (1 ≡ last ∧ x ≡ 4) ∨ (1 ≡ init ∧ x ≢ 3); + ensures + (1 ≡ init ⇒ x ≢ 3 ∨ x ≡ 4) ∧ + (1 ≡ last ⇒ (x ≢ 4 ∧ x ≢ 3) ∨ x ≡ 4) ∧ + (1 ≡ step1 ⇒ x ≡ 3 ∨ x ≢ 4); + ensures 1 ≡ init ∨ 0 ≡ init; + ensures 1 ≡ step1 ∨ 0 ≡ step1; + ensures 1 ≡ init ∨ 1 ≡ step1; + + behavior Buchi_behavior_in_1: + assumes + (1 ≡ step1 ∧ x ≡ 4) ∨ (1 ≡ last ∧ x ≢ 4 ∧ x ≢ 3); + ensures + (1 ≡ init ⇒ x ≢ 3 ∨ x ≡ 4) ∧ + (1 ≡ last ⇒ (x ≢ 4 ∧ x ≢ 3) ∨ x ≡ 4) ∧ + (1 ≡ step1 ⇒ x ≡ 3 ∨ x ≢ 4); + ensures 1 ≡ init ∨ 0 ≡ init; + ensures 1 ≡ last ∨ 0 ≡ last; + ensures 1 ≡ step1 ∨ 0 ≡ step1; + ensures 1 ≡ init ∨ 1 ≡ last ∨ 1 ≡ step1; + + behavior Buchi_behavior_in_2: + assumes + (1 ≡ step1 ∧ x ≢ 4) ∨ (1 ≡ last ∧ x ≡ 3) ∨ + (1 ≡ init ∧ x ≡ 3); + ensures + (1 ≡ init ⇒ x ≢ 3 ∨ x ≡ 4) ∧ + (1 ≡ last ⇒ (x ≢ 4 ∧ x ≢ 3) ∨ x ≡ 4) ∧ + (1 ≡ step1 ⇒ x ≡ 3 ∨ x ≢ 4); + ensures 1 ≡ last ∨ 0 ≡ last; + ensures 1 ≡ step1 ∨ 0 ≡ step1; + ensures 1 ≡ last ∨ 1 ≡ step1; + + behavior Buchi_behavior_out_0: + assumes + (0 ≡ last ∨ (x ≡ 3 ∧ x ≢ 4)) ∧ + (0 ≡ step1 ∨ x ≢ 4) ∧ (0 ≡ init ∨ x ≡ 3); + ensures 0 ≡ init; + + behavior Buchi_behavior_out_1: + assumes + 0 ≡ step1 ∧ (0 ≡ init ∨ x ≢ 3) ∧ + (0 ≡ last ∨ (x ≢ 3 ∧ x ≡ 4)); + ensures 0 ≡ last; + + behavior Buchi_behavior_out_2: + assumes 0 ≡ last ∧ 0 ≡ init ∧ 0 ≡ step1; + ensures 0 ≡ step1; + */ +void f(void) +{ + f_pre_func(); + x = 3; + f_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_g; + assigns aorai_CurOpStatus, aorai_CurOperation, init, last, step1; + + behavior buch_state_init_in: + assumes (1 ≡ last ∧ x ≡ 4) ∨ (1 ≡ init ∧ x ≢ 3); + ensures 1 ≡ init; + + behavior buch_state_init_out: + assumes (0 ≡ last ∨ ¬(x ≡ 4)) ∧ (0 ≡ init ∨ ¬(x ≢ 3)); + ensures 0 ≡ init; + + behavior buch_state_last_in: + assumes + (1 ≡ step1 ∧ x ≡ 4) ∨ (1 ≡ last ∧ x ≢ 4 ∧ x ≢ 3); + ensures 1 ≡ last; + + behavior buch_state_last_out: + assumes + (0 ≡ step1 ∨ ¬(x ≡ 4)) ∧ + (0 ≡ last ∨ ¬(x ≢ 4 ∧ x ≢ 3)); + ensures 0 ≡ last; + + behavior buch_state_step1_in: + assumes + (1 ≡ step1 ∧ x ≢ 4) ∨ (1 ≡ last ∧ x ≡ 3) ∨ + (1 ≡ init ∧ x ≡ 3); + ensures 1 ≡ step1; + + behavior buch_state_step1_out: + assumes + (0 ≡ step1 ∨ ¬(x ≢ 4)) ∧ (0 ≡ last ∨ ¬(x ≡ 3)) ∧ + (0 ≡ init ∨ ¬(x ≡ 3)); + ensures 0 ≡ step1; + */ +extern void g_pre_func(void); + +/*@ requires 1 ≡ init ∨ 1 ≡ last ∨ 1 ≡ step1; + requires 1 ≡ last ⇒ x ≡ 4 ∨ (x ≢ 4 ∧ x ≢ 3) ∨ x ≡ 3; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_g; + assigns aorai_CurOpStatus, aorai_CurOperation, init, last, step1; + + behavior buch_state_init_in: + assumes (1 ≡ last ∧ x ≡ 4) ∨ (1 ≡ init ∧ x ≢ 3); + ensures 1 ≡ init; + + behavior buch_state_init_out: + assumes (0 ≡ last ∨ ¬(x ≡ 4)) ∧ (0 ≡ init ∨ ¬(x ≢ 3)); + ensures 0 ≡ init; + + behavior buch_state_last_in: + assumes + (1 ≡ step1 ∧ x ≡ 4) ∨ (1 ≡ last ∧ x ≢ 4 ∧ x ≢ 3); + ensures 1 ≡ last; + + behavior buch_state_last_out: + assumes + (0 ≡ step1 ∨ ¬(x ≡ 4)) ∧ + (0 ≡ last ∨ ¬(x ≢ 4 ∧ x ≢ 3)); + ensures 0 ≡ last; + + behavior buch_state_step1_in: + assumes + (1 ≡ step1 ∧ x ≢ 4) ∨ (1 ≡ last ∧ x ≡ 3) ∨ + (1 ≡ init ∧ x ≡ 3); + ensures 1 ≡ step1; + + behavior buch_state_step1_out: + assumes + (0 ≡ step1 ∨ ¬(x ≢ 4)) ∧ (0 ≡ last ∨ ¬(x ≡ 3)) ∧ + (0 ≡ init ∨ ¬(x ≡ 3)); + ensures 0 ≡ step1; + */ +extern void g_post_func(void); + +/*@ requires 1 ≡ init ∨ 1 ≡ last ∨ 1 ≡ step1; + requires 1 ≡ last ⇒ x ≡ 4 ∨ (x ≢ 4 ∧ x ≢ 3) ∨ x ≡ 3; + requires 1 ≡ step1 ∨ 0 ≡ step1; + requires 1 ≡ last ∨ 0 ≡ last; + requires 1 ≡ init ∨ 0 ≡ init; + + behavior Buchi_behavior_in_0: + assumes (1 ≡ last ∧ x ≡ 4) ∨ (1 ≡ init ∧ x ≢ 3); + ensures + (1 ≡ init ⇒ x ≢ 3 ∨ x ≡ 4) ∧ + (1 ≡ last ⇒ (x ≢ 4 ∧ x ≢ 3) ∨ x ≡ 4) ∧ + (1 ≡ step1 ⇒ x ≡ 3 ∨ x ≢ 4); + ensures 1 ≡ init ∨ 0 ≡ init; + ensures 1 ≡ step1 ∨ 0 ≡ step1; + ensures 1 ≡ init ∨ 1 ≡ step1; + + behavior Buchi_behavior_in_1: + assumes + (1 ≡ step1 ∧ x ≡ 4) ∨ (1 ≡ last ∧ x ≢ 4 ∧ x ≢ 3); + ensures + (1 ≡ init ⇒ x ≢ 3 ∨ x ≡ 4) ∧ + (1 ≡ last ⇒ (x ≢ 4 ∧ x ≢ 3) ∨ x ≡ 4) ∧ + (1 ≡ step1 ⇒ x ≡ 3 ∨ x ≢ 4); + ensures 1 ≡ init ∨ 0 ≡ init; + ensures 1 ≡ last ∨ 0 ≡ last; + ensures 1 ≡ step1 ∨ 0 ≡ step1; + ensures 1 ≡ init ∨ 1 ≡ last ∨ 1 ≡ step1; + + behavior Buchi_behavior_in_2: + assumes + (1 ≡ step1 ∧ x ≢ 4) ∨ (1 ≡ last ∧ x ≡ 3) ∨ + (1 ≡ init ∧ x ≡ 3); + ensures + (1 ≡ init ⇒ x ≢ 3 ∨ x ≡ 4) ∧ + (1 ≡ last ⇒ (x ≢ 4 ∧ x ≢ 3) ∨ x ≡ 4) ∧ + (1 ≡ step1 ⇒ x ≡ 3 ∨ x ≢ 4); + ensures 1 ≡ last ∨ 0 ≡ last; + ensures 1 ≡ step1 ∨ 0 ≡ step1; + ensures 1 ≡ last ∨ 1 ≡ step1; + + behavior Buchi_behavior_out_0: + assumes + (0 ≡ last ∨ (x ≡ 3 ∧ x ≢ 4)) ∧ + (0 ≡ step1 ∨ x ≢ 4) ∧ (0 ≡ init ∨ x ≡ 3); + ensures 0 ≡ init; + + behavior Buchi_behavior_out_1: + assumes + 0 ≡ step1 ∧ (0 ≡ init ∨ x ≢ 3) ∧ + (0 ≡ last ∨ (x ≢ 3 ∧ x ≡ 4)); + ensures 0 ≡ last; + + behavior Buchi_behavior_out_2: + assumes 0 ≡ last ∧ 0 ≡ init ∧ 0 ≡ step1; + ensures 0 ≡ step1; + */ +void g(void) +{ + g_pre_func(); + x = 4; + g_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, init, last, step1; + + behavior buch_state_init_in: + assumes 1 ≡ init ∧ x ≢ 3; + ensures 1 ≡ init; + + behavior buch_state_init_out: + assumes 0 ≡ init ∨ ¬(x ≢ 3); + ensures 0 ≡ init; + + behavior buch_state_last_out: + ensures 0 ≡ last; + + behavior buch_state_step1_out: + ensures 0 ≡ step1; + */ +extern void main_pre_func(void); + +/*@ requires 1 ≡ init ∨ 1 ≡ last ∨ 1 ≡ step1; + requires 1 ≡ last ⇒ x ≡ 4 ∨ (x ≢ 4 ∧ x ≢ 3) ∨ x ≡ 3; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, init, last, step1; + + behavior buch_state_init_in: + assumes (1 ≡ last ∧ x ≡ 4) ∨ (1 ≡ init ∧ x ≢ 3); + ensures 1 ≡ init; + + behavior buch_state_init_out: + assumes (0 ≡ last ∨ ¬(x ≡ 4)) ∧ (0 ≡ init ∨ ¬(x ≢ 3)); + ensures 0 ≡ init; + + behavior buch_state_last_in: + assumes + (1 ≡ step1 ∧ x ≡ 4) ∨ (1 ≡ last ∧ x ≢ 4 ∧ x ≢ 3); + ensures 1 ≡ last; + + behavior buch_state_last_out: + assumes + (0 ≡ step1 ∨ ¬(x ≡ 4)) ∧ + (0 ≡ last ∨ ¬(x ≢ 4 ∧ x ≢ 3)); + ensures 0 ≡ last; + + behavior buch_state_step1_in: + assumes + (1 ≡ step1 ∧ x ≢ 4) ∨ (1 ≡ last ∧ x ≡ 3) ∨ + (1 ≡ init ∧ x ≡ 3); + ensures 1 ≡ step1; + + behavior buch_state_step1_out: + assumes + (0 ≡ step1 ∨ ¬(x ≢ 4)) ∧ (0 ≡ last ∨ ¬(x ≡ 3)) ∧ + (0 ≡ init ∨ ¬(x ≡ 3)); + ensures 0 ≡ step1; + */ +extern void main_post_func(int res); + +/*@ requires 1 ≡ init ∧ 0 ≡ last ∧ 0 ≡ step1; + requires 1 ≡ init ⇒ x ≢ 3; + + behavior aorai_acceptance: + ensures 1 ≡ last; + + behavior Buchi_property_behavior: + ensures + (1 ≡ init ⇒ x ≢ 3 ∨ x ≡ 4) ∧ + (1 ≡ last ⇒ (x ≢ 4 ∧ x ≢ 3) ∨ x ≡ 4) ∧ + (1 ≡ step1 ⇒ x ≡ 3 ∨ x ≢ 4); + ensures 1 ≡ init ∨ 0 ≡ init; + ensures 1 ≡ last ∨ 0 ≡ last; + ensures 1 ≡ step1 ∨ 0 ≡ step1; + ensures \true; + ensures 1 ≡ init ∨ 1 ≡ last ∨ 1 ≡ step1; + */ +int main(void) +{ + main_pre_func(); + f(); + g(); + f(); + g(); + main_post_func(x); + return x; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/seq_loop.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/seq_loop.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/seq_loop.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/seq_loop.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,394 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/seq_loop.i (no preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_seq_loop0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_f = 2, + op_g = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int S0 = 1; */ +/*@ ghost int Sf = 0; */ +/*@ ghost int aorai_intermediate_state = 0; */ +/*@ ghost int aorai_intermediate_state_0 = 0; */ +/*@ ghost int aorai_intermediate_state_1 = 0; */ +/*@ ghost int aorai_intermediate_state_2 = 0; */ +/*@ ghost int aorai_intermediate_state_3 = 0; */ +/*@ ghost int aorai_counter = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_counter, aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_in_0: + assumes 1 ≡ aorai_intermediate_state_0 ∧ aorai_counter < 5; + ensures 1 ≡ aorai_intermediate_state_1; + ensures aorai_counter ≡ \old(aorai_counter)+1; + + behavior buch_state_aorai_intermediate_state_1_in_1: + assumes 1 ≡ aorai_intermediate_state; + ensures 1 ≡ aorai_intermediate_state_1; + ensures aorai_counter ≡ 1; + + behavior buch_state_aorai_intermediate_state_1_out: + assumes + (0 ≡ aorai_intermediate_state_0 ∨ ¬(aorai_counter < 5)) ∧ + 0 ≡ aorai_intermediate_state; + ensures 0 ≡ aorai_intermediate_state_1; + ensures aorai_counter ≡ \old(aorai_counter); + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_out: + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void f_pre_func(void); + +/*@ requires + 1 ≡ aorai_intermediate_state_1 ∧ 0 ≡ S0 ∧ 0 ≡ Sf ∧ + 0 ≡ aorai_intermediate_state ∧ 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_in: + assumes 1 ≡ aorai_intermediate_state_1; + ensures 1 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_2_out: + assumes 0 ≡ aorai_intermediate_state_1; + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_out: + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void f_post_func(void); + +/*@ requires + (1 ≡ aorai_intermediate_state ∨ 1 ≡ aorai_intermediate_state_0) ∧ + 0 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + requires 1 ≡ aorai_intermediate_state_0 ⇒ aorai_counter < 5; + requires + 0 ≡ aorai_intermediate_state ∨ 0 ≡ aorai_intermediate_state_0; + requires + 1 ≡ aorai_intermediate_state_0 ∨ 0 ≡ aorai_intermediate_state_0; + requires + 1 ≡ aorai_intermediate_state ∨ 0 ≡ aorai_intermediate_state; + + behavior Buchi_property_behavior: + ensures + 0 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ 0 ≡ aorai_intermediate_state_3; + ensures 1 ≡ aorai_intermediate_state_2; + ensures + \at(1 ≡ aorai_intermediate_state_0,Pre) ∧ + 1 ≡ aorai_intermediate_state_2 ⇒ + aorai_counter ≡ \at(aorai_counter,Pre)+1; + ensures + \at(1 ≡ aorai_intermediate_state,Pre) ∧ + 1 ≡ aorai_intermediate_state_2 ⇒ aorai_counter ≡ 1; + */ +void f(void) +{ + f_pre_func(); + f_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_g; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_in: + assumes 1 ≡ aorai_intermediate_state_2; + ensures 1 ≡ aorai_intermediate_state_3; + + behavior buch_state_aorai_intermediate_state_3_out: + assumes 0 ≡ aorai_intermediate_state_2; + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void g_pre_func(void); + +/*@ requires + 1 ≡ aorai_intermediate_state_3 ∧ 0 ≡ S0 ∧ 0 ≡ Sf ∧ + 0 ≡ aorai_intermediate_state ∧ 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ 0 ≡ aorai_intermediate_state_2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_g; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_in: + assumes 1 ≡ aorai_intermediate_state_3; + ensures 1 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_0_out: + assumes 0 ≡ aorai_intermediate_state_3; + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_out: + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void g_post_func(void); + +/*@ requires + 1 ≡ aorai_intermediate_state_2 ∧ 0 ≡ S0 ∧ 0 ≡ Sf ∧ + 0 ≡ aorai_intermediate_state ∧ 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ 0 ≡ aorai_intermediate_state_3; + + behavior Buchi_property_behavior: + ensures + 0 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + ensures 1 ≡ aorai_intermediate_state_0; + */ +void g(void) +{ + g_pre_func(); + g_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_in: + assumes 1 ≡ S0; + ensures 1 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_out: + assumes 0 ≡ S0; + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_out: + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void main_pre_func(int c); + +/*@ requires + (1 ≡ aorai_intermediate_state ∨ 1 ≡ aorai_intermediate_state_0) ∧ + 0 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_in: + assumes + 1 ≡ aorai_intermediate_state_0 ∨ 1 ≡ aorai_intermediate_state; + ensures 1 ≡ Sf; + + behavior buch_state_Sf_out: + assumes + 0 ≡ aorai_intermediate_state_0 ∧ 0 ≡ aorai_intermediate_state; + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_out: + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void main_post_func(int res); + +/*@ requires + 1 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3, aorai_counter; + + behavior aorai_acceptance: + ensures 1 ≡ Sf; + + behavior Buchi_property_behavior: + ensures + 0 ≡ S0 ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + ensures 1 ≡ Sf; + ensures + \at(1 ≡ S0,Pre) ∧ 1 ≡ Sf ⇒ + (1 ≤ aorai_counter ≤ 5) ∨ + aorai_counter ≡ \at(aorai_counter,Pre)+0; + */ +int main(int c) +{ + int aorai_Loop_Init_39; + int __retres; + main_pre_func(c); + if (c < 0) c = 0; + if (c > 5) c = 5; + /*@ assert 0 ≤ c ≤ 5; */ ; + /*@ ghost aorai_Loop_Init_39 = 1; */ + aorai_loop_39: + /*@ loop invariant Aorai: 0 ≡ S0; + loop invariant Aorai: 0 ≡ Sf; + loop invariant + Aorai: + 1 ≡ aorai_intermediate_state ∨ 0 ≡ aorai_intermediate_state; + loop invariant + Aorai: + 1 ≡ aorai_intermediate_state_0 ∨ + 0 ≡ aorai_intermediate_state_0; + loop invariant Aorai: 0 ≡ aorai_intermediate_state_1; + loop invariant Aorai: 0 ≡ aorai_intermediate_state_2; + loop invariant Aorai: 0 ≡ aorai_intermediate_state_3; + loop invariant + Aorai: + 1 ≡ aorai_intermediate_state ∨ + 1 ≡ aorai_intermediate_state_0; + loop invariant + Aorai: + aorai_Loop_Init_39 ≢ 0 ⇒ + \at(1 ≡ S0,Pre) ⇒ 0 ≡ aorai_intermediate_state_0; + loop invariant + Aorai: aorai_Loop_Init_39 ≡ 0 ⇒ 0 ≡ aorai_intermediate_state; + loop invariant + Aorai: + \at(1 ≡ aorai_intermediate_state,aorai_loop_39) ∧ + 1 ≡ aorai_intermediate_state_0 ⇒ 1 ≤ aorai_counter ≤ 5; + loop assigns c, aorai_Loop_Init_39, aorai_CurOpStatus, + aorai_CurOperation, S0, Sf, aorai_intermediate_state, + aorai_intermediate_state_0, aorai_intermediate_state_1, + aorai_intermediate_state_2, aorai_intermediate_state_3, + aorai_counter; + loop assigns aorai_Loop_Init_39 \from \nothing; + */ + while (1) { + if (! c) goto while_0_break; + /*@ ghost aorai_Loop_Init_39 = 0; */ + f(); + g(); + c --; + } + while_0_break: ; + __retres = 0; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/seq.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/seq.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/seq.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/seq.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,359 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/seq.i (no preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_seq0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_f = 2, + op_g = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int S0 = 1; */ +/*@ ghost int Sf = 0; */ +/*@ ghost int aorai_intermediate_state = 0; */ +/*@ ghost int aorai_intermediate_state_0 = 0; */ +/*@ ghost int aorai_intermediate_state_1 = 0; */ +/*@ ghost int aorai_intermediate_state_2 = 0; */ +/*@ ghost int aorai_intermediate_state_3 = 0; */ +/*@ ghost int aorai_counter = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_in: + assumes 1 ≡ aorai_intermediate_state; + ensures 1 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_1_out: + assumes 0 ≡ aorai_intermediate_state; + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_out: + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void f_pre_func(void); + +/*@ requires + 1 ≡ aorai_intermediate_state_1 ∧ 0 ≡ S0 ∧ 0 ≡ Sf ∧ + 0 ≡ aorai_intermediate_state ∧ 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_f; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_in: + assumes 1 ≡ aorai_intermediate_state_1; + ensures 1 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_0_out: + assumes 0 ≡ aorai_intermediate_state_1; + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_out: + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void f_post_func(void); + +/*@ requires + 1 ≡ aorai_intermediate_state ∧ 0 ≡ S0 ∧ 0 ≡ Sf ∧ + 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + + behavior Buchi_property_behavior: + ensures + 0 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + ensures 1 ≡ aorai_intermediate_state_0; + */ +void f(void) +{ + f_pre_func(); + f_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_g; + assigns aorai_counter, aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_in_0: + assumes 1 ≡ aorai_intermediate_state_2 ∧ aorai_counter < 2; + ensures 1 ≡ aorai_intermediate_state_3; + ensures aorai_counter ≡ \old(aorai_counter)+1; + + behavior buch_state_aorai_intermediate_state_3_in_1: + assumes 1 ≡ aorai_intermediate_state_0; + ensures 1 ≡ aorai_intermediate_state_3; + ensures aorai_counter ≡ 1; + + behavior buch_state_aorai_intermediate_state_3_in_2: + assumes 1 ≡ aorai_intermediate_state; + ensures 1 ≡ aorai_intermediate_state_3; + ensures aorai_counter ≡ 1; + + behavior buch_state_aorai_intermediate_state_3_out: + assumes + (0 ≡ aorai_intermediate_state_2 ∨ ¬(aorai_counter < 2)) ∧ + 0 ≡ aorai_intermediate_state_0 ∧ 0 ≡ aorai_intermediate_state; + ensures 0 ≡ aorai_intermediate_state_3; + ensures aorai_counter ≡ \old(aorai_counter); + */ +extern void g_pre_func(void); + +/*@ requires + 1 ≡ aorai_intermediate_state_3 ∧ 0 ≡ S0 ∧ 0 ≡ Sf ∧ + 0 ≡ aorai_intermediate_state ∧ 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ 0 ≡ aorai_intermediate_state_2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_g; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_in: + assumes 1 ≡ aorai_intermediate_state_3; + ensures 1 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_2_out: + assumes 0 ≡ aorai_intermediate_state_3; + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_out: + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void g_post_func(void); + +/*@ requires + (1 ≡ aorai_intermediate_state ∨ 1 ≡ aorai_intermediate_state_0 ∨ + 1 ≡ aorai_intermediate_state_2) ∧ + 0 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_3; + requires 1 ≡ aorai_intermediate_state_2 ⇒ aorai_counter < 2; + requires + 0 ≡ aorai_intermediate_state ∨ 0 ≡ aorai_intermediate_state_2; + requires + 0 ≡ aorai_intermediate_state ∨ 0 ≡ aorai_intermediate_state_0; + requires + 0 ≡ aorai_intermediate_state_0 ∨ 0 ≡ aorai_intermediate_state_2; + requires + 1 ≡ aorai_intermediate_state_2 ∨ 0 ≡ aorai_intermediate_state_2; + requires + 1 ≡ aorai_intermediate_state_0 ∨ 0 ≡ aorai_intermediate_state_0; + requires + 1 ≡ aorai_intermediate_state ∨ 0 ≡ aorai_intermediate_state; + + behavior Buchi_property_behavior: + ensures + 0 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ 0 ≡ aorai_intermediate_state_3; + ensures 1 ≡ aorai_intermediate_state_2; + ensures + \at(1 ≡ aorai_intermediate_state_2,Pre) ∧ + 1 ≡ aorai_intermediate_state_2 ⇒ + aorai_counter ≡ \at(aorai_counter,Pre)+1; + ensures + \at(1 ≡ aorai_intermediate_state_0,Pre) ∧ + 1 ≡ aorai_intermediate_state_2 ⇒ aorai_counter ≡ 1; + ensures + \at(1 ≡ aorai_intermediate_state,Pre) ∧ + 1 ≡ aorai_intermediate_state_2 ⇒ aorai_counter ≡ 1; + */ +void g(void) +{ + g_pre_func(); + g_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_in: + assumes 1 ≡ S0; + ensures 1 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_out: + assumes 0 ≡ S0; + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_out: + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void main_pre_func(int c); + +/*@ requires + 1 ≡ aorai_intermediate_state_2 ∧ 0 ≡ S0 ∧ 0 ≡ Sf ∧ + 0 ≡ aorai_intermediate_state ∧ 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ 0 ≡ aorai_intermediate_state_3; + requires 1 ≡ aorai_intermediate_state_2 ⇒ 1 ≤ aorai_counter; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state, aorai_intermediate_state_0, + aorai_intermediate_state_1, aorai_intermediate_state_2, + aorai_intermediate_state_3; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_in: + assumes 1 ≡ aorai_intermediate_state_2 ∧ 1 ≤ aorai_counter; + ensures 1 ≡ Sf; + + behavior buch_state_Sf_out: + assumes 0 ≡ aorai_intermediate_state_2 ∨ ¬(1 ≤ aorai_counter); + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_0_out: + ensures 0 ≡ aorai_intermediate_state_0; + + behavior buch_state_aorai_intermediate_state_1_out: + ensures 0 ≡ aorai_intermediate_state_1; + + behavior buch_state_aorai_intermediate_state_2_out: + ensures 0 ≡ aorai_intermediate_state_2; + + behavior buch_state_aorai_intermediate_state_3_out: + ensures 0 ≡ aorai_intermediate_state_3; + */ +extern void main_post_func(int res); + +/*@ requires + 1 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + + behavior aorai_acceptance: + ensures 1 ≡ Sf; + + behavior Buchi_property_behavior: + ensures 1 ≡ Sf ⇒ 1 ≤ aorai_counter; + ensures + 0 ≡ S0 ∧ 0 ≡ aorai_intermediate_state ∧ + 0 ≡ aorai_intermediate_state_0 ∧ + 0 ≡ aorai_intermediate_state_1 ∧ + 0 ≡ aorai_intermediate_state_2 ∧ 0 ≡ aorai_intermediate_state_3; + ensures 1 ≡ Sf; + ensures \at(1 ≡ S0,Pre) ∧ 1 ≡ Sf ⇒ 1 ≤ aorai_counter ≤ 2; + */ +int main(int c) +{ + int __retres; + main_pre_func(c); + if (c) f(); + g(); + if (c) g(); + __retres = 0; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/single_call.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/single_call.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/single_call.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/single_call.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,82 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/single_call.i (no preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_single_call0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int S0 = 1; */ +/*@ ghost int Sf = 0; */ +/*@ ghost int aorai_intermediate_state = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_out: + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_in: + assumes 1 ≡ S0; + ensures 1 ≡ aorai_intermediate_state; + + behavior buch_state_aorai_intermediate_state_out: + assumes 0 ≡ S0; + ensures 0 ≡ aorai_intermediate_state; + */ +extern void main_pre_func(void); + +/*@ requires 1 ≡ aorai_intermediate_state ∧ 0 ≡ S0 ∧ 0 ≡ Sf; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S0, Sf, + aorai_intermediate_state; + + behavior buch_state_S0_out: + ensures 0 ≡ S0; + + behavior buch_state_Sf_in: + assumes 1 ≡ aorai_intermediate_state; + ensures 1 ≡ Sf; + + behavior buch_state_Sf_out: + assumes 0 ≡ aorai_intermediate_state; + ensures 0 ≡ Sf; + + behavior buch_state_aorai_intermediate_state_out: + ensures 0 ≡ aorai_intermediate_state; + */ +extern void main_post_func(int res); + +/*@ requires 1 ≡ S0 ∧ 0 ≡ Sf ∧ 0 ≡ aorai_intermediate_state; + + behavior aorai_acceptance: + ensures 1 ≡ Sf; + + behavior Buchi_property_behavior: + ensures 0 ≡ S0 ∧ 0 ≡ aorai_intermediate_state; + ensures 1 ≡ Sf; + */ +int main(void) +{ + int __retres; + main_pre_func(); + __retres = 0; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_acces_params2.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_acces_params2.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_acces_params2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_acces_params2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,401 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_acces_params2.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_acces_params20.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_main = 3, + op_opa = 2, + op_opb = 1, + op_opc = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +int rr = 1; +/*@ global invariant inv: 0 ≤ rr ≤ 5000; + */ +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int S1 = 1; */ +/*@ ghost int S2 = 0; */ +/*@ ghost int S3 = 0; */ +/*@ ghost int S4 = 0; */ +/*@ ghost int S5 = 0; */ +/*@ ghost int S6 = 0; */ +/*@ ghost int S7 = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_opa; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S3, S4, S5, S6, + S7; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_S3_in: + assumes 1 ≡ S2 ∧ r ≥ 0; + ensures 1 ≡ S3; + + behavior buch_state_S3_out: + assumes 0 ≡ S2 ∨ ¬(r ≥ 0); + ensures 0 ≡ S3; + + behavior buch_state_S4_out: + ensures 0 ≡ S4; + + behavior buch_state_S5_out: + ensures 0 ≡ S5; + + behavior buch_state_S6_out: + ensures 0 ≡ S6; + + behavior buch_state_S7_out: + ensures 0 ≡ S7; + */ +extern void opa_pre_func(int r); + +/*@ requires + 1 ≡ S3 ∧ 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S4 ∧ 0 ≡ S5 ∧ + 0 ≡ S6 ∧ 0 ≡ S7; + requires 1 ≡ S3 ⇒ res ≤ 5000; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_opa; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S3, S4, S5, S6, + S7; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_S3_out: + ensures 0 ≡ S3; + + behavior buch_state_S4_in: + assumes 1 ≡ S3 ∧ res ≤ 5000; + ensures 1 ≡ S4; + + behavior buch_state_S4_out: + assumes 0 ≡ S3 ∨ ¬(res ≤ 5000); + ensures 0 ≡ S4; + + behavior buch_state_S5_out: + ensures 0 ≡ S5; + + behavior buch_state_S6_out: + ensures 0 ≡ S6; + + behavior buch_state_S7_out: + ensures 0 ≡ S7; + */ +extern void opa_post_func(int res); + +/*@ requires + 1 ≡ S2 ∧ 0 ≡ S1 ∧ 0 ≡ S3 ∧ 0 ≡ S4 ∧ 0 ≡ S5 ∧ + 0 ≡ S6 ∧ 0 ≡ S7; + requires 1 ≡ S2 ⇒ r ≥ 0; + requires r < 5000; + + behavior j: + ensures \result ≡ \old(r)+1; + + behavior Buchi_property_behavior: + ensures 1 ≡ S4 ⇒ \result ≤ 5000; + ensures + 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S3 ∧ 0 ≡ S5 ∧ 0 ≡ S6 ∧ + 0 ≡ S7; + ensures 1 ≡ S4; + */ +int opa(int r) +{ + int __retres; + opa_pre_func(r); + __retres = r + 1; + opa_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_opb; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S3, S4, S5, S6, + S7; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_S3_out: + ensures 0 ≡ S3; + + behavior buch_state_S4_out: + ensures 0 ≡ S4; + + behavior buch_state_S5_in: + assumes 1 ≡ S4; + ensures 1 ≡ S5; + + behavior buch_state_S5_out: + assumes 0 ≡ S4; + ensures 0 ≡ S5; + + behavior buch_state_S6_out: + ensures 0 ≡ S6; + + behavior buch_state_S7_out: + ensures 0 ≡ S7; + */ +extern void opb_pre_func(void); + +/*@ requires + 1 ≡ S5 ∧ 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S3 ∧ 0 ≡ S4 ∧ + 0 ≡ S6 ∧ 0 ≡ S7; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_opb; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S3, S4, S5, S6, + S7; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_S3_out: + ensures 0 ≡ S3; + + behavior buch_state_S4_out: + ensures 0 ≡ S4; + + behavior buch_state_S5_out: + ensures 0 ≡ S5; + + behavior buch_state_S6_in: + assumes 1 ≡ S5; + ensures 1 ≡ S6; + + behavior buch_state_S6_out: + assumes 0 ≡ S5; + ensures 0 ≡ S6; + + behavior buch_state_S7_out: + ensures 0 ≡ S7; + */ +extern void opb_post_func(void); + +/*@ requires + 1 ≡ S4 ∧ 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S3 ∧ 0 ≡ S5 ∧ + 0 ≡ S6 ∧ 0 ≡ S7; + requires rr ≥ 1 ∧ rr ≤ 5000; + + behavior f: + ensures rr ≥ 3 ∧ rr ≤ 5000; + + behavior Buchi_property_behavior: + ensures + 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S3 ∧ 0 ≡ S4 ∧ 0 ≡ S5 ∧ + 0 ≡ S7; + ensures 1 ≡ S6; + */ +void opb(void) +{ + opb_pre_func(); + if (rr < 4998) rr += 2; + opb_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_opc; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S3, S4, S5, S6, + S7; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_S3_out: + ensures 0 ≡ S3; + + behavior buch_state_S4_out: + ensures 0 ≡ S4; + + behavior buch_state_S5_out: + ensures 0 ≡ S5; + + behavior buch_state_S6_out: + ensures 0 ≡ S6; + + behavior buch_state_S7_out: + ensures 0 ≡ S7; + */ +extern void opc_pre_func(void); + +/*@ requires \false; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_opc; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S3, S4, S5, S6, + S7; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_S3_out: + ensures 0 ≡ S3; + + behavior buch_state_S4_out: + ensures 0 ≡ S4; + + behavior buch_state_S5_out: + ensures 0 ≡ S5; + + behavior buch_state_S6_out: + ensures 0 ≡ S6; + + behavior buch_state_S7_out: + ensures 0 ≡ S7; + */ +extern void opc_post_func(void); + +/*@ requires \false; + + behavior d: + ensures rr ≡ 600; + + behavior Buchi_behavior_out_0: + ensures 0 ≡ S1; + + behavior Buchi_behavior_out_1: + ensures 0 ≡ S2; + + behavior Buchi_behavior_out_2: + ensures 0 ≡ S3; + + behavior Buchi_behavior_out_3: + ensures 0 ≡ S4; + + behavior Buchi_behavior_out_4: + ensures 0 ≡ S5; + + behavior Buchi_behavior_out_5: + ensures 0 ≡ S6; + + behavior Buchi_behavior_out_6: + ensures 0 ≡ S7; + */ +void opc(void) +{ + opc_pre_func(); + rr = 600; + opc_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S3, S4, S5, S6, + S7; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_in: + assumes 1 ≡ S1; + ensures 1 ≡ S2; + + behavior buch_state_S2_out: + assumes 0 ≡ S1; + ensures 0 ≡ S2; + + behavior buch_state_S3_out: + ensures 0 ≡ S3; + + behavior buch_state_S4_out: + ensures 0 ≡ S4; + + behavior buch_state_S5_out: + ensures 0 ≡ S5; + + behavior buch_state_S6_out: + ensures 0 ≡ S6; + + behavior buch_state_S7_out: + ensures 0 ≡ S7; + */ +extern void main_pre_func(void); + +/*@ requires + 1 ≡ S6 ∧ 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S3 ∧ 0 ≡ S4 ∧ + 0 ≡ S5 ∧ 0 ≡ S7; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S3, S4, S5, S6, + S7; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_S3_out: + ensures 0 ≡ S3; + + behavior buch_state_S4_out: + ensures 0 ≡ S4; + + behavior buch_state_S5_out: + ensures 0 ≡ S5; + + behavior buch_state_S6_out: + ensures 0 ≡ S6; + + behavior buch_state_S7_in: + assumes 1 ≡ S6; + ensures 1 ≡ S7; + + behavior buch_state_S7_out: + assumes 0 ≡ S6; + ensures 0 ≡ S7; + */ +extern void main_post_func(int res); + +/*@ requires + 1 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S3 ∧ 0 ≡ S4 ∧ 0 ≡ S5 ∧ + 0 ≡ S6 ∧ 0 ≡ S7; + requires rr ≡ 1; + + behavior Buchi_property_behavior: + ensures + 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S3 ∧ 0 ≡ S4 ∧ 0 ≡ S5 ∧ + 0 ≡ S6; + ensures 1 ≡ S7; + */ +int main(void) +{ + int __retres; + main_pre_func(); + if (rr < 5000) rr = opa(rr); + opb(); + goto L6; + opc(); + L6: __retres = 1; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_acces_params.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_acces_params.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_acces_params.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_acces_params.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,282 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_acces_params.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_acces_params0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_main = 2, + op_opa = 1, + op_opb = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +int status = 0; +int rr = 1; +/*@ global invariant inv: 0 ≤ rr ≤ 5000; + */ +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int S1 = 0; */ +/*@ ghost int S2 = 0; */ +/*@ ghost int S3 = 0; */ +/*@ ghost int S4 = 0; */ +/*@ ghost int SF = 0; */ +/*@ ghost int mainst = 1; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_opa; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S3, S4, SF, + mainst; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_in: + assumes 1 ≡ S1 ∧ i ≥ 0; + ensures 1 ≡ S2; + + behavior buch_state_S2_out: + assumes 0 ≡ S1 ∨ ¬(i ≥ 0); + ensures 0 ≡ S2; + + behavior buch_state_S3_out: + ensures 0 ≡ S3; + + behavior buch_state_S4_out: + ensures 0 ≡ S4; + + behavior buch_state_SF_out: + ensures 0 ≡ SF; + + behavior buch_state_mainst_out: + ensures 0 ≡ mainst; + */ +extern void opa_pre_func(int i, int j); + +/*@ requires + 1 ≡ S2 ∧ 0 ≡ S1 ∧ 0 ≡ S3 ∧ 0 ≡ S4 ∧ 0 ≡ SF ∧ + 0 ≡ mainst; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_opa; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S3, S4, SF, + mainst; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_S3_in: + assumes 1 ≡ S2; + ensures 1 ≡ S3; + + behavior buch_state_S3_out: + assumes 0 ≡ S2; + ensures 0 ≡ S3; + + behavior buch_state_S4_out: + ensures 0 ≡ S4; + + behavior buch_state_SF_out: + ensures 0 ≡ SF; + + behavior buch_state_mainst_out: + ensures 0 ≡ mainst; + */ +extern void opa_post_func(void); + +/*@ requires + 1 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S3 ∧ 0 ≡ S4 ∧ 0 ≡ SF ∧ + 0 ≡ mainst; + requires 1 ≡ S1 ⇒ i ≥ 0; + requires rr < 5000; + + behavior j: + ensures rr < 5001; + + behavior Buchi_property_behavior: + ensures + 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S4 ∧ 0 ≡ SF ∧ 0 ≡ mainst; + ensures 1 ≡ S3; + */ +void opa(int i, int j) +{ + opa_pre_func(i,j); + rr = i + j; + opa_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_opb; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S3, S4, SF, + mainst; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_S3_out: + ensures 0 ≡ S3; + + behavior buch_state_S4_in: + assumes 1 ≡ S3; + ensures 1 ≡ S4; + + behavior buch_state_S4_out: + assumes 0 ≡ S3; + ensures 0 ≡ S4; + + behavior buch_state_SF_out: + ensures 0 ≡ SF; + + behavior buch_state_mainst_out: + ensures 0 ≡ mainst; + */ +extern void opb_pre_func(void); + +/*@ requires + 1 ≡ S4 ∧ 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S3 ∧ 0 ≡ SF ∧ + 0 ≡ mainst; + requires 1 ≡ S4 ⇒ res > 0; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_opb; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S3, S4, SF, + mainst; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_S3_out: + ensures 0 ≡ S3; + + behavior buch_state_S4_out: + ensures 0 ≡ S4; + + behavior buch_state_SF_in: + assumes 1 ≡ S4 ∧ res > 0; + ensures 1 ≡ SF; + + behavior buch_state_SF_out: + assumes 0 ≡ S4 ∨ ¬(res > 0); + ensures 0 ≡ SF; + + behavior buch_state_mainst_out: + ensures 0 ≡ mainst; + */ +extern void opb_post_func(int res); + +/*@ requires + 1 ≡ S3 ∧ 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S4 ∧ 0 ≡ SF ∧ + 0 ≡ mainst; + + behavior Buchi_property_behavior: + ensures 1 ≡ SF ⇒ \result > 0; + ensures + 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S3 ∧ 0 ≡ S4 ∧ 0 ≡ mainst; + ensures 1 ≡ SF; + */ +int opb(void) +{ + int __retres; + opb_pre_func(); + status = 1; + __retres = status * 3; + opb_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S3, S4, SF, + mainst; + + behavior buch_state_S1_in: + assumes 1 ≡ mainst; + ensures 1 ≡ S1; + + behavior buch_state_S1_out: + assumes 0 ≡ mainst; + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_S3_out: + ensures 0 ≡ S3; + + behavior buch_state_S4_out: + ensures 0 ≡ S4; + + behavior buch_state_SF_out: + ensures 0 ≡ SF; + + behavior buch_state_mainst_out: + ensures 0 ≡ mainst; + */ +extern void main_pre_func(void); + +/*@ requires + 1 ≡ SF ∧ 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S3 ∧ 0 ≡ S4 ∧ + 0 ≡ mainst; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, S3, S4, SF, + mainst; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_S3_out: + ensures 0 ≡ S3; + + behavior buch_state_S4_out: + ensures 0 ≡ S4; + + behavior buch_state_SF_in: + assumes 1 ≡ SF; + ensures 1 ≡ SF; + + behavior buch_state_SF_out: + assumes 0 ≡ SF; + ensures 0 ≡ SF; + + behavior buch_state_mainst_out: + ensures 0 ≡ mainst; + */ +extern void main_post_func(int res); + +/*@ requires + 1 ≡ mainst ∧ 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S3 ∧ 0 ≡ S4 ∧ + 0 ≡ SF; + + behavior Buchi_property_behavior: + ensures + 0 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ S3 ∧ 0 ≡ S4 ∧ 0 ≡ mainst; + ensures 1 ≡ SF; + */ +int main(void) +{ + int __retres; + main_pre_func(); + if (rr < 5000) opa(rr,300); + rr = opb(); + __retres = 1; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_boucle1.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_boucle1.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_boucle1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_boucle1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,324 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_boucle1.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_boucle10.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_commit_trans = 2, + op_init_trans = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +int cpt = 3; +/*@ global invariant inv_cpt: 0 ≤ cpt ≤ 3; + */ +int status = 0; +/*@ global invariant inv_status: 0 ≤ status ≤ 1; + */ +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int accept_S1 = 0; */ +/*@ ghost int accept_S2 = 0; */ +/*@ ghost int accept_S3 = 0; */ +/*@ ghost int accept_S4 = 0; */ +/*@ ghost int accept_init = 1; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_commit_trans; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S1, accept_S2, + accept_S3, accept_S4, accept_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ accept_S4; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ accept_S4; + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void commit_trans_pre_func(void); + +/*@ requires + 1 ≡ accept_S2 ∧ 0 ≡ accept_S1 ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S4 ∧ 0 ≡ accept_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_commit_trans; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S1, accept_S2, + accept_S3, accept_S4, accept_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ accept_S2; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ accept_S2; + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void commit_trans_post_func(int res); + +/*@ requires + 1 ≡ accept_S4 ∧ 0 ≡ accept_S1 ∧ 0 ≡ accept_S2 ∧ + 0 ≡ accept_S3 ∧ 0 ≡ accept_init; + requires \true; + + behavior a: + ensures 0 ≤ \result ≤ 1; + + behavior Buchi_property_behavior: + ensures + 0 ≡ accept_S1 ∧ 0 ≡ accept_S3 ∧ 0 ≡ accept_S4 ∧ + 0 ≡ accept_init; + ensures 1 ≡ accept_S2; + */ +int commit_trans(void) +{ + int __retres; + commit_trans_pre_func(); + __retres = 1; + commit_trans_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_init_trans; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S1, accept_S2, + accept_S3, accept_S4, accept_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ accept_S2; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ accept_S2; + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void init_trans_pre_func(void); + +/*@ requires + 1 ≡ accept_S2 ∧ 0 ≡ accept_S1 ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S4 ∧ 0 ≡ accept_init; + requires 1 ≡ accept_S2 ⇒ status ≡ 0 ∨ status ≢ 0; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_init_trans; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S1, accept_S2, + accept_S3, accept_S4, accept_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ accept_S2 ∧ status ≡ 0; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ accept_S2 ∨ ¬(status ≡ 0); + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_in: + assumes 1 ≡ accept_S2 ∧ status ≢ 0; + ensures 1 ≡ accept_S4; + + behavior buch_state_accept_S4_out: + assumes 0 ≡ accept_S2 ∨ status ≡ 0; + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void init_trans_post_func(int res); + +/*@ requires + 1 ≡ accept_S2 ∧ 0 ≡ accept_S1 ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S4 ∧ 0 ≡ accept_init; + requires \true; + + behavior a: + ensures 0 ≤ \result ≤ 1; + + behavior Buchi_property_behavior: + ensures + (1 ≡ accept_S2 ⇒ status ≡ 0) ∧ + (1 ≡ accept_S4 ⇒ status ≢ 0); + ensures 1 ≡ accept_S2 ∨ 0 ≡ accept_S2; + ensures 1 ≡ accept_S4 ∨ 0 ≡ accept_S4; + ensures 0 ≡ accept_S1 ∧ 0 ≡ accept_S3 ∧ 0 ≡ accept_init; + ensures 1 ≡ accept_S2 ∨ 1 ≡ accept_S4; + */ +int init_trans(void) +{ + int __retres; + init_trans_pre_func(); + __retres = 1; + init_trans_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S1, accept_S2, + accept_S3, accept_S4, accept_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ accept_init; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ accept_init; + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void main_pre_func(void); + +/*@ requires + 1 ≡ accept_S2 ∧ 0 ≡ accept_S1 ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S4 ∧ 0 ≡ accept_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S1, accept_S2, + accept_S3, accept_S4, accept_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_S2; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_S2; + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ accept_S2; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ accept_S2; + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_in: + assumes 1 ≡ accept_S2; + ensures 1 ≡ accept_S3; + + behavior buch_state_accept_S3_out: + assumes 0 ≡ accept_S2; + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void main_post_func(int res); + +/*@ requires + 1 ≡ accept_init ∧ 0 ≡ accept_S1 ∧ 0 ≡ accept_S2 ∧ + 0 ≡ accept_S3 ∧ 0 ≡ accept_S4; + requires \true; + + behavior a: + ensures 0 ≤ \result ≤ 1; + + behavior aorai_acceptance: + ensures + 1 ≡ accept_S1 ∨ 1 ≡ accept_S2 ∨ 1 ≡ accept_S3 ∨ + 1 ≡ accept_S4 ∨ 1 ≡ accept_init; + + behavior Buchi_property_behavior: + ensures 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + ensures 1 ≡ accept_S2 ∨ 0 ≡ accept_S2; + ensures 1 ≡ accept_S3 ∨ 0 ≡ accept_S3; + ensures 0 ≡ accept_S4 ∧ 0 ≡ accept_init; + ensures 1 ≡ accept_S1 ∨ 1 ≡ accept_S2 ∨ 1 ≡ accept_S3; + */ +int main(void) +{ + int aorai_Loop_Init_32; + int __retres; + main_pre_func(); + cpt = 3; + status = 0; + /*@ ghost aorai_Loop_Init_32 = 1; */ + aorai_loop_32: + /*@ loop invariant + i: + 0 ≤ status ≤ 1 ∧ 0 ≤ cpt ≤ 3 ∧ + (cpt ≡ 0 ⇒ status ≡ 0); + loop invariant Aorai: 0 ≡ accept_S1; + loop invariant Aorai: 1 ≡ accept_S2; + loop invariant Aorai: 0 ≡ accept_S3; + loop invariant Aorai: 0 ≡ accept_S4; + loop invariant Aorai: 0 ≡ accept_init; + */ + while (1) { + if (! (cpt > 0)) goto while_0_break; + /*@ ghost aorai_Loop_Init_32 = 0; */ + status = init_trans(); + if (status) { + status = commit_trans(); + if (status) goto label_ok; + } + cpt --; + } + while_0_break: ; + __retres = 0; + goto return_label; + label_ok: __retres = 1; + return_label: main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_boucle2.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_boucle2.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_boucle2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_boucle2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,317 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_boucle2.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_boucle20.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_main = 2, + op_opa = 1, + op_opb = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +int status = 0; +int rr = 1; +/*@ global invariant inv: 0 ≤ rr ≤ 50; + */ +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int T0_S2 = 0; */ +/*@ ghost int T0_init = 1; */ +/*@ ghost int accept_S3 = 0; */ +/*@ ghost int accept_S4 = 0; */ +/*@ ghost int accept_S5 = 0; */ +/*@ ghost int accept_all = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_opa; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S3, + accept_S4, accept_S5, accept_all; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ T0_S2; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ T0_S2; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + */ +extern void opa_pre_func(void); + +/*@ requires + 1 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S4 ∧ 0 ≡ accept_S5 ∧ 0 ≡ accept_all; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_opa; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S3, + accept_S4, accept_S5, accept_all; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ T0_S2; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ T0_S2; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S3_in: + assumes 1 ≡ T0_S2 ∧ rr ≡ 51; + ensures 1 ≡ accept_S3; + + behavior buch_state_accept_S3_out: + assumes 0 ≡ T0_S2 ∨ ¬(rr ≡ 51); + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + */ +extern void opa_post_func(void); + +/*@ requires + 1 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S4 ∧ 0 ≡ accept_S5 ∧ 0 ≡ accept_all; + requires rr < 50; + + behavior j: + ensures rr < 51; + + behavior Buchi_property_behavior: + ensures 1 ≡ accept_S3 ⇒ rr ≡ 51; + ensures 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + ensures 1 ≡ accept_S3 ∨ 0 ≡ accept_S3; + ensures + 0 ≡ T0_init ∧ 0 ≡ accept_S4 ∧ 0 ≡ accept_S5 ∧ + 0 ≡ accept_all; + ensures 1 ≡ T0_S2 ∨ 1 ≡ accept_S3; + */ +void opa(void) +{ + opa_pre_func(); + rr ++; + opa_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_opb; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S3, + accept_S4, accept_S5, accept_all; + + behavior buch_state_T0_S2_out: + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_in: + assumes 1 ≡ accept_S3; + ensures 1 ≡ accept_S4; + + behavior buch_state_accept_S4_out: + assumes 0 ≡ accept_S3; + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + */ +extern void opb_pre_func(void); + +/*@ requires + 1 ≡ accept_S4 ∧ 0 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ + 0 ≡ accept_S3 ∧ 0 ≡ accept_S5 ∧ 0 ≡ accept_all; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_opb; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S3, + accept_S4, accept_S5, accept_all; + + behavior buch_state_T0_S2_out: + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_in: + assumes 1 ≡ accept_S4; + ensures 1 ≡ accept_S5; + + behavior buch_state_accept_S5_out: + assumes 0 ≡ accept_S4; + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + */ +extern void opb_post_func(void); + +/*@ requires + 1 ≡ accept_S3 ∧ 0 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ + 0 ≡ accept_S4 ∧ 0 ≡ accept_S5 ∧ 0 ≡ accept_all; + + behavior Buchi_property_behavior: + ensures + 0 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S4 ∧ 0 ≡ accept_all; + ensures 1 ≡ accept_S5; + */ +void opb(void) +{ + opb_pre_func(); + status = 1; + opb_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S3, + accept_S4, accept_S5, accept_all; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ T0_init; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ T0_init; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + */ +extern void main_pre_func(void); + +/*@ requires + 1 ≡ accept_S5 ∧ 0 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ + 0 ≡ accept_S3 ∧ 0 ≡ accept_S4 ∧ 0 ≡ accept_all; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S3, + accept_S4, accept_S5, accept_all; + + behavior buch_state_T0_S2_out: + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_all_in: + assumes 1 ≡ accept_S5; + ensures 1 ≡ accept_all; + + behavior buch_state_accept_all_out: + assumes 0 ≡ accept_S5; + ensures 0 ≡ accept_all; + */ +extern void main_post_func(int res); + +/*@ requires + 1 ≡ T0_init ∧ 0 ≡ T0_S2 ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S4 ∧ 0 ≡ accept_S5 ∧ 0 ≡ accept_all; + + behavior aorai_acceptance: + ensures + 1 ≡ accept_S3 ∨ 1 ≡ accept_S4 ∨ 1 ≡ accept_S5 ∨ + 1 ≡ accept_all; + + behavior Buchi_property_behavior: + ensures + 0 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S4 ∧ 0 ≡ accept_S5; + ensures 1 ≡ accept_all; + */ +int main(void) +{ + int aorai_Loop_Init_26; + int __retres; + /*@ ghost int tmp; */ + main_pre_func(); + /*@ ghost aorai_Loop_Init_26 = 1; */ + aorai_loop_26: + /*@ loop invariant 0 ≤ rr ≤ 50; + loop invariant Aorai: 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + loop invariant Aorai: 0 ≡ T0_init; + loop invariant Aorai: 1 ≡ accept_S3 ∨ 0 ≡ accept_S3; + loop invariant Aorai: 0 ≡ accept_S4; + loop invariant Aorai: 0 ≡ accept_S5; + loop invariant Aorai: 0 ≡ accept_all; + loop invariant Aorai: 1 ≡ T0_S2 ∨ 1 ≡ accept_S3; + loop invariant + Aorai: + aorai_Loop_Init_26 ≢ 0 ⇒ + \at(1 ≡ T0_init,Pre) ⇒ 0 ≡ accept_S3; + */ + while (1) { + if (! (rr < 50)) goto while_0_break; + /*@ ghost aorai_Loop_Init_26 = 0; */ + opa(); + } + while_0_break: ; + opb(); + /*@ ghost tmp = 1; */ + /*@ ghost tmp = 0; */ + __retres = 1; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_boucle3.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_boucle3.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_boucle3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_boucle3.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,332 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_boucle3.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_boucle30.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_main = 2, + op_opa = 1, + op_opb = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +int status = 0; +int rr = 1; +/*@ global invariant inv: 0 ≤ rr ≤ 50; + */ +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int T0_S4 = 0; */ +/*@ ghost int T0_init = 1; */ +/*@ ghost int T1_S2 = 0; */ +/*@ ghost int accept_S3 = 0; */ +/*@ ghost int accept_all = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_opa; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S4, T0_init, T1_S2, + accept_S3, accept_all; + + behavior buch_state_T0_S4_in: + assumes 1 ≡ T0_S4; + ensures 1 ≡ T0_S4; + + behavior buch_state_T0_S4_out: + assumes 0 ≡ T0_S4; + ensures 0 ≡ T0_S4; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_S2_in: + assumes 1 ≡ T1_S2; + ensures 1 ≡ T1_S2; + + behavior buch_state_T1_S2_out: + assumes 0 ≡ T1_S2; + ensures 0 ≡ T1_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + */ +extern void opa_pre_func(void); + +/*@ requires + (1 ≡ T0_S4 ∨ 1 ≡ T1_S2) ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_all; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_opa; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S4, T0_init, T1_S2, + accept_S3, accept_all; + + behavior buch_state_T0_S4_in: + assumes 1 ≡ T0_S4; + ensures 1 ≡ T0_S4; + + behavior buch_state_T0_S4_out: + assumes 0 ≡ T0_S4; + ensures 0 ≡ T0_S4; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_S2_in: + assumes 1 ≡ T1_S2; + ensures 1 ≡ T1_S2; + + behavior buch_state_T1_S2_out: + assumes 0 ≡ T1_S2; + ensures 0 ≡ T1_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + */ +extern void opa_post_func(void); + +/*@ requires + (1 ≡ T0_S4 ∨ 1 ≡ T1_S2) ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_all; + requires 1 ≡ T1_S2 ∨ 0 ≡ T1_S2; + requires 1 ≡ T0_S4 ∨ 0 ≡ T0_S4; + requires rr < 50; + + behavior j: + ensures rr < 51; + + behavior Buchi_behavior_in_0: + assumes 1 ≡ T0_S4; + ensures 1 ≡ T0_S4; + + behavior Buchi_behavior_in_1: + assumes 1 ≡ T1_S2; + ensures 1 ≡ T1_S2; + + behavior Buchi_behavior_out_0: + assumes 0 ≡ T0_S4; + ensures 0 ≡ T0_S4; + + behavior Buchi_behavior_out_1: + ensures 0 ≡ T0_init; + + behavior Buchi_behavior_out_2: + assumes 0 ≡ T1_S2; + ensures 0 ≡ T1_S2; + + behavior Buchi_behavior_out_3: + ensures 0 ≡ accept_S3; + + behavior Buchi_behavior_out_4: + ensures 0 ≡ accept_all; + */ +void opa(void) +{ + opa_pre_func(); + rr ++; + opa_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_opb; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S4, T0_init, T1_S2, + accept_S3, accept_all; + + behavior buch_state_T0_S4_out: + ensures 0 ≡ T0_S4; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_S2_out: + ensures 0 ≡ T1_S2; + + behavior buch_state_accept_S3_in: + assumes 1 ≡ T1_S2 ∧ rr ≡ 51; + ensures 1 ≡ accept_S3; + + behavior buch_state_accept_S3_out: + assumes 0 ≡ T1_S2 ∨ ¬(rr ≡ 51); + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + */ +extern void opb_pre_func(void); + +/*@ requires + 1 ≡ accept_S3 ∧ 0 ≡ T0_S4 ∧ 0 ≡ T0_init ∧ 0 ≡ T1_S2 ∧ + 0 ≡ accept_all; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_opb; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S4, T0_init, T1_S2, + accept_S3, accept_all; + + behavior buch_state_T0_S4_in: + assumes 1 ≡ accept_S3; + ensures 1 ≡ T0_S4; + + behavior buch_state_T0_S4_out: + assumes 0 ≡ accept_S3; + ensures 0 ≡ T0_S4; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_S2_out: + ensures 0 ≡ T1_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + */ +extern void opb_post_func(void); + +/*@ requires + 1 ≡ T1_S2 ∧ 0 ≡ T0_S4 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_all; + requires 1 ≡ T1_S2 ⇒ rr ≡ 51; + + behavior Buchi_property_behavior: + ensures + 0 ≡ T0_init ∧ 0 ≡ T1_S2 ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_all; + ensures 1 ≡ T0_S4; + */ +void opb(void) +{ + opb_pre_func(); + status = 1; + opb_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S4, T0_init, T1_S2, + accept_S3, accept_all; + + behavior buch_state_T0_S4_out: + ensures 0 ≡ T0_S4; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_S2_in: + assumes 1 ≡ T0_init; + ensures 1 ≡ T1_S2; + + behavior buch_state_T1_S2_out: + assumes 0 ≡ T0_init; + ensures 0 ≡ T1_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + */ +extern void main_pre_func(void); + +/*@ requires + 1 ≡ T0_S4 ∧ 0 ≡ T0_init ∧ 0 ≡ T1_S2 ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_all; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S4, T0_init, T1_S2, + accept_S3, accept_all; + + behavior buch_state_T0_S4_in: + assumes 1 ≡ T0_S4; + ensures 1 ≡ T0_S4; + + behavior buch_state_T0_S4_out: + assumes 0 ≡ T0_S4; + ensures 0 ≡ T0_S4; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_S2_out: + ensures 0 ≡ T1_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_all_in: + assumes 1 ≡ T0_S4; + ensures 1 ≡ accept_all; + + behavior buch_state_accept_all_out: + assumes 0 ≡ T0_S4; + ensures 0 ≡ accept_all; + */ +extern void main_post_func(int res); + +/*@ requires + 1 ≡ T0_init ∧ 0 ≡ T0_S4 ∧ 0 ≡ T1_S2 ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_all; + + behavior aorai_acceptance: + ensures 1 ≡ accept_S3 ∨ 1 ≡ accept_all; + + behavior Buchi_property_behavior: + ensures 1 ≡ T0_S4 ∨ 0 ≡ T0_S4; + ensures 1 ≡ accept_all ∨ 0 ≡ accept_all; + ensures 0 ≡ T0_init ∧ 0 ≡ T1_S2 ∧ 0 ≡ accept_S3; + ensures 1 ≡ T0_S4 ∨ 1 ≡ accept_all; + */ +int main(void) +{ + int aorai_Loop_Init_41; + int aorai_Loop_Init_31; + int __retres; + main_pre_func(); + /*@ ghost aorai_Loop_Init_31 = 1; */ + aorai_loop_31: + /*@ loop invariant 0 ≤ rr ≤ 50; + loop invariant Aorai: 0 ≡ T0_S4; + loop invariant Aorai: 0 ≡ T0_init; + loop invariant Aorai: 1 ≡ T1_S2; + loop invariant Aorai: 0 ≡ accept_S3; + loop invariant Aorai: 0 ≡ accept_all; + */ + while (1) { + if (! (rr < 50)) goto while_0_break; + /*@ ghost aorai_Loop_Init_31 = 0; */ + opa(); + } + while_0_break: ; + opb(); + rr = 0; + /*@ ghost aorai_Loop_Init_41 = 1; */ + aorai_loop_41: + /*@ loop invariant Aorai: 1 ≡ T0_S4; + loop invariant Aorai: 0 ≡ T0_init; + loop invariant Aorai: 0 ≡ T1_S2; + loop invariant Aorai: 0 ≡ accept_S3; + loop invariant Aorai: 0 ≡ accept_all; + */ + while (1) { + if (! (rr < 50)) goto while_1_break; + /*@ ghost aorai_Loop_Init_41 = 0; */ + opa(); + } + while_1_break: ; + __retres = 1; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_boucle_rechercheTableau.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_boucle_rechercheTableau.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_boucle_rechercheTableau.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_boucle_rechercheTableau.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,247 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_boucle_rechercheTableau.c (with preprocessing) +tests/aorai/test_boucle_rechercheTableau.c:18:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/aorai/test_boucle_rechercheTableau.c:8:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_boucle_rechercheTableau0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_foo = 2, + op_isPresent = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int End = 0; */ +/*@ ghost int Idle = 1; */ +/*@ ghost int WillDoFoo = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_isPresent; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, WillDoFoo; + + behavior buch_state_End_out: + ensures 0 ≡ End; + + behavior buch_state_Idle_in: + assumes 1 ≡ Idle; + ensures 1 ≡ Idle; + + behavior buch_state_Idle_out: + assumes 0 ≡ Idle; + ensures 0 ≡ Idle; + + behavior buch_state_WillDoFoo_out: + ensures 0 ≡ WillDoFoo; + */ +extern void isPresent_pre_func(int *t, int max, int val); + +/*@ requires 1 ≡ Idle ∧ 0 ≡ End ∧ 0 ≡ WillDoFoo; + requires 1 ≡ Idle ⇒ res ≢ -1 ∨ res ≡ -1; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_isPresent; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, WillDoFoo; + + behavior buch_state_End_in: + assumes 1 ≡ Idle ∧ res ≢ -1; + ensures 1 ≡ End; + + behavior buch_state_End_out: + assumes 0 ≡ Idle ∨ ¬(res ≢ -1); + ensures 0 ≡ End; + + behavior buch_state_Idle_out: + ensures 0 ≡ Idle; + + behavior buch_state_WillDoFoo_in: + assumes 1 ≡ Idle ∧ res ≡ -1; + ensures 1 ≡ WillDoFoo; + + behavior buch_state_WillDoFoo_out: + assumes 0 ≡ Idle ∨ ¬(res ≡ -1); + ensures 0 ≡ WillDoFoo; + */ +extern void isPresent_post_func(int res); + +/*@ requires 1 ≡ Idle ∧ 0 ≡ End ∧ 0 ≡ WillDoFoo; + requires \valid(t+(0 .. max)); + requires max ≥ 0; + ensures (0 ≤ \result ≤ \old(max)) ∨ \result ≡ -1; + ensures 0 ≤ \result ≤ \old(max) ⇒ *(\old(t)+\result) ≡ \old(val); + ensures + \result ≡ -1 ⇒ + (∀ ℤ j; 0 ≤ j ≤ \old(max) ⇒ *(\old(t)+j) ≢ \old(val)); + + behavior Buchi_property_behavior: + ensures + (1 ≡ End ⇒ \result ≢ -1) ∧ + (1 ≡ WillDoFoo ⇒ \result ≡ -1); + ensures 1 ≡ End ∨ 0 ≡ End; + ensures 1 ≡ WillDoFoo ∨ 0 ≡ WillDoFoo; + ensures 0 ≡ Idle; + ensures 1 ≡ End ∨ 1 ≡ WillDoFoo; + */ +int isPresent(int *t, int max, int val) +{ + int aorai_Loop_Init_32; + int __retres; + int i; + isPresent_pre_func(t,max,val); + i = 0; + /*@ ghost aorai_Loop_Init_32 = 1; */ + aorai_loop_32: + /*@ loop invariant + inv: + 0 ≤ i ≤ max ∧ \valid(t+(0 .. max)) ∧ max ≥ 0 ∧ + (∀ ℤ j; 0 ≤ j ≤ i-1 ⇒ *(t+j) ≢ val); + loop invariant Aorai: 0 ≡ End; + loop invariant Aorai: 1 ≡ Idle; + loop invariant Aorai: 0 ≡ WillDoFoo; + loop variant (v: max-i); + */ + while (1) { + if (i < max) { + if (! (*(t + i) != val)) goto while_0_break; + } + else goto while_0_break; + /*@ ghost aorai_Loop_Init_32 = 0; */ + i ++; + } + while_0_break: ; + if (*(t + i) == val) { + __retres = i; + goto return_label; + } + __retres = -1; + return_label: isPresent_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_foo; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, WillDoFoo; + + behavior buch_state_End_in: + assumes 1 ≡ WillDoFoo; + ensures 1 ≡ End; + + behavior buch_state_End_out: + assumes 0 ≡ WillDoFoo; + ensures 0 ≡ End; + + behavior buch_state_Idle_out: + ensures 0 ≡ Idle; + + behavior buch_state_WillDoFoo_out: + ensures 0 ≡ WillDoFoo; + */ +extern void foo_pre_func(void); + +/*@ requires 1 ≡ End ∧ 0 ≡ Idle ∧ 0 ≡ WillDoFoo; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_foo; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, WillDoFoo; + + behavior buch_state_End_in: + assumes 1 ≡ End; + ensures 1 ≡ End; + + behavior buch_state_End_out: + assumes 0 ≡ End; + ensures 0 ≡ End; + + behavior buch_state_Idle_out: + ensures 0 ≡ Idle; + + behavior buch_state_WillDoFoo_out: + ensures 0 ≡ WillDoFoo; + */ +extern void foo_post_func(void); + +/*@ requires 1 ≡ WillDoFoo ∧ 0 ≡ End ∧ 0 ≡ Idle; + + behavior Buchi_property_behavior: + ensures 0 ≡ Idle ∧ 0 ≡ WillDoFoo; + ensures 1 ≡ End; + */ +void foo(void) +{ + foo_pre_func(); + foo_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, WillDoFoo; + + behavior buch_state_End_out: + ensures 0 ≡ End; + + behavior buch_state_Idle_in: + assumes 1 ≡ Idle; + ensures 1 ≡ Idle; + + behavior buch_state_Idle_out: + assumes 0 ≡ Idle; + ensures 0 ≡ Idle; + + behavior buch_state_WillDoFoo_out: + ensures 0 ≡ WillDoFoo; + */ +extern void main_pre_func(int argc, char **argv); + +/*@ requires 1 ≡ End ∧ 0 ≡ Idle ∧ 0 ≡ WillDoFoo; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, WillDoFoo; + + behavior buch_state_End_in: + assumes 1 ≡ End; + ensures 1 ≡ End; + + behavior buch_state_End_out: + assumes 0 ≡ End; + ensures 0 ≡ End; + + behavior buch_state_Idle_out: + ensures 0 ≡ Idle; + + behavior buch_state_WillDoFoo_out: + ensures 0 ≡ WillDoFoo; + */ +extern void main_post_func(int res); + +/*@ requires 1 ≡ Idle ∧ 0 ≡ End ∧ 0 ≡ WillDoFoo; + + behavior aorai_acceptance: + ensures 1 ≡ End; + + behavior Buchi_property_behavior: + ensures 0 ≡ Idle ∧ 0 ≡ WillDoFoo; + ensures 1 ≡ End; + */ +int main(int argc, char **argv) +{ + int __retres; + int tab[4]; + int r; + main_pre_func(argc,argv); + tab[0] = 10; + tab[1] = 20; + tab[2] = 33; + tab[3] = 15; + r = isPresent(tab,3,33); + if (r == -1) foo(); + __retres = 1; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_boucle.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_boucle.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_boucle.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_boucle.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,234 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_boucle.c (with preprocessing) +tests/aorai/test_boucle.c:17:[kernel] warning: Calling undeclared function call_to_an_undefined_function. Old style K&R code? +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_boucle0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_a = 2, + op_b = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +extern int call_to_an_undefined_function(); + +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int T0_S2 = 0; */ +/*@ ghost int T0_init = 1; */ +/*@ ghost int accept_S1 = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_a; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_out: + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_S1 ∨ 1 ≡ T0_S2; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_S1 ∧ 0 ≡ T0_S2; + ensures 0 ≡ accept_S1; + */ +extern void a_pre_func(void); + +/*@ requires 1 ≡ accept_S1 ∧ 0 ≡ T0_S2 ∧ 0 ≡ T0_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_a; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_out: + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ accept_S1; + */ +extern void a_post_func(int res); + +/*@ requires (1 ≡ T0_S2 ∨ 1 ≡ accept_S1) ∧ 0 ≡ T0_init; + requires 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + requires 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + requires \true; + ensures 0 ≤ \result ≤ 1; + + behavior Buchi_property_behavior: + ensures 0 ≡ T0_S2 ∧ 0 ≡ T0_init; + ensures 1 ≡ accept_S1; + */ +int a(void) +{ + int __retres; + a_pre_func(); + __retres = 1; + a_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_b; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S1 ∨ 1 ≡ T0_S2; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S1 ∧ 0 ≡ T0_S2; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + */ +extern void b_pre_func(void); + +/*@ requires 1 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S1; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_b; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ T0_S2; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ T0_S2; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + */ +extern void b_post_func(int res); + +/*@ requires (1 ≡ T0_S2 ∨ 1 ≡ accept_S1) ∧ 0 ≡ T0_init; + requires 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + requires 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + requires \true; + ensures 1 ≤ \result ≤ 2; + + behavior Buchi_property_behavior: + ensures 0 ≡ T0_init ∧ 0 ≡ accept_S1; + ensures 1 ≡ T0_S2; + */ +int b(void) +{ + int __retres; + b_pre_func(); + call_to_an_undefined_function(); + __retres = 2; + b_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_out: + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ T0_init; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ T0_init; + ensures 0 ≡ accept_S1; + */ +extern void main_pre_func(void); + +/*@ requires 1 ≡ accept_S1 ∧ 0 ≡ T0_S2 ∧ 0 ≡ T0_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_out: + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ accept_S1; + */ +extern void main_post_func(int res); + +/*@ requires 1 ≡ T0_init ∧ 0 ≡ T0_S2 ∧ 0 ≡ accept_S1; + requires \true; + ensures 0 ≤ \result ≤ 1; + + behavior aorai_acceptance: + ensures 1 ≡ accept_S1; + + behavior Buchi_property_behavior: + ensures 0 ≡ T0_S2 ∧ 0 ≡ T0_init; + ensures 1 ≡ accept_S1; + */ +int main(void) +{ + int aorai_Loop_Init_26; + int x; + int tmp_1; + main_pre_func(); + x = a(); + /*@ ghost aorai_Loop_Init_26 = 1; */ + aorai_loop_26: + /*@ loop invariant i: 0 ≤ x ≤ 11; + loop invariant Aorai: 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + loop invariant Aorai: 0 ≡ T0_init; + loop invariant Aorai: 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + loop invariant Aorai: 1 ≡ T0_S2 ∨ 1 ≡ accept_S1; + loop invariant + Aorai: + aorai_Loop_Init_26 ≢ 0 ⇒ + \at(1 ≡ T0_init,Pre) ⇒ 0 ≡ T0_S2; + loop invariant Aorai: aorai_Loop_Init_26 ≡ 0 ⇒ 0 ≡ accept_S1; + */ + while (1) { + if (! (x < 10)) goto while_0_break; + /*@ ghost aorai_Loop_Init_26 = 0; */ + { + int tmp_0; + tmp_0 = b(); + x += tmp_0; + } + } + while_0_break: ; + tmp_1 = a(); + main_post_func(tmp_1); + return tmp_1; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_factorial2.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_factorial2.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_factorial2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_factorial2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,313 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_factorial2.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_factorial20.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_decode_int = 2, + op_factorial = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int S1 = 0; */ +/*@ ghost int S2 = 0; */ +/*@ ghost int main_0 = 1; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_decode_int; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, main_0; + + behavior buch_state_S1_in: + assumes 1 ≡ S1; + ensures 1 ≡ S1; + + behavior buch_state_S1_out: + assumes 0 ≡ S1; + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_main_0_out: + ensures 0 ≡ main_0; + */ +extern void decode_int_pre_func(char *s); + +/*@ requires 1 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ main_0; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_decode_int; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, main_0; + + behavior buch_state_S1_in: + assumes 1 ≡ S1; + ensures 1 ≡ S1; + + behavior buch_state_S1_out: + assumes 0 ≡ S1; + ensures 0 ≡ S1; + + behavior buch_state_S2_in: + assumes 1 ≡ S1 ∧ 1 ≢ 0; + ensures 1 ≡ S2; + + behavior buch_state_S2_out: + assumes 0 ≡ S1 ∨ 1 ≡ 0; + ensures 0 ≡ S2; + + behavior buch_state_main_0_out: + ensures 0 ≡ main_0; + */ +extern void decode_int_post_func(int res); + +/*@ requires 1 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ main_0; + + behavior Buchi_property_behavior: + ensures 1 ≡ S2 ⇒ 1 ≢ 0; + ensures 1 ≡ S1 ∨ 0 ≡ S1; + ensures 1 ≡ S2 ∨ 0 ≡ S2; + ensures 0 ≡ main_0; + ensures 1 ≡ S1 ∨ 1 ≡ S2; + */ +int decode_int(char *s) +{ + int aorai_Loop_Init_81; + int __retres; + int intmax; + int cutlim; + int cutoff; + int value; + char c; + decode_int_pre_func(s); + intmax = ~ (1 << (sizeof(int) * (unsigned int)8 - (unsigned int)1)); + cutlim = intmax % 10; + cutoff = intmax / 10; + value = 0; + /*@ ghost aorai_Loop_Init_81 = 1; */ + aorai_loop_81: + /*@ loop invariant Aorai: 1 ≡ S1; + loop invariant Aorai: 0 ≡ S2; + loop invariant Aorai: 0 ≡ main_0; + */ + while (1) { + { + char *tmp; + /*@ ghost aorai_Loop_Init_81 = 0; */ + tmp = s; + s ++; + c = *tmp; + if (! c) goto while_0_break; + { + int v; + v = 0; + switch ((int)c) { + case '0': v = 0; + goto switch_1_break; + case '1': v = 1; + goto switch_1_break; + case '2': v = 2; + goto switch_1_break; + case '3': v = 3; + goto switch_1_break; + case '4': v = 4; + goto switch_1_break; + case '5': v = 5; + goto switch_1_break; + case '6': v = 6; + goto switch_1_break; + case '7': v = 7; + goto switch_1_break; + case '8': v = 8; + goto switch_1_break; + case '9': v = 9; + goto switch_1_break; + default: ; + __retres = -1; + goto return_label; + } + switch_1_break: ; + if (value > cutoff) { + __retres = -1; + goto return_label; + } + else + if (value == cutoff) + if (v > cutlim) { + __retres = -1; + goto return_label; + } + value = value * 10 + v; + } + } + } + while_0_break: ; + __retres = value; + return_label: decode_int_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_factorial; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, main_0; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_S2_in: + assumes 1 ≡ S2 ∨ (1 ≡ S1 ∧ 1 ≢ 0); + ensures 1 ≡ S2; + + behavior buch_state_S2_out: + assumes 0 ≡ S2 ∧ (0 ≡ S1 ∨ 1 ≡ 0); + ensures 0 ≡ S2; + + behavior buch_state_main_0_out: + ensures 0 ≡ main_0; + */ +extern void factorial_pre_func(int value); + +/*@ requires (1 ≡ S1 ∨ 1 ≡ S2) ∧ 0 ≡ main_0; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_factorial; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, main_0; + + behavior buch_state_S1_in: + assumes 1 ≡ S2 ∨ 1 ≡ S1; + ensures 1 ≡ S1; + + behavior buch_state_S1_out: + assumes 0 ≡ S2 ∧ 0 ≡ S1; + ensures 0 ≡ S1; + + behavior buch_state_S2_in: + assumes 1 ≡ S2 ∨ (1 ≡ S1 ∧ 1 ≢ 0); + ensures 1 ≡ S2; + + behavior buch_state_S2_out: + assumes 0 ≡ S2 ∧ (0 ≡ S1 ∨ 1 ≡ 0); + ensures 0 ≡ S2; + + behavior buch_state_main_0_out: + ensures 0 ≡ main_0; + */ +extern void factorial_post_func(int res); + +/*@ requires (1 ≡ S1 ∨ 1 ≡ S2) ∧ 0 ≡ main_0; + requires 1 ≡ S1 ⇒ 1 ≢ 0; + requires 1 ≡ S2 ∨ 0 ≡ S2; + requires 1 ≡ S1 ∨ 0 ≡ S1; + requires 0 ≤ value ≤ 12; + decreases value; + ensures \result ≥ 1; + + behavior Buchi_property_behavior: + ensures 1 ≡ S1 ∨ 0 ≡ S1; + ensures 1 ≡ S2 ∨ 0 ≡ S2; + ensures 0 ≡ main_0; + ensures 1 ≡ S1 ∨ 1 ≡ S2; + */ +int factorial(int value) +{ + int tmp_0; + factorial_pre_func(value); + if (value > 0) { + int tmp; + tmp = factorial(value - 1); + tmp_0 = tmp * value; + } + else tmp_0 = 1; + factorial_post_func(tmp_0); + return tmp_0; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, main_0; + + behavior buch_state_S1_in: + assumes 1 ≡ main_0; + ensures 1 ≡ S1; + + behavior buch_state_S1_out: + assumes 0 ≡ main_0; + ensures 0 ≡ S1; + + behavior buch_state_S2_out: + ensures 0 ≡ S2; + + behavior buch_state_main_0_out: + ensures 0 ≡ main_0; + */ +extern void main_pre_func(int argc, char **argv); + +/*@ requires 1 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ main_0; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, main_0; + + behavior buch_state_S1_in: + assumes 1 ≡ S1; + ensures 1 ≡ S1; + + behavior buch_state_S1_out: + assumes 0 ≡ S1; + ensures 0 ≡ S1; + + behavior buch_state_S2_in: + assumes 1 ≡ S1 ∧ 1 ≢ 0; + ensures 1 ≡ S2; + + behavior buch_state_S2_out: + assumes 0 ≡ S1 ∨ 1 ≡ 0; + ensures 0 ≡ S2; + + behavior buch_state_main_0_out: + ensures 0 ≡ main_0; + */ +extern void main_post_func(int res); + +/*@ requires 1 ≡ main_0 ∧ 0 ≡ S1 ∧ 0 ≡ S2; + requires argc ≡ 2; + ensures \result ≡ 0 ∨ \result ≡ 1; + + behavior Buchi_property_behavior: + ensures 1 ≡ S2 ⇒ 1 ≢ 0; + ensures 1 ≡ S1 ∨ 0 ≡ S1; + ensures 1 ≡ S2 ∨ 0 ≡ S2; + ensures 0 ≡ main_0; + ensures 1 ≡ S1 ∨ 1 ≡ S2; + */ +int main(int argc, char **argv) +{ + int __retres; + int value; + main_pre_func(argc,argv); + if (argc != 2) { + __retres = 1; + goto return_label; + } + else { + value = decode_int(*(argv + 1)); + if (value < 0) { + __retres = 1; + goto return_label; + } + else + if (value > 12) { + __retres = 1; + goto return_label; + } + } + factorial(value); + __retres = 0; + return_label: main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_factorial.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_factorial.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_factorial.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_factorial.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,316 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_factorial.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_factorial0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_decode_int = 2, + op_factorial = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int accept_S1 = 0; */ +/*@ ghost int accept_S2 = 0; */ +/*@ ghost int accept_init = 1; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_decode_int; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S1, accept_S2, + accept_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void decode_int_pre_func(char *s); + +/*@ requires 1 ≡ accept_S1 ∧ 0 ≡ accept_S2 ∧ 0 ≡ accept_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_decode_int; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S1, accept_S2, + accept_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void decode_int_post_func(int res); + +/*@ requires 1 ≡ accept_S1 ∧ 0 ≡ accept_S2 ∧ 0 ≡ accept_init; + + behavior Buchi_property_behavior: + ensures 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + ensures 1 ≡ accept_S2 ∨ 0 ≡ accept_S2; + ensures 0 ≡ accept_init; + ensures 1 ≡ accept_S1 ∨ 1 ≡ accept_S2; + */ +int decode_int(char *s) +{ + int aorai_Loop_Init_81; + int __retres; + int intmax; + int cutlim; + int cutoff; + int value; + char c; + decode_int_pre_func(s); + intmax = ~ (1 << (sizeof(int) * (unsigned int)8 - (unsigned int)1)); + cutlim = intmax % 10; + cutoff = intmax / 10; + value = 0; + /*@ ghost aorai_Loop_Init_81 = 1; */ + aorai_loop_81: + /*@ loop invariant Aorai: 1 ≡ accept_S1; + loop invariant Aorai: 0 ≡ accept_S2; + loop invariant Aorai: 0 ≡ accept_init; + */ + while (1) { + { + char *tmp; + /*@ ghost aorai_Loop_Init_81 = 0; */ + tmp = s; + s ++; + c = *tmp; + if (! c) goto while_0_break; + { + int v; + v = 0; + switch ((int)c) { + case '0': v = 0; + goto switch_1_break; + case '1': v = 1; + goto switch_1_break; + case '2': v = 2; + goto switch_1_break; + case '3': v = 3; + goto switch_1_break; + case '4': v = 4; + goto switch_1_break; + case '5': v = 5; + goto switch_1_break; + case '6': v = 6; + goto switch_1_break; + case '7': v = 7; + goto switch_1_break; + case '8': v = 8; + goto switch_1_break; + case '9': v = 9; + goto switch_1_break; + default: ; + __retres = -1; + goto return_label; + } + switch_1_break: ; + if (value > cutoff) { + __retres = -1; + goto return_label; + } + else + if (value == cutoff) + if (v > cutlim) { + __retres = -1; + goto return_label; + } + value = value * 10 + v; + } + } + } + while_0_break: ; + __retres = value; + return_label: decode_int_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_factorial; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S1, accept_S2, + accept_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ accept_S2 ∨ 1 ≡ accept_S1; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ accept_S2 ∧ 0 ≡ accept_S1; + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void factorial_pre_func(int value); + +/*@ requires (1 ≡ accept_S1 ∨ 1 ≡ accept_S2) ∧ 0 ≡ accept_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_factorial; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S1, accept_S2, + accept_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_S2 ∨ 1 ≡ accept_S1; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_S2 ∧ 0 ≡ accept_S1; + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ accept_S2 ∨ 1 ≡ accept_S1; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ accept_S2 ∧ 0 ≡ accept_S1; + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void factorial_post_func(int res); + +/*@ requires (1 ≡ accept_S1 ∨ 1 ≡ accept_S2) ∧ 0 ≡ accept_init; + requires 1 ≡ accept_S2 ∨ 0 ≡ accept_S2; + requires 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + requires 0 ≤ value ≤ 12; + decreases value; + ensures \result ≥ 1; + + behavior Buchi_property_behavior: + ensures 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + ensures 1 ≡ accept_S2 ∨ 0 ≡ accept_S2; + ensures 0 ≡ accept_init; + ensures 1 ≡ accept_S1 ∨ 1 ≡ accept_S2; + */ +int factorial(int value) +{ + int tmp_0; + factorial_pre_func(value); + if (value > 0) { + int tmp; + tmp = factorial(value - 1); + tmp_0 = tmp * value; + } + else tmp_0 = 1; + factorial_post_func(tmp_0); + return tmp_0; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S1, accept_S2, + accept_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_init; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_init; + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void main_pre_func(int argc, char **argv); + +/*@ requires 1 ≡ accept_S1 ∧ 0 ≡ accept_S2 ∧ 0 ≡ accept_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S1, accept_S2, + accept_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void main_post_func(int res); + +/*@ requires 1 ≡ accept_init ∧ 0 ≡ accept_S1 ∧ 0 ≡ accept_S2; + requires argc ≡ 2; + ensures \result ≡ 0 ∨ \result ≡ 1; + + behavior Buchi_property_behavior: + ensures 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + ensures 1 ≡ accept_S2 ∨ 0 ≡ accept_S2; + ensures 0 ≡ accept_init; + ensures 1 ≡ accept_S1 ∨ 1 ≡ accept_S2; + */ +int main(int argc, char **argv) +{ + int __retres; + int value; + main_pre_func(argc,argv); + if (argc != 2) { + __retres = 1; + goto return_label; + } + else { + value = decode_int(*(argv + 1)); + if (value < 0) { + __retres = 1; + goto return_label; + } + else + if (value > 12) { + __retres = 1; + goto return_label; + } + } + factorial(value); + __retres = 0; + return_label: main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_recursion1.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_recursion1.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_recursion1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_recursion1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,262 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_recursion1.c (with preprocessing) +tests/aorai/test_recursion1.c:22:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/aorai/test_recursion1.c:43:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/aorai/test_recursion1.c:55:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_recursion10.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_count = 2, + op_countOne = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ +axiomatic string_len { + logic ℤ string_len{L}(char *s) ; + + axiom strlen0{L}: ∀ char *s; \valid{L}(s) ⇒ string_len{L}(s) ≥ 0; + + axiom strlen1{L}: + ∀ char *s; + \valid{L}(s) ∧ *(s+0) ≡ '\000' ⇒ string_len{L}(s) ≡ 0; + + axiom strlen2{L}: + ∀ char *s; \valid{L}(s) ⇒ *(s+string_len{L}(s)) ≡ '\000'; + + axiom strlen3{L}: + ∀ char *s; + \valid{L}(s) ∧ *(s+0) ≢ '\000' ⇒ + string_len{L}(s) ≡ 1+string_len{L}(s+1) ∧ \valid{L}(s+1); + + axiom strlen4{L}: + ∀ char *s; + \valid{L}(s) ⇒ + (∀ ℤ i; 0 ≤ i < string_len{L}(s) ⇒ *(s+i) ≢ '\000'); + + } + */ +/*@ +predicate valid_string{L}(char *s) = + \valid{L}(s) ∧ \valid{L}(s+(0 .. string_len{L}(s))); + */ +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int T0_S2 = 0; */ +/*@ ghost int T0_init = 1; */ +/*@ ghost int accept_S1 = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_countOne; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ T0_S2; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ T0_S2; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + */ +extern void countOne_pre_func(char *argv); + +/*@ requires 1 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S1; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_countOne; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ T0_S2; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ T0_S2; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + */ +extern void countOne_post_func(int res); + +/*@ requires 1 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S1; + requires valid_string(argv); + ensures \result ≡ string_len(\old(argv)); + + behavior Buchi_property_behavior: + ensures 0 ≡ T0_init ∧ 0 ≡ accept_S1; + ensures 1 ≡ T0_S2; + */ +int countOne(char *argv) +{ + int __retres; + int r; + int tmp; + countOne_pre_func(argv); + r = 0; + if ((int)*(argv + 0) == 0) { + __retres = 0; + goto return_label; + } + r ++; + tmp = countOne(argv + 1); + r += tmp; + __retres = r; + return_label: countOne_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_count; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + */ +extern void count_pre_func(int argc, char **argv); + +/*@ requires 1 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S1; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_count; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_out: + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ T0_S2; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ T0_S2; + ensures 0 ≡ accept_S1; + */ +extern void count_post_func(int res); + +/*@ requires 1 ≡ accept_S1 ∧ 0 ≡ T0_S2 ∧ 0 ≡ T0_init; + requires + argc > 0 ∧ \valid(argv) ∧ \valid(argv+(0 .. argc)) ∧ + (∀ ℤ i; 0 ≤ i < argc ⇒ valid_string(*(argv+i))); + ensures \result ≥ 0; + + behavior Buchi_property_behavior: + ensures 0 ≡ T0_S2 ∧ 0 ≡ T0_init; + ensures 1 ≡ accept_S1; + */ +int count(int argc, char **argv) +{ + int s; + count_pre_func(argc,argv); + s = countOne(*(argv + 0)); + if (argc > 1) { + int tmp_0; + tmp_0 = count(argc - 1,argv + 1); + s += tmp_0; + } + count_post_func(s); + return s; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_out: + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ T0_init; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ T0_init; + ensures 0 ≡ accept_S1; + */ +extern void main_pre_func(int argc, char **argv); + +/*@ requires 1 ≡ accept_S1 ∧ 0 ≡ T0_S2 ∧ 0 ≡ T0_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ accept_S1; + */ +extern void main_post_func(int res); + +/*@ requires 1 ≡ T0_init ∧ 0 ≡ T0_S2 ∧ 0 ≡ accept_S1; + requires + argc ≥ 0 ∧ (argc > 0 ⇒ \valid(argv)) ∧ + \valid(argv+(0 .. argc)) ∧ + (∀ ℤ i; 0 ≤ i < argc ⇒ valid_string(*(argv+i))); + ensures \result ≡ 1; + + behavior aorai_acceptance: + ensures 1 ≡ accept_S1; + + behavior Buchi_property_behavior: + ensures 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + ensures 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + ensures 0 ≡ T0_init; + ensures 1 ≡ T0_S2 ∨ 1 ≡ accept_S1; + */ +int main(int argc, char **argv) +{ + int __retres; + int somme; + main_pre_func(argc,argv); + somme = 0; + if (argc > 0) somme = count(argc,argv); + __retres = 1; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_recursion2.1.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_recursion2.1.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_recursion2.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_recursion2.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,329 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_recursion2.c (with preprocessing) +tests/aorai/test_recursion2.c:29:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/aorai/test_recursion2.c:38:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/aorai/test_recursion2.c:39:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/aorai/test_recursion2.c:40:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/aorai/test_recursion2.c:59:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_recursion21.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_count = 2, + op_main = 1, + op_sumOne = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ +axiomatic string_len { + logic ℤ string_len{L}(char *s) ; + + axiom strlen0{L}: ∀ char *s; \valid{L}(s) ⇒ string_len{L}(s) ≥ 0; + + axiom strlen1{L}: + ∀ char *s; + \valid{L}(s) ∧ *(s+0) ≡ '\000' ⇒ string_len{L}(s) ≡ 0; + + axiom strlen2{L}: + ∀ char *s; \valid{L}(s) ⇒ *(s+string_len{L}(s)) ≡ '\000'; + + axiom strlen3{L}: + ∀ char *s; + \valid{L}(s) ∧ *(s+0) ≢ '\000' ⇒ + string_len{L}(s) ≡ 1+string_len{L}(s+1) ∧ \valid{L}(s+1); + + axiom strlen4{L}: + ∀ char *s; + \valid{L}(s) ⇒ + (∀ ℤ i; 0 ≤ i < string_len{L}(s) ⇒ *(s+i) ≢ '\000'); + + } + */ +/*@ +predicate valid_string{L}(char *s) = + \valid{L}(s) ∧ \valid{L}(s+(0 .. string_len{L}(s))); + */ +/*@ +axiomatic sum_tab { + logic ℤ sum_tab{L}(char *t, ℤ l, ℤ i) ; + + axiom sum_tab0{L}: + ∀ char *t, ℤ l; + \valid{L}(t+(0 .. l)) ⇒ sum_tab{L}(t, l, 0) ≡ *(t+0); + + axiom sum_tabi{L}: + ∀ char *t, ℤ l, ℤ i; + \valid{L}(t+(0 .. l)) ∧ 0 < i ≤ l ⇒ + sum_tab{L}(t, l, i) ≡ sum_tab{L}(t, l, i-1)+*(t+i); + + axiom sum_tabn{L}: + ∀ char *t, ℤ l; + \valid{L}(t+(0 .. l)) ∧ l > 0 ∧ l ≡ string_len{L}(t) ⇒ + sum_tab{L}(t, l, l) ≡ sum_tab{L}(t, l, l-1); + + } + */ +int global_argc = 0; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int S1 = 0; */ +/*@ ghost int T0_init = 1; */ +/*@ ghost int T1 = 0; */ +/*@ ghost int accept_T2 = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_count; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, T0_init, T1, + accept_T2; + + behavior buch_state_S1_in: + assumes (1 ≡ T1 ∧ global_argc > 0) ∨ 1 ≡ S1; + ensures 1 ≡ S1; + + behavior buch_state_S1_out: + assumes (0 ≡ T1 ∨ ¬(global_argc > 0)) ∧ 0 ≡ S1; + ensures 0 ≡ S1; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_out: + ensures 0 ≡ T1; + + behavior buch_state_accept_T2_out: + ensures 0 ≡ accept_T2; + */ +extern void count_pre_func(char *argv); + +/*@ requires 1 ≡ S1 ∧ 0 ≡ T0_init ∧ 0 ≡ T1 ∧ 0 ≡ accept_T2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_count; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, T0_init, T1, + accept_T2; + + behavior buch_state_S1_in: + assumes 1 ≡ S1; + ensures 1 ≡ S1; + + behavior buch_state_S1_out: + assumes 0 ≡ S1; + ensures 0 ≡ S1; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_out: + ensures 0 ≡ T1; + + behavior buch_state_accept_T2_out: + ensures 0 ≡ accept_T2; + */ +extern void count_post_func(int res); + +/*@ requires (1 ≡ S1 ∨ 1 ≡ T1) ∧ 0 ≡ T0_init ∧ 0 ≡ accept_T2; + requires 1 ≡ T1 ⇒ global_argc > 0; + requires 1 ≡ T1 ∨ 0 ≡ T1; + requires 1 ≡ S1 ∨ 0 ≡ S1; + requires valid_string(argv); + ensures \result ≡ string_len(\old(argv)); + + behavior Buchi_property_behavior: + ensures 0 ≡ T0_init ∧ 0 ≡ T1 ∧ 0 ≡ accept_T2; + ensures 1 ≡ S1; + */ +int count(char *argv) +{ + int __retres; + int tmp; + count_pre_func(argv); + if ((int)*(argv + 0) == 0) { + __retres = 0; + goto return_label; + } + tmp = count(argv + 1); + __retres = 1 + tmp; + return_label: count_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_sumOne; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, T0_init, T1, + accept_T2; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_in: + assumes 1 ≡ S1; + ensures 1 ≡ T1; + + behavior buch_state_T1_out: + assumes 0 ≡ S1; + ensures 0 ≡ T1; + + behavior buch_state_accept_T2_out: + ensures 0 ≡ accept_T2; + */ +extern void sumOne_pre_func(char *t, int length); + +/*@ requires 1 ≡ T1 ∧ 0 ≡ S1 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_T2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_sumOne; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, T0_init, T1, + accept_T2; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_in: + assumes 1 ≡ T1; + ensures 1 ≡ T1; + + behavior buch_state_T1_out: + assumes 0 ≡ T1; + ensures 0 ≡ T1; + + behavior buch_state_accept_T2_out: + ensures 0 ≡ accept_T2; + */ +extern void sumOne_post_func(int res); + +/*@ requires 1 ≡ S1 ∧ 0 ≡ T0_init ∧ 0 ≡ T1 ∧ 0 ≡ accept_T2; + requires + \valid(t) ∧ length ≥ 0 ∧ length ≡ string_len(t) ∧ + \valid(t+(0 .. length)); + ensures \result ≡ sum_tab(\old(t), \old(length), \old(length)); + + behavior Buchi_property_behavior: + ensures 0 ≡ S1 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_T2; + ensures 1 ≡ T1; + */ +int sumOne(char *t, int length) +{ + int aorai_Loop_Init_42; + int sum; + int i; + sumOne_pre_func(t,length); + sum = 0; + i = 0; + i = 0; + /*@ ghost aorai_Loop_Init_42 = 1; */ + aorai_loop_42: + /*@ loop invariant ranges: 0 ≤ i ≤ length; + loop invariant sumValue0: i ≡ 0 ⇒ sum ≡ 0; + loop invariant sumValuei: i > 0 ⇒ sum ≡ sum_tab(t, length, i-1); + loop invariant Aorai: 0 ≡ S1; + loop invariant Aorai: 0 ≡ T0_init; + loop invariant Aorai: 1 ≡ T1; + loop invariant Aorai: 0 ≡ accept_T2; + */ + while (1) { + if (! (i < length)) goto while_0_break; + /*@ ghost aorai_Loop_Init_42 = 0; */ + sum += (int)*(t + i); + i ++; + } + while_0_break: ; + sumOne_post_func(sum); + return sum; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, T0_init, T1, + accept_T2; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_in: + assumes 1 ≡ T0_init; + ensures 1 ≡ T1; + + behavior buch_state_T1_out: + assumes 0 ≡ T0_init; + ensures 0 ≡ T1; + + behavior buch_state_accept_T2_out: + ensures 0 ≡ accept_T2; + */ +extern void main_pre_func(int argc, char **argv); + +/*@ requires 1 ≡ T1 ∧ 0 ≡ S1 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_T2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, T0_init, T1, + accept_T2; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_in: + assumes 1 ≡ T1; + ensures 1 ≡ T1; + + behavior buch_state_T1_out: + assumes 0 ≡ T1; + ensures 0 ≡ T1; + + behavior buch_state_accept_T2_in: + assumes 1 ≡ T1 ∧ res ≡ 1; + ensures 1 ≡ accept_T2; + + behavior buch_state_accept_T2_out: + assumes 0 ≡ T1 ∨ ¬(res ≡ 1); + ensures 0 ≡ accept_T2; + */ +extern void main_post_func(int res); + +/*@ requires 1 ≡ T0_init ∧ 0 ≡ S1 ∧ 0 ≡ T1 ∧ 0 ≡ accept_T2; + requires + argc ≥ 0 ∧ (argc > 0 ⇒ \valid(argv) ∧ valid_string(*(argv+0))); + ensures \result ≡ 1; + + behavior aorai_acceptance: + ensures 1 ≡ accept_T2; + + behavior Buchi_property_behavior: + ensures 1 ≡ accept_T2 ⇒ \result ≡ 1; + ensures 1 ≡ T1 ∨ 0 ≡ T1; + ensures 1 ≡ accept_T2 ∨ 0 ≡ accept_T2; + ensures 0 ≡ S1 ∧ 0 ≡ T0_init; + ensures 1 ≡ T1 ∨ 1 ≡ accept_T2; + */ +int main(int argc, char **argv) +{ + int __retres; + int sum; + int length; + main_pre_func(argc,argv); + sum = 0; + global_argc = argc; + if (argc > 0) { + length = count(*(argv + 0)); + sum = sumOne(*(argv + 0),length); + } + __retres = 1; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_recursion2.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_recursion2.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_recursion2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_recursion2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,328 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_recursion2.c (with preprocessing) +tests/aorai/test_recursion2.c:29:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/aorai/test_recursion2.c:38:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/aorai/test_recursion2.c:39:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/aorai/test_recursion2.c:40:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/aorai/test_recursion2.c:59:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_recursion20.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_count = 2, + op_main = 1, + op_sumOne = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ +axiomatic string_len { + logic ℤ string_len{L}(char *s) ; + + axiom strlen0{L}: ∀ char *s; \valid{L}(s) ⇒ string_len{L}(s) ≥ 0; + + axiom strlen1{L}: + ∀ char *s; + \valid{L}(s) ∧ *(s+0) ≡ '\000' ⇒ string_len{L}(s) ≡ 0; + + axiom strlen2{L}: + ∀ char *s; \valid{L}(s) ⇒ *(s+string_len{L}(s)) ≡ '\000'; + + axiom strlen3{L}: + ∀ char *s; + \valid{L}(s) ∧ *(s+0) ≢ '\000' ⇒ + string_len{L}(s) ≡ 1+string_len{L}(s+1) ∧ \valid{L}(s+1); + + axiom strlen4{L}: + ∀ char *s; + \valid{L}(s) ⇒ + (∀ ℤ i; 0 ≤ i < string_len{L}(s) ⇒ *(s+i) ≢ '\000'); + + } + */ +/*@ +predicate valid_string{L}(char *s) = + \valid{L}(s) ∧ \valid{L}(s+(0 .. string_len{L}(s))); + */ +/*@ +axiomatic sum_tab { + logic ℤ sum_tab{L}(char *t, ℤ l, ℤ i) ; + + axiom sum_tab0{L}: + ∀ char *t, ℤ l; + \valid{L}(t+(0 .. l)) ⇒ sum_tab{L}(t, l, 0) ≡ *(t+0); + + axiom sum_tabi{L}: + ∀ char *t, ℤ l, ℤ i; + \valid{L}(t+(0 .. l)) ∧ 0 < i ≤ l ⇒ + sum_tab{L}(t, l, i) ≡ sum_tab{L}(t, l, i-1)+*(t+i); + + axiom sum_tabn{L}: + ∀ char *t, ℤ l; + \valid{L}(t+(0 .. l)) ∧ l > 0 ∧ l ≡ string_len{L}(t) ⇒ + sum_tab{L}(t, l, l) ≡ sum_tab{L}(t, l, l-1); + + } + */ +int global_argc = 0; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int S1 = 0; */ +/*@ ghost int T0_init = 1; */ +/*@ ghost int T1 = 0; */ +/*@ ghost int accept_T2 = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_count; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, T0_init, T1, + accept_T2; + + behavior buch_state_S1_in: + assumes (1 ≡ T1 ∧ global_argc > 0) ∨ 1 ≡ S1; + ensures 1 ≡ S1; + + behavior buch_state_S1_out: + assumes (0 ≡ T1 ∨ ¬(global_argc > 0)) ∧ 0 ≡ S1; + ensures 0 ≡ S1; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_out: + ensures 0 ≡ T1; + + behavior buch_state_accept_T2_out: + ensures 0 ≡ accept_T2; + */ +extern void count_pre_func(char *argv); + +/*@ requires 1 ≡ S1 ∧ 0 ≡ T0_init ∧ 0 ≡ T1 ∧ 0 ≡ accept_T2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_count; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, T0_init, T1, + accept_T2; + + behavior buch_state_S1_in: + assumes 1 ≡ S1; + ensures 1 ≡ S1; + + behavior buch_state_S1_out: + assumes 0 ≡ S1; + ensures 0 ≡ S1; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_out: + ensures 0 ≡ T1; + + behavior buch_state_accept_T2_out: + ensures 0 ≡ accept_T2; + */ +extern void count_post_func(int res); + +/*@ requires (1 ≡ S1 ∨ 1 ≡ T1) ∧ 0 ≡ T0_init ∧ 0 ≡ accept_T2; + requires 1 ≡ T1 ⇒ global_argc > 0; + requires 1 ≡ T1 ∨ 0 ≡ T1; + requires 1 ≡ S1 ∨ 0 ≡ S1; + requires valid_string(argv); + ensures \result ≡ string_len(\old(argv)); + + behavior Buchi_property_behavior: + ensures 0 ≡ T0_init ∧ 0 ≡ T1 ∧ 0 ≡ accept_T2; + ensures 1 ≡ S1; + */ +int count(char *argv) +{ + int __retres; + int tmp; + count_pre_func(argv); + if ((int)*(argv + 0) == 0) { + __retres = 0; + goto return_label; + } + tmp = count(argv + 1); + __retres = 1 + tmp; + return_label: count_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_sumOne; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, T0_init, T1, + accept_T2; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_in: + assumes 1 ≡ S1; + ensures 1 ≡ T1; + + behavior buch_state_T1_out: + assumes 0 ≡ S1; + ensures 0 ≡ T1; + + behavior buch_state_accept_T2_out: + ensures 0 ≡ accept_T2; + */ +extern void sumOne_pre_func(char *t, int length); + +/*@ requires 1 ≡ T1 ∧ 0 ≡ S1 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_T2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_sumOne; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, T0_init, T1, + accept_T2; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_in: + assumes 1 ≡ T1; + ensures 1 ≡ T1; + + behavior buch_state_T1_out: + assumes 0 ≡ T1; + ensures 0 ≡ T1; + + behavior buch_state_accept_T2_out: + ensures 0 ≡ accept_T2; + */ +extern void sumOne_post_func(int res); + +/*@ requires 1 ≡ S1 ∧ 0 ≡ T0_init ∧ 0 ≡ T1 ∧ 0 ≡ accept_T2; + requires + \valid(t) ∧ length ≥ 0 ∧ length ≡ string_len(t) ∧ + \valid(t+(0 .. length)); + ensures \result ≡ sum_tab(\old(t), \old(length), \old(length)); + + behavior Buchi_property_behavior: + ensures 0 ≡ S1 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_T2; + ensures 1 ≡ T1; + */ +int sumOne(char *t, int length) +{ + int aorai_Loop_Init_42; + int sum; + int i; + sumOne_pre_func(t,length); + sum = 0; + i = 0; + i = 0; + /*@ ghost aorai_Loop_Init_42 = 1; */ + aorai_loop_42: + /*@ loop invariant ranges: 0 ≤ i ≤ length; + loop invariant sumValue0: i ≡ 0 ⇒ sum ≡ 0; + loop invariant sumValuei: i > 0 ⇒ sum ≡ sum_tab(t, length, i-1); + loop invariant Aorai: 0 ≡ S1; + loop invariant Aorai: 0 ≡ T0_init; + loop invariant Aorai: 1 ≡ T1; + loop invariant Aorai: 0 ≡ accept_T2; + */ + while (1) { + if (! (i < length)) goto while_0_break; + /*@ ghost aorai_Loop_Init_42 = 0; */ + sum += (int)*(t + i); + i ++; + } + while_0_break: ; + sumOne_post_func(sum); + return sum; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, T0_init, T1, + accept_T2; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_in: + assumes 1 ≡ T0_init; + ensures 1 ≡ T1; + + behavior buch_state_T1_out: + assumes 0 ≡ T0_init; + ensures 0 ≡ T1; + + behavior buch_state_accept_T2_out: + ensures 0 ≡ accept_T2; + */ +extern void main_pre_func(int argc, char **argv); + +/*@ requires 1 ≡ T1 ∧ 0 ≡ S1 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_T2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, T0_init, T1, + accept_T2; + + behavior buch_state_S1_out: + ensures 0 ≡ S1; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_T1_in: + assumes 1 ≡ T1; + ensures 1 ≡ T1; + + behavior buch_state_T1_out: + assumes 0 ≡ T1; + ensures 0 ≡ T1; + + behavior buch_state_accept_T2_in: + assumes 1 ≡ T1; + ensures 1 ≡ accept_T2; + + behavior buch_state_accept_T2_out: + assumes 0 ≡ T1; + ensures 0 ≡ accept_T2; + */ +extern void main_post_func(int res); + +/*@ requires 1 ≡ T0_init ∧ 0 ≡ S1 ∧ 0 ≡ T1 ∧ 0 ≡ accept_T2; + requires + argc ≥ 0 ∧ (argc > 0 ⇒ \valid(argv) ∧ valid_string(*(argv+0))); + ensures \result ≡ 1; + + behavior aorai_acceptance: + ensures 1 ≡ accept_T2; + + behavior Buchi_property_behavior: + ensures 1 ≡ T1 ∨ 0 ≡ T1; + ensures 1 ≡ accept_T2 ∨ 0 ≡ accept_T2; + ensures 0 ≡ S1 ∧ 0 ≡ T0_init; + ensures 1 ≡ T1 ∨ 1 ≡ accept_T2; + */ +int main(int argc, char **argv) +{ + int __retres; + int sum; + int length; + main_pre_func(argc,argv); + sum = 0; + global_argc = argc; + if (argc > 0) { + length = count(*(argv + 0)); + sum = sumOne(*(argv + 0),length); + } + __retres = 1; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_recursion4.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_recursion4.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_recursion4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_recursion4.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,243 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_recursion4.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_recursion40.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_foo = 2, + op_isPresent = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +#pragma JessieIntegerModel(math) +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int End = 0; */ +/*@ ghost int Idle = 1; */ +/*@ ghost int WillDoFoo = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_isPresent; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, WillDoFoo; + + behavior buch_state_End_out: + ensures 0 ≡ End; + + behavior buch_state_Idle_in: + assumes 1 ≡ Idle; + ensures 1 ≡ Idle; + + behavior buch_state_Idle_out: + assumes 0 ≡ Idle; + ensures 0 ≡ Idle; + + behavior buch_state_WillDoFoo_out: + ensures 0 ≡ WillDoFoo; + */ +extern void isPresent_pre_func(int *t, int size, int val); + +/*@ requires 1 ≡ End ∨ 1 ≡ Idle ∨ 1 ≡ WillDoFoo; + requires 1 ≡ End ⇒ res ≢ -1; + requires 1 ≡ Idle ⇒ res ≢ -1 ∨ res ≡ -1; + requires 1 ≡ WillDoFoo ⇒ res ≡ -1; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_isPresent; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, WillDoFoo; + + behavior buch_state_End_in: + assumes (1 ≡ Idle ∧ res ≢ -1) ∨ (1 ≡ End ∧ res ≢ -1); + ensures 1 ≡ End; + + behavior buch_state_End_out: + assumes + (0 ≡ Idle ∨ ¬(res ≢ -1)) ∧ (0 ≡ End ∨ ¬(res ≢ -1)); + ensures 0 ≡ End; + + behavior buch_state_Idle_out: + ensures 0 ≡ Idle; + + behavior buch_state_WillDoFoo_in: + assumes + (1 ≡ WillDoFoo ∧ res ≡ -1) ∨ (1 ≡ Idle ∧ res ≡ -1); + ensures 1 ≡ WillDoFoo; + + behavior buch_state_WillDoFoo_out: + assumes + (0 ≡ WillDoFoo ∨ ¬(res ≡ -1)) ∧ + (0 ≡ Idle ∨ ¬(res ≡ -1)); + ensures 0 ≡ WillDoFoo; + */ +extern void isPresent_post_func(int res); + +/*@ requires 1 ≡ Idle ∧ 0 ≡ End ∧ 0 ≡ WillDoFoo; + requires \valid(t+(0 .. size-1)); + requires size ≥ 0; + decreases size; + ensures -1 ≤ \result < \old(size); + + behavior found: + ensures 0 ≤ \result ⇒ *(\old(t)+\result) ≡ \old(val); + + behavior notIn: + ensures + \result ≡ -1 ⇒ + (∀ ℤ i; 0 ≤ i < \old(size) ⇒ *(\old(t)+i) ≢ \old(val)); + + behavior Buchi_property_behavior: + ensures + (1 ≡ End ⇒ \result ≢ -1) ∧ + (1 ≡ WillDoFoo ⇒ \result ≡ -1); + ensures 1 ≡ End ∨ 0 ≡ End; + ensures 1 ≡ WillDoFoo ∨ 0 ≡ WillDoFoo; + ensures 0 ≡ Idle; + ensures 1 ≡ End ∨ 1 ≡ WillDoFoo; + */ +int isPresent(int *t, int size, int val) +{ + int __retres; + int r; + int tmp; + isPresent_pre_func(t,size,val); + if (size == 0) { + __retres = -1; + goto return_label; + } + if (*(t + 0) == val) { + __retres = 0; + goto return_label; + } + tmp = isPresent(t + 1,size - 1,val); + r = 1 + tmp; + if (r == 0) r = -1; + __retres = r; + return_label: isPresent_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_foo; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, WillDoFoo; + + behavior buch_state_End_in: + assumes 1 ≡ WillDoFoo; + ensures 1 ≡ End; + + behavior buch_state_End_out: + assumes 0 ≡ WillDoFoo; + ensures 0 ≡ End; + + behavior buch_state_Idle_out: + ensures 0 ≡ Idle; + + behavior buch_state_WillDoFoo_out: + ensures 0 ≡ WillDoFoo; + */ +extern void foo_pre_func(void); + +/*@ requires 1 ≡ End ∧ 0 ≡ Idle ∧ 0 ≡ WillDoFoo; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_foo; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, WillDoFoo; + + behavior buch_state_End_in: + assumes 1 ≡ End; + ensures 1 ≡ End; + + behavior buch_state_End_out: + assumes 0 ≡ End; + ensures 0 ≡ End; + + behavior buch_state_Idle_out: + ensures 0 ≡ Idle; + + behavior buch_state_WillDoFoo_out: + ensures 0 ≡ WillDoFoo; + */ +extern void foo_post_func(void); + +/*@ requires 1 ≡ WillDoFoo ∧ 0 ≡ End ∧ 0 ≡ Idle; + + behavior Buchi_property_behavior: + ensures 0 ≡ Idle ∧ 0 ≡ WillDoFoo; + ensures 1 ≡ End; + */ +void foo(void) +{ + foo_pre_func(); + foo_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, WillDoFoo; + + behavior buch_state_End_out: + ensures 0 ≡ End; + + behavior buch_state_Idle_in: + assumes 1 ≡ Idle; + ensures 1 ≡ Idle; + + behavior buch_state_Idle_out: + assumes 0 ≡ Idle; + ensures 0 ≡ Idle; + + behavior buch_state_WillDoFoo_out: + ensures 0 ≡ WillDoFoo; + */ +extern void main_pre_func(int argc, char **argv); + +/*@ requires 1 ≡ End ∧ 0 ≡ Idle ∧ 0 ≡ WillDoFoo; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, WillDoFoo; + + behavior buch_state_End_in: + assumes 1 ≡ End; + ensures 1 ≡ End; + + behavior buch_state_End_out: + assumes 0 ≡ End; + ensures 0 ≡ End; + + behavior buch_state_Idle_out: + ensures 0 ≡ Idle; + + behavior buch_state_WillDoFoo_out: + ensures 0 ≡ WillDoFoo; + */ +extern void main_post_func(int res); + +/*@ requires 1 ≡ Idle ∧ 0 ≡ End ∧ 0 ≡ WillDoFoo; + + behavior aorai_acceptance: + ensures 1 ≡ End; + + behavior Buchi_property_behavior: + ensures 0 ≡ Idle ∧ 0 ≡ WillDoFoo; + ensures 1 ≡ End; + */ +int main(int argc, char **argv) +{ + int __retres; + int tab[4]; + int r; + main_pre_func(argc,argv); + tab[0] = 10; + tab[1] = 20; + tab[2] = 33; + tab[3] = 15; + r = isPresent(tab,4,33); + if (r == -1) foo(); + __retres = 1; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_recursion5.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_recursion5.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_recursion5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_recursion5.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,358 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_recursion5.c (with preprocessing) +tests/aorai/test_recursion5.c:13:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/aorai/test_recursion5.c:29:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_recursion50.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_foo = 3, + op_isPresent = 2, + op_isPresentRec = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int End = 0; */ +/*@ ghost int Idle = 1; */ +/*@ ghost int IgnoreFoo = 0; */ +/*@ ghost int WillDoFoo = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_isPresentRec; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, IgnoreFoo, + WillDoFoo; + + behavior buch_state_End_out: + ensures 0 ≡ End; + + behavior buch_state_Idle_in: + assumes 1 ≡ Idle; + ensures 1 ≡ Idle; + + behavior buch_state_Idle_out: + assumes 0 ≡ Idle; + ensures 0 ≡ Idle; + + behavior buch_state_IgnoreFoo_out: + ensures 0 ≡ IgnoreFoo; + + behavior buch_state_WillDoFoo_out: + ensures 0 ≡ WillDoFoo; + */ +extern void isPresentRec_pre_func(int *t, int i, int max, int val); + +/*@ requires + (1 ≡ Idle ∨ 1 ≡ IgnoreFoo ∨ 1 ≡ WillDoFoo) ∧ 0 ≡ End; + requires 1 ≡ Idle ⇒ res ≢ -1 ∨ res ≡ -1; + requires 1 ≡ IgnoreFoo ⇒ res ≢ -1; + requires 1 ≡ WillDoFoo ⇒ res ≡ -1; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_isPresentRec; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, IgnoreFoo, + WillDoFoo; + + behavior buch_state_End_out: + ensures 0 ≡ End; + + behavior buch_state_Idle_out: + ensures 0 ≡ Idle; + + behavior buch_state_IgnoreFoo_in: + assumes + (1 ≡ IgnoreFoo ∧ res ≢ -1) ∨ (1 ≡ Idle ∧ res ≢ -1); + ensures 1 ≡ IgnoreFoo; + + behavior buch_state_IgnoreFoo_out: + assumes + (0 ≡ IgnoreFoo ∨ ¬(res ≢ -1)) ∧ + (0 ≡ Idle ∨ ¬(res ≢ -1)); + ensures 0 ≡ IgnoreFoo; + + behavior buch_state_WillDoFoo_in: + assumes + (1 ≡ WillDoFoo ∧ res ≡ -1) ∨ (1 ≡ Idle ∧ res ≡ -1); + ensures 1 ≡ WillDoFoo; + + behavior buch_state_WillDoFoo_out: + assumes + (0 ≡ WillDoFoo ∨ ¬(res ≡ -1)) ∧ + (0 ≡ Idle ∨ ¬(res ≡ -1)); + ensures 0 ≡ WillDoFoo; + */ +extern void isPresentRec_post_func(int res); + +/*@ requires + 1 ≡ Idle ∧ 0 ≡ End ∧ 0 ≡ IgnoreFoo ∧ 0 ≡ WillDoFoo; + requires \valid(t+(0 .. max)); + requires max ≥ 0; + requires 0 ≤ i ≤ max; + decreases max-i; + ensures (\old(i) ≤ \result ≤ \old(max)) ∨ \result ≡ -1; + ensures + \old(i) ≤ \result ≤ \old(max) ⇒ *(\old(t)+\result) ≡ \old(val); + ensures + \result ≡ -1 ⇒ + (∀ ℤ j; \old(i) ≤ j ≤ \old(max) ⇒ *(\old(t)+j) ≢ \old(val)); + + behavior Buchi_property_behavior: + ensures + (1 ≡ IgnoreFoo ⇒ \result ≢ -1) ∧ + (1 ≡ WillDoFoo ⇒ \result ≡ -1); + ensures 1 ≡ IgnoreFoo ∨ 0 ≡ IgnoreFoo; + ensures 1 ≡ WillDoFoo ∨ 0 ≡ WillDoFoo; + ensures 0 ≡ End ∧ 0 ≡ Idle; + ensures 1 ≡ IgnoreFoo ∨ 1 ≡ WillDoFoo; + */ +int isPresentRec(int *t, int i, int max, int val) +{ + int __retres; + int tmp; + isPresentRec_pre_func(t,i,max,val); + if (*(t + i) == val) { + __retres = i; + goto return_label; + } + if (max == i) { + __retres = -1; + goto return_label; + } + tmp = isPresentRec(t,i + 1,max,val); + __retres = tmp; + return_label: isPresentRec_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_isPresent; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, IgnoreFoo, + WillDoFoo; + + behavior buch_state_End_out: + ensures 0 ≡ End; + + behavior buch_state_Idle_in: + assumes 1 ≡ Idle; + ensures 1 ≡ Idle; + + behavior buch_state_Idle_out: + assumes 0 ≡ Idle; + ensures 0 ≡ Idle; + + behavior buch_state_IgnoreFoo_out: + ensures 0 ≡ IgnoreFoo; + + behavior buch_state_WillDoFoo_out: + ensures 0 ≡ WillDoFoo; + */ +extern void isPresent_pre_func(int *t, int max, int val); + +/*@ requires + (1 ≡ IgnoreFoo ∨ 1 ≡ WillDoFoo) ∧ 0 ≡ End ∧ 0 ≡ Idle; + requires 1 ≡ IgnoreFoo ⇒ res ≢ -1; + requires 1 ≡ WillDoFoo ⇒ res ≡ -1; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_isPresent; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, IgnoreFoo, + WillDoFoo; + + behavior buch_state_End_in: + assumes 1 ≡ IgnoreFoo ∧ res ≢ -1; + ensures 1 ≡ End; + + behavior buch_state_End_out: + assumes 0 ≡ IgnoreFoo ∨ ¬(res ≢ -1); + ensures 0 ≡ End; + + behavior buch_state_Idle_out: + ensures 0 ≡ Idle; + + behavior buch_state_IgnoreFoo_out: + ensures 0 ≡ IgnoreFoo; + + behavior buch_state_WillDoFoo_in: + assumes 1 ≡ WillDoFoo ∧ res ≡ -1; + ensures 1 ≡ WillDoFoo; + + behavior buch_state_WillDoFoo_out: + assumes 0 ≡ WillDoFoo ∨ ¬(res ≡ -1); + ensures 0 ≡ WillDoFoo; + */ +extern void isPresent_post_func(int res); + +/*@ requires + 1 ≡ Idle ∧ 0 ≡ End ∧ 0 ≡ IgnoreFoo ∧ 0 ≡ WillDoFoo; + requires \valid(t+(0 .. max)); + requires max ≥ 0; + ensures (0 ≤ \result ≤ \old(max)) ∨ \result ≡ -1; + ensures 0 ≤ \result ≤ \old(max) ⇒ *(\old(t)+\result) ≡ \old(val); + ensures + \result ≡ -1 ⇒ + (∀ ℤ i; 0 ≤ i ≤ \old(max) ⇒ *(\old(t)+i) ≢ \old(val)); + + behavior Buchi_property_behavior: + ensures + (1 ≡ End ⇒ \result ≢ -1) ∧ + (1 ≡ WillDoFoo ⇒ \result ≡ -1); + ensures 1 ≡ End ∨ 0 ≡ End; + ensures 1 ≡ WillDoFoo ∨ 0 ≡ WillDoFoo; + ensures 0 ≡ Idle ∧ 0 ≡ IgnoreFoo; + ensures 1 ≡ End ∨ 1 ≡ WillDoFoo; + */ +int isPresent(int *t, int max, int val) +{ + int tmp; + isPresent_pre_func(t,max,val); + tmp = isPresentRec(t,0,max,val); + isPresent_post_func(tmp); + return tmp; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_foo; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, IgnoreFoo, + WillDoFoo; + + behavior buch_state_End_in: + assumes 1 ≡ WillDoFoo; + ensures 1 ≡ End; + + behavior buch_state_End_out: + assumes 0 ≡ WillDoFoo; + ensures 0 ≡ End; + + behavior buch_state_Idle_out: + ensures 0 ≡ Idle; + + behavior buch_state_IgnoreFoo_out: + ensures 0 ≡ IgnoreFoo; + + behavior buch_state_WillDoFoo_out: + ensures 0 ≡ WillDoFoo; + */ +extern void foo_pre_func(void); + +/*@ requires + 1 ≡ End ∧ 0 ≡ Idle ∧ 0 ≡ IgnoreFoo ∧ 0 ≡ WillDoFoo; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_foo; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, IgnoreFoo, + WillDoFoo; + + behavior buch_state_End_in: + assumes 1 ≡ End; + ensures 1 ≡ End; + + behavior buch_state_End_out: + assumes 0 ≡ End; + ensures 0 ≡ End; + + behavior buch_state_Idle_out: + ensures 0 ≡ Idle; + + behavior buch_state_IgnoreFoo_out: + ensures 0 ≡ IgnoreFoo; + + behavior buch_state_WillDoFoo_out: + ensures 0 ≡ WillDoFoo; + */ +extern void foo_post_func(void); + +/*@ requires + 1 ≡ WillDoFoo ∧ 0 ≡ End ∧ 0 ≡ Idle ∧ 0 ≡ IgnoreFoo; + + behavior Buchi_property_behavior: + ensures 0 ≡ Idle ∧ 0 ≡ IgnoreFoo ∧ 0 ≡ WillDoFoo; + ensures 1 ≡ End; + */ +void foo(void) +{ + foo_pre_func(); + foo_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, IgnoreFoo, + WillDoFoo; + + behavior buch_state_End_out: + ensures 0 ≡ End; + + behavior buch_state_Idle_in: + assumes 1 ≡ Idle; + ensures 1 ≡ Idle; + + behavior buch_state_Idle_out: + assumes 0 ≡ Idle; + ensures 0 ≡ Idle; + + behavior buch_state_IgnoreFoo_out: + ensures 0 ≡ IgnoreFoo; + + behavior buch_state_WillDoFoo_out: + ensures 0 ≡ WillDoFoo; + */ +extern void main_pre_func(int argc, char **argv); + +/*@ requires + 1 ≡ End ∧ 0 ≡ Idle ∧ 0 ≡ IgnoreFoo ∧ 0 ≡ WillDoFoo; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, End, Idle, IgnoreFoo, + WillDoFoo; + + behavior buch_state_End_in: + assumes 1 ≡ End; + ensures 1 ≡ End; + + behavior buch_state_End_out: + assumes 0 ≡ End; + ensures 0 ≡ End; + + behavior buch_state_Idle_out: + ensures 0 ≡ Idle; + + behavior buch_state_IgnoreFoo_out: + ensures 0 ≡ IgnoreFoo; + + behavior buch_state_WillDoFoo_out: + ensures 0 ≡ WillDoFoo; + */ +extern void main_post_func(int res); + +/*@ requires + 1 ≡ Idle ∧ 0 ≡ End ∧ 0 ≡ IgnoreFoo ∧ 0 ≡ WillDoFoo; + + behavior aorai_acceptance: + ensures 1 ≡ End; + + behavior Buchi_property_behavior: + ensures 0 ≡ Idle ∧ 0 ≡ IgnoreFoo ∧ 0 ≡ WillDoFoo; + ensures 1 ≡ End; + */ +int main(int argc, char **argv) +{ + int __retres; + int tab[4]; + int r; + main_pre_func(argc,argv); + tab[0] = 10; + tab[1] = 20; + tab[2] = 33; + tab[3] = 15; + r = isPresent(tab,3,33); + if (r == -1) foo(); + __retres = 1; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_struct.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_struct.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_struct.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_struct.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,138 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_struct.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_struct0.i (no preprocessing) +/* Generated by Frama-C */ +struct People { + int Age ; + char Gender ; +}; +enum aorai_ListOper { + op_increment = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +struct People nobody; +int myAge = 0; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int S1 = 0; */ +/*@ ghost int main_0 = 1; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_increment; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, main_0; + + behavior buch_state_S1_in: + assumes 1 ≡ S1 ∧ nobody.Age ≡ 1; + ensures 1 ≡ S1; + + behavior buch_state_S1_out: + assumes 0 ≡ S1 ∨ ¬(nobody.Age ≡ 1); + ensures 0 ≡ S1; + + behavior buch_state_main_0_out: + ensures 0 ≡ main_0; + */ +extern void increment_pre_func(void); + +/*@ requires 1 ≡ S1 ∧ 0 ≡ main_0; + requires 1 ≡ S1 ⇒ nobody.Age ≡ 1; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_increment; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, main_0; + + behavior buch_state_S1_in: + assumes 1 ≡ S1 ∧ nobody.Age ≡ 1; + ensures 1 ≡ S1; + + behavior buch_state_S1_out: + assumes 0 ≡ S1 ∨ ¬(nobody.Age ≡ 1); + ensures 0 ≡ S1; + + behavior buch_state_main_0_out: + ensures 0 ≡ main_0; + */ +extern void increment_post_func(void); + +/*@ requires 1 ≡ S1 ∧ 0 ≡ main_0; + requires 1 ≡ S1 ⇒ nobody.Age ≡ 1; + + behavior Buchi_property_behavior: + ensures 1 ≡ S1 ⇒ nobody.Age ≡ 1; + ensures 0 ≡ main_0; + ensures 1 ≡ S1; + */ +void increment(void) +{ + increment_pre_func(); + (nobody.Age) ++; + myAge ++; + increment_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, main_0; + + behavior buch_state_S1_in: + assumes 1 ≡ main_0 ∧ nobody.Age ≡ 0; + ensures 1 ≡ S1; + + behavior buch_state_S1_out: + assumes 0 ≡ main_0 ∨ ¬(nobody.Age ≡ 0); + ensures 0 ≡ S1; + + behavior buch_state_main_0_out: + ensures 0 ≡ main_0; + */ +extern void main_pre_func(void); + +/*@ requires 1 ≡ S1 ∧ 0 ≡ main_0; + requires 1 ≡ S1 ⇒ nobody.Age ≡ 1; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, S1, main_0; + + behavior buch_state_S1_in: + assumes 1 ≡ S1 ∧ nobody.Age ≡ 1; + ensures 1 ≡ S1; + + behavior buch_state_S1_out: + assumes 0 ≡ S1 ∨ ¬(nobody.Age ≡ 1); + ensures 0 ≡ S1; + + behavior buch_state_main_0_out: + ensures 0 ≡ main_0; + */ +extern void main_post_func(int res); + +/*@ requires 1 ≡ main_0 ∧ 0 ≡ S1; + requires 1 ≡ main_0 ⇒ nobody.Age ≡ 0; + + behavior aorai_acceptance: + ensures 1 ≡ S1 ∨ 1 ≡ main_0; + + behavior Buchi_property_behavior: + ensures 1 ≡ S1 ⇒ nobody.Age ≡ 1; + ensures 0 ≡ main_0; + ensures 1 ≡ S1; + */ +int main(void) +{ + int __retres; + main_pre_func(); + nobody.Age = 0; + increment(); + __retres = 0; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_switch2.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_switch2.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_switch2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_switch2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,409 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_switch2.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +tests/aorai/test_switch2.c:35:[aorai] warning: Call to opc not conforming to automaton (post-cond). Assuming it is on a dead path +tests/aorai/test_switch2.c:24:[aorai] warning: Call to opc not conforming to automaton (pre-cond). Assuming it is on a dead path +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_switch20.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_main = 3, + op_opa = 2, + op_opb = 1, + op_opc = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +int status = 0; +int rr = 1; +/*@ global invariant inv: 0 ≤ rr ≤ 50; + */ +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int accept_S2 = 0; */ +/*@ ghost int accept_S3 = 0; */ +/*@ ghost int accept_S4 = 0; */ +/*@ ghost int accept_S5 = 0; */ +/*@ ghost int accept_S6 = 0; */ +/*@ ghost int accept_all = 0; */ +/*@ ghost int accept_init = 1; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_opa; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S2, accept_S3, + accept_S4, accept_S5, accept_S6, accept_all, accept_init; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_in: + assumes 1 ≡ accept_S2; + ensures 1 ≡ accept_S3; + + behavior buch_state_accept_S3_out: + assumes 0 ≡ accept_S2; + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_S6_out: + ensures 0 ≡ accept_S6; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void opa_pre_func(void); + +/*@ requires + 1 ≡ accept_S3 ∧ 0 ≡ accept_S2 ∧ 0 ≡ accept_S4 ∧ + 0 ≡ accept_S5 ∧ 0 ≡ accept_S6 ∧ 0 ≡ accept_all ∧ + 0 ≡ accept_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_opa; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S2, accept_S3, + accept_S4, accept_S5, accept_S6, accept_all, accept_init; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_in: + assumes 1 ≡ accept_S3; + ensures 1 ≡ accept_S4; + + behavior buch_state_accept_S4_out: + assumes 0 ≡ accept_S3; + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_S6_out: + ensures 0 ≡ accept_S6; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void opa_post_func(void); + +/*@ requires + 1 ≡ accept_S2 ∧ 0 ≡ accept_S3 ∧ 0 ≡ accept_S4 ∧ + 0 ≡ accept_S5 ∧ 0 ≡ accept_S6 ∧ 0 ≡ accept_all ∧ + 0 ≡ accept_init; + requires rr < 50; + + behavior j: + ensures rr < 51; + + behavior Buchi_property_behavior: + ensures + 0 ≡ accept_S2 ∧ 0 ≡ accept_S3 ∧ 0 ≡ accept_S5 ∧ + 0 ≡ accept_S6 ∧ 0 ≡ accept_all ∧ 0 ≡ accept_init; + ensures 1 ≡ accept_S4; + */ +void opa(void) +{ + opa_pre_func(); + rr ++; + opa_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_opb; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S2, accept_S3, + accept_S4, accept_S5, accept_S6, accept_all, accept_init; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_in: + assumes 1 ≡ accept_S4; + ensures 1 ≡ accept_S5; + + behavior buch_state_accept_S5_out: + assumes 0 ≡ accept_S4; + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_S6_out: + ensures 0 ≡ accept_S6; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void opb_pre_func(void); + +/*@ requires + 1 ≡ accept_S5 ∧ 0 ≡ accept_S2 ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S4 ∧ 0 ≡ accept_S6 ∧ 0 ≡ accept_all ∧ + 0 ≡ accept_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_opb; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S2, accept_S3, + accept_S4, accept_S5, accept_S6, accept_all, accept_init; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_S6_in: + assumes 1 ≡ accept_S5; + ensures 1 ≡ accept_S6; + + behavior buch_state_accept_S6_out: + assumes 0 ≡ accept_S5; + ensures 0 ≡ accept_S6; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void opb_post_func(void); + +/*@ requires + 1 ≡ accept_S4 ∧ 0 ≡ accept_S2 ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S5 ∧ 0 ≡ accept_S6 ∧ 0 ≡ accept_all ∧ + 0 ≡ accept_init; + + behavior Buchi_property_behavior: + ensures + 0 ≡ accept_S2 ∧ 0 ≡ accept_S3 ∧ 0 ≡ accept_S4 ∧ + 0 ≡ accept_S5 ∧ 0 ≡ accept_all ∧ 0 ≡ accept_init; + ensures 1 ≡ accept_S6; + */ +void opb(void) +{ + opb_pre_func(); + status = 1; + opb_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_opc; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S2, accept_S3, + accept_S4, accept_S5, accept_S6, accept_all, accept_init; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_S6_out: + ensures 0 ≡ accept_S6; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void opc_pre_func(void); + +/*@ requires \false; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_opc; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S2, accept_S3, + accept_S4, accept_S5, accept_S6, accept_all, accept_init; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_S6_out: + ensures 0 ≡ accept_S6; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void opc_post_func(void); + +/*@ requires \false; + + behavior Buchi_behavior_out_0: + ensures 0 ≡ accept_S2; + + behavior Buchi_behavior_out_1: + ensures 0 ≡ accept_S3; + + behavior Buchi_behavior_out_2: + ensures 0 ≡ accept_S4; + + behavior Buchi_behavior_out_3: + ensures 0 ≡ accept_S5; + + behavior Buchi_behavior_out_4: + ensures 0 ≡ accept_S6; + + behavior Buchi_behavior_out_5: + ensures 0 ≡ accept_all; + + behavior Buchi_behavior_out_6: + ensures 0 ≡ accept_init; + */ +void opc(void) +{ + opc_pre_func(); + rr = 9000; + opc_post_func(); + return; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S2, accept_S3, + accept_S4, accept_S5, accept_S6, accept_all, accept_init; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ accept_init; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ accept_init; + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_S6_out: + ensures 0 ≡ accept_S6; + + behavior buch_state_accept_all_out: + ensures 0 ≡ accept_all; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void main_pre_func(void); + +/*@ requires + 1 ≡ accept_S6 ∧ 0 ≡ accept_S2 ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S4 ∧ 0 ≡ accept_S5 ∧ 0 ≡ accept_all ∧ + 0 ≡ accept_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, accept_S2, accept_S3, + accept_S4, accept_S5, accept_S6, accept_all, accept_init; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + + behavior buch_state_accept_S3_out: + ensures 0 ≡ accept_S3; + + behavior buch_state_accept_S4_out: + ensures 0 ≡ accept_S4; + + behavior buch_state_accept_S5_out: + ensures 0 ≡ accept_S5; + + behavior buch_state_accept_S6_out: + ensures 0 ≡ accept_S6; + + behavior buch_state_accept_all_in: + assumes 1 ≡ accept_S6; + ensures 1 ≡ accept_all; + + behavior buch_state_accept_all_out: + assumes 0 ≡ accept_S6; + ensures 0 ≡ accept_all; + + behavior buch_state_accept_init_out: + ensures 0 ≡ accept_init; + */ +extern void main_post_func(int res); + +/*@ requires + 1 ≡ accept_init ∧ 0 ≡ accept_S2 ∧ 0 ≡ accept_S3 ∧ + 0 ≡ accept_S4 ∧ 0 ≡ accept_S5 ∧ 0 ≡ accept_S6 ∧ + 0 ≡ accept_all; + + behavior aorai_acceptance: + ensures + 1 ≡ accept_S2 ∨ 1 ≡ accept_S3 ∨ 1 ≡ accept_S4 ∨ + 1 ≡ accept_S5 ∨ 1 ≡ accept_S6 ∨ 1 ≡ accept_all ∨ + 1 ≡ accept_init; + + behavior Buchi_property_behavior: + ensures + 0 ≡ accept_S2 ∧ 0 ≡ accept_S3 ∧ 0 ≡ accept_S4 ∧ + 0 ≡ accept_S5 ∧ 0 ≡ accept_S6 ∧ 0 ≡ accept_init; + ensures 1 ≡ accept_all; + */ +int main(void) +{ + int __retres; + main_pre_func(); + switch (rr) { + case 1: opa(); + goto switch_0_break; + case 3: opa(); + default: ; + opc(); + } + switch_0_break: ; + opb(); + __retres = 1; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_switch3_et_recursion.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_switch3_et_recursion.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_switch3_et_recursion.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_switch3_et_recursion.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,220 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_switch3_et_recursion.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +tests/aorai/test_switch3_et_recursion.c:27:[aorai] warning: Call to countOne does not follow automaton's specification. This path is assumed to be dead +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_switch3_et_recursion0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_count = 2, + op_countOne = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int T0_S2 = 0; */ +/*@ ghost int T0_init = 1; */ +/*@ ghost int accept_S1 = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_countOne; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ T0_S2; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ T0_S2; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + */ +extern void countOne_pre_func(char *argv); + +/*@ requires \false; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_countOne; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_out: + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + */ +extern void countOne_post_func(int res); + +/*@ requires 1 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S1; + + behavior Buchi_behavior_out_0: + ensures 0 ≡ T0_S2; + + behavior Buchi_behavior_out_1: + ensures 0 ≡ T0_init; + + behavior Buchi_behavior_out_2: + ensures 0 ≡ accept_S1; + */ +int countOne(char *argv) +{ + int r; + countOne_pre_func(argv); + r = 0; + switch ((int)*(argv + 0)) { + int tmp; + case 0: r = 0; + case 1: case 2: case 3: default: ; + r ++; + tmp = countOne(argv + 1); + r += tmp; + } + countOne_post_func(r); + return r; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_count; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + */ +extern void count_pre_func(int argc, char **argv); + +/*@ requires 1 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S1; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_count; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_out: + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ T0_S2; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ T0_S2; + ensures 0 ≡ accept_S1; + */ +extern void count_post_func(int res); + +/*@ requires 1 ≡ accept_S1 ∧ 0 ≡ T0_S2 ∧ 0 ≡ T0_init; + + behavior Buchi_property_behavior: + ensures 0 ≡ T0_S2 ∧ 0 ≡ T0_init; + ensures 1 ≡ accept_S1; + */ +int count(int argc, char **argv) +{ + int __retres; + count_pre_func(argc,argv); + if (argc > 0) { + int tmp; + int tmp_0; + tmp = countOne(*(argv + 0)); + tmp_0 = count(argc - 1,argv + 1); + __retres = tmp + tmp_0; + goto return_label; + } + __retres = 0; + return_label: count_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_out: + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ T0_init; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ T0_init; + ensures 0 ≡ accept_S1; + */ +extern void main_pre_func(int argc, char **argv); + +/*@ requires 1 ≡ accept_S1 ∧ 0 ≡ T0_S2 ∧ 0 ≡ T0_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ accept_S1; + */ +extern void main_post_func(int res); + +/*@ requires 1 ≡ T0_init ∧ 0 ≡ T0_S2 ∧ 0 ≡ accept_S1; + + behavior aorai_acceptance: + ensures 1 ≡ accept_S1; + + behavior Buchi_property_behavior: + ensures 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + ensures 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + ensures 0 ≡ T0_init; + ensures 1 ≡ T0_S2 ∨ 1 ≡ accept_S1; + */ +int main(int argc, char **argv) +{ + int __retres; + int somme; + main_pre_func(argc,argv); + somme = count(argc,argv); + __retres = 1; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_switch3_if.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_switch3_if.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_switch3_if.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_switch3_if.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,275 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_switch3_if.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_switch3_if0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_count = 2, + op_countOne = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int T0_S2 = 0; */ +/*@ ghost int T0_init = 1; */ +/*@ ghost int accept_S1 = 0; */ +/*@ ghost int accept_S2 = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_countOne; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S2 ∨ 1 ≡ T0_S2; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S2 ∧ 0 ≡ T0_S2; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + */ +extern void countOne_pre_func(char *argv); + +/*@ requires + 1 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S1 ∧ 0 ≡ accept_S2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_countOne; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ T0_S2; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ T0_S2; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + */ +extern void countOne_post_func(int res); + +/*@ requires + (1 ≡ T0_S2 ∨ 1 ≡ accept_S2) ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S1; + requires 1 ≡ accept_S2 ∨ 0 ≡ accept_S2; + requires 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + + behavior Buchi_property_behavior: + ensures 0 ≡ T0_init ∧ 0 ≡ accept_S1 ∧ 0 ≡ accept_S2; + ensures 1 ≡ T0_S2; + */ +int countOne(char *argv) +{ + int r; + countOne_pre_func(argv); + r = 0; + if ((int)*(argv + 0) != 0) { + int tmp; + r ++; + tmp = countOne(argv + 1); + r += tmp; + } + countOne_post_func(r); + return r; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_count; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ T0_S2; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ T0_S2; + ensures 0 ≡ accept_S2; + */ +extern void count_pre_func(int argc, char **argv); + +/*@ requires + (1 ≡ T0_S2 ∨ 1 ≡ accept_S1 ∨ 1 ≡ accept_S2) ∧ 0 ≡ T0_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_count; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_S2 ∨ 1 ≡ accept_S1 ∨ 1 ≡ T0_S2; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_S2 ∧ 0 ≡ accept_S1 ∧ 0 ≡ T0_S2; + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ accept_S2 ∨ 1 ≡ T0_S2; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ accept_S2 ∧ 0 ≡ T0_S2; + ensures 0 ≡ accept_S2; + */ +extern void count_post_func(int res); + +/*@ requires + (1 ≡ T0_S2 ∨ 1 ≡ accept_S1) ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S2; + requires 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + requires 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + + behavior Buchi_property_behavior: + ensures 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + ensures 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + ensures 1 ≡ accept_S2 ∨ 0 ≡ accept_S2; + ensures 0 ≡ T0_init; + ensures 1 ≡ T0_S2 ∨ 1 ≡ accept_S1 ∨ 1 ≡ accept_S2; + */ +int count(int argc, char **argv) +{ + int __retres; + count_pre_func(argc,argv); + if (argc > 0) { + int tmp; + int tmp_0; + tmp = countOne(*(argv + 0)); + tmp_0 = count(argc - 1,argv + 1); + __retres = tmp + tmp_0; + goto return_label; + } + __retres = 0; + return_label: count_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ T0_init; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ T0_init; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ T0_init; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ T0_init; + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + */ +extern void main_pre_func(int argc, char **argv); + +/*@ requires + 1 ≡ accept_S1 ∧ 0 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + */ +extern void main_post_func(int res); + +/*@ requires + 1 ≡ T0_init ∧ 0 ≡ T0_S2 ∧ 0 ≡ accept_S1 ∧ 0 ≡ accept_S2; + + behavior aorai_acceptance: + ensures 1 ≡ accept_S1 ∨ 1 ≡ accept_S2; + + behavior Buchi_property_behavior: + ensures 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + ensures 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + ensures 0 ≡ T0_init ∧ 0 ≡ accept_S2; + ensures 1 ≡ T0_S2 ∨ 1 ≡ accept_S1; + */ +int main(int argc, char **argv) +{ + int __retres; + int somme; + main_pre_func(argc,argv); + somme = count(argc,argv); + __retres = 1; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_switch3.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_switch3.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_switch3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_switch3.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,279 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_switch3.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_switch30.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_count = 2, + op_countOne = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int T0_S2 = 0; */ +/*@ ghost int T0_init = 1; */ +/*@ ghost int accept_S1 = 0; */ +/*@ ghost int accept_S2 = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_countOne; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S2 ∨ 1 ≡ T0_S2; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S2 ∧ 0 ≡ T0_S2; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + */ +extern void countOne_pre_func(char *argv); + +/*@ requires + 1 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S1 ∧ 0 ≡ accept_S2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_countOne; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ T0_S2; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ T0_S2; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + */ +extern void countOne_post_func(int res); + +/*@ requires + (1 ≡ T0_S2 ∨ 1 ≡ accept_S2) ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S1; + requires 1 ≡ accept_S2 ∨ 0 ≡ accept_S2; + requires 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + + behavior Buchi_property_behavior: + ensures 0 ≡ T0_init ∧ 0 ≡ accept_S1 ∧ 0 ≡ accept_S2; + ensures 1 ≡ T0_S2; + */ +int countOne(char *argv) +{ + int r; + countOne_pre_func(argv); + r = 0; + switch ((int)*(argv + 0)) { + int tmp; + case 0: r = 0; + goto switch_0_break; + case 1: case 2: case 3: default: ; + r ++; + tmp = countOne(argv + 1); + r += tmp; + } + switch_0_break: ; + countOne_post_func(r); + return r; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_count; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ T0_S2; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ T0_S2; + ensures 0 ≡ accept_S2; + */ +extern void count_pre_func(int argc, char **argv); + +/*@ requires + (1 ≡ T0_S2 ∨ 1 ≡ accept_S1 ∨ 1 ≡ accept_S2) ∧ 0 ≡ T0_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_count; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_S2 ∨ 1 ≡ accept_S1 ∨ 1 ≡ T0_S2; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_S2 ∧ 0 ≡ accept_S1 ∧ 0 ≡ T0_S2; + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ accept_S2 ∨ 1 ≡ T0_S2; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ accept_S2 ∧ 0 ≡ T0_S2; + ensures 0 ≡ accept_S2; + */ +extern void count_post_func(int res); + +/*@ requires + (1 ≡ T0_S2 ∨ 1 ≡ accept_S1) ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S2; + requires 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + requires 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + + behavior Buchi_property_behavior: + ensures 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + ensures 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + ensures 1 ≡ accept_S2 ∨ 0 ≡ accept_S2; + ensures 0 ≡ T0_init; + ensures 1 ≡ T0_S2 ∨ 1 ≡ accept_S1 ∨ 1 ≡ accept_S2; + */ +int count(int argc, char **argv) +{ + int __retres; + count_pre_func(argc,argv); + if (argc > 0) { + int tmp; + int tmp_0; + tmp = countOne(*(argv + 0)); + tmp_0 = count(argc - 1,argv + 1); + __retres = tmp + tmp_0; + goto return_label; + } + __retres = 0; + return_label: count_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ T0_init; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ T0_init; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ T0_init; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ T0_init; + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + */ +extern void main_pre_func(int argc, char **argv); + +/*@ requires + 1 ≡ accept_S1 ∧ 0 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + */ +extern void main_post_func(int res); + +/*@ requires + 1 ≡ T0_init ∧ 0 ≡ T0_S2 ∧ 0 ≡ accept_S1 ∧ 0 ≡ accept_S2; + + behavior aorai_acceptance: + ensures 1 ≡ accept_S1 ∨ 1 ≡ accept_S2; + + behavior Buchi_property_behavior: + ensures 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + ensures 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + ensures 0 ≡ T0_init ∧ 0 ≡ accept_S2; + ensures 1 ≡ T0_S2 ∨ 1 ≡ accept_S1; + */ +int main(int argc, char **argv) +{ + int __retres; + int somme; + main_pre_func(argc,argv); + somme = count(argc,argv); + __retres = 1; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_switch3_return.res.oracle frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_switch3_return.res.oracle --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/oracle/test_switch3_return.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/oracle/test_switch3_return.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,280 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/aorai/test_switch3_return.c (with preprocessing) +[aorai] Welcome to the Aorai plugin +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing /tmp/aorai_test_switch3_return0.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_ListOper { + op_count = 2, + op_countOne = 1, + op_main = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */ +/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +*/ +/*@ ghost int T0_S2 = 0; */ +/*@ ghost int T0_init = 1; */ +/*@ ghost int accept_S1 = 0; */ +/*@ ghost int accept_S2 = 0; +*/ +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_countOne; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S2 ∨ 1 ≡ T0_S2; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S2 ∧ 0 ≡ T0_S2; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + */ +extern void countOne_pre_func(char *argv); + +/*@ requires + 1 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S1 ∧ 0 ≡ accept_S2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_countOne; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ T0_S2; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ T0_S2; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + */ +extern void countOne_post_func(int res); + +/*@ requires + (1 ≡ T0_S2 ∨ 1 ≡ accept_S2) ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S1; + requires 1 ≡ accept_S2 ∨ 0 ≡ accept_S2; + requires 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + + behavior Buchi_property_behavior: + ensures 0 ≡ T0_init ∧ 0 ≡ accept_S1 ∧ 0 ≡ accept_S2; + ensures 1 ≡ T0_S2; + */ +int countOne(char *argv) +{ + int __retres; + int r; + countOne_pre_func(argv); + r = 0; + switch ((int)*(argv + 0)) { + int tmp; + case 0: __retres = 0; + goto return_label; + case 1: case 2: case 3: default: ; + r ++; + tmp = countOne(argv + 1); + r += tmp; + } + __retres = r; + return_label: countOne_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_count; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_out: + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ T0_S2; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ T0_S2; + ensures 0 ≡ accept_S2; + */ +extern void count_pre_func(int argc, char **argv); + +/*@ requires + (1 ≡ T0_S2 ∨ 1 ≡ accept_S1 ∨ 1 ≡ accept_S2) ∧ 0 ≡ T0_init; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_count; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_S2 ∨ 1 ≡ accept_S1 ∨ 1 ≡ T0_S2; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_S2 ∧ 0 ≡ accept_S1 ∧ 0 ≡ T0_S2; + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_in: + assumes 1 ≡ accept_S2 ∨ 1 ≡ T0_S2; + ensures 1 ≡ accept_S2; + + behavior buch_state_accept_S2_out: + assumes 0 ≡ accept_S2 ∧ 0 ≡ T0_S2; + ensures 0 ≡ accept_S2; + */ +extern void count_post_func(int res); + +/*@ requires + (1 ≡ T0_S2 ∨ 1 ≡ accept_S1) ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S2; + requires 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + requires 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + + behavior Buchi_property_behavior: + ensures 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + ensures 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + ensures 1 ≡ accept_S2 ∨ 0 ≡ accept_S2; + ensures 0 ≡ T0_init; + ensures 1 ≡ T0_S2 ∨ 1 ≡ accept_S1 ∨ 1 ≡ accept_S2; + */ +int count(int argc, char **argv) +{ + int __retres; + count_pre_func(argc,argv); + if (argc > 0) { + int tmp; + int tmp_0; + tmp = countOne(*(argv + 0)); + tmp_0 = count(argc - 1,argv + 1); + __retres = tmp + tmp_0; + goto return_label; + } + __retres = 0; + return_label: count_post_func(__retres); + return __retres; +} + +/*@ ensures aorai_CurOpStatus ≡ aorai_Called; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ T0_init; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ T0_init; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ T0_init; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ T0_init; + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + */ +extern void main_pre_func(int argc, char **argv); + +/*@ requires + 1 ≡ accept_S1 ∧ 0 ≡ T0_S2 ∧ 0 ≡ T0_init ∧ 0 ≡ accept_S2; + ensures aorai_CurOpStatus ≡ aorai_Terminated; + ensures aorai_CurOperation ≡ op_main; + assigns aorai_CurOpStatus, aorai_CurOperation, T0_S2, T0_init, accept_S1, + accept_S2; + + behavior buch_state_T0_S2_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ T0_S2; + + behavior buch_state_T0_S2_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ T0_S2; + + behavior buch_state_T0_init_out: + ensures 0 ≡ T0_init; + + behavior buch_state_accept_S1_in: + assumes 1 ≡ accept_S1; + ensures 1 ≡ accept_S1; + + behavior buch_state_accept_S1_out: + assumes 0 ≡ accept_S1; + ensures 0 ≡ accept_S1; + + behavior buch_state_accept_S2_out: + ensures 0 ≡ accept_S2; + */ +extern void main_post_func(int res); + +/*@ requires + 1 ≡ T0_init ∧ 0 ≡ T0_S2 ∧ 0 ≡ accept_S1 ∧ 0 ≡ accept_S2; + + behavior aorai_acceptance: + ensures 1 ≡ accept_S1 ∨ 1 ≡ accept_S2; + + behavior Buchi_property_behavior: + ensures 1 ≡ T0_S2 ∨ 0 ≡ T0_S2; + ensures 1 ≡ accept_S1 ∨ 0 ≡ accept_S1; + ensures 0 ≡ T0_init ∧ 0 ≡ accept_S2; + ensures 1 ≡ T0_S2 ∨ 1 ≡ accept_S1; + */ +int main(int argc, char **argv) +{ + int __retres; + int somme; + main_pre_func(argc,argv); + somme = count(argc,argv); + __retres = 1; + main_post_func(__retres); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/other.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/other.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/other.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/other.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,18 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/other.ya -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + +int x=0; + +void f (void) { x=3; } + +void g (void) { x=4; } + +int main () { + f(); + g(); + f(); + g(); + return x; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/other.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/other.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/other.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/other.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,14 @@ +%init: init; +%accept: last; + +init: { x == 3 } -> step1 + | other -> init; + +step1: { x == 4 } -> last + | other -> step1 + ; + +last: { x == 3 } -> step1 + | { x == 4 } -> init + | other -> last + ; \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/seq.i frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/seq.i --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/seq.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/seq.i 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,15 @@ +/* run.config + EXECNOW: make -s tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/seq.ya -aorai-test 1 -load-module tests/aorai/Aorai_test.cmxs -aorai-acceptance -aorai-test-number @PTEST_NUMBER@ + */ + +void f() { } + +void g() { } + +int main(int c) { + if (c) f(); + g(); + if (c) g(); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/seq_loop.i frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/seq_loop.i --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/seq_loop.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/seq_loop.i 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,23 @@ +/* run.config + EXECNOW: make -s tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/seq_loop.ya -aorai-test 1 -load-module tests/aorai/Aorai_test.cmxs -aorai-acceptance -aorai-test-number @PTEST_NUMBER@ +*/ + +void f() {} + +void g() {} + +//@ assigns \nothing; +int main(int c) { + if (c<0) { c = 0; } + if (c>5) { c = 5; } + /*@ assert 0<=c<=5; */ + /*@ loop assigns c; */ + while (c) { + f(); + g(); + c--; + } + return 0; +} + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/seq_loop.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/seq_loop.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/seq_loop.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/seq_loop.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,5 @@ +%init: S0; +%accept: Sf; + +S0: { [main([f();g()]{0,5})] } -> Sf; +Sf: -> Sf; diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/seq.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/seq.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/seq.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/seq.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,6 @@ +%init: S0; +%accept: Sf; + +S0: { [ main( f()?; g(){1,2}) ] } -> Sf; + +Sf: -> Sf; diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/single_call.i frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/single_call.i --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/single_call.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/single_call.i 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,6 @@ +/* run.config + EXECNOW: make -s tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/single_call.ya -aorai-test 1 -load-module tests/aorai/Aorai_test.cmxs -aorai-acceptance -aorai-test-number @PTEST_NUMBER@ +*/ + +int main () {} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/single_call.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/single_call.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/single_call.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/single_call.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,5 @@ +%init: S0; +%accept: Sf; + +S0: { [main()] } -> Sf; +Sf: -> Sf; \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_acces_params2.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_acces_params2.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_acces_params2.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_acces_params2.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,40 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/test_acces_params2.ya -aorai-test 1 -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + + + +int rr=1; +//@ global invariant inv:0<=rr<=5000; + +/*@ requires r<5000; + @ behavior j : + @ ensures \result==r+1; +*/ + +int opa(int r) {return r+1;} + +/*@ requires rr>=1 && rr <=5000; + @behavior f: + @ ensures rr>=3 && rr<=5000; +*/ +void opb () {if(rr<4998) {rr+=2;}} +/*@ behavior d: + @ ensures rr==600; +*/ +void opc () {rr=600;} + +/*@ requires rr==1; + +*/ +int main() { + if (rr<5000) rr=opa(rr); + opb(); + goto L6; + opc(); + L6: + return 1; + + +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_acces_params2.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_acces_params2.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_acces_params2.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_acces_params2.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,17 @@ +%init: S1; +%accept: S1, S2, S3, S4, S5, S6, S7; + +S1 : { CALL(main) } -> S2 + ; +S2 : { opa().r>=0 } -> S3 + ; +S3 : { opa().return<=5000 } -> S4 + ; +S4 : { !RETURN(opa) } -> S5 + ; +S5 : { RETURN(opb) } -> S6 + ; +S6 : { RETURN(main) } -> S7 + ; +S7 : -> S7 + ; diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_acces_params.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_acces_params.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_acces_params.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_acces_params.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,30 @@ +/* run.config + EXECNOW: make -s tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/test_acces_params.ya -aorai-test 1 -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + +int status=0; +int rr=1; +//@ global invariant inv : 0<=rr<=5000; + +/*@ requires rr<5000; + @ behavior j : + @ ensures rr<5001; +*/ +void opa(int i, int j) { + rr=i+j; +} + + +int opb () { + status=1; + return status*3; +} + +int main(){ + + if (rr<5000) opa(rr,300); + rr=opb(); + + return 1; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_acces_params.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_acces_params.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_acces_params.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_acces_params.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,16 @@ +%init: mainst; +%accept: SF; + +mainst : { CALL(main) } -> S1 + ; +S1 : { opa().i>=0 } -> S2 + ; +S2 : { !CALL(opb) } -> S3 + ; +S3 : { !CALL(opa) } -> S4 + ; +S4 : { opb().return>0 } -> SF + ; +SF : { RETURN(main) } -> SF + ; + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle1.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle1.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle1.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle1.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,50 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-ltl tests/aorai/test_boucle1.ltl -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + +int cpt=3; +//@ global invariant inv_cpt : 0<=cpt<=3; + +int status=0; +//@ global invariant inv_status : 0<=status<=1; + + +/*@ requires \true; + @ behavior a : + @ ensures 0<=\result<=1; +*/ +int commit_trans() { + return 1; +} + +/*@ requires \true; + @ behavior a : + @ ensures 0<=\result<=1; +*/ +int init_trans() { + return 1; +} + +/*@ requires \true; + @ behavior a : + @ ensures 0<=\result<=1; +*/ +int main(){ + cpt=3; + status=0; + /*@ loop invariant i : + @ 0<=status<=1 + @ && 0<=cpt<=3 + @ && (cpt==0 ==> status==0); + */ + while (cpt>0) { + status=init_trans(); + if (status && (status=commit_trans())) goto label_ok; + cpt--; + } + return 0; + + label_ok: + return 1; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle1.ltl frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle1.ltl --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle1.ltl 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle1.ltl 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,13 @@ +_G_( + RETURN(main) || + (((_X_ CALL(commit_trans)) + => + (RETURN(init_trans) && status) + ) + && + ((RETURN(init_trans) && status) + => + (_X_ CALL(commit_trans)) + ) + ) +) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle2.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle2.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle2.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle2.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,36 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-ltl tests/aorai/test_boucle2.ltl -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + +int status=0; +int rr=1; +//@ global invariant inv : 0<=rr<=50; + +/*@ requires rr<50; + @ behavior j : + @ ensures rr<51; +*/ +void opa() { + rr++; +} + +void opb () { + status=1; +} + +int main(){ + + /*@ loop invariant 0<=rr<=50; + */ + while (rr<50) { + opa(); + } + + opb(); + //@ ghost int tmp = 1; + + //@ ghost tmp=0; + + return 1; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle2.ltl frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle2.ltl --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle2.ltl 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle2.ltl 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,10 @@ +CALL(main) && +_X_ + (CALL_OR_RETURN(opa) + _U_ + (rr==51 && + _X_ ( + !CALL_OR_RETURN(opa) && + _X_ ( + RETURN(opb) && + _X_ (RETURN(main)))))) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle3.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle3.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle3.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle3.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,39 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-ltl tests/aorai/test_boucle3.ltl -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + + +int status=0; +int rr=1; +//@ global invariant inv : 0<=rr<=50; + +/*@ requires rr<50; + @ behavior j : + @ ensures rr<51; +*/ +void opa() { + rr++; +} + +void opb () { + status=1; +} + +int main(){ + + /*@ loop invariant 0<=rr<=50; + */ + while (rr<50) { + opa(); + } + + opb(); + + rr=0; + while (rr<50) { + opa(); + } + + return 1; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle3.ltl frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle3.ltl --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle3.ltl 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle3.ltl 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,9 @@ +CALL(main) && +_X_ + (CALL_OR_RETURN(opa) + _U_ + (rr==51 && + !CALL_OR_RETURN(opa) && + _X_ ( + RETURN(opb) && + _X_ ((!RETURN(opb)) _U_ RETURN(main))))) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,33 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-ltl tests/aorai/test_boucle.ltl -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + +/*@ requires \true; + @ ensures 0<=\result<=1; +*/ +int a() { + return 1; +} + +/*@ requires \true; + @ ensures 1<=\result<=2; +*/ +int b() { + call_to_an_undefined_function(); + return 2; +} + +/*@ requires \true; + @ ensures 0<=\result<=1; +*/ +int main(){ + int x=a(); + /*@ loop invariant i : + @ 0<=x<=11; + */ + while (x<10) { + x+=b(); + } + return a(); +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle.ltl frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle.ltl --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle.ltl 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle.ltl 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1 @@ +_G_(CALL(b) => (CALL_OR_RETURN(b) _U_ CALL(a))) \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle_rechercheTableau.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle_rechercheTableau.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_boucle_rechercheTableau.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_boucle_rechercheTableau.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,39 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/test_boucle_rechercheTableau.ya -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + + + +/*@ requires \valid_range(t,0,max); + @ requires max>=0; + @ ensures 0<=\result<=max || \result==-1 ; + @ ensures 0<=\result<=max ==> t[\result]==val; + @ ensures \result==-1 ==> (\forall integer j; 0<=j<=max ==> t[j]!=val); + */ +int isPresent(int t[], int max, int val) { + int i=0; + /*@ loop invariant inv : + @ 0<=i<=max + @ && \valid_range(t,0,max) + @ && max>=0 + @ && (\forall integer j; 0<=j<=i-1 ==> t[j]!=val); + @ loop variant v : max-i ; + */ + while (i WillDoFoo + | { isPresent().return!=-1 } -> End + | { ! RETURN(isPresent) } -> Idle ; + +WillDoFoo + : { CALL(foo) } -> End; + +End + : { !CALL(foo) } -> End; diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_factorial2.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_factorial2.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_factorial2.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_factorial2.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,62 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/test_factorial.ya -aorai-test 1 -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + + + + +/* @ requires \string_len(s) >= 0; + * @ ensures \result >= -1; + */ +int decode_int(char *s) { + int intmax = ~ (1 << (sizeof(int) * 8 - 1)); + int cutlim = intmax % 10; + int cutoff = intmax / 10; + int value = 0; + char c; + + /* Decode number */ + while (c = *s++) { + int v = 0; + switch(c) { + case '0': v = 0; break; case '1': v = 1; break; + case '2': v = 2; break; case '3': v = 3; break; + case '4': v = 4; break; case '5': v = 5; break; + case '6': v = 6; break; case '7': v = 7; break; + case '8': v = 8; break; case '9': v = 9; break; + default: return -1; + } + if ((value > cutoff) || (value == cutoff && v > cutlim)) + return -1; + value = value * 10 + v; + } + + return value; +} + + + +/*@ requires 0 <= value <= 12; + @ decreases value; + @ ensures \result >= 1; + */ +int factorial(int value) { + return value > 0 ? factorial(value - 1) * value : 1; +} + +/*@ requires argc==2; + @ ensures \result == 0 || \result == 1; + */ +int main(int argc, char** argv) { + int value, err; + + if ((argc != 2) || /* bad argument number */ + ((value = decode_int(argv[1])) < 0) || /* decoding error */ + (value > 12)) /* not in range */ + return 1; + + factorial(value); + //printf("%d! = %d\n", value, factorial(value)); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_factorial.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_factorial.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_factorial.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_factorial.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,75 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-ltl tests/aorai/test_factorial.ltl -aorai-test 1 -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + + +/* + + +make -f test_factorial_annot.makefile goals + + + +frama-c -jessie-analysis tests/aorai/test_factorial.c -jessie-int-model exact -jessie-gui +frama-c tests/aorai/test_factorial.c -ltl tests/aorai/test_factorial.ltl -ltl-dot +frama-c -jessie-analysis tests/aorai/test_factorial_annot.c -jessie-int-model exact -jessie-gui + */ + + + + +/* @ requires \string_len(s) >= 0; + * @ ensures \result >= -1; + */ +int decode_int(char *s) { + int intmax = ~ (1 << (sizeof(int) * 8 - 1)); + int cutlim = intmax % 10; + int cutoff = intmax / 10; + int value = 0; + char c; + + /* Decode number */ + while (c = *s++) { + int v = 0; + switch(c) { + case '0': v = 0; break; case '1': v = 1; break; + case '2': v = 2; break; case '3': v = 3; break; + case '4': v = 4; break; case '5': v = 5; break; + case '6': v = 6; break; case '7': v = 7; break; + case '8': v = 8; break; case '9': v = 9; break; + default: return -1; + } + if ((value > cutoff) || (value == cutoff && v > cutlim)) + return -1; + value = value * 10 + v; + } + + return value; +} + + + +/*@ requires 0 <= value <= 12; + @ decreases value; + @ ensures \result >= 1; + */ +int factorial(int value) { + return value > 0 ? factorial(value - 1) * value : 1; +} + +/*@ requires argc==2; + @ ensures \result == 0 || \result == 1; + */ +int main(int argc, char** argv) { + int value, err; + + if ((argc != 2) || /* bad argument number */ + ((value = decode_int(argv[1])) < 0) || /* decoding error */ + (value > 12)) /* not in range */ + return 1; + + factorial(value); + //printf("%d! = %d\n", value, factorial(value)); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_factorial.ltl frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_factorial.ltl --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_factorial.ltl 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_factorial.ltl 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,3 @@ +_G_ ( + CALL(factorial) => _X_ (CALL_OR_RETURN(factorial)) +) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_factorial.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_factorial.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_factorial.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_factorial.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,13 @@ +%init: main; +%accept: main, S1, S2; + +main : { !CALL(factorial) } -> S1 + | -> S2 + ; +S1 : { !CALL(factorial) } -> S1 + | { 1 } -> S2 + ; +S2 : {!CALL(factorial) && COR(factorial) } -> S1 + | { COR(factorial) } -> S2 + ; + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion1.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion1.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion1.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion1.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,64 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-ltl tests/aorai/test_recursion1.ltl -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + + +/* Calcul de la longueur cumulee des chaines de caracteres prises en parametre */ + +//======================== +// Chaines de caracteres +//---------------------- +/*@ axiomatic string_len { + logic integer string_len{L}(char *s); + axiom strlen0{L}: \forall char *s ; \valid(s) ==> string_len(s)>=0; + axiom strlen1{L}: \forall char *s ; \valid(s) && s[0]=='\0' ==> string_len(s)==0 ; + axiom strlen2{L}: \forall char *s ; \valid(s) ==> s[string_len(s)]=='\0' ; + axiom strlen3{L}: \forall char *s ; \valid(s) && s[0]!='\0' ==> string_len(s)==1+string_len(s+1) && \valid(s+1) ; + axiom strlen4{L}: \forall char *s ; \valid(s) ==> + \forall integer i ; 0<=i s[i]!='\0' ; + } +*/ +//@ predicate valid_string{L}(char *s) = \valid(s) && \valid_range(s,0,string_len(s)) ; +//======================== + + + +/* Calcul de la longueur d'une chaine */ +/*@ requires valid_string(argv); + @ ensures \result==string_len(argv); + */ +int countOne(char* argv) { + int r=0; + + if(argv[0]==0) return 0; + r++; + r+=countOne(argv+1); + return r; + +} + +/* Somme de chacune des longueurs */ +/*@ requires argc>0 && \valid(argv) && + \valid_range(argv,0,argc) && + (\forall integer i; 0<=i valid_string(argv[i])); + @ ensures \result>=0; + */ +int count(int argc, char** argv) { + // printf(" --> '%s'\n",argv[0]); + int s=countOne(argv[0]); + if (argc>1) s+=count(argc-1,argv+1); + return s; +} + +/*@ requires argc>=0 && (argc>0 ==> \valid(argv)) && + \valid_range(argv,0,argc) && + (\forall integer i; 0<=i valid_string(argv[i])); + @ ensures \result==1; + */ +int main(int argc, char** argv) { + int somme=0; + if (argc>0) somme=count(argc,argv); + // printf("Longueur cumulee des params = %d\n",somme); + return 1; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion1.ltl frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion1.ltl --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion1.ltl 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion1.ltl 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,4 @@ +_G_ ( + CALL(count) => + _X_ (CALL_OR_RETURN(countOne) _U_ (RETURN(count))) +) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion2.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion2.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion2.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion2.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,96 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-buchi tests/aorai/test_recursion2.promela -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ + OPT: -aorai-buchi tests/aorai/test_recursion3.promela -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + +/* + OPT: -buchi tests/aorai/test_recursion2.promela -ltl-output-c-file tests/aorai/result/test_recursion2_annot.c + OPT: tests/aorai/result/test_recursion2_annot.c -jessie -jessie-int-model exact -jessie-why-opt -fast-wp +*/ + + +/* Calcul de la longueur cumulee des chaines de caracteres prises en parametre */ + +//======================== +// Strings +//-------- +// +/*@ axiomatic string_len { + logic integer string_len{L}(char *s); + axiom strlen0{L}: \forall char *s ; \valid(s) ==> string_len(s)>=0; + axiom strlen1{L}: \forall char *s ; \valid(s) && s[0]=='\0' ==> string_len(s)==0 ; + axiom strlen2{L}: \forall char *s ; \valid(s) ==> s[string_len(s)]=='\0' ; + axiom strlen3{L}: \forall char *s ; \valid(s) && s[0]!='\0' ==> string_len(s)==1+string_len(s+1) && \valid(s+1) ; + axiom strlen4{L}: \forall char *s ; \valid(s) ==> + \forall integer i ; 0<=i s[i]!='\0' ; + } +*/ +//@ predicate valid_string{L}(char *s) = \valid(s) && \valid_range(s,0,string_len(s)) ; +// +// +//======================== +// Sum of a tab +//------------- +// +/*@ axiomatic sum_tab { + logic integer sum_tab{L}(char *t,integer l,integer i); + axiom sum_tab0{L}: \forall char *t, integer l ; \valid_range(t,0,l) ==> sum_tab(t,l,0)==t[0]; + axiom sum_tabi{L}: \forall char *t, integer l, integer i ; \valid_range(t,0,l) && 0 sum_tab(t,l,i)==sum_tab(t,l,i-1)+t[i]; + axiom sum_tabn{L}: \forall char *t, integer l ; \valid_range(t,0,l) && l>0 && l==string_len(t) ==> sum_tab(t,l,l)==sum_tab(t,l,l-1); + } +*/ +// +//======================== + + +int global_argc=0; + +/* Calcul de la longueur d'une chaine */ +/*@ requires valid_string(argv); + @ ensures \result==string_len(argv); + */ +int count(char* argv) { + if(argv[0]==0) return 0; + return 1+count(argv+1); +} + + +/*@ requires \valid(t) && length>=0 && length==string_len(t) && \valid_range(t,0,length); + @ ensures \result==sum_tab(t,length,length); + */ +int sumOne(char* t, int length) { + // printf(" --> t : '%s' / length : %d\n",t,length); + int sum=0; + int i=0; +//printf(" ----> c = '%d'\n",t[i]); + /*@ loop invariant ranges: 0<=i<=length; + @ loop invariant sumValue0: i==0 ==> sum==0; + @ loop invariant sumValuei: i>0 ==> sum==sum_tab(t,length,i-1); + */ + for(i=0;i c = '%d'\n",t[i]); + sum+=t[i]; + } + return sum; +} + + + +/*@ requires argc>=0 && (argc>0 ==> \valid(argv) && valid_string(argv[0])); +// && \valid_range(argv,0,argc) && +// (\forall integer i; 0<=i valid_string(argv[i])); + @ ensures \result==1; + */ +int main(int argc, char** argv) { + int sum=0; + int length; + global_argc=argc; + + if (argc>0) { + length=count(argv[0]); + sum=sumOne(argv[0],length); + } +//printf("Somme cumulee du premier param = %d\n",sum); + return 1; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion2.promela frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion2.promela --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion2.promela 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion2.promela 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,23 @@ +never { /* []((callof_count -> X((callorreturnof_count U callof_sumOne)))) + */ + +T0_init: + if + :: (global_argc>0 && callof_count) -> goto S1 + :: (!callof_count) -> goto T1 + fi; +T1: + if + :: (!callorreturnof_count) -> goto T1 + :: (returnof_main) -> goto accept_T2 + :: (global_argc>0 && callof_count) -> goto S1 + fi; +S1: + if + :: (callorreturnof_count) -> goto S1 + :: (callof_sumOne) -> goto T1 + fi; + +accept_T2: + skip; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion3.promela frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion3.promela --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion3.promela 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion3.promela 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,23 @@ +never { /* []((callof_count -> X((callorreturnof_count U callof_sumOne)))) + */ + +T0_init: + if + :: (global_argc>0 && count().argv!=0) -> goto S1 + :: (!callof_count) -> goto T1 + fi; +T1: + if + :: (!callorreturnof_count) -> goto T1 + :: (main().return==1) -> goto accept_T2 + :: (global_argc>0 && callof_count) -> goto S1 + fi; +S1: + if + :: (callorreturnof_count) -> goto S1 + :: (callof_sumOne) -> goto T1 + fi; + +accept_T2: + skip; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion4.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion4.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion4.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion4.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,33 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/test_recursion4.ya -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + +# pragma JessieIntegerModel(math) + +/*@ requires \valid(t+(0..size-1)); + @ requires size>=0; + @ decreases size; + @ ensures -1<=\result t[\result]==val; + @ behavior notIn : + @ ensures \result==-1 ==> (\forall integer i; 0<=i t[i]!=val); + */ +int isPresent(int t[], int size, int val) { + if(size==0) return -1; + if(t[0]==val) return 0; + int r=1+isPresent(t+1, size-1, val); + if (r==0) r=-1; + return r; +} + +void foo(){} + +int main(int argc, char** argv) { + int tab[]={10,20,33,15}; + int r=isPresent(tab, 4, 33); + if (r==-1) foo(); + + return 1; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion4.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion4.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion4.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion4.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,14 @@ +%init: Idle; +%accept: End; + + +Idle : { isPresent().return==-1 } -> WillDoFoo + | { isPresent().return!=-1 } -> End + | { ! RETURN(isPresent) } -> Idle ; + +WillDoFoo + : { isPresent().return==-1 } -> WillDoFoo + | { CALL(foo) } -> End; + +End + : { !CALL(foo) && (!RETURN(isPresent) || isPresent().return!=-1) } -> End; diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion5.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion5.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion5.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion5.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,48 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/test_recursion5.ya -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + + +//frama-c t2.c -aorai-automata t2.ya -aorai-dot -aorai-show-op-spec -aorai-output-c-file t2_annot.c +//frama-c -jessie t2_annot.c -jessie-why-opt="-fast-wp" + +//#include + + +/*@ requires \valid_range(t,0,max); + @ requires max>=0; + @ requires 0<=i<=max; + @ decreases max-i; + @ ensures i<=\result<=max || \result==-1 ; + @ ensures i<=\result<=max ==> t[\result]==val; + @ ensures \result==-1 ==> (\forall integer j; i<=j<=max ==> t[j]!=val); + */ +int isPresentRec(int t[], int i, int max, int val) { +// printf("t : %d | s : %d | v : %d\n",t[0],size,val); + if(t[i]==val) return i; + if(max==i) return -1; // 1 de plus que max + return isPresentRec(t, i+1, max, val); +} + + +/*@ requires \valid_range(t,0,max); + @ requires max>=0; + @ ensures 0<=\result<=max || \result==-1 ; + @ ensures 0<=\result<=max ==> t[\result]==val; + @ ensures \result==-1 ==> (\forall integer i; 0<=i<=max ==> t[i]!=val); + */ +int isPresent(int t[], int max, int val) { + return isPresentRec(t, 0, max, val); +} + +void foo(){} + +int main(int argc, char** argv) { + int tab[]={10,20,33,15}; + int r=isPresent(tab, 3, 33); + if (r==-1) foo(); + +// printf("Résultat = %d\n",r); + return 1; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion5.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion5.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_recursion5.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_recursion5.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,17 @@ +%init: Idle; +%accept: End; + + +Idle : { isPresentRec().return==-1 } -> WillDoFoo + | { isPresentRec().return!=-1 } -> IgnoreFoo + | { ! RETURN(isPresentRec) } -> Idle ; + +IgnoreFoo : { isPresentRec().return!=-1 } -> IgnoreFoo + | { isPresent().return!=-1 } -> End ; + +WillDoFoo : { isPresentRec().return==-1 } -> WillDoFoo + | { isPresent().return==-1 } -> WillDoFoo + | { CALL(foo) } -> End; + +End + : { !CALL(foo) && !RETURN(isPresent) && !RETURN(isPresentRec) } -> End; diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_struct.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_struct.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_struct.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_struct.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,27 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-automata tests/aorai/test_struct.ya -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + +struct People{ + int Age; + + char Gender; + +}; + +struct People nobody; + +int myAge=0; + +void increment(){ + nobody.Age++; + myAge++; +} + + +int main() { + nobody.Age=0; + increment(); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_struct.ya frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_struct.ya --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_struct.ya 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_struct.ya 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,8 @@ +%init: main; +%accept: main, S1; + +main : { nobody.Age == 0 } -> S1 + ; +S1 : { nobody.Age == 1 } -> S1 + ; + diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_switch2.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_switch2.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_switch2.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_switch2.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,40 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-ltl tests/aorai/test_switch2.ltl -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + +int status=0; +int rr=1; +//@ global invariant inv : 0<=rr<=50; + +/*@ requires rr<50; + @ behavior j : + @ ensures rr<51; +*/ +void opa() { + rr++; +} + +void opb () { + status=1; +} + +void opc() { + rr=9000; +} + +int main(){ + + switch (rr) { + case 1 : + opa(); + break; + case 3 : + opa(); + default : + opc(); + } + opb(); + + return 1; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_switch2.ltl frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_switch2.ltl --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_switch2.ltl 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_switch2.ltl 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1 @@ +CALL(main) && _X_ (CALL(opa) && _X_ (!RETURN(opb) && _X_ (!CALL(opa) && _X_ (RETURN(opb) && _X_ (RETURN(main)))))) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_switch3.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_switch3.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_switch3.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_switch3.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,34 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-ltl tests/aorai/test_switch3.ltl -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + +/* Calcul de la longueur cumulee des chaines de caracteres prises en parametre */ + +/* Calcul de la longueur d'une chaine */ +int countOne(char* argv) { + int r=0; + + switch (argv[0]) { + case 0: r=0; break; + case 1: + case 2: + case 3: + default: + r++; + r+=countOne(argv+1); + } + return r; +} + +/* Somme de chacune des longueurs */ +int count(int argc, char** argv) { + if (argc>0) return countOne(argv[0])+count(argc-1,argv+1); + return 0; +} + +int main(int argc, char** argv) { + int somme; + somme=count(argc,argv); + return 1; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_switch3_et_recursion.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_switch3_et_recursion.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_switch3_et_recursion.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_switch3_et_recursion.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,36 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-ltl tests/aorai/test_switch3_et_recursion.ltl -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + +/* Calcul de la longueur cumulee des chaines de caracteres prises en parametre */ + +/* Calcul de la longueur d'une chaine */ +int countOne(char* argv) { + int r=0; + + switch (argv[0]) { + case 0: r=0; // ICI il n'y a pas de break. C'est un bug, mais c'est un test ;) + case 1: + case 2: + case 3: + default: + r++; + r+=countOne(argv+1); + } + return r; +} + +/* Somme de chacune des longueurs */ +int count(int argc, char** argv) { + // printf(" --> '%s'\n",argv[0]); + if (argc>0) return countOne(argv[0])+count(argc-1,argv+1); + return 0; +} + +int main(int argc, char** argv) { + int somme; + somme=count(argc,argv); + // printf("Longueur cumulee des params = %d\n",somme); + return 1; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_switch3_et_recursion.ltl frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_switch3_et_recursion.ltl --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_switch3_et_recursion.ltl 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_switch3_et_recursion.ltl 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,4 @@ +_G_ ( + CALL(count) => + _X_ (CALL_OR_RETURN(countOne) _U_ (RETURN(count))) +) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_switch3_if.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_switch3_if.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_switch3_if.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_switch3_if.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,34 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-ltl tests/aorai/test_switch3.ltl -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + +/* Calcul de la longueur cumulee des chaines de caracteres prises en parametre */ + +/* Calcul de la longueur d'une chaine */ +int countOne(char* argv) { + int r=0; + if (argv[0]!=0) { + r++; + r+=countOne(argv+1); + } + return r; +} + + + + + + + +/* Somme de chacune des longueurs */ +int count(int argc, char** argv) { + if (argc>0) return countOne(argv[0])+count(argc-1,argv+1); + return 0; +} + +int main(int argc, char** argv) { + int somme; + somme=count(argc,argv); + return 1; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_switch3.ltl frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_switch3.ltl --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_switch3.ltl 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_switch3.ltl 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,4 @@ +_G_ ( + CALL(count) => + _X_ (CALL_OR_RETURN(countOne) _U_ (CALL_OR_RETURN(count))) +) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_switch3_return.c frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_switch3_return.c --- frama-c-20140301+neon+dfsg/src/aorai/tests/aorai/test_switch3_return.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/tests/aorai/test_switch3_return.c 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,34 @@ +/* run.config + EXECNOW: make tests/aorai/Aorai_test.cmxs + OPT: -aorai-ltl tests/aorai/test_switch3.ltl -aorai-test 1 -aorai-acceptance -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ +*/ + +/* Calcul de la longueur cumulee des chaines de caracteres prises en parametre */ + +/* Calcul de la longueur d'une chaine */ +int countOne(char* argv) { + int r=0; + + switch (argv[0]) { + case 0: return 0; + case 1: + case 2: + case 3: + default: + r++; + r+=countOne(argv+1); + } + return r; +} + +/* Somme de chacune des longueurs */ +int count(int argc, char** argv) { + if (argc>0) return countOne(argv[0])+count(argc-1,argv+1); + return 0; +} + +int main(int argc, char** argv) { + int somme; + somme=count(argc,argv); + return 1; +} diff -Nru frama-c-20140301+neon+dfsg/src/aorai/utils_parser.ml frama-c-20150201+sodium+dfsg/src/aorai/utils_parser.ml --- frama-c-20140301+neon+dfsg/src/aorai/utils_parser.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/utils_parser.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/yalexer.ml frama-c-20150201+sodium+dfsg/src/aorai/yalexer.ml --- frama-c-20140301+neon+dfsg/src/aorai/yalexer.ml 2014-03-12 15:07:54.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/yalexer.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,919 +0,0 @@ -# 27 "src/aorai/yalexer.mll" - - open Yaparser - open Lexing - exception Eof - - let new_line lexbuf = - let lcp = lexbuf.lex_curr_p in - lexbuf.lex_curr_p <- { lcp with pos_lnum = lcp.pos_lnum + 1; - pos_bol = lcp.pos_cnum; } - ;; - - exception Error of (Lexing.position * Lexing.position) * string - let loc lexbuf = (lexeme_start_p lexbuf, lexeme_end_p lexbuf) - let raise_located loc e = raise (Error (loc, e)) - - -# 19 "src/aorai/yalexer.ml" -let __ocaml_lex_tables = { - Lexing.lex_base = - "\000\000\211\255\212\255\213\255\214\255\006\000\217\255\034\000\ - \035\000\065\000\066\000\004\000\001\000\230\255\004\000\007\000\ - \235\255\236\255\237\255\238\255\239\255\240\255\241\255\069\000\ - \243\255\244\255\084\000\028\000\160\000\235\000\054\001\129\001\ - \204\001\023\002\254\255\255\255\033\002\108\002\183\002\002\003\ - \077\003\152\003\227\003\046\004\121\004\196\004\015\005\090\005\ - \165\005\240\005\059\006\134\006\209\006\028\007\103\007\178\007\ - \253\007\042\000\029\000\028\000\038\000\031\000\246\255\229\255\ - \232\255\231\255\226\255\225\255\218\255\221\255\220\255\219\255\ - \215\255"; - Lexing.lex_backtrk = - "\255\255\255\255\255\255\255\255\255\255\039\000\255\255\044\000\ - \033\000\032\000\031\000\028\000\027\000\255\255\022\000\021\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\013\000\ - \255\255\255\255\010\000\044\000\010\000\010\000\010\000\010\000\ - \010\000\002\000\255\255\255\255\010\000\010\000\010\000\003\000\ - \005\000\010\000\010\000\010\000\010\000\004\000\010\000\010\000\ - \010\000\006\000\010\000\010\000\007\000\010\000\010\000\010\000\ - \008\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255"; - Lexing.lex_default = - "\001\000\000\000\000\000\000\000\000\000\255\255\000\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\000\000\255\255\255\255\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\ - \000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\000\000\000\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000"; - Lexing.lex_trans = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\035\000\034\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \035\000\010\000\000\000\000\000\000\000\020\000\012\000\066\000\ - \019\000\018\000\022\000\024\000\025\000\023\000\013\000\021\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\005\000\006\000\009\000\007\000\008\000\003\000\ - \072\000\026\000\026\000\032\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\031\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\017\000\027\000\016\000\004\000\071\000\ - \070\000\026\000\026\000\026\000\026\000\026\000\028\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\030\000\ - \026\000\026\000\026\000\026\000\029\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\015\000\011\000\014\000\069\000\068\000\ - \067\000\065\000\064\000\063\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\057\000\058\000\ - \059\000\060\000\061\000\062\000\000\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\000\000\ - \000\000\000\000\000\000\026\000\000\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\000\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\000\000\000\000\000\000\000\000\026\000\ - \002\000\053\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\000\000\000\000\ - \000\000\000\000\026\000\000\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\050\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\000\000\000\000\000\000\000\000\026\000\000\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\046\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\026\000\026\000\026\000\026\000\041\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\000\000\000\000\000\000\000\000\ - \026\000\000\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\037\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\036\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\000\000\ - \000\000\000\000\000\000\026\000\000\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\040\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\000\000\000\000\000\000\000\000\ - \026\000\000\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \038\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\000\000\ - \000\000\000\000\000\000\026\000\000\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\039\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\000\000\000\000\000\000\000\000\026\000\000\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\000\000\000\000\000\000\ - \000\000\026\000\000\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \000\000\000\000\000\000\000\000\026\000\000\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\042\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\000\000\000\000\000\000\000\000\026\000\ - \000\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \043\000\026\000\026\000\026\000\026\000\026\000\000\000\000\000\ - \000\000\000\000\026\000\000\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \044\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\000\000\000\000\000\000\000\000\026\000\000\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\045\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\000\000\000\000\000\000\000\000\ - \026\000\000\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\000\000\ - \000\000\000\000\000\000\026\000\000\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\000\000\000\000\000\000\000\000\026\000\000\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\047\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\000\000\000\000\000\000\ - \000\000\026\000\000\000\026\000\026\000\026\000\026\000\048\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \000\000\000\000\000\000\000\000\026\000\000\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\049\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\000\000\000\000\000\000\000\000\026\000\ - \000\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\000\000\000\000\ - \000\000\000\000\026\000\000\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \051\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\000\000\000\000\000\000\000\000\026\000\000\000\026\000\ - \026\000\026\000\026\000\052\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\000\000\000\000\000\000\000\000\ - \026\000\000\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\000\000\ - \000\000\000\000\000\000\026\000\000\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \054\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\000\000\000\000\000\000\000\000\026\000\000\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\055\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\000\000\000\000\000\000\ - \000\000\026\000\000\000\026\000\026\000\026\000\026\000\056\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \000\000\000\000\000\000\000\000\026\000\000\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000"; - Lexing.lex_check = - "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\000\000\000\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \000\000\000\000\255\255\255\255\255\255\000\000\000\000\012\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\000\ - \008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\009\000\010\000\ - \011\000\014\000\015\000\023\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\027\000\057\000\ - \058\000\059\000\060\000\061\000\255\255\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\255\255\ - \255\255\255\255\255\255\026\000\255\255\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\255\255\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\255\255\255\255\255\255\255\255\028\000\ - \000\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\255\255\255\255\ - \255\255\255\255\029\000\255\255\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ - \029\000\029\000\029\000\029\000\029\000\029\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\255\255\255\255\255\255\255\255\030\000\255\255\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ - \030\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\255\255\255\255\255\255\255\255\ - \031\000\255\255\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\255\255\ - \255\255\255\255\255\255\032\000\255\255\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ - \032\000\032\000\032\000\032\000\032\000\032\000\032\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\036\000\036\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\036\000\036\000\036\000\255\255\255\255\255\255\255\255\ - \036\000\255\255\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ - \036\000\036\000\036\000\036\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\037\000\037\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\037\000\037\000\037\000\255\255\ - \255\255\255\255\255\255\037\000\255\255\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ - \037\000\037\000\037\000\037\000\037\000\037\000\037\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ - \038\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ - \038\000\038\000\255\255\255\255\255\255\255\255\038\000\255\255\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ - \038\000\038\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\255\255\255\255\255\255\ - \255\255\039\000\255\255\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\040\000\040\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ - \255\255\255\255\255\255\255\255\040\000\255\255\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ - \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\255\255\255\255\255\255\255\255\041\000\ - \255\255\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\255\255\255\255\ - \255\255\255\255\042\000\255\255\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\255\255\255\255\255\255\255\255\043\000\255\255\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \043\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\255\255\255\255\255\255\255\255\ - \044\000\255\255\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\045\000\045\000\045\000\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\045\000\045\000\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\255\255\ - \255\255\255\255\255\255\045\000\255\255\045\000\045\000\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ - \045\000\045\000\045\000\045\000\045\000\045\000\045\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\255\255\255\255\255\255\255\255\046\000\255\255\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \046\000\046\000\047\000\047\000\047\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\047\000\047\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\255\255\255\255\255\255\ - \255\255\047\000\255\255\047\000\047\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\048\000\048\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\048\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \255\255\255\255\255\255\255\255\048\000\255\255\048\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\255\255\255\255\255\255\255\255\049\000\ - \255\255\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\050\000\050\000\050\000\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\050\000\050\000\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\255\255\255\255\ - \255\255\255\255\050\000\255\255\050\000\050\000\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ - \050\000\050\000\050\000\050\000\050\000\050\000\051\000\051\000\ - \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\051\000\ - \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\255\255\255\255\255\255\255\255\051\000\255\255\051\000\ - \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ - \051\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\255\255\255\255\255\255\255\255\ - \052\000\255\255\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\255\255\ - \255\255\255\255\255\255\053\000\255\255\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ - \053\000\053\000\053\000\053\000\053\000\053\000\053\000\054\000\ - \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ - \054\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ - \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ - \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ - \054\000\054\000\255\255\255\255\255\255\255\255\054\000\255\255\ - \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ - \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ - \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ - \054\000\054\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\255\255\255\255\255\255\ - \255\255\055\000\255\255\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \255\255\255\255\255\255\255\255\056\000\255\255\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255"; - Lexing.lex_base_code = - ""; - Lexing.lex_backtrk_code = - ""; - Lexing.lex_default_code = - ""; - Lexing.lex_trans_code = - ""; - Lexing.lex_check_code = - ""; - Lexing.lex_code = - ""; -} - -let rec token lexbuf = - __ocaml_lex_token_rec lexbuf 0 -and __ocaml_lex_token_rec lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 51 "src/aorai/yalexer.mll" - ( token lexbuf ) -# 653 "src/aorai/yalexer.ml" - - | 1 -> -# 52 "src/aorai/yalexer.mll" - ( new_line lexbuf; token lexbuf ) -# 658 "src/aorai/yalexer.ml" - - | 2 -> -let -# 53 "src/aorai/yalexer.mll" - lxm -# 664 "src/aorai/yalexer.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in -# 53 "src/aorai/yalexer.mll" - ( INT(lxm) ) -# 668 "src/aorai/yalexer.ml" - - | 3 -> -# 54 "src/aorai/yalexer.mll" - ( CALL_OF ) -# 673 "src/aorai/yalexer.ml" - - | 4 -> -# 55 "src/aorai/yalexer.mll" - ( RETURN_OF ) -# 678 "src/aorai/yalexer.ml" - - | 5 -> -# 56 "src/aorai/yalexer.mll" - ( CALLORRETURN_OF ) -# 683 "src/aorai/yalexer.ml" - - | 6 -> -# 57 "src/aorai/yalexer.mll" - ( OTHERWISE ) -# 688 "src/aorai/yalexer.ml" - - | 7 -> -# 58 "src/aorai/yalexer.mll" - ( TRUE ) -# 693 "src/aorai/yalexer.ml" - - | 8 -> -# 59 "src/aorai/yalexer.mll" - ( FALSE ) -# 698 "src/aorai/yalexer.ml" - - | 9 -> -let -# 60 "src/aorai/yalexer.mll" - lxm -# 704 "src/aorai/yalexer.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 7) in -# 60 "src/aorai/yalexer.mll" - ( IDENTIFIER(lxm) ) -# 708 "src/aorai/yalexer.ml" - - | 10 -> -let -# 61 "src/aorai/yalexer.mll" - lxm -# 714 "src/aorai/yalexer.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in -# 61 "src/aorai/yalexer.mll" - ( IDENTIFIER(lxm) ) -# 718 "src/aorai/yalexer.ml" - - | 11 -> -# 62 "src/aorai/yalexer.mll" - ( COMMA ) -# 723 "src/aorai/yalexer.ml" - - | 12 -> -# 63 "src/aorai/yalexer.mll" - ( PLUS ) -# 728 "src/aorai/yalexer.ml" - - | 13 -> -# 64 "src/aorai/yalexer.mll" - ( MINUS ) -# 733 "src/aorai/yalexer.ml" - - | 14 -> -# 65 "src/aorai/yalexer.mll" - ( STAR ) -# 738 "src/aorai/yalexer.ml" - - | 15 -> -# 66 "src/aorai/yalexer.mll" - ( SLASH ) -# 743 "src/aorai/yalexer.ml" - - | 16 -> -# 67 "src/aorai/yalexer.mll" - ( PERCENT ) -# 748 "src/aorai/yalexer.ml" - - | 17 -> -# 68 "src/aorai/yalexer.mll" - ( LPAREN ) -# 753 "src/aorai/yalexer.ml" - - | 18 -> -# 69 "src/aorai/yalexer.mll" - ( RPAREN ) -# 758 "src/aorai/yalexer.ml" - - | 19 -> -# 70 "src/aorai/yalexer.mll" - ( LSQUARE ) -# 763 "src/aorai/yalexer.ml" - - | 20 -> -# 71 "src/aorai/yalexer.mll" - ( RSQUARE ) -# 768 "src/aorai/yalexer.ml" - - | 21 -> -# 72 "src/aorai/yalexer.mll" - ( LCURLY ) -# 773 "src/aorai/yalexer.ml" - - | 22 -> -# 73 "src/aorai/yalexer.mll" - ( RCURLY ) -# 778 "src/aorai/yalexer.ml" - - | 23 -> -# 74 "src/aorai/yalexer.mll" - ( LBRACELBRACE ) -# 783 "src/aorai/yalexer.ml" - - | 24 -> -# 75 "src/aorai/yalexer.mll" - ( RBRACERBRACE ) -# 788 "src/aorai/yalexer.ml" - - | 25 -> -# 76 "src/aorai/yalexer.mll" - ( DOT ) -# 793 "src/aorai/yalexer.ml" - - | 26 -> -# 77 "src/aorai/yalexer.mll" - ( RARROW ) -# 798 "src/aorai/yalexer.ml" - - | 27 -> -# 78 "src/aorai/yalexer.mll" - ( AMP ) -# 803 "src/aorai/yalexer.ml" - - | 28 -> -# 79 "src/aorai/yalexer.mll" - ( PIPE ) -# 808 "src/aorai/yalexer.ml" - - | 29 -> -# 80 "src/aorai/yalexer.mll" - ( AND ) -# 813 "src/aorai/yalexer.ml" - - | 30 -> -# 81 "src/aorai/yalexer.mll" - ( OR ) -# 818 "src/aorai/yalexer.ml" - - | 31 -> -# 82 "src/aorai/yalexer.mll" - ( NOT ) -# 823 "src/aorai/yalexer.ml" - - | 32 -> -# 83 "src/aorai/yalexer.mll" - ( LT ) -# 828 "src/aorai/yalexer.ml" - - | 33 -> -# 84 "src/aorai/yalexer.mll" - ( GT ) -# 833 "src/aorai/yalexer.ml" - - | 34 -> -# 85 "src/aorai/yalexer.mll" - ( LE ) -# 838 "src/aorai/yalexer.ml" - - | 35 -> -# 86 "src/aorai/yalexer.mll" - ( GE ) -# 843 "src/aorai/yalexer.ml" - - | 36 -> -# 87 "src/aorai/yalexer.mll" - ( EQ ) -# 848 "src/aorai/yalexer.ml" - - | 37 -> -# 88 "src/aorai/yalexer.mll" - ( NEQ ) -# 853 "src/aorai/yalexer.ml" - - | 38 -> -# 89 "src/aorai/yalexer.mll" - ( SEMI_COLON ) -# 858 "src/aorai/yalexer.ml" - - | 39 -> -# 90 "src/aorai/yalexer.mll" - ( COLON ) -# 863 "src/aorai/yalexer.ml" - - | 40 -> -# 91 "src/aorai/yalexer.mll" - ( COLUMNCOLUMN ) -# 868 "src/aorai/yalexer.ml" - - | 41 -> -# 92 "src/aorai/yalexer.mll" - ( CARET ) -# 873 "src/aorai/yalexer.ml" - - | 42 -> -# 93 "src/aorai/yalexer.mll" - ( QUESTION ) -# 878 "src/aorai/yalexer.ml" - - | 43 -> -# 94 "src/aorai/yalexer.mll" - ( EOF ) -# 883 "src/aorai/yalexer.ml" - - | 44 -> -# 95 "src/aorai/yalexer.mll" - ( raise_located (loc lexbuf) "Unknown token" ) -# 888 "src/aorai/yalexer.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_token_rec lexbuf __ocaml_lex_state - -;; - -# 97 "src/aorai/yalexer.mll" - - let parse c = - let lb = from_channel c in - try - Yaparser.main token lb - with - Parsing.Parse_error - | Invalid_argument _ -> - (* [VP]: Does not contain more information than - what is in the exn. *) - (*let (a,b)=(loc lb) in - Format.print_string "Syntax error (" ; - Format.print_string "l" ; - Format.print_int a.pos_lnum ; - Format.print_string "c" ; - Format.print_int (a.pos_cnum-a.pos_bol) ; - Format.print_string " -> l" ; - Format.print_int b.pos_lnum ; - Format.print_string "c" ; - Format.print_int (b.pos_cnum-b.pos_bol) ; - Format.print_string ")\n" ; - *) - raise_located (loc lb) "Syntax error" - - -# 920 "src/aorai/yalexer.ml" diff -Nru frama-c-20140301+neon+dfsg/src/aorai/yalexer.mll frama-c-20150201+sodium+dfsg/src/aorai/yalexer.mll --- frama-c-20140301+neon+dfsg/src/aorai/yalexer.mll 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/yalexer.mll 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Aorai plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* INRIA (Institut National de Recherche en Informatique et en *) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/yaparser.ml frama-c-20150201+sodium+dfsg/src/aorai/yaparser.ml --- frama-c-20140301+neon+dfsg/src/aorai/yaparser.ml 2014-03-12 15:07:54.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/yaparser.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,1099 +0,0 @@ -type token = - | CALL_OF - | RETURN_OF - | CALLORRETURN_OF - | IDENTIFIER of (string) - | INT of (string) - | LCURLY - | RCURLY - | LPAREN - | RPAREN - | LSQUARE - | RSQUARE - | LBRACELBRACE - | RBRACERBRACE - | RARROW - | TRUE - | FALSE - | NOT - | DOT - | AMP - | COLON - | SEMI_COLON - | COMMA - | PIPE - | CARET - | QUESTION - | COLUMNCOLUMN - | EQ - | LT - | GT - | LE - | GE - | NEQ - | PLUS - | MINUS - | SLASH - | STAR - | PERCENT - | OR - | AND - | OTHERWISE - | EOF - -open Parsing;; -let _ = parse_error;; -# 30 "src/aorai/yaparser.mly" -open Logic_ptree -open Promelaast -open Bool3 - -let to_seq c = - [{ condition = Some c; - nested = []; - min_rep = Some Data_for_aorai.cst_one; - max_rep = Some Data_for_aorai.cst_one; - }] - -let is_no_repet (min,max) = - let is_one c = Extlib.may_map Data_for_aorai.is_cst_one ~dft:false c in - is_one min && is_one max - -let observed_states = Hashtbl.create 1 -let prefetched_states = Hashtbl.create 1 - -let fetch_and_create_state name = - Hashtbl.remove prefetched_states name ; - try - Hashtbl.find observed_states name - with - Not_found -> - let s = Data_for_aorai.new_state name in - Hashtbl.add observed_states name s; s -;; - -let prefetch_and_create_state name = - if (Hashtbl.mem prefetched_states name) || - not (Hashtbl.mem observed_states name) - then - begin - let s= fetch_and_create_state name in - Hashtbl.add prefetched_states name name; - s - end - else - (fetch_and_create_state name) -;; - -type pre_cond = Behavior of string | Pre of Promelaast.condition - -# 91 "src/aorai/yaparser.ml" -let yytransl_const = [| - 257 (* CALL_OF *); - 258 (* RETURN_OF *); - 259 (* CALLORRETURN_OF *); - 262 (* LCURLY *); - 263 (* RCURLY *); - 264 (* LPAREN *); - 265 (* RPAREN *); - 266 (* LSQUARE *); - 267 (* RSQUARE *); - 268 (* LBRACELBRACE *); - 269 (* RBRACERBRACE *); - 270 (* RARROW *); - 271 (* TRUE *); - 272 (* FALSE *); - 273 (* NOT *); - 274 (* DOT *); - 275 (* AMP *); - 276 (* COLON *); - 277 (* SEMI_COLON *); - 278 (* COMMA *); - 279 (* PIPE *); - 280 (* CARET *); - 281 (* QUESTION *); - 282 (* COLUMNCOLUMN *); - 283 (* EQ *); - 284 (* LT *); - 285 (* GT *); - 286 (* LE *); - 287 (* GE *); - 288 (* NEQ *); - 289 (* PLUS *); - 290 (* MINUS *); - 291 (* SLASH *); - 292 (* STAR *); - 293 (* PERCENT *); - 294 (* OR *); - 295 (* AND *); - 296 (* OTHERWISE *); - 0 (* EOF *); - 0|] - -let yytransl_block = [| - 260 (* IDENTIFIER *); - 261 (* INT *); - 0|] - -let yylhs = "\255\255\ -\001\000\002\000\002\000\004\000\005\000\005\000\006\000\006\000\ -\003\000\003\000\007\000\008\000\008\000\009\000\009\000\009\000\ -\011\000\011\000\012\000\012\000\013\000\013\000\013\000\013\000\ -\013\000\015\000\015\000\016\000\016\000\010\000\017\000\017\000\ -\017\000\017\000\017\000\017\000\017\000\017\000\014\000\014\000\ -\014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\ -\019\000\019\000\019\000\019\000\019\000\019\000\019\000\018\000\ -\018\000\018\000\020\000\020\000\020\000\020\000\022\000\022\000\ -\022\000\022\000\021\000\021\000\021\000\021\000\023\000\023\000\ -\023\000\024\000\024\000\024\000\024\000\000\000" - -let yylen = "\002\000\ -\002\000\002\000\001\000\004\000\000\000\002\000\003\000\001\000\ -\002\000\001\000\004\000\003\000\001\000\005\000\003\000\002\000\ -\001\000\003\000\000\000\001\000\001\000\003\000\006\000\005\000\ -\004\000\002\000\003\000\000\000\003\000\002\000\000\000\001\000\ -\001\000\001\000\005\000\003\000\004\000\004\000\004\000\004\000\ -\004\000\001\000\001\000\002\000\003\000\003\000\003\000\001\000\ -\003\000\003\000\003\000\003\000\003\000\003\000\001\000\003\000\ -\003\000\001\000\003\000\003\000\003\000\001\000\001\000\003\000\ -\003\000\003\000\001\000\002\000\001\000\003\000\003\000\004\000\ -\001\000\002\000\005\000\001\000\003\000\002\000" - -let yydefred = "\000\000\ -\000\000\000\000\000\000\078\000\000\000\003\000\000\000\000\000\ -\000\000\002\000\010\000\000\000\000\000\000\000\009\000\008\000\ -\000\000\004\000\000\000\000\000\000\000\000\000\013\000\000\000\ -\000\000\000\000\000\000\000\000\067\000\000\000\000\000\042\000\ -\043\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\048\000\000\000\063\000\000\000\000\000\073\000\016\000\000\000\ -\011\000\000\000\007\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\044\000\068\000\000\000\000\000\000\000\000\000\034\000\032\000\ -\033\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\015\000\012\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\026\000\000\000\000\000\047\000\ -\070\000\077\000\000\000\022\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\049\000\050\000\051\000\052\000\053\000\ -\054\000\056\000\057\000\059\000\060\000\061\000\064\000\065\000\ -\066\000\000\000\071\000\040\000\041\000\039\000\000\000\000\000\ -\025\000\000\000\027\000\020\000\000\000\000\000\018\000\014\000\ -\000\000\000\000\036\000\000\000\072\000\000\000\075\000\024\000\ -\000\000\038\000\037\000\000\000\029\000\023\000\035\000" - -let yydgoto = "\002\000\ -\004\000\005\000\009\000\006\000\013\000\017\000\011\000\022\000\ -\023\000\063\000\140\000\141\000\038\000\039\000\058\000\137\000\ -\074\000\040\000\041\000\042\000\043\000\044\000\045\000\046\000" - -let yysindex = "\078\000\ -\059\255\000\000\101\255\000\000\000\255\000\000\091\255\096\255\ -\119\255\000\000\000\000\121\255\106\255\251\254\000\000\000\000\ -\107\255\000\000\083\255\128\255\122\255\240\254\000\000\136\255\ -\142\255\164\255\167\255\008\255\000\000\105\255\083\255\000\000\ -\000\000\105\255\139\255\009\255\159\255\253\254\168\255\252\254\ -\000\000\067\255\000\000\185\255\079\255\000\000\000\000\174\255\ -\000\000\251\254\000\000\176\255\180\255\206\255\056\255\105\255\ -\208\255\210\255\224\255\029\255\252\254\079\255\214\255\232\255\ -\000\000\000\000\009\255\079\255\223\255\007\255\000\000\000\000\ -\000\000\000\000\105\255\105\255\237\255\237\255\237\255\237\255\ -\237\255\237\255\237\255\237\255\237\255\237\255\237\255\237\255\ -\237\255\237\255\237\255\235\255\000\000\000\000\238\255\244\255\ -\004\000\062\255\019\000\249\254\000\000\083\255\020\000\000\000\ -\000\000\000\000\083\255\000\000\085\255\240\255\237\255\237\255\ -\055\255\168\255\168\255\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\036\000\000\000\000\000\000\000\000\000\105\255\027\000\ -\000\000\037\000\000\000\000\000\042\000\035\000\000\000\000\000\ -\045\000\048\000\000\000\166\255\000\000\031\255\000\000\000\000\ -\037\000\000\000\000\000\049\000\000\000\000\000\000\000" - -let yyrindex = "\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\038\000\000\000\ -\057\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\041\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\158\255\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\117\255\157\000\073\000\ -\000\000\039\000\000\000\005\000\192\255\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\124\255\000\000\037\255\091\000\010\255\000\000\ -\000\000\000\000\000\000\227\255\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\166\000\000\000\000\000\000\000\054\000\000\000\000\000\ -\000\000\000\000\103\255\000\000\000\000\000\000\000\000\000\000\ -\000\000\125\000\134\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\166\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\166\000\000\000\000\000\000\000\000\000\000\000\000\000" - -let yygindex = "\000\000\ -\000\000\000\000\000\000\053\001\000\000\000\000\056\001\000\000\ -\023\001\055\001\243\255\225\000\000\000\236\255\000\000\181\255\ -\000\000\226\255\000\000\000\000\190\000\000\000\228\255\000\000" - -let yytablesize = 458 -let yytable = "\061\000\ -\019\000\062\000\070\000\008\000\049\000\139\000\050\000\068\000\ -\020\000\060\000\059\000\029\000\059\000\065\000\111\000\055\000\ -\067\000\064\000\017\000\056\000\017\000\071\000\077\000\078\000\ -\079\000\080\000\081\000\082\000\112\000\072\000\075\000\076\000\ -\073\000\057\000\021\000\100\000\003\000\104\000\109\000\113\000\ -\035\000\099\000\036\000\157\000\036\000\055\000\116\000\117\000\ -\118\000\119\000\120\000\121\000\122\000\123\000\114\000\115\000\ -\025\000\026\000\027\000\028\000\029\000\147\000\152\000\030\000\ -\098\000\031\000\075\000\076\000\075\000\076\000\032\000\033\000\ -\034\000\135\000\055\000\055\000\148\000\158\000\001\000\136\000\ -\145\000\146\000\062\000\025\000\026\000\027\000\028\000\029\000\ -\091\000\035\000\030\000\036\000\031\000\106\000\091\000\003\000\ -\092\000\032\000\033\000\034\000\084\000\085\000\092\000\087\000\ -\007\000\025\000\026\000\027\000\059\000\029\000\012\000\019\000\ -\030\000\019\000\150\000\014\000\035\000\156\000\036\000\032\000\ -\033\000\034\000\008\000\031\000\016\000\031\000\018\000\031\000\ -\024\000\076\000\076\000\047\000\076\000\076\000\076\000\048\000\ -\076\000\031\000\035\000\051\000\036\000\076\000\076\000\066\000\ -\076\000\076\000\076\000\076\000\076\000\052\000\076\000\076\000\ -\076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ -\076\000\076\000\076\000\076\000\076\000\069\000\076\000\076\000\ -\076\000\059\000\029\000\053\000\155\000\111\000\054\000\076\000\ -\076\000\093\000\076\000\095\000\076\000\076\000\076\000\096\000\ -\076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\ -\076\000\076\000\076\000\076\000\076\000\069\000\069\000\035\000\ -\069\000\036\000\069\000\088\000\069\000\075\000\076\000\089\000\ -\090\000\097\000\069\000\101\000\069\000\069\000\069\000\069\000\ -\069\000\102\000\069\000\069\000\069\000\069\000\069\000\069\000\ -\069\000\069\000\069\000\069\000\069\000\069\000\069\000\103\000\ -\074\000\074\000\107\000\074\000\110\000\074\000\131\000\074\000\ -\059\000\029\000\108\000\144\000\111\000\074\000\132\000\074\000\ -\074\000\074\000\074\000\074\000\133\000\074\000\074\000\074\000\ -\074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ -\074\000\074\000\062\000\062\000\134\000\062\000\035\000\062\000\ -\036\000\062\000\124\000\125\000\126\000\127\000\128\000\129\000\ -\130\000\062\000\062\000\138\000\142\000\062\000\151\000\062\000\ -\062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ -\062\000\062\000\062\000\062\000\058\000\058\000\149\000\058\000\ -\135\000\058\000\153\000\058\000\136\000\105\000\154\000\159\000\ -\001\000\010\000\005\000\058\000\058\000\006\000\019\000\058\000\ -\015\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ -\094\000\037\000\058\000\143\000\058\000\058\000\055\000\055\000\ -\000\000\055\000\000\000\055\000\000\000\055\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\055\000\000\000\000\000\ -\000\000\055\000\000\000\069\000\000\000\000\000\000\000\000\000\ -\000\000\055\000\000\000\000\000\055\000\069\000\055\000\055\000\ -\000\000\069\000\069\000\000\000\000\000\069\000\069\000\069\000\ -\069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ -\069\000\069\000\046\000\046\000\000\000\046\000\000\000\046\000\ -\000\000\046\000\000\000\045\000\045\000\000\000\045\000\000\000\ -\045\000\046\000\045\000\000\000\000\000\046\000\000\000\000\000\ -\000\000\000\000\045\000\000\000\000\000\046\000\045\000\000\000\ -\046\000\000\000\021\000\021\000\000\000\021\000\045\000\021\000\ -\000\000\045\000\000\000\028\000\028\000\000\000\028\000\000\000\ -\028\000\021\000\000\000\000\000\000\000\021\000\000\000\000\000\ -\000\000\000\000\028\000\000\000\000\000\021\000\028\000\000\000\ -\021\000\000\000\000\000\000\000\000\000\000\000\028\000\000\000\ -\000\000\028\000" - -let yycheck = "\030\000\ -\006\001\030\000\006\001\004\001\021\001\013\001\023\001\036\000\ -\014\001\030\000\004\001\005\001\004\001\034\000\008\001\008\001\ -\008\001\031\000\009\001\012\001\011\001\025\001\027\001\028\001\ -\029\001\030\001\031\001\032\001\022\001\033\001\038\001\039\001\ -\036\001\026\001\040\001\056\000\037\001\009\001\067\000\070\000\ -\034\001\055\000\036\001\013\001\036\001\009\001\077\000\078\000\ -\079\000\080\000\081\000\082\000\083\000\084\000\075\000\076\000\ -\001\001\002\001\003\001\004\001\005\001\007\001\138\000\008\001\ -\009\001\010\001\038\001\039\001\038\001\039\001\015\001\016\001\ -\017\001\012\001\038\001\039\001\022\001\153\000\001\000\018\001\ -\111\000\112\000\111\000\001\001\002\001\003\001\004\001\005\001\ -\010\001\034\001\008\001\036\001\010\001\009\001\010\001\037\001\ -\018\001\015\001\016\001\017\001\034\001\035\001\018\001\037\001\ -\004\001\001\001\002\001\003\001\004\001\005\001\020\001\009\001\ -\008\001\011\001\135\000\020\001\034\001\148\000\036\001\015\001\ -\016\001\017\001\004\001\007\001\004\001\009\001\021\001\011\001\ -\022\001\006\001\007\001\004\001\009\001\010\001\011\001\014\001\ -\013\001\021\001\034\001\004\001\036\001\018\001\019\001\005\001\ -\021\001\022\001\023\001\024\001\025\001\008\001\027\001\028\001\ -\029\001\030\001\031\001\032\001\033\001\034\001\035\001\036\001\ -\037\001\038\001\039\001\006\001\007\001\007\001\009\001\010\001\ -\011\001\004\001\005\001\008\001\007\001\008\001\008\001\018\001\ -\019\001\004\001\021\001\004\001\023\001\024\001\025\001\004\001\ -\027\001\028\001\029\001\030\001\031\001\032\001\033\001\034\001\ -\035\001\036\001\037\001\038\001\039\001\006\001\007\001\034\001\ -\009\001\036\001\011\001\019\001\013\001\038\001\039\001\023\001\ -\024\001\004\001\019\001\004\001\021\001\022\001\023\001\024\001\ -\025\001\008\001\027\001\028\001\029\001\030\001\031\001\032\001\ -\033\001\034\001\035\001\036\001\037\001\038\001\039\001\008\001\ -\006\001\007\001\021\001\009\001\014\001\011\001\004\001\013\001\ -\004\001\005\001\011\001\004\001\008\001\019\001\009\001\021\001\ -\022\001\023\001\024\001\025\001\009\001\027\001\028\001\029\001\ -\030\001\031\001\032\001\033\001\034\001\035\001\036\001\037\001\ -\038\001\039\001\006\001\007\001\009\001\009\001\034\001\011\001\ -\036\001\013\001\085\000\086\000\087\000\088\000\089\000\090\000\ -\091\000\021\001\022\001\009\001\009\001\025\001\004\001\027\001\ -\028\001\029\001\030\001\031\001\032\001\033\001\034\001\035\001\ -\036\001\037\001\038\001\039\001\006\001\007\001\011\001\009\001\ -\012\001\011\001\009\001\013\001\018\001\009\001\007\001\007\001\ -\000\000\005\000\021\001\021\001\022\001\021\001\009\001\025\001\ -\009\000\027\001\028\001\029\001\030\001\031\001\032\001\033\001\ -\050\000\019\000\036\001\107\000\038\001\039\001\006\001\007\001\ -\255\255\009\001\255\255\011\001\255\255\013\001\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\021\001\255\255\255\255\ -\255\255\025\001\255\255\009\001\255\255\255\255\255\255\255\255\ -\255\255\033\001\255\255\255\255\036\001\019\001\038\001\039\001\ -\255\255\023\001\024\001\255\255\255\255\027\001\028\001\029\001\ -\030\001\031\001\032\001\033\001\034\001\035\001\036\001\037\001\ -\038\001\039\001\006\001\007\001\255\255\009\001\255\255\011\001\ -\255\255\013\001\255\255\006\001\007\001\255\255\009\001\255\255\ -\011\001\021\001\013\001\255\255\255\255\025\001\255\255\255\255\ -\255\255\255\255\021\001\255\255\255\255\033\001\025\001\255\255\ -\036\001\255\255\006\001\007\001\255\255\009\001\033\001\011\001\ -\255\255\036\001\255\255\006\001\007\001\255\255\009\001\255\255\ -\011\001\021\001\255\255\255\255\255\255\025\001\255\255\255\255\ -\255\255\255\255\021\001\255\255\255\255\033\001\025\001\255\255\ -\036\001\255\255\255\255\255\255\255\255\255\255\033\001\255\255\ -\255\255\036\001" - -let yynames_const = "\ - CALL_OF\000\ - RETURN_OF\000\ - CALLORRETURN_OF\000\ - LCURLY\000\ - RCURLY\000\ - LPAREN\000\ - RPAREN\000\ - LSQUARE\000\ - RSQUARE\000\ - LBRACELBRACE\000\ - RBRACERBRACE\000\ - RARROW\000\ - TRUE\000\ - FALSE\000\ - NOT\000\ - DOT\000\ - AMP\000\ - COLON\000\ - SEMI_COLON\000\ - COMMA\000\ - PIPE\000\ - CARET\000\ - QUESTION\000\ - COLUMNCOLUMN\000\ - EQ\000\ - LT\000\ - GT\000\ - LE\000\ - GE\000\ - NEQ\000\ - PLUS\000\ - MINUS\000\ - SLASH\000\ - STAR\000\ - PERCENT\000\ - OR\000\ - AND\000\ - OTHERWISE\000\ - EOF\000\ - " - -let yynames_block = "\ - IDENTIFIER\000\ - INT\000\ - " - -let yyact = [| - (fun _ -> failwith "parser") -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 1 : 'options) in - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'states) in - Obj.repr( -# 104 "src/aorai/yaparser.mly" - ( - List.iter - (fun(key, ids) -> - match key with - "init" -> - List.iter - (fun id -> - try - (Hashtbl.find observed_states id).init <- True - with - Not_found -> - Aorai_option.abort "Error: no state '%s'\n" id) - ids - | "accept" -> - List.iter - (fun id -> try - (Hashtbl.find observed_states id).acceptation <- True - with Not_found -> - Aorai_option.abort "no state '%s'\n" id) ids - | "deterministic" -> Aorai_option.Deterministic.set true; - | oth -> Aorai_option.abort "unknown option '%s'\n" oth - ) _1; - let states= - Hashtbl.fold - (fun _ st l -> - if st.acceptation=Undefined || st.init=Undefined then - begin - Aorai_option.abort - "Error: the state '%s' is used but never defined.\n" st.name - end; - st::l) - observed_states [] - in - (try - Hashtbl.iter - (fun _ st -> if st.init=True then raise Exit) observed_states; - Aorai_option.abort "Automaton does not declare an initial state" - with Exit -> ()); - if Hashtbl.length prefetched_states >0 then - begin - let r = Hashtbl.fold - (fun s n _ -> - s^"Error: the state '"^n^"' is used but never defined.\n") - prefetched_states - "" - in - Aorai_option.abort "%s" r - end; - (states, _2) - ) -# 464 "src/aorai/yaparser.ml" - : Promelaast.parsed_automaton)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 1 : 'options) in - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'option) in - Obj.repr( -# 158 "src/aorai/yaparser.mly" - ( _1@[_2] ) -# 472 "src/aorai/yaparser.ml" - : 'options)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'option) in - Obj.repr( -# 159 "src/aorai/yaparser.mly" - ( [_1] ) -# 479 "src/aorai/yaparser.ml" - : 'options)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 2 : string) in - let _3 = (Parsing.peek_val __caml_parser_env 1 : 'opt_identifiers) in - Obj.repr( -# 163 "src/aorai/yaparser.mly" - ( (_2, _3) ) -# 487 "src/aorai/yaparser.ml" - : 'option)) -; (fun __caml_parser_env -> - Obj.repr( -# 167 "src/aorai/yaparser.mly" - ( [] ) -# 493 "src/aorai/yaparser.ml" - : 'opt_identifiers)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'id_list) in - Obj.repr( -# 168 "src/aorai/yaparser.mly" - ( _2 ) -# 500 "src/aorai/yaparser.ml" - : 'opt_identifiers)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'id_list) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 172 "src/aorai/yaparser.mly" - ( _1@[_3] ) -# 508 "src/aorai/yaparser.ml" - : 'id_list)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 173 "src/aorai/yaparser.mly" - ( [_1] ) -# 515 "src/aorai/yaparser.ml" - : 'id_list)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 1 : 'states) in - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'state) in - Obj.repr( -# 177 "src/aorai/yaparser.mly" - ( _1@_2 ) -# 523 "src/aorai/yaparser.ml" - : 'states)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'state) in - Obj.repr( -# 178 "src/aorai/yaparser.mly" - ( _1 ) -# 530 "src/aorai/yaparser.ml" - : 'states)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 3 : string) in - let _3 = (Parsing.peek_val __caml_parser_env 1 : 'transitions) in - Obj.repr( -# 182 "src/aorai/yaparser.mly" - ( - let start_state = fetch_and_create_state _1 in - let (_, transitions) = - List.fold_left - (fun (otherwise, transitions) (cross,stop_state) -> - if otherwise then - Aorai_option.abort - "'other' directive in definition of %s \ - transitions is not the last one" start_state.name - else begin - let trans = - { start=start_state; stop=stop_state; - cross=cross; numt=(-1) }::transitions - in - let otherwise = - match cross with - | Otherwise -> true - | Seq _ -> false - in otherwise, trans - end) - (false,[]) _3 - in - List.rev transitions - ) -# 561 "src/aorai/yaparser.ml" - : 'state)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'transitions) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'transition) in - Obj.repr( -# 208 "src/aorai/yaparser.mly" - ( _1@[_3] ) -# 569 "src/aorai/yaparser.ml" - : 'transitions)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'transition) in - Obj.repr( -# 209 "src/aorai/yaparser.mly" - ( [_1] ) -# 576 "src/aorai/yaparser.ml" - : 'transitions)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 3 : 'seq_elt) in - let _5 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 215 "src/aorai/yaparser.mly" - ( (Seq _2, prefetch_and_create_state _5) ) -# 584 "src/aorai/yaparser.ml" - : 'transition)) -; (fun __caml_parser_env -> - let _3 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 216 "src/aorai/yaparser.mly" - ((Otherwise, prefetch_and_create_state _3) ) -# 591 "src/aorai/yaparser.ml" - : 'transition)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 217 "src/aorai/yaparser.mly" - ( (Seq (to_seq PTrue), prefetch_and_create_state _2) ) -# 598 "src/aorai/yaparser.ml" - : 'transition)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'seq_elt) in - Obj.repr( -# 221 "src/aorai/yaparser.mly" - ( _1 ) -# 605 "src/aorai/yaparser.ml" - : 'non_empty_seq)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'seq_elt) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'seq) in - Obj.repr( -# 222 "src/aorai/yaparser.mly" - ( _1 @ _3 ) -# 613 "src/aorai/yaparser.ml" - : 'non_empty_seq)) -; (fun __caml_parser_env -> - Obj.repr( -# 226 "src/aorai/yaparser.mly" - ( [] ) -# 619 "src/aorai/yaparser.ml" - : 'seq)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'non_empty_seq) in - Obj.repr( -# 227 "src/aorai/yaparser.mly" - ( _1 ) -# 626 "src/aorai/yaparser.ml" - : 'seq)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'single_cond) in - Obj.repr( -# 231 "src/aorai/yaparser.mly" - ( to_seq _1 ) -# 633 "src/aorai/yaparser.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'non_empty_seq) in - Obj.repr( -# 232 "src/aorai/yaparser.mly" - ( _2 ) -# 640 "src/aorai/yaparser.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 5 : string) in - let _2 = (Parsing.peek_val __caml_parser_env 4 : 'pre_cond) in - let _4 = (Parsing.peek_val __caml_parser_env 2 : 'seq) in - let _6 = (Parsing.peek_val __caml_parser_env 0 : 'post_cond) in - Obj.repr( -# 234 "src/aorai/yaparser.mly" - ( let pre_cond = - match _2 with - | Behavior b -> PCall(_1,Some b) - | Pre c -> PAnd (PCall(_1,None), c) - in - let post_cond = - match _6 with - | None -> PReturn _1 - | Some c -> PAnd (PReturn _1,c) - in - (to_seq pre_cond) @ _4 @ to_seq post_cond - ) -# 661 "src/aorai/yaparser.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 4 : string) in - let _3 = (Parsing.peek_val __caml_parser_env 2 : 'non_empty_seq) in - let _5 = (Parsing.peek_val __caml_parser_env 0 : 'post_cond) in - Obj.repr( -# 247 "src/aorai/yaparser.mly" - ( let post_cond = - match _5 with - | None -> PReturn _1 - | Some c -> PAnd (PReturn _1,c) - in - (to_seq (PCall (_1, None))) @ _3 @ to_seq post_cond - ) -# 676 "src/aorai/yaparser.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 3 : string) in - let _4 = (Parsing.peek_val __caml_parser_env 0 : 'post_cond) in - Obj.repr( -# 255 "src/aorai/yaparser.mly" - ( let post_cond = - match _4 with - | None -> PReturn _1 - | Some c -> PAnd (PReturn _1,c) - in - (to_seq (PCall (_1, None))) @ to_seq post_cond - ) -# 690 "src/aorai/yaparser.ml" - : 'guard)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 265 "src/aorai/yaparser.mly" - ( Behavior _2 ) -# 697 "src/aorai/yaparser.ml" - : 'pre_cond)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'single_cond) in - Obj.repr( -# 266 "src/aorai/yaparser.mly" - ( Pre _2 ) -# 704 "src/aorai/yaparser.ml" - : 'pre_cond)) -; (fun __caml_parser_env -> - Obj.repr( -# 270 "src/aorai/yaparser.mly" - ( None ) -# 710 "src/aorai/yaparser.ml" - : 'post_cond)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'single_cond) in - Obj.repr( -# 271 "src/aorai/yaparser.mly" - ( Some _2 ) -# 717 "src/aorai/yaparser.ml" - : 'post_cond)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 1 : 'guard) in - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'repetition) in - Obj.repr( -# 275 "src/aorai/yaparser.mly" - ( - let min, max = _2 in - match _1 with - | [ s ] when Data_for_aorai.is_single s -> - [ { s with min_rep = min; max_rep = max } ] - | l -> - if is_no_repet (min,max) then - l (* [ a; [b;c]; d] is equivalent to [a;b;c;d] *) - else [ { condition = None; nested = l; min_rep = min; max_rep = max } ] - ) -# 734 "src/aorai/yaparser.ml" - : 'seq_elt)) -; (fun __caml_parser_env -> - Obj.repr( -# 289 "src/aorai/yaparser.mly" - ( Some Data_for_aorai.cst_one, Some Data_for_aorai.cst_one ) -# 740 "src/aorai/yaparser.ml" - : 'repetition)) -; (fun __caml_parser_env -> - Obj.repr( -# 290 "src/aorai/yaparser.mly" - ( Some Data_for_aorai.cst_one, None) -# 746 "src/aorai/yaparser.ml" - : 'repetition)) -; (fun __caml_parser_env -> - Obj.repr( -# 291 "src/aorai/yaparser.mly" - ( None, None ) -# 752 "src/aorai/yaparser.ml" - : 'repetition)) -; (fun __caml_parser_env -> - Obj.repr( -# 292 "src/aorai/yaparser.mly" - ( None, Some Data_for_aorai.cst_one ) -# 758 "src/aorai/yaparser.ml" - : 'repetition)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 3 : 'arith_relation) in - let _4 = (Parsing.peek_val __caml_parser_env 1 : 'arith_relation) in - Obj.repr( -# 293 "src/aorai/yaparser.mly" - ( Some _2, Some _4 ) -# 766 "src/aorai/yaparser.ml" - : 'repetition)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'arith_relation) in - Obj.repr( -# 294 "src/aorai/yaparser.mly" - ( Some _2, Some _2 ) -# 773 "src/aorai/yaparser.ml" - : 'repetition)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - Obj.repr( -# 295 "src/aorai/yaparser.mly" - ( Some _2, None ) -# 780 "src/aorai/yaparser.ml" - : 'repetition)) -; (fun __caml_parser_env -> - let _3 = (Parsing.peek_val __caml_parser_env 1 : 'arith_relation) in - Obj.repr( -# 296 "src/aorai/yaparser.mly" - ( None, Some _3 ) -# 787 "src/aorai/yaparser.ml" - : 'repetition)) -; (fun __caml_parser_env -> - let _3 = (Parsing.peek_val __caml_parser_env 1 : string) in - Obj.repr( -# 300 "src/aorai/yaparser.mly" - ( POr (PCall (_3,None), PReturn _3) ) -# 794 "src/aorai/yaparser.ml" - : 'single_cond)) -; (fun __caml_parser_env -> - let _3 = (Parsing.peek_val __caml_parser_env 1 : string) in - Obj.repr( -# 301 "src/aorai/yaparser.mly" - ( PCall (_3,None) ) -# 801 "src/aorai/yaparser.ml" - : 'single_cond)) -; (fun __caml_parser_env -> - let _3 = (Parsing.peek_val __caml_parser_env 1 : string) in - Obj.repr( -# 302 "src/aorai/yaparser.mly" - ( PReturn _3 ) -# 808 "src/aorai/yaparser.ml" - : 'single_cond)) -; (fun __caml_parser_env -> - Obj.repr( -# 303 "src/aorai/yaparser.mly" - ( PTrue ) -# 814 "src/aorai/yaparser.ml" - : 'single_cond)) -; (fun __caml_parser_env -> - Obj.repr( -# 304 "src/aorai/yaparser.mly" - ( PFalse ) -# 820 "src/aorai/yaparser.ml" - : 'single_cond)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'single_cond) in - Obj.repr( -# 305 "src/aorai/yaparser.mly" - ( PNot _2 ) -# 827 "src/aorai/yaparser.ml" - : 'single_cond)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'single_cond) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'single_cond) in - Obj.repr( -# 306 "src/aorai/yaparser.mly" - ( PAnd (_1,_3) ) -# 835 "src/aorai/yaparser.ml" - : 'single_cond)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'single_cond) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'single_cond) in - Obj.repr( -# 307 "src/aorai/yaparser.mly" - ( POr (_1,_3) ) -# 843 "src/aorai/yaparser.ml" - : 'single_cond)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'single_cond) in - Obj.repr( -# 308 "src/aorai/yaparser.mly" - ( _2 ) -# 850 "src/aorai/yaparser.ml" - : 'single_cond)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'logic_relation) in - Obj.repr( -# 309 "src/aorai/yaparser.mly" - ( _1 ) -# 857 "src/aorai/yaparser.ml" - : 'single_cond)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 313 "src/aorai/yaparser.mly" - ( PRel(Eq, _1, _3) ) -# 865 "src/aorai/yaparser.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 314 "src/aorai/yaparser.mly" - ( PRel(Lt, _1, _3) ) -# 873 "src/aorai/yaparser.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 315 "src/aorai/yaparser.mly" - ( PRel(Gt, _1, _3) ) -# 881 "src/aorai/yaparser.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 316 "src/aorai/yaparser.mly" - ( PRel(Le, _1, _3) ) -# 889 "src/aorai/yaparser.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 317 "src/aorai/yaparser.mly" - ( PRel(Ge, _1, _3) ) -# 897 "src/aorai/yaparser.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 318 "src/aorai/yaparser.mly" - ( PRel(Neq, _1, _3) ) -# 905 "src/aorai/yaparser.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 319 "src/aorai/yaparser.mly" - ( PRel (Neq, _1, PCst(IntConstant "0")) ) -# 912 "src/aorai/yaparser.ml" - : 'logic_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_mul) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 323 "src/aorai/yaparser.mly" - ( PBinop(Badd,_1,_3) ) -# 920 "src/aorai/yaparser.ml" - : 'arith_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_mul) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation) in - Obj.repr( -# 324 "src/aorai/yaparser.mly" - ( PBinop(Bsub,_1,_3) ) -# 928 "src/aorai/yaparser.ml" - : 'arith_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation_mul) in - Obj.repr( -# 325 "src/aorai/yaparser.mly" - ( _1 ) -# 935 "src/aorai/yaparser.ml" - : 'arith_relation)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_mul) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'access_or_const) in - Obj.repr( -# 329 "src/aorai/yaparser.mly" - ( PBinop(Bdiv,_1,_3) ) -# 943 "src/aorai/yaparser.ml" - : 'arith_relation_mul)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_mul) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'access_or_const) in - Obj.repr( -# 330 "src/aorai/yaparser.mly" - ( PBinop(Bmul, _1, _3) ) -# 951 "src/aorai/yaparser.ml" - : 'arith_relation_mul)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_mul) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'access_or_const) in - Obj.repr( -# 331 "src/aorai/yaparser.mly" - ( PBinop(Bmod, _1, _3) ) -# 959 "src/aorai/yaparser.ml" - : 'arith_relation_mul)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'arith_relation_bw) in - Obj.repr( -# 332 "src/aorai/yaparser.mly" - ( _1 ) -# 966 "src/aorai/yaparser.ml" - : 'arith_relation_mul)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'access_or_const) in - Obj.repr( -# 336 "src/aorai/yaparser.mly" - ( _1 ) -# 973 "src/aorai/yaparser.ml" - : 'arith_relation_bw)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_bw) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'access_or_const) in - Obj.repr( -# 337 "src/aorai/yaparser.mly" - ( PBinop(Bbw_and,_1,_3) ) -# 981 "src/aorai/yaparser.ml" - : 'arith_relation_bw)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_bw) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'access_or_const) in - Obj.repr( -# 338 "src/aorai/yaparser.mly" - ( PBinop(Bbw_or,_1,_3) ) -# 989 "src/aorai/yaparser.ml" - : 'arith_relation_bw)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'arith_relation_bw) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'access_or_const) in - Obj.repr( -# 339 "src/aorai/yaparser.mly" - ( PBinop(Bbw_xor,_1,_3) ) -# 997 "src/aorai/yaparser.ml" - : 'arith_relation_bw)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 343 "src/aorai/yaparser.mly" - ( PCst (IntConstant _1) ) -# 1004 "src/aorai/yaparser.ml" - : 'access_or_const)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 344 "src/aorai/yaparser.mly" - ( PUnop (Uminus, PCst (IntConstant _2)) ) -# 1011 "src/aorai/yaparser.ml" - : 'access_or_const)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'access) in - Obj.repr( -# 345 "src/aorai/yaparser.mly" - ( _1 ) -# 1018 "src/aorai/yaparser.ml" - : 'access_or_const)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'arith_relation) in - Obj.repr( -# 346 "src/aorai/yaparser.mly" - ( _2 ) -# 1025 "src/aorai/yaparser.ml" - : 'access_or_const)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'access) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 351 "src/aorai/yaparser.mly" - ( PField(_1,_3) ) -# 1033 "src/aorai/yaparser.ml" - : 'access)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 3 : 'access) in - let _3 = (Parsing.peek_val __caml_parser_env 1 : 'access_or_const) in - Obj.repr( -# 352 "src/aorai/yaparser.mly" - ( PArrget(_1,_3) ) -# 1041 "src/aorai/yaparser.ml" - : 'access)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'access_leaf) in - Obj.repr( -# 353 "src/aorai/yaparser.mly" - (_1) -# 1048 "src/aorai/yaparser.ml" - : 'access)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'access) in - Obj.repr( -# 357 "src/aorai/yaparser.mly" - ( PUnop (Ustar,_2) ) -# 1055 "src/aorai/yaparser.ml" - : 'access_leaf)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 4 : string) in - let _5 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 358 "src/aorai/yaparser.mly" - ( PPrm(_1,_5) ) -# 1063 "src/aorai/yaparser.ml" - : 'access_leaf)) -; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in - Obj.repr( -# 359 "src/aorai/yaparser.mly" - ( PVar _1 ) -# 1070 "src/aorai/yaparser.ml" - : 'access_leaf)) -; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'access) in - Obj.repr( -# 360 "src/aorai/yaparser.mly" - ( _2 ) -# 1077 "src/aorai/yaparser.ml" - : 'access_leaf)) -(* Entry main *) -; (fun __caml_parser_env -> raise (Parsing.YYexit (Parsing.peek_val __caml_parser_env 0))) -|] -let yytables = - { Parsing.actions=yyact; - Parsing.transl_const=yytransl_const; - Parsing.transl_block=yytransl_block; - Parsing.lhs=yylhs; - Parsing.len=yylen; - Parsing.defred=yydefred; - Parsing.dgoto=yydgoto; - Parsing.sindex=yysindex; - Parsing.rindex=yyrindex; - Parsing.gindex=yygindex; - Parsing.tablesize=yytablesize; - Parsing.table=yytable; - Parsing.check=yycheck; - Parsing.error_function=parse_error; - Parsing.names_const=yynames_const; - Parsing.names_block=yynames_block } -let main (lexfun : Lexing.lexbuf -> token) (lexbuf : Lexing.lexbuf) = - (Parsing.yyparse yytables 1 lexfun lexbuf : Promelaast.parsed_automaton) diff -Nru frama-c-20140301+neon+dfsg/src/aorai/yaparser.mli frama-c-20150201+sodium+dfsg/src/aorai/yaparser.mli --- frama-c-20140301+neon+dfsg/src/aorai/yaparser.mli 2014-03-12 15:07:54.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/yaparser.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -type token = - | CALL_OF - | RETURN_OF - | CALLORRETURN_OF - | IDENTIFIER of (string) - | INT of (string) - | LCURLY - | RCURLY - | LPAREN - | RPAREN - | LSQUARE - | RSQUARE - | LBRACELBRACE - | RBRACERBRACE - | RARROW - | TRUE - | FALSE - | NOT - | DOT - | AMP - | COLON - | SEMI_COLON - | COMMA - | PIPE - | CARET - | QUESTION - | COLUMNCOLUMN - | EQ - | LT - | GT - | LE - | GE - | NEQ - | PLUS - | MINUS - | SLASH - | STAR - | PERCENT - | OR - | AND - | OTHERWISE - | EOF - -val main : - (Lexing.lexbuf -> token) -> Lexing.lexbuf -> Promelaast.parsed_automaton diff -Nru frama-c-20140301+neon+dfsg/src/aorai/yaparser.mly frama-c-20150201+sodium+dfsg/src/aorai/yaparser.mly --- frama-c-20140301+neon+dfsg/src/aorai/yaparser.mly 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/aorai/yaparser.mly 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Aorai plug-in of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* INRIA (Institut National de Recherche en Informatique et en */ diff -Nru frama-c-20140301+neon+dfsg/src/buckx/buckx_c.c frama-c-20150201+sodium+dfsg/src/buckx/buckx_c.c --- frama-c-20140301+neon+dfsg/src/buckx/buckx_c.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/buckx/buckx_c.c 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat à l'énergie atomique et aux énergies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/src/buckx/buckx.ml frama-c-20150201+sodium+dfsg/src/buckx/buckx.ml --- frama-c-20140301+neon+dfsg/src/buckx/buckx.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/buckx/buckx.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,79 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -module type WeakHashable = -sig - type t - val equal : t -> t -> bool - val hash : t -> int - val pretty : Format.formatter -> t -> unit - val id : string -end - -module type S = sig - type data - type t - - val create : int -> t - val merge : t -> data -> data - val iter : t -> (data -> unit) -> unit - val clear : t -> unit - val release : t -> unit - val shallow_copy : t -> t - val addr : t -> int - val overwrite : old:t -> fresh:t -> unit - val pretty_debug : Format.formatter -> t -> int -> unit -end;; - -module MakeBig(H:WeakHashable) = -struct - module W = Weak.Make(H) - type t = W.t ref - let addr _t = 0 - type data = H.t - let create c = ref (W.create c) - let merge t d = W.merge !t d - let iter t f = W.iter f (!t) - let clear t = W.clear (!t) - let release _t = () - let pretty_debug _ = assert false - let shallow_copy t = ref !t - let overwrite ~old ~fresh = - old := !fresh -end - - - -let () = - let gc_params = Gc.get () in - Gc.set - { gc_params with - Gc.minor_heap_size = 1 lsl 18 ; - major_heap_increment = 1 lsl 22; - (* space_overhead = 40 ; max_overhead = 100 *) - }; - -(* -Local Variables: -compile-command: "LC_ALL=C make -C ../.." -End: -*) diff -Nru frama-c-20140301+neon+dfsg/src/buckx/buckx.mli frama-c-20150201+sodium+dfsg/src/buckx/buckx.mli --- frama-c-20140301+neon+dfsg/src/buckx/buckx.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/buckx/buckx.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -(** Undocumented. - Do not use this module if you don't know what you are doing. *) - -(* [JS 2011/10/03] To the authors/users of this module: please document it. *) - -module type WeakHashable = -sig - type t - val equal : t -> t -> bool - val hash : t -> int - val pretty : Format.formatter -> t -> unit - val id : string -end - - -module type S = sig - type data - type t - - val create : int -> t - val merge : t -> data -> data - val iter : t -> (data -> unit) -> unit - val clear : t -> unit - val release : t -> unit - val shallow_copy : t -> t - val addr : t -> int - val overwrite : old:t -> fresh:t -> unit - val pretty_debug : Format.formatter -> t -> int -> unit -end - -module MakeBig (H : WeakHashable) : (S with type data = H.t) - -(* -Local Variables: -compile-command: "LC_ALL=C make -C ../.." -End: -*) diff -Nru frama-c-20140301+neon+dfsg/src/constant_propagation/Constant_Propagation.mli frama-c-20150201+sodium+dfsg/src/constant_propagation/Constant_Propagation.mli --- frama-c-20140301+neon+dfsg/src/constant_propagation/Constant_Propagation.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/constant_propagation/Constant_Propagation.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/constant_propagation/propagationParameters.ml frama-c-20150201+sodium+dfsg/src/constant_propagation/propagationParameters.ml --- frama-c-20140301+neon+dfsg/src/constant_propagation/propagationParameters.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/constant_propagation/propagationParameters.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -37,7 +37,7 @@ let () = SemanticConstFolding.add_aliases ["-semantic-const-folding"] module SemanticConstFold = - StringSet + Fundec_set (struct let option_name = "-scf-fct" let arg_name = "f1, ..., fn" @@ -62,6 +62,15 @@ end) let () = ExpandLogicContext.add_aliases ["-semantic-const-fold-logic"] +module Project_name = + String + (struct + let option_name = "-scf-project-name" + let default = "propagated" + let arg_name = "" + let help = "name of the generated project (default is `propagated`)" + end) + (* Local Variables: compile-command: "make -C ../.." diff -Nru frama-c-20140301+neon+dfsg/src/constant_propagation/propagationParameters.mli frama-c-20150201+sodium+dfsg/src/constant_propagation/propagationParameters.mli --- frama-c-20140301+neon+dfsg/src/constant_propagation/propagationParameters.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/constant_propagation/propagationParameters.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -21,9 +21,11 @@ (**************************************************************************) module SemanticConstFolding: Parameter_sig.Bool -module SemanticConstFold: Parameter_sig.String_set +module SemanticConstFold: Parameter_sig.Fundec_set module CastIntro: Parameter_sig.Bool module ExpandLogicContext: Parameter_sig.Bool +module Project_name: Parameter_sig.String + include Log.Messages (* diff -Nru frama-c-20140301+neon+dfsg/src/constant_propagation/register.ml frama-c-20150201+sodium+dfsg/src/constant_propagation/register.ml --- frama-c-20140301+neon+dfsg/src/constant_propagation/register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/constant_propagation/register.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,217 +20,307 @@ (* *) (**************************************************************************) -open Cil open Cil_types module FC_file = File open Cil_datatype exception Cannot_expand +exception Cannot_change + +(* Build the term [p+i], assuming that [p] has pointer type *) +let plus_pi ~loc p i = + if Integer.(equal zero i) then + p + else + Cil.mkBinOp ~loc PlusPI p (Cil.kinteger64 ~loc i) (** This visitor also performs a deep copy. *) class propagate project fnames ~cast_intro = object(self) inherit Visitor.frama_c_copy project - val mutable operate = false - + (* Variables which have already been declared earlier in the list of + globals. Varinfos of the old project. *) val mutable known_globals = Varinfo.Set.empty + (* Variables whose declaration must be put before the global we are visiting. + Reset before each global. Varinfos of the _new_ project. *) val mutable must_add_decl = Varinfo.Set.empty - method private on_current_stmt nothing f = - match self#current_stmt with - | None | Some ({ skind = Return _}) -> nothing - | Some _ when not operate -> nothing - | Some stmt -> f (Kstmt stmt) + method! vstmt_aux s= + (* Do not propagate on 'return' statements: one invariant of the AST is + that they must be of the form 'return v;' where 'v' is a variable *) + match s.skind with + | Return _ -> Cil.JustCopy + | _ -> Cil.DoChildren method! vfunc fundec = - let name = fundec.svar.vname in - operate <- - Datatype.String.Set.is_empty fnames - || Datatype.String.Set.mem name fnames; - if operate then + if Cil_datatype.Fundec.Set.is_empty fnames || + Cil_datatype.Fundec.Set.mem fundec fnames + then begin PropagationParameters.feedback ~level:2 "propagated constant in function %s" (fundec.svar.vname); - DoChildren + Cil.DoChildren + end else Cil.JustCopy - method! vexpr expr = - self#on_current_stmt - DoChildren - (fun ki -> - PropagationParameters.debug ~level:2 - "Replacing %a?" Printer.pp_exp expr; - let type_of_expr = typeOf expr in - try - begin match unrollType type_of_expr with - | (TInt _ - | TFloat _ - | TPtr _ - | TEnum _) -> () - | _ -> raise Cannot_expand - end; - let mkCast ~e ~newt = - (* introduce a new cast or do not expand [e] *) - let exp = mkCast e newt in - if cast_intro then - exp - else match exp.enode with - | CastE _ -> - if exp == e (* older cast, no new cast added *) then - exp - else - (* without [cast_intro], introducing such a cast is not - allowed: do not expand [e] *) - raise Cannot_expand - | _ -> - (* remember the change done by [mkCast] (if any). - note that [mkCast] make some modifications, even if it - does not introduce a new cast. *) - exp - in - let evaled = !Db.Value.access_expr ki expr in - let k,m = Cvalue.V.find_lonely_binding evaled in - let can_replace vi = - vi.vglob || - Extlib.may_map - (Kernel_function.is_formal_or_local vi) ~dft:false - self#current_kf - in - begin match k with - | Base.Var(vi,_) | Base.Initialized_Var (vi,_) - when (PropagationParameters.ExpandLogicContext.get () - || not vi.vlogic) - && can_replace vi -> - if vi.vglob && not (Varinfo.Set.mem vi known_globals) then begin - let vi' = - Visitor.visitFramacVarDecl (self :> Visitor.frama_c_visitor) vi - in - must_add_decl <- Varinfo.Set.add vi' must_add_decl; - if Cil.isFunctionType vi.vtype then begin - let kf = Globals.Functions.get vi in - let new_kf = Cil.memo_kernel_function self#behavior kf in - Queue.add (fun () -> Globals.Functions.register new_kf) - self#get_filling_actions; - end; - end; (* This is a pointer coming for C code *) - PropagationParameters.debug - "Trying replacing %a from a pointer value {&%a + %a}" - Printer.pp_exp expr - Base.pretty k - Ival.pretty m; - let base = mkAddrOrStartOf ~loc:expr.eloc (var vi) in - let offset = Ival.project_int m in (* these are bytes *) - let shifted = - if Abstract_interp.Int.is_zero offset then base - else - let offset,rem = - let sizeof_pointed = - try - Int_Base.project - (if isArrayType vi.vtype then - Bit_utils.osizeof_pointed vi.vtype - else Bit_utils.osizeof vi.vtype) - with - | Int_Base.Error_Top -> raise Cannot_expand - in - (Abstract_interp.Int.pos_div offset sizeof_pointed), - (Abstract_interp.Int.pos_rem offset sizeof_pointed) - in - let shifted = - if Abstract_interp.Int.is_zero offset - then base - else - let v1 = Abstract_interp.Int.cast - ~signed:true - ~size:(Abstract_interp.Int.of_int 64) - ~value:offset - in - increm64 base v1 - in - if Abstract_interp.Int.is_zero rem then shifted - else let v1 = Abstract_interp.Int.cast - ~signed:true - ~size:(Abstract_interp.Int.of_int 64) - ~value:rem - in - increm64 (mkCast ~e:shifted ~newt:Cil.charPtrType) v1 + method private add_decl_non_source_var vi = + PropagationParameters.debug ~level:2 + "Need to declare %a earlier" Printer.pp_varinfo vi; + let vi' = + Visitor.visitFramacVarDecl (self :> Visitor.frama_c_visitor) vi + in + must_add_decl <- Varinfo.Set.add vi' must_add_decl; + known_globals <- Varinfo.Set.add vi known_globals; + if Cil.isFunctionType vi.vtype then begin + let kf = Globals.Functions.get vi in + let new_kf = Cil.memo_kernel_function self#behavior kf in + Queue.add (fun () -> Globals.Functions.register new_kf) + self#get_filling_actions; + end + + (* introduce a new cast from [oldt] to [newt] or do not expand [e] *) + method private add_cast ~ignore_const_cast ~oldt ~newt e = + (* strip the superfleous 'const' attribute (see bts #1787) on + pointed values. *) + let oldt, newt = + if ignore_const_cast then + match Cil.unrollType oldt, Cil.unrollType newt with + | TPtr(typ, attrs), TPtr(typ', attrs') -> + let drop_const ty = Cil.typeRemoveAttributes ["const"] ty in + TPtr(drop_const typ, attrs), TPtr(drop_const typ', attrs') + | _ -> oldt, newt + else + oldt, newt + in + let exp = Cil.mkCastT e oldt newt in + if cast_intro then + exp + else match exp.enode with + | CastE _ -> + if exp == e (* older cast, no new cast added *) then + exp + else begin + (* without [cast_intro], introducing such a cast is not + allowed: do not expand [e] *) + PropagationParameters.debug + ~level:2 + "Need a cast introduction (force using -scf-allow-cast option)"; + raise Cannot_expand + end + | _ -> + (* remember the change done by [mkCastT] (if any). + note that [mkCastT] make some modifications, even if it + does not introduce a new cast. *) + exp + + (* Make sure that [expr] is in the original project. *) + method private propagated expr ~ignore_const_cast = + PropagationParameters.debug ~level:2 + "Replacing %s%a?" + (if ignore_const_cast then "(without const* cast) " else "") + Printer.pp_exp expr; + try + let loc = expr.eloc in + let typ = Cil.typeOf expr in + let typ_e = Cil.unrollType typ in + begin match typ_e with + | (TInt _ + | TFloat _ + | TPtr _ + | TEnum _) -> () + | _ -> raise Cannot_expand + end; + let ki = match self#current_stmt with + | None -> raise Cannot_change + | Some s -> Kstmt s + in + let evaled = !Db.Value.access_expr ki expr in + let k,m = Cvalue.V.find_lonely_binding evaled in + let can_replace vi = + (* can replace the current expr by [vi] iff (1) it is a source var, or + expansion of non-source var is allowed. *) + (vi.vsource || PropagationParameters.ExpandLogicContext.get ()) + && + (* (2) [vi] is bound in this function *) + (vi.vglob || + Extlib.may_map + (Kernel_function.is_formal_or_local vi) ~dft:false + self#current_kf) + in + let change_to = match k with + | Base.Var(vi,_) + | Base.Initialized_Var (vi,_) when can_replace vi -> + if vi.vglob && not (Varinfo.Set.mem vi known_globals) then + self#add_decl_non_source_var vi; + PropagationParameters.debug + "Trying replacing %a from a pointer value {&%a + %a}" + Printer.pp_exp expr Base.pretty k Ival.pretty m; + let offset = Ival.project_int m in (* these are bytes *) + let expr' = + try + if not (Cil.isPointerType typ_e) then + raise Bit_utils.NoMatchingOffset; + let typ_pointed = Cil.unrollType (Cil.typeOf_pointed typ_e) in + if Cil.isVoidType typ_pointed then + raise Bit_utils.NoMatchingOffset; + let offset = Integer.mul offset Integer.eight in + let m = Bit_utils.MatchType typ_pointed in + let off, _ = Bit_utils.(find_offset vi.vtype ~offset m) in + Cil.mkAddrOrStartOf ~loc (Var vi, off) + with Bit_utils.NoMatchingOffset -> + (* Build [((char* )&t[idx])+rem] when vi is an array, or + [(char* )(&vi+idx)+rem] otherwise. Automatically simplify + when [idx] or [rem] is zero. *) + let array, idx, rem = + let array, sizeof_pointed = + let array = Cil.isArrayType vi.vtype in + let size = if array + then Bit_utils.osizeof_pointed vi.vtype + else Bit_utils.osizeof vi.vtype in - let change_to = (* Give it the right type! *) - mkCast ~e:shifted ~newt:type_of_expr + array, Int_Base.project size + in + array, + (Integer.pos_div offset sizeof_pointed), + (Integer.pos_rem offset sizeof_pointed) + in + let expr' = + if array then + let off_idx = + if Integer.is_zero idx + then NoOffset + else Index (Cil.kinteger64 ~loc idx, NoOffset) in - PropagationParameters.debug "Replacing %a with %a" - Printer.pp_exp expr - Printer.pp_exp change_to; - ChangeDoChildrenPost (change_to, fun x -> x) - | Base.Null -> - let e = - begin - try - (* This is an integer *) - let v = Ival.project_int m in - PropagationParameters.debug - "Trying to replace %a with a numeric value: %a" - Printer.pp_exp expr - Abstract_interp.Int.pretty v; - try - let v1 = Abstract_interp.Int.cast - ~signed:true - ~size:(Abstract_interp.Int.of_int 64) - ~value:v - in - PropagationParameters.debug ~level:2 - "Before v=%a after as signed int64 v1=%a" - Abstract_interp.Int.pretty v - Abstract_interp.Int.pretty v1; - kinteger64 ~loc:expr.eloc - IULongLong - v1 - with Failure _ -> raise Cannot_expand - with Ival.Not_Singleton_Int-> - (* TODO: floats *) - raise Cannot_expand - end - in let change_to = (* Give it the right type ! *) - mkCast ~e ~newt:(type_of_expr) - in - PropagationParameters.debug "Replacing %a with %a (was %a)" - Printer.pp_exp expr - Printer.pp_exp change_to - Printer.pp_exp e; - ChangeDoChildrenPost(change_to,fun x -> x) - | Base.String _ | Base.Var _ | Base.Initialized_Var _ - | Base.CLogic_Var _ -> DoChildren - end - with Not_found | Cannot_expand -> DoChildren) + Cil.mkAddrOrStartOf ~loc (Var vi, off_idx) + else + let start = Cil.mkAddrOrStartOf ~loc (Var vi, NoOffset) in + plus_pi ~loc start idx + in + if Integer.is_zero rem then expr' + else + plus_pi ~loc + (self#add_cast + ~ignore_const_cast:false + ~oldt:(Cil.typeOf expr') + ~newt:Cil.charPtrType + expr') + rem + in + (* preserve typing: propagating constant could change the type + of the expression. We have to put back the original type. *) + self#add_cast + ~ignore_const_cast + ~oldt:(Cil.typeOf expr') + ~newt:typ + expr' + + | Base.Null -> + let const_integer m ikind = + try + let v = Ival.project_int m in + if not (Cil.fitsInInt ikind v) then + PropagationParameters.error "Constant found by Value (%a) \ + does not fit inside type %a. Please report" + Abstract_interp.Int.pretty v + Printer.pp_typ typ; + Cil.kinteger64 ~loc ~kind:ikind v + with Ival.Not_Singleton_Int -> raise Cannot_expand + and const_float m fkind = + try + let v = Ival.project_float m in + let f1,f2 = Ival.Float_abstract.min_and_max_float v in + if not (Ival.F.equal f1 f2) then raise Cannot_expand ; + let f = Ival.F.to_float f1 in + Cil.kfloat ~loc:expr.eloc fkind f + with Ival.F.Nan_or_infinite -> raise Cannot_expand + in + (match typ_e with + | TFloat (fkind, _) -> const_float m fkind + | TInt (ikind, _) | TEnum ({ ekind = ikind}, _) -> + const_integer m ikind + | _ -> raise Cannot_expand) + + | Base.String _ | Base.Var _ | Base.Initialized_Var _ + | Base.CLogic_Var _ -> raise Cannot_change + in + PropagationParameters.debug "Replacing %a with %a" + Printer.pp_exp expr + Printer.pp_exp change_to; + Some change_to + with + | Cannot_change -> None + | Not_found | Cannot_expand | Cil.Not_representable + | Int_Base.Error_Top as e -> + PropagationParameters.debug "Replacement failed %s" + (Printexc.to_string e); + None + + method! vexpr expr = + (* Start by trying to constant-propagate all of [expr]. Casts are allowed + only if -scf-allow-cast is set *) + match self#propagated expr ~ignore_const_cast:false with + | Some expr' -> Cil.ChangeDoChildrenPost (expr', fun x -> x) + | None -> begin + (* Global constant propagation of [expr] failed. We try a special + const-folding, AND simplify the sub-expressions in all cases *) + match expr.enode with + | Lval (Mem exp_mem, off) -> begin + (* [expr] is a Mem. Try to see if we can propagate [exp_mem] into + something simpler, because the result will be of the form + [Var _, offs'], which can be simplified under a [Mem]. This time, + we ignore const-related casts when simplifying [exp_mem], because + they will disappear when the l-value is dereferenced. *) + match self#propagated exp_mem ~ignore_const_cast:true with + | Some exp_mem' -> + let lv = Cil.new_exp expr.eloc (Lval (Cil.mkMem exp_mem' off)) in + Cil.ChangeDoChildrenPost (lv, fun x -> x) + | None -> Cil.DoChildren + end + | _ -> Cil.DoChildren + end method! vvdec v = if v.vglob then begin known_globals <- Varinfo.Set.add v known_globals; end; - DoChildren + Cil.DoChildren - method! vglob_aux _ = + method! vglob_aux g = must_add_decl <- Varinfo.Set.empty; - let add_decl l = + (* Check if [g] has already been declared earlier, due to being used in + some earlier values. If so, we will skip [g]. We do this check now and + not in [add_decls], because [self#vvdec] will mark g as known. *) + let g_is_known = match g with + | GVarDecl (_, vi, _) -> Varinfo.Set.mem vi known_globals + | _ -> false + in + let add_decls l = + (* Do not re-add a declaration for g if it is known. *) + let l = if g_is_known then [] else l in + (* Add declarations for the globals that are referenced in g's propagated + value. *) Varinfo.Set.fold (fun x l -> PropagationParameters.feedback ~level:2 "Adding declaration of global %a" Printer.pp_varinfo x; GVarDecl(Cil.empty_funspec(),x,x.vdecl)::l) must_add_decl l - in DoChildrenPost add_decl + in + Cil.DoChildrenPost add_decls method! vlval lv = let simplify (host,offs as lv) = match host with - | Mem e -> mkMem e offs (* canonicalize *) - | Var _ -> lv - in ChangeDoChildrenPost(lv, simplify) + | Mem e -> Cil.mkMem e offs (* canonize in case the propagation + simplified [lv] *) + | Var _ -> lv + in + Cil.ChangeDoChildrenPost(lv, simplify) end module Result_pair = - Datatype.Pair_with_collections(Datatype.String.Set)(Datatype.Bool) + Datatype.Pair_with_collections(Cil_datatype.Fundec.Set)(Datatype.Bool) (struct let module_name = "Constant_propagation.Register.Result_pair.t" end) module Result = State_builder.Hashtbl @@ -243,9 +333,14 @@ let size = 7 let name = "Semantical constant propagation" let dependencies = - [ Db.Value.self; PropagationParameters.CastIntro.self ] + [ Db.Value.self; + PropagationParameters.CastIntro.self; + PropagationParameters.Project_name.self ] end) +let selection_command_line_option = + State_selection.singleton PropagationParameters.SemanticConstFolding.self + let journalized_get = let get fnames cast_intro = Result.memo @@ -253,10 +348,11 @@ !Db.Value.compute (); let fresh_project = FC_file.create_project_from_visitor - "propagated" + (PropagationParameters.Project_name.get ()) (fun prj -> new propagate prj fnames cast_intro) in let ctx = Parameter_state.get_selection_context () in + let ctx = State_selection.diff ctx selection_command_line_option in Project.copy ~selection:ctx fresh_project; fresh_project) (fnames, cast_intro) @@ -264,7 +360,7 @@ Journal.register "!Db.Constant_Propagation.get" (Datatype.func2 - Datatype.String.Set.ty + Cil_datatype.Fundec.Set.ty ~label2:("cast_intro",None) Datatype.bool Project.ty) @@ -279,15 +375,19 @@ PropagationParameters.feedback "beginning constant propagation"; let fnames = PropagationParameters.SemanticConstFold.get () in let cast_intro = PropagationParameters.CastIntro.get () in - let propagated = !Db.Constant_Propagation.get fnames cast_intro in + let propagated = get fnames cast_intro in if PropagationParameters.SemanticConstFolding.get () then FC_file.pretty_ast ~prj:propagated (); - PropagationParameters.feedback "constant propagation done" + let project_name = Project.get_unique_name propagated in + PropagationParameters.feedback "@[constant propagation done%t@]" + (fun fmt -> + if project_name <> PropagationParameters.Project_name.get () then + Format.fprintf fmt ",@ result is in project@ `%s`" project_name) let main () = let force_semantic_folding = PropagationParameters.SemanticConstFolding.get () - || not (Datatype.String.Set.is_empty + || not (Cil_datatype.Fundec.Set.is_empty (PropagationParameters.SemanticConstFold.get ())) in (* must called the function stored in [Db] for journalisation purpose *) @@ -296,15 +396,14 @@ let () = Db.Main.extend main; Db.register Db.Journalization_not_required Db.Constant_Propagation.get get; - let _self = - Db.register_compute - "Constant_Propagation.compute" - [ PropagationParameters.SemanticConstFold.self; - PropagationParameters.SemanticConstFolding.self; - Result.self ] - Db.Constant_Propagation.compute - compute; - in () + ignore + (Db.register_compute + "Constant_Propagation.compute" + [ PropagationParameters.SemanticConstFold.self; + PropagationParameters.SemanticConstFolding.self; + Result.self ] + Db.Constant_Propagation.compute + compute) (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/constant_propagation/register.mli frama-c-20150201+sodium+dfsg/src/constant_propagation/register.mli --- frama-c-20140301+neon+dfsg/src/constant_propagation/register.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/constant_propagation/register.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/dummy/hello_world/hello_world.ml frama-c-20150201+sodium+dfsg/src/dummy/hello_world/hello_world.ml --- frama-c-20140301+neon+dfsg/src/dummy/hello_world/hello_world.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/dummy/hello_world/hello_world.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/dummy/hello_world/Makefile frama-c-20150201+sodium+dfsg/src/dummy/hello_world/Makefile --- frama-c-20140301+neon+dfsg/src/dummy/hello_world/Makefile 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/dummy/hello_world/Makefile 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # diff -Nru frama-c-20140301+neon+dfsg/src/from/callwise.ml frama-c-20150201+sodium+dfsg/src/from/callwise.ml --- frama-c-20140301+neon+dfsg/src/from/callwise.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/from/callwise.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -41,7 +41,22 @@ with Not_found -> Kinstr.Hashtbl.add table callsite froms -let call_froms_stack = ref [] +(** State for the analysis of one function call *) +type from_state = { + current_function: Kernel_function.t (** Function being analyzed *); + value_initial_state: Db.Value.state (** State of Value at the beginning of + the call *); + table_for_calls: Function_Froms.t Kinstr.Hashtbl.t + (** State of the From plugin for each statement containing a function call + in the body of [current_function]. Updated incrementally each time + Value analyses such a statement *); +} + +(** The state of the callwise From analysis. Only the top of this callstack + is accessed. New calls are pushed on the stack when Value starts the + analysis of a function, and popped when the analysis finisheds. This + stack is manually synchronized with Value's callstack. *) +let call_froms_stack : from_state list ref = ref [] let record_callwise_dependencies_in_db call_site froms = try @@ -49,19 +64,20 @@ Tbl.replace call_site (Function_Froms.join previous froms) with Not_found -> Tbl.add call_site froms -let call_for_individual_froms (state, call_stack) = +let call_for_individual_froms (value_initial_state, call_stack) = if From_parameters.ForceCallDeps.get () then begin let current_function, call_site = List.hd call_stack in if not (!Db.Value.use_spec_instead_of_definition current_function) then - let table_for_current_function = Kinstr.Hashtbl.create 7 in + let table_for_calls = Kinstr.Hashtbl.create 7 in call_froms_stack := - (current_function,table_for_current_function) :: !call_froms_stack + { current_function; value_initial_state; table_for_calls } :: + !call_froms_stack else try - let _above_function, table = List.hd !call_froms_stack in + let { table_for_calls = table } = List.hd !call_froms_stack in let froms = From_compute.compute_using_prototype_for_state - state current_function + value_initial_state current_function in merge_call_froms table call_site froms; record_callwise_dependencies_in_db call_site froms; @@ -71,15 +87,15 @@ end let end_record call_stack froms = - let (current_function, call_site) = List.hd call_stack in + let (current_function_value, call_site) = List.hd call_stack in record_callwise_dependencies_in_db call_site froms; (* pop + record in top of stack the froms of function that just finished *) match !call_froms_stack with - | (current_function2, _) :: (((_caller, table) :: _) as tail) -> - if current_function2 != current_function then + | {current_function} :: ({table_for_calls = table} :: _ as tail) -> + if current_function_value != current_function then From_parameters.fatal "calldeps %a != %a@." - Kernel_function.pretty current_function (* g *) - Kernel_function.pretty current_function2; (* f *) + Kernel_function.pretty current_function + Kernel_function.pretty current_function_value; call_froms_stack := tail; merge_call_froms table call_site froms @@ -99,51 +115,32 @@ end) let compute_call_from_value_states current_function states = - let module Froms_To_Use = - struct - let get _f callsite = - let _current_function, table = List.hd !call_froms_stack in - try Kinstr.Hashtbl.find table callsite - with Not_found -> raise From_compute.Call_did_not_take_place - end - in - let module Values_To_Use = struct - let get_stmt_state s = + let module To_Use = struct + let get_from_call _f callsite = + let { table_for_calls } = List.hd !call_froms_stack in + try Kinstr.Hashtbl.find table_for_calls (Cil_types.Kstmt callsite) + with Not_found -> raise From_compute.Call_did_not_take_place + + let get_value_state s = try Stmt.Hashtbl.find states s with Not_found -> Cvalue.Model.bottom - let lval_to_zone_with_deps s ~deps ~for_writing lv = - let state = get_stmt_state s in - !Db.Value.lval_to_zone_with_deps_state state ~deps ~for_writing lv - - let expr_to_kernel_function kinstr ~deps exp = - let state = get_stmt_state kinstr in - !Db.Value.expr_to_kernel_function_state state ~deps exp - - let access_expr stmt expr = - let state = get_stmt_state stmt in - !Db.Value.eval_expr ~with_alarms:CilE.warn_none_mode state expr + let keep_base kf base = + let fundec = Kernel_function.get_definition kf in + not (Base.is_formal_or_local base fundec) + + let cleanup_and_save _kf froms = froms end in - let module Recording_To_Do = - struct - let accept_base_in_lmap kf base = - let fundec = Kernel_function.get_definition kf in - not (Base.is_formal_or_local base fundec) - let final_cleanup _kf froms = froms - let record_kf _kf _last_froms = () - end - in - let module Callwise_Froms = - From_compute.Make(Values_To_Use)(Froms_To_Use)(Recording_To_Do) - in + let module Callwise_Froms = From_compute.Make(To_Use) in Callwise_Froms.compute_and_return current_function let record_for_individual_froms (call_stack, value_res) = if From_parameters.ForceCallDeps.get () then begin let froms = match value_res with - | Value_types.Normal states | Value_types.NormalStore (states, _) -> + | Value_types.Normal (states, _after_states) + | Value_types.NormalStore ((states, _after_states), _) -> let cur_kf, _ = List.hd call_stack in let froms = if !Db.Value.no_results (Kernel_function.get_definition cur_kf) then @@ -151,6 +148,12 @@ else compute_call_from_value_states cur_kf (Lazy.force states) in + let pre_state = match !call_froms_stack with + | [] -> assert false + | { value_initial_state } :: _ -> value_initial_state + in + if From_parameters.VerifyAssigns.get () then + !Db.Value.verify_assigns_froms cur_kf pre_state froms; (match value_res with | Value_types.NormalStore (_, memexec_counter) -> MemExec.replace memexec_counter froms diff -Nru frama-c-20140301+neon+dfsg/src/from/callwise.mli frama-c-20150201+sodium+dfsg/src/from/callwise.mli --- frama-c-20140301+neon+dfsg/src/from/callwise.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/from/callwise.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/from/from_compute.ml frama-c-20150201+sodium+dfsg/src/from/from_compute.ml --- frama-c-20140301+neon+dfsg/src/from/from_compute.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/from/from_compute.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -28,32 +28,12 @@ exception Call_did_not_take_place -module type Froms_To_Use_Sig = sig - val get : kernel_function -> kinstr -> Function_Froms.t -end - -module type Values_To_Use_Sig = sig - val lval_to_zone_with_deps : - stmt -> - deps:Locations.Zone.t option -> - for_writing:bool -> - Cil_types.lval -> - Locations.Zone.t * Locations.Zone.t * bool - - val expr_to_kernel_function : - stmt -> - deps:Locations.Zone.t option -> - Cil_types.exp -> Locations.Zone.t * Kernel_function.Hptset.t - - val get_stmt_state : stmt -> Db.Value.state - val access_expr : Cil_types.stmt -> Cil_types.exp -> Db.Value.t -end - -module type Recording_Sig = sig - val accept_base_in_lmap : kernel_function -> Base.t -> bool - val final_cleanup: kernel_function -> Function_Froms.t -> Function_Froms.t - val record_kf : kernel_function -> Function_Froms.t -> unit - (* function to call at the end of the treatment of a function *) +module type To_Use = +sig + val get_from_call : kernel_function -> stmt -> Function_Froms.t + val get_value_state : stmt -> Db.Value.state + val keep_base : kernel_function -> Base.t -> bool + val cleanup_and_save : kernel_function -> Function_Froms.t -> Function_Froms.t end let rec find_deps_no_transitivity state expr = @@ -69,7 +49,7 @@ ~deps:Zone.bottom lv in - Function_Froms.Deps.data_deps deps + Function_Froms.Deps.from_data_deps deps | CastE (_, e)|UnOp (_, e, _) -> find_deps_no_transitivity state e | BinOp (_, e1, e2, _) -> @@ -88,10 +68,6 @@ Zone.pretty ind_deps Zone.pretty direct_deps; { Function_Froms.Deps.data = direct_deps; indirect = ind_deps } -let update z exact new_v memory = - Function_Froms.Memory.add_binding exact memory z new_v - - let compute_using_prototype_for_state state kf = let varinfo = Kernel_function.get_vi kf in let behaviors = !Db.Value.valid_behaviors kf state in @@ -99,7 +75,10 @@ let return_deps,deps = match assigns with | WritesAny -> - Function_Froms.(Memory.LOffset.degenerate Deps.top, Memory.top) + From_parameters.warning "no assigns clauses@ for function %a.@ \ + Results@ will be@ imprecise." + Kernel_function.pretty kf; + Function_Froms.Memory.(top_return, top) | Writes assigns -> let (rt_typ,_,_,_) = splitFunctionTypeVI varinfo in let input_zone out ins = @@ -108,26 +87,36 @@ in let treat_assign acc (out, ins) = try - let output_locs, _deps = - !Db.Properties.Interp.loc_to_locs - ~result:None state out.it_content + let (output_loc_under, output_loc_over, _deps) = + !Db.Properties.Interp.loc_to_loc_under_over + ~result:None state out.it_content in let input_zone = input_zone out ins in - let treat_one_output acc out_loc = - let exact = Location_Bits.cardinal_zero_or_one out_loc.loc in - let output_zone = - Locations.enumerate_valid_bits ~for_writing:true out_loc - in - let overlap = Zone.intersects output_zone input_zone in - let exact = exact && not overlap in - (* assign clauses do not let us specify address - dependencies for now, so we assume it is all - data dependencies *) - let input_deps = Function_Froms.Deps.data_deps input_zone in - Function_Froms.Memory.add_binding ~exact - acc output_zone input_deps + (* assign clauses do not let us specify address + dependencies for now, so we assume it is all data + dependencies *) + let input_deps = + Function_Froms.Deps.from_data_deps input_zone + in + (* Weak update of the over-approximation of the zones assigned *) + let acc = Function_Froms.Memory.add_binding_loc ~exact:false + acc output_loc_over input_deps in + let output_loc_under_zone = Locations.enumerate_valid_bits_under + ~for_writing:true output_loc_under in + (* Now, perform a strong update on the zones that are guaranteed + to be assigned (under-approximation) AND that do not depend + on themselves. + Note: here we remove an overapproximation from an + underapproximation to get an underapproximation, which is not + the usual direction. It works here because diff on non-top + zones is an exact operation. *) + let sure_out_zone = + Zone.(if equal top input_zone then bottom + else diff output_loc_under_zone input_zone) in - List.fold_left treat_one_output acc output_locs + let acc = Function_Froms.Memory.add_binding ~exact:true + acc sure_out_zone input_deps in + acc with Invalid_argument "not an lvalue" -> From_parameters.result ~once:true ~current:true "Unable to extract assigns in %a" @@ -138,7 +127,7 @@ let zone_from = input_zone out from in (* assign clauses do not let us specify address dependencies for now, so we assume it is all data dependencies *) - let inputs_deps = Function_Froms.Deps.data_deps zone_from in + let inputs_deps = Function_Froms.Deps.from_data_deps zone_from in try let coffs = !Db.Properties.Interp.loc_to_offset ~result:None out.it_content @@ -146,22 +135,17 @@ List.fold_left (fun acc coff -> let (base,width) = bitsOffset rt_typ coff in - Function_Froms.Memory.LOffset.add_iset - ~exact:true - (Lattice_Interval_Set.Int_Intervals.from_ival_size - (Ival.of_int base) - (Int_Base.inject (Int.of_int width))) - inputs_deps - acc) + let size = Int_Base.inject (Int.of_int width) in + Function_Froms.Memory.(add_to_return + ~start:base ~size ~m:acc inputs_deps) + ) acc coffs with Invalid_argument "not an lvalue" | SizeOfError _ -> From_parameters.result ~once:true ~current:true "Unable to extract a proper offset. \ Using FROM for the whole \\result"; - Function_Froms.Memory.LOffset.add_iset ~exact:false - (Lattice_Interval_Set.Int_Intervals.from_ival_size - (Ival.of_int 0) (Bit_utils.sizeof rt_typ)) - inputs_deps acc + let size = Bit_utils.sizeof rt_typ in + Function_Froms.(Memory.add_to_return ~size ~m:acc inputs_deps) in let return_assigns, other_assigns = List.fold_left @@ -173,17 +157,13 @@ let return_assigns = match return_assigns with | [] when Cil.isVoidType rt_typ -> - Function_Froms.Memory.LOffset.empty + Function_Froms.Memory.default_return | [] -> (* \from unspecified. *) - Function_Froms.( - Memory.LOffset.add_iset ~exact:true - (Lattice_Interval_Set.Int_Intervals.from_ival_size - (Ival.of_int 0) (Bit_utils.sizeof rt_typ)) - Deps.top - Memory.LOffset.empty) + let size = Bit_utils.sizeof rt_typ in + Function_Froms.Memory.top_return_size size | _ -> List.fold_left treat_ret_assign - Function_Froms.Memory.LOffset.empty return_assigns + Function_Froms.Memory.default_return return_assigns in return_assigns, List.fold_left @@ -201,13 +181,10 @@ let decide_none _base z = z in let decide_some z1 z2 = Zone.join z1 z2 in symmetric_merge ~cache:("From_compute.ZoneStmtMap.join", ()) - ~decide_none ~decide_some + ~empty_neutral:true ~decide_none ~decide_some end -module Make - (Values_To_Use:Values_To_Use_Sig) - (Froms_To_Use: Froms_To_Use_Sig) - (Recording_To_Do: Recording_Sig) = +module Make (To_Use: To_Use) = struct type t' = { additional_deps_table : ZoneStmtMap.t; @@ -229,6 +206,7 @@ let rebuild_additional_deps map = ZoneStmtMap.fold (fun _ z accz -> Zone.join z accz) map Zone.bottom + (** given a [Function_Froms.Deps.t], apply [f] on both components and merge the result: depending directly on an indirect dependency -> indirect, @@ -242,12 +220,44 @@ { data = data; indirect = ind } + (** Bind all the given variables to [Assigned \from \nothing]. This function + is always called on local variables. We do *not* want to bind a local + variable [v] to Unassigned, as otherwise we could get some dependencies + that refer to [v] (when [v] is not guaranteed to be always assigned, or + for padding in local structs), and that would need to be removed when v + goes out of scope. Moreover, semantically, [v] *is* assigned (albeit to + "uninitalized", which represents an indefinite part of the stack). We + do not attemps to track this "uninitalized" information in From, as this + is redundant with the work done by Value -- hence the use of [\nothing].*) + let bind_locals vars m = + let aux_local acc vi = + (* Consider that local are initialized to a constant value *) + Function_Froms.Memory.bind_var vi Function_Froms.Deps.bottom acc + in + if Function_Froms.Memory.is_bottom m + then m + else List.fold_left aux_local m vars + let find stmt deps_tbl expr = - let state = Values_To_Use.get_stmt_state stmt in + let state = To_Use.get_value_state stmt in let pre_trans = find_deps_no_transitivity state expr in merge_deps (fun d -> Function_Froms.Memory.find_precise deps_tbl d) pre_trans + let lval_to_zone_with_deps stmt ~for_writing lv = + let state = To_Use.get_value_state stmt in + !Db.Value.lval_to_zone_with_deps_state + state ~deps:(Some Zone.bottom) ~for_writing lv + + let lval_to_precise_loc_with_deps stmt ~for_writing lv = + let state = To_Use.get_value_state stmt in + let deps, loc = + !Db.Value.lval_to_precise_loc_with_deps_state + state ~deps:(Some Zone.bottom) lv + in + let exact = Precise_locs.valid_cardinal_zero_or_one ~for_writing loc in + deps, loc, exact + let empty_from = { additional_deps_table = ZoneStmtMap.empty; additional_deps = Zone.bottom; @@ -265,36 +275,9 @@ let callwise_states_with_formals = Stmt.Hashtbl.create 7 - type substit = - Froms of Function_Froms.Deps.t - - let cached_substitute call_site_froms extra_loc = - let f k intervs = - Function_Froms.Memory.find_precise - call_site_froms - (Zone.inject k intervs) - in - let joiner = Function_Froms.Deps.join in - let projection base = Base.valid_range (Base.validity base) in - let zone_substitution = - Zone.cached_fold ~cache_name:"from substitution" ~temporary:true - ~f ~joiner ~empty:Function_Froms.Deps.bottom ~projection - in - let zone_substitution x = - try zone_substitution x - with Zone.Error_Top -> Function_Froms.Deps.top - in - let open Function_Froms.Deps in - fun { data; indirect } -> - let dirdeps = zone_substitution data in - let inddeps = zone_substitution indirect in - (* depending directly on an indirect dependency -> indirect, - depending indirectly on a direct dependency -> indirect *) - let ind = - Zone.(join dirdeps.indirect (join (to_zone inddeps) extra_loc)) - in - let dir = dirdeps.data in - { data = dir; indirect = ind } + let substitute call_site_froms extra_loc deps = + let subst_deps = Function_Froms.Memory.substitute call_site_froms deps in + Function_Froms.Deps.add_indirect_dep subst_deps extra_loc let display_one_from fmt v = Function_Froms.Memory.pretty fmt v.deps_table; @@ -318,8 +301,7 @@ Zone.join additional state.additional_deps } - let join_and_is_included smaller larger = - let old = larger and new_ = smaller in + let join_and_is_included new_ old = let additional_map, additional_zone, included = let mold = old.additional_deps_table in let mnew = new_.additional_deps_table in @@ -331,8 +313,10 @@ let new_z = Zone.join old.additional_deps new_.additional_deps in m, new_z, false in - let map = Function_Froms.Memory.join old.deps_table new_.deps_table in - let included' = Function_Froms.Memory.equal map old.deps_table in + let map, included' = + Function_Froms.Memory.join_and_is_included + new_.deps_table old.deps_table + in { deps_table = map; additional_deps_table = additional_map; additional_deps = additional_zone; }, @@ -340,38 +324,33 @@ let join old new_ = fst (join_and_is_included old new_) - let resolv_func_vinfo ?deps stmt funcexp = - Values_To_Use.expr_to_kernel_function ~deps stmt funcexp + (** Handle an assignement [lv = ...], the dependencies of the right-hand + side being stored in [deps_right]. *) + let transfer_assign stmt lv deps_right state = + (* The assigned location is [loc], whose address is computed from + [deps]. *) + let deps, loc, exact = + lval_to_precise_loc_with_deps stmt ~for_writing:true lv + in + let deps_of_deps = Function_Froms.Memory.find state.deps_table deps in + let all_indirect = Zone.join state.additional_deps deps_of_deps in + let deps = Function_Froms.Deps.add_indirect_dep deps_right all_indirect in + { state with deps_table = + Function_Froms.Memory.add_binding_precise_loc + ~exact state.deps_table loc deps } let transfer_instr stmt (i: instr) (state: t) = !Db.progress (); - let add_set_with_additional_var lv v d = - let deps, target, exact = - (* The modified location is [target], - whose address is computed from [deps]. *) - Values_To_Use.lval_to_zone_with_deps - stmt ~deps:(Some Zone.bottom) ~for_writing:true lv - in - let deps_of_deps = Function_Froms.Memory.find d.deps_table deps in - let deps = - Function_Froms.Deps.add_indirect_dep - (Function_Froms.Deps.add_indirect_dep v deps_of_deps) - d.additional_deps - in - let r = update target exact deps d.deps_table in - {d with deps_table=r; } - in match i with | Set (lv, exp, _) -> let comp_vars = find stmt state.deps_table exp in - add_set_with_additional_var lv comp_vars state + transfer_assign stmt lv comp_vars state | Call (lvaloption,funcexp,argl,_) -> !Db.progress (); + let value_state = To_Use.get_value_state stmt in let funcexp_deps, called_vinfos = - resolv_func_vinfo - ~deps:Zone.bottom - stmt - funcexp + !Db.Value.expr_to_kernel_function_state + value_state ~deps:(Some Zone.bottom) funcexp in (* dependencies for the evaluation of [funcexp] *) let funcexp_deps = @@ -385,43 +364,30 @@ let args_froms = List.map (fun arg -> - (* TODO : optimize the dependencies on subfields for structs - *) - Froms (find stmt state.deps_table arg)) + (* TODO : dependencies on subfields for structs *) + find stmt state.deps_table arg) argl in let states_with_formals = ref [] in - let do_on kernel_function = - let called_vinfo = Kernel_function.get_vi kernel_function in + let do_on kf = + let called_vinfo = Kernel_function.get_vi kf in if Ast_info.is_cea_function called_vinfo.vname then state else - let { Function_Froms.deps_return = return_from; - deps_table = called_func_froms } = - Froms_To_Use.get kernel_function (Kstmt stmt) - in - if Function_Froms.Memory.is_bottom called_func_froms then + let froms_call = To_Use.get_from_call kf stmt in + let froms_call_table = froms_call.Function_Froms.deps_table in + if Function_Froms.Memory.is_bottom froms_call_table then bottom_from else - let formal_args = - Kernel_function.get_formals kernel_function - in + let formal_args = Kernel_function.get_formals kf in let state_with_formals = ref state.deps_table in begin try List.iter2 (fun vi from -> - match from with - | Froms from -> - let zvi = Locations.zone_of_varinfo vi in - state_with_formals := - Function_Froms.Memory.add_binding - ~exact:true - !state_with_formals - zvi - from - (*| Lvalue _ -> assert false *)) - formal_args - args_froms; + state_with_formals := + Function_Froms.Memory.bind_var + vi from !state_with_formals; + ) formal_args args_froms; with Invalid_argument "List.iter2" -> From_parameters.warning ~once:true ~current:true "variadic call detected. Using only %d argument(s)." @@ -429,74 +395,31 @@ (List.length formal_args) (List.length args_froms)) end; - if not (Db.From.Record_From_Callbacks.is_empty ()) then states_with_formals := - (kernel_function, !state_with_formals) :: - !states_with_formals; - let substitute = - cached_substitute - !state_with_formals - additional_deps + (kf, !state_with_formals) :: !states_with_formals; + let subst_before_call = + substitute !state_with_formals additional_deps in - let new_state = - (* From state just after the call, - but before the result assigment *) - {state with - deps_table = - Function_Froms.Memory.map_and_merge substitute - called_func_froms - state.deps_table} + (* From state just after the call, + but before the result assigment *) + let deps_after_call = + let before_call = state.deps_table in + let open Function_Froms in + let subst d = DepsOrUnassigned.subst subst_before_call d in + let call_substituted = Memory.map subst froms_call_table in + Memory.compose call_substituted before_call in + let state = {state with deps_table = deps_after_call } in (* Treatement for the possible assignement of the call result *) - (match lvaloption with - | None -> new_state + match lvaloption with + | None -> state | Some lv -> - let first = ref true in - (try - Function_Froms.Memory.LOffset.fold - (fun _itv (_,x) acc -> - if not !first - then (*treatment below only compatible with imprecise - handling of Return elsewhere in this file *) - raise Not_found; - first := false; - let res = substitute x in - let deps, loczone, exact = - Values_To_Use.lval_to_zone_with_deps - stmt - ~deps:(Some Zone.bottom) - ~for_writing:true - lv - in - let deps = - Function_Froms.Memory.find_precise - acc.deps_table deps - in - let deps = Function_Froms.Deps.join res deps in - let deps = - Function_Froms.Deps.add_indirect_dep - deps - acc.additional_deps - in - { acc with deps_table = - update loczone exact deps acc.deps_table} - ) - return_from - new_state - with Not_found -> (* from find_lonely_binding *) - let vars = - Function_Froms.Memory.LOffset.map - (fun (b,x) -> (b,substitute x)) - return_from - in - add_set_with_additional_var - lv - (Function_Froms.Memory.LOffset.collapse vars) - new_state - )) + let return_from = froms_call.Function_Froms.deps_return in + let deps_ret = subst_before_call return_from in + transfer_assign stmt lv deps_ret state in let f f acc = let p = do_on f in @@ -527,7 +450,10 @@ let transfer_guard s e d = - let interpreted_e = Values_To_Use.access_expr s e in + let value_state = To_Use.get_value_state s in + let interpreted_e = + !Db.Value.eval_expr ~with_alarms:CilE.warn_none_mode value_state e + in let t1 = unrollType (typeOf e) in let do_then, do_else = if isIntegralType t1 || isPointerType t1 @@ -572,32 +498,31 @@ let data = transfer_conditional_exp s exp data in Dataflows.transfer_switch_from_guard transfer_guard s data - | Return _ -> [] + | Return _ | Throw _ -> [] | UnspecifiedSequence _ | Loop _ | Block _ | Goto _ | Break _ | Continue _ - | TryExcept _ | TryFinally _ + | TryExcept _ | TryFinally _ | TryCatch _ -> map_on_all_succs data ;; (* Filter out unreachable values. *) let transfer_stmt s d = - if Db.Value.is_reachable (Values_To_Use.get_stmt_state s) && + if Db.Value.is_reachable (To_Use.get_value_state s) && not (Function_Froms.Memory.is_bottom d.deps_table) then transfer_stmt s d else [] let doEdge s succ d = - if Db.Value.is_reachable (Values_To_Use.get_stmt_state succ) + if Db.Value.is_reachable (To_Use.get_value_state succ) then let d = match Kernel_function.blocks_closed_by_edge s succ with | [] -> d | closed_blocks -> - let deps_table = - Function_Froms.Memory.uninitialize - (List.fold_left (fun x y -> y.blocals @ x) [] closed_blocks) - d.deps_table - in { d with deps_table = deps_table } + let vars = + List.fold_left (fun x y -> y.blocals @ x) [] closed_blocks + in + { d with deps_table = bind_locals vars d.deps_table } in d else bottom_from @@ -617,23 +542,19 @@ (match return.skind with | Return (Some ({enode = Lval v}),_) -> let deps, target, _exact = - Values_To_Use.lval_to_zone_with_deps - ~deps:(Some Zone.bottom) - ~for_writing:false - return - v + lval_to_zone_with_deps ~for_writing:false return v in - Function_Froms.Memory.LOffset.join - (Function_Froms.Memory.find_base state.deps_table deps) - (Function_Froms.Memory.find_base state.deps_table target) + let z = Zone.join target deps in + let deps = Function_Froms.Memory.find_precise state.deps_table z in + let size = Bit_utils.sizeof (Cil.typeOfLval v) in + Function_Froms.(Memory.add_to_return ~size deps) | Return (None,_) -> - Function_Froms.Memory.LOffset.empty + Function_Froms.Memory.default_return | _ -> assert false) in + let accept = To_Use.keep_base kf in let deps_table = - Function_Froms.Memory.filter_base - (Recording_To_Do.accept_base_in_lmap kf) - state.deps_table + Function_Froms.Memory.filter_base accept state.deps_table in { deps_return = deps_return; Function_Froms.deps_table = deps_table } @@ -659,9 +580,7 @@ Stack.push kf call_stack; let state = { empty_from with - deps_table = - Function_Froms.Memory.uninitialize - f.slocals empty_from.deps_table } + deps_table = bind_locals f.slocals empty_from.deps_table } in let module Fenv = (val Dataflows.function_env kf: Dataflows.FUNCTION_ENV) @@ -687,8 +606,7 @@ let _poped = Stack.pop call_stack in let last_from = try - if Db.Value.is_reachable - (Values_To_Use.get_stmt_state ret_id) + if Db.Value.is_reachable (To_Use.get_value_state ret_id) then externalize ret_id @@ -701,14 +619,14 @@ "Non-terminating function %a (no dependencies)" Kernel_function.pretty kf; { Function_Froms.deps_return = - Function_Froms.Memory.LOffset.empty; + Function_Froms.Memory.default_return; deps_table = Function_Froms.Memory.bottom } end in last_from with Exit (* Recursive call *) -> - { Function_Froms.deps_return = Function_Froms.Memory.LOffset.empty; + { Function_Froms.deps_return = Function_Froms.Memory.default_return; deps_table = Function_Froms.Memory.empty } let compute_using_prototype kf = @@ -727,14 +645,12 @@ call_stack; !s); !Db.progress (); - let result = if !Db.Value.use_spec_instead_of_definition kf then compute_using_prototype kf else compute_using_cfg kf in - let result = Recording_To_Do.final_cleanup kf result in - Recording_To_Do.record_kf kf result; + let result = To_Use.cleanup_and_save kf result in From_parameters.feedback "Done for function %a" Kernel_function.pretty kf; !Db.progress (); diff -Nru frama-c-20140301+neon+dfsg/src/from/from_compute.mli frama-c-20150201+sodium+dfsg/src/from/from_compute.mli --- frama-c-20140301+neon+dfsg/src/from/from_compute.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/from/from_compute.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -24,42 +24,25 @@ open Cil_types -(** Signature of the module explaining how to find the Froms for a given call - during the analysis. *) -module type Froms_To_Use_Sig = +(** Computations of From can be done Functionwise (one result per function), + or Callwise (one result by call). The signature [To_Use] is used to + describe the functions that are different between the two implementations.*) +module type To_Use = sig - val get : kernel_function -> kinstr -> Function_Froms.t -end - -(** Signature of the module explaining how to evaluatue some values during the - analysis. This is typically Db.Value, or a specialized versions of - Db.Value on more precise state. *) -module type Values_To_Use_Sig = -sig - val lval_to_zone_with_deps : - stmt -> - deps:Locations.Zone.t option -> - for_writing:bool -> - lval -> - Locations.Zone.t * Locations.Zone.t * bool - - val expr_to_kernel_function : - stmt -> - deps:Locations.Zone.t option -> - exp -> Locations.Zone.t * Kernel_function.Hptset.t - - val get_stmt_state : stmt -> Db.Value.state + (** How to find the Froms for a given call during the analysis. *) + val get_from_call : kernel_function -> stmt -> Function_Froms.t - val access_expr : stmt -> exp -> Db.Value.t -end + (** How to find the state of Value at a given statement during the analysis.*) + val get_value_state : stmt -> Db.Value.state -(** Module explaining how results should be recorded. *) -module type Recording_Sig = -sig - val accept_base_in_lmap : kernel_function -> Base.t -> bool - val final_cleanup : - kernel_function -> Function_Froms.t -> Function_Froms.t - val record_kf : kernel_function -> Function_Froms.t -> unit + val keep_base : kernel_function -> Base.t -> bool + (** Return true if the given base is in scope after a call to the given + function. (In particular, formals and locals of the function must result + in [false].) *) + + (** Clean the given from (that have been computed for the given function), + optionally save them, and return the cleant result. *) + val cleanup_and_save : kernel_function -> Function_Froms.t -> Function_Froms.t end (** Function that compute the Froms from a given prototype, called @@ -78,12 +61,7 @@ (** Functor computing the functional dependencies, according to the three modules above. *) -module Make : - functor (Values_To_Use : Values_To_Use_Sig) -> - functor (Froms_To_Use : Froms_To_Use_Sig) -> - functor (Recording_To_Do : Recording_Sig) -> -sig - +module Make (To_Use: To_Use) : sig (** Compute the dependencies of the given function, and return them *) val compute_and_return : Kernel_function.t -> Function_Froms.t (** Compute the dependencies of the given function *) diff -Nru frama-c-20140301+neon+dfsg/src/from/From.mli frama-c-20150201+sodium+dfsg/src/from/From.mli --- frama-c-20140301+neon+dfsg/src/from/From.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/from/From.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/from/from_parameters.ml frama-c-20150201+sodium+dfsg/src/from/from_parameters.ml --- frama-c-20140301+neon+dfsg/src/from/from_parameters.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/from/from_parameters.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -50,6 +50,18 @@ let help = "experimental" end) +module VerifyAssigns = +False + (struct + let option_name = "-from-verify-assigns" + let help = "verification of assigns/from clauses for functions with \ + bodies. Implies -calldeps" + end) +let () = + VerifyAssigns.add_set_hook + (fun _ new_ -> + if new_ then ForceCallDeps.set true) + module PathDeps = False (struct diff -Nru frama-c-20140301+neon+dfsg/src/from/from_parameters.mli frama-c-20150201+sodium+dfsg/src/from/from_parameters.mli --- frama-c-20140301+neon+dfsg/src/from/from_parameters.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/from/from_parameters.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -32,6 +32,9 @@ (** Option -show-indirect-deps *) module ShowIndirectDeps: Parameter_sig.Bool +(** Option -from-verify-assigns. *) +module VerifyAssigns: Parameter_sig.Bool + (** Option -experimental-path-deps *) module PathDeps: Parameter_sig.Bool diff -Nru frama-c-20140301+neon+dfsg/src/from/from_register_gui.ml frama-c-20150201+sodium+dfsg/src/from/from_register_gui.ml --- frama-c-20140301+neon+dfsg/src/from/from_register_gui.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/from/from_register_gui.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,20 +20,24 @@ (* *) (**************************************************************************) +open Cil_types + let main (main_ui:Design.main_window_extension_points) = - let filetree_selector ~was_activated ~activating globals = - if Db.Value.is_computed () then begin - if not was_activated && activating then begin match globals with -(* [JS 2009/30/03] GUI may become too slow if froms are displayed *) -(* | [GFun ({svar=v},_)] -> - begin try - let kf = Globals.Functions.get v in - if !From.is_computed kf then - let s = fprintf_to_string "@[Functional dependencies:@\n%a@]@." !From.pretty kf in - main_ui#annot_window#buffer#insert s - with Not_found -> () - end*) - | _ -> (); + let filetree_selector ~was_activated ~activating node = + (* [JS 2009/30/03] GUI may become too slow if froms are displayed *) + if false && Db.Value.is_computed () then begin + if not was_activated && activating then begin + match node with + | Filetree.Global (Cil_types.GFun ({svar=v},_)) -> + begin + try + let kf = Globals.Functions.get v in + if !Db.From.is_computed kf then + main_ui#pretty_information + "@[Functional dependencies:@\n%a@]@." !Db.From.pretty kf + with Not_found -> () + end + | _ -> (); end; end in diff -Nru frama-c-20140301+neon+dfsg/src/from/from_register_gui.mli frama-c-20150201+sodium+dfsg/src/from/from_register_gui.mli --- frama-c-20140301+neon+dfsg/src/from/from_register_gui.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/from/from_register_gui.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/from/from_register.ml frama-c-20150201+sodium+dfsg/src/from/from_register.ml --- frama-c-20140301+neon+dfsg/src/from/from_register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/from/from_register.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/from/from_register.mli frama-c-20150201+sodium+dfsg/src/from/from_register.mli --- frama-c-20140301+neon+dfsg/src/from/from_register.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/from/from_register.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/from/functionwise.ml frama-c-20150201+sodium+dfsg/src/from/functionwise.ml --- frama-c-20140301+neon+dfsg/src/from/functionwise.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/from/functionwise.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,7 +20,6 @@ (* *) (**************************************************************************) -open Cil_types open Locations @@ -37,8 +36,9 @@ (* Forward reference to a function computing the from for a given function *) let force_compute = ref (fun _ -> assert false) -module Functionwise_From_to_use = -struct +module To_Use = struct + let get_value_state = Db.Value.get_stmt_state + let memo kf = Tbl.memo (fun kf -> @@ -46,14 +46,13 @@ try Tbl.find kf with Not_found -> invalid_arg "could not compute dependencies") kf - let get kf _ = memo kf -end -module Recording_To_Do = -struct - let accept_base_in_lmap kf = (* Eta-expansion required *) + let get_from_call kf _ = memo kf + + let keep_base kf = (* Eta-expansion required *) !Db.Semantic_Callgraph.accept_base ~with_formals:false ~with_locals:false kf - let final_cleanup kf froms = + + let cleanup kf froms = if Function_Froms.Memory.is_bottom froms.Function_Froms.deps_table then froms else @@ -64,7 +63,7 @@ else Zone.bottom in let joiner = Zone.join in - let projection base = Base.valid_range (Base.validity base) in + let projection _ = Int_Intervals.top in let zone_substitution = Zone.cached_fold ~cache_name:"from cleanup" ~temporary:true ~f ~joiner ~empty:Zone.bottom ~projection @@ -74,29 +73,20 @@ zone_substitution x with Zone.Error_Top -> Zone.top in - let subst = Function_Froms.Deps.subst zone_substitution in + let map_zone = Function_Froms.Deps.map zone_substitution in + let subst = Function_Froms.DepsOrUnassigned.subst map_zone in let open Function_Froms in - { deps_table = - Memory.map_and_merge subst froms.deps_table Memory.empty; - deps_return = - Memory.LOffset.map (function b, d -> b, subst d) froms.deps_return; + { deps_table = Memory.map subst froms.deps_table; + deps_return = Deps.map zone_substitution froms.deps_return; } - let record_kf kf last_from = Tbl.add kf last_from -end -module Value_local = struct - let get_stmt_state = Db.Value.get_stmt_state - let access_expr s exp = !Db.Value.access_expr (Kstmt s) exp - let expr_to_kernel_function s ~deps exp = - !Db.Value.expr_to_kernel_function - (Kstmt s) ~with_alarms:CilE.warn_none_mode ~deps exp - let lval_to_zone_with_deps s ~deps ~for_writing lval = - !Db.Value.lval_to_zone_with_deps_state - (get_stmt_state s) ~for_writing ~deps lval + let cleanup_and_save kf froms = + let froms = cleanup kf froms in + Tbl.add kf froms; + froms end -module From = - From_compute.Make(Value_local)(Functionwise_From_to_use)(Recording_To_Do) +module From = From_compute.Make(To_Use) let () = force_compute := From.compute @@ -114,11 +104,11 @@ Db.From.self := Tbl.self; Db.From.is_computed := Tbl.mem; Db.From.compute := - (fun kf -> ignore (Functionwise_From_to_use.memo kf)); - Db.From.get := Functionwise_From_to_use.memo; + (fun kf -> ignore (To_Use.memo kf)); + Db.From.get := To_Use.memo; Db.From.pretty := (fun fmt v -> - let deps = Functionwise_From_to_use.memo v in + let deps = To_Use.memo v in Function_Froms.pretty_with_type (Kernel_function.get_type v) fmt deps); Db.From.find_deps_no_transitivity := (fun stmt lv -> diff -Nru frama-c-20140301+neon+dfsg/src/from/functionwise.mli frama-c-20150201+sodium+dfsg/src/from/functionwise.mli --- frama-c-20140301+neon+dfsg/src/from/functionwise.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/from/functionwise.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/from/mem_dependencies.ml frama-c-20150201+sodium+dfsg/src/from/mem_dependencies.ml --- frama-c-20140301+neon+dfsg/src/from/mem_dependencies.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/from/mem_dependencies.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -63,11 +63,11 @@ DoChildren (* for the statements and the expression *) | Instr _ -> DoChildren (* for Calls *) - | Return _ -> + | Return _ | Throw _ -> DoChildren | Goto _ | Break _ | Continue _ -> SkipChildren - | TryExcept _ | TryFinally _ -> assert false + | TryExcept _ | TryFinally _ | TryCatch _ -> assert false end else SkipChildren diff -Nru frama-c-20140301+neon+dfsg/src/from/path_dependencies.ml frama-c-20150201+sodium+dfsg/src/from/path_dependencies.ml --- frama-c-20140301+neon+dfsg/src/from/path_dependencies.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/from/path_dependencies.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -63,9 +63,9 @@ DoChildren (* for the statements and the expression *) | Instr _ -> DoChildren (* for Calls *) - | Return _ | Goto _ | Break _ | Continue _ -> + | Return _ | Goto _ | Break _ | Continue _ | Throw _ -> SkipChildren - | TryExcept _ | TryFinally _ -> assert false + | TryExcept _ | TryFinally _ | TryCatch _ -> assert false end else SkipChildren diff -Nru frama-c-20140301+neon+dfsg/src/gui/analyses_manager.ml frama-c-20150201+sodium+dfsg/src/gui/analyses_manager.ml --- frama-c-20140301+neon+dfsg/src/gui/analyses_manager.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/analyses_manager.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -55,7 +55,10 @@ run "Execute an OCaml script" "OCaml sources" ".ml" Dynamic.load_script let run_module = - run "Load an OCaml object file" "OCaml objects" Dynamic.object_file_extension + run + "Load an OCaml object file" + "OCaml objects" + Dynamic.object_file_extension_regexp Dynamic.load_module let insert (main_ui: Design.main_window_extension_points) = diff -Nru frama-c-20140301+neon+dfsg/src/gui/analyses_manager.mli frama-c-20150201+sodium+dfsg/src/gui/analyses_manager.mli --- frama-c-20140301+neon+dfsg/src/gui/analyses_manager.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/analyses_manager.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/book_manager.ml frama-c-20150201+sodium+dfsg/src/gui/book_manager.ml --- frama-c-20140301+neon+dfsg/src/gui/book_manager.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/book_manager.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/book_manager.mli frama-c-20150201+sodium+dfsg/src/gui/book_manager.mli --- frama-c-20140301+neon+dfsg/src/gui/book_manager.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/book_manager.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/debug_manager.ml frama-c-20150201+sodium+dfsg/src/gui/debug_manager.ml --- frama-c-20140301+neon+dfsg/src/gui/debug_manager.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/debug_manager.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/debug_manager.mli frama-c-20150201+sodium+dfsg/src/gui/debug_manager.mli --- frama-c-20140301+neon+dfsg/src/gui/debug_manager.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/debug_manager.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/design.ml frama-c-20150201+sodium+dfsg/src/gui/design.ml --- frama-c-20140301+neon+dfsg/src/gui/design.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/design.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -59,6 +59,7 @@ method launcher : unit -> unit method source_viewer : GSourceView2.source_view + method source_viewer_scroll : GBin.scrolled_window method display_globals : global list -> unit method register_source_selector : (GMenu.menu GMenu.factory -> main_window_extension_points -> button:int @@ -76,9 +77,10 @@ method reactive_buffer: reactive_buffer option method original_source_viewer : Source_manager.t method reset : unit -> unit - method error : - 'a. ?parent:GWindow.window_skel -> ('a, Format.formatter, unit) format - -> 'a + method error : 'a. + ?parent:GWindow.window_skel -> ?reset:bool -> + ('a, Format.formatter, unit) format -> + 'a method push_info : 'a. ('a, Format.formatter, unit) format -> 'a method pop_info : unit -> unit method help_message : 'a 'b. @@ -146,7 +148,8 @@ main_ui#original_source_viewer ~filename:f ~line:1 () ; main_ui#display_globals l - | Filetree.Global g -> main_ui#display_globals [g] + | Filetree.Global g -> + main_ui#display_globals [g]; ); source#scroll_to_mark ~use_align:true ~xalign:0. ~yalign:0.5 `INSERT; let print_one_global prefix (v,loc) = @@ -171,21 +174,26 @@ other globals in the filetree *) end | Filetree.File (f, globals) -> - let first_global = ref None in + let max_length = 40 in + let cons_limit r g l = if !r >= max_length then l else (incr r;g::l) in + let gfun_c,gtyp_c,gcomptagdecl_c,genumtagdecl_c,gvardecl_c,gvar_c= + ref 0,ref 0,ref 0,ref 0,ref 0,ref 0 + in let (gfun,gtype,gcomp,genum,gvardecl,gvar) = List.fold_right (fun g (gfun,gtype,gcomp,genum,gvardecl,gvar) -> match g with - | GFun ({svar=v},loc) -> - (match !first_global with - | None -> first_global:=Some (v,loc) - | Some _ -> ()); - (g::gfun,gtype,gcomp,genum,gvardecl,gvar) - | GType _ -> (gfun,g::gtype,gcomp,genum,gvardecl,gvar) - | GCompTagDecl _ -> (gfun,gtype,g::gcomp,genum,gvardecl,gvar) - | GEnumTagDecl _ -> (gfun,gtype,gcomp,g::genum,gvardecl,gvar) - | GVarDecl _ -> (gfun,gtype,gcomp,genum,g::gvardecl,gvar) - | GVar _ -> (gfun,gtype,gcomp,genum,gvardecl,g::gvar) + | GFun _ -> + (cons_limit gfun_c g gfun,gtype,gcomp,genum,gvardecl,gvar) + | GType _ -> (gfun,cons_limit gtyp_c g gtype,gcomp,genum,gvardecl,gvar) + | GCompTagDecl _ -> + (gfun,gtype,cons_limit gcomptagdecl_c g gcomp,genum,gvardecl,gvar) + | GEnumTagDecl _ -> + (gfun,gtype,gcomp,cons_limit genumtagdecl_c g genum,gvardecl,gvar) + | GVarDecl _ -> + (gfun,gtype,gcomp,genum,cons_limit gvardecl_c g gvardecl,gvar) + | GVar _ -> + (gfun,gtype,gcomp,genum,gvardecl,cons_limit gvar_c g gvar) | _ -> (gfun,gtype,gcomp,genum,gvardecl,gvar)) globals ([],[],[],[],[],[]) @@ -193,27 +201,32 @@ main_ui#pretty_information "@[File %s@]@." f; let printing (head:string) + (ellipsis:bool) (f:Format.formatter -> 'a -> unit) (l:'a list) = if l <> [] then - main_ui#pretty_information "@[%s @[%a@]@]@." head + main_ui#pretty_information "@[%s @[%a@]%s@]@\n" head (Pretty_utils.pp_list ~sep:",@ " f) l + (if ellipsis then "..." else "") in printing "Functions:" + (!gfun_c>=max_length) (fun fmt -> (function GFun ({svar=v},_) -> Varinfo.pretty_vname fmt v | _ -> assert false)) gfun; printing "Types:" + (!gtyp_c>=max_length) (function fmt -> (function (GType ({tname=name},_)) -> Format.pp_print_string fmt name | _ -> assert false)) gtype; printing "Composite types:" + (!gcomptagdecl_c>=max_length) (function fmt -> (function GCompTagDecl ({cname=name},_) |GCompTag ({cname=name},_)-> @@ -222,7 +235,8 @@ gcomp; printing "Enums:" - (function fmt -> + (!genumtagdecl_c>=max_length) + (function fmt -> (function GEnumTagDecl ({ename=name},_) | GEnumTag ({ename=name},_)-> Format.pp_print_string fmt name @@ -230,6 +244,7 @@ genum; printing "Declared variables:" + (!gvardecl_c>=max_length) (function fmt -> (function GVarDecl (_,v,_) -> Varinfo.pretty_vname fmt v @@ -237,10 +252,12 @@ gvardecl; printing "Variables:" + (!gvar_c>=max_length) (fun fmt -> (function GVar(v,_,_) -> Varinfo.pretty_vname fmt v | _ -> assert false)) gvar; + main_ui#pretty_information "%!" end end @@ -306,7 +323,7 @@ if Emitter.equal e Emitter.end_user then "user" else "alarm" in main_ui#pretty_information "@[%s(%s): @[%a@]@]@.%a@." - pos user Printer.pp_code_annotation a + pos user Printer.pp_code_annotation a (Pretty_utils.pp_list ~sep:"@\n" pretty_predicate_status) (Property.ip_of_code_annot kf stmt a)) stmt) @@ -370,46 +387,59 @@ main_ui#pretty_information "This is an axiomatic.@."; | PIP(Property.IPLemma _) -> main_ui#pretty_information "This is a lemma.@."; + | PIP(Property.IPTypeInvariant _) -> + main_ui#pretty_information "This is a type invariant.@."; + | PIP(Property.IPGlobalInvariant _) -> + main_ui#pretty_information "This is a global invariant.@."; | PIP(Property.IPBehavior _) -> main_ui#pretty_information "This is a behavior.@."; - | PIP(Property.IPReachable _) | PIP(Property.IPOther _) -> + | PIP(Property.IPReachable _ | Property.IPOther _ + | Property.IPPropertyInstance _) -> (* these properties are not selectable *) assert false | PGlobal _g -> main_ui#pretty_information "This is a global.@."; | PLval (kf, ki,lv) -> - begin try - let ty = typeOfLval lv in - if isFunctionType ty - then - main_ui#pretty_information "This is a C function of type %a@." - Printer.pp_typ ty - else begin - current_statement_msg kf ki; - match lv with - | Var vi,NoOffset -> - main_ui#pretty_information - "Variable %a has type \"%a\".@\nIt is a %s.@\n\ - %tIt is %sreferenced and its address is %staken.@." - Varinfo.pretty_vname vi - Printer.pp_typ vi.vtype - (if vi.vglob then "global variable" - else formal_or_local (Extlib.the kf) vi) - (fun fmt -> - match vi.vdescr with None -> () - | Some s -> - Format.fprintf fmt - "This is a temporary variable for \"%s\".@\n" s) - (if vi.vreferenced then "" else "not ") - (if vi.vaddrof then "" else "not ") - | _ -> main_ui#pretty_information "This is an lvalue of type %a@." - Printer.pp_typ (typeOfLval lv) - end - with Not_found -> - main_ui#error "Error in lval Db.KernelFunction.find" - end + let ty = typeOfLval lv in + if isFunctionType ty then + main_ui#pretty_information "This is a C function of type %a@." + Printer.pp_typ ty + else begin + current_statement_msg kf ki; + match lv with + | Var vi,NoOffset -> + main_ui#pretty_information + "Variable %a has type \"%a\".@\nIt is a %s.@\n\ + %tIt is %sreferenced and its address is %staken.@." + Varinfo.pretty_vname vi + Printer.pp_typ vi.vtype + (if vi.vglob then "global variable" + else formal_or_local (Extlib.the kf) vi) + (fun fmt -> + match vi.vdescr with + | None -> () + | Some s -> + Format.fprintf fmt + "This is a temporary variable for \"%s\".@\n" s) + (if vi.vreferenced then "" else "not ") + (if vi.vaddrof then "" else "not ") + | _ -> main_ui#pretty_information "This is an lvalue of type %a@." + Printer.pp_typ (typeOfLval lv) + end + + | PExp (_kf, _ki, e) -> + begin match constFoldToInt e with + | Some i -> + main_ui#pretty_information + "This is a constant C expression of type %a, equal to %a.@." + Printer.pp_typ (typeOf e) Datatype.Integer.pretty i + | None -> + main_ui#pretty_information "This is a pure C expression of type %a.@." + Printer.pp_typ (typeOf e) + end | PTermLval _ -> main_ui#pretty_information "This is a logical left-value.@." + | PVDecl (kf,vi) -> main_ui#view_original vi.vdecl; if vi.vglob @@ -460,7 +490,7 @@ (* only simple literal calls can be resolved syntactically *) do_menu v | _ -> ()) - | PTermLval _ | PGlobal _ | PIP _ -> () + | PExp _ | PTermLval _ | PGlobal _ | PIP _ -> () end (** Global selectors and highlighters *) @@ -557,12 +587,12 @@ | F.Valid_under_hyp -> "valid_under_hyp" | F.Invalid_under_hyp -> "invalid_under_hyp" | F.Inconsistent -> "inconsistent" - + let declare_markers (source:GSourceView2.source_view) = List.iter (fun v -> - source#set_mark_category_pixbuf - ~category:(category v) + source#set_mark_category_pixbuf + ~category:(category v) (Some (Gtk_helper.Icon.get (Gtk_helper.Icon.Feedback v)))) [ F.Never_tried; F.Considered_valid; @@ -575,7 +605,7 @@ F.Valid_under_hyp; F.Invalid_under_hyp; F.Inconsistent ] - + let mark (source:GSourceView2.source_buffer) ~start ~stop:_ validity = begin let iter = source#get_iter_at_char start in @@ -585,13 +615,13 @@ end let update (reactive_buffer:reactive_buffer) prop = - Extlib.may - (fun loc_table -> + Extlib.may + (fun loc_table -> let validity = F.get prop in let loc = Pretty_source.PIP prop in let loc = locate_localizable loc_table loc in - Extlib.may - (fun (start,stop) -> + Extlib.may + (fun (start,stop) -> mark reactive_buffer#buffer ~start ~stop validity) loc) reactive_buffer#locs @@ -728,19 +758,19 @@ (* upper text view: source code *) let fr1 = GBin.frame ~shadow_type:`ETCHED_OUT ~packing:hb_sources#add1 () in - let sw = GBin.scrolled_window + let source_viewer_scroll = GBin.scrolled_window ~vpolicy:`AUTOMATIC ~hpolicy:`AUTOMATIC ~packing:fr1#add () in - let source_viewer = Source_viewer.make ~packing:sw#add in - let () = + let source_viewer = Source_viewer.make ~packing:source_viewer_scroll#add in + let () = begin source_viewer#set_show_line_numbers false ; source_viewer#set_show_line_marks true ; Feedback.declare_markers source_viewer ; - end + end in let original_source_viewer = Source_manager.make ~packing:hb_sources#add2 () @@ -785,6 +815,7 @@ = pretty_information method source_viewer = source_viewer + method source_viewer_scroll = source_viewer_scroll method register_source_selector f = selector := f::!selector method register_source_highlighter f = highlighter := f::!highlighter @@ -836,7 +867,7 @@ Extlib.may (fun refresh -> to_refresh:= - (fun ()-> + (fun ()-> if !Gtk_helper.gui_unlocked && expander#expanded then refresh ()) ::!to_refresh) @@ -899,7 +930,6 @@ self#rehighlight () (* This should not be needed, but for some reason gtk does not highlight the buffer by default *) - (* Cf .mli doc. In the first case, the callbacks of the filetree are called, but not in the second case. As of 2011-05-16, the only callback is registered here (in design.ml) and calls filetree_selector *) @@ -953,7 +983,9 @@ ignore (self#source_viewer#backward_display_line_start iter); self#source_viewer#buffer#place_cursor iter; ignore (self#source_viewer#scroll_to_mark - ~use_align:true ~yalign:0.5 ~xalign:0. `INSERT) + ~use_align:true ~yalign:0.5 ~xalign:0. `INSERT); + let adj = source_viewer_scroll#hadjustment in + adj#set_value adj#lower in match Pretty_source.locate_localizable (Extlib.the state#locs) loc with | Some (b,_) -> show b @@ -1076,12 +1108,12 @@ self#set_reset self#reset; let menu_manager = self#menu_manager () (* create the menu_manager *) in main_window#add_accel_group menu_manager#factory#accel_group; - + let lock_gui lock = (* lock left part of the GUI. *) filetree_panel_vpaned#misc#set_sensitive (not lock); if lock then - ignore (Glib.Timeout.add ~ms:25 + ignore (Glib.Timeout.add ~ms:50 ~callback:(fun () -> progress_bar#pulse (); not !Gtk_helper.gui_unlocked)); @@ -1129,9 +1161,7 @@ file_tree <- Some (Filetree.make file_tree_view); self#file_tree#add_select_function (filetree_selector self#toplevel); - process_extensions self#toplevel; - self#register_source_selector to_do_on_select; self#initialize_panels (); main_window#show (); @@ -1144,8 +1174,8 @@ ~tab_label:(GMisc.label ~text:"Messages" ())#coerce w) in let callback e _column = - Extlib.may - (fun pos -> + Extlib.may + (fun pos -> Extlib.may self#scroll (Pretty_source.loc_to_localizable pos); self#view_original (pos,pos)) e.Log.evt_source @@ -1242,16 +1272,19 @@ new Gtk_helper.error_manager (splash_w:>GWindow.window_skel) in let init_crashed = ref true in - error_manager#protect + error_manager#protect ~cancelable:true ~parent:(splash_w:>GWindow.window_skel) (fun () -> - (try + (try play (); (* This is a good point to start using real asynchronous tasks management: plug-ins launched from command line have finished their asynchronous tasks thanks to the default Task.on_idle. *) Task.on_idle := (fun f -> ignore (Glib.Timeout.add ~ms:50 ~callback:f)); + let project_name = Gui_parameters.Project_name.get () in + if project_name <> "" then + Project.set_current (Project.from_unique_name project_name); Ast.compute () with e -> (* An error occurred: we need to enforce the splash screen realization before we create the error dialog widget.*) diff -Nru frama-c-20140301+neon+dfsg/src/gui/design.mli frama-c-20150201+sodium+dfsg/src/gui/design.mli --- frama-c-20140301+neon+dfsg/src/gui/design.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/design.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -124,6 +124,9 @@ method source_viewer : GSourceView2.source_view (** The [GText.view] showing the AST. *) + method source_viewer_scroll : GBin.scrolled_window + (** The scrolling of the [GText.view] showing the AST. *) + method reactive_buffer: reactive_buffer option (** The buffer containing the AST. @since Carbon-20101201 *) @@ -140,8 +143,11 @@ opportunity to launch to the user *) method error : - 'a. ?parent:GWindow.window_skel -> ('a, Format.formatter, unit) format -> 'a - (** Popup a modal dialog displaying an error message *) + 'a. ?parent:GWindow.window_skel -> ?reset:bool -> + ('a, Format.formatter, unit) format -> 'a + (** Popup a modal dialog displaying an error message. If [reset] is true + (default is false), the gui is reset after the dialog has been + displayed. *) (** {3 Extension Points} *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/file_manager.ml frama-c-20150201+sodium+dfsg/src/gui/file_manager.ml --- frama-c-20140301+neon+dfsg/src/gui/file_manager.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/file_manager.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -38,15 +38,37 @@ [Some f] for saving in file [f] *) let reparse (host_window: Design.main_window_extension_points) = - host_window#protect ~cancelable:true + let old_helt = History.get_current () in + let old_scroll = + let adj = host_window#source_viewer_scroll#vadjustment in + (adj#value -. adj#lower ) /. (adj#upper -. adj#lower) + in + let succeeded = host_window#full_protect ~cancelable:true (fun () -> let files = Kernel.Files.get () in Kernel.Files.set []; Kernel.Files.set files; Ast.compute (); !Db.Main.play (); - Source_manager.clear host_window#original_source_viewer); - host_window#reset () + Source_manager.clear host_window#original_source_viewer) + in + begin match old_helt, succeeded with + | None, _ -> (** no history available before reparsing *) + host_window#reset () + | _, None -> (** the user stopped or an error occured *) + host_window#reset () + | Some old_helt, Some () -> + let new_helt = History.translate_history_elt old_helt in + Extlib.may History.push new_helt; + host_window#reset (); + (** The buffer is not ready yet, modification of its vadjustement + is unrealiable *) + let set () = + let adj = host_window#source_viewer_scroll#vadjustment in + adj#set_value (old_scroll *. (adj#upper-.adj#lower) +. adj#lower) + in + Gtk_helper.later set + end let save_in (host_window: Design.main_window_extension_points) parent name = try diff -Nru frama-c-20140301+neon+dfsg/src/gui/file_manager.mli frama-c-20150201+sodium+dfsg/src/gui/file_manager.mli --- frama-c-20140301+neon+dfsg/src/gui/file_manager.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/file_manager.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/filetree.ml frama-c-20150201+sodium+dfsg/src/gui/filetree.ml --- frama-c-20140301+neon+dfsg/src/gui/filetree.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/filetree.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -25,6 +25,9 @@ open Extlib open Gtk_helper +(* To debug performance related to heigth of lines *) +let fixed_height = false + type filetree_node = | File of string * Cil_types.global list | Global of Cil_types.global @@ -65,8 +68,8 @@ method refresh_columns : unit -> unit end -(* crude way to to debug inefficiencies with the gtk interface -let c = ref 0 +(* crude way to to debug inefficiencies with the gtk interface *) +(*let c = ref 0 let gtk s = incr c; Format.printf "[%d %s]@." !c s *) @@ -165,30 +168,36 @@ in parent#foreach f - method append_tree (t:TREE.t) = - let rec make_forest root sons = + method set_tree (fill_cache:int list->custom_tree->unit) (t:TREE.t list) = + num_roots <- 0; + let rec make_forest pos root sons = Array.mapi (fun i t -> let result = {finfo=t; fidx=i; parent = Some root; sons = [||] } - in - let sons = make_forest result (TREE.sons t) in - result.sons<-sons; - result) + in + fill_cache (i::pos) result; + let sons = make_forest (i::pos) result (TREE.sons t) in + result.sons<-sons; + result) sons in - let pos = num_roots in - num_roots <- num_roots+1; - let root = { finfo = t; sons = [||]; - parent = None; - fidx = pos } + let new_roots = List.map + (fun t -> + let pos = num_roots in + num_roots <- num_roots+1; + let root = { finfo = t; sons = [||]; + parent = None; + fidx = pos } + in + fill_cache [pos] root; + let sons = make_forest [pos] root (TREE.sons t) + in + root.sons <- sons; + root) + t in + roots <- Array.of_list new_roots - let sons = make_forest root (TREE.sons t) - in - root.sons <- sons; - roots <- - Array.init num_roots (fun n -> if n = num_roots - 1 then root - else roots.(n)) method clear () = self#custom_foreach (fun p _ -> self#custom_row_deleted p; @@ -323,6 +332,7 @@ let storage = default_storage display_name (Array.of_list globs) in let sons = make_list_globals hide globs in storage, sons + end module MODEL=MAKE(MYTREE) @@ -359,11 +369,11 @@ gtk node *) type cache = { cache_files: - (Gtk.tree_path * MODEL.custom_tree) Datatype.String.Hashtbl.t; + (int list * MODEL.custom_tree) Datatype.String.Hashtbl.t; cache_vars: - (Gtk.tree_path * MODEL.custom_tree) Varinfo.Hashtbl.t; + (int list * MODEL.custom_tree) Varinfo.Hashtbl.t; cache_global_annot: - (Gtk.tree_path * MODEL.custom_tree) Global_annotation.Hashtbl.t; + (int list * MODEL.custom_tree) Global_annotation.Hashtbl.t; } let default_cache () = { @@ -384,20 +394,19 @@ with Not_found -> None) | _ -> None - let fill_cache cache path row = + let fill_cache cache (path:int list) row = match row.MODEL.finfo with - | MYTREE.MFile (storage,_) -> - Datatype.String.Hashtbl.add - cache.cache_files storage.MYTREE.name (path,row) - | MYTREE.MGlobal storage -> - match storage.MYTREE.globals with - (* Only one element in this array by invariant: this is a leaf*) - | [| GFun ({svar=vi},_) | GVar(vi,_,_) | GVarDecl(_,vi,_) |] -> - Varinfo.Hashtbl.add cache.cache_vars vi (path,row) - | [| GAnnot (ga, _) |] -> - Global_annotation.Hashtbl.add cache.cache_global_annot ga (path,row) - | _ -> (* no cache for other globals yet *) () - + | MYTREE.MFile (storage,_) -> + Datatype.String.Hashtbl.add + cache.cache_files storage.MYTREE.name (path,row) + | MYTREE.MGlobal storage -> + match storage.MYTREE.globals with + (* Only one element in this array by invariant: this is a leaf*) + | [| GFun ({svar=vi},_) | GVar(vi,_,_) | GVarDecl(_,vi,_) |] -> + Varinfo.Hashtbl.add cache.cache_vars vi (path,row) + | [| GAnnot (ga, _) |] -> + Global_annotation.Hashtbl.add cache.cache_global_annot ga (path,row) + | _ -> (* no cache for other globals yet *) () let default_filetree () = let m1 = MODEL.custom_tree () in @@ -450,23 +459,27 @@ let model, cache, _ = Ref.get () in (* Let's fill up the model with all files and functions. *) let files = cil_files () in - if flat_mode () then - let files = + begin + if flat_mode () then + let files = MYTREE.make_list_globals hide (List.concat (List.map snd files)) in - List.iter model#append_tree files + model#set_tree (fill_cache cache) files; else - List.iter - (fun v -> - let name, globals = MYTREE.make_file hide v in - if not ((hide_stdlib ()) - && (MYTREE.comes_from_share name.MYTREE.name)) - then - model#append_tree (MYTREE.MFile (name, globals))) - (List.sort (fun (s1, _) (s2, _) -> String.compare s1 s2) files); + let files = List.fold_left + (fun acc v -> + let name, globals = MYTREE.make_file hide v in + if not ((hide_stdlib ()) + && (MYTREE.comes_from_share name.MYTREE.name)) + then + (MYTREE.MFile (name, globals))::acc + else acc) + [] + (List.sort (fun (s1, _) (s2, _) -> String.compare s1 s2) files) + in + model#set_tree (fill_cache cache) files + end; (* Let's build the table from globals to rows in the model *) - model#custom_foreach - (fun path tree -> (*gtk "cache";*) fill_cache cache path tree; false); Ref.mark_as_computed () let get () = @@ -529,8 +542,7 @@ (fun b -> (MYTREE.get_storage row).MYTREE.strikethrough <- b) strikethrough; may (fun b -> (MYTREE.get_storage row).MYTREE.name <- b) text; - (* gtk "set_row"; *) - model#custom_row_changed path raw_row + if false then model#custom_row_changed (GTree.Path.create (List.rev path)) raw_row in let myself = object(self) @@ -559,14 +571,16 @@ method append_pixbuf_column ~title (f:(global list -> GTree.cell_properties_pixbuf list)) visible = let column = GTree.view_column ~title () in - column#set_resizable true; + if fixed_height then (column#set_sizing `FIXED; + column#set_resizable false; + column#set_fixed_width 100) + else column#set_resizable true; let renderer = GTree.cell_renderer_pixbuf [] in column#pack renderer; column#set_cell_data_func renderer (fun model row -> if visible () then let (path:Gtk.tree_path) = model#get_path row in - (* gtk "cell renderer"; *) match model_custom#custom_get_iter path with | Some {MODEL.finfo=v} -> renderer#set_properties @@ -651,7 +665,6 @@ (Printexc.to_string e) in try - (* gtk "select"; *) let {MODEL.finfo=t} = Extlib.the (model_custom#custom_get_iter path) in let selected_node = MYTREE.storage_type t in @@ -674,7 +687,7 @@ f ~was_activated:(not old_force_selection && was_activated) ~activating:true selected_node - with e-> fail e) + with e -> fail e) select_functions; end; force_selection <- false; @@ -725,17 +738,20 @@ List.iter (fun f -> f (self :> t)) reset_extensions; State.Ref.set (mc, cache, prev_active); force_selection <- true; - match prev_active with + (match prev_active with | None -> () | Some node -> match State.path_from_node path_cache node with | None -> () - | Some (path, _) -> self#show_path_in_tree path; + | Some (path, _) -> + self#show_path_in_tree (GTree.Path.create (List.rev path))) method select_global g = match State.path_from_node path_cache (Global g) with | None -> (* selection failed *) self#unselect; false - | Some (path, _) -> self#show_path_in_tree path; true + | Some (path, _) -> + self#show_path_in_tree (GTree.Path.create (List.rev path)); + true method selected_globals = match self#activated with @@ -754,7 +770,6 @@ let source_renderer = GTree.cell_renderer_text [`YALIGN 0.0] in let m_source_renderer renderer (lmodel:GTree.model) iter = let (path:Gtk.tree_path) = lmodel#get_path iter in - (* gtk "source renderer"; *) match self#model#custom_get_iter path with | Some p -> let special, text, strike, underline = match p.MODEL.finfo with @@ -779,10 +794,13 @@ ~title:"Source file" ~renderer:((source_renderer:>GTree.cell_renderer),[]) () in + if fixed_height then column#set_sizing `FIXED; source_column <- Some column; column#set_cell_data_func source_renderer (m_source_renderer source_renderer); - column#set_resizable true; + if fixed_height then ( column#set_resizable false; + column#set_fixed_width 100) + else column#set_resizable true; column#set_clickable true; column#set_widget (Some button_menu#coerce); @@ -809,6 +827,7 @@ let _ = tree_view#append_column column in tree_view#set_model (Some (init_model:>GTree.model)); self#enable_select_functions (); + if fixed_height then tree_view#set_fixed_height_mode true; end in diff -Nru frama-c-20140301+neon+dfsg/src/gui/filetree.mli frama-c-20150201+sodium+dfsg/src/gui/filetree.mli --- frama-c-20140301+neon+dfsg/src/gui/filetree.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/filetree.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/gtk_form.ml frama-c-20150201+sodium+dfsg/src/gui/gtk_form.ml --- frama-c-20140301+neon+dfsg/src/gui/gtk_form.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/gtk_form.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/gtk_form.mli frama-c-20150201+sodium+dfsg/src/gui/gtk_form.mli --- frama-c-20140301+neon+dfsg/src/gui/gtk_form.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/gtk_form.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/gtk_helper.ml frama-c-20150201+sodium+dfsg/src/gui/gtk_helper.ml --- frama-c-20140301+neon+dfsg/src/gui/gtk_helper.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/gtk_helper.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -58,23 +58,31 @@ module F = Property_status.Feedback + type theme_file = + | ThemeSpecific of string + | ThemeGeneric of string + let builtins = - [(Frama_C,"frama-c.ico"); - (Unmark,"unmark.png"); - (Feedback F.Never_tried,"feedback/never_tried.png"); - (Feedback F.Unknown,"feedback/unknown.png"); - (Feedback F.Valid,"feedback/surely_valid.png"); - (Feedback F.Invalid,"feedback/surely_invalid.png"); - (Feedback F.Considered_valid,"feedback/considered_valid.png"); - (Feedback F.Valid_under_hyp,"feedback/valid_under_hyp.png"); - (Feedback F.Invalid_under_hyp,"feedback/invalid_under_hyp.png"); - (Feedback F.Invalid_but_dead,"feedback/invalid_but_dead.png"); - (Feedback F.Unknown_but_dead,"feedback/unknown_but_dead.png"); - (Feedback F.Valid_but_dead,"feedback/valid_but_dead.png"); - (Feedback F.Inconsistent,"feedback/inconsistent.png"); + [(Frama_C, ThemeGeneric "frama-c.ico"); + (Unmark, ThemeGeneric "unmark.png"); + (Feedback F.Never_tried, ThemeSpecific "never_tried.png"); + (Feedback F.Unknown, ThemeSpecific "unknown.png"); + (Feedback F.Valid, ThemeSpecific "surely_valid.png"); + (Feedback F.Invalid, ThemeSpecific "surely_invalid.png"); + (Feedback F.Considered_valid, ThemeSpecific "considered_valid.png"); + (Feedback F.Valid_under_hyp, ThemeSpecific "valid_under_hyp.png"); + (Feedback F.Invalid_under_hyp, ThemeSpecific "invalid_under_hyp.png"); + (Feedback F.Invalid_but_dead, ThemeSpecific "invalid_but_dead.png"); + (Feedback F.Unknown_but_dead, ThemeSpecific "unknown_but_dead.png"); + (Feedback F.Valid_but_dead, ThemeSpecific "valid_but_dead.png"); + (Feedback F.Inconsistent, ThemeSpecific "inconsistent.png"); ] - type icon = Filename of string | Pixbuf of GdkPixbuf.pixbuf + let get_file_in_theme = function + | ThemeSpecific x -> "theme/" ^ (Gui_parameters.Theme.get()) ^ "/" ^ x + | ThemeGeneric x -> x + + type icon = Filename of theme_file | Pixbuf of GdkPixbuf.pixbuf let h = Hashtbl.create 7 @@ -87,19 +95,21 @@ let get k = try match Hashtbl.find h k with - | Filename f -> - let p = - try GdkPixbuf.from_file (Config.datadir ^ "/" ^ f) - with Glib.GError _ -> - Gui_parameters.warning ~once:true - "Frama-C images not found. Is FRAMAC_SHARE correctly set?"; - default () - in - Hashtbl.replace h k (Pixbuf p); p + | Filename f' -> + let f = get_file_in_theme f' in + let p = + try GdkPixbuf.from_file (Config.datadir ^ "/" ^ f) + with Glib.GError _ -> + Gui_parameters.warning ~once:true + "Frama-C images not found. Is FRAMAC_SHARE correctly set?"; + default () + in + Hashtbl.replace h k (Pixbuf p); p | Pixbuf p -> p with Not_found -> assert false - let register ~name ~file = Hashtbl.replace h (Custom name) (Filename file) + let register ~name ~file = Hashtbl.replace h (Custom name) + (Filename (ThemeGeneric file)) end @@ -672,7 +682,7 @@ (** A utility class to catch exceptions and report proper error messages. *) class type host = object method error: - 'a. ?parent:GWindow.window_skel -> ('a, Format.formatter, unit) format -> 'a + 'a. ?parent:GWindow.window_skel -> ?reset:bool -> ('a, Format.formatter, unit) format -> 'a method full_protect : 'a. cancelable:bool -> ?parent:GWindow.window_skel -> (unit -> 'a) -> 'a option @@ -684,13 +694,13 @@ class error_manager ?reset (o_parent:GWindow.window_skel) : host = object (self: #host) - val mutable reset = match reset with + val mutable f_reset = match reset with | None -> fun () -> () | Some f -> f - method private set_reset f = reset <- f + method private set_reset f = f_reset <- f - method private error_string ?parent message = + method private error_string ?parent ~reset message = let w = GWindow.message_dialog ~message ~message_type:`ERROR @@ -705,23 +715,23 @@ w#present (); ignore (w#run ()); w#destroy (); - reset () + if reset then f_reset () - method error ?parent fmt = + method error ?parent ?(reset=false) fmt = let b = Buffer.create 80 in let bfmt = Format.formatter_of_buffer b in Format.kfprintf (function fmt -> Format.pp_print_flush fmt (); let content = Buffer.contents b in - self#error_string ?parent content) + self#error_string ?parent ~reset content) bfmt fmt method private display_toplevel_error ?parent ~cancelable e = Cmdline.error_occurred e; if cancelable then Project.Undo.restore (); - self#error ?parent "%s" (Cmdline.protect e) + self#error ?parent ~reset:true "%s" (Cmdline.protect e); method protect ~cancelable ?(parent:GWindow.window_skel option) f = ignore (self#full_protect ~cancelable ?parent f) @@ -753,7 +763,8 @@ None | Sys.Break | Db.Cancel -> if cancelable then Project.Undo.restore (); - self#error ?parent "Stopping current computation on user request."; + self#error ?parent ~reset:true + "Stopping current computation on user request."; None | Globals.No_such_entry_point msg -> (try Gui_parameters.abort "%s" msg @@ -807,7 +818,15 @@ in reparent_page, w -let refresh_gui () = while Glib.Main.iteration false do () done +exception Too_many_events +let refresh_gui () = + let counter = ref 0 in + try + while Glib.Main.iteration false do + if !counter >= 10 then raise Too_many_events + else incr counter + done + with Too_many_events -> () (* ************************************************************************* *) (** {2 Source File Chooser} *) @@ -874,18 +893,22 @@ ignore (add_button#connect#pressed ~callback:add_selected_files); ignore (remove_button#connect#pressed ~callback:remove); ignore (filechooser#connect#file_activated ~callback:add_selected_files); - (match dialog#run () with - | `OPEN -> - main_ui#protect - ~cancelable:true - ~parent:(dialog :> GWindow.window_skel) - (fun () -> f (get_all ())) - | `DELETE_EVENT | `CANCEL -> - ()); - Extlib.may (fun f -> - Configuration.set "last_opened_dir" - (Configuration.ConfString f)) filechooser#current_folder; - dialog#destroy () + let response r = (match r with + | `OPEN -> + main_ui#protect + ~cancelable:true + ~parent:(dialog :> GWindow.window_skel) + (fun () -> f (get_all ())) + | `DELETE_EVENT | `CANCEL -> + ()); + Extlib.may (fun f -> + Configuration.set "last_opened_dir" + (Configuration.ConfString f)) filechooser#current_folder; + dialog#destroy () + in + let (_:GtkSignal.id) = dialog#connect#response ~callback:response in + dialog#show (); + () let later f = let for_idle () = f () ; false in diff -Nru frama-c-20140301+neon+dfsg/src/gui/gtk_helper.mli frama-c-20150201+sodium+dfsg/src/gui/gtk_helper.mli --- frama-c-20140301+neon+dfsg/src/gui/gtk_helper.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/gtk_helper.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -247,10 +247,13 @@ (** {2 Error manager} *) (* ************************************************************************** *) -(** A utility class to catch exceptions and report proper error messages. *) +(** A utility class to catch exceptions and report proper error messages. + See the documentations of the methods in + {!Design.main_window_extension_points}, which inherits from this + class. *) class type host = object method error: - 'a. ?parent:GWindow.window_skel -> ('a, Format.formatter, unit) format -> 'a + 'a. ?parent:GWindow.window_skel -> ?reset:bool -> ('a, Format.formatter, unit) format -> 'a method full_protect : 'a. cancelable:bool -> ?parent:GWindow.window_skel -> (unit -> 'a) -> 'a option @@ -291,7 +294,7 @@ val later : (unit -> unit) -> unit val refresh_gui: unit -> unit - (** Process pending events in the main Glib loop. + (** Process some pending events in the main Glib loop. This is intended to be called only when [!gui_unlocked == false]. @since Beryllium-20090901 *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/gui_parameters.ml frama-c-20150201+sodium+dfsg/src/gui/gui_parameters.ml --- frama-c-20140301+neon+dfsg/src/gui/gui_parameters.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/gui_parameters.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -28,6 +28,16 @@ let help = "Graphical User Interface" end) +let () = Parameter_customize.do_not_projectify () +module Project_name = + Empty_string + (struct + let option_name = "-gui-project" + let arg_name = "p" + let help = "run the GUI on project

after applying the \ +command line actions (by default, it is run on the default project" + end) + (* Used mainly for debugging purposes. No need to show it to the user *) let () = Parameter_customize.is_invisible () module Undo = @@ -37,6 +47,16 @@ let help = "possible to click on the `undo' button (set by default)" end) +module Theme = + String + (struct + let option_name = "-gui-theme" + let arg_name = "s" + let help = + "choose the theme of the GUI (available: 'default', 'colorblind')" + let default = "default" + end) + (* Local Variables: compile-command: "make -C ../.." diff -Nru frama-c-20140301+neon+dfsg/src/gui/gui_parameters.mli frama-c-20150201+sodium+dfsg/src/gui/gui_parameters.mli --- frama-c-20140301+neon+dfsg/src/gui/gui_parameters.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/gui_parameters.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -24,9 +24,15 @@ include Plugin.S +module Project_name: Parameter_sig.String +(** Option -gui-project. *) + module Undo: Parameter_sig.Bool (** Option -undo. *) +module Theme: Parameter_sig.String +(** Option -gui-theme. *) + (* Local Variables: compile-command: "make -C ../.." diff -Nru frama-c-20140301+neon+dfsg/src/gui/help_manager.ml frama-c-20150201+sodium+dfsg/src/gui/help_manager.ml --- frama-c-20140301+neon+dfsg/src/gui/help_manager.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/help_manager.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -36,7 +36,7 @@ "Benjamin Monate"; "Yannick Moy"; "Anne Pacalet"; - "Virgile Prévosto"; + "Virgile Prevosto"; "Julien Signoles"; "Boris Yakobowski" ] in diff -Nru frama-c-20140301+neon+dfsg/src/gui/help_manager.mli frama-c-20150201+sodium+dfsg/src/gui/help_manager.mli --- frama-c-20140301+neon+dfsg/src/gui/help_manager.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/help_manager.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/history.ml frama-c-20150201+sodium+dfsg/src/gui/history.ml --- frama-c-20140301+neon+dfsg/src/gui/history.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/history.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -141,6 +141,8 @@ let h = CurrentHistory.get () in fun f -> CurrentHistory.set h; f () +let get_current () = (CurrentHistory.get ()).current + let push cur = let h = CurrentHistory.get () in let h' = match h.current with @@ -175,6 +177,107 @@ ] +exception Found_global of global + +let translate_history_elt old_helt = + let test_name_file old_name new_name old_loc new_loc = + old_name = new_name && + (fst old_loc).Lexing.pos_fname = (fst new_loc).Lexing.pos_fname + in + let global old_g = + let iter new_g = + let open Cil_types in + (** In the same file, same constructor and same original name *) + match old_g, + new_g with + | (GType( {torig_name = old_name}, old_loc), + GType( {torig_name = new_name}, new_loc)) + | (GEnumTag( {eorig_name = old_name}, old_loc), + GEnumTag( {eorig_name = new_name}, new_loc)) + | (GEnumTagDecl( {eorig_name = old_name}, old_loc), + GEnumTagDecl( {eorig_name = new_name}, new_loc)) + | (GCompTag( {corig_name = old_name}, old_loc), + GCompTag( {corig_name = new_name}, new_loc)) + | (GCompTagDecl( {corig_name = old_name}, old_loc), + GCompTagDecl( {corig_name = new_name}, new_loc)) + | (GVarDecl(_, {vorig_name = old_name}, old_loc), + GVarDecl(_, {vorig_name = new_name}, new_loc)) + | (GVar( {vorig_name = old_name},_, old_loc), + GVar( {vorig_name = new_name},_, new_loc)) + | (GFun({svar= {vorig_name = old_name}}, old_loc), + GFun({svar= {vorig_name = new_name}}, new_loc)) + | (GAnnot(Dtype( {lt_name = old_name},_), old_loc), + GAnnot(Dtype( {lt_name = new_name},_), new_loc)) + | (GAnnot(Daxiomatic( old_name,_,_), old_loc), + GAnnot(Daxiomatic( new_name,_,_), new_loc)) + | (GAnnot(Dlemma( old_name,_,_,_,_,_),old_loc), + GAnnot(Dlemma( new_name,_,_,_,_,_),new_loc)) + | (GAnnot(Dfun_or_pred({l_var_info= {lv_name=old_name}},_), old_loc), + GAnnot(Dfun_or_pred({l_var_info= {lv_name=new_name}},_), new_loc)) + + when test_name_file old_name new_name old_loc new_loc -> + raise (Found_global new_g) + + | GAsm _, GAsm _ + | GText _, GText _ + | GPragma _, GPragma _ + | GAnnot(Dvolatile _,_), GAnnot(Dvolatile _,_) + | GAnnot(Dinvariant _,_), GAnnot(Dinvariant _,_) + | GAnnot(Dtype_annot _,_), GAnnot(Dtype_annot _,_) + | GAnnot(Dmodel_annot _,_), GAnnot(Dmodel_annot _,_) + | GAnnot(Dcustom_annot _,_), GAnnot(Dcustom_annot _,_) + -> (** they have no names *) () + | _ -> (** different constructors *) () + in + try + List.iter iter (Ast.get ()).globals; + None + with Found_global new_g -> Some new_g + in + let open Pretty_source in + let open Cil_datatype in + let global_Global g = Extlib.opt_map (fun x -> Global x) (global g) in + match old_helt with + | Global old_g -> global_Global old_g + | Localizable (PGlobal old_g) -> global_Global old_g + | Localizable(PVDecl(Some kf,_)) -> + global_Global (Kernel_function.get_global kf) + | Localizable ( PStmt(kf,_) | PLval(Some kf,_,_) | PExp(Some kf,_,_) + | PTermLval(Some kf,_,_) as loc) -> + begin match global (Kernel_function.get_global kf) with + | None -> + (** The kernel function can't be found nothing to say *) + None + | Some g -> + (** Try to stay at the same offset in the function *) + let old_kf_loc = fst (Kernel_function.get_location kf) in + let old_loc = fst (Kinstr.loc (ki_of_localizable loc)) in + let offset = old_loc.Lexing.pos_lnum - old_kf_loc.Lexing.pos_lnum in + let new_kf_loc = fst (Global.loc g) in + let new_loc = {new_kf_loc with + Lexing.pos_lnum = new_kf_loc.Lexing.pos_lnum + offset; + Lexing.pos_cnum = old_loc.Lexing.pos_cnum; + } + in + match Pretty_source.loc_to_localizable new_loc with + | None -> (** the line is unknown *) + Some (Global g) + | Some locali -> + begin match kf_of_localizable locali with + | None -> (** not in a kf so return the start of the function *) + Some (Global g) + | Some kf when not (Global.equal (Kernel_function.get_global kf) g) -> + (** Fall in the wrong global, so return the start of the function *) + Some (Global g) + | _ -> + (** Fall in the correct global *) + Some (Localizable locali) + end + end + | Localizable (PLval(None,_,_) | PExp(None,_,_) | PTermLval(None,_,_) + | PVDecl(None,_)) -> (** no names useful? *) None + | Localizable (PIP _ ) -> (** no names available *) None + (* Local Variables: compile-command: "make -C ../.." diff -Nru frama-c-20140301+neon+dfsg/src/gui/history.mli frama-c-20150201+sodium+dfsg/src/gui/history.mli --- frama-c-20140301+neon+dfsg/src/gui/history.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/history.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -48,6 +48,11 @@ (** Add the element to the current history; clears the forward history, and push the old current element to the past history. *) +val get_current: unit -> history_elt option +(** return the current history point, if available + @since Sodium-20150201 +*) + val show_current: unit -> unit (** Redisplay the current history point, if available. Useful to refresh the gui. *) @@ -61,6 +66,11 @@ (** [apply_on_selected f] applies [f] to the currently selected [Pretty_source.localizable]. Does nothing if nothing is selected. *) +val translate_history_elt: history_elt -> history_elt option +(** try to translate the history_elt of one project to the current one + @since Sodium-20150201 + *) + (**/**) val set_display_elt_callback: (history_elt -> unit) -> unit val create_buttons: Menu_manager.menu_manager -> Menu_manager.item array diff -Nru frama-c-20140301+neon+dfsg/src/gui/launcher.ml frama-c-20150201+sodium+dfsg/src/gui/launcher.ml --- frama-c-20140301+neon+dfsg/src/gui/launcher.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/launcher.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -108,20 +108,6 @@ in Kernel_hook.extend (fun () -> if !widget_value <> old then set !widget_value)) - - | Typed_parameter.String_set { Typed_parameter.get = get; set = set } - | Typed_parameter.String_list { Typed_parameter.get = get; set = set } -> - let use_markup = is_set () in - let name = if use_markup then hname else name in - let old = get () in - let widget_value = ref old in - let w_set r = widget_value := r in - let w_get () = !widget_value in - let _refresh = - on_string_set ~tooltip ~use_markup ~width:400 box name w_get w_set - in - Kernel_hook.extend - (fun () -> if !widget_value <> old then set !widget_value) ); use_markup diff -Nru frama-c-20140301+neon+dfsg/src/gui/launcher.mli frama-c-20150201+sodium+dfsg/src/gui/launcher.mli --- frama-c-20140301+neon+dfsg/src/gui/launcher.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/launcher.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/menu_manager.ml frama-c-20150201+sodium+dfsg/src/gui/menu_manager.ml --- frama-c-20140301+neon+dfsg/src/gui/menu_manager.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/menu_manager.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/menu_manager.mli frama-c-20150201+sodium+dfsg/src/gui/menu_manager.mli --- frama-c-20140301+neon+dfsg/src/gui/menu_manager.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/menu_manager.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/pretty_source.ml frama-c-20150201+sodium+dfsg/src/gui/pretty_source.ml --- frama-c-20140301+neon+dfsg/src/gui/pretty_source.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/pretty_source.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -29,11 +29,11 @@ type localizable = | PStmt of (kernel_function * stmt) | PLval of (kernel_function option * kinstr * lval) + | PExp of (kernel_function option * kinstr * exp) | PTermLval of (kernel_function option * kinstr * term_lval) | PVDecl of (kernel_function option * varinfo) | PGlobal of global | PIP of Property.t - module Localizable = Datatype.Make (struct @@ -49,17 +49,23 @@ Kinstr.equal ki1 ki2 && Logic_utils.is_same_tlval lv1 lv2 (* [JS 2008/01/21] term_lval are not shared: cannot use == *) | PVDecl (_,v1), PVDecl (_,v2) -> Varinfo.equal v1 v2 + | PExp (_,_,e1), PExp(_,_,e2) -> Cil_datatype.Exp.equal e1 e2 | PIP ip1, PIP ip2 -> Property.equal ip1 ip2 | PGlobal g1, PGlobal g2 -> Cil_datatype.Global.equal g1 g2 - | (PStmt _ | PLval _ | PTermLval _ | PVDecl _ | PIP _ | PGlobal _), _ + | (PStmt _ | PLval _ | PExp _ | PTermLval _ | PVDecl _ + | PIP _ | PGlobal _), _ -> false let mem_project = Datatype.never_any_project let pretty fmt = function | PStmt (_, s) -> Format.fprintf fmt "LocalizableStmt %d (%a)" s.sid Printer.pp_location (Cil_datatype.Stmt.loc s) - | PLval (_, ki, lv) -> + | PLval (_, ki, lv) -> Format.fprintf fmt "LocalizableLval %a (%a)" - Printer.pp_lval lv + Printer.pp_lval lv + Cil_datatype.Location.pretty (Cil_datatype.Kinstr.loc ki) + | PExp (_, ki, lv) -> + Format.fprintf fmt "LocalizableExp %a (%a)" + Printer.pp_exp lv Cil_datatype.Location.pretty (Cil_datatype.Kinstr.loc ki) | PTermLval (_, ki, tlv) -> Format.fprintf fmt "LocalizableTermLval %a (%a)" @@ -75,6 +81,7 @@ let kf_of_localizable loc = match loc with | PLval (kf_opt, _, _) + | PExp (kf_opt,_,_) | PTermLval(kf_opt, _,_) | PVDecl (kf_opt, _) -> kf_opt | PStmt (kf, _) -> Some kf @@ -84,6 +91,7 @@ let ki_of_localizable loc = match loc with | PLval (_, ki, _) + | PExp (_, ki, _) | PTermLval(_, ki,_) -> ki | PVDecl (_, _) -> Kglobal | PStmt (_, st) -> Kstmt st @@ -183,26 +191,26 @@ before loc2, or loc1 and loc2 start at the same position but loc1 spawns further than loc2. *) - + type t = ((int*int) * localizable option) array - - let create state = + + let create state = let arr = Array.make (Locs.size state) ((0,0), None) in - let index = ref 0 in - Locs.iter + let index = ref 0 in + Locs.iter state (fun (pb,pe) v -> Array.set arr !index ((pb,pe), Some v) ; incr index ) ; - Array.sort + Array.sort (fun ((pb1,pe1),_) ((pb2,pe2),_) -> - if (pb1 = pb2) then + if (pb1 = pb2) then if (pe1 = pe2) then 0 - else + else (* most englobing comes first *) - Pervasives.compare pe2 pe1 + Pervasives.compare pe2 pe1 else Pervasives.compare pb1 pb2 ) arr ; @@ -212,18 +220,18 @@ (* get loc at index i; raises Not_found if none exists *) - let get arr i = + let get arr i = if i >= Array.length arr then raise Not_found - else + else match Array.get arr i with | ((_,_),None) -> raise Not_found | ((pb,pe),Some v) -> ((pb,pe),v) - + (* find the next loc in array starting at index i - which satifies the predicate; + which satifies the predicate; raises Not_found if none exists *) - let find_next arr i predicate = - let rec fnext i = + let find_next arr i predicate = + let rec fnext i = let ((pb',_pe'),v) = get arr i in if predicate v then pb' else fnext (i+1) @@ -249,6 +257,7 @@ let encode_stmt,decode_stmt = make_modem 's' let encode_lval,decode_lval = make_modem 'l' + let encode_exp,decode_exp = make_modem 'e' let encode_termlval,decode_termlval = make_modem 't' let encode_vdecl,decode_vdecl = make_modem 'd' let encode_global,decode_global = make_modem 'g' @@ -257,6 +266,7 @@ let create = function | PStmt sid -> encode_stmt sid | PLval lval -> encode_lval lval + | PExp e -> encode_exp e | PTermLval lval -> encode_termlval lval | PVDecl vi -> encode_vdecl vi | PGlobal g -> encode_global g @@ -264,6 +274,8 @@ let get s = try + PExp (decode_exp s) + with Wrong_decoder -> try PStmt (decode_stmt s) with Wrong_decoder -> try PLval (decode_lval s) @@ -331,21 +343,35 @@ ); Format.fprintf fmt "@}" + method! exp fmt e = + match e.enode with + | Lval lv -> + (* Do not mark immediate l-values as they would not be + selectable anyway because of the embedded tags of self#lval. + This is only an optimization. *) + self#lval fmt lv + | _ -> + Format.fprintf fmt "@{<%s>" + (Tag.create (PExp (self#current_kf,self#current_kinstr,e))); + super#exp fmt e; + Format.fprintf fmt "@}" + method! term_lval fmt lv = - (* similar to pLval *) - match self#current_kinstr with - | Kglobal -> super#term_lval fmt lv - (* Do not highlight the lvals in initializers. *) - | Kstmt _ as ki -> - Format.fprintf fmt "@{<%s>" - (Tag.create (PTermLval (self#current_kf,ki,lv))); - (match lv with - | TVar vi, (TField _| TIndex _ as o) -> - self#term_lval fmt (TVar vi, TNoOffset); - self#term_offset fmt o - | _ -> super#term_lval fmt lv - ); - Format.fprintf fmt "@}" + (* similar to pLval, except that term_lval can appear in specifications + of functions (ki = None, kf <> None). Initializers are ignored. *) + if self#current_kinstr = Kglobal && self#current_kf = None then begin + super#term_lval fmt lv (* Do not highlight the lvals in initializers. *) + end else begin + Format.fprintf fmt "@{<%s>" + (Tag.create (PTermLval (self#current_kf, self#current_kinstr, lv))); + (match lv with + | TVar vi, (TField _| TIndex _ as o) -> + self#term_lval fmt (TVar vi, TNoOffset); + self#term_offset fmt o + | _ -> super#term_lval fmt lv + ); + Format.fprintf fmt "@}" + end method! vdecl fmt vi = Format.fprintf fmt "@{<%s>%a@}" @@ -372,7 +398,7 @@ | AStmtSpec _ -> (* tags will be set in the inner nodes. *) super#code_annotation fmt ca - | AAllocation _ + | AAllocation _ | AAssigns _ -> (* tags will be set in the inner nodes. *) current_ca <- Some ca; @@ -487,11 +513,11 @@ Format.fprintf fmt "@{<%s>%a@}" (Tag.create (PIP ip)) (super#from s) from - method! global_annotation fmt a = + method! global_annotation fmt a = match Property.ip_of_global_annotation_single a with | None -> super#global_annotation fmt a | Some ip -> - Format.fprintf fmt "@{<%s>%a@}" + Format.fprintf fmt "@{<%s>%a@}" (Tag.create (PIP ip)) super#global_annotation a method! allocation ~isloop fmt a = @@ -550,7 +576,8 @@ let localizable_from_locs state ~file ~line = let loc_localizable = function - | PStmt (_,st) | PLval (_,Kstmt st,_) | PTermLval(_,Kstmt st,_) -> + | PStmt (_,st) | PLval (_,Kstmt st,_) | PExp(_,Kstmt st, _) + | PTermLval(_,Kstmt st,_) -> Stmt.loc st | PIP ip -> (match Property.get_kinstr ip with @@ -561,7 +588,7 @@ | Kstmt st -> Stmt.loc st) | PVDecl (_,vi) -> vi.vdecl | PGlobal g -> Global.loc g - | (PLval _ | PTermLval _) as localize -> + | (PLval _ | PTermLval _ | PExp _) as localize -> (match kf_of_localizable localize with | None -> Location.unknown | Some kf -> Kernel_function.get_location kf) @@ -604,17 +631,16 @@ Format.pp_set_margin gtk_fmt 79; gtk_fmt -let display_source globals - (source:GSourceView2.source_buffer) ~(host:Gtk_helper.host) +let display_source globals + (source:GSourceView2.source_buffer) ~(host:Gtk_helper.host) ~highlighter ~selector = let state = Locs.create () in (* let highlighter _ ~start:_ ~stop:_ = () in *) host#protect ~cancelable:false (fun () -> - Gtk_helper.refresh_gui (); source#set_text ""; - source#remove_source_marks + source#remove_source_marks ~start:source#start_iter ~stop:source#end_iter (); let hiliter () = let event_tag = Gtk_helper.make_tag source ~name:"events" [] in @@ -623,15 +649,14 @@ let index_max = LocsArray.length locs_array in let index = ref 0 in while(!index < index_max) do ( - try + try let ((pb,pe),v) = LocsArray.get locs_array !index in - Gtk_helper.refresh_gui (); match v with | PStmt (_,ki) -> (try let pb,pe = match ki with | {skind = Instr _ | Return _ | Goto _ - | Break _ | Continue _} -> pb,pe + | Break _ | Continue _ | Throw _ } -> pb,pe | {skind = If _ | Loop _ | Switch _ } -> (* These statements contain other statements. @@ -644,7 +669,7 @@ | _ -> false (* Do not stop on expressions*)) with Not_found -> pb+1) | {skind = Block _ | TryExcept _ | TryFinally _ - | UnspecifiedSequence _} -> + | UnspecifiedSequence _ | TryCatch _ } -> pb, (try LocsArray.find_next locs_array (!index+1) (fun _ -> true) with Not_found -> pb+1) @@ -652,24 +677,22 @@ highlighter v ~start:pb ~stop:pe with Not_found -> ()) | PTermLval _ | PLval _ | PVDecl _ | PGlobal _ - | PIP _ -> - highlighter v ~start:pb ~stop:pe + | PIP _ | PExp _ -> + highlighter v ~start:pb ~stop:pe with Not_found -> () ) ; incr index done; (* Kernel.debug "Highlighting done (%d occurrences)" (Locs.size ());*) - + (* React to events on the text *) source#apply_tag ~start:source#start_iter ~stop:source#end_iter event_tag; (* Kernel.debug "Event tag done";*) in Locs.set_hilite state hiliter; - (* Kernel.debug "Display source starts";*) let gtk_fmt = buffer_formatter state (source:>GText.buffer) in let tagPrinter = new tagPrinterClass in let display_global g = - Gtk_helper.refresh_gui (); tagPrinter#global gtk_fmt g; Format.pp_print_flush gtk_fmt () in @@ -694,7 +717,6 @@ ()) ca *) end; (* Kernel.debug "Displayed globals";*) - source#place_cursor source#start_iter; (* Highlight the localizable *) hiliter (); diff -Nru frama-c-20140301+neon+dfsg/src/gui/pretty_source.mli frama-c-20150201+sodium+dfsg/src/gui/pretty_source.mli --- frama-c-20140301+neon+dfsg/src/gui/pretty_source.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/pretty_source.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -29,6 +29,7 @@ type localizable = | PStmt of (kernel_function * stmt) | PLval of (kernel_function option * kinstr * lval) + | PExp of (kernel_function option * kinstr * exp) | PTermLval of (kernel_function option * kinstr * term_lval) | PVDecl of (kernel_function option * varinfo) (** Declaration and definition of variables and function. Check the type diff -Nru frama-c-20140301+neon+dfsg/src/gui/project_manager.ml frama-c-20150201+sodium+dfsg/src/gui/project_manager.ml --- frama-c-20140301+neon+dfsg/src/gui/project_manager.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/project_manager.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -131,7 +131,8 @@ | Some f -> (try ignore (Project.load f) with Project.IOError s | Failure s -> - host_window#error ~parent:(dialog:>GWindow.window_skel) + host_window#error + ~reset:true ~parent:(dialog:>GWindow.window_skel) "Cannot load: %s" s) end | `DELETE_EVENT | `CANCEL -> ()); @@ -150,7 +151,7 @@ try ignore (Project.from_unique_name s); main_ui#error "Project of name %S already exists" s - with Not_found -> + with Project.Unknown_project -> Project.set_name project s let reset (menu: GMenu.menu) = @@ -188,7 +189,9 @@ end let rec duplicate_project window menu project = - let new_p = Project.create_by_copy ~src:project (Project.get_name project) in + let new_p = + Project.create_by_copy ~last:false ~src:project (Project.get_name project) + in try (* update the menu *) let group = diff -Nru frama-c-20140301+neon+dfsg/src/gui/project_manager.mli frama-c-20150201+sodium+dfsg/src/gui/project_manager.mli --- frama-c-20140301+neon+dfsg/src/gui/project_manager.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/project_manager.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/property_navigator.ml frama-c-20150201+sodium+dfsg/src/gui/property_navigator.ml --- frama-c-20140301+neon+dfsg/src/gui/property_navigator.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/property_navigator.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -67,7 +67,7 @@ let status = Property_status.get ip in let status_name = Pretty_utils.sfprintf "%a" Property_status.pretty status in let con_status = Consolidation.get ip in - let consolidated_status_name = + let consolidated_status_name = Pretty_utils.sfprintf "%a" Consolidation.pretty con_status in let function_name, module_name = match Property.get_kf ip with @@ -76,11 +76,11 @@ enough information in the ast *) | Some kf -> kf_name_and_module kf in - let kind = - Pretty_utils.sfprintf "@[%a@]" Property.pretty ip + let kind = + Pretty_utils.sfprintf "@[%a@]" Property.pretty ip in let status_icon = Gtk_helper.Icon.Feedback (Feedback.get ip) in - { + { module_name = module_name; function_name = function_name; visible = true; @@ -107,7 +107,10 @@ module StmtSpec: State_builder.Ref with type data = bool module Reachable: State_builder.Ref with type data = bool module Other: State_builder.Ref with type data = bool + module Instances: State_builder.Ref with type data = bool module Axiomatic: State_builder.Ref with type data = bool + module TypeInvariants: State_builder.Ref with type data = bool + module GlobalInvariants: State_builder.Ref with type data = bool (*module Pragma: State_builder.Ref with type data = bool*) module RteNotGenerated: State_builder.Ref with type data = bool module RteGenerated: State_builder.Ref with type data = bool @@ -155,21 +158,21 @@ let first_extended_ref = ref true let first_exiting_ref = ref true let () = - Cmdline.run_after_extended_stage - (fun () -> + Cmdline.run_after_extended_stage + (fun () -> if !first_extended_ref then begin first_extended_ref := false; Configuration.load () end); - Cmdline.run_after_loading_stage - (fun () -> + Cmdline.run_after_loading_stage + (fun () -> if !first_exiting_ref then begin first_exiting_ref := false; let v = Configuration.find_bool ~default:true key_name in set v end) - let set v = + let set v = Configuration.set key_name (Configuration.ConfBool v); set v @@ -222,6 +225,18 @@ module Reachable = Add( struct let name = "Reachable" let hint = "Show 'reachable' hypotheses" end) + module Instances = Add( + struct let name = "Instances" + let hint = "Show properties that are instances of root properties" + end) + module TypeInvariants = Add( + struct let name = "Type invariants" + let hint = "Show type invariants" + end) + module GlobalInvariants = Add( + struct let name = "Global invariants" + let hint = "Show global invariants" + end) module Other = Add( struct let name = "Other" let hint = "Show other properties" end) @@ -280,6 +295,9 @@ Reachable.add hb; StmtSpec.add hb; Axiomatic.add hb; + TypeInvariants.add hb; + GlobalInvariants.add hb; + Instances.add hb; Other.add hb; (*Pragma.add hb;*) RteNotGenerated.add hb; @@ -307,7 +325,7 @@ | true, true, _ | false, _, true -> (* Considered that leaf functions are not verified internally *) - let status_name, status = + let status_name, status = if st then if Kernel_function.is_definition kf then "Generated", Feedback.Valid @@ -316,7 +334,7 @@ in let function_name, module_name = kf_name_and_module kf in let status_icon = Gtk_helper.Icon.Feedback status in - let ip = Property.ip_other name None Kglobal in { + let ip = Property.ip_other name None Kglobal in { module_name = module_name; function_name = function_name; visible = true; @@ -342,7 +360,7 @@ sc_buttons#add_with_viewport vb#coerce; container#pack sc_buttons#coerce; - let module MODEL = + let module MODEL = Gtk_helper.MAKE_CUSTOM_LIST(struct type t = property end) in let model = MODEL.custom_list () in @@ -369,7 +387,7 @@ ~callback:(fun path _col -> match model#custom_get_iter path with | Some { MODEL.finfo = { ip = ip } } -> - let format_graph ppf = + let format_graph ppf = Consolidation_graph.dump (Consolidation_graph.get ip) ppf in Gtk_helper.graph_window_through_dot main_ui#main_window "Dependencies" format_graph | None -> ())); @@ -439,6 +457,8 @@ Ensures.get() && StmtSpec.get() | Property.IPPredicate(Property.PKTerminates,_,_,_) -> Terminates.get () | Property.IPAxiom _ -> false + | Property.IPTypeInvariant _ -> TypeInvariants.get() + | Property.IPGlobalInvariant _ -> GlobalInvariants.get() | Property.IPAxiomatic _ -> Axiomatic.get () && not (OnlyCurrent.get ()) | Property.IPLemma _ -> Axiomatic.get () && not (OnlyCurrent.get ()) | Property.IPComplete _ -> Behaviors.get () @@ -454,7 +474,6 @@ Allocations.get () | Property.IPAllocation (_,Kstmt _,Property.Id_behavior _,_) -> Allocations.get() && StmtSpec.get() - | Property.IPAssigns (_,Kglobal,_,_) -> Assigns.get () | Property.IPAssigns (_,Kstmt _,Property.Id_code_annot _,_) -> Assigns.get () @@ -462,6 +481,7 @@ Assigns.get() && StmtSpec.get() | Property.IPFrom _ -> From.get () | Property.IPDecrease _ -> Variant.get () + | Property.IPPropertyInstance _ -> Instances.get () in let visible_status_aux = function | Consolidation.Never_tried -> Untried.get () @@ -578,7 +598,8 @@ | Pretty_source.PStmt _ | Pretty_source.PGlobal _| Pretty_source.PVDecl _ - | Pretty_source.PTermLval _| Pretty_source.PLval _ -> () + | Pretty_source.PTermLval _| Pretty_source.PLval _ + | Pretty_source.PExp _ -> () diff -Nru frama-c-20140301+neon+dfsg/src/gui/property_navigator.mli frama-c-20150201+sodium+dfsg/src/gui/property_navigator.mli --- frama-c-20140301+neon+dfsg/src/gui/property_navigator.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/property_navigator.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/source_manager.ml frama-c-20150201+sodium+dfsg/src/gui/source_manager.ml --- frama-c-20140301+neon+dfsg/src/gui/source_manager.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/source_manager.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/source_manager.mli frama-c-20150201+sodium+dfsg/src/gui/source_manager.mli --- frama-c-20140301+neon+dfsg/src/gui/source_manager.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/source_manager.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/source_viewer.ml frama-c-20150201+sodium+dfsg/src/gui/source_viewer.ml --- frama-c-20140301+neon+dfsg/src/gui/source_viewer.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/source_viewer.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/source_viewer.mli frama-c-20150201+sodium+dfsg/src/gui/source_viewer.mli --- frama-c-20140301+neon+dfsg/src/gui/source_viewer.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/source_viewer.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/toolbox.ml frama-c-20150201+sodium+dfsg/src/gui/toolbox.ml --- frama-c-20140301+neon+dfsg/src/gui/toolbox.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/toolbox.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/toolbox.mli frama-c-20150201+sodium+dfsg/src/gui/toolbox.mli --- frama-c-20140301+neon+dfsg/src/gui/toolbox.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/toolbox.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/warning_manager.ml frama-c-20150201+sodium+dfsg/src/gui/warning_manager.ml --- frama-c-20140301+neon+dfsg/src/gui/warning_manager.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/warning_manager.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/gui/warning_manager.mli frama-c-20150201+sodium+dfsg/src/gui/warning_manager.mli --- frama-c-20140301+neon+dfsg/src/gui/warning_manager.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/gui/warning_manager.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/impact/compute_impact.ml frama-c-20150201+sodium+dfsg/src/impact/compute_impact.ml --- frama-c-20140301+neon+dfsg/src/impact/compute_impact.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/impact/compute_impact.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -695,7 +695,10 @@ (** Computation of the [skip] field from a list of variables *) let skip_bases vars = - let aux acc v = Locations.Zone.join acc (Locations.Zone.defaultall v) in + let aux acc v = + let z = Locations.Zone.inject v Int_Intervals.top in + Locations.Zone.join z acc + in List.fold_left aux Locations.Zone.bottom vars (** Computation of the [skip] field from the [-impact-skip] option *) diff -Nru frama-c-20140301+neon+dfsg/src/impact/compute_impact.mli frama-c-20150201+sodium+dfsg/src/impact/compute_impact.mli --- frama-c-20140301+neon+dfsg/src/impact/compute_impact.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/impact/compute_impact.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/impact/Impact.mli frama-c-20150201+sodium+dfsg/src/impact/Impact.mli --- frama-c-20140301+neon+dfsg/src/impact/Impact.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/impact/Impact.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/impact/options.ml frama-c-20150201+sodium+dfsg/src/impact/options.ml --- frama-c-20140301+neon+dfsg/src/impact/options.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/impact/options.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -28,7 +28,7 @@ end) module Pragma = - StringSet + Kernel_function_set (struct let option_name = "-impact-pragma" let arg_name = "f1, ..., fn" @@ -58,7 +58,7 @@ end) module Skip = - StringSet + String_set (struct let arg_name = "v1,...,vn" let help = "consider that those variables are not impacted" diff -Nru frama-c-20140301+neon+dfsg/src/impact/options.mli frama-c-20150201+sodium+dfsg/src/impact/options.mli --- frama-c-20140301+neon+dfsg/src/impact/options.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/impact/options.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -22,7 +22,7 @@ include Plugin.S -module Pragma: Parameter_sig.String_set +module Pragma: Parameter_sig.Kernel_function_set (** Use pragmas of given function. *) module Print: Parameter_sig.Bool diff -Nru frama-c-20140301+neon+dfsg/src/impact/pdg_aux.ml frama-c-20150201+sodium+dfsg/src/impact/pdg_aux.ml --- frama-c-20140301+neon+dfsg/src/impact/pdg_aux.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/impact/pdg_aux.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -38,7 +38,9 @@ let name = "Impact.Pdg_aux.NS.intersects" in let z_intersects _ z1 z2 = Locations.Zone.intersects z1 z2 in let map_intersects = - symmetric_binary_predicate (PersistentCache name) ExistentialPredicate + symmetric_binary_predicate + (Hptmap.PersistentCache name) + ExistentialPredicate ~decide_fast:decide_fast_intersection ~decide_one:(fun _ _ -> false) ~decide_both:z_intersects @@ -62,7 +64,8 @@ let decide_none _ n = n in let decide_some z1 z2 = Zone.join z1 z2 in let merge = - symmetric_merge ~cache:("Pdg_aux.NS.union", ()) ~decide_none ~decide_some + symmetric_merge ~cache:("Pdg_aux.NS.union", ()) + ~empty_neutral:true ~decide_none ~decide_some in fun m1 m2 -> merge m1 m2 @@ -109,7 +112,7 @@ fold (fun n z -> f (n, z)) - let () = Db.Value.Table.add_hook_on_update (fun _ -> clear_caches ()) + let () = Db.Value.Table_By_Callstack.add_hook_on_update (fun _ -> clear_caches ()) end type call_interface = (PdgTypes.Node.t * NS.t) list diff -Nru frama-c-20140301+neon+dfsg/src/impact/pdg_aux.mli frama-c-20150201+sodium+dfsg/src/impact/pdg_aux.mli --- frama-c-20140301+neon+dfsg/src/impact/pdg_aux.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/impact/pdg_aux.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/impact/reason_graph.ml frama-c-20150201+sodium+dfsg/src/impact/reason_graph.ml --- frama-c-20140301+neon+dfsg/src/impact/reason_graph.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/impact/reason_graph.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -139,7 +139,7 @@ let graph_attributes _ = [`Label "Impact graph"] - let default_vertex_attributes _g = [`Style [`Filled]; `Shape `Box] + let default_vertex_attributes _g = [`Style `Filled; `Shape `Box] let default_edge_attributes _g = [] let vertex_attributes v = diff -Nru frama-c-20140301+neon+dfsg/src/impact/register_gui.ml frama-c-20150201+sodium+dfsg/src/impact/register_gui.ml --- frama-c-20140301+neon+dfsg/src/impact/register_gui.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/impact/register_gui.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/impact/register_gui.mli frama-c-20150201+sodium+dfsg/src/impact/register_gui.mli --- frama-c-20140301+neon+dfsg/src/impact/register_gui.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/impact/register_gui.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/impact/register.ml frama-c-20150201+sodium+dfsg/src/impact/register.ml --- frama-c-20140301+neon+dfsg/src/impact/register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/impact/register.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -28,7 +28,7 @@ let rec pp_stmt fmt s = match s.skind with | Instr _ | Return _ | Goto _ | Break _ | Continue _ | TryFinally _ - | TryExcept _ -> + | TryExcept _ | Throw _ | TryCatch _ -> Printer.without_annot Printer.pp_stmt fmt s | If (e, _, _, _) -> Format.fprintf fmt "if(%a) <..>" Printer.pp_exp e @@ -127,17 +127,12 @@ in (* fill [pragmas] with all the pragmas of all the selected functions *) let pragmas = Pragma.fold - (fun f acc -> - try - let kf = Globals.Functions.find_def_by_name f in - match kf.fundec with - | Definition(f, _) -> - ignore (visitFramacFunction visitor f); - if !pragmas != [] then (kf, !pragmas) :: acc else acc - | Declaration _ -> assert false - with Not_found -> - abort "function %s not found." f - ) [] + (fun kf acc -> + (* Pragma option only accept defined functions. *) + let f = Kernel_function.get_definition kf in + ignore (visitFramacFunction visitor f); + if !pragmas != [] then (kf, !pragmas) :: acc else acc) + [] in let skip = Compute_impact.skip () in (* compute impact analyses on each kf *) diff -Nru frama-c-20140301+neon+dfsg/src/inout/access_path.ml frama-c-20150201+sodium+dfsg/src/inout/access_path.ml --- frama-c-20140301+neon+dfsg/src/inout/access_path.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/inout/access_path.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,158 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -open Locations -open Abstract_interp -open Lattice_Interval_Set -open Cvalue - -let pretty = - let module M = - Base.Map.Make(struct - include Datatype.Pair(Zone)(Location_Bits) - let pretty fmt (z, loc) = - Format.fprintf fmt "@[[Zone:%a@ Loc_bits:%a]@]" - Zone.pretty z - Location_Bits.pretty loc - end) - in - fun fmt m -> - Format.fprintf fmt "Access_path:@\n%a@\n=============@\n" M.pretty m - - -(** [reciprocal_image b m] is the set of bits in the offsetmap [m] - that may lead to Top([b]) and the set of offsets in [m] - where one can read an address [b]+_ *) -let reciprocal_image_offsm base m = - let treat_binding (bi,ei as itv) (v, modu, r) (acc1,acc2) = - let r = Integer.c_rem (Rel.add_abs bi r) modu in - let v = Cvalue.V_Or_Uninitialized.get_v v in - let acc1 = if Locations.Location_Bytes.may_reach base v - then Int_Intervals.join acc1 (Int_Intervals.inject [itv]) - else acc1 - in - let acc2 = - if (Locations.Location_Bytes.intersects - (Locations.Location_Bytes.inject base Ival.top) - v) - && Int.compare modu (Integer.of_int (Bit_utils.sizeofpointer ())) = 0 - then - let first = Int.round_up_to_r ~min:bi ~r ~modu in - let last = - Integer.mul - (Integer.pred (Integer.div (Integer.succ (Integer.sub ei first)) modu)) - modu - in - if Integer.lt last Integer.zero then acc2 - else - Ival.join - acc2 - (Ival.inject_top (Some first) (Some (Integer.add first last)) r modu) - else acc2 - in - acc1,acc2 - in - Cvalue.V_Offsetmap.fold treat_binding m (Int_Intervals.bottom, Ival.bottom) - -(** [reciprocal_image m b] is the set of bits in the map [m] that may lead - to Top([b]) and the location in [m] where one may read an address [b]+_ *) - -let reciprocal_image base m : Zone.t*Location_Bits.t = - if Base.is_null base then Zone.top,Location_Bits.top - else - Model.fold_base_offsetmap - (fun b offsm (acc1,acc2) -> - let interv_set,ival = reciprocal_image_offsm base offsm in - let acc1 = Zone.join acc1 (Zone.inject b interv_set) in - let acc2 = Location_Bits.join acc2 (Location_Bits.inject b ival) in - acc1,acc2 - ) m (Zone.bottom,Location_Bits.bottom) - -let compute state base_set = - let q = Queue.create () in - let result = ref Base.Map.empty in - Base.Set.iter (fun elt -> Queue.add elt q) base_set; - while not (Queue.is_empty q) do - let current_base = Queue.take q in - let recip = reciprocal_image current_base state in - result := Base.Map.add current_base recip !result ; - try - Zone.fold_bases - (fun base () -> - try ignore (Base.Map.find base !result) - with Not_found -> Queue.add base q) - (fst recip) - () - with Zone.Error_Top -> () - done; - Inout_parameters.result "%a" pretty !result; - !result - -let filter m inputs = - Base.Map.map - (fun (zone,loc) -> - Zone.narrow zone inputs, - (Locations.filter_loc - (Locations.make_loc - loc - (Int_Base.inject (Int.of_int (Bit_utils.sizeofpointer ())))) - inputs).Locations.loc) - m - -let main () = - if Inout_parameters.ForceAccessPath.get () then - !Db.Semantic_Callgraph.topologically_iter_on_functions - (fun kf -> - if Kernel_function.is_definition kf && !Db.Value.is_called kf then - let state = - Db.Value.get_state - (Cil_types.Kstmt (Kernel_function.find_first_stmt kf)) - in - let inputs = !Db.Operational_inputs.get_internal kf in - let s = !Db.Access_path.compute state - (Cvalue.Model.fold_base - (fun base acc -> Base.Set.add base acc) - state - Base.Set.empty) - in - Inout_parameters.result - "Filtered access_path for %a :@ %a@." - Kernel_function.pretty kf - !Db.Access_path.pretty - (!Db.Access_path.filter s - (Locations.Zone.filter_base - (fun b -> - not (Base.is_local b (Kernel_function.get_definition kf))) - inputs.Inout_type.over_inputs))) - -let () = Db.Main.extend main - -let () = - Db.Access_path.compute := compute; - Db.Access_path.filter := filter; - Db.Access_path.pretty := pretty - -(* -Local Variables: -compile-command: "make -C ../.." -End: -*) diff -Nru frama-c-20140301+neon+dfsg/src/inout/access_path.mli frama-c-20150201+sodium+dfsg/src/inout/access_path.mli --- frama-c-20140301+neon+dfsg/src/inout/access_path.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/inout/access_path.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -(* -Local Variables: -compile-command: "make -C ../.." -End: -*) diff -Nru frama-c-20140301+neon+dfsg/src/inout/cumulative_analysis.ml frama-c-20150201+sodium+dfsg/src/inout/cumulative_analysis.ml --- frama-c-20140301+neon+dfsg/src/inout/cumulative_analysis.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/inout/cumulative_analysis.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/inout/cumulative_analysis.mli frama-c-20150201+sodium+dfsg/src/inout/cumulative_analysis.mli --- frama-c-20140301+neon+dfsg/src/inout/cumulative_analysis.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/inout/cumulative_analysis.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/inout/derefs.ml frama-c-20150201+sodium+dfsg/src/inout/derefs.ml --- frama-c-20140301+neon+dfsg/src/inout/derefs.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/inout/derefs.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/inout/derefs.mli frama-c-20150201+sodium+dfsg/src/inout/derefs.mli --- frama-c-20140301+neon+dfsg/src/inout/derefs.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/inout/derefs.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/inout/Inout.mli frama-c-20150201+sodium+dfsg/src/inout/Inout.mli --- frama-c-20140301+neon+dfsg/src/inout/Inout.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/inout/Inout.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/inout/inout_parameters.ml frama-c-20150201+sodium+dfsg/src/inout/inout_parameters.ml --- frama-c-20140301+neon+dfsg/src/inout/inout_parameters.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/inout/inout_parameters.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/inout/inout_parameters.mli frama-c-20150201+sodium+dfsg/src/inout/inout_parameters.mli --- frama-c-20140301+neon+dfsg/src/inout/inout_parameters.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/inout/inout_parameters.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/inout/inputs.ml frama-c-20150201+sodium+dfsg/src/inout/inputs.ml --- frama-c-20140301+neon+dfsg/src/inout/inputs.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/inout/inputs.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/inout/inputs.mli frama-c-20150201+sodium+dfsg/src/inout/inputs.mli --- frama-c-20140301+neon+dfsg/src/inout/inputs.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/inout/inputs.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/inout/operational_inputs.ml frama-c-20150201+sodium+dfsg/src/inout/operational_inputs.ml --- frama-c-20140301+neon+dfsg/src/inout/operational_inputs.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/inout/operational_inputs.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -123,24 +123,21 @@ not (Kernel_function.is_formal v kf) | Base.CLogic_Var _ | Base.Null | Base.String _ -> true) in - let outputs, deps = + let outputs_under, outputs_over, deps = try if Logic_utils.is_result out.it_content - then [], Zone.bottom + then (Zone.bottom, Zone.bottom, Zone.bottom) else - let locs_out, deps = !Db.Properties.Interp.loc_to_locs ~result:None - state out.it_content + let loc_out_under, loc_out_over, deps = + !Db.Properties.Interp.loc_to_loc_under_over ~result:None state out.it_content in - let conv loc = - let z = enumerate_valid_bits ~for_writing:true loc in - let sure = Locations.cardinal_zero_or_one loc in - z, sure - in - List.map conv locs_out, clean_deps deps + (enumerate_valid_bits_under ~for_writing:true loc_out_under, + enumerate_valid_bits ~for_writing:true loc_out_over, + clean_deps deps) with Invalid_argument _ -> Inout_parameters.warning ~current:true ~once:true "Failed to interpret assigns clause '%a'" Printer.pp_term out.it_content; - [Locations.Zone.top, false], Locations.Zone.top + (Zone.bottom, Zone.top, Zone.top) in (* Compute all inputs as a zone *) let inputs = @@ -149,14 +146,11 @@ | FromAny -> Zone.top | From l -> let aux acc { it_content = from } = - let locs, deps = - !Db.Properties.Interp.loc_to_locs None state from in + let _, loc, deps = + !Db.Properties.Interp.loc_to_loc_under_over None state from in let acc = Zone.join (clean_deps deps) acc in - List.fold_left - (fun acc loc -> - let z = enumerate_valid_bits ~for_writing:false loc in - Zone.join z acc - ) acc locs + let z = enumerate_valid_bits ~for_writing:false loc in + Zone.join z acc in List.fold_left aux deps l with Invalid_argument _ -> @@ -165,28 +159,28 @@ Printer.pp_from asgn; Zone.top in - (* Fuse all outputs. An output is sure if it was certainly overwritten, - and if it is not amongst its from *) - let extract_sure (sure_out, all_out) (out, exact) = - let all_out' = Zone.join out all_out in - if exact then - let sure = Locations.Zone.diff out inputs in - Zone.join sure sure_out, all_out' - else - sure_out, all_out' + (* Fuse all outputs. An output is sure if it was certainly + overwritten (i.e. is in the left part of an assign clause, + and if it is not amongst its from.) *) + (* Note: here we remove an overapproximation from an + underapproximation to get an underapproximation, which is not + the usual direction. It works here because diff on non-top zones is + an exact operation. *) + let sure_out = + Zone.(if equal top inputs then bottom else diff outputs_under inputs) in - let sure_out, all_out = - List.fold_left extract_sure (Zone.bottom, Zone.bottom) outputs - in (* Join all three kinds of locations. The use a join (not a meet) for - under_outputs is correct here (and in fact required for precision) *) { - under_outputs_d = Zone.join acc.under_outputs_d sure_out; + under_outputs_d = Zone.link acc.under_outputs_d sure_out; over_inputs_d = Zone.join acc.over_inputs_d inputs; - over_outputs_d = Zone.join acc.over_outputs_d all_out; + over_outputs_d = Zone.join acc.over_outputs_d outputs_over; } in match assigns with - | WritesAny -> top + | WritesAny -> + Inout_parameters.warning "no assigns clauses@ for function %a.@ \ + Results@ will be@ imprecise." + Kernel_function.pretty kf; + top | Writes l -> let init = { bottom with under_outputs_d = Zone.bottom } in let r = List.fold_left treat_one_zone init l in { @@ -223,7 +217,7 @@ which only the specification is used. *) module CallwiseResults = State_builder.Hashtbl - (CallsiteHash) + (Value_types.Callsite.Hashtbl) (Inout_type) (struct let size = 17 @@ -390,7 +384,8 @@ assert (s.succs == []); [] | Return(None,_) -> return_data := data; assert (s.succs == []); [] - + | Throw _ | TryCatch _ -> + Inout_parameters.fatal "Exception node in the AST" | UnspecifiedSequence _ | Loop _ | Block _ | Goto _ | Break _ | Continue _ | TryExcept _ | TryFinally _ @@ -591,7 +586,8 @@ let record_for_callwise_inout ((call_stack: Db.Value.callstack), value_res) = if compute_callwise () then let inout = match value_res with - | Value_types.Normal states | Value_types.NormalStore (states, _) -> + | Value_types.Normal (states, _after_states) + | Value_types.NormalStore ((states, _after_states), _) -> let kf = fst (List.hd call_stack) in let inout = if !Db.Value.no_results (Kernel_function.get_definition kf) then diff -Nru frama-c-20140301+neon+dfsg/src/inout/outputs.ml frama-c-20150201+sodium+dfsg/src/inout/outputs.ml --- frama-c-20140301+neon+dfsg/src/inout/outputs.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/inout/outputs.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/inout/outputs.mli frama-c-20150201+sodium+dfsg/src/inout/outputs.mli --- frama-c-20140301+neon+dfsg/src/inout/outputs.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/inout/outputs.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/inout/register.ml frama-c-20150201+sodium+dfsg/src/inout/register.ml --- frama-c-20140301+neon+dfsg/src/inout/register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/inout/register.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/alarms.ml frama-c-20150201+sodium+dfsg/src/kernel/alarms.ml --- frama-c-20140301+neon+dfsg/src/kernel/alarms.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/alarms.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -58,6 +58,7 @@ | Not_separated of lval * lval | Overlap of lval * lval | Uninitialized of lval + | Dangling of lval | Is_nan_or_infinite of exp * fkind | Valid_string of exp @@ -83,6 +84,7 @@ | Float_to_int _ -> 11 | Differing_blocks _ -> 12 | Valid_string _ -> 13 + | Dangling _ -> 14 let compare a1 a2 = match a1, a2 with | Division_by_zero e1, Division_by_zero e2 -> Exp.compare e1 e2 @@ -131,6 +133,7 @@ let n = Lval.compare lv11 lv21 in if n = 0 then Lval.compare lv12 lv22 else n | Uninitialized lv1, Uninitialized lv2 -> Lval.compare lv1 lv2 + | Dangling lv1, Dangling lv2 -> Lval.compare lv1 lv2 | Differing_blocks (e11, e12), Differing_blocks (e21, e22) -> let n = Exp.compare e11 e21 in if n = 0 then Exp.compare e12 e22 else n @@ -139,8 +142,8 @@ | _, (Division_by_zero _ | Memory_access _ | Logic_memory_access _ | Index_out_of_bound _ | Invalid_shift _ | Pointer_comparison _ | Overflow _ | Not_separated _ | Overlap _ | Uninitialized _ | - Is_nan_or_infinite _ | Float_to_int _ | Differing_blocks _ | - Valid_string _) + Dangling _ | Is_nan_or_infinite _ | Float_to_int _ | + Differing_blocks _ | Valid_string _) -> let n = rank a1 - rank a2 in assert (n <> 0); @@ -184,6 +187,7 @@ | Not_separated(lv1, lv2) | Overlap(lv1, lv2) -> Hashtbl.hash (rank a, Lval.hash lv1, Lval.hash lv2) | Uninitialized lv -> Hashtbl.hash (rank a, Lval.hash lv) + | Dangling lv -> Hashtbl.hash (rank a, Lval.hash lv) | Valid_string(e) -> Hashtbl.hash (rank a, Exp.hash e) let structural_descr = Structural_descr.t_abstract @@ -227,12 +231,12 @@ (String.capitalize (string_of_overflow_kind s)) Printer.pp_exp e (match b with Lower_bound -> ">=" | Upper_bound -> "<=") - Datatype.Big_int.pretty n + Datatype.Integer.pretty n | Float_to_int(e, n, b) -> Format.fprintf fmt "Float_to_int(@[%a@]@ %s@ @[%a@])" Printer.pp_exp e (match b with Lower_bound -> ">" | Upper_bound -> "<") - Datatype.Big_int.pretty + Datatype.Integer.pretty ((match b with | Lower_bound -> Integer.sub | Upper_bound -> Integer.add) n Integer.one) @@ -244,6 +248,8 @@ Lval.pretty lv1 Lval.pretty lv2 | Uninitialized lv -> Format.fprintf fmt "Uninitialized(@[%a@])" Lval.pretty lv + | Dangling lv -> + Format.fprintf fmt "Unspecified(@[%a@])" Lval.pretty lv | Valid_string e -> Format.fprintf fmt "Valid_string(@[%a@])" Exp.pretty e @@ -346,6 +352,7 @@ | Not_separated _ -> "separation" | Overlap _ -> "overlap" | Uninitialized _ -> "initialisation" + | Dangling _ -> "dangling_pointer" | Is_nan_or_infinite _ -> "is_nan_or_infinite" | Float_to_int _ -> "float_to_int" | Valid_string _ -> "valid_string" @@ -449,12 +456,12 @@ | Float_to_int(e, n, bound) -> (* n < e or e < n according to bound *) let loc = e.eloc in - let t = overflowed_expr_to_term e in + let t = Logic_const.tlogic_coerce ~loc (overflowed_expr_to_term e) Lreal in let n = (match bound with Lower_bound -> Integer.sub | Upper_bound -> Integer.add) n Integer.one in - let tn = Logic_const.tint ~loc n in + let tn = Logic_const.tlogic_coerce ~loc (Logic_const.tint ~loc n) Lreal in Logic_const.prel ~loc (match bound with Lower_bound -> Rlt, tn, t | Upper_bound -> Rlt, t, tn) @@ -482,6 +489,12 @@ let t = Logic_utils.expr_to_term ~cast:false e in Logic_const.pinitialized ~loc (Logic_const.here_label, t) + | Dangling lv -> + (* !\dangling(lv) *) + let e = Cil.mkAddrOrStartOf ~loc lv in + let t = Logic_utils.expr_to_term ~cast:false e in + Logic_const.(pnot ~loc (pdangling ~loc (Logic_const.here_label, t))) + | Is_nan_or_infinite (e, fkind) -> (* \is_finite((fkind)e) *) let loc = e.eloc in diff -Nru frama-c-20140301+neon+dfsg/src/kernel/alarms.mli frama-c-20150201+sodium+dfsg/src/kernel/alarms.mli --- frama-c-20140301+neon+dfsg/src/kernel/alarms.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/alarms.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -62,6 +62,7 @@ | Overlap of lval * lval (** overlapping read/write: the two lvalues must be separated or equal *) | Uninitialized of lval + | Dangling of lval | Is_nan_or_infinite of exp * fkind | Valid_string of exp @@ -118,6 +119,9 @@ (** Generate the predicate corresponding to a given alarm. @since Fluorine-20130401 *) +val get_name: t -> string +(** Short name of the alarm, used to prefix the assertion in the AST. *) + (* Local Variables: compile-command: "make -C ../.." diff -Nru frama-c-20140301+neon+dfsg/src/kernel/ast_info.ml frama-c-20150201+sodium+dfsg/src/kernel/ast_info.ml --- frama-c-20140301+neon+dfsg/src/kernel/ast_info.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/ast_info.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/ast_info.mli frama-c-20150201+sodium+dfsg/src/kernel/ast_info.mli --- frama-c-20140301+neon+dfsg/src/kernel/ast_info.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/ast_info.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/ast.ml frama-c-20150201+sodium+dfsg/src/kernel/ast.ml --- frama-c-20140301+neon+dfsg/src/kernel/ast.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/ast.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -30,8 +30,6 @@ (struct let name = "AST" - (* Kernel.UnrollingLevel.self is not a real dependency: the AST will - get recomputed whenever this parameter changes. See unroll.ml *) let dependencies = [ Cil.selfMachine; Kernel.SimplifyCfg.self; @@ -40,6 +38,7 @@ Kernel.ReadAnnot.self; Kernel.PreprocessAnnot.self; Kernel.Files.self; + Kernel.UnrollingLevel.self; Cil.selfFormalsDecl ] end) @@ -60,9 +59,8 @@ let add_monotonic_state state = monotonic_states := state :: !monotonic_states module After_building = Hook.Build(struct type t = Cil_types.file end) + let apply_after_computed = After_building.extend -let () = Parameter_customize.set_ast_hook apply_after_computed -let () = List.iter apply_after_computed !Parameter_customize.init_ast_hooks let mark_as_changed () = let depends = State_selection.only_dependencies self in @@ -87,7 +85,7 @@ Cil_datatype.Varinfo.Hptset.self ]; add_monotonic_state Cil_datatype.Stmt.Hptset.self; add_monotonic_state Cil_datatype.Varinfo.Hptset.self; - Cil.register_ast_dependencies self; + Cil.set_dependencies_of_ast self; Logic_env.init_dependencies self; exception Bad_Initialization of string @@ -120,9 +118,10 @@ let get () = memo (fun () -> force_compute ()) -let is_computed () = is_computed () +let is_computed () = is_computed () (* hide the optional argument [?project] *) let compute () = if not (is_computed ()) then ignore (force_compute ()) +let () = Parameter_builder.force_ast_compute := compute let set_file file = let change old_file = diff -Nru frama-c-20140301+neon+dfsg/src/kernel/ast.mli frama-c-20150201+sodium+dfsg/src/kernel/ast.mli --- frama-c-20140301+neon+dfsg/src/kernel/ast.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/ast.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -127,15 +127,12 @@ val add_hook_on_update: (unit -> unit) -> unit (** Apply the given hook each time the reference to the AST is updated, - including on a project switch. + including on a project switch. @since Fluorine-20130401 *) - (**/**) val add_linked_state: State.t -> unit - - (* Local Variables: compile-command: "make -C ../.." diff -Nru frama-c-20140301+neon+dfsg/src/kernel/boot.ml frama-c-20150201+sodium+dfsg/src/kernel/boot.ml --- frama-c-20140301+neon+dfsg/src/kernel/boot.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/boot.ml 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -40,11 +40,9 @@ with Globals.No_such_entry_point msg -> Kernel.abort "%s" msg -let on_from_name name f = match name with - | None -> f () - | Some s -> - try Project.on (Project.from_unique_name s) f () - with Not_found -> Kernel.abort "no project %S." s +let on_from_name name f = + try Project.on (Project.from_unique_name name) f () + with Project.Unknown_project -> Kernel.abort "no project `%s'." name let () = Db.Main.play := run_plugins diff -Nru frama-c-20140301+neon+dfsg/src/kernel/cilE.ml frama-c-20150201+sodium+dfsg/src/kernel/cilE.ml --- frama-c-20140301+neon+dfsg/src/kernel/cilE.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/cilE.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,127 +20,11 @@ (* *) (**************************************************************************) -(** Cil extensions for Frama-C *) - -open Cil_types -open Cil - (* ************************************************************************* *) (* [JS 2011/03/11] All the below stuff manage warnings of the value analysis plug-in. Refactoring required. *) (* ************************************************************************* *) -(* [JS 2012/10/17] pretty printing hack to preserve previous behavior - which displays low <= lv < high whenever possible. - Currently, the default printer does not do that. *) -let local_printer: Printer.extensible_printer = object (self) - inherit Printer.extensible_printer () as super - - (* Temporary variables for which we want to print more information *) - val mutable temporaries = Cil_datatype.Varinfo.Set.empty - - method! predicate fmt = function - | Pand({ content = Prel(rel1, low, t) }, - { content = Prel(rel2, _, up) }) -> - (* explicit use the undocumented form of the built - annotation... *) - Format.fprintf fmt "@[%a@ %a@ %a@ %a@ %a@]" - super#term low - Printer.pp_relation rel1 - super#term t - Printer.pp_relation rel2 - super#term up - | p -> super#predicate fmt p - - method! code_annotation fmt ca = - temporaries <- Cil_datatype.Varinfo.Set.empty; - match ca.annot_content with - | AAssert(_, p) -> - (* ignore the ACSL name *) - Format.fprintf fmt "@[@[assert@ %a;@]" self#predicate p.content; - (* print temporary variables information *) - if not (Cil_datatype.Varinfo.Set.is_empty temporaries) then begin - Format.fprintf fmt "@ @[(%t)@]" self#pp_temporaries - end; - Format.fprintf fmt "@]"; - | _ -> assert false - - method private pp_temporaries fmt = - let pp_var fmt vi = - Format.fprintf fmt "%s from@ @[%s@]" vi.vname (Extlib.the vi.vdescr) - in - Pretty_utils.pp_iter Cil_datatype.Varinfo.Set.iter - ~pre:"" ~suf:"" ~sep:",@ " pp_var fmt temporaries - - method! logic_var fmt lvi = - (match lvi.lv_origin with - | None | Some { vdescr = None }-> () - | Some ({ vdescr = Some _ } as vi) -> - temporaries <- Cil_datatype.Varinfo.Set.add vi temporaries - ); - super#logic_var fmt lvi -end - -let current_stmt_tbl = - let s = Stack.create () in - Stack.push Kglobal s; - s - -let start_stmt ki = Stack.push ki current_stmt_tbl - -let end_stmt () = - try ignore (Stack.pop current_stmt_tbl) - with Stack.Empty -> assert false - -let current_stmt () = - try Stack.top current_stmt_tbl - with Stack.Empty -> assert false - -type syntactic_context = - | SyNone - | SyCallResult - | SyBinOp of Cil_types.exp * Cil_types.binop * Cil_types.exp * Cil_types.exp - | SyUnOp of Cil_types.exp - | SyMem of Cil_types.lval - | SyMemLogic of Cil_types.term - | SySep of Cil_types.lval * Cil_types.lval - -let syntactic_context = ref SyNone -let set_syntactic_context e = - (* (match e with - | SyBinOp (e1,e2) -> - ignore - (Cil.warn - "New binary context: %a %a\n" - Cil.d_exp e1 - Cil.d_exp e2) - | SyUnOp e -> - ignore - (Cil.warn - "New unary context: %a\n" - Cil.d_exp e) - | SyMem e -> - ignore - (Cil.warn - "New mem context: %a\n" - Cil.d_lval e) - | SyNone -> ignore - (Cil.warn - "New null context\n"));*) - syntactic_context := e - -let get_syntactic_context () = current_stmt (),!syntactic_context - -let sc_kinstr_loc ki = - match ki with - | Kglobal -> (* can occur in case of obscure bugs (already happended) - with wacky initializers. Module Initial_state of - value analysis correctly positions the loc *) - assert (Cil_datatype.Kinstr.equal Kglobal - (fst (get_syntactic_context ()))); - CurrentLoc.get () - | Kstmt s -> Cil_datatype.Stmt.loc s - type alarm_behavior = { a_log: (Emitter.t * (Format.formatter -> unit)) option; a_call: unit -> unit;} @@ -163,363 +47,6 @@ { imprecision_tracing = a_ignore; defined_logic = a_ignore; unspecified = a_ignore; others=a_ignore; } -let do_warn {a_log=log;a_call=call} f = - Extlib.may f log; - call () - -let register_alarm ?kf ?(status=Property_status.Dont_know) e ki a = - Value_messages.new_alarm ki a status; - Alarms.register ~loc:(sc_kinstr_loc ki) ?kf ~status e ki a - -let warn_div warn_mode = - do_warn warn_mode.others - (fun (emitter, suffix) -> - match get_syntactic_context () with - | _,SyNone -> () - | _,(SyUnOp _ | SyMem _ | SyMemLogic _ | SySep _ | SyCallResult) -> - assert false - | ki, (SyBinOp (_, (Div|Mod), _, e)) -> - let annot, is_new = - register_alarm emitter ki (Alarms.Division_by_zero e) - in - if is_new then - Kernel.warning ~current:true - "@[division by zero:@ %a@]%t" - local_printer#code_annotation annot suffix; - |_, SyBinOp _ -> assert false) - -(** Auxiliary function that displays two simultaneous alarms as a conjunction *) -let warn_conjuctive_annots warn annot1 annot2 = - match annot1, annot2 with - | Some annot, None | None, Some annot -> warn annot - | Some { annot_content = AAssert(_, pmn) }, - Some { annot_content = AAssert(_, pmx) } - -> - let p = Logic_const.pand (pmn, pmx) in - let annot = Logic_const.new_code_annotation (AAssert([], p)) in - warn annot - | _, _ -> () - -let warn_integer_overflow warn_mode ~signed ~min:mn ~max:mx = - do_warn warn_mode.others - (fun (emitter, suffix) -> - match get_syntactic_context () with - | ki, (SyUnOp e | SyBinOp(e, _, _, _)) -> - let warn annot = - Kernel.warning ~current:true - "@[%s overflow.@ %a@]%t" - (if signed then "signed" else "unsigned") - local_printer#code_annotation annot suffix - in - let signed lower bound = - Extlib.may_map ~dft:None - (fun n -> - let kind = if signed then Alarms.Signed else Alarms.Unsigned in - let annot, is_new = - register_alarm emitter ki - (Alarms.Overflow(kind, e, n, lower)) - in - if is_new then Some annot else None) - bound - in - warn_conjuctive_annots - warn - (signed Alarms.Lower_bound mn) - (signed Alarms.Upper_bound mx) - | _ -> assert false) - -let warn_float_to_int_overflow warn_mode mn mx msg = - do_warn warn_mode.others - (fun (emitter, suffix) -> - match get_syntactic_context () with - | ki, SyUnOp e -> - let warn annot = - Kernel.warning ~current:true - "@[overflow@ in conversion@ of %t@ from@ floating-point@ \ - to integer.@ %a@]%t" msg - local_printer#code_annotation annot suffix - in - let aux lower bound = - Extlib.may_map ~dft:None - (fun n -> - let annot, is_new = - register_alarm emitter ki (Alarms.Float_to_int(e, n, lower)) - in - if is_new then Some annot else None - ) - bound - in - warn_conjuctive_annots - warn - (aux Alarms.Lower_bound mn) - (aux Alarms.Upper_bound mx) - | _ -> assert false) - -let warn_shift warn_mode size = - do_warn warn_mode.others - (fun (emitter, suffix) -> - match get_syntactic_context () with - | _,SyNone -> () - | _,(SyUnOp _ | SyMem _ | SyMemLogic _ | SySep _ | SyCallResult) -> - assert false - | ki,SyBinOp (_, (Shiftrt | Shiftlt),_,exp_d) -> - let annot, is_new = - register_alarm emitter ki (Alarms.Invalid_shift(exp_d, Some size)) - in - if is_new then - Kernel.warning ~current:true - "@[invalid RHS operand for shift.@ %a@]%t" - local_printer#code_annotation annot suffix; - | _, SyBinOp _ -> - assert false) - -let warn_shift_left_positive warn_mode = - do_warn warn_mode.others - (fun (emitter, suffix) -> - match get_syntactic_context () with - | _,SyNone -> () - | _, (SyUnOp _ | SyMem _ | SyMemLogic _ | SySep _ | SyCallResult) -> - assert false - | ki, SyBinOp (_, (Shiftrt | Shiftlt),exp_l,_) -> - let annot, is_new = - register_alarm emitter ki (Alarms.Invalid_shift(exp_l, None)) - in - if is_new then - Kernel.warning ~current:true - "@[invalid LHS operand for left shift.@ %a@]%t" - local_printer#code_annotation annot suffix - | _, SyBinOp _ -> - assert false) - -let pretty_warn_mem_mode fmt m = - Format.pp_print_string fmt - (match m with Alarms.For_reading -> "read" | Alarms.For_writing -> "write") - -let warn_mem warn_mode wmm = - do_warn warn_mode.others - (fun (emitter, suffix) -> - let warn_term ki mk_alarm = - let valid = wmm in - let annot, is_new = register_alarm emitter ki (mk_alarm valid) in - if is_new then - Kernel.warning ~current:true "@[out of bounds %a.@ %a@]%t" - pretty_warn_mem_mode wmm - local_printer#code_annotation annot suffix; - in - match get_syntactic_context () with - | _,SyNone -> () - | _,(SyBinOp _ | SyUnOp _ | SySep _ | SyCallResult) -> assert false - | ki,SyMem lv_d -> - warn_term ki (fun v -> Alarms.Memory_access(lv_d, v)); - (match lv_d with - | Mem _,_ | _, (Index _ | Field _) -> () - | Var v, NoOffset -> - match Base.validity_from_type v with - | Base.Invalid | Base.Unknown _ | Base.Periodic _ -> () - | Base.Known _ -> - (* Invalid syntactic context, or deep bug *) - Kernel.fatal "ERR 937: %a@." Printer.pp_lval lv_d) - | ki,SyMemLogic term -> - warn_term ki (fun v -> Alarms.Logic_memory_access(term, v))) - -let warn_mem_read warn_mode = warn_mem warn_mode Alarms.For_reading -let warn_mem_write warn_mode = warn_mem warn_mode Alarms.For_writing - -let warn_index warn_mode ~positive ~range = - do_warn warn_mode.others - (fun (emitter, suffix) -> - match get_syntactic_context () with - | _,SyNone -> () - | _,(SyMem _ | SyMemLogic _ | SyUnOp _ | SySep _ | SyCallResult) -> - assert false - | ki ,SyBinOp (_, IndexPI, e1, e2) -> - let left = - if not positive then - Some - (register_alarm - emitter ki (Alarms.Index_out_of_bound(e1, None))) - else None - in - let annot, is_new = - register_alarm emitter ki (Alarms.Index_out_of_bound(e1, Some e2)) - in - let warn a = - Kernel.warning ~current:true - "@[accessing out of bounds index %s.@ @[%a@]@]%t" - range - local_printer#code_annotation a - suffix - in - if is_new then - let a = match left, annot with - | None, _ | Some(_, false), _ -> annot - | Some({ annot_content = AAssert(_, l) }, true), - { annot_content = AAssert(_, r) } -> - let p = Logic_const.pand (l, r) in - Logic_const.new_code_annotation (AAssert([], p)) - | Some _, _ -> assert false - in - warn a - else - Extlib.may (fun (a, b) -> if b then warn a) left - | _, SyBinOp _ -> - assert false) - -let warn_pointer_comparison warn_mode = - do_warn warn_mode.defined_logic - (fun (emitter, suffix) -> - let aux ki e1 e2 = - let annot, is_new = - register_alarm emitter ki (Alarms.Pointer_comparison (e1, e2)) - in - if is_new then - Kernel.warning ~current:true - "@[pointer comparison:@ %a@]%t" - local_printer#code_annotation annot suffix; - in - match get_syntactic_context () with - | _,SyNone -> () - | _,(SyMem _ | SyMemLogic _ | SySep _ | SyCallResult) -> - assert false - | ki, SyUnOp e -> aux ki None e - | ki, SyBinOp (_, (Eq|Ne|Ge|Le|Gt|Lt), e1, e2) -> aux ki (Some e1) e2 - | _, SyBinOp _ -> - assert false) - -let warn_valid_string warn_mode = - do_warn warn_mode.defined_logic - (fun (emitter, suffix) -> - let aux ki e = - let annot, is_new = - register_alarm emitter ki (Alarms.Valid_string e) - in - if is_new then - Kernel.warning ~current:true - "@[may not point to a valid string:@ %a@]%t" - local_printer#code_annotation annot suffix; - in - match get_syntactic_context () with - | _,SyNone -> () - | _,(SyMemLogic _ | SySep _ | SyCallResult | SyMem _ | SyBinOp _) -> - assert false - | ki, SyUnOp e -> - aux ki e) - -let warn_pointer_subtraction warn_mode = - do_warn warn_mode.defined_logic - (fun (emitter, suffix) -> - match get_syntactic_context () with - | _,SyNone -> () - | _,(SyMem _ | SyMemLogic _ | SySep _ | SyCallResult | SyUnOp _) -> - assert false - | ki, SyBinOp (_, _, e1, e2) -> - let annot, is_new = - register_alarm emitter ki (Alarms.Differing_blocks (e1, e2)) - in - if is_new then - Kernel.warning ~current:true - "@[pointer subtraction:@ %a@]%t" - local_printer#code_annotation annot suffix) - -let warn_nan_infinite warn_mode fkind pp = - let sfkind = match fkind with - | None -> "real" - | Some FFloat -> "float" - | Some FDouble -> "double" - | Some FLongDouble -> "long double" - in - do_warn warn_mode.others - (fun (emitter, suffix) -> - match get_syntactic_context () with - | _,SyNone -> () - | _,(SyBinOp _ | SyMem _ | SyMemLogic _ | SySep _) -> assert false - | _, SyCallResult -> (* cf. bug 997 *) - Kernel.warning ~current:true ~once:true - "@[non-finite@ %s@ value being@ returned:@ \ - assert(\\is_finite(\\returned_value))@]%t" sfkind suffix; - | ki,SyUnOp (exp_r) -> - (* Should always be called with a non-none fkind, except in logic - mode (in which case this code is not executed *) - let fkind = Extlib.the fkind in - let annot, is_new = - register_alarm emitter ki (Alarms.Is_nan_or_infinite (exp_r, fkind)) - in - if is_new then - Kernel.warning ~current:true ~once:true - "@[non-finite@ %s@ value@ (%t):@ %a@]%t" - sfkind pp local_printer#code_annotation annot suffix) - -let warn_uninitialized warn_mode = - do_warn warn_mode.unspecified - (fun (emitter, suffix) -> - match get_syntactic_context () with - | _, SyNone - | _, (SyBinOp _ | SyUnOp _ | SySep _ | SyMemLogic _) -> assert false - | _, SyCallResult -> - Kernel.warning ~once:true ~current:true - "@[returned value may be uninitialized:@ \ - assert \\initialized(\\returned_value)@]%t" suffix; - | ki, SyMem lv_d -> - let annot, is_new = - register_alarm emitter ki (Alarms.Uninitialized lv_d) - in - if is_new then - Kernel.warning ~current:true - "@[accessing uninitialized left-value:@ %a@]%t" - local_printer#code_annotation annot suffix) - -let warn_escapingaddr warn_mode = - do_warn warn_mode.unspecified - (fun (_emitter, suffix) -> - match get_syntactic_context () with - | _,SyNone -> () - | _,(SyBinOp _ | SyUnOp _ | SySep _ | SyMemLogic _) -> assert false - | _, SyCallResult -> - Kernel.warning ~once:true ~current:true - "@[returned value may be contain escaping addresses:@ \ - assert \\defined(\\returned_value)@]%t" suffix; - | _,SyMem lv_d -> - (* TODO Ook *) - Kernel.warning ~once:true ~current:true - "@[accessing left-value@ that contains@ escaping@ addresses;\ - @ assert(\\defined(&%a))@]%t" Printer.pp_lval lv_d suffix) - -let warn_separated warn_mode = - do_warn warn_mode.others - (fun (emitter, suffix) -> - match get_syntactic_context () with - | _,SyNone -> () - | _,(SyBinOp _ | SyUnOp _ | SyMem _ | SyMemLogic _| SyCallResult) -> - assert false - | ki,SySep(lv1,lv2) -> - let annot, is_new = - register_alarm emitter ki (Alarms.Not_separated(lv1, lv2)) - in - if is_new then - Kernel.warning ~current:true - "@[undefined multiple accesses in expression.@ %a@]%t" - local_printer#code_annotation annot suffix) - -let warn_overlap (loc1, loc2) warn_mode = - do_warn warn_mode.others - (fun (emitter, suffix) -> - match get_syntactic_context () with - | _,SyNone -> () - | _,(SyBinOp _ | SyUnOp _ | SyMem _ | SyMemLogic _| SyCallResult) -> - assert false - | ki,SySep(lv1,lv2) -> - let annot, is_new = - register_alarm emitter ki (Alarms.Overlap(lv1, lv2)) - in - if is_new then - Kernel.warning ~current:true - "@[partially overlapping@ lvalue assignment@ \ - (%a,@ size %a bits;@ %a,@ size %a bits).@ %a@]%t" - (Locations.pretty_english ~prefix:false) - loc1 Int_Base.pretty loc1.Locations.size - (Locations.pretty_english ~prefix:false) loc2 - Int_Base.pretty loc2.Locations.size - local_printer#code_annotation annot suffix) (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/kernel/cilE.mli frama-c-20150201+sodium+dfsg/src/kernel/cilE.mli --- frama-c-20140301+neon+dfsg/src/kernel/cilE.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/cilE.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,7 +20,7 @@ (* *) (**************************************************************************) -(** CIL Extension for Frama-C. +(** Value analysis alarms @plugin development guide *) (* ************************************************************************* *) @@ -28,36 +28,15 @@ plug-in. Refactoring required. *) (* ************************************************************************* *) -type syntactic_context = - | SyNone - | SyCallResult - | SyBinOp of Cil_types.exp * Cil_types.binop * Cil_types.exp * Cil_types.exp - | SyUnOp of Cil_types.exp - | SyMem of Cil_types.lval - | SyMemLogic of Cil_types.term - | SySep of Cil_types.lval * Cil_types.lval - (** assert that two locations must be separated *) - -val start_stmt : Cil_types.kinstr -> unit -val end_stmt : unit -> unit -val current_stmt : unit -> Cil_types.kinstr - -val set_syntactic_context : syntactic_context -> unit -val get_syntactic_context : unit -> Cil_types.kinstr*syntactic_context - type alarm_behavior = { a_log: (Emitter.t * (Format.formatter -> unit)) option; - (** log the alarm using the global variable that has been set - with set_syntactic_context, and continue, + (** log the alarm, and continue, pretending that the problematic values do not happen *) a_call: unit -> unit; (** call function after optionally emitting with field a_log. *) } -val do_warn: alarm_behavior -> - ((Emitter.t * (Format.formatter -> unit)) -> unit) -> unit - val a_ignore: alarm_behavior type warn_mode = @@ -86,40 +65,6 @@ val warn_none_mode : warn_mode (** Do not emit any message. *) -val warn_div : warn_mode -> unit -val warn_shift : warn_mode -> int -> unit -val warn_shift_left_positive : warn_mode -> unit -val warn_mem_read : warn_mode -> unit -val warn_mem_write : warn_mode -> unit -val warn_integer_overflow : - warn_mode -> signed:bool -> min:Integer.t option -> max:Integer.t option -> unit -val warn_float_to_int_overflow: - warn_mode -> - Integer.t option -> Integer.t option -> (Format.formatter -> unit) -> unit - -val warn_index : warn_mode -> positive:bool -> range:string -> unit -(** [warn_index w ~positive ~range] emits a warning signaling an out of bounds - access. The expression used as index is taken from the syntactic context. - [range] is used to display the inferred values for the index. - If [positive] is true, the generated assertion is of the form - [e < upper_bound]; otherwise, two assertions are generated: [0 <= e] - and [e < upper_bound]. -*) -val warn_pointer_comparison : warn_mode -> unit -val warn_valid_string : warn_mode -> unit -val warn_pointer_subtraction : warn_mode -> unit -val warn_nan_infinite: - warn_mode -> Cil_types.fkind option -> (Format.formatter -> unit) -> unit -val warn_uninitialized : warn_mode -> unit -val warn_escapingaddr : warn_mode -> unit -(** warning to be emitted when two incompatible accesses to a location are - done in unspecified order. Must be called in a [SyNone] or [SySep] context. -*) -val warn_separated : warn_mode -> unit -val warn_overlap : - Locations.location * Locations.location -> warn_mode -> unit - - (* Local Variables: compile-command: "make -C ../.." diff -Nru frama-c-20140301+neon+dfsg/src/kernel/clone.ml frama-c-20150201+sodium+dfsg/src/kernel/clone.ml --- frama-c-20140301+neon+dfsg/src/kernel/clone.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/clone.ml 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,96 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) + +open Cil_types + +(** Experimental module *) + + +let mk_new_name = + let prefix = "__fc_clone_" in + let counter = ref 0 in + fun name -> incr counter; prefix ^ (string_of_int !counter) ^ "_" ^ name + + +(** Returns a clone of a defined kernel function to add into the current AST *) +let clone_function_definition old_kf = + let visitor = new Visitor.frama_c_refresh (Project.current()) in + let old_fundec = Kernel_function.get_definition old_kf in + let old_loc = Kernel_function.get_location old_kf in + let old_funspec = Annotations.funspec ~populate:false old_kf in + visitor#set_current_kf old_kf; + visitor#set_current_func old_fundec; + let new_fundec = Visitor.visitFramacFunction visitor old_fundec in + let new_vi = new_fundec.svar in + new_vi.vname <- mk_new_name old_fundec.svar.vname; + let new_funspec = + Visitor.visitFramacFunspec visitor old_funspec + in + (* Creates the kernel function for the clone function. *) + let new_kf = + (* NOTE: it would be better if the replace function would + return the associated kernel function that is new here *) + Globals.Functions.replace_by_definition new_funspec new_fundec old_loc; + try Globals.Functions.get new_fundec.svar + with Not_found -> + Kernel.fatal "No clone kernel function for %s(%d)" + new_fundec.svar.vname new_fundec.svar.vid + in + new_kf + +(** Returns a clone of a kernel function and adds it into the current AST *) +let clone_defined_kernel_function old_kf = + let f = Ast.get() in + let new_kf = clone_function_definition old_kf in + let new_fundec = Kernel_function.get_definition new_kf in + let new_loc = Kernel_function.get_location new_kf in + let gfun = GFun (new_fundec, new_loc) in + + let old_vi = Kernel_function.get_vi old_kf in + let is_old_fundec fundec = Cil_datatype.Varinfo.equal fundec.svar old_vi in + let is_old_gfun = function + | GFun (fundec,_) -> is_old_fundec fundec + | _ -> false + in + (* Scan the globals. Make sure this is tail recursive. *) + let rec loop (acc: global list) = function + | [] -> begin + match f.globinit with + | Some fundec when is_old_fundec fundec -> + (* The clone function is the global initializer function. + Adds it at the end of the list of globals. *) + List.rev_append acc [gfun] + | _ -> Kernel.fatal "kernel function not found for %s(%d)" old_vi.vname old_vi.vid + end + | g :: restg when is_old_gfun g -> List.rev_append acc (g:: gfun ::restg) + | g :: restg -> loop (g::acc) restg + in + (* Updates the list of globals *) + f.globals <- loop [] f.globals; + Ast.mark_as_grown(); + new_kf + +(* +Local Variables: +compile-command: "make -C ../.." +End: +*) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/clone.mli frama-c-20150201+sodium+dfsg/src/kernel/clone.mli --- frama-c-20140301+neon+dfsg/src/kernel/clone.mli 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/clone.mli 2015-05-28 08:53:23.000000000 +0000 @@ -0,0 +1,36 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) + +open Cil_types + +(** Experimental module *) + +(** Returns a clone of a kernel function and + adds it into the AST next to the old one *) +val clone_defined_kernel_function: kernel_function -> kernel_function + + +(* +Local Variables: +compile-command: "make -C ../.." +End: +*) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/cmdline.ml frama-c-20150201+sodium+dfsg/src/kernel/cmdline.ml --- frama-c-20140301+neon+dfsg/src/kernel/cmdline.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/cmdline.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -76,6 +76,8 @@ let use_obj_ref = ref true let use_type_ref = ref true +let last_project_created_by_copy = ref (fun () -> assert false) + (* ************************************************************************* *) (** {2 Handling errors} *) (* ************************************************************************* *) @@ -178,8 +180,8 @@ let bail_out_ref = ref (fun _ -> assert false) let bail_out () = - !bail_out_ref (); (* bail_out_ref must call exit 0 *) - assert false + !bail_out_ref (); (* bail_out_ref must exit 0 *) + Kernel_log.fatal "Cmdline.bail_out must `exit 0'." let catch_toplevel_run ~f ~quit ~at_normal_exit ~on_error = (* both functions below handle errors at exit hooks *) @@ -259,6 +261,11 @@ with Not_found -> option, arg, false +type then_argument = + | Default + | Last + | Name of string + let parse known_options_list then_expected options_list = let known_options = Hashtbl.create 17 in List.iter (fun (n, s) -> Hashtbl.add known_options n s) known_options_list; @@ -299,11 +306,11 @@ in let rec go unknown_options nb_used = function | [] -> unknown_options, nb_used, None - | [ "-then" ] when then_expected -> - Kernel_log.warning "ignoring last option `-then'"; + | [ "-then" | "-then-last" as then_name ] when then_expected -> + Kernel_log.warning "ignoring last option `%s'." then_name; unknown_options, nb_used, None | [ "-then-on" ] when then_expected -> - raise_error "-then-on" "requires a string as argument" + raise_error "-then-on" "requires a string as argument." | [ option ] -> let unknown, use_arg, is_used = parse_one_option unknown_options option "" @@ -311,9 +318,11 @@ assert (not use_arg); unknown, (if is_used then succ nb_used else nb_used), None | "-then" :: then_options when then_expected -> - unknown_options, nb_used, Some (then_options, None) + unknown_options, nb_used, Some (then_options, Default) + | "-then-last" :: then_options when then_expected -> + unknown_options, nb_used, Some (then_options, Last) | "-then-on" :: project_name :: then_options when then_expected -> - unknown_options, nb_used, Some (then_options, Some project_name) + unknown_options, nb_used, Some (then_options, Name project_name) | option :: (arg :: next_options as arg_next) -> let unknown, use_arg, is_used = parse_one_option unknown_options option arg @@ -395,7 +404,7 @@ ohelp: string; ovisible: bool; ext_help: (unit,Format.formatter,unit) format; - setting: option_setting } + mutable setting: option_setting } module Plugin: sig type t = private @@ -409,6 +418,8 @@ val add_option: string -> group:string -> cmdline_option -> unit val add_aliases: orig:string -> string -> group:string -> string list -> cmdline_option list + val replace_option_setting: + string -> plugin:string -> group:string -> option_setting -> unit val find: string -> t val find_option_aliases: cmdline_option -> cmdline_option list val is_option_alias: cmdline_option -> bool @@ -511,6 +522,19 @@ let is_option_alias o = Option_names.is_option_alias o.oname + let replace_option_setting option ~plugin ~group setting = + if option <> "" then + let options_in_group = find_group plugin group in + let rec replace = function + | [] -> + Kernel_log.fatal + "no option %s in plugin %s ((group of options %s)." + option plugin group + | o :: _ when o.oname = option -> o.setting <- setting + | _ :: l -> replace l + in + replace !options_in_group + end let add_plugin = Plugin.add @@ -673,6 +697,8 @@ in List.iter add l +let replace_option_setting = Plugin.replace_option_setting + module On_Files = Hook.Build(struct type t = string list end) let use_cmdline_files = On_Files.extend @@ -705,6 +731,8 @@ !nb_used_relevant "function `nb_given_options' called too early"); !nb_used_ref +let load_all_plugins = ref (fun () -> assert false) + let rec play_in_toplevel on_from_name nb_used play options = let options, nb_used_extended, then_options_extended = Extended_Stage.parse options @@ -735,10 +763,20 @@ play (); match then_options_extended with | None -> () - | Some(options, project_name) -> - on_from_name - project_name - (fun () -> play_in_toplevel on_from_name nb_used play options) + | Some(options, then_argument) -> + match then_argument with + | Default -> play_in_toplevel on_from_name nb_used play options + | Last -> + (match !last_project_created_by_copy () with + | None -> Kernel_log.abort "no known last created project." + | Some p -> + on_from_name + p + (fun () -> play_in_toplevel on_from_name nb_used play options)) + | Name p -> + on_from_name + p + (fun () -> play_in_toplevel on_from_name nb_used play options) let parse_and_boot on_from_name get_toplevel play = let options, nb_used_early, then_options_early = @@ -748,6 +786,7 @@ let options, nb_used_extending, then_options_extending = Extending_Stage.parse options in + !load_all_plugins (); assert (then_options_extending = None); get_toplevel () diff -Nru frama-c-20140301+neon+dfsg/src/kernel/cmdline.mli frama-c-20150201+sodium+dfsg/src/kernel/cmdline.mli --- frama-c-20140301+neon+dfsg/src/kernel/cmdline.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/cmdline.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -23,18 +23,33 @@ (** Command line parsing. @plugin development guide *) +(* ************************************************************************** *) (** {2 Stage configurations} +(* ************************************************************************** *) Frama-C uses several stages for parsing its command line. Each of them may be customized. *) -type stage = - | Early (** @plugin development guide *) - | Extending (** @plugin development guide *) - | Extended (** @plugin development guide *) - | Exiting (** @plugin development guide *) - | Loading (** @plugin development guide *) - | Configuring (** @plugin development guide *) +type stage = + | Early (** Initial stage for very specific almost hard-coded + options. Do not use it. + @plugin development guide *) + | Extending (** Before loading plug-ins. Run only once. + @plugin development guide *) + | Extended (** The stage where plug-ins are loaded. + It is also the first stage each time the Frama-C main + loop is run (e.g. after each "-then"). + @plugin development guide *) + | Exiting (** Run once when exiting Frama-C. + @plugin development guide *) + | Loading (** After {!Extended}, the stage where a previous Frama-C + internal states is restored (e.g. the one specified by + -load or by running the journal). + @plugin development guide *) + | Configuring (** The stage where all the parameters which were not already + set may be modified to take into account cmdline options. + Just after this stage, Frama-C will run the plug-in mains. + @plugin development guide *) (** The different stages, from the first to be executed to the last one. @since Beryllium-20090601-beta1 *) @@ -93,6 +108,54 @@ @plugin development guide @since Carbon-20101201 *) +val at_normal_exit: (unit -> unit) -> unit + (** Register a hook executed whenever Frama-C exits without error (the exit + code is 0). + @since Boron-20100401 *) + +val at_error_exit: (exn -> unit) -> unit + (** Register a hook executed whenever Frama-C exits with error (the exit + code is greater than 0). The argument of the hook is the exception at the + origin of the error. + @since Boron-20100401 + @modify Neon-20130301 add the exception as argument of the + hook. *) + +(** Group of command line options. + @since Beryllium-20090901 *) +module Group : sig + type t (** @since Beryllium-20090901 *) + val default: t (** @since Beryllium-20090901 *) + val name: t -> string + (** @since Beryllium-20090901 *) + + (**/**) + (** Kernel internals *) + + val add: ?memo:bool -> plugin:string -> string -> t * bool + (** Add a new group of options to the given plugin. + If [memo] is [true], just return the already registered group if any. + If [memo] is [false], cannot add twice a group with the same name. + @return the group corresponding to the given name. Also return [true] + iff the group has just been created. + @since Beryllium-20090901 *) + (**/**) + +end + +(**/**) + +(* ************************************************************************** *) +(* ************************************************************************** *) +(** From here: functions required by Kernel Internals only! + You should not use them! *) +(* ************************************************************************** *) +(* ************************************************************************** *) + +(* ************************************************************************** *) +(** {2 Handle Hooks} *) +(* ************************************************************************** *) + val protect: exn -> string (** Messages for exceptions raised by Frama-C @since Boron-20100401 *) @@ -115,23 +178,10 @@ @modify Fluorine-20130601+Dev add the exception as argument of [on_error]. *) -val at_normal_exit: (unit -> unit) -> unit - (** Register a hook executed whenever Frama-C exits without error (the exit - code is 0). - @since Boron-20100401 *) - val run_normal_exit_hook: unit -> unit (** Run all the hooks registered by {!at_normal_exit}. @since Boron-20100401 *) -val at_error_exit: (exn -> unit) -> unit - (** Register a hook executed whenever Frama-C exits with error (the exit - code is greater than 0). The argument of the hook is the exception at the - origin of the error. - @since Boron-20100401 - @modify Neon-20130301 add the exception as argument of the - hook. *) - val run_error_exit_hook: exn -> unit (** Run all the hooks registered by {!at_normal_exit}. @since Boron-20100401 @@ -148,22 +198,25 @@ (** Stop Frama-C with exit 0. @since Boron-20100401 *) +(* ************************************************************************** *) (** {2 Special functions} +(* ************************************************************************** *) These functions should not be used by a standard plug-in developer. *) val parse_and_boot: - (string option -> (unit -> unit) -> unit) -> + (string -> (unit -> unit) -> unit) -> (unit -> (unit -> unit) -> unit) -> (unit -> unit) -> unit (** Not for casual users. [parse_and_boot on_from_name get_toplevel play] performs the parsing of the command line, then play the analysis with the good toplevel provided by [get_toplevel]. [on_from_name] is [Project.on] on the - project corresponding to the given (unique) name (or the default project if - [None]). + project corresponding to the given (unique) name. @since Beryllium-20090901 - @modify Carbon-20101201 *) + @modify Carbon-20101201 + @modify Sodium-20150201 the first argument of the first functional is no + more a string option, just a string *) val nb_given_options: unit -> int (** Number of options provided by the user on the command line. @@ -174,21 +227,6 @@ (** What to do with the list of files put on the command lines. @since Beryllium-20090601-beta1 *) -(** @since Beryllium-20090901 *) -module Group : sig - type t (** @since Beryllium-20090901 *) - val default: t (** @since Beryllium-20090901 *) - val add: ?memo:bool -> plugin:string -> string -> t * bool - (** Add a new group of options to the given plugin. - If [memo] is [true], just return the already registered group if any. - If [memo] is [false], cannot add twice a group with the same name. - @return the group corresponding to the given name. Also return [true] - iff the group has just been created. - @since Beryllium-20090901 *) - val name: t -> string - (** @since Beryllium-20090901 *) -end - val help: unit -> exit (** Display the help of Frama-C @since Beryllium-20090601-beta1 *) @@ -269,7 +307,14 @@ @Invalid_argument if an alias name is the empty string @since Carbon-20110201 *) +val replace_option_setting: + string -> plugin:string -> group:Group.t -> option_setting -> unit +(** Replace the previously registered option setting. + @since Neon-20140201+dev *) + +(* ************************************************************************** *) (** {2 Special parameters} +(* ************************************************************************** *) Frama-c parameters depending on the command line argument and set at the very beginning of the Frama-C initialisation. @@ -277,7 +322,7 @@ They should not be used directly by a standard plug-in developer. *) module Kernel_log: Log.Messages -(** @since Neon-20130301 *) +(** @since Neon-20140301 *) (** @since Fluorine-20130401 *) module type Level = sig @@ -321,6 +366,12 @@ (** Must not be used for something else that initializing values @since Beryllium-20090601-beta1 *) +val last_project_created_by_copy: (unit -> string option) ref + +val load_all_plugins: (unit -> unit) ref + +(**/**) + (* Local Variables: compile-command: "make -C ../.." diff -Nru frama-c-20140301+neon+dfsg/src/kernel/command.ml frama-c-20150201+sodium+dfsg/src/kernel/command.ml --- frama-c-20140301+neon+dfsg/src/kernel/command.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/command.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -245,14 +245,16 @@ if !Config.is_gui || timeout > 0 then let f = command_generic ~async:true ?stdout ?stderr cmd args in let res = ref(Unix.WEXITED 99) in - let elapsed = ref 0 in + let ftimeout = float_of_int timeout in + let start = ref (Unix.gettimeofday ()) in let running () = match f () with | Not_ready terminate -> begin try !Db.progress () ; - if timeout > 0 && !elapsed > timeout then raise Db.Cancel ; + if timeout > 0 && Unix.gettimeofday () -. !start > ftimeout then + raise Db.Cancel ; true with Db.Cancel as e -> terminate (); @@ -261,7 +263,7 @@ | Result r -> res := r; false - in while running () do Unix.sleep 1 done ; !res + in while running () do Extlib.usleep 100000 (* 0.1s *) done ; !res else let f = command_generic ~async:false ?stdout ?stderr cmd args in match f () with diff -Nru frama-c-20140301+neon+dfsg/src/kernel/command.mli frama-c-20150201+sodium+dfsg/src/kernel/command.mli --- frama-c-20140301+neon+dfsg/src/kernel/command.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/command.mli 2015-05-28 08:53:23.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/config.mli frama-c-20150201+sodium+dfsg/src/kernel/config.mli --- frama-c-20140301+neon+dfsg/src/kernel/config.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/config.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -71,6 +71,13 @@ "gcc -C -E -I." @since Oxygen-20120901 *) +val preprocessor_is_gnu_like: bool + (** whether the default preprocessor accepts the same options as gcc + (i.e. is either gcc or clang), when this is the case, the default + command line for pre-processing contains more options. + @since Sodium-20150201 + *) + val preprocessor_keep_comments: bool (** [true] if the default preprocessor selected during compilation is able to keep comments (hence ACSL annotations) in its output. diff -Nru frama-c-20140301+neon+dfsg/src/kernel/config.ml.in frama-c-20150201+sodium+dfsg/src/kernel/config.ml.in --- frama-c-20140301+neon+dfsg/src/kernel/config.ml.in 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/config.ml.in 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,70 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) + +let version = "@VERSION@" +let date = "@CURR_DATE@" + +let is_gui = ref false + +let ocamlc = "@OCAMLC@" +let ocamlopt = "@OCAMLOPT@" + +let datadir = try Sys.getenv "FRAMAC_SHARE" with Not_found -> "@FRAMAC_DATADIR@" +let () = Filepath.add_symbolic_dir "FRAMAC_SHARE" datadir +let libdir = try Sys.getenv "FRAMAC_LIB" with Not_found -> "@FRAMAC_LIBDIR@" +let () = Filepath.add_symbolic_dir "FRAMAC_LIB" libdir +let plugin_dir = + try Sys.getenv "FRAMAC_PLUGIN" + with Not_found -> + try (Sys.getenv "FRAMAC_LIB") ^ "/plugins" + with Not_found -> + let myself = Filename.basename Sys.executable_name in + let myself = if Filename.check_suffix myself (".opt" ^ "@EXE@") + then Filename.chop_suffix myself (".opt" ^ "@EXE@") + else myself + in + let myself = + if Filename.check_suffix myself (".byte" ^ "@EXE@") + then Filename.chop_suffix myself (".byte" ^ "@EXE@") + else myself + in + if myself = "toplevel" || myself = "viewer" then + "@FRAMAC_TOP_SRCDIR@/lib/plugins" + else "@FRAMAC_PLUGINDIR@" +let () = Filepath.add_symbolic_dir "FRAMAC_PLUGIN" plugin_dir + +let preprocessor = + try Sys.getenv "CPP" with Not_found -> "@FRAMAC_DEFAULT_CPP@" + +let preprocessor_is_gnu_like = + try ignore (Sys.getenv "CPP"); false with Not_found -> @FRAMAC_GNU_CPP@ + +let preprocessor_keep_comments = + try (ignore (Sys.getenv "CPP"); true) + with Not_found -> @DEFAULT_CPP_KEEP_COMMENTS@ + +let static_plugins = [@STATIC_PLUGINS@] +let static_gui_plugins = [@STATIC_GUI_PLUGINS@] + +let compilation_unit_names = [@COMPILATION_UNITS@] + +let dot = @OPTDOT@ diff -Nru frama-c-20140301+neon+dfsg/src/kernel/db.ml frama-c-20150201+sodium+dfsg/src/kernel/db.ml --- frama-c-20140301+neon+dfsg/src/kernel/db.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/db.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -292,14 +292,14 @@ (struct let name = "Value analysis results" let size = size - let dependencies = dependencies + let dependencies = [ Table_By_Callstack.self ] end) (* Clear Value's various caches each time [Db.Value.is_computed] is updated, including when it is set, reset, or during project change. Some operations of Value depend on -ilevel, -plevel, etc, so clearing those caches when Value ends ensures that those options will have an effect between two runs of Value. *) - let () = Table.add_hook_on_update + let () = Table_By_Callstack.add_hook_on_update (fun _ -> Cvalue.V_Offsetmap.clear_caches (); Cvalue.Model.clear_caches (); @@ -309,13 +309,6 @@ ) - module AfterTable = - Cil_state_builder.Stmt_hashtbl(Cvalue.Model) - (struct - let name = "Value analysis after states" - let dependencies = [Table.self] - let size = size - end) module AfterTable_By_Callstack = Cil_state_builder.Stmt_hashtbl(States_by_callstack) (struct @@ -323,17 +316,24 @@ let size = size let dependencies = dependencies end) + module AfterTable = + Cil_state_builder.Stmt_hashtbl(Cvalue.Model) + (struct + let name = "Value analysis after states" + let dependencies = [AfterTable_By_Callstack.self] + let size = size + end) - let self = Table.self + let self = Table_By_Callstack.self let only_self = [ self ] let mark_as_computed = Journal.register "Db.Value.mark_as_computed" (Datatype.func Datatype.unit Datatype.unit) - Table.mark_as_computed + Table_By_Callstack.mark_as_computed - let is_computed () = Table.is_computed () + let is_computed () = Table_By_Callstack.is_computed () module Conditions_table = Cil_state_builder.Stmt_hashtbl @@ -377,15 +377,24 @@ let recursive_call_occurred kf = RecursiveCallsFound.add kf - module Called_Functions = - Cil_state_builder.Varinfo_hashtbl + module Called_Functions_By_Callstack = + State_builder.Hashtbl(Value_types.Callstack.Hashtbl) (Cvalue.Model) (struct - let name = "called_functions" + let name = "called_functions_by_callstack" let size = 11 let dependencies = only_self end) + module Called_Functions_Memo = + State_builder.Hashtbl(Kernel_function.Hashtbl) + (Cvalue.Model) + (struct + let name = "called_functions_memo" + let size = 11 + let dependencies = [ Called_Functions_By_Callstack.self ] + end) + (* let pretty_table () = Table.iter @@ -415,8 +424,10 @@ module Record_Value_Callbacks_New = Hook.Build (struct - type t = (kernel_function * kinstr) list * - (state Stmt.Hashtbl.t) Lazy.t Value_types.callback_result + type t = + (kernel_function * kinstr) list * + ((state Stmt.Hashtbl.t) Lazy.t * (state Stmt.Hashtbl.t) Lazy.t) + Value_types.callback_result end) module Record_Value_After_Callbacks = @@ -460,35 +471,51 @@ let r = Callstack.Hashtbl.create 7 in Callstack.Hashtbl.add r callstack v; add stmt r - - let update_table stmt v = - try - let old = Table.find stmt in - let joined_global = Cvalue.Model.join old v in - Table.replace stmt joined_global; - with - Not_found -> Table.add stmt v - let merge_initial_state kf state = - let vi = Kernel_function.get_vi kf in + let merge_initial_state cs state = try - let old = Called_Functions.find vi in - Called_Functions.replace vi (Cvalue.Model.join old state) + let old = Called_Functions_By_Callstack.find cs in + Called_Functions_By_Callstack.replace cs (Cvalue.Model.join old state) with - Not_found -> Called_Functions.add vi state + Not_found -> Called_Functions_By_Callstack.add cs state + let get_initial_state kf = - try - Called_Functions.find (Kernel_function.get_vi kf) + assert (is_computed ()); (* this assertion fails during value analysis *) + try Called_Functions_Memo.find kf with Not_found -> - Cvalue.Model.bottom + let state = + Called_Functions_By_Callstack.fold (fun cs state acc -> + match cs with + | (kf', _) :: _ when Kernel_function.equal kf kf' -> + Cvalue.Model.join acc state + | _ -> acc + ) Cvalue.Model.bottom + in + Called_Functions_Memo.add kf state; + state let valid_behaviors = mk_fun "Value.get_valid_behaviors" let add_formals_to_state = mk_fun "add_formals_to_state" let noassert_get_stmt_state s = - try Table.find s with Not_found -> Cvalue.Model.bottom + if !no_results (Kernel_function.(get_definition (find_englobing_kf s))) + then Cvalue.Model.top + else + try Table.find s + with Not_found -> + let ho = try Some (Table_By_Callstack.find s) with Not_found -> None in + let state = + match ho with + | None -> Cvalue.Model.bottom + | Some h -> + Value_types.Callstack.Hashtbl.fold (fun _cs state acc -> + Cvalue.Model.join acc state + ) h Cvalue.Model.bottom + in + Table.add s state; + state let noassert_get_state k = match k with @@ -512,23 +539,28 @@ let is_reachable = Cvalue.Model.is_reachable - let is_accessible ki = - let st = get_state ki in - Cvalue.Model.is_reachable st - let is_reachable_stmt stmt = - Cvalue.Model.is_reachable (get_stmt_state stmt) + if !no_results (Kernel_function.(get_definition (find_englobing_kf stmt))) + then true + else + let ho = try Some (Table_By_Callstack.find stmt) with Not_found -> None in + match ho with + | None -> false + | Some h -> + Value_types.Callstack.Hashtbl.fold (fun _cs state acc -> + acc || Cvalue.Model.is_reachable state) h false + let is_accessible ki = + match ki with + | Kglobal -> Cvalue.Model.is_reachable (globals_state ()) + | Kstmt stmt -> is_reachable_stmt stmt let is_called = mk_fun "Value.is_called" let callers = mk_fun "Value.callers" let access_location = mk_fun "Value.access_location" - let find = - Cvalue.Model.find - ~with_alarms:CilE.warn_none_mode - ~conflate_bottom:true + let find state loc = snd (Cvalue.Model.find state loc) let access = mk_fun "Value.access" let access_expr = mk_fun "Value.access_expr" @@ -555,8 +587,7 @@ let eval_expr_with_state = ref (fun ~with_alarms:_ _ -> mk_labeled_fun "Value.eval_expr_with_state") - let find_lv_plus = - ref (fun ~with_alarms:_ _ -> mk_labeled_fun "Value.find_lv_plus") + let find_lv_plus = mk_fun "Value.find_lv_plus" let pretty_state = Cvalue.Model.pretty @@ -590,9 +621,12 @@ let lval_to_zone = mk_fun "Value.lval_to_zone" let lval_to_zone_state = mk_fun "Value.lval_to_zone_state" let lval_to_zone_with_deps_state = mk_fun "Value.lval_to_zone_with_deps_state" + let lval_to_precise_loc_with_deps_state = + mk_fun "Value.lval_to_precise_loc_with_deps_state" let assigns_inputs_to_zone = mk_fun "Value.assigns_inputs_to_zone" let assigns_outputs_to_zone = mk_fun "Value.assigns_outputs_to_zone" let assigns_outputs_to_locations = mk_fun "Value.assigns_outputs_to_locations" + let verify_assigns_froms = mk_fun "Value.verify_assigns_froms" module Logic = struct let eval_predicate = @@ -661,13 +695,6 @@ end end -module Access_path = struct - type t = (Locations.Zone.t * Locations.Location_Bits.t) Base.Map.t - let compute = mk_fun "Access_path.compute" - let filter = mk_fun "Access_path.filter" - let pretty = mk_fun "Access_path.pretty" -end - module Users = struct let get = mk_fun "Users.get" end @@ -985,7 +1012,7 @@ (* loc_to_loc and loc_to_locs are defined in Value/Eval_logic, not in Logic_interp *) let loc_to_loc = mk_resultfun "Properties.Interp.loc_to_loc" - let loc_to_locs = mk_resultfun "Properties.Interp.loc_to_locs" + let loc_to_loc_under_over = mk_resultfun "Properties.Interp.loc_to_loc_with_deps" let loc_to_offset = mk_resultfun "Properties.Interp.loc_to_offset" let loc_to_exp = mk_resultfun "Properties.Interp.loc_to_exp" let term_offset_to_offset = diff -Nru frama-c-20140301+neon+dfsg/src/kernel/db.mli frama-c-20150201+sodium+dfsg/src/kernel/db.mli --- frama-c-20140301+neon+dfsg/src/kernel/db.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/db.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -176,13 +176,15 @@ (** Return [true] iff the value analysis has been done. @plugin development guide *) - module Table: - State_builder.Hashtbl with type key = stmt and type data = state + module Table_By_Callstack: + State_builder.Hashtbl with type key = stmt + and type data = state Value_types.Callstack.Hashtbl.t (** Table containing the results of the value analysis, ie. the state before the evaluation of each reachable statement. *) - module AfterTable: - State_builder.Hashtbl with type key = stmt and type data = state + module AfterTable_By_Callstack: + State_builder.Hashtbl with type key = stmt + and type data = state Value_types.Callstack.Hashtbl.t (** Table containing the state of the value analysis after the evaluation of each reachable and evaluable statement. Filled only if [Value_parameters.ResultsAfter] is set. *) @@ -303,8 +305,7 @@ (with_alarms:CilE.warn_mode -> state -> exp -> state * t) ref val find_lv_plus : - (with_alarms:CilE.warn_mode -> - Cvalue.Model.t -> Cil_types.exp -> + (Cvalue.Model.t -> Cil_types.exp -> (Cil_types.lval * Ival.t) list) ref (** returns the list of all decompositions of [expr] into the sum an lvalue and an interval. *) @@ -411,6 +412,11 @@ memory zones that are writable. [exact] indicates that [lv] evaluates to a valid locatio of cardinal at most one. *) + val lval_to_precise_loc_with_deps_state: + (state -> deps:Locations.Zone.t option -> lval -> + Locations.Zone.t * Precise_locs.precise_location) ref + + (** Evaluation of the [\from] clause of an [assigns] clause.*) val assigns_inputs_to_zone : (state -> identified_term assigns -> Locations.Zone.t) ref @@ -424,6 +430,12 @@ val assigns_outputs_to_locations : (state -> result:varinfo option -> identified_term assigns -> Locations.location list) ref + (** For internal use only. Evaluate the [assigns] clause of the + given function in the given prestate, compare it with the + computed froms, return warning and set statuses. *) + val verify_assigns_froms : + (Kernel_function.t -> pre:state -> Function_Froms.t -> unit) ref + (** {3 Evaluation of logic terms and predicates} *) module Logic : sig @@ -435,7 +447,7 @@ Property_status.emitted_status) ref (** Evaluate the given predicate in the given states for the Pre and Here ACSL labels. - @since Neon-20130301 *) + @since Neon-20140301 *) end @@ -460,7 +472,9 @@ module Record_Value_Callbacks_New: Hook.Iter_hook with type param = callstack * - (state Stmt.Hashtbl.t) Lazy.t Value_types.callback_result + ((state Stmt.Hashtbl.t) Lazy.t (* before states *) * + (state Stmt.Hashtbl.t) Lazy.t) (* after states *) + Value_types.callback_result (**/**) val no_results: (fundec -> bool) ref @@ -492,9 +506,6 @@ val noassert_get_state : kinstr -> state (** To be used during the value analysis itself (instead of {!get_state}). *) - val noassert_get_stmt_state : stmt -> state - (** To be used during the value analysis itself (instead of - {!get_stmt_state}). *) val recursive_call_occurred: kernel_function -> unit @@ -504,9 +515,6 @@ val initial_state_only_globals : (unit -> state) ref - val update_table : stmt -> state -> unit - (* Merge the given state with others associated to the given stmt. *) - val update_callstack_table: after:bool -> stmt -> callstack -> state -> unit (* Merge a new state in the table indexed by callstacks. *) @@ -516,9 +524,11 @@ (kernel_function -> call_kinstr:kinstr -> state -> (exp*t) list -> Cvalue.V_Offsetmap.t option (** returned value of [kernel_function] *) * state) ref *) - val merge_initial_state : kernel_function -> state -> unit - (** Store an additional possible initial state for the given function as + val merge_initial_state : callstack -> state -> unit + (** Store an additional possible initial state for the given callstack as well as its values for actuals. *) + (** @modify Neon-TIS now takes the current callstack instead of just + the current kernel function. *) val initial_state_changed: (unit -> unit) ref end @@ -577,13 +587,6 @@ val get: (kernel_function -> Kernel_function.Hptset.t) ref end -(** Do not use yet. *) -module Access_path : sig - type t = (Locations.Zone.t * Locations.Location_Bits.t) Base.Map.t - val compute: (Cvalue.Model.t -> Base.Set.t -> t) ref - val filter: (t -> Locations.Zone.t -> t) ref - val pretty: (Format.formatter -> t -> unit) ref -end (* ************************************************************************* *) (** {2 Properties} *) @@ -595,10 +598,12 @@ (** Interpretation of logic terms. *) module Interp : sig - (** {3 From C terms to logic terms} *) + (** {3 Parsing logic terms and annotations} *) val lval : (kernel_function -> stmt -> string -> Cil_types.term_lval) ref val expr : (kernel_function -> stmt -> string -> Cil_types.term) ref + val code_annot : (kernel_function -> stmt -> string -> code_annotation) ref + (** {3 From logic terms to C terms} *) @@ -643,13 +648,15 @@ Locations.location) ref (** @raise Invalid_argument if the translation fails. *) - val loc_to_locs: + val loc_to_loc_under_over: (result: Cil_types.varinfo option -> Value.state -> term -> - Locations.location list * Locations.Zone.t) ref - (** Translate a term more precisely than [loc_to_loc] if the term - evaluates to an ACSL tset. The zone returned is the locations - that have been read during evaluation. - Warning: This API is not stabilized, and is likely to change in + Locations.location * Locations.location * Locations.Zone.t) ref + (** Same as {!loc_to_loc}, except that we return simultaneously an + under-approximation of the term (first location), and an + over-approximation (second location). The under-approximation + is particularly useful when evaluating Tsets. The zone returned is an + over-approximation of locations that have been read during evaluation. + Warning: This API is not stabilized, and may change in the future. @raise Invalid_argument in some cases. *) @@ -741,11 +748,6 @@ val to_result_from_pred: (predicate named -> bool) ref - (** {3 Internal use only} *) - - val code_annot : - (kernel_function -> stmt -> string -> code_annotation) - ref end @@ -842,7 +844,7 @@ (** Constant propagation plugin. @see <../constant_propagation/index.html> internal documentation. *) module Constant_Propagation: sig - val get : (Datatype.String.Set.t -> cast_intro:bool -> Project.t) ref + val get : (Cil_datatype.Fundec.Set.t -> cast_intro:bool -> Project.t) ref (** Propagate constant into the functions given by name. note: the propagation is performed into all functions when the set is empty; and casts can be introduced when [cast_intro] is true. *) @@ -968,7 +970,10 @@ See also {!find_simple_stmt_nodes} or {!find_call_stmts}. @raise Not_found if the given statement is unreachable. @raise Bottom if given PDG is bottom. - @raise Top if the given pdg is top. *) + @raise Top if the given pdg is top. + @raise PdgIndex.CallStatement if the given stmt is a function + call. *) + val find_simple_stmt_nodes : (t -> Cil_types.stmt -> PdgTypes.Node.t list) ref (** Get the nodes corresponding to the statement. diff -Nru frama-c-20140301+neon+dfsg/src/kernel/dominators.ml frama-c-20150201+sodium+dfsg/src/kernel/dominators.ml --- frama-c-20140301+neon+dfsg/src/kernel/dominators.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/dominators.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/dominators.mli frama-c-20150201+sodium+dfsg/src/kernel/dominators.mli --- frama-c-20140301+neon+dfsg/src/kernel/dominators.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/dominators.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/dynamic.ml frama-c-20150201+sodium+dfsg/src/kernel/dynamic.ml --- frama-c-20140301+neon+dfsg/src/kernel/dynamic.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/dynamic.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -28,17 +28,18 @@ let set_default b = no_default := not b -let plugin_dirs = Str.split (Str.regexp ",[ ]*") Config.plugin_dir +(* directories which plug-ins are searched in *) +let plugin_dirs = ref (Str.split (Str.regexp ",[ ]*") Config.plugin_dir) let default_path () = match !no_default, !Config.is_gui with | true, _ -> [] | false, true -> - List.fold_left (fun acc d -> d :: (d ^ "/gui") :: acc) [] plugin_dirs - | false, false -> plugin_dirs + List.fold_left (fun acc d -> d :: (d ^ "/gui") :: acc) [] !plugin_dirs + | false, false -> !plugin_dirs -let all_path = ref [] -let bad_path : string list ref = ref [] +(* list of directories which cannot be load: do not try to load them again. *) +let bad_paths: string list ref = ref [] (* ************************************************************************* *) (** {2 Debugging} *) @@ -55,12 +56,10 @@ let list_arg = Str.split (Str.regexp ": ") s in match list_arg with | [ dir; error ] -> - if not (List.mem dir (default_path ())) then begin + if not (List.mem dir (default_path ())) then warning "cannot search dynamic plugins inside directory `%s' (%s)." - dir error; - bad_path := dir :: !bad_path; - end + dir error | [] | [ _ ] | _ :: _ :: _ :: _ -> raise (Sys_error s) @@ -78,16 +77,32 @@ (* apply [f] to [x] iff dynlink is available *) let dynlink_available f x = if is_dynlink_available then f x +let extract_filename f = + let f = Filename.basename f in + try Filename.chop_extension f with Invalid_argument _ -> f + (* ************************************************************************* *) (** {2 Dependency graph} *) (* ************************************************************************* *) -module Dep_graph = Graph.Imperative.Digraph.Concrete(Datatype.String) +module Dep_graph = + Graph.Imperative.Digraph.Concrete( + struct + type t = string + let compare s1 s2 = + let n1 = extract_filename s1 in + let n2 = extract_filename s2 in + Datatype.String.compare n1 n2 + let equal s1 s2 = compare s1 s2 = 0 + let hash s = Hashtbl.hash (extract_filename s) + end + ) + let plugin_dependencies = Dep_graph.create () let add_dependencies ~from p = Dep_graph.add_edge plugin_dependencies from p (* debugging purpose only *) -let print_graph fmt = +let _print_graph () = let module G = Graph.Graphviz.Dot (struct @@ -101,7 +116,7 @@ let edge_attributes _ = [] end) in - G.fprint_graph fmt plugin_dependencies + G.fprint_graph Format.std_formatter plugin_dependencies (* ************************************************************************* *) (** {2 Paths} *) @@ -109,8 +124,13 @@ (** @return true iff [path] is a readable directory *) let check_path ?(error=true) path = + not (List.mem path !bad_paths) + && try ignore (Sys.readdir path); true - with Sys_error s -> if error then catch_sysreaddir s; false + with Sys_error s -> + if error then catch_sysreaddir s; + bad_paths := path :: !bad_paths; + false let rec init_paths = let todo = ref true in @@ -125,14 +145,11 @@ feedback ~dkey "dynamic plug-ins are now searched inside directory `%s'." path; init_paths (); - all_path := path :: !all_path + plugin_dirs := path :: !plugin_dirs and add_path path = (* the lazyness of && is used below *) - if not (List.mem path !all_path) - && not (List.mem path !bad_path) - && check_path path - then begin + if not (List.mem path !plugin_dirs) && check_path path then begin add_path_list path; (* in GUI mode, try to load the GUI plug-ins before the standard ones *) if !Config.is_gui then begin @@ -184,7 +201,7 @@ Datatype.String.Hashtbl.iter (fun name details -> let append fmt = - if verbose_atleast 2 then + if verbose_atleast 2 && details <> "" then Format.fprintf fmt " The exact failure is: %s." details in warning ~once ~append "cannot load plug-in `%s' (%s)." name msg) @@ -259,28 +276,29 @@ (* ************************************************************************* *) exception Unloadable of string +module Tbl = Type.String_tbl(struct type 'a t = 'a end) + +exception Incompatible_type = Tbl.Incompatible_type +exception Unbound_value = Tbl.Unbound_value (* Distinction between native and bytecode versions *) -let object_file_extension = - if Dynlink_common_interface.is_native then ".cmxs" else ".cm[oa]" +let object_file_extension_regexp = + if Dynlink_common_interface.is_native then ".cmxs$" else ".cm[oa]$" + +let add_extension file = + if Dynlink_common_interface.is_native then file ^ ".cmxs" + else + let cma = file ^ ".cma" in + if Sys.file_exists cma then cma else file ^ ".cmo" let dynlink_file path module_name = let error msg details = Modules.unregister module_name; Loading_error_messages.add (String.capitalize module_name) msg details in - let file = - if Dynlink_common_interface.is_native then - Filename.concat path (module_name ^ object_file_extension) - else begin - let cmo = Filename.concat path (module_name ^ ".cmo") in - let cma = Filename.concat path (module_name ^ ".cma") in - if Sys.file_exists cma then cma else cmo - end - in - try - feedback ~dkey "loading plug-in `%s'." (String.capitalize module_name); - Dynlink_common_interface.loadfile file + let file = add_extension (path ^ "/" ^ module_name) in + feedback ~dkey "loading plug-in '%s'." file; + try Dynlink_common_interface.loadfile file with | Dynlink_common_interface.Error e -> (match e with @@ -302,29 +320,45 @@ error "system error" (Printexc.to_string e) | Unloadable s -> error "incompatible with current set-up" s + (* the three next errors may be raised in case of incompatibilites with + another plug-in *) + | Incompatible_type s -> + error "code incompatibility" s + | Unbound_value s -> + error "code incompatibility" ("unbound value " ^ s) + | Type.No_abstract_type s -> + error "code incompatibility" ("unbound abstract type " ^ s) | Log.AbortError _ | Log.AbortFatal _ | Log.FeatureRequest _ as e -> raise e | e -> fatal "unexpected exception %S" (Printexc.to_string e) +(** Paths in which additional modules may be searched in: {!modules_to_load} + contains the long name of the plug-ins, so these [extra_paths] should be + useless. However, when there is a dependency involving such a module, this + dependency is stored without path. When the edge is added in the graph, it + replaces the previous long name by the short one. So retrieving its path is + required. *) +let extra_paths = ref [] + let load_module_from_unknown_path name = if Modules.register_once name then begin Modules.unregister name; let regexp = - Str.regexp_case_fold (name ^ "\\" ^ object_file_extension ^ "$") + Str.regexp_case_fold (name ^ "\\" ^ object_file_extension_regexp) in let check_path path = let files= read_path path in List.exists (fun file -> Str.string_match regexp file 0) files in - let paths = !all_path in + let paths = !plugin_dirs @ !extra_paths in let tried = ref false in List.iter (fun p -> if check_path p then begin tried := true; if Modules.register_once name then dynlink_file p name - end) + end) paths; if not !tried then begin Modules.unregister name; @@ -334,28 +368,38 @@ (match paths with | [] -> "no specified directory" | [ p ] -> - Pretty_utils.sfprintf "plug-in not found in directory %s" p + Pretty_utils.sfprintf "plug-in not found in directory `%s'" p | _ :: _ -> Pretty_utils.sfprintf "plug-in not found in directories %a" - (Pretty_utils.pp_list Format.pp_print_string) + (Pretty_utils.pp_list ~sep:":" Format.pp_print_string) paths); end; Loading_error_messages.print (); end -let extract_filename f = - try Filename.chop_extension f with Invalid_argument _ -> f +(* whether [load_all_modules] has been called *) +let load_all_done = ref false + +(* additional modules to load by [load_all_modules] *) +let modules_to_load = ref [] let load_module f = - init_paths (); let load f = - let name = String.capitalize (Filename.basename (extract_filename f)) in - let dir = Filename.dirname f in - if dir = Filename.current_dir_name && Filename.is_implicit f then - load_module_from_unknown_path (String.capitalize f) - else - if Modules.register_once name then dynlink_file dir name; - Loading_error_messages.print () + if !load_all_done then + let name = extract_filename f in + let dir = Filename.dirname f in + if dir = Filename.current_dir_name && Filename.is_implicit f then + load_module_from_unknown_path (String.capitalize f) + else + if Modules.register_once (String.capitalize name) then + dynlink_file dir name; + Loading_error_messages.print () + else begin + (* delay module loading while the plug-in dependency graph is not built + (by [load_all_modules]) *) + modules_to_load := f :: !modules_to_load; + extra_paths := Filename.dirname f :: !extra_paths + end in dynlink_available load f @@ -363,23 +407,22 @@ let load f = let name = extract_filename f in let dir = Filename.dirname f in - let ml_name = name ^ ".ml" in - let mk_name ext = - dir ^ "/" ^ String.capitalize (Filename.basename name) ^ ext - in + let ml_name = dir ^ "/" ^ name ^ ".ml" in + let mk_name ext = dir ^ "/" ^ String.capitalize name ^ ext in let gen_name = mk_name (if Dynlink_common_interface.is_native then ".cmxs" else ".cmo") in let cmd = Format.sprintf "%s -w Ly -warn-error A -I %s%s%t -I %s %s" (if Dynlink_common_interface.is_native then - Config.ocamlopt ^ " -shared -o " ^ gen_name + Config.ocamlopt ^ " -shared -o " ^ gen_name else Config.ocamlc ^ " -c -o " ^ gen_name) Config.libdir (if !Config.is_gui then " -I +lablgtk2" else "") - (fun () -> List.fold_left (fun acc s -> " -I " ^ s ^ acc) "" !all_path) + (fun () -> + List.fold_left (fun acc s -> " -I " ^ s ^ acc) "" !plugin_dirs) dir ml_name in @@ -388,11 +431,11 @@ if code <> 0 then abort "command `%s' failed." cmd else begin let extended = add_path "." in - load_module name; + load_module gen_name; if extended then begin - match !all_path with + match !plugin_dirs with | [] -> assert false (* contains at least '.', see def of [extended] *) - | _ :: l -> all_path := l + | _ :: l -> plugin_dirs := l end; let cleanup () = feedback ~dkey "removing files generated when compiling `%s'." ml_name; @@ -410,48 +453,64 @@ let plugins_of_dir d = let filter f = - Str.string_match (Str.regexp (".+\\" ^ object_file_extension ^ "$")) f 0 + Str.string_match (Str.regexp (".+\\" ^ object_file_extension_regexp)) f 0 in let files = read_path d in let files = List.filter filter files in - List.map Filename.chop_extension files + List.map (fun f -> d ^ "/" ^ Filename.chop_extension f) files let load_dir d = - let load f = if Modules.register_once f then dynlink_file d f in + let load f = + if Modules.register_once f then dynlink_file d (Filename.basename f) + in let modules = plugins_of_dir d in (* order of loading inside a directory remains system-independent *) List.iter load (List.sort String.compare modules) -let build_dependency_graph () = - List.iter - (fun d -> - let dir = d ^ "/dependencies" in - if Sys.file_exists dir && Sys.is_directory dir then begin - load_dir dir; - Loading_error_messages.print () - end) - plugin_dirs +let load_dependencies d = + let dir = d ^ "/dependencies" in + if Sys.file_exists dir && Sys.is_directory dir then begin + load_dir dir; + Loading_error_messages.print () + end let load_all_modules () = + load_all_done := true; init_paths (); (* build the plug-in dependency graph *) - let add_vertex dir = + let add = Dep_graph.add_vertex plugin_dependencies in + let add_vertex dir = let modules = plugins_of_dir dir in - List.iter (Dep_graph.add_vertex plugin_dependencies) modules + List.iter add modules in - List.iter add_vertex !all_path; - if not !no_default then build_dependency_graph (); - debug ~level:2 ~dkey "@[plug-in dependency graph:@ %t@]" print_graph; + (* add the plug-ins from the registered directories *) + List.iter add_vertex !plugin_dirs; + (* add the stand-alone modules *) + List.iter add !modules_to_load; + (* load the plug-ins dependencies *) + if not !no_default then List.iter load_dependencies !plugin_dirs; + (* load the plug-ins dependencies of the stand-alone modules *) + List.iter + (fun s -> + let dir = Filename.dirname s ^ "/dependencies" in + let base = extract_filename s ^ "_dependencies" in + let file = add_extension (dir ^ "/" ^ base) in + if Sys.file_exists file && Modules.register_once base then + dynlink_file dir base; + Loading_error_messages.print ()) + !modules_to_load; +(* print_graph ();*) (* load the plug-ins by following the dependencies *) let module T = Graph.Topological.Make_stable(Dep_graph) in - T.iter load_module_from_unknown_path plugin_dependencies; + T.iter load_module plugin_dependencies; Loading_error_messages.print () +let () = Cmdline.load_all_plugins := load_all_modules + (* ************************************************************************* *) (** {2 Registering and accessing dynamic values} *) (* ************************************************************************* *) -module Tbl = Type.String_tbl(struct type 'a t = 'a end) let dynamic_values = Tbl.create 97 let comments_fordoc = Hashtbl.create 97 @@ -485,15 +544,12 @@ end else f -exception Incompatible_type = Tbl.Incompatible_type -exception Unbound_value = Tbl.Unbound_value - let get ~plugin name ty = if Cmdline.use_type then begin if plugin <> "" then load_module_from_unknown_path plugin; Tbl.find dynamic_values (plugin ^ "." ^ name) ty end else - failwith + failwith (Pretty_utils.sfprintf "cannot access value %s in the 'no obj' mode" name) let iter f = Tbl.iter f dynamic_values @@ -593,18 +649,6 @@ (Datatype.func Datatype.string Datatype.unit) Datatype.unit end -(* - module IndexedVal(X: sig val ty_name: string end) = struct - include Common(struct type t = string let ty = string end) - type value = Type.ty - let ty = Type.get_abstract X.ty_name - let add_choice name = - StringTbl.find tbl (name ^ ".add_choice") (func string (func ty unit)) - let get_val name = - StringTbl.find tbl (name ^ ".get_val") (func unit ty) () - end - *) - end (* ************************************************************************* *) @@ -615,7 +659,6 @@ if is_dynlink_available then begin Dynlink_common_interface.init (); Dynlink_common_interface.allow_unsafe_modules true; - Cmdline.run_during_extending_stage load_all_modules end; (* diff -Nru frama-c-20140301+neon+dfsg/src/kernel/dynamic.mli frama-c-20150201+sodium+dfsg/src/kernel/dynamic.mli --- frama-c-20140301+neon+dfsg/src/kernel/dynamic.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/dynamic.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -138,33 +138,25 @@ include Common with type t = string list val add: string -> string -> unit val append_before: string -> string list -> unit - (** @since Neon-20130301 *) + (** @since Neon-20140301 *) val append_after: string -> string list -> unit - (** @since Neon-20130301 *) + (** @since Neon-20140301 *) val remove: string -> string -> unit val is_empty: string -> unit -> bool val iter: string -> (string -> unit) -> unit end -(* - module IndexedVal(X: sig val ty_name: string end) : sig - include Common with type t = string - type value - val add_choice: string -> string -> value -> unit - val get_val: string -> value - end -*) - end +(**/**) (* ************************************************************************* *) (** {2 Kernel materials} *) (* ************************************************************************* *) -val object_file_extension: string +val object_file_extension_regexp: string (** Object file extension used when loading a module. See function {!load_module}. - @since Boron-20100401 *) + @since Sodium-20150201 *) val add_path: string -> bool (** Add a path into the search paths, if it is not already in the list. @@ -193,7 +185,8 @@ val add_dependencies: from:string -> string -> unit (** [add_dependencies ~from p] indicates that the plugin [from] must be loaded before [p]. - @since Neon-20130301 *) + @since Neon-20140301 *) +(**/**) (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/kernel/emitter.ml frama-c-20150201+sodium+dfsg/src/kernel/emitter.ml --- frama-c-20140301+neon+dfsg/src/kernel/emitter.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/emitter.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -369,16 +369,11 @@ Typed_parameter.Hashtbl.add parameter_hooks p tbl; let update () = Datatype.String.Hashtbl.iter (fun _ f -> f ()) tbl in match p.Typed_parameter.accessor with - (* factorisation requires GADT (OCaml 4.01) *) | Typed_parameter.Bool(a, _) -> a.Typed_parameter.add_set_hook (fun _ _ -> update ()) | Typed_parameter.Int(a, _) -> a.Typed_parameter.add_set_hook (fun _ _ -> update ()) | Typed_parameter.String(a, _) -> - a.Typed_parameter.add_set_hook (fun _ _ -> update ()) - | Typed_parameter.String_set a -> - a.Typed_parameter.add_set_hook (fun _ _ -> update ()) - | Typed_parameter.String_list a -> a.Typed_parameter.add_set_hook (fun _ _ -> update ())) (* [JS 2012/02/07] should be limited to [Option_functor.get_selection_context], but it is not possible while @@ -604,6 +599,8 @@ let mem key = H.mem !state key let iter f = H.iter f !state let fold f acc = H.fold f !state acc + let iter_sorted ~cmp f = H.iter_sorted ~cmp f !state + let fold_sorted ~cmp f acc = H.fold_sorted ~cmp f !state acc let remove key = if not (Remove_hooks.is_empty ()) then begin try diff -Nru frama-c-20140301+neon+dfsg/src/kernel/emitter.mli frama-c-20150201+sodium+dfsg/src/kernel/emitter.mli --- frama-c-20140301+neon+dfsg/src/kernel/emitter.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/emitter.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -127,6 +127,11 @@ val mem: H.key -> bool val iter: (H.key -> internal_tbl -> unit) -> unit val fold: (H.key -> internal_tbl -> 'a -> 'a) -> 'a -> 'a + val iter_sorted: + cmp: (H.key -> H.key -> int) -> (H.key -> internal_tbl -> unit) -> unit + val fold_sorted: + cmp: (H.key -> H.key -> int) -> + (H.key -> internal_tbl -> 'a -> 'a) -> 'a -> 'a val remove: H.key -> unit val add_hook_on_remove: (E.t -> H.key -> D.t -> unit) -> unit (** Register a hook to be applied whenever a binding is removed from the table. diff -Nru frama-c-20140301+neon+dfsg/src/kernel/exn_flow.ml frama-c-20150201+sodium+dfsg/src/kernel/exn_flow.ml --- frama-c-20140301+neon+dfsg/src/kernel/exn_flow.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/exn_flow.ml 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,819 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) + +open Cil +open Cil_types + +let dkey = Kernel.register_category "exn_flow" + +(* all exceptions that can be raised somewhere in the AST. + Used to handle function pointers without exn specification + *) +module All_exn = + State_builder.Option_ref(Cil_datatype.Typ.Set) + (struct let name = "Exn_flow.All_exn" let dependencies = [Ast.self] end) + +module Exns = + State_builder.Hashtbl(Kernel_function.Hashtbl)(Cil_datatype.Typ.Set) + (struct + let name = "Exn_flow.Exns" + let dependencies = [Ast.self; All_exn.self] + let size = 47 + end) + +module ExnsStmt = + State_builder.Hashtbl(Cil_datatype.Stmt.Hashtbl)(Cil_datatype.Typ.Set) + (struct + let name = "Exn_flow.ExnsStmt" + let dependencies = [Ast.self; All_exn.self] + let size = 53 + end) + +let self_fun = Exns.self + +let self_stmt = ExnsStmt.self + +let purify t = + let t = Cil.unrollTypeDeep t in + Cil.type_remove_qualifier_attributes_deep t + +class all_exn = + object + inherit Visitor.frama_c_inplace + val mutable all_exn = Cil_datatype.Typ.Set.empty + method get_exn = all_exn + method! vstmt_aux s = + match s.skind with + | Throw (Some (_,t),_) -> + all_exn <- Cil_datatype.Typ.Set.add (purify t) all_exn; + SkipChildren + | _ -> DoChildren + end + +let compute_all_exn () = + let vis = new all_exn in + Visitor.visitFramacFileSameGlobals (vis:>Visitor.frama_c_visitor) (Ast.get()); + vis#get_exn + +let all_exn () = All_exn.memo compute_all_exn + +let add_exn_var exns v = + let t = Cil.unrollTypeDeep v.vtype in + let t = Cil.type_remove_qualifier_attributes t in + Cil_datatype.Typ.Set.add t exns + +let add_exn_clause exns (v,_) = add_exn_var exns v + +(* We're not really interested by intra-procedural Dataflow here: all the + interesting stuff happens at inter-procedural level (except for Throw + encapsulated directly in a TryCatch, but even then it is easily captured + at syntactical level). Therefore, we can as well use a syntactic pass + at intra-procedural level + *) +class exn_visit = +object (self) + inherit Visitor.frama_c_inplace + val stack = Stack.create () + val possible_exn = Stack.create () + (* current set of exn included in a catch-all clause. Used to + handle Throw None; + *) + val current_exn = Stack.create () + + method private recursive_call kf = + try + Stack.iter + (fun (kf',_) -> if Kernel_function.equal kf kf' then raise Exit) stack; + false + with Exit -> true + + method private add_exn t = + let current_uncaught = Stack.top possible_exn in + current_uncaught:= Cil_datatype.Typ.Set.add t !current_uncaught + + method private union_exn s = + let current_uncaught = Stack.top possible_exn in + current_uncaught := Cil_datatype.Typ.Set.union s !current_uncaught + + method! vstmt_aux s = + match s.skind with + | Throw (None,_) -> + let my_exn = Stack.top current_exn in + self#union_exn my_exn; ExnsStmt.replace s my_exn; SkipChildren + | Throw(Some (_,t),_) -> + let t = Cil.unrollTypeDeep t in + let t = Cil.type_remove_qualifier_attributes t in + self#add_exn t; + ExnsStmt.replace s (Cil_datatype.Typ.Set.singleton t); + SkipChildren + | TryCatch (t,c,_) -> + let catch, catch_all = + List.fold_left + (fun (catch, catch_all) -> + function + | (Catch_all,_) -> catch, true + | (Catch_exn(v,[]),_) -> + let catch = add_exn_var catch v in + catch, catch_all + | (Catch_exn(_,aux), _) -> + let catch = List.fold_left add_exn_clause catch aux in + catch, catch_all) + (Cil_datatype.Typ.Set.empty,false) c + in + Stack.push (ref Cil_datatype.Typ.Set.empty) possible_exn; + ignore (Visitor.visitFramacBlock (self:>Visitor.frama_c_inplace) t); + let my_exn = Stack.pop possible_exn in + let uncaught = Cil_datatype.Typ.Set.diff !my_exn catch in + (* uncaught exceptions are lift to previous set of exn, but + only if there's no catch-all clause. *) + Stack.push (ref Cil_datatype.Typ.Set.empty) possible_exn; + if not catch_all then self#union_exn uncaught; + List.iter + (fun (v,b) -> + let catch_all = + match v with + Catch_all -> true + | Catch_exn (v,[]) -> + let catch = add_exn_var Cil_datatype.Typ.Set.empty v in + Stack.push catch current_exn; false + | Catch_exn (_,aux) -> + let catch = + List.fold_left + add_exn_clause Cil_datatype.Typ.Set.empty aux + in + Stack.push catch current_exn; false + in + ignore + (Visitor.visitFramacBlock (self:>Visitor.frama_c_inplace) b); + if not catch_all then ignore (Stack.pop current_exn)) + c; + let my_exn = !(Stack.pop possible_exn) in + ExnsStmt.replace s my_exn; + self#union_exn my_exn; + SkipChildren + | If _ | Switch _ | Loop _ | Block _ | UnspecifiedSequence _ + | TryFinally _ | TryExcept _ + | Instr _ -> (* must take into account exceptions thrown by a fun call*) + Stack.push (ref Cil_datatype.Typ.Set.empty) possible_exn; + DoChildrenPost + (fun s -> + let my_exn = !(Stack.pop possible_exn) in + ExnsStmt.replace s my_exn; + self#union_exn my_exn; + s) + (* No exception can be thrown here. *) + | Return _ | Goto _ | Break _ | Continue _ -> + ExnsStmt.replace s Cil_datatype.Typ.Set.empty; + SkipChildren + + method! vinst = + function + | Call(_,{ enode = Lval(Var f,NoOffset) },_,_) -> + let kf = Globals.Functions.get f in + if self#recursive_call kf then begin + let module Found = + struct + exception F of Cil_datatype.Typ.Set.t + end + in + let computed_exn = + try + Stack.iter + (fun (kf', exns) -> + if Kernel_function.equal kf kf' then raise (Found.F !exns)) + stack; + Kernel.fatal "No cycle found!" + with Found.F exns -> exns + in + let known_exn = + try Exns.find kf with Not_found -> Cil_datatype.Typ.Set.empty + in + if Cil_datatype.Typ.Set.subset computed_exn known_exn then begin + (* Fixpoint found, no need to recurse. *) + self#union_exn known_exn + end else begin + (* add known exns in table and recurse. Termination is ensured + by the fact that only a finite number of exceptions + can be thrown. *) + let kf_exn = Cil_datatype.Typ.Set.union computed_exn known_exn in + Exns.replace kf kf_exn; + ignore + (Visitor.visitFramacFunction + (self:>Visitor.frama_c_visitor) + (Kernel_function.get_definition kf)); + let callee_exn = Exns.find kf in + self#union_exn callee_exn + end + end else if Exns.mem kf then begin + self#union_exn (Exns.find kf) + end else if Kernel_function.is_definition kf then begin + let def = Kernel_function.get_definition kf in + ignore + (Visitor.visitFramacFunction (self:>Visitor.frama_c_visitor) def); + let callee_exn = Exns.find kf in + self#union_exn callee_exn + end else begin (* TODO: introduce extension to declare + exceptions that can be thrown by prototypes. *) + Kernel.warning + "Assuming declared function %a can't throw any exception" + Kernel_function.pretty kf + end; + SkipChildren + | Call _ -> + (* Function pointer: we consider that it can throw any possible + exception. *) + self#union_exn (all_exn()); SkipChildren + | _ -> SkipChildren + + method! vfunc f = + let my_exns = ref Cil_datatype.Typ.Set.empty in + let kf = Globals.Functions.get f.svar in + Stack.push (kf,my_exns) stack; + Stack.push my_exns possible_exn; + let after_visit f = + let callee_exn = Stack.pop possible_exn in + Exns.add kf !callee_exn; + ignore (Stack.pop stack); f + in + DoChildrenPost after_visit + +end + +let compute_kf kf = + if Kernel_function.is_definition kf then + ignore + (Visitor.visitFramacFunction (new exn_visit) + (Kernel_function.get_definition kf)) + (* just ignore prototypes. *) + +let compute () = Globals.Functions.iter compute_kf + +let get_type_tag t = + let rec aux t = + match t with + | TVoid _ -> "v" + | TInt (IBool,_) -> "B" + | TInt (IChar,_) -> "c" + | TInt (ISChar,_) -> "sc" + | TInt (IUChar,_) -> "uc" + | TInt (IInt,_) -> "i" + | TInt (IUInt,_) -> "ui" + | TInt (IShort,_) -> "s" + | TInt (IUShort,_) -> "us" + | TInt (ILong,_) -> "l" + | TInt (IULong,_) -> "ul" + | TInt (ILongLong,_) -> "ll" + | TInt (IULongLong,_) -> "ull" + | TFloat(FFloat,_) -> "f" + | TFloat(FDouble,_) -> "d" + | TFloat (FLongDouble,_) -> "ld" + | TPtr(t,_) -> "p" ^ aux t + | TArray(t,_,_,_) -> "a" ^ aux t + | TFun(rt,l,_,_) -> + let base = "fun" ^ aux rt in + (match l with + | None -> base + | Some l -> + List.fold_left (fun acc (_,t,_) -> acc ^ aux t) base l) + | TNamed _ -> Kernel.fatal "named type not correctly unrolled" + | TComp (s,_,_) -> (if s.cstruct then "S" else "U") ^ s.cname + | TEnum (e,_) -> "E" ^ e.ename + | TBuiltin_va_list _ -> "va" + in "__fc_" ^ aux t + +let get_type_enum t = "__fc_exn_kind_" ^ (get_type_tag t) + +let get_kf_exn kf = + if not (Exns.is_computed()) then compute(); + Exns.find kf + +let exn_uncaught_name = "exn_uncaught" +let exn_kind_name = "exn_kind" +let exn_obj_name = "exn_obj" + +(* enumeration for all possible exceptions *) +let generate_exn_enum exns = + let loc = Cil_datatype.Location.unknown in + let v = ref 0 in + let info = + { eorig_name = "__fc_exn_enum"; + ename = "__fc_exn_enum"; + eitems = []; + eattr = []; + ereferenced = true; (* not generated if no exn can be thrown *) + ekind = IInt; (* Take into account -enum option? *) + } + in + let create_enum_item t acc = + let ve = Cil.kinteger ~loc IInt !v in + let name = get_type_enum t in + incr v; + { eiorig_name = name; + einame = name; + eival = ve; + eihost = info; + eiloc = loc; + } :: acc + in + let enums = Cil_datatype.Typ.Set.fold create_enum_item exns [] in + info.eitems <- enums; + info + +(* discriminated union (i.e. struct + union) for all possible exceptions. *) +let generate_exn_union e exns = + let loc = Cil_datatype.Location.unknown in + let create_union_fields _ = + let add_one_field t acc = (get_type_tag t, t, None, [], loc) :: acc in + Cil_datatype.Typ.Set.fold add_one_field exns [] + in + let union_name = "__fc_exn_union" in + let exn_kind_union = + Cil.mkCompInfo false union_name ~norig:union_name create_union_fields [] + in + let create_struct_fields _ = + let uncaught = (exn_uncaught_name, Cil.intType, None, [], loc) in + let kind = (exn_kind_name, TEnum (e,[]), None, [], loc) in + let obj = + (exn_obj_name, + TComp(exn_kind_union, { scache = Not_Computed } , []), None, [], loc) + in + [uncaught; kind; obj] + in + let struct_name = "__fc_exn_struct" in + let exn_struct = + Cil.mkCompInfo true struct_name ~norig:struct_name create_struct_fields [] + in + exn_kind_union, exn_struct + +let add_types_and_globals typs globs f = + let iter_globs (acc,added) g = + match g with + | GVarDecl _ | GVar _ | GFun _ as g when not added -> + (g :: List.rev_append globs (List.rev_append typs acc), true) + | _ -> g :: acc, added + in + let globs, added = List.fold_left iter_globs ([],false) f.globals in + let globs = + if added then List.rev globs + else List.rev_append globs (List.rev_append typs globs) + in + f.globals <- globs; + f + +let make_init_assign loc v init = + let rec aux lv acc = function + | SingleInit e -> Cil.mkStmtOneInstr (Set(lv,e,loc)) :: acc + | CompoundInit(_,l) -> + let treat_one_offset acc (o,i) = aux (Cil.addOffsetLval o lv) acc i in + List.fold_left treat_one_offset acc l + in + List.rev (aux (Var v, NoOffset) [] init) + +let find_exns e = + match e.enode with + | Lval(Var v, NoOffset) -> + (try Exns.find (Globals.Functions.get v) + with Not_found -> Cil_datatype.Typ.Set.empty) + | _ -> all_exn () + +class erase_exn = +object(self) + inherit Visitor.frama_c_inplace + (* reverse before filling. *) + val mutable new_types = [] + + val exn_enum = Cil_datatype.Typ.Hashtbl.create 7 + + val exn_union = Cil_datatype.Typ.Hashtbl.create 7 + + val mutable modified_funcs = Cil_datatype.Fundec.Set.empty + + val mutable exn_struct = None + + val mutable exn_var = None + + val mutable can_throw = false + + val mutable catched_var = None + + val mutable label_counter = 0 + + val exn_labels = Cil_datatype.Typ.Hashtbl.create 7 + val catch_all_label = Stack.create () + + method modified_funcs = modified_funcs + + method private update_enum_bindings enum exns = + let update_one_binding t = + let s = get_type_enum t in + let ei = List.find (fun ei -> ei.einame = s) enum.eitems in + Cil_datatype.Typ.Hashtbl.add exn_enum t ei + in + Cil_datatype.Typ.Set.iter update_one_binding exns + + method private update_union_bindings union exns = + let update_one_binding t = + let s = get_type_tag t in + Kernel.debug2 ~dkey + "Registering %a as possible exn type" Cil_datatype.Typ.pretty t; + let fi = List.find (fun fi -> fi.fname = s) union.cfields in + Cil_datatype.Typ.Hashtbl.add exn_union t fi + in + Cil_datatype.Typ.Set.iter update_one_binding exns + + method private exn_kind t = Cil_datatype.Typ.Hashtbl.find exn_enum t + + method private exn_field_off name = + List.find (fun fi -> fi.fname = name) (Extlib.the exn_struct).cfields + + method private exn_field name = + Var (Extlib.the exn_var), Field(self#exn_field_off name, NoOffset) + + method private exn_field_term name = + TVar(Cil.cvar_to_lvar (Extlib.the exn_var)), + TField(self#exn_field_off name, TNoOffset) + + method private exn_obj_field = self#exn_field exn_obj_name + + method private exn_obj_field_term = self#exn_field_term exn_obj_name + + method private exn_kind_field = self#exn_field exn_kind_name + + method private exn_kind_field_term = self#exn_field_term exn_kind_name + + method private uncaught_flag_field = self#exn_field exn_uncaught_name + + method private uncaught_flag_field_term = + self#exn_field_term exn_uncaught_name + + method private exn_obj_kind_field t = + Kernel.debug2 ~dkey + "Searching for %a as possible exn type" Cil_datatype.Typ.pretty t; + Cil_datatype.Typ.Hashtbl.find exn_union t + + method private test_uncaught_flag loc b = + let e1 = Cil.new_exp ~loc (Lval self#uncaught_flag_field) in + let e2 = if b then Cil.one ~loc else Cil.zero ~loc in + Cil.new_exp ~loc (BinOp(Eq,e1,e2,Cil.intType)) + + method private pred_uncaught_flag loc b = + let e1 = + Logic_const.term + ~loc (TLval self#uncaught_flag_field_term) Linteger + in + let e2 = + if b then Logic_const.tinteger ~loc 1 + else Logic_const.tinteger ~loc 0 + in + Logic_const.prel ~loc (Req,e1,e2) + + method private set_uncaught_flag loc b = + let e = if b then Cil.one ~loc else Cil.zero ~loc in + Cil.mkStmtOneInstr (Set(self#uncaught_flag_field,e,loc)) + + method private set_exn_kind loc t = + let e = self#exn_kind (purify t) in + let e = Cil.new_exp ~loc (Const (CEnum e)) in + Cil.mkStmtOneInstr(Set(self#exn_kind_field,e,loc)) + + method private set_exn_value loc t e = + let lv = self#exn_obj_field in + let union_field = self#exn_obj_kind_field (purify t) in + let lv = Cil.addOffsetLval (Field (union_field, NoOffset)) lv in + Cil.mkStmtOneInstr (Set(lv,e,loc)) + + method private jumps_to_default_handler loc = + if Stack.is_empty catch_all_label then begin + (* no catch-all clause in the function: just go up in the stack. *) + let kf = Extlib.the self#current_kf in + let ret = Kernel_function.find_return kf in + let rtyp = Kernel_function.get_return_type kf in + if ret.labels = [] then + ret.labels <- [Label("__ret_label",Cil_datatype.Stmt.loc ret,false)]; + let goto = mkStmt (Goto (ref ret,loc)) in + match ret.skind with + | Return (None,_) -> [goto] + (* rt is void: do not need to create a dummy return value *) + | Return (Some { enode = Lval(Var rv, NoOffset) },_) -> + let init = Cil.makeZeroInit ~loc rtyp in + make_init_assign loc rv init @ [goto] + | Return _ -> + Kernel.fatal "exception removal should be used after oneRet" + | _ -> + Kernel.fatal "find_return did not give a Return statement" + end else begin + let stmt = Stack.top catch_all_label in + [mkStmt (Goto (ref stmt, loc))] + end + + method private jumps_to_handler loc t = + let t = purify t in + try + let stmt = Cil_datatype.Typ.Hashtbl.find exn_labels t in + [mkStmt (Goto (ref stmt, loc))] + with + | Not_found -> self#jumps_to_default_handler loc + + method! vfile f = + let exns = all_exn () in + if not (Cil_datatype.Typ.Set.is_empty exns) then begin + let loc = Cil_datatype.Location.unknown in + let e = generate_exn_enum exns in + let u,s = generate_exn_union e exns in + let exn = + Cil.makeGlobalVar "__fc_exn" (TComp (s,{scache = Not_Computed},[])) + in + self#update_enum_bindings e exns; + self#update_union_bindings u exns; + exn_struct <- Some s; + can_throw <- true; + new_types <- + GCompTag (s,loc) :: + GCompTag (u,loc) :: + GEnumTag (e,loc) :: new_types; + exn_var <- Some exn; + let exn_init = Cil.makeZeroInit ~loc (TComp(s,{scache=Not_Computed},[])) + in + let gexn_var = GVar(exn, { init = Some exn_init }, loc) in + ChangeDoChildrenPost( + f,add_types_and_globals (List.rev new_types) [gexn_var]) + end else (* nothing can be thrown in the first place, but we still have + to get rid of (useless) try/catch blocks if any. *) + DoChildren + + method private visit_catch_clause loc (v,b) = + let loc = + match b.bstmts with + | [] -> loc + | [x] -> Cil_datatype.Stmt.loc x + | x::tl -> + fst (Cil_datatype.Stmt.loc x), + snd (Cil_datatype.Stmt.loc (Extlib.last tl)) + in + let add_unreachable_block b = + Cil.mkStmt (If(Cil.zero ~loc, b, Cil.mkBlock [], loc)) + in + let assign_catched_obj v b = + let exn_obj = self#exn_obj_field in + let kind_field = self#exn_obj_kind_field (purify v.vtype) in + let lv = Cil.addOffsetLval (Field (kind_field,NoOffset)) exn_obj in + let s = + Cil.mkStmtOneInstr + (Set ((Var v, NoOffset), Cil.new_exp ~loc (Lval lv), loc)) + in + b.bstmts <- s :: b.bstmts + in + let f = Extlib.the self#current_func in + let update_locals v b = + if not (List.memq v b.blocals) then b.blocals <- v::b.blocals; + if not (List.memq v f.slocals) then f.slocals <- v::f.slocals + in + let b = + (match v with + | Catch_all -> b + | Catch_exn (v,[]) -> + v.vtype <- purify v.vtype; update_locals v b;assign_catched_obj v b; b + | Catch_exn(v,aux) -> + let add_one_aux stmts (v,b) = + v.vtype <- purify v.vtype; update_locals v b; + assign_catched_obj v b; + add_unreachable_block b :: stmts + in + b.blocals <- List.filter (fun v' -> v!=v') b.blocals; + let aux_blocks = + List.fold_left add_one_aux [Cil.mkStmt (Block b)] aux + in + let main_block = Cil.mkBlock aux_blocks in + v.vtype <- purify v.vtype; + update_locals v main_block; + main_block) + in + ignore (Visitor.visitFramacBlock (self :> Visitor.frama_c_visitor) b); + add_unreachable_block b + + method! vfunc _ = label_counter <- 0; DoChildren + + method private modify_current () = + modified_funcs <- + Cil_datatype.Fundec.Set.add (Extlib.the self#current_func) modified_funcs; + + method private aux_handler_goto target (v,b) = + let loc = v.vdecl in + let goto_main_handler = Cil.mkStmt (Goto (ref target,loc)) in + let suf = + if label_counter = 0 then "" else "_" ^ (string_of_int label_counter) + in + let lab = (get_type_tag (purify v.vtype)) ^ suf in + label_counter <- label_counter + 1; + b.bstmts <- b.bstmts @ [goto_main_handler]; + (* we have at least the goto statement in the block *) + let s = List.hd b.bstmts in + s.labels <- (Label(lab,loc,false)::s.labels); + Cil_datatype.Typ.Hashtbl.add exn_labels (purify v.vtype) s + + method private guard_post_cond (kind,pred as orig) = + match kind with + (* If we exit explicitely with exit, + we haven't seen an uncaught exception anyway. *) + | Exits | Breaks | Continues -> orig + | Returns | Normal -> + let loc = pred.ip_loc in + let p = self#pred_uncaught_flag loc false in + let pred' = Logic_const.pred_of_id_pred pred in + (kind, + (Logic_const.new_predicate + (Logic_const.pimplies ~loc (p,pred')))) + + method! vbehavior b = + match self#current_kf, self#current_stmt with + | None, None -> SkipChildren + (* Prototype is assumed to not throw any exception. *) + | None, Some _ -> + Kernel.fatal + "Inconsistent visitor state: visiting a statement \ + outside of any function." + | Some f, None when not (Kernel_function.is_definition f) -> + (* By hypothesis, prototypes do not throw anything. *) + SkipChildren + | Some f, None -> (* function contract *) + let exns = Exns.find f in + if Cil_datatype.Typ.Set.is_empty exns then SkipChildren + else begin + b.b_post_cond <- List.map self#guard_post_cond b.b_post_cond; + ChangeTo b (* need to register the new clauses. *) + end + | Some _, Some s -> (* statement contract *) + let exns = ExnsStmt.find s in + if Cil_datatype.Typ.Set.is_empty exns then SkipChildren + else begin + b.b_post_cond <- List.map self#guard_post_cond b.b_post_cond; + ChangeTo b + end + + method! vstmt_aux s = + match s.skind with + | Instr (Call (_,f,_,loc) as instr) -> + let my_exns = find_exns f in + if Cil_datatype.Typ.Set.is_empty my_exns then SkipChildren + else begin + self#modify_current (); + let make_jump t (stmts, uncaught) = + let t = purify t in + if Cil_datatype.Typ.Hashtbl.mem exn_labels t then begin + let e = self#exn_kind t in + let e = Cil.new_exp ~loc (Const (CEnum e)) in + let b = self#jumps_to_handler loc t in + let s = Cil.mkStmt (Block (Cil.mkBlock b)) in + s.labels <- [Case (e,loc)]; + s::stmts, uncaught + end else stmts, true + in + let stmts, uncaught = + Cil_datatype.Typ.Set.fold make_jump my_exns ([],false) + in + let stmts = + if uncaught then begin + let default = + Cil.mkStmt ( + Block (Cil.mkBlock (self#jumps_to_default_handler loc))) + in + default.labels <- [Default loc]; + List.rev_append stmts [default] + end else List.rev stmts + in + let test = self#test_uncaught_flag loc true in + let cases = Cil.new_exp ~loc (Lval self#exn_kind_field) in + let switch = Cil.mkStmt (Switch(cases,Cil.mkBlock stmts,stmts,loc)) in + let handler = + Cil.mkStmt (If(test,Cil.mkBlock [switch],Cil.mkBlock [],loc)) + in + let instr = + Visitor.visitFramacInstr (self:>Visitor.frama_c_visitor) instr + in + let call = Cil.mkStmtOneInstr (List.hd instr) in + s.skind <- Block (Cil.mkBlock [call;handler]); + SkipChildren + end + | Throw _ when not can_throw -> + Kernel.fatal "Unexpected Throw statement" + | Throw(Some(e,t),loc) -> + self#modify_current(); + let s1 = self#set_uncaught_flag loc true in + let s2 = self#set_exn_kind loc t in + let s3 = self#set_exn_value loc t e in + let rv = self#jumps_to_handler loc t in + let b = mkBlock (s1 :: s2 :: s3 :: rv) in + s.skind <- Block b; + SkipChildren + | Throw (None,loc) -> + self#modify_current (); + let s1 = self#set_uncaught_flag loc true in + let t = purify (Extlib.the exn_var).vtype in + let rv = self#jumps_to_handler loc t in + let b = mkBlock (s1 :: rv) in + s.skind <- Block b; + SkipChildren + | TryCatch (t,_,_) when not can_throw -> + self#modify_current(); + (* no exception can be thrown: + we can simply remove the catch clauses. *) + s.skind <- (Block t); + DoChildren (* visit the block for nested try catch. *) + | TryCatch (t,c,loc) -> + self#modify_current(); + (* Visit the catch clauses first, as they are in the same catch scope + than the current block. As we are adding statements in the + auxiliary blocks, we need to do that before adding labels to the + entry points of these blocks. + *) + let stmts = List.map (self#visit_catch_clause loc) c in + let suf = + if label_counter = 0 then "" else "_" ^ (string_of_int label_counter) + in + label_counter <- label_counter + 1; + (* now generate the labels for jumping to the appropriate block when + catching an exception. *) + List.iter + (function + | (Catch_exn (v,aux),b) -> + (* first thing that we do is to flag the exn as caught *) + let stmt = self#set_uncaught_flag v.vdecl false in + let label = (get_type_tag (purify v.vtype)) ^ suf in + stmt.labels <- [Label (label,v.vdecl,false)]; + b.bstmts <- stmt :: b.bstmts; + (match aux with + | [] -> + Cil_datatype.Typ.Hashtbl.add exn_labels (purify v.vtype) stmt + | _ :: _ -> + List.iter (self#aux_handler_goto stmt) aux) + | (Catch_all, b) -> + let loc = + match b.bstmts with [] -> loc | s::_ -> Cil_datatype.Stmt.loc s + in + let stmt = self#set_uncaught_flag loc false in + stmt.labels <- [Label ("catch_all" ^ suf,loc,false)]; + b.bstmts <- stmt :: b.bstmts; + Stack.push stmt catch_all_label) + (* We generate the bindings in reverse order, as if two clauses + match the same type, the first one (which is the one that has + to be taken), will be visited last, hiding the binding of the + second in the Hashtbl. *) + (List.rev c); + ignore (Visitor.visitFramacBlock (self:>Visitor.frama_c_visitor) t); + List.iter + (function + | (Catch_exn (v,[]), _) -> + Cil_datatype.Typ.Hashtbl.remove exn_labels (purify v.vtype) + | Catch_exn(_,l), _ -> + List.iter + (fun (v,_) -> + Cil_datatype.Typ.Hashtbl.remove exn_labels (purify v.vtype)) + l + | Catch_all,_ -> ignore (Stack.pop catch_all_label)) + c; (* we remove bindings in the reverse order as we added them, + though order does not really matter here. *) + t.bstmts <- t.bstmts @ stmts; + s.skind <- Block t; + SkipChildren + | _ -> DoChildren + +end + +let prepare_file f = + if Kernel.SimplifyCfg.get () then begin + Cfg.prepareCFG ~keepSwitch:false f; + end; + File.must_recompute_cfg f + +let remove_exn f = + if Kernel.RemoveExn.get() then begin + Visitor.visitFramacFileSameGlobals (new exn_visit) f; + let vis = new erase_exn in + Visitor.visitFramacFile (vis :> Visitor.frama_c_visitor) f; + Cil_datatype.Fundec.Set.iter prepare_file vis#modified_funcs + end + +let transform_category = File.register_code_transformation_category "remove_exn" + +let () = + let deps = [ (module Kernel.RemoveExn: Parameter_sig.S) ] in + File.add_code_transformation_after_cleanup ~deps transform_category remove_exn diff -Nru frama-c-20140301+neon+dfsg/src/kernel/exn_flow.mli frama-c-20150201+sodium+dfsg/src/kernel/exn_flow.mli --- frama-c-20140301+neon+dfsg/src/kernel/exn_flow.mli 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/exn_flow.mli 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,43 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) + +(** Manages information related to possible exceptions thrown by each + function in the AST. *) + +(** returns the set of exceptions that a given kernel function might throw. *) +val get_kf_exn: Kernel_function.t -> Cil_datatype.Typ.Set.t + +(** computes the information if not already done. *) +val compute: unit -> unit + +(**/**) +(** internal state of the module. *) +val self_fun: State.t +val self_stmt: State.t +(**/**) + +(** transforms functions that may throw into functions returning a union type + composed of the normal return or one of the exceptions. *) +val remove_exn: Cil_types.file -> unit + +(** category of the code transformation above. *) +val transform_category: File.code_transformation_category diff -Nru frama-c-20140301+neon+dfsg/src/kernel/file.ml frama-c-20150201+sodium+dfsg/src/kernel/file.ml --- frama-c-20140301+neon+dfsg/src/kernel/file.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/file.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -27,16 +27,30 @@ open Cil_datatype let dkey_check = Kernel.register_category "check" +(* Use category "check:strict" to enable stricter tests *) +let dkey_check_volatile = Kernel.register_category "check:strict:volatile" + let dkey_print_one = Kernel.register_category "file" let dkey_transform = Kernel.register_category "file:transformation" let dkey_annot = Kernel.register_category "file:annotation" +let dkey_pp = Kernel.register_category "pp" + +type cpp_opt_kind = Gnu | Not_gnu | Unknown + +let pretty_cpp_opt_kind fmt = + function + | Gnu -> Format.pp_print_string fmt "Gnu" + | Not_gnu -> Format.pp_print_string fmt "Not_gnu" + | Unknown -> Format.pp_print_string fmt "Unknown" + type file = | NeedCPP of string (* filename of the [.c] to preprocess *) * string (* Preprocessor command. [filename.c -o tempfilname.i] will be appended at the end.*) + * cpp_opt_kind | NoCPP of string (** filename of a preprocessed [.c] *) | External of string * string (* file * name of plug-in that handles it *) @@ -46,7 +60,7 @@ include Datatype.Serializable_undefined type t = file let name = "File" - let reprs = [ NeedCPP("", ""); NoCPP ""; External("", "") ] + let reprs = [ NeedCPP("", "", Unknown); NoCPP ""; External("", "") ] let structural_descr = Structural_descr.t_abstract let mem_project = Datatype.never_any_project let copy = Datatype.identity (* immutable strings *) @@ -55,7 +69,9 @@ | NoCPP s -> Format.fprintf fmt "@[File.NoCPP %S@]" s | External (f,p) -> Format.fprintf fmt "@[File.External (%S,%S)@]" f p - | NeedCPP (a,b) -> Format.fprintf fmt "@[File.NeedCPP (%S,%S)@]" a b + | NeedCPP (a,b,c) -> + Format.fprintf + fmt "@[File.NeedCPP (%S,%S,%a)@]" a b pretty_cpp_opt_kind c in Type.par p_caller Type.Call fmt pp end) @@ -69,12 +85,19 @@ check_suffixes [ ".c"; ".i"; ".h" ] -let get_name = function NeedCPP (s,_) | NoCPP s | External (s,_) -> s +let get_name = function NeedCPP (s,_,_) | NoCPP s | External (s,_) -> s (* ************************************************************************* *) (** {2 Preprocessor command} *) (* ************************************************************************* *) +(* Do not trust custom command-line to be gnu like by default, but give + them a chance, with a warning indicating that things may go wrong. *) +let cpp_opt_kind () = + if Kernel.CppGnuLike.is_set () then + if Kernel.CppGnuLike.get () then Gnu else Not_gnu + else Unknown + (* the preprocessor command is: If the program has an explicit argument -cpp-command "XX -Y" (quotes are required by the shell) @@ -82,10 +105,21 @@ else use the command in [Config.preprocessor].*) let get_preprocessor_command () = let cmdline = Kernel.CppCommand.get() in - if cmdline <> "" then cmdline - else Config.preprocessor + if cmdline <> "" then begin + (cmdline, cpp_opt_kind ()) + end else begin + try (Sys.getenv "CPP", cpp_opt_kind ()) + with Not_found -> + let gnu = if Config.preprocessor_is_gnu_like then Gnu else Not_gnu in + (Config.preprocessor, gnu) + end -let from_filename ?(cpp=get_preprocessor_command ()) f = +let from_filename ?cpp f = + let cpp, is_gnu_like = + match cpp with + | None -> get_preprocessor_command () + | Some s -> s, cpp_opt_kind () + in if Filename.check_suffix f ".i" then begin NoCPP f end else @@ -102,7 +136,7 @@ Kernel.warning ~once:true "Default pre-processor does not keep comments. Any ACSL annotation \ on non-pre-processed file will be discarded."; - NeedCPP (f, cpp) + NeedCPP (f, cpp, is_gnu_like) end else Kernel.abort "No working pre-processor found. You can only analyze \ pre-processed .i files." @@ -196,6 +230,91 @@ (Filename.concat "libc" "__fc_builtin_for_normalization.i")) +(* ************************************************************************* *) +(** {2 Machdep} *) +(* ************************************************************************* *) + +module DatatypeMachdep = Datatype.Make_with_collections(struct + include Datatype.Serializable_undefined + let reprs = [Machdeps.x86_32] + let name = "File.Machdep" + type t = Cil_types.mach + let compare : t -> t -> int = Pervasives.compare + let equal : t -> t -> bool = (=) + let hash : t -> int = Hashtbl.hash + let copy = Datatype.identity +end) + +let default_machdeps = + [ "x86_16", Machdeps.x86_16; + "x86_32", Machdeps.x86_32; + "x86_64", Machdeps.x86_64; + "gcc_x86_16", Machdeps.x86_16; + "gcc_x86_32", Machdeps.gcc_x86_32; + "gcc_x86_64", Machdeps.gcc_x86_64; + "ppc_32", Machdeps.ppc_32; + ] + +let machdep_macro = function + | "x86_16" | "gcc_x86_16" -> "__FC_MACHDEP_X86_16" + | "x86_32" | "gcc_x86_32" -> "__FC_MACHDEP_X86_32" + | "x86_64" | "gcc_x86_64" -> "__FC_MACHDEP_X86_64" + | "ppc_32" -> "__FC_MACHDEP_PPC_32" + | s -> + let res = "__FC_MACHDEP_" ^ (String.uppercase s) in + Kernel.warning ~once:true + "machdep %s has no registered macro. Using %s for pre-processing" s res; + res + +module Machdeps = + State_builder.Hashtbl(Datatype.String.Hashtbl)(DatatypeMachdep) + (struct + let name = " File.Machdeps" + let size = 5 + let dependencies = [] + end) + +let mem_machdep s = Machdeps.mem s || List.mem_assoc s default_machdeps + +let new_machdep s f = + if mem_machdep s then + invalid_arg (Format.sprintf "machdep `%s' already exists" s); + Machdeps.add s f + +let pretty_machdeps fmt = + Machdeps.iter (fun x _ -> Format.fprintf fmt "@ %s" x); + List.iter (fun (x, _) -> Format.fprintf fmt "@ %s" x) default_machdeps + +let machdep_help () = + let m = Kernel.Machdep.get () in + if m = "help" then begin + Kernel.feedback + "@[supported machines are%t@ (default is x86_32).@]" + pretty_machdeps; + raise Cmdline.Exit + end else + Cmdline.nop + +let () = Cmdline.run_after_exiting_stage machdep_help + +let set_machdep () = + let m = Kernel.Machdep.get () in + if not (mem_machdep m) then + Kernel.abort "@[unsupported machine %s.@ Try one of%t.@]" m pretty_machdeps + +let () = Cmdline.run_after_configuring_stage set_machdep + +(* Local to this module. Use Cil.theMachine.theMachine outside *) +let get_machdep () = + let m = Kernel.Machdep.get () in + try + Machdeps.find m + with Not_found -> + try + List.assoc m default_machdeps + with Not_found -> (* Should not happen given the checks above *) + Kernel.fatal "Machdep %s not registered" m + (*****************************************************************************) (** {2 AST Integrity check} *) (*****************************************************************************) @@ -472,7 +591,7 @@ List.iter check_cfg_edge stmt.succs; List.iter check_cfg_edge stmt.preds; match stmt.skind with - | Return _ -> + | Return _ | Throw _ -> if stmt.succs <> [] then check_abort "return statement %a in function %a \ @@ -480,7 +599,7 @@ print_stmt stmt Printer.pp_varinfo f.svar (Pretty_utils.pp_list ~sep:"@\n" print_stmt) stmt.succs | Instr(Call (_, called, _, _)) - when hasAttribute "noreturn" (typeAttrs (typeOf called)) -> + when typeHasAttribute "noreturn" (typeOf called) -> if stmt.succs <> [] then check_abort "exit statement %a in function %a \ @@ -613,8 +732,8 @@ fi.fname fi.fcomp.cname) with Not_found -> (check_abort - "field %s of type %s is unbound in the AST" - fi.fname fi.fcomp.cname) + "field %s of type %s(%d) is unbound in the AST" + fi.fname fi.fcomp.cname fi.fcomp.ckey) end; DoChildren @@ -688,10 +807,10 @@ if v.vdefined && not (Kernel_function.is_definition (Globals.Functions.get v)) then - check_abort - "Function %s is supposed to be defined, \ + check_abort + "Function %s(%d) is supposed to be defined, \ but not registered as such" - v.vname; + v.vname v.vid; if not v.vdefined && Kernel_function.is_definition (Globals.Functions.get v) then @@ -859,6 +978,15 @@ | _ -> false method! vexpr e = + if Cil.typeHasAttribute "volatile" (Cil.typeOf e) then begin + let volatile_problem : (_, _, _) format = + "Expression with volatile qualification %a" + in + if Kernel.is_debug_key_enabled dkey_check_volatile then + check_abort volatile_problem Printer.pp_exp e + else + Kernel.warning ~current:true volatile_problem Printer.pp_exp e + end; match e.enode with | Const (CEnum ei) -> self#check_ei ei | Lval lv when @@ -934,11 +1062,11 @@ initializer let add_func kf = let vi = Kernel_function.get_vi kf in - if not vi.vlogic then + if vi.vsource then globals_functions <- Cil_datatype.Varinfo.Set.add vi globals_functions in let add_var vi _ = - if not vi.vlogic then + if vi.vsource then globals_vars <- Cil_datatype.Varinfo.Set.add vi globals_vars in Globals.Functions.iter add_func; @@ -960,11 +1088,27 @@ | NoCPP f -> if not (Sys.file_exists f) then Kernel.abort "preprocessed file %S does not exist" f; + Kernel.feedback "Parsing %s (no preprocessing)" (Filepath.pretty f); Frontc.parse f () - | NeedCPP (f, cmdl) -> + | NeedCPP (f, cmdl, is_gnu_like) -> if not (Sys.file_exists f) then Kernel.abort "source file %S does not exist" f; let debug = Kernel.Debug_category.exists (fun x -> x = "parser") in + let add_if_gnu opt = + match is_gnu_like with + | Gnu -> opt + | Not_gnu -> "" + | Unknown -> + Kernel.warning + ~once:true + "your preprocessor is not known to handle option `%s'. \ + If pre-processing fails because of it, please add \ + -no-cpp-gnu-like option to Frama-C's command-line. \ + If you do not want to see this warning again, use explicitely \ + -cpp-gnu-like option." + opt; + opt + in let ppf = try Extlib.temp_file_cleanup_at_exit ~debug (Filename.basename f) ".i" with Extlib.Temp_file_error s -> @@ -1018,15 +1162,49 @@ shell metacharacters *) (Filename.quote out_file) (Filename.quote in_file) in + (* Hypothesis: the preprocessor is POSIX compliant, + hence understands -I and -D. *) + let supp_args = + if Kernel.FramaCStdLib.get () then begin + let libc = Config.datadir ^ "/libc" in + " -I" ^ libc + end else "" + in let supp_args = - (Kernel.CppExtraArgs.get_set ~sep:" " ()) ^ - (if Kernel.ReadAnnot.get() && Kernel.PreprocessAnnot.get() - then " -dD" else "") + if Kernel.FramaCStdLib.get () then begin + let machdep = + " -D" ^ (machdep_macro (Kernel.Machdep.get ())) in + machdep ^ supp_args + end else supp_args in - Kernel.feedback "@{preprocessing@} with \"%s %s %s\"" - cmdl - supp_args - (Filepath.pretty f); + let supp_args = + if supp_args = "" then "" + else (add_if_gnu " -nostdinc") ^ supp_args + in + let supp_args = + if Kernel.ReadAnnot.get () then + if Kernel.PreprocessAnnot.is_set () then + if Kernel.PreprocessAnnot.get () then + " -dD" ^ supp_args + else supp_args + else + let opt = add_if_gnu "-dD" in + if opt = "" then supp_args + else " " ^ opt ^ supp_args + else supp_args + in + let add_args s = + Pretty_utils.sfprintf "%a%s" + (Pretty_utils.pp_list ~sep:" " + (fun fmt s -> Format.fprintf fmt "%s" s)) + (Kernel.CppExtraArgs.get ()) + s + in + let supp_args = add_args supp_args in + if Kernel.is_debug_key_enabled dkey_pp then + Kernel.feedback ~dkey:dkey_pp + "@{preprocessing@} with \"%s %s %s\"" cmdl supp_args f; + Kernel.feedback "Parsing %s (with preprocessing)" (Filepath.pretty f); if Sys.command (cmd supp_args f ppf) <> 0 then begin Extlib.safe_remove ppf; Kernel.abort "failed to run: %s@\n\ @@ -1035,7 +1213,17 @@ (cmd supp_args f ppf); end; let ppf = - if Kernel.ReadAnnot.get() && Kernel.PreprocessAnnot.get() + if Kernel.ReadAnnot.get() && + ((Kernel.PreprocessAnnot.is_set () && + Kernel.PreprocessAnnot.get()) + || (match is_gnu_like with + | Gnu -> true + | Not_gnu -> false + | Unknown -> + Kernel.warning + ~once:true + "trying to preprocess annotation with an unknown \ + preprocessor."; true)) then begin let ppf' = try Logic_preprocess.file ".c" (cmd "-nostdinc") ppf @@ -1055,7 +1243,9 @@ | External (f,suf) -> if not (Sys.file_exists f) then Kernel.abort "file %S does not exist." f; - try Hashtbl.find check_suffixes suf f + try + Kernel.feedback "Parsing %s (external front-end)" (Filepath.pretty f); + Hashtbl.find check_suffixes suf f with Not_found -> Kernel.abort "could not find a suitable plugin for parsing %s." f @@ -1066,9 +1256,13 @@ let keep_entry_point ?(specs=Kernel.Keep_unused_specified_functions.get ()) g = Rmtmps.isDefaultRoot g || match g with + | GFun({svar = v; sspec = spec},_) | GVarDecl(spec,v,_) -> - Kernel.MainFunction.get () = v.vname - || (specs && not (is_empty_funspec spec)) + Kernel.MainFunction.get_plain_string () = v.vname + (* Always keep the declaration of the entry point *) + || (specs && not (is_empty_funspec spec)) + (* and the declarations carrying specifications according to the + command line.*) | _ -> false let files_to_cil files = @@ -1107,7 +1301,15 @@ with exn when Cilmsg.had_errors () -> if Kernel.Debug.get () >= 1 then raise exn else - Kernel.abort "skipping file %S that has errors." (get_name f)) + Kernel.abort "@[stopping on@ file %S@ that@ has@ errors.%t@]" + (get_name f) + (fun fmt -> + if Filename.check_suffix (get_name f) ".c" && + not (Kernel.is_debug_key_enabled dkey_pp) + then + Format.fprintf fmt "@ Add@ '-kernel-msg-key pp'@ \ + for preprocessing command.") + ) ([],[]) files in @@ -1119,7 +1321,6 @@ debug_globals files; (* Clean up useless parts *) Kernel.feedback ~level:2 "cleaning unused parts"; - Rmtmps.rmUnusedStatic := false; (* a command line option will be available*) (* remove unused functions. However, we keep declarations that have a spec, since they might be merged with another one which is used. If this is not the case, these declarations will be removed after Mergecil.merge. *) @@ -1136,7 +1337,6 @@ debug_globals [merged_file]; Logic_utils.complete_types merged_file; - Rmtmps.removeUnusedTemps ~isRoot:keep_entry_point merged_file; if Kernel.UnspecifiedAccess.get() then begin @@ -1147,10 +1347,8 @@ f1.fname = f2.fname && f1.fcomp.ckey = f2.fcomp.ckey && not_separated_offset offs1 offs2 | Index(i1,offs1), Index(i2,offs2) -> - (match - Cil.isInteger (Cil.constFold true i1), - Cil.isInteger (Cil.constFold true i2) with - Some c1, Some c2 -> + (match Cil.constFoldToInt i1, Cil.constFoldToInt i2 with + | Some c1, Some c2 -> Integer.equal c1 c2 && not_separated_offset offs1 offs2 | None, _ | _, None -> true) @@ -1557,7 +1755,7 @@ "applying %s to current AST, after option %s changed" name.name P.option_name; f (Ast.get()); - if Kernel.Files.Check.get () then begin + if Kernel.Check.get () then begin Cil.visitCilFileSameGlobals (new check_file ("after code transformation: " ^ name.name ^ @@ -1604,7 +1802,7 @@ Kernel.feedback ~dkey:dkey_transform "applying %s to file" name; f file; recompute_cfg (); - if Kernel.Files.Check.get () then begin + if Kernel.Check.get () then begin Cil.visitCilFileSameGlobals (new check_file_aux normalized ("after code transformation: " ^ name) :> Cil.cilVisitor) file; @@ -1641,12 +1839,12 @@ let prepare_cil_file file = Kernel.feedback ~level:2 "preparing the AST"; computeCFG ~clear_id:true file; - if Kernel.Files.Check.get () then begin + if Kernel.Check.get () then begin Cil.visitCilFileSameGlobals (new check_file_aux false "initial AST" :> Cil.cilVisitor) file end; Kernel.feedback ~level:2 "First check done"; - if Kernel.Files.Orig_name.get () then begin + if Kernel.Orig_name.get () then begin Cil.visitCilFileSameGlobals print_renaming file end; Transform_before_cleanup.apply file; @@ -1674,7 +1872,7 @@ cleanup file; Ast.set_file file; (* Check that normalization is correct. *) - if Kernel.Files.Check.get() then begin + if Kernel.Check.get() then begin Cil.visitCilFileSameGlobals (new check_file "AST after normalization" :> Cil.cilVisitor) file; end; @@ -1684,62 +1882,6 @@ the transformation. *) Ast.set_file file -(* ************************************************************************* *) -(** {2 Machdep} *) -(* ************************************************************************* *) - -let default_machdeps = - [ "x86_16", (module Machdep_x86_16: Cil.Machdeps); - "x86_32", (module Machdep_x86_32: Cil.Machdeps); - "x86_64", (module Machdep_x86_64: Cil.Machdeps); - "ppc_32", (module Machdep_ppc_32: Cil.Machdeps); - ] - -let machdeps = Datatype.String.Hashtbl.create 7 -let () = - List.iter - (fun (s, c) -> Datatype.String.Hashtbl.add machdeps s c) - default_machdeps - -let new_machdep s f = - if Datatype.String.Hashtbl.mem machdeps s then - invalid_arg (Format.sprintf "machdep `%s' already exists" s); - Datatype.String.Hashtbl.add machdeps s f - -let pretty_machdeps fmt = - Datatype.String.Hashtbl.iter (fun x _ -> Format.fprintf fmt "@ %s" x) machdeps - -let machdep_help () = - let m = Kernel.Machdep.get () in - if m = "help" then begin - Kernel.feedback - "@[supported machines are%t@ (default is x86_32).@]" - pretty_machdeps; - raise Cmdline.Exit - end else - Cmdline.nop - -let () = Cmdline.run_after_exiting_stage machdep_help - -let set_machdep () = - let m = Kernel.Machdep.get () in - if not (Datatype.String.Hashtbl.mem machdeps m) then - Kernel.abort "@[unsupported machine %s.@ Try one of%t.@]" m pretty_machdeps - -let () = Cmdline.run_after_configuring_stage set_machdep - -(* Local to this module. Use Cil.theMachine.theMachine outside *) -let get_machdep () = - let m = Kernel.Machdep.get () in - try - Datatype.String.Hashtbl.find machdeps m - with Not_found -> (* Should not happen given the checks above *) - Kernel.fatal "Machdep %s not registered" m - -(* ************************************************************************* *) -(** End of machdep *) -(* ************************************************************************* *) - let fill_built_ins () = if Cil.selfMachine_is_computed () then begin Kernel.debug "Machine is computed, just fill the built-ins"; @@ -1905,7 +2047,8 @@ Kernel.fatal "unexpected result of visiting global when reordering" in let deps = - if Global_annotation_graph.has_cycle logic_info_deps then begin + if Global_annotation_graph.nb_vertex logic_info_deps = 0 then [] + else if Global_annotation_graph.has_cycle logic_info_deps then begin let entries = Global_annotation_graph.fold (fun ga acc -> ga :: acc) logic_info_deps [] @@ -2162,7 +2305,7 @@ Project.on ~selection prj finalize file'; (* reorder _before_ check. *) if reorder then Project.on prj reorder_ast (); - if Kernel.Files.Check.get() then begin + if Kernel.Check.get() then begin Project.on prj (* eta-expansion required because of operations on the current project in @@ -2184,14 +2327,14 @@ let visitor = visitor prj in init_project_from_visitor ?reorder prj visitor -let create_project_from_visitor ?reorder prj_name visitor = +let create_project_from_visitor ?reorder ?(last=true) prj_name visitor = let selection = State_selection.list_state_union ~deps:State_selection.with_dependencies [ Kernel.Files.self; Files.pre_register_state ] in let selection = State_selection.diff State_selection.full selection in - let prj = Project.create_by_copy ~selection prj_name in + let prj = Project.create_by_copy ~selection ~last prj_name in (* reset projectified parameters to their default values *) let temp = Project.create "File.temp" in Project.copy @@ -2207,7 +2350,7 @@ let init_from_cmdline () = let prj1 = Project.current () in - if Kernel.Files.Copy.get () then begin + if Kernel.Copy.get () then begin let selection = State_selection.diff State_selection.full @@ -2219,7 +2362,7 @@ Logic_env.Logic_ctor_info.self; Ast.self ]) in - let prj2 = Project.create_by_copy ~selection "debug_copy_prj" in + let prj2 = Project.create_by_copy ~selection ~last:false "debug_copy_prj" in Project.set_current prj2; end; let files = Kernel.Files.get () in @@ -2227,11 +2370,11 @@ let files = List.map (fun s -> from_filename s) files in try init_from_c_files files; - if Kernel.Files.Check.get () then begin + if Kernel.Check.get () then begin Cil.visitCilFile (new check_file "Copy of original AST" :> Cil.cilVisitor) (Ast.get()) end; - if Kernel.Files.Copy.get () then begin + if Kernel.Copy.get () then begin Project.on prj1 fill_built_ins (); prepare_from_visitor prj1 (fun prj -> new Visitor.frama_c_copy prj); Project.set_current prj1; @@ -2286,9 +2429,9 @@ let pretty_ast ?(prj=Project.current ()) ?fmt () = journalized_pretty_ast prj fmt () -let create_rebuilt_project_from_visitor - ?reorder ?(preprocess=false) prj_name visitor = - let prj = create_project_from_visitor ?reorder prj_name visitor in +let create_rebuilt_project_from_visitor + ?reorder ?last ?(preprocess=false) prj_name visitor = + let prj = create_project_from_visitor ?reorder ?last prj_name visitor in try let f = let name = "frama_c_project_" ^ prj_name ^ "_" in diff -Nru frama-c-20140301+neon+dfsg/src/kernel/file.mli frama-c-20150201+sodium+dfsg/src/kernel/file.mli --- frama-c-20140301+neon+dfsg/src/kernel/file.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/file.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -23,8 +23,12 @@ (** Frama-c preprocessing and Cil AST initialization. @plugin development guide *) +(** Whether a given preprocessor supports gcc options used in some + configurations. *) +type cpp_opt_kind = Gnu | Not_gnu | Unknown + type file = - | NeedCPP of string * string + | NeedCPP of string * string * cpp_opt_kind (** The first string is the filename of the [.c] to preprocess. The second one is the preprocessor command ([filename.c -o tempfilname.i] will be appended at the end).*) @@ -43,20 +47,19 @@ @plugin development guide *) -val new_machdep: string -> (module Cil.Machdeps) -> unit +val new_machdep: string -> Cil_types.mach -> unit (** [new_machdep name module] registers a new machdep name as recognized by Frama-C through The usual uses is [Cmdline.run_after_loading_stage - (fun () -> File.new_machdep - "my_machdep" - (module My_machdep_implem: Cil.Machdeps))] + (fun () -> File.new_machdep "my_machdep" my_machdep_implem)] @since Nitrogen-20111001 @modify Fluorine-20130401 Receives the machdep (as a module) as argument + @modify Sodium-20150201 Receives directly the machdep as argument @raise Invalid_argument if the given name already exists *) type code_transformation_category (** type of registered code transformations - @since Neon-20130301 + @since Neon-20140301 *) val register_code_transformation_category: @@ -88,7 +91,7 @@ At this level, globals and ACSL annotations have not been registered. - @since Neon-20130301 + @since Neon-20140301 @plugin development guide *) val add_code_transformation_after_cleanup: @@ -100,14 +103,14 @@ At this level, globals and ACSL annotations have been registered. If the hook adds some new globals or annotations, it must take care of adding them in the appropriate tables. - @since Neon-20130301 + @since Neon-20140301 @plugin development guide *) val must_recompute_cfg: Cil_types.fundec -> unit (** [must_recompute_cfg f] must be called by code transformation hooks when they modify statements in function [f]. This will trigger a recomputation of the cfg of [f] after the transformation. - @since Neon-20130301 + @since Neon-20140301 @plugin development guide *) val get_suffixes: unit -> string list @@ -117,7 +120,7 @@ val get_name: t -> string (** File name. *) -val get_preprocessor_command: unit -> string +val get_preprocessor_command: unit -> string * cpp_opt_kind (** Return the preprocessor command to use. *) val pre_register: t -> unit @@ -172,19 +175,25 @@ *) val create_project_from_visitor: - ?reorder:bool -> string -> (Project.t -> Visitor.frama_c_visitor) -> Project.t + ?reorder:bool -> ?last:bool -> + string -> + (Project.t -> Visitor.frama_c_visitor) -> + Project.t (** Return a new project with a new cil file representation by visiting the file of the current project. If [reorder] is [true], the globals in the - AST of the new project are reordered (default is [false]). + AST of the new project are reordered (default is [false]). If [last] is + [true] (by default), remember than the returned project is the last + created one. The visitor is responsible to avoid sharing between old file and new file (i.e. it should use {!Cil.copy_visit} at some point). @raise File_types.Bad_Initialization if called more than once. @since Beryllium-20090601-beta1 - @modify Fluorine-20130401 added reorder optional argument + @modify Fluorine-20130401 added [reorder] optional argument + @modify Sodium-20150201 added [last] optional argument @plugin development guide *) val create_rebuilt_project_from_visitor: - ?reorder:bool -> ?preprocess:bool -> + ?reorder:bool -> ?last:bool -> ?preprocess:bool -> string -> (Project.t -> Visitor.frama_c_visitor) -> Project.t (** Like {!create_project_from_visitor}, but the new generated cil file is generated into a temp .i or .c file according to [preprocess], then re-built @@ -214,7 +223,7 @@ *) val reorder_custom_ast: Cil_types.file -> unit -(** @since Neon-20130301 *) +(** @since Neon-20140301 *) (* ************************************************************************* *) (** {2 Pretty printing} *) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/frama_c_config.ml.in frama-c-20150201+sodium+dfsg/src/kernel/frama_c_config.ml.in --- frama-c-20140301+neon+dfsg/src/kernel/frama_c_config.ml.in 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/frama_c_config.ml.in 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,59 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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* linked in Frama-C. Instead, is it is concatenated + to Config, to create a standalone executable *) + +let version _ = + Format.printf +"Version: %s@\n\ +Compilation date: %s@\n\ +Share path: %s (may be overridden with FRAMAC_SHARE variable)@\n\ +Library path: %s (may be overridden with FRAMAC_LIB variable)@\n\ +Plug-in paths: %s (may be overridden with FRAMAC_PLUGIN variable)@." + version date datadir libdir plugin_dir; + exit 0 + +let options = Arg.([ + "-print-share-path", + Unit (fun _ -> Format.printf "%s%!" datadir; exit 0), + " Print the path of Frama-C share directory"; + + "-print-libpath", + Unit (fun _ -> Format.printf "%s%!" libdir; exit 0), + " Print the path of Frama-C kernel library"; + + "-print-plugin-path", + Unit (fun _ -> Format.printf "%s%!" plugin_dir; exit 0), + " Print the path where Frama-C dynamic plug-ins are searched for"; + + "-version", + Unit version, + " Display Frama-C version"; +]) + +let usage = "\ +Usage: frama-c-config

\ -(may be used if the plug-in is not installed at the same place than Frama-C)" +(may be used if the plug-in is not installed at the same place as Frama-C)" end) (struct let dir () = Config.datadir @@ -437,7 +437,7 @@ "disables message display for categories ,...," module Debug_category = - StringSet(struct + String_set(struct let option_name = debug_category_optname let arg_name="k1[,...,kn]" let help = diff -Nru frama-c-20140301+neon+dfsg/src/kernel/plugin.mli frama-c-20150201+sodium+dfsg/src/kernel/plugin.mli --- frama-c-20140301+neon+dfsg/src/kernel/plugin.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/plugin.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -53,11 +53,11 @@ module Share: Parameter_sig.Specific_dir (** Handle the specific `session' directory of the plug-in. - @since Neon-20130301 *) + @since Neon-20140301 *) module Session: Parameter_sig.Specific_dir (** Handle the specific `config' directory of the plug-in. - @since Neon-20130301 *) + @since Neon-20140301 *) module Config: Parameter_sig.Specific_dir val help: Cmdline.Group.t @@ -111,18 +111,18 @@ val is_session_visible: unit -> unit (** Make visible to the end-user the --session option. To be called just before applying {!Register} to create plug-in services. - @since Neon-20130301 *) + @since Neon-20140301 *) val is_config_visible: unit -> unit (** Make visible to the end-user the --config option. To be called just before applying {!Register} to create plug-in services. - @since Neon-20130301 *) + @since Neon-20140301 *) val plugin_subpath: string -> unit (** Use the given string as the sub-directory in which the plugin files will be installed (ie. [share/frama-c/plugin_subpath]...). Relevant for directories [Share], [Session] and [Config] above. - @since Neon-20130301 *) + @since Neon-20140301 *) (* ************************************************************************* *) (** {2 Handling plugins} *) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/special_hooks.ml frama-c-20150201+sodium+dfsg/src/kernel/special_hooks.ml --- frama-c-20140301+neon+dfsg/src/kernel/special_hooks.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/special_hooks.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/special_hooks.mli frama-c-20150201+sodium+dfsg/src/kernel/special_hooks.mli --- frama-c-20140301+neon+dfsg/src/kernel/special_hooks.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/special_hooks.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/stmts_graph.ml frama-c-20150201+sodium+dfsg/src/kernel/stmts_graph.ml --- frama-c-20140301+neon+dfsg/src/kernel/stmts_graph.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/stmts_graph.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -34,7 +34,7 @@ module HV = Hashtbl.Make(Stmt) module HptmapStmtBool = Hptmap.Make (Cil_datatype.Stmt_Id) - (Datatype.Bool) + (struct include Datatype.Bool let pretty_debug = pretty end) (Hptmap.Comp_unused) (struct let v = [ [] ] end) (struct let l = [ Ast.self ] end) @@ -142,6 +142,7 @@ (match s.skind with | Instr _ -> Format.sprintf "INSTR <%d>\n%s" s.sid (pretty_raw_stmt s) | Return _ -> Format.sprintf "RETURN <%d>" s.sid + | Throw _ -> Format.sprintf "THROW <%d>" s.sid | Goto _ -> Format.sprintf "%s <%d>\n" (pretty_raw_stmt s) s.sid | Break _ -> Format.sprintf "BREAK <%d>" s.sid | Continue _ -> Format.sprintf "CONTINUE <%d>" s.sid @@ -152,17 +153,18 @@ | Block _ -> Format.sprintf "BLOCK <%d>" s.sid | TryExcept _ -> Format.sprintf "TRY EXCEPT <%d>" s.sid | TryFinally _ -> Format.sprintf "TRY FINALLY <%d>" s.sid + | TryCatch _ -> Format.sprintf "TRY CATCH <%d>" s.sid | UnspecifiedSequence _ -> Format.sprintf "UnspecifiedSequence <%d>" s.sid) let vertex_attributes s = match s.skind with - | Loop _ -> [`Color 0xFF0000; `Style [`Filled]] - | If _ -> [`Color 0x00FF00; `Style [`Filled]; `Shape `Diamond] - | Return _ -> [`Color 0x0000FF; `Style [`Filled]] + | Loop _ -> [`Color 0xFF0000; `Style `Filled] + | If _ -> [`Color 0x00FF00; `Style `Filled; `Shape `Diamond] + | Return _ -> [`Color 0x0000FF; `Style `Filled] | Block _ -> [`Shape `Box; `Fontsize 8] - | Goto _ -> [`Shape `Diamond; `Color 0x00FFFF ; `Style [`Filled]] - | Instr (Skip _) -> [`Color 0x00FFFF ; `Style [`Filled]] + | Goto _ -> [`Shape `Diamond; `Color 0x00FFFF ; `Style `Filled] + | Instr (Skip _) -> [`Color 0x00FFFF ; `Style `Filled] | _ -> [] let default_vertex_attributes _ = [] @@ -274,7 +276,7 @@ and get_stmt_stmts s = let compute_stmt_stmts s = match s.skind with - | Instr _ | Return _ -> Stmt.Set.singleton s + | Instr _ | Return _ | Throw _ -> Stmt.Set.singleton s | Continue _ | Break _ | Goto _ -> Stmt.Set.singleton s | Block b | Switch (_, b, _, _) | Loop (_, b, _, _, _) -> Stmt.Set.add s (get_block_stmts b) @@ -285,6 +287,10 @@ let stmts = Stmt.Set.union (get_block_stmts b1)(get_block_stmts b2) in Stmt.Set.add s stmts + | TryCatch(t,c,_) -> + List.fold_left + (fun acc (_,b) -> Stmt.Set.union acc (get_block_stmts b)) + (get_block_stmts t) c | TryExcept (_, _, _, _) | TryFinally (_, _, _) -> Kernel.not_yet_implemented "exception handling" in diff -Nru frama-c-20140301+neon+dfsg/src/kernel/stmts_graph.mli frama-c-20150201+sodium+dfsg/src/kernel/stmts_graph.mli --- frama-c-20140301+neon+dfsg/src/kernel/stmts_graph.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/stmts_graph.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/task.ml frama-c-20150201+sodium+dfsg/src/kernel/task.ml --- frama-c-20140301+neon+dfsg/src/kernel/task.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/task.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -248,7 +248,7 @@ (try !Db.progress () with Db.Cancel -> Monad.cancel task) ; match Monad.state task with | Finished r -> r - | _ -> Unix.sleep 1 ; wait task + | _ -> Extlib.usleep 100000 (* 0.1s *) ; wait task (* ------------------------------------------------------------------------ *) (* --- System Commands --- *) @@ -265,7 +265,7 @@ } let set_chrono cmd = match cmd.chrono with - | None -> () | Some r -> r := max !r (Unix.time () -. cmd.time_start) + | None -> () | Some r -> r := max !r (Unix.gettimeofday () -. cmd.time_start) let set_time cmd t = match cmd.chrono with | None -> () | Some r -> r := max !r t @@ -278,7 +278,7 @@ Array.iter (fun c -> Format.fprintf fmt "@ %s" c) args) ; let timed = timeout > 0 || time <> None in - let time_start = if timed then Unix.time () else 0.0 in + let time_start = if timed then Unix.gettimeofday () else 0.0 in let time_stop = if timeout > 0 then time_start +. float_of_int timeout else 0.0 in let async = Command.command_async ?stdout ?stderr cmd args in { @@ -297,7 +297,7 @@ match cmd.async () with | Command.Not_ready kill -> - let time_now = if cmd.timed then Unix.time () else 0.0 in + let time_now = if cmd.timed then Unix.gettimeofday () else 0.0 in if cmd.timeout > 0 && time_now > cmd.time_stop then begin set_time cmd (time_now -. cmd.time_start) ; diff -Nru frama-c-20140301+neon+dfsg/src/kernel/task.mli frama-c-20150201+sodium+dfsg/src/kernel/task.mli --- frama-c-20140301+neon+dfsg/src/kernel/task.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/task.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/typed_parameter.ml frama-c-20150201+sodium+dfsg/src/kernel/typed_parameter.ml --- frama-c-20140301+neon+dfsg/src/kernel/typed_parameter.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/typed_parameter.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -32,8 +32,6 @@ | Bool of bool accessor * string option (** the negative option, if any *) | Int of int accessor * (unit -> int * int) (** getting range *) | String of string accessor * (unit -> string list) (** possible values *) - | String_set of (string, Datatype.String.Set.t) gen_accessor - | String_list of (string, string list) gen_accessor type parameter = { name: string; @@ -85,10 +83,7 @@ let pretty_value fmt p = match p.accessor with | Bool(a, _) -> Format.fprintf fmt "%b" (a.get ()) | Int(a, _) -> Format.fprintf fmt "%d" (a.get ()) - (* factorisation requires GADT (OCaml 4.01) *) | String(a, _) -> Format.fprintf fmt "%s" (a.get ()) - | String_set a -> Format.fprintf fmt "%s" (a.get ()) - | String_list a -> Format.fprintf fmt "%s" (a.get ()) let get_value p = Pretty_utils.sfprintf "%a" pretty_value p diff -Nru frama-c-20140301+neon+dfsg/src/kernel/typed_parameter.mli frama-c-20150201+sodium+dfsg/src/kernel/typed_parameter.mli --- frama-c-20140301+neon+dfsg/src/kernel/typed_parameter.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/typed_parameter.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -38,8 +38,6 @@ | Bool of bool accessor * string option (** the negative option, if any *) | Int of int accessor * (unit -> int * int) (** getting range *) | String of string accessor * (unit -> string list) (** possible values *) - | String_set of (string, Datatype.String.Set.t) gen_accessor - | String_list of (string, string list) gen_accessor type parameter = private { name: string; (** Name of the option corresponding to the parameter. diff -Nru frama-c-20140301+neon+dfsg/src/kernel/unicode.ml frama-c-20150201+sodium+dfsg/src/kernel/unicode.ml --- frama-c-20140301+neon+dfsg/src/kernel/unicode.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/unicode.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/unicode.mli frama-c-20150201+sodium+dfsg/src/kernel/unicode.mli --- frama-c-20140301+neon+dfsg/src/kernel/unicode.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/unicode.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/unroll_loops.ml frama-c-20150201+sodium+dfsg/src/kernel/unroll_loops.ml --- frama-c-20140301+neon+dfsg/src/kernel/unroll_loops.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/unroll_loops.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -28,6 +28,134 @@ let dkey = Kernel.register_category "ulevel" +let rec fold_itv f b e acc = + if Integer.equal b e then f acc b + else fold_itv f (Integer.succ b) e (f acc b) + +(* Find the initializer for index [i] in [init] *) +let find_init_by_index init i = + let same_offset (off, _) = match off with + | Index (i', NoOffset) -> + Integer.equal i (Extlib.the (Cil.isInteger i')) + | _ -> false + in + snd (List.find same_offset init) + +(* Find the initializer for field [f] in [init] *) +let find_init_by_field init f = + let same_offset (off, _) = match off with + | Field (f', NoOffset) -> f == f' + | _ -> false + in + snd (List.find same_offset init) + +exception CannotSimplify + +(* Evaluate the bounds of the range [b..e] as constants. The array being + indexed has type [typ]. If [b] or [e] are not specified, use default + values. *) +let const_fold_trange_bounds typ b e = + let extract = function None -> raise CannotSimplify | Some i -> i in + let b = match b with + | Some tb -> extract (Logic_utils.constFoldTermToInt tb) + | None -> Integer.zero + in + let e = match e with + | Some te -> extract (Logic_utils.constFoldTermToInt te) + | None -> + match Cil.unrollType typ with + | TArray (_, Some size, _, _) -> + Integer.pred (extract (Cil.isInteger size)) + | _ -> raise CannotSimplify + in + b, e + +(** Find the value corresponding to the logic offset [loff] inside the + initialiser [init]. Zero is used as a default value when the initialiser is + incomplete. [loff] must have an integral type. Returns a set of values + when [loff] contains ranges. *) +let find_initial_value init loff = + let module S = Datatype.Integer.Set in + let extract = function None -> raise CannotSimplify | Some i -> i in + let rec aux loff init = + match loff, init with + | TNoOffset, SingleInit e -> S.singleton (extract (Cil.constFoldToInt e)) + | TIndex (i, loff), CompoundInit (typ, l) -> begin + (* Add the initializer at offset [Index(i, loff)] to [acc]. *) + let add_index acc i = + let vi = + try aux loff (find_init_by_index l i) + with Not_found -> S.singleton Integer.zero + in + S.union acc vi + in + match i.term_node with + | Tunion tl -> + let conv t = extract (Logic_utils.constFoldTermToInt t) in + List.fold_left add_index S.empty (List.map conv tl) + | Trange (b, e) -> + let b, e = const_fold_trange_bounds typ b e in + fold_itv add_index b e S.empty + | _ -> + let i = extract (Logic_utils.constFoldTermToInt i) in + add_index S.empty i + end + | TField (f, loff), CompoundInit (_, l) -> + if f.fcomp.cstruct then + try aux loff (find_init_by_field l f) + with Not_found -> S.singleton Integer.zero + else (* too complex, a value might be written through another field *) + raise CannotSimplify + | TNoOffset, CompoundInit _ + | (TIndex _ | TField _), SingleInit _ -> assert false + | TModel _, _ -> raise CannotSimplify + in + try + match init with + | None -> Some (S.singleton Integer.zero) + | Some init -> Some (aux loff init) + with CannotSimplify -> None + + +(** Evaluate the given term l-value in the initial state *) +let eval_term_lval (lhost, loff) = + match lhost with + | TVar lvi -> begin + (** See if we can evaluate the l-value using the initializer of lvi*) + let off_type = Cil.typeTermOffset lvi.lv_type loff in + if Logic_const.plain_or_set Cil.isLogicIntegralType off_type then + match lvi.lv_origin with + | Some vi when vi.vglob && Cil.typeHasQualifier "const" vi.vtype -> + find_initial_value (Globals.Vars.find vi).init loff + | _ -> None + else None + end + | _ -> None + +class simplify_const_lval = object (self) + inherit Visitor.frama_c_copy (Project.current ()) + + method! vterm t = + match t.term_node with + | TLval tlv -> begin + (* simplify recursively tlv before attempting evaluation *) + let tlv = Visitor.(visitFramacTermLval (self:>frama_c_visitor) tlv) in + match eval_term_lval tlv with + | None -> Cil.SkipChildren + | Some itvs -> + (* Replace the value/set of values found by something that has the + expected logic type (plain/Set) *) + let typ = Logic_const.plain_or_set Extlib.id t.term_type in + let aux i l = Logic_const.term (TConst (Integer (i,None))) typ :: l in + let l = Datatype.Integer.Set.fold aux itvs [] in + match l, Logic_const.is_plain_type t.term_type with + | [i], true -> Cil.ChangeTo i + | _, false -> Cil.ChangeTo (Logic_const.term (Tunion l) t.term_type) + | _ -> Cil.SkipChildren + end + | _ -> Cil.DoChildren +end + type loop_pragmas_info = { unroll_number: int option; total_unroll: Emitter.t option; @@ -46,14 +174,14 @@ end else begin try begin - let i = - Cil.constFold true(!Db.Properties.Interp.term_to_exp None spec) - in - match isInteger i with + let t = Visitor.visitFramacTerm (new simplify_const_lval) spec in + let i = Logic_utils.constFoldTermToInt t in + match i with | Some i -> { info with unroll_number = Some (Integer.to_int i) } | None -> Kernel.warning ~once:true ~current:true - "ignoring unrolling directive (not a constant expression)"; + "ignoring unrolling directive (not an understood constant \ + expression)"; info end with Invalid_argument s -> @@ -68,7 +196,10 @@ "found two total unroll pragmas"; info end else { info with total_unroll = Some emitter } - | _ -> info + | _ -> + Kernel.warning ~once:true ~current:true + "ignoring invalid unrolling directive"; + info let extract_from_pragmas s = let filter _ a = Logic_utils.is_loop_pragma a in @@ -98,6 +229,11 @@ let copy_var = let counter = ref (-1) in + (* [VP] I fail too see the purpose of this argument instead of changing + the counter at each variable's copy: copy_var () is called once per + copy of block with local variables, bearing no relationship with the + number of unrolling. counter could thus be an arbitrary integer as well. + *) fun () -> decr counter; fun vi -> @@ -106,7 +242,7 @@ Cil_const.change_varinfo_name vi' name; vi' -let refresh_vars new_var old_var = +let refresh_vars old_var new_var = let assoc = List.combine old_var new_var in let visit = object inherit Visitor.frama_c_inplace @@ -114,7 +250,8 @@ try ChangeTo (snd (List.find (fun (x,_) -> x.vid = vi.vid) assoc)) with Not_found -> SkipChildren end - in Visitor.visitFramacStmt visit + in + fun b -> ignore (Visitor.visitFramacBlock visit b) (* Takes care of local gotos and labels into C. *) let update_gotos sid_tbl block = @@ -331,7 +468,8 @@ and copy_stmtkind break_continue_must_change labelled_stmt_tbl calls_tbl stkind = match stkind with - |(Instr _ | Return _) as keep -> keep,labelled_stmt_tbl,calls_tbl + | (Instr _ | Return _ | Throw _) as keep -> + keep,labelled_stmt_tbl,calls_tbl | Goto (stmt_ref, loc) -> Goto (ref !stmt_ref, loc),labelled_stmt_tbl,calls_tbl | If (exp,bl1,bl2,loc) -> CurrentLoc.set loc; @@ -398,6 +536,42 @@ (fun s -> Cil_datatype.Stmt.Map.find s new_labelled_stmt_tbl) stmts in Switch(e,new_block,stmts',loc),new_labelled_stmt_tbl,calls_tbl + | TryCatch(t,c,loc) -> + let t', labs, calls = + copy_block break_continue_must_change labelled_stmt_tbl calls_tbl t + in + let treat_one_extra_binding mv mv' (bindings, labs, calls) (v,b) = + let v' = copy_var () v in + assoc := (v,v')::!assoc; + let b', labs', calls' = + copy_block break_continue_must_change labs calls b + in + refresh_vars [mv; v] [mv'; v'] b'; + (v',b')::bindings, labs', calls' + in + let treat_one_catch (catches, labs, calls) (v,b) = + let v', vorig, vnew, labs', calls' = + match v with + | Catch_all -> Catch_all, [], [], labs, calls + | Catch_exn(v,l) -> + let v' = copy_var () v in + assoc:=(v,v')::!assoc; + let l', labs', calls' = + List.fold_left + (treat_one_extra_binding v v') ([],labs, calls) l + in + Catch_exn(v', List.rev l'), [v], [v'], labs', calls' + in + let (b', labs', calls') = + copy_block break_continue_must_change labs' calls' b + in + refresh_vars vorig vnew b'; + (v', b')::catches, labs', calls' + in + let c', labs', calls' = + List.fold_left treat_one_catch ([],labs, calls) c + in + TryCatch(t',List.rev c',loc), labs', calls' | TryFinally _ | TryExcept _ -> assert false and copy_block break_continue_must_change labelled_stmt_tbl calls_tbl bl = @@ -416,9 +590,8 @@ in fundec.slocals <- fundec.slocals @ new_locals; assoc:=(List.combine bl.blocals new_locals) @ !assoc; - let new_block = - mkBlock (List.rev_map (refresh_vars new_locals bl.blocals) new_stmts) - in + let new_block = mkBlock (List.rev new_stmts) in + refresh_vars bl.blocals new_locals new_block; new_block.blocals <- new_locals; new_block,labelled_stmt_tbl,calls_tbl in diff -Nru frama-c-20140301+neon+dfsg/src/kernel/unroll_loops.mli frama-c-20150201+sodium+dfsg/src/kernel/unroll_loops.mli --- frama-c-20140301+neon+dfsg/src/kernel/unroll_loops.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/unroll_loops.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/kernel/visitor.ml frama-c-20150201+sodium+dfsg/src/kernel/visitor.ml --- frama-c-20140301+neon+dfsg/src/kernel/visitor.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/visitor.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -24,6 +24,8 @@ open Cil open Cil_types +let dkey = Kernel.register_category "visitor" + (* ************************************************************************* *) (** {2 Visitors} *) (* ************************************************************************* *) @@ -66,8 +68,9 @@ method current_kf = !current_kf method! private vstmt stmt = + let orig_stmt = Cil.get_original_stmt self#behavior stmt in let annots = - Annotations.fold_code_annot (fun e a acc -> (e, a) :: acc) stmt [] + Annotations.fold_code_annot (fun e a acc -> (e, a) :: acc) orig_stmt [] in let res = self#vstmt_aux stmt in (* Annotations will be visited and more importantly added in the @@ -159,7 +162,13 @@ let old_ensures = fold_elt Annotations.fold_ensures in let old_assigns = fold_elt Annotations.fold_assigns in let old_allocates = fold_elt Annotations.fold_allocates in - let res = self#vbehavior b in + let old_extended = fold_elt Annotations.fold_extended in + let b' = + if Cil.is_copy_behavior self#behavior then + { b with b_name = b.b_name } + else b + in + let res = self#vbehavior b' in let new_kf = Cil.get_kernel_function self#behavior kf in let add_queue a = Queue.add a self#get_filling_actions in let visit_clauses vis f = @@ -190,7 +199,7 @@ in let fold_elt fold visit remove add append dft = let (changed, res) = - fold.Fold.apply (check_elt visit) kf b.b_name (false,[]) + fold.Fold.apply (check_elt visit) kf b'.b_name (false,[]) in if changed then begin add_queue @@ -201,8 +210,8 @@ | None -> remove e' new_kf x | Some e when Emitter.equal e e' -> remove e' new_kf x | _ -> ()) - new_kf b.b_name (); - List.iter (fun (e,x) -> add e new_kf b.b_name x) res) + new_kf b'.b_name (); + List.iter (fun (e,x) -> add e new_kf b'.b_name x) res) end; List.fold_left (fun acc (_,x) -> append x acc) dft res in @@ -214,7 +223,7 @@ (fun e kf b r -> Annotations.add_requires e kf b [r]) (fun x l -> x :: l) [] in - b.b_requires <- req; + b'.b_requires <- req; let assumes = fold_elt { Fold.apply = Annotations.fold_assumes } @@ -223,7 +232,7 @@ (fun e kf b a -> Annotations.add_assumes e kf b [a]) (fun x l -> x :: l) [] in - b.b_assumes <- assumes; + b'.b_assumes <- assumes; let visit_ensures vis (k,p as e) = let new_p = Cil.visitCilIdPredicate (vis:>Cil.cilVisitor) p in if p != new_p then (k,new_p) else e @@ -236,7 +245,7 @@ (fun e kf b p -> Annotations.add_ensures e kf b [p]) (fun x l -> x :: l) [] in - b.b_post_cond <- ensures; + b'.b_post_cond <- ensures; let add_assigns e kf b a = match a with | WritesAny -> () @@ -256,7 +265,7 @@ concat_assigns WritesAny in - b.b_assigns <- a; + b'.b_assigns <- a; let concat_allocation new_a a = match new_a, a with | FreeAllocAny, a | a, FreeAllocAny -> a @@ -271,8 +280,18 @@ concat_allocation FreeAllocAny in - b.b_allocation <- a; - f b + b'.b_allocation <- a; + let ext = + fold_elt + { Fold.apply = Annotations.fold_extended } + Cil.visitCilExtended + Annotations.remove_extended + Annotations.add_extended + (fun x y -> x::y) + [] + in + b'.b_extended <- ext; + f b' in let remove_and_add get remove add fold old b = let emitter = match e with None -> Emitter.end_user | Some e -> e in @@ -299,7 +318,7 @@ add e new_kf b.b_name x)) (List.rev elts); in - let register_annots b f = + let register_annots b' f = add_queue (fun () -> ignore (Annotations.behaviors ~populate:false new_kf)); remove_and_add @@ -307,19 +326,19 @@ Annotations.remove_requires (fun e kf b r -> Annotations.add_requires e kf b [r]) Annotations.fold_requires - old_requires b; + old_requires b'; remove_and_add (fun b -> b.b_assumes) Annotations.remove_assumes (fun e kf b r -> Annotations.add_assumes e kf b [r]) Annotations.fold_assumes - old_assumes b; + old_assumes b'; remove_and_add (fun b -> b.b_post_cond) Annotations.remove_ensures (fun e kf b r -> Annotations.add_ensures e kf b [r]) Annotations.fold_ensures - old_ensures b; + old_ensures b'; remove_and_add (fun b -> match b.b_assigns with WritesAny -> [] | a -> [a]) Annotations.remove_assigns @@ -328,14 +347,20 @@ | WritesAny -> () | Writes _ -> Annotations.add_assigns ~keep_empty:false e kf b a) Annotations.fold_assigns - old_assigns b; + old_assigns b'; remove_and_add (fun b -> match b.b_allocation with FreeAllocAny -> [] | a -> [a]) Annotations.remove_allocates Annotations.add_allocates Annotations.fold_allocates - old_allocates b; - f b + old_allocates b'; + remove_and_add + (fun b -> b.b_extended) + Annotations.remove_extended + Annotations.add_extended + Annotations.fold_extended + old_extended b'; + f b' in match res with | SkipChildren -> b @@ -590,7 +615,8 @@ method! vglob g = let fundec, has_kf = match g with | GVarDecl(_,v,_) when isFunctionType v.vtype -> - let kf = try Globals.Functions.get v with Not_found -> + let ov = Cil.get_original_varinfo self#behavior v in + let kf = try Globals.Functions.get ov with Not_found -> Kernel.fatal "No kernel function for %s(%d)" v.vname v.vid in (* Just make a copy of current kernel function in case it is needed *) @@ -719,7 +745,7 @@ let new_kf = Cil.get_kernel_function self#behavior kf in Queue.add (fun () -> - Kernel.debug + Kernel.debug ~dkey "@[Adding definition %s (vid: %d) for project %s@\n\ body: %a@\n@]@." f.svar.vname f.svar.vid @@ -811,8 +837,9 @@ class frama_c_copy prj = generic_frama_c_visitor (copy_visit prj) -class frama_c_inplace = - generic_frama_c_visitor (inplace_visit()) +class frama_c_refresh prj = generic_frama_c_visitor (refresh_visit prj) + +class frama_c_inplace = generic_frama_c_visitor (inplace_visit()) let visitFramacFileCopy vis f = visitCilFileCopy (vis:>cilVisitor) f @@ -826,9 +853,12 @@ vis#fill_global_tables; g' let visitFramacFunction vis f = - vis#set_current_kf (Globals.Functions.get f.svar); + let orig_var = Cil.get_original_varinfo vis#behavior f.svar in + let old_current_kf = vis#current_kf in + vis#set_current_kf (Globals.Functions.get orig_var); let f' = visitCilFunction (vis:>cilVisitor) f in vis#reset_current_kf (); + Extlib.may vis#set_current_kf old_current_kf; vis#fill_global_tables; f' let visitFramacExpr vis e = diff -Nru frama-c-20140301+neon+dfsg/src/kernel/visitor.mli frama-c-20150201+sodium+dfsg/src/kernel/visitor.mli --- frama-c-20140301+neon+dfsg/src/kernel/visitor.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/kernel/visitor.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -90,6 +90,11 @@ See {!File.init_project_from_visitor} and [create_project_from_visitor] for possible uses. *) +class frama_c_refresh: Project.t -> frama_c_visitor + (** Similar to {!frama_c_copy}, but ids will be refreshed in the copy. + @since Sodium-20150201 + *) + class generic_frama_c_visitor: Cil.visitor_behavior -> frama_c_visitor (** Generic class that abstracts over [frama_c_inplace] and [frama_c_copy]. diff -Nru frama-c-20140301+neon+dfsg/src/lib/bad_dynlink_311_or_higher.ml frama-c-20150201+sodium+dfsg/src/lib/bad_dynlink_311_or_higher.ml --- frama-c-20140301+neon+dfsg/src/lib/bad_dynlink_311_or_higher.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/bad_dynlink_311_or_higher.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,10 +20,6 @@ (* *) (**************************************************************************) -(* Should not be in this module, but must happen very early in the boot - process *) -let () = Printexc.record_backtrace true - (* Implementation of [Dynlink_common_interface] compatible with OCaml >=3.11 whenever [Dynlink] **does not** correctly work. *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/bag.ml frama-c-20150201+sodium+dfsg/src/lib/bag.ml --- frama-c-20140301+neon+dfsg/src/lib/bag.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/bag.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/bag.mli frama-c-20150201+sodium+dfsg/src/lib/bag.mli --- frama-c-20140301+neon+dfsg/src/lib/bag.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/bag.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/binary_cache.ml frama-c-20150201+sodium+dfsg/src/lib/binary_cache.ml --- frama-c-20140301+neon+dfsg/src/lib/binary_cache.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/binary_cache.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -24,7 +24,8 @@ let memory_footprint = let error () = - Kernel.error "@[Bad value for environment variable@ %s.@ Expected value: \ + Cmdline.Kernel_log.error + "@[Bad value for environment variable@ %s.@ Expected value: \ integer between@ 1 and 10.@ Using@ default value@ of 2.@]" memory_footprint_var_name; 2 @@ -39,6 +40,23 @@ let cache_size = 1 lsl (8 + memory_footprint) +(** The caches of this module are lazy, for two reasons: + + - some caches are never used, because the function that created them is + never called. This typically happens for functors implementing generic + datastructures, where not all functions are used in every module + (but every function with a static cache creates its cache nevertheless) + + - Caches must be cleared as soon as some states change, in order to remain + coherent (for example, when the current project changes). When setting + multiple command-line options, the caches may be cleared after each option. + When caches are big, this becomes very time-consuming. To avoid this, + the functions [clear] do nothing when the caches have not been forced yet. + (This is not perfect: once a lazy cache has been forced, each 'clear' + operation becomes costly again.) +*) +let (!!) = Lazy.force + module type Cacheable = sig type t @@ -153,6 +171,75 @@ Obj.obj (Obj.field t (base+2)) end +module Array_4 = +struct + type ('a, 'b, 'c, 'd) t + + let (clear : ('a , 'b , 'c , 'd) t -> + 'a -> 'b -> 'c -> 'd -> unit) + = fun t a b c d -> + let t = Obj.repr t in + let size4 = Obj.size t in + let i = ref 0 in + while (!i < size4) + do + let base = !i in + Obj.set_field t (base) (Obj.repr a); + Obj.set_field t (base+1) (Obj.repr b); + Obj.set_field t (base+2) (Obj.repr c); + Obj.set_field t (base+3) (Obj.repr d); + i := base + 7; + done + + let (make : int -> 'a -> 'b -> 'c -> 'd -> + ('a , 'b , 'c , 'd) t) + = fun size a b c d -> + let size4 = 4 * size in + let t = Obj.obj (Obj.new_block 0 size4) in + clear t a b c d; + t + + let (set : + ('a, 'b, 'c, 'd) t -> int -> + 'a -> 'b -> 'c -> 'd -> unit) + = fun t i a b c d -> + let t = Obj.repr t in + let base = 4 * i in + Obj.set_field t (base) (Obj.repr a); + Obj.set_field t (base+1) (Obj.repr b); + Obj.set_field t (base+2) (Obj.repr c); + Obj.set_field t (base+3) (Obj.repr d); + ;; + + let (get0 : + ('a, 'b, 'c, 'd) t -> int -> 'a) + = fun t i -> + let t = Obj.repr t in + let base = 4 * i in + Obj.obj (Obj.field t (base)) + + let (get1 : + ('a, 'b, 'c, 'd) t -> int -> 'b) + = fun t i -> + let t = Obj.repr t in + let base = 4 * i in + Obj.obj (Obj.field t (base+1)) + + let (get2 : + ('a, 'b, 'c, 'd) t -> int -> 'c) + = fun t i -> + let t = Obj.repr t in + let base = 4 * i in + Obj.obj (Obj.field t (base+2)) + + let (get3 : + ('a, 'b, 'c, 'd) t -> int -> 'd) + = fun t i -> + let t = Obj.repr t in + let base = 4 * i in + Obj.obj (Obj.field t (base+3)) +end + module Array_7 = struct type ('a, 'b, 'c, 'd, 'e, 'f, 'g) t @@ -176,7 +263,7 @@ i := base + 7; done - let (make : int -> 'a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g -> + let (_make : int -> 'a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g -> ('a , 'b , 'c , 'd , 'e , 'f , 'g) t) = fun size a b c d e f g -> let size7 = 7 * size in @@ -184,7 +271,7 @@ clear t a b c d e f g; t - let (set : + let (_set : ('a, 'b, 'c, 'd, 'e, 'f, 'g) t -> int -> 'a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g -> unit) = fun t i a b c d e f g -> @@ -198,49 +285,49 @@ Obj.set_field t (base+5) (Obj.repr f); Obj.set_field t (base+6) (Obj.repr g) - let (get0 : + let (_get0 : ('a, 'b, 'c, 'd, 'e, 'f, 'g) t -> int -> 'a) = fun t i -> let t = Obj.repr t in let base = 7 * i in Obj.obj (Obj.field t (base)) - let (get1 : + let (_get1 : ('a, 'b, 'c, 'd, 'e, 'f, 'g) t -> int -> 'b) = fun t i -> let t = Obj.repr t in let base = 7 * i in Obj.obj (Obj.field t (base+1)) - let (get2 : + let (_get2 : ('a, 'b, 'c, 'd, 'e, 'f, 'g) t -> int -> 'c) = fun t i -> let t = Obj.repr t in let base = 7 * i in Obj.obj (Obj.field t (base+2)) - let (get3 : + let (_get3 : ('a, 'b, 'c, 'd, 'e, 'f, 'g) t -> int -> 'd) = fun t i -> let t = Obj.repr t in let base = 7 * i in Obj.obj (Obj.field t (base+3)) - let (get4 : + let (_get4 : ('a, 'b, 'c, 'd, 'e, 'f, 'g) t -> int -> 'e) = fun t i -> let t = Obj.repr t in let base = 7 * i in Obj.obj (Obj.field t (base+4)) - let (get5 : + let (_get5 : ('a, 'b, 'c, 'd, 'e, 'f, 'g) t -> int -> 'f) = fun t i -> let t = Obj.repr t in let base = 7 * i in Obj.obj (Obj.field t (base+5)) - let (get6 : + let (_get6 : ('a, 'b, 'c, 'd, 'e, 'f, 'g) t -> int -> 'g) = fun t i -> let t = Obj.repr t in @@ -249,15 +336,16 @@ end -module Make_Symmetric (H: Cacheable) (R: Result) = +module Symmetric_Binary (H: Cacheable) (R: Result) = struct let size = cache_size - let cache = Array_3.make size H.sentinel H.sentinel R.sentinel + let cache = lazy (Array_3.make size H.sentinel H.sentinel R.sentinel) let mask = pred size let clear () = - Array_3.clear cache H.sentinel H.sentinel R.sentinel + if Lazy.lazy_is_val cache then + Array_3.clear !!cache H.sentinel H.sentinel R.sentinel let hash = H.hash @@ -273,50 +361,109 @@ in let has = has land mask in - if H.equal (Array_3.get0 cache has) a0 - && H.equal (Array_3.get1 cache has) a1 + if H.equal (Array_3.get0 !!cache has) a0 + && H.equal (Array_3.get1 !!cache has) a1 then begin (* Format.printf "Cache O@."; *) - Array_3.get2 cache has + Array_3.get2 !!cache has end else let result = f a0 a1 in (* Format.printf "Cache N@."; *) - Array_3.set cache has a0 a1 result; + Array_3.set !!cache has a0 a1 result; result end - -module Make_Asymmetric (H: Cacheable) (R: Result) = +module Arity_One (H: Cacheable) (R: Result) = struct let size = cache_size - let cache = Array_3.make size H.sentinel H.sentinel R.sentinel + let cache = lazy (Array_2.make size H.sentinel R.sentinel) let mask = pred size let clear () = - Array_3.clear cache H.sentinel H.sentinel R.sentinel + if Lazy.lazy_is_val cache then + Array_2.clear !!cache H.sentinel R.sentinel - let merge f a0 a1 = + let merge f a0 = let h0 = H.hash a0 in - let h1 = H.hash a1 in + let has = h0 land mask in + if H.equal (Array_2.get0 !!cache has) a0 + then begin +(* Format.printf "Cache O@."; *) + Array_2.get1 !!cache has + end + else + let result = f a0 in +(* Format.printf "Cache N@."; *) + Array_2.set !!cache has a0 result; + result +end + +module Arity_Two (H0: Cacheable) (H1: Cacheable) (R: Result) = +struct + + let size = cache_size + let cache = lazy (Array_3.make size H0.sentinel H1.sentinel R.sentinel) + let mask = pred size + + let clear () = + if Lazy.lazy_is_val cache then + Array_3.clear !!cache H0.sentinel H1.sentinel R.sentinel + + let merge f a0 a1 = + let h0 = H0.hash a0 in + let h1 = H1.hash a1 in let has = h1 lsl 5 - h1 + h0 in let has = has land mask in - if H.equal (Array_3.get0 cache has) a0 - && H.equal (Array_3.get1 cache has) a1 + if H0.equal (Array_3.get0 !!cache has) a0 + && H1.equal (Array_3.get1 !!cache has) a1 then begin (* Format.printf "Cache O@."; *) - Array_3.get2 cache has + Array_3.get2 !!cache has end else let result = f a0 a1 in (* Format.printf "Cache N@."; *) - Array_3.set cache has a0 a1 result; + Array_3.set !!cache has a0 a1 result; + result +end + +module Arity_Three (H0: Cacheable) (H1: Cacheable) (H2: Cacheable) (R: Result) = +struct + let size = cache_size + let cache = + lazy (Array_4.make size H0.sentinel H1.sentinel H2.sentinel R.sentinel) + let mask = pred size + + let clear () = + if Lazy.lazy_is_val cache then + Array_4.clear !!cache H0.sentinel H1.sentinel H2.sentinel R.sentinel + + let merge f a0 a1 a2 = + let h0 = H0.hash a0 in + let h1 = H1.hash a1 in + let h2 = H2.hash a2 in + let has = h0 + 117 * h1 + 2375 * h2 in + let has = has land mask in + + if H0.equal (Array_4.get0 !!cache has) a0 + && H1.equal (Array_4.get1 !!cache has) a1 + && H2.equal (Array_4.get2 !!cache has) a2 + then begin +(* Format.printf "Cache O@."; *) + Array_4.get3 !!cache has + end + else + let result = f a0 a1 a2 in +(* Format.printf "Cache N@."; *) + Array_4.set !!cache has a0 a1 a2 result; result end + module Array_Bit = struct let make size = @@ -346,16 +493,18 @@ String.fill s 0 (String.length s) zero end -module Make_Binary (H0: Cacheable) (H1: Cacheable) = +module Binary_Predicate (H0: Cacheable) (H1: Cacheable) = struct let size = cache_size - let cache = Array_2.make size H0.sentinel H1.sentinel - let result = Array_Bit.make size + let cache = lazy (Array_2.make size H0.sentinel H1.sentinel) + let result = lazy (Array_Bit.make size) let mask = pred size let clear () = - Array_2.clear cache H0.sentinel H1.sentinel; - Array_Bit.clear result + if Lazy.lazy_is_val cache then + Array_2.clear !!cache H0.sentinel H1.sentinel; + if Lazy.lazy_is_val result then + Array_Bit.clear !!result let merge f a0 a1 = let has = @@ -365,30 +514,32 @@ in let has = has land mask in - if H0.equal (Array_2.get0 cache has) a0 - && H1.equal (Array_2.get1 cache has) a1 + if H0.equal (Array_2.get0 !!cache has) a0 + && H1.equal (Array_2.get1 !!cache has) a1 then begin (* Format.printf "Cache O@."; *) - Array_Bit.get result has + Array_Bit.get !!result has end else let r = f a0 a1 in (* Format.printf "Cache N@."; *) - Array_2.set cache has a0 a1; - Array_Bit.set result has r; + Array_2.set !!cache has a0 a1; + Array_Bit.set !!result has r; r end -module Make_Symmetric_Binary (H0: Cacheable) = +module Symmetric_Binary_Predicate (H0: Cacheable) = struct let size = cache_size - let cache = Array_2.make size H0.sentinel H0.sentinel - let result = Array_Bit.make size + let cache = lazy (Array_2.make size H0.sentinel H0.sentinel) + let result = lazy (Array_Bit.make size) let mask = pred size let clear () = - Array_2.clear cache H0.sentinel H0.sentinel; - Array_Bit.clear result + if Lazy.lazy_is_val cache then + Array_2.clear !!cache H0.sentinel H0.sentinel; + if Lazy.lazy_is_val result then + Array_Bit.clear !!result let hash = H0.hash @@ -404,59 +555,20 @@ in let has = has land mask in - if H0.equal (Array_2.get0 cache has) a0 - && H0.equal (Array_2.get1 cache has) a1 + if H0.equal (Array_2.get0 !!cache has) a0 + && H0.equal (Array_2.get1 !!cache has) a1 then begin (* Format.printf "Cache O@."; *) - Array_Bit.get result has + Array_Bit.get !!result has end else let r = f a0 a1 in (* Format.printf "Cache N@."; *) - Array_2.set cache has a0 a1; - Array_Bit.set result has r; + Array_2.set !!cache has a0 a1; + Array_Bit.set !!result has r; r end -module Make_Het1_1_4 (H0: Cacheable) (H1: Cacheable) (H2: Cacheable) (R: Result) = -struct - let size = cache_size - let cache = - Array_7.make size - H0.sentinel H1.sentinel - H2.sentinel H2.sentinel H2.sentinel H2.sentinel - R.sentinel - - let mask = pred size - - let clear () = - Array_7.clear cache - H0.sentinel H1.sentinel - H2.sentinel H2.sentinel H2.sentinel H2.sentinel - R.sentinel - - let merge f a0 a1 a2 a3 a4 a5 = - let has = H0.hash a0 + 4909 * (H1.hash a1) + - 127 * (H2.hash a2) + 971 * (H2.hash a3) + - 31 * (H2.hash a4) + 7907 * (H2.hash a5) - in - let has = has land mask in - if H0.equal (Array_7.get0 cache has) a0 - && H1.equal (Array_7.get1 cache has) a1 - && H2.equal (Array_7.get2 cache has) a2 - && H2.equal (Array_7.get3 cache has) a3 - && H2.equal (Array_7.get4 cache has) a4 - && H2.equal (Array_7.get5 cache has) a5 - then begin -(* Format.printf "Cache O@."; *) - Array_7.get6 cache has - end - else - let result = f () in -(* Format.printf "Cache N@."; *) - Array_7.set cache has a0 a1 a2 a3 a4 a5 result; - result -end (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/lib/binary_cache.mli frama-c-20150201+sodium+dfsg/src/lib/binary_cache.mli --- frama-c-20140301+neon+dfsg/src/lib/binary_cache.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/binary_cache.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -42,34 +42,40 @@ val sentinel : t end -module Make_Symmetric(H : Cacheable)(R : Result): sig +module Symmetric_Binary(H : Cacheable)(R : Result): sig val clear : unit -> unit val merge : (H.t -> H.t -> R.t) -> H.t -> H.t -> R.t end -module Make_Asymmetric(H : Cacheable)(R : Result): sig - val clear : unit -> unit - val merge : (H.t -> H.t -> R.t) -> H.t -> H.t -> R.t -end -module Make_Binary(H0 : Cacheable)(H1 : Cacheable): sig +module Binary_Predicate(H0 : Cacheable)(H1 : Cacheable): sig val clear : unit -> unit val merge : (H0.t -> H1.t -> bool) -> H0.t -> H1.t -> bool end -module Make_Symmetric_Binary(H0 : Cacheable): sig +module Symmetric_Binary_Predicate(H0 : Cacheable): sig val clear : unit -> unit val merge : (H0.t -> H0.t -> bool) -> H0.t -> H0.t -> bool end -module Make_Het1_1_4 - (H0 : Cacheable)(H1 : Cacheable)(H2 : Cacheable) (R : Result): + +module Arity_One(H : Cacheable)(R : Result): sig + val clear : unit -> unit + val merge : (H.t -> R.t) -> H.t -> R.t +end + +module Arity_Two(H0 : Cacheable)(H1 : Cacheable)(R : Result): sig + val clear : unit -> unit + val merge : (H0.t -> H1.t -> R.t) -> H0.t -> H1.t -> R.t +end + +module Arity_Three(H0 : Cacheable)(H1 : Cacheable)(H2 : Cacheable)(R : Result): sig val clear : unit -> unit - val merge : - (unit -> R.t) -> H0.t -> H1.t -> H2.t -> H2.t -> H2.t -> H2.t -> R.t + val merge : (H0.t -> H1.t -> H2.t -> R.t) -> H0.t -> H1.t -> H2.t -> R.t end + (* Local Variables: compile-command: "make -C ../.." diff -Nru frama-c-20140301+neon+dfsg/src/lib/bitvector.ml frama-c-20150201+sodium+dfsg/src/lib/bitvector.ml --- frama-c-20140301+neon+dfsg/src/lib/bitvector.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/bitvector.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -24,15 +24,65 @@ (* --- Bit Vector Library --- *) (* ------------------------------------------------------------------------ *) +(* Notes: + - Bits are counted from 0, in string order, then from least to + most significant. For instance the value of bit 11 is tested + with (s.[1] land (1 lsl 3) == 0) + - Strings can store more bits than the bitvector they represent; + for instance a bitvector of size 11 is stored in a 2-bytes + string. We (currently) do not store the actual size of the + bitvector, which has to be provided in some informations (such as + concat). We rely on the invariant that the extra bits are set to + 0 (this is important e.g. for equality testing). An alternative + design could have been not to explicitely ignore these extra bits + in operations that are sensitive to them, but this seems more + error-prone. *) + type t = string let max_size = 1 lsl 20 +let ( <-< ) a b = char_of_int (((int_of_char a) lsl b) land 255);; +let ( >-> ) a b = char_of_int ((int_of_char a) lsr b);; +let ( ||| ) a b = char_of_int ((int_of_char a) lor (int_of_char b));; +let ( &&& ) a m = char_of_int ((int_of_char a) land m);; + +(* Imperatively unset the extra trailing bits *) +let clean_trail size bv = + let last = (size + 7) / 8 - 1 in + assert (last < String.length bv); + let r = size land 7 in + if r > 0 then + (let mask = 1 lsl r - 1 in + bv.[last] <- bv.[last] &&& mask) ; + for i = last + 1 to String.length bv - 1 do + bv.[i] <- '\000' ; + done ; + bv +;; + +let capacity s = String.length s * 8 + let create n = - let s = n lsr 3 in + let s = (n + 7) lsr 3 in (* rounded-up division *) + if s > max_size then raise (Invalid_argument "Bitvector.create") ; + String.make s '\000' + +let resize n s = + let u = create n in + String.blit s 0 u 0 (min (String.length s) (String.length u)) ; + clean_trail n u + +let create_set n = + let s = (n + 7) lsr 3 in (* rounded-up division *) if s > max_size then raise (Invalid_argument "Bitvector.create") ; + let copy = String.make s (char_of_int 255) in let r = n land 7 in - String.make (if r > 0 then succ s else s) '\000' + (* Set only the last r bits in the last byte. *) + if r != 0 + then copy.[s-1] <- char_of_int ((1 lsl r) - 1); + copy +;; let pp_bits fmt x = for k=7 downto 0 do @@ -89,6 +139,115 @@ let b1 = b0 lor (1 lsl r) in if b0 = b1 then false else (s.[p] <- char_of_int b1 ; true) +let bnot size s = + let len = (size + 7) / 8 in + let copy = String.make (String.length s) '\000' in + for i = 0 to len-1 do + copy.[i] <- char_of_int ((lnot (int_of_char s.[i])) land 255) + done; + clean_trail size copy +;; + + +(* Internal; this function does not clean the trail for operations + that do not need it. *) +let bitwise_bop bop a b = + assert ((String.length a) = (String.length b)); + let copy = String.make (String.length a) '\000' in + for i = 0 to (String.length a) - 1 do + copy.[i] <- char_of_int (255 land (bop (int_of_char a.[i]) (int_of_char b.[i]))); + done; + copy + +let band _ = bitwise_bop (land);; +let bor _ = bitwise_bop (lor);; +let bxor _ = bitwise_bop (lxor);; +let beq size a b = + let bv = bitwise_bop (fun x y -> lnot (x lxor y)) a b in + clean_trail size bv +;; + +let bitwise_op2 size op2 a b = + let len = String.length a in + assert (len = (String.length b)); + let copy = String.make len '\000' in + for i = 0 to len - 1 do + copy.[i] <- char_of_int (255 land (op2 + (int_of_char a.[i]) + (int_of_char b.[i]))) + done; + clean_trail size copy +;; + + + +let bitwise_op3 size op3 a b c = + let len = String.length a in + assert (len = (String.length b)); + assert (len = (String.length c)); + let copy = String.make len '\000' in + for i = 0 to len - 1 do + copy.[i] <- char_of_int (255 land (op3 + (int_of_char a.[i]) + (int_of_char b.[i]) + (int_of_char c.[i]))); + done; + clean_trail size copy +;; + +let bitwise_op4 size op4 a b c d = + let len = String.length a in + assert (len = (String.length b)); + assert (len = (String.length c)); + assert (len = (String.length d)); + let copy = String.make len '\000' in + for i = 0 to len - 1 do + copy.[i] <- char_of_int (255 land + (op4 + (int_of_char a.[i]) (int_of_char b.[i]) + (int_of_char c.[i]) (int_of_char d.[i]))); + done; + clean_trail size copy +;; + + +let equal = (=);; (* String equality. *) +let compare = Pervasives.compare +let hash = Hashtbl.hash + +let concat bv1 size1 bv2 size2 = + let len1 = size1 / 8 in + let str1 = (size1 + 7) / 8 in + let str2 = (size2 + 7) / 8 in + assert (str1 <= String.length bv1); + assert (str2 <= String.length bv2); + let newlen = (size1 + size2 + 7) / 8 in + let copy = String.create newlen in + String.blit bv1 0 copy 0 len1 ; + let fst_bits = size1 land 7 in + let snd_bits = 8 - fst_bits in + + (* Byte-aligned case. *) + if fst_bits = 0 then + (String.blit bv2 0 copy len1 str2; + copy) + + (* Not aligned. *) + else + let rec loop prev_byte i = + let j = len1 + i in + if i <= str2 - 1 + then + (copy.[j] <- prev_byte ||| (bv2.[i] <-< fst_bits); + loop (bv2.[i] >-> snd_bits) (i+1)) + else + if j < newlen + then copy.[j] <- (bv2.[str2-1] >-> snd_bits) + else () + in + loop bv1.[len1] 0; + clean_trail (size1+size2) copy;; + let iter_true f s = for p = 0 to String.length s - 1 do let x = int_of_char s.[p] in @@ -172,3 +331,4 @@ s.[q0] <- char_of_int x ; pred q0 in for i=p to q do s.[i] <- '\255' done +;; diff -Nru frama-c-20140301+neon+dfsg/src/lib/bitvector.mli frama-c-20150201+sodium+dfsg/src/lib/bitvector.mli --- frama-c-20140301+neon+dfsg/src/lib/bitvector.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/bitvector.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -21,7 +21,7 @@ (**************************************************************************) (* ------------------------------------------------------------------------ *) -(** Bitvector naive implementation. +(** Bitvectors. @since Carbon-20101201 *) (* ------------------------------------------------------------------------ *) @@ -29,6 +29,14 @@ type t val create : int -> t (** Create a vector of [n] bits, with all bits unset. *) +val create_set : int -> t (** Create a vector of [n] bits, with all bits set.*) + +val capacity : t -> int +(** Maximum number of bits in the bitvector. *) + +val resize : int -> t -> t +(** A copy of the bitvector up-to or down-to [n] bits. + Extra bits up to final bitvector capacity are set to zero. *) val mem : t -> int -> bool val set : t -> int -> unit @@ -37,9 +45,40 @@ val set_range : t -> int -> int -> unit val is_empty : t -> bool +val equal: t -> t -> bool +val compare: t -> t -> int +val hash: t -> int + +(** {2 Bitwise Binary Operations} + The first argument is the size of the vectors. *) + +val bnot: int -> t -> t +val band: int -> t -> t -> t +val bor: int -> t -> t -> t +val bxor: int -> t -> t -> t (* bitwise difference *) +val beq: int -> t -> t -> t (* bitwise equivalence/equality *) + +(** {2 Generic Bitwise Operations}. + Prefer using these rather than create intermediary bitvectors. *) + +val bitwise_op2: int -> (int -> int -> int) -> t -> t -> t +val bitwise_op3: int -> (int -> int -> int -> int) -> t -> t -> t -> t +val bitwise_op4: int -> (int -> int -> int -> int -> int) -> t -> t -> t -> t -> t + +(** {2 Sized Concatenation} *) + +val concat: t -> int -> t -> int -> t +(** [concat b1 s1 b2 s2] concatenates + the [s1] first bits of [b1] with + the [s2] first bits of [b2]. *) + +(** {2 Misc} *) + val iter_true : (int -> unit) -> t -> unit + (** Iterates on all indexes of the bitvector with their bit set. *) + val fold_true : ('a -> int -> 'a) -> 'a -> t -> 'a - (** Iterates on all indexes of the bitvector with their bit set. *) + (** Iterates on all indexes of the bitvector with their bit set. *) val find_next_true: t -> int -> int (** [find_next_true i a] returns the first index greater or equal to diff -Nru frama-c-20140301+neon+dfsg/src/lib/dynlink_311_or_higher.ml frama-c-20150201+sodium+dfsg/src/lib/dynlink_311_or_higher.ml --- frama-c-20140301+neon+dfsg/src/lib/dynlink_311_or_higher.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/dynlink_311_or_higher.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,11 +20,6 @@ (* *) (**************************************************************************) -(* Should not be in this module, but must happen very early in the boot - process *) -let () = Printexc.record_backtrace true - - (* Implementation of [Dynlink_common_interface] compatible with OCaml >=3.11 whenever [Dynlink] does correctly work. *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/dynlink_common_interface.mli frama-c-20150201+sodium+dfsg/src/lib/dynlink_common_interface.mli --- frama-c-20140301+neon+dfsg/src/lib/dynlink_common_interface.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/dynlink_common_interface.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -73,6 +73,10 @@ (** [true] if the program is native, [false] if the program is bytecode. *) +val adapt_filename: string -> string +(** In bytecode, the identity function. In native code, replace the last + extension with [.cmxs]. *) + (** {6 Error reporting} *) type linking_error = diff -Nru frama-c-20140301+neon+dfsg/src/lib/extlib.ml frama-c-20150201+sodium+dfsg/src/lib/extlib.ml --- frama-c-20140301+neon+dfsg/src/lib/extlib.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/extlib.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -73,6 +73,8 @@ let swap f x y = f y x +let uncurry f x = f (fst x) (snd x) + let iter_uncurry2 iter f v = iter (fun a b -> f (a, b)) v @@ -218,6 +220,10 @@ | None, Some _ -> -1 | Some v1, Some v2 -> f v1 v2 +let opt_hash hash v = match v with + | None -> 31179 + | Some v -> hash v + (* ************************************************************************* *) (** Booleans *) (* ************************************************************************* *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/extlib.mli frama-c-20150201+sodium+dfsg/src/lib/extlib.mli --- frama-c-20140301+neon+dfsg/src/lib/extlib.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/extlib.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -73,6 +73,8 @@ val swap: ('a -> 'b -> 'c) -> 'b -> 'a -> 'c (** Swap arguments. *) +val uncurry: ('a -> 'b -> 'c) -> ('a * 'b) -> 'c + val iter_uncurry2: (('a -> 'b -> unit) -> 'c -> unit) -> (('a * 'b -> unit) -> 'c -> unit) @@ -97,7 +99,7 @@ (** [replace cmp x l] replaces the first element [y] of [l] such that [cmp x y] is true by [x]. If no such element exists, [x] is added at the tail of [l]. - @since Neon-20130301 + @since Neon-20140301 *) val filter_map: ('a -> bool) -> ('a -> 'b) -> 'a list -> 'b list @@ -208,6 +210,9 @@ val opt_compare : ('a -> 'a -> int) -> 'a option -> 'a option -> int (** @since Boron-20100401 *) +val opt_hash: ('a -> int) -> 'a option -> int + (** @since Sodium-20150201 *) + (* ************************************************************************* *) (** {2 Booleans} *) (* ************************************************************************* *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/FCHashtbl.ml frama-c-20150201+sodium+dfsg/src/lib/FCHashtbl.ml --- frama-c-20140301+neon+dfsg/src/lib/FCHashtbl.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/FCHashtbl.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/FCHashtbl.mli frama-c-20150201+sodium+dfsg/src/lib/FCHashtbl.mli --- frama-c-20140301+neon+dfsg/src/lib/FCHashtbl.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/FCHashtbl.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/filepath.ml frama-c-20150201+sodium+dfsg/src/lib/filepath.ml --- frama-c-20140301+neon+dfsg/src/lib/filepath.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/filepath.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/filepath.mli frama-c-20150201+sodium+dfsg/src/lib/filepath.mli --- frama-c-20140301+neon+dfsg/src/lib/filepath.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/filepath.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -32,7 +32,7 @@ {!Sysutil.absolutize_filename} if you want to obtain the absolute path of a given file. - @since Neon-20130301 + @since Neon-20140301 *) val pretty: string -> string diff -Nru frama-c-20140301+neon+dfsg/src/lib/floating_point.ml frama-c-20150201+sodium+dfsg/src/lib/floating_point.ml --- frama-c-20140301+neon+dfsg/src/lib/floating_point.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/floating_point.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -53,11 +53,7 @@ assert (Integer.gt den Integer.zero); (* Format.printf "make_float: num den exp:@\n%a@\n@\n%a@\n@\n%d@.min_exp:%d max_exp:%d@." - (Integer.pretty ~hexa:false) num - (Integer.pretty ~hexa:false) den - exp - min_exp - max_exp; + Datatype.Integer.pretty num Datatype.Integer.pretty den exp min_exp max_exp; *) let size_bi = Integer.of_int man_size in let ssize_bi = Integer.of_int (succ man_size) in @@ -85,9 +81,7 @@ let exp = !exp in (* Format.printf "make_float2: num den exp:@\n%a@\n@\n%a@\n@\n%d@." - (Integer.pretty ~hexa:false) num - (Integer.pretty ~hexa:false) den - exp; + Datatype.Integer.pretty num Datatype.Integer.pretty den exp; *) if exp > max_exp - man_size then inf ~man_size ~max_exp else @@ -100,10 +94,8 @@ in let man = Integer.to_int64 man in (* Format.printf "pre-round: num den man rem:@\n%a@\n@\n%a@\n@\n%Ld@\n@\n%a@." - (Integer.pretty ~hexa:false) num - (Integer.pretty ~hexa:false) den - man - (Integer.pretty ~hexa:false) rem; *) + Datatype.Integer.pretty num Datatype.Integer.pretty den + man Datatype.Integer.pretty rem; *) let lowb = ldexp (Int64.to_float man) exp in if Integer.is_zero rem2 then { f_lower = lowb ; @@ -321,7 +313,9 @@ end -exception Float_Non_representable_as_Int64 +type sign = Neg | Pos + +exception Float_Non_representable_as_Int64 of sign (* If the argument [x] is not in the range [min_64_float, 2*max_64_float], raise Float_Non_representable_as_Int64. This is the most reasonable as @@ -334,11 +328,12 @@ (* let open Int64 in float_of_bits (pred (bits_of_float (to_float max_int))) *) in - let float_non_representable_as_int64 = Float_Non_representable_as_Int64 in fun x -> let max_64_float = Extlib.id max_64_float in - if x < min_64_float || x > (max_64_float +. max_64_float) - then raise float_non_representable_as_int64; + if x < min_64_float + then raise (Float_Non_representable_as_Int64 Neg); + if x > (max_64_float +. max_64_float) + then raise (Float_Non_representable_as_Int64 Pos); if x <= max_64_float then Integer.of_int64 (Int64.of_float x) else @@ -346,6 +341,19 @@ (Integer.of_int64 (Int64.of_float (x +. min_64_float))) (Integer.two_power_of_int 63) +let bits_of_max_double = + Integer.of_int64 (Int64.bits_of_float max_float) +let bits_of_most_negative_double = + Integer.of_int64 (Int64.bits_of_float (-. max_float)) + +(** See e.g. http://www.h-schmidt.net/FloatConverter/IEEE754.html *) +let bits_of_max_float = Integer.of_int64 0x7F7FFFFFL +let bits_of_most_negative_float = + let v = Int64.of_int32 0xFF7FFFFFl in(* cast to int32 to get negative value *) + Integer.of_int64 v + + + (* Local Variables: compile-command: "make -C ../.. byte" diff -Nru frama-c-20140301+neon+dfsg/src/lib/floating_point.mli frama-c-20150201+sodium+dfsg/src/lib/floating_point.mli --- frama-c-20140301+neon+dfsg/src/lib/floating_point.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/floating_point.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -56,12 +56,24 @@ val pretty : Format.formatter -> float -> unit -exception Float_Non_representable_as_Int64 +type sign = Neg | Pos + +exception Float_Non_representable_as_Int64 of sign val truncate_to_integer: float -> Integer.t (** Raises [Float_Non_representable_as_Int64] if the float value cannot be represented as an Int64 or as an unsigned Int64. *) + +(** binary representation of -DBL_MAX and DBL_MAX as 64 bits signed integers *) +val bits_of_max_double : Integer.t +val bits_of_most_negative_double : Integer.t + +(** binary representation of -FLT_MAX and FLT_MAX as 32 bits signed integers *) +val bits_of_max_float : Integer.t +val bits_of_most_negative_float : Integer.t + + (* Local Variables: compile-command: "make -C ../.. byte" diff -Nru frama-c-20140301+neon+dfsg/src/lib/hook.ml frama-c-20150201+sodium+dfsg/src/lib/hook.ml --- frama-c-20140301+neon+dfsg/src/lib/hook.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/hook.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/hook.mli frama-c-20150201+sodium+dfsg/src/lib/hook.mli --- frama-c-20140301+neon+dfsg/src/lib/hook.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/hook.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -71,7 +71,7 @@ end (** hook with a notion of priority. - @since Neon-20130301 *) + @since Neon-20140301 *) module type S_ordered = sig include S type key @@ -96,15 +96,15 @@ module Fold(P: sig type t end): S with type param = P.t and type result = P.t -(** @since Neon-20130301 *) +(** @since Neon-20140301 *) module Build_ordered (P: sig module Id:Comparable type t end): S_ordered with type key = P.Id.t and type param = P.t and type result = unit -(** @since Neon-20130301 *) +(** @since Neon-20140301 *) module Make_ordered(P:sig module Id:Comparable end): S_ordered with type key = P.Id.t and type param = unit and type result = unit -(** @since Neon-20130301 *) +(** @since Neon-20140301 *) module Fold_ordered(P: sig module Id:Comparable type t end): S_ordered with type key = P.Id.t and type param = P.t and type result = P.t diff -Nru frama-c-20140301+neon+dfsg/src/lib/hptset.ml frama-c-20150201+sodium+dfsg/src/lib/hptset.ml --- frama-c-20140301+neon+dfsg/src/lib/hptset.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/hptset.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -31,6 +31,16 @@ val shape: t -> unit shape val from_shape: 'a shape -> t + val fold2_join_heterogeneous: + cache:Hptmap.cache_type -> + empty_left:('a shape -> 'b) -> + empty_right:(t -> 'b) -> + both:(elt -> 'a -> 'b) -> + join:('b -> 'b -> 'b) -> + empty:'b -> + t -> 'a shape -> + 'b + val clear_caches: unit -> unit end @@ -49,7 +59,7 @@ include Hptmap.Make (X) - (Datatype.Unit) + (struct include Datatype.Unit let pretty_debug = pretty end) (Hptmap.Comp_unused) (struct let v = List.map (List.map (fun k -> k, ())) Initial_Values.v end) (Datatype_deps) @@ -95,7 +105,7 @@ in let i2 = inter s1 s2 in if not (i1 == i2) then - Kernel.error "%a@./@.%a@.->@.%a@./@.%a" + Cmdline.Kernel_log.error "%a@./@.%a@.->@.%a@./@.%a" pretty_debug s1 pretty_debug s2 pretty_debug i1 pretty_debug i2; i1 @@ -103,6 +113,7 @@ let name = Format.sprintf "Hptset(%s).union" X.name in symmetric_merge ~cache:(name, ()) + ~empty_neutral:true ~decide_none:(fun _k () -> ()) ~decide_some:(fun () () -> ()) @@ -114,7 +125,7 @@ let subset = let name = Format.sprintf "Hptset(%s).subset" X.name in - binary_predicate (PersistentCache name) UniversalPredicate + binary_predicate (Hptmap.PersistentCache name) UniversalPredicate ~decide_fast:decide_fast_inclusion ~decide_fst:(fun _ () -> false) ~decide_snd:(fun _ () -> true) @@ -133,7 +144,9 @@ let intersects = let name = Pretty_utils.sfprintf "Hptset(%s).intersects" X.name in - symmetric_binary_predicate (PersistentCache name) ExistentialPredicate + symmetric_binary_predicate + (Hptmap.PersistentCache name) + ExistentialPredicate ~decide_fast:decide_fast_intersection ~decide_one:(fun _ () -> false) ~decide_both:(fun _ () () -> true) @@ -142,6 +155,11 @@ let from_shape m = from_shape (fun _ _ -> ()) m + (* Partial application is needed becauses of caches *) + let fold2_join_heterogeneous ~cache ~empty_left ~empty_right ~both ~join ~empty = + let both k () v = both k v in + fold2_join_heterogeneous ~cache ~empty_left ~empty_right ~both ~join ~empty + end (* diff -Nru frama-c-20140301+neon+dfsg/src/lib/hptset.mli frama-c-20150201+sodium+dfsg/src/lib/hptset.mli --- frama-c-20140301+neon+dfsg/src/lib/hptset.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/hptset.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -50,6 +50,16 @@ val from_shape: 'a shape -> t (** Build a set from another [elt]-indexed map or set. *) + val fold2_join_heterogeneous: + cache:Hptmap.cache_type -> + empty_left:('a shape -> 'b) -> + empty_right:(t -> 'b) -> + both:(elt -> 'a -> 'b) -> + join:('b -> 'b -> 'b) -> + empty:'b -> + t -> 'a shape -> + 'b + (** Clear all the caches used internally by the functions of this module. Those caches are not project-aware, so this function must be called at least each a project switch occurs. *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/indexer.ml frama-c-20150201+sodium+dfsg/src/lib/indexer.ml --- frama-c-20140301+neon+dfsg/src/lib/indexer.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/indexer.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/indexer.mli frama-c-20150201+sodium+dfsg/src/lib/indexer.mli --- frama-c-20140301+neon+dfsg/src/lib/indexer.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/indexer.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/integer.ml.bigint frama-c-20150201+sodium+dfsg/src/lib/integer.ml.bigint --- frama-c-20140301+neon+dfsg/src/lib/integer.ml.bigint 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/integer.ml.bigint 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -203,11 +203,9 @@ let of_int32 i = big_int_of_string (Int32.to_string i) let max_int64 = of_int64 Int64.max_int let min_int64 = of_int64 Int64.min_int - let bits_of_max_float = of_int64 (Int64.bits_of_float max_float) - let bits_of_most_negative_float = - of_int64 (Int64.bits_of_float (-. max_float)) - let of_string = big_int_of_string + let of_string = big_int_of_string (* may raise Failure "sys_big_int_of_string" + or Failure "invalid digit". Let's leave the exact string unspecified *) let to_string = string_of_big_int let to_float = float_of_big_int diff -Nru frama-c-20140301+neon+dfsg/src/lib/integer.mli frama-c-20150201+sodium+dfsg/src/lib/integer.mli --- frama-c-20140301+neon+dfsg/src/lib/integer.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/integer.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -95,9 +95,12 @@ val two_power_64 : t val max_int64 : t val min_int64 : t -val bits_of_max_float : t -val bits_of_most_negative_float : t val of_string : string -> t +(** @raise Failure _ when the string cannot be parsed. *) +(* Beware that non-decimal integers cannot be parsed when OCaml's Big_int + implementation is used. Zarith handles them, but we cannot assume it + is present. *) + val to_string : t -> string val add_2_64 : t -> t val add_2_32 : t -> t diff -Nru frama-c-20140301+neon+dfsg/src/lib/integer.ml.zarith frama-c-20150201+sodium+dfsg/src/lib/integer.ml.zarith --- frama-c-20140301+neon+dfsg/src/lib/integer.ml.zarith 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/integer.ml.zarith 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -22,30 +22,13 @@ type t = Z.t -include Big_int_Z - let equal = Z.equal let compare = Z.compare -let shift_left_big_int x y = - Z.shift_left x (Z.to_int y) - -let shift_right_big_int x y = - Z.shift_right x (Z.to_int y) let two_power_of_int k = Z.shift_left Z.one k -(* - let h = Hashtbl.create 7 in - fun k -> - try - Hashtbl.find h k - with Not_found -> - let p = power_int_positive_int 2 k in - Hashtbl.add h k p; - p -*) let two_power y = try @@ -53,20 +36,15 @@ two_power_of_int k with Z.Overflow -> assert false -let log_shift_right_big_int x y = (* no meaning for negative value of x *) - if (lt_big_int x zero_big_int) - then raise (Invalid_argument "log_shift_right_big_int") - else shift_right_big_int x y - let popcount = Z.popcount (* To export *) - let small_nums = Array.init 33 (fun i -> big_int_of_int i) + let small_nums = Array.init 33 (fun i -> Z.of_int i) - let zero = zero_big_int - let one = unit_big_int - let minus_one = minus_big_int unit_big_int + let zero = Z.zero + let one = Z.one + let minus_one = Z.minus_one let two = Z.of_int 2 let four = Z.of_int 4 let eight = Z.of_int 8 @@ -78,56 +56,63 @@ let two_power_60 = two_power_of_int 60 let two_power_64 = two_power_of_int 64 - let is_zero v = (sign_big_int v) = 0 + let is_zero v = Z.equal v Z.zero - let rem = mod_big_int - let div = div_big_int - let mul = mult_big_int - let sub = sub_big_int + let add = Z.add + let sub = Z.sub + let succ = Z.succ + let pred = Z.pred + let neg = Z.neg - let abs = abs_big_int - let succ = succ_big_int - let pred = pred_big_int - let neg = minus_big_int + let rem = Z.erem + let div = Z.ediv + let mul = Z.mul - let add = add_big_int + let abs = Z.abs let hash = Z.hash - let shift_right_logical = log_shift_right_big_int - let shift_right = shift_right_big_int - let shift_left = shift_left_big_int + let shift_left x y = Z.shift_left x (Z.to_int y) + let shift_right x y = Z.shift_right x (Z.to_int y) + let shift_right_logical x y = (* no meaning for negative value of x *) + if (Z.lt x Z.zero) + then failwith "log_shift_right_big_int" + else Z.shift_right x (Z.to_int y) let logand = Z.logand let lognot = Z.lognot let logor = Z.logor let logxor = Z.logxor - let le = le_big_int - let lt = lt_big_int - let ge = ge_big_int - let gt = gt_big_int - - let to_int v = - try Z.to_int v - with Z.Overflow -> failwith "to_int" + let le a b = Z.compare a b <= 0 + let ge a b = Z.compare a b >= 0 + let lt a b = Z.compare a b < 0 + let gt a b = Z.compare a b > 0 + let of_int = Z.of_int let of_int64 = Z.of_int64 let of_int32 = Z.of_int32 - let to_int64 = Z.to_int64 + + (* Return the same exceptions as [Big_int] *) + let to_int = Big_int_Z.int_of_big_int + let to_int64 = Big_int_Z.int64_of_big_int + let of_string s = + try Z.of_string s + with Invalid_argument _ -> + (* We intentionally do NOT specify a string in the .mli, as Big_int + raises multiple [Failure _] exceptions *) + failwith "Integer.of_string" + let max_int64 = of_int64 Int64.max_int let min_int64 = of_int64 Int64.min_int - let bits_of_max_float = of_int64 (Int64.bits_of_float max_float) - let bits_of_most_negative_float = - of_int64 (Int64.bits_of_float (-. max_float)) - - let of_string = big_int_of_string - let to_string = string_of_big_int - let to_float = float_of_big_int + + + let to_string = Z.to_string + let to_float = Z.to_float let add_2_64 x = add two_power_64 x let add_2_32 x = add two_power_32 x @@ -135,7 +120,7 @@ let pretty ?(hexa=false) fmt v = let rec aux v = if gt v two_power_60 then - let quo, rem = quomod_big_int v two_power_60 in + let quo, rem = Z.ediv_rem v two_power_60 in aux quo; Format.fprintf fmt "%015LX" (to_int64 rem) else @@ -144,7 +129,7 @@ if hexa then if equal v zero then Format.pp_print_string fmt "0" else if gt v zero then (Format.pp_print_string fmt "0x"; aux v) - else (Format.pp_print_string fmt "-0x"; aux (minus_big_int v)) + else (Format.pp_print_string fmt "-0x"; aux (Z.neg v)) else Format.pp_print_string fmt (to_string v) @@ -199,7 +184,7 @@ let r = if is_zero v then u - else gcd_big_int u v in + else Z.gcd u v in r let ppcm u v = @@ -207,8 +192,8 @@ then zero else native_div (mul u v) (pgcd u v) - let min = min_big_int - let max = max_big_int + let min = Z.min + let max = Z.max let round_down_to_zero v modu = mul (pos_div v modu) modu @@ -226,3 +211,5 @@ let to_num b = Num.num_of_big_int (Big_int.big_int_of_string (Big_int_Z.string_of_big_int b)) + + let power_int_positive_int = Big_int_Z.power_int_positive_int diff -Nru frama-c-20140301+neon+dfsg/src/lib/no_dynlink_opt.ml frama-c-20150201+sodium+dfsg/src/lib/no_dynlink_opt.ml --- frama-c-20140301+neon+dfsg/src/lib/no_dynlink_opt.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/no_dynlink_opt.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/pretty_utils.ml frama-c-20150201+sodium+dfsg/src/lib/pretty_utils.ml --- frama-c-20140301+neon+dfsg/src/lib/pretty_utils.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/pretty_utils.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/pretty_utils.mli frama-c-20150201+sodium+dfsg/src/lib/pretty_utils.mli --- frama-c-20140301+neon+dfsg/src/lib/pretty_utils.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/pretty_utils.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/qstack.ml frama-c-20150201+sodium+dfsg/src/lib/qstack.ml --- frama-c-20140301+neon+dfsg/src/lib/qstack.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/qstack.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/qstack.mli frama-c-20150201+sodium+dfsg/src/lib/qstack.mli --- frama-c-20140301+neon+dfsg/src/lib/qstack.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/qstack.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/vector.ml frama-c-20150201+sodium+dfsg/src/lib/vector.ml --- frama-c-20140301+neon+dfsg/src/lib/vector.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/vector.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/lib/vector.mli frama-c-20150201+sodium+dfsg/src/lib/vector.mli --- frama-c-20140301+neon+dfsg/src/lib/vector.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/lib/vector.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/logic/allocates.ml frama-c-20150201+sodium+dfsg/src/logic/allocates.ml --- frama-c-20140301+neon+dfsg/src/logic/allocates.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/allocates.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/logic/allocates.mli frama-c-20150201+sodium+dfsg/src/logic/allocates.mli --- frama-c-20140301+neon+dfsg/src/logic/allocates.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/allocates.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/logic/annotations.ml frama-c-20150201+sodium+dfsg/src/logic/annotations.ml --- frama-c-20140301+neon+dfsg/src/logic/annotations.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/annotations.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -201,7 +201,8 @@ fresh_bhv.b_assigns <- merge_assigns ~keep_empty:false fresh_bhv.b_assigns bhv.b_assigns; fresh_bhv.b_allocation <- - Logic_utils.merge_allocation fresh_bhv.b_allocation bhv.b_allocation + Logic_utils.merge_allocation fresh_bhv.b_allocation bhv.b_allocation; + fresh_bhv.b_extended <- fresh_bhv.b_extended @ bhv.b_extended let merge_behaviors fresh old = let init_fresh_bhvs = fresh.spec_behavior in @@ -392,22 +393,56 @@ with Not_found -> acc -let iter_all_code_annot f = - Code_annots.iter - (fun stmt tbl -> - Emitter.Usable_emitter.Hashtbl.iter - (fun e l -> List.iter (f stmt (Emitter.Usable_emitter.get e)) !l) - tbl) - -let fold_all_code_annot f = - Code_annots.fold - (fun stmt tbl acc -> - Emitter.Usable_emitter.Hashtbl.fold - (fun e l acc -> - let e = Emitter.Usable_emitter.get e in - List.fold_left (fun acc x -> f stmt e x acc) acc !l) - tbl - acc) +let iter_all_code_annot ?(sorted=true) f = + let cmp s1 s2 = + let res = + Cil_datatype.Location.compare + (Cil_datatype.Stmt.loc s1) (Cil_datatype.Stmt.loc s2) + in + if res <> 0 then res else Cil_datatype.Stmt.compare s1 s2 + in + let f_inner stmt tbl = + let cmp = Emitter.Usable_emitter.compare in + let iter = + if sorted then + Emitter.Usable_emitter.Hashtbl.iter_sorted ~cmp + else + Emitter.Usable_emitter.Hashtbl.iter + in + iter + (fun e l -> List.iter (f stmt (Emitter.Usable_emitter.get e)) !l) + tbl + in + let iter = if sorted then Code_annots.iter_sorted ~cmp else Code_annots.iter + in + iter f_inner + +let fold_all_code_annot ?(sorted=true) f = + let cmp s1 s2 = + let res = + Cil_datatype.Location.compare + (Cil_datatype.Stmt.loc s1) (Cil_datatype.Stmt.loc s2) + in + if res <> 0 then res else Cil_datatype.Stmt.compare s1 s2 + in + let f_inner stmt tbl acc = + let cmp = Emitter.Usable_emitter.compare in + let iter = + if sorted then + Emitter.Usable_emitter.Hashtbl.fold_sorted ~cmp + else + Emitter.Usable_emitter.Hashtbl.fold + in + iter + (fun e l acc -> + let e = Emitter.Usable_emitter.get e in + List.fold_left (fun acc x -> f stmt e x acc) acc !l) + tbl + acc + in + let fold = if sorted then Code_annots.fold_sorted ~cmp else Code_annots.fold + in + fold f_inner let iter_global f = Globals.iter @@ -466,6 +501,7 @@ let iter_ensures f = iter_bhv_gen (fun b -> b.b_post_cond) List.iter f let iter_assigns f = iter_bhv_gen (fun b -> b.b_assigns) (fun f a -> f a) f let iter_allocates f = iter_bhv_gen (fun b -> b.b_allocation) (fun f a -> f a) f +let iter_extended f = iter_bhv_gen (fun b -> b.b_extended) List.iter f let fold_spec_gen get fold f kf acc = try @@ -533,6 +569,10 @@ let fold_allocates f = fold_bhv_gen (fun b -> b.b_allocation) (fun f a acc -> f a acc) f +let fold_extended f = + fold_bhv_gen (fun b -> b.b_extended) + (fun f l acc -> List.fold_left (Extlib.swap f) acc l) f + (**************************************************************************) (** {2 Adding annotations} *) (**************************************************************************) @@ -567,9 +607,9 @@ in let ca = convert ca in let e = Emitter.get e in - let kf = match kf with + let kf = match kf with | None -> Kernel_function.find_englobing_kf stmt - | Some kf -> kf + | Some kf -> kf in let ppts = Property.ip_of_code_annot kf stmt ca in List.iter Property_status.register ppts; @@ -941,6 +981,11 @@ Property_status.register (Property.ip_of_allocation kf Kglobal (Property.Id_behavior bhv) a) +let add_extended e kf bhv_name ext = + ignore + (extend_behavior e kf bhv_name + (fun b -> b.b_extended <- ext :: b.b_extended)) + (**************************************************************************) (** {2 Removing annotations} *) (**************************************************************************) @@ -1142,6 +1187,16 @@ in remove_in_funspec e kf set_spec +let remove_extended e kf ext = + let set_spec spec _tbl = + List.iter + (fun b -> + b.b_extended <- Extlib.filter_out ((==) ext) b.b_extended) + spec.spec_behavior + in + remove_in_funspec e kf set_spec + + let remove_assigns e kf p = let set_spec spec _tbl = List.iter diff -Nru frama-c-20140301+neon+dfsg/src/logic/annotations.mli frama-c-20150201+sodium+dfsg/src/logic/annotations.mli --- frama-c-20140301+neon+dfsg/src/logic/annotations.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/annotations.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -123,12 +123,22 @@ (** Fold on each code annotation attached to the given statement. *) val iter_all_code_annot: + ?sorted:bool -> (stmt -> Emitter.t -> code_annotation -> unit) -> unit -(** Iter on each code annotation of the program. *) +(** Iter on each code annotation of the program. + If [sorted] is [true] (the default), iteration is sorted according + to the location of the statements and by emitter. Note that the + sorted version is less efficient than the unsorted iteration. + @modify Sodium-20150201: iteration is sorted + *) val fold_all_code_annot: + ?sorted:bool -> (stmt -> Emitter.t -> code_annotation -> 'a -> 'a) -> 'a -> 'a -(** Fold on each code annotation of the program. *) +(** Fold on each code annotation of the program. See above for + the meaning of the [sorted] argument. + @modify Sodium-20150201 sorted fold + *) val iter_global: (Emitter.t -> global_annotation -> unit) -> unit @@ -193,6 +203,15 @@ kernel_function -> string -> 'a -> 'a (** Fold on the allocates of the corresponding behavior. *) +val iter_extended: + (Emitter.t -> (string * int * identified_predicate list) -> unit) -> + kernel_function -> string -> unit + (** @since Sodium-20150201 *) + +val fold_extended: + (Emitter.t -> (string * int * identified_predicate list) -> 'a -> 'a) -> + kernel_function -> string -> 'a -> 'a + val iter_behaviors: (Emitter.t -> (identified_predicate, identified_term) behavior -> unit) -> kernel_function -> unit @@ -324,6 +343,11 @@ (** Add new allocates into the given behavior (provided by its name) of the given function. *) +val add_extended: + Emitter.t -> kernel_function -> string -> + (string * int * identified_predicate list) -> unit + (** @since Sodium-20150201 *) + (**************************************************************************) (** {2 Removing annotations} *) (**************************************************************************) @@ -411,6 +435,11 @@ (** Remove the corresponding assigns clause. Do nothing if the clause does not exist or was not emitted by the given emitter. *) +val remove_extended: + Emitter.t -> kernel_function -> + (string * int * identified_predicate list) -> unit + (** @since Sodium-20150201 *) + (**************************************************************************) (** {2 Other useful functions} *) (**************************************************************************) diff -Nru frama-c-20140301+neon+dfsg/src/logic/description.ml frama-c-20150201+sodium+dfsg/src/logic/description.ml --- frama-c-20140301+neon+dfsg/src/logic/description.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/description.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -140,7 +140,8 @@ | Loop(_,_,loc,_,_) -> Format.fprintf fmt "loop%a" (pp_kloc kloc) loc | Block _ -> Format.fprintf fmt "block%a" pp_labels stmt | UnspecifiedSequence _ -> Format.fprintf fmt "instruction%a" pp_labels stmt - | TryFinally(_,_,loc) | TryExcept(_,_,_,loc) -> + | Throw(_,loc) -> Format.fprintf fmt "throw%a" (pp_kloc kloc) loc + | TryFinally(_,_,loc) | TryExcept(_,_,_,loc) | TryCatch(_,_,loc)-> Format.fprintf fmt "try-catch%a" (pp_kloc kloc) loc let pp_kinstr kloc fmt = function @@ -176,9 +177,11 @@ if not (Kernel_function.equal kf0 kf) then Format.fprintf fmt " of '%s'" (Kernel_function.get_name kf) -let pp_prop kfopt kiopt kloc fmt = function +let rec pp_prop kfopt kiopt kloc fmt = function | IPAxiom (s,_,_,_,_) -> Format.fprintf fmt "Axiom '%s'" s | IPLemma (s,_,_,_,_) -> Format.fprintf fmt "Lemma '%s'" s + | IPTypeInvariant (s,_,_,_) -> Format.fprintf fmt "Type invariant '%s'" s + | IPGlobalInvariant (s,_,_) -> Format.fprintf fmt "Global invariant '%s'" s | IPAxiomatic (s,_) -> Format.fprintf fmt "Axiomatic '%s'" s | IPOther(s,kf,ki) -> Format.fprintf fmt "%s%a%a" s (pp_context kfopt) kf (pp_opt kiopt (pp_kinstr kloc)) ki @@ -276,6 +279,13 @@ | IPReachable (Some kf, Kglobal, _) -> (* print "Unreachable": it seems that it is what the user want to see *) Format.fprintf fmt "Unreachable %a" Kernel_function.pretty kf + | IPPropertyInstance (kfo, ki, ip) -> + Format.fprintf fmt "Instance of '%a'%a%a@." + (pp_prop kfopt kiopt kloc) ip + (pp_context kfopt) kfo + (pp_opt kiopt (pp_kinstr kloc)) ki + + type kf = [ `Always | `Never | `Context of kernel_function ] @@ -346,7 +356,7 @@ | Id_behavior b -> [B b] | Id_code_annot _ -> [] -let ip_order = function +let rec ip_order = function | IPAxiomatic(a,_) -> [I 0;S a] | IPAxiom(a,_,_,_,_) | IPLemma(a,_,_,_,_) -> [I 1;S a] | IPOther(s,None,ki) -> [I 3;K ki;S s] @@ -363,6 +373,10 @@ | IPDecrease(kf,ki,Some a,_) -> [I 14;F kf;K ki] @ annot_order a | IPReachable(None,_,_) -> [I 15] | IPReachable(Some kf,ki,_) -> [I 16;F kf;K ki] + | IPPropertyInstance (None,ki,ip) -> [I 17; K ki] @ ip_order ip + | IPPropertyInstance (Some kf,ki,ip) -> [I 17; F kf; K ki] @ ip_order ip + | IPTypeInvariant(a,_,_,_) -> [I 18; S a] + | IPGlobalInvariant(a,_,_) -> [I 19; S a] let pp_compare p q = cmp (ip_order p) (ip_order q) diff -Nru frama-c-20140301+neon+dfsg/src/logic/description.mli frama-c-20150201+sodium+dfsg/src/logic/description.mli --- frama-c-20140301+neon+dfsg/src/logic/description.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/description.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/logic/infer_annotations.ml frama-c-20150201+sodium+dfsg/src/logic/infer_annotations.ml --- frama-c-20140301+neon+dfsg/src/logic/infer_annotations.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/infer_annotations.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -54,7 +54,7 @@ let t = tvar (cvar_to_lvar vi) in let typ = vi.vtype in if Cil.isVoidPtrType typ then - let const = hasAttribute "const" (typeAttrs (Cil.typeOf_pointed typ)) in + let const = typeHasAttribute "const" (Cil.typeOf_pointed typ) in let typ' = if const then Cil.charConstPtrType else Cil.charPtrType in (Logic_utils.mk_cast ~loc typ' t, typ') else (t, typ) @@ -81,9 +81,7 @@ let range = match size with | None -> make_range None | Some size -> - match (Cil.constFold true size).enode with - | Const(CInt64(length,_,_)) -> make_range (Some length) - | _ -> make_range None + make_range (Cil.constFoldToInt size) in let offs, typ = mk_offset true typ_elem in TIndex (range, offs), typ @@ -119,7 +117,7 @@ (List.filter (fun (_t, typ) -> let pointed_type = typeOf_pointed typ in - not (hasAttribute "const" (typeAttrs pointed_type)) + not (typeHasAttribute "const" pointed_type) ) pointer_args) in diff -Nru frama-c-20140301+neon+dfsg/src/logic/infer_annotations.mli frama-c-20150201+sodium+dfsg/src/logic/infer_annotations.mli --- frama-c-20140301+neon+dfsg/src/logic/infer_annotations.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/infer_annotations.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/logic/logic_interp.ml frama-c-20150201+sodium+dfsg/src/logic/logic_interp.ml --- frama-c-20140301+neon+dfsg/src/logic/logic_interp.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/logic_interp.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -34,10 +34,7 @@ try Globals.Vars.find_from_astinfo x (VFormal kf) with Not_found -> - try - Globals.Vars.find_from_astinfo x VGlobal - with Not_found -> - raise (Unbound ("Unbound variable " ^ x)) + Globals.Vars.find_from_astinfo x VGlobal in cvar_to_lvar vi @@ -60,19 +57,24 @@ let find_macro _ = raise Not_found - let find_var x = - try find_var X.kf x - with Unbound s -> raise (Error (Stmt.loc X.stmt, s)) - - let find_enum_tag _ = assert false (*TODO*) + let find_var x = find_var X.kf x - let find_comp_type ~kind:_ _s = assert false (*TODO*) + let find_enum_tag x = + try + Globals.Types.find_enum_tag x + with Not_found -> + (* The ACSL typer tries to parse a string, first as a variable, + then as an enum. We report the "Unbound variable" message + here, as it is nicer for the user. However, this short-circuits + the later stages of resolution, for example global logic + variables. *) + raise (Unbound ("Unbound variable " ^ x)) let find_comp_field info s = let field = Cil.getCompField info s in Field(field,NoOffset) - let find_type _s = assert false (*TODO*) + let find_type = Globals.Types.find_type let find_label s = Kernel_function.find_label X.kf s include Logic_env @@ -250,8 +252,9 @@ Logic_utils.is_same_type (Logic_typing.type_of_set_elem set) t.term_type -> loc_to_exp ~result t + | Tnull -> [ Cil.mkCast (Cil.zero ~loc) (TPtr(TVoid [], [])) ] - (* additional constructs *) + (* additional constructs *) | Tapp _ | Tlambda _ | Trange _ | Tlet _ | TDataCons _ | Tif _ @@ -259,7 +262,6 @@ | Tbase_addr _ | Toffset _ | Tblock_length _ - | Tnull | TCoerce _ | TCoerceE _ | TUpdate _ | Ttypeof _ | Ttype _ | TLogic_coerce _ -> error_lval () @@ -701,7 +703,9 @@ | Pseparated _ (* need only to preserve the values of each pointer *) -> DoChildren - | Pinitialized (lbl, t) -> + | Pinitialized (lbl, t) | Pdangling (lbl, t) -> + (* Dependencies of [\initialized(p)] or [\dangling(p)] are the + dependencies of [*p]. *) if is_same_label current_label lbl then ( let typ = Logic_typing.type_of_pointed t.term_type in let tlv = Cil.mkTermMem t TNoOffset in @@ -817,8 +821,6 @@ (** Used by annotations entry points. *) let get_zone_from_annot a (ki,kf) loop_body_opt = - assert (!pragmas = empty_pragmas); - (* check before modification. Anne.*) let get_zone_from_term k x = (try ignore diff -Nru frama-c-20140301+neon+dfsg/src/logic/logic_interp.mli frama-c-20150201+sodium+dfsg/src/logic/logic_interp.mli --- frama-c-20140301+neon+dfsg/src/logic/logic_interp.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/logic_interp.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/logic/property.ml frama-c-20150201+sodium+dfsg/src/logic/property.ml --- frama-c-20140301+neon+dfsg/src/logic/property.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/property.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -80,13 +80,20 @@ type identified_reachable = kernel_function option * kinstr * program_point +type identified_type_invariant = string * typ * predicate named * location + +type identified_global_invariant = string * predicate named * location + and identified_axiomatic = string * identified_property list and identified_lemma = string * logic_label list * string list * predicate named * location and identified_axiom = identified_lemma - + +and identified_instance = + kernel_function option * kinstr * identified_property + and identified_property = | IPPredicate of identified_predicate | IPAxiom of identified_axiom @@ -101,6 +108,9 @@ | IPFrom of identified_from | IPDecrease of identified_decrease | IPReachable of identified_reachable + | IPPropertyInstance of identified_instance + | IPTypeInvariant of identified_type_invariant + | IPGlobalInvariant of identified_global_invariant | IPOther of string * kernel_function option * kinstr let get_kinstr = function @@ -112,12 +122,14 @@ | IPAssigns (_,ki,_,_) | IPFrom(_,ki,_,_) | IPReachable (_, ki, _) - | IPDecrease (_,ki,_,_) -> ki + | IPDecrease (_,ki,_,_) + | IPPropertyInstance (_, ki, _) -> ki | IPAxiom _ | IPAxiomatic _ | IPLemma _ -> Kglobal | IPOther(_,_,ki) -> ki | IPCodeAnnot (_,s,_) -> Kstmt s + | IPTypeInvariant _ | IPGlobalInvariant _ -> Kglobal let get_kf = function | IPPredicate (_,kf,_,_) @@ -132,8 +144,10 @@ | IPAxiom _ | IPAxiomatic _ | IPLemma _ -> None - | IPReachable (kf, _, _) - | IPOther(_,kf,_) -> kf + | IPReachable (kfopt, _, _) + | IPPropertyInstance (kfopt, _, _) + | IPOther(_,kfopt,_) -> kfopt + | IPTypeInvariant _ | IPGlobalInvariant _ -> None let loc_of_kf_ki kf = function | Kstmt s -> Cil_datatype.Stmt.loc s @@ -143,8 +157,14 @@ | IPPredicate (_,_,_,ip) -> ip.ip_loc | IPBehavior(kf,ki, _) | IPComplete (kf,ki,_) + | IPReachable(Some kf, ki, _) -> loc_of_kf_ki kf ki + | IPPropertyInstance (Some kf, ki, _) | IPDisjoint(kf,ki,_) -> loc_of_kf_ki kf ki + | IPPropertyInstance (None, Kstmt s, _) + | IPReachable(None, Kstmt s, _) | IPCodeAnnot (_,s,_) -> Cil_datatype.Stmt.loc s + | IPPropertyInstance (None, Kglobal, _) + | IPReachable(None, Kglobal, _) -> Cil_datatype.Location.unknown | IPAssigns(kf,ki,_,a) -> (match a with | [] -> loc_of_kf_ki kf ki @@ -156,8 +176,6 @@ | _,(t :: _) -> t.it_content.term_loc) | IPFrom(_,_,_,(t,_)) -> t.it_content.term_loc | IPDecrease (_,_,_,(t,_)) -> t.term_loc - | IPReachable(None, _, _) -> Cil_datatype.Location.unknown - | IPReachable(Some kf, ki, _) -> loc_of_kf_ki kf ki | IPAxiom (_,_,_,_,loc) -> loc | IPAxiomatic (_,l) -> (match l with @@ -168,6 +186,22 @@ (match kf with | None -> Cil_datatype.Location.unknown | Some kf -> loc_of_kf_ki kf ki) + | IPTypeInvariant(_,_,_,loc) | IPGlobalInvariant(_,_,loc) -> loc + +(* Pretty information about the localization of a IPPropertyInstance *) +let pretty_instance_location fmt (kfopt, ki) = + match kfopt, ki with + | None, Kglobal -> Format.pp_print_string fmt "at global scope" + | Some kf, Kglobal -> + Format.fprintf fmt "in function %a" Kernel_function.pretty kf + | None, Kstmt stmt -> Format.fprintf fmt "at stmt %d" stmt.sid + | Some kf, Kstmt stmt + when Kernel_function.(equal kf (find_englobing_kf stmt)) -> + Format.fprintf fmt "at stmt %d" stmt.sid + | Some kf, Kstmt stmt -> + Format.fprintf fmt "at stmt %d and function %a" + stmt.sid Kernel_function.pretty kf + let get_pk_behavior = function | PKRequires b | PKAssumes b | PKEnsures (b,_) -> Some b @@ -190,6 +224,9 @@ | IPDisjoint(_,_,_) | IPDecrease _ | IPReachable _ + | IPPropertyInstance _ + | IPTypeInvariant _ + | IPGlobalInvariant _ | IPOther _ -> None include Datatype.Make_with_collections @@ -215,13 +252,17 @@ | Some _,None -> 1 | Some x,Some y -> cmp x y - let pretty fmt = function + let rec pretty fmt = function | IPPredicate (kind,_,_,p) -> Format.fprintf fmt "%a@ %a" pretty_predicate_kind kind Cil_printer.pp_identified_predicate p | IPAxiom (s,_,_,_,_) -> Format.fprintf fmt "axiom@ %s" s | IPAxiomatic(s, _) -> Format.fprintf fmt "axiomatic@ %s" s | IPLemma (s,_,_,_,_) -> Format.fprintf fmt "lemma@ %s" s + | IPTypeInvariant(s,ty,_,_) -> + Format.fprintf fmt "invariant@ %s for type %a" s Cil_printer.pp_typ ty + | IPGlobalInvariant(s,_,_) -> + Format.fprintf fmt "global invariant@ %s" s | IPBehavior(_kf, ki, b) -> if Cil.is_default_behavior b then Format.pp_print_string fmt "default behavior" @@ -257,9 +298,16 @@ (match ba with Before -> "of" | After -> "post") Cil_datatype.Location.pretty_line (Cil_datatype.Stmt.loc stmt) Kf.pretty kf + | IPPropertyInstance (kfopt, ki, ip) -> + Format.fprintf fmt "status of '%a'%t %a" + pretty ip + (fun fmt -> match get_kf ip with + | Some kf -> Format.fprintf fmt " of %a" Kernel_function.pretty kf + | None -> ()) + pretty_instance_location (kfopt, ki) | IPOther(s,_,_) -> Format.pp_print_string fmt s - let hash = + let rec hash = let hash_bhv_loop = function | Id_behavior b -> (0, Hashtbl.hash b.b_name) | Id_code_annot ca -> (1, ca.annot_id) @@ -291,9 +339,14 @@ Kinstr.hash ki, Hashtbl.hash ba) | IPAllocation(f, ki, b, _fa) -> Hashtbl.hash (13, Kf.hash f, Kinstr.hash ki, hash_bhv_loop b) - | IPOther(s,_,_) -> Hashtbl.hash (14, (s:string)) + | IPPropertyInstance (kf_caller, ki, ip) -> + Hashtbl.hash (14, Extlib.opt_hash Kf.hash kf_caller, + Kinstr.hash ki, hash ip) + | IPOther(s,_,_) -> Hashtbl.hash (15, (s:string)) + | IPTypeInvariant(s,_,_,_) -> Hashtbl.hash (16, (s:string)) + | IPGlobalInvariant(s,_,_) -> Hashtbl.hash (17, (s:string)) - let equal p1 p2 = + let rec equal p1 p2 = let eq_bhv (f1,ki1,b1) (f2,ki2,b2) = Kf.equal f1 f2 && Kinstr.equal ki1 ki2 && @@ -308,6 +361,8 @@ | IPPredicate (_,_,_,s1), IPPredicate (_,_,_,s2) -> s1.ip_id = s2.ip_id | IPAxiom (s1,_,_,_,_), IPAxiom (s2,_,_,_,_) | IPAxiomatic(s1, _), IPAxiomatic(s2, _) + | IPTypeInvariant(s1,_,_,_), IPTypeInvariant(s2,_,_,_) + | IPGlobalInvariant(s1,_,_), IPGlobalInvariant(s2,_,_) | IPLemma (s1,_,_,_,_), IPLemma (s2,_,_,_,_) -> Datatype.String.equal s1 s2 | IPCodeAnnot(_,_,ca1), IPCodeAnnot(_,_,ca2) -> @@ -333,12 +388,17 @@ Datatype.String.equal s1 s2 && Kinstr.equal ki1 ki2 && equal_opt Kf.equal kf1 kf2 + | IPPropertyInstance (kf1, ki1, ip1), + IPPropertyInstance (kf2, ki2, ip2) -> + Extlib.opt_equal Kernel_function.equal kf1 kf2 && + Kinstr.equal ki1 ki2 && equal ip1 ip2 | (IPPredicate _ | IPAxiom _ | IPAxiomatic _ | IPLemma _ | IPCodeAnnot _ | IPComplete _ | IPDisjoint _ | IPAssigns _ | IPFrom _ | IPDecrease _ | IPBehavior _ | IPReachable _ - | IPAllocation _ | IPOther _ ), _ -> false + | IPAllocation _ | IPOther _ | IPPropertyInstance _ + | IPTypeInvariant _ | IPGlobalInvariant _), _ -> false - let compare x y = + let rec compare x y = let cmp_bhv (f1,ki1,b1) (f2,ki2,b2) = let n = Kf.compare f1 f2 in if n = 0 then @@ -385,6 +445,7 @@ n | IPAxiom (s1,_,_,_,_), IPAxiom (s2,_,_,_,_) | IPAxiomatic(s1, _), IPAxiomatic(s2, _) + | IPTypeInvariant(s1,_,_,_), IPTypeInvariant(s2,_,_,_) | IPLemma (s1,_,_,_,_), IPLemma (s2,_,_,_,_) -> Datatype.String.compare s1 s2 | IPOther(s1,kf1,ki1), IPOther(s2,kf2,ki2) -> @@ -395,10 +456,17 @@ Kinstr.compare ki1 ki2 | IPAllocation (f1, ki1, b1, _), IPAllocation (f2, ki2, b2, _) -> cmp_bhv (f1,ki1,b1) (f2,ki2,b2) + | IPPropertyInstance (kf1, ki1, ip1), + IPPropertyInstance (kf2, ki2, ip2) -> + let c = Extlib.opt_compare Kernel_function.compare kf1 kf2 in + if c <> 0 then c else + let c = Kinstr.compare ki1 ki2 in + if c <> 0 then c else compare ip1 ip2 | (IPPredicate _ | IPCodeAnnot _ | IPBehavior _ | IPComplete _ | IPDisjoint _ | IPAssigns _ | IPFrom _ | IPDecrease _ | IPReachable _ | IPAxiom _ | IPAxiomatic _ | IPLemma _ | - IPOther _ | IPAllocation _) as x, y -> + IPOther _ | IPAllocation _ | IPPropertyInstance _ | + IPTypeInvariant _ | IPGlobalInvariant _) as x, y -> let nb = function | IPPredicate _ -> 1 | IPAssigns (_, _, _, _) -> 2 @@ -414,18 +482,21 @@ | IPReachable _ -> 12 | IPAllocation _ -> 13 | IPOther _ -> 14 + | IPPropertyInstance _ -> 15 + | IPTypeInvariant _ -> 16 + | IPGlobalInvariant _ -> 17 in Datatype.Int.compare (nb x) (nb y) end) -let short_pretty fmt p = -match p with +let rec short_pretty fmt p = match p with | IPPredicate (_,_,_,{ ip_name = name :: _ }) -> Format.pp_print_string fmt name | IPPredicate _ -> pretty fmt p - | IPAxiom (name,_,_,_,_) | IPLemma(name,_,_,_,_) -> - Format.pp_print_string fmt name + | IPAxiom (name,_,_,_,_) | IPLemma(name,_,_,_,_) + | IPTypeInvariant(name,_,_,_) -> Format.pp_print_string fmt name + | IPGlobalInvariant(name,_,_) -> Format.pp_print_string fmt name | IPAxiomatic (name,_) -> Format.pp_print_string fmt name | IPBehavior(kf,_,{b_name = name }) -> Format.fprintf fmt "behavior %s in function %a" @@ -449,10 +520,13 @@ Kernel_function.pretty kf | IPFrom (kf,_,_,(t,_)) -> Format.fprintf fmt "from clause of term %a in function %a" - Cil_datatype.Identified_term.pretty t Kernel_function.pretty kf + Cil_printer.pp_identified_term t Kernel_function.pretty kf | IPDecrease(kf,_,_,_) -> Format.fprintf fmt "decrease clause in function %a" Kernel_function.pretty kf + | IPPropertyInstance (kfopt, ki, ip) -> + Format.fprintf fmt "specialization of %a %a" short_pretty ip + pretty_instance_location (kfopt, ki) | IPReachable _ | IPOther _ -> pretty fmt p module Names = struct @@ -524,7 +598,7 @@ in (ki_prefix ki) ^ name - let id_prop_txt p = match p with + let rec id_prop_txt p = match p with | IPPredicate (pk,kf,ki,idp) -> Pretty_utils.sfprintf "%s%s%a" (kf_prefix kf) (predicate_kind_txt pk ki) pp_names idp.ip_name @@ -547,6 +621,10 @@ | IPAxiomatic(name, _) -> "axiomatic_" ^ name | IPLemma (name,_,_,named_pred,_) -> Pretty_utils.sfprintf "lemma_%s%a" name pp_names named_pred.name + | IPTypeInvariant (name,_,named_pred,_) -> + Pretty_utils.sfprintf "type_invariant_%s%a" name pp_names named_pred.name + | IPGlobalInvariant (name,named_pred,_) -> + Pretty_utils.sfprintf "global_invariant_%s%a"name pp_names named_pred.name | IPAllocation (kf, ki, (Id_behavior b), _) -> (kf_prefix kf) ^ (ki_prefix ki) ^ (behavior_prefix b) ^ "alloc" | IPAllocation (kf, Kstmt _s, (Id_code_annot ca), _) -> Pretty_utils.sfprintf "%sloop_alloc%a" (kf_prefix kf) pp_code_annot_names ca | IPAllocation _ -> assert false @@ -557,6 +635,14 @@ "from_id_"^(string_of_int (out.it_id)) | IPReachable _ -> "reachable_stmt" | IPBehavior(_, _, b) -> b.b_name + | IPPropertyInstance (kfopt, ki, ip) -> + Pretty_utils.sfprintf "specialization_%s_at_%t" (id_prop_txt ip) + (fun fmt -> match kfopt, ki with + | None, Kglobal -> Format.pp_print_string fmt "global" + | Some kf, Kglobal -> Kernel_function.pretty fmt kf + | None, Kstmt s -> Format.fprintf fmt "stmt_%d" s.sid + | Some kf, Kstmt s -> + Format.fprintf fmt "%a_stmt_%d" Kernel_function.pretty kf s.sid) | IPOther(s,Some kf,ki) -> (kf_prefix kf) ^ (ki_prefix ki) ^ s | IPOther(s,None,ki) -> (ki_prefix ki) ^ s @@ -629,9 +715,10 @@ let ki = get_kinstr p in let ba = match p with | IPPredicate((PKRequires _ | PKAssumes _ | PKTerminates), _, _, _) - | IPAxiom _ | IPAxiomatic _ | IPLemma _ | IPComplete _ + | IPAxiom _ | IPAxiomatic _ | IPLemma _ | IPComplete _ | IPDisjoint _ | IPCodeAnnot _ | IPAllocation _ - | IPDecrease _ | IPOther _ + | IPDecrease _ | IPPropertyInstance _ | IPOther _ + | IPTypeInvariant _ | IPGlobalInvariant _ -> Before | IPPredicate(PKEnsures _, _, _, _) | IPAssigns _ | IPFrom _ | IPBehavior _ @@ -752,6 +839,10 @@ let ip_axiom s = IPAxiom s let ip_lemma s = IPLemma s +let ip_type_invariant s = IPTypeInvariant s +let ip_global_invariant s = IPGlobalInvariant s + +let ip_property_instance kfopt ki ip = IPPropertyInstance (kfopt, ki, ip) let ip_of_code_annot kf ki ca = let st = Kstmt ki in @@ -799,16 +890,26 @@ IPAxiomatic(name, ppts) :: (ppts @ acc) | Dlemma(name, true, a, b, c, d) -> ip_axiom (name,a,b,c,d) :: acc | Dlemma(name, false, a, b, c, d) -> ip_lemma (name,a,b,c,d) :: acc - | Dinvariant(l, _) -> - (* TODO *) - Kernel.warning ~once "ignoring status of global invariant `%s'" - l.l_var_info.lv_name; - acc - | Dtype_annot(l, _) -> - (* TODO *) - Kernel.warning ~once "ignoring status of type invariant `%s'" - l.l_var_info.lv_name; - acc + | Dinvariant(l, loc) -> + let pred = match l.l_body with + | LBpred p -> p + | _ -> assert false + in + IPGlobalInvariant(l.l_var_info.lv_name,pred,loc) :: acc + | Dtype_annot(l, loc) -> + let parameter = match l.l_profile with + | h :: [] -> h + | _ -> assert false + in + let ty = match parameter.lv_type with + | Ctype x -> x + | _ -> assert false + in + let pred = match l.l_body with + | LBpred p -> p + | _ -> assert false + in + IPTypeInvariant(l.l_var_info.lv_name,ty,pred,loc) :: acc | Dcustom_annot(_c, _n, _) -> (* TODO *) Kernel.warning ~once "ignoring status of custom annotation"; diff -Nru frama-c-20140301+neon+dfsg/src/logic/property.mli frama-c-20150201+sodium+dfsg/src/logic/property.mli --- frama-c-20140301+neon+dfsg/src/logic/property.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/property.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -96,6 +96,13 @@ and identified_axiom = identified_lemma +(** Specialization of a property at a given point. *) +and identified_instance = kernel_function option * kinstr * identified_property + +and identified_type_invariant = string * typ * predicate named * location + +and identified_global_invariant = string * predicate named * location + and identified_property = private | IPPredicate of identified_predicate | IPAxiom of identified_axiom @@ -110,6 +117,9 @@ | IPFrom of identified_from | IPDecrease of identified_decrease | IPReachable of identified_reachable + | IPPropertyInstance of identified_instance + | IPTypeInvariant of identified_type_invariant + | IPGlobalInvariant of identified_global_invariant | IPOther of string * kernel_function option * kinstr include Datatype.S_with_collections with type t = identified_property @@ -119,7 +129,7 @@ corresponding identified predicate when available) reverting back to the full ACSL formula if it can't find one. The name is not meant to uniquely identify the property. - @since Neon-20130301 + @since Neon-20140301 *) (** @since Oxygen-20120901 *) @@ -280,6 +290,11 @@ val ip_of_spec: kernel_function -> kinstr -> funspec -> identified_property list +(** Build a specialization of the given property at the given function and + stmt *) +val ip_property_instance: + kernel_function option -> kinstr -> identified_property -> identified_property + (** Builds an IPAxiom. @since Carbon-20110201 @modify Oxygen-20120901 takes an identified_axiom instead of a string @@ -292,6 +307,12 @@ *) val ip_lemma: identified_lemma -> identified_property +(** Build an IPTypeInvariant. *) +val ip_type_invariant: identified_type_invariant -> identified_property + +(** Build an IPGlobalInvariant. *) +val ip_global_invariant: identified_global_invariant -> identified_property + (** Builds all IP related to a given code annotation. @since Carbon-20110201 *) val ip_of_code_annot: diff -Nru frama-c-20140301+neon+dfsg/src/logic/property_status.ml frama-c-20150201+sodium+dfsg/src/logic/property_status.ml --- frama-c-20140301+neon+dfsg/src/logic/property_status.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/property_status.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -324,13 +324,15 @@ Kernel.fatal "reachability of a stmt without function" | Property.IPReachable(Some kf, Cil_types.Kglobal, Property.Before) -> let f = kf.Cil_types.fundec in - if Ast_info.Function.get_name f = Kernel.MainFunction.get () + if Ast_info.Function.get_name f = Kernel.MainFunction.get_plain_string () (* main is always reachable *) then emit_valid ppt | Property.IPOther _ | Property.IPReachable _ | Property.IPPredicate _ | Property.IPCodeAnnot _ | Property.IPComplete _ | Property.IPDisjoint _ | Property.IPAssigns _ | Property.IPFrom _ - | Property.IPAllocation _ | Property.IPDecrease _ | Property.IPLemma _ -> + | Property.IPAllocation _ | Property.IPDecrease _ | Property.IPLemma _ + | Property.IPPropertyInstance _ + | Property.IPTypeInvariant _ | Property.IPGlobalInvariant _ -> () (* the functions above and below MUST be synchronized *) @@ -345,13 +347,15 @@ Kernel.fatal "reachability of a stmt without function" | Property.IPReachable(Some kf, Cil_types.Kglobal, Property.Before) -> let f = kf.Cil_types.fundec in (* main is always reachable *) - Ast_info.Function.get_name f = Kernel.MainFunction.get () + Ast_info.Function.get_name f = Kernel.MainFunction.get_plain_string () | Property.IPAxiom _ | Property.IPAxiomatic _ | Property.IPOther _ | Property.IPReachable _ | Property.IPPredicate _ | Property.IPCodeAnnot _ | Property.IPComplete _ | Property.IPDisjoint _ | Property.IPAssigns _ | Property.IPFrom _ - | Property.IPAllocation _ | Property.IPDecrease _ | Property.IPLemma _ -> + | Property.IPAllocation _ | Property.IPDecrease _ | Property.IPLemma _ + | Property.IPPropertyInstance _ + | Property.IPTypeInvariant _ | Property.IPGlobalInvariant _ -> false and unsafe_emit_and_get e ~hyps ~auto ppt ?(distinct=false) s = @@ -434,13 +438,15 @@ conjunctions ones (but conjunctions are automatically computed and so already registered) *) match ppt with - | Property.IPOther _ | Property.IPReachable _ -> + | Property.IPOther _ | Property.IPReachable _ + | Property.IPPropertyInstance _ -> register ppt; unsafe_emit_and_get e ~hyps ~auto ppt ~distinct s | Property.IPPredicate _ | Property.IPCodeAnnot _ | Property.IPComplete _ | Property.IPDisjoint _ | Property.IPAssigns _ | Property.IPFrom _ | Property.IPAllocation _ | Property.IPDecrease _ | Property.IPBehavior _ - | Property.IPAxiom _ | Property.IPAxiomatic _ | Property.IPLemma _ -> + | Property.IPAxiom _ | Property.IPAxiomatic _ | Property.IPLemma _ + | Property.IPTypeInvariant _ | Property.IPGlobalInvariant _ -> Kernel.fatal "unregistered property %a" Property.pretty ppt and logical_consequence e ppt hyps = @@ -454,7 +460,7 @@ register_as_kernel_logical_consequence let emit_and_get e ~hyps ppt ?distinct s = - (match ppt with + begin match ppt with | Property.IPBehavior _ | Property.IPAxiom _ | Property.IPAxiomatic _ | Property.IPPredicate (Property.PKAssumes _, _, _, _) -> Kernel.fatal @@ -464,7 +470,10 @@ | Property.IPPredicate _ | Property.IPCodeAnnot _ | Property.IPComplete _ | Property.IPDisjoint _ | Property.IPAssigns _ | Property.IPFrom _ | Property.IPDecrease _ | Property.IPLemma _ | Property.IPReachable _ - | Property.IPAllocation _ | Property.IPOther _ -> ()); + | Property.IPAllocation _ | Property.IPOther _ + | Property.IPPropertyInstance _ + | Property.IPTypeInvariant _ | Property.IPGlobalInvariant _ -> () + end; unsafe_emit_and_get e ~hyps ~auto:false ppt ?distinct s let emit e ~hyps ppt ?distinct s = ignore (emit_and_get e ~hyps ppt ?distinct s) @@ -622,7 +631,8 @@ with Not_found -> (* assume that all ACSL properties are registered, except non-ACSL ones *) match ppt with - | Property.IPOther _ | Property.IPReachable _ -> + | Property.IPOther _ | Property.IPReachable _ + | Property.IPPropertyInstance _ -> if must_register then begin register ppt; if is_kernel_logical_consequence ppt then get_status ppt @@ -633,7 +643,8 @@ | Property.IPPredicate _ | Property.IPCodeAnnot _ | Property.IPComplete _ | Property.IPDisjoint _ | Property.IPAssigns _ | Property.IPFrom _ | Property.IPDecrease _ | Property.IPAllocation _ - | Property.IPAxiom _ | Property.IPAxiomatic _ | Property.IPLemma _ -> + | Property.IPAxiom _ | Property.IPAxiomatic _ | Property.IPLemma _ + | Property.IPTypeInvariant _ | Property.IPGlobalInvariant _ -> Kernel.fatal "trying to get status of unregistered property `%a'.\n\ That is forbidden (kernel invariant broken)." Property.pretty ppt @@ -1481,12 +1492,12 @@ let s = get_status p in let color = status_color p s in let style = match s with - | Never_tried -> [`Style [`Bold]; `Width 0.8 ] - | _ -> [`Style [`Filled]] + | Never_tried -> [`Style `Bold; `Width 0.8 ] + | _ -> [`Style `Filled] in style @ [ label v; `Color color; `Shape `Box ] | Emitter _ as v -> - [ label v; `Shape `Diamond; `Color 0xb0c4de; `Style [`Filled] ] + [ label v; `Shape `Diamond; `Color 0xb0c4de; `Style `Filled ] | Tuning_parameter _ as v -> [ label v; (*`Style `Dotted;*) `Color 0xb0c4de; ] (*| Correctness_parameter _ (*as v*) -> assert false (*[ label v; `Color 0xb0c4de ]*)*) @@ -1495,7 +1506,7 @@ | None -> [] | Some s -> let c = emitted_status_color s in - [ `Color c; `Fontcolor c; `Style [`Bold] ] + [ `Color c; `Fontcolor c; `Style `Bold ] let default_vertex_attributes _ = [] let default_edge_attributes _ = [] diff -Nru frama-c-20140301+neon+dfsg/src/logic/property_status.mli frama-c-20150201+sodium+dfsg/src/logic/property_status.mli --- frama-c-20140301+neon+dfsg/src/logic/property_status.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/property_status.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -106,20 +106,23 @@ { valid: emitter_with_properties list; invalid: emitter_with_properties list } -(** Type of known precise status of a property. *) +(** Type of the local status of a property. *) type status = private | Never_tried (** Nobody tries to verify the property *) | Best of - emitted_status (** The know precise status *) + emitted_status (** The know more precise status *) * emitter_with_properties list (** who attempt the verification under which hypotheses *) - | Inconsistent of inconsistent (** someone says the property is valid and - someone else says it is invalid. *) + | Inconsistent of inconsistent (** someone locally says the property is valid + and someone else says it is invalid: only + the consolidated status may conclude. *) include Datatype.S with type t = status val get: Property.t -> status -(** @return the most precise status and all its emitters. *) +(** @return the most precise **local** status and all its emitters. Please + condiser to use {!Property_status.Consolidation.get} if you want to know the + consolidated status of the property. *) (* ************************************************************************ *) (** {2 Consolidated status} *) @@ -232,7 +235,7 @@ val register_property_add_hook: (Property.t -> unit) -> unit (** add an hook that will be called for any newly registred property - @since Neon-20130301 *) + @since Neon-20140301 *) val remove: Property.t -> unit (** Remove the property deeply. Must be called only when removing the @@ -240,7 +243,7 @@ val register_property_remove_hook: (Property.t -> unit) -> unit (** Add and hook that will be called each time a property is removed. - @since Neon-20130301 *) + @since Neon-20140301 *) val merge: old:Property.t list -> Property.t list -> unit (** [merge old new] registers properties in [new] which are not in [old] and diff -Nru frama-c-20140301+neon+dfsg/src/logic/statuses_by_call.ml frama-c-20150201+sodium+dfsg/src/logic/statuses_by_call.ml --- frama-c-20140301+neon+dfsg/src/logic/statuses_by_call.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/statuses_by_call.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -87,11 +87,7 @@ with Not_found -> let loc = (Cil_datatype.Stmt.loc stmt) in let kf_call = Kernel_function.find_englobing_kf stmt in - let name = Pretty_utils.sfprintf "%s: %a" - (Property.Names.get_prop_name_id pid) - (Description.pp_localized ~kf:`Never ~ki:false ~kloc:true) pid - in - let p = Property.ip_other name (Some kf_call) (Kstmt stmt) in + let p = Property.ip_property_instance (Some kf_call) (Kstmt stmt) pid in PreCondAt.add (pid, stmt) p; (match stmt.skind with | Instr(Call(_, e, _, _)) -> diff -Nru frama-c-20140301+neon+dfsg/src/logic/statuses_by_call.mli frama-c-20150201+sodium+dfsg/src/logic/statuses_by_call.mli --- frama-c-20140301+neon+dfsg/src/logic/statuses_by_call.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/statuses_by_call.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/logic/translate_lightweight.ml frama-c-20150201+sodium+dfsg/src/logic/translate_lightweight.ml --- frama-c-20140301+neon+dfsg/src/logic/translate_lightweight.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/translate_lightweight.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/logic/translate_lightweight.mli frama-c-20150201+sodium+dfsg/src/logic/translate_lightweight.mli --- frama-c-20140301+neon+dfsg/src/logic/translate_lightweight.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/logic/translate_lightweight.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/cvalue.ml frama-c-20150201+sodium+dfsg/src/memory_state/cvalue.ml --- frama-c-20140301+neon+dfsg/src/memory_state/cvalue.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/cvalue.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -22,7 +22,6 @@ open Abstract_interp open Locations -open CilE open Cil_types module V = struct @@ -38,6 +37,9 @@ then raise Not_based_on_null else v with Not_found -> raise Not_based_on_null + + let project_ival_bottom m = + if is_bottom m then Ival.bottom else project_ival m let min_and_max_float f = try @@ -45,15 +47,6 @@ Ival.min_and_max_float i with Not_based_on_null -> assert false - (* [JS 2013/01/09] unused right now *) - let _force_float kind v = - try - let i = project_ival v in - let f, fi = Ival.force_float kind i in - f, inject_ival (fi) - with Not_based_on_null -> - true, topify_arith_origin v - let is_imprecise v = match v with | Top _ -> true @@ -63,7 +56,6 @@ let is_bottom v = equal bottom v - let is_isotropic v = match v with | Top _ -> true @@ -94,6 +86,16 @@ let of_int64 i = inject_ival (Ival.of_int64 i) + let inject_int (v:Int.t) = + inject_ival (Ival.inject_singleton v) + + let interp_boolean ~contains_zero ~contains_non_zero = + match contains_zero, contains_non_zero with + | true, true -> zero_or_one + | true, false -> singleton_zero + | false, true -> singleton_one + | false, false -> bottom + let subdiv_float_interval ~size v = try let v_ival = project_ival v in @@ -103,6 +105,140 @@ inject_ival ival1, inject_ival ival2 with Not_based_on_null -> assert false + + (* Pretty-printing *) + + (* Pretty the partial address [b(base)+i(offsets)] in a basic way, + by printing [i] as an [Ival.t] *) + let pretty_base_offsets_default fmt b i = + if Ival.equal Ival.singleton_zero i then + Format.fprintf fmt "@[%a@]" Base.pretty_addr b + else + Format.fprintf fmt "@[%a +@ %a@]" Base.pretty_addr b Ival.pretty i + + (* Pretty the partial address [b(base)+i(offsets)], supposing it has type + [typ]. Whenever possible, we print real addresses instead of bytes + offsets. *) + let pretty_base_offsets_typ typ fmt b i = + let typ_match = match Extlib.opt_map Cil.unrollType typ with + | Some (TPtr (typ_pointed, _)) -> + if Cil.isVoidType typ_pointed then None else Some typ_pointed + | _ -> None + in + try + let v_base = Base.to_varinfo b in + let typ_base = v_base.vtype in + (* Manually pretty a cast to [typ_pointed *] *) + let pretty_cast fmt ok = + if not ok then + match typ with + | None -> Format.fprintf fmt "(? *)" + | Some typ -> Format.fprintf fmt "(%a)" Printer.pp_typ typ + in + (* Find an offset in [typ_base] at byte [ioffset] such that the offset + is of type [typ_match]. If no such offset exists, find an offset + that does not have the proper type. *) + let conv_offset ioffset = + let ioffsbits = Int.mul ioffset (Bit_utils.sizeofchar ()) in + let find_match om = + fst (Bit_utils.find_offset typ_base ~offset:ioffsbits om) + in + try + match typ_match with + | None -> raise Bit_utils.NoMatchingOffset + | Some typ -> find_match Bit_utils.(MatchType typ), true + with Bit_utils.NoMatchingOffset -> + (* Backup solution: no type to match, or no offset with the proper + type. Find a matching offset with potentially the wrong type *) + find_match Bit_utils.MatchFirst, false + in + match i with + | Ival.Set [|o|] -> + (* One single offset. Use a short notation, and an even shorter one + if we represent [&b] *) + let o, ok = conv_offset o in + if o = NoOffset then + Format.fprintf fmt "@[%a%a@]" pretty_cast ok Base.pretty_addr b + else + Format.fprintf fmt "@[%a%a%a@]" + pretty_cast ok Base.pretty_addr b Printer.pp_offset o + | Ival.Set a -> (* Multiple offsets. We use a set notation *) + (* Catch NoOffset, which we would be printed as '{, [1], [2]}. Instead, + we find a slightly deeper offset. We should never be in a different + case from array/comp, as the other types cannot have multiple + offsets. *) + let conv_offset' o = + let o, ok = conv_offset o in + if o = NoOffset then + let o' = match Cil.unrollType typ_base with + | TArray _ -> Index (Cil.(zero builtinLoc), NoOffset) + | TComp (ci, _, _) -> Field (List.hd ci.cfields, NoOffset) + | _ -> raise Bit_utils.NoMatchingOffset + in o', ok + else o, ok + in + let arr_off, ok = + Array.fold_right + (fun o (l, ok)-> let o', ok' = conv_offset' o in o' :: l, ok && ok') + a ([], true) + in + Format.fprintf fmt "@[%a%a{%a}@]" + pretty_cast ok + Base.pretty_addr b + (Pretty_utils.pp_iter + ~sep:",@ " List.iter Printer.pp_offset) arr_off + | Ival.Top _ -> + (* Too many offsets. Currently, we use the basic notation. *) + pretty_base_offsets_default fmt b i + | Ival.Float _ -> assert false + with + (* Strange looking base, or no offset found. Use default printing *) + | Base.Not_a_C_variable | Bit_utils.NoMatchingOffset -> + pretty_base_offsets_default fmt b i + + (* Pretty-print a map of bases, using auxiliary function pp_base *) + let pretty_pointers fmt pp_base m = + Pretty_utils.pp_iter + ~pre:"@[{{ " ~suf:" }}@]" ~sep:" ;@ " + (fun pp map -> M.iter (fun k v -> pp (k, v)) map) + (fun fmt (k, v) -> pp_base fmt k v) + fmt m + + let pretty_typ typ fmt v = + let pretty_org fmt org = + if not (Origin.is_top org) then + Format.fprintf fmt "@ @[(origin: %a)@]" Origin.pretty org + in + match v with + | Top (Base.SetLattice.Top, a) -> + Format.fprintf fmt "{{ ANYTHING%a }}" + pretty_org a + | Top (Base.SetLattice.Set t, a) -> + let t = Base.SetLattice.(inject (O.remove Base.null t)) in + Format.fprintf fmt "{{ garbled mix of &%a%a }}" + Base.SetLattice.pretty t pretty_org a + | Map m -> + try + Ival.pretty fmt (project_ival v) + with + | Not_based_on_null -> + try + pretty_pointers fmt (pretty_base_offsets_typ typ) m + with Cil.SizeOfError _ -> + (* Standard printing as a set of (base+ival) *) + pretty_pointers fmt pretty_base_offsets_default m + + let pretty fmt v = match v with + | Top _ -> pretty_typ None fmt v + | Map m -> + try + Ival.pretty fmt (project_ival v) + with + | Not_based_on_null -> pretty_pointers fmt pretty_base_offsets_default m + + + (** Comparisons *) + let compare_bound ival_compare_bound l1 l2 = if l1 == l2 then 0 else if is_bottom l2 then 1 @@ -118,260 +254,43 @@ let compare_min_int = compare_bound Ival.compare_min_int let compare_max_int = compare_bound Ival.compare_max_int - let filter_comparison ival_filter e1 ~cond_expr = - let r = + let filter_le_ge_lt_gt_int op e1 ~cond_expr = match e1 with | Top _ -> e1 | Map m1 -> try let k,v2 = find_lonely_key cond_expr in let v1 = find_or_bottom k m1 in - let r = Map (add_or_bottom k (ival_filter v1 v2) m1) in - if (not (Base.equal k Base.null)) && - (ival_filter == Ival.filter_ge || ival_filter == Ival.filter_gt) + let v1' = Ival.filter_le_ge_lt_gt_int op v1 v2 in + let r = add k v1' e1 in + if (not (Base.equal k Base.null)) && (op = Ge || op = Gt) then diff_if_one r singleton_zero else r with Not_found -> e1 - in -(* Format.printf "filter_comparison %a %a -> %a@." - pretty e1 pretty cond_expr pretty r; *) - r - let filter_comparison_float float_filter e1 ~cond_expr = + let filter_le_ge_lt_gt_float op allmodes fkind e1 ~cond_expr = try let v1 = project_ival e1 in let v2 = project_ival cond_expr in - inject_ival (float_filter v1 v2) + inject_ival (Ival.filter_le_ge_lt_gt_float op allmodes fkind v1 v2) with Not_based_on_null -> e1 - let filter_le e1 ~cond_expr = filter_comparison Ival.filter_le e1 ~cond_expr - let filter_ge e1 ~cond_expr = filter_comparison Ival.filter_ge e1 ~cond_expr - let filter_lt e1 ~cond_expr = filter_comparison Ival.filter_lt e1 ~cond_expr - let filter_gt e1 ~cond_expr = filter_comparison Ival.filter_gt e1 ~cond_expr - - let filter_le_float allmodes ~typ_loc e1 ~cond_expr = - filter_comparison_float - (Ival.filter_le_float allmodes ~typ_loc) - e1 - ~cond_expr - let filter_ge_float allmodes ~typ_loc e1 ~cond_expr = - filter_comparison_float - (Ival.filter_ge_float allmodes ~typ_loc) - e1 ~cond_expr - let filter_lt_float allmodes ~typ_loc e1 ~cond_expr = - filter_comparison_float - (Ival.filter_lt_float allmodes ~typ_loc) - e1 - ~cond_expr - let filter_gt_float allmodes ~typ_loc e1 ~cond_expr = - filter_comparison_float - (Ival.filter_gt_float allmodes ~typ_loc) - e1 - ~cond_expr - - let pretty fmt v = - (*Format.printf "@[HERE@.@]";*) - let pretty_org fmt org = - if not (Origin.is_top org) then - Format.fprintf fmt "@ @[(origin: %a)@]" Origin.pretty org - in - match v with - | Top (Base.SetLattice.Top, a) -> - Format.fprintf fmt "{{ ANYTHING%a }}" - pretty_org a - | Top (t, a) -> - Format.fprintf fmt "{{ garbled mix of &%a%a }}" - Base.SetLattice.pretty t - pretty_org a - | Map m -> - try - Ival.pretty fmt (project_ival v) - with - | Not_based_on_null -> - let print_binding fmt k v = - if Ival.equal Ival.singleton_zero v - then Format.fprintf fmt "@[%a@]" Base.pretty_addr k - else begin - if true - then - Format.fprintf fmt "@[%a +@ %a@]" - Base.pretty_addr k Ival.pretty v - else - match v, Base.typeof k with - Ival.Top _, _ - | Ival.Float _, _ - | _, None - | _, Some TArray(TInt((IChar|ISChar|IUChar),_),_,_,_) -> - Format.fprintf fmt "@[%a +@ %a@]" - Base.pretty_addr k Ival.pretty v - | Ival.Set s, Some typ -> - Format.fprintf fmt "@[%a +@ {" - Base.pretty_addr k; - Array.iter - (fun i -> - Format.fprintf fmt "%a@ (" - Abstract_interp.Int.pretty i; - let ibits = Integer.mul (Bit_utils.sizeofchar()) i in - Bit_utils.pretty_offset typ ibits fmt; - Format.fprintf fmt "),@ ") - s; - Format.fprintf fmt "}@]" - - (* Format.fprintf fmt "@[%a +@ %a (%a)@]" - Base.pretty_addr k Ival.pretty v - - *) - end - in - Pretty_utils.pp_iter - ~pre:"@[{{ " ~suf:" }}@]" ~sep:" ;@ " - (fun pp map -> M.iter (fun k v -> pp (k, v)) map) - (fun fmt (k, v) -> print_binding fmt k v) - fmt m - - let inject_int (v:Int.t) = - inject_ival (Ival.inject_singleton v) - - let interp_boolean ~contains_zero ~contains_non_zero = - match contains_zero, contains_non_zero with - | true, true -> zero_or_one - | true, false -> singleton_zero - | false, true -> singleton_one - | false, false -> bottom - - let add v1 v2 = - try - Location_Bytes.shift (project_ival v1) v2 - with Not_based_on_null -> - try - Location_Bytes.shift (project_ival v2) v1 - with - Not_based_on_null -> - join - (topify_arith_origin v1) - (topify_arith_origin v2) - - (* Compute the pointwise difference between two Locations_Bytes.t. *) - let sub_untyped_pointwise v1 v2 = - let open Locations in - match v1, v2 with - | Top _, Top _ - | Top (Base.SetLattice.Top, _), Map _ - | Map _, Top (Base.SetLattice.Top, _) -> - Ival.top, true - | Top (Base.SetLattice.Set s, _), Map m - | Map m, Location_Bytes.Top (Base.SetLattice.Set s, _) -> - (* Differences between pointers containing garbled mixes must always - result in an alarm, as garbled mix at least contain a pointer and NULL *) - let s' = Base.SetLattice.O.add Base.null s in - if Base.SetLattice.O.(intersects s' (from_shape (M.shape m))) then - Ival.top, true - else - Ival.bottom, true - | Map m1, Map m2 -> - (* Substract pointwise for all the bases that are present in both m1 - and m2. Could be written more efficiently with a recursive simultaneous - descent, but not such iterator currently exists. *) - let aux b offsm1 (acc_offs, cardm1) = - let acc_offs = - try - let offsm2 = M.find b m2 in - Ival.join (Ival.sub offsm1 offsm2) acc_offs - with Not_found -> acc_offs - in - acc_offs, succ cardm1 - in - let offsets, cardm1 = M.fold aux m1 (Ival.bottom, 0) in - (* If cardm1 > 1 or cardm2 > 1 or m1 and m2 are disjoint, we must emit - an alarm *) - let warn = cardm1 > 1 || Ival.is_bottom offsets || - (try ignore (find_lonely_key v2); false with Not_found -> true) - in - offsets, warn - - (* compute [e1+factor*e2] using C semantic for +, i.e. - [ptr+v] is [add_untyped sizeof_in_octets( *ptr) ptr v] *) - let add_untyped factor e1 e2 = - try - if Int_Base.equal factor (Int_Base.minus_one) - then - (* Either e1 and e2 have the same base, and it's a subtraction - of pointers, or e2 is really an integer *) - let b1, o1 = Location_Bytes.find_lonely_key e1 in - let b2, o2 = Location_Bytes.find_lonely_key e2 in - if Base.compare b1 b2 <> 0 then raise Not_found; - inject_ival (Ival.sub o1 o2) - else begin - if not (Int_Base.equal factor (Int_Base.one)) - then raise Not_found; (* cannot multiply a pointer *) - add e1 e2 - end - with Not_found -> - (* we end up here if the only way left to make this - addition is to convert e2 to an integer *) - try - let right = Ival.scale_int_base factor (project_ival e2) - in Location_Bytes.shift right e1 - with Not_based_on_null -> (* from [project_ival] *) - join (topify_arith_origin e1) (topify_arith_origin e2) - - let compare_min_max min max = - match min, max with - | None,_ -> -1 - | _,None -> -1 - | Some min, Some max -> Int.compare min max - - let compare_max_min max min = - match max, min with - | None,_ -> 1 - | _,None -> 1 - | Some max, Some min -> Int.compare max min - let do_le min1 max1 min2 max2 = - if compare_max_min max1 min2 <= 0 then singleton_one - else if compare_min_max min1 max2 > 0 then singleton_zero + if Ival.compare_max_min max1 min2 <= 0 then singleton_one + else if Ival.compare_min_max min1 max2 > 0 then singleton_zero else zero_or_one let do_ge min1 max1 min2 max2 = do_le min2 max2 min1 max1 let do_lt min1 max1 min2 max2 = - if compare_max_min max1 min2 < 0 then singleton_one - else if compare_min_max min1 max2 >= 0 then singleton_zero + if Ival.compare_max_min max1 min2 < 0 then singleton_one + else if Ival.compare_min_max min1 max2 >= 0 then singleton_zero else zero_or_one let do_gt min1 max1 min2 max2 = do_lt min2 max2 min1 max1 - let _comparisons _info ~signed f e1 e2 = - let r = - try - let k1,v1 = find_lonely_key e1 in - let k2,v2 = find_lonely_key e2 in - if not (Base.equal k1 k2) - then begin - if (not signed) - then begin - let e1_zero = equal e1 singleton_zero in - let e2_zero = equal e2 singleton_zero in - if (e1_zero && (f == do_le || f == do_lt)) - || (e2_zero && (f == do_ge || f == do_gt)) - then singleton_one - else if (e2_zero && (f == do_le || f == do_lt)) - || (e1_zero && (f == do_ge || f == do_gt)) - then singleton_zero - else zero_or_one - end - else zero_or_one - end - else Ival.compare_C f v1 v2 - with Not_found -> - zero_or_one - in -(* Format.printf "comparisons %a %a %a@." - pretty e1 pretty e2 pretty r; *) - r - let asym_rel ~signed op e1 e2 = let open Cil_types in try @@ -428,11 +347,14 @@ | _ -> assert false + (** Casts *) + let cast_float ~rounding_mode v = try let i = project_ival v in - let b, i = Ival.cast_float ~rounding_mode i in - false, b, inject_ival i + let b, i = Ival.force_float FFloat i in + let b', i = Ival.cast_float ~rounding_mode i in + false, b || b', inject_ival i with Not_based_on_null -> if is_bottom v @@ -442,50 +364,28 @@ let cast_double v = try let i = project_ival v in - let b, i = Ival.cast_double i in - false, b, inject_ival i + let b, i = Ival.force_float FDouble i in + let b', i = Ival.cast_double i in + false, b || b', inject_ival i with Not_based_on_null -> if is_bottom v then false, false, bottom else true, true, topify_arith_origin v - let cast ~size ~signed expr = - try - let i = project_ival expr in - inject_ival (Ival.cast ~size ~signed ~value:i), true - with - | Not_based_on_null -> - if Int.ge size (Int.of_int (Bit_utils.sizeofpointer ())) || - is_bottom expr || is_imprecise expr - then expr, true - else topify_arith_origin expr, false - - let import_function ~topify ~with_alarms info f e1 e2 = - try - let v1 = project_ival e1 in - let v2 = project_ival e2 in - inject_ival (f v1 v2) - with Not_based_on_null -> - if is_bottom e1 || is_bottom e2 - then bottom - else begin - (do_warn with_alarms.imprecision_tracing - (fun _ -> - match e1,e2 with - | Map _, Map _ -> - Kernel.warning ~once:true ~current:true - "Operation %a %s %a incurs a loss of precision" - pretty e1 - info - pretty e2 - | _ -> ())); - join - (topify_with_origin_kind topify e1) - (topify_with_origin_kind topify e2) - end - - let arithmetic_function = import_function ~topify:Origin.K_Arith + let cast ~size ~signed v = + let integer_part, pointer_part = split Base.null v in + let integer_part' = Ival.cast ~size ~signed ~value:integer_part in + let pointer_part', ok = + if Int.ge size (Int.of_int (Bit_utils.sizeofpointer ())) || + is_bottom pointer_part || is_imprecise pointer_part + then pointer_part, true + else topify_arith_origin pointer_part, false + in + if ok && integer_part' == integer_part then + v, true + else + (join (inject_ival integer_part') pointer_part'), ok let cast_float_to_int ~signed ~size v = try @@ -495,7 +395,7 @@ in false, alarm_use_as_float, alarm_overflow, inject_ival r with Not_based_on_null -> - (not (is_bottom v)), true, true, topify_arith_origin v + (not (is_bottom v)), true, (true, true), topify_arith_origin v let cast_float_to_int_inverse ~single_precision i = try @@ -512,152 +412,154 @@ inject_ival r, ok with Not_based_on_null -> v, false - let div ~with_alarms e1 e2 = - if equal e2 singleton_one - then e1 - else begin - if (with_alarms.others.a_log <> None) && contains_zero e2 then - CilE.warn_div with_alarms; - arithmetic_function ~with_alarms "/" Ival.div e1 e2 - end - - let c_rem ~with_alarms e1 e2 = - if (with_alarms.others.a_log <> None) && contains_zero e2 then - warn_div with_alarms; - arithmetic_function ~with_alarms "%" Ival.c_rem e1 e2 - - let mul ~with_alarms e1 e2 = - arithmetic_function ~with_alarms "*" Ival.mul e1 e2 - - (** Warn about overflow iff [size] is not [None]. Beware when calling - this function *) - let shift_left ~topify ~with_alarms ~size e1 e2 = - let default e1 e2 = - begin - try - let size = - Extlib.opt_map - (function (_, y) -> Int.of_int y) - size - in - import_function - ~topify - ~with_alarms - "<<" - (Ival.shift_left ~size) e1 e2 - with Not_found -> - join - (topify_with_origin_kind topify e1) - (topify_with_origin_kind topify e2) - end - in - match size with - | None -> default e1 e2 - | Some ((warn_negative, size)) -> - let size_int = Int.of_int size in - let valid_range_rhs = - inject_ival - (Ival.inject_range - (Some Int.zero) - (Some (Int.pred size_int))) - in - if (with_alarms.others.a_log <> None) - then begin - if not (is_included e2 valid_range_rhs) - then warn_shift with_alarms size; - end; - let e2 = narrow e2 valid_range_rhs in - let e1 = - if warn_negative - then begin - let valid_range_lhs = - inject_ival - (Ival.inject_range - (Some Int.zero) - None) - in - if not (is_included e1 valid_range_lhs) - then warn_shift_left_positive with_alarms; - narrow e1 valid_range_lhs - end - else e1 - in - default e1 e2 - - let bitwise_xor ~with_alarms v1 v2 = - arithmetic_function ~with_alarms "^" Ival.bitwise_xor v1 v2 - - let bitwise_or_with_topify ~topify ~with_alarms v1 v2 = - import_function ~topify ~with_alarms "^" Ival.bitwise_or v1 v2 - - - let shift_right ~with_alarms ~size e1 e2 = - let default () = - begin - try - let size = Extlib.opt_map (function (_,s) -> Int.of_int s) size in - arithmetic_function ~with_alarms ">>" - (Ival.shift_right ~size) e1 e2 - with Not_found -> - join (topify_arith_origin e1) (topify_arith_origin e2) - end - in - match size with - | None -> default () - | Some (_,size) -> - let size_int = Int.of_int size in - let valid_range = - inject_ival (Ival.inject_range (Some Int.zero) - (Some (Int.pred size_int))) - in - if not (intersects e2 valid_range) then begin - warn_shift with_alarms size; - if with_alarms.others.a_log <> None then - Kernel.warning ~once:true ~current:true - "invalid shift of %a-bit value by %a. \ -This path is assumed to be dead." - Int.pretty size_int - pretty e2; - bottom - end else begin - if (with_alarms.others.a_log <> None) - && not (is_included e2 valid_range) - then warn_shift with_alarms size; - default () - end - - let bitwise_and ~signed ~size e1 e2 = - let bitwise_and_pointer_ival p ival = - let _min, _max = - match Ival.min_and_max ival with - Some min, Some max when Int.ge min Int.zero -> - min, max - | _ -> raise Not_based_on_null + + (** Binary functions *) + + let import_function ~topify f e1 e2 = + try + let v1 = project_ival e1 in + let v2 = project_ival e2 in + inject_ival (f v1 v2) + with Not_based_on_null -> + if is_bottom e1 || is_bottom e2 + then bottom + else begin + join + (topify_with_origin_kind topify e1) + (topify_with_origin_kind topify e2) + end + + let arithmetic_function = import_function ~topify:Origin.K_Arith + + (* Compute the pointwise difference between two Locations_Bytes.t. *) + let sub_untyped_pointwise v1 v2 = + let open Locations in + match v1, v2 with + | Top _, Top _ + | Top (Base.SetLattice.Top, _), Map _ + | Map _, Top (Base.SetLattice.Top, _) -> + Ival.top, true + | Top (Base.SetLattice.Set s, _), Map m + | Map m, Location_Bytes.Top (Base.SetLattice.Set s, _) -> + (* Differences between pointers containing garbled mixes must always + result in an alarm, as garbled mix at least contain a pointer and NULL *) + let s' = Base.SetLattice.O.add Base.null s in + if Base.SetLattice.O.(intersects s' (from_shape (M.shape m))) then + Ival.top, true + else + Ival.bottom, true + | Map m1, Map m2 -> + (* Substract pointwise for all the bases that are present in both m1 + and m2. Could be written more efficiently with a recursive simultaneous + descent, but not such iterator currently exists. *) + let aux b offsm1 (acc_offs, cardm1) = + let acc_offs = + try + let offsm2 = M.find b m2 in + Ival.join (Ival.sub_int offsm1 offsm2) acc_offs + with Not_found -> acc_offs + in + acc_offs, succ cardm1 in - let treat_base _base _offsets _acc = - Location_Bytes.topify_arith_origin p (* TODO *) + let offsets, cardm1 = M.fold aux m1 (Ival.bottom, 0) in + (* If cardm1 > 1 or cardm2 > 1 or m1 and m2 are disjoint, we must emit + an alarm *) + let warn = cardm1 > 1 || Ival.is_bottom offsets || + (try ignore (find_lonely_key v2); false with Not_found -> true) in - Location_Bytes.fold_i treat_base p Location_Bytes.bottom - in - try - let v1 = project_ival e1 in - try - let v2 = project_ival e2 in - let result = Ival.bitwise_and ~signed ~size v1 v2 - in - inject_ival result - with Not_based_on_null | Location_Bytes.Error_Top -> - bitwise_and_pointer_ival e2 v1 - with Not_based_on_null | Location_Bytes.Error_Top -> + offsets, warn + + (* compute [e1+factor*e2] using C semantic for +, i.e. + [ptr+v] is [add_untyped sizeof_in_octets( *ptr) ptr v]. This function + handles simultaneously PlusA, MinusA, PlusPI, MinusPI and sometimes + MinusPP, by setting [factor] accordingly. This is more precise than + having multiple functions, as computations such as + [(int)&t[1] - (int)&t[2]] would not be treated precisely otherwise. *) + let add_untyped factor e1 e2 = + try + if Int_Base.equal factor (Int_Base.minus_one) + then + (* Either e1 and e2 have the same base, and it's a subtraction + of pointers, or e2 is really an integer *) + let b1, o1 = Location_Bytes.find_lonely_key e1 in + let b2, o2 = Location_Bytes.find_lonely_key e2 in + if Base.compare b1 b2 <> 0 then raise Not_found; + inject_ival (Ival.sub_int o1 o2) + else begin + if not (Int_Base.equal factor (Int_Base.one)) then + raise Not_found (* cannot multiply a pointer *); try - let v2 = project_ival e2 in - bitwise_and_pointer_ival e1 v2 - with Not_based_on_null | Location_Bytes.Error_Top -> - join (topify_arith_origin e1) (topify_arith_origin e2) + Location_Bytes.shift (project_ival_bottom e2) e1 + with Not_based_on_null -> + try (* On the off chance that someone writes [i+(int)&p]... *) + Location_Bytes.shift (project_ival_bottom e1) e2 + with Not_based_on_null -> + join (topify_arith_origin e1) (topify_arith_origin e2) + end + with Not_found -> + (* we end up here if the only way left to make this + addition is to convert e2 to an integer *) + try + let right = Ival.scale_int_base factor (project_ival_bottom e2) + in Location_Bytes.shift right e1 + with Not_based_on_null -> (* from [project_ival] *) + join (topify_arith_origin e1) (topify_arith_origin e2) + + (* Under-approximating variant of add_untyped. Takes two + under-approximation, and returns an under-approximation.*) + let add_untyped_under factor e1 e2 = + if Int_Base.equal factor (Int_Base.minus_one) + then + (* Note: we could do a "link" for each pair of matching bases in + e1 and e2, so this is an underapproximation in the most + common case. *) + try + let b1, o1 = Location_Bytes.find_lonely_key e1 in + let b2, o2 = Location_Bytes.find_lonely_key e2 in + if Base.compare b1 b2 <> 0 then bottom + else inject_ival (Ival.sub_int_under o1 o2) + with Not_found -> bottom + else if Int_Base.equal factor Int_Base.one + then + try Location_Bytes.shift_under (project_ival_bottom e2) e1 + with Not_based_on_null -> bottom + else + try + let right = Ival.scale_int_base factor (project_ival_bottom e2) in + Location_Bytes.shift_under right e1 + with Not_based_on_null -> bottom + ;; + + let div e1 e2 = + arithmetic_function Ival.div e1 e2 + + let c_rem e1 e2 = + arithmetic_function Ival.c_rem e1 e2 + + let mul e1 e2 = + arithmetic_function Ival.mul e1 e2 + + let shift_left e1 e2 = + arithmetic_function Ival.shift_left e1 e2 + + let bitwise_xor v1 v2 = + arithmetic_function Ival.bitwise_xor v1 v2 + + let bitwise_or_with_topify ~topify v1 v2 = + import_function ~topify Ival.bitwise_or v1 v2 + + let bitwise_or = bitwise_or_with_topify ~topify:Origin.K_Arith + + let bitwise_and ~signed ~size v1 v2 = + let f i1 i2 = Ival.bitwise_and ~size ~signed i1 i2 in + import_function ~topify:Origin.K_Arith f v1 v2 + + let shift_right e1 e2 = + arithmetic_function Ival.shift_right e1 e2 let extract_bits ~topify ~start ~stop ~size v = try - let i = project_ival v in + let i = project_ival_bottom v in false, inject_ival (Ival.extract_bits ~start ~stop ~size i) with | Not_based_on_null -> @@ -665,6 +567,14 @@ then false, v else true, topify_with_origin_kind topify v + (* Computes [e * 2^factor]. Auxiliary function for foo_endian_merge_bits *) + let shift_left_by_integer ~topify factor e = + try + let i = project_ival_bottom e in + inject_ival (Ival.scale (Int.two_power factor) i) + with Not_based_on_null -> + topify_with_origin_kind topify e + let big_endian_merge_bits ~topify ~conflate_bottom ~total_length ~length ~value ~offset acc = if is_bottom acc || is_bottom value then begin @@ -677,20 +587,10 @@ (topify_with_origin_kind topify value) end else - let total_length_i = Int.of_int total_length in - assert (Int.le (Int.add length offset) total_length_i); - let result = - bitwise_or_with_topify - ~topify - ~with_alarms:warn_none_mode - (shift_left - ~topify - ~with_alarms:warn_none_mode - ~size:(Some (false,total_length)) - value - (inject_ival (Ival.inject_singleton (Int.sub (Int.sub total_length_i offset) length)))) - acc - in + let total_length_i = Int.of_int total_length in + let factor = Int.sub (Int.sub total_length_i offset) length in + let value' = shift_left_by_integer ~topify factor value in + let result = bitwise_or_with_topify ~topify value' acc in (* Format.printf "big_endian_merge_bits : total_length:%d length:%a value:%a offset:%a acc:%a GOT:%a@." total_length Int.pretty length @@ -700,8 +600,7 @@ pretty result; *) result - let little_endian_merge_bits ~topify ~conflate_bottom ~total_length ~value - ~offset acc = + let little_endian_merge_bits ~topify ~conflate_bottom ~value ~offset acc = if is_bottom acc || is_bottom value then begin if conflate_bottom @@ -713,18 +612,8 @@ (topify_with_origin_kind topify value) end else - let result = - bitwise_or_with_topify - ~topify - ~with_alarms:warn_none_mode - (shift_left - ~topify - ~with_alarms:warn_none_mode - ~size:(Some (false, total_length)) - value - (inject_ival (Ival.inject_singleton offset))) - acc - in + let value' = shift_left_by_integer ~topify offset value in + let result = bitwise_or_with_topify ~topify value' acc in (*Format.printf "le merge_bits : total_length:%d value:%a offset:%a acc:%a GOT:%a@." total_length pretty value Int.pretty offset pretty acc pretty result;*) result @@ -745,8 +634,6 @@ let create_all_values ~modu ~signed ~size = inject_ival (Ival.create_all_values ~modu ~signed ~size) - let bitwise_or = bitwise_or_with_topify ~topify:Origin.K_Arith - let shift_left = shift_left ~topify:Origin.K_Arith end module V_Or_Uninitialized = struct @@ -765,8 +652,10 @@ let mask_init = 2 let mask_noesc = 1 - let is_initialized flags = (flags land mask_init) <> 0 - let is_noesc flags = (flags land mask_noesc) <> 0 + external get_flags : tt -> int = "caml_obj_tag" "noalloc" + + let is_initialized v = (get_flags v land mask_init) <> 0 + let is_noesc v = (get_flags v land mask_noesc) <> 0 let get_v = function | C_uninit_esc v @@ -774,7 +663,9 @@ | C_init_esc v | C_init_noesc v -> v - external get_flags : tt -> int = "caml_obj_tag" "noalloc" + let is_indeterminate = function + | C_init_noesc _ -> false + | _ -> true let create : int -> V.t -> tt = fun flags v -> match flags with @@ -814,6 +705,8 @@ ((get_flags t1) lor (get_flags t2)) (V.meet (get_v t1) (get_v t2)) + let map f v = create (get_flags v) (f (get_v v)) + let bottom = C_init_noesc V.bottom let top = C_uninit_esc V.top @@ -822,11 +715,6 @@ let uninitialized = C_uninit_noesc V.bottom let initialized v = C_init_noesc v - let remove_indeterminateness v = - match v with - C_init_noesc _ -> v - | (C_uninit_noesc v | C_uninit_esc v | C_init_esc v) -> C_init_noesc v - let is_included t1 t2 = (* (t2.initialized ==> t1.initialized) && (t2.no_escaping_adr ==> t1.no_escaping_adr) && @@ -840,29 +728,32 @@ let join_and_is_included t1 t2 = let t12 = join t1 t2 in (t12, equal t12 t2) - let pretty fmt t = - let flags = get_flags t in - let no_escaping_adr = is_noesc flags in - let initialized = is_initialized flags in + let pretty_aux pp fmt t = + let no_escaping_adr = is_noesc t in + let initialized = is_initialized t in let v = get_v t in match V.(equal bottom v), initialized, no_escaping_adr with | false, false, false -> - Format.fprintf fmt "%a or UNINITIALIZED or ESCAPINGADDR" V.pretty v + Format.fprintf fmt "%a or UNINITIALIZED or ESCAPINGADDR" pp v | true, false, false -> Format.pp_print_string fmt "UNINITIALIZED or ESCAPINGADDR" | false, false, true -> - Format.fprintf fmt "%a or UNINITIALIZED" V.pretty v + Format.fprintf fmt "%a or UNINITIALIZED" pp v | true, false, true -> Format.pp_print_string fmt "UNINITIALIZED" | false, true, false -> - Format.fprintf fmt "%a or ESCAPINGADDR" V.pretty v + Format.fprintf fmt "%a or ESCAPINGADDR" pp v | true, true, false -> Format.pp_print_string fmt "ESCAPINGADDR" | false, true, true -> - V.pretty fmt v + pp fmt v | true, true, true -> Format.pp_print_string fmt "BOTVALUE" + let pretty fmt v = pretty_aux V.pretty fmt v + let pretty_typ typ fmt v = + pretty_aux (fun fmt v -> V.pretty_typ typ fmt v) fmt v + let cardinal_zero_or_one t = match t with C_init_noesc v -> V.cardinal_zero_or_one v @@ -909,9 +800,6 @@ let is_isotropic t = V.is_isotropic (get_v t) - let cardinal_zero_or_one_or_isotropic t = - cardinal_zero_or_one t || is_isotropic t - let extract_bits ~topify ~start ~stop ~size t = let inform_extract_pointer_bits, v = V.extract_bits ~topify ~start ~stop ~size (get_v t) @@ -919,11 +807,11 @@ inform_extract_pointer_bits, create (get_flags t) v - let little_endian_merge_bits ~topify ~conflate_bottom ~total_length ~value ~offset t = + let little_endian_merge_bits ~topify ~conflate_bottom ~value ~offset t = create ((get_flags t) land (get_flags value)) (V.little_endian_merge_bits ~topify ~conflate_bottom - ~total_length ~value:(get_v value) ~offset + ~value:(get_v value) ~offset (get_v t)) let big_endian_merge_bits ~topify ~conflate_bottom ~total_length ~length ~value ~offset t = @@ -958,38 +846,25 @@ let v = if exact then v' else V.join v v' in locals, create flags v - let change_initialized init v = match init, v with + let reduce_by_initializedness init v = match init, v with | true, C_uninit_esc v -> C_init_esc v | true, C_uninit_noesc v -> C_init_noesc v - | true, _ -> v - | false, C_init_esc v -> C_uninit_esc v - | false, C_init_noesc v -> C_uninit_noesc v - | false, _ -> v - - let project_with_alarms ~with_alarms ~conflate_bottom loc v = - let v_v = get_v v in - let bottom = V.is_bottom v_v in - let flags = get_flags v in - - (* distasteful FIXME *) if conflate_bottom then begin - if not (is_initialized flags) - then warn_uninitialized with_alarms; - if not (is_noesc flags) - then warn_escapingaddr with_alarms; - end; - - if with_alarms.unspecified.a_log <> None && - bottom && - not (is_initialized flags && - is_noesc flags ) - then begin - do_warn with_alarms.unspecified - (fun _ -> - Kernel.warning ~current:true ~once:true - "completely indeterminate value %a." - (Locations.pretty_english ~prefix:true) loc) - end; - v_v + | true, (C_init_esc _ | C_init_noesc _) -> v + | false, (C_init_esc _ | C_init_noesc _) -> bottom + | false, C_uninit_noesc _ -> C_uninit_noesc V.bottom + | false, C_uninit_esc _ -> C_uninit_esc V.bottom + + let reduce_by_danglingness spec v = match spec, v with + | false, C_uninit_esc v -> C_uninit_noesc v + | false, C_init_esc v -> C_init_noesc v + | false, (C_uninit_noesc _ | C_init_noesc _) -> v + | true, (C_uninit_noesc _ | C_init_noesc _) -> bottom + | true, C_uninit_esc _ -> C_uninit_esc V.bottom + | true, C_init_esc _ -> C_init_esc V.bottom + + let remove_indeterminateness = function + | C_init_noesc _ as v -> v + | (C_uninit_noesc v | C_uninit_esc v | C_init_esc v) -> C_init_noesc v end @@ -1038,23 +913,33 @@ let default_offsetmap base = match base with | Base.Initialized_Var (v,_) -> - (try InitializedVars.find v - with Not_found -> assert false) - | Base.Var _ | Base.CLogic_Var _ -> + `Map (try InitializedVars.find v with Not_found -> assert false) + | Base.Var _ | Base.CLogic_Var _ | Base.Null -> + (* The map we create is not faithful for NULL: we bind the interval + [0..start] to uninitialized instead of bottom. This is not a problem in + practice, given the way we use this module. Indeed, the NULL base is + always bound to something (else) in module Value/Initial_state, or + is invalid. *) begin match Base.validity base with - | Base.Invalid -> V_Offsetmap.empty + | Base.Invalid -> `Bottom | Base.Known (mn, mx) | Base.Unknown (mn, _, mx) -> - assert (Int.ge mx mn && Int.equal mn Int.zero); - V_Offsetmap.create_isotropic ~size:(Int.succ mx) - V_Or_Uninitialized.uninitialized - | Base.Periodic (mn, mx, p) -> - assert (Int.is_zero mn && Int.gt mx p); - V_Offsetmap.create_isotropic ~size:p - V_Or_Uninitialized.bottom + assert (Int.ge mx mn); + `Map (V_Offsetmap.create_isotropic ~size:(Int.succ mx) + V_Or_Uninitialized.uninitialized) end - | Base.Null -> V_Offsetmap.empty - | Base.String (_,i) -> V_Offsetmap.from_cstring i + | Base.String (_,i) -> `Map (V_Offsetmap.from_cstring i) + + let is_default_offsetmap b m = + match b with + | Base.Var _ | Base.CLogic_Var _ | Base.Null -> + let is_default v = V_Or_Uninitialized.(equal v uninitialized) in + V_Offsetmap.is_single_interval ~f:is_default m + | Base.Initialized_Var _ | Base.String _ -> + match default_offsetmap b with + |`Bottom -> false + | `Map m' -> V_Offsetmap.equal m' m + end module Model = struct @@ -1062,126 +947,55 @@ include Lmap.Make_LOffset(V_Or_Uninitialized)(V_Offsetmap)(Default_offsetmap) - let find_unspecified = find + let find_unspecified ?(conflate_bottom=true) state loc = + find ~conflate_bottom state loc - let find ~with_alarms ~conflate_bottom state loc = - let v = find_unspecified ~with_alarms ~conflate_bottom state loc in - V_Or_Uninitialized.project_with_alarms ~with_alarms ~conflate_bottom loc v - -let reduce_by_initialized_defined_loc f loc_bits size state = - try - let base, offset = Locations.Location_Bits.find_lonely_key loc_bits in - let ll = Ival.project_int offset in - let lh = Int.pred (Int.add ll size) in - let offsm = find_base base state in - let aux (offl, offh) (v, modu, shift) acc = - let v' = f v in - if v' != v then begin - if V_Or_Uninitialized.is_bottom v' then raise Exit; - let il = Int.max offl ll and ih = Int.min offh lh in - let abs_shift = Integer.pos_rem (Rel.add_abs offl shift) modu in - (* il and ih are the bounds of the interval to reduce. - We change the initialized flags in the following cases: - - either we overwrite entire values, or the partly overwritten - value is at the beginning or at the end of the subrange - - or we do not lose information on misaligned or partial values: - the result is a singleton *) - if V_Or_Uninitialized.cardinal_zero_or_one_or_isotropic v' || - ((Int.equal offl il || Int.equal (Int.pos_rem ll modu) abs_shift) && - (Int.equal offh ih || Int.equal - (Int.pos_rem (Int.succ lh) modu) abs_shift)) - then - let diff = Rel.sub_abs il offl in - let shift_il = Rel.pos_rem (Rel.sub shift diff) modu in - V_Offsetmap.add (il, ih) (v', modu, shift_il) acc - else acc - end - else acc - in - let noffsm = - V_Offsetmap.fold_between ~entire:true (ll, lh) aux offsm offsm - in - add_base base noffsm state - with - | Exit -> bottom - | Not_found (* from find_lonely_key *) - | Ival.Not_Singleton_Int (* from Ival.project_int *) -> - state - - let find_and_reduce_indeterminate ~with_alarms state loc = - let conflate_bottom = true in - let v = find_unspecified ~conflate_bottom ~with_alarms state loc in - let v_v = - V_Or_Uninitialized.project_with_alarms ~with_alarms ~conflate_bottom loc v - in - let loc_bits = loc.Locations.loc in - let state = - match v with - | V_Or_Uninitialized.C_uninit_esc _ - | V_Or_Uninitialized.C_uninit_noesc _ - | V_Or_Uninitialized.C_init_esc _ - when Locations.cardinal_zero_or_one loc - -> - (* Does not raise an exception, given the definition of - Locations.cardinal_zero_or one *) - let size = Int_Base.project loc.size in - reduce_by_initialized_defined_loc - V_Or_Uninitialized.remove_indeterminateness loc_bits size state - | _ -> state - in - state, v_v + let find ?(conflate_bottom=true) state loc = + let alarm, v = find_unspecified ~conflate_bottom state loc in + alarm, V_Or_Uninitialized.get_v v let add_binding_unspecified ~exact mem loc v = - add_binding ~reducing:false ~with_alarms:warn_none_mode ~exact mem loc v + add_binding ~reducing:false ~exact mem loc v - let reduce_previous_binding initial_mem l v = + let reduce_previous_binding state l v = assert (Locations.cardinal_zero_or_one l); let v = V_Or_Uninitialized.initialized v in - add_binding ~with_alarms:CilE.warn_none_mode - ~reducing:true ~exact:true initial_mem l v + snd (add_binding ~reducing:true ~exact:true state l v) -(* XXXXXXXXX bug with uninitialized values ? *) let reduce_binding initial_mem l v = - let with_alarms = CilE.warn_none_mode in - let v_old = find ~conflate_bottom:true ~with_alarms initial_mem l in + let _, v_old = find initial_mem l in + (* This function will discard any indeterminate bit in [v_old]. This is + by design, as reduction functions must be called after evaluation + was done. *) if V.equal v v_old then initial_mem else - let vv = V.narrow v_old v in -(* Format.printf "narrow %a %a %a@." V.pretty v_old V.pretty v V.pretty vv; *) - if V.equal vv v_old then initial_mem - else reduce_previous_binding initial_mem l vv + let v_new = V.narrow v_old v in + if V.equal v_new v_old then initial_mem + else if V.is_bottom v_new then bottom + else reduce_previous_binding initial_mem l v_new let add_initial_binding mem loc v = - add_binding ~with_alarms:warn_none_mode - ~reducing:true ~exact:true mem loc v + snd (add_binding ~reducing:true ~exact:true mem loc v) (* Overwrites the definition of add_binding coming from Lmap, with a signature change. *) - let add_binding ~with_alarms ~exact acc loc value = - add_binding ~with_alarms + let add_binding ~exact acc loc value = + add_binding ~reducing:false ~exact acc loc (V_Or_Uninitialized.initialized value) let add_new_base base ~size v ~size_v state = let v = V_Or_Uninitialized.initialized v in add_new_base base ~size v ~size_v state + + let remove_variables vars state = + let cleanup acc v = remove_base (Base.of_varinfo v) acc in + List.fold_left cleanup state vars + let uninitialize_blocks_locals blocks state = List.fold_left - (fun acc block -> - List.fold_left - (fun acc vi -> remove_base (Base.of_varinfo vi) acc) - acc - block.blocals) - state - blocks - - let uninitialize_formals_locals fundec state = - let locals = List.map Base.of_varinfo fundec.slocals in - let formals = List.map Base.of_varinfo fundec.sformals in - let cleanup acc v = remove_base v acc in - let result = List.fold_left cleanup state locals in - List.fold_left cleanup result formals + (fun acc block -> remove_variables block.blocals acc) state blocks end diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/cvalue.mli frama-c-20150201+sodium+dfsg/src/memory_state/cvalue.mli --- frama-c-20140301+neon+dfsg/src/memory_state/cvalue.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/cvalue.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -42,10 +42,15 @@ with type t := t and type widen_hint := widen_hint + val pretty_typ: Cil_types.typ option -> t Pretty_utils.formatter + exception Not_based_on_null val project_ival : t -> Ival.t (** Raises [Not_based_on_null] if the value may be a pointer. *) + val project_ival_bottom: t -> Ival.t + (* Temporary API, will be merged with project_ival later *) + val min_and_max_float : t -> Ival.F.t * Ival.F.t val is_imprecise : t -> bool @@ -65,18 +70,10 @@ val compare_min_int : t -> t -> int val compare_max_int : t -> t -> int - val filter_le : t -> cond_expr:t -> t - val filter_ge : t -> cond_expr:t -> t - val filter_lt : t -> cond_expr:t -> t - val filter_gt : t -> cond_expr:t -> t - val filter_le_float : - bool -> typ_loc:Cil_types.typ -> t -> cond_expr:t -> t - val filter_ge_float : - bool -> typ_loc:Cil_types.typ -> t -> cond_expr:t -> t - val filter_lt_float : - bool -> typ_loc:Cil_types.typ -> t -> cond_expr:t -> t - val filter_gt_float : - bool -> typ_loc:Cil_types.typ -> t -> cond_expr:t -> t + val filter_le_ge_lt_gt_int: Cil_types.binop -> t -> cond_expr:t -> t + val filter_le_ge_lt_gt_float : + Cil_types.binop -> + bool -> Ival.Float_abstract.float_kind -> t -> cond_expr:t -> t val eval_comp: signed:bool -> Cil_types.binop -> t -> t -> t (** Can only be called on the 6 comparison operators *) @@ -84,35 +81,47 @@ val inject_int : Int.t -> t val interp_boolean : contains_zero:bool -> contains_non_zero:bool -> t +(** [cast ~size ~signed v] applies to the abstract value [v] the conversion + to the integer type described by [size] and [signed]. The results + are [new_value, ok]. The boolean [ok], when true, indicates that no + imprecision was introduced. + Offsets of bases other than Null are not clipped. If they were clipped, + they should be clipped at the validity of the base. The C standard does + not say that [p+(1ULL<<32+1)] is the same as [p+1], it says that + [p+(1ULL<<32+1)] is invalid. *) val cast: size:Int.t -> signed:bool -> t -> t * bool + val cast_float: rounding_mode:Ival.Float_abstract.rounding_mode -> t -> bool * bool * t val cast_double: t -> bool * bool * t val cast_float_to_int : signed:bool -> size:int -> t -> - bool (** addresses *) * bool (** top *) * bool (** overflow *) * t + bool (** addresses *) * + bool (** non-finite *) * + (bool * bool) (** overflow, in both directions *) * + t val cast_float_to_int_inverse : single_precision:bool -> t -> t val cast_int_to_float : Ival.Float_abstract.rounding_mode -> t -> t * bool val add_untyped : Int_Base.t -> t -> t -> t + val add_untyped_under : Int_Base.t -> t -> t -> t + val sub_untyped_pointwise: t -> t -> Ival.t * bool (** Substracts two pointers (assumed to have type [char*]) and returns the difference of their offsets. The two pointers are supposed to be pointing to the same base; the returned boolean indicates that this assumption might be incorrect. *) - val mul: with_alarms:CilE.warn_mode -> t -> t -> t - val div : with_alarms:CilE.warn_mode -> t -> t -> t - val c_rem : with_alarms:CilE.warn_mode -> t -> t -> t - val shift_right : - with_alarms:CilE.warn_mode -> size:(bool*int) option -> t -> t -> t - val shift_left : - with_alarms:CilE.warn_mode -> size:(bool*int) option -> t -> t -> t - val bitwise_and : signed:bool -> size:int -> t -> t -> t - val bitwise_xor: with_alarms:CilE.warn_mode -> t -> t -> t - val bitwise_or : with_alarms:CilE.warn_mode -> t -> t -> t + val mul: t -> t -> t + val div: t -> t -> t + val c_rem: t -> t -> t + val shift_right: t -> t -> t + val shift_left: t -> t -> t + val bitwise_and: signed:bool -> size:int -> t -> t -> t + val bitwise_xor: t -> t -> t + val bitwise_or : t -> t -> t val all_values : size:Int.t -> t -> bool val create_all_values : @@ -133,19 +142,33 @@ include Lattice_type.With_Under_Approximation with type t:= t include Lattice_type.With_Narrow with type t := t - val get_v : un_t -> V.t - external get_flags : un_t -> int = "caml_obj_tag" "noalloc" + val get_v : t -> V.t - val uninitialized: un_t + val is_bottom: t -> bool + val is_initialized : t -> bool + val is_noesc : t -> bool + val is_indeterminate: t -> bool + + val uninitialized: t + val initialized : V.t -> t + + val reduce_by_initializedness : bool -> t -> t + (** [reduce_by_initializedness initialized v] reduces [v] so that its result + [r] verifies [\initialized(r)] if [initialized] is [true], and + [!\initialized(r)] otherwise. *) + + val reduce_by_danglingness : bool -> t -> t + (** [reduce_by_danglingness dangling v] reduces [v] so that its result [r] + verifies [\dangling(r)] if [dangling] is [true], and + [!\dangling(r)] otherwise. *) - val initialized : V.t -> un_t - val change_initialized : bool -> un_t -> un_t - - val is_initialized : int -> bool - val is_noesc : int -> bool + val remove_indeterminateness: t -> t + (** Remove 'unitialized' and 'escaping addresses' flags from the argument *) val unspecify_escaping_locals : - exact:bool -> (V.M.key -> bool) -> un_t -> Base.SetLattice.t * un_t + exact:bool -> (V.M.key -> bool) -> t -> Base.SetLattice.t * t + + val map: (V.t -> V.t) -> t -> t end (** Memory slices. They are maps from intervals to values with @@ -160,7 +183,7 @@ module Default_offsetmap: sig val create_initialized_var : Cil_types.varinfo -> Base.validity -> V_Offsetmap.t -> Base.t - val default_offsetmap : Base.t -> V_Offsetmap.t + val default_offsetmap : Base.t -> [ `Bottom | `Map of V_Offsetmap.t ] end (** Memories. They are maps from bases to memory slices *) @@ -190,40 +213,37 @@ - if [conflate_bottom] is [false] and at least one bit pointed to by [l..l+loc.size-1] is not [V.bottom], the value is an approximation of the join of all the bits at [l..l+loc.size-1]. - You usually want to use [conflate_bottom=false], unless your goal - is to test for the the fact that [loc] points to something undeterminate. + As a rule of thumb, you must set [conflate_bottom=true] when the + operation you abstract really accesses [loc.size] bits, and when + undeterminate values are an error. This is typically the case when + reading a scalar value. Conversely, if you are reading many bits at + once (for example, to approximate the entire contents of a struct), + set [conflate_bottom] to [false] -- to account for the possibility + of padding bits. The default value is [true]. The function + also returns [true] when the read location may be invalid. *) val find_unspecified : - with_alarms:CilE.warn_mode -> - conflate_bottom:bool -> t -> location -> V_Or_Uninitialized.t + ?conflate_bottom:bool -> t -> location -> bool * V_Or_Uninitialized.t - (** [find ~with_alarms state loc] returns the same value as - [find_indeterminate], but removes the flags from the result. If either - the "unitialized" or "escaping" address flag was present, the - corresponding alarm is raised by the function. *) - val find : - with_alarms:CilE.warn_mode -> - conflate_bottom:bool -> t -> location -> V.t - - (** Similar to [find], but we expect a non-indeterminate result; if - the value returned had escaping or uninitialized flags, they are - removed in the state that is returned along with the cvalue. *) - val find_and_reduce_indeterminate : - with_alarms:CilE.warn_mode -> t -> location -> t * V.t + (** [find ?conflate_bottom state loc] returns the same value as + [find_indeterminate], but removes the indeterminate flags from the + result. The returned boolean indicates only a possibly invalid + location, not indeterminateness. *) + val find : ?conflate_bottom:bool -> t -> location -> bool * V.t (** {2 Writing values into the state} *) (** [add_binding state loc v] simulates the effect of writing [v] at location [loc] in [state]. If [loc] is not writable, {!bottom} is returned. - + The returned boolean indicates that the location may be invalid. For this function, [v] is an initialized value; the function {!add_binding_unspecified} allows to write a possibly unspecified value to [state]. *) val add_binding : - with_alarms:CilE.warn_mode -> exact:bool -> t -> location -> V.t -> t + exact:bool -> t -> location -> V.t -> bool * t val add_binding_unspecified : - exact:bool -> t -> location -> V_Or_Uninitialized.t -> t + exact:bool -> t -> location -> V_Or_Uninitialized.t -> bool * t (** {2 Reducing the state} *) @@ -255,12 +275,10 @@ (** {2 Misc} *) - val reduce_by_initialized_defined_loc : - (V_Or_Uninitialized.t -> V_Or_Uninitialized.t) -> - Locations.Location_Bits.t -> Int.t -> t -> t - val uninitialize_blocks_locals : Cil_types.block list -> t -> t - val uninitialize_formals_locals : Cil_types.fundec -> t -> t + val remove_variables : Cil_types.varinfo list -> t -> t + (** For variables that are coming from the AST, this is equivalent to + uninitializing them. *) end diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/function_Froms.ml frama-c-20150201+sodium+dfsg/src/memory_state/function_Froms.ml --- frama-c-20140301+neon+dfsg/src/memory_state/function_Froms.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/function_Froms.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -25,37 +25,17 @@ module Deps = struct - type from_deps = { + type deps = { data: Zone.t; indirect: Zone.t; } - let subst_from_deps f fd = { - data = f fd.data; - indirect = f fd.indirect; - } + let to_zone {data; indirect} = Zone.join data indirect module DatatypeFromDeps = Datatype.Make(struct - type t = from_deps + type t = deps - let name = "Function_Froms.Deps.deps_assigned" - - let pretty fmt {data; indirect} = - let bottom_data = Zone.is_bottom data in - let bottom_indirect = Zone.is_bottom indirect in - match bottom_indirect, bottom_data with - | true, true -> - Format.fprintf fmt "\\nothing" - | true, false -> - Format.fprintf fmt "direct: %a" - Zone.pretty data - | false, true -> - Format.fprintf fmt "indirect: %a" - Zone.pretty indirect - | false, false -> - Format.fprintf fmt "indirect: %a; direct: %a" - Zone.pretty indirect - Zone.pretty data + let name = "Function_Froms.Deps.from_deps" let hash fd = Zone.hash fd.data + 37 * Zone.hash fd.indirect @@ -67,6 +47,8 @@ let equal = Datatype.from_compare + let pretty fmt d = Zone.pretty fmt (to_zone d) + let reprs = List.map (fun z -> {data = z; indirect = z}) Zone.reprs @@ -81,11 +63,28 @@ let copy = Datatype.undefined end) - let data_deps z = { data = z; indirect = Zone.bottom } - let indirect_deps z = { data = Zone.bottom; indirect = z } - include DatatypeFromDeps + let pretty_precise fmt {data; indirect} = + let bottom_data = Zone.is_bottom data in + let bottom_indirect = Zone.is_bottom indirect in + match bottom_indirect, bottom_data with + | true, true -> + Format.fprintf fmt "\\nothing" + | true, false -> + Format.fprintf fmt "direct: %a" + Zone.pretty data + | false, true -> + Format.fprintf fmt "indirect: %a" + Zone.pretty indirect + | false, false -> + Format.fprintf fmt "indirect: %a; direct: %a" + Zone.pretty indirect + Zone.pretty data + + let from_data_deps z = { data = z; indirect = Zone.bottom } + let from_indirect_deps z = { data = Zone.bottom; indirect = z } + let bottom = { data = Zone.bottom; indirect = Zone.bottom; @@ -100,23 +99,17 @@ Zone.is_included fd1.data fd2.data && Zone.is_included fd1.indirect fd2.indirect - let join fd1 fd2 = { - data = Zone.join fd1.data fd2.data; - indirect = Zone.join fd1.indirect fd2.indirect - } - - let join_and_is_included fd1 fd2 = - let fd12 = join fd1 fd2 in - (fd12, equal fd12 fd2) - - let defaultall base = { - data = Zone.defaultall base; - indirect = Zone.bottom - } - - let default zone x y = { - data = Zone.default zone x y; - indirect = Zone.bottom + let join fd1 fd2 = + if fd1 == bottom then fd2 + else if fd2 == bottom then fd1 + else { + data = Zone.join fd1.data fd2.data; + indirect = Zone.join fd1.indirect fd2.indirect + } + + let _narrow fd1 fd2 = { + data = Zone.narrow fd1.data fd2.data; + indirect = Zone.narrow fd1.indirect fd2.indirect } let add_data_dep fd data = @@ -125,74 +118,454 @@ let add_indirect_dep fd indirect = { fd with indirect = Zone.join fd.indirect indirect } - let to_zone {data; indirect} = Zone.join data indirect + let map f fd = { + data = f fd.data; + indirect = f fd.indirect; + } + +end + +module DepsOrUnassigned = struct - let subst = subst_from_deps + type deps_or_unassigned = + | DepsBottom + | Unassigned + | AssignedFrom of Deps.t + | MaybeAssignedFrom of Deps.t + + module DatatypeDeps = Datatype.Make(struct + type t = deps_or_unassigned + + let name = "Function_Froms.Deps.deps" + + let pretty fmt = function + | DepsBottom -> Format.pp_print_string fmt "DEPS_BOTTOM" + | Unassigned -> Format.pp_print_string fmt "UNASSIGNED" + | AssignedFrom fd -> Deps.pretty_precise fmt fd + | MaybeAssignedFrom fd -> + (* '(or UNASSIGNED)' would be a better pretty-printer, we use + '(and SELF)' only for compatibility reasons *) + Format.fprintf fmt "%a (and SELF)" Deps.pretty_precise fd + + let hash = function + | DepsBottom -> 3 + | Unassigned -> 17 + | AssignedFrom fd -> 37 + 13 * Deps.hash fd + | MaybeAssignedFrom fd -> 57 + 123 * Deps.hash fd + + let compare d1 d2 = match d1, d2 with + | DepsBottom, DepsBottom + | Unassigned, Unassigned -> 0 + | AssignedFrom fd1, AssignedFrom fd2 + | MaybeAssignedFrom fd1, MaybeAssignedFrom fd2 -> + Deps.compare fd1 fd2 + | DepsBottom, (Unassigned | AssignedFrom _ | MaybeAssignedFrom _) + | Unassigned, (AssignedFrom _ | MaybeAssignedFrom _) + | AssignedFrom _, MaybeAssignedFrom _ -> + -1 + | (Unassigned | AssignedFrom _ | MaybeAssignedFrom _), DepsBottom + | (AssignedFrom _ | MaybeAssignedFrom _), Unassigned + | MaybeAssignedFrom _, AssignedFrom _ -> + 1 + + let equal = Datatype.from_compare + + let reprs = Unassigned :: List.map (fun r -> AssignedFrom r) Deps.reprs + + let structural_descr = + let d = Deps.packed_descr in + Structural_descr.t_sum [| [| d |]; [| d |] |] + let rehash = Datatype.identity + + let mem_project = Datatype.never_any_project + let varname _ = "d" + + let internal_pretty_code = Datatype.undefined + let copy = Datatype.undefined + + end) + + let join d1 d2 = match d1, d2 with + | DepsBottom, d | d, DepsBottom -> d + | Unassigned, Unassigned -> Unassigned + | Unassigned, AssignedFrom fd | AssignedFrom fd, Unassigned -> + MaybeAssignedFrom fd + | Unassigned, (MaybeAssignedFrom _ as d) + | (MaybeAssignedFrom _ as d), Unassigned -> + d + | AssignedFrom fd1, AssignedFrom fd2 -> + AssignedFrom (Deps.join fd1 fd2) + | AssignedFrom fd1, MaybeAssignedFrom fd2 + | MaybeAssignedFrom fd1, AssignedFrom fd2 + | MaybeAssignedFrom fd1, MaybeAssignedFrom fd2 -> + MaybeAssignedFrom (Deps.join fd1 fd2) + + let narrow _ _ = assert false (* not used yet *) + + let is_included d1 d2 = match d1, d2 with + | DepsBottom, (DepsBottom | Unassigned | AssignedFrom _ | + MaybeAssignedFrom _) + | Unassigned, (Unassigned | AssignedFrom _ | MaybeAssignedFrom _) -> + true + | MaybeAssignedFrom fd1, (AssignedFrom fd2 | MaybeAssignedFrom fd2) + | AssignedFrom fd1, AssignedFrom fd2 -> + Deps.is_included fd1 fd2 + | (Unassigned | AssignedFrom _ | MaybeAssignedFrom _), DepsBottom + | (AssignedFrom _ | MaybeAssignedFrom _), Unassigned + | AssignedFrom _, MaybeAssignedFrom _ -> + false + + let bottom = DepsBottom + let top = MaybeAssignedFrom Deps.top + let default = Unassigned + + include DatatypeDeps + + let join_and_is_included d1 d2 = + let d12 = join d1 d2 in + (d12, equal d12 d2) + + let subst f d = match d with + | DepsBottom -> DepsBottom + | Unassigned -> Unassigned + | AssignedFrom fd -> + let fd' = f fd in + if fd == fd' then d else AssignedFrom fd' + | MaybeAssignedFrom fd -> + let fd' = f fd in + if fd == fd' then d else MaybeAssignedFrom fd' let pretty_precise = pretty + let to_zone = function + | DepsBottom | Unassigned -> Zone.bottom + | AssignedFrom fd | MaybeAssignedFrom fd -> Deps.to_zone fd + + let to_deps = function + | DepsBottom | Unassigned -> Deps.bottom + | AssignedFrom fd | MaybeAssignedFrom fd -> fd + + let extract_data = function + | DepsBottom | Unassigned -> Zone.bottom + | AssignedFrom fd | MaybeAssignedFrom fd -> fd.Deps.data + + let extract_indirect = function + | DepsBottom | Unassigned -> Zone.bottom + | AssignedFrom fd | MaybeAssignedFrom fd -> fd.Deps.indirect + + let may_be_unassigned = function + | DepsBottom | AssignedFrom _ -> false + | Unassigned | MaybeAssignedFrom _ -> true + + let compose d1 d2 = + match d1, d2 with + | DepsBottom, _ | _, DepsBottom -> + DepsBottom (* could indicate dead code. Not used in practice anyway *) + | Unassigned, _ -> d2 + | AssignedFrom _, _ -> d1 + | MaybeAssignedFrom _, Unassigned -> d1 + | MaybeAssignedFrom d1, MaybeAssignedFrom d2 -> + MaybeAssignedFrom (Deps.join d1 d2) + | MaybeAssignedFrom d1, AssignedFrom d2 -> + AssignedFrom (Deps.join d1 d2) + (* for backwards compatibility *) let pretty fmt fd = - Zone.pretty fmt (to_zone fd) + match fd with + | DepsBottom -> Format.pp_print_string fmt "DEPS_BOTTOM" + | Unassigned -> Format.pp_print_string fmt "(SELF)" + | AssignedFrom d -> Zone.pretty fmt (Deps.to_zone d) + | MaybeAssignedFrom d -> + Format.fprintf fmt "%a (and SELF)" Zone.pretty (Deps.to_zone d) end module Memory = struct - include Lmap_bitwise.Make_bitwise(Deps) + (** A From table is internally represented as a Lmap of [DepsOrUnassigned]. + However, the API mostly hides this fact, and exports access functions + that take or return [Deps.t] values. This way, the user needs not + understand the subtleties of DepsBottom/Unassigned/MaybeAssigned. *) + + include Lmap_bitwise.Make_bitwise(DepsOrUnassigned) + + let () = imprecise_write_msg := "dependencies to update" + + let pretty_skip = function + | DepsOrUnassigned.DepsBottom -> true + | DepsOrUnassigned.Unassigned -> true + | DepsOrUnassigned.AssignedFrom _ -> false + | DepsOrUnassigned.MaybeAssignedFrom _ -> false + + let pretty = + pretty_generic_printer + ~skip_v:pretty_skip ~pretty_v:DepsOrUnassigned.pretty ~sep:"FROM" () let pretty_ind_data = - pretty_generic_printer Deps.pretty_precise "FROM" + pretty_generic_printer + ~skip_v:pretty_skip ~pretty_v:DepsOrUnassigned.pretty_precise ~sep:"FROM" + () + - let find_precise = find + (** This is the auxiliary datastructure used to write the function [find]. + When we iterate over a offsetmap of value [DepsOrUnassigned], we obtain + two things: (1) some dependencies; (2) some intervals that may have not + been assigned, and that will appear as data dependencies (once we know + the base we are iterating on). *) + type find_offsm = { + fo_itvs: Int_Intervals.t; + fo_deps: Deps.t; + } - let find m z = - Deps.to_zone (find_precise m z) + (** Once the base is known, we can obtain something of type [Deps.t] *) + let convert_find_offsm base fp = + let z = Zone.inject base fp.fo_itvs in + Deps.add_data_dep fp.fo_deps z + + let empty_find_offsm = { + fo_itvs = Int_Intervals.bottom; + fo_deps = Deps.bottom; + } + + let join_find_offsm fp1 fp2 = + if fp1 == empty_find_offsm then fp2 + else if fp2 == empty_find_offsm then fp1 + else { + fo_itvs = Int_Intervals.join fp1.fo_itvs fp2.fo_itvs; + fo_deps = Deps.join fp1.fo_deps fp2.fo_deps; + } + + (** Auxiliary function that collects the dependencies on some intervals of + an offsetmap. *) + let find_precise_offsetmap : Int_Intervals.t -> LOffset.t -> find_offsm = + let cache = Hptmap.PersistentCache "Function_Froms.find_precise" in + let aux_find_offsm ib ie v = + (* If the interval can be unassigned, we collect its bound. We also + return the dependencies stored at this interval. *) + let default, v = match v with + | DepsOrUnassigned.DepsBottom -> false, Deps.bottom + | DepsOrUnassigned.Unassigned -> true, Deps.bottom + | DepsOrUnassigned.MaybeAssignedFrom v -> true, v + | DepsOrUnassigned.AssignedFrom v -> false, v + in + { fo_itvs = + if default + then Int_Intervals.inject_bounds ib ie + else Int_Intervals.bottom; + fo_deps = v } + in + (* Partial application is important *) + LOffset.fold_join_itvs + ~cache aux_find_offsm join_find_offsm empty_find_offsm + + (** Collecting dependencies on a given zone. *) + let find_precise : t -> Zone.t -> Deps.t = + let both = find_precise_offsetmap in + let conv = convert_find_offsm in + (* We are querying a zone for which no dependency is stored. Hence, every + base is implicitely bound to [Unassigned]. *) + let empty_map z = Deps.from_data_deps z in + let join = Deps.join in + let empty = Deps.bottom in + (* Partial application is important *) + let f = fold_join_zone ~both ~conv ~empty_map ~join ~empty in + fun m z -> + match m with + | Top -> Deps.top + | Bottom -> Deps.bottom + | Map m -> f z m + + let find z m = + Deps.to_zone (find_precise z m) + + let add_binding_precise_loc ~exact m loc v = + let aux_one_loc loc m = + let loc = Locations.valid_part ~for_writing:true loc in + add_binding_loc + ~reducing:false ~exact m loc (DepsOrUnassigned.AssignedFrom v) + in + Precise_locs.fold aux_one_loc loc m + + let bind_var vi v m = + let z = Locations.zone_of_varinfo vi in + add_binding ~reducing:true ~exact:true m z (DepsOrUnassigned.AssignedFrom v) + + let add_binding ~exact m z v = + add_binding ~reducing:false ~exact m z (DepsOrUnassigned.AssignedFrom v) + + let add_binding_loc ~exact m loc v = + add_binding_loc + ~reducing:false ~exact m loc (DepsOrUnassigned.AssignedFrom v) + + let is_unassigned m = + let unassigned v = DepsOrUnassigned.(equal v Unassigned) in + LOffset.is_single_interval ~f:unassigned m + + (* Unassigned is a neutral value for compose, on both sides *) + let decide_compose m1 m2 = + if m1 == m2 || is_unassigned m1 then LOffset.ReturnRight + else if is_unassigned m2 then LOffset.ReturnLeft + else LOffset.Recurse + + let compose_map = + let cache = Hptmap.PersistentCache "Function_Froms.Memory.compose" in + (* Partial application is important because of the cache. Idempotent, + because [compose x x] is always equal to [x]. *) + map2 cache ~idempotent:true ~empty_neutral:true + decide_compose DepsOrUnassigned.compose + + let compose m1 m2 = match m1, m2 with + | Top, _ | _, Top -> Top + | Map m1, Map m2 -> Map (compose_map m1 m2) + | Bottom, (Map _ | Bottom) | Map _, Bottom -> Bottom + + (** Auxiliary function that substitutes the data right-hand part of a + dependency by a pre-existing From state. The returned result is a Deps.t: + the data part will be the data part of the complete result, the indirect + part will be added to the indirect part of the final result. *) + (* This function iterates simultaneously on a From memory, and on a zone. + It is cached. The definitions below are used to call the function that + does the recursive descent. *) + let substitute_data_deps = + (* Nothing left to substitute, return z unchanged *) + let empty_right z = Deps.from_data_deps z in + (* Zone to subtitute is empty *) + let empty_left _ = Deps.bottom in + (* [b] is in the zone and substituted. Rewrite appropriately *) + let both b itvs offsm = + let fp = find_precise_offsetmap itvs offsm in + convert_find_offsm b fp + in + let join = Deps.join in + let empty = Deps.bottom in + let cache = Hptmap.PersistentCache "From_compute.subst_data" in + let f_map = + Zone.fold2_join_heterogeneous + ~cache ~empty_left ~empty_right ~both ~join ~empty + in + fun call_site_froms z -> + match call_site_froms with + | Bottom -> Deps.bottom + | Top -> Deps.top + | Map m -> + try f_map z (shape m) + with Zone.Error_Top -> Deps.top + + (** Auxiliary function that substitutes the indirect right-hand part of a + dependency by a pre-existing From state. The returned result is a zone, + which will be added to the indirect part of the final result. *) + let substitute_indirect_deps = + (* Nothing left to substitute, z is directly an indirect dependency *) + let empty_right z = z in + (* Zone to subtitute is empty *) + let empty_left _ = Zone.bottom in + let both b itvs offsm = + (* Both the found data and indirect dependencies are computed for indirect + dependencies: merge to a single zone *) + let fp = find_precise_offsetmap itvs offsm in + Deps.to_zone (convert_find_offsm b fp) + in + let join = Zone.join in + let empty = Zone.bottom in + let cache = Hptmap.PersistentCache "From_compute.subst_indirect" in + let f_map = + Zone.fold2_join_heterogeneous + ~cache ~empty_left ~empty_right ~both ~join ~empty + in + fun call_site_froms z -> + match call_site_froms with + | Bottom -> Zone.bottom + | Top -> Zone.top + | Map m -> + try f_map z (shape m) + with Zone.Error_Top -> Zone.top + + let substitute call_site_froms deps = + let open Deps in + let { data; indirect } = deps in + (* depending directly on an indirect dependency -> indirect, + depending indirectly on a direct dependency -> indirect *) + let dirdeps = substitute_data_deps call_site_froms data in + let inddeps = substitute_indirect_deps call_site_froms indirect in + let dir = dirdeps.data in + let ind = Zone.(join dirdeps.indirect inddeps) in + { data = dir; indirect = ind } + + + type return = Deps.t + + let default_return = Deps.bottom + + let top_return = Deps.top + + let add_to_return ?start:(_start=0) ~size:_size ?(m=default_return) v = + Deps.join m v +(* + let start = Ival.of_int start in + let itvs = Int_Intervals.from_ival_size start size in + LOffset.add_iset ~exact:true itvs (DepsOrUnassigned.AssignedFrom v) m +*) + + let top_return_size size = + add_to_return ~size Deps.top + + let join_return = Deps.join + + let collapse_return x = x end type froms = - { deps_return : Memory.LOffset.t; + { deps_return : Memory.return; deps_table : Memory.t } let top = { - deps_return = Memory.LOffset.degenerate Deps.top; + deps_return = Memory.top_return; deps_table = Memory.top; } let join x y = - { deps_return = Memory.LOffset.join x.deps_return y.deps_return ; + { deps_return = Memory.join_return x.deps_return y.deps_return ; deps_table = Memory.join x.deps_table y.deps_table } let outputs { deps_table = t } = - Memory.fold - (fun z _ acc -> Locations.Zone.join z acc) t Locations.Zone.bottom + match t with + | Memory.Top -> Locations.Zone.top + | Memory.Bottom -> Locations.Zone.bottom + | Memory.Map(m) -> + Memory.fold + (fun z v acc -> + let open DepsOrUnassigned in + match v with + | DepsBottom | Unassigned -> acc + | AssignedFrom _ | MaybeAssignedFrom _ -> Locations.Zone.join z acc) + m Locations.Zone.bottom -let addr_data_inputs ?(include_self=false) t = +let inputs ?(include_self=false) t = let aux b offm acc = Memory.LOffset.fold - (fun itvs (self, z) acc -> - let acc = Deps.join z acc in + (fun itvs deps acc -> + let z = DepsOrUnassigned.to_zone deps in + let self = DepsOrUnassigned.may_be_unassigned deps in + let acc = Zone.join z acc in match include_self, self, b with | true, true, Some b -> - Deps.add_data_dep acc (Zone.inject b itvs) + Zone.join acc (Zone.inject b itvs) | _ -> acc ) offm acc in - try - let return = aux None t.deps_return Deps.bottom in - let aux_table b = aux (Some b) in - Memory.fold_base aux_table t.deps_table return - with Memory.Cannot_fold -> Deps.top - -let inputs ?(include_self=false) t = - let deps = addr_data_inputs ~include_self t in - Deps.to_zone deps + let return = Deps.to_zone t.deps_return in + let aux_table b = aux (Some b) in + match t.deps_table with + | Memory.Top -> Zone.top + | Memory.Bottom -> Zone.bottom + | Memory.Map m -> Memory.fold_base aux_table m return + let pretty fmt { deps_return = r ; deps_table = t } = - Format.fprintf fmt "%a@\n\\result %a@\n" + Format.fprintf fmt "%a@\n\\result FROM @[%a@]@\n" Memory.pretty t - Memory.LOffset.pretty r + Deps.pretty r (** same as pretty, but uses the type of the function to output more precise information. @@ -220,24 +593,19 @@ if not (Memory.is_empty t) then Format.fprintf fmt "@ " in - if Memory.LOffset.is_empty r then - Format.fprintf fmt "@[%a%t@[\\result FROM \\nothing@]@]" - map_pretty t pp_space - else - Format.fprintf fmt "@[%a%t@[\\result%a@]@]" - map_pretty t pp_space - (Memory.LOffset.pretty_with_type (Some rt_typ)) r + Format.fprintf fmt "@[%a%t@[\\result FROM @[%a@]@]@]" + map_pretty t pp_space Deps.pretty r let pretty_with_type_indirect = pretty_with_type ~indirect:true let pretty_with_type = pretty_with_type ~indirect:false let hash { deps_return = dr ; deps_table = dt } = - Memory.hash dt + 197 * Memory.LOffset.hash dr + Memory.hash dt + 197 * Deps.hash dr let equal { deps_return = dr ; deps_table = dt } { deps_return = dr' ; deps_table = dt' } = - Memory.equal dt dt'&& Memory.LOffset.equal dr dr' + Memory.equal dt dt'&& Deps.equal dr dr' include Datatype.Make (struct @@ -250,10 +618,10 @@ acc Memory.reprs) [] - Memory.LOffset.reprs + Deps.reprs let structural_descr = Structural_descr.t_record - [| Memory.LOffset.packed_descr; + [| Deps.packed_descr; Memory.packed_descr |] let name = "Function_Froms" let hash = hash diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/function_Froms.mli frama-c-20150201+sodium+dfsg/src/memory_state/function_Froms.mli --- frama-c-20140301+neon+dfsg/src/memory_state/function_Froms.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/function_Froms.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -24,30 +24,73 @@ module Deps : sig - type from_deps = { + type deps = { data: Locations.Zone.t; indirect: Locations.Zone.t; } - include Lmap_bitwise.With_default with type t = from_deps + val bottom: deps + val top: deps + val join: deps -> deps -> deps + val to_zone: deps -> Locations.Zone.t - val add_data_dep : t -> Locations.Zone.t -> t - val add_indirect_dep : t -> Locations.Zone.t -> t - val subst : (Locations.Zone.t -> Locations.Zone.t) -> t -> t + val add_data_dep: deps -> Locations.Zone.t -> deps + val add_indirect_dep: deps -> Locations.Zone.t -> deps - val data_deps: Locations.Zone.t -> t - val indirect_deps: Locations.Zone.t -> t + + val from_data_deps: Locations.Zone.t -> deps + val from_indirect_deps: Locations.Zone.t -> deps + + val map: (Locations.Zone.t -> Locations.Zone.t) -> deps -> deps + + include Datatype.S with type t = deps + + val pretty_precise : Format.formatter -> t -> unit +end + + +module DepsOrUnassigned : sig + + type deps_or_unassigned = + | DepsBottom (** Bottom of the lattice, never bound inside a memory state + at a valid location. (May appear for bases for which the + validity does not start at 0, currently only NULL.) *) + | Unassigned (** Location has never been assigned *) + | AssignedFrom of Deps.t (** Location guaranteed to have been overwritten, + its contents depend on the [Deps.t] value *) + | MaybeAssignedFrom of Deps.t (** Location may or may not have been + overwritten *) + (** The lattice is [DepsBottom <= Unassigned], [DepsBottom <= AssignedFrom z], + [Unassigned <= MaybeAssignedFrom] and + [AssignedFrom z <= MaybeAssignedFrom z]. *) + + include Lmap_bitwise.With_default with type t = deps_or_unassigned + + val subst: (Deps.t -> Deps.t) -> t -> t + + val extract_data: t -> Locations.Zone.t + val extract_indirect: t -> Locations.Zone.t + + val may_be_unassigned: t -> bool + + val compose: t -> t -> t + (** [compose d1 d2] is the sequential composition of [d1] after [d2], ie. + the dependencies needed to execute [d1] after having executed [d2]. + It is computed as [d1] if [d1 = AssignedFrom _] (as executing [d1] + completely overwrites what [d2] wrote), and as a partial join between + [d1] and [d2] in the other cases. *) val pretty_precise : Format.formatter -> t -> unit val to_zone: t -> Locations.Zone.t + val to_deps: t -> Deps.deps end module Memory : sig - include Lmap_bitwise.Location_map_bitwise with type y = Deps.t + include Lmap_bitwise.Location_map_bitwise with type v = DepsOrUnassigned.t -(* to print the detail of address and data dependencies, as opposed to [pretty] - that prints the backwards-compatible union of them *) + (** Prints the detail of address and data dependencies, as opposed to [pretty] + that prints the backwards-compatible union of them *) val pretty_ind_data : Format.formatter -> t -> unit val find: t -> Locations.Zone.t -> Locations.Zone.t @@ -56,12 +99,54 @@ val find_precise: t -> Locations.Zone.t -> Deps.t (** Precise version of find *) + + val add_binding: exact:bool -> t -> Locations.Zone.t -> Deps.t -> t + val add_binding_loc: exact:bool -> t -> Locations.location -> Deps.t -> t + val add_binding_precise_loc: + exact:bool -> t -> Precise_locs.precise_location -> Deps.t -> t + val bind_var: Cil_types.varinfo -> Deps.t -> t -> t + + val map: (DepsOrUnassigned.t -> DepsOrUnassigned.t) -> t -> t + + val compose: t -> t -> t + (** Sequential composition. See {!DepsOrUnassigned.compose}. *) + + val substitute: t -> Deps.t -> Deps.t + (** [substitute m d] applies [m] to [d] so that any dependency in [d] is + expressed using the dependencies already present in [m]. For example, + [substitute 'x From y' 'x'] returns ['y']. *) + + + (** Dependencies for [\result]. *) + + type return = Deps.t + (* Currently, this type is equal to [Deps.t]. However, some of the functions + below are more precise, and will be more useful when 'return' are + represented by a precise offsetmap. *) + + (** Default value to use for storing the dependencies of [\result] *) + val default_return: return + + (** Completly imprecise return *) + val top_return: return + + (** Completly imprecise return of the given size *) + val top_return_size: Int_Base.t -> return + + (** Add some dependencies to [\result], between bits [start] and + [start+size-1], to the [Deps.t] value; default value for [start] is 0. + If [m] is specified, the dependencies are added to it. Otherwise, + {!default_return} is used. *) + val add_to_return: + ?start:int -> size:Int_Base.t -> ?m:return -> Deps.t -> return + + val collapse_return: return -> Deps.t end type froms = { - deps_return : Memory.LOffset.t + deps_return : Memory.return (** Dependencies for the returned value *); deps_table : Memory.t (** Dependencies on all the zones modified by the function *); @@ -88,7 +173,6 @@ default value is [false]. *) val inputs: ?include_self:bool -> froms -> Locations.Zone.t - (* Local Variables: compile-command: "make -C ../.." diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/inout_type.ml frama-c-20150201+sodium+dfsg/src/memory_state/inout_type.ml --- frama-c-20140301+neon+dfsg/src/memory_state/inout_type.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/inout_type.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/inout_type.mli frama-c-20150201+sodium+dfsg/src/memory_state/inout_type.mli --- frama-c-20140301+neon+dfsg/src/memory_state/inout_type.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/inout_type.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/int_Interv_Map.ml frama-c-20150201+sodium+dfsg/src/memory_state/int_Interv_Map.ml --- frama-c-20140301+neon+dfsg/src/memory_state/int_Interv_Map.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/int_Interv_Map.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -(** Undocumented. - Do not use this module if you don't know what you are doing. *) - -open Abstract_interp - -module Make(Value: Rangemap.Value) = struct - - include Rangemap.Make(Int_Interv)(Value) - - let check (bi,ei) = assert (Int.le bi ei) - - let add x = check x; add x - let find x = check x; find x - - exception No_binding_above - - let find_above i m = - let o (b2, _e2) = Int.le i b2 - in - lowest_binding_above o m - - let pretty pretty_v fmt m = - Pretty_utils.pp_iter - ~pre:"@[{" - ~suf:"}@]" - ~sep:" ;@ " - (fun pp map -> iter (fun bi_ei v -> pp (bi_ei, v)) map) - (fun fmt ((bi, ei), v) -> - Format.fprintf fmt "[%a..%a] -> %a" - Int.pretty bi Int.pretty ei - pretty_v v) - fmt - m - - let enlarge_to_right ~extend_right same_values ei new_vv acc = - if extend_right then - (* look for an interval starting just after i *) - let s_ei = Int.succ ei in - match concerned_intervals Int_Interv.fuzzy_order (s_ei,s_ei) acc - with [] -> acc,ei - | [(ba,ea) as a,vva] -> - assert (Int.equal ba s_ei); - if same_values vva new_vv then - (remove a acc),ea - else acc,ei - | _ -> assert false - else acc,ei - - let handle_rightmost_itv - ~extend_right - same_values ei new_vv ((_,ei1),vv1) acc = - if Int.gt ei1 ei - then (* Part of the previous binding remains - on the right-hand-side *) - if extend_right && same_values vv1 new_vv - then (* same value -> merge keys *) - acc,ei1 - else add (Int.succ ei, ei1) vv1 acc,ei - else enlarge_to_right ~extend_right same_values ei new_vv acc - - let enlarge_to_left ~extend_left same_values bi new_vv acc = - if extend_left then - (* look for an interval ending just before i *) - let p_bi = Int.pred bi in - match concerned_intervals Int_Interv.fuzzy_order (p_bi,p_bi) acc - with [] -> acc,bi - | [(ba,ea) as a,vva] -> assert (Int.equal ea p_bi); - if same_values vva new_vv then - (remove a acc),ba - else acc,bi - | _ -> assert false - else acc, bi - - let handle_leftmost_itv ~extend_left same_values bi new_vv - ((bi1,_),vv1) acc = - if Int.lt bi1 bi - then (* Part of the previous binding remains - on the left-hand-side *) - if extend_left && same_values vv1 new_vv - then (* same value -> merge keys *) - acc,bi1 - else add (bi1, Int.pred bi) vv1 acc,bi - else enlarge_to_left ~extend_left same_values bi new_vv acc - - - let cleanup_overwritten_bindings - ?(extend_left=true) ?(extend_right=true) - same_values (bi,ei as i) new_vv m = - (* if not (extend_right && extend_left) then - Format.printf "left:%b right:%b@\n" extend_left extend_right; *) - let concerned_intervals = - concerned_intervals Int_Interv.fuzzy_order i m - in - let result = match concerned_intervals with - | [] -> - let acc,new_bi = - enlarge_to_left ~extend_left same_values bi new_vv m in - let acc,new_ei = - enlarge_to_right ~extend_right same_values ei new_vv acc in - Some(new_bi, new_ei, acc) - | [((bi1, ei1) as i1, vv1) as binding1] -> - let cond_start = Int.le bi1 bi in - let cond_end = Int.ge ei1 ei in - let cond_same = same_values vv1 new_vv in - if (cond_start && cond_end && cond_same && extend_right && extend_left) - then None (* nothing to do, the new interval is included in the - previous one and the old and new values are the same*) - else begin - let result1 = remove i1 m in - let result2,new_bi = - handle_leftmost_itv - same_values ~extend_left bi new_vv binding1 result1 - in - let result3,new_ei = - handle_rightmost_itv - ~extend_right - same_values ei new_vv binding1 result2 - in - Some(new_bi, new_ei, result3) - end - | ((_bi1, _ei1), _vv1 as binding1)::tail -> - let result1 = - List.fold_right - (fun (i1,_) acc -> remove i1 acc) - concerned_intervals - m - in - (* part of the last interval might remain on the right *) - let result2,new_ei = - handle_rightmost_itv - ~extend_right - same_values ei new_vv binding1 result1 - in - let rec f l acc = - match l with - | [] -> assert false - (* at least 2 elements in [concerned_intervals] *) - | [(_bi1, _ei1), _vv1 as binding1] -> - (* part of the first interval might remain on the left *) - handle_leftmost_itv ~extend_left - same_values bi new_vv binding1 acc - | ((_bi1, _ei1), _vv1)::tail -> - (* the middle intervals are completely covered : ignore - former values *) - f tail acc - in - let result3,new_bi = f tail result2 in - Some(new_bi, new_ei, result3) - in - (* if not (extend_right && extend_left) then - (match result with None -> Format.printf "Cleanup...NONE@\n" - | Some (new_bi,new_ei,_) -> - Format.printf "Cleanup...new_bi:%a new_ei:%a@\n" Int.pretty new_bi - Int.pretty new_ei);*) - result - - let remove_itv _fuzzy_order (start,stop as ss) to_ = - let concerned_intervals = - concerned_intervals Int_Interv.fuzzy_order ss to_ in - List.fold_left - (fun acc (bi,ei as i,vv) -> - let r = remove i acc in - let r = if Int.lt bi start then add (bi,Int.pred start) vv r - else r - in let r = if Int.gt ei stop then add (Int.succ stop,ei) vv r - else r - in r) - to_ concerned_intervals - - let shift offs m = - mapii (fun k v -> Int_Interv.shift offs k, v) m - -end - -(* -Local Variables: -compile-command: "make -C ../.." -End: -*) diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/int_Interv.ml frama-c-20150201+sodium+dfsg/src/memory_state/int_Interv.ml --- frama-c-20140301+neon+dfsg/src/memory_state/int_Interv.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/int_Interv.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,102 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -open Abstract_interp - -let fuzzy_order (b1, e1) (b2, e2) = - if Int.lt e1 b2 then Rangemap.Above - else if Int.lt e2 b1 then Rangemap.Below - else Rangemap.Match - -exception Cannot_compare_intervals - -include Datatype.Make -(struct - (* better to not use Datatype.Pair since we customize [compare] *) - type t = Int.t * Int.t - let structural_descr = - Structural_descr.t_tuple [| Int.packed_descr; Int.packed_descr |] - let name = "Int_Interv" - let reprs = - List.fold_left - (fun acc n1 -> - List.fold_left (fun acc n2 -> (n1, n2) :: acc) acc Int.reprs) - [] - Int.reprs - - let compare x y = match fuzzy_order x y with - | Rangemap.Above -> -1 - | Rangemap.Below -> 1 - | Rangemap.Match -> - if Int.equal (fst x) (fst y) && - Int.equal (snd x) (snd y) - then 0 - else begin - (*Format.printf "Comparaison d'intervalles non comparables [%a..%a] et [%a..%a]@\n@\n" - Int.pretty (fst x) Int.pretty (snd x) - Int.pretty (fst y) Int.pretty (snd y);*) - raise Cannot_compare_intervals - end - - let hash (x, y) = Int.hash x + 7 * Int.hash y - let equal (a,b) (c,d) = Int.equal a c && Int.equal b d - - let rehash = Datatype.identity - let copy = Datatype.undefined - let internal_pretty_code = Datatype.undefined - let pretty = Datatype.undefined - let mem_project = Datatype.never_any_project - let varname = Datatype.undefined - end) - -let shift s (b,e) = Int.add b s, Int.add e s - -exception Not_fully_included - -let check_coverage (bi,ei) concerned = - ( match concerned with - [] -> raise Not_fully_included - | ((_bj,ej),_) :: _ -> - if Int.gt ei ej then raise Not_fully_included); - let rec check_joint concerned = - match concerned with - [] -> assert false - | [(bj,_ej),_] -> - if Int.lt bi bj then raise Not_fully_included - | ((bj,_ej),_) :: ((((_bk,ek),_)::_) as tail) -> - if not (Int.equal bj (Int.succ ek)) then raise Not_fully_included; - check_joint tail - in - check_joint concerned - -let clip_itv (refb1,refe1) (b2,e2) = - assert (Int.le b2 refe1 && Int.ge e2 refb1); - (* the 2 is a concerned_interval of the ref *) - let min = Int.max refb1 b2 in - let max = Int.min refe1 e2 in - min,max - -(* -Local Variables: -compile-command: "make -C ../.." -End: -*) diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/int_Interv.mli frama-c-20150201+sodium+dfsg/src/memory_state/int_Interv.mli --- frama-c-20140301+neon+dfsg/src/memory_state/int_Interv.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/int_Interv.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -(** Intervals of integers. *) - -exception Cannot_compare_intervals - -include Datatype.S with type t = Integer.t * Integer.t - -(** Locates (b2, e2) with respect to (b1, e1). - Therefore the meaning of "Above" and "Below" may look as if it - is reversed, beware. *) -val fuzzy_order: t -> t -> Rangemap.fuzzy_order - -val shift: Integer.t -> t -> t -val clip_itv: t -> t -> t - -exception Not_fully_included -val check_coverage: t -> (t * 'a) list -> unit - - -(* -Local Variables: -compile-command: "make -C ../.." -End: -*) diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/lmap_bitwise.ml frama-c-20150201+sodium+dfsg/src/memory_state/lmap_bitwise.ml --- frama-c-20140301+neon+dfsg/src/memory_state/lmap_bitwise.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/lmap_bitwise.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,61 +20,68 @@ (* *) (**************************************************************************) -open Abstract_interp -open Lattice_Interval_Set open Locations exception Bitwise_cannot_copy module type Location_map_bitwise = sig - type y - include Datatype.S + type v + + type map + + type lmap = Top | Map of map | Bottom + + include Datatype.S with type t = lmap include Lattice_type.Bounded_Join_Semi_Lattice with type t := t include Lattice_type.With_Top with type t := t - module LOffset: sig - include Datatype.S - val map: ((bool * y) -> (bool * y)) -> t -> t - val fold : - (Int_Intervals.t -> bool * y -> 'a -> 'a) -> t -> 'a -> 'a - val fold_fuse_same : - (Int_Intervals.t -> bool * y -> 'a -> 'a) -> t -> 'a -> 'a - val join: t -> t -> t - val pretty_with_type: - Cil_types.typ option -> Format.formatter -> t -> unit - val collapse : t -> y - val empty : t - val degenerate: y -> t - val is_empty: t->bool - val add_iset : exact:bool -> Int_Intervals.t -> y -> t -> t - end + module LOffset : + module type of Offsetmap_bitwise_sig + with type v = v + and type intervals = Int_Intervals.t - val empty : t val is_empty : t -> bool val is_bottom : t -> bool + val empty : t + val empty_map: map val pretty_generic_printer: - y Pretty_utils.formatter -> string -> t Pretty_utils.formatter + ?pretty_v: v Pretty_utils.formatter -> + ?skip_v: (v -> bool) -> + sep:string -> + unit -> + t Pretty_utils.formatter + + val add_binding : reducing:bool -> exact:bool -> t -> Zone.t -> v -> t + val add_binding_loc: reducing:bool -> exact:bool -> t -> location -> v -> t + val add_base: Base.t -> LOffset.t -> t -> t - val add_binding : exact:bool -> t -> Zone.t -> y -> t - val map_and_merge : (y -> y) -> t -> t -> t + val find : t -> Zone.t -> v val filter_base : (Base.t -> bool) -> t -> t - val find : t -> Zone.t -> y - val find_base: t -> Zone.t -> LOffset.t - exception Cannot_fold + val map: (v -> v) -> t -> t - val uninitialize: Cil_types.varinfo list -> t -> t + val fold : (Zone.t -> v -> 'a -> 'a) -> map -> 'a -> 'a + val fold_base : (Base.t -> LOffset.t -> 'a -> 'a) -> map -> 'a -> 'a + val fold_fuse_same : (Zone.t -> v -> 'a -> 'a) -> map -> 'a -> 'a + + val fold_join_zone: + both:(Int_Intervals.t -> LOffset.t -> 'a) -> + conv:(Base.t -> 'a -> 'b) -> + empty_map:(Locations.Zone.t -> 'b) -> + join:('b -> 'b -> 'b) -> + empty:'b -> + Locations.Zone.t -> map -> 'b + + val map2: + Hptmap.cache_type -> idempotent:bool -> empty_neutral:bool -> + (LOffset.t -> LOffset.t -> LOffset.map2_decide) -> + (v -> v -> v) -> map -> map -> map - val fold : (Zone.t -> bool * y -> 'a -> 'a) -> t -> 'a -> 'a - val fold_base : (Base.t -> LOffset.t -> 'a -> 'a) -> t -> 'a -> 'a - val fold_fuse_same : (Zone.t -> bool * y -> 'a -> 'a) -> t -> 'a -> 'a - val map2 : ((bool * y) option -> (bool * y) option -> bool * y) - -> t -> t -> t - val copy_paste : - f:(bool * y -> bool * y) -> - location -> location -> t -> t + val shape: map -> LOffset.t Hptmap.Shape(Base.Base).t + + val imprecise_write_msg: string ref val clear_caches: unit -> unit end @@ -82,33 +89,94 @@ module type With_default = sig include Lattice_type.Bounded_Join_Semi_Lattice include Lattice_type.With_Top with type t := t - val default : Base.t -> Int.t -> Int.t -> t - val defaultall : Base.t -> t + include Lattice_type.With_Narrow with type t := t + val default: t end -module Make_bitwise (V:With_default) = struct +module Make_bitwise (V: With_default): Location_map_bitwise with type v = V.t = +struct module LOffset = struct - include Offsetmap_bitwise.Make(V) - let real_copy = copy + include Offsetmap.Make_bitwise(V) let copy = Datatype.undefined end + exception Invalid_base + + (* validity must not be invalid; otherwise, Invalid_base is raised. *) + let default_offsetmap_aux b validity = + let default () = + match Base.valid_range validity with + | None -> raise Invalid_base + | Some (ib, ie) -> + assert (Integer.(equal ib zero)); + LOffset.create ~size:(Integer.succ ie) V.default + in + if Base.equal Base.null b then + match validity with + | Base.Invalid -> raise Invalid_base + | Base.Known (ib, ie) | Base.Unknown (ib, _, ie) -> + if Integer.is_zero ib then + default () + else begin + (* NULL is special, because the validity may not start at 0. We must + bind the beginning of the interval to bottom. *) + assert (Integer.gt ib Integer.zero); + let to_bottom = LOffset.create ~size:(Integer.succ ie) V.bottom in + let range = Int_Intervals.inject_bounds ib ie in + match LOffset.add_binding_intervals + ~validity ~exact:true range V.default to_bottom + with + | `Bottom -> assert false + | `Map m -> m + end + else + default () + + let default_offsetmap b = default_offsetmap_aux b (Base.validity b) + module LBase = struct - include Hptmap.Make(Base)(LOffset)(Hptmap.Comp_unused)(struct let v = [[]] end)(struct let l = [ Ast.self ] end) + include Hptmap.Make(Base.Base)(LOffset)(Hptmap.Comp_unused)(struct let v = [[]] end)(struct let l = [ Ast.self ] end) let () = Ast.add_monotonic_state self - let find_or_default base m = - try find base m with Not_found -> LOffset.empty + + (* We override [add] so that the map is canonical: no key should be + bound to its default value. *) + let add b offsm m = + let is_default = + if Base.is_null b then + (* If we are binding something to NULL, NULL should not be invalid *) + let default = default_offsetmap Base.null in + LOffset.equal default offsm + else + let is_default v = V.equal v V.default in + LOffset.is_single_interval ~f:is_default offsm + in + if is_default then + remove b m + else + add b offsm m + end - let clear_caches = LBase.clear_caches - type tt = Top | Map of LBase.t | Bottom - type y = V.t + let clear_caches () = + LBase.clear_caches (); + LOffset.clear_caches (); + ;; + + type map = LBase.t + + let imprecise_write_msg = LOffset.imprecise_write_msg + + let find_or_default b m = + try LBase.find b m + with Not_found -> default_offsetmap b + + type lmap = Top | Map of LBase.t | Bottom + type v = V.t + let empty_map = LBase.empty let empty = Map LBase.empty let bottom = Bottom - exception Cannot_fold - let hash = function | Top -> 0 | Bottom -> 17 @@ -125,7 +193,7 @@ let top = Top - let pretty_generic_printer printer sep fmt m = + let pretty_generic_printer ?pretty_v ?skip_v ~sep () fmt m = match m with | Top -> Format.fprintf fmt "@[%sTOP@]" sep | Bottom -> Format.fprintf fmt "@[%sUNREACHABLE@]" sep @@ -133,17 +201,17 @@ let pp_one fmt (base, offs) = Format.fprintf fmt "@[%a@[%a@]@]" Base.pretty base - (LOffset.pretty_with_type_generic_printer - (Base.typeof base) printer sep) offs + (LOffset.pretty_generic + ?typ:(Base.typeof base) ?pretty_v ?skip_v ~sep ()) offs in Pretty_utils.pp_iter ~pre:"@[" ~sep:"@ " ~suf:"@]" (Extlib.iter_uncurry2 LBase.iter) pp_one fmt m - let pretty = pretty_generic_printer V.pretty "FROM" + let pretty = pretty_generic_printer ~sep:"FROM" () include Datatype.Make (struct - type t = tt + type t = lmap let reprs = Top :: List.map (fun b -> Map b) LBase.reprs let structural_descr = Structural_descr.t_sum [| [| LBase.packed_descr |] |] @@ -160,26 +228,18 @@ end) let fold f m acc = - match m with - | Top - | Bottom -> acc - | Map m -> - LBase.fold - (fun k offsetmap acc -> - LOffset.fold - (fun itvs v acc -> - let z = Zone.inject k itvs in - f z v acc) - offsetmap - acc) - m - acc + LBase.fold + (fun k offsetmap acc -> + LOffset.fold + (fun itvs v acc -> + let z = Zone.inject k itvs in + f z v acc) + offsetmap + acc) + m + acc - let fold_base f m acc= - match m with - | Bottom - | Top -> raise Cannot_fold - | Map m -> LBase.fold f m acc + let fold_base f m acc = LBase.fold f m acc let fold_fuse_same f m acc = let f' b offs acc = @@ -189,47 +249,55 @@ in fold_base f' m acc - let add_binding ~exact m (loc:Zone.t) v = + let for_writing_validity ~reducing b = + if not reducing && Base.is_read_only b + then Base.Invalid + else Base.validity b + + let add_binding ~reducing ~exact m (loc:Zone.t) v = + let aux_base_offset base offs m = + let validity = for_writing_validity ~reducing base in + try + let offsm = find_or_default base m in + match LOffset.add_binding_intervals ~validity ~exact offs v offsm with + | `Bottom -> m + | `Map new_offsetmap -> LBase.add base new_offsetmap m + with Invalid_base -> m + in match loc, m with | Zone.Top (Base.SetLattice.Top, _),_|_,Top -> Top - | Zone.Top (Base.SetLattice.Set s, _), Map m -> - let result = - let treat_base base acc = - let offsetmap_orig = - try - LBase.find base m - with Not_found -> - LOffset.empty - in - let new_offsetmap = - LOffset.add_iset ~exact Int_Intervals.top v offsetmap_orig - in - LBase.add base new_offsetmap acc - in - Base.Hptset.fold treat_base s (treat_base Base.null m) - in Map result - | Zone.Map _, Map m -> - let result = - let treat_offset varid offs m = - let offsetmap_orig = - try - LBase.find varid m - with Not_found -> - LOffset.empty - in - let new_offsetmap = - LOffset.add_iset ~exact offs v offsetmap_orig - in LBase.add varid new_offsetmap m - in - Zone.fold_i treat_offset loc m - in Map result - | _, Bottom -> assert false + | _, Bottom -> Bottom + | _, Map m -> Map (Zone.fold_topset_ok aux_base_offset loc m) + + let add_binding_loc ~reducing ~exact m loc v = + let aux_base_offset base offs m = + let validity = for_writing_validity ~reducing base in + try + let offsm = find_or_default base m in + let new_offsetmap = + LOffset.add_binding_ival ~validity ~exact offs ~size:loc.size v offsm + in + match new_offsetmap with + | `Bottom -> m + | `Map new_offsetmap -> LBase.add base new_offsetmap m + with Invalid_base -> m + in + match loc.loc, m with + | Location_Bits.Top (Base.SetLattice.Top, _),_|_,Top -> Top + | _, Bottom -> Bottom + | _, Map m -> + Map (Location_Bits.fold_topset_ok aux_base_offset loc.loc m) + + let add_base b offsm = function + | Bottom | Top as m -> m + | Map m -> Map (LBase.add b offsm m) let join_on_map = - let decide_none _ m = LOffset.joindefault m in + let decide_none b m = LOffset.join m (default_offsetmap b) in let decide_some = LOffset.join in LBase.symmetric_merge - ~cache:("lmap_bitwise.join", ()) ~decide_none ~decide_some + ~cache:("lmap_bitwise.join", ()) + ~empty_neutral:false ~decide_none ~decide_some let join m1 m2 = let result = match m1, m2 with @@ -243,30 +311,32 @@ pretty result;*) result + let map f = function + | Top -> Top + | Bottom -> Bottom + | Map m -> Map (LBase.map (fun m -> LOffset.map f m) m) - let map2_on_map f = - let decide _b om1 om2 = match om1, om2 with + let map2 cache ~idempotent ~empty_neutral fv f = + let aux = LOffset.map2 cache fv f in + let decide b om1 om2 = match om1, om2 with | None, None -> assert false (* decide is never called in this case *) - | Some m1, None -> LOffset.map (fun x -> f (Some x) None) m1 - | None, Some m2 -> LOffset.map (fun x -> f None (Some x)) m2 - | Some m1, Some m2 -> LOffset.map2 f m1 m2 + | Some m1, None -> aux m1 (default_offsetmap b) + | None, Some m2 -> aux (default_offsetmap b) m2 + | Some m1, Some m2 -> aux m1 m2 in - LBase.generic_merge ~cache:("", false) ~idempotent:false ~decide - - let map2 f m1 m2 = - match m1, m2 with - | Top, _ | _, Top -> Top - | Bottom, Bottom -> Bottom - | Map m1, Map m2 -> Map (map2_on_map f m1 m2) - | Bottom, Map m -> Map (map2_on_map f LBase.empty m) - | Map m, Bottom -> Map (map2_on_map f m LBase.empty) + let cache = match cache with + | Hptmap.PersistentCache _ -> true + | Hptmap.NoCache -> false + | Hptmap.TemporaryCache _ (* not possible with generic_merge *) -> false + in + LBase.generic_merge ~idempotent ~empty_neutral ~cache:("", cache) ~decide let is_included_map = let name = Pretty_utils.sfprintf "Lmap_bitwise(%s).is_included" V.name in - let decide_fst _b offs1 = LOffset.is_included offs1 LOffset.empty in - let decide_snd _b offs2 = LOffset.is_included LOffset.empty offs2 in + let decide_fst b offs1 = LOffset.is_included offs1 (default_offsetmap b) in + let decide_snd b offs2 = LOffset.is_included (default_offsetmap b) offs2 in let decide_both _ offs1 offs2 = LOffset.is_included offs1 offs2 in - LBase.binary_predicate (LBase.PersistentCache name) LBase.UniversalPredicate + LBase.binary_predicate (Hptmap.PersistentCache name) LBase.UniversalPredicate ~decide_fast:LBase.decide_fast_inclusion ~decide_fst ~decide_snd ~decide_both @@ -287,26 +357,6 @@ let m = join_on_map mm1 mm2 in if LBase.equal m mm2 then m2, true else Map m, false - - let map_and_merge_on_map f = - let decide _b om1 om2 = match om1, om2 with - | None, None -> assert false (* decide is never called in this case *) - | Some m1, None -> LOffset.map (fun (b, v) -> b, f v) m1 - | None, Some m2 -> m2 - | Some m1, Some m2 -> LOffset.map_and_merge f m1 m2 - in - LBase.generic_merge - ~cache:("lmap_bitwise.map_and_merge", false) ~idempotent:false ~decide - - let map_and_merge f (m_1:t) (m_2:t) = - match m_1,m_2 with - | Top,_ | _, Top -> Top - | Bottom, Bottom -> Bottom - | Bottom, Map _ -> m_2 - | Map m, Bottom -> Map (map_and_merge_on_map f m LBase.empty) - | Map m1, Map m2 -> Map (map_and_merge_on_map f m1 m2) - - let filter_base f m = match m with | Top -> Top @@ -319,232 +369,34 @@ in Map result - let uninitialize locals m = - match m with - | Top -> Top - | Bottom -> Bottom - | Map m -> - let result = - List.fold_left - (fun acc v -> - let base = Base.of_varinfo v in - let (i1,i2) = - match Base.validity base with - | Base.Invalid -> assert false (* map should be empty *) - | Base.Periodic(i1, _, p) -> - assert (Int.is_zero i1); - i1, Int.pred p - | Base.Unknown (i1,_,i2) | Base.Known(i1,i2) -> (i1,i2) - in - if Int.lt i2 i1 then assert false (* not supposed to happen - for a local *) - else - let offset = LOffset.add (i1,i2) V.bottom LOffset.empty - in LBase.add base offset acc) - m locals - in Map result - - - let find_base m loc = - match loc, m with - | Zone.Top _, _ | _, (Top | Bottom) -> LOffset.empty - | Zone.Map _, Map m -> - let treat_offset varid offs acc = - let default = V.default varid in - let offsetmap = - try - LBase.find varid m - with Not_found -> LOffset.empty - in - LOffset.add_iset ~exact:true - offs - (LOffset.find_iset default (V.defaultall varid) offs offsetmap) - acc - in Zone.fold_i treat_offset loc LOffset.empty - let find m loc = match loc, m with | Zone.Top _, _ | _, Top -> V.top | _, Bottom -> V.bottom | Zone.Map _, Map m -> - let treat_offset varid offs acc = - let default = V.default varid in - let offsetmap = - try - LBase.find varid m - with Not_found -> - LOffset.empty - in - V.join - (LOffset.find_iset default (V.defaultall varid) offs offsetmap) - acc + let treat_offset base itvs acc = + let validity = Base.validity base in + if validity = Base.Invalid then acc + else + let offsetmap = find_or_default base m in + let v = LOffset.find_iset ~validity itvs offsetmap in + V.join acc v in Zone.fold_i treat_offset loc V.bottom - let copy_offsetmap ~f src_loc m = - let result = - begin - begin - try - let size = Int_Base.project src_loc.size in - begin - let treat_src k_src i_src (acc : LOffset.t option) = - let validity = Base.validity k_src in - try - let offsetmap_src = LBase.find_or_default k_src m in -(* Format.printf - "copy_offsetmap/treat_src k_src:%a i_src:%a@\n" - Base.pretty k_src - Ival.pretty i_src;*) - ignore (Ival.cardinal_less_than i_src 100); - Ival.fold_int - (fun start acc -> - let stop = Int.pred (Int.add start size) in - match validity with - | Base.Periodic _ -> - raise Bitwise_cannot_copy - | Base.Invalid -> acc - | (Base.Known (b,e) | Base.Unknown (b,_,e)) when Int.lt start b - || Int.gt stop e -> - acc - | Base.Known _ | Base.Unknown _ -> - let default = V.default k_src in - let copy = - LOffset.real_copy ~f:(Some (f, default)) - offsetmap_src start stop - in - let r = match acc with - | None -> Some copy - | Some acc -> let r = LOffset.join copy acc in - if LOffset.is_empty r then - raise Not_found; - Some r - in r) - i_src - acc - with - | Not_found (* from [LOffset.is_empty] *) - -> - (*CilE.warn_once "reading top in @[%a@]. Look above for origin." - Location_Bits.pretty src_loc.loc;*) - Some LOffset.empty - | Not_less_than (* from [Ival.cardinal_less_than] *)-> - (*ignore (CilE.warn_once "approximating lval assignment");*) - raise Bitwise_cannot_copy - in - try - Extlib.the (Location_Bits.fold_i treat_src src_loc.loc None) - with Location_Bits.Error_Top -> - (*CilE.warn_once "reading unknown location(2)@ @[%a@]" - Location_Bits.pretty src_loc.loc;*) - LOffset.empty - end - with - | Location_Bits.Error_Top (* from Location_Bits.fold *) - | Not_less_than (* from Ival.cardinal_less_than *) - | Int_Base.Error_Top (* from Int_Base.project *) - | Ival.Error_Top (* from Ival.fold_int *) -> - LOffset.empty - - end - end - in -(* Format.printf "copy_offsetmap: m:%a src:%a result:%a@\n" - pretty m - Locations.pretty src_loc - pretty result;*) - result - - - let paste_offsetmap map_to_copy dst_loc start size m = - let dst_is_exact = - Locations.valid_cardinal_zero_or_one ~for_writing:true - (Locations.make_loc dst_loc (Int_Base.inject size)) - in - let stop = Int.pred (Int.add start size) in - let had_non_bottom = ref false in - let plevel = !Lattice_Interval_Set.plevel in - let treat_dst k_dst i_dst (acc_lmap : LBase.t) = - if Base.is_read_only k_dst - then acc_lmap - else - let validity = Base.validity k_dst in - let offsetmap_dst = LBase.find_or_default k_dst m in - let new_offsetmap = - try - ignore - (Ival.cardinal_less_than i_dst plevel); - Ival.fold_int - (fun start_to acc -> - let stop_to = Int.pred (Int.add start_to size) in - match validity with - | Base.Periodic _ -> - raise Bitwise_cannot_copy - | Base.Known (b,e) | Base.Unknown (b,_,e) - when Int.lt start_to b || Int.gt stop_to e -> - acc - | Base.Invalid -> - acc - | Base.Known _ | Base.Unknown _ -> - had_non_bottom := true; - (if dst_is_exact - then LOffset.copy_paste ~f:None - else LOffset.copy_merge) - map_to_copy - start - stop - start_to - acc) - i_dst - offsetmap_dst - with Not_less_than -> - raise Bitwise_cannot_copy - in - LBase.add k_dst new_offsetmap acc_lmap - in - try - let result = Location_Bits.fold_i treat_dst dst_loc m in - if !had_non_bottom then result - else begin - Kernel.warning ~once:true ~current:true - "all target addresses were invalid. This path is assumed to be dead."; - assert false - end - with Location_Bits.Error_Top -> (* from Location_Bits.fold_i *) - raise Bitwise_cannot_copy - + let fold_join_zone ~both ~conv ~empty_map ~join ~empty = + let cache = Hptmap.PersistentCache "Lmap_bitwise.fold_on_zone" in + let empty_left _ = empty (* zone over which to fold is empty *) in + let empty_right z = empty_map z in + let both b itvs map_b = conv b (both itvs map_b) in + let fmap = + Zone.fold2_join_heterogeneous + ~cache ~empty_left ~empty_right ~both ~join ~empty + in + fun z m -> fmap z (LBase.shape m) - let copy_paste_map ~f src_loc dst_loc mm = - assert (Int_Base.equal src_loc.size dst_loc.size ); -(* temporary fix *) - if not (Locations.is_valid ~for_writing:false src_loc - && Locations.is_valid ~for_writing:true dst_loc) - then raise Bitwise_cannot_copy; - - try - let size = Int_Base.project src_loc.size in - let result = - copy_offsetmap ~f src_loc mm - in - paste_offsetmap result dst_loc.loc Int.zero size mm - with - | Int_Base.Error_Top (* from Int_Base.project *) -> - raise Bitwise_cannot_copy - - let copy_paste ~f src_loc dst_loc mm = - let res = - match mm with - | Top -> Top - | Bottom -> Bottom - | Map mm -> Map (copy_paste_map ~f src_loc dst_loc mm) - in -(* Format.printf "Lmap.copy_paste orig: %a from src:%a to dst:%a result:%a@\n" - pretty mm - Locations.pretty src_loc - Locations.pretty dst_loc - pretty res;*) - res + let shape = LBase.shape end diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/lmap_bitwise.mli frama-c-20150201+sodium+dfsg/src/memory_state/lmap_bitwise.mli --- frama-c-20140301+neon+dfsg/src/memory_state/lmap_bitwise.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/lmap_bitwise.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -23,105 +23,132 @@ (** Functors making map indexed by zone. @plugin development guide *) -open Abstract_interp -open Lattice_Interval_Set open Locations exception Bitwise_cannot_copy module type Location_map_bitwise = sig - type y + type v - include Datatype.S + type map + + type lmap = Top | Map of map | Bottom + + include Datatype.S with type t = lmap include Lattice_type.Bounded_Join_Semi_Lattice with type t := t include Lattice_type.With_Top with type t := t - module LOffset : sig - include Datatype.S - val map: ((bool * y) -> (bool * y)) -> t -> t - val fold : - (Int_Intervals.t -> bool * y -> 'a -> 'a) -> t -> 'a -> 'a - val fold_fuse_same : - (Int_Intervals.t -> bool * y -> 'a -> 'a) -> t -> 'a -> 'a - val join: t -> t -> t - val pretty_with_type: - Cil_types.typ option-> Format.formatter -> t -> unit - val collapse : t -> y - val empty : t - val degenerate: y -> t - val is_empty: t->bool - val add_iset : exact:bool -> Int_Intervals.t -> y -> t -> t - end + module LOffset : + module type of Offsetmap_bitwise_sig + with type v = v + and type intervals = Int_Intervals.t - val empty : t val is_empty : t -> bool val is_bottom : t -> bool + val empty : t + val empty_map: map val pretty_generic_printer: - y Pretty_utils.formatter -> string -> t Pretty_utils.formatter - - val add_binding : exact:bool -> t -> Zone.t -> y -> t + ?pretty_v: v Pretty_utils.formatter -> + ?skip_v: (v -> bool) -> + sep:string -> + unit -> + t Pretty_utils.formatter + + val add_binding : reducing:bool -> exact:bool -> t -> Zone.t -> v -> t + val add_binding_loc: reducing:bool -> exact:bool -> t -> location -> v -> t + val add_base: Base.t -> LOffset.t -> t -> t - val map_and_merge : (y -> y) -> t -> t -> t - (** [map_and_merge f m1 m2] maps [f] on values in [m1] and [add_exact] - all elements of the mapped [m1] to [m2] *) + val find : t -> Zone.t -> v val filter_base : (Base.t -> bool) -> t -> t - val find : t -> Zone.t -> y - val find_base: t -> Zone.t -> LOffset.t - exception Cannot_fold - val uninitialize: Cil_types.varinfo list -> t -> t - (** binds the given variables to bottom, keeps the other unchanged. *) + (** {2 Iterators} *) + + val map: (v -> v) -> t -> t - val fold : (Zone.t -> bool * y -> 'a -> 'a) -> t -> 'a -> 'a - (** [fold f m] folds a function [f] on bindings in [m]. Each binding - associates to a zone a boolean representing the possibility that the - zone was not modified, and a value of type y. May raise - [Cannot_fold]. *) - val fold_base : (Base.t -> LOffset.t -> 'a -> 'a) -> t -> 'a -> 'a - - val fold_fuse_same : (Zone.t -> bool * y -> 'a -> 'a) -> t -> 'a -> 'a - (** Same behavior as [fold], except if two disjoint ranges [r1] and [r2] of - a given base are mapped to the same value and boolean. In this - case, [fold] will call its argument [f] on [r1], then on [r2]. - [fold_fuse_same] will call it directly on [r1 U r2], where U - is the join on sets of intervals. - - May raise [Cannot_fold]. - *) - - - val map2 : ((bool * y) option -> (bool * y) option -> bool * y) - -> t -> t -> t - (** like for [fold], the boolean in [bool * y] indicates if it is possible - that the zone was not modified *) - - val copy_paste : - f:(bool * y -> bool * y) -> - location -> location -> t -> t - (** This function takes a function [f] to be applied to each bit of - the read slice. Otherwise, it has the same specification as - [copy_paste] for [Location_map.copy_paste]. It may raise - [Bitwise_cannot_copy]. - Precondition : the two locations must have the same size *) + (** The following fold_* functions, as well as {!map2} take arguments + of type [map] to force their user to handle the cases Top and Bottom + explicitly. *) + val fold: (Zone.t -> v -> 'a -> 'a) -> map -> 'a -> 'a + (** [fold f m] folds a function [f] on the bindings in [m]. Contiguous + bits with the same value are merged into a single zone. Different bases + are presented in different zones. *) + + val fold_base : (Base.t -> LOffset.t -> 'a -> 'a) -> map -> 'a -> 'a + + val fold_fuse_same : (Zone.t -> v -> 'a -> 'a) -> map -> 'a -> 'a + (** Same behavior as [fold], except if two non-contiguous ranges [r1] and + [r2] of a given base are mapped to the same value. + [fold] will call its argument [f] on each range successively + (hence, in our example, on [r1] and [r2] separately). + Conversely, [fold_fuse_same] will call [f] directly on [r1 U r2], + U being the join on sets of intervals. *) + + val fold_join_zone: + both:(Int_Intervals.t -> LOffset.t -> 'a) -> + conv:(Base.t -> 'a -> 'b) -> + empty_map:(Locations.Zone.t -> 'b) -> + join:('b -> 'b -> 'b) -> + empty:'b -> + Locations.Zone.t -> map -> 'b + (** [fold_join_zone ~both ~conv ~empty_map ~join ~empty z m] folds over the + intervals present in [z]. When a base [b] is present in both [z] and [m], + and bound respectively to [itvs] and [mb], [both itvs mb] is called. + The results obtained for this base [b] are then converted using [conv]. + If a sub-zone [z'] is present in [z], but the corresponding bases are + not bound in [m], [empty_map z'] is called. All the sub-results (of type) + ['b] are joined using [join]. [empty] is used when an empty map or + sub-zone is encountered. It must be a neutral element for [join]. + + This function internally uses a cache, and {b must} be partially applied + to its named arguments. (This explains the somewhat contrived interface, + in particular the fact that [both] and [conv] are not fused.) *) + + val map2: + Hptmap.cache_type -> idempotent:bool -> empty_neutral: bool -> + (LOffset.t -> LOffset.t -> LOffset.map2_decide) -> + (v -> v -> v) -> map -> map -> map + (** 'map'-like function between two interval maps, implemented as a + simultaneous descent in both maps. + [map2 cache ~idempotent ~empty_neutral decide_fast f m1 m2] computes the + map containing [k |-> f v_1 v_2] for all the keys [k] present in either + [m1] or [m2]. When a key is present, [v_i] is the corresponding value in + the map. When it is missing in one of the maps, a default value is + generated. (See argument [default] to functor {!Make_bitwise} below.) + + [idempotent], [empty_neutral] and [decide_fast] are present for + optimisation purposes, to avoid visiting some trees. If [idempotent] + holds, [f v v = v] must also holds. Similarly, if [empty_neutral] holds, + [f v default = f default v = v] must hold. [decide_fast] is called before + visiting two subtrees, and can be used to stop the recursion early. See + the documentation of {!Offsetmap_sig.map2_decide}. + + Depending on the value of [cache], the results of this function will be + cached. *) + + (** {2 Misc} *) + + val shape: map -> LOffset.t Hptmap.Shape(Base.Base).t + + val imprecise_write_msg: string ref (** Clear the caches local to this module. Beware that they are not project-aware, and that you must call them at every project switch. *) val clear_caches: unit -> unit + end -(** Lattice with default values on a range or on an entire base. *) module type With_default = sig include Lattice_type.Bounded_Join_Semi_Lattice include Lattice_type.With_Top with type t := t - val default : Base.t -> Int.t -> Int.t -> t - val defaultall : Base.t -> t + include Lattice_type.With_Narrow with type t := t + val default: t end -module Make_bitwise(V : With_default) : Location_map_bitwise with type y = V.t +module Make_bitwise(V : With_default) : Location_map_bitwise with type v = V.t (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/lmap.ml frama-c-20150201+sodium+dfsg/src/memory_state/lmap.ml --- frama-c-20140301+neon+dfsg/src/memory_state/lmap.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/lmap.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -22,20 +22,22 @@ open Abstract_interp open Locations -open CilE - module Make_LOffset (V: module type of Offsetmap_lattice_with_isotropy) (Offsetmap: module type of Offsetmap_sig with type v = V.t and type widen_hint = V.widen_hint) - (Default_offsetmap: sig val default_offsetmap : Base.t -> Offsetmap.t end) + (Default_offsetmap: sig + val default_offsetmap : Base.t -> [`Bottom | `Map of Offsetmap.t] + val is_default_offsetmap: Base.t -> Offsetmap.t -> bool + end) = struct type v = V.t type offsetmap = Offsetmap.t + type offsetmap_top_bottom = [ `Map of offsetmap | `Bottom | `Top ] type widen_hint_base = V.widen_hint open Default_offsetmap @@ -63,21 +65,22 @@ let add b v m = - if Offsetmap.equal v (default_offsetmap b) then - remove b m + if Default_offsetmap.is_default_offsetmap b v + then remove b m else add b v m let find_or_default b map = - try find b map + try `Map (find b map) with Not_found -> default_offsetmap b end + type map = LBase.t + let shape = LBase.shape let clear_caches = LBase.clear_caches - exception Found_prefix = LBase.Found_prefix - type tt = + type lmap = | Bottom | Top | Map of LBase.t @@ -127,13 +130,13 @@ (fun fmt (base, offs) -> let typ = Base.typeof base in Format.fprintf fmt "@[%a@[%a@]@]" Base.pretty base - (Offsetmap.pretty_typ typ) offs) + (Offsetmap.pretty_generic ?typ ()) offs) fmt m | Top -> Format.fprintf fmt "@[NO INFORMATION@]" include Datatype.Make_with_collections (struct - type t = tt + type t = lmap let structural_descr = Structural_descr.t_sum [| [| LBase.packed_descr |] |] let name = Offsetmap.name ^ " lmap" @@ -154,23 +157,21 @@ let bottom = Bottom let is_top x = equal top x - exception Error_Bottom - let add_base base offsetmap acc = match acc with | Map acc -> Map (LBase.add base offsetmap acc) - | Bottom -> raise Error_Bottom + | Bottom -> Bottom | Top -> Top let is_empty_map = function - Bottom -> assert false - | Top -> assert false + | Bottom -> false + | Top -> false | Map m -> LBase.is_empty m let filter_base f m = match m with Top -> Top - | Bottom -> assert false + | Bottom -> Bottom | Map m -> Map (LBase.fold @@ -183,17 +184,23 @@ | Bottom -> Bottom | Map m -> Map (LBase.inter_with_shape shape m) - let find_base (vi:LBase.key) (m:t) = - match m with - | Bottom -> raise Not_found - | Map m -> LBase.find vi m - | Top -> Offsetmap.empty + let find_base b mem = + match mem with + | Bottom -> `Bottom + | Top -> `Top + | Map m -> `Map (LBase.find b m) + + let find_base_or_default b mem = + match mem with + | Bottom -> `Bottom + | Top -> `Top + | Map m -> (LBase.find_or_default b m :> offsetmap_top_bottom) let remove_base (vi:LBase.key) (m:t) = match m with | Bottom -> m | Map m -> Map (LBase.remove vi m) - | Top -> assert false + | Top -> Top let is_reachable t = match t with @@ -201,7 +208,7 @@ | Top | Map _ -> true let all_bottom m = - let f v _ = + let f v = if not (V.equal V.bottom v) then raise Exit in try Offsetmap.iter_on_values f m; true @@ -216,12 +223,16 @@ | Map m -> let first = ref true in let filter base _itvs () = - let offsm = LBase.find_or_default base m in - if not (all_bottom offsm) - then begin - if !first then first := false else Format.fprintf fmt "@ "; - Format.fprintf fmt "@[%a%a@]" - Base.pretty base (Offsetmap.pretty_typ (Base.typeof base)) offsm + match LBase.find_or_default base m with + | `Bottom -> () + | `Map offsm -> + if not (all_bottom offsm) + then begin + if !first then first := false else Format.fprintf fmt "@ "; + let typ = Base.typeof base in + Format.fprintf fmt "@[%a%a@]" + Base.pretty base + (Offsetmap.pretty_generic ?typ ()) offsm end in match zfilter with @@ -241,31 +252,6 @@ else Base.validity b - let add_binding_offsetmap ~with_alarms ~reducing ~exact varid offsets size v map = - let validity = for_writing_validity ~reducing varid in - if validity = Base.Invalid then raise Offsetmap.Result_is_bottom; - match size with - | Int_Base.Top -> - let offsm = LBase.find_or_default varid map in - let orig = Origin.current Origin.K_Arith in - let new_offsm = - Offsetmap.update_imprecise_everywhere ~validity orig v offsm - in - if offsm == new_offsm then map - else LBase.add varid new_offsm map - - | Int_Base.Value size -> - assert (Int.gt size Int.zero); - let offsetmap_orig = LBase.find_or_default varid map in - (*Format.printf "add_binding_offsetmap varid:%a offset:%a@\n" - Base.pretty varid Ival.pretty offsets;*) - let new_offsetmap = - Offsetmap.update ~with_alarms ~validity - ~exact ~offsets ~size v offsetmap_orig - in - if offsetmap_orig == new_offsetmap then map - else LBase.add varid new_offsetmap map - let add_new_base base ~size v ~size_v state = match state with | Bottom -> state @@ -273,112 +259,73 @@ | Map mem -> Map (LBase.add base (Offsetmap.create ~size v ~size_v) mem) - let add_binding ~with_alarms ~reducing ~exact initial_mem {loc=loc ; size=size } v = + let add_binding ~reducing ~exact initial_mem ({loc; size} as lloc) v = (*Format.printf "add_binding: loc:%a@\n" Location_Bits.pretty loc;*) - if V.equal v V.bottom then Bottom else + if V.equal v V.bottom then false, Bottom + else match initial_mem with - | Top -> Top - | Bottom -> Bottom - | Map mem -> - let result = - (match loc with - | Location_Bits.Top (Base.SetLattice.Top, orig) -> - CilE.do_warn with_alarms.imprecision_tracing - (fun _ -> - Kernel.warning ~current:true ~once:true - "writing at a completely unknown address @[%a@]@\n\ - Aborting." Origin.pretty_as_reason orig - ); - warn_mem_write with_alarms; - (* Format.printf "dumping memory : %a@\n" pretty initial_mem;*) - top (* the map where every location maps to top *) - | Location_Bits.Top (Base.SetLattice.Set set, origin) -> - (* Always emit an alarm, we emit out-of-bounds anyway *) - warn_mem_write with_alarms; - let had_non_bottom = ref false in - let treat_base b acc = - let validity = for_writing_validity ~reducing b in - match validity with - | Base.Invalid -> acc - | Base.Unknown _ | Base.Known _ | Base.Periodic _ -> - let offsm = LBase.find_or_default b mem in - try - let offsetmap = - Offsetmap.update_imprecise_everywhere - ~validity origin v offsm - in - had_non_bottom := true; - LBase.add b offsetmap acc - with Offsetmap.Result_is_bottom -> acc - in - let result = - let after_null = treat_base Base.null mem in - let r = Base.Hptset.fold treat_base set after_null in - if !had_non_bottom then Map r else bottom - in - (* Format.printf "debugging add_binding topset, loc =%a, result=%a@." - Location_Bits.pretty loc - pretty result; *) - result - | Location_Bits.Map loc_map -> - (* Format.printf "add_binding size:%a@\n" - Int_Base.pretty size;*) - let had_non_bottom = ref false in - let result = Location_Bits.M.fold - (fun varid offsets map -> - try - let r = - add_binding_offsetmap - ~with_alarms - ~reducing - ~exact - varid - offsets - size - v - map - in - had_non_bottom := true; - r - with Offsetmap.Result_is_bottom -> - CilE.warn_mem_write with_alarms; - map) - loc_map - mem - in - if !had_non_bottom - then Map result - else begin - (do_warn with_alarms.imprecision_tracing - (* another field would be appropriate here TODO *) - (fun _ -> Kernel.warning ~current:true ~once:true - "all target addresses were invalid. This path is \ -assumed to be dead.")); - bottom - end) - in - result - - let find_base_or_default base mem = - match mem with - Map mem -> LBase.find_or_default base mem - | Top -> Offsetmap.empty - | Bottom -> assert false + | Top -> (Locations.is_valid ~for_writing:true lloc), Top + | Bottom -> false, Bottom + | Map mem -> begin + let alarm = ref false in + let had_non_bottom = ref false in + let result = ref mem in + let aux origin b offsets = + let validity = for_writing_validity ~reducing b in + match LBase.find_or_default b mem with + | `Bottom -> alarm := true + | `Map offm -> + let offm' = + match size with + | Int_Base.Top -> + let orig = Origin.current Origin.K_Arith in + alarm := true; + Offsetmap.update_imprecise_everywhere ~validity orig v offm + | Int_Base.Value size -> + assert (Int.gt size Int.zero); + let this_alarm, r = + Offsetmap.update ?origin ~validity ~exact ~offsets ~size v offm + in + if this_alarm then alarm := true; + r + in + match offm' with + | `Bottom -> () + | `Map offm' -> + had_non_bottom := true; + if offm != offm' then result := LBase.add b offm' !result + in + match loc with + | Location_Bits.Top (Base.SetLattice.Top, orig) -> + Kernel.warning ~current:true ~once:true + "writing at a completely unknown address @[%a@]@\n\ + Aborting." Origin.pretty_as_reason orig; + true, top (* the map where every location maps to top *) + | Location_Bits.Top (Base.SetLattice.Set set, origin) -> + Base.Hptset.iter (fun b -> aux (Some origin) b Ival.top) set; + true, (if !had_non_bottom then Map !result else bottom) + | Location_Bits.Map loc_map -> + Location_Bits.M.iter (fun b off -> aux None b off) loc_map; + if !had_non_bottom then (!alarm, Map !result) else (true, bottom) + end - let find ~with_alarms ~conflate_bottom mem { loc = loc ; size = size } = - let result = + let find ?(conflate_bottom=true) mem ({loc ; size} as lloc) = match mem with - | Bottom -> V.bottom - | Top | Map _ -> - let handle_imprecise_base base acc = + | Bottom -> false, V.bottom + | Top -> (Locations.is_valid ~for_writing:true lloc), V.top + | Map mem -> + let alarm = ref false in + let handle_imprecise_base base acc = + alarm := true; + match LBase.find_or_default base mem with + | `Bottom -> acc + | `Map offsetmap -> let validity = Base.validity base in - CilE.warn_mem_read with_alarms; - let offsetmap = find_base_or_default base mem in let new_v = Offsetmap.find_imprecise ~validity offsetmap in V.join new_v acc - in - begin match loc with - | Location_Bits.Top (topparam,_orig) -> + in + let v = match loc with + | Location_Bits.Top (topparam,_orig) -> begin try Base.SetLattice.fold handle_imprecise_base @@ -398,38 +345,35 @@ with Base.SetLattice.Error_Top -> V.top end | Int_Base.Value size -> - Location_Bits.M.fold - (fun base offsets acc -> - let validity = Base.validity base in - let offsetmap = find_base_or_default base mem in - (*Format.printf "offsetmap(%a):%a@\noffsets:%a@\nsize:%a@\n" - Base.pretty base - (Offsetmap.pretty None) offsetmap - Ival.pretty offsets - Int.pretty size;*) - let new_v = - Offsetmap.find - ~conflate_bottom - ~validity - ~with_alarms - ~offsets - ~size - offsetmap - in - (* Format.printf "find got:%a@\n" V.pretty new_v; *) - V.join new_v acc) - loc_map - V.bottom + let aux_base base offsets acc_v = + let validity = Base.validity base in + match LBase.find_or_default base mem with + | `Bottom -> + alarm := true; + acc_v + | `Map offsetmap -> + let alarm_o, new_v = + Offsetmap.find + ~conflate_bottom ~validity ~offsets ~size offsetmap + in + if alarm_o then alarm := true; + V.join new_v acc_v + in + Location_Bits.M.fold aux_base loc_map V.bottom end - end - in - result + in + !alarm, v let join_internal = - let decide_none base v1 = Offsetmap.join v1 (default_offsetmap base) in + let decide_none base v = + match default_offsetmap base with + | `Bottom -> v + | `Map v' -> Offsetmap.join v v' + in let decide_some v1 v2 = Offsetmap.join v1 v2 in let symmetric_merge = - LBase.symmetric_merge ~cache:("lmap", ()) ~decide_none ~decide_some + LBase.symmetric_merge ~cache:("lmap", ()) + ~empty_neutral:false ~decide_none ~decide_some in fun m1 m2 -> Map (symmetric_merge m1 m2) @@ -449,23 +393,30 @@ | Some m, None -> let typ = Base.typeof base in Format.fprintf fmt "@[L %a@[%a@]@]@ " - Base.pretty base (Offsetmap.pretty_typ typ) m + Base.pretty base (Offsetmap.pretty_generic ?typ ()) m | None, Some m -> let typ = Base.typeof base in Format.fprintf fmt "@[R %a@[%a@]@]@ " - Base.pretty base (Offsetmap.pretty_typ typ) m + Base.pretty base (Offsetmap.pretty_generic ?typ ()) m | Some m1, Some m2 -> if not (Offsetmap.equal m1 m2) then let typ = Base.typeof base in - let pp = Offsetmap.pretty_typ typ in + let pp = Offsetmap.pretty_generic ?typ () in Format.fprintf fmt "@[%a @[L@[%a@]@,R@[%a@]@]@]@ " Base.pretty base pp m1 pp m2 in (* The diff is implemented by performing a merge on the two offsetmaps. We _must not_ cache the result, as we are interested only in the side effects. *) - let decide b m1 m2 = print b m1 m2; Offsetmap.empty in - let aux = LBase.generic_merge ~idempotent:true ~cache:("", false) ~decide in + let decide b m1 m2 = + print b m1 m2; + (match m1, m2 with (* We need something to return *) + | Some m, _ | _, Some m -> m + | None, None -> assert false (* generic_merge invariant *)) + in + let aux = LBase.generic_merge + ~idempotent:true ~empty_neutral:false ~cache:("", false) ~decide + in Format.fprintf fmt "@["; ignore (aux m1 m2); Format.fprintf fmt "@]" @@ -483,10 +434,14 @@ let is_included = let name = Pretty_utils.sfprintf "Lmap(%s).is_included" V.name in let decide_fst base v1 = - Offsetmap.is_included v1 (default_offsetmap base) + match default_offsetmap base with + | `Bottom -> false + | `Map vb -> Offsetmap.is_included v1 vb in let decide_snd base v2 = - Offsetmap.is_included (default_offsetmap base) v2 + match default_offsetmap base with + | `Bottom -> true + | `Map vb -> Offsetmap.is_included vb v2 in let decide_both _ m1 m2 = Offsetmap.is_included m1 m2 in let decide_fast s t = @@ -499,7 +454,7 @@ in let generic_is_included = LBase.binary_predicate - (LBase.PersistentCache name) LBase.UniversalPredicate + (Hptmap.PersistentCache name) LBase.UniversalPredicate ~decide_fast ~decide_fst ~decide_snd ~decide_both in fun (m1:t) (m2:t) -> @@ -514,9 +469,9 @@ (* Precondition : m1 <= m2 *) let widen (wh_key_set, wh_hints) r1 r2 = match r1,r2 with - | Top, _ | _, Top -> assert false + | Top, Top | _, Top -> Top | Bottom,Bottom -> Bottom - | _,Bottom -> assert false (* thanks to precondition *) + | _, Bottom | Top, Map _-> assert false (* thanks to precondition *) | Bottom, m -> m | Map m1,Map m2 -> let widened, something_done = @@ -524,6 +479,10 @@ (fun key (widened, something_done) -> let offs2 = LBase.find_or_default key m2 in let offs1 = LBase.find_or_default key m1 in + match offs1, offs2 with + | `Bottom, _ | _, `Bottom -> + assert false (* cannot be invalid and bound *) + | `Map offs1, `Map offs2 -> let unchanged = Offsetmap.equal offs2 offs1 in (* Format.printf "key=%a, fixed=%b@." Base.pretty key fixed; *) @@ -547,143 +506,105 @@ Offsetmap.widen (wh_hints base) off1 off2 in Map (LBase.generic_merge - ~idempotent:true ~cache:("", false) ~decide:merge m1 m2) + ~idempotent:true ~empty_neutral:true ~cache:("", false) + ~decide:merge m1 m2) - let paste_offsetmap ~with_alarms ~from ~dst_loc ~start ~size ~exact m = + let paste_offsetmap ~reducing ~from ~dst_loc ~size ~exact m = match m with - | Bottom | Top -> m + | Bottom -> false, m + | Top -> + let loc = make_loc dst_loc (Int_Base.inject size) in + (Locations.is_valid ~for_writing:true loc), m | Map m' -> let loc_dst = make_loc dst_loc (Int_Base.inject size) in assert (Int.lt Int.zero size); - let loc_dst' = Locations.valid_part ~for_writing:true loc_dst in - if not (Location.equal loc_dst loc_dst') then - CilE.warn_mem_write with_alarms; - let loc_dst = loc_dst' in let exact = exact && cardinal_zero_or_one loc_dst in (* TODO: do we want to alter exact here? *) let had_non_bottom = ref false in + let alarm = ref false in let treat_dst base_dst i_dst acc = - let validity = for_writing_validity ~reducing:false base_dst in - if validity <> Base.Invalid then - let offsetmap_dst = LBase.find_or_default base_dst m' in - try - let new_offsetmap = - Offsetmap.paste_slice ~with_alarms ~validity ~exact - (from, start) ~size ~offsets:i_dst offsetmap_dst - in - had_non_bottom := true; + let validity = for_writing_validity ~reducing base_dst in + let offsetmap_dst = LBase.find_or_default base_dst m' in + match offsetmap_dst with + | `Bottom -> + alarm := true; + acc + | `Map offsetmap_dst -> + let this_alarm, new_offsetmap = + Offsetmap.paste_slice ~validity ~exact + ~from ~size ~offsets:i_dst offsetmap_dst + in + alarm := !alarm || this_alarm; + had_non_bottom := true; + match new_offsetmap with + | `Bottom -> acc + | `Map new_offsetmap -> if offsetmap_dst != new_offsetmap then LBase.add base_dst new_offsetmap acc else acc - with Offsetmap.Result_is_bottom -> - CilE.warn_mem_write with_alarms; - acc - else ( - CilE.warn_mem_write with_alarms; - acc - ) in match dst_loc with - | Location_Bits.Map _ -> - let result = Location_Bits.fold_i treat_dst dst_loc m' in - if !had_non_bottom then Map result - else begin - Kernel.warning ~once:true ~current:true - "all target addresses were invalid. This path is assumed to \ - be dead."; - bottom - end + | Location_Bits.Map _ -> + let result = Location_Bits.fold_i treat_dst dst_loc m' in + if !had_non_bottom then !alarm, Map result else true, bottom + + | Location_Bits.Top (top, orig) -> + if not (Base.SetLattice.equal top Base.SetLattice.top) then + Kernel.result ~current:true ~once:true + "writing somewhere in @[%a@]@[%a@]." + Base.SetLattice.pretty top + Origin.pretty_as_reason orig; + let validity = Base.Known (Int.zero, Int.pred size) in + let v = Offsetmap.find_imprecise ~validity from in + add_binding ~reducing:false ~exact:false m loc_dst v - | Location_Bits.Top (top, orig) -> - if not (Base.SetLattice.equal top Base.SetLattice.top) then - Kernel.result ~current:true ~once:true - "writing somewhere in @[%a@]@[%a@]." - Base.SetLattice.pretty top - Origin.pretty_as_reason orig; - let src_end = Int.pred (Int.add start size) in - let validity = Base.Known (start, src_end) in - let v = Offsetmap.find ~with_alarms:CilE.warn_none_mode - ~validity ~conflate_bottom:false - ~offsets:(Ival.inject_singleton start) ~size from - in - add_binding ~with_alarms ~reducing:false ~exact:false m loc_dst v - - let copy_offsetmap ~with_alarms src_loc mm = + let copy_offsetmap src_loc size mm = match mm with - | Bottom -> None - | Top -> Some Offsetmap.empty + | Bottom -> false, `Bottom + | Top -> + let loc = make_loc src_loc (Int_Base.inject size) in + (Locations.is_valid ~for_writing:false loc), `Top | Map m -> - try - let size = Int_Base.project src_loc.size in + let alarm = ref false in try begin - let treat_src k_src i_src (acc : Offsetmap.t option) = + let treat_src k_src i_src acc = let validity = Base.validity k_src in - let offsetmap_src = LBase.find_or_default k_src m in - if Offsetmap.is_empty offsetmap_src then ( - CilE.warn_mem_read with_alarms; - acc) - else - let copy = Offsetmap.copy_slice ~with_alarms ~validity + match LBase.find_or_default k_src m with + | `Bottom -> + alarm := true; + acc + | `Map offsetmap_src -> + let alarm_copy, copy = Offsetmap.copy_slice ~validity ~offsets:i_src ~size offsetmap_src in - if Offsetmap.is_empty copy then ( - CilE.warn_mem_read with_alarms; - acc) - else - match acc with - | None -> Some copy - | Some acc -> - Some ((Offsetmap.join copy acc)) + if alarm_copy then alarm := true; + Offsetmap.join_top_bottom acc copy in - Location_Bits.fold_i treat_src src_loc.loc None + let r = Location_Bits.fold_i treat_src src_loc `Bottom in + !alarm, r end with | Location_Bits.Error_Top (* from Location_Bits.fold *) -> - let v = find ~conflate_bottom:false ~with_alarms mm src_loc in - Some (Offsetmap.create ~size ~size_v:size v) - with - | Int_Base.Error_Top (* from Int_Base.project *) -> - Some Offsetmap.empty + let loc = make_loc src_loc (Int_Base.inject size) in + let alarm, v = find ~conflate_bottom:false mm loc in + alarm, `Map (Offsetmap.create ~size ~size_v:size v) - let fold_base f m acc = - match m with - | Bottom -> raise Error_Bottom - | Top -> assert false - | Map m -> - LBase.fold - (fun k _ acc -> f k acc) - m - acc + let fold f m acc = + LBase.fold (fun k off acc -> f k off acc) m acc - let fold_base_offsetmap f m acc = - match m with - | Top -> assert false - | Bottom -> raise Error_Bottom - | Map m -> - LBase.fold - (fun k off acc -> f k off acc) - m - acc + let iter = LBase.iter let cached_fold ~f ~cache_name ~temporary ~joiner ~empty = - let cached_f = LBase.cached_fold ~f ~cache_name ~temporary ~joiner ~empty - in - function - | Top -> assert false - | Bottom -> raise Error_Bottom - | Map mm -> - (cached_f mm) - + let cached_f = LBase.cached_fold ~f ~cache_name ~temporary ~joiner ~empty in + fun m -> cached_f m let cached_map ~f ~cache ~temporary = - let cached_f = LBase.cached_map ~f ~cache ~temporary - in + let cached_f = LBase.cached_map ~f ~cache ~temporary in function - Bottom -> Bottom - | Top -> assert false - | Map mm -> - Map (cached_f mm) + | Top -> Top + | Bottom -> Bottom + | Map mm -> Map (cached_f mm) end diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/lmap.mli frama-c-20150201+sodium+dfsg/src/memory_state/lmap.mli --- frama-c-20140301+neon+dfsg/src/memory_state/lmap.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/lmap.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -29,7 +29,10 @@ (Offsetmap: module type of Offsetmap_sig with type v = V.t and type widen_hint = V.widen_hint) - (Default_offsetmap: sig val default_offsetmap : Base.t -> Offsetmap.t end): + (Default_offsetmap: sig + val default_offsetmap : Base.t -> [`Bottom | `Map of Offsetmap.t] + val is_default_offsetmap: Base.t -> Offsetmap.t -> bool + end): module type of Lmap_sig with type v = V.t and type widen_hint_base = V.widen_hint diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/lmap_sig.mli frama-c-20150201+sodium+dfsg/src/memory_state/lmap_sig.mli --- frama-c-20140301+neon+dfsg/src/memory_state/lmap_sig.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/lmap_sig.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -27,24 +27,13 @@ type v (** type of the values associated to a location *) type offsetmap (** type of the maps associated to a base *) +type offsetmap_top_bottom = [ `Map of offsetmap | `Bottom | `Top ] type widen_hint_base (** widening hints for each base *) -module LBase : -sig - type t - val iter : (Base.base -> offsetmap -> unit) -> t -> unit - val shape: t -> offsetmap Hptmap.Shape(Base.Base).t -end +type map (** Maps from {!Base.t} to {!offsetmap} *) +type lmap = private Bottom | Top | Map of map -type tt = private Bottom | Top | Map of LBase.t - -include Datatype.S_with_collections with type t = tt - -(** Bases that must be widening in priority, plus widening hints for each - base. *) -type widen_hint = Base.Set.t * (Base.t -> widen_hint_base) - -val add_base : Base.t -> offsetmap -> t -> t +include Datatype.S_with_collections with type t = lmap val pretty: Format.formatter -> t -> unit val pretty_filter: Format.formatter -> t -> Zone.t -> unit @@ -52,94 +41,141 @@ the bases present in [z] *) val pretty_diff: Format.formatter -> t -> t -> unit -val add_binding: - with_alarms:CilE.warn_mode -> reducing:bool -> exact:bool -> t -> location -> v -> t - -val find: - with_alarms:CilE.warn_mode -> conflate_bottom:bool -> t -> location -> v - -val join : t -> t -> t -val is_included : t -> t -> bool +(** {2 General shape} *) val top: t val is_top: t -> bool -(** Empty map. Casual users do not need this.*) +(** Empty map. Casual users do not need this except to create a custom + initial state. *) val empty_map : t val is_empty_map : t -> bool -(** Every location is associated to [VALUE.bottom] in [bottom]. This state - can be reached only in dead code. *) val bottom : t +(** Every location is associated to the value [bottom] of type [v] in this + state. This state can be reached only in dead code. *) val is_reachable : t -> bool + +(** {2 Join and inclusion} *) + +val join : t -> t -> t +val is_included : t -> t -> bool + +(** Bases that must be widening in priority, plus widening hints for each + base. *) +type widen_hint = Base.Set.t * (Base.t -> widen_hint_base) + val widen : widen_hint-> t -> t -> t -val filter_base : (Base.t -> bool) -> t -> t -(** Remove from the map all the bases that do not satisfy the predicate. *) -val filter_by_shape: 'a Hptmap.Shape(Base.Base).t -> t -> t -(** Remove from the map all the bases that are not also present in - the given [Base.t]-indexed tree. *) +(** {2 Finding values} *) + +val find: + ?conflate_bottom:bool -> t -> location -> bool * v + +(** [copy_offsetmap alarms loc size m] returns the superposition of the + ranges of [size] bits starting at [loc] within [m]. [size] must be strictly + greater than zero. Return [None] if all pointed adresses are invalid in [m]. + The boolean returned indicates that the location may be invalid. + @raise Error_Top if [m] is [Top]. *) +val copy_offsetmap : + Location_Bits.t -> Integer.t -> t -> + bool * [ `Bottom | `Map of offsetmap | `Top ] +val find_base : Base.t -> t -> offsetmap_top_bottom (** @raise Not_found if the varid is not present in the map. *) -val find_base : Base.t -> t -> offsetmap -val find_base_or_default : Base.t -> t -> offsetmap +val find_base_or_default : Base.t -> t -> offsetmap_top_bottom +(** Same as [find_base], but return the default values for bases + that are not currently present in the map. Prefer the use of this function + to [find_base], unless you explicitely want to see if the base is bound. *) -(** Removes the base if it is present. Does nothing otherwise. *) -val remove_base : Base.t -> t -> t -(** [paste_offsetmap ~from:offmap ~dst_loc ~start ~size ~exact m] - copies [size] bits starting at [start] in [offmap], and pastes +(** {2 Binding variables} *) + +val add_binding: + reducing:bool -> exact:bool -> t -> location -> v -> bool * t + +(** [paste_offsetmap ~reducing ~from ~dst_loc ~size ~exact m] + copies [from], which is supposed to be exactly [size] bits, and pastes them at [dst_loc] in [m]. The copy is exact if and only if - [dst_loc] is exact, and [exact is true] *) + [dst_loc] is exact, and [exact] is true. The returned boolean indicates + that the destination location may be invalid. Passing [~reducing:true] + allows writing to location that are read-only. It should only be used + when creating an initial state, or when reducing an existing value. *) val paste_offsetmap : - with_alarms:CilE.warn_mode -> + reducing:bool -> from:offsetmap -> dst_loc:Location_Bits.t -> - start:Integer.t -> size:Integer.t -> exact:bool -> - t -> t - -(** [copy_offsetmap alarms loc m] returns the superposition of the - bits pointed to by [loc] within [m]. [loc.size] must not be top. - Return [None] if all pointed adresses are invalid in [m]. *) -val copy_offsetmap : - with_alarms:CilE.warn_mode -> location -> t -> offsetmap option + t -> bool * t -(** [fold_base f m] calls [f] on all bases bound to non top - offsetmaps in the non bottom map [m]. - @raise Error_Bottom if [m] is bottom. *) -val fold_base : (Base.t -> 'a -> 'a) -> t -> 'a -> 'a - -(** [fold_base_offsetmap f m] calls [f] on all bases bound to non - top offsetmaps in the non bottom map [m]. - @raise Error_Bottom if [m] is bottom.*) -val fold_base_offsetmap : (Base.t -> offsetmap -> 'a -> 'a) -> t -> 'a -> 'a +val add_base : Base.t -> offsetmap -> t -> t +(** No effect on [Top] or [Bottom] *) val add_new_base: - Base.t -> - size:Integer.t -> - v -> size_v:Integer.t -> - t -> t + Base.t -> size:Integer.t -> v -> size_v:Integer.t -> t -> t +(** Creates the offsetmap described by [size], [v] and [size_v], + and binds it to the base. No effect on [Top] or [Bottom]. *) + + +(** {2 Filters} *) + +val filter_base : (Base.t -> bool) -> t -> t +(** Remove from the map all the bases that do not satisfy the predicate. *) + +val filter_by_shape: 'a Hptmap.Shape(Base.Base).t -> t -> t +(** Remove from the map all the bases that are not also present in + the given [Base.t]-indexed tree. *) + +(** Removes the base if it is present. Does nothing otherwise. *) +val remove_base : Base.t -> t -> t -exception Error_Bottom -(** Cached iterators *) +(** {2 Iterators} *) + +(** Notice that some iterators require an argument of type {!map}: the + cases {!Top} and {!Bottom} must be handled separately. All the iterators + belowonly present bases that are bound to non-default values, according + to the function [is_default_offsetmap] of the function {!Lmap.Make_Loffset}. +*) + +val iter: (Base.base -> offsetmap -> unit) -> map -> unit +val fold : (Base.t -> offsetmap -> 'a -> 'a) -> map -> 'a -> 'a + +(** {3 Cached iterators} *) + +(** These functions are meant to be partially applied to all their arguments + but the final one (the map). They must be called at the toplevel of OCaml + modules, as they create persistent caches. *) val cached_fold : f:(Base.t -> offsetmap -> 'a) -> cache_name:string -> temporary:bool -> - joiner:('a -> 'a -> 'a) -> empty:'a -> t -> 'a + joiner:('a -> 'a -> 'a) -> empty:'a -> map -> 'a val cached_map : f:(Base.t -> offsetmap -> offsetmap) -> cache:string * int -> temporary:bool -> t -> t -(** Prefixes. To be used by advanced users only *) + +(** {2 Misc} *) + +val shape: map -> offsetmap Hptmap.Shape(Base.Base).t +(** Shape of the map. This can be used for simultaneous iterations + on other maps indexed by type {!Base.Base.t}. *) + +(** Clear the caches local to this module. Beware that they are not + project-aware, and that you must call them at every project switch. *) +val clear_caches: unit -> unit + + +(**/**) + +(** {2 Prefixes. To be used by advanced users only} *) type subtree val comp_prefixes: t -> t -> unit @@ -150,10 +186,6 @@ exception Found_prefix of Hptmap.prefix * subtree * subtree -(** Clear the caches local to this module. Beware that they are not - project-aware, and that you must call them at every project switch. *) -val clear_caches: unit -> unit - (* diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/locations.ml frama-c-20150201+sodium+dfsg/src/memory_state/locations.ml --- frama-c-20140301+neon+dfsg/src/memory_state/locations.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/locations.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -23,7 +23,6 @@ open Cil_types open Cil open Abstract_interp -open Lattice_Interval_Set module Initial_Values = struct let v = [ [Base.null,Ival.singleton_zero]; @@ -46,12 +45,7 @@ module MapLatticeIval = Map_Lattice.Make - (Base.Base)(Base.SetLattice)(Ival)(Comp_cardinal_0_1)(Initial_Values)( - struct - let zone = false - let null = Base.null - let is_null = Base.is_null - end) + (Base.Base)(Base.SetLattice)(Ival)(Comp_cardinal_0_1)(Initial_Values) module Location_Bytes = struct @@ -60,6 +54,9 @@ type z = tt = | Top of Base.SetLattice.t * Origin.t | Map of M.t + (* Invariant : + [Top (s, _) must always contain NULL, _and_ at least another base. + Top ({Null}, _) is replaced by Top_int]. See inject_top_origin below. *) let inject_ival i = inject Base.null i @@ -68,23 +65,35 @@ (Ival.inject_float (Ival.Float_abstract.inject_singleton f)) - let top_float = inject_ival Ival.top_float - - let top_single_precision_float = inject_ival Ival.top_single_precision_float - + (** Check that those values correspond to {!Initial_Values} above. *) let singleton_zero = inject_ival Ival.singleton_zero let singleton_one = inject_ival Ival.singleton_one let zero_or_one = inject_ival Ival.zero_or_one + let top_int = inject_ival Ival.top + let top_float = inject_ival Ival.top_float + let top_single_precision_float = inject_ival Ival.top_single_precision_float (* true iff [v] is exactly 0 *) let is_zero v = equal v singleton_zero (* [shift offset l] is the location [l] shifted by [offset] *) let shift offset l = + if Ival.is_bottom offset then bottom else try map_offsets (Ival.add_int offset) l with Error_Top -> l + (* [shift_under offset l] is the location [l] (an + under-approximation) shifted by [offset] (another + under-approximation); returns an underapproximation. *) + let shift_under offset l = + if Ival.is_bottom offset then bottom else + try + map_offsets (Ival.add_int_under offset) l + (* Note: having an under-approximation at top is probably + wrong. *) + with Error_Top -> assert false + (* Override the function coming from MapLattice, we can do better *) let cardinal_zero_or_one = function | Top _ -> false @@ -102,6 +111,22 @@ let top_with_origin origin = Top(Base.SetLattice.top, origin) + let inject_top_origin o b = + if Base.Hptset.(equal b empty || equal b Base.null_set) then + top_int + else + Top (Base.SetLattice.inject (Base.Hptset.add Base.null b), o) + + (** some functions can reduce a garbled mix, make sure to normalize + the result when only NULL remains *) + let normalize_top m = + match m with + | Top (Base.SetLattice.Top, _) | Map _ -> m + | Top (Base.SetLattice.Set s, o) -> inject_top_origin o s + + let narrow m1 m2 = normalize_top (narrow m1 m2) + let meet m1 m2 = normalize_top (meet m1 m2) + let topify_with_origin o v = match v with | Top (s,a) -> @@ -124,7 +149,6 @@ try let b,_ = find_lonely_binding m in match Base.validity b with - | Base.Periodic _ -> false | Base.Known _ | Base.Unknown _ | Base.Invalid -> true with Not_found -> false @@ -179,37 +203,22 @@ if Base.is_null base then true else match loc with - | Top (toparam,_) -> - Base.SetLattice.is_included (Base.SetLattice.inject_singleton base) toparam + | Top (Base.SetLattice.Top, _) -> true + | Top (Base.SetLattice.Set s,_) -> + Base.Hptset.mem base s | Map m -> try ignore (M.find base m); true with Not_found -> false - let contains_addresses_of_locals is_local = - let f base _offsets = is_local base in - let projection _base = Ival.top in - let cached_f = - cached_fold - ~cache_name:"loc_top_locals" - ~temporary:true - ~f - ~projection - ~joiner:(||) - ~empty:false - in - fun loc -> - try - cached_f loc - with Error_Top -> - assert (match loc with - | Top (Base.SetLattice.Top,_) -> true - | Top (Base.SetLattice.Set _top_param,_orig) -> - false - | Map _ -> false); - true + let contains_addresses_of_locals is_local l = + match l with + | Top (Base.SetLattice.Top,_) -> true + | Top (Base.SetLattice.Set s, _) -> + Base.SetLattice.O.exists is_local s + | Map m -> + M.exists (fun b _ -> is_local b) m - (** TODO: merge with above function *) let remove_escaping_locals is_local v = match v with | Top (Base.SetLattice.Top as t,_) -> t, v @@ -280,7 +289,7 @@ let name = Pretty_utils.sfprintf "Locations.Overlap(%d)" size_int in let f = M.symmetric_binary_predicate - (M.TemporaryCache name) M.ExistentialPredicate + (Hptmap.TemporaryCache name) M.ExistentialPredicate ~decide_fast:(fun _ _ -> M.PUnknown) ~decide_one:(fun _ _ -> false) ~decide_both:(fun _ x y -> Ival.partially_overlaps size x y) @@ -303,14 +312,6 @@ (Int_Intervals) (Hptmap.Comp_unused) (Initial_Values) - (struct - let zone = true - let null = Base.null - let is_null = Base.is_null - end) - - let default base bi ei = inject base (Int_Intervals.inject [bi,ei]) - let defaultall base = inject base Int_Intervals.top let pretty fmt m = match m with @@ -341,6 +342,32 @@ let shape = M.shape + let fold2_join_heterogeneous ~cache ~empty_left ~empty_right ~both ~join ~empty = + let f_top = + (* Build a zone corresponding to the garbled mix. Do not add NULL, we + are reasoning on zones. Inefficient if empty_right does not use + its argument, though... *) + let build_z set = + let aux b z = M.add b Int_Intervals.top z in + Map (Base.Hptset.fold aux set M.empty) + in + let empty_right set = empty_right (build_z set) in + let both base v = both base Int_Intervals.top v in + Base.SetLattice.O.fold2_join_heterogeneous + ~cache ~empty_left ~empty_right ~both ~join ~empty + in + let f_map = + let empty_right m = empty_right (Map m) in + let both base itvs v = both base itvs v in + M.fold2_join_heterogeneous + ~cache ~empty_left ~empty_right ~both ~join ~empty + in + fun z -> + match z with + | Top (Base.SetLattice.Top, _) -> raise Error_Top + | Top (Base.SetLattice.Set s, _) -> f_top s + | Map mm -> f_map mm + end @@ -381,9 +408,7 @@ match Base.validity base, size with | Base.Invalid, _ -> Ival.bottom | _, Int_Base.Top -> offsets - | ( Base.Known (minv,maxv) - | Base.Unknown (minv,_,maxv) - | Base.Periodic (minv, maxv, _)), + | (Base.Known (minv,maxv) | Base.Unknown (minv,_,maxv)), Int_Base.Value size -> let maxv = Int.succ (Int.sub maxv size) in let range = Ival.inject_range (Some minv) (Some maxv) in @@ -402,6 +427,8 @@ match loc with | Location_Bits.Top _ -> false | Location_Bits.Map m -> + if Int_Base.is_top size then false + else begin Location_Bits.M.iter (fun base offsets -> let valid_offsets = @@ -415,6 +442,7 @@ else raise Found_two ) m; true + end with | Int_Base.Error_Top | Found_two -> false @@ -434,6 +462,14 @@ (Ival.scale_div ~pos:true (Bit_utils.sizeofchar())) x | Location_Bits.Top _ -> x +let loc_bits_to_loc_bytes_under x = + match x with + | Location_Bits.Map _ -> + Location_Bits.map_offsets + (Ival.scale_div_under ~pos:true (Bit_utils.sizeofchar())) x + | Location_Bits.Top _ -> x + + let loc_to_loc_without_size {loc = loc} = loc_bits_to_loc_bytes loc let loc_size { size = size } = size @@ -532,19 +568,36 @@ (fun f -> Location_Bits.M.iter (fun k v -> f (k, v))) print_binding fmt off -let enumerate_valid_bits ~for_writing {loc = loc_bits; size = size}= +(* Case [Top (Top, _)] must be handled by caller. *) +let enumerate_valid_bits_under_over under_over ~for_writing {loc; size} = let compute_offset base offs acc = let valid_offset = reduce_offset_by_validity ~for_writing base offs size in if Ival.is_bottom valid_offset then acc else - let valid_itvs = Int_Intervals.from_ival_size valid_offset size in + let valid_itvs = under_over valid_offset size in Zone.M.add base valid_itvs acc in - match loc_bits with + Zone.Map (Location_Bits.fold_topset_ok compute_offset loc Zone.M.empty) + +let enumerate_valid_bits ~for_writing loc = + match loc.loc with | Location_Bits.Top (Base.SetLattice.Top, _) -> Zone.top | _ -> - Zone.Map (Location_Bits.fold_topset_ok compute_offset loc_bits Zone.M.empty) + enumerate_valid_bits_under_over + Int_Intervals.from_ival_size ~for_writing loc +;; + +let enumerate_valid_bits_under ~for_writing loc = + match loc.size with + | Int_Base.Top -> Zone.bottom + | Int_Base.Value _ -> + match loc.loc with + | Location_Bits.Top _ -> Zone.bottom + | Location_Bits.Map _ -> + enumerate_valid_bits_under_over + Int_Intervals.from_ival_size_under ~for_writing loc +;; (** [valid_part l] is an over-approximation of the valid part of the location [l] *) @@ -560,27 +613,34 @@ match loc with | Location_Bits.Top (Base.SetLattice.Top, _) -> loc | Location_Bits.Top (Base.SetLattice.Set _, _) -> - (* We do not reduce garbled mixes. This makes them disappear after - one memory access. *) - if false then - Location_Bits.(Map (fold_topset_ok compute_loc loc M.empty)) - else - loc + Location_Bits.(Map (fold_topset_ok compute_loc loc M.empty)) | Location_Bits.Map m -> Location_Bits.inject_map (Location_Bits.M.fold compute_loc m Location_Bits.M.empty) in make_loc locbits size -let enumerate_bits ({loc = loc_bits; size = size} as _arg)= +let enumerate_bits_under_over under_over {loc; size} = let compute_offset base offs acc = - let valid_offset = Int_Intervals.from_ival_size offs size in - Zone.M.add base valid_offset acc + let valid_offset = under_over offs size in + if Int_Intervals.(equal valid_offset bottom) then + acc (* Should not occur, as this means that [loc] maps something + to Bottom *) + else + Zone.M.add base valid_offset acc in - match loc_bits with + Zone.Map (Location_Bits.fold_topset_ok compute_offset loc Zone.M.empty) + +let enumerate_bits loc = + match loc.loc with | Location_Bits.Top (Base.SetLattice.Top, _) -> Zone.top - | _ -> - Zone.Map (Location_Bits.fold_topset_ok compute_offset loc_bits Zone.M.empty) + | _ -> enumerate_bits_under_over Int_Intervals.from_ival_size loc + +let enumerate_bits_under loc = + match loc.loc, loc.size with + | Location_Bits.Top _, _ | _, Int_Base.Top -> Zone.bottom + | _ -> enumerate_bits_under_over Int_Intervals.from_ival_size_under loc + let zone_of_varinfo var = enumerate_bits (loc_of_varinfo var) diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/locations.mli frama-c-20150201+sodium+dfsg/src/memory_state/locations.mli --- frama-c-20140301+neon+dfsg/src/memory_state/locations.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/locations.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -25,9 +25,8 @@ open Cil_types open Abstract_interp -open Lattice_Interval_Set -(** Association between varids and offsets in byte. +(** Association between bases and offsets in byte. @plugin development guide *) module Location_Bytes : sig (* TODOBY: write an mli for MapLattice, and name the result. Use it there, @@ -35,7 +34,7 @@ module M : sig type key = Base.t - type t + type t (** Mapping from bases to bytes-expressed offsets *) val iter : (Base.t -> Ival.t -> unit) -> t -> unit val find : key -> t -> Ival.t val fold : (Base.t -> Ival.t -> 'a -> 'a) -> t -> 'a -> 'a @@ -44,7 +43,10 @@ type z = | Top of Base.SetLattice.t * Origin.t - | Map of M.t + (** Garbled mix of the addresses in the set *) + | Map of M.t (** Precice set of addresses+offsets *) + (** This type should be considered private *) + (* TODO: make it private when OCaml 4.01 is mandatory *) (** Those locations have a lattice structure, including standard operations such as [join], [narrow], etc. *) @@ -70,8 +72,9 @@ val inject_ival : Ival.t -> t val inject_float : Ival.F.t -> t - (** Non directly lattice-related operations *) - val add_or_bottom : Base.t -> Ival.t -> M.t -> M.t + val add : Base.t -> Ival.t -> t -> t + (** [add b i loc] binds [b] to [i] in [loc] when [i] is not {!Ival.bottom}, + and returns {!bottom} otherwise. *) val diff : t -> t -> t (** Over-approximation of difference. [arg2] needs to be exact or an @@ -82,6 +85,8 @@ over-approximation. *) val shift : Ival.t -> t -> t + val shift_under : Ival.t -> t -> t + (** Over- and under-approximation of shifting the value by the given Ival. *) (** Topifying of values, in case of imprecise accesses *) @@ -91,13 +96,15 @@ val topify_leaf_origin : t -> t val topify_with_origin: Origin.t -> t -> t val topify_with_origin_kind: Origin.kind -> t -> t - val inject_top_origin : Origin.t -> Base.SetLattice.O.t -> t + val inject_top_origin : Origin.t -> Base.Hptset.t -> t (** [inject_top_origin origin p] creates a top with origin [origin] and additional information [param] *) val top_with_origin: Origin.t -> t (** Completely imprecise value. Use only as last resort. *) + (* {2 Iterators} *) + val fold_bases : (Base.t -> 'a -> 'a) -> t -> 'a -> 'a (** Fold on all the bases of the location, including [Top bases]. @raise Error_Top in the case [Top Top]. *) @@ -109,6 +116,13 @@ [Ival.top] is supplied to the iterator. @raise Error_Top in the case [Top Top]. *) + val fold_enum : (t -> 'a -> 'a) -> t -> 'a -> 'a + (** [fold_enum f loc acc] enumerates the locations in [acc], and passes + them to [f]. Make sure to call {!cardinal_less_than} before calling + this function, as all possible combinations of bases/offsets are + presented to [f]. Raises {!Error_Top} if [loc] is [Top _] or if + one offset cannot be enumerated. *) + val cached_fold: cache_name:string -> temporary:bool -> @@ -117,24 +131,36 @@ joiner:('a -> 'a -> 'a) -> empty:'a -> t -> 'a (** Cached version of [fold_i], for advanced users *) - (** Number of locations *) + + (** {2 Number of locations} *) + val cardinal_zero_or_one : t -> bool val cardinal_less_than : t -> int -> int + (** [cardinal_less_than v card] returns the cardinal of [v] if it is less + than [card], or raises [Not_less_than]. *) val cardinal: t -> Integer.t option (** None if the cardinal is unbounded *) - val find_lonely_binding : t -> Base.t * Ival.t + val find_lonely_key : t -> Base.t * Ival.t - val fold_enum : (t -> 'a -> 'a) -> t -> 'a -> 'a + (** if there is only one base [b] in the location, then returns the + pair [b,o] where [o] are the offsets associated to [b]. + @raise Not_found otherwise. *) - (** Destructuring *) + val find_lonely_binding : t -> Base.t * Ival.t + (** if there is only one binding [b -> o] in the location (that is, only + one base [b] with [cardinal_zero_or_one o]), returns the pair [b,o]. + @raise Not_found otherwise *) + + + (** {2 Destructuring} *) val find_or_bottom : Base.t -> M.t -> Ival.t val split : Base.t -> t -> Ival.t * t val get_bases : t -> Base.SetLattice.t - (** Returns the bases the location may point too. Never fail, but + (** Returns the bases the location may point to. Never fails, but may return [Base.SetLattice.Top]. *) - (** Local variables inside locations *) + (** {2 Local variables inside locations} *) val contains_addresses_of_locals : (M.key -> bool) -> t -> bool (** [contains_addresses_of_locals is_local loc] returns [true] @@ -150,7 +176,7 @@ (** [contains_addresses_of_any_locals loc] returns [true] iff [loc] contains the adress of a local variable or of a formal variable. *) - (** Other *) + (** {2 Misc} *) val iter_on_strings : skip:Base.t option -> (Base.t -> string -> int -> int -> unit) -> t -> unit @@ -168,18 +194,23 @@ val clear_caches: unit -> unit end -(** Association between varids and offsets in bits. +(** Association between bases and offsets in bits. @plugin development guide *) module Location_Bits : module type of Location_Bytes -(** Association between varids and ranges of bits. +(** Association between bases and ranges of bits. @plugin development guide *) module Zone : sig type map_t - type tt = Top of Base.SetLattice.t * Origin.t | Map of map_t + + (** This type should be considered private *) + (* TODO: make it private when OCaml 4.01 is mandatory *) + type tt = private Top of Base.SetLattice.t * Origin.t | Map of map_t + include Datatype.S_with_collections with type t = tt + val pretty_debug: t Pretty_utils.formatter include Lattice_type.Bounded_Join_Semi_Lattice with type t := t include Lattice_type.With_Top with type t := t @@ -232,17 +263,20 @@ val cached_fold : cache_name:string -> temporary:bool -> - f:(Base.t -> Lattice_Interval_Set.Int_Intervals.t -> 'b) -> - projection:(Base.t -> Lattice_Interval_Set.Int_Intervals.t) -> + f:(Base.t -> Int_Intervals.t -> 'b) -> + projection:(Base.t -> Int_Intervals.t) -> joiner:('b -> 'b -> 'b) -> empty:'b -> t -> 'b - (** {3 Lmap_bitwise utilities} *) - - (** The functions default and default_all are intended to be called by the - functor Lmap_bitwise. *) + val fold2_join_heterogeneous: + cache:Hptmap.cache_type -> + empty_left:('a Hptmap.Shape(Base.Base).t -> 'b) -> + empty_right:(t -> 'b) -> + both:(Base.t -> Int_Intervals.t -> 'a -> 'b) -> + join:('b -> 'b -> 'b) -> + empty:'b -> + t -> 'a Hptmap.Shape(Base.Base).t -> + 'b - val default : Base.t -> Int.t -> Int.t -> t - val defaultall : Base.t -> t (** {3 Misc} *) val shape: map_t -> Int_Intervals.t Hptmap.Shape(Base.Base).t @@ -303,14 +337,22 @@ (** {2 Conversion functions} *) +(* Note: the first two operations are exact (if offsets are not + floats.) The last one can return an over-approximation, and has an + under-approximating counterpart. *) val loc_to_loc_without_size : location -> Location_Bytes.t val loc_bytes_to_loc_bits : Location_Bytes.t -> Location_Bits.t val loc_bits_to_loc_bytes : Location_Bits.t -> Location_Bytes.t +val loc_bits_to_loc_bytes_under : Location_Bits.t -> Location_Bytes.t val enumerate_bits : location -> Zone.t +val enumerate_bits_under : location -> Zone.t + val enumerate_valid_bits : for_writing:bool -> location -> Zone.t (** @plugin development guide *) +val enumerate_valid_bits_under : for_writing:bool -> location -> Zone.t + val zone_of_varinfo : varinfo -> Zone.t (** @since Carbon-20101201 *) diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/offsetmap_bitwise.ml frama-c-20150201+sodium+dfsg/src/memory_state/offsetmap_bitwise.ml --- frama-c-20140301+neon+dfsg/src/memory_state/offsetmap_bitwise.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/offsetmap_bitwise.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,758 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -open Abstract_interp -open Lattice_Interval_Set - -type itv = Int.t * Int.t - -module Make(V: Lattice_type.Bounded_Join_Semi_Lattice) = -struct - - module V_bool = struct - include Datatype.Pair_with_collections(Datatype.Bool)(V) - (struct let module_name = - Format.sprintf "Offsetmap_bitwise(%s).Make.V_bool" V.name end) - let hash (b,v) = - let h = V.hash v in - if b then h else 100000 + h - - let fast_equal (b1, v1: t) (b2, v2: t) = b1 = b2 && v1 == v2 - end - - module M = Int_Interv_Map.Make(V_bool) - - type tt = Map of M.t | Degenerate of V.t - - let hash x = match x with - | Degenerate v -> 571 + V.hash v - | Map map -> M.hash map - - let empty = Map M.empty - - let degenerate v = Degenerate v - - let equal_map mm1 mm2 = - try M.equal mm1 mm2 - with Int_Interv.Cannot_compare_intervals -> false - - let equal m1 m2 = - match m1, m2 with - Degenerate v1, Degenerate v2 -> - V.equal v1 v2 - | Map mm1, Map mm2 -> - equal_map mm1 mm2 - | Map _, Degenerate _ | Degenerate _, Map _ -> false - - let compare = - if V.compare == Datatype.undefined || M.compare == Datatype.undefined then ( - Kernel.debug "Missing comparison function for %s offsetmap_bitwise \ - (%b, %b)"V.name - (V.compare == Datatype.undefined) (M.compare == Datatype.undefined); - Datatype.undefined) - else - fun m1 m2 -> - if m1 == m2 then 0 - else match m1, m2 with - | Map m1, Map m2 -> M.compare m1 m2 - | Degenerate v1, Degenerate v2 -> V.compare v1 v2 - | Map _, Degenerate _ -> -1 - | Degenerate _, Map _ -> 1 - - - module MapIntervals = - FCMap.Make(struct - type t = Int_Intervals.t - let compare = Int_Intervals.compare_itvs - end) - - (* Print a map by fusing together intervals that map to the same value *) - let fold_fuse_same_aux f m acc = - let h = V_bool.Hashtbl.create 17 in - (* Map the various values in m to the intervals they appear in*) - let sort_by_content itv v () = - let cur = try V_bool.Hashtbl.find h v - with Not_found -> Int_Intervals.bottom - in - let itvs = Int_Intervals.inject [itv] in - let new_ = Int_Intervals.join itvs cur in - V_bool.Hashtbl.replace h v new_ - in - M.fold sort_by_content m (); - (* Now sort the contents of h by increasing intervals *) - let m = V_bool.Hashtbl.fold - (fun v itvs acc -> MapIntervals.add itvs v acc) - h MapIntervals.empty - in - (* Call f on those intervals *) - MapIntervals.fold (fun itvs v acc -> f itvs v acc) m acc - - let fold_fuse_same f offsm acc = - match offsm with - | Degenerate v -> - f Int_Intervals.top (true,v) acc - | Map offsm -> fold_fuse_same_aux f offsm acc - - let range_covers_whole_type typ itvs = - match typ with - | None -> false - | Some typ -> - match Int_Intervals.project_singleton itvs with - | Some (b, e) -> - (try - let s = Cil.bitsSizeOf typ in - Int.equal b Int.zero && Int.equal e (Int.of_int (pred s)) - with Cil.SizeOfError _ -> false) - | None -> false - - let pretty_with_type_generic_printer typ printer sep fmt m = - match m with - | Degenerate v -> - Format.fprintf fmt "@[[..] %s @[%a@]@]" sep printer v - | Map m -> - let pp_itv = Int_Intervals.pretty_typ typ in - let first = ref true in - let pretty_binding fmt itvs (default,v) () = - if !first then first := false else Format.fprintf fmt "@," ; - Format.fprintf fmt "@[@[%a@]%(%)@[%s @[%a%s@]@]@]" - pp_itv itvs - (if range_covers_whole_type typ itvs - then (" ": (unit,Format.formatter,unit) format) else "@ ") - sep printer v - (if default then " (and SELF)" else "") - - in - Format.fprintf fmt "@["; - fold_fuse_same_aux (pretty_binding fmt) m (); - Format.fprintf fmt "@]" - - let pretty_with_type typ fmt m = - pretty_with_type_generic_printer typ V.pretty "FROM" fmt m - - let pretty = pretty_with_type None - - include Datatype.Make - (struct - type t = tt - let name = V.name ^ " offsetmap_bitwise" - let structural_descr = - Structural_descr.t_sum [| [| M.packed_descr |]; [| V.packed_descr |] |] - let reprs = - List.fold_left - (fun acc m -> Map m :: acc) - (List.map (fun v -> Degenerate v) V.reprs) - M.reprs - let equal = equal - let hash = hash - let compare = compare - let pretty = pretty - let internal_pretty_code = Datatype.undefined - let rehash = Datatype.identity - let copy = Datatype.undefined - let varname = Datatype.undefined - let mem_project = Datatype.never_any_project - end) - let () = Type.set_ml_name ty None - - let is_empty m = - match m with - Map m -> M.is_empty m - | Degenerate _ -> false - - let find default ((bi,ei) as i) m = - match m with - Degenerate v -> v - | Map m -> - let concerned_intervals = - M.concerned_intervals Int_Interv.fuzzy_order i m - in - match concerned_intervals with - | [] -> default bi ei - | ((_bk,ek),_)::_ -> - (* Beware that intervals are presented in reverse order. - [(bk, ek)] is the highest one. *) - let implicit_right = - if Int.gt ei ek - then default (Int.succ ek) ei - else V.bottom - in - let rec implicit_mid_and_left list acc = - match list with - | [(bl,_el),_] -> (* Implicit left *) - if Int.lt bi bl - then V.join acc (default bi (Int.pred bl)) - else acc - | ((bl, _el), _)::((((_bk, ek), _)::_) as tail) -> - let tail = implicit_mid_and_left tail acc in - (* implicit mid, ie. a hole between the two intervals. Again, - [(bk, ek)] is the highest interval *) - (* Format.printf "treat_mid_itv: ek:%a bl:%a@\n" Int.pretty ek - Int.pretty bl; *) - let s_ek = Int.succ ek in - if Int.lt s_ek bl then - V.join (default s_ek (Int.pred bl)) tail - else tail - | [] -> assert false - in - let implicit = - implicit_mid_and_left concerned_intervals implicit_right - in - (* now add the explicit values *) - List.fold_left - (function acc -> function ((bi',ei'),(d,v)) -> - let valu = V.join v acc in - if d then - let (b, e) = Int_Interv.clip_itv (bi, ei) (bi', ei') in - V.join valu (default b e) - else valu - ) - implicit - concerned_intervals - - let same_values ((bx:bool),x) (by,y) = - (bx = by) && (V.equal x y ) - - let add_map_internal i v map = (* FIXME (?) Fails to stick the writing binding - with neighbors if applicable *) - match M.cleanup_overwritten_bindings same_values i v map - with - | None -> map - | Some(new_bi, new_ei, cleaned_m) -> - (* Add the new binding *) - let result = M.add (new_bi,new_ei) v cleaned_m in - result - - let merge_map m1 m2 = - M.fold (fun k v acc -> add_map_internal k v acc) m1 m2 - -(* low-level add to manipulate the pairs (default,value) *) - let add_internal ((_bi,_ei) as i) (_bv, tv as v) m = - match m with - | Degenerate v1 -> Degenerate (V.join tv v1) - | Map map -> - Map (add_map_internal i v map) -(** exact add *) - let add i v m = add_internal i (false,v) m - -(** approximate add, for when the target location is ambiguous *) - let add_approximate (b, e as i) v m = - match m with - | Degenerate v1 -> Degenerate (V.join v v1) - | Map map -> - let concerned_intervals = - M.concerned_intervals Int_Interv.fuzzy_order i map - in - let treat_interval (acc, right_bound) ((b1, e1), (d1, v1)) = - let acc, restricted_e1 = - if Int.lt e1 right_bound - then begin (* there is a hole *) - let i_hole = (Int.succ e1, right_bound) in - add_internal i_hole (true, v) acc, e1 - end - else acc, Int.min e1 e - in - let restricted_b1 = Int.max b1 b in - let restricted_i1 = restricted_b1, restricted_e1 in - add_internal restricted_i1 (d1,V.join v1 v) acc, Int.pred restricted_b1 - in - let acc, right_bound = List.fold_left treat_interval (m, e) concerned_intervals - in - let result = - if Int.le b right_bound - then begin (* there is a hole *) - let i_hole = (b, right_bound) in - add_internal i_hole (true, v) acc - end - else acc - in -(* Format.printf "bitwise add_approximate@\ninterval:%a..%a value:%a@\nstate%a@\nresult: %a@." - Int.pretty b Int.pretty e - V.pretty v - pretty m - pretty result;*) - result - - let collapse m = - match m with - | Degenerate v -> v - | Map map -> - M.fold (fun _ (_,v) acc -> V.join acc v) map V.bottom - - let find_iset default alldefault is m = - let result = - if Int_Intervals.is_top is - then - V.join alldefault (collapse m) - else - let s = Int_Intervals.project_set is in - if s = [] - then V.bottom - else begin - match m with - | Degenerate v -> - List.fold_left - (fun acc i -> V.join acc (default (fst i) (snd i))) - v s - | Map _ -> - let f acc i = V.join acc (find default i m) in - List.fold_left f V.bottom s - end - in -(* Format.printf "find_iset %a %a@\nresult:%a@." Int_Intervals.pretty is pretty m V.pretty result; *) - result - - let add_iset ~exact is v m = - if Int_Intervals.is_top is - then begin -(* Format.printf "add_iset degenerate: value: %a@\nmap: %a@." V.pretty v pretty m; *) - Degenerate (V.join v (collapse m)) - end - else begin - let s = Int_Intervals.project_set is in - match m with - | Degenerate v1 -> Degenerate (V.join v v1) - | Map _ -> - let result = - List.fold_left - (fun acc i -> - (if exact then add else add_approximate) - i v acc) - m - s - in - result - end - - let joindefault_internal = - M.map - (fun v -> true, (snd v)) - - let fold f m acc = - match m with - | Degenerate v -> - f Int_Intervals.top (true,v) acc - | Map m -> - M.fold - (fun i v acc -> - f (Int_Intervals.inject [i]) v acc) - m - acc - - let map_map f m = - M.fold - (fun i v acc -> add_map_internal i (f v) acc) - (* [pc] add_internal could be replaced by a more efficient - function that assumes there are no bindings above i *) - m - M.empty - - let map f m = - match m with - | Degenerate v -> Degenerate (snd (f (true,v))) - | Map m -> - Map (map_map f m) - -(* let check_contiguity m = - let id = map (fun x -> x) m in - assert (equal id m) - - let check_map_contiguity m = - let id = map_map (fun x -> x) m in - assert (equal_map id m) -*) - let joindefault m = - match m with - Degenerate _ -> m - | Map m -> - Map (joindefault_internal m) - - let map2 - (f : (bool * V.t) option -> (bool * V.t) option -> bool * V.t) - mm1 mm2 = -(* check_contiguity(mm2); - check_contiguity(mm1); *) - let result = - match mm1, mm2 with - | Degenerate(v), m | m, Degenerate(v) -> - Degenerate (snd (f (Some (true, v)) (Some (true, collapse m)))) - | Map(m1), Map(m2) -> - (*Format.printf "map2: m1:@\n%a@\nm2:@\n%a@\n" - pretty mm1 pretty mm2;*) - let compute_remains_m1_and_merge m1 acc = - let remains = - map_map - (fun vv -> f (Some vv) None) - m1 - in - merge_map remains acc - in - let compute_remains_m2_and_merge m2 acc = -(* check_map_contiguity(acc); *) - let remains = map_map - (fun vv -> f None (Some vv)) - m2 - in -(* check_map_contiguity(remains); *) - let result = merge_map remains acc in -(* check_map_contiguity(result);*) - result - in - let rec out_out (b1,_e1 as i1) v1 m1 (b2, _e2 as i2) v2 m2 acc = - (*Format.printf "out_out: b1=%a e1=%a b2=%a e2=%a@\n" - Int.pretty b1 Int.pretty e1 Int.pretty b2 Int.pretty e2; *) -(* check_map_contiguity(acc);*) - let result = - if Int.lt b1 b2 - then in_out i1 v1 m1 i2 v2 m2 acc - else if Int.gt b1 b2 - then out_in i1 v1 m1 i2 v2 m2 acc - else (* b1 = b2 *) - in_in i1 v1 m1 i2 v2 m2 acc - in -(* check_map_contiguity(result);*) - result - and in_out (b1,e1 as i1) v1 m1 (b2, _e2 as i2) v2 m2 acc = - (*Format.printf "in_out: b1=%a e1=%a b2=%a e2=%a@\n" - Int.pretty b1 Int.pretty e1 Int.pretty b2 Int.pretty e2; *) -(* check_map_contiguity(acc);*) - assert (Int.gt b2 b1); - let result = - let pb2 = Int.pred b2 in - let new_v = f (Some v1) None in - if Int.lt pb2 e1 - then begin (* -> in_in *) - let new_acc = add_map_internal (b1,pb2) new_v acc in - in_in (b2,e1) v1 m1 i2 v2 m2 new_acc - end - else begin - let new_acc = add_map_internal i1 new_v acc in - try - let (new_i1, new_v1) = M.lowest_binding m1 in - let new_m1 = M.remove new_i1 m1 in - if Int.lt e1 pb2 - then (* -> out_out *) - out_out new_i1 new_v1 new_m1 i2 v2 m2 new_acc - else (* pb2 = e1 *) - (* -> in_or_out_in *) - in_or_out_in new_i1 new_v1 new_m1 i2 v2 m2 new_acc - with M.Empty_rangemap -> - compute_remains_m2_and_merge (add_map_internal i2 v2 m2) new_acc - end - in -(* check_map_contiguity(result);*) - result - and out_in (b1,_e1 as i1) v1 m1 (b2, e2 as i2) v2 m2 acc = - (* Format.printf "out_in: b1=%a e1=%a b2=%a e2=%a@\n" - Int.pretty b1 - Int.pretty e1 - Int.pretty b2 - Int.pretty e2; *) -(* check_map_contiguity(acc);*) - assert (Int.lt b2 b1); - let result = - let pb1 = Int.pred b1 in - let new_v = f None (Some v2) in - if Int.lt pb1 e2 - then begin (* -> in_in *) - let new_acc = add_map_internal (b2,pb1) new_v acc in - in_in i1 v1 m1 (b1,e2) v2 m2 new_acc - end - else begin - let new_acc = add_map_internal i2 new_v acc in - try - let (new_i2, new_v2) = M.lowest_binding m2 in - let new_m2 = M.remove new_i2 m2 in - if Int.lt e2 pb1 - then (* -> out_out *) - out_out i1 v1 m1 new_i2 new_v2 new_m2 new_acc - else (* pb1 = e2 *) - (* -> in_in_or_out *) - in_in_or_out i1 v1 m1 new_i2 new_v2 new_m2 new_acc - with M.Empty_rangemap -> - compute_remains_m1_and_merge (add_map_internal i1 v1 m1) new_acc - end - in -(* check_map_contiguity(result);*) - result - and in_in_or_out (b1,_e1 as i1) v1 m1 (b2,_e2 as i2) v2 m2 acc = - (*Format.printf "in_in_or_out: b1=%a e1=%a b2=%a e2=%a@\n" - Int.pretty b1 Int.pretty e1 Int.pretty b2 Int.pretty e2;*) - (if Int.equal b1 b2 then in_in else (assert (Int.lt b1 b2);in_out)) - i1 v1 m1 i2 v2 m2 acc - and in_or_out_in (b1,_e1 as i1) v1 m1 (b2,_e2 as i2) v2 m2 acc = - (*Format.printf "in_or_out_in: b1=%a e1=%a b2=%a e2=%a@\n" - Int.pretty b1 - Int.pretty e1 - Int.pretty b2 - Int.pretty e2;*) - (if Int.equal b1 b2 then in_in else (assert (Int.gt b1 b2);out_in)) - i1 v1 m1 i2 v2 m2 acc - and in_in_e1_first (_b1, e1 as i1) _v1 m1 (_b2, e2) v2 m2 acc new_v12 = - (*Format.printf "in_in_e1_first: b1=%a e1=%a b2=%a e2=%a@\n" - Int.pretty b1 Int.pretty e1 Int.pretty b2 Int.pretty e2; *) - assert (Int.lt e1 e2); - let new_acc = add_map_internal i1 new_v12 acc in - let new_i2 = (Int.succ e1,e2) in - try - let (new_i1, new_v1) = M.lowest_binding m1 in - let new_m1 = M.remove new_i1 m1 in - in_or_out_in new_i1 new_v1 new_m1 new_i2 v2 m2 new_acc - with M.Empty_rangemap -> - compute_remains_m2_and_merge - (add_map_internal new_i2 v2 m2) new_acc - and in_in_e2_first (_b1, e1) v1 m1 (_b2, e2 as i2) _v2 m2 acc new_v12= - (*Format.printf "in_in_e2_first: b1=%a e1=%a b2=%a e2=%a@\n" - Int.pretty b1 Int.pretty e1 Int.pretty b2 Int.pretty e2; *) - assert (Int.lt e2 e1); - let new_acc = add_map_internal i2 new_v12 acc in - let new_i1 = (Int.succ e2,e1) in - try - let (new_i2, new_v2) = M.lowest_binding m2 in - let new_m2 = M.remove new_i2 m2 in - in_in_or_out new_i1 v1 m1 new_i2 new_v2 new_m2 new_acc - with M.Empty_rangemap -> - compute_remains_m1_and_merge - (add_map_internal new_i1 v1 m1) new_acc - and in_in_same_end (_b1, e1 as i1) _v1 m1 (_b2, e2) _v2 m2 acc new_v12= - (*Format.printf "in_in_same_end: b1=%a e1=%a b2=%a e2=%a@\n" - Int.pretty b1 Int.pretty e1 Int.pretty b2 Int.pretty e2; *) - assert (Int.equal e1 e2); - - let acc = add_map_internal i1 new_v12 acc in - try - let (new_i1, new_v1) = M.lowest_binding m1 in - let new_m1 = M.remove new_i1 m1 in - try - let (new_i2, new_v2) = M.lowest_binding m2 in - let new_m2 = M.remove new_i2 m2 in - out_out new_i1 new_v1 new_m1 new_i2 new_v2 new_m2 acc - with M.Empty_rangemap -> - compute_remains_m1_and_merge m1 acc - with M.Empty_rangemap -> - compute_remains_m2_and_merge m2 acc - and in_in (b1, e1 as i1) v1 m1 (b2, e2 as i2) v2 m2 acc = - (*Format.printf "in_in: b1=%a e1=%a b2=%a e2=%a@\n" - Int.pretty b1 Int.pretty e1 Int.pretty b2 Int.pretty e2; *) - assert (Int.equal b1 b2); - - let new_v12 = f (Some v1) (Some v2) in - (if Int.gt e1 e2 - then in_in_e2_first - else if Int.lt e1 e2 - then in_in_e1_first - else in_in_same_end) - i1 v1 m1 i2 v2 m2 acc new_v12 - in - try - let i1, v1 = M.lowest_binding m1 in - try - let i2, v2 = M.lowest_binding m2 in - let new_m1 = M.remove i1 m1 in - let new_m2 = M.remove i2 m2 in - Map (out_out i1 v1 new_m1 i2 v2 new_m2 M.empty) - with M.Empty_rangemap -> mm1 - with M.Empty_rangemap -> mm2 - in -(* check_contiguity(result);*) - result - - let check_inter offs1 offs2 = - let check bi ei = - let concerned_intervals = - M.concerned_intervals - Int_Interv.fuzzy_order (bi,ei) offs2 - in - List.iter - (fun (_,(b,_v)) -> if not b then raise Int_Interv.Not_fully_included) - concerned_intervals - in - let f (bi,ei) _ acc = - match acc with - None -> - (* (* now we do something about -**..bi *) - if Int.neq bi Int.min_int - then check Int.min_int (Int.pred bi);*) - Some ei - | Some ek -> - let pbi = Int.pred bi in - if Int.lt ek pbi - then check (Int.succ ek) pbi; - Some ei - in - match M.fold f offs1 None with - | None -> () - | Some _ek -> - (* if Int.lt ek Int.max_int - then check (Int.succ ek) Int.max_int *) - () - - let is_included_aux offs1 offs2 = - if offs1 != offs2 then - match offs1, offs2 with - | Map offs1, Map offs2 -> - let treat_itv (_bi, _ei as i) (di,vi) = - let concerned_intervals = - M.concerned_intervals Int_Interv.fuzzy_order i offs2 - in - Int_Interv.check_coverage i concerned_intervals; - List.iter - (fun ((_bj, _ej),(dj,vj)) -> - if (di && (not dj)) || not (V.is_included vi vj) then - raise Int_Interv.Not_fully_included; - ) concerned_intervals - in - M.iter treat_itv offs1 ; - check_inter offs1 offs2 - | Degenerate _v1, Map _offs2 -> - raise Int_Interv.Not_fully_included - | _, Degenerate v2 -> - if not (V.is_included (collapse offs1) v2) - then raise Int_Interv.Not_fully_included - - let is_included m1 m2 = - try is_included_aux m1 m2; true - with Int_Interv.Not_fully_included -> false - - let join mm1 mm2 = -(* check_contiguity(mm1); - check_contiguity(mm2); -*) - if mm1 == mm2 then mm1 else - let result = map2 - (fun v1 v2 -> match v1,v2 with - | None, None -> assert false - | Some v , None | None, Some v -> true, snd v - | Some v1, Some v2 -> - (fst v1 || fst v2), (V.join (snd v1) (snd v2))) - mm1 mm2 - in -(* check_contiguity(result);*) - result - - (* map [f] on [offs] and merge with [acc] *) - let map_and_merge f offs acc = -(* check_contiguity(acc); - check_contiguity(offs);*) - let generic_f v1 v2 = match v1,v2 with - | None, None -> assert false - | Some (d,v), None -> - d,f v - | None, Some vv -> vv - | Some (d1,v1), Some (d2,v2) -> - d1&&d2, - if d1 then V.join (f v1) v2 else f v1 - in -(* Format.printf "@[Offsetmap.map_and_merge offs:%a and acc:%a@]@." - (pretty) offs - (pretty) acc; -*) - let result = map2 generic_f offs acc in -(* check_contiguity(result);*) - result - -(* this code was copied from the non-bitwise lattice, it could be shared - if it was placed in M. TODO PC 2007/02 *) - let copy_paste_map ~f from start stop start_to _to = - let result = - let ss = start,stop in - let to_ss = start_to, Int.sub (Int.add stop start_to) start in - (* First removing the bindings of the destination interval *) - let _to = M.remove_itv Int_Interv.fuzzy_order to_ss _to in - let concerned_itv = - M.concerned_intervals Int_Interv.fuzzy_order ss from - in - let offset = Int.sub start_to start in - let current = ref start in - let f, treat_empty_space = - match f with - Some (f, default) -> f, - (fun acc i -> - let src_b = !current in - if Int.le i src_b - then acc - else - let src_e = Int.pred i in - let dest_itv = Int.add (!current) offset, Int.add src_e offset in - (* Format.printf "treat_empty ib=%a ie=%a@." - Int.pretty src_b - Int.pretty src_e;*) - add_map_internal dest_itv (f (true, default src_b src_e)) acc) - | None -> (fun x -> x), (fun acc _i -> acc) - in - let treat_interval ((b,_) as i,v) acc = - let acc = treat_empty_space acc b in - let new_vv = f v in - let src_b, src_e = Int_Interv.clip_itv ss i in - let dest_i = Int.add src_b offset, Int.add src_e offset in - current := Int.succ src_e; - (*Format.printf "treat_itv: ib=%a ie=%a v=%a dib=%a die=%a@." - Int.pretty (fst i) Int.pretty (snd i) - V.pretty v - Int.pretty (fst dest_i) Int.pretty (snd dest_i);*) - add_map_internal dest_i new_vv acc - in - let acc = List.fold_right treat_interval concerned_itv _to in - treat_empty_space acc (Int.succ stop) - in -(* Format.printf "Offsetmap_bitwise.copy_paste from:%a start:%a stop:%a start_to:%a to:%a result:%a@\n" - (pretty) (Map from) - Int.pretty start - Int.pretty stop - Int.pretty start_to - (pretty) (Map _to) - (pretty) (Map result); -*) - result - - let copy_paste ~f from start stop start_to _to = - match from, _to with - Map from, Map _to -> Map (copy_paste_map ~f from start stop start_to _to) - | _, _ -> - let collapse_from = collapse from in - let value_from = - ( match f with - Some (f,_default) -> - (snd (f (true,collapse_from))) - | None -> collapse_from ) - in - Degenerate (V.join value_from (collapse _to)) - - let copy_merge from start stop start_to _to = - let old_value = - copy_paste ~f:None - _to start_to - (Int.sub (Int.add start_to stop) start) - start empty - in - let merged_value = join old_value from in - copy_paste ~f:None merged_value start stop start_to _to - - let copy ~f from start stop = - copy_paste ~f from start stop Int.zero empty - -end - -(* -Local Variables: -compile-command: "make -C ../.." -End: -*) diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/offsetmap_bitwise.mli frama-c-20150201+sodium+dfsg/src/memory_state/offsetmap_bitwise.mli --- frama-c-20140301+neon+dfsg/src/memory_state/offsetmap_bitwise.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/offsetmap_bitwise.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -(** Undocumented. - Do not use this module if you don't know what you are doing. *) - -(* [JS 2011/10/03] To the authors/users of this module: please document it. *) - -open Abstract_interp -open Lattice_Interval_Set - -type itv = Int.t * Int.t - -module Make(V: Lattice_type.Bounded_Join_Semi_Lattice) : sig - - include Datatype.S_no_copy - val degenerate : V.t -> t - val pretty_with_type_generic_printer : - Cil_types.typ option -> (Format.formatter -> V.t -> unit) -> string -> - Format.formatter -> t -> unit - val pretty_with_type : Cil_types.typ option -> Format.formatter -> t -> unit - - val empty : t - val is_empty : t -> bool - - val find : (Int.t -> Int.t -> V.t) -> itv -> t -> V.t - - val add : itv -> V.t -> t -> t - val add_approximate : - itv -> V.t -> t -> t - val collapse : t -> V.t - val find_iset : - (Int.t -> Int.t -> V.t) -> V.t -> - Int_Intervals.t -> t -> V.t - - val add_iset : exact:bool -> Int_Intervals.t -> V.t -> t -> t - val join : t -> t -> t - val joindefault : t -> t - val is_included : t -> t -> bool - val map_and_merge : (V.t -> V.t) -> t -> t -> t - val map : (bool * V.t -> bool * V.t) -> t -> t - val map2 : - ((bool * V.t) option -> (bool * V.t) option -> bool * V.t) - -> t -> t -> t - val fold : - (Int_Intervals.t -> bool * V.t -> 'a -> 'a) -> t -> 'a -> 'a - val fold_fuse_same: - (Int_Intervals.t -> bool * V.t -> 'a -> 'a) -> t -> 'a -> 'a - (** Same behavior as [fold], except if two disjoint intervals [r1] and [r2] - are mapped to the same value and boolean. In this case, [fold] will call - its argument [f] on [r1], then on [r2]. [fold_fuse_same] will call it - directly on [r1 U r2], where U is the join on sets of intervals. *) - - val copy_paste : - f:((bool*V.t -> bool*V.t) * (Int.t -> Int.t -> V.t)) option -> - t -> Int.t -> Int.t -> Int.t -> t -> t - - val copy_merge : t -> Int.t -> Int.t -> Int.t -> t -> t - val copy : - f:((bool*V.t -> bool*V.t) * (Int.t -> Int.t -> V.t)) option -> - t -> Int.t -> Int.t -> t - -end - -(* -Local Variables: -compile-command: "make -C ../.." -End: -*) diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/offsetmap_bitwise_sig.mli frama-c-20150201+sodium+dfsg/src/memory_state/offsetmap_bitwise_sig.mli --- frama-c-20140301+neon+dfsg/src/memory_state/offsetmap_bitwise_sig.mli 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/offsetmap_bitwise_sig.mli 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,138 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) + +(** Signature for {!Offsetmap_bitwise} module, that implement efficient maps + from intervals to values. + + Values are simpler than those of the {!Offsetmap_sig} module: given a value + [v] bound to an interval [i], all sub-intervals of [i] are implicitly also + bound to [v]. If you need e.g. to extract the k-th bit of the interval to + retrieve a more precise value, you must use the {!Offsetmap} module + instead. *) + + +type v (** Type of the values stored in the offsetmap *) +include Datatype.S (** Datatype for the offsetmap *) + +type intervals + +(** {2 Pretty-printing} *) + +val pretty: t Pretty_utils.formatter +val pretty_generic : + ?typ:Cil_types.typ -> + ?pretty_v:(Format.formatter -> v -> unit) -> + ?skip_v:(v -> bool) -> + ?sep:string -> + unit -> + Format.formatter -> t -> unit + +val pretty_debug: t Pretty_utils.formatter + + +(** {2 Join and inclusion testing} *) + +val join : t -> t -> t +val is_included : t -> t -> bool + + +(** {2 Finding values} *) + +val find : Int_Intervals_sig.itv -> t -> v +val find_iset : validity:Base.validity -> intervals -> t -> v + + +(** {2 Adding values} *) + +val add_binding_intervals : + validity:Base.validity -> exact:bool -> intervals -> v -> t -> [`Map of t | `Bottom] +val add_binding_ival : + validity:Base.validity -> + exact:bool -> Ival.t -> size:Int_Base.t -> v -> t -> [`Map of t | `Bottom] + + +(** {2 Creating an offsetmap} *) + +val create: size:Integer.t -> v -> t + + +(** {2 Iterators} *) + +val map : (v -> v) -> t -> t + +type map2_decide = + ReturnLeft | ReturnRight | ReturnConstant of v | Recurse +(** See the documentation of type {!Offsetmap_sig.map2_decide} *) + +val map2: + Hptmap.cache_type -> (t -> t -> map2_decide) -> (v -> v -> v) -> t -> t -> t +(** See the documentation of function {!Offsetmap_sig.map2_on_values}. *) + + +val fold : (intervals -> v -> 'a -> 'a) -> t -> 'a -> 'a +val fold_fuse_same: (intervals -> v -> 'a -> 'a) -> t -> 'a -> 'a +(** Same behavior as [fold], except if two disjoint intervals [r1] and [r2] + are mapped to the same value and boolean. In this case, [fold] will call + its argument [f] on [r1], then on [r2]. [fold_fuse_same] will call it + directly on [r1 U r2], where U is the join on sets of intervals. *) + +val fold_itv: + (Int_Intervals_sig.itv -> v -> 'a -> 'a) -> Int_Intervals_sig.itv -> t -> 'a -> 'a + +(** [fold_join f join vempty itvs m] is an implementation of [fold] that + restricts itself to the intervals in [itvs]. Unlike in [fold] (where the + equivalent of [f] operates on an accumulator), [f] returns a value on each + sub-interval independently. The results are joined using [joined]. + [vempty] is the value that must be returned on {!Int_Intervals.bottom}. + This function uses a cache internally. Hence, it must be partially + applied to its first three arguments. If you do not need a cache, use + [fold] instead. *) +val fold_join_itvs: + cache:Hptmap.cache_type -> + (Integer.t -> Integer.t -> v -> 'a) -> + ('a -> 'a -> 'a) -> + 'a -> + intervals -> t -> 'a + + +(** {2 Shape} *) + +(** [is_single_interval ?f o] is true if + (1) the offsetmap [o] contains a single binding + (2) either [f] is [None], or the bound value [v] verifies [f v]. *) +val is_single_interval: ?f:(v -> bool) -> t -> bool + +val single_interval_value: t -> v option +(** [single_interval_value o] returns [Some v] if [o] contains a single + interval, to which [v] is bound, and [None] otherwise. *) + + +(** {2 Misc} *) + +(** Clear the caches local to this module. Beware that they are not + project-aware, and that you must call them at every project switch. *) +val clear_caches: unit -> unit + + +(**/**) + +val imprecise_write_msg: string ref diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/offsetmap_lattice_with_isotropy.mli frama-c-20150201+sodium+dfsg/src/memory_state/offsetmap_lattice_with_isotropy.mli --- frama-c-20140301+neon+dfsg/src/memory_state/offsetmap_lattice_with_isotropy.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/offsetmap_lattice_with_isotropy.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -26,9 +26,12 @@ include Bounded_Join_Semi_Lattice include With_Top with type t := t +include With_Narrow with type t := t include With_Widening with type t := t include With_Cardinal_One with type t := t +val pretty_typ: Cil_types.typ option -> t Pretty_utils.formatter + (** Are the bits independent? *) val is_isotropic : t -> bool @@ -46,7 +49,7 @@ val little_endian_merge_bits : topify:Origin.kind -> conflate_bottom:bool -> - total_length:int -> value:t -> offset:Integer.t -> t -> t + value:t -> offset:Integer.t -> t -> t val big_endian_merge_bits : topify:Origin.kind -> diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/offsetmap.ml frama-c-20150201+sodium+dfsg/src/memory_state/offsetmap.ml --- frama-c-20140301+neon+dfsg/src/memory_state/offsetmap.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/offsetmap.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -38,35 +38,71 @@ let succ = Integer.succ let pred = Integer.pred +let dkey_caches = Kernel.register_category "offsetmap:caches" + +(** Offsetmaps are unbalanced trees that map intervals to values, with + the additional properties that the shape of the tree is entirely determined + by the intervals that are mapped. The intervals are contiguous (offsetmaps + cannot contain holes), and sorted from left to right in the tree. + + In this file, offsetmaps are represented in a relative way to maximise + sharing. An offsetmap alone does not "know" which intervals it represents. + When iterating on it, it is necessary to maintain a *current offset*, which + is the lower index of the interval at the top of the tree. ( *Not* of the + leftmost interval, which is the smallest binding.) *) +type 'a offsetmap = +| Empty + +| Node of + Integer.t * + (** Relative, upper index of the interval. Thus the interval has length + [max+1]. The relative lower index of the interval is always zero by + definition. *) + Integer.t * 'a offsetmap * + (** subtree on the left: the offset [offl] of its root (relative to 0), + and the tree [subl]. If [subl] is not empty, it maps at least one + interval, and [offl] is strictly negative. If [subl] is empty, + then [offl] is zero. *) + Integer.t * 'a offsetmap + (** subtree on the right: the offset [offr] of its root (relative to 0), + and the tree [subr]. [offr] is greater than [max+1] by definition, + and equal to it if [subr] is empty. ([offr] may also be equal to + [max+1] with a non-empty [subr], when the interval at the root of + [subr] starts exactly at [max+1].) *) * + Rel.t * Integer.t * 'a + (** rem * size * value, ie. the value, its size [size] and its alignment + [rem] relative to the start of the interval. [size] can be: + - strictly more than [max+1], in which case the value is truncated + - equal to [max+1]: + * if [rem] is zero, the value is stored exactly once in the interval + * otherwise, two truncated instances of the value are stored + consecutively. + - strictly less than [max+1]: the value is stored more than once, + and implictly repeats itself to fill the entire interval. *) * + int + (** tag: hash-consing id of the node, plus an additional boolean. + Not related to the contents of the tree. *) + +(** plevel-related operation: value + hooks to call when the value is modified*) +let plevel = ref 200 +let plevel_hook = ref [] +let set_plevel i = + List.iter (fun f -> f ()) !plevel_hook; + plevel := i +let add_plevel_hook f = plevel_hook := f :: !plevel_hook +let get_plevel () = !plevel + +let debug = false module Make (V : module type of Offsetmap_lattice_with_isotropy) = struct open Format - exception Result_is_bottom - type v = V.t type widen_hint = V.widen_hint + type alarm = bool - type tt = - | Empty - (* min, the lower bound of the key interval, is always zero because - trees are relative. - - max * - offset_left * subtree_left * - offset_right * subtree_right * - rem * modu * value * - tag - *) - | Node of - Integer.t * - Integer.t * tt * - Integer.t * tt * - Rel.t * Integer.t * V.t * - int - - let equal (t1:tt) (t2:tt) = t1 == t2 + let equal (t1:V.t offsetmap) (t2:V.t offsetmap) = t1 == t2 let compare t1 t2 = match t1, t2 with | Empty, Empty -> 0 @@ -106,6 +142,32 @@ Format.fprintf fmt "@[%a@]" (pretty_offset_aux "r" Integer.zero) t; ;; + let pretty_debug_offset fmt (curr_off, tree) = + let rec aux_pdebug fmt (curr_off, tree) = + match tree with + | Empty -> Format.fprintf fmt "empty" + | Node (max, offl, subl, offr, subr, rem, modu, v, tag) -> + Format.fprintf fmt "@[@[[%a..%a]@ (%a, %a,@ %a){%d,%x}@]@\n@[-- \ + %a -->@\n%a@]@\n@[-- %a -->@\n%a@]@]" + pretty_int curr_off + pretty_int (curr_off +~ max) + Rel.pretty rem + pretty_int modu + V.pretty v + tag + (Extlib.address_of_value tree) + pretty_int offl + aux_pdebug (curr_off +~ offl, subl) + pretty_int offr + aux_pdebug (curr_off +~ offr, subr) + in + aux_pdebug fmt (curr_off, tree); + Format.fprintf fmt "@\n"; + ;; + + let pretty_debug fmt m = pretty_debug_offset fmt (Integer.zero, m);; + + include (struct @@ -118,13 +180,13 @@ let rehash_ref = ref (fun _ -> assert false) module D = Datatype.Make (struct - type t = tt - let name = V.name ^ " newoffsetmap" + type t = V.t offsetmap + let name = Printf.sprintf "Offsetmap(%s)" V.name let reprs = [ Empty ] open Structural_descr let r = Recursive.create () let structural_descr = - let p_bint = Datatype.Big_int.packed_descr in + let p_bint = Datatype.Integer.packed_descr in t_sum [| [| p_bint; p_bint; @@ -149,7 +211,9 @@ include D (* Basic operations on nodes *) - let empty = Empty;; + let m_empty = Empty (* Empty is not exported, and we cannot make it private. + Instead, we use m_empty to track the places where we + create something empty *) let is_empty t = t == Empty let equal_internal t1 t2 = @@ -224,7 +288,7 @@ hashed_node let rehash_node x = match x with - | Empty -> empty + | Empty -> Empty | Node _ -> NewoHashconsTbl.merge x @@ -232,8 +296,9 @@ end : sig - include Datatype.S with type t = tt - val empty : t + include Datatype.S with type t = V.t offsetmap + + val m_empty : t val hash: t -> int val nNode : Integer.t -> @@ -245,13 +310,16 @@ val singleton_tag : t -> int end) + type t_bottom = [ `Bottom | `Map of t] + type t_top_bottom = [ `Bottom | `Map of t | `Top ] + module Cacheable = struct - type t = Integer.t * tt + type t = Integer.t * V.t offsetmap let hash (i, t: t) = Integer.hash i + 37 * hash t let equal (i1, t1: t) (i2, t2: t) = t1 == t2 && i1 =~ i2 - let sentinel = Integer.minus_one, empty + let sentinel = Integer.minus_one, m_empty end - let clear_caches = ref [] + let clear_caches_ref = ref [] let equal_vv (rem1, modu1, v1) (rem2, modu2, v2) = @@ -294,10 +362,10 @@ ;; - type zipper = + type 'a zipper = | End - | Right of Integer.t * t * zipper - | Left of Integer.t * t * zipper;; + | Right of Integer.t * 'a offsetmap * 'a zipper + | Left of Integer.t * 'a offsetmap * 'a zipper;; (** Zippers : Offset of a node * Node * continuation of the zipper *) exception End_reached;; @@ -377,10 +445,10 @@ | Empty -> assert false ;; - type imp_zipper = { + type 'a imp_zipper = { mutable offset: Integer.t; - mutable node: t; - mutable zipper: zipper; + mutable node: 'a offsetmap; + mutable zipper: 'a zipper; };; let imp_move_right imp_z = @@ -390,18 +458,19 @@ imp_z.zipper <- z; ;; - (* Minimum and maximum bit bounds in the offsetmap (inclusively), assumming + (* Minimum and maximum bit bounds in the offsetmap (inclusively), assuming that [m] starts at [curr_off]. Usually not required, as we use [validity] arguments, that give the size of the offsetmap. Beware that this function - returns something incorrect if [m] is [Empty]. *) + must not be called on empty offsetmaps. *) let bounds_offset curr_off m = let rec min curr_off = function - | Empty -> curr_off + | Empty -> curr_off (* This bit is bound, unless [m] itself is empty *) | Node (_, offl, subl, _, _, _, _, _, _) -> min (curr_off +~ offl) subl and max curr_off = function - | Empty -> curr_off + | Empty -> pred curr_off (* [curr_off] is not bound, [curr_off-1] is. *) | Node (_, _, _, offr, subr, _, _, _, _) -> max (curr_off +~ offr) subr in + assert (m != Empty); (min curr_off m, max curr_off m) let _bounds m = bounds_offset Int.zero m @@ -411,39 +480,50 @@ / \ iter f t = f n1; fn0; f n2; n1 n2 *) - let fold_offset f o t = - let o, n, z = leftmost_child o End t in - let rec aux_fold o t z pre = - match t with - | Empty -> pre - | Node (max, _, _, _, _, r, m, v, _) -> - let abs_max = max +~ o in - let now = f (o, abs_max) (v, m, r) pre in - try - let no, nt, nz = move_right o t z in - aux_fold no nt nz now - with End_reached -> now - in aux_fold o n z + let fold_offset f o t acc = + if t = Empty then + acc + else + let o, n, z = leftmost_child o End t in + let rec aux_fold o t z pre = + match t with + | Empty -> pre + | Node (max, _, _, _, _, r, m, v, _) -> + let abs_max = max +~ o in + let now = f (o, abs_max) (v, m, r) pre in + let no, nt, nz = + try move_right o t z + with End_reached -> (* Use match ... with exception in 4.02 *) + abs_max, Empty, z (* End the recursion at next iteration *) + in + aux_fold no nt nz now + + in + aux_fold o n z acc ;; let fold f t = fold_offset f Integer.zero t ;; let iter_offset f o t = - let o, n, z = leftmost_child o End t in - let rec aux_iter o t z = - match t with - | Empty -> () - | Node (max, _, _, _, _, r, m, v, _) -> - begin - let abs_max = max +~ o in - f (o, abs_max) (v, m, r); - try - let no, nt, nz = move_right o t z in - aux_iter no nt nz - with End_reached -> () - end - in aux_iter o n z + if t <> Empty then + let o, n, z = leftmost_child o End t in + let rec aux_iter o t z = + match t with + | Empty -> () + | Node (max, _, _, _, _, r, m, v, _) -> + begin + let abs_max = max +~ o in + f (o, abs_max) (v, m, r); + let no, nt, nz = + try move_right o t z + with End_reached -> + abs_max, Empty, z (* End the recursion at next iteration *) + in + aux_iter no nt nz + end + in + aux_iter o n z ;; let iter f t = iter_offset f Integer.zero t @@ -453,24 +533,23 @@ let rec iter_on_values f t = match t with | Empty -> () - | Node (_, _, left, _, right, _, modu, v, _) -> + | Node (_, _, left, _, right, _, _, v, _) -> iter_on_values f left; - f v modu; + f v; iter_on_values f right ;; let rec fold_on_values f t acc = match t with | Empty -> acc - | Node (_, _, left, _, right, _, modu, v, _) -> - fold_on_values f right (f v modu ((fold_on_values f left acc))) + | Node (_, _, left, _, right, _, _, v, _) -> + fold_on_values f right (f v ((fold_on_values f left acc))) ;; (** Smart constructor for nodes: it glues the node being allocated to potential candidates if needed (i.e. leftmost node of right subtree and rightmost node of left subtree), *) - let make_node curr_off max offl subl offr subr rem modu v = let rem, modu = if V.is_isotropic v @@ -478,7 +557,6 @@ else rem, modu in let curr_vv = (rem, modu, v) in - let max, offr, subr = try let offset, nr, zr = @@ -509,7 +587,8 @@ | Node (nmax, noffl, nsubl , _, noffr, nrelrem, nmodu, nv, _) -> assert (is_empty noffr); let nrem = (Rel.add_abs offset nrelrem) %~ nmodu in - if equal_vv (nrem, nmodu, nv) curr_vv && (curr_off %~ modu =~ rem) + if equal_vv (nrem, nmodu, nv) curr_vv && + (V.cardinal_zero_or_one v || (curr_off %~ modu =~ rem)) then ( let new_curr_offl, new_subl = rezip zl (offset +~ noffl) nsubl in let succ_nmax = succ nmax in @@ -527,6 +606,21 @@ curr_off, nNode max offl subl offr subr remrel modu v ;; + (* Creates the tree representing the interval [curr_off..cur_off+span], + bound to [v] *) + let interval_aux curr_off span rem modu v = + let remrel, modu = + if V.is_isotropic v + then Rel.zero, Integer.one + else Rel.pos_rem (Rel.sub_abs rem curr_off) modu, modu + in + curr_off, + nNode span Integer.zero m_empty (succ span) m_empty remrel modu v + + (* creates a fresh tree that binds [0..size-1] to the isotropic value [v] *) + let isotropic_interval size v = + nNode (pred size) Integer.zero m_empty size m_empty Rel.zero Integer.one v + (** Smart add node: Adds a node to the current tree and merges (new) consecutive intervals containing the same values @@ -535,12 +629,11 @@ Hypothesis: the tree is in canonical form w.r.t having no mergeable intervals. *) - let add_node min max rem modu v curr_off tree = + let add_node ~min ~max rem modu v curr_off tree = let rec aux_add curr_off tree = match tree with | Empty -> - let sz = max -~ min in - make_node min sz Integer.zero empty (succ sz) empty rem modu v + interval_aux min (max -~ min) rem modu v | Node (nmax, noffl, nsubl, noffr, nsubr, nremrel, nmodu, nv, _) -> let nrem = (Rel.add_abs curr_off nremrel) %~ nmodu in let abs_min = curr_off @@ -550,7 +643,7 @@ if is_above min max abs_min abs_max then let new_offr = abs_min -~ min in (*Format.printf "add to the left above@."; *) - make_node min (max -~ min) Integer.zero empty + make_node min (max -~ min) Integer.zero m_empty new_offr tree rem modu v else begin @@ -574,9 +667,8 @@ let new_offl = abs_min -~ min in let new_max = max -~ min in make_node - min new_max new_offl tree (succ new_max) empty rem modu v + min new_max new_offl tree (succ new_max) m_empty rem modu v end - else begin (* Format.printf "add to the right Not ABOVE@."; *) @@ -592,22 +684,20 @@ in aux_add curr_off tree ;; - let add_node_from_root ~min ~max ~rem ~modu ~v t = - snd (add_node min max rem modu v Integer.zero t) - - let add_basic_node ~min ~max ~v m = + (* Bind the interval [min..max] to [v], and append it to the zero-rooted + map [t]. [rem] and [modu] are inferred by considering that [min..max] binds + a single value (unless [v] is isotropic) *) + let append_basic_itv ~min ~max ~v m = if V.is_isotropic v then - add_node_from_root ~min ~max ~rem:Integer.zero ~modu:Integer.one ~v m + snd (add_node ~min ~max Integer.zero Integer.one v Integer.zero(*co*) m) else let size = Integer.length min max in let v = V.anisotropic_cast ~size v in let rem = min %~ size in - add_node_from_root ~min ~max ~rem ~modu:size ~v m - + snd (add_node ~min ~max rem size v Integer.zero(*co*) m) (** Checks that [tree] is sanely built *) - - let rec _check curr_off tree = + let rec check_aux curr_off tree = match tree with | Empty -> () | Node (max, offl, subl, offr, subr, rem, modu, _v, _) -> @@ -624,10 +714,17 @@ let nabs_max = nmax +~ nabs_min in assert (is_above abs_min abs_max nabs_min nabs_max) in aux offl subl; aux offr subr; - _check (curr_off +~ offl) subl; - _check (curr_off +~ offr) subr; + check_aux (curr_off +~ offl) subl; + check_aux (curr_off +~ offr) subr; ;; + let _check curr_off tree = + try check_aux curr_off tree + with Assert_failure _ as e -> + Kernel.result "INVALID@.%a@." _pretty_offset (curr_off, tree); + raise e + + (** Inclusion functions *) (* Auxiliary fonction for inclusion: check that, between [mabs_min] and @@ -649,11 +746,13 @@ then V.is_included v1 v2 else false - (* Functional for inclusion test. *) - let is_included_aux cache (o1, t1) (o2, t2) = + (* Functional for inclusion test. For this function, the equality + [bounds o1 t1 = bounds o2 t2] does not need to hold. We test the inclusion + for the range that is common to both trees. *) + let is_included_aux_cache cache (o1, t1) (o2, t2) = match t1, t2 with - | Empty, _ -> true (* BYTODO *) - | _, Empty -> true (* BYTODO *) + | Empty, _ | _, Empty -> + true (* no common range. By definition, the inclusion holds *) | Node (max1, offl1, subl1, offr1, subr1, r1rel, m1, v1, _), Node (max2, offl2, subl2, offr2, subr2, r2rel, m2, v2, _) -> let amin1 = o1 in @@ -747,16 +846,15 @@ end ;; - module IsIncludedCache = Binary_cache.Make_Binary(Cacheable)(Cacheable) - let () = clear_caches := IsIncludedCache.clear :: !clear_caches;; + module IsIncludedCache = Binary_cache.Binary_Predicate(Cacheable)(Cacheable) + let () = clear_caches_ref := IsIncludedCache.clear :: !clear_caches_ref;; + + let rec is_included_aux t1 t2 = + Cacheable.equal t1 t2 || + is_included_aux_cache (IsIncludedCache.merge is_included_aux) t1 t2 let is_included t1 t2 = - let rec aux t1 t2 = - if Cacheable.equal t1 t2 - then true - else is_included_aux (IsIncludedCache.merge aux) t1 t2 - in - aux (Integer.zero, t1) (Integer.zero, t2) + is_included_aux (Integer.zero, t1) (Integer.zero, t2) ;; (** Joins two trees with no overlapping intervals. *) @@ -769,7 +867,7 @@ match t1, t2 with | Empty, Empty -> assert (t1_curr_off =~ t2_curr_off); - t1_curr_off, empty + t1_curr_off, t1 | Empty, Node _ -> t2_curr_off, t2 | Node _, Empty -> t1_curr_off, t1 | Node (lmax, loffl, lsubl, loffr, lsubr, lremrel, lmodu, lv, _), @@ -806,8 +904,13 @@ [cache] must be used for recursive calls on subtrees. [f_aux] is the function that merges the intervals point-wise. *) let merge cache f_aux (o1, t1) (o2, t2) = + if debug then (* the two trees must span the exact same range. *) + assert ((t1 == Empty && t2 == Empty && o1 =~ o2) || + let ib1, ie1 = bounds_offset o1 t1 in + let ib2, ie2 = bounds_offset o2 t2 in + ib1 =~ ib2 && ie1 =~ ie2); match t1, t2 with - | Empty, Empty -> assert false + | Empty, Empty -> o1, t1 | Node _, Empty -> assert false | Empty, Node _ -> assert false | Node (max1, offl1, subl1, offr1, subr1, rem1rel, modu1, v1, _), @@ -816,39 +919,12 @@ and abs_max1 = max1 +~ o1 and abs_min2 = o2 and abs_max2 = max2 +~ o2 + and rem1 = (Rel.add_abs o1 rem1rel) %~ modu1 + and rem2 = (Rel.add_abs o2 rem2rel) %~ modu2 in - let rem1 = (Rel.add_abs o1 rem1rel) %~ modu1 in - let rem2 = (Rel.add_abs o2 rem2rel) %~ modu2 in - if abs_min2 >~ abs_max1 then - if is_above abs_min1 abs_max1 abs_min2 abs_max2 - then (* t2 is on the right of t1 *) - let off, t = cache (o1 +~ offr1, subr1) (o2, t2) in - make_node o1 max1 offl1 subl1 (off -~ o1) t rem1 modu1 v1 - else(* t1 is on the left of t2 *) - begin - (* Format.printf "t2:[%a %a] %a @.t1:[%a %a] %a@." pretty_int - abs_min2 pretty_int abs_max2 (pretty_debug_offset o2) t2 - pretty_int abs_min1 - pretty_int abs_max1 (pretty_debug_offset o1) t1; *) - (* assert (is_above abs_min2 abs_max2 abs_min1 abs_max1); *) - let off, t = cache (o1, t1) (o2 +~ offl2, subl2) in - make_node o2 max2 (off -~ o2) t offr2 subr2 rem2 modu2 v2 - end - else if abs_min1 >~ abs_max2 then - if is_above abs_min1 abs_max1 abs_min2 abs_max2 - then - (* t2 is on the left of t1 *) - let off, t = cache (o1 +~ offl1, subl1) (o2, t2) in - make_node o1 max1 (off -~ o1) t offr1 subl1 rem1 modu1 v1 - else - begin - assert (is_above abs_min2 abs_max2 abs_min1 abs_max1); - (* t1 is on the right of t2 *) - let off, t = cache (o1, t1) (o2 +~ offr2, subr2) in - make_node o2 max2 offl2 subl2 (off -~ o2) t rem2 modu2 v2 - end - else - (* here n1 \inter n2 <> \emptyset: + if debug then assert (abs_min2 <=~ abs_max1 && abs_min1 <=~ abs_max2); + (* here n1 \inter n2 <> \emptyset, given the invariants on offsetmaps + shape and the fact that both trees cover the same range. -compute the intersection interval: middle_abs_min, middle_abs_max - add the rest of the nodes to their left/right subtree depending on the size of the node @@ -862,14 +938,13 @@ cache (abs_offl1, subl1) (abs_offl2, subl2), abs_min1 else if abs_min1 <~ abs_min2 then let new_offl1, new_subl1 = - add_node abs_min1 (pred abs_min2) + add_node ~min:abs_min1 ~max:(pred abs_min2) rem1 modu1 v1 abs_offl1 subl1 in cache (new_offl1, new_subl1) (abs_offl2, subl2), abs_min2 else - begin - assert (abs_min1 >~ abs_min2); + begin (* abs_min1 >~ abs_min2 *) let new_offl2, new_subl2 = - add_node abs_min2 (pred abs_min1) rem2 modu2 + add_node ~min:abs_min2 ~max:(pred abs_min1) rem2 modu2 v2 abs_offl2 subl2 in cache (abs_offl1, subl1) (new_offl2, new_subl2), abs_min1 end @@ -882,28 +957,44 @@ else if abs_max1 <~ abs_max2 then let new_offr2, new_subr2 = add_node - (succ abs_max1) abs_max2 rem2 modu2 v2 abs_offr2 subr2 + ~min:(succ abs_max1) ~max:abs_max2 + rem2 modu2 v2 abs_offr2 subr2 in cache (abs_offr1, subr1) (new_offr2, new_subr2), abs_max1 else - begin - assert (abs_max1 >~ abs_max2); + begin (* abs_max1 >~ abs_max2 *) let min = (succ abs_max2) in let new_offr1, new_subr1 = - add_node min abs_max1 rem1 modu1 v1 abs_offr1 subr1 + add_node ~min ~max:abs_max1 rem1 modu1 v1 abs_offr1 subr1 in cache (new_offr1, new_subr1) (abs_offr2, subr2), abs_max2 end in - let rem, modu, v = f_aux middle_abs_min middle_abs_max rem1 modu1 v1 rem2 modu2 v2 in let curr_offl, left_t = - add_node middle_abs_min middle_abs_max rem modu v curr_offl left_t + add_node ~min:middle_abs_min ~max:middle_abs_max + rem modu v curr_offl left_t in union curr_offl left_t curr_offr right_t ;; + let rec map_on_values_aux f curr_off t = + match t with + | Empty -> curr_off, t + | Node (max, offl, subl, offr, subr, relrem, modu, v, _) -> + let v' = f v in + let offl', l' = map_on_values_aux f (curr_off +~ offl) subl in + let offr', r' = map_on_values_aux f (curr_off +~ offr) subr in + if l' == subl && r' == subr && V.equal v v' + then curr_off, t + else + let rem = (Rel.add_abs curr_off relrem) %~ modu in + make_node + curr_off max (offl' -~ curr_off) l' (offr' -~ curr_off) r' rem modu v' + ;; + + let map_on_values f t = snd (map_on_values_aux f Int.zero t);; let extract_bits ~start ~stop ~modu v = assert (start <=~ stop && stop <=~ modu); @@ -917,16 +1008,13 @@ V.extract_bits ~start ~stop ~size:modu v ;; - let merge_bits ~conflate_bottom ~offset ~length ~value ~total_length acc = + let merge_bits ~topify ~conflate_bottom ~offset ~length ~value ~total_length acc = assert (length +~ offset <=~ Integer.of_int total_length); if Cil.theMachine.Cil.theMachine.Cil_types.little_endian then - V.little_endian_merge_bits - ~conflate_bottom - ~offset ~value ~total_length acc + V.little_endian_merge_bits ~topify ~conflate_bottom ~offset ~value acc else V.big_endian_merge_bits - ~conflate_bottom - ~offset ~value ~total_length ~length acc + ~topify ~conflate_bottom ~offset ~value ~total_length ~length acc ;; (* @@ -936,7 +1024,6 @@ [acc] is the current state of accumulated reads. *) let extract_bits_and_stitch ~topify ~conflate_bottom ~offset ~size curr_off (rem, modu, v) max acc = - let inform = ref false in let r = let abs_max = curr_off +~ max in (* last bit to be read, @@ -967,9 +1054,11 @@ pretty_int start pretty_int stop pretty_int size pretty_int offset pretty_int max_bit pretty_int curr_off pretty_int rem pretty_int modu V.pretty v ; *) - let this_inform, read_bits = extract_bits ~topify ~start ~stop ~modu v in + (* we ignore the 'inform' information here (and everywhere else in + this module, since we do not propagate it), because it is mostly + redundant with the 'origin' information in garbled mix *) + let _inform, read_bits = extract_bits ~topify ~start ~stop ~modu v in (* Format.printf "After single step: read bits %a@." V.pretty read_bits; *) - inform := !inform || this_inform; let result = merge_bits ~topify ~conflate_bottom ~offset:merge_offset ~length:(Integer.length start stop) @@ -1005,14 +1094,14 @@ pretty_int offset pretty_int size pretty_int curr_off (\* pretty_int (curr_off +~ (get_max node)) *\) V.pretty v V.pretty acc V.pretty r; *) - !inform, r + r ;; (** Auxiliary function to join 2 trees with merge. The merge on two values is done by [merge_v]. Since this function can be [V.widen], the left/right order of arguments must be preserved. *) - let f_aux_merge inform merge_v abs_min abs_max rem1 modu1 v1 rem2 modu2 v2 = + let f_aux_merge merge_v abs_min abs_max rem1 modu1 v1 rem2 modu2 v2 = (* Format.printf "f_aux_merge: [%a, %a]@.(%a %a %a)@.(%a %a %a)@." pretty_int abs_min pretty_int abs_max pretty_int rem1 pretty_int modu1 V.pretty v1 pretty_int rem2 pretty_int modu2 V.pretty v2 ; *) @@ -1024,23 +1113,21 @@ rem2, modu2, joined modu2 v1 v2 else let topify = Origin.K_Merge in - let conflate_bottom = false in let offset = abs_min in let size = Integer.length abs_min abs_max in let rem = abs_min %~ size in - let this_inform1, v1' = + let v1' = if modu1 =~ size && ((rem1 %~ size) =~ rem) - then false, v1 - else extract_bits_and_stitch ~topify ~conflate_bottom + then v1 + else extract_bits_and_stitch ~topify ~conflate_bottom:false ~offset ~size offset (rem1, modu1, v1) abs_max V.merge_neutral_element in - let this_inform2, v2' = + let v2' = if modu2 =~ size && ((rem2 %~ size) =~ rem) - then false, v2 - else extract_bits_and_stitch ~topify ~conflate_bottom + then v2 + else extract_bits_and_stitch ~topify ~conflate_bottom:false ~offset ~size offset (rem2, modu2, v2) abs_max V.merge_neutral_element in - inform := !inform || this_inform1 || this_inform2; (* Format.printf "1: (%a, %a, %a);@.2: (%a, %a, %a);@.[%a--%a] -> %a/%a@." pretty_int rem1 pretty_int modu1 V.pretty v1 pretty_int rem2 pretty_int modu2 V.pretty v2 @@ -1049,26 +1136,50 @@ rem, size, merge_v v1' v2' ;; - module JoinCache = Binary_cache.Make_Symmetric(Cacheable)(Cacheable) - let () = clear_caches := JoinCache.clear :: !clear_caches;; + module JoinCache = Binary_cache.Symmetric_Binary(Cacheable)(Cacheable) + let () = clear_caches_ref := JoinCache.clear :: !clear_caches_ref;; (** Joining two trees that cover the same range *) let join t1 t2 = - let inform = ref false in - let f_join = f_aux_merge inform V.join in + let f_join = f_aux_merge V.join in let rec aux_cache t1 t2 = if Cacheable.equal t1 t2 then t1 else JoinCache.merge (merge aux_cache f_join) t1 t2 in let _, r = aux_cache (Integer.zero, t1) (Integer.zero, t2) in -(* if !inform then - Kernel.result ~current:true ~once:true - "Loss of precision during join operation"; *) r ;; + module NarrowCache = Binary_cache.Symmetric_Binary(Cacheable)(Cacheable) + let () = clear_caches_ref := NarrowCache.clear :: !clear_caches_ref;; + + let is_top = function + | Node (_, _, Empty, _, Empty, _ , _, v, _) -> V.equal v V.top + | _ -> false + + (** Narrowing two trees that cover the same range *) + let narrow t1 t2 = + let f_join = f_aux_merge V.narrow in + let rec aux_cache t1 t2 = + if Cacheable.equal t1 t2 || is_top (snd t2) then t1 + else if is_top (snd t1) then t2 + else NarrowCache.merge (merge aux_cache f_join) t1 t2 + in + let _, r = aux_cache (Integer.zero, t1) (Integer.zero, t2) in + r + ;; + + + let join_top_bottom m1 m2 = match m1, m2 with + | `Bottom, `Bottom -> `Bottom + | `Top, _ | _, `Top -> `Top + | (`Map _ as r), `Bottom | `Bottom, (`Map _ as r) -> r + | `Map m1, `Map m2 -> `Map (join m1 m2) + + let join_and_is_included t1 t2 = + let r = join t1 t2 in r, equal r t2 + let widen wh t1 t2 = - let inform = ref false in (* Due to the way f_aux_merge is designed, we can obtain intervals on which the two bindings do not verify [is_included v1 v2]. The widening operations require this, so we correct the arguments here. *) @@ -1076,19 +1187,60 @@ let v2 = if not (V.is_included v1 v2) then V.join v1 v2 else v2 in V.widen wh v1 v2 in - let f_widen = f_aux_merge inform widen in + let f_widen = f_aux_merge widen in let rec aux t1 t2 = if Cacheable.equal t1 t2 then t1 else merge aux f_widen t1 t2 in let _, r = aux (Integer.zero, t1) (Integer.zero, t2) in -(* if !inform then - Kernel.result ~current:true ~once:true - "Loss of precision during widening"; *) r ;; + type map2_decide = + ReturnLeft | ReturnRight | ReturnConstant of V.t | Recurse + + let map2_on_values_offset cache decide (f: V.t -> V.t -> V.t) = + let merge_cache = + match cache with + | Hptmap.PersistentCache _ | Hptmap.TemporaryCache _ -> + let module Map2Cache = + Binary_cache.Arity_Two(Cacheable)(Cacheable)(Cacheable) + in + (match cache with + | Hptmap.PersistentCache _ -> + clear_caches_ref := Map2Cache.clear :: !clear_caches_ref + | _ -> ()); + Map2Cache.merge + | Hptmap.NoCache -> fun f x y -> f x y + in + let f' _abs_min _abs_max _rem1 _modu1 v1 _rem2 _modu2 v2 = + Int.zero, Int.one, f v1 v2 + in + (* See the invariants a the top of {!merge}: [bounds o1 n1 = bounds o2 n2] + holds *) + let rec aux (o1, n1 as t1) (_o2, n2 as t2) = + match decide n1 n2 with + | Recurse -> + merge_cache (merge aux f') t1 t2 + | ReturnLeft -> t1 + | ReturnRight -> t2 + | ReturnConstant v -> + if n1 == Empty then begin + (o1, n1) (* [n2 == Empty] and [o1 =~ o2] hold. *) + end else begin + (* build an interval mapped to [v], of the same width as t1 and t2 *) + let ib1, ie1 = bounds_offset o1 n1 in + interval_aux ib1 (ie1 -~ ib1) Int.zero Int.one v + end + in + aux + + let map2_on_values cache decide (f: V.t -> V.t -> V.t) = + let map2_on_values_cached = map2_on_values_offset cache decide f in + fun t1 t2 -> snd (map2_on_values_cached (Int.zero, t1) (Int.zero, t2)) + + (* Given an integer i, find the interval the ith bit belongs to (thus its node) Returns: the zipper to navigate from the root to the node found, @@ -1155,8 +1307,9 @@ (* Query the offsetmap for the interval [start, start + size - 1], which is supposed to fit in the offsetmap. Assumes the offsetmap is rooted at offset 0 *) - let find_itv ~topify ~conflate_bottom ~start ~size tree period_read_ahead = + let find_itv ~conflate_bottom ~start ~size tree period_read_ahead = let z, cur_off, root = find_bit start tree in + let topify = Origin.K_Misalign_read in match root with | Empty -> (* Bit_Not_found has been raised by find_bit in this case *) @@ -1173,20 +1326,18 @@ then Some nsize else None in - false, read_ahead, v + read_ahead, v end else - let inform = ref false in let acc = ref V.merge_neutral_element in let impz = { node = root; offset = cur_off; zipper = z; } in while impz.offset <=~ isize do - let this_inform, v = + let v = extract_bits_and_stitch ~topify ~conflate_bottom ~offset:start ~size impz.offset (get_vv impz.node impz.offset) (get_max impz.node) !acc in - inform := !inform || this_inform; acc := v; if impz.offset +~ (get_max impz.node) >=~ isize then impz.offset <- succ isize (* end the loop *) @@ -1194,14 +1345,13 @@ (* Nominal behavior: do next binding *) imp_move_right impz done; - !inform, None, !acc + None, !acc ;; (* Finds the value associated to some offsets represented as an ival. *) - let find ~with_alarms ~validity ~conflate_bottom ~offsets ~size tree = - let inform = ref false in - let filtered_by_bound = - Tr_offset.filter_by_bound_for_reading ~with_alarms offsets size validity + let find ~validity ?(conflate_bottom=true) ~offsets ~size tree = + let alarm, filtered_by_bound = + Tr_offset.trim_by_validity offsets size validity in let r = try match filtered_by_bound with @@ -1211,11 +1361,9 @@ let acc = ref V.bottom in let pred_size = pred size in while !mn <=~ mx do - let this_inform, read_ahead, v = - find_itv ~topify:Origin.K_Misalign_read ~conflate_bottom - ~start:!mn ~size tree m + let read_ahead, v = + find_itv ~conflate_bottom ~start:!mn ~size tree m in - inform := !inform || this_inform; acc := V.join v !acc; let naive_next = !mn +~ m in mn := @@ -1230,36 +1378,24 @@ | Tr_offset.Set s -> List.fold_left (fun acc offset -> - let this_inform, _, new_value = - find_itv ~topify:Origin.K_Misalign_read ~conflate_bottom - ~start:offset ~size tree Integer.zero + let _, new_value = + find_itv ~conflate_bottom ~start:offset ~size tree Int.zero in - inform := !inform || this_inform; - let result = V.join acc new_value in - if V.equal result V.top then raise Not_found; - result) - V.bottom s - | Tr_offset.Imprecise(mn, mx) -> + V.join acc new_value + ) V.bottom s + | Tr_offset.Overlap (mn, mx, _origin) -> find_imprecise_between (mn, mx) tree | Tr_offset.Invalid -> V.bottom - with Bit_Not_found -> V.top + with Bit_Not_found -> V.top (* does not happen with proper validity *) in - if !inform then begin - let w = with_alarms.CilE.imprecision_tracing in - Extlib.may - (fun _ -> Kernel.warning ~current:true ~once:true - "extracting bits of a pointer") - w.CilE.a_log; - w.CilE.a_call () - end; - r + alarm, r ;; - (* Keep the part of the tree under a given limit offset. *) - - let rec keep_below offset curr_off tree = + (* Keep the part of the tree strictly under (i.e. strictly on the left) of a + given offset. *) + let rec keep_below ~offset curr_off tree = match tree with - | Empty -> offset, empty + | Empty -> offset, tree | Node (max, offl, subl, offr, subr, rrel, m, v, _) -> let new_offl = offl +~ curr_off in if offset <~ curr_off then @@ -1275,14 +1411,16 @@ else let new_max = pred (offset -~ curr_off) in add_node - curr_off (new_max +~ curr_off) + ~min:curr_off ~max:(new_max +~ curr_off) ((Rel.add_abs curr_off rrel) %~ m) m v (curr_off +~ offl ) subl ;; - let rec keep_above offset curr_off tree = + (* Keep the part of the tree strictly above (e.g. strictly on the right) of a + given offset. *) + let rec keep_above ~offset curr_off tree = match tree with - | Empty -> (succ offset), empty + | Empty -> (succ offset), tree | Node (max, offl, subl, offr, subr, rrel, m, v, _) -> let new_offr = offr +~ curr_off in let abs_max = curr_off +~ max in @@ -1308,15 +1446,17 @@ (* the cut happens somewhere in this node it should be cut accordingly and reinjected into its right subtree *) let new_reml = (Rel.add_abs curr_off rrel) %~ m in - add_node (succ offset) abs_max new_reml m v new_offr subr + add_node ~min:(succ offset) ~max:abs_max new_reml m v new_offr subr ;; -let update_itv_with_rem ~exact ~offset ~abs_max ~size ~rem curr_off v tree = +let update_itv_with_rem ~exact ~offset ~abs_max ~size ~rem v curr_off tree = let off1, t1 = keep_above abs_max curr_off tree in let off2, t2 = keep_below offset curr_off tree in let rabs = (Rel.add_abs offset rem) %~ size in if exact then - let off_add, t_add = add_node offset abs_max rabs size v off1 t1 in + let off_add, t_add = + add_node ~min:offset ~max:abs_max rabs size v off1 t1 + in union off2 t2 off_add t_add else let v_is_isotropic = V.is_isotropic v in @@ -1357,12 +1497,10 @@ in let new_left_offset, new_left_tree = add_node - (Integer.max impz.offset offset) - write_max + ~min:(Integer.max impz.offset offset) ~max:write_max new_r new_m new_v !left_offset !left_tree in left_tree := new_left_tree; left_offset := new_left_offset; - if not end_reached then imp_move_right impz else impz.offset <- succ abs_max done; @@ -1371,59 +1509,61 @@ let update_itv = update_itv_with_rem ~rem:Rel.zero;; - (* This function does a weak update of the entire [offsm], by adding the + (* This should be in Int_Intervals, but is currently needed here. + Returns an interval with reversed bounds when the intersection is empty. *) + let clip_by_validity = function + | Base.Invalid -> + (fun _-> Int.one, Int.zero (* reversed interval -> no intersection*)) + | Base.Known (min, max) + | Base.Unknown (min, _, max) -> + (fun (min', max') -> Integer.max min min', Integer.min max max') + +(** This function does a weak update of the entire [offsm], by adding the topification of [v]. The parameter [validity] is respected, and so is the current size of [offsm]: each interval already present in [offsm] and valid is overwritten. Interval already present but not valid are bound to [V.bottom]. *) +(* TODO: the convention to write bottom on non-valid locations is strange, + and only useful for the NULL base in Lmap.ml. It would be simpler an more + elegant to keep the existing value on non-valid ranges instead. This + function should also be written as a call to fold_between *) let update_imprecise_everywhere ~validity o v offsm = - if is_empty offsm then ( - assert (validity = Base.Invalid); - raise Result_is_bottom - ); let v = V.topify_with_origin o v in - let clip_min, clip_max = match validity with - | Base.Invalid -> raise Result_is_bottom - | Base.Known (min, max) - | Base.Unknown (min, _, max) -> - (fun min' -> Integer.max min min'), - (fun max' -> Integer.min max max') - | Base.Periodic (_, _, p) -> - let min = Integer.zero and max = pred p in - (fun min' -> Integer.max min min'), - (fun max' -> Integer.min max max') - in - fold - (fun (min, max) (bound_v, _, _) acc -> + if Base.Validity.equal validity Base.Invalid then + `Bottom + else + let clip = clip_by_validity validity in + let r = fold + (fun (min, max as itv) (bound_v, _, _) acc -> let new_v = V.join (V.topify_with_origin o bound_v) v in - let new_min = clip_min min and new_max = clip_max max in - let acc = - if min <~ new_min (* Before validity *) - then add_basic_node ~min ~max:(pred new_min) ~v:V.bottom acc - else acc - in - let acc = - if new_min <=~ new_max - then add_basic_node ~min:new_min ~max:new_max ~v:new_v acc - else acc (* Interval completely out of validity *) - in - let acc = - if new_max <~ max (* After validity *) - then add_basic_node ~min:(succ new_max) ~max ~v:V.bottom acc - else acc - in acc - ) offsm empty + let new_min, new_max = clip itv in + if new_min <=~ new_max then (* [min..max] and validity intersect *) + let acc = + if min <~ new_min (* Before validity *) + then append_basic_itv ~min ~max:(pred new_min) ~v:V.bottom acc + else acc + in + let acc = append_basic_itv ~min:new_min ~max:new_max ~v:new_v acc in + let acc = + if new_max <~ max (* After validity *) + then append_basic_itv ~min:(succ new_max) ~max ~v:V.bottom acc + else acc + in acc + else + append_basic_itv ~min ~max ~v:V.bottom acc + ) offsm m_empty + in `Map r ;; (** Update a set of intervals in a given rangemap all offsets starting from mn ending in mx must be updated with value v, every period *) - let update_itvs ~exact ~mn ~mx ~period ~size v tree = + let update_itvs ~exact ~mn ~mx ~period ~size v curr_off tree = assert(mx >=~ mn); let r = mn %~ period in let rec aux_update mn mx curr_off tree = match tree with - | Empty -> curr_off, empty + | Empty -> curr_off, tree | Node (max, offl, subl, offr, subr, r_node, m_node, v_node, _) -> let abs_offl = offl +~ curr_off in let abs_offr = offr +~ curr_off in @@ -1462,8 +1602,7 @@ in let o, t = add_node - curr_off - (curr_off +~ max) + ~min:curr_off ~max:(curr_off +~ max) ((Rel.add_abs curr_off r_node) %~ m_node) m_node v_node new_offl new_subl in @@ -1475,7 +1614,7 @@ if size =~ period then let abs_max = pred (size +~ max) in - update ~offset:min ~abs_max ~size curr_off v tree + update ~offset:min ~abs_max ~size v curr_off tree else let offset = ref min in let o = ref curr_off in @@ -1483,7 +1622,7 @@ while !offset <=~ max do let abs_max = pred (size +~ !offset) in let o', t' = - update ~offset:!offset ~abs_max ~size !o v !t + update ~offset:!offset ~abs_max ~size v !o !t in o := o'; t := t'; @@ -1495,66 +1634,119 @@ | None, Some _ | None, None -> curr_off, tree in - snd (aux_update mn mx Integer.zero tree) + aux_update mn mx curr_off tree ;; + let imprecise_write_msg = ref "locations to update in array" - (* Same speficication as above, except that if too many writes are required, - the result is automatically approximated *) - let update_itvs_or_approx ~exact ~mn ~mx ~period ~size v m = - let number = succ ((mx -~ mn) /~ period) in - let plevel = !Lattice_Interval_Set.plevel in - if number <=~ (Integer.of_int plevel) && (period >=~ size) then - update_itvs ~exact ~mn ~mx ~period ~size v m - else - begin - if size <~ period then - (* We are going to write the locations that are between [size+1] and - [period] unnecessarily, warn the user *) - Kernel.result ~current:true ~once:true - "more than %d(%a) locations to update in array. Approximating." - !Lattice_Interval_Set.plevel pretty_int number; - let abs_max = pred (mx +~ size) in - snd (update_itv ~exact:false ~offset:mn ~abs_max ~size Integer.zero v m) - end - +exception Update_Result_is_bottom -let update ~with_alarms ~validity ~exact ~offsets ~size v t = - let v = V.anisotropic_cast ~size v in - let exact, reduced = Tr_offset.filter_by_bound_for_writing - ~with_alarms ~exact offsets size validity - in - match reduced with - | Tr_offset.Imprecise (mn, mx) -> - let origin = Origin.(current K_Misalign_read) in +(* Returns [true] iff [update_aux_tr_offsets] will approximate the set + of offsets written *) +let update_aux_tr_offsets_approximates offsets size = + match offsets with + | Tr_offset.Overlap _ -> false + | Tr_offset.Interval(mn, mx, period) -> + let number = succ ((mx -~ mn) /~ period) in + let plevel = !plevel in + if number <=~ Integer.of_int plevel || period =~ size then false + else true + | Tr_offset.Set _ + | Tr_offset.Invalid -> false + +(* Update [t] by writing [v] of size [size] every offsets. Make sure that this + function over-approximates the set of location written + iff [update_aux_approximates] returns [true] *) +let update_aux_tr_offsets ~exact ~offsets ~size v curr_off t = + match offsets with + | Tr_offset.Overlap (mn, mx, origin) -> + let origin = if origin = Origin.Unknown + then Origin.(current K_Misalign_read) + else origin + in let v = V.topify_with_origin origin v in - snd (update_itv ~exact:false ~offset:mn ~abs_max:mx ~size:Integer.one - Integer.zero v t) (* TODO: check *) + (* TODO: check *) + update_itv ~exact ~offset:mn ~abs_max:mx ~size:Integer.one v curr_off t - | Tr_offset.Interval(mn, mx, m) -> - update_itvs_or_approx exact mn mx m size v t + | Tr_offset.Interval(mn, mx, period) -> + let number = succ ((mx -~ mn) /~ period) in + let plevel = !plevel in + assert (period >=~ size); (* Checked by Tr_offset *) + if number <=~ Integer.of_int plevel || period =~ size then + update_itvs ~exact ~mn ~mx ~period ~size v curr_off t + else begin + if size <~ period then + (* We are going to write the locations that are between [size+1] and + [period] unnecessarily, warn the user *) + Kernel.result ~current:true ~once:true + "more than %d(%a) %s. Approximating." + plevel pretty_int number !imprecise_write_msg; + let abs_max = pred (mx +~ size) in + let v = + if Int.is_zero (period %~ size) then v + else + let origin = Origin.(current K_Misalign_read) in + let v' = V.topify_with_origin origin v in + if not (V.equal v v') then + Kernel.result ~current:true ~once:true + "approximating value to write."; + v' + in + update_itv ~exact:false ~offset:mn ~abs_max ~size v curr_off t + end | Tr_offset.Set s -> List.fold_left - (fun acc offset -> - let update = update_itv ~exact in - let _, r = update ~offset ~size - ~abs_max:(pred (offset +~ size)) Integer.zero v acc - in - r - ) t s + (fun (curr_off, m) offset -> + update_itv ~exact ~offset ~size + ~abs_max:(pred (offset +~ size)) v curr_off m + ) (curr_off, t) s + | Tr_offset.Invalid -> - if exact - then raise Result_is_bottom - else t + raise Update_Result_is_bottom + +(* High-level update function (roughly of type [Ival.t -> v -> offsetmap -> + offsetmap]. This function does not suppose that offsetmaps are zero-rooted. + When too many locations must be updated, the result is approximated w.r.t + the memory zones written. *) +let update_aux ?origin ~validity ~exact ~offsets ~size v curr_off t = + let v = V.anisotropic_cast ~size v in + let alarm, reduced = + Tr_offset.trim_by_validity ?origin offsets size validity + in + let r = update_aux_tr_offsets ~exact ~offsets:reduced ~size v curr_off t in + alarm, r + +(* Same as update_aux, but on zero-rooted offsetmaps. *) +let update ?origin ~validity ~exact ~offsets ~size v t = + try + let alarm, (_curr_off, r) = + update_aux ?origin ~validity ~exact ~offsets ~size v Int.zero t + in + alarm, `Map r + with Update_Result_is_bottom -> true, `Bottom + +(* High-level update function (roughly of type [Ival.t -> v -> offsetmap -> + offsetmap]) that *under*-approximate the set of written locations, when + there are too many of them. *) +let update_under ~validity ~exact ~offsets ~size v t = + let v = V.anisotropic_cast ~size v in + let alarm, offsets = Tr_offset.trim_by_validity offsets size validity in + if update_aux_tr_offsets_approximates offsets size then + alarm, `Map t + else + try + let _, t = update_aux_tr_offsets ~exact ~offsets ~size v Int.zero t in + alarm, `Map t + with Update_Result_is_bottom -> true, `Bottom let copy_single offset tree size period_read_ahead = let z, cur_off, root = find_bit offset tree in - let cur_copy_offset = ref offset (* diffrent from cur_off, as we may + let cur_copy_offset = ref offset (* different from cur_off, as we may be in the middle of the node *) in let impz = { node = root; offset = cur_off; zipper = z; } in - let acc = ref empty in + let acc = ref m_empty in let iend = pred (offset +~ size) in let read_ahead = (* See if we can read everything in this node with some read-ahead *) @@ -1579,7 +1771,9 @@ (Rel.add_abs nbeg (Rel.sub rrel (Rel.sub_abs !cur_copy_offset impz.offset))) %~ m in - let o, t = add_node nbeg new_rel_end abs_rem m v Integer.zero !acc in + let o, t = + add_node ~min:nbeg ~max:new_rel_end abs_rem m v Integer.zero !acc + in assert (o =~ Integer.zero); acc := t; let cond = iend >~ next_end in @@ -1590,6 +1784,7 @@ cond) do (); done; + (* [!acc <> Empty] because the Node case executes at least once *) read_ahead, !acc ;; @@ -1604,14 +1799,12 @@ | _ -> None - let copy_slice ~with_alarms ~validity ~offsets ~size tree = - let filtered_by_bound = - Tr_offset.filter_by_bound_for_reading ~with_alarms offsets size validity - in - let init = - add_basic_node ~min:Integer.zero ~max:(pred size) ~v:V.bottom empty + let copy_slice ~validity ~offsets ~size tree = + assert (Int.gt size Int.zero); + let alarm, filtered_by_bound = + Tr_offset.trim_by_validity offsets size validity in - let join acc t = if is_empty acc then t else join acc t in + let init = isotropic_interval size V.bottom in let result = match filtered_by_bound with | Tr_offset.Interval(mn, mx, m) -> @@ -1632,20 +1825,23 @@ let aligned_b = Integer.round_down_to_r ~max ~r ~modu:m in Integer.max naive_next aligned_b done; - !acc_tree + `Map !acc_tree | Tr_offset.Set s -> + let m = List.fold_left (fun acc_tree offset -> let _, t = copy_single offset tree size Integer.zero in join acc_tree t ) init s - | Tr_offset.Imprecise(mn, mx) -> + in + `Map m + | Tr_offset.Overlap(mn, mx, _origin) -> let v = find_imprecise_between (mn, mx) tree in - add_basic_node ~min:Integer.zero ~max:(pred size) ~v empty + `Map (isotropic_interval size v) | Tr_offset.Invalid -> - empty + `Bottom in - result + alarm, result ;; let fold_between ~entire (imin, imax) f t acc = @@ -1681,23 +1877,25 @@ aux Integer.zero t acc ;; - let paste_slice_itv ~exact from start stop start_dest to_ = + let paste_slice_itv ~exact from stop start_dest to_ = let update = update_itv_with_rem ~exact in - let offset = start_dest -~ start in let treat_interval (imin, imax) (v, modu, rem) acc = - let dmin, dmax = imin +~ offset, imax +~ offset in + let dmin, dmax = imin +~ start_dest, imax +~ start_dest in snd (update - ~offset:dmin ~abs_max:dmax ~rem:rem ~size:modu Integer.zero v acc) + ~offset:dmin ~abs_max:dmax ~rem:rem ~size:modu v Integer.zero acc) in - fold_between ~entire:false (start, stop) treat_interval from to_ + fold_between ~entire:false (Int.zero, stop) treat_interval from to_ ;; - - let paste_slice ~with_alarms ~validity ~exact (src, start_src) ~size ~offsets dst = + (** pastes [from] (of size [size]) at all [offsets] in [dst]. Optimisations + for the case where [size] and the periodicity of [offsets] match are + treated in [paste_slice] below *) + let paste_slice_not_contiguous ~validity ~exact ~from:src ~size ~offsets dst = try - let plevel = !Lattice_Interval_Set.plevel in - let stop_src = Int.pred (Int.add start_src size) in + let plevel = !plevel in + let stop_src = Int.pred size in ignore (Ival.cardinal_less_than offsets plevel); + let alarm = ref false in (* TODO: this should be improved if offsets if of the form [a..b]c%d with d >= size. In this case, the write do not overlap, and could be done in one run in the offsetmap itself *) @@ -1705,52 +1903,62 @@ let stop_to = Int.pred (Int.add start_to size) in match validity with | Base.Invalid -> - CilE.warn_mem_write with_alarms; + alarm := true; acc, success - | Base.Periodic (b, e, _) | Base.Known (b,e) | Base.Unknown (b,_,e) when Int.lt start_to b || Int.gt stop_to e -> - CilE.warn_mem_write with_alarms; + alarm := true; acc, success | Base.Known _ | Base.Unknown _ -> - paste_slice_itv ~exact src start_src stop_src start_to acc, - true - - | Base.Periodic (b, _e, period) -> - assert (Int.equal b Int.zero) (* assumed in module Base *); - let start_to = Int.rem start_to period in - let stop_to = Int.pred (Int.add start_to size) in - if Int.gt stop_to period then - Kernel.not_yet_implemented "Paste of overly long \ - values in periodic offsetmaps" (* TODO *); - paste_slice_itv ~exact:false src start_src stop_src start_to acc, + paste_slice_itv ~exact src stop_src start_to acc, true in let res, success = Ival.fold_int aux offsets (dst, false) in - if success then res else raise Result_is_bottom + if success then !alarm, `Map res else true, `Bottom with Not_less_than -> - Kernel.result ~current:true ~once:true - "too many locations to update in array. Approximating."; (* Value to paste, since we cannot be precise *) - let validity_src = Base.Known (start_src, Int.pred (start_src +~ size)) in - let v = find ~with_alarms:CilE.warn_none_mode - ~validity:validity_src ~conflate_bottom:false - ~offsets:(Ival.inject_singleton start_src) ~size src + let validity_src = Base.Known (Int.zero, Int.pred size) in + let _, v = + find ~validity:validity_src ~conflate_bottom:false + ~offsets:Ival.singleton_zero ~size src + in + (* Have we produced an imprecision when calling 'find' ? *) + let imprecise = match src with + | Node (_, _, Empty, _, Empty, _, _, v', _) -> not (V.equal v v') + | _ -> true (* at least two nodes *) in - update ~with_alarms ~validity ~exact ~offsets ~size v dst + if imprecise then + Kernel.result ~current:true ~once:true + "too many locations to update in array. Approximating."; + update ~validity ~exact ~offsets ~size v dst + + (** pastes [from] (of size [size]) at all [offsets] in [dst] *) + let paste_slice ~validity ~exact ~from:src ~size ~offsets dst = + match offsets, src with + (* Special case: [from] contains a single (aligned) binding [v], and [size] + matches the periodicity of [offsets] and the size of [v]. In this case, + it is more efficient to perform an interval update instead of an + offsetmap copy. *) + | Ival.Top (_,_,_, offperiod), Node (_,_, Empty,_, Empty, vrem, vsize, v,_) + when Rel.is_zero vrem && size =~ offperiod && + (size =~ vsize || V.is_isotropic v) + -> + update ~validity ~exact ~offsets ~size v dst + | _ -> + paste_slice_not_contiguous ~validity ~exact ~from:src ~size ~offsets dst + let skip_v v = V.equal V.bottom v - let pretty_typ typ fmt m = - let inset_utf8 = Unicode.inset_string () in + let pretty_generic ?typ ?(pretty_v=V.pretty_typ) ?(skip_v=skip_v) ?(sep=Unicode.inset_string ()) () fmt m = let is_first = ref true in let pretty_binding fmt (bk, ek) (v, modu, rel_offs) = - if not (V.equal v V.bottom) then begin (* TODOBY: temporary *) + if not (skip_v v) then begin if !is_first then is_first:=false else Format.fprintf fmt "@\n"; Format.fprintf fmt "@[" ; (* Print left-member and return misalign condition *) - let force_misalign, _printed_type = + let force_misalign, printed_type = match typ with | None -> Format.fprintf fmt "[rbits %a to %a]" @@ -1766,7 +1974,7 @@ ~use_align:(not (V.is_isotropic v)) ~align:rel_offs ~rh_size:modu ~start:bk ~stop:ek fmt in - Format.fprintf fmt " %s@ @[%a@]" inset_utf8 V.pretty v ; + Format.fprintf fmt " %s@ @[%a@]" sep (pretty_v printed_type) v ; if force_misalign then if Rel.is_zero rel_offs && (Int.length bk ek) %~ modu =~ Integer.zero @@ -1784,7 +1992,7 @@ end in if is_empty m then - Format.fprintf fmt "@[[?] %s ANYTHING@]" inset_utf8 + Format.fprintf fmt "@[[?] %s ANYTHING@]" sep else Format.fprintf fmt "@[%a@]" (fun fmt -> iter (pretty_binding fmt)) m @@ -1792,12 +2000,11 @@ let create_isotropic ~size v = assert (Int.gt size Int.zero); assert (V.is_isotropic v); - add_basic_node ~min:Integer.zero ~max:(pred size) ~v empty + isotropic_interval size v let create ~size v ~size_v = assert (Int.gt size Int.zero); - add_node_from_root ~min:Integer.zero ~max:(pred size) ~rem:Integer.zero - ~modu:size_v ~v empty + snd (interval_aux Int.zero (pred size) Int.zero size_v v) let cardinal_zero_or_one offsetmap = (singleton_tag offsetmap) <> 0 @@ -1807,22 +2014,22 @@ let n = ref Integer.zero in let addw acc v = let e = !n +~ s in - let r = add_basic_node ~min:!n ~max:e ~v acc in + let r = append_basic_itv ~min:!n ~max:e ~v acc in n := succ e; r in - fold addw empty l + let r = fold addw m_empty l in + assert (!n >~ Int.zero); (* implies that r <> Empty *) + r - let add (min, max) (v, modu, rem) m = - snd (update_itv_with_rem ~exact:true - ~offset:min ~abs_max:max ~rem ~size:modu Integer.zero v m) + let add ?(exact=true) (min, max) (v, modu, rem) m = + snd (update_itv_with_rem ~exact + ~offset:min ~abs_max:max ~rem ~size:modu v Integer.zero m) let find_imprecise ~validity m = match validity with | Base.Known (min, max) | Base.Unknown (min, _, max) -> find_imprecise_between (min, max) m - | Base.Periodic (_min, _max, p) -> - find_imprecise_between (Int.zero, pred p) m | Base.Invalid -> V.bottom let find_imprecise_everywhere m = @@ -1833,7 +2040,921 @@ find_imprecise_between bounds m - let clear_caches () = List.iter (fun f -> f ()) !clear_caches + let clear_caches () = List.iter (fun f -> f ()) !clear_caches_ref +end + +(* Generic implementation of {Offsetmap_lattice_with_isotropy} for values + that are all isotropic. *) +module FullyIsotropic = struct + let is_isotropic _ = true + let anisotropic_cast ~size:_ v = v + + let topify_with_origin _o v = v + + let extract_bits ~topify:_ ~start:_ ~stop:_ ~size:_ m = false, m + let little_endian_merge_bits ~topify:_ ~conflate_bottom:_ ~value:_ ~offset:_ v = v + let big_endian_merge_bits ~topify:_ ~conflate_bottom:_ ~total_length:_ ~length:_ ~value:_ ~offset:_ v = v + + let cardinal_zero_or_one _ = false + + let widen _wh _ m = m + type widen_hint = unit +end + + +(* -------------------------------------------------------------------------- *) +(* --- Intervals --- *) +(* -------------------------------------------------------------------------- *) + +module Int_Intervals_Map = struct + + include Make(struct + include Datatype.Bool + + let top = true + let bottom = false + let join = (||) + let narrow = (&&) + let is_included b1 b2 = b2 || not b1 + let join_and_is_included b1 b2 = let r = b1 || b2 in r, r = b2 + let merge_neutral_element = bottom + + let pretty_typ _ fmt v = pretty fmt v + + include FullyIsotropic + end) + + let () = + imprecise_write_msg := "elements to enumerate" + + + (* In this auxiliary module, intervals are pairs [(curr_off, m)] where [m] + has type [bool Offsetmap.t]. However, in order to avoid boxing, + functions sometimes take two arguments: first the current offset, + then the map. *) + type itvs = Int.t * t + + let join : itvs -> itvs -> itvs = + let stop_join m1 m2 = + if m1 == m2 then ReturnLeft (* idempotency *) + (* true everywhere leads to true everywhere. false everywhere leads + to the other tree. *) + else match m1 with + | Node (_, _, Empty, _, Empty, _ , _, b, _) -> + if b then ReturnLeft else ReturnRight + | _ -> + match m2 with + | Node (_, _, Empty, _, Empty, _ , _, b, _) -> + if b then ReturnRight else ReturnLeft + | _ -> Recurse + in + let cache = Hptmap.PersistentCache "Int_Intervals.join" in + map2_on_values_offset cache stop_join (||) + + let narrow : itvs -> itvs -> itvs = + let stop_narrow m1 m2 = + if m1 == m2 then ReturnLeft (* idempotency *) + (* false everywhere leads to false everywhere. true everywhere leads + to the other tree. *) + else match m1 with + | Node (_, _, Empty, _, Empty, _ , _, b, _) -> + if b then ReturnRight else ReturnLeft + | _ -> + match m2 with + | Node (_, _, Empty, _, Empty, _ , _, b, _) -> + if b then ReturnLeft else ReturnRight + | _ -> Recurse + in + let cache = Hptmap.PersistentCache "Int_Intervals.narrow" in + map2_on_values_offset cache stop_narrow (&&) + + let diff : itvs -> itvs -> itvs = + let stop_diff m1 m2 = + if m1 == m2 then ReturnConstant false + else + match m2 with + | Node (_, _, Empty, _, Empty, _ , _, false, _) -> + ReturnLeft (* diff with empty *) + | _ -> Recurse + in + let cache = Hptmap.PersistentCache "Int_Intervals.diff" in + map2_on_values_offset + cache stop_diff (fun b1 b2 -> if b2 then false else b1) + + + (* Auxiliary function that binds [b] to the interval [min..max], which + is assumed not to be bound in [m] *) + let add_itv ~min ~max b co m : itvs = + add_node ~min ~max Int.zero Int.one b co m + + (* enlarges the offsetmap [m] from range [prev_min..prev_max] to + [new_min..new_max], by adding an interval bound to [false] at the left + and right ends. The inclusion [prev_min..prev_max \subset new_min..new_max] + must hold *) + let enlarge_itv co m ~prev_min ~new_min ~prev_max ~new_max : itvs = + let co, m as i = + if new_max >~ prev_max then + add_itv ~min:(succ prev_max) ~max:new_max false co m + else co, m + in + if new_min <~ prev_min then + add_itv ~min:new_min ~max:(pred prev_min) false co m + else i + + (* shrinks the offsetmap [m] from range [prev_min..prev_max] to + [new_min..new_max], by dropping the superfluous intervals. The inclusion + [new_min..new_max \subset prev_min..prev_max] must hold *) + let shrink_itv co m ~prev_min ~new_min ~prev_max ~new_max : itvs = + let co, m as i = + if new_max <~ prev_max then + keep_below (succ new_max) co m + else co, m + in + if new_min >~ prev_min then + keep_above (pred new_min) co m + else i + + (* Resize size [m] to size [new_min..new_max], by enlarging or shrinking + it on both ends. *) + let resize_itv co m ~prev_min ~new_min ~prev_max ~new_max : itvs = + let co, m as i = + if new_max =~ prev_max then co, m + else if new_max >~ prev_max then + add_itv ~min:(succ prev_max) ~max:new_max false co m + else (* new_max <~ prev_max *) + keep_below (succ new_max) co m + in + if new_min =~ prev_min then i + else if new_min <~ prev_min then + add_itv ~min:new_min ~max:(pred prev_min) false co m + else (* new_min >~ prev_min *) + keep_above (pred new_min) co m + + + (* normalizes a non-empty offsetmap [m], by removing an eventual rightmost + interval bound to false. Returns the new rightmost bit bound to [true].*) + let rec drop_righmost_false curr_off node = + match node with + | Empty -> assert false + | Node (max, _, _, _, Empty, _, _, true, _) -> + (* we are the rightmost interval, and not equal to false: no change *) + curr_off, node, curr_off +~ max + | Node (_, offl, subl, _, Empty, _, _, false, _) -> + (* we are the rightmost interval, and false; keep only the left tree *) + curr_off +~ offl, subl, pred curr_off + | Node (max, offl, subl, offr, (Node _ as subr), _, _, v, _) -> + (* Normalize the right tree and rebuild. *) + let new_rcurr_off, new_rtree, rbit = + drop_righmost_false (curr_off +~ offr) subr + in + (* We cannot have [v = false] and [new_rtree = empty]: [subr] would need + contain only [false], and it should have been merged with us. *) + if new_rtree == subr then + curr_off, node, rbit + else + let curr_off', node' = + make_node + curr_off max offl subl (new_rcurr_off -~ curr_off) new_rtree + Integer.zero Integer.one v + in + curr_off', node', rbit + + (* normalizes a non-empty offsetmap [m], by removing an eventual leftmost + interval bound to false. Returns the new leftmost bit bound to [true].*) + let rec drop_leftmost_false curr_off node = + match node with + | Empty -> assert false + | Node (_, _, Empty, _, _, _, _, true, _) -> + (* we are the leftmost interval, and not equal to false: no change *) + curr_off, node, curr_off + | Node (max, _, Empty, offr, subr, _, _, false, _) -> + (* we are the leftmost interval, and false; keep only the right tree *) + curr_off +~ offr, subr, succ (curr_off +~ max) + | Node (max, offl, (Node _ as subl), offr, subr, _, _, v, _) -> + (* normalize the left subtree and rebuild *) + let new_lcurr_off, new_ltree, lbit = + drop_leftmost_false (curr_off +~ offl) subl + in + if new_ltree == subl then + curr_off, node, lbit + else + let curr_off', node' = + make_node + curr_off max (new_lcurr_off -~ curr_off) new_ltree offr subr + Integer.zero Integer.one v + in + curr_off', node', lbit + +end + +module Int_Intervals = struct + + exception Error_Top + + type itv = Int.t * Int.t + + type intervals = + | Top + | Intervals of Int.t * Int_Intervals_Map.t * Int.t * Int.t + (* The arguments of {!Intervals} are [curr_off, m, min, max] in this + order. [min] and [max] are the the first and last bit bound to true + in the map, which is supposed to be non-empty. All operations must + maintain those two invariants. *) + | Bottom + + let pretty_debug fmt t = + match t with + | Top -> Format.pp_print_string fmt "TopISet" + | Bottom -> Format.pp_print_string fmt "BottomISet" + | Intervals (curr_off, i, min, max) -> + Format.fprintf fmt "@[I(%a-%a, @[%a])@]" + Int.pretty min Int.pretty max + Int_Intervals_Map.pretty_debug_offset (curr_off, i) + + include Datatype.Make(struct + type t = intervals + let name = "Int_Intervals.t" + + let pretty fmt t = + match t with + | Top -> Format.pp_print_string fmt "TopISet" + | Bottom -> Format.pp_print_string fmt "BottomISet" + | Intervals (curr_off, i, _, _) -> + let first = ref true in + Format.fprintf fmt "@[{"; + Int_Intervals_Map.iter_offset + (fun (b, e) (v, _, _) -> + if v then begin + if !first then first := false else Format.pp_print_space fmt (); + Format.fprintf fmt "[%a..%a]" Int.pretty b Int.pretty e + end + ) curr_off i; + Format.fprintf fmt "}@]" + + let hash = function + | Top -> 37 + | Bottom -> 73 + | Intervals (curr_off, i, _, _) -> + (* Ignore min and max, which are redundant with curr_off + i *) + Int.hash curr_off + 143 * Int_Intervals_Map.hash i + + let equal i1 i2 = match i1, i2 with + | Top, Top | Bottom, Bottom -> true + | Intervals (curr_off1, i1, _, _), Intervals (curr_off2, i2, _, _) -> + curr_off1 =~ curr_off2 && Int_Intervals_Map.equal i1 i2 + | (Top | Bottom | Intervals _), _ -> false + + let compare i1 i2 = match i1, i2 with + | Bottom, Bottom + | Top, Top -> 0 + | Intervals (curr_off1, i1, _, _), Intervals (curr_off2, i2, _, _) -> + let c = Int.compare curr_off1 curr_off2 in + if c = 0 then Int_Intervals_Map.compare i1 i2 + else c + | Bottom, (Intervals _ | Top) + | Intervals _, Top -> -1 + | Intervals _, Bottom | Top, (Bottom | Intervals _) -> 1 + + let reprs = [Bottom; Top] + let rehash = Datatype.identity + (* type intervals = + Top | Intervals of Int.t * Int_Intervals_Map.t * Int.t * Int.t| Bottom *) + let structural_descr = + Structural_descr.t_sum + [| [| Int.packed_descr; Int_Intervals_Map.packed_descr; + Int.packed_descr; Int.packed_descr |] |] + + let mem_project = Datatype.never_any_project + let varname _ = "i" + let internal_pretty_code = Datatype.undefined + let copy = Datatype.undefined + end) + + let top = Top + let bottom = Bottom + + let is_top = function + | Top -> true + | _ -> false + + let aux_create_interval ~min ~max v = + (* Use [min] as current offset *) + Int_Intervals_Map.add_itv ~min ~max v min Int_Intervals_Map.m_empty + + let inject_bounds min max = + if Int.gt min max then + Bottom + else + let curr_off, i = aux_create_interval ~min ~max true in + Intervals (curr_off, i, min, max) + + let inject_itv (b, e) = inject_bounds b e + + let is_included i1 i2 = match i1, i2 with + | Bottom, Bottom + | Top, Top + | Bottom, (Intervals _ | Top) + | Intervals _, Top -> + true + | Intervals (co1, i1, min1, max1), + Intervals (co2, i2, min2, max2) -> + min1 >=~ min2 && max1 <=~ max2 && + Int_Intervals_Map.is_included_aux (co1, i1) (co2, i2) + | Intervals _, Bottom | Top, (Bottom | Intervals _) -> false + + let join m1 m2 = + match m1, m2 with + | Top, _ | _, Top -> Top + | Bottom, i | i, Bottom -> i + | Intervals (co1, i1, min1, max1), Intervals (co2, i2, min2, max2) -> + let new_min = Int.min min1 min2 in + let new_max = Int.max max1 max2 in + (* Enlarge both intervals to the largest bounds. *) + let coi1' = + Int_Intervals_Map.enlarge_itv + co1 i1 ~prev_min:min1 ~new_min ~prev_max:max1 ~new_max + in + let coi2' = + Int_Intervals_Map.enlarge_itv + co2 i2 ~prev_min:min2 ~new_min ~prev_max:max2 ~new_max + in + (* No need to normalize, the leftmost and rightmost bits are still there*) + let co, i = Int_Intervals_Map.join coi1' coi2' in + Intervals (co, i, new_min, new_max) + + let link = join (* all constructors but Top, which is never returned, + are exact. *) + + let join_and_is_included t1 t2 = + let r = join t1 t2 in r, equal r t2 + + (* Drop the leftmost and rightmost intervals if they are equal to + [false], and detect if the result is [Bottom] *) + let normalize_itv curr_off m = + match m with + | Empty | Node (_, _, Empty, _, Empty, _ ,_, false, _) -> Bottom + | Node _ -> + let curr_off, m, right_bit = + Int_Intervals_Map.drop_righmost_false curr_off m + in + let curr_off, m, left_bit = + Int_Intervals_Map.drop_leftmost_false curr_off m + in + if m == Empty then Bottom + else (Intervals (curr_off, m, left_bit, right_bit)) + + let narrow m1 m2 = + match m1, m2 with + | Bottom, _ | _, Bottom -> Bottom + | Top, i | i, Top -> i + | Intervals (co1, i1, min1, max1), Intervals (co2, i2, min2, max2) -> + if min1 >~ max2 || min2 >~ max1 then Bottom + else + (* Keep only the part common to both intervals *) + let new_min = Int.max min1 min2 in + let new_max = Int.min max1 max2 in + let coi1' = + Int_Intervals_Map.shrink_itv + co1 i1 ~prev_min:min1 ~new_min ~prev_max:max1 ~new_max + in + let coi2' = + Int_Intervals_Map.shrink_itv + co2 i2 ~prev_min:min2 ~new_min ~prev_max:max2 ~new_max + in + let co, i = Int_Intervals_Map.narrow coi1' coi2' in + (* Normalize *) + normalize_itv co i + + let meet = narrow (* all constructors but Top, which is never returned, + are exact. *) + + let intersects_map = + let rec aux (o1, t1) (o2, t2) = + match t1, t2 with + | Empty, Empty | Empty, _ | _, Empty -> false + + | Node (_, offl1, subl1, offr1, subr1, _, _, false, _), Node _ -> + aux (o1 +~ offl1, subl1) (o2, t2) || aux (o1 +~ offr1, subr1) (o2, t2) + + | Node _, Node (_, offl2, subl2, offr2, subr2, _, _, false, _) -> + aux (o1, t1) (o2 +~ offl2, subl2) || aux (o1, t1) (o2 +~ offr2, subr2) + + | Node (max1, offl1, subl1, offr1, subr1, _, _, true, _), + Node (max2, offl2, subl2, offr2, subr2, _, _, true, _) -> + if max1 +~ o1 <~ o2 then + aux (o1, t1) (o2 +~ offl2, subl2) || aux (o1 +~ offr1, subr1) (o2, t2) + else if o1 >~ max2 +~ o2 then + aux (o1, t1) (o2 +~ offr2, subr2) || aux (o1 +~ offl1, subl1) (o2, t2) + else true (* the two intervals have a non-empty intersection *) + in + aux + ;; + + let intersects i1 i2 = match i1, i2 with + | Top, Top | Top, Intervals _ | Intervals _, Top -> true + | Bottom, Bottom | Bottom, (Top | Intervals _) + | (Top | Intervals _), Bottom -> false + | Intervals (co1, i1, min1, max1), Intervals (co2, i2, min2, max2) -> + min1 <=~ max2 && min2 <=~ max1 && intersects_map (co1, i1) (co2, i2) + + let diff m1 m2 = + match m1, m2 with + | Bottom, _ -> Bottom + | Top, (Bottom | Intervals _ | Top) -> Top + | Intervals _, Top -> Bottom + | Intervals _, Bottom -> m1 + | Intervals (co1, i1, min1, max1), Intervals (co2, i2, min2, max2) -> + if max1 >~ max2 && min1 <~ min2 then + (* The last bits of i1 will not be unset; grow i2 to the size of i1, + then no need to renormalize afterwards . *) + let coi2' = + Int_Intervals_Map.enlarge_itv + co2 i2 ~prev_min:min2 ~new_min:min1 ~prev_max:max2 ~new_max:max1 + in + let co, i = Int_Intervals_Map.diff (co1, i1) coi2' in + Intervals (co, i, min1, max1) + else + (* The result cannot be bigger than i1: resize i2 to the same of i1. + But some bits may be diffed to false, we need to renormalize *) + let coi2' = + Int_Intervals_Map.resize_itv + co2 i2 ~prev_min:min2 ~new_min:min1 ~prev_max:max2 ~new_max:max1 + in + let co, i = Int_Intervals_Map.diff (co1, i1) coi2' in + normalize_itv co i + + let fold f m acc = + match m with + | Bottom -> acc + | Top -> raise Error_Top + | Intervals (curr_off, i, _, _) -> + let aux_itv itv (v, _, _) acc = + if v then f itv acc else acc + in + Int_Intervals_Map.fold_offset aux_itv curr_off i acc + + (* Could be slightly improved *) + let inject l = + List.fold_left (fun acc itv -> join (inject_itv itv) acc) Bottom l + + let iter f m = + match m with + | Bottom -> () + | Top -> raise Error_Top + | Intervals (curr_off, i, _, _) -> + let aux_itv itv (v, _, _) = + if v then f itv + in + Int_Intervals_Map.iter_offset aux_itv curr_off i + + let project_set i = List.rev (fold (fun x y -> x :: y) i []) + + let project_singleton m = + match m with + | Bottom | Top -> None + | Intervals (curr_offset, i, _, _) -> + match i with + | Node (max, _, Empty, _, Empty, _, _, true, _) -> + Some (curr_offset, curr_offset +~ max) + | _ -> None + + let pretty_typ typ fmt i = + let typ = + match typ with + | Some t -> t + | None -> + Cil_types.(TArray (TInt(IUChar,[]), None, Cil.empty_size_cache (), [])) + in + match i with + | Top -> Format.pp_print_string fmt "[..]" + | Bottom -> Format.pp_print_string fmt "BottomISet" + | Intervals _ -> + let pp_one fmt (b,e)= + assert (Int.le b e) ; + ignore (Bit_utils.pretty_bits typ + ~use_align:false + ~align:Rel.zero + ~rh_size:Int.one + ~start:b ~stop:e fmt) + in + match project_singleton i with + | Some itv -> pp_one fmt itv + | None -> + Pretty_utils.pp_iter ~pre:"@[{" ~sep:";@ " ~suf:"}@]" + iter pp_one fmt i + ;; + + (* Conversion from ival+size to integers. The result is cached, and + over-approximated when the ival points to too many locations. *) + let from_ival_size_over_cached = + (* This function uses an internal cache *) + let module Arg1 = struct include Ival let sentinel = bottom end in + let module Arg2 = struct include Integer let sentinel = zero end in + let module Result = struct type t = intervals let sentinel = bottom end in + let module Cache = Binary_cache.Arity_Two(Arg1)(Arg2)(Result) in + Int_Intervals_Map.(clear_caches_ref := Cache.clear :: !clear_caches_ref); + add_plevel_hook Cache.clear; + (* Uncached version *) + let from_ival_size_aux ival size = + (* Auxiliary function when [ival] is precise. The result will be contained + in [min..start_max+size-1]. Create an englobing offsetmap, then update + it for all intervals. *) + let aux_min_max min start_max = + let max = pred (start_max +~ size) in + let curr_off, ifalse = aux_create_interval ~min ~max false in + let validity = Base.Known (min, max) in + let _alarm, (curr_off', i) = + try + Int_Intervals_Map.update_aux + ~validity ~exact:true ~offsets:ival ~size true curr_off ifalse + with Int_Intervals_Map.Update_Result_is_bottom -> + assert false (* in bounds by construction *) + in + Intervals (curr_off', i, min, max) + in + match ival with + | Ival.Top(None, _, _, _) | Ival.Top(_, None, _, _) | Ival.Float _ -> top + | Ival.Top(Some mn, Some mx, _r, _m) -> + aux_min_max mn mx + | Ival.Set(s) -> + if Array.length s > 0 then + aux_min_max s.(0) s.(Array.length s - 1) + else + bottom + in + Cache.merge from_ival_size_aux + + (* Over-approximation of the conversion of an ival+size to a set of + intervals *) + let from_ival_size ival size = + match size with + | Int_Base.Top -> top + | Int_Base.Value size -> from_ival_size_over_cached ival size + + (* Under-approximation of the conversion of an ival+size to a set of + intervals. Basically, we see if we are going to over-approximate (in which + case we return Bottom). Otherwise, we use the over-approximating function, + which is by definition exact in this case, and has a cache *) + let from_ival_size_under ival size = + match size with + | Int_Base.Top -> Bottom (* imprecise *) + | Int_Base.Value size -> + match ival with + | Ival.Top(None, _, _, _) | Ival.Top(_, None, _, _) | Ival.Float _ -> + Bottom (* imprecise *) + | Ival.Set _ -> from_ival_size_over_cached ival size (* precise *) + | Ival.Top (Some min, Some start_max, _, _) -> + (* See if using [from_ival_size] would cause an approximation *) + let max = pred (start_max +~ size) in + let validity = Base.Known (min, max) in + let _, offsets = Tr_offset.trim_by_validity ival size validity in + if Int_Intervals_Map.update_aux_tr_offsets_approximates offsets size + then bottom (* imprecise *) + else from_ival_size_over_cached ival size (* precise *) + + let range_covers_whole_type typ itvs = + match project_singleton itvs with + | Some (b, e) -> + (try + let s = Cil.bitsSizeOf typ in + Int.equal b Int.zero && Int.equal e (Int.of_int (s-1)) + with Cil.SizeOfError _ -> false) + | None -> false + + (* Interval bound in a zero-rooted offsetmap, expressed as a value of this + module. Not currently exported *) + let bounds_as_itv map = + match map with + | Empty -> bottom + | Node _ -> + let min, max = Int_Intervals_Map.bounds_offset Int.zero map in + inject_bounds min max + +(* Although interval functions do not depend on the AST itself, there are + numerous problems with not clearing the caches when the AST is reset. + Hence, the weak hash table for boolean offsetmaps depends on Ast.self, + and the caches are reset on an ast update. *) + let () = Ast.add_hook_on_update + (fun () -> + Kernel.debug ~dkey:dkey_caches "Clearing interval caches"; + Int_Intervals_Map.clear_caches ()) + +end + +(* -------------------------------------------------------------------------- *) +(* --- Bitwise offsetmaps --- *) +(* -------------------------------------------------------------------------- *) + + +module Make_bitwise(V: sig + include Lattice_type.Bounded_Join_Semi_Lattice + include Lattice_type.With_Narrow with type t := t + include Lattice_type.With_Top with type t := t +end) = struct + + include Make(struct + include V + include FullyIsotropic + let merge_neutral_element = bottom + let pretty_typ _ fmt v = pretty fmt v + end) + + type intervals = Int_Intervals.intervals + + let create = create_isotropic + + let v_size_mod v = (v, Int.one, Rel.zero) + + let add_binding_intervals ~validity ~exact itvs v m = + try + match Base.valid_range validity with + | None -> `Bottom + | Some _ -> + let clip = clip_by_validity validity in + let aux_itv itv m = + let itv = clip itv in + if Int.le (fst itv) (snd itv) then + add ~exact itv (v_size_mod v) m + else m + in + `Map (Int_Intervals.fold aux_itv itvs m) + with Int_Intervals.Error_Top -> + update_imprecise_everywhere ~validity Origin.top v m + + let add_binding_ival ~validity ~exact offsets ~size v m = + match size with + | Int_Base.Value size -> + snd (update ~validity ~exact ~offsets ~size v m) + | Int_Base.Top -> + update_imprecise_everywhere ~validity Origin.top v m + + let fold_itv f itv m acc = + let f' itv (v, _, _) acc = f itv v acc in + fold_between ~entire:false itv f' m acc + + let find = find_imprecise_between + + let find_iset ~validity itvs m = + try + let aux_itv i acc = V.join acc (find i m) in + Int_Intervals.fold aux_itv itvs V.bottom + with Int_Intervals.Error_Top -> find_imprecise ~validity m + + module V_Hashtbl = FCHashtbl.Make(V) + + (* Map indexed by sorted lists of integers. Used by function [fold_fuse_same] + below, to sort bound values by increasing intervals. *) + module MapIntervals = + Map.Make(struct + type t = (Int.t * Int.t) list + let compare_itv (b1, e1) (b2, e2) = + let c = Integer.compare b1 b2 in + if c = 0 + then Integer.compare e1 e2 + else c + let compare = Extlib.list_compare compare_itv + end) + + let fold_fuse_same f m acc = + let h = V_Hashtbl.create 17 in + (* Map the various values in m to the intervals they appear in*) + let sort_by_content itv (v, _, _) () = + let cur = + try V_Hashtbl.find h v + with Not_found -> [] + in + V_Hashtbl.replace h v (itv :: cur) + in + fold sort_by_content m (); + (* Now sort the contents of h by increasing intervals *) + let m = V_Hashtbl.fold + (fun v itvs acc -> MapIntervals.add (List.rev itvs) v acc) + h MapIntervals.empty + in + (* Call f on those intervals *) + MapIntervals.fold + (fun itvs v acc -> f (Int_Intervals.inject itvs) v acc) m acc + + let fold f m acc = + let f' (ib, ie) (v, _, _) acc = + let itv = Int_Intervals.inject_bounds ib ie in + f itv v acc + in + fold f' m acc + + let default_skip _ = false + + let pretty_generic ?typ ?(pretty_v=V.pretty) ?(skip_v=default_skip) ?(sep="<:") () fmt m = + let range_covers_whole_type itvs = + match typ with + | None -> false + | Some typ -> Int_Intervals.range_covers_whole_type typ itvs + in + let pp_itv = Int_Intervals.pretty_typ typ in + let first = ref true in + let pretty_binding fmt itvs v () = + if not (skip_v v) then begin + if !first then first := false else Format.fprintf fmt "@," ; + Format.fprintf fmt "@[@[%a@]%(%)@[%s @[%a@]@]@]" + pp_itv itvs + (if range_covers_whole_type itvs + then (" ": (unit,Format.formatter,unit) format) else "@ ") + sep pretty_v v + end + in + Format.fprintf fmt "@["; + fold_fuse_same (pretty_binding fmt) m (); + Format.fprintf fmt "@]" + + let map = map_on_values + let map2 = map2_on_values + + (* Simultaneous recursive descent on an offsetmap bitwise and on an interval + map. This function handles the case where the intervals and the offsetmap + do not cover the same range. *) + let fold_join_itvs_map_offset cache (type r) f join empty = + let module R = struct type t = r let sentinel = empty end in + let merge = match cache with + | Hptmap.PersistentCache _ | Hptmap.TemporaryCache _ -> + let module Cache = + Binary_cache.Arity_Two(Cacheable)(Int_Intervals_Map.Cacheable)(R) + in + (match cache with + | Hptmap.PersistentCache _ -> + clear_caches_ref := Cache.clear :: !clear_caches_ref + | _ -> ()); + Cache.merge + | Hptmap.NoCache -> fun f x y -> f x y + in + let rec aux cache (o1, t1) (o2, t2) = + match t1, t2 with + | Empty, _ | _, Empty + | _, Node (_, _, Empty, _, Empty, _, _, false, _) -> + empty (* Notice that we do not present to [f] the intervals that + are present in [o2] but not in [o1] (i.e. in the zone but + not in the map). For the current users of this module, + the map is always of the size of the validity of the base, + hence this is not a problem. *) + | _, Node (_, _, Empty, offr2, (Node _ as subr2), _, _, false, _) -> + aux cache (o1, t1) (o2 +~ offr2, subr2) + | _, Node (_, offl2, (Node _ as subl2), _, Empty, _, _, false, _) -> + aux cache (o1, t1) (o2 +~ offl2, subl2) + | _, Node (_, offl2, (Node _ as subl2), offr2, (Node _ as subr2), + _, _, false, _) -> + (* This special case seems redundant with the ones above and the next + one, but it speeds up dramatically this function. Otherwise, we + would recurse on t1 until the interval bound to false is split in + many small parts, without never adding anything. *) + join + (cache (o1, t1) (o2 +~ offl2, subl2)) + (cache (o1, t1) (o2 +~ offr2, subr2)) + | Node (max1, offl1, subl1, offr1, subr1, _, _, v, _), + Node (max2, offl2, subl2, offr2, subr2, _, _, true, _) -> + let amin1 = o1 in + let amax1 = max1 +~ o1 in + let amin2 = o2 in + let amax2 = max2 +~ o2 in + let ol1 = o1 +~ offl1 in + let ol2 = o2 +~ offl2 in + let or1 = o1 +~ offr1 in + let or2 = o2 +~ offr2 in + if amax1 <~ amin2 then begin + join (cache (o1, t1) (ol2, subl2)) (cache (or1, subr1) (o2, t2)) + end else if amin1 >~ amax2 then begin + join (cache (o1, t1) (or2, subr2)) (cache (ol1, subl1) (o2, t2)) + end else begin + if amin1 =~ amin2 then begin + let foo = + if amax1 =~ amax2 then begin + join (f amin1 amax1 v) (cache (or1, subr1) (or2, subr2)) + end + else if amax1 >~ amax2 then begin + join (f amin1 amax2 v) (cache (o1, t1) (or2, subr2)) + end + else begin + join (f amin1 amax1 v) (cache (or1, subr1) (o2, t2)) + end + in + join foo (cache (ol1, subl1) (ol2, subl2)) + end + else + let treat_right_nodes mabs_min = + if amax1 =~ amax2 then begin + join (f mabs_min amax1 v) (cache (or1, subr1) (or2, subr2)) + end + else if amax1 >~ amax2 then begin + join (f mabs_min amax2 v) (cache (o1, t1) (or2, subr2)) + end + else begin + join (f mabs_min amax1 v) (cache (or1, subr1) (o2, t2)) + end + in + if amin1 >~ amin2 then begin + join (treat_right_nodes amin1) (cache (ol1, subl1) (o2, t2)) + end + else begin + join (treat_right_nodes amin2) (cache (o1, t1) (ol2, subl2)) + end + end + and compute (_, t1 as v1) (_, t2 as v2) = + if t1 == Empty || t2 == Empty then empty + else + merge (aux compute) v1 v2 + in + compute + ;; + + (* Simultaneous recursive descent on an offsetmap bitwise and on an + interval. *) + let fold_join_itvs ~cache f join empty = + (* fold_join on non-degenerate intervals. Partial application is important*) + let aux_intervals = fold_join_itvs_map_offset cache f join empty in + fun itvs m -> + match itvs with + | Int_Intervals.Bottom -> empty + | Int_Intervals.Intervals (curr_off, itvs, _, _) -> + aux_intervals (Int.zero, m) (curr_off, itvs) + | Int_Intervals.Top -> + (* Find the range that is bound in [m], and use this as interval. + We would not return anything outside anyway. *) + match Int_Intervals.bounds_as_itv m with + | Int_Intervals.Bottom -> empty + | Int_Intervals.Intervals (curr_off, itvs, _, _) -> + aux_intervals (Int.zero, m) (curr_off, itvs) + | Int_Intervals.Top -> assert false + +end + + +module Aux + (V1 : module type of Offsetmap_lattice_with_isotropy) + (V2 : module type of Offsetmap_lattice_with_isotropy) += struct + + module M1 = Make(V1) + module M2 = Make(V2) + + (* This function is there as a template for people wanting to write a fold-like + iterator on two offsetmaps simultaneously. [bounds o1 t1 = bounds o2 t2] + need not to hold; the function returns [empty] when the maps + have no overlap. Currently, this functor is not exported. *) + let _map_fold2 (type s) (type t) f join empty o1 (t1: s offsetmap) o2 (t2: t offsetmap) = + let rec aux (o1, t1) (o2, t2) = + match t1, t2 with + | Empty, Empty -> empty + | Empty, _ | _, Empty -> assert false + | Node (max1, offl1, subl1, offr1, subr1, _, _, v1, _), + Node (max2, offl2, subl2, offr2, subr2, _, _, v2, _) -> + let amin1 = o1 in + let amax1 = max1 +~ o1 in + let amin2 = o2 in + let amax2 = max2 +~ o2 in + let ol1 = o1 +~ offl1 in + let ol2 = o2 +~ offl2 in + let or1 = o1 +~ offr1 in + let or2 = o2 +~ offr2 in + if amax1 <~ amin2 then begin + join (aux (o1, t1) (ol2, subl2)) (aux (or1, subr1) (o2, t2)) + end else if amin1 >~ amax2 then begin + join (aux (o1, t1) (or2, subr2)) (aux (ol1, subl1) (o2, t2)) + end else begin + if amin1 =~ amin2 then begin + let foo = + if amax1 =~ amax2 then begin + join (f amin1 amax1 v1 v2) (aux (or1, subr1) (or2, subr2)) + end + else if amax1 >~ amax2 then begin + join (f amin1 amax2 v1 v2) (aux (o1, t1) (or2, subr2)) + end + else begin + join (f amin1 amax1 v1 v2) (aux (or1, subr1) (o2, t2)) + end + in + join foo (aux (ol1, subl1) (ol2, subl2)) + end + else + let treat_right_nodes mabs_min = + if amax1 =~ amax2 then begin + join (f mabs_min amax1 v1 v2) (aux (or1, subr1) (or2, subr2)) + end + else if amax1 >~ amax2 then begin + join (f mabs_min amax2 v1 v2) (aux (o1, t1) (or2, subr2)) + end + else begin + join (f mabs_min amax1 v1 v2) (aux (or1, subr1) (o2, t2)) + end; + in + if amin1 >~ amin2 then begin + join (treat_right_nodes amin1) (aux (ol1, subl1) (o2, t2)) + end + else begin + join (treat_right_nodes amin2) (aux (o1, t1) (ol2, subl2)) + end + end + in + aux (o1, t1) (o2, t2) + ;; + end diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/offsetmap.mli frama-c-20150201+sodium+dfsg/src/memory_state/offsetmap.mli --- frama-c-20140301+neon+dfsg/src/memory_state/offsetmap.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/offsetmap.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,10 +20,42 @@ (* *) (**************************************************************************) +(** Maps from intervals to values. *) + (** Maps from intervals to values. The documentation of the returned maps is in module {!Offsetmap_sig}. *) - module Make (V : module type of Offsetmap_lattice_with_isotropy) : module type of Offsetmap_sig with type v = V.t and type widen_hint = V.widen_hint + +(**/**) +(* Exported as Int_Intervals, do not use this module directly *) +module Int_Intervals: module type of Int_Intervals_sig +(**/**) + + +(** Maps from intervals to simple values. The documentation of the returned + maps is in module {!Offsetmap_bitwise_sig}. *) +module Make_bitwise(V: sig + include Lattice_type.Bounded_Join_Semi_Lattice + include Lattice_type.With_Narrow with type t := t + include Lattice_type.With_Top with type t := t +end) : + module type of Offsetmap_bitwise_sig + with type v = V.t + and type intervals = Int_Intervals.t + + +(**/**) + +(* This is automatically set by the Value plugin. Do not modify. *) +val set_plevel: int -> unit +val get_plevel: unit -> int + + +(* +Local Variables: +compile-command: "make -C ../.." +End: +*) diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/offsetmap_sig.mli frama-c-20150201+sodium+dfsg/src/memory_state/offsetmap_sig.mli --- frama-c-20140301+neon+dfsg/src/memory_state/offsetmap_sig.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/offsetmap_sig.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -29,13 +29,21 @@ type v (** Type of the values stored in the offsetmap *) type widen_hint +type alarm = bool (** [true] indicates that an alarm may have occurred *) include Datatype.S (** Datatype for the offsetmaps *) +type t_bottom = [ `Bottom | `Map of t] +type t_top_bottom = [ `Bottom | `Map of t | `Top ] -(** {2 Pretty-printing} *) -val pretty : Format.formatter -> t -> unit -val pretty_typ: Cil_types.typ option -> Format.formatter -> t -> unit +(** {2 Pretty-printing} *) +val pretty_generic: + ?typ:Cil_types.typ -> + ?pretty_v:(Cil_types.typ option -> Format.formatter -> v -> unit) -> + ?skip_v:(v -> bool) -> + ?sep:string -> + unit -> + Format.formatter -> t -> unit (** {2 Creating basic offsetmaps} *) @@ -51,12 +59,8 @@ val of_list: ((t -> v -> t) -> t -> 'l -> t) -> 'l -> Int.t -> t (** [from_list fold c size] creates an offsetmap by applying the iterator [fold] to the container [c], the elements of [c] being supposed to - be of size [size]. *) - -(** {2 Empty offsetmap} *) - -val empty : t -val is_empty: t -> bool + be of size [size]. [c] must be such that [fold] is called at least + once. *) (** {2 Iterators} *) @@ -89,24 +93,53 @@ are presented. If [entire] is true, intersecting intervals are presented whole (ie. they may be bigger than [start..stop]). If [entire] is [false], only the intersection with [ib..ie] is presented. *) - -val iter_on_values: - (v -> Int.t -> unit) -> - t -> unit + + +(** {2 Interval-unaware iterators} *) + +val iter_on_values: (v -> unit) -> t -> unit (** [iter_on_values f m] iterates on the entire contents of [m], but [f] - receives only the value bound to each interval and the size of this value. - Interval bounds and the offset of the value are not computed. *) + receives only the value bound to each interval. Interval bounds, the + alignment of the value and its size are not computed. *) -val fold_on_values: (v -> Int.t -> 'a -> 'a) -> t -> 'a -> 'a +val fold_on_values: (v -> 'a -> 'a) -> t -> 'a -> 'a (** Same as [iter_on_values] but with an accumulator *) +val map_on_values: (v -> v) -> t -> t +(** [map_on_values f m ] creates the map derived from [m] by applying [f] to + each interval. For each interval, the size of the new value and its offset + relative to the beginning of the interval is kept unchanged. *) + +type map2_decide = + ReturnLeft | ReturnRight | ReturnConstant of v | Recurse +(** This type describes different possibilities to accelerate a simultaneous + iteration on two offsetmaps. {!ReturnLeft} (resp. {!ReturnRight}) means + 'return the left (resp. right) operand unchanged, and stop the recursive + descent'. [ReturnConstant v] means 'return a constant offsetmap of the good + size and that contains [v] everywhere'. It is always correct to return + {!Recurse}, which will force the recursion until the maps have been fully + decomposed. + + Typical usage include functions that verify [f v v = v], maps [m] such that + [f m m' = m'], etc. *) + +val map2_on_values: + Hptmap.cache_type -> (t -> t -> map2_decide) -> (v -> v -> v) -> t -> t -> t +(** [map2_on_values cache decide join m1 m2] applies [join] pointwise to + all the elements of [m1] and [m2] and buils the resulting map. This function + can only be called if [m1] and [m2] contain isotropic values. [decide] + is called during the iteration, and can be used to return early; it is + always correct to return {!Recurse}. Depending on [cache], the results of + the partially applied function [map2_on_values cache decide join] will be + cached between different calls. *) + (** {2 Join and inclusion testing} *) -val join : t -> t -> t +include Lattice_type.Join_Semi_Lattice with type t := t +include Lattice_type.With_Narrow with type t := t -val is_included : t -> t -> bool -(** [is_included m1 m2] tests whether [m1] is included in [m2]. *) +val join_top_bottom: [< t_top_bottom] -> [< t_top_bottom] -> [> t_top_bottom] val widen : widen_hint -> t -> t -> t (** [widen wh m1 m2] performs a widening step on [m2], assuming that @@ -116,11 +149,10 @@ (** {2 Searching values} *) val find : - with_alarms:CilE.warn_mode -> validity:Base.validity -> - conflate_bottom:bool -> + ?conflate_bottom:bool -> offsets:Ival.t -> size:Integer.t -> - t -> v + t -> bool * v (** Find the value bound to a set of intervals, expressed as an ival, in the given rangemap. *) @@ -132,18 +164,17 @@ (** Returns an imprecise join of all the values bound in the offsetmap. *) val copy_slice: - with_alarms:CilE.warn_mode -> validity:Base.validity -> offsets:Ival.t -> size:Integer.t -> - t -> t -(** [copy_slice ~with_alarms ~validity ~offsets ~size m] copies and merges - the slices of [m] starting at offsets [offsets] and of size [size]. - Offsets invalid according to [validity] are removed. *) -(* TODOBY: clarify and document return convention *) + t -> alarm * [`Map of t | `Bottom] +(** [copy_slice ~validity ~offsets ~size m] copies and merges the slices of + [m] starting at offsets [offsets] and of size [size]. Offsets invalid + according to [validity] are removed. [size] must be strictly greater + than zero. *) (** {2 Adding values} *) -val add : (Int.t * Int.t) -> (v * Int.t * Rel.t) -> t -> t +val add : ?exact:bool -> (Int.t * Int.t) -> (v * Int.t * Rel.t) -> t -> t (** [add (min, max) (v, size, offset) m] maps the interval [min..max] (inclusive) to the value [v] in [m]. [v] is assumed as having size [size]. If [stop-start+1] is greater than [size], [v] repeats itself @@ -152,35 +183,51 @@ contain holes, so [m] must already bind at least the intervals [0..start-1]. *) -exception Result_is_bottom - val update : - with_alarms:CilE.warn_mode -> + ?origin:Origin.t -> validity:Base.validity -> exact:bool -> offsets:Ival.t -> size:Int.t -> v -> - t -> t -(** Can raise [Result_is_bottom] *) + t -> alarm * t_bottom +(** [update ?origin ~validity ~exact ~offsets ~size v m] writes [v], + of size [size], each [offsets] in [m]; [m] must be of the size implied by + [validity]. [~exact=true] results in a strong update, while + [~exact=false] performs a weak update. If [offsets] contains too many + offsets, or if [offsers] and [size] are not compatible, [offsets] and/or + [v] are over-approximated. In this case, [origin] is used as the source of + the resulting imprecision. Returns [`Bottom] when all offsets are invalid. + The boolean returned indicates a potential alarm. *) + +val update_under : + validity:Base.validity -> + exact:bool -> + offsets:Ival.t -> + size:Int.t -> + v -> + t -> alarm * t_bottom +(** Same as {!update}, except that no over-approximation on the set + of offsets or on the value written occurs. In case of imprecision, + [m] is not updated. *) + val update_imprecise_everywhere: validity:Base.validity -> Origin.t -> v -> - t -> t + t -> t_bottom (** [update_everywhere ~validity o v m] computes the offsetmap resulting from imprecisely writing [v] potentially anywhere where [m] is valid according to [validity]. If a value becomes too imprecise, [o] is used as origin. *) val paste_slice: - with_alarms:CilE.warn_mode -> validity:Base.validity -> exact:bool -> - (t * Int.t) (** Source *)-> + from:t -> size:Int.t -> offsets:Ival.t -> - t -> t + t -> alarm * t_bottom (** {2 Shape} *) @@ -201,10 +248,17 @@ (** {2 Misc} *) +val imprecise_write_msg: string ref +(** The message "more than N . Approximating." is displayed + when the offsetmap must update too many locations in one operation. *) + (** Clear the caches local to this module. Beware that they are not project-aware, and that you must call them at every project switch. *) val clear_caches: unit -> unit +(**/**) + +val pretty_debug: t Pretty_utils.formatter (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/precise_locs.ml frama-c-20150201+sodium+dfsg/src/memory_state/precise_locs.ml --- frama-c-20140301+neon+dfsg/src/memory_state/precise_locs.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/precise_locs.ml 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,313 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) + +open Abstract_interp +open Locations + +type precise_offset = + | POBottom (* No offset *) + | POZero (* Offset zero *) + | POSingleton of Int.t (* Single offset *) + | POPrecise of Ival.t * (Int.t (* cardinal *)) + (* Offset exactly represented by an ival *) + | POImprecise of Ival.t (* Offset that could not be represented precisely *) + | POShift of (* Shifted offset *) + Ival.t (* number of bits/bytes to shift *) * + precise_offset * + Int.t (* cardinal*) + +(* Cardinals are over-approximated: the combination [{0, 1} + {0, 1}] + is considered as having cardinal 4 instead of 3. POBottom is the + only way to represent Bottom (ie [POImprecise Ival.bottom] is + forbidden). Other invariants, ie. [POSingleton i] means that [i] is + non-zero, are not required for correction -- only for performance. *) + + +let rec pretty_offset fmt = function + | POBottom -> Format.fprintf fmt "" + | POZero -> Format.fprintf fmt "<0>" + | POSingleton i -> Format.fprintf fmt "<%a>_0" Int.pretty i + | POPrecise (po, _) -> Format.fprintf fmt "<%a>p" Ival.pretty po + | POImprecise po -> Format.fprintf fmt "<%a>i" Ival.pretty po + | POShift (i, po, _) -> + Format.fprintf fmt "<%a+%a>" pretty_offset po Ival.pretty i + +let offset_zero = POZero +let offset_bottom = POBottom +let offset_top = POImprecise Ival.top + +let is_bottom_offset off = off = POBottom + +let cardinal_zero_or_one_offset = function + | POBottom | POZero | POSingleton _ -> true + | POPrecise (_, c) | POShift (_, _, c) -> Int.le c Int.one + | POImprecise _ -> false + + +let small_cardinal c = Int.le c (Int.of_int (Offsetmap.get_plevel ())) + +let _cardinal_offset = function + | POBottom -> Some Int.zero + | POZero | POSingleton _ -> Some Int.one + | POPrecise (_, c) -> Some c + | POImprecise _ -> None + | POShift (_, _, c) -> Some c + +let rec imprecise_offset = function + | POBottom -> Ival.bottom + | POZero -> Ival.singleton_zero + | POSingleton i -> Ival.inject_singleton i + | POPrecise (i, _) | POImprecise i -> i + | POShift (shift, po, _) -> Ival.add_int shift (imprecise_offset po) + +let rec _scale_offset scale po = + assert (Int.gt scale Int.zero); + match po with + | POBottom -> POBottom + | POZero -> POZero + | POSingleton i -> POSingleton (Int.mul i scale) + | POPrecise (i, c) -> POPrecise (Ival.scale scale i, c) + | POImprecise i -> POImprecise (Ival.scale scale i) + | POShift (shift, po, c) -> + POShift (Ival.scale scale shift, _scale_offset scale po, c) + +let shift_offset_by_singleton shift po = + if Int.is_zero shift then + po + else + match po with + | POBottom -> POBottom + | POZero -> POSingleton shift + | POSingleton i -> POSingleton (Int.add i shift) + | POPrecise (i, c) -> POPrecise (Ival.add_singleton_int shift i, c) + | POImprecise i -> POImprecise (Ival.add_singleton_int shift i) + | POShift (shift', po, c) -> + POShift (Ival.add_singleton_int shift shift', po, c) + +let shift_offset shift po = + if Ival.is_bottom shift then + POBottom + else + match po with + | POBottom -> POBottom + + | POZero -> + (match Ival.cardinal shift with + | Some c when small_cardinal c -> + if Int.equal c Int.one then + POSingleton (Ival.project_int shift) + else + POPrecise (shift, c) + | _ -> POImprecise shift) + + | POImprecise i -> POImprecise (Ival.add_int shift i) + + | POSingleton i -> + (match Ival.cardinal shift with + | Some c when small_cardinal c -> + if Int.equal c Int.one then + POSingleton (Int.add (Ival.project_int shift) i) + else + POPrecise (Ival.add_singleton_int i shift, c) + | _ -> POImprecise (Ival.add_int shift (imprecise_offset po))) + + | POPrecise (_i, cpo) -> + (match Ival.cardinal shift with + | Some cs -> + let new_card = Int.mul cs cpo in + if small_cardinal new_card then + POShift (shift, po, new_card) (* may be a POPrecise depending + on ilevel *) + else + POImprecise (Ival.add_int shift (imprecise_offset po)) + | None -> + POImprecise (Ival.add_int shift (imprecise_offset po))) + + | POShift (_shift', _po', cpo) -> + (match Ival.cardinal shift with + | Some cs -> + let new_card = Int.mul cs cpo in + if small_cardinal new_card then + POShift (shift, po, new_card) (* may be a single POShift depending + on the cardinals of shift/shift'*) + else + POImprecise (Ival.add_int shift (imprecise_offset po)) + | None -> + POImprecise (Ival.add_int shift (imprecise_offset po))) + +type precise_location_bits = + | PLBottom + | PLLoc of Location_Bits.t + | PLVarOffset of Base.t * precise_offset + | PLLocOffset of Location_Bits.t * precise_offset + +let pretty_loc_bits fmt = function + | PLBottom -> Format.fprintf fmt "[Bot]" + | PLLoc loc -> Format.fprintf fmt "[%a]" Location_Bits.pretty loc + | PLVarOffset (b, po) -> + Format.fprintf fmt "[%a+%a]" Base.pretty b pretty_offset po + | PLLocOffset (loc, po) -> + Format.fprintf fmt "[%a+%a]" Location_Bits.pretty loc pretty_offset po + +let bottom_location_bits = PLBottom + +let cardinal_zero_or_one_location_bits = function + | PLBottom -> true + | PLLoc loc -> Location_Bits.cardinal_zero_or_one loc + | PLVarOffset (_, po) -> cardinal_zero_or_one_offset po + | PLLocOffset (loc, po) -> + Location_Bits.cardinal_zero_or_one loc && cardinal_zero_or_one_offset po + +let inject_location_bits loc = + if Location_Bits.is_bottom loc then PLBottom else PLLoc loc + +let combine_base_precise_offset base po = + match po with + | POBottom -> PLBottom + | POZero -> PLLoc (Location_Bits.inject base Ival.singleton_zero) + | POSingleton i -> + PLLoc (Location_Bits.inject base (Ival.inject_singleton i)) + | POImprecise i | POPrecise (i, _) -> PLLoc (Location_Bits.inject base i) + | POShift _ -> PLVarOffset (base, po) + +let combine_loc_precise_offset loc po = + match po with + | POBottom -> PLBottom + | POZero -> PLLoc loc + | POImprecise i -> + PLLoc (Location_Bits.shift i loc) + | POSingleton i -> + PLLoc (Location_Bits.shift (Ival.inject_singleton i) loc) + | POPrecise (i, _c) when Location_Bits.cardinal_zero_or_one loc -> + PLLoc (Location_Bits.shift i loc) + | POPrecise (_, c) | POShift (_, _, c) -> + (match Location_Bits.cardinal loc with + | Some card when small_cardinal (Int.mul card c) -> + PLLocOffset (loc, po) + | _ -> + PLLoc (Location_Bits.shift (imprecise_offset po) loc) + ) + +let imprecise_location_bits = function + | PLBottom -> Location_Bits.bottom + | PLLoc l -> l + | PLVarOffset (b, po) -> Location_Bits.inject b (imprecise_offset po) + | PLLocOffset (loc, po) -> Location_Bits.shift (imprecise_offset po) loc + +type precise_location = { + loc: precise_location_bits; + size: Int_Base.t +} + +let imprecise_location pl = + make_loc (imprecise_location_bits pl.loc) pl.size + +let make_precise_loc loc ~size = { loc; size } + +let loc_size loc = loc.size + +let loc_bottom = { + loc = PLBottom; + size = Int_Base.top; +} +let is_bottom_loc pl = pl.loc = PLBottom + +let rec fold_offset f po acc = + match po with + | POBottom -> f Ival.bottom acc + | POZero -> f Ival.singleton_zero acc + | POSingleton i -> f (Ival.inject_singleton i) acc + | POPrecise (iv, _) | POImprecise iv -> f iv acc + | POShift (shift, po', _) -> + let aux_po ival acc = + let aux_ival shift_i acc = + let ival' = Ival.add_singleton_int shift_i ival in + f ival' acc + in + Ival.fold_int aux_ival shift acc + in + fold_offset aux_po po' acc + +let fold f pl acc = + match pl.loc with + | PLBottom -> f Locations.loc_bottom acc + | PLLoc l -> f (make_loc l pl.size) acc + | PLVarOffset (b, po) -> + let aux_po ival acc = + let loc_b = Location_Bits.inject b ival in + let loc = make_loc loc_b pl.size in + f loc acc + in + fold_offset aux_po po acc + | PLLocOffset (loc, po) -> + let aux_po ival_po acc = + let aux_loc b ival_loc acc = + let aux_ival_loc i acc = + let ival = Ival.add_singleton_int i ival_po in + let loc_b = Location_Bits.inject b ival in + let loc = make_loc loc_b pl.size in + f loc acc + in + Ival.fold_int aux_ival_loc ival_loc acc + in + Location_Bits.fold_i aux_loc loc acc + in + fold_offset aux_po po acc + +let enumerate_valid_bits ~for_writing loc = + let aux loc z = Zone.join z (enumerate_valid_bits ~for_writing loc) in + fold aux loc Zone.bottom + + +let cardinal_zero_or_one pl = + not (Int_Base.is_top pl.size) && cardinal_zero_or_one_location_bits pl.loc + +let valid_cardinal_zero_or_one ~for_writing pl = + match pl.loc with + | PLBottom -> true + | PLLoc lb -> + let loc = make_loc lb pl.size in + Locations.valid_cardinal_zero_or_one ~for_writing loc + | _ -> + try + ignore + (fold (fun loc found_one -> + let valid = Locations.valid_part ~for_writing loc in + if Locations.is_bottom_loc loc then found_one + else + if Locations.cardinal_zero_or_one valid then + if found_one then raise Exit else true + else raise Exit + ) pl false); + true + with Exit -> false + +let pretty_loc fmt loc = + Format.fprintf fmt "%a (size:%a)" + pretty_loc_bits loc.loc Int_Base.pretty loc.size + + +(* +Local Variables: +compile-command: "make -C ../.." +End: +*) diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/precise_locs.mli frama-c-20150201+sodium+dfsg/src/memory_state/precise_locs.mli --- frama-c-20140301+neon+dfsg/src/memory_state/precise_locs.mli 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/precise_locs.mli 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,93 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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 module provides transient datastructures that may be more precise + than an {!Ival.t}, {!Locations.Location_Bits.t} and {!Locations.location} + respectively, typically for l-values such as [t[i][j]], [p->t[i]], etc. + Those structures do not have a lattice structure, and cannot be stored + as an abstract domain. However, they can be use to model more precisely + read or write accesses to semi-imprecise l-values. *) + + +(** {2 Precise offsets} *) + +type precise_offset +val pretty_offset : Format.formatter -> precise_offset -> unit + +val offset_zero : precise_offset +val offset_bottom : precise_offset +val offset_top : precise_offset + +val is_bottom_offset : precise_offset -> bool + +val imprecise_offset : precise_offset -> Ival.t + +(*val _scale_offset : Integer.t -> precise_offset -> precise_offset*) +val shift_offset_by_singleton : Integer.t -> precise_offset -> precise_offset +val shift_offset : Ival.t -> precise_offset -> precise_offset + + +(** {2 Precise location_bits} *) + +type precise_location_bits +val pretty_loc_bits : Format.formatter -> precise_location_bits -> unit +val bottom_location_bits : precise_location_bits + +val inject_location_bits : Locations.Location_Bits.t -> precise_location_bits +val combine_base_precise_offset : + Base.t -> precise_offset -> precise_location_bits +val combine_loc_precise_offset : + Locations.Location_Bits.t -> precise_offset -> precise_location_bits + +val imprecise_location_bits : + precise_location_bits -> Locations.Location_Bits.t + + +(** {2 Precise locations} *) + +type precise_location + +val loc_size: precise_location -> Int_Base.t + +val make_precise_loc : + precise_location_bits -> size:Int_Base.t -> precise_location + +val imprecise_location : precise_location -> Locations.location + +val loc_bottom : precise_location +val is_bottom_loc: precise_location -> bool + +val fold: + (Locations.location -> 'a -> 'a) -> precise_location -> 'a -> 'a + +val enumerate_valid_bits: + for_writing:bool -> precise_location -> Locations.Zone.t + +val valid_cardinal_zero_or_one: for_writing:bool -> precise_location -> bool +(** Is the restriction of the given location to its valid part precise enough + to perform a strong read, or a strong update. *) + +val cardinal_zero_or_one: precise_location -> bool +(** Should not be used, {!valid_cardinal_zero_or_one} is almost always more + useful *) + +val pretty_loc: precise_location Pretty_utils.formatter diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/tr_offset.ml frama-c-20150201+sodium+dfsg/src/memory_state/tr_offset.ml --- frama-c-20140301+neon+dfsg/src/memory_state/tr_offset.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/tr_offset.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -21,134 +21,79 @@ (**************************************************************************) open Abstract_interp -open CilE type t = | Invalid | Set of Int.t list | Interval of Int.t * Int.t * Int.t - | Imprecise of Int.t * Int.t + | Overlap of Int.t * Int.t * Origin.t -exception OverlyLongForPeriodic - -(* Returns [still_exact_flag, (alarm, reduce_ival)] *) -let reduce_ival_by_bound ival size validity = +(* Returns (alarm, reduced_ival)] *) +let trim_by_validity ?(origin=Origin.Unknown) ival size validity = let pred_size = Int.pred size in - match validity with - | Base.Invalid -> true, (true, Invalid) - | Base.Known (bound_min, bound_max) | Base.Unknown (bound_min, _, bound_max) - | Base.Periodic (bound_min, bound_max, _) -> - let max_in_bound = Int.sub bound_max pred_size in - let is_in_bound mn mx r modu = - let out, new_mn = - match mn with - | Some mn when (Int.ge mn bound_min) -> false, mn - | _ -> true, Int.round_up_to_r ~r ~modu ~min:bound_min - in - let out, new_mx = - match mx with - | Some mx when (Int.le mx max_in_bound) -> - let out = - match validity with - | Base.Unknown (_,Some valid_max, _) - when Int.gt mx (Int.sub valid_max pred_size) -> true - | Base.Unknown (_, None, _) -> true - | _ -> out - in - out, mx - | _ -> true, Int.round_down_to_r ~r ~modu ~max:max_in_bound - in - let itv_or_set = - if Int.le new_mn new_mx - then begin - if Int.lt modu size - then Imprecise(new_mn, Int.add new_mx pred_size) - else Interval(new_mn, new_mx, modu) - end - else Invalid + (* reduce [ival] so that all accesses fit within [bound_min] and + [bound_max] *) + let reduce_for_bounds bound_min bound_max = + let max_in_bound = Int.sub bound_max pred_size in + let is_in_bound mn mx r modu = + let alarm, new_mn = + match mn with + | Some mn when (Int.ge mn bound_min) -> false, mn + | _ -> true, Int.round_up_to_r ~r ~modu ~min:bound_min + in + let alarm, new_mx = + match mx with + | Some mx when (Int.le mx max_in_bound) -> + let alarm = + match validity with + | Base.Unknown (_,Some valid_max, _) + when Int.gt mx (Int.sub valid_max pred_size) -> true + | Base.Unknown (_, None, _) -> true + | _ -> alarm in - out, itv_or_set + alarm, mx + | _ -> true, Int.round_down_to_r ~r ~modu ~max:max_in_bound in - let out, reduced_bounds as result = - begin match ival with - | Ival.Top (mn,mx,r,m) -> is_in_bound mn mx r m - | Ival.Float _ -> is_in_bound None None Integer.zero Integer.one - | Ival.Set s -> - let out, set = - Array.fold_right - (fun offset (out_acc, reduced_acc) -> - let sOffset = Some offset in - let out, reduced = - is_in_bound - sOffset - sOffset - Integer.zero - Integer.one - in - out || out_acc, - if reduced != Invalid - then offset :: reduced_acc - else reduced_acc) - s - (false, []) - in - if set = [] then (out, Invalid) else (out, Set set) + let itv_or_set = + if Int.le new_mn new_mx + then begin + if Int.equal new_mn new_mx then + Set [new_mn] (* No need to compare [size] and [modu] in this case *) + else + if Int.lt modu size + then Overlap(new_mn, Int.add new_mx pred_size, origin) + else Interval(new_mn, new_mx, modu) end + else Invalid in - match validity with - | Base.Periodic(_, _, p) -> - assert (Int.is_zero bound_min); - let reduced_bounds = - match reduced_bounds with - | Invalid -> Invalid - | Imprecise (mn, mx) -> - if Int.equal (Int.pos_div mn p) (Int.pos_div mx p) - then Imprecise (Int.pos_rem mn p, Int.pos_rem mx p) - else Imprecise (bound_min, Int.pred p) - | Set s -> - let treat_offset acc offset = - let new_offset = Int.pos_rem offset p in - if Int.gt (Int.add new_offset size) p - then raise OverlyLongForPeriodic - else - (*Format.printf "old offset: %a mx: %a period: %a new: %a@." - Int.pretty offset Int.pretty bound_max - Int.pretty p Int.pretty new_offset; *) - new_offset :: acc - in - begin - try - let trimmed = List.fold_left treat_offset [] s in - Set (List.sort Integer.compare trimmed) - with OverlyLongForPeriodic -> - Imprecise (bound_min, Int.pred p) - end - | Interval(lb, _ub, mo) -> - if Int.is_zero (Int.pos_rem mo p) - then Set [Int.pos_rem lb p] - else begin -(* Format.printf "Interval %a %a %a / %a@." - Int.pretty lb - Int.pretty _ub - Int.pretty mo - Int.pretty p; *) - Imprecise (bound_min, Int.pred p) - end - in - false, (out, reduced_bounds) - | _ -> true, result - - let filter_by_bound_for_reading ~with_alarms ival size validity = - let _, (out, filtered_by_bound) = reduce_ival_by_bound ival size validity in - if out then warn_mem_read with_alarms; - filtered_by_bound - - let filter_by_bound_for_writing ~with_alarms ~exact ival size validity = - let still_exact, (out, filtered_by_bound) = - reduce_ival_by_bound ival size validity + alarm, itv_or_set in - if out then warn_mem_write with_alarms; - (exact && still_exact), filtered_by_bound + begin match ival with + | Ival.Float _ -> assert false + | Ival.Top (mn,mx,r,m) -> is_in_bound mn mx r m + | Ival.Set s -> + let alarm, set = + Array.fold_right + (fun offset (alarm_acc, reduced_acc) -> + let sOffset = Some offset in + let alarm, reduced = + is_in_bound sOffset sOffset Int.zero Int.one + in + alarm || alarm_acc, + if reduced != Invalid + then offset :: reduced_acc + else reduced_acc) + s + (false, []) + in + if set = [] then (alarm, Invalid) else (alarm, Set set) + end + in + match validity with + | Base.Invalid -> + true, Invalid + | Base.Known (min, max) | Base.Unknown (min, _, max) -> + reduce_for_bounds min max (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/tr_offset.mli frama-c-20150201+sodium+dfsg/src/memory_state/tr_offset.mli --- frama-c-20140301+neon+dfsg/src/memory_state/tr_offset.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/tr_offset.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -23,23 +23,29 @@ (** Reduction of a location (expressed as an Ival.t and a size) by a base validity. Only the locations in the trimmed result are valid. *) -type t = +type t = private | Invalid (** No location is valid *) | Set of Integer.t list (** Limited number of locations *) | Interval of (** min *) Integer.t * (** max *) Integer.t * (** modu *)Integer.t - | Imprecise of (** min *) Integer.t * - (** max *) Integer.t + | Overlap of (** min *) Integer.t * + (** max *) Integer.t * + Origin.t (** The location covers the entire range [min..max], + but consecutive offsets overlap *) -val filter_by_bound_for_reading : - with_alarms:CilE.warn_mode -> - Ival.t -> Integer.t -> Base.validity -> t - -val filter_by_bound_for_writing : - with_alarms:CilE.warn_mode -> - exact:bool -> - Ival.t -> Integer.t -> Base.validity -> bool * t +(** [trim_by_validity ?origin offsets size validity] reduces [offsets] so that + all accesses to [offsets+(0..size-1)] are valid according to [validity]. + The returned boolean indicates that at least one of the offsets does not + comply with [validity]. If the valid offsets cannot be represented + precisely, the [Imprecise] constructor is returned. When specified, + the [origin] argument is used as the source of this imprecision . *) +val trim_by_validity : + ?origin:Origin.t -> + Ival.t -> + Integer.t -> + Base.validity -> + bool (** alarm *) * t (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/value_messages.ml frama-c-20150201+sodium+dfsg/src/memory_state/value_messages.ml --- frama-c-20140301+neon+dfsg/src/memory_state/value_messages.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/value_messages.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,9 +20,11 @@ (* *) (**************************************************************************) +(** UNDOCUMENTED. *) + open Cil_types;; -(* Warnings can either emit ACSL (Alarm), or do not emit ACSL +(** Warnings can either emit ACSL (Alarm), or do not emit ACSL (others). *) type warning = | Alarm of Alarms.t * Property_status.emitted_status @@ -39,7 +41,7 @@ | Garbled_mix_creation of Cil_types.exp (* Expression that creates the garbled mix. *) | Garbled_mix_propagation -(* Temporary: avoid a circular dependency while CilE is used. *) +(** Temporary: avoid a circular dependency while CilE is used. *) type callstack = unit (* Value_types.callstack;; *) type state = unit (* Cvalue.Model.t;; *) diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/value_types.ml frama-c-20150201+sodium+dfsg/src/memory_state/value_types.ml --- frama-c-20140301+neon+dfsg/src/memory_state/value_types.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/value_types.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/value_types.mli frama-c-20150201+sodium+dfsg/src/memory_state/value_types.mli --- frama-c-20140301+neon+dfsg/src/memory_state/value_types.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/value_types.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/widen_type.ml frama-c-20150201+sodium+dfsg/src/memory_state/widen_type.ml --- frama-c-20140301+neon+dfsg/src/memory_state/widen_type.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/widen_type.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -71,8 +71,7 @@ let validity = Base.validity b in match validity with | Base.Known (_, m) - | Base.Unknown (_, _, m) - | Base.Periodic (_, m, _) -> + | Base.Unknown (_, _, m) -> (* Try the frontier of the block: further accesses are invalid anyway. This also works great for constant strings (this computes the offset of the null terminator). *) diff -Nru frama-c-20140301+neon+dfsg/src/memory_state/widen_type.mli frama-c-20150201+sodium+dfsg/src/memory_state/widen_type.mli --- frama-c-20140301+neon+dfsg/src/memory_state/widen_type.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/memory_state/widen_type.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/metrics/css_html.ml frama-c-20150201+sodium+dfsg/src/metrics/css_html.ml --- frama-c-20140301+neon+dfsg/src/metrics/css_html.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/css_html.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/metrics/metrics_acsl.ml frama-c-20150201+sodium+dfsg/src/metrics/metrics_acsl.ml --- frama-c-20140301+neon+dfsg/src/metrics/metrics_acsl.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/metrics_acsl.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/metrics/metrics_acsl.mli frama-c-20150201+sodium+dfsg/src/metrics/metrics_acsl.mli --- frama-c-20140301+neon+dfsg/src/metrics/metrics_acsl.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/metrics_acsl.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/metrics/metrics_base.ml frama-c-20150201+sodium+dfsg/src/metrics/metrics_base.ml --- frama-c-20140301+neon+dfsg/src/metrics/metrics_base.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/metrics_base.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/metrics/metrics_base.mli frama-c-20150201+sodium+dfsg/src/metrics/metrics_base.mli --- frama-c-20140301+neon+dfsg/src/metrics/metrics_base.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/metrics_base.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/metrics/metrics_cabs.ml frama-c-20150201+sodium+dfsg/src/metrics/metrics_cabs.ml --- frama-c-20140301+neon+dfsg/src/metrics/metrics_cabs.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/metrics_cabs.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -194,7 +194,7 @@ self#incr_both_metrics incr_dpoints; | BREAK _ | CONTINUE _ -> () - | RETURN _ -> self#incr_both_metrics incr_exits; + | RETURN _ | THROW _ -> self#incr_both_metrics incr_exits; | SWITCH _ -> () | LABEL _ -> () | GOTO _ @@ -204,6 +204,7 @@ | SEQUENCE _ | TRY_EXCEPT _ | TRY_FINALLY _ + | TRY_CATCH _ | CODE_ANNOT _ | CODE_SPEC _ -> ()); self#set_case stmt; diff -Nru frama-c-20140301+neon+dfsg/src/metrics/metrics_cabs.mli frama-c-20150201+sodium+dfsg/src/metrics/metrics_cabs.mli --- frama-c-20140301+neon+dfsg/src/metrics/metrics_cabs.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/metrics_cabs.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/metrics/metrics_cilast.ml frama-c-20150201+sodium+dfsg/src/metrics/metrics_cilast.ml --- frama-c-20140301+neon+dfsg/src/metrics/metrics_cilast.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/metrics_cilast.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -182,7 +182,7 @@ if consider_function vi then global_metrics := incr_funcs !global_metrics; ) else ( - if vi.vglob && not vi.vgenerated + if vi.vglob && not vi.vtemp then ( global_metrics:= incr_glob_vars !global_metrics; ) diff -Nru frama-c-20140301+neon+dfsg/src/metrics/metrics_cilast.mli frama-c-20150201+sodium+dfsg/src/metrics/metrics_cilast.mli --- frama-c-20140301+neon+dfsg/src/metrics/metrics_cilast.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/metrics_cilast.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/metrics/metrics_coverage.ml frama-c-20150201+sodium+dfsg/src/metrics/metrics_coverage.ml --- frama-c-20140301+neon+dfsg/src/metrics/metrics_coverage.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/metrics_coverage.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -280,7 +280,6 @@ Varinfo.Set.empty let compute () = - !Db.Value.compute (); let semantic = compute_semantic () in let main = fst (Globals.entry_point ()) in let syntactic, initializers = compute_syntactic main in diff -Nru frama-c-20140301+neon+dfsg/src/metrics/metrics_coverage.mli frama-c-20150201+sodium+dfsg/src/metrics/metrics_coverage.mli --- frama-c-20140301+neon+dfsg/src/metrics/metrics_coverage.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/metrics_coverage.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/metrics/metrics_gui.ml frama-c-20150201+sodium+dfsg/src/metrics/metrics_gui.ml --- frama-c-20140301+neon+dfsg/src/metrics/metrics_gui.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/metrics_gui.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -69,7 +69,7 @@ - The upper part contains the various choices of the user; - The bottom part displays the result. *) -let init_panel () = +let init_panel (main_ui: Design.main_window_extension_points) = let v = GPack.vbox () in (* Titles, buttons, and headers *) let up = GPack.hbox ~width:120 ~packing:(v#pack ~expand:true) () in @@ -78,7 +78,7 @@ let choices = GEdit.combo_box_text ~active:0 ~strings:[] ~packing:(up#pack) () in - let launch_button = GButton.button ~label:"Launch metrics" + let launch_button = GButton.button ~label:"Launch" ~packing:(up#pack) () in ignore(launch_button#connect#clicked (fun () -> @@ -90,7 +90,8 @@ if List.mem_assoc s actions then let action = List.assoc s actions in clear_container bottom; - action bottom; + ignore (main_ui#full_protect ~cancelable:true + (fun () -> action bottom)) else () ) ); set_panel (Some choices) (Some bottom); diff -Nru frama-c-20140301+neon+dfsg/src/metrics/metrics_gui.mli frama-c-20150201+sodium+dfsg/src/metrics/metrics_gui.mli --- frama-c-20140301+neon+dfsg/src/metrics/metrics_gui.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/metrics_gui.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -26,7 +26,7 @@ @returns a box containing the lower part of the panel where metrics can display their results. *) -val init_panel : unit -> GPack.box ;; +val init_panel : Design.main_window_extension_points -> GPack.box ;; (** @returns a value allowing to register the panel into the main GUI *) val coerce_panel_to_ui : < coerce : 'a; .. > -> 'b -> string * 'a * 'c option ;; diff -Nru frama-c-20140301+neon+dfsg/src/metrics/Metrics.mli frama-c-20150201+sodium+dfsg/src/metrics/Metrics.mli --- frama-c-20140301+neon+dfsg/src/metrics/Metrics.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/Metrics.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/metrics/metrics_parameters.ml frama-c-20150201+sodium+dfsg/src/metrics/metrics_parameters.ml --- frama-c-20140301+neon+dfsg/src/metrics/metrics_parameters.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/metrics_parameters.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -44,7 +44,7 @@ end) module OutputFile = - EmptyString + Empty_string (struct let option_name = "-metrics-output" let arg_name = "filename" @@ -74,7 +74,7 @@ let () = AstType.set_possible_values ["cil"; "cabs"; "acsl"] module SyntacticallyReachable = - StringSet + Kernel_function_set (struct let option_name = "-metrics-cover" let arg_name = "f1,..,fn" diff -Nru frama-c-20140301+neon+dfsg/src/metrics/metrics_parameters.mli frama-c-20150201+sodium+dfsg/src/metrics/metrics_parameters.mli --- frama-c-20140301+neon+dfsg/src/metrics/metrics_parameters.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/metrics_parameters.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -43,8 +43,8 @@ "txt" or "text" for text *) -module SyntacticallyReachable: Parameter_sig.String_set -(** List of functions for which we compute the functions they may call *) +module SyntacticallyReachable: Parameter_sig.Kernel_function_set +(** Set of functions for which we compute the functions they may call *) (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/metrics/register_gui.ml frama-c-20150201+sodium+dfsg/src/metrics/register_gui.ml --- frama-c-20140301+neon+dfsg/src/metrics/register_gui.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/register_gui.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -157,7 +157,7 @@ | _ -> () end - method cyclo_selector (popup_factory:GMenu.menu GMenu.factory) _main_ui ~button localizable = + method cyclo_selector (popup_factory:GMenu.menu GMenu.factory) main_ui ~button localizable = if button = 3 && Db.Value.is_computed () then match localizable with | PVDecl (Some kf, _) -> @@ -223,7 +223,9 @@ let compute () = begin match !result with - | None -> result := Some (fst (Metrics_coverage.compute ())) + | None -> + !Db.Value.compute (); + result := Some (fst (Metrics_coverage.compute ())) | Some _ -> () end; Extlib.the !result @@ -291,7 +293,7 @@ end let register_final main_ui = - let box = Metrics_gui.init_panel () in + let box = Metrics_gui.init_panel main_ui in Design.register_reset_extension Metrics_gui.reset_panel; HalsteadMetricsGUI.register main_ui; CyclomaticMetricsGUI.register main_ui; diff -Nru frama-c-20140301+neon+dfsg/src/metrics/register.ml frama-c-20150201+sodium+dfsg/src/metrics/register.ml --- frama-c-20140301+neon+dfsg/src/metrics/register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/metrics/register.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -38,11 +38,9 @@ end; SyntacticallyReachable.iter - (fun s -> - try let kf = Globals.Functions.find_by_name s in - Metrics_parameters.result - "%a" Metrics_coverage.pp_reached_from_function kf - with Not_found -> Metrics_parameters.error "Unknown function %s" s) + (fun kf -> + Metrics_parameters.result "%a" + Metrics_coverage.pp_reached_from_function kf) let () = ValueCoverage.set_output_dependencies [Db.Value.self] diff -Nru frama-c-20140301+neon+dfsg/src/misc/bit_utils.ml frama-c-20150201+sodium+dfsg/src/misc/bit_utils.ml --- frama-c-20140301+neon+dfsg/src/misc/bit_utils.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/misc/bit_utils.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -189,10 +189,7 @@ (if Kernel.debug_atleast 1 then String.make 1 c else "") (fun fmt -> if Int.equal stop (max_bit_address ()) then - if Int.equal start Int.zero then - Format.pp_print_string fmt "..." - else - Format.fprintf fmt "bits %a to ..." Int.pretty start + Format.fprintf fmt "bits %a to .." Int.pretty start else Format.fprintf fmt "bits %a to %a" Int.pretty start Int.pretty stop ) @@ -411,139 +408,6 @@ raw_bits 'a' start stop) -let rec pretty_offset_internal env typ ~start = - - let update_types typ = env.types <- update_types env.types typ in - - let raw_offset start = - let cond = false in - Format.fprintf env.fmt "[%t]%s" - (fun fmt -> Format.fprintf fmt "bit %a" Int.pretty start) - (if cond then (env.misaligned <- true ; "#") else "") - in - match (unrollType typ) with - | TInt (_ , _) | TPtr (_, _) | TEnum (_, _) | TFloat (_, _) - | TVoid _ | TBuiltin_va_list _ | TNamed _ | TFun (_, _, _, _) as typ -> - if Int.is_zero start then - (** pretty print a full offset *) - ( update_types typ) - else begin - env.types <- Mixed; - raw_offset start - end - - | TComp (compinfo, _, _) as typ -> - if (not env.use_align) - then - update_types typ (* do not print sub-fields if the size is exactly - the right one and the alignement is not important *) - else begin - try - let full_fields_to_print = List.fold_left - (fun acc field -> - let current_offset = Field (field,NoOffset) in - let start_o,width_o = bitsOffset typ current_offset in - let start_o,width_o = Int.of_int start_o, Int.of_int width_o in - let diff = Int.sub start start_o in - if Int.le start_o start && Int.le diff width_o then - let new_bfinfo = match field.fbitfield with - | None -> Other - | Some i -> Bitfield (Int.to_int64 (Int.of_int i)) - in - let new_align = Int.zero - in - let name = Pretty_utils.sfprintf "%a" Printer.pp_field field in - NamedField( name , - new_bfinfo , field.ftype , - new_align , diff , diff ) :: acc - else - acc) - [] - compinfo.cfields - in - (** find non covered intervals in structs *) - let non_covered,succ_last = - if compinfo.cstruct then - List.fold_left - (fun ((s,last_field_offset) as acc) field -> - let current_offset = Field (field,NoOffset) in - let start_o,width_o = bitsOffset typ current_offset in - let start_o,width_o = - Int.of_int start_o, Int.of_int width_o - in - let succ_stop_o = Int.add start_o width_o in - if Int.gt start_o start then acc - else if Int.le succ_stop_o start then acc - else if Int.gt start_o last_field_offset then - (* found a hole *) - (RawField('c', last_field_offset,Int.pred start_o)::s, - succ_stop_o) - else - (s,succ_stop_o) - ) - (full_fields_to_print,start) - compinfo.cfields - else full_fields_to_print, Int.zero - in - let overflowing = - if compinfo.cstruct && Int.le succ_last start - then RawField('o',Int.max start succ_last,start)::non_covered - else non_covered - in - let pretty_one_field = function - | NamedField(name,_bf,ftyp,_align,start,_stop) -> - Format.fprintf env.fmt ".%s" name ; - pretty_offset_internal env ftyp ~start - | RawField(_c,start,_stop) -> - env.types <- Mixed; - Format.pp_print_char env.fmt '.' ; - raw_offset start - in - let rec pretty_all_fields = function - | [] -> () - | [f] -> pretty_one_field f - | f::fs -> - pretty_all_fields fs ; - Format.pp_print_string env.fmt "; "; - pretty_one_field f ; - in - match overflowing with - | [] -> Format.pp_print_string env.fmt "{}" - | [f] -> pretty_one_field f - | fs -> - Format.pp_print_char env.fmt '{' ; - pretty_all_fields fs ; - Format.pp_print_char env.fmt '}' - with Cil.SizeOfError _ -> - raw_offset start - end - - | TArray (typ, _, _, _) -> - let size = - try Int.of_int (bitsSizeOf typ) - with Cil.SizeOfError _ -> Int.zero - in - if Int.is_zero size then - raw_offset start - else - let start_case = Int.pos_div start size in - let rem_start_size = Int.pos_rem start size in - Format.fprintf env.fmt "[%a]" Int.pretty start_case ; - pretty_offset_internal env typ - ~start:rem_start_size - -let pretty_offset typ start fmt = - let env = - { - fmt = fmt ; - rh_size = Int.zero ; - use_align = true ; - misaligned = false ; - types = NoneYet ;} - in - pretty_offset_internal env typ start - - let pretty_bits typ ~use_align ~align ~rh_size ~start ~stop fmt = (* It is simpler to perform all computation using an absolute offset: Cil easily gives offset information in terms of offset since the start, @@ -569,9 +433,127 @@ | Mixed | NoneYet -> None | SomeType t -> Some t) +(* -------------------------------------------------------------------------- *) +(* --- Mapping numeric offset -> symbolic one --- *) +(* -------------------------------------------------------------------------- *) + +exception NoMatchingOffset + +type offset_match = +| MatchType of typ +| MatchSize of Integer.t +| MatchFirst + +(* Comparaison of the shape of two types. Attributes are completely ignored. *) +let rec equal_type_no_attribute t1 t2 = + match Cil.unrollType t1, Cil.unrollType t2 with + | TVoid _, TVoid _ -> true + | TInt (i1, _), TInt (i2, _) -> i1 = i2 + | TFloat (f1, _), TFloat (f2, _) -> f1 = f2 + | TPtr (t1, _), TPtr (t2, _) -> equal_type_no_attribute t1 t2 + | TArray (t1', s1, _, _), TArray (t2', s2, _, _) -> + equal_type_no_attribute t1' t2' && + (s1 == s2 || try Int.equal (Cil.lenOfArray64 s1) (Cil.lenOfArray64 s2) + with Cil.LenOfArray -> false) + | TFun (r1, a1, v1, _), TFun (r2, a2, v2, _) -> + v1 = v2 && equal_type_no_attribute r1 r2 && + (match a1, a2 with + | None, _ | _, None -> true + | Some l1, Some l2 -> + try + List.for_all2 + (fun (_, t1, _) (_, t2, _) -> equal_type_no_attribute t1 t2) l1 l2 + with Invalid_argument _ -> false) + | TNamed _, TNamed _ -> assert false + | TComp (c1, _, _), TComp (c2, _, _) -> c1.ckey = c2.ckey + | TEnum (e1, _), TEnum (e2, _) -> e1.ename = e2.ename + | TBuiltin_va_list _, TBuiltin_va_list _ -> true + | (TVoid _ | TInt _ | TFloat _ | TPtr _ | TArray _ | TFun _ | TNamed _ | + TComp _ | TEnum _ | TBuiltin_va_list _), _ -> + false + +(* We have found a possible matching offset of type [typ] for [om], do we stop + here? *) +let offset_matches om typ = + match om with + | MatchFirst -> true + | MatchSize size -> Int.equal size (Int.of_int (Cil.bitsSizeOf typ)) + | MatchType typ' -> equal_type_no_attribute typ typ' + +(* Can we match [om] inside a cell of an array whose elements have size + [size_elt] *) +let offset_match_cell om size_elt = + match om with + | MatchFirst -> true + | MatchSize size -> Int.le size size_elt + | MatchType typ' -> Int.le (Int.of_int (Cil.bitsSizeOf typ')) size_elt + +let rec find_offset typ ~offset om = + (* Format.printf "Searching offset %a in %a, size %a@." + Int.pretty offset Printer.pp_typ typ Int.pretty size; *) + let loc = Cil_datatype.Location.unknown in + if Int.is_zero offset && offset_matches om typ then + NoOffset, typ + else + match Cil.unrollType typ with + | TArray (typ_elt, _, _, _) -> + let size_elt = Int.of_int (Cil.bitsSizeOf typ_elt) in + let start = Integer.pos_div offset size_elt in + let exp_start = Cil.kinteger64 ~loc start in + let rem = Integer.pos_rem offset size_elt in + if offset_match_cell om size_elt then + (* [size] covers at most one cell; we continue in the relevant one *) + let off, typ = find_offset typ_elt rem om in + Index (exp_start, off), typ + else begin + match om with + | MatchFirst | MatchType _ -> raise NoMatchingOffset + | MatchSize size -> + if Int.is_zero rem && Int.is_zero (Int.rem size size_elt) then + (* We cover more than one cell, but we are aligned. *) + let nb = Int.div size size_elt in + let exp_nb = Cil.kinteger64 ~loc nb in + let typ = + TArray (typ_elt, Some exp_nb, Cil.empty_size_cache (),[]) + in + Index (exp_start, NoOffset), typ + else (* We match different parts of multiple cells: too imprecise. *) + raise NoMatchingOffset + end + + | TComp (ci, _, _) -> + let rec find_field = function + | [] -> raise NoMatchingOffset + | fi :: q -> + try + let off_fi, len_fi = Cil.bitsOffset typ (Field (fi, NoOffset)) in + let off_fi, len_fi = Int.of_int off_fi, Int.of_int len_fi in + if Integer.(ge offset (add off_fi len_fi)) then + (* [offset] is not in the interval occupied by [fi]. Try the next + one (including for union: maybe the next fields are larger). *) + find_field q + else + let off, typ = + find_offset fi.ftype (Int.sub offset off_fi) om + in + Field (fi, off), typ + with NoMatchingOffset when not ci.cstruct -> + (* Mismatch between [offset] and the structure of [fi.ftype]. In the + union case, we try the other fields. In the struct case, the + other fields are too far and we abort. *) + find_field q + in + find_field ci.cfields + + | _ -> raise NoMatchingOffset + +let find_offset typ ~offset om = + try + find_offset typ ~offset om + with Cil.SizeOfError _ | Cil.Not_representable -> raise NoMatchingOffset (* -Local Variables: -compile-command: "make -C ../.." -End: -*) + Local Variables: + compile-command: "make -C ../.." + End: + *) diff -Nru frama-c-20140301+neon+dfsg/src/misc/bit_utils.mli frama-c-20150201+sodium+dfsg/src/misc/bit_utils.mli --- frama-c-20140301+neon+dfsg/src/misc/bit_utils.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/misc/bit_utils.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -85,8 +85,27 @@ (** Pretty prints a range of bits in a type for the user. Tries to find field names and array indexes, whenever possible. *) -val pretty_offset: - typ -> Integer.t -> Format.formatter -> unit + +(** {2 Mapping from numeric offsets to symbolic ones.} *) + +(** We want to find a symbolic offset that corresponds to a numeric one, with + one additional criterion: *) +type offset_match = +| MatchType of typ (** Offset that has this type (modulo attributes) *) +| MatchSize of Integer.t (** Offset that has a type of this size *) +| MatchFirst (** Return first symbolic offset that matches *) + +exception NoMatchingOffset + +(** [find_offset typ ~offset ~size] finds a subtype [t] of [typ] that describes + the type of the bits [offset..offset+size-1] in [typ]. May return a subtype + of [typ], or a type that is a sub-array of an array type in [typ]. + Also returns a {!Cil_types.offset} [off] that corresponds to [offset]. + (But we do not have the guarantee that [typeof(off) == typ], because of + sub-arrays.) + @raise NoMatchingOffset when no offset matches. *) +val find_offset: + typ -> offset:Integer.t -> offset_match -> Cil_types.offset * Cil_types.typ (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/misc/filter.ml frama-c-20150201+sodium+dfsg/src/misc/filter.ml --- frama-c-20140301+neon+dfsg/src/misc/filter.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/misc/filter.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -68,7 +68,7 @@ module F (Info : RemoveInfo) : sig - val build_cil_file : string -> Info.proj -> Project.t + val build_cil_file: ?last:bool -> string -> Info.proj -> Project.t end = struct @@ -179,7 +179,7 @@ let _ = change loc s in () | Continue loc when cont && Info.inst_visible finfo s -> let _ = change loc s in () - | Instr _ | Return _ | Break _ | Continue _ | Goto _ -> () + | Instr _ | Return _ | Break _ | Continue _ | Goto _ | Throw _ -> () | If (_, bthen, belse, _) -> List.iter (rm_aux cont break) bthen.bstmts; List.iter (rm_aux cont break) belse.bstmts; @@ -194,7 +194,7 @@ (* if change [continue] do it, but stop changing [break] *) if cont then let break = false in List.iter (rm_aux cont break) blk.bstmts - | TryFinally _ | TryExcept _ -> (* TODO ? *) () + | TryFinally _ | TryExcept _ | TryCatch _ -> (* TODO ? *) () in List.iter (rm_aux cont break) blk.bstmts (** filter [params] according to [ff] input visibility. @@ -889,10 +889,10 @@ | _ -> Cil.DoChildren end - let build_cil_file new_proj_name pinfo = + let build_cil_file ?last new_proj_name pinfo = debug1 "[build_cil_file] in %s@." new_proj_name; let visitor = new filter_visitor pinfo in - let prj = FC_file.create_project_from_visitor new_proj_name visitor in + let prj = FC_file.create_project_from_visitor ?last new_proj_name visitor in debug1 "[build_cil_file] done.@."; prj diff -Nru frama-c-20140301+neon+dfsg/src/misc/filter.mli frama-c-20150201+sodium+dfsg/src/misc/filter.mli --- frama-c-20140301+neon+dfsg/src/misc/filter.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/misc/filter.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -132,7 +132,7 @@ *) module F (Info : RemoveInfo) : sig - val build_cil_file : string -> Info.proj -> Project.t + val build_cil_file : ?last:bool -> string -> Info.proj -> Project.t end diff -Nru frama-c-20140301+neon+dfsg/src/misc/service_graph.ml frama-c-20150201+sodium+dfsg/src/misc/service_graph.ml --- frama-c-20140301+neon+dfsg/src/misc/service_graph.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/misc/service_graph.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -289,7 +289,7 @@ color e else match CallG.E.label e with - | Inter_services -> [ `Style [`Invis] ] + | Inter_services -> [ `Style `Invis ] | Inter_functions | Both -> color e let default_edge_attributes _ = [] @@ -303,7 +303,7 @@ sg_attributes = [ `Label ("S " ^ cs); `Color (Extlib.number_to_color id); - `Style [`Bold] ] } + `Style `Bold ] } end diff -Nru frama-c-20140301+neon+dfsg/src/misc/service_graph.mli frama-c-20150201+sodium+dfsg/src/misc/service_graph.mli --- frama-c-20140301+neon+dfsg/src/misc/service_graph.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/misc/service_graph.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/obfuscator/configure frama-c-20150201+sodium+dfsg/src/obfuscator/configure --- frama-c-20140301+neon+dfsg/src/obfuscator/configure 2014-03-12 15:07:56.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/obfuscator/configure 2015-06-01 13:17:43.000000000 +0000 @@ -1794,6 +1794,13 @@ + +# Usage: plugin_disable([plugin],[reason]) + + + + + # Implementation of an ordering $1 < $2: "" < yes < partial < no lt_mark () { first=`echo "$1" | sed -e 's/ .*//' ` diff -Nru frama-c-20140301+neon+dfsg/src/obfuscator/configure.ac frama-c-20150201+sodium+dfsg/src/obfuscator/configure.ac --- frama-c-20140301+neon+dfsg/src/obfuscator/configure.ac 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/obfuscator/configure.ac 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # diff -Nru frama-c-20140301+neon+dfsg/src/obfuscator/dictionary.ml frama-c-20150201+sodium+dfsg/src/obfuscator/dictionary.ml --- frama-c-20140301+neon+dfsg/src/obfuscator/dictionary.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/obfuscator/dictionary.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/obfuscator/dictionary.mli frama-c-20150201+sodium+dfsg/src/obfuscator/dictionary.mli --- frama-c-20140301+neon+dfsg/src/obfuscator/dictionary.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/obfuscator/dictionary.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/obfuscator/Makefile.in frama-c-20150201+sodium+dfsg/src/obfuscator/Makefile.in --- frama-c-20140301+neon+dfsg/src/obfuscator/Makefile.in 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/obfuscator/Makefile.in 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # @@ -54,4 +54,4 @@ $(Obfuscator_DIR)/Makefile: $(Obfuscator_DIR)/Makefile.in \ $(CONFIG_STATUS_DIR)/config.status - cd $(CONFIG_STATUS_DIR) && ./config.status + cd $(CONFIG_STATUS_DIR) && ./config.status --file $@ diff -Nru frama-c-20140301+neon+dfsg/src/obfuscator/obfuscate.ml frama-c-20150201+sodium+dfsg/src/obfuscator/obfuscate.ml --- frama-c-20140301+neon+dfsg/src/obfuscator/obfuscate.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/obfuscator/obfuscate.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/obfuscator/obfuscate.mli frama-c-20150201+sodium+dfsg/src/obfuscator/obfuscate.mli --- frama-c-20140301+neon+dfsg/src/obfuscator/obfuscate.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/obfuscator/obfuscate.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/obfuscator/obfuscator_kind.ml frama-c-20150201+sodium+dfsg/src/obfuscator/obfuscator_kind.ml --- frama-c-20140301+neon+dfsg/src/obfuscator/obfuscator_kind.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/obfuscator/obfuscator_kind.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/obfuscator/obfuscator_kind.mli frama-c-20150201+sodium+dfsg/src/obfuscator/obfuscator_kind.mli --- frama-c-20140301+neon+dfsg/src/obfuscator/obfuscator_kind.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/obfuscator/obfuscator_kind.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/obfuscator/Obfuscator.mli frama-c-20150201+sodium+dfsg/src/obfuscator/Obfuscator.mli --- frama-c-20140301+neon+dfsg/src/obfuscator/Obfuscator.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/obfuscator/Obfuscator.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/obfuscator/obfuscator_register.ml frama-c-20150201+sodium+dfsg/src/obfuscator/obfuscator_register.ml --- frama-c-20140301+neon+dfsg/src/obfuscator/obfuscator_register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/obfuscator/obfuscator_register.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/obfuscator/options.ml frama-c-20150201+sodium+dfsg/src/obfuscator/options.ml --- frama-c-20140301+neon+dfsg/src/obfuscator/options.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/obfuscator/options.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -36,7 +36,7 @@ end) module Dictionary = - EmptyString + Empty_string (struct let option_name = "-obfuscator-dictionary" let arg_name = "f" @@ -44,7 +44,7 @@ end) module Literal_string = - EmptyString + Empty_string (struct let option_name = "-obfuscator-string-dictionary" let arg_name = "f" diff -Nru frama-c-20140301+neon+dfsg/src/obfuscator/options.mli frama-c-20150201+sodium+dfsg/src/obfuscator/options.mli --- frama-c-20140301+neon+dfsg/src/obfuscator/options.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/obfuscator/options.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/occurrence/Occurrence.mli frama-c-20150201+sodium+dfsg/src/occurrence/Occurrence.mli --- frama-c-20140301+neon+dfsg/src/occurrence/Occurrence.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/occurrence/Occurrence.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/occurrence/options.ml frama-c-20150201+sodium+dfsg/src/occurrence/options.ml --- frama-c-20140301+neon+dfsg/src/occurrence/options.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/occurrence/options.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/occurrence/options.mli frama-c-20150201+sodium+dfsg/src/occurrence/options.mli --- frama-c-20140301+neon+dfsg/src/occurrence/options.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/occurrence/options.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/occurrence/register_gui.ml frama-c-20150201+sodium+dfsg/src/occurrence/register_gui.ml --- frama-c-20140301+neon+dfsg/src/occurrence/register_gui.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/occurrence/register_gui.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -114,7 +114,7 @@ in match loc with | PLval (_, ki, lval) -> - let same_lval (_kf, k, l) = + let same_lval (_kf, k, l) = Kinstr.equal k ki && Lval.equal l lval in if List.exists same_lval result then highlight () @@ -128,7 +128,7 @@ if List.exists same_tlval result then highlight () | PVDecl(_, vi') when Varinfo.equal vi vi' -> highlight () - | PVDecl _ | PStmt _ | PGlobal _ | PIP _ -> () + | PExp _ | PVDecl _ | PStmt _ | PGlobal _ | PIP _ -> () module FollowFocus = State_builder.Ref diff -Nru frama-c-20140301+neon+dfsg/src/occurrence/register_gui.mli frama-c-20150201+sodium+dfsg/src/occurrence/register_gui.mli --- frama-c-20140301+neon+dfsg/src/occurrence/register_gui.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/occurrence/register_gui.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/occurrence/register.ml frama-c-20150201+sodium+dfsg/src/occurrence/register.ml --- frama-c-20140301+neon+dfsg/src/occurrence/register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/occurrence/register.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/pdg/annot.ml frama-c-20150201+sodium+dfsg/src/pdg/annot.ml --- frama-c-20140301+neon+dfsg/src/pdg/annot.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg/annot.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/pdg/annot.mli frama-c-20150201+sodium+dfsg/src/pdg/annot.mli --- frama-c-20140301+neon+dfsg/src/pdg/annot.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg/annot.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/pdg/build.ml frama-c-20150201+sodium+dfsg/src/pdg/build.ml --- frama-c-20140301+neon+dfsg/src/pdg/build.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg/build.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -63,7 +63,6 @@ (* --- Auxiliary functions --- *) (* -------------------------------------------------------------------------- *) - type arg_nodes = Node.t list (** type of the whole PDG representation during its building process *) @@ -250,9 +249,10 @@ let new_node = add_elem pdg (Key.param_key n) in add_decl_dpd pdg new_node Dpd.Addr decl_node ; add_decl_dpd pdg decl_node Dpd.Addr new_node ; + let z = Locations.zone_of_varinfo v in let new_state = Pdg_state.add_loc_node - state ~exact:true (Locations.zone_of_varinfo v) new_node in + state ~initializing:true ~exact:true z new_node in (n+1, new_state) in let _next_in_num, new_state = @@ -282,8 +282,8 @@ let process_param state param arg = let new_node = arg in add_ctrl_dpd pdg new_node ctrl_node; - Pdg_state.add_loc_node - state (Locations.zone_of_varinfo param) new_node ~exact:true + let z = Locations.zone_of_varinfo param in + Pdg_state.add_loc_node ~initializing:true state z new_node ~exact:true in let rec do_param_arg state param_list (arg_nodes: arg_nodes) = match param_list, arg_nodes with @@ -321,17 +321,13 @@ add_dpds pdg new_node Dpd.Data state_before deps; state - let process_call_ouput pdg state_before_call state stmt numout out default from_out fct_dpds = - let exact = - (* TODO : Check this with Pascal ! - * (Locations.Zone.cardinal_zero_or_one out) && *) - (not default) in - debug "call-%d Out%d : %a From %a (%sexact)@." - stmt.sid numout + let process_call_output pdg state_before_call state stmt out default from_out fct_dpds = + let exact = (not default) in + debug "call-%d Out : %a From %a (%sexact)@." + stmt.sid Locations.Zone.pretty out Locations.Zone.pretty from_out (if exact then "" else "not "); - - let key = Key.call_output_key stmt (* numout *) out in + let key = Key.call_output_key stmt out in let new_node = create_call_output_node pdg state_before_call stmt key from_out fct_dpds in let state = Pdg_state.add_loc_node state exact out new_node @@ -566,9 +562,14 @@ | Some froms -> (* undefined function : add output 0 *) (* TODO : also add the nodes for the other from ! *) let state = match last_state with Some s -> s | None -> assert false in - let process_out out (default, deps) s = - let from_out = Function_Froms.Deps.to_zone deps in - add_from pdg state s out (default, from_out) + let process_out out deps s = + let open Function_Froms.DepsOrUnassigned in + if (equal Unassigned deps) + then s + else + let from_out = to_zone deps in + let default = may_be_unassigned deps in + add_from pdg state s out (default, from_out) in let from_table = froms.Function_Froms.deps_table in let new_state = @@ -576,17 +577,17 @@ Pdg_state.bottom else let new_state = - try Function_Froms.Memory.fold_fuse_same - process_out from_table state - with Function_Froms.Memory.Cannot_fold -> (* TOP in from_table *) + match from_table with + | Function_Froms.Memory.Top -> process_out - Locations.Zone.top - (false, Function_Froms.Deps.top) - state + Locations.Zone.top Function_Froms.DepsOrUnassigned.top state + | Function_Froms.Memory.Map m -> + Function_Froms.Memory.fold_fuse_same process_out m state + | Function_Froms.Memory.Bottom -> assert false (* checked above *) in if not (Kernel_function.returns_void pdg.fct) then begin let from0 = froms.Function_Froms.deps_return in - let deps_ret = Function_Froms.Memory.LOffset.collapse from0 in + let deps_ret = Function_Froms.Memory.collapse_return from0 in let deps_ret = Function_Froms.Deps.to_zone deps_ret in ignore (create_fun_output_node pdg (Some new_state) deps_ret) @@ -654,32 +655,37 @@ Function_Froms.Memory.pretty from_table; if not (lvaloption = None) then Format.fprintf fmt "\t and \\result %a@." - Function_Froms.Memory.LOffset.pretty froms_deps_return + Function_Froms.Deps.pretty froms_deps_return in debug "%t" print_outputs; - let process_out out (default, deps) (state, numout) = - let from_out = Function_Froms.Deps.to_zone deps in - let new_state = - process_call_ouput pdg state_with_inputs state stmt - numout out default from_out fct_dpds in - (new_state, numout+1) + + let process_out out deps state = + if Function_Froms.DepsOrUnassigned.(equal Unassigned deps) then + state + else + let from_out = Function_Froms.DepsOrUnassigned.to_zone deps in + let default = Function_Froms.DepsOrUnassigned.may_be_unassigned deps in + process_call_output + pdg state_with_inputs state stmt out default from_out fct_dpds in if Function_Froms.Memory.is_bottom from_table then Pdg_state.bottom else - let (state_with_outputs, _num) = - try - Function_Froms.Memory.fold_fuse_same process_out from_table (state_before_call, 1) - with Function_Froms.Memory.Cannot_fold -> (* TOP in from_table *) - process_out Locations.Zone.top (false, Function_Froms.Deps.top) - (state_before_call, 1) + let state_with_outputs = + let open Function_Froms in + match from_table with + | Memory.Top -> + process_out + Locations.Zone.top DepsOrUnassigned.top state_before_call + | Memory.Bottom -> assert false (* checked above *) + | Memory.Map m -> + Memory.fold_fuse_same process_out m state_before_call in - let new_state = match lvaloption with | None -> state_with_outputs | Some lval -> let r_dpds = - Function_Froms.Memory.LOffset.collapse froms_deps_return + Function_Froms.Memory.collapse_return froms_deps_return in let r_dpds = Function_Froms.Deps.to_zone r_dpds in let (l_loc, exact, l_dpds, l_decl) = get_lval_infos lval stmt in @@ -689,7 +695,6 @@ state_with_inputs stmt ~l_loc ~exact ~l_dpds ~l_decl ~r_dpds fct_dpds - in new_state (** process call : {v lvaloption = funcexp (argl); v} Use the state at ki (before the call) @@ -914,7 +919,8 @@ | Loop _ -> process_loop_stmt current_pdg ctrl_dpds_infos stmt; map_on_all_succs state - + | Throw _ | TryCatch _ -> + Pdg_parameters.fatal "Exception node in the AST" | TryExcept (_, _, _, _) | TryFinally (_, _, _) -> map_on_all_succs state diff -Nru frama-c-20140301+neon+dfsg/src/pdg/build.mli frama-c-20150201+sodium+dfsg/src/pdg/build.mli --- frama-c-20140301+neon+dfsg/src/pdg/build.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg/build.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/pdg/ctrlDpds.ml frama-c-20150201+sodium+dfsg/src/pdg/ctrlDpds.ml --- frama-c-20140301+neon+dfsg/src/pdg/ctrlDpds.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg/ctrlDpds.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -112,9 +112,9 @@ let _ = add_links graph last_list stmt in stmt::[] in prev_list - + | TryCatch _ -> Pdg_parameters.fatal "Try/Catch node in the AST" | Instr _ - | Return _ | Goto _ | Break _ | Continue _ + | Return _ | Goto _ | Break _ | Continue _ | Throw _ | TryFinally _ | TryExcept _ -> let _ = add_links graph prev_list stmt in [stmt] diff -Nru frama-c-20140301+neon+dfsg/src/pdg/ctrlDpds.mli frama-c-20150201+sodium+dfsg/src/pdg/ctrlDpds.mli --- frama-c-20140301+neon+dfsg/src/pdg/ctrlDpds.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg/ctrlDpds.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/pdg/marks.ml frama-c-20150201+sodium+dfsg/src/pdg/marks.ml --- frama-c-20140301+neon+dfsg/src/pdg/marks.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg/marks.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/pdg/marks.mli frama-c-20150201+sodium+dfsg/src/pdg/marks.mli --- frama-c-20140301+neon+dfsg/src/pdg/marks.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg/marks.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/pdg/Pdg.mli frama-c-20150201+sodium+dfsg/src/pdg/Pdg.mli --- frama-c-20140301+neon+dfsg/src/pdg/Pdg.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg/Pdg.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/pdg/pdg_parameters.ml frama-c-20150201+sodium+dfsg/src/pdg/pdg_parameters.ml --- frama-c-20140301+neon+dfsg/src/pdg/pdg_parameters.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg/pdg_parameters.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -39,7 +39,7 @@ end) module BuildFct = - StringSet + Kernel_function_set (struct let option_name = "-fct-pdg" let arg_name = "" @@ -55,9 +55,15 @@ let () = Parameter_customize.set_group output module DotBasename = - EmptyString + Empty_string (struct let option_name = "-pdg-dot" let arg_name = "basename" let help = "put the PDG of function in basename.f.dot" end) + +(* +Local Variables: +compile-command: "make -C ../.." +End: +*) diff -Nru frama-c-20140301+neon+dfsg/src/pdg/pdg_parameters.mli frama-c-20150201+sodium+dfsg/src/pdg/pdg_parameters.mli --- frama-c-20140301+neon+dfsg/src/pdg/pdg_parameters.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg/pdg_parameters.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -24,8 +24,14 @@ module BuildAll: Parameter_sig.With_output -module BuildFct: Parameter_sig.String_set +module BuildFct: Parameter_sig.Kernel_function_set module PrintBw: Parameter_sig.Bool module DotBasename: Parameter_sig.String + +(* +Local Variables: +compile-command: "make -C ../.." +End: +*) diff -Nru frama-c-20140301+neon+dfsg/src/pdg/pdg_state.ml frama-c-20150201+sodium+dfsg/src/pdg/pdg_state.ml --- frama-c-20140301+neon+dfsg/src/pdg/pdg_state.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg/pdg_state.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -47,7 +47,7 @@ LocInfo.pretty state.loc_info Locations.Zone.pretty state.under_outputs -let add_loc_node state ~exact loc node = +let add_loc_node state ?(initializing=false) ~exact loc node = P.debug ~dkey ~level:2 "add_loc_node (%s) : node %a -> %a@." (if exact then "exact" else "merge") PdgTypes.Node.pretty node @@ -58,7 +58,9 @@ state else let new_info = NodeSetLattice.inject_singleton node in - let new_loc_info = LocInfo.add_binding exact state.loc_info loc new_info in + let reducing = initializing in + let new_loc_info = + LocInfo.add_binding ~exact ~reducing state.loc_info loc new_info in let new_outputs = (* Zone.link in the under-approx version of Zone.join *) if exact then Locations.Zone.link state.under_outputs loc else state.under_outputs @@ -77,7 +79,8 @@ | _ -> let new_info = NodeSetLattice.inject_singleton node in let new_loc_info = - LocInfo.add_binding false state.loc_info loc new_info + LocInfo.add_binding + ~reducing:true ~exact:false state.loc_info loc new_info in let new_outputs = Locations.Zone.link state.under_outputs loc in make new_loc_info new_outputs @@ -105,7 +108,7 @@ * @raise Cannot_fold if the state is top (TODO : something better ?) * *) let get_loc_nodes_and_part state loc = - let process z (_default, nodes) acc = + let process z nodes acc = if Locations.Zone.intersects z loc then let z = if Locations.Zone.equal loc z @@ -126,8 +129,10 @@ else acc in - try LocInfo.fold process state.loc_info [] - with LocInfo.Cannot_fold -> raise Cannot_fold + match state.loc_info with + | LocInfo.Top -> raise Cannot_fold + | LocInfo.Bottom -> [] + | LocInfo.Map m -> LocInfo.fold process m [] (** @raise Cannot_fold (see [get_loc_nodes_and_part]) *) let get_loc_nodes state loc = diff -Nru frama-c-20140301+neon+dfsg/src/pdg/pdg_state.mli frama-c-20150201+sodium+dfsg/src/pdg/pdg_state.mli --- frama-c-20140301+neon+dfsg/src/pdg/pdg_state.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg/pdg_state.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -30,7 +30,7 @@ val bottom: data_state val add_loc_node : - data_state -> exact:bool -> Locations.Zone.t -> Node.t -> data_state + data_state -> ?initializing:bool -> exact:bool -> Locations.Zone.t -> Node.t -> data_state val add_init_state_input : data_state -> Locations.Zone.t -> Node.t -> data_state diff -Nru frama-c-20140301+neon+dfsg/src/pdg/register.ml frama-c-20150201+sodium+dfsg/src/pdg/register.ml --- frama-c-20140301+neon+dfsg/src/pdg/register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg/register.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -124,17 +124,16 @@ let compute () = let all = Pdg_parameters.BuildAll.get () in let do_kf_pdg kf = - let fname = Kernel_function.get_name kf in - if all || Datatype.String.Set.mem fname (Pdg_parameters.BuildFct.get ()) - then + if all || Kernel_function.Set.mem kf (Pdg_parameters.BuildFct.get ()) then let pdg = !Db.Pdg.get kf in let dot_basename = Pdg_parameters.DotBasename.get () in if dot_basename <> "" then + let fname = Kernel_function.get_name kf in !Db.Pdg.extract pdg (dot_basename ^ "." ^ fname ^ ".dot") in !Db.Semantic_Callgraph.topologically_iter_on_functions do_kf_pdg; - Pdg_parameters.debug "Logging keys : %s" - (Pdg_parameters.Debug_category.get_set()) ; + Pdg_parameters.debug "Logging keys : %s" + (Pdg_parameters.Debug_category.As_string.get ()); if Pdg_parameters.BuildAll.get () then Pdg_parameters.feedback "====== PDG GRAPH COMPUTED ======" @@ -145,20 +144,19 @@ let bw = Pdg_parameters.PrintBw.get () in let all = Pdg_parameters.BuildAll.get () in let do_kf_pdg kf = - let fname = Kernel_function.get_name kf in - if all || Datatype.String.Set.mem fname (Pdg_parameters.BuildFct.get ()) - then + if all || Kernel_function.Set.mem kf (Pdg_parameters.BuildFct.get ()) then let pdg = !Db.Pdg.get kf in let header fmt = Format.fprintf fmt "PDG for %a" Kernel_function.pretty kf in - Pdg_parameters.printf ~header "@[ @[%a@]@]" (PdgTypes.Pdg.pretty_bw ~bw) pdg + Pdg_parameters.printf ~header "@[ @[%a@]@]" + (PdgTypes.Pdg.pretty_bw ~bw) pdg in !Db.Semantic_Callgraph.topologically_iter_on_functions do_kf_pdg let something_to_do () = Pdg_parameters.BuildAll.get () - || not (Datatype.String.Set.is_empty (Pdg_parameters.BuildFct.get ())) + || not (Kernel_function.Set.is_empty (Pdg_parameters.BuildFct.get ())) let main () = if something_to_do () then diff -Nru frama-c-20140301+neon+dfsg/src/pdg/sets.ml frama-c-20150201+sodium+dfsg/src/pdg/sets.ml --- frama-c-20140301+neon+dfsg/src/pdg/sets.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg/sets.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/pdg/sets.mli frama-c-20150201+sodium+dfsg/src/pdg/sets.mli --- frama-c-20140301+neon+dfsg/src/pdg/sets.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg/sets.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/pdg_types/pdgIndex.ml frama-c-20150201+sodium+dfsg/src/pdg_types/pdgIndex.ml --- frama-c-20140301+neon+dfsg/src/pdg_types/pdgIndex.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg_types/pdgIndex.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -253,6 +253,8 @@ in fold_all_outputs (fun acc (n, info) -> f acc (Out n, info)) acc sgn + let iter f sgn = fold (fun () v -> f v) () sgn + let merge sgn1 sgn2 merge_info = let merge_elem lst (k, info) = add_in_list lst k info merge_info in let inputs = fold_num_inputs merge_elem sgn1.in_params sgn2 in @@ -288,10 +290,10 @@ | Out key -> pretty_out_key fmt key let pretty pp fmt sgn = - let print _ (k,i) = - Format.fprintf fmt "@[(%a:@ %a)@]" pretty_key k pp i - in - fold print () sgn + Pretty_utils.pp_iter ~pre:"@[" ~suf:"@]" ~sep:"@," iter + (fun fmt (k,i) -> + Format.fprintf fmt "@[(%a:@ %a)@]" pretty_key k pp i) + fmt sgn end @@ -346,19 +348,18 @@ (* see PrintPdg.pretty_key : can't be here because it uses Db... *) let pretty_node fmt k = let print_stmt fmt s = - let str = - match s.skind with - | Switch (exp,_,_,_) | If (exp,_,_,_) -> - Pretty_utils.to_string Printer.pp_exp exp - | Loop _ -> "while(1)" - | Block _ -> "block" - | Goto _ | Break _ | Continue _ | Return _ | Instr _ -> - Pretty_utils.sfprintf "@[%a@]" - (Printer.without_annot Printer.pp_stmt) s - | UnspecifiedSequence _ -> "unspecified sequence" - | TryExcept _ | TryFinally _ -> "ERROR" - in - Format.fprintf fmt "%s" str + match s.skind with + | Switch (exp,_,_,_) | If (exp,_,_,_) -> + Printer.pp_exp fmt exp + | Loop _ -> Format.pp_print_string fmt "while(1)" + | Block _ -> Format.pp_print_string fmt "block" + | Goto _ | Break _ | Continue _ | Return _ | Instr _ | Throw _ -> + Format.fprintf fmt "@[%a@]" + (Printer.without_annot Printer.pp_stmt) s + | UnspecifiedSequence _ -> + Format.pp_print_string fmt "unspecified sequence" + | TryExcept _ | TryFinally _ | TryCatch _ -> + Format.pp_print_string fmt "ERROR" in match k with | CallStmt call -> diff -Nru frama-c-20140301+neon+dfsg/src/pdg_types/pdgIndex.mli frama-c-20150201+sodium+dfsg/src/pdg_types/pdgIndex.mli --- frama-c-20140301+neon+dfsg/src/pdg_types/pdgIndex.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg_types/pdgIndex.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/pdg_types/pdgMarks.ml frama-c-20150201+sodium+dfsg/src/pdg_types/pdgMarks.ml --- frama-c-20140301+neon+dfsg/src/pdg_types/pdgMarks.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg_types/pdgMarks.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/pdg_types/pdgMarks.mli frama-c-20150201+sodium+dfsg/src/pdg_types/pdgMarks.mli --- frama-c-20140301+neon+dfsg/src/pdg_types/pdgMarks.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg_types/pdgMarks.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/pdg_types/pdgTypes.ml frama-c-20150201+sodium+dfsg/src/pdg_types/pdgTypes.ml --- frama-c-20140301+neon+dfsg/src/pdg_types/pdgTypes.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg_types/pdgTypes.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -109,8 +109,7 @@ (** set of nodes of the graph *) module NodeSetLattice = struct include Abstract_interp.Make_Lattice_Set(Node) - let default _v _a _b : t = empty - let defaultall _v : t = empty + let default : t = empty end module LocInfo = Lmap_bitwise.Make_bitwise (NodeSetLattice) @@ -222,11 +221,14 @@ val dpd_zone : t -> Locations.Zone.t option val pretty : Format.formatter -> t -> unit + val pretty_debug: Format.formatter -> t -> unit end = struct include Datatype.Pair(Dpd)(Datatype.Option(Locations.Zone)) (* None == Locations.Zone.Top *) + let pretty_debug = pretty + let dpd_kind dpd = fst dpd let dpd_zone dpd = snd dpd let kind_and_zone dpd = dpd @@ -626,7 +628,7 @@ let graph_attributes _ = [`Rankdir `TopToBottom ] - let default_vertex_attributes _ = [`Style [`Filled]] + let default_vertex_attributes _ = [`Style `Filled] let vertex_name v = string_of_int (Node.id v) let vertex_attributes v = @@ -711,13 +713,13 @@ if Dpd.is_ctrl d then (`Arrowtail `Odot)::attrib else attrib in let attrib = - if Dpd.is_addr d then (`Style [`Dotted])::attrib else attrib + if Dpd.is_addr d then (`Style `Dotted)::attrib else attrib in attrib let get_subgraph v = let mk_subgraph name attrib = - let attrib = (`Style [`Filled]) :: attrib in + let attrib = (`Style `Filled) :: attrib in Some { Graph.Graphviz.DotAttributes.sg_name= name; sg_parent = None; sg_attributes = attrib } diff -Nru frama-c-20140301+neon+dfsg/src/pdg_types/pdgTypes.mli frama-c-20150201+sodium+dfsg/src/pdg_types/pdgTypes.mli --- frama-c-20140301+neon+dfsg/src/pdg_types/pdgTypes.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/pdg_types/pdgTypes.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -103,12 +103,11 @@ module NodeSetLattice : sig include Lattice_type.Lattice_Set with type O.elt=Node.t - val default : Base.t -> Abstract_interp.Int.t -> Abstract_interp.Int.t -> t - val defaultall : Base.t -> t + val default: t end module LocInfo : - Lmap_bitwise.Location_map_bitwise with type y = NodeSetLattice.t + Lmap_bitwise.Location_map_bitwise with type v = NodeSetLattice.t (** a [data_state] object is associated with a program point and provides a mapping between a location and some nodes in the PDG diff -Nru frama-c-20140301+neon+dfsg/src/postdominators/compute.ml frama-c-20150201+sodium+dfsg/src/postdominators/compute.ml --- frama-c-20140301+neon+dfsg/src/postdominators/compute.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/postdominators/compute.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/postdominators/Postdominators.mli frama-c-20150201+sodium+dfsg/src/postdominators/Postdominators.mli --- frama-c-20140301+neon+dfsg/src/postdominators/Postdominators.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/postdominators/Postdominators.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/postdominators/postdominators_parameters.ml frama-c-20150201+sodium+dfsg/src/postdominators/postdominators_parameters.ml --- frama-c-20140301+neon+dfsg/src/postdominators/postdominators_parameters.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/postdominators/postdominators_parameters.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -28,7 +28,7 @@ end) module DotPostdomBasename = - EmptyString + Empty_string (struct let option_name = "-dot-postdom" let arg_name = "f" diff -Nru frama-c-20140301+neon+dfsg/src/postdominators/postdominators_parameters.mli frama-c-20150201+sodium+dfsg/src/postdominators/postdominators_parameters.mli --- frama-c-20140301+neon+dfsg/src/postdominators/postdominators_parameters.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/postdominators/postdominators_parameters.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/postdominators/print.ml frama-c-20150201+sodium+dfsg/src/postdominators/print.ml --- frama-c-20140301+neon+dfsg/src/postdominators/print.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/postdominators/print.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -63,7 +63,7 @@ let graph_attributes (title, _) = [`Label title] - let default_vertex_attributes _g = [`Style [`Filled]] + let default_vertex_attributes _g = [`Style `Filled] let default_edge_attributes _g = [] let vertex_attributes (s, has_postdom) = diff -Nru frama-c-20140301+neon+dfsg/src/printer/cil_descriptive_printer.ml frama-c-20150201+sodium+dfsg/src/printer/cil_descriptive_printer.ml --- frama-c-20140301+neon+dfsg/src/printer/cil_descriptive_printer.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/printer/cil_descriptive_printer.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/printer/cil_descriptive_printer.mli frama-c-20150201+sodium+dfsg/src/printer/cil_descriptive_printer.mli --- frama-c-20140301+neon+dfsg/src/printer/cil_descriptive_printer.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/printer/cil_descriptive_printer.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/printer/cil_printer.ml frama-c-20150201+sodium+dfsg/src/printer/cil_printer.ml --- frama-c-20140301+neon+dfsg/src/printer/cil_printer.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/printer/cil_printer.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -31,19 +31,22 @@ let debug_unspecified = Kernel.register_category "printer:unspecified" module Behavior_extensions = struct + let printer_tbl = Hashtbl.create 5 + let register name printer = Hashtbl.add printer_tbl name printer + + let default_pp printer fmt (_,preds) = + Pretty_utils.pp_list ~sep:",@ " printer#identified_predicate fmt preds + let pp (printer:extensible_printer_type) fmt (name, code, preds) = - try - let pp = Hashtbl.find printer_tbl name in - Format.fprintf fmt "@[%s %a;@]" name (pp printer) (code, preds) - with Not_found -> - (* default pretty-printer *) - Format.fprintf fmt "@[%s %a;@]" - name - (Pretty_utils.pp_list ~sep:",@ " printer#identified_predicate) - preds; + let pp = + try + Hashtbl.find printer_tbl name + with Not_found -> default_pp + in + Format.fprintf fmt "@[%s %a;@]" name (pp printer) (code, preds) end let register_behavior_extension = Behavior_extensions.register @@ -83,9 +86,9 @@ (* in gcc this avoids a warning, but it might avoid a real problem on another compiler or a 64-bit architecture *) Format.fprintf fmt "(-%a-1)" - Datatype.Big_int.pretty (Integer.pred max_strict_signed) + Datatype.Integer.pretty (Integer.pred max_strict_signed) else - Format.fprintf fmt "%a%s" Datatype.Big_int.pretty i suffix + Format.fprintf fmt "%a%s" Datatype.Integer.pretty i suffix let pred_body = function | LBpred a -> a @@ -116,6 +119,14 @@ let comparativeLevel = 70 let bitwiseLevel = 75 let logic_level = 77 + + (* Be careful if you change the relative order of these 3 levels *) + let and_level = 83 + let or_level = 84 + let xor_level = 85 + let assoc_connector_level x = + and_level <= x && x <= xor_level + let binderLevel = 90 let questionLevel = 100 let upperLevel = 110 @@ -129,15 +140,16 @@ | Pvalid _ | Pvalid_read _ | Pinitialized _ + | Pdangling _ | Pseparated _ | Pat _ | Pfresh _ -> 0 | Pnot _ -> 30 | Psubtype _ -> 75 - | Pand _ - | Por _ - | Pxor _ -> 85 - | Pimplies _ -> 88 + | Pand _ -> and_level + | Por _ -> or_level + | Pxor _ -> xor_level + | Pimplies _ -> 87 (* and 88 for positive side *) | Piff _ -> 89 | Pif _ -> questionLevel | Prel _ -> comparativeLevel @@ -145,6 +157,20 @@ | Pforall _ | Pexists _ -> binderLevel + let compareLevel x y = + if assoc_connector_level x && assoc_connector_level y then 0 + else compare x y + + let needParens thisLevel contextprec = + let c = compareLevel thisLevel contextprec in + if c != 0 + then c > 0 + else + not (thisLevel == binderLevel || + thisLevel == 89 (* Piff *) || + (assoc_connector_level thisLevel && thisLevel == contextprec + && not Cil.miscState.Cil.printCilAsIs)) + let getParenthLevel e = match (Cil.stripInfo e).enode with | Info _ -> assert false | BinOp((LAnd | LOr), _,_,_) -> 80 @@ -234,12 +260,82 @@ | ADot _ | AIndex _ | AStar _ -> 20 | AQuestion _ -> questionLevel + let needIndent current pred fmt = + let nextLevel = getParenthLevelPred pred.content in + let need = not (current == binderLevel && nextLevel == binderLevel) in + if need then begin + pp_open_box fmt 2; + kfprintf (fun fmt -> pp_close_box fmt ()) fmt + end + else + fprintf fmt + + end let get_termination_kind_name = function | Normal -> "ensures" | Exits -> "exits" | Breaks -> "breaks" | Continues -> "continues" | Returns -> "returns" +let rec get_pand_list pred l = + match pred.content with + | Pand(p1,p2) -> get_pand_list p1 (p2::l) + | _ -> pred::l + +let rec get_tand_list term l = + match term.term_node with + | TBinOp(LAnd,t1,t2) -> get_tand_list t1 (t2::l) + | _ -> term::l + +let is_compatible_rel_binop op1 op2 = + match op1, op2 with + | (Lt | Le | Eq), (Lt | Le | Eq) -> true + | (Gt | Ge | Eq), (Gt | Ge | Eq) -> true + | _ -> false + +let is_compatible_relation op1 op2 = + match op1, op2 with + | (Rlt | Rle | Req), (Rlt | Rle | Req) -> true + | (Rgt | Rge | Req), (Rgt | Rge | Req) -> true + | _ -> false + +type direction = Nothing | Less | Greater | Both + +let update_direction_binop dir op = + match dir, op with + | _, Eq -> dir + | (Both | Less), (Lt | Le) -> Less + | (Both | Greater), (Gt | Ge) -> Greater + | _ -> Nothing + +let update_direction_rel dir op = + match dir, op with + | _, Req -> dir + | (Both | Less), (Rlt | Rle) -> Less + | (Both | Greater), (Rgt | Rge) -> Greater + | _ -> Nothing + +let is_same_direction_binop dir op = + update_direction_binop dir op <> Nothing + +let is_same_direction_rel dir op = + update_direction_rel dir op <> Nothing + +(* when pretty-printing relation chains, a < b && b' < c, it can happen that + b has a coercion and b' hasn't or vice-versa (bc c is an integer and a and + b are ints for instance). We nevertheless want to + pretty-print that as a < b < c. For that, we compare b and b' after having + removed any existing head coercion. +*) +let equal_mod_coercion t1 t2 = + let t1 = + match t1.term_node with TLogic_coerce(_,t1) -> t1 | _ -> t1 + in + let t2 = + match t2.term_node with TLogic_coerce(_,t2) -> t2 | _ -> t2 + in + Cil_datatype.Term.equal t1 t2 + (* Grab one of the labels of a statement *) let rec pickLabel = function | [] -> None @@ -330,8 +426,8 @@ | IUInt -> "U" | ILong -> "L" | IULong -> "UL" - | ILongLong -> if Cil.theMachine.Cil.msvcMode then "L" else "LL" - | IULongLong -> if Cil.theMachine.Cil.msvcMode then "UL" else "ULL" + | ILongLong -> if Cil.msvcMode () then "L" else "LL" + | IULongLong -> if Cil.msvcMode () then "UL" else "ULL" | IInt | IBool | IShort | IUShort | IChar | ISChar | IUChar -> "" in let prefix = @@ -430,8 +526,14 @@ else self#lval fmt lv + (* used to check whether StartOf x can be printed as x + or must be rendered as &x[0]. *) + val mutable parent_non_decay = false + (*** EXPRESSIONS ***) method exp fmt (e: exp) = + let non_decay = parent_non_decay in + parent_non_decay <- false; let level = Precedence.getParenthLevel e in match (Cil.stripInfo e).enode with | Info _ -> assert false @@ -455,15 +557,18 @@ | CastE(t,e) -> fprintf fmt "(%a)%a" (self#typ None) t (self#exp_prec level) e | SizeOf t -> fprintf fmt "sizeof(%a)" (self#typ None) t - | SizeOfE e -> fprintf fmt "sizeof(%a)" self#exp e + | SizeOfE e -> fprintf fmt "sizeof(%a)" self#exp_non_decay e | SizeOfStr s -> fprintf fmt "sizeof(%a)" self#constant (CStr s) | AlignOf t -> fprintf fmt "__alignof__(%a)" (self#typ None) t - | AlignOfE e -> fprintf fmt "__alignof__(%a)" self#exp e + | AlignOfE e -> fprintf fmt "__alignof__(%a)" self#exp_non_decay e | AddrOf lv -> fprintf fmt "& %a" (self#lval_prec Precedence.addrOfLevel) lv | StartOf(lv) -> - if state.print_cil_as_is then fprintf fmt "&(%a[0])" self#lval lv + if state.print_cil_as_is || non_decay then + fprintf fmt "&(%a[0])" self#lval lv else self#lval fmt lv + method private exp_non_decay fmt e = parent_non_decay <- true; self#exp fmt e + method unop fmt u = fprintf fmt "%s" (match u with @@ -534,7 +639,7 @@ let print_index prev_index (designator,init as di) = let curr_index = match designator with - | Index(e,NoOffset) -> Cil.isInteger (Cil.constFold false e) + | Index(e,NoOffset) -> Cil.constFoldToInt ~machdep:false e | _ -> None in let designator_needed = @@ -708,7 +813,7 @@ | Asm(attrs, tmpls, outs, ins, clobs, labels, l) -> self#line_directive fmt l; let goto = if labels=[] then "" else " goto" in - if Cil.theMachine.Cil.msvcMode then + if Cil.msvcMode () then fprintf fmt "__asm%s {@[%a@]}%s" goto (Pretty_utils.pp_list ~sep:"@\n" @@ -950,7 +1055,7 @@ | Some style -> let directive = match style with | Line_comment | Line_comment_sparse -> "//#line " - | Line_preprocessor_output when not Cil.theMachine.Cil.msvcMode -> "#" + | Line_preprocessor_output when not (Cil.msvcMode ()) -> "#" | Line_preprocessor_output | Line_preprocessor_input -> "#line" in lastLineNumber <- (fst l).Lexing.pos_lnum; @@ -1086,7 +1191,7 @@ try let rec skipEmpty = function | [] -> [] - | {skind=Instr (Skip _);labels=[]} as h :: rest + | { skind = Instr (Skip _) } as h :: rest when self#may_be_skipped h-> skipEmpty rest | x -> x in @@ -1097,12 +1202,19 @@ when not state.print_cil_as_is && self#may_be_skipped to_skip -> (match skipEmpty tb.bstmts, skipEmpty fb.bstmts with - | [], [{ skind = Break _; labels = [] } as s] - when self#may_be_skipped s -> + | [], [ { skind = Break _ } as s ] when self#may_be_skipped s -> e, rest - | [{ skind = Break _; labels = [] } as s], [] - when self#may_be_skipped s -> + | [], [ { skind = Goto(sref, _) } as s ] + when self#may_be_skipped s + && Cil_datatype.Stmt.equal !sref next -> + e, rest + | [ { skind = Break _ } as s ], [] when self#may_be_skipped s -> Cil.dummy_exp (UnOp(LNot, e, Cil.intType)), rest + | [ { skind = Goto(sref, _) } as s ], [] + when self#may_be_skipped s + && Cil_datatype.Stmt.equal !sref next -> + Cil.dummy_exp (UnOp(LNot, e, Cil.intType)), rest + | _ -> raise Not_found) | _ -> raise Not_found in @@ -1153,6 +1265,29 @@ instr_terminator <- ";"; fprintf fmt "%a) @]@ %a@]" self#exp e (fun fmt -> self#block fmt) h + | Throw (e,_) -> + let print_expr fmt (e,_) = self#exp fmt e in + fprintf fmt "@[throw@ %a;@]" + (Pretty_utils.pp_opt ~pre:"(" ~suf:")" print_expr) e + | TryCatch(body,catch,_) -> + let print_var_catch_all fmt v = + match v with + | Catch_all -> pp_print_string fmt "..." + | Catch_exn(v,l) -> + fprintf fmt "@[@[%a@]%a@]" + self#vdecl v + (Pretty_utils.pp_list ~pre:"@;" ~sep:"@;" + (fun fmt (v,_) -> self#vdecl fmt v)) l + in + let braces = false in + let print_one_catch fmt (v,b) = + fprintf fmt "@[@[catch (@;%a@;)@] {@;%a@]@;}" + print_var_catch_all v + (self#block ~braces) b + in + fprintf fmt "@[try@ @[%a@]@]@\n@[%a@]" + (self#block ~braces) body + (Pretty_utils.pp_list ~sep:"@;" print_one_catch) catch (*** GLOBALS ***) method global fmt (g:global) = match g with @@ -1277,7 +1412,7 @@ (* nor 'cilnoremove' *) let suppress = not state.print_cil_input - && not Cil.theMachine.Cil.msvcMode + && not (Cil.msvcMode ()) && (Cil.startsWith "box" an || Cil.startsWith "ccured" an || an = "merger" @@ -1379,10 +1514,10 @@ | ILong -> "long" | IULong -> "unsigned long" | ILongLong -> - if Cil.theMachine.Cil.msvcMode then "__int64" else "long long" + if Cil.msvcMode () then "__int64" else "long long" | IULongLong -> - if Cil.theMachine.Cil.msvcMode then "unsigned __int64" - else "unsigned long long") + if Cil.msvcMode () then "unsigned __int64" else "unsigned long long" + ) method typ ?fundecl nameOpt fmt (t:typ) = @@ -1392,9 +1527,7 @@ in let printAttributes fmt (a: attributes) = match nameOpt with - | None when not state.print_cil_input - && not Cil.theMachine.Cil.msvcMode -> - () + | None when not state.print_cil_input && not (Cil.msvcMode ()) -> () (* Cannot print the attributes in this case because gcc does not like them here, except if we are printing for CIL, or for MSVC. In fact, for MSVC we MUST print attributes such as __stdcall *) @@ -1431,7 +1564,7 @@ * the parenthesis. *) let (paren: (formatter -> unit) option), (bt': typ) = match bt with - | TFun(rt, args, isva, fa) when Cil.theMachine.Cil.msvcMode -> + | TFun(rt, args, isva, fa) when Cil.msvcMode () -> let an, af', at = Cil.partitionAttributes ~default:Cil.AttrType fa in (* We take the af' and we put them into the parentheses *) Some @@ -1485,62 +1618,40 @@ | TFun (restyp, args, isvararg, a) -> let name' fmt = - if a = [] then pname fmt false - else if nameOpt = None then printAttributes fmt a - else fprintf fmt "(%a%a)" printAttributes a pname (a <> []) - in - let module Args - (A:sig - type t - val args: t list option - val pp_args: Format.formatter -> t -> unit - end) - = - struct - let pp_prms fmt = - fprintf fmt "%t(@[%t@])" name' - (fun fmt -> - match A.args with - | (None | Some []) when isvararg -> fprintf fmt "..." - | None -> () - | Some [] -> fprintf fmt "void" - | Some args -> - Pretty_utils.pp_list ~sep:",@ " A.pp_args fmt args; - if isvararg then fprintf fmt "@ , ...") - end - in - let pp_prms = match fundecl with - | None -> - let module Args = - Args(struct - type t = (string * typ * attributes) - let args = args - let pp_args fmt (aname,atype,aattr) = - let stom, rest = Cil.separateStorageModifiers aattr in - (* First the storage modifiers *) - fprintf fmt - "%a%a%a" - self#attributes stom - (self#typ - (Some (fun fmt -> fprintf fmt "%s" aname))) - atype - self#attributes rest - end) - in - Args.pp_prms - | Some fundecl -> - let module Args = - Args(struct - type t = varinfo - let args = - try Some (Cil.getFormalsDecl fundecl) - with Not_found -> None - let pp_args = self#vdecl - end) - in - Args.pp_prms + if a = [] then pname fmt false + else if nameOpt = None then printAttributes fmt a + else fprintf fmt "(%a%a)" printAttributes a pname (a <> []) + in + let pp_params fmt args pp_args = + fprintf fmt "%t(@[%t@])" name' + (fun fmt -> + match args with + | (None | Some []) when isvararg -> fprintf fmt "..." + | None -> () + | Some [] -> fprintf fmt "void" + | Some args -> + Pretty_utils.pp_list ~sep:",@ " pp_args fmt args; + if isvararg then fprintf fmt "@ , ...") + in + let pp_params fmt = match fundecl with + | None -> + let pp_args fmt (aname,atype,aattr) = + (* The storage modifiers come first *) + let stom, rest = Cil.separateStorageModifiers aattr in + fprintf fmt "%a%a%a" + self#attributes stom + (self#typ (Some (fun fmt -> fprintf fmt "%s" aname))) atype + self#attributes rest + in + pp_params fmt args pp_args + | Some fundecl -> + let args = + try Some (Cil.getFormalsDecl fundecl) with Not_found -> None + in + pp_params fmt args self#vdecl in - self#typ (Some pp_prms) fmt restyp + self#typ (Some pp_params) fmt restyp + | TNamed (t, a) -> fprintf fmt "%a%a%a" self#varname t.tname @@ -1563,29 +1674,24 @@ (match an, args with | "const", [] -> fprintf fmt "const"; false (* Put the aconst inside the attribute list *) - | "aconst", [] when not Cil.theMachine.Cil.msvcMode -> - fprintf fmt "__const__"; true - | "thread", [] when not Cil.theMachine.Cil.msvcMode -> - fprintf fmt "__thread"; false - (* - | "used", [] when not !msvcMode -> text "__attribute_used__", false - *) + | "aconst", [] when not (Cil.msvcMode ()) -> fprintf fmt "__const__"; true + | "thread", [] when not (Cil.msvcMode ()) -> fprintf fmt "__thread"; false | "volatile", [] -> fprintf fmt "volatile"; false | "restrict", [] -> fprintf fmt "__restrict"; false | "missingproto", [] -> if self#display_comment () then fprintf fmt "/* missing proto */"; false - | "cdecl", [] when Cil.theMachine.Cil.msvcMode -> + | "cdecl", [] when Cil.msvcMode () -> fprintf fmt "__cdecl"; false - | "stdcall", [] when Cil.theMachine.Cil.msvcMode -> + | "stdcall", [] when Cil.msvcMode () -> fprintf fmt "__stdcall"; false - | "fastcall", [] when Cil.theMachine.Cil.msvcMode -> + | "fastcall", [] when Cil.msvcMode () -> fprintf fmt "__fastcall"; false - | "declspec", args when Cil.theMachine.Cil.msvcMode -> + | "declspec", args when Cil.msvcMode () -> fprintf fmt "__declspec(%a)" (Pretty_utils.pp_list ~sep:"" self#attrparam) args; false - | "w64", [] when Cil.theMachine.Cil.msvcMode -> + | "w64", [] when Cil.msvcMode () -> fprintf fmt "__w64"; false | "asm", args -> fprintf fmt "__asm__(%a)" @@ -1628,7 +1734,7 @@ | _ -> (* This is the dafault case *) (* Add underscores to the name *) let an' = - if Cil.theMachine.Cil.msvcMode then "__" ^ an else "__" ^ an ^ "__" + if Cil.msvcMode () then "__" ^ an else "__" ^ an ^ "__" in (match args with | [] -> fprintf fmt "%s" an' @@ -1658,7 +1764,7 @@ method attrparam fmt a = let level = Precedence.getParenthLevelAttrParam a in match a with - | AInt n -> fprintf fmt "%a" Datatype.Big_int.pretty n + | AInt n -> fprintf fmt "%a" Datatype.Integer.pretty n | AStr s -> fprintf fmt "\"%s\"" (Escape.escape_string s) | ACons(s, []) -> fprintf fmt "%s" s | ACons(s,al) -> @@ -1740,7 +1846,7 @@ | Integer(_, Some s) when print_as_source s -> fprintf fmt "%s" s (* Always print the text if there is one, unless we want to print it as hexa *) - | Integer(i, _) -> Datatype.Big_int.pretty fmt i + | Integer(i, _) -> Datatype.Integer.pretty fmt i | LStr(s) -> fprintf fmt "\"%s\"" (Escape.escape_string s) | LWStr(s) -> (* text ("L\"" ^ escape_string s ^ "\"") *) @@ -1865,6 +1971,43 @@ | Req -> if Kernel.Unicode.get () then Utf8_logic.eq else "==" | Rneq -> if Kernel.Unicode.get () then Utf8_logic.neq else "!=") + method private tand_list fmt l = + match l with + | [] -> () + | [ t ] -> self#term_prec Precedence.and_level fmt t + | { term_node = TBinOp(op1,low,mid1) } :: + { term_node = TBinOp(op2,mid2,up) } :: l + when is_compatible_rel_binop op1 op2 + && equal_mod_coercion mid1 mid2 -> + fprintf fmt "@[%a %a@ %a %a@ %a" + (self#term_prec Precedence.comparativeLevel) low + self#term_binop op1 + (self#term_prec Precedence.comparativeLevel) mid1 + self#term_binop op2 + (self#term_prec Precedence.comparativeLevel) up; + let dir = + update_direction_binop (update_direction_binop Both op1) op2 + in + let rec rel_list dir t = + function + | [] -> fprintf fmt "@]" + | { term_node = TBinOp(op,t',up) } :: l + when is_same_direction_binop dir op + && equal_mod_coercion t t' -> + fprintf fmt " %a@ %a" + self#term_binop op + (self#term_prec Precedence.comparativeLevel) up; + rel_list (update_direction_binop dir op) up l + | l -> + fprintf fmt "@] %a@ %a" self#term_binop LAnd self#tand_list l + in + rel_list dir up l + | t :: l -> + fprintf fmt "%a %a@ %a" + (self#term_prec Precedence.and_level) t + self#term_binop LAnd + self#tand_list l + method term_node fmt t = let current_level = Precedence.getParenthLevelLogic t.term_node in match t.term_node with @@ -1881,6 +2024,8 @@ | TAlignOfE e -> fprintf fmt "alignof(%a)" self#term e | TUnOp (op,e) -> fprintf fmt "%a%a" self#unop op (self#term_prec current_level) e + | TBinOp (LAnd, l, r) when not Cil.miscState.Cil.printCilAsIs -> + fprintf fmt "@[%a@]" self#tand_list (get_tand_list l [r]) | TBinOp (op,l,r) -> fprintf fmt "%a%a%a" (self#term_prec current_level) l @@ -2036,7 +2181,7 @@ method private pred_prec fmt (contextprec,p) = let thisLevel = Precedence.getParenthLevelPred p in - let needParens = thisLevel >= contextprec in + let needParens = Precedence.needParens thisLevel contextprec in if needParens then fprintf fmt "@[(%a)@]" self#predicate p else self#predicate fmt p @@ -2070,7 +2215,34 @@ Pretty_utils.pp_list ~suf:"@]@\n" ~sep:"@\n" (fun fmt p -> fprintf fmt "@[%s %a;@]" kw self#identified_predicate p) fmt l - + + method private pand_list fmt l = + let term = self#term_prec Precedence.comparativeLevel in + let pred fmt p = self#pred_prec_named fmt (Precedence.and_level,p) in + match l with + | [] -> () + | [p] -> pred fmt p + | { content = Prel(rel1, low, mid1) } :: + { content = Prel(rel2, mid2, up) } :: l + when is_compatible_relation rel1 rel2 && + equal_mod_coercion mid1 mid2 -> + fprintf fmt "@[%a@ %a@ %a@ %a@ %a" + term low self#relation rel1 term mid1 self#relation rel2 term up; + let dir = update_direction_rel (update_direction_rel Both rel1) rel2 in + let rec rel_list dir t = + function + | [] -> fprintf fmt "@]" + | { content = Prel(rel,t',up) } :: l + when is_same_direction_rel dir rel && equal_mod_coercion t t' -> + fprintf fmt " %a@ %a" self#relation rel term up; + rel_list (update_direction_rel dir rel) up l + | l -> + fprintf fmt "@] %a@ %a" self#term_binop LAnd self#pand_list l + in + rel_list dir up l + | p :: l -> + fprintf fmt "%a %a@ %a" pred p self#term_binop LAnd self#pand_list l + method predicate fmt p = let current_level = Precedence.getParenthLevelPred p in let term = self#term_prec current_level in @@ -2084,28 +2256,30 @@ (Pretty_utils.pp_list ~pre:"@[(" ~suf:")@]" ~sep:",@ " self#term) l | Prel (rel,l,r) -> fprintf fmt "@[%a@ %a@ %a@]" term l self#relation rel term r - | Pand (p1, p2) -> - fprintf fmt "@[%a@ %a@ %a@]" + | Pand (p1, p2) when not Cil.miscState.Cil.printCilAsIs -> + fprintf fmt "@[%a@]" self#pand_list (get_pand_list p1 [p2]) + | Pand (p1,p2) -> + fprintf fmt "@[%a %a@ %a@]" self#pred_prec_named (current_level,p1) self#term_binop LAnd self#pred_prec_named (current_level,p2) | Por (p1, p2) -> - fprintf fmt "@[%a@ %a@ %a@]" + fprintf fmt "@[%a %a@ %a@]" self#pred_prec_named (current_level,p1) self#term_binop LOr self#pred_prec_named (current_level,p2) | Pxor (p1, p2) -> - fprintf fmt "@[%a@ %s@ %a@]" + fprintf fmt "@[%a %s@ %a@]" self#pred_prec_named (current_level,p1) (if Kernel.Unicode.get () then Utf8_logic.x_or else "^^") self#pred_prec_named (current_level,p2) | Pimplies (p1,p2) -> - fprintf fmt "@[%a@ %s@ %a@]" + fprintf fmt "@[%a %s@ %a@]" self#pred_prec_named (current_level,p1) (if Kernel.Unicode.get () then Utf8_logic.implies else "==>") - self#pred_prec_named (current_level,p2) + self#pred_prec_named (current_level+1,p2) | Piff (p1,p2) -> - fprintf fmt "@[%a@ %s@ %a@]" + fprintf fmt "@[%a %s@ %a@]" self#pred_prec_named (current_level,p1) (if Kernel.Unicode.get () then Utf8_logic.iff else "<==>") self#pred_prec_named (current_level,p2) @@ -2133,7 +2307,8 @@ | LBreads _ | LBinductive _ -> Kernel.fatal "invalid logic local definition" in - fprintf fmt "@[\\let@ %a@ =@ %t%t;@ %a@]" + Precedence.needIndent current_level p fmt + "@[\\let@ %a =@ %t%t;@]@ %a" self#logic_var v (fun fmt -> if args <> [] then @@ -2141,13 +2316,15 @@ pp_defn self#pred_prec_named (current_level,p) | Pforall (quant,pred) -> - fprintf fmt "@[@[%s %a;@]@ %a@]" - (if Kernel.Unicode.get () then Utf8_logic.forall else "\\forall") - self#quantifiers quant self#pred_prec_named (current_level,pred) + Precedence.needIndent current_level pred fmt + "@[%s %a;@]@ %a" + (if Kernel.Unicode.get () then Utf8_logic.forall else "\\forall") + self#quantifiers quant self#pred_prec_named (current_level,pred) | Pexists (quant,pred) -> - fprintf fmt "@[@[%s %a;@]@ %a@]" - (if Kernel.Unicode.get () then Utf8_logic.exists else "\\exists") - self#quantifiers quant self#pred_prec_named (current_level,pred) + Precedence.needIndent current_level pred fmt + "@[%s %a;@]@ %a" + (if Kernel.Unicode.get () then Utf8_logic.exists else "\\exists") + self#quantifiers quant self#pred_prec_named (current_level,pred) | Pfreeable (l,p) -> fprintf fmt "@[\\freeable%a(@[%a@])@]" self#labels [l] self#term p | Pallocable (l,p) -> @@ -2158,6 +2335,9 @@ fprintf fmt "@[\\valid_read%a(@[%a@])@]" self#labels [l] self#term p | Pinitialized (l,p) -> fprintf fmt "@[\\initialized%a(@[%a@])@]" self#labels [l] self#term p + | Pdangling (l,p) -> + fprintf fmt "@[\\dangling%a(@[%a@])@]" + self#labels [l] self#term p | Pfresh (l1,l2,e1,e2) -> fprintf fmt "@[\\fresh%a(@[%a@],@[%a@])@]" self#labels [l1;l2] self#term e1 self#term e2 @@ -2470,9 +2650,9 @@ method global_annotation fmt = function | Dtype_annot (a,_) -> - fprintf fmt "@[type invariant @[%a%a=@ %a@,;@]@]@\n" + fprintf fmt "@[@[type invariant %a%a=@]@ %a;@]@\n" self#logic_var a.l_var_info - (Pretty_utils.pp_list ~pre:"@[(" ~suf:")@]@ " ~sep:",@ " + (Pretty_utils.pp_list ~pre:"@[(" ~suf:")@] " ~sep:",@ " self#logicPrms) a.l_profile self#identified_pred (pred_body a.l_body) | Dmodel_annot (mfi,_) -> @@ -2480,55 +2660,56 @@ | Dcustom_annot(_c, n ,_) -> fprintf fmt "@[custom %s: <...>@]@\n" n | Dinvariant (pred,_) -> - fprintf fmt "@[global@ invariant %a:@[@ %a;@]@]@\n" + fprintf fmt "@[@[global invariant %a:@]@ %a;@]@\n" self#logic_var pred.l_var_info self#identified_pred (pred_body pred.l_body) | Dlemma(name, is_axiom, labels, tvars, pred,_) -> - fprintf fmt "@[%s@ %a%a%a:@[@ %a;@]@]@\n" + fprintf fmt "@[@[%s %a%a%a:@]@ %a;@]@\n" (if is_axiom then "axiom" else "lemma") self#varname name self#labels labels self#typeKernel tvars self#identified_pred pred | Dtype (ti,_) -> - fprintf fmt "@[type@ %a%a%a;@]@\n" + fprintf fmt "@[@[type %a%a%a;@]@\n" self#varname ti.lt_name self#typeKernel ti.lt_params - (Pretty_utils.pp_opt - (fun fmt d -> fprintf fmt "@ =@ @[%a@]" self#logic_type_def d)) + (fun fmt -> function + | None -> fprintf fmt "@]" + | Some d -> fprintf fmt " =@]@ %a" self#logic_type_def d) ti.lt_def | Dfun_or_pred (li,_) -> (match li.l_type with | Some rt -> - fprintf fmt "@[logic %a" + fprintf fmt "@[@[logic %a" (self#logic_type None) rt | None -> (match li.l_body with - | LBinductive _ -> fprintf fmt "@[inductive" - | _ -> fprintf fmt "@[predicate")); - fprintf fmt " %a%a%a%a" + | LBinductive _ -> fprintf fmt "@[@[inductive" + | _ -> fprintf fmt "@[@[predicate")); + fprintf fmt "@ %a@,%a@,%a@,%a" self#logic_var li.l_var_info self#labels li.l_labels self#typeKernel li.l_tparams - (Pretty_utils.pp_list ~pre:"@[(" ~suf:")@]@ " ~sep:",@ " - self#logicPrms) + (Pretty_utils.pp_list ~pre:"@[(" ~suf:")@] " ~sep:",@ " + self#logicPrms) li.l_profile; (match li.l_body with | LBnone -> - fprintf fmt ";" + fprintf fmt ";@]" | LBreads reads -> (match reads with - | [] -> fprintf fmt "@\n@[reads \\nothing;@]" - | _ -> + | [] -> fprintf fmt "@]@\n@[reads \\nothing;@]" + | _ -> fprintf fmt "%a;" (Pretty_utils.pp_list - ~pre:"@\n@[reads@ " + ~pre:"@]@\n@[reads@ " ~sep:",@ " (fun fmt x -> self#term fmt x.it_content)) reads) | LBpred def -> - fprintf fmt "=@ %a;" + fprintf fmt "=@]@ %a;" self#identified_pred def | LBinductive indcases -> - fprintf fmt "{@ %a}" + fprintf fmt "{@]@ %a}" (Pretty_utils.pp_list ~pre:"@[" ~suf:"@]@\n" ~sep:"@\n" (fun fmt (id,labels,tvars,p) -> Format.fprintf fmt "case %s%a%a: @[%a@];" id @@ -2536,7 +2717,7 @@ self#typeKernel tvars self#identified_pred p)) indcases | LBterm def -> - fprintf fmt "=@ %a;" + fprintf fmt "=@]@ %a;" self#term def); fprintf fmt "@]@\n" | Dvolatile(tsets,rvi_opt,wvi_opt,_) -> @@ -2551,7 +2732,7 @@ (pp_vol "reads") rvi_opt (pp_vol "writes") wvi_opt ; | Daxiomatic(id,decls,_) -> - fprintf fmt "@[axiomatic@ %s {@\n%a}@]@\n" id + fprintf fmt "@[@[axiomatic %s {@]@\n%a}@]@\n" id (Pretty_utils.pp_list ~pre:"@[" ~suf:"@]@\n" ~sep:"@\n" self#global_annotation) decls diff -Nru frama-c-20140301+neon+dfsg/src/printer/cil_printer.mli frama-c-20150201+sodium+dfsg/src/printer/cil_printer.mli --- frama-c-20140301+neon+dfsg/src/printer/cil_printer.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/printer/cil_printer.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -39,7 +39,9 @@ string -> (Printer_api.extensible_printer_type -> Format.formatter -> int * Cil_types.identified_predicate list -> unit) -> unit -(** Register a pretty-printer used for behavior extensione. *) +(** Register a pretty-printer used for behavior extension. + @plugin development guide + *) val state: Printer_api.state diff -Nru frama-c-20140301+neon+dfsg/src/printer/printer_api.mli frama-c-20150201+sodium+dfsg/src/printer/printer_api.mli --- frama-c-20140301+neon+dfsg/src/printer/printer_api.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/printer/printer_api.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -441,7 +441,7 @@ val printer: unit -> extensible_printer (** @return the current printer. - @since Neon-20130301 *) + @since Neon-20140301 *) end diff -Nru frama-c-20140301+neon+dfsg/src/printer/printer_builder.ml frama-c-20150201+sodium+dfsg/src/printer/printer_builder.ml --- frama-c-20140301+neon+dfsg/src/printer/printer_builder.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/printer/printer_builder.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/printer/printer_builder.mli frama-c-20150201+sodium+dfsg/src/printer/printer_builder.mli --- frama-c-20140301+neon+dfsg/src/printer/printer_builder.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/printer/printer_builder.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/printer/printer.ml frama-c-20150201+sodium+dfsg/src/printer/printer.ml --- frama-c-20140301+neon+dfsg/src/printer/printer.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/printer/printer.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -25,8 +25,6 @@ let debug_vid = Kernel.register_category "printer:vid" let debug_sid = Kernel.register_category "printer:sid" -let cabsbranches_pp_comment = Extlib.mk_fun "Printer.debug_cabs" - let compare_annotations la1 la2 = let total_order = Datatype.Int.compare la1.annot_id la2.annot_id in match la1.annot_content,la2.annot_content with @@ -221,10 +219,6 @@ (* print the labels *) self#stmt_labels fmt s; Format.pp_open_hvbox fmt 0; - (* print the Cabscond, if any *) - Cabscond.pp_comment fmt s; - (* JS TODO: should not depend on [Cabsbranches] *) - !cabsbranches_pp_comment fmt s; if Kernel.PrintComments.get () then begin let comments = Globals.get_comments_stmt s in if comments <> [] then diff -Nru frama-c-20140301+neon+dfsg/src/printer/printer.mli frama-c-20150201+sodium+dfsg/src/printer/printer.mli --- frama-c-20140301+neon+dfsg/src/printer/printer.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/printer/printer.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -26,11 +26,6 @@ include Printer_api.S -(**/**) - -val cabsbranches_pp_comment: (Format.formatter -> Cil_types.stmt -> unit) ref -(** Internal use only. *) - (* Local Variables: compile-command: "make -C ../.." diff -Nru frama-c-20140301+neon+dfsg/src/project/project.ml frama-c-20150201+sodium+dfsg/src/project/project.ml --- frama-c-20140301+neon+dfsg/src/project/project.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/project/project.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -84,9 +84,10 @@ (fun s -> f s x) State_dependency_graph.graph - let iter_on_selection ?(selection=State_selection.full) f x = + let iter_on_selection + ?(iter=State_selection.iter) ?(selection=State_selection.full) f x = current_selection := selection; - State_selection.iter (fun s -> f s x) selection + iter (fun s -> f s x) selection let fold_on_selection ?(selection=State_selection.full) f x = current_selection := selection; @@ -100,7 +101,12 @@ iter_on_selection ?selection (fun s -> (private_ops s).commit) let update ?selection = - iter_on_selection ?selection (fun s -> (private_ops s).update) + (* since the developer may add hooks on update which may depend on each + others, iterating in the dependencies order is required. *) + iter_on_selection + ~iter:State_selection.iter_in_order + ?selection + (fun s -> (private_ops s).update) let clear ?(selection=State_selection.full) p = let clear s = (private_ops s).clear in @@ -249,13 +255,27 @@ let current () = Q.top projects let is_current p = equal p (current ()) +let last_created_by_copy_ref: t option ref = ref None +let () = + Cmdline.last_project_created_by_copy := + (fun () -> match !last_created_by_copy_ref with + | None -> None + | Some p -> Some p.unique_name) + let iter_on_projects f = Q.iter f projects let fold_on_projects f acc = Q.fold f acc projects let find_all name = Q.filter (fun p -> p.name = name) projects -let from_unique_name uname = Q.find (fun p -> p.unique_name = uname) projects + +exception Unknown_project +let from_unique_name uname = + try Q.find (fun p -> p.unique_name = uname) projects + with Not_found -> raise Unknown_project + module Mem = struct - let mem s = try ignore (from_unique_name s); true with Not_found -> false + let mem s = + try ignore (from_unique_name s); true + with Unknown_project -> false end module Setter = Make_setter(Mem) @@ -374,6 +394,10 @@ States_operations.update c; Set_Current_Hook_User.apply c end; + (* if we removed the last created_by_copy project, there is no last one *) + Extlib.may + (fun p -> if equal project p then last_created_by_copy_ref := None) + !last_created_by_copy_ref; (* clear all the states of other projects referring to the delete project *) Q.iter (States_operations.clear_some_projects (equal project)) projects (* Gc.major ()*) @@ -392,6 +416,7 @@ iter_on_projects Before_remove.apply; States_operations.clean (); Q.clear projects; + last_created_by_copy_ref := None; Gc.full_major () with NoProject -> () @@ -472,8 +497,10 @@ [] projects in - (* projects are stored on disk from the current one to the last project *) - output_value cout (List.rev states); + (* projects are stored on disk from the current one to the last project. + !last_created_by_copy_ref must be saved at the same time to share the + project on disk *) + output_value cout (List.rev states, !last_created_by_copy_ref); close_out cout; end else abort "saving a file is not supported in the 'no obj' mode" @@ -592,7 +619,7 @@ Descr.dynamic (fun () -> (* Local states must be up-to-date according to [p] when - unmarshalling states of [p] *) + unmarshalling states of [p] *) unjournalized_set_current true selection p; Before_load.apply (); Descr.t_list tbl_on_disk) @@ -603,16 +630,20 @@ Descr.transform one_state (fun (p, s as c) -> - (match name with None -> () | Some s -> set_name p s); - Project_tbl.add existing_projects p (); - (* At this point, the local states are always up-to-date according - to the current project, since we load first the old current - project *) - States_operations.unserialize ~selection p s; - After_load.apply (); - c) - in - Descr.t_list final_one_state + (* if we provide an explicit name different of the current one, + rename project [p] *) + (match name with Some s when s <> p.name -> set_name p s | _ -> ()); + Project_tbl.add existing_projects p (); + (* At this point, the local states are always up-to-date according + to the current project, since we load first the old current + project *) + States_operations.unserialize ~selection p s; + After_load.apply (); + c) + in + Descr.t_pair + (Descr.t_list final_one_state) + (Descr.t_option D.descr) (* the last saved project *) let input_val = Descr.input_val @@ -642,12 +673,13 @@ check_magic cin (fun n -> "magic number " ^ string_of_int n) magic; let ocamlgraph_counter = read cin in let pre_existing_projects = Descr.init project_under_copy in - let loaded_states = + let loaded_states, last_created = gen_read (fun c -> Descr.input_val c (Descr.global_state name selection)) cin in close_in cin; + last_created_by_copy_ref := last_created; Descr.finalize loaded_states selection; Graph.Blocks.after_unserialization ocamlgraph_counter; (* [set_current] done when unmarshalling and hooks may reorder @@ -714,7 +746,7 @@ let create_by_copy_hook f = Create_by_copy_hook.extend (fun (src, dst) -> f src dst) -let unjournalized_create_by_copy selection src name = +let unjournalized_create_by_copy selection src last name = guarded_feedback selection 2 "creating project %S by copying project %S" name (src.unique_name); let filename = @@ -728,6 +760,7 @@ ~project_under_copy:(Some src) selection (Some name) filename in Extlib.safe_remove filename; + if last then last_created_by_copy_ref := Some prj; Create_by_copy_hook.apply (src, prj); prj with e -> @@ -738,11 +771,14 @@ let lbl = Datatype.optlabel_func in Journal.register "Project.create_by_copy" (lbl "selection" dft_sel State_selection.ty - (lbl "src" current ty (Datatype.func Datatype.string ty))) + (lbl "src" current ty + (Datatype.func2 + ~label1:("last", None) Datatype.bool Datatype.string ty))) unjournalized_create_by_copy -let create_by_copy ?(selection=State_selection.full) ?(src=current()) name = - journalized_create_by_copy selection src name +let create_by_copy + ?(selection=State_selection.full) ?(src=current()) ~last name = + journalized_create_by_copy selection src last name (* ************************************************************************** *) (** {2 Undoing} *) diff -Nru frama-c-20140301+neon+dfsg/src/project/project.mli frama-c-20150201+sodium+dfsg/src/project/project.mli --- frama-c-20140301+neon+dfsg/src/project/project.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/project/project.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -107,9 +107,11 @@ (** Set the name of the given project. @since Boron-20100401 *) +exception Unknown_project val from_unique_name: string -> t (** Return a project based on {!unique_name}. - @raise Not_found if no project has this unique name. *) + @raise Unknown_project if no project has this unique name. + @modify Sodium-20150201 *) val set_current: ?on:bool -> ?selection:State_selection.t -> t -> unit (** Set the current project with the given one. @@ -143,15 +145,19 @@ @modify Carbon-20101201 replace the optional arguments [only] and [except] by a single one [selection]. *) -val create_by_copy: ?selection:State_selection.t -> ?src:t -> string -> t +val create_by_copy: + ?selection:State_selection.t -> ?src:t -> last:bool -> string -> t (** Return a new project with the given name by copying some states from the project [src]. All the other states are initialized with their default values. Use the save/load mechanism for copying. Thus it does not require that the copy function of the copied state is implemented. All the hooks applied when loading a project are applied (see {!load}). + If [last], then remember that the returned project is the last created + one (see {!last_created_by_copy}). @modify Carbon-20101201 replace the optional arguments [only] and - [except] by a single one [selection]. *) + [except] by a single one [selection]. + @modify Sodium-20150201 add the labeled argument [last]. *) val create_by_copy_hook: (t -> t -> unit) -> unit (** Register a hook to call at the end of {!create_by_copy}. The first diff -Nru frama-c-20140301+neon+dfsg/src/project/project_skeleton.ml frama-c-20150201+sodium+dfsg/src/project/project_skeleton.ml --- frama-c-20140301+neon+dfsg/src/project/project_skeleton.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/project/project_skeleton.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/project/project_skeleton.mli frama-c-20150201+sodium+dfsg/src/project/project_skeleton.mli --- frama-c-20140301+neon+dfsg/src/project/project_skeleton.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/project/project_skeleton.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/project/state_builder.ml frama-c-20150201+sodium+dfsg/src/project/state_builder.ml --- frama-c-20140301+neon+dfsg/src/project/state_builder.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/project/state_builder.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/project/state_builder.mli frama-c-20150201+sodium+dfsg/src/project/state_builder.mli --- frama-c-20140301+neon+dfsg/src/project/state_builder.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/project/state_builder.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -121,7 +121,7 @@ end) : Ref with type data = Data.t -(** Output signature of [OptionRef]. Note that [get] will raise [Not_found] +(** Output signature of [Option_ref]. Note that [get] will raise [Not_found] if the stored data is [None]. Use [get_option] if you want to have access to the option. *) @@ -340,7 +340,7 @@ include Ref type elt val add: elt -> unit - val remove: elt -> unit (** @since Neon-20130301 *) + val remove: elt -> unit (** @since Neon-20140301 *) val is_empty: unit -> bool val mem: elt -> bool val fold: (elt -> 'a -> 'a) -> 'a -> 'a diff -Nru frama-c-20140301+neon+dfsg/src/project/state_dependency_graph.ml frama-c-20150201+sodium+dfsg/src/project/state_dependency_graph.ml --- frama-c-20140301+neon+dfsg/src/project/state_dependency_graph.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/project/state_dependency_graph.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/project/state_dependency_graph.mli frama-c-20150201+sodium+dfsg/src/project/state_dependency_graph.mli --- frama-c-20140301+neon+dfsg/src/project/state_dependency_graph.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/project/state_dependency_graph.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/project/state.ml frama-c-20150201+sodium+dfsg/src/project/state.ml --- frama-c-20140301+neon+dfsg/src/project/state.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/project/state.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -165,6 +165,9 @@ (not (Datatype.String.Hashtbl.mem states uname)) "state %S already exists." uname); + assert + (Project_skeleton.Output.verify (uname <> "") + "state should have a non-empty name"); Datatype.String.Hashtbl.add states uname s let unique_name_from_name = diff -Nru frama-c-20140301+neon+dfsg/src/project/state.mli frama-c-20150201+sodium+dfsg/src/project/state.mli --- frama-c-20140301+neon+dfsg/src/project/state.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/project/state.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/project/state_selection.ml frama-c-20150201+sodium+dfsg/src/project/state_selection.ml --- frama-c-20140301+neon+dfsg/src/project/state_selection.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/project/state_selection.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/project/state_selection.mli frama-c-20150201+sodium+dfsg/src/project/state_selection.mli --- frama-c-20140301+neon+dfsg/src/project/state_selection.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/project/state_selection.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -86,13 +86,14 @@ val with_dependencies: State.t -> t (** The selection containing the given state and all its dependencies. - @since Carbon-20101201 + @since Carbon-20101201 @plugin development guide *) val only_dependencies: State.t -> t (** The selection containing all the dependencies of the given state (but not this state itself). - @since Carbon-20101201 *) + @since Carbon-20101201 + @plugin development guide *) val with_codependencies: State.t -> t (** The selection containing the given state and all its co-dependencies. diff -Nru frama-c-20140301+neon+dfsg/src/report/configure frama-c-20150201+sodium+dfsg/src/report/configure --- frama-c-20140301+neon+dfsg/src/report/configure 2014-03-12 15:07:57.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/configure 2015-06-01 13:17:43.000000000 +0000 @@ -1793,6 +1793,13 @@ + +# Usage: plugin_disable([plugin],[reason]) + + + + + # Implementation of an ordering $1 < $2: "" < yes < partial < no lt_mark () { first=`echo "$1" | sed -e 's/ .*//' ` diff -Nru frama-c-20140301+neon+dfsg/src/report/configure.ac frama-c-20150201+sodium+dfsg/src/report/configure.ac --- frama-c-20140301+neon+dfsg/src/report/configure.ac 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/configure.ac 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # diff -Nru frama-c-20140301+neon+dfsg/src/report/dump.ml frama-c-20150201+sodium+dfsg/src/report/dump.ml --- frama-c-20140301+neon+dfsg/src/report/dump.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/dump.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -54,6 +54,7 @@ val mutable st_dead = 0 ; (* under invalid hyp *) val mutable st_maybe_unreachable = 0 ; (* possible unreachable *) val mutable st_unreachable = 0 ; (* confirmed unreachable *) + val mutable st_reachable = 0 ; (* confirmed reachable *) val mutable st_inconsistent = 0 ; (* unsound *) val mutable kf : Description.kf = `Always @@ -70,13 +71,15 @@ method category ip st = match ip, st with (* Special display for unreachable *) - | Property.IPReachable _, Invalid_under_hyp _ -> - st_maybe_unreachable <- succ st_maybe_unreachable; - "Possibly unreachable" | Property.IPReachable _, Invalid _ -> st_unreachable <- succ st_unreachable; "Unreachable" + | Property.IPReachable _, (Valid _ | Considered_valid) -> + st_reachable <- succ st_reachable; "Reachable" + | Property.IPReachable _, _ -> + st_maybe_unreachable <- succ st_maybe_unreachable; + "-r-" - (* All other cases, including some unreachable *) + (* All other cases *) | _, (Never_tried | Unknown _) -> st_unknown <- succ st_unknown ; "-" | _, Considered_valid -> st_extern <- succ st_extern ; "Extern" | _, Valid _ -> st_complete <- succ st_complete ; "Valid" @@ -177,6 +180,8 @@ Format.fprintf out " %4d Dead properties@\n" st_dead ; if st_dead = 1 then Format.fprintf out " 1 Dead property@\n" ; + if st_reachable > 0 then + Format.fprintf out " %4d Reachable@\n" st_reachable ; if st_maybe_unreachable > 0 then Format.fprintf out " %4d Unconfirmed unreachable@\n" st_maybe_unreachable ; @@ -188,7 +193,8 @@ then Format.fprintf out " 1 Inconsistency@\n" ; let total = st_complete + st_partial + st_extern + st_unknown + st_alarm + st_bug - + st_dead + st_inconsistent + + st_dead + st_reachable + st_unreachable + st_maybe_unreachable + + st_inconsistent in Format.fprintf out " %5d Total@\n%s@." total bar ; diff -Nru frama-c-20140301+neon+dfsg/src/report/dump.mli frama-c-20150201+sodium+dfsg/src/report/dump.mli --- frama-c-20140301+neon+dfsg/src/report/dump.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/dump.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/report/Makefile.in frama-c-20150201+sodium+dfsg/src/report/Makefile.in --- frama-c-20140301+neon+dfsg/src/report/Makefile.in 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/Makefile.in 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # @@ -37,7 +37,9 @@ PLUGIN_ENABLE:=@ENABLE_REPORT@ PLUGIN_DYNAMIC:=@DYNAMIC_REPORT@ PLUGIN_NAME:=Report -PLUGIN_CMO:= report_parameters scan dump register +PLUGIN_CMO:= report_parameters scan dump $(sort $(patsubst src/report/%.ml,%,\ + $(wildcard src/report/*_nonfree.ml))) \ + register PLUGIN_HAS_MLI:=yes PLUGIN_DISTRIBUTED:=$(PLUGIN_ENABLE) PLUGIN_DISTRIB_EXTERNAL:= Makefile.in configure.ac configure @@ -63,4 +65,4 @@ $(Report_DIR)/Makefile: $(Report_DIR)/Makefile.in \ $(CONFIG_STATUS_DIR)/config.status - cd $(CONFIG_STATUS_DIR) && ./config.status + cd $(CONFIG_STATUS_DIR) && ./config.status --file $@ diff -Nru frama-c-20140301+neon+dfsg/src/report/register.ml frama-c-20150201+sodium+dfsg/src/report/register.ml --- frama-c-20140301+neon+dfsg/src/report/register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/register.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -41,6 +41,7 @@ "Report.print_once" [ Report_parameters.Enabled.self; (* reprint if we explicitly ask for *) Report_parameters.PrintProperties.self; + Report_parameters.Specialized.self; Property_status.self ] print diff -Nru frama-c-20140301+neon+dfsg/src/report/register.mli frama-c-20150201+sodium+dfsg/src/report/register.mli --- frama-c-20140301+neon+dfsg/src/report/register.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/register.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/report/Report.mli frama-c-20150201+sodium+dfsg/src/report/Report.mli --- frama-c-20140301+neon+dfsg/src/report/Report.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/Report.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/report/report_parameters.ml frama-c-20150201+sodium+dfsg/src/report/report_parameters.ml --- frama-c-20140301+neon+dfsg/src/report/report_parameters.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/report_parameters.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -48,3 +48,11 @@ let option_name = "-report-untried" let help = "display properties which no plug-in tried to prove" end) + +module Specialized = + True + (struct + let option_name = "-report-specialized" + let help = "display properties that are auxiliary instances of other \ + properties." + end) diff -Nru frama-c-20140301+neon+dfsg/src/report/report_parameters.mli frama-c-20150201+sodium+dfsg/src/report/report_parameters.mli --- frama-c-20140301+neon+dfsg/src/report/report_parameters.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/report_parameters.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,7 +20,8 @@ (* *) (**************************************************************************) -include Plugin.S +include Plugin.General_services module Enabled : Parameter_sig.Bool module PrintProperties: Parameter_sig.Bool module Untried: Parameter_sig.Bool +module Specialized: Parameter_sig.Bool diff -Nru frama-c-20140301+neon+dfsg/src/report/scan.ml frama-c-20150201+sodium+dfsg/src/report/scan.ml --- frama-c-20140301+neon+dfsg/src/report/scan.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/scan.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -51,8 +51,27 @@ best Property.Set.empty) ps + +(** Filters on which properties should be reported *) + +(* someone has tried to prove [ip], or show ips that no one attempted *) +let report_untried ip = + match Consolidation.get ip with + | Consolidation.Never_tried -> Report_parameters.Untried.get () + | _ -> true + +(* ip is not the specialization of a property, or those specializations should + be shown. *) +let report_specialized ip = + (Report_parameters.Specialized.get ()) || + (match ip with Property.IPPropertyInstance _ -> false | _ -> true) + +let report_ip ip = + report_untried ip && report_specialized ip + + let rec add_property ips ip = - if not (Property.Set.mem ip !ips) then + if report_ip ip && not (Property.Set.mem ip !ips) then begin ips := Property.Set.add ip !ips ; add_consolidation ips (Consolidation.get ip) @@ -82,19 +101,11 @@ ) m ) ps -let consider_ip ip = - match Consolidation.get ip with - | Consolidation.Never_tried -> Report_parameters.Untried.get () - | _ -> true - let iter (inspector:inspector) = begin (* Collect noticeable properties (tried + their pending) *) let properties = ref Property.Set.empty in - Property_status.iter - (fun ip -> - if consider_ip ip then - add_property properties ip) ; + Property_status.iter (fun ip -> add_property properties ip) ; let globals = ref Property.Set.empty in let functions = ref Kernel_function.Map.empty in (* Dispatch properties into globals and per-function map *) diff -Nru frama-c-20140301+neon+dfsg/src/report/scan.mli frama-c-20150201+sodium+dfsg/src/report/scan.mli --- frama-c-20140301+neon+dfsg/src/report/scan.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/scan.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/report/tests/report/hyp.i frama-c-20150201+sodium+dfsg/src/report/tests/report/hyp.i --- frama-c-20140301+neon+dfsg/src/report/tests/report/hyp.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/tests/report/hyp.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,33 @@ +/* run.config + OPT: -load-script tests/report/one_hyp.ml + OPT: -load-script tests/report/several_hyps.ml +*/ + +void f(); +void f2(); + +void g() { + /*@ assert \true; */ +} + +void h() { + /*@ assert \false; */ +} + +void i() { + /*@ assert 1 == 2; */ +} + +void j() { + /*@ assert 2 == 3; */ +} + +void main() { + /*@ assert 0 == 1; */ + f(); + f2(); + g(); + h(); + i(); + j(); +} diff -Nru frama-c-20140301+neon+dfsg/src/report/tests/report/multi_emitters.ml frama-c-20150201+sodium+dfsg/src/report/tests/report/multi_emitters.ml --- frama-c-20140301+neon+dfsg/src/report/tests/report/multi_emitters.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/tests/report/multi_emitters.ml 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,64 @@ +open Cil_types + +let emitter1 = + Emitter.create "Test1" [ Emitter.Property_status ] ~correctness:[] ~tuning:[] + +let emitter2 = + Emitter.create "Test2" [ Emitter.Property_status ] ~correctness:[] ~tuning:[] + +let set_status e s = + Kernel.feedback "%a SET STATUS TO %a" + Emitter.pretty e Property_status.Emitted_status.pretty s; + Annotations.iter_all_code_annot + (fun stmt _ ca -> + let kf = Kernel_function.find_englobing_kf stmt in + let ps = Property.ip_of_code_annot kf stmt ca in + List.iter (fun p -> Property_status.emit e p ~hyps:[] s) ps) + +let print_status = + Dynamic.get + ~plugin:"Report" + "print" + (Datatype.func Datatype.unit Datatype.unit) + +let clear () = + Kernel.feedback "CLEARING"; + Project.clear + ~selection:(State_selection.Static.with_dependencies Property_status.self) + () + +let main () = + Ast.compute (); + print_status (); + set_status emitter1 Property_status.Dont_know; + set_status emitter2 Property_status.Dont_know; + (* unknow /\ unknown *) + print_status (); + (* unknow /\ true *) + set_status emitter1 Property_status.True; + print_status (); + (* true /\ true *) + set_status emitter2 Property_status.True; + print_status (); + clear (); + (* true /\ false_if_reachable *) + set_status emitter1 Property_status.Dont_know; + set_status emitter2 Property_status.False_if_reachable; + print_status (); + (* true /\ false *) + set_status emitter2 Property_status.False_and_reachable; + print_status (); + clear (); + (* false_if_reachable /\ false_if_reachable *) + set_status emitter1 Property_status.False_if_reachable; + set_status emitter2 Property_status.False_if_reachable; + print_status (); + (* false_if_reachable /\ false *) + set_status emitter1 Property_status.False_if_reachable; + set_status emitter2 Property_status.False_and_reachable; + print_status (); + (* false /\ false *) + set_status emitter1 Property_status.False_and_reachable; + print_status () + +let () = Db.Main.extend main diff -Nru frama-c-20140301+neon+dfsg/src/report/tests/report/no_hyp.ml frama-c-20150201+sodium+dfsg/src/report/tests/report/no_hyp.ml --- frama-c-20140301+neon+dfsg/src/report/tests/report/no_hyp.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/tests/report/no_hyp.ml 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,47 @@ +open Cil_types + +let emitter = + Emitter.create "Test" [ Emitter.Property_status ] ~correctness:[] ~tuning:[] + +let set_status s = + Annotations.iter_all_code_annot + (fun stmt _ ca -> + let kf = Kernel_function.find_englobing_kf stmt in + let ps = Property.ip_of_code_annot kf stmt ca in + List.iter (fun p -> Property_status.emit emitter p ~hyps:[] s) ps) + +let print_status = + Dynamic.get + ~plugin:"Report" + "print" + (Datatype.func Datatype.unit Datatype.unit) + +let clear () = + Project.clear + ~selection:(State_selection.Static.with_dependencies Property_status.self) + () + +let main () = + Ast.compute (); + Kernel.feedback "SETTING STATUS TO dont_know"; + set_status Property_status.Dont_know; + print_status (); + Kernel.feedback "SETTING STATUS TO true"; + set_status Property_status.True; + print_status (); + Kernel.feedback "SETTING STATUS TO false_if_reachable"; + (try set_status Property_status.False_if_reachable + with Property_status.Inconsistent_emitted_status(s1, s2) -> + Kernel.result "inconsistency between %a and %a" + Property_status.Emitted_status.pretty s1 + Property_status.Emitted_status.pretty s2); + Kernel.feedback "CLEARING"; + clear (); + Kernel.feedback "SETTING STATUS TO false_if_reachable"; + set_status Property_status.False_if_reachable; + print_status (); + Kernel.feedback "SETTING STATUS TO false_and_reachable"; + set_status Property_status.False_and_reachable; + print_status () + +let () = Db.Main.extend main diff -Nru frama-c-20140301+neon+dfsg/src/report/tests/report/one_hyp.ml frama-c-20150201+sodium+dfsg/src/report/tests/report/one_hyp.ml --- frama-c-20140301+neon+dfsg/src/report/tests/report/one_hyp.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/tests/report/one_hyp.ml 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,226 @@ +open Cil_types + +let emitter = + Emitter.create "Test" [ Emitter.Property_status ] ~correctness:[] ~tuning:[] + +let emitter2 = + Emitter.create "Test2" [ Emitter.Property_status ] ~correctness:[] ~tuning:[] + +let set_status ?(emitter=emitter) p hyps s = + Kernel.feedback "SETTING STATUS OF %a TO %a" + Property.pretty p + Property_status.Emitted_status.pretty s; + Property_status.emit emitter p ~hyps s + +let print_status = + Dynamic.get + ~plugin:"Report" + "print" + (Datatype.func Datatype.unit Datatype.unit) + +let clear () = + Kernel.feedback "CLEARING"; + Project.clear + ~selection:(State_selection.with_dependencies Property_status.self) + () + +let main () = + Ast.compute (); + print_status (); + let main, _, _, h, g = + let l = + Annotations.fold_all_code_annot + (fun stmt _ ca acc -> + let kf = Kernel_function.find_englobing_kf stmt in + let ps = Property.ip_of_code_annot kf stmt ca in + match ps with + | [ p ] -> p :: acc + | _ -> assert false) + [] + in + match l with + | [ p1; p2; p3; p4; p5 ] -> p1, p2, p3, p4, p5 + | _ -> assert false + in + let ensures = + let kf = Globals.Functions.find_by_name "f" in + let spec = Annotations.funspec kf in + Property.ip_post_cond_of_spec kf Kglobal spec + in + (* *********************************************************************** *) + (* hyp = never_tried *) + (* unknown *) + set_status h [ main ] Property_status.Dont_know; + print_status (); + (* true *) + set_status h [ main ] Property_status.True; + print_status (); + clear (); + (* false *) + set_status h [ ] Property_status.False_and_reachable; + print_status (); + (* *********************************************************************** *) + (* hyp = considered_valid *) + clear (); + (* unknown *) + set_status h ensures Property_status.Dont_know; + print_status (); + (* true *) + set_status h ensures Property_status.True; + print_status (); + clear (); + (* false *) + set_status h [] Property_status.False_and_reachable; + print_status (); + (* *********************************************************************** *) + (* hyp = valid *) + clear (); + (* unknown *) + set_status main [] Property_status.True; + set_status h [ main ] Property_status.Dont_know; + print_status (); + (* true *) + set_status h [ main ] Property_status.True; + print_status (); + clear (); + (* false *) + set_status main [] Property_status.True; + set_status h [ ] Property_status.False_and_reachable; + print_status (); + (* *********************************************************************** *) + (* hyp = valid under hyp *) + clear (); + (* unknown *) + set_status g [] Property_status.Dont_know; + set_status main [ g ] Property_status.True; + set_status h [ main ] Property_status.Dont_know; + print_status (); + (* true *) + set_status h [ main ] Property_status.True; + print_status (); + clear (); + (* false *) + set_status g [] Property_status.Dont_know; + set_status main [ g ] Property_status.True; + set_status h [ ] Property_status.False_and_reachable; + print_status (); + (* *********************************************************************** *) + (* hyp = dont_know *) + clear (); + (* unknown *) + set_status main [] Property_status.Dont_know; + set_status h [ main ] Property_status.Dont_know; + print_status (); + (* true *) + set_status h [ main ] Property_status.True; + print_status (); + clear (); + (* false *) + set_status main [] Property_status.Dont_know; + set_status h [ ] Property_status.False_and_reachable; + print_status (); + (* *********************************************************************** *) + (* hyp = invalid *) + clear (); + (* unknown *) + set_status main [] Property_status.False_and_reachable; + set_status h [ main ] Property_status.Dont_know; + print_status (); + (* true *) + set_status h [ main ] Property_status.True; + print_status (); + clear (); + (* false *) + set_status main [] Property_status.False_and_reachable; + set_status h [ ] Property_status.False_and_reachable; + print_status (); + (* *********************************************************************** *) + (* hyp = invalid under hyp *) + clear (); + (* unknown *) + set_status g [] Property_status.Dont_know; + set_status main [ ] Property_status.False_and_reachable; + set_status h [ main ] Property_status.Dont_know; + print_status (); + (* true *) + set_status h [ main ] Property_status.True; + print_status (); + clear (); + (* false *) + set_status g [] Property_status.Dont_know; + set_status main [ ] Property_status.False_and_reachable; + set_status h [ ] Property_status.False_and_reachable; + print_status (); + (* *********************************************************************** *) + (* hyp = invalid but dead *) + clear (); + (* unknown *) + set_status g [] Property_status.False_and_reachable; + set_status main [ ] Property_status.False_and_reachable; + set_status h [ main ] Property_status.Dont_know; + print_status (); + (* true *) + set_status h [ main ] Property_status.True; + print_status (); + clear (); + (* false *) + set_status g [] Property_status.False_and_reachable; + set_status main [ ] Property_status.False_and_reachable; + set_status h [ ] Property_status.False_and_reachable; + print_status (); + (* *********************************************************************** *) + (* hyp = valid but dead *) + clear (); + (* unknown *) + set_status g [] Property_status.False_and_reachable; + set_status main [ g ] Property_status.True; + set_status h [ main ] Property_status.Dont_know; + print_status (); + (* true *) + set_status h [ main ] Property_status.True; + print_status (); + clear (); + (* false *) + set_status g [] Property_status.False_and_reachable; + set_status main [ g ] Property_status.True; + set_status h [ ] Property_status.False_and_reachable; + print_status (); + (* *********************************************************************** *) + (* hyp = unknown but dead *) + clear (); + (* unknown *) + set_status g [] Property_status.False_and_reachable; + set_status main [ g ] Property_status.Dont_know; + set_status h [ main ] Property_status.Dont_know; + print_status (); + (* true *) + set_status h [ main ] Property_status.True; + print_status (); + clear (); + (* false *) + set_status g [] Property_status.False_and_reachable; + set_status main [ g ] Property_status.Dont_know; + set_status h [ ] Property_status.False_and_reachable; + print_status (); + (* *********************************************************************** *) + (* hyp = inconsistent *) + clear (); + (* unknown *) + set_status main [] Property_status.True; + set_status ~emitter:emitter2 main [] Property_status.False_and_reachable; + set_status h [ main ] Property_status.Dont_know; + print_status (); + (* true *) + set_status h [ main ] Property_status.True; + print_status (); + clear (); + (* false *) + set_status main [] Property_status.True; + set_status ~emitter:emitter2 main [] Property_status.False_and_reachable; + set_status h [ ] Property_status.False_and_reachable; + print_status (); + (* *********************************************************************** *) + () + +let () = Db.Main.extend main + diff -Nru frama-c-20140301+neon+dfsg/src/report/tests/report/oracle/hyp.1.res.oracle frama-c-20150201+sodium+dfsg/src/report/tests/report/oracle/hyp.1.res.oracle --- frama-c-20140301+neon+dfsg/src/report/tests/report/oracle/hyp.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/tests/report/oracle/hyp.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,11211 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/report/hyp.i (no preprocessing) +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 0 Total +-------------------------------------------------------------------------------- +tests/report/hyp.i:25:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +tests/report/hyp.i:25:[kernel] warning: Neither code nor specification for function f2, generating default assigns from the prototype +[kernel] NEVER_TRIED + NEVER_TRIED +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 5 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 5 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 5 Total +-------------------------------------------------------------------------------- +[kernel] NEVER_TRIED + CONSIDERED_VALID +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 5 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 5 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 5 Total +-------------------------------------------------------------------------------- +[kernel] NEVER_TRIED + VALID +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 To be validated + 6 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 1 Locally validated + 2 Considered valid + 6 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 Bugs found + 6 Total +-------------------------------------------------------------------------------- +[kernel] NEVER_TRIED + VALID_UNDER_HYP +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 To be validated + 6 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 14) + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Locally validated + 2 Considered valid + 6 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 Bugs found + 6 Total +-------------------------------------------------------------------------------- +[kernel] NEVER_TRIED + UNKNOWN +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 To be validated + 6 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 To be validated + 6 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 6 Total +-------------------------------------------------------------------------------- +[kernel] NEVER_TRIED + INVALID +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 6 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 6 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 6 Total +-------------------------------------------------------------------------------- +[kernel] NEVER_TRIED + INVALID_UNDER_HYP +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 6 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 6 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 6 Total +-------------------------------------------------------------------------------- +[kernel] NEVER_TRIED + INVALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 3 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] NEVER_TRIED + VALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 1 Locally validated + 2 Considered valid + 1 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 2 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] NEVER_TRIED + UNKNOWN_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 10) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 10) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 10) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] NEVER_TRIED + INCONSISTENT +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 10) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 1 Inconsistency + 6 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 10) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 Inconsistency + 6 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 10) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 1 Inconsistency + 6 Total +-------------------------------------------------------------------------------- +[kernel] CONSIDERED_VALID + CONSIDERED_VALID +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 5 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 5 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 5 Total +-------------------------------------------------------------------------------- +[kernel] CONSIDERED_VALID + VALID +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 To be validated + 6 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 4 Completely validated + 2 Considered valid + 6 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 Bugs found + 6 Total +-------------------------------------------------------------------------------- +[kernel] CONSIDERED_VALID + VALID_UNDER_HYP +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 To be validated + 6 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Locally validated + 2 Considered valid + 6 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 Bugs found + 6 Total +-------------------------------------------------------------------------------- +[kernel] CONSIDERED_VALID + UNKNOWN +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 To be validated + 6 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 To be validated + 6 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 6 Total +-------------------------------------------------------------------------------- +[kernel] CONSIDERED_VALID + INVALID +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 6 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 6 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 6 Total +-------------------------------------------------------------------------------- +[kernel] CONSIDERED_VALID + INVALID_UNDER_HYP +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 6 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 6 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 6 Total +-------------------------------------------------------------------------------- +[kernel] CONSIDERED_VALID + INVALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 3 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] CONSIDERED_VALID + VALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 4 Completely validated + 2 Considered valid + 1 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 2 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] CONSIDERED_VALID + UNKNOWN_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 10) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 10) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 10) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] CONSIDERED_VALID + INCONSISTENT +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 10) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 1 Inconsistency + 6 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 10) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 Inconsistency + 6 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 10) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 1 Inconsistency + 6 Total +-------------------------------------------------------------------------------- +[kernel] VALID + VALID +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 4 Completely validated + 2 Considered valid + 1 To be validated + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 5 Completely validated + 2 Considered valid + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 4 Completely validated + 2 Considered valid + 1 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] VALID + VALID_UNDER_HYP +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 14) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 1 Locally validated + 2 Considered valid + 1 To be validated + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 14) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Locally validated + 2 Considered valid + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 14) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 1 Locally validated + 2 Considered valid + 1 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] VALID + UNKNOWN +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 2 To be validated + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 1 Locally validated + 2 Considered valid + 1 To be validated + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] VALID + INVALID +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 2 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] VALID + INVALID_UNDER_HYP +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 2 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] VALID + INVALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 3 Bugs found + 8 Total +-------------------------------------------------------------------------------- +[kernel] VALID + VALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 4 Completely validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 5 Completely validated + 2 Considered valid + 1 Bugs found + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 4 Completely validated + 2 Considered valid + 2 Bugs found + 8 Total +-------------------------------------------------------------------------------- +[kernel] VALID + UNKNOWN_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 4 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] VALID + INCONSISTENT +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 To be validated + 1 Inconsistency + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 1 Locally validated + 2 Considered valid + 1 Inconsistency + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 Bugs found + 1 Inconsistency + 7 Total +-------------------------------------------------------------------------------- +[kernel] VALID_UNDER_HYP + VALID_UNDER_HYP +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 14) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Locally validated + 2 Considered valid + 1 To be validated + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 14) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 3 Locally validated + 2 Considered valid + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 14) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Locally validated + 2 Considered valid + 1 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] VALID_UNDER_HYP + UNKNOWN +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 2 To be validated + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 14) + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Locally validated + 2 Considered valid + 1 To be validated + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] VALID_UNDER_HYP + INVALID +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 2 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] VALID_UNDER_HYP + INVALID_UNDER_HYP +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 2 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] VALID_UNDER_HYP + INVALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 3 Bugs found + 8 Total +-------------------------------------------------------------------------------- +[kernel] VALID_UNDER_HYP + VALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 1 Locally validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Locally validated + 2 Considered valid + 1 Bugs found + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 1 Locally validated + 2 Considered valid + 2 Bugs found + 8 Total +-------------------------------------------------------------------------------- +[kernel] VALID_UNDER_HYP + UNKNOWN_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Locally validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] VALID_UNDER_HYP + INCONSISTENT +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 To be validated + 1 Inconsistency + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 14) + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Locally validated + 2 Considered valid + 1 Inconsistency + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 10) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 Bugs found + 1 Inconsistency + 7 Total +-------------------------------------------------------------------------------- +[kernel] UNKNOWN + UNKNOWN +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 3 To be validated + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 2 To be validated + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 To be validated + 1 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] UNKNOWN + INVALID +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 2 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] UNKNOWN + INVALID_UNDER_HYP +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 2 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] UNKNOWN + INVALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 2 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 2 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 3 Bugs found + 8 Total +-------------------------------------------------------------------------------- +[kernel] UNKNOWN + VALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 2 To be validated + 1 Bugs found + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 1 Locally validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 To be validated + 2 Bugs found + 8 Total +-------------------------------------------------------------------------------- +[kernel] UNKNOWN + UNKNOWN_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 To be validated + 1 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 2 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] UNKNOWN + INCONSISTENT +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 To be validated + 1 Inconsistency + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 To be validated + 1 Inconsistency + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 1 Inconsistency + 7 Total +-------------------------------------------------------------------------------- +[kernel] INVALID + INVALID +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 3 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] INVALID + INVALID_UNDER_HYP +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 3 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] INVALID + INVALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 3 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 3 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 4 Bugs found + 8 Total +-------------------------------------------------------------------------------- +[kernel] INVALID + VALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 3 Bugs found + 8 Total +-------------------------------------------------------------------------------- +[kernel] INVALID + UNKNOWN_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 2 Dead properties + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 2 Dead properties + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 3 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] INVALID + INCONSISTENT +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 1 Inconsistency + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 1 Inconsistency + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Inconsistency + 7 Total +-------------------------------------------------------------------------------- +[kernel] INVALID_UNDER_HYP + INVALID_UNDER_HYP +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 3 Bugs found + 7 Total +-------------------------------------------------------------------------------- +[kernel] INVALID_UNDER_HYP + INVALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 3 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 3 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 4 Bugs found + 8 Total +-------------------------------------------------------------------------------- +[kernel] INVALID_UNDER_HYP + VALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 3 Bugs found + 8 Total +-------------------------------------------------------------------------------- +[kernel] INVALID_UNDER_HYP + UNKNOWN_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 2 Dead properties + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 2 Dead properties + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 3 Bugs found + 1 Dead property + 8 Total +-------------------------------------------------------------------------------- +[kernel] INVALID_UNDER_HYP + INCONSISTENT +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 1 Inconsistency + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 1 Inconsistency + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Inconsistency + 7 Total +-------------------------------------------------------------------------------- +[kernel] INVALID_BUT_DEAD + INVALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 4 Bugs found + 1 Dead property + 9 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 4 Bugs found + 1 Dead property + 9 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 5 Bugs found + 9 Total +-------------------------------------------------------------------------------- +[kernel] INVALID_BUT_DEAD + VALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 3 Bugs found + 1 Dead property + 9 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 3 Bugs found + 1 Dead property + 9 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 4 Bugs found + 9 Total +-------------------------------------------------------------------------------- +[kernel] INVALID_BUT_DEAD + UNKNOWN_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 3 Bugs found + 2 Dead properties + 9 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 3 Bugs found + 2 Dead properties + 9 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 4 Bugs found + 1 Dead property + 9 Total +-------------------------------------------------------------------------------- +[kernel] INVALID_BUT_DEAD + INCONSISTENT +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 1 Inconsistency + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 1 Inconsistency + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 3 Bugs found + 1 Inconsistency + 8 Total +-------------------------------------------------------------------------------- +[kernel] VALID_BUT_DEAD + VALID_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 4 Completely validated + 2 Considered valid + 1 To be validated + 2 Bugs found + 9 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 5 Completely validated + 2 Considered valid + 2 Bugs found + 9 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 4 Completely validated + 2 Considered valid + 3 Bugs found + 9 Total +-------------------------------------------------------------------------------- +[kernel] VALID_BUT_DEAD + UNKNOWN_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 To be validated + 2 Bugs found + 1 Dead property + 9 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 4 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 9 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 3 Bugs found + 1 Dead property + 9 Total +-------------------------------------------------------------------------------- +[kernel] VALID_BUT_DEAD + INCONSISTENT +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 1 Inconsistency + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 1 Locally validated + 2 Considered valid + 1 Bugs found + 1 Inconsistency + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 2 Bugs found + 1 Inconsistency + 8 Total +-------------------------------------------------------------------------------- +[kernel] UNKNOWN_BUT_DEAD + UNKNOWN_BUT_DEAD +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 10) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 2 Bugs found + 2 Dead properties + 9 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 10) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 2 Considered valid + 2 Bugs found + 2 Dead properties + 9 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 2 ≡ 3; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 10) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'j' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 22) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 3 Bugs found + 2 Dead properties + 9 Total +-------------------------------------------------------------------------------- +[kernel] UNKNOWN_BUT_DEAD + INCONSISTENT +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 10) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 1 Bugs found + 1 Dead property + 1 Inconsistency + 8 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 10) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 1 Bugs found + 1 Dead property + 1 Inconsistency + 8 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 1 ≡ 2; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 10) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 18) + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'i' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 18) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 2 Bugs found + 1 Dead property + 1 Inconsistency + 8 Total +-------------------------------------------------------------------------------- +[kernel] INCONSISTENT + INCONSISTENT +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 10) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 To be validated + 2 Inconsistencies + 7 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 10) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 10) + - Assertion (file tests/report/hyp.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Locally validated + 2 Considered valid + 2 Inconsistencies + 7 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO VALID +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 10) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 14) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 1 Bugs found + 2 Inconsistencies + 7 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/report/tests/report/oracle/hyp.res.oracle frama-c-20150201+sodium+dfsg/src/report/tests/report/oracle/hyp.res.oracle --- frama-c-20140301+neon+dfsg/src/report/tests/report/oracle/hyp.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/tests/report/oracle/hyp.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,1304 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/report/hyp.i (no preprocessing) +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 0 Total +-------------------------------------------------------------------------------- +tests/report/hyp.i:25:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[kernel] SETTING STATUS OF assert \false; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ - ] Assigns nothing + tried with Inferred annotations. +[ - ] Default behavior + tried with Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 To be validated + 3 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert \false; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ - ] Assigns nothing + tried with Inferred annotations. +[ - ] Default behavior + tried with Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 14) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 26) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Locally validated + 2 To be validated + 3 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 1 Bugs found + 3 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \false; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 1 To be validated + 3 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert \false; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Considered valid + 3 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 1 Bugs found + 3 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Considered valid + 1 To be validated + 4 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert \false; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 3 Completely validated + 1 Considered valid + 4 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Considered valid + 1 Bugs found + 4 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Locally validated + 1 Considered valid + 2 To be validated + 5 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert \false; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 14) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 2 Locally validated + 1 Considered valid + 1 To be validated + 5 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 26) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Locally validated + 1 Considered valid + 1 To be validated + 1 Bugs found + 5 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[kernel] SETTING STATUS OF assert \false; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 2 To be validated + 4 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert \false; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 14) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 26) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Locally validated + 1 Considered valid + 1 To be validated + 4 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 26) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 1 To be validated + 1 Bugs found + 4 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 26) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 1 Bugs found + 1 Dead property + 4 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert \false; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 26) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 1 Bugs found + 1 Dead property + 4 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 2 Bugs found + 4 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 26) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 1 To be validated + 1 Bugs found + 1 Dead property + 5 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert \false; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 26) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 1 To be validated + 1 Bugs found + 1 Dead property + 5 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO unknown +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 10) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 1 To be validated + 2 Bugs found + 5 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 26) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 2 Bugs found + 1 Dead property + 5 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert \false; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 14) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 26) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 2 Bugs found + 1 Dead property + 5 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 26) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 3 Bugs found + 5 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 1 To be validated + 1 Bugs found + 1 Dead property + 5 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert \false; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Considered valid + 1 Bugs found + 1 Dead property + 5 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally valid, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 2 Bugs found + 1 Dead property + 5 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[kernel] SETTING STATUS OF assert \false; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 1 To be validated + 1 Bugs found + 1 Dead property + 5 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert \false; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 1 Considered valid + 1 Bugs found + 1 Dead property + 5 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert \true; TO **NOT** VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO unknown +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 10) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/report/hyp.i, line 26) + Locally unknown, but unreachable. + By Test because: + - Assertion (file tests/report/hyp.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 2 Bugs found + 1 Dead property + 5 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/hyp.i, line 14) + tried with Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 26) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 1 To be validated + 1 Inconsistency + 4 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS OF assert \false; TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Partial ] Assertion (file tests/report/hyp.i, line 14) + By Test, with pending: + - Assertion (file tests/report/hyp.i, line 26) + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 26) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Locally validated + 1 Considered valid + 1 Inconsistency + 4 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO VALID +[kernel] SETTING STATUS OF assert 0 ≡ 1; TO **NOT** VALID +[kernel] SETTING STATUS OF assert \false; TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/hyp.i, line 14) + by Test. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Unsound ] Assertion (file tests/report/hyp.i, line 26) + inconsistent status: + VALID according to Test + but **NOT** VALID according to Test2 + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Considered valid + 1 Bugs found + 1 Inconsistency + 4 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/report/tests/report/oracle/single.1.res.oracle frama-c-20150201+sodium+dfsg/src/report/tests/report/oracle/single.1.res.oracle --- frama-c-20140301+neon+dfsg/src/report/tests/report/oracle/single.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/tests/report/oracle/single.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,70 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/report/single.i (no preprocessing) +[kernel] SETTING STATUS TO dont_know +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/single.i, line 9) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 To be validated + 1 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS TO true +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/single.i, line 9) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS TO false_if_reachable +[kernel] inconsistency between **NOT** VALID and VALID +[kernel] CLEARING +[kernel] SETTING STATUS TO false_if_reachable +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Alarm ] Assertion (file tests/report/single.i, line 9) + By Test, with pending: + - Unreachable program point (file tests/report/single.i, line 9) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Alarm emitted + 1 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS TO false_and_reachable +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/single.i, line 9) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Bugs found + 1 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/report/tests/report/oracle/single.2.res.oracle frama-c-20150201+sodium+dfsg/src/report/tests/report/oracle/single.2.res.oracle --- frama-c-20140301+neon+dfsg/src/report/tests/report/oracle/single.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/tests/report/oracle/single.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,149 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/report/single.i (no preprocessing) +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 0 Total +-------------------------------------------------------------------------------- +[kernel] Test1 SET STATUS TO unknown +[kernel] Test2 SET STATUS TO unknown +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/single.i, line 9) + tried with Test2, Test1. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 To be validated + 1 Total +-------------------------------------------------------------------------------- +[kernel] Test1 SET STATUS TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/single.i, line 9) + by Test1. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Total +-------------------------------------------------------------------------------- +[kernel] Test2 SET STATUS TO VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/report/single.i, line 9) + by Test1. + by Test2. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] Test1 SET STATUS TO unknown +[kernel] Test2 SET STATUS TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Alarm ] Assertion (file tests/report/single.i, line 9) + By Test2, with pending: + - Unreachable program point (file tests/report/single.i, line 9) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Alarm emitted + 1 Total +-------------------------------------------------------------------------------- +[kernel] Test2 SET STATUS TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/single.i, line 9) + by Test2. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Bugs found + 1 Total +-------------------------------------------------------------------------------- +[kernel] CLEARING +[kernel] Test1 SET STATUS TO **NOT** VALID +[kernel] Test2 SET STATUS TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Alarm ] Assertion (file tests/report/single.i, line 9) + By Test1, with pending: + - Unreachable program point (file tests/report/single.i, line 9) + By Test2, with pending: + - Unreachable program point (file tests/report/single.i, line 9) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Alarm emitted + 1 Total +-------------------------------------------------------------------------------- +[kernel] Test1 SET STATUS TO **NOT** VALID +[kernel] Test2 SET STATUS TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/single.i, line 9) + by Test2. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Bugs found + 1 Total +-------------------------------------------------------------------------------- +[kernel] Test1 SET STATUS TO **NOT** VALID +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/single.i, line 9) + by Test1. + by Test2. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Bugs found + 1 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/report/tests/report/oracle/single.res.oracle frama-c-20150201+sodium+dfsg/src/report/tests/report/oracle/single.res.oracle --- frama-c-20140301+neon+dfsg/src/report/tests/report/oracle/single.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/tests/report/oracle/single.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,147 @@ +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/report/single.i (no preprocessing) +[kernel] SETTING STATUS TO unknown IN p +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/single.i, line 9) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 To be validated + 1 Total +-------------------------------------------------------------------------------- +[kernel] CHANGING DEFAULT PROJECT TO p' +[kernel] GOING BACK TO PROJECT p +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/single.i, line 9) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 To be validated + 1 Total +-------------------------------------------------------------------------------- +[kernel] CREATING p2 by COPYING p +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/single.i, line 9) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 To be validated + 1 Total +-------------------------------------------------------------------------------- +[kernel] CHANGING DEFAULT PROJECT TO p2 +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 0 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS TO false_and_reachable +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Bug ] Assertion (file tests/report/single.i, line 9) + by Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Bugs found + 1 Total +-------------------------------------------------------------------------------- +[kernel] CHANGING DEFAULT PROJECT TO p +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/single.i, line 9) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 To be validated + 1 Total +-------------------------------------------------------------------------------- +[kernel] SETTING A CORRECTNESS PARAMETER +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 0 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS TO unknown IN p +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/single.i, line 9) + tried with Test. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 To be validated + 1 Total +-------------------------------------------------------------------------------- +[kernel] SETTING A TUNING PARAMETER +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/single.i, line 9) + tried with Test (v1). + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 To be validated + 1 Total +-------------------------------------------------------------------------------- +[kernel] SETTING STATUS TO unknown IN p +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/report/single.i, line 9) + tried with Test (v2), Test (v1). + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 To be validated + 1 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/report/tests/report/projectified_status.ml frama-c-20150201+sodium+dfsg/src/report/tests/report/projectified_status.ml --- frama-c-20140301+neon+dfsg/src/report/tests/report/projectified_status.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/tests/report/projectified_status.ml 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,60 @@ +open Cil_types + +let emitter = + Emitter.create + "Test" + [ Emitter.Property_status ] + ~correctness:[ Kernel.LibEntry.parameter ] + ~tuning:[ Kernel.SafeArrays.parameter ] + +let set_status s = + Annotations.iter_all_code_annot + (fun stmt _ ca -> + let kf = Kernel_function.find_englobing_kf stmt in + let ps = Property.ip_of_code_annot kf stmt ca in + List.iter (fun p -> Property_status.emit emitter p ~hyps:[] s) ps) + +let print_status = + Dynamic.get + ~plugin:"Report" + "print" + (Datatype.func Datatype.unit Datatype.unit) + +let main () = + Ast.compute (); + Kernel.feedback "SETTING STATUS TO unknown IN p"; + set_status Property_status.Dont_know; + print_status (); + let p' = Project.create "foobar" in + Kernel.feedback "CHANGING DEFAULT PROJECT TO p'"; + Project.on p' (fun () -> ()) (); + Project.remove ~project:p' (); + Kernel.feedback "GOING BACK TO PROJECT p"; + print_status (); + let p = Project.current () in + Kernel.feedback "CREATING p2 by COPYING p"; + let p2 = File.create_project_from_visitor "p2" (new Visitor.frama_c_copy) in + print_status (); + Kernel.feedback "CHANGING DEFAULT PROJECT TO p2"; + Project.set_current p2; + print_status (); + Kernel.feedback "SETTING STATUS TO false_and_reachable"; + set_status Property_status.False_and_reachable; + print_status (); + Kernel.feedback "CHANGING DEFAULT PROJECT TO p"; + Project.set_current p; + print_status (); + Kernel.feedback "SETTING A CORRECTNESS PARAMETER"; + Kernel.LibEntry.on (); + print_status (); + Kernel.feedback "SETTING STATUS TO unknown IN p"; + set_status Property_status.Dont_know; + print_status (); + Kernel.feedback "SETTING A TUNING PARAMETER"; + Kernel.SafeArrays.off (); + print_status (); + Kernel.feedback "SETTING STATUS TO unknown IN p"; + set_status Property_status.Dont_know; + print_status () + +let () = Db.Main.extend main diff -Nru frama-c-20140301+neon+dfsg/src/report/tests/report/several_hyps.ml frama-c-20150201+sodium+dfsg/src/report/tests/report/several_hyps.ml --- frama-c-20140301+neon+dfsg/src/report/tests/report/several_hyps.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/tests/report/several_hyps.ml 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,207 @@ +open Cil_types + +let emitter = + Emitter.create "Test" [ Emitter.Property_status ] ~correctness:[] ~tuning:[] + +let emitter2 = + Emitter.create "Test2" [ Emitter.Property_status ] ~correctness:[] ~tuning:[] + +let set_status ?(emitter=emitter) p hyps s = + Kernel.feedback "SETTING STATUS OF %a TO %a" + Property.pretty p + Property_status.Emitted_status.pretty s; + Property_status.emit emitter p ~hyps s + +let print_status = + Dynamic.get + ~plugin:"Report" + "print" + (Datatype.func Datatype.unit Datatype.unit) + +let clear () = + Kernel.feedback "CLEARING"; + Project.clear + ~selection:(State_selection.Static.with_dependencies Property_status.self) + () + +let main () = + Ast.compute (); + print_status (); + let main, j, i, h, g = + let l = + Annotations.fold_all_code_annot + (fun stmt _ ca acc -> + let kf = Kernel_function.find_englobing_kf stmt in + let ps = Property.ip_of_code_annot kf stmt ca in + match ps with + | [ p ] -> p :: acc + | _ -> assert false) + [] + in + match l with + | [ p1; p2; p3; p4; p5 ] -> p1, p2, p3, p4, p5 + | _ -> assert false + in + let hyps = [ g; h ] in + let ensures = + let kf = Globals.Functions.find_by_name "f" in + let spec = Annotations.funspec kf in + Property.ip_post_cond_of_spec kf Kglobal spec + in + let ensures2 = + let kf = Globals.Functions.find_by_name "f2" in + let spec = Annotations.funspec kf in + Property.ip_post_cond_of_spec kf Kglobal spec + in + let reset f = + clear (); + f () + in + let test msg ?(hyps=hyps) set_status_hyps = + Kernel.feedback msg; + reset set_status_hyps; + (* unknown *) + set_status main hyps Property_status.Dont_know; + print_status (); + (* true *) + set_status main hyps Property_status.True; + print_status (); + reset set_status_hyps; + (* false *) + set_status main [] Property_status.False_and_reachable; + print_status () + in + let nothing () = () in + let valid ?(g=g) ?(i=i) () = + let _i = i in set_status g [] Property_status.True + in + let valid_under_hyp ?(g=g) ?(i=i) () = + set_status g [ i ] Property_status.True in + let unknown ?(g=g) ?(i=i) () = + let _i = i in set_status g [] Property_status.Dont_know + in + let invalid ?(g=g) ?(i=i) () = + let _i = i in set_status g [] Property_status.False_and_reachable + in + let invalid_under_hyp ?(g=g) ?(i=i) () = + set_status g [ ] Property_status.False_and_reachable + in + let invalid_but_dead ?(g=g) ?(i=i) () = + set_status i [] Property_status.False_and_reachable; + set_status g [ ] Property_status.False_and_reachable + in + let valid_but_dead ?(g=g) ?(i=i) () = + set_status i [] Property_status.False_and_reachable; + set_status g [ ] Property_status.True + in + let unknown_but_dead ?(g=g) ?(i=i) () = + set_status i [] Property_status.False_and_reachable; + set_status g [ i ] Property_status.Dont_know + in + let inconsistent ?(g=g) ?(i=i) () = + let _i = i in + set_status g [ ] Property_status.True; + set_status ~emitter:emitter2 g [] Property_status.False_and_reachable + in + (***************************************************************************) + test "NEVER_TRIED + NEVER_TRIED" nothing; + test "NEVER_TRIED + CONSIDERED_VALID" ~hyps:(g :: ensures) nothing; + test "NEVER_TRIED + VALID" valid; + test "NEVER_TRIED + VALID_UNDER_HYP" valid_under_hyp; + test "NEVER_TRIED + UNKNOWN" unknown; + test "NEVER_TRIED + INVALID" invalid; + test "NEVER_TRIED + INVALID_UNDER_HYP" invalid_under_hyp; + test "NEVER_TRIED + INVALID_BUT_DEAD" invalid_but_dead; + test "NEVER_TRIED + VALID_BUT_DEAD" valid_but_dead; + test "NEVER_TRIED + UNKNOWN_BUT_DEAD" unknown_but_dead; + test "NEVER_TRIED + INCONSISTENT" inconsistent; + (***************************************************************************) + test "CONSIDERED_VALID + CONSIDERED_VALID" ~hyps:(ensures @ ensures2) nothing; + let hyps = g :: ensures in + test "CONSIDERED_VALID + VALID" ~hyps valid; + test "CONSIDERED_VALID + VALID_UNDER_HYP" ~hyps valid_under_hyp; + test "CONSIDERED_VALID + UNKNOWN" ~hyps unknown; + test "CONSIDERED_VALID + INVALID" ~hyps invalid; + test "CONSIDERED_VALID + INVALID_UNDER_HYP" ~hyps invalid_under_hyp; + test "CONSIDERED_VALID + INVALID_BUT_DEAD" ~hyps invalid_but_dead; + test "CONSIDERED_VALID + VALID_BUT_DEAD" ~hyps valid_but_dead; + test "CONSIDERED_VALID + UNKNOWN_BUT_DEAD" ~hyps unknown_but_dead; + test "CONSIDERED_VALID + INCONSISTENT" ~hyps inconsistent; + (***************************************************************************) + let set status_g status_h () = +(* (status_h: ?g:Property.t -> ?i:Property.t -> unit -> unit) () =*) + status_g (); +(* status_h ~g:h ~i:j ()*) + status_h ?g:(Some h) ?i:(Some j) () + in + test "VALID + VALID" (set valid valid); + test "VALID + VALID_UNDER_HYP" (set valid valid_under_hyp); + test "VALID + UNKNOWN" (set valid unknown); + test "VALID + INVALID" (set valid invalid); + test "VALID + INVALID_UNDER_HYP" (set valid invalid_under_hyp); + test "VALID + INVALID_BUT_DEAD" (set valid invalid_but_dead); + test "VALID + VALID_BUT_DEAD" (set valid valid_but_dead); + test "VALID + UNKNOWN_BUT_DEAD" (set valid unknown_but_dead); + test "VALID + INCONSISTENT" (set valid inconsistent); + (***************************************************************************) + test "VALID_UNDER_HYP + VALID_UNDER_HYP" + (set valid_under_hyp valid_under_hyp); + test "VALID_UNDER_HYP + UNKNOWN" (set valid_under_hyp unknown); + test "VALID_UNDER_HYP + INVALID" (set valid_under_hyp invalid); + test "VALID_UNDER_HYP + INVALID_UNDER_HYP" + (set valid_under_hyp invalid_under_hyp); + test "VALID_UNDER_HYP + INVALID_BUT_DEAD" + (set valid_under_hyp invalid_but_dead); + test "VALID_UNDER_HYP + VALID_BUT_DEAD" (set valid_under_hyp valid_but_dead); + test "VALID_UNDER_HYP + UNKNOWN_BUT_DEAD" + (set valid_under_hyp unknown_but_dead); + test "VALID_UNDER_HYP + INCONSISTENT" (set valid_under_hyp inconsistent); + (***************************************************************************) + test "UNKNOWN + UNKNOWN" (set unknown unknown); + test "UNKNOWN + INVALID" (set unknown invalid); + test "UNKNOWN + INVALID_UNDER_HYP" (set unknown invalid_under_hyp); + test "UNKNOWN + INVALID_BUT_DEAD" (set unknown invalid_but_dead); + test "UNKNOWN + VALID_BUT_DEAD" (set unknown valid_but_dead); + test "UNKNOWN + UNKNOWN_BUT_DEAD" (set unknown unknown_but_dead); + test "UNKNOWN + INCONSISTENT" (set unknown inconsistent); + (***************************************************************************) + test "INVALID + INVALID" (set invalid invalid); + test "INVALID + INVALID_UNDER_HYP" (set invalid invalid_under_hyp); + test "INVALID + INVALID_BUT_DEAD" (set invalid invalid_but_dead); + test "INVALID + VALID_BUT_DEAD" (set invalid valid_but_dead); + test "INVALID + UNKNOWN_BUT_DEAD" (set invalid unknown_but_dead); + test "INVALID + INCONSISTENT" (set invalid inconsistent); + (***************************************************************************) + test "INVALID_UNDER_HYP + INVALID_UNDER_HYP" + (set invalid_under_hyp invalid_under_hyp); + test "INVALID_UNDER_HYP + INVALID_BUT_DEAD" + (set invalid_under_hyp invalid_but_dead); + test "INVALID_UNDER_HYP + VALID_BUT_DEAD" + (set invalid_under_hyp valid_but_dead); + test "INVALID_UNDER_HYP + UNKNOWN_BUT_DEAD" + (set invalid_under_hyp unknown_but_dead); + test "INVALID_UNDER_HYP + INCONSISTENT" + (set invalid_under_hyp inconsistent); + (***************************************************************************) + test "INVALID_BUT_DEAD + INVALID_BUT_DEAD" + (set invalid_but_dead invalid_but_dead); + test "INVALID_BUT_DEAD + VALID_BUT_DEAD" + (set invalid_but_dead valid_but_dead); + test "INVALID_BUT_DEAD + UNKNOWN_BUT_DEAD" + (set invalid_but_dead unknown_but_dead); + test "INVALID_BUT_DEAD + INCONSISTENT" + (set invalid_but_dead inconsistent); + (***************************************************************************) + test "VALID_BUT_DEAD + VALID_BUT_DEAD" (set valid_but_dead valid_but_dead); + test "VALID_BUT_DEAD + UNKNOWN_BUT_DEAD" + (set valid_but_dead unknown_but_dead); + test "VALID_BUT_DEAD + INCONSISTENT" (set valid_but_dead inconsistent); + (***************************************************************************) + test "UNKNOWN_BUT_DEAD + UNKNOWN_BUT_DEAD" + (set unknown_but_dead unknown_but_dead); + test "UNKNOWN_BUT_DEAD + INCONSISTENT" (set unknown_but_dead inconsistent); + (***************************************************************************) + test "INCONSISTENT + INCONSISTENT" (set inconsistent inconsistent) + +let () = Db.Main.extend main + diff -Nru frama-c-20140301+neon+dfsg/src/report/tests/report/single.i frama-c-20150201+sodium+dfsg/src/report/tests/report/single.i --- frama-c-20140301+neon+dfsg/src/report/tests/report/single.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/report/tests/report/single.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,10 @@ +/* run.config + OPT: -load-script tests/report/projectified_status.ml + OPT: -load-script tests/report/no_hyp.ml + OPT: -load-script tests/report/multi_emitters.ml +*/ + +void main() { + int x = 1; + /*@ assert \true; */ +} diff -Nru frama-c-20140301+neon+dfsg/src/rte/generator.ml frama-c-20150201+sodium+dfsg/src/rte/generator.ml --- frama-c-20140301+neon+dfsg/src/rte/generator.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/rte/generator.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/rte/generator.mli frama-c-20150201+sodium+dfsg/src/rte/generator.mli --- frama-c-20140301+neon+dfsg/src/rte/generator.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/rte/generator.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/rte/options.ml frama-c-20150201+sodium+dfsg/src/rte/options.ml --- frama-c-20140301+neon+dfsg/src/rte/options.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/rte/options.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -25,7 +25,7 @@ include Plugin.Register (struct - let name = "rte annotation" + let name = "rtegen" let shortname = "rte" let help = help_msg end) @@ -129,7 +129,7 @@ the plug-in performs its jobs (and only those). By default all functions are annotated *) module FunctionSelection = - StringSet + Kernel_function_set (struct let option_name = "-rte-select" let arg_name = "fun" diff -Nru frama-c-20140301+neon+dfsg/src/rte/options.mli frama-c-20150201+sodium+dfsg/src/rte/options.mli --- frama-c-20140301+neon+dfsg/src/rte/options.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/rte/options.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -33,7 +33,7 @@ module Trivial : Parameter_sig.Bool module Warn : Parameter_sig.Bool -module FunctionSelection : Parameter_sig.String_set +module FunctionSelection: Parameter_sig.Kernel_function_set val warn: ?source:Lexing.position -> ('a, Format.formatter, unit) format -> 'a diff -Nru frama-c-20140301+neon+dfsg/src/rte/register.ml frama-c-20150201+sodium+dfsg/src/rte/register.ml --- frama-c-20140301+neon+dfsg/src/rte/register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/rte/register.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/rte/RteGen.mli frama-c-20150201+sodium+dfsg/src/rte/RteGen.mli --- frama-c-20140301+neon+dfsg/src/rte/RteGen.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/rte/RteGen.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/rte/rte.ml frama-c-20150201+sodium+dfsg/src/rte/rte.ml --- frama-c-20140301+neon+dfsg/src/rte/rte.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/rte/rte.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -50,19 +50,7 @@ (* Tries to evaluate expr as a constant value (Int64.t). Uses Cil constant folding (e.g. for (-0x7ffffff -1) => Some (-2147483648)) on 32 bits *) -let get_expr_val expr = - let cexpr = Cil.constFold true expr in - match cexpr.enode with - | Const c -> - let rec get_constant_expr_val e = - match e with - | CChr c -> get_constant_expr_val (Cil.charConstToInt c) - | CInt64 (d64,_,_) -> Some d64 - | _ -> None - in - get_constant_expr_val c - | _ -> - None +let get_expr_val expr = Cil.constFoldToInt expr (* Creates [0 <= e] and [e < size] assertions *) let valid_index ~remove_trivial kf kinstr e size = @@ -535,10 +523,14 @@ local_printer#code_annotation a; true) else false - with Floating_point.Float_Non_representable_as_Int64 -> - (* One of the alarms is False, but which one? ... *) - full_alarms (); - true + with Floating_point.Float_Non_representable_as_Int64 sign -> + match sign with + | Floating_point.Neg -> + ignore (alarms Alarms.Lower_bound); + true + | Floating_point.Pos -> + ignore (alarms Alarms.Upper_bound); + true end | _ -> full_alarms (); diff -Nru frama-c-20140301+neon+dfsg/src/rte/rte.mli frama-c-20150201+sodium+dfsg/src/rte/rte.mli --- frama-c-20140301+neon+dfsg/src/rte/rte.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/rte/rte.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/rte/visit.ml frama-c-20150201+sodium+dfsg/src/rte/visit.ml --- frama-c-20140301+neon+dfsg/src/rte/visit.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/rte/visit.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -920,15 +920,11 @@ Ast.compute () ; let include_function kf = let fsel = Options.FunctionSelection.get () in - Datatype.String.Set.is_empty fsel - || - let name = Kernel_function.get_name kf in - Datatype.String.Set.mem name fsel + Kernel_function.Set.is_empty fsel + || Kernel_function.Set.mem kf fsel in Globals.Functions.iter - (fun kf -> - if include_function kf && Kernel_function.is_definition kf then - !Db.RteGen.annotate_kf kf) + (fun kf -> if include_function kf then !Db.RteGen.annotate_kf kf) (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/rte/visit.mli frama-c-20150201+sodium+dfsg/src/rte/visit.mli --- frama-c-20140301+neon+dfsg/src/rte/visit.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/rte/visit.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/scope/datascope.ml frama-c-20150201+sodium+dfsg/src/scope/datascope.ml --- frama-c-20140301+neon+dfsg/src/scope/datascope.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/scope/datascope.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -56,8 +56,7 @@ include Abstract_interp.Make_Hashconsed_Lattice_Set(StmtDefault)(Cil_datatype.Stmt.Hptset) - let default _v _a _b : t = empty - let defaultall _v : t = empty + let default: t = empty let empty = bottom let cardinal set = fold (fun _ n -> n+1) set 0 @@ -80,8 +79,7 @@ let add_zone ~exact lmap zone sid = let new_val = StmtSetLattice.single sid in - let lmap = LM.add_binding exact lmap zone new_val in - lmap + LM.add_binding ~reducing:false ~exact lmap zone new_val let test_and_merge old_lmap new_lmap = let new_lmap = LM.join old_lmap new_lmap in @@ -307,16 +305,18 @@ include State;; let transfer_stmt s state = - let map_on_all_succs new_state = List.map (fun x -> (x,new_state)) s.succs in + let map_on_all_succs new_state = + List.map (fun x -> (x,new_state)) s.succs + in match s.skind with | Instr _ -> map_on_all_succs (State.transfer (X.modified s) state) | If _ | Switch _ -> map_on_all_succs (State.transfer false state) - | Return _ -> [] + | Return _ | Throw _ -> [] | UnspecifiedSequence _ | Loop _ | Block _ | Goto _ | Break _ | Continue _ - | TryExcept _ | TryFinally _ + | TryExcept _ | TryFinally _ | TryCatch _ -> map_on_all_succs state ;; @@ -342,10 +342,10 @@ let add_s s acc = (* we add only 'simple' statements *) match s.skind with - | Instr _ | Return _ | Continue _ | Break _ | Goto _ + | Instr _ | Return _ | Continue _ | Break _ | Goto _ | Throw _ -> Cil_datatype.Stmt.Hptset.add s acc | Block _ | Switch _ | If _ | UnspecifiedSequence _ | Loop _ - | TryExcept _ | TryFinally _ + | TryExcept _ | TryFinally _ | TryCatch _ -> acc (** Do backward and then forward propagations and compute the 3 statement sets : @@ -572,8 +572,8 @@ else (* is to be removed *) match annot.annot_content with | AAssert (_, p) -> - R.result ~dkey:cat_rm_asserts ~level:2 - "removing redundant %a@." Printer.pp_code_annotation annot; + R.result ~current:true ~dkey:cat_rm_asserts ~level:2 + "@[removing redundant@ %a@]" Printer.pp_code_annotation annot; let p = { p with content = Ptrue } in let aassert = AAssert ([], p) in let annot = { annot with annot_content = aassert } in diff -Nru frama-c-20140301+neon+dfsg/src/scope/defs.ml frama-c-20150201+sodium+dfsg/src/scope/defs.ml --- frama-c-20140301+neon+dfsg/src/scope/defs.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/scope/defs.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/scope/defs.mli frama-c-20150201+sodium+dfsg/src/scope/defs.mli --- frama-c-20140301+neon+dfsg/src/scope/defs.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/scope/defs.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/scope/dpds_gui.ml frama-c-20150201+sodium+dfsg/src/scope/dpds_gui.ml --- frama-c-20140301+neon+dfsg/src/scope/dpds_gui.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/scope/dpds_gui.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -42,7 +42,7 @@ let empty_tag = ("", []) let add_msg (main_ui:Design.main_window_extension_points) txt = - main_ui#annot_window#buffer#insert (txt ^ "\n") + main_ui#pretty_information "%s@." txt let pretty_zone fmt z = Format.fprintf fmt "@[%a@]" Locations.Zone.pretty z @@ -94,7 +94,7 @@ (struct let name = "Dpds_gui.Kf_containing_highlighted_stmt" let size = 7 - let dependencies = + let dependencies = [ (*Dependencies are managed manually by Make_StmtSetState*) ] end) @@ -109,13 +109,13 @@ let dependencies = [ Db.Value.self ] let default () = Stmt.Hptset.empty end) - - let set s = + + let set s = set s; Kf_containing_highlighted_stmt.clear (); - Stmt.Hptset.iter - (fun stmt -> - Kf_containing_highlighted_stmt.replace + Stmt.Hptset.iter + (fun stmt -> + Kf_containing_highlighted_stmt.replace (Kernel_function.find_englobing_kf stmt) default_icon) s; !update_column `Contents @@ -318,12 +318,12 @@ let name = "Dpds_gui.Highlighter.ZonesState" let dependencies = [ Db.Value.self ] end) - let set s = + let set s = set s; Kf_containing_highlighted_stmt.clear (); - Stmt.Hptset.iter - (fun stmt -> - Kf_containing_highlighted_stmt.replace + Stmt.Hptset.iter + (fun stmt -> + Kf_containing_highlighted_stmt.replace (Kernel_function.find_englobing_kf stmt) default_icon) (snd s); !update_column `Contents @@ -400,10 +400,13 @@ let callbacks ?(defs=false) ?(zones=false) ?(scope=false) ?(pscope=false) main_ui (kf, stmt, localizable) = + (* The messages printed here are (1) not really informative; (2) too short + lived: after the 'information' panel has been cleared, they are never + printed again. (And if the filetree filter is active, they are cleared just + after having been written.) Because of (1), no effort has been made to + correct (2). *) let compute f arg = - let msg = f kf stmt arg in - if msg <> "" then add_msg main_ui msg in let set_txt x = @@ -414,7 +417,7 @@ DpdsState.set stmt; add_msg main_ui txt in - let _ = + begin if pscope then begin reset (); match get_annot_opt localizable with @@ -437,7 +440,8 @@ if scope then compute DataScope.compute lval else DataScope.clear () end end - in main_ui#rehighlight () + end; + main_ui#rehighlight () let highlighter (buffer:GSourceView2.source_buffer) localizable ~start ~stop = try @@ -454,7 +458,7 @@ put_tag (ShowDef.tag_stmt stmt) | PIP (Property.IPCodeAnnot (_, _, annot)) -> put_tag (Pscope.tag_annot annot) - | PVDecl _ | PTermLval _ | PLval _ | PGlobal _ | PIP _ -> () + | PExp _ | PVDecl _ | PTermLval _ | PLval _ | PGlobal _ | PIP _ -> () with Not_found -> () let check_value (main_ui:Design.main_window_extension_points) = @@ -464,11 +468,13 @@ ~title:("Need Value Analysis") ~buttons:[ "Run"; "Cancel" ] ("Value analysis has to be run first.\nThis can take some time.\n" - ^"Do you want to run the value analysis now ?") + ^"Do you want to run the Value analysis with its current settings now?") in if answer = 1 then match main_ui#full_protect ~cancelable:true !Db.Value.compute with - | Some _ -> true + | Some _ -> + main_ui#redisplay (); (* New alarms *) + true | None -> false else false @@ -529,7 +535,7 @@ (fun _ -> reset () ; main_ui#rehighlight ()) end -let filetree_decorate main_ui = +let filetree_decorate main_ui = main_ui#file_tree#append_pixbuf_column ~title:"Scope" (fun globs -> @@ -561,10 +567,10 @@ List.map (fun icon -> `STOCK_ID icon) icons ) (fun _ -> Kf_containing_highlighted_stmt.length () <>0) - + let main main_ui = main_ui#register_source_selector selector; main_ui#register_source_highlighter highlighter; update_column := (filetree_decorate main_ui) - + let () = Design.register_extension main diff -Nru frama-c-20140301+neon+dfsg/src/scope/Scope.mli frama-c-20150201+sodium+dfsg/src/scope/Scope.mli --- frama-c-20140301+neon+dfsg/src/scope/Scope.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/scope/Scope.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/scope/zones.ml frama-c-20150201+sodium+dfsg/src/scope/zones.ml --- frama-c-20140301+neon+dfsg/src/scope/zones.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/scope/zones.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -68,7 +68,7 @@ | None -> false, data | Some lval -> let ret_dpds = froms.Function_Froms.deps_return in - let r_dpds = Function_Froms.Memory.LOffset.collapse ret_dpds in + let r_dpds = Function_Froms.Memory.collapse_return ret_dpds in let r_dpds = Function_Froms.Deps.to_zone r_dpds in let l_dpds, exact, l_zone = Datascope.get_lval_zones ~for_writing:true stmt lval in @@ -81,8 +81,9 @@ * modified for sure. *) let process_froms data_after froms = let from_table = froms.Function_Froms.deps_table in - let process_out_call out (default, deps) (to_prop, used, new_data) = - let out_dpds = Function_Froms.Deps.to_zone deps in + let process_out_call out deps (to_prop, used, new_data) = + let out_dpds = Function_Froms.DepsOrUnassigned.to_zone deps in + let default = Function_Froms.DepsOrUnassigned.may_be_unassigned deps in let exact = not default in (* be careful to compare out with data_after and not new_data *) if (Data.intersects data_after out) then @@ -99,11 +100,13 @@ let new_data = Data.bottom in (* add out_dpds when out intersects data_after*) let used = false in (* is the call needed ? *) let to_prop, used, new_data = - try Function_Froms.Memory.fold process_out_call from_table - (to_prop, used, new_data) - with Function_Froms.Memory.Cannot_fold -> - process_out_call Locations.Zone.top (false, Function_Froms.Deps.top) - (to_prop, used, new_data) + match from_table with + | Function_Froms.Memory.Bottom -> to_prop, used, new_data + | Function_Froms.Memory.Top -> + let v = Function_Froms.DepsOrUnassigned.top in + process_out_call Locations.Zone.top v (to_prop, used, new_data) + | Function_Froms.Memory.Map m -> + Function_Froms.Memory.fold process_out_call m (to_prop, used, new_data) in let data = Data.merge to_prop new_data in (used, data) diff -Nru frama-c-20140301+neon+dfsg/src/scope/zones.mli frama-c-20150201+sodium+dfsg/src/scope/zones.mli --- frama-c-20140301+neon+dfsg/src/scope/zones.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/scope/zones.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/security_slicing/components.ml frama-c-20150201+sodium+dfsg/src/security_slicing/components.ml --- frama-c-20140301+neon+dfsg/src/security_slicing/components.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/security_slicing/components.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/security_slicing/components.mli frama-c-20150201+sodium+dfsg/src/security_slicing/components.mli --- frama-c-20140301+neon+dfsg/src/security_slicing/components.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/security_slicing/components.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/security_slicing/configure frama-c-20150201+sodium+dfsg/src/security_slicing/configure --- frama-c-20140301+neon+dfsg/src/security_slicing/configure 2014-03-12 15:07:57.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/security_slicing/configure 2015-06-01 13:17:44.000000000 +0000 @@ -1795,6 +1795,13 @@ + +# Usage: plugin_disable([plugin],[reason]) + + + + + # Implementation of an ordering $1 < $2: "" < yes < partial < no lt_mark () { first=`echo "$1" | sed -e 's/ .*//' ` @@ -2129,7 +2136,6 @@ -if test "$ENABLE_SECURITY_SLICING" != "no"; then @@ -2188,7 +2194,6 @@ # main call compute_dependency -fi diff -Nru frama-c-20140301+neon+dfsg/src/security_slicing/configure.ac frama-c-20150201+sodium+dfsg/src/security_slicing/configure.ac --- frama-c-20140301+neon+dfsg/src/security_slicing/configure.ac 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/security_slicing/configure.ac 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # @@ -34,12 +34,10 @@ check_plugin(security_slicing,PLUGIN_RELATIVE_PATH(plugin_file), [support for Security_slicing plug-in],yes,yes) -if test "$ENABLE_SECURITY_SLICING" != "no"; then - plugin_require(security_slicing,slicing) - plugin_require(security_slicing,value_analysis) - plugin_require(security_slicing,pdg) - plugin_require(security_slicing,gui) - check_plugin_dependencies -fi +plugin_require(security_slicing,slicing) +plugin_require(security_slicing,value_analysis) +plugin_require(security_slicing,pdg) +plugin_require(security_slicing,gui) +check_plugin_dependencies write_plugin_config(Makefile) diff -Nru frama-c-20140301+neon+dfsg/src/security_slicing/Makefile.in frama-c-20150201+sodium+dfsg/src/security_slicing/Makefile.in --- frama-c-20140301+neon+dfsg/src/security_slicing/Makefile.in 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/security_slicing/Makefile.in 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat à l'énergie atomique et aux énergies # # alternatives) # # # @@ -52,4 +52,4 @@ $(Security_slicing_DIR)/Makefile: $(Security_slicing_DIR)/Makefile.in \ $(CONFIG_STATUS_DIR)/config.status - cd $(CONFIG_STATUS_DIR) && ./config.status + cd $(CONFIG_STATUS_DIR) && ./config.status --file $@ diff -Nru frama-c-20140301+neon+dfsg/src/security_slicing/register_gui.ml frama-c-20150201+sodium+dfsg/src/security_slicing/register_gui.ml --- frama-c-20140301+neon+dfsg/src/security_slicing/register_gui.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/security_slicing/register_gui.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -56,7 +56,7 @@ if List.exists (fun k -> k.sid=s.sid) d then begin let tag = make_tag buffer"direct" [`BACKGROUND "green" ] in apply_tag buffer tag start stop end - | PVDecl _ | PTermLval _ | PLval _ | PGlobal _ | PIP _ -> () + | PExp _ | PVDecl _ | PTermLval _ | PLval _ | PGlobal _ | PIP _ -> () let security_selector (popup_factory:GMenu.menu GMenu.factory) main_ui ~button localizable = diff -Nru frama-c-20140301+neon+dfsg/src/security_slicing/register_gui.mli frama-c-20150201+sodium+dfsg/src/security_slicing/register_gui.mli --- frama-c-20140301+neon+dfsg/src/security_slicing/register_gui.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/security_slicing/register_gui.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/security_slicing/Security_slicing.mli frama-c-20150201+sodium+dfsg/src/security_slicing/Security_slicing.mli --- frama-c-20140301+neon+dfsg/src/security_slicing/Security_slicing.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/security_slicing/Security_slicing.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/security_slicing/security_slicing_parameters.ml frama-c-20150201+sodium+dfsg/src/security_slicing/security_slicing_parameters.ml --- frama-c-20140301+neon+dfsg/src/security_slicing/security_slicing_parameters.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/security_slicing/security_slicing_parameters.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,13 +20,12 @@ (* *) (**************************************************************************) -module P = Plugin.Register +include Plugin.Register (struct let name = "security-slicing" let shortname = "security-slicing" let help = "security slicing (experimental, undocumented)" end) -include P module Slicing = False diff -Nru frama-c-20140301+neon+dfsg/src/security_slicing/security_slicing_parameters.mli frama-c-20150201+sodium+dfsg/src/security_slicing/security_slicing_parameters.mli --- frama-c-20140301+neon+dfsg/src/security_slicing/security_slicing_parameters.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/security_slicing/security_slicing_parameters.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/semantic_callgraph/options.ml frama-c-20150201+sodium+dfsg/src/semantic_callgraph/options.ml --- frama-c-20140301+neon+dfsg/src/semantic_callgraph/options.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/semantic_callgraph/options.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -31,7 +31,7 @@ end) module Filename = - EmptyString + Empty_string (struct let option_name = "-scg" let arg_name = "filename" @@ -40,7 +40,7 @@ end) module InitFunc = - StringSet + Kernel_function_set (struct let option_name = "-scg-init-func" let arg_name = "" diff -Nru frama-c-20140301+neon+dfsg/src/semantic_callgraph/options.mli frama-c-20150201+sodium+dfsg/src/semantic_callgraph/options.mli --- frama-c-20140301+neon+dfsg/src/semantic_callgraph/options.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/semantic_callgraph/options.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -24,7 +24,7 @@ val name: string module Filename: Parameter_sig.String -module InitFunc: Parameter_sig.String_set +module InitFunc: Parameter_sig.Kernel_function_set (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/semantic_callgraph/register.ml frama-c-20150201+sodium+dfsg/src/semantic_callgraph/register.ml --- frama-c-20140301+neon+dfsg/src/semantic_callgraph/register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/semantic_callgraph/register.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -102,8 +102,8 @@ let name = Kernel_function.get_name let attributes v = [ `Style - [if Kernel_function.is_definition v then `Bold - else `Dotted] ] + (if Kernel_function.is_definition v then `Bold + else `Dotted) ] let entry_point () = try Some (fst (Globals.entry_point ())) with Globals.No_such_entry_point _ -> None @@ -126,19 +126,18 @@ let get_init_funcs () = let init_funcs = InitFunc.get () in try - let callees = - let kf, _ = Globals.entry_point () in - !Db.Users.get kf - in + let kf_main, _ = Globals.entry_point () in + let callees = !Db.Users.get kf_main in (** add the entry point as root *) - let init_funcs = - Datatype.String.Set.add (Kernel.MainFunction.get ()) init_funcs - in + let init_funcs = Kernel_function.Set.add kf_main init_funcs in (* add the callees of entry point as roots *) - Kernel_function.Hptset.fold + let kfs = + Kernel_function.Hptset.fold Kernel_function.Set.add callees init_funcs + in + Kernel_function.Set.fold (fun kf acc -> Datatype.String.Set.add (Kernel_function.get_name kf) acc) - callees - init_funcs + kfs + Datatype.String.Set.empty with Globals.No_such_entry_point _ -> (* always an entry point for the semantic callgraph since value analysis has been computed. *) diff -Nru frama-c-20140301+neon+dfsg/src/semantic_callgraph/Semantic_callgraph.mli frama-c-20150201+sodium+dfsg/src/semantic_callgraph/Semantic_callgraph.mli --- frama-c-20140301+neon+dfsg/src/semantic_callgraph/Semantic_callgraph.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/semantic_callgraph/Semantic_callgraph.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing/fct_slice.ml frama-c-20150201+sodium+dfsg/src/slicing/fct_slice.ml --- frama-c-20140301+neon+dfsg/src/slicing/fct_slice.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/fct_slice.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -953,7 +953,7 @@ let in_zones = if need_out0 then let from0 = froms.Function_Froms.deps_return in - let z_return = Function_Froms.Memory.LOffset.collapse from0 in + let z_return = Function_Froms.Memory.collapse_return from0 in Locations.Zone.join in_zones z_return else in_zones in in_zones @@ -1466,10 +1466,10 @@ (** {2 Printing} (see also {!PrintSlice}) *) let print_ff_sig fmt ff = - Format.fprintf fmt "@[%s:@ " (SlicingMacros.ff_name ff); + Format.fprintf fmt "%s:@ " (SlicingMacros.ff_name ff); match FctMarks.get_sgn ff with - | None -> Format.fprintf fmt "@]" - | Some s -> Format.fprintf fmt "%a@]" SlicingMarks.pretty_sig s + | None -> Format.fprintf fmt "" + | Some s -> SlicingMarks.pretty_sig fmt s (*-----------------------------------------------------------------------*) (* diff -Nru frama-c-20140301+neon+dfsg/src/slicing/fct_slice.mli frama-c-20150201+sodium+dfsg/src/slicing/fct_slice.mli --- frama-c-20140301+neon+dfsg/src/slicing/fct_slice.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/fct_slice.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing/printSlice.ml frama-c-20150201+sodium+dfsg/src/slicing/printSlice.ml --- frama-c-20140301+neon+dfsg/src/slicing/printSlice.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/printSlice.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -33,7 +33,8 @@ | TryFinally (bl1, bl2, _) -> bl1.bstmts@bl2.bstmts | Block bl | Loop (_,bl, _, _, _) | Switch (_, bl, _, _) -> bl.bstmts | UnspecifiedSequence seq -> List.map (fun (x,_,_,_,_) -> x) seq -| Continue _|Break _|Goto (_, _)|Return (_, _)|Instr _ -> [] +| TryCatch(t,c,_) -> List.fold_left (fun acc (_,b) -> acc @ b.bstmts) t.bstmts c +| Continue _|Break _|Goto (_, _)|Return (_, _)|Instr _|Throw _ -> [] let str_call_sig ff call fmt = try @@ -43,12 +44,12 @@ | None | Some (None) -> Format.fprintf fmt "@[/* undetermined call */@]" | Some (Some (SlicingInternals.CallSlice ff)) -> - Format.fprintf fmt "@[/* call to@ %a */@]" + Format.fprintf fmt "@[/* call to %a */@]" Fct_slice.print_ff_sig ff | Some (Some(SlicingInternals.CallSrc _)) -> Format.fprintf fmt "@[/* call to source function */@]" in - Format.fprintf fmt "@[@[/* sig call:@ %a */@]@ %t@]" + Format.fprintf fmt "@[@[/* sig call:@ %a */@]@ %t@]" SlicingMarks.pretty_sig sgn print_called with Not_found -> Format.fprintf fmt "@[/* invisible call */@]" @@ -109,6 +110,8 @@ Format.fprintf fmt "@[/* %s */@ %a@]" label_info super#label l + + method! private require_braces ?has_annot:_ _ = true end let print_fct_from_pdg fmt ?ff pdg = @@ -227,7 +230,7 @@ let graph_attributes (name, _) = [`Label name] - let default_vertex_attributes _ = [`Style [`Filled]] + let default_vertex_attributes _ = [`Style `Filled] let vertex_name v = match v with | Src fi -> SlicingMacros.fi_name fi @@ -280,16 +283,16 @@ let edge_attributes (e, call) = let attrib = match e with - | (Src _, Src _) -> [`Style [`Invis]] - | (OptSliceCallers _, _) -> [`Style [`Invis]] - | (_, OptSliceCallers _) -> [`Style [`Invis]] + | (Src _, Src _) -> [`Style `Invis] + | (OptSliceCallers _, _) -> [`Style `Invis] + | (_, OptSliceCallers _) -> [`Style `Invis] | _ -> [] in match call with None -> attrib | Some call -> (`Label (string_of_int call.sid)):: attrib let get_subgraph v = let mk_subgraph name attrib = - let attrib = (*(`Label name) ::*) (`Style [`Filled]) :: attrib in + let attrib = (*(`Label name) ::*) (`Style `Filled) :: attrib in Some { Graph.Graphviz.DotAttributes.sg_name= name; sg_parent = None; sg_attributes = attrib } diff -Nru frama-c-20140301+neon+dfsg/src/slicing/printSlice.mli frama-c-20150201+sodium+dfsg/src/slicing/printSlice.mli --- frama-c-20140301+neon+dfsg/src/slicing/printSlice.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/printSlice.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing/register_gui.ml frama-c-20150201+sodium+dfsg/src/slicing/register_gui.ml --- frama-c-20140301+neon+dfsg/src/slicing/register_gui.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/register_gui.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -49,6 +49,7 @@ (* for slicing callback *) let mk_slice selection = + Enabled.set true; let n = string_of_int (1 + List.length (!Db.Slicing.Project.get_all ())) in let project_name = SlicingParameters.ProjectName.get () ^ n in let project = !Db.Slicing.Project.mk_project project_name in @@ -75,103 +76,94 @@ ignore (factory#add_item name ~callback:(fun () -> callback arg)) (* To inform the user about a status. *) -let gui_annot_info (main_ui:Design.main_window_extension_points) ~level txt = +let gui_annot_info (main_ui:Design.main_window_extension_points) ?(level=2) txt= if (SlicingParameters.verbose_atleast level) then begin - main_ui#annot_window#buffer#insert ((txt ()) ^ ".\n") + main_ui#pretty_information "%t.@." txt end -(* To inform the user about an action. *) -let gui_annot_action (main_ui:Design.main_window_extension_points) txt = - if SlicingParameters.verbose_atleast 2 then - let tag_style_italic = - Gtk_helper.make_tag - main_ui#annot_window#buffer - ~name:"slicing:style italic" - [`STYLE `ITALIC] - in - main_ui#annot_window#buffer#insert - ~tags:[tag_style_italic] - ((txt ())^"\n") - (* To inform the user about an error. *) let gui_mk_slice (main_ui:Design.main_window_extension_points) selection ~info = - gui_annot_action main_ui info; + gui_annot_info main_ui info; let new_project = mk_slice selection in (* ... slicing computation *) - gui_annot_action main_ui - (fun () -> "Slice exported to project: " ^ (Project.get_name new_project)); + gui_annot_info main_ui + (fun fmt -> Format.fprintf fmt "Slice exported to project: %s" + (Project.get_unique_name new_project)); main_ui#rehighlight () -let _msg_appl_compute_values = - "Activating Slicing Plug-in by running Value Analysis first" -let msg_help_compute_values = - "Activates Slicing Plug-in by running Value Analysis first." let msg_help_enable_gui = "Enables/Disables the Slicing GUI." let msg_help_libraries = "Allows/Disallows the use of the -slicing-level option for calls to \ undefined functions." -let gui_compute_values (main_ui:Design.main_window_extension_points) = - if not (Db.Value.is_computed ()) then begin - let tag_style_oblique = - Gtk_helper.make_tag main_ui#annot_window#buffer - ~name:"slicing:style oblique" [`STYLE `OBLIQUE ; ] +let check_value_computed (main_ui:Design.main_window_extension_points) = + if Db.Value.is_computed () then true + else + let answer = GToolbox.question_box + ~title:("Need Value Analysis") + ~buttons:[ "Run"; "Cancel" ] + ("Value analysis has to be run first.\nThis can take some time and may \ + require some special settings.\n" + ^"Do you want to run the Value analysis with its current settings now?") in - main_ui#annot_window#buffer#insert - "[Slicing] activation requires an execution of a "; - main_ui#annot_window#buffer#insert - ~tags:[tag_style_oblique] "value analysis"; - main_ui#annot_window#buffer#insert ". Selects "; - main_ui#annot_window#buffer#insert ~tags:[tag_style_oblique] "-val"; - main_ui#annot_window#buffer#insert - " option and sets parameters before pushing " ; - main_ui#annot_window#buffer#insert ~tags:[tag_style_oblique] "Execute" ; - main_ui#annot_window#buffer#insert " button.\n" ; - main_ui#launcher () - end + if answer = 1 then + match main_ui#full_protect ~cancelable:true !Db.Value.compute with + | Some _ -> + main_ui#redisplay (); (* New alarms *) + true + | None -> false + else false (* To do an action and inform the user. *) let gui_apply_action (main_ui:Design.main_window_extension_points) f x ~info = f x ; - gui_annot_action main_ui info + gui_annot_info main_ui info -let get_setting_option_text txt = - "Setting option " ^ txt ^ " for the current project" let gui_set_project (main_ui:Design.main_window_extension_points) proj_opt = gui_apply_action main_ui !Db.Slicing.Project.set_project proj_opt - ~info:(fun () -> - Extlib.may_map ~dft:"Clear slicing highlighting" - (fun project -> ("Highlighting for " ^ (!Db.Slicing.Project.get_name project))) - proj_opt) ; + ~info:(fun fmt -> + match proj_opt with + | None -> Format.fprintf fmt "Clear slicing highlighting" + | Some project -> + Format.fprintf fmt "Highlighting for@ %s" + (!Db.Slicing.Project.get_name project) + ); main_ui#rehighlight () let slicing_selector (popup_factory:GMenu.menu GMenu.factory) (main_ui:Design.main_window_extension_points) ~button localizable = - if (not (Db.Value.is_computed ())) || not (Enabled.get ()) + if (not (Db.Value.is_computed ())) then ignore (popup_factory#add_item "Enable _slicing" ~callback: (fun () -> - if (not (Db.Value.is_computed ())) - then gui_compute_values main_ui ; - if Db.Value.is_computed () - then (Enabled.set true; - !update_column `Visibility) + let enable () = + Enabled.set true; + !update_column `Visibility + in + if (not (Db.Value.is_computed ())) then begin + if check_value_computed main_ui then enable () + end + else enable () )) else let slicing_project = !Db.Slicing.Project.get_project () in if button = 1 then begin let level = 1 in let slicing_view project = - gui_annot_info main_ui ~level (fun () -> "Highlighting for " ^ (!Db.Slicing.Project.get_name project)) + gui_annot_info main_ui ~level + (fun fmt -> Format.fprintf fmt "Highlighting for@ %s" + (!Db.Slicing.Project.get_name project)) in Extlib.may slicing_view slicing_project; if SlicingParameters.verbose_atleast level then begin let slicing_mark project = let slicing_mark kf get_mark = (* use -slicing-debug -verbose to get slicing mark information *) - let add_mark_info txt = gui_annot_info ~level main_ui (fun () -> "Tag: " ^ (txt ())) in + let add_mark_info txt = gui_annot_info ~level main_ui + (fun fmt -> Format.fprintf fmt "Tag: %s" (txt ())) + in let slices = !Db.Slicing.Slice.get_all project kf in match slices with | [] -> (* No slice for this kf *) @@ -216,11 +208,11 @@ add_item slicing_factory name ~callback v in let mk_slice = gui_mk_slice main_ui in - let add_slice_menu kf_opt kf_ki_opt = + let add_slice_menu kf_opt kf_ki_lv_opt = (let callback kf = mk_slice - ~info:(fun () -> - Pretty_utils.sfprintf + ~info:(fun fmt -> + Format.fprintf fmt "Request for slicing effects of function %a" Kernel_function.pretty kf) (mk_selection_all !Db.Slicing.Select.select_func_calls_to kf) @@ -229,8 +221,8 @@ (let callback kf = mk_slice - ~info:(fun () -> - Pretty_utils.sfprintf + ~info:(fun fmt -> + Format.fprintf fmt "Request for slicing entrance into function %a" Kernel_function.pretty kf) (mk_selection_all !Db.Slicing.Select.select_func_calls_into kf) @@ -239,8 +231,8 @@ (let callback kf = mk_slice - ~info:(fun () -> - Pretty_utils.sfprintf + ~info:(fun fmt -> + Format.fprintf fmt "Request for returned value of function %a" Kernel_function.pretty kf) (mk_selection_all !Db.Slicing.Select.select_func_return kf) @@ -256,26 +248,36 @@ kf_opt) ~callback); - (let callback (kf, ki) = + (let callback (kf, ki, _) = mk_slice - ~info:(fun () -> - Pretty_utils.sfprintf + ~info:(fun fmt -> + Format.fprintf fmt "Request for slicing effects of statement %d" ki.sid) (mk_selection_all !Db.Slicing.Select.select_stmt ki kf) in - add_slicing_item "Slice stmt" kf_ki_opt ~callback); + add_slicing_item "Slice stmt" kf_ki_lv_opt ~callback); - (let callback (kf, ki) = + let get_lv lvopt text = + match lvopt with + | None -> + GToolbox.input_string ~title:"Enter an lvalue" text + | Some lv -> + (* For probably dubious reasons, the functions in Db.Slicing.Select + require strings instead of directly a lvalue. Thus, we convert + our shiny lvalue to string, so that it may be parsed back... *) + Some (Pretty_utils.to_string Printer.pp_lval lv) + in + (let callback (kf, ki, lvopt) = let do_with_txt txt = try let lval_str = Datatype.String.Set.add txt Datatype.String.Set.empty in mk_slice - ~info:(fun () -> - Pretty_utils.sfprintf - "Request for slicing Lvalue %s before statement %d" + ~info:(fun fmt -> + Format.fprintf fmt + "Request for slicing lvalue %s before statement %d" txt ki.sid) (mk_selection_cad !Db.Slicing.Select.select_stmt_lval @@ -283,26 +285,23 @@ with e -> main_ui#error "Invalid expression: %s" (Printexc.to_string e) in - let txt = - GToolbox.input_string - ~title:"Input a pure Lvalue expression to slice before current \ -statement" - "" + let txt = get_lv lvopt + "Input a lvalue to slice on its value before the current statement." in Extlib.may do_with_txt txt in - add_slicing_item "Slice lval" kf_ki_opt ~callback); + add_slicing_item "Slice lval" kf_ki_lv_opt ~callback); - (let callback (kf, ki) = + (let callback (kf, ki, lvopt) = let do_with_txt txt = try let lval_str = Datatype.String.Set.add txt Datatype.String.Set.empty in mk_slice - ~info:(fun () -> - Pretty_utils.sfprintf - "Request for slicing read accesses to Lvalue %s" + ~info:(fun fmt -> + Format.fprintf fmt + "Request for slicing read accesses to lvalue %s" txt) (mk_selection_cad !Db.Slicing.Select.select_func_lval_rw @@ -313,25 +312,23 @@ with e -> main_ui#error "Invalid expression: %s" (Printexc.to_string e) in - let txt = - GToolbox.input_string - ~title:"Input a pure Lvalue expression to slice read accesses" - "" + let txt = get_lv lvopt + "Input a lvalue to slice on its read accesses." in Extlib.may do_with_txt txt in - add_slicing_item "Slice rd" kf_ki_opt ~callback); + add_slicing_item "Slice rd" kf_ki_lv_opt ~callback); - (let callback (kf, ki) = + (let callback (kf, ki, lvopt) = let do_with_txt txt = try let lval_str = Datatype.String.Set.add txt Datatype.String.Set.empty in mk_slice - ~info:(fun () -> - Pretty_utils.sfprintf - "Request for slicing writen accesses to Lvalue %s" + ~info:(fun fmt -> + Format.fprintf fmt + "Request for slicing written accesses to lvalue %s" txt) (mk_selection_cad !Db.Slicing.Select.select_func_lval_rw @@ -342,45 +339,46 @@ with e -> main_ui#error "Invalid expression: %s" (Printexc.to_string e) in - let txt = - GToolbox.input_string - ~title:"Input a pure Lvalue expression to slice read accesses" - "" + let txt = get_lv lvopt + "Input a lvalue to slice on its write accesses." in Extlib.may do_with_txt txt in - add_slicing_item "Slice wr" kf_ki_opt ~callback); + add_slicing_item "Slice wr" kf_ki_lv_opt ~callback); - let callback (kf, ki) = + let callback (kf, ki, _) = mk_slice - ~info:(fun () -> - Pretty_utils.sfprintf + ~info:(fun fmt -> + Format.fprintf fmt "Request for slicing accessibility to statement %d" ki.sid) (mk_selection_all !Db.Slicing.Select.select_stmt_ctrl ki kf) in - add_slicing_item "Slice ctrl" kf_ki_opt ~callback + add_slicing_item "Slice ctrl" kf_ki_lv_opt ~callback in let some_kf_from_vi vi = try let kf = Globals.Functions.get vi in - if Enabled.get () && !Db.Value.is_called kf then Some kf else None + if !Db.Value.is_called kf then Some kf else None with Not_found -> None in let some_kf_from_lv lv = match lv with | Var vi,_ -> some_kf_from_vi vi - | _ -> None in - let some_kf_ki kf stmt = - if Enabled.get () - && !Db.Value.is_called kf - && Db.Value.is_reachable_stmt stmt - then Some (kf, stmt) else None in + | _ -> None + in + let some_kf_ki_lv kf stmt lvopt = + if !Db.Value.is_called kf && Db.Value.is_reachable_stmt stmt + then Some (kf, stmt, lvopt) else None + in begin (* add menu for slicing and scope plug-in *) match localizable with - | Pretty_source.PLval (Some kf,(Kstmt stmt),lv) -> - add_slice_menu (some_kf_from_lv lv) (some_kf_ki kf stmt) - | Pretty_source.PTermLval(Some kf,(Kstmt ki),_) (* as for the statement *) + | Pretty_source.PLval (Some kf,(Kstmt stmt),lv)-> + add_slice_menu + (some_kf_from_lv lv) (some_kf_ki_lv kf stmt (Some lv)) + | Pretty_source.PTermLval(Some kf,(Kstmt ki),_) + (* as for 'statement' localizable. We currently ignore the + term-lval *) | Pretty_source.PStmt (kf,ki) -> - add_slice_menu None (some_kf_ki kf ki) + add_slice_menu None (some_kf_ki_lv kf ki None) | Pretty_source.PVDecl (_,vi) -> add_slice_menu (some_kf_from_vi vi) None | _ -> @@ -492,7 +490,8 @@ | Pretty_source.PLval _ | Pretty_source.PTermLval _ | Pretty_source.PGlobal _ - | Pretty_source.PIP _ -> () + | Pretty_source.PIP _ + | Pretty_source.PExp _ -> () in let slicing_project = !Db.Slicing.Project.get_project () in (* 2. Highlights the 'Slicing' *) @@ -527,37 +526,35 @@ combo_box#misc#set_sensitive sensitive +let pretty_setting_option fmt = + Format.fprintf fmt "@[Setting option %s@ %s@ for the current project@]" + let gui_set_slicing_debug (main_ui:Design.main_window_extension_points) v = let old = SlicingParameters.Verbose.get () in if v <> old then (* Otherwise set is done at every refreshing *) gui_apply_action main_ui SlicingParameters.Verbose.set v - ~info:(fun () -> get_setting_option_text ("-slicing-debug \"-debug " ^ (string_of_int v) ^ "\"")) + ~info:(fun fmt -> + pretty_setting_option fmt "-slicing-verbose" (string_of_int v)) let gui_set_slicing_level (main_ui:Design.main_window_extension_points) v = let old = SlicingParameters.Mode.Calls.get () in if v != old then (* Otherwise set is done at every refreshing *) gui_apply_action main_ui SlicingParameters.Mode.Calls.set v - ~info:(fun () -> get_setting_option_text ("-slicing-level " ^ (string_of_int v))) + ~info:(fun fmt -> + pretty_setting_option fmt "-slicing-level" (string_of_int v)) let gui_set_slicing_undef_functions (main_ui:Design.main_window_extension_points) v = let old = SlicingParameters.Mode.SliceUndef.get () in if v != old then (* Otherwise set is done at every refreshing *) gui_apply_action main_ui SlicingParameters.Mode.SliceUndef.set v - ~info:(fun () -> get_setting_option_text (if v then "-slicing-undef-functions" else "-no-slice-undef-functions")) + ~info:(fun fmt -> + pretty_setting_option fmt + (if v then "-slice-undef-functions" else "-no-slice-undef-functions") + "") let slicing_panel (main_ui:Design.main_window_extension_points) = let w = GPack.vbox () in - let hbox1 = GPack.hbox - ~packing:w#pack () in - let activate_button = - let b = GButton.button ~label:"Activate" - ~packing:hbox1#pack () in - main_ui#help_message b "%s" msg_help_compute_values ; - ignore (b#connect#pressed - (fun () -> gui_compute_values main_ui )); - - b - in + let hbox1 = GPack.hbox ~packing:w#pack () in let combo_box_text = let ((combo_box, (_model, column)) as combo_box_text) = GEdit.combo_box_text ~strings:[ none_text ] ~wrap_width:3 ~use_markup:true @@ -586,7 +583,7 @@ (* [enabled_button] to give slicing menu available *) let do_refresh to_enable = - if to_enable then gui_compute_values main_ui; + if to_enable then ignore (check_value_computed main_ui); !update_column `Visibility; main_ui#rehighlight (); in @@ -637,7 +634,6 @@ let value_is_computed = Db.Value.is_computed () in let slicing_project = !Db.Slicing.Project.get_project () in let enabled = Enabled.get () in - activate_button#misc#set_sensitive (not value_is_computed) ; enabled_button#misc#set_sensitive value_is_computed ; slice_undef_button#misc#set_sensitive enabled ; verbose_refresh (); diff -Nru frama-c-20140301+neon+dfsg/src/slicing/register_gui.mli frama-c-20150201+sodium+dfsg/src/slicing/register_gui.mli --- frama-c-20140301+neon+dfsg/src/slicing/register_gui.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/register_gui.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,8 +20,6 @@ (* *) (**************************************************************************) -(* $Id: register_gui.mli,v 1.1 2008-08-19 09:28:36 uid568 Exp $ *) - (** Extension of the GUI in order to support slicing visualization. No function is exported. *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing/register.ml frama-c-20150201+sodium+dfsg/src/slicing/register.ml --- frama-c-20140301+neon+dfsg/src/slicing/register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/register.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -1197,14 +1197,11 @@ begin SlicingParameters.warning "No internal slicing request from the command line." ; if SlicingParameters.Mode.Callers.get () then - let select_entry = - let spare_mark = - !Db.Slicing.Mark.make ~data:false ~addr:false ~ctrl:false - in - let kf_entry, _library = Globals.entry_point () in - SlicingParameters.warning "Adding an extra request on the entry point of function: %a." Kernel_function.pretty kf_entry; - !Db.Slicing.Select.select_entry_point_internal kf_entry spare_mark - in !Db.Slicing.Request.add_selection_internal project select_entry + let kf_entry, _library = Globals.entry_point () in + SlicingParameters.warning "Adding an extra request on the entry point of function: %a." Kernel_function.pretty kf_entry; + let set = Db.Slicing.Select.empty_selects in + let set = !Db.Slicing.Select.select_func_calls_into set true kf_entry in + !Db.Slicing.Request.add_persistent_selection project set end; !Db.Slicing.Request.apply_all_internal project; diff -Nru frama-c-20140301+neon+dfsg/src/slicing/register.mli frama-c-20150201+sodium+dfsg/src/slicing/register.mli --- frama-c-20140301+neon+dfsg/src/slicing/register.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/register.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing/slicingActions.ml frama-c-20150201+sodium+dfsg/src/slicing/slicingActions.ml --- frama-c-20140301+neon+dfsg/src/slicing/slicingActions.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/slicingActions.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing/slicingActions.mli frama-c-20150201+sodium+dfsg/src/slicing/slicingActions.mli --- frama-c-20140301+neon+dfsg/src/slicing/slicingActions.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/slicingActions.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing/slicingCmds.ml frama-c-20150201+sodium+dfsg/src/slicing/slicingCmds.ml --- frama-c-20140301+neon+dfsg/src/slicing/slicingCmds.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/slicingCmds.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -198,32 +198,51 @@ (* apply [select ~spare] on each callsite of [kf] and add the returned selection to [set]. *) -let generic_select_func_calls select set ~spare kf = +let generic_select_func_calls select_stmt set ~spare kf = assert (Db.Value.is_computed ()); let callers = !Db.Value.callers kf in let select_calls acc (caller, stmts) = - List.fold_left (fun acc s -> select acc ~spare s caller) acc stmts + List.fold_left (fun acc s -> select_stmt acc ~spare s caller) acc stmts in List.fold_left select_calls set callers - + (** Registered as a slicing selection function: Add a selection of calls to a [kf]. *) -let select_func_calls_to = generic_select_func_calls select_stmt +let select_func_calls_into set ~spare kf = + let add_to_select set ~spare select = + let mark = + let nspare = not spare in + !Db.Slicing.Mark.make ~data:nspare ~addr:nspare ~ctrl:nspare + in add_to_selection set (select mark) + in + let kf_entry, _library = Globals.entry_point () in + if Kernel_function.equal kf_entry kf then + add_to_select set ~spare (!Db.Slicing.Select.select_entry_point_internal kf) + else + let select_min_call set ~spare ki kf = + add_to_select set ~spare (!Db.Slicing.Select.select_min_call_internal kf ki) + in + generic_select_func_calls select_min_call set ~spare kf (** Registered as a slicing selection function: Add a selection of calls to a [kf]. *) -let select_func_calls_into = - let select_min_call set ~spare ki kf = - let nspare = not spare in - let stmt_mark = - !Db.Slicing.Mark.make ~data:nspare ~addr:nspare ~ctrl:nspare - in - let selection = - !Db.Slicing.Select.select_min_call_internal kf ki stmt_mark - in - add_to_selection set selection - in - generic_select_func_calls select_min_call +let select_func_calls_to set ~spare kf = + let kf_entry, _library = Globals.entry_point () in + if Kernel_function.equal kf_entry kf then + begin + let mark = + let nspare = not spare in + !Db.Slicing.Mark.make ~data:nspare ~addr:nspare ~ctrl:nspare + in + assert (Db.Value.is_computed ()); + let outputs = !Db.Outputs.get_external kf in + select_entry_point_and_some_inputs_outputs set ~mark kf + ~return:true + ~outputs + ~inputs:Locations.Zone.bottom + end + else + generic_select_func_calls select_stmt set ~spare kf (** Registered as a slicing selection function: Add selection of function ouputs. *) @@ -595,8 +614,8 @@ Globals.Functions.iter (fun kf -> let add_selection opt select = - if Datatype.String.Set.mem (Kernel_function.get_name kf) (opt ()) - then selection := select !selection ~spare:false kf + if Kernel_function.Set.mem kf (opt ()) then + selection := select !selection ~spare:false kf in add_selection SlicingParameters.Select.Return.get diff -Nru frama-c-20140301+neon+dfsg/src/slicing/slicingCmds.mli frama-c-20150201+sodium+dfsg/src/slicing/slicingCmds.mli --- frama-c-20140301+neon+dfsg/src/slicing/slicingCmds.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/slicingCmds.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing/slicingMacros.ml frama-c-20150201+sodium+dfsg/src/slicing/slicingMacros.ml --- frama-c-20140301+neon+dfsg/src/slicing/slicingMacros.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/slicingMacros.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing/slicingMacros.mli frama-c-20150201+sodium+dfsg/src/slicing/slicingMacros.mli --- frama-c-20140301+neon+dfsg/src/slicing/slicingMacros.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/slicingMacros.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing/slicingMarks.ml frama-c-20150201+sodium+dfsg/src/slicing/slicingMarks.ml --- frama-c-20140301+neon+dfsg/src/slicing/slicingMarks.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/slicingMarks.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing/slicingMarks.mli frama-c-20150201+sodium+dfsg/src/slicing/slicingMarks.mli --- frama-c-20140301+neon+dfsg/src/slicing/slicingMarks.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/slicingMarks.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing/slicingParameters.ml frama-c-20150201+sodium+dfsg/src/slicing/slicingParameters.ml --- frama-c-20140301+neon+dfsg/src/slicing/slicingParameters.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/slicingParameters.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -33,8 +33,9 @@ module Select = struct + let () = Parameter_customize.argument_may_be_fundecl () module Calls = - StringSet + Kernel_function_set (struct let option_name = "-slice-calls" let arg_name = "f1, ..., fn" @@ -42,8 +43,9 @@ "select every calls to functions f1,...,fn, and all their effect" end) + let () = Parameter_customize.argument_may_be_fundecl () module Return = - StringSet + Kernel_function_set (struct let option_name = "-slice-return" let arg_name = "f1, ..., fn" @@ -51,8 +53,9 @@ "select the result (returned value) of functions f1,...,fn" end) + let () = Parameter_customize.argument_may_be_fundecl () module Threat = - StringSet + Kernel_function_set (struct let option_name = "-slice-threat" let arg_name = "f1, ..., fn" @@ -60,7 +63,7 @@ end) module Assert = - StringSet + Kernel_function_set (struct let option_name = "-slice-assert" let arg_name = "f1, ..., fn" @@ -68,7 +71,7 @@ end) module LoopInv = - StringSet + Kernel_function_set (struct let option_name = "-slice-loop-inv" let arg_name = "f1, ..., fn" @@ -76,7 +79,7 @@ end) module LoopVar = - StringSet + Kernel_function_set (struct let option_name = "-slice-loop-var" let arg_name = "f1, ..., fn" @@ -84,7 +87,7 @@ end) module Pragma = - StringSet + Kernel_function_set (struct let option_name = "-slice-pragma" let arg_name = "f1, ..., fn" @@ -96,36 +99,40 @@ this control-flow point\n\ //@ slice pragma stmt; to preserve the effect of the next statement" end) - module RdAccess = - StringSet - (struct - let option_name = "-slice-rd" - let arg_name = "v1, ..., vn" - let help = - "select the read accesses to left-values v1,...,vn \ + + module RdAccess = + String_set + (struct + let option_name = "-slice-rd" + let arg_name = "v1, ..., vn" + let help = + "select the read accesses to left-values v1,...,vn \ (addresses are evaluated at the beginning of the function given as \ entry point)" end) - module WrAccess = - StringSet - (struct - let option_name = "-slice-wr" - let arg_name = "v1, ..., vn" - let help = - "select the write accesses to left-values v1,...,vn \ + + module WrAccess = + String_set + (struct + let option_name = "-slice-wr" + let arg_name = "v1, ..., vn" + let help = + "select the write accesses to left-values v1,...,vn \ (addresses are evaluated at the beginning of the function given as\ entry point)" - end) - module Value = - StringSet - (struct - let option_name = "-slice-value" - let arg_name = "v1, ..., vn" - let help = - "select the result of left-values v1,...,vn at the end of the \ + end) + + module Value = + String_set + (struct + let option_name = "-slice-value" + let arg_name = "v1, ..., vn" + let help = + "select the result of left-values v1,...,vn at the end of the \ function given as entry point (addresses are evaluated at the beginning of \ the function given as entry point)" - end) + end) + end module Mode = struct diff -Nru frama-c-20140301+neon+dfsg/src/slicing/slicingParameters.mli frama-c-20150201+sodium+dfsg/src/slicing/slicingParameters.mli --- frama-c-20140301+neon+dfsg/src/slicing/slicingParameters.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/slicingParameters.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -26,13 +26,13 @@ (* modules related to the command line options *) module Select : sig - module Calls: Parameter_sig.String_set - module Return: Parameter_sig.String_set - module Threat: Parameter_sig.String_set - module Assert: Parameter_sig.String_set - module Pragma: Parameter_sig.String_set - module LoopInv: Parameter_sig.String_set - module LoopVar: Parameter_sig.String_set + module Calls: Parameter_sig.Kernel_function_set + module Return: Parameter_sig.Kernel_function_set + module Threat: Parameter_sig.Kernel_function_set + module Assert: Parameter_sig.Kernel_function_set + module Pragma: Parameter_sig.Kernel_function_set + module LoopInv: Parameter_sig.Kernel_function_set + module LoopVar: Parameter_sig.Kernel_function_set module RdAccess: Parameter_sig.String_set module WrAccess: Parameter_sig.String_set module Value: Parameter_sig.String_set diff -Nru frama-c-20140301+neon+dfsg/src/slicing/slicingProject.ml frama-c-20150201+sodium+dfsg/src/slicing/slicingProject.ml --- frama-c-20140301+neon+dfsg/src/slicing/slicingProject.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/slicingProject.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing/slicingProject.mli frama-c-20150201+sodium+dfsg/src/slicing/slicingProject.mli --- frama-c-20140301+neon+dfsg/src/slicing/slicingProject.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/slicingProject.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing/slicingTransform.ml frama-c-20150201+sodium+dfsg/src/slicing/slicingTransform.ml --- frama-c-20140301+neon+dfsg/src/slicing/slicingTransform.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/slicingTransform.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing/slicingTransform.mli frama-c-20150201+sodium+dfsg/src/slicing/slicingTransform.mli --- frama-c-20140301+neon+dfsg/src/slicing/slicingTransform.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing/slicingTransform.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing_types/slicingInternals.ml frama-c-20150201+sodium+dfsg/src/slicing_types/slicingInternals.ml --- frama-c-20140301+neon+dfsg/src/slicing_types/slicingInternals.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing_types/slicingInternals.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/slicing_types/slicingTypes.ml frama-c-20150201+sodium+dfsg/src/slicing_types/slicingTypes.ml --- frama-c-20140301+neon+dfsg/src/slicing_types/slicingTypes.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/slicing_types/slicingTypes.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/sparecode/globs.ml frama-c-20150201+sodium+dfsg/src/sparecode/globs.ml --- frama-c-20140301+neon+dfsg/src/sparecode/globs.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/sparecode/globs.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/sparecode/register.ml frama-c-20150201+sodium+dfsg/src/sparecode/register.ml --- frama-c-20140301+neon+dfsg/src/sparecode/register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/sparecode/register.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -84,7 +84,7 @@ let new_proj_name = (old_proj_name^" without sparecode") in P.feedback "remove unused global declarations..."; - let tmp_prj = Transform.Info.build_cil_file "tmp_prj" proj in + let tmp_prj = Transform.Info.build_cil_file ~last:false "tmp_prj" proj in let new_prj = Project.on tmp_prj Globs.rm_unused_decl new_proj_name in P.result "result in new project '%s'." (Project.get_name new_prj); diff -Nru frama-c-20140301+neon+dfsg/src/sparecode/Sparecode.mli frama-c-20150201+sodium+dfsg/src/sparecode/Sparecode.mli --- frama-c-20140301+neon+dfsg/src/sparecode/Sparecode.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/sparecode/Sparecode.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/sparecode/sparecode_params.ml frama-c-20150201+sodium+dfsg/src/sparecode/sparecode_params.ml --- frama-c-20140301+neon+dfsg/src/sparecode/sparecode_params.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/sparecode/sparecode_params.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/sparecode/sparecode_params.mli frama-c-20150201+sodium+dfsg/src/sparecode/sparecode_params.mli --- frama-c-20140301+neon+dfsg/src/sparecode/sparecode_params.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/sparecode/sparecode_params.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/sparecode/spare_marks.ml frama-c-20150201+sodium+dfsg/src/sparecode/spare_marks.ml --- frama-c-20140301+neon+dfsg/src/sparecode/spare_marks.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/sparecode/spare_marks.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/sparecode/spare_marks.mli frama-c-20150201+sodium+dfsg/src/sparecode/spare_marks.mli --- frama-c-20140301+neon+dfsg/src/sparecode/spare_marks.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/sparecode/spare_marks.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/sparecode/transform.ml frama-c-20150201+sodium+dfsg/src/sparecode/transform.ml --- frama-c-20140301+neon+dfsg/src/sparecode/transform.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/sparecode/transform.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/syntactic_callgraph/cg_viewer.ml frama-c-20150201+sodium+dfsg/src/syntactic_callgraph/cg_viewer.ml --- frama-c-20140301+neon+dfsg/src/syntactic_callgraph/cg_viewer.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/syntactic_callgraph/cg_viewer.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/syntactic_callgraph/options.ml frama-c-20150201+sodium+dfsg/src/syntactic_callgraph/options.ml --- frama-c-20140301+neon+dfsg/src/syntactic_callgraph/options.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/syntactic_callgraph/options.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -31,7 +31,7 @@ end) module Filename = - EmptyString + Empty_string (struct let option_name = "-cg" let arg_name = "filename" @@ -40,7 +40,7 @@ end) module InitFunc = - StringSet + Kernel_function_set (struct let option_name = "-cg-init-func" let arg_name = "" diff -Nru frama-c-20140301+neon+dfsg/src/syntactic_callgraph/options.mli frama-c-20150201+sodium+dfsg/src/syntactic_callgraph/options.mli --- frama-c-20140301+neon+dfsg/src/syntactic_callgraph/options.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/syntactic_callgraph/options.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -24,7 +24,7 @@ val name: string module Filename: Parameter_sig.String -module InitFunc: Parameter_sig.String_set +module InitFunc: Parameter_sig.Kernel_function_set (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/syntactic_callgraph/register.ml frama-c-20150201+sodium+dfsg/src/syntactic_callgraph/register.ml --- frama-c-20140301+neon+dfsg/src/syntactic_callgraph/register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/syntactic_callgraph/register.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,7 +20,6 @@ (* *) (**************************************************************************) -open Cil_types open Callgraph open Options @@ -37,8 +36,8 @@ let name v = nodeName v.cnInfo let attributes v = [ match v.cnInfo with - | NIVar (_,b) when not !b -> `Style [`Dotted] - | _ -> `Style [`Bold] ] + | NIVar (_,b) when not !b -> `Style `Dotted + | _ -> `Style `Bold ] let equal v1 v2 = id v1 = id v2 let compare v1 v2 = let i1 = id v1 in @@ -61,34 +60,41 @@ let dependencies = [ Ast.self ] end) -let get_init_funcs main_name cg = - match main_name with +let get_init_funcs main cg = + match main with | None -> InitFunc.get () - | Some s -> + | Some kf -> (* the entry point is always a root *) - let init_funcs = Datatype.String.Set.add s (InitFunc.get ()) in + let init_funcs = Kernel_function.Set.add kf (InitFunc.get ()) in (* Add the callees of entry point as roots *) - Datatype.String.Set.union + Kernel_function.Set.union (try - let callees = (Hashtbl.find cg s).Callgraph.cnCallees in + let kf_name = Kernel_function.get_name kf in + let callees = (Hashtbl.find cg kf_name).Callgraph.cnCallees in Datatype.Int.Hashtbl.fold (fun _ v acc -> match v.Callgraph.cnInfo with - | Callgraph.NIVar ({vname=n},_) -> Datatype.String.Set.add n acc + | Callgraph.NIVar (vi,_) -> + let kf = + try Globals.Functions.get vi + with Not_found -> assert false + in + Kernel_function.Set.add kf acc | _ -> acc) callees - Datatype.String.Set.empty + Kernel_function.Set.empty with Not_found -> - Datatype.String.Set.empty) + Kernel_function.Set.empty) init_funcs let compute () = feedback "beginning analysis"; let p = Ast.get () in let cg = computeGraph p in - let main = Kernel.MainFunction.get () in - let main_name = + let main, _ = Globals.entry_point () in + let main = try - entry_point_ref := Some (Hashtbl.find cg main); + let name = Kernel_function.get_name main in + entry_point_ref := Some (Hashtbl.find cg name); Some main with Not_found -> warning "no entry point available: services could be less precise. \ @@ -96,7 +102,13 @@ entry_point_ref := None; None in - let init_funcs = get_init_funcs main_name cg in + let init_funcs = get_init_funcs main cg in + let init_funcs = + Kernel_function.Set.fold + (fun kf acc -> Datatype.String.Set.add (Kernel_function.get_name kf) acc) + init_funcs + Datatype.String.Set.empty + in let cg = Service.compute cg init_funcs in CG.mark_as_computed (); feedback "analysis done"; diff -Nru frama-c-20140301+neon+dfsg/src/syntactic_callgraph/Syntactic_callgraph.mli frama-c-20150201+sodium+dfsg/src/syntactic_callgraph/Syntactic_callgraph.mli --- frama-c-20140301+neon+dfsg/src/syntactic_callgraph/Syntactic_callgraph.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/syntactic_callgraph/Syntactic_callgraph.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/toplevel/toplevel_config.ml frama-c-20150201+sodium+dfsg/src/toplevel/toplevel_config.ml --- frama-c-20140301+neon+dfsg/src/toplevel/toplevel_config.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/toplevel/toplevel_config.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/type/datatype.ml frama-c-20150201+sodium+dfsg/src/type/datatype.ml --- frama-c-20140301+neon+dfsg/src/type/datatype.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/type/datatype.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -789,7 +789,7 @@ module Make(T1: S)(T2: S) : S with type t = (T1.t, T2.t) poly end = struct - (* Split the functor argument in 2 modules such that ocaml is able to safely + (* Split the functor argument in 2 modules such that OCaml is able to safely evaluate the recursive modules *) include Polymorphic2(struct include Pair_arg include Pair_name end) end @@ -1326,7 +1326,7 @@ module type Functor_info = sig val module_name: string end -(* ocaml functors are generative *) +(* OCaml functors are generative *) module Set (S: FCSet.S)(E: S with type t = S.elt)(Info: Functor_info) = struct @@ -1518,7 +1518,7 @@ (** {3 Hashtbl} *) (* ****************************************************************************) -(* ocaml functors are generative *) +(* OCaml functors are generative *) module Hashtbl (H: Hashtbl_with_descr)(Key: S with type t = H.key)(Info : Functor_info) = struct @@ -1892,11 +1892,11 @@ end) let formatter = Formatter.ty -module Big_int = +module Integer = Make_with_collections (struct type t = Integer.t - let name = "Datatype.Big_int" + let name = "Datatype.Integer" let reprs = [ Integer.zero ] let structural_descr = Structural_descr.t_abstract let equal = Integer.equal @@ -1908,15 +1908,18 @@ let pp fmt = Format.fprintf fmt - "Big_int.big_int_of_string %S" + "Integer.of_string %S" (Integer.to_string n) in Type.par par Type.Call fmt pp + (* TODO: this should take into account kernel's option -big-ints-hex *) let pretty = Integer.pretty ~hexa:false - let varname _ = "big_n" + let varname _ = "integer_n" let mem_project = never_any_project end) -let big_int = Big_int.ty +let integer = Integer.ty + +module Big_int = Integer (* ****************************************************************************) (** {3 Triple} *) @@ -1980,7 +1983,7 @@ include Type.Polymorphic3 with type ('a,'b,'c) poly = 'a * 'b * 'c module Make(T1: S)(T2: S)(T3:S) : S with type t = (T1.t, T2.t, T3.t) poly end = - (* Split the functor argument in 2 modules such that ocaml is able to safely + (* Split the functor argument in 2 modules such that OCaml is able to safely evaluate the recursive modules *) Polymorphic3(struct include Triple_arg include Triple_name end) @@ -2085,7 +2088,7 @@ S with type t = (T1.t, T2.t, T3.t, T4.t) poly end = struct - (* Split the functor argument in 2 modules such that ocaml is able to safely + (* Split the functor argument in 2 modules such that OCaml is able to safely evaluate the recursive modules *) include Polymorphic4 (struct include Quadruple_arg include Quadruple_name end) diff -Nru frama-c-20140301+neon+dfsg/src/type/datatype.mli frama-c-20150201+sodium+dfsg/src/type/datatype.mli --- frama-c-20140301+neon+dfsg/src/type/datatype.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/type/datatype.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -341,10 +341,14 @@ module Formatter: S with type t = Format.formatter val formatter: Format.formatter Type.t - -module Big_int: S_with_collections with type t = Integer.t -val big_int: Big_int.t Type.t - + +(* module Big_int: S_with_collections with type t = Integer.t *) +(* val big_int: Big_int.t Type.t *) +(** @deprecated use Integer instead. *) + +module Integer: S_with_collections with type t = Integer.t +val integer: Integer.t Type.t + (* ****************************************************************************) (** {2 Generic functors for polymorphic types} *) (* ****************************************************************************) @@ -546,17 +550,17 @@ (** @plugin development guide *) module Poly_array: Polymorphic with type 'a poly = 'a array -(** @since Neon-20130301 *) +(** @since Neon-20140301 *) module Array(T: S) : S with type t = T.t array -(** @since Neon-20130301 *) +(** @since Neon-20140301 *) module Array_with_collections(T:S)(Info:Functor_info): S_with_collections with type t = T.t array -(** @since Neon-20130301 *) +(** @since Neon-20140301 *) val array: 'a Type.t -> 'a array Type.t -(** @since Neon-20130301 *) +(** @since Neon-20140301 *) module Poly_queue: Polymorphic with type 'a poly = 'a Queue.t diff -Nru frama-c-20140301+neon+dfsg/src/type/descr.ml frama-c-20150201+sodium+dfsg/src/type/descr.ml --- frama-c-20140301+neon+dfsg/src/type/descr.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/type/descr.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/type/descr.mli frama-c-20150201+sodium+dfsg/src/type/descr.mli --- frama-c-20140301+neon+dfsg/src/type/descr.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/type/descr.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -54,7 +54,7 @@ (** @since Carbon-20101201 *) val is_abstract: 'a t -> bool -(** @since Neon-20130301 *) +(** @since Neon-20140301 *) (* ********************************************************************** *) (** {2 Type descriptor builders} *) diff -Nru frama-c-20140301+neon+dfsg/src/type/structural_descr.ml frama-c-20150201+sodium+dfsg/src/type/structural_descr.ml --- frama-c-20140301+neon+dfsg/src/type/structural_descr.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/type/structural_descr.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/type/structural_descr.mli frama-c-20150201+sodium+dfsg/src/type/structural_descr.mli --- frama-c-20140301+neon+dfsg/src/type/structural_descr.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/type/structural_descr.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -109,10 +109,10 @@ (* ********************************************************************** *) val t_unknown: t -(** @since Neon-20130301 *) +(** @since Neon-20140301 *) val t_abstract: t -(** @since Neon-20130301 *) +(** @since Neon-20140301 *) val t_unit : t val t_int : t @@ -131,7 +131,7 @@ val t_array : t -> t val t_queue: t -> t val t_sum: pack array array -> t -(** @since Neon-20130301 *) +(** @since Neon-20140301 *) (** Use the functions below only if the compare/hash functions cannot change by marshalling. *) diff -Nru frama-c-20140301+neon+dfsg/src/type/type.ml frama-c-20150201+sodium+dfsg/src/type/type.ml --- frama-c-20140301+neon+dfsg/src/type/type.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/type/type.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -166,10 +166,14 @@ let add_abstract_types = ref (fun _ _ -> ()) +exception No_abstract_type of string + module Abstract(T: sig val name: string end) = struct type t let ty = - if !use_obj then (Hashtbl.find types T.name).ty + if !use_obj then + try (Hashtbl.find types T.name).ty + with Not_found -> raise (No_abstract_type T.name) else failwith "Cannot call `Type.Abstract' in `no obj' mode" let () = let p = match Str.split (Str.regexp_string ".") T.name with @@ -784,7 +788,7 @@ let type_error s ty_name ty_name' = raise (Incompatible_type - (Format.sprintf "%s has type %s but is used with type %s." + (Format.sprintf "%s has type %s but is used with type %s" s ty_name' ty_name)) let find tbl s ty = diff -Nru frama-c-20140301+neon+dfsg/src/type/type.mli frama-c-20150201+sodium+dfsg/src/type/type.mli --- frama-c-20140301+neon+dfsg/src/type/type.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/type/type.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -101,7 +101,10 @@ @modify Carbon-20101201 [value_name] is now [ml_name]. Must provide a structural descriptor. Argument [pp] does not exist anymore. *) +exception No_abstract_type of string + (** Apply this functor to access to the abstract type of the given name. + @raise No_abstract_type if no such abstract type was registered. @since Nitrogen-20111001 @plugin development guide *) module Abstract(T: sig val name: string end): sig @@ -129,7 +132,7 @@ val pp_ml_name: 'a t -> precedence -> Format.formatter -> unit val set_ml_name: 'a t -> string option -> unit val set_name: 'a t -> string -> unit -(** @since Neon-20130301 *) +(** @since Neon-20140301 *) (* ****************************************************************************) (** {2 Type values are comparable} *) diff -Nru frama-c-20140301+neon+dfsg/src/users/Users.mli frama-c-20150201+sodium+dfsg/src/users/Users.mli --- frama-c-20140301+neon+dfsg/src/users/Users.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/users/Users.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/users/users_register.ml frama-c-20150201+sodium+dfsg/src/users/users_register.ml --- frama-c-20140301+neon+dfsg/src/users/users_register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/users/users_register.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/builtins.ml frama-c-20150201+sodium+dfsg/src/value/builtins.ml --- frama-c-20140301+neon+dfsg/src/value/builtins.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/builtins.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -45,6 +45,19 @@ with Not_found -> false +(* Helper function to create the best type for a new base. + Builds an array type with the appropriate number of elements if needed *) +let type_from_nb_elems ~loc typ nb_elems = + if Int.equal Int.one nb_elems + then typ + else + try + let esize_arr = Cil.kinteger64 ~loc nb_elems in + TArray (typ, Some esize_arr, Cil.empty_size_cache (), []) + with Cil.Not_representable -> + Value_parameters.fatal + "Allocation size is too large for malloc %a." Int.pretty nb_elems + let double_double_fun name caml_fun state actuals = match actuals with [_, arg, _] -> @@ -69,25 +82,21 @@ ("Invalid argument for " ^ name ^ " function"); raise Db.Value.Aborted - -let frama_C_cos = double_double_fun "Frama_C_cos" Ival.Float_abstract.cos_float +let frama_C_cos = double_double_fun "Frama_C_cos" Ival.Float_abstract.cos let frama_C_cos_precise = - double_double_fun "Frama_C_cos_precise" Ival.Float_abstract.cos_float_precise + double_double_fun "Frama_C_cos_precise" Ival.Float_abstract.cos_precise let () = register_builtin "Frama_C_cos" frama_C_cos let () = register_builtin "Frama_C_cos_precise" frama_C_cos_precise -let frama_C_sin = double_double_fun "Frama_C_sin" Ival.Float_abstract.sin_float +let frama_C_sin = double_double_fun "Frama_C_sin" Ival.Float_abstract.sin let () = register_builtin "Frama_C_sin" frama_C_sin let frama_C_sin_precise = - double_double_fun "Frama_C_sin_precise" Ival.Float_abstract.sin_float_precise + double_double_fun "Frama_C_sin_precise" Ival.Float_abstract.sin_precise let () = register_builtin "Frama_C_sin_precise" frama_C_sin_precise -let frama_C_exp = double_double_fun "Frama_C_exp" Ival.Float_abstract.exp_float -let () = register_builtin "Frama_C_exp" frama_C_exp - (* external cos_rd : float -> float = "caml_cos_rd" external cos_ru : float -> float = "caml_cos_ru" @@ -148,42 +157,68 @@ let () = register_builtin "Frama_C_compare_cos" frama_C_compare_cos -let frama_C_sqrt state actuals = +let float_or_double_fun_alarm name caml_fun state actuals = match actuals with - [_, arg, _] -> begin - let r = - try - let i = Cvalue.V.project_ival arg in - let f = Ival.project_float i in - let result_alarm, f = - Ival.Float_abstract.sqrt_float (get_rounding_mode()) f - in - if result_alarm - then - Value_parameters.result ~once:true ~current:true - "float sqrt: assert (Ook)"; - Cvalue.V.inject_ival (Ival.inject_float f) - - with - Cvalue.V.Not_based_on_null -> - Value_parameters.result ~once:true ~current:true - "float sqrt applied to address"; - Cvalue.V.topify_arith_origin arg - | Ival.Float_abstract.Bottom -> - Value_parameters.warning ~once:true ~current:true - "invalid float sqrt: assert(Ook)"; - V.bottom - in - { Value_types.c_values = [ Eval_op.wrap_double r, state] ; - c_clobbered = Base.SetLattice.bottom; - c_cacheable = Value_types.Cacheable; - } - end - | _ -> Value_parameters.error - "Invalid argument for Frama_C_sqrt function"; - raise Db.Value.Aborted - -let () = register_builtin "Frama_C_sqrt" frama_C_sqrt + | [_, arg, _] -> begin + let warn () = + Value_parameters.warning ~once:true ~current:true + "out-of-range argument %a for function %s" V.pretty arg name + in + let r = + try + let i = Cvalue.V.project_ival arg in + let f = Ival.project_float i in + let nearest_even = Ival.Float_abstract.Nearest_Even in + let rounding_mode = Value_util.get_rounding_mode () in + if rounding_mode <> nearest_even then + Value_parameters.warning ~once:true "option -all-rounding-modes \ + is not supported for builtin %s" name; + let alarm, f' = caml_fun nearest_even f in + if alarm then warn (); + Cvalue.V.inject_ival (Ival.inject_float f') + with + | Ival.Float_abstract.Nan_or_infinite -> + Value_parameters.result ~once:true ~current:true + "@[Invalid@ (integer)@ argument %a@ for@ builtin %s.@ Probably@ \ + missing@ declaration@ 'double %s(double);@]'" + V.pretty arg name name; + warn (); + Cvalue.V.topify_arith_origin arg + | Cvalue.V.Not_based_on_null -> + if Cvalue.V.is_bottom arg then begin + (* Probably does not occur, should be caught earlier by Value *) + warn (); + V.bottom + end else begin + warn (); + Value_parameters.result ~once:true ~current:true + "function %s applied to address" name; + Cvalue.V.topify_arith_origin arg + end + | Ival.Float_abstract.Bottom -> + warn (); + V.bottom + in + { Value_types.c_values = + if V.is_bottom r then [] + else [Eval_op.wrap_double r, state ]; + c_clobbered = Base.SetLattice.bottom; + c_cacheable = Value_types.Cacheable; } + end + | _ -> + Value_parameters.error "%s" + ("Invalid argument for " ^ name ^ " function"); + raise Db.Value.Aborted + +let register name f = + let name = "Frama_C_" ^ name in + register_builtin name (float_or_double_fun_alarm name f); +;; + +let () = register "log" Ival.Float_abstract.log +let () = register "log10" Ival.Float_abstract.log10 +let () = register "exp" Ival.Float_abstract.exp +let () = register "sqrt" Ival.Float_abstract.sqrt let frama_C_assert state actuals = let do_bottom () = @@ -240,7 +275,7 @@ in let term_size = Logic_utils.expr_to_term ~cast:true exp_size in let array_dst = Logic_utils.array_with_range exp_dst term_size in - CilE.set_syntactic_context (CilE.SyMemLogic array_dst); + Valarms.set_syntactic_context (Valarms.SyMemLogic array_dst); if not (Cvalue.V.cardinal_zero_or_one dst) then raise Db.Value.Outside_builtin_possibilities; let left = loc_bytes_to_loc_bits dst @@ -250,9 +285,8 @@ in let state = if Int.gt size Int.zero then - Cvalue.Model.paste_offsetmap ~with_alarms - ~from:offsm_repeat ~dst_loc:left ~start:Int.zero ~size:size - ~exact:true state + Eval_op.paste_offsetmap ~reducing:false ~with_alarms + ~from:offsm_repeat ~dst_loc:left ~size:size ~exact:true state else state in { Value_types.c_values = [ None, state ] ; @@ -326,10 +360,10 @@ let pp_one fmt (actual, v, offsm) = (* YYY: catch pointers to arrays, and print the contents of the array *) Format.fprintf fmt "@["; - let card = Cvalue.V_Offsetmap.fold_on_values (fun _ _ -> succ) offsm 0 in + let card = Cvalue.V_Offsetmap.fold_on_values (fun _ n -> n+1) offsm 0 in (match Cil.unrollType (Cil.typeOf actual) with | TComp _ as typ when card > 1 -> - V_Offsetmap.pretty_typ (Some typ) fmt offsm + V_Offsetmap.pretty_generic ~typ:typ () fmt offsm | _ -> V.pretty fmt v ); Format.fprintf fmt "@]"; diff -Nru frama-c-20140301+neon+dfsg/src/value/builtins.mli frama-c-20150201+sodium+dfsg/src/value/builtins.mli --- frama-c-20140301+neon+dfsg/src/value/builtins.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/builtins.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -35,7 +35,13 @@ val mem_builtin: string -> bool (** Should the given function be replaced by a call to a builtin *) -val overridden_by_builtin: string -> bool +val overridden_by_builtin: Kernel_function.t -> bool + +(** Helper function to create the best type for a new base. + Builds an array type with the appropriate number of elements if needed *) +val type_from_nb_elems : + loc:Cil_types.location -> Cil_types.typ -> Integer.t -> Cil_types.typ + (** Builtins with multiple names; the lookup is done using a distinctive prefix *) diff -Nru frama-c-20140301+neon+dfsg/src/value/current_table.ml frama-c-20150201+sodium+dfsg/src/value/current_table.ml --- frama-c-20140301+neon+dfsg/src/value/current_table.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/current_table.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,127 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -open Cil_datatype - - type state_imp = State_imp.t;; - - type record = - { - superposition : State_imp.t ; - mutable widening : int ; - mutable widening_state : Cvalue.Model.t ; - mutable counter_unroll : int ; - } - - let empty_record () = - { superposition = State_imp.empty () ; - widening = Value_parameters.WideningLevel.get () ; - widening_state = Cvalue.Model.bottom ; - counter_unroll = 0; - } - - type t = record Stmt.Hashtbl.t - - let create () = - Stmt.Hashtbl.create 257 - - let clear t = Stmt.Hashtbl.clear t - - let find_current current_table kinstr = - try - Stmt.Hashtbl.find current_table kinstr - with Not_found -> - let record = empty_record () in - Stmt.Hashtbl.add current_table kinstr record; - record - - let find_widening_info current_table kinstr = - let r = find_current current_table kinstr in - r.widening, r.widening_state - - let update_and_tell_if_changed current_table kinstr d = - let record = find_current current_table kinstr in - if Cvalue.Model.is_reachable record.widening_state - then - let (j,tr) = State_set.join d in - if Cvalue.Model.is_included j record.widening_state - then State_set.empty - else State_set.singleton (j,tr) - else - State_imp.merge_set_return_new d record.superposition - - - let update_widening_info current_table kinstr wcounter wstate = - let record = find_current current_table kinstr in - record.widening <- wcounter; - record.widening_state <- wstate - - let merge_db_table hash_states callstack = - let treat_stmt k sum = - let current_state = Db.Value.noassert_get_stmt_state k in - let is_top_already = - Cvalue.Model.is_top current_state - in - if not is_top_already - then Db.Value.update_table k sum; - if Value_parameters.ResultsCallstack.get () then - Db.Value.update_callstack_table ~after:false k callstack sum - in - Stmt.Hashtbl.iter treat_stmt (Lazy.force hash_states) - - let superpositions current_table = - let r = Stmt.Hashtbl.create (Stmt.Hashtbl.length current_table) - in - Stmt.Hashtbl.iter - (fun k record -> - let sup = State_imp.to_list record.superposition in - Stmt.Hashtbl.add r k sup) - current_table; - r - - let states current_table = - let r = Stmt.Hashtbl.create (Stmt.Hashtbl.length current_table) - in - Stmt.Hashtbl.iter - (fun k record -> - Stmt.Hashtbl.add r k - (Cvalue.Model.join - (State_imp.join record.superposition) - record.widening_state)) - current_table; - r - - - let find_superposition current_table s = - let record = find_current current_table s in - let s = State_imp.to_set record.superposition in - if Cvalue.Model.is_reachable record.widening_state - (* Forget about the trace. TODO: preserve the trace. *) - then State_set.add (record.widening_state, Trace.top) s - else s - - -(* -Local Variables: -compile-command: "make -C ../.." -End: -*) diff -Nru frama-c-20140301+neon+dfsg/src/value/current_table.mli frama-c-20150201+sodium+dfsg/src/value/current_table.mli --- frama-c-20140301+neon+dfsg/src/value/current_table.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/current_table.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -open Cil_types -open Cil_datatype - -(** Internal state of the Value Analysis during analysis. *) - -(** The array of all the states associated to a statement. It uses a - different (imperative) structure than the functional [State_set], - but this is hidden by this interface where all the functions only - use [State_set]. *) -type state_imp;; - -(** State on one statement *) -type record = - { - superposition : state_imp; - mutable widening : int ; - mutable widening_state : Cvalue.Model.t ; - - (* Number of states that were put in [superposition]; i.e. the - sum of the cardinals of the state sets that were added with - [update_and_tell_if_changed]. It may be different - (i.e. larger) from the cardinal of [state_imp], that merge - states that are equal. *) - mutable counter_unroll : int ; - } - -(** State for an entire function *) -type t = record Cil_datatype.Stmt.Hashtbl.t - -val create : unit -> t -val clear : t -> unit (* Not clear this is useful, as the table is garbage-collected *) - -(** Extraction *) -val find_widening_info : t -> stmt -> int * Cvalue.Model.t -val find_superposition : t -> stmt -> State_set.t -val find_current : t -> stmt -> record - -(** Updating *) -(* [update_and_tell_if_changed t stmt set] merges [set] into the - [superposition] associated to [stmt], and returns the subset of - [set] that was not already in the superposition. *) -val update_and_tell_if_changed : t -> stmt -> State_set.t -> State_set.t -val update_widening_info : t -> stmt -> int -> Cvalue.Model.t -> unit - -(** Export *) -val superpositions : t -> Cvalue.Model.t list Stmt.Hashtbl.t -val states : t -> Cvalue.Model.t Stmt.Hashtbl.t - -(** Merge the results of the current analysis with the global results. - Honor [-no-results*] options *) -val merge_db_table : - Db.Value.state Stmt.Hashtbl.t Lazy.t -> Db.Value.callstack -> unit diff -Nru frama-c-20140301+neon+dfsg/src/value/eval_annots.ml frama-c-20150201+sodium+dfsg/src/value/eval_annots.ml --- frama-c-20140301+neon+dfsg/src/value/eval_annots.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/eval_annots.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -43,12 +43,12 @@ if not (Cil.is_default_behavior b) then Format.fprintf fmt ", behavior %s" b.b_name - let is_active_aux init_state b = + let is_active_aux pre_state b = let assumes = (Logic_const.pands (List.map Logic_const.pred_of_id_pred b.b_assumes)) in - eval_predicate (env_pre_f ~init:init_state ()) assumes + eval_predicate (env_pre_f ~pre:pre_state ()) assumes type t = { init_state: Cvalue.Model.t; @@ -96,12 +96,9 @@ end -(* Does the given function has any requires to evaluate. Use kf.spec as - a shortcut. *) -let has_requires kf = +let has_requires spec = let behav_has_requires b = b.b_requires <> [] in - List.exists behav_has_requires kf.spec.spec_behavior - + List.exists behav_has_requires spec.spec_behavior let conv_status = function | False -> Property_status.False_if_reachable; @@ -255,6 +252,129 @@ in List.fold_left incorporate_behavior post_states behaviors +let check_fct_assigns kf ab ~pre_state found_froms = + let open Locations in + let behaviors = Annotations.behaviors kf in + + (* Eval: under-approximation of the term. Note that ACSL states + that assigns clauses are evaluated in the pre-state. We skip [\result]: + it is meaningless when evaluating the 'assigns' part, and treated + specially in the 'from' part. *) + let eval it = + let term = it.it_content in + if Logic_utils.is_result it.it_content then + Zone.bottom + else + let eval_env = Eval_terms.env_assigns pre_state in + fst (Eval_terms.eval_tlval_as_zone_under_over + ~with_alarms:CilE.warn_none_mode ~for_writing:false eval_env term) + in + (* Under-approximation of the union. *) + let link zones = List.fold_left Zone.link Zone.bottom zones in + + let outputs = Function_Froms.outputs found_froms in + + let check_for_behavior b = + let activity = ActiveBehaviors.active ab b in + match activity with + | False -> () + | True | Unknown -> + let pp_activity fmt activity = match activity with + | False -> assert false + | True -> () + (* If unknown, the error may be because we did not notice + that the behavior is inactive. *) + | Unknown -> Format.fprintf fmt "(the behavior may be inactive)" + in + + (match b.b_assigns with + | WritesAny -> () + | Writes(assigns_deps) -> + let bol = Property.Id_behavior b in + let ip = Extlib.the (Property.ip_of_assigns kf Kglobal bol b.b_assigns) + in + let source = fst (Property.location ip) in + + (* First, check the assigns. *) + let assigns = List.map fst assigns_deps in + let assigns_zones = List.map eval assigns in + let assigns_union = link assigns_zones in + let status_txt,status = + if not (Zone.is_included outputs assigns_union) + then ( + Value_parameters.debug "found_assigns %a stated_assigns %a" + Zone.pretty outputs Zone.pretty assigns_union; + "unknown",Property_status.Dont_know) + else "valid",Property_status.True + in + Value_parameters.result ~once:true ~source + "%a: assigns got status %s.%a%t" + (pp_header kf) b + status_txt + pp_activity activity + Value_util.pp_callstack; + emit_status ip status; + notify_status ip status pre_state; + + (* Now, checks the individual froms. *) + let check_from ((asgn,deps) as from) assigns_zone = + match deps with + | FromAny -> () + | From(deps) -> + let source = fst (asgn.it_content.term_loc) in + let ip = Property.ip_of_from kf Kglobal bol from in + (* Note: narrowing the stated assigns (in [assigns_zone]) + with the ones really found (in [outputs]) allows to + have less dependencies. But this is sound only if the + assigns from express a weak update. + + For instance for the function void f(){ a[2] = b;} the + contract assigns a[1..2] \from b is incorrect (and + would be incorrectly proved by this optimization) + whereas assigns a[1..2] \from a,b could be safely + optimized. + + let assigns_zone = Zone.narrow assigns_zone outputs in + *) + let found_deps = + if Logic_utils.is_result asgn.it_content then + Function_Froms.(Deps.to_zone found_froms.deps_return) + else + Function_Froms.Memory.find + found_froms.Function_Froms.deps_table assigns_zone + in + let stated_deps = link (List.map eval deps) in + + let status_txt,status = + if not (Zone.is_included found_deps stated_deps) + then ( + Value_parameters.debug "found_deps %a stated_deps %a" + Zone.pretty found_deps Zone.pretty stated_deps; + "unknown",Property_status.Dont_know) + else "valid",Property_status.True + in + Value_parameters.result ~once:true ~source + "%a: \\from ... part in assign clause got status %s.%a%t" + (pp_header kf) b + status_txt + pp_activity activity + Value_util.pp_callstack; + emit_status ip status; + notify_status ip status pre_state; + in + List.iter2 check_from assigns_deps assigns_zones) + + in List.iter check_for_behavior behaviors +;; + +let verify_assigns_from kf ~pre froms = + let ab = ActiveBehaviors.create pre kf in + check_fct_assigns kf ab ~pre_state:pre froms +;; + +Db.Value.verify_assigns_froms := verify_assigns_from;; + + (** Check the precondition of [kf]. This may result in splitting [init_state] into multiple states if the precondition contains disjunctions. *) let check_fct_preconditions kf ab call_ki init_state = @@ -277,25 +397,33 @@ let ip_call = Statuses_by_call.precondition_at_call kf ip_precondition stmt in ip_call in - let build_env init = env_pre_f ~init () in + let build_env pre = env_pre_f ~pre () in eval_and_reduce_pre_post kf ab b Precondition b.b_requires states build_prop build_env in List.fold_left incorporate_behavior init_states spec.spec_behavior +let code_annotation_text ca = + match ca.annot_content with + | AAssert _ -> "Assertion" + | AInvariant _ -> "Loop invariant" + | APragma _ | AVariant _ | AAssigns _ | AAllocation _ | AStmtSpec _ -> + assert false (* currently not treated by Value *) + +let code_annotation_source ca = + match Cil_datatype.Code_annotation.loc ca with + | Some loc when not (Cil_datatype.Location.(equal loc unknown)) -> fst loc + | _ -> fst (Cil.CurrentLoc.get ()) (* fallback: current statement *) (* Reduce the given states according to the given code annotations. If [record] is true, update the proof state of the code annotation. DO NOT PASS record=false unless you know what your are doing *) let interp_annot kf ab initial_state slevel states stmt ca record = let ips = Property.ip_of_code_annot kf stmt ca in - let source = match Cil_datatype.Code_annotation.loc ca with - | Some loc when not (Cil_datatype.Location.equal - loc Cil_datatype.Location.unknown) - -> fst loc - | _ -> fst (Cil.CurrentLoc.get ()) (* fallback: current statement *) - in - let aux_interp text behav p ip = + let source = code_annotation_source ca in + let aux_interp ca behav p = + let ip = Property.ip_of_code_annot_single kf stmt ca in + let text = code_annotation_text ca in let in_behavior = match behav with | [] -> `True @@ -366,21 +494,21 @@ 'nice' ordering *) State_set.reorder reduced_states in - let aux text behav p ip = + let aux ca behav p = if State_set.is_empty states then ( - if record then + if record then begin + let text = code_annotation_text ca in Value_parameters.result ~once:true ~source "no state left in which to evaluate %s, status not \ computed.%t" (String.lowercase text) Value_util.pp_callstack; + end; states ) else - aux_interp text behav p ip + aux_interp ca behav p in match ca.annot_content with - | AAssert (behav,p) -> - aux "Assertion" behav p (Property.ip_of_code_annot_single kf stmt ca) - | AInvariant (behav, true, p) -> - aux "Loop invariant" behav p (Property.ip_of_code_annot_single kf stmt ca) + | AAssert (behav,p) + | AInvariant (behav, true, p) -> aux ca behav p | APragma _ | AInvariant (_, false, _) | AVariant _ | AAssigns _ | AAllocation _ @@ -419,6 +547,10 @@ | Instr (Call (_, e, _, _)) -> (match Kernel_function.get_called e with | Some kf -> + (* Setup all precondition statuses for [kf]: maybe it has + never been called anywhere. *) + Statuses_by_call.setup_all_preconditions_proxies kf; + (* Now mark the statuses at this particular statement as dead *) let preconds = Statuses_by_call.all_call_preconditions_at ~warn_missing:false kf stmt @@ -452,6 +584,80 @@ ) ) +(* Evaluates [p] at [stmt], using the most precise states available: + per-callstacks if possible, or the synthetic state otherwise. *) +let eval_by_callstack kf stmt p = + (* This is actually irrelevant for alarms: they never use \old *) + let pre = Db.Value.get_initial_state kf in + let aux_callstack _callstack state acc_status = + let env = Eval_terms.env_annot ~pre ~here:state () in + let status = Eval_terms.eval_predicate env p in + let open Eval_terms in + (* Join: unknown anywhere or True+False means unknown *) + match status, acc_status with + | Unknown, _ | True, Some False | False, Some True | _, Some Unknown -> + raise Exit + | (True | False), None -> Some status + | True, Some True | False, Some False -> acc_status + in + match Db.Value.get_stmt_state_callstack ~after:false stmt with + | None -> (* per-callstacks results unavailable *) + let state = Db.Value.get_stmt_state stmt in + if Cvalue.Model.is_reachable state then begin + let env = Eval_terms.env_annot ~pre ~here:state () in + Eval_terms.eval_predicate env p + end + else Unknown (* Do not evaluate. An 'unreachable' status is better. *) + | Some states -> begin (* Per-callstacks results available *) + try + match Value_types.Callstack.Hashtbl.fold aux_callstack states None with + | None -> Eval_terms.Unknown (* probably never reached *) + | Some status -> status + with Exit -> Eval_terms.Unknown + end + +(* Re-evaluate all alarms, and see if we can put a 'green' or 'red' status, + which would be more precise than those we have emitted during the current + analysis. *) +let mark_green_and_red () = + let do_code_annot stmt _e ca = + match Alarms.find ca with + | None -> () (* Not an alarm. Do nothing, as we already put a status on this + assert each time value visited the statement. *) + | Some _ -> + match ca.annot_content with + | AAssert (_, p) | AInvariant (_, true, p) -> + let kf = Kernel_function.find_englobing_kf stmt in + let ip = Property.ip_of_code_annot_single kf stmt ca in + (* This status is exact: we are _not_ refining the statuses previously + emitted, but writing a synthetic more precise status. *) + let distinct = false in + let emit status = + let status, text_status = match status with + | `True -> Property_status.True, "valid" + | `False -> Property_status.False_if_reachable, "invalid" + in + Property_status.emit ~distinct Value_util.emitter ~hyps:[] ip status; + let source = code_annotation_source ca in + let text_ca = code_annotation_text ca in + Value_parameters.result ~once:true ~source "%s%a got final status %s." + text_ca Description.pp_named p text_status; + in + begin + match eval_by_callstack kf stmt p with + | Eval_terms.False -> emit `False + | Eval_terms.True -> (* should not happen for an alarm that has been + emitted during this Value analysis. However, this is perfectly + possible for an 'old' alarm. *) + emit `True + | Eval_terms.Unknown -> () + end + | AInvariant (_, false, _) | AStmtSpec _ | AVariant _ | AAssigns _ + | AAllocation _ | APragma _ -> () + in + Annotations.iter_all_code_annot do_code_annot + + let () = Db.Value.valid_behaviors := (fun kf state -> diff -Nru frama-c-20140301+neon+dfsg/src/value/eval_exprs.ml frama-c-20150201+sodium+dfsg/src/value/eval_exprs.ml --- frama-c-20140301+neon+dfsg/src/value/eval_exprs.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/eval_exprs.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -54,7 +54,7 @@ let msg fmt = Format.fprintf fmt "%a (%a)" Printer.pp_exp e_src Cvalue.V.pretty v in - CilE.set_syntactic_context (CilE.SyUnOp e_src); + Valarms.set_syntactic_context (Valarms.SyUnOp e_src); Eval_op.do_promotion ~with_alarms rounding_mode ~src_typ ~dst_typ v msg @@ -154,10 +154,6 @@ it would be better and more powerful to have chains of inverse functions *) and pass_cast state exn typ e = let typeofe = typeOf e in - (* Any volatile attribute may have an effect on the expression value *) - if hasAttribute "volatile" (typeAttrs typeofe) - || hasAttribute "volatile" (typeAttrs typ) - then raise exn; (* Format.printf "pass_cast %a as %a@." Printer.pp_exp e Printer.pp_typ typ; *) match unrollType typ, unrollType typeofe with | (TInt _ | TEnum _), (TInt _ | TEnum _) -> @@ -183,44 +179,44 @@ if not (V.is_included (eval_expr ~with_alarms state e) all_values) then raise exn + | TPtr _, TPtr _ -> () + | TPtr _, TInt (ik, _) | TInt (ik, _), TPtr _ + when Cil.theMachine.upointKind = ik -> () + | TFloat (f1,_), TFloat (f2, _) -> if Cil.frank f1 < Cil.frank f2 then raise exn (* TODO: check value inclusion as in the integer case *) | _ -> raise exn (* Not a scalar type *) -and find_lv ~with_alarms (state:Cvalue.Model.t) ee = - (* [BM] Do not recognize an lval whenever a volatile is involved to - prevent copy/paste optimization. IS THIS THE RIGHTPLACE PC ?*) - if hasAttribute "volatile" (typeAttrs (typeOf ee)) then - raise cannot_find_lv; +and find_lv state ee = match ee.enode with | Lval lv -> lv | CastE (typ,e) -> pass_cast state cannot_find_lv typ e; - find_lv ~with_alarms state e + find_lv state e | _ -> raise cannot_find_lv (** If possible, decomposes [e] into [lval+offset]; where [lval] is a Cil expression, and [offset] is an Ival.t, in bytes. @raises Cannot_find_lv if the expression cannot be decomposed *) -and find_lv_plus_offset ~with_alarms state e = +and find_lv_plus_offset state e = let acc = ref None in let rec aux e current_offs = try - let lv = find_lv ~with_alarms state e in - if not (hasAttribute "volatile" (typeAttrs (Cil.typeOfLval lv))) + let lv = find_lv state e in + if not (typeHasQualifier "volatile" (Cil.typeOfLval lv)) then acc := Some (lv,current_offs) with Cannot_find_lv -> match e.enode with | BinOp((MinusPI|PlusPI|IndexPI as op), p, offs, typ) -> - let offs = eval_expr ~with_alarms state offs in + let offs = eval_expr ~with_alarms:CilE.warn_none_mode state offs in (try let offs = V.project_ival offs in let offs = Ival.scale (Int_Base.project (osizeof_pointed typ)) offs in - let offs = if op = MinusPI then Ival.neg offs else offs in + let offs = if op = MinusPI then Ival.neg_int offs else offs in aux p (Ival.add_int current_offs offs) with V.Not_based_on_null | Int_Base.Error_Top-> ()); | _ -> () @@ -263,9 +259,7 @@ (Locations.Location_Bits.inject varid offset) (sizeof_lval lv) in - let contents = - Cvalue.Model.find ~conflate_bottom:true state ~with_alarms loc - in + let contents = snd (Cvalue.Model.find state loc) in if Location_Bytes.cardinal_zero_or_one contents then acc (* small cardinal: not influential *) else loc :: acc @@ -303,33 +297,6 @@ in get_vars [] exp -and reduce_by_valid_loc ~positive ~for_writing loc typ state = - try - let value = Cvalue.Model.find ~with_alarms:CilE.warn_none_mode - ~conflate_bottom:true state loc - in - if Cvalue.V.is_imprecise value then - (* we won't reduce anything anyway, and we may lose information if loc - contains misaligned data *) - raise cannot_find_lv; - let value_as_loc = - make_loc (loc_bytes_to_loc_bits value) (sizeof_pointed typ) - in - let reduced_value = - loc_to_loc_without_size - (if positive - then valid_part ~for_writing value_as_loc - else invalid_part value_as_loc ) - in - if Location_Bytes.equal value reduced_value - then state - else begin - if Location_Bytes.equal Location_Bytes.bottom reduced_value - then Cvalue.Model.bottom - else - Cvalue.Model.reduce_previous_binding state loc reduced_value - end - with Cannot_find_lv -> state and eval_binop ~with_alarms e deps state = match e.enode with @@ -348,26 +315,40 @@ else begin match unrollType (typeOf e1) with | TFloat (fkind, _) -> - CilE.set_syntactic_context (CilE.SyUnOp e); + Valarms.set_syntactic_context (Valarms.SyUnOp e); let r = Eval_op.eval_binop_float ~with_alarms (get_rounding_mode ()) (Some fkind) ev1 op ev2 in state, deps, r | TInt _ | TPtr (_, _) | _ as te1 -> - CilE.set_syntactic_context (CilE.SyBinOp(e, op, e1, e2)); - let v = - Eval_op.eval_binop_int ~with_alarms ~typ ~te1 ev1 op ev2 - in - (* Warn if overflow during a non-bitwise operation *) - let v = match op with + Valarms.set_syntactic_context (Valarms.SyBinOp(e, op, e1, e2)); + (* Implicit preconditions of [op] *) + let state, ev1, ev2 = match op with + | Mod | Div -> + Warn.maybe_warn_div ~with_alarms ev2; + state, ev1, ev2 (* TODO: we could reduce ev2 *) + | Shiftlt -> + warn_reduce_shift_left ~with_alarms state te1 e1 ev1 e2 ev2 + | Shiftrt -> + let state, ev2 = + warn_reduce_shift_rhs ~with_alarms state te1 e2 ev2 + in + state, ev1, ev2 + | _ -> state, ev1, ev2 + in + let v = + Eval_op.eval_binop_int ~with_alarms ~te1 ev1 op ev2 + in + (* Warn if overflow during a non-bitwise operation *) + let v = match op with | Shiftlt | Mult | MinusPP | MinusPI | IndexPI | PlusPI | PlusA | Div | Mod | MinusA -> let warn_unsigned = op <> Shiftlt in Eval_op.handle_overflow ~with_alarms ~warn_unsigned typ v | _ -> v - in - state, deps, v + in + state, deps, v end | _ -> assert false @@ -384,12 +365,9 @@ begin match v with | CInt64 (i,_k,_s) -> V.inject_int i (* TODO: missing checks for overflow *) - | CChr c -> - (match charConstToInt c with - | CInt64 (i,_,_) -> V.inject_int i - | _ -> assert false) + | CChr c -> V.inject_int (charConstToInt c) | CReal (f, fkind, fstring) -> - CilE.set_syntactic_context (CilE.SyUnOp e); + Valarms.set_syntactic_context (Valarms.SyUnOp e); Eval_op.eval_float_constant ~with_alarms f fkind fstring | CWStr _ | CStr _ -> V.inject (Base.of_string_exp e) Ival.zero @@ -418,11 +396,10 @@ state, deps, r | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ | AlignOfE _ -> - let e = Cil.constFold true orig_expr in - let r = match e.enode with - | Const (CInt64 (v, _, _)) -> Cvalue.V.inject_int v + let r = match Cil.constFoldToInt orig_expr with + | Some v -> Cvalue.V.inject_int v | _ -> - CilE.do_warn with_alarms.CilE.imprecision_tracing + Valarms.do_warn with_alarms.CilE.imprecision_tracing (fun _ -> Value_parameters.result ~current:true "cannot interpret sizeof or alignof (incomplete type)" @@ -435,29 +412,22 @@ let state, deps, expr = eval_expr_with_deps_state ~with_alarms deps state e in let syntactic_context = match op with - | Neg -> CilE.SyUnOp orig_expr (* Can overflow *) - | BNot -> CilE.SyUnOp orig_expr (* does in fact never raise an alarm*) - | LNot -> CilE.SyUnOp e - (* Can raise a pointer comparison. CilE needs [e] there *) + | Neg -> Valarms.SyUnOp orig_expr (* Can overflow *) + | BNot -> Valarms.SyUnOp orig_expr(* does in fact never raise an alarm*) + | LNot -> Valarms.SyUnOp e + (* Can raise a pointer comparison. Valarms needs [e] there *) in let t = unrollType (typeOf e) in - CilE.set_syntactic_context syntactic_context; + Valarms.set_syntactic_context syntactic_context; let result = Eval_op.eval_unop ~check_overflow:true ~with_alarms expr t op in state, deps, result in - let r = - if hasAttribute "volatile" (typeAttrs (typeOf e)) - && not (Cvalue.V.is_bottom r) - then Eval_op.light_topify r - else r - in - let typ = typeOf e in - CilE.set_syntactic_context (CilE.SyUnOp e); + Valarms.set_syntactic_context (Valarms.SyUnOp e); (* TODO: the functions called above should respect the destination type. Calling reinterpret should be useless *) - let rr = Eval_op.reinterpret ~with_alarms typ r in + let rr = Eval_op.reinterpret ~with_alarms (typeOf e) r in (if Cvalue.V.is_bottom rr then Cvalue.Model.bottom else state), deps, rr and eval_expr_with_deps_state_subdiv ~with_alarms deps state e = @@ -502,21 +472,14 @@ try if not (List.exists (fun x -> Locations.loc_equal v x) tail) then raise too_linear; - let v_value = - Cvalue.Model.find - ~conflate_bottom:true - ~with_alarms:CilE.warn_none_mode - state - v - in - (* Value_parameters.result ~current:true - "subdivfloatvar: considering optimizing variable %a (value %a)" - Locations.pretty v Cvalue.V.pretty v_value; *) + let _, v_value = Cvalue.Model.find state v in + (* Value_parameters.result ~current:true + "subdivfloatvar: considering optimizing variable %a (value %a)" + Locations.pretty v Cvalue.V.pretty v_value; *) if not (Locations.Location_Bytes.is_included v_value Locations.Location_Bytes.top_float) then raise too_linear; - let working_list = ref [ (v_value, result_without_subdiv) ] in let bound1, bound2 = Cvalue.V.min_and_max_float v_value in let compute subvalue = @@ -692,14 +655,17 @@ in (try (* Decompose [exp_mem] into a base lvalue and an offset *) - let lv_mem, plus = find_lv_plus_offset - ~with_alarms state exp_mem in + let lv_mem, plus = find_lv_plus_offset state exp_mem in (* Total offset, still in bytes *) let plus = Ival.add_int plus offs in let state, loc_mem, _typ_plus = lval_to_loc_state ~with_alarms state lv_mem in - let loc_mem = Locations.valid_part ~for_writing loc_mem in + let loc_mem = + (* Writing or reading to *p -> + in any case, p needs to be valid for reading *) + Locations.valid_part ~for_writing:false loc_mem + in if Location_Bits.is_relationable loc_mem.Locations.loc then (* is_relationable guarantees that [loc_mem] is a single binding, @@ -707,7 +673,7 @@ the original location shifted by [-plus] *) let new_val = Location_Bytes.shift - (Ival.neg plus) (loc_bits_to_loc_bytes valid_loc.loc) + (Ival.neg_int plus)(loc_bits_to_loc_bytes valid_loc.loc) in (* [new_val] is not necessarily included in previous binding, use [reduce_binding] *) @@ -724,15 +690,11 @@ let base_pointer = eval_expr ~with_alarms state p in if Cvalue.V.cardinal_zero_or_one base_pointer then begin - let lv_index = find_lv ~with_alarms state exp_index in + let lv_index = find_lv state exp_index in let loc_index = lval_to_loc state ~with_alarms lv_index in if Location_Bits.is_relationable loc_index.Locations.loc then - let old_index_val = - Cvalue.Model.find - ~conflate_bottom:true - ~with_alarms - state loc_index + let _, old_index_val = Cvalue.Model.find state loc_index in if Cvalue.V.is_included old_index_val Cvalue.V.top_int then @@ -824,17 +786,21 @@ (* Auxiliary function for [eval_lval] below. We are evaluating the location [loc] that resulted from the evaluation of [lv]. *) - and eval_lval_one_loc ~conflate_bottom ~with_alarms deps state lv typ_lv loc = - CilE.set_syntactic_context (CilE.SyMem lv); - let state, result = - if conflate_bottom - then - Cvalue.Model.find_and_reduce_indeterminate ~with_alarms state loc - else - state, - (Cvalue.Model.find ~conflate_bottom ~with_alarms state loc) + and eval_lval_one_loc ~with_alarms deps state lv typ_lv loc = + Valarms.set_syntactic_context (Valarms.SyMem lv); + (* ignore alarm, which will be emitted by warn_reduce_by_accessed_loc *) + let _alarm_loc, v = Model.find_unspecified state loc in + let result = V_Or_Uninitialized.get_v v in + let indeterminate = Warn.maybe_warn_indeterminate ~with_alarms v in + Warn.maybe_warn_completely_indeterminate ~with_alarms loc v result; + let state = (* If v is indeterminate then warn, and reduce when possible *) + if indeterminate then + Eval_op.reduce_by_initialized_defined + V_Or_Uninitialized.remove_indeterminateness loc state + else state in - let result = Eval_op.cast_lval_bitfield typ_lv loc.size result in + let result = Eval_op.make_volatile ~typ:typ_lv result in + let result = Eval_op.cast_lval_if_bitfield typ_lv loc.size result in let state, loc = warn_reduce_by_accessed_loc ~with_alarms ~for_writing:false state loc lv in @@ -847,7 +813,7 @@ in state, new_deps, result - and eval_lval ~conflate_bottom ~with_alarms deps state lv = + and eval_lval ~with_alarms deps state lv = let state, deps, precise_loc, typ_lv = lval_to_precise_loc_deps_state ~with_alarms ~deps state lv ~reduce_valid_index:(Kernel.SafeArrays.get ()) @@ -857,8 +823,7 @@ else let aux loc (res_state, res_deps, res_result) = let state', deps, res' = - eval_lval_one_loc ~with_alarms ~conflate_bottom - res_deps state lv typ_lv loc + eval_lval_one_loc ~with_alarms res_deps state lv typ_lv loc in Model.join res_state state', deps, V.join res' res_result in @@ -868,10 +833,8 @@ state, deps, res, typ_lv and eval_lval_and_convert ~with_alarms deps state (e, lv) = - let state, deps, oldv, typ = - eval_lval ~conflate_bottom:true ~with_alarms deps state lv - in - CilE.set_syntactic_context (CilE.SyUnOp e); + let state, deps, oldv, typ = eval_lval ~with_alarms deps state lv in + Valarms.set_syntactic_context (Valarms.SyUnOp e); let newv = Eval_op.reinterpret ~with_alarms typ oldv in (* Reduce if the conversion has really improved the result; in particular float that are top_int are reduced there. On the other hand, we do not @@ -879,10 +842,7 @@ let state' = (* Currently, we only store the reduction infinite float -> finite. *) if V.equal oldv V.top_int && isFloatingType typ then - try - let loc, _v, _ = eval_as_exact_loc ~with_alarms ~locv:false state e in - Cvalue.Model.reduce_previous_binding state loc newv - with Not_an_exact_loc -> state + reduce_previous_value state e newv else state in state', deps, newv @@ -890,7 +850,7 @@ (** We are accessing an array of size [array_size] at indexes [index] in state [state]. If index causes an out-of-bounds access, emit an informative alarm, reduce [index], and if possible reduce [index_exp] in [state]. *) - and reduce_index ~with_alarms array_size_exp array_size index_exp index state = + and warn_reduce_index ~with_alarms array_size_exp array_size index_exp index state = let array_range = Ival.inject_range (Some Int.zero) (Some (Integer.pred array_size)) in @@ -898,7 +858,7 @@ if Ival.equal new_index index then state, index else begin - CilE.do_warn with_alarms.CilE.others + Valarms.do_warn with_alarms.CilE.others (fun _ -> let range = Pretty_utils.to_string Ival.pretty index in let positive = match Ival.min_int index with @@ -907,22 +867,13 @@ in let size = Extlib.the array_size_exp (* array_size exists *) in (* first [index_exp] is unused *) - let sc = CilE.SyBinOp (index_exp, IndexPI, index_exp, size) in - CilE.set_syntactic_context sc; - CilE.warn_index with_alarms ~positive ~range + let sc = Valarms.SyBinOp (index_exp, IndexPI, index_exp, size) in + Valarms.set_syntactic_context sc; + Valarms.warn_index with_alarms ~positive ~range ); - begin - try - let loc,_,_= - eval_as_exact_loc ~with_alarms ~locv:false state index_exp - in - let ival_new_index = V.inject_ival new_index in - let new_state = - Cvalue.Model.reduce_previous_binding state loc ival_new_index - in - new_state, new_index - with Not_an_exact_loc -> state, new_index - end + let new_index_v = V.inject_ival new_index in + let state = reduce_previous_value state index_exp new_index_v in + state, new_index end and eval_offset ~with_alarms ~reduce_valid_index deps typ state offset = @@ -949,8 +900,14 @@ try if reduce_valid_index then let array_size_i = lenOfArray64 array_size in - reduce_index ~with_alarms - array_size array_size_i exp index_i state + (* Handle the special GCCism of zero-sized arrays: + Frama-C pretends their size is unknown, exactly like + GCC. *) + if Integer.is_zero array_size_i then + state,index_i + else + warn_reduce_index ~with_alarms + array_size array_size_i exp index_i state else state, index_i with LenOfArray -> state, index_i (* unknown array size *) in @@ -976,7 +933,7 @@ | Field (fi,remaining) -> let attrs = filter_qualifier_attributes (typeAttr typ) in let typ_fi = typeAddAttributes attrs fi.ftype in - let state, deps, r, typ = + let state, deps, r, typ_res = eval_offset ~with_alarms ~reduce_valid_index deps typ_fi state remaining in @@ -986,7 +943,7 @@ Precise_locs.shift_offset_by_singleton (Int.of_int field) r with Cil.SizeOfError _ -> Precise_locs.offset_top in - state, deps, off, typ + state, deps, off, typ_res and topify_offset ~with_alarms deps state acc offset = match offset with | NoOffset -> deps,acc @@ -1002,21 +959,26 @@ in topify_offset ~with_alarms deps state acc remaining - and eval_as_exact_loc ~with_alarms ?(locv=true) state e = + (** Set [locv] to [true] if you want to compute the value pointed to by + [loc] simultaneously. *) + and eval_as_exact_loc ?(locv=true) state e = + let with_alarms = CilE.warn_none_mode in try - let lv = find_lv ~with_alarms state e in + let lv = find_lv state e in + (* eval_as_exact_loc is only used for reducing values, and we must NOT + reduce volatile locations. *) + if typeHasQualifier "volatile" (typeOfLval lv) then + raise Not_an_exact_loc; let _, loc, typ = lval_to_loc_state ~with_alarms state lv in let loc = Locations.valid_part ~for_writing:false loc in if not (cardinal_zero_or_one loc) then raise not_an_exact_loc; let v = if locv then begin - CilE.set_syntactic_context (CilE.SyMem lv); - let v = Cvalue.Model.find ~with_alarms - ~conflate_bottom:true state loc - in - CilE.set_syntactic_context (CilE.SyUnOp e); + Valarms.set_syntactic_context (Valarms.SyMem lv); + let _, v = Cvalue.Model.find state loc in + Valarms.set_syntactic_context (Valarms.SyUnOp e); let v' = Eval_op.reinterpret ~with_alarms typ v in - let v' = Eval_op.cast_lval_bitfield typ loc.size v' in + let v' = Eval_op.cast_lval_if_bitfield typ loc.size v' in v' end else V.bottom @@ -1028,38 +990,75 @@ and warn_reduce_by_accessed_loc ~with_alarms ~for_writing state loc lv = let warn = not (Locations.is_valid ~for_writing loc) in if warn then begin - CilE.set_syntactic_context (CilE.SyMem lv); - (if for_writing then CilE.warn_mem_write else CilE.warn_mem_read) + Valarms.set_syntactic_context (Valarms.SyMem lv); + (if for_writing then Valarms.warn_mem_write else Valarms.warn_mem_read) with_alarms; (* The calls to [is_valid] and to [reduce_by_accessed_loc] below cannot be - fused because of bases with validity unkwnown *) + fused because of bases with validity unknown *) reduce_by_accessed_loc ~for_writing state lv loc end else state, loc +(** Reduce the rhs argument of a shift so that it fits inside [size] bits. + Also reduce the state when possible *) +and warn_reduce_shift_rhs ~with_alarms state typ e ve = + let size = Cil.bitsSizeOf typ in + let size_int = Int.of_int size in + let valid_range_rhs = + V.inject_ival + (Ival.inject_range (Some Int.zero) (Some (Int.pred size_int))) + in + if not (V.is_included ve valid_range_rhs) then begin + Valarms.warn_shift with_alarms size; + let ve = V.narrow ve valid_range_rhs in + reduce_previous_value state e ve, ve + end else state, ve + +(** Reduce both arguments of a left shift, and the state if possible *) +and warn_reduce_shift_left ~with_alarms state typ e1 v1 e2 v2 = + let state, v2 = warn_reduce_shift_rhs ~with_alarms state typ e2 v2 in + let warn_negative = + Value_parameters.WarnLeftShiftNegative.get() && + Bit_utils.is_signed_int_enum_pointer typ + in + let state, v1 = (* Cannot left-shift a negative value *) + if warn_negative then begin + let valid_range_lhs = + V.inject_ival (Ival.inject_range (Some Int.zero) None) + in + if not (V.is_included v1 valid_range_lhs) then begin + Valarms.warn_shift_left_positive with_alarms; + let v1 = V.narrow v1 valid_range_lhs in + reduce_previous_value state e1 v1, v1 + end else + state, v1 + end + else state, v1 + in + state, v1, v2 -let reduce_rel_from_type t = - if isIntegralType t || isPointerType t - then Eval_op.reduce_rel_int - else Eval_op.reduce_rel_float (Value_parameters.AllRoundingModes.get ()) +and reduce_previous_value state e newv = + try + let loc, _, _ = eval_as_exact_loc ~locv:false state e in + Model.reduce_previous_binding state loc newv + with Not_an_exact_loc -> state (** Reduce the state for comparisons of the form 'v Rel k', where v evaluates to a location, and k to some value *) -let reduce_by_left_comparison_abstract eval pos expl binop expr state = - let with_alarms = CilE.warn_none_mode in +let reduce_by_left_comparison_abstract pos expl binop expr state = try let loc, val_for_loc, invert, val_compared, typ_loc = try let loc, value, typ = - eval_as_exact_loc ~with_alarms state expl + eval_as_exact_loc state expl in loc, value, (fun x -> x), value, typ with Not_an_exact_loc -> let invert_cast e1 typ_loc = let loc, val_for_loc, typ_for_loc = - eval_as_exact_loc ~with_alarms state e1 + eval_as_exact_loc state e1 in ( match Cil.unrollType typ_for_loc with | TFloat ((FDouble|FFloat) as fk, _) -> @@ -1087,20 +1086,18 @@ | _ -> raise not_an_exact_loc) in + let reduce = Eval_op.reduce_rel_from_type typ_loc in let cond_v = expr in - let v_sym = - eval.Eval_op.reduce_rel_symmetric pos binop cond_v val_compared in - let v_asym = - eval.Eval_op.reduce_rel_antisymmetric ~typ_loc pos binop cond_v v_sym in + let v_reduced = reduce pos binop cond_v val_compared in (* Format.printf "reduce_by_left %a -> %a -> %a@." Cvalue.V.pretty val_for_loc Cvalue.V.pretty val_compared - Cvalue.V.pretty v_asym; *) - if V.equal v_asym V.bottom then raise reduce_to_bottom; - if V.equal v_asym val_compared + Cvalue.V.pretty v_reduced; *) + if V.equal v_reduced V.bottom then raise reduce_to_bottom; + if V.equal v_reduced val_compared then state else ( - let new_val_for_loc = invert v_asym in + let new_val_for_loc = invert v_reduced in let new_val_for_loc = V.narrow new_val_for_loc val_for_loc in if V.equal new_val_for_loc val_for_loc then state @@ -1108,27 +1105,27 @@ (* Format.printf "reduce_by_left %a -> %a -> %a -> %a@." Cvalue.V.pretty val_for_loc Cvalue.V.pretty val_compared - Cvalue.V.pretty v_asym + Cvalue.V.pretty v_reduced Cvalue.V.pretty new_val_for_loc; *) Cvalue.Model.reduce_previous_binding state loc new_val_for_loc end ) with | Not_an_exact_loc | Cil.SizeOfError _ -> state -let reduce_by_left_comparison eval pos expl binop expr state = +let reduce_by_left_comparison pos expl binop expr state = let expr = eval_expr ~with_alarms:CilE.warn_none_mode state expr in - reduce_by_left_comparison_abstract eval pos expl binop expr state + reduce_by_left_comparison_abstract pos expl binop expr state (** Reduce the state for comparisons of the form 'v Rel k', 'k Rel v' or 'v = w' *) -let reduce_by_comparison reduce_rel pos exp1 binop exp2 state = +let reduce_by_comparison pos exp1 binop exp2 state = (* Format.printf "red_by_comparison %a@." Cvalue.Model.pretty state; *) - let state = reduce_by_left_comparison reduce_rel pos exp1 binop exp2 state in - let inv_binop = match binop with + let state = reduce_by_left_comparison pos exp1 binop exp2 state in + let sym_binop = match binop with | Gt -> Lt | Lt -> Gt | Le -> Ge | Ge -> Le | _ -> binop in - reduce_by_left_comparison reduce_rel pos exp2 inv_binop exp1 state + reduce_by_left_comparison pos exp2 sym_binop exp1 state (* Try to make the condition true by evaluating important locations, proceeding @@ -1146,7 +1143,7 @@ else V.is_included V.singleton_zero vcond in let is_enumerable loc = - let v = Cvalue.Model.find ~conflate_bottom:true ~with_alarms state loc in + let _, v = Cvalue.Model.find state loc in let upto = succ (Ival.get_small_cardinal()) in ignore (Location_Bytes.cardinal_less_than v upto); v @@ -1183,81 +1180,64 @@ Cvalue.Model.reduce_previous_binding state loc newv with Not_found -> state +(** [state cond eqop exp1lv exp1mod exp2] reduces [state] by the property + [exp1lv mod exp1mod =!= exp2], [=!=] being the conjunct of [eqop] (which + must be either [==] or [!=]) and [cond.positive]. Currently, only the + location pointed to by [exp1lv] (if any) is reduced, and only when [exp1mod] + and [exp2] are constants. *) +let reduce_by_modulo state cond exp1lv exp1mod eqop exp2 = + try + let with_alarms = CilE.warn_none_mode in + let vmodu = V.project_ival (eval_expr ~with_alarms state exp1mod) in + let modu = Ival.project_int vmodu in + let v2 = V.project_ival (eval_expr ~with_alarms state exp2) in + let r = Ival.project_int v2 in + let loc, value, _ = eval_as_exact_loc state exp1lv in + (* Format.printf "loc:%a value:%a == %a %% %a\n" + Locations.pretty loc V.pretty value Int.pretty i2 Int.pretty modu; *) + let av = V.project_ival value in + match av with + | Ival.Top _ | Ival.Set _ -> + if Int.le modu Int.zero then raise Exit; (* TODOPC *) + let min, max, r = + if (eqop = Ne) = cond.positive then begin (* Testing for Ne *) + if Int.equal modu Int.two && Int.is_zero r + then None, None, Int.one + else raise Exit + end else begin (* Testing for Eq *) + if Int.is_zero r + then None, None, r + else + if Int.gt r Int.zero + then Some (Int.round_up_to_r ~min:Int.zero ~r ~modu), None, r + else raise Exit (* TODOPC *) + end + in + if Int.ge (Int.abs r) modu then raise Reduce_to_bottom; + let reducer = Ival.inject_top min max r modu in + let reduced_value = Ival.meet (* exact here *) reducer av in + Model.reduce_previous_binding state loc (V.inject_ival reduced_value) + | Ival.Float _ -> raise Exit + with Not_an_exact_loc | V.Not_based_on_null | Ival.Not_Singleton_Int | Exit -> + state (** raises [Reduce_to_bottom] and never returns [Cvalue.Model.bottom]*) let reduce_by_cond state cond = - (* Do not reduce anything if the cond is volatile. - (This test is dumb because the cond may contain volatile lvalues - without the "volatile" attribute appearing at toplevel. pc 2007/11) *) - if hasAttribute "volatile" (typeAttr (typeOf cond.exp)) then state - else let rec aux cond state = - (*Format.printf "eval_cond_aux %B %a@." cond.positive - Printer.pp_exp cond.exp;*) - match cond.positive,cond.exp.enode with - | _, (BinOp ((Eq | Ne) as eqop, ({enode = BinOp (Mod, ({enode = Lval _ } as expl), - exp12, typ1)} as exp1), - exp2, _)) - | _, (BinOp ((Eq | Ne) as eqop, exp2, - ({enode = BinOp (Mod, ({enode = Lval _ } as expl), - exp12, typ1)} as exp1), _)) -> - let reduce_rel = reduce_rel_from_type (unrollType typ1) in - ( try - let with_alarms = CilE.warn_none_mode in - let a12 = V.project_ival (eval_expr ~with_alarms state exp12) in - let modu = Ival.project_int a12 in - let a2 = V.project_ival (eval_expr ~with_alarms state exp2) in - let i2 = Ival.project_int a2 in - let loc, value, _ = eval_as_exact_loc ~with_alarms state expl in -(* Format.printf "loc:%a value:%a == %a %% %a\n" - Locations.pretty loc - V.pretty value - Int.pretty i2 - Int.pretty modu; *) - let av = V.project_ival value in - ( match av with - Ival.Top _ | Ival.Set _ -> - let r = i2 in - if Int.le modu Int.zero then raise not_an_exact_loc; (* TODO *) - let min, max, r = - if (eqop = Ne) = cond.positive (* really not equal *) - then begin - if Int.equal modu Int.two && Int.is_zero r - then None, None, Int.one - else raise not_an_exact_loc - end - else - if Int.is_zero r then - None, None, r - else if Int.gt r Int.zero - then - Some (Int.round_up_to_r ~min:Int.zero ~r ~modu), None, r - else - (* None, (Int.round_down_to_r ~max:Int.zero ~r ~modu), (r *) - raise not_an_exact_loc (* TODO *) - in - if Int.ge (Int.abs r) modu - then Model.bottom - else - let reducer = Ival.inject_top min max r modu in - let reduced_value = - Ival.meet (* exact here *) - reducer - av - in - let state = - Model.reduce_binding state loc (V.inject_ival reduced_value) - in - reduce_by_comparison reduce_rel cond.positive exp1 eqop exp2 - state - | Ival.Float _ -> raise not_an_exact_loc - ) - with Not_an_exact_loc | V.Not_based_on_null | Ival.Not_Singleton_Int - -> - reduce_by_comparison reduce_rel cond.positive exp1 eqop exp2 state) + (*Format.printf "eval_cond_aux %B %a@." cond.positive + Printer.pp_exp cond.exp;*) + match cond.positive, cond.exp.enode with + | _, (BinOp ((Eq | Ne as eqop), + ({enode = BinOp (Mod,exp1lv,exp1mod,_)} as exp1), exp2, _)) + | _, (BinOp ((Eq | Ne as eqop), + exp2,({enode = BinOp (Mod,exp1lv,exp1mod, _)} as exp1), _)) + -> (* This case overlaps with the BinOp case just after. For the moment, + we call the second case ourselves. *) + let state = reduce_by_modulo state cond exp1lv exp1mod eqop exp2 in + reduce_by_comparison cond.positive exp1 eqop exp2 state + | _positive, BinOp ((Le|Ne|Eq|Gt|Lt|Ge as binop), exp1, exp2, _typ) -> - let reduce_rel = reduce_rel_from_type (unrollType (typeOf exp1)) in - reduce_by_comparison reduce_rel cond.positive exp1 binop exp2 state + reduce_by_comparison cond.positive exp1 binop exp2 state (* Strict or lazy operators can be handled uniformly here: there are no side effects inside expressions, and alarms should have been emitted @@ -1298,15 +1278,13 @@ with Exit -> if isIntegralType typ || isPointerType typ then - reduce_by_left_comparison_abstract - Eval_op.reduce_rel_int + reduce_by_left_comparison_abstract cond.positive cond.exp Ne V.singleton_zero state else state) | _, Lval _ when (let t = typeOf cond.exp in isIntegralType t || isPointerType t) -> (* "if (c)" is equivalent to "if(!(c==0))" *) - reduce_by_left_comparison_abstract - Eval_op.reduce_rel_int + reduce_by_left_comparison_abstract cond.positive cond.exp Ne V.singleton_zero state | _ -> state in @@ -1459,16 +1437,16 @@ let state, loc_to_read, _typ = lval_to_precise_loc_state ~with_alarms state lv in - CilE.set_syntactic_context (CilE.SyMem lv); + Valarms.set_syntactic_context (Valarms.SyMem lv); let aux loc offsm_res = - let copy = Cvalue.Model.copy_offsetmap ~with_alarms loc state in - match copy, offsm_res with - | None as r, None | (Some _ as r), None | None, (Some _ as r) -> r - | Some r1, Some r2 -> Some (V_Offsetmap.join r1 r2) + let size = Int_Base.project loc.size in + let alarm, copy = Cvalue.Model.copy_offsetmap loc.loc size state in + if alarm then Valarms.warn_mem_read with_alarms; + V_Offsetmap.join_top_bottom copy offsm_res in loc_to_read, state, - Precise_locs.fold aux loc_to_read None + Precise_locs.fold aux loc_to_read `Bottom @@ -1478,8 +1456,8 @@ let () = Db.Value.find_lv_plus := - (fun ~with_alarms state e -> - try [find_lv_plus_offset ~with_alarms state e] + (fun state e -> + try [find_lv_plus_offset state e] with Cannot_find_lv -> []); ;; diff -Nru frama-c-20140301+neon+dfsg/src/value/eval_exprs.mli frama-c-20150201+sodium+dfsg/src/value/eval_exprs.mli --- frama-c-20140301+neon+dfsg/src/value/eval_exprs.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/eval_exprs.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -45,7 +45,6 @@ Cvalue.Model.t * Zone.t option * Location_Bytes.t val eval_lval : - conflate_bottom:bool -> with_alarms:CilE.warn_mode -> Zone.t option -> Cvalue.Model.t -> @@ -105,10 +104,6 @@ (** Reduction by accesses *) -val reduce_by_valid_loc : - positive:bool -> - for_writing:bool -> location -> typ -> Cvalue.Model.t -> Cvalue.Model.t - val reduce_by_accessed_loc : for_writing:bool -> Cvalue.Model.t -> Cil_types.lval -> Locations.location -> @@ -119,9 +114,7 @@ exception Cannot_find_lv -val find_lv : - with_alarms:CilE.warn_mode -> - Cvalue.Model.t -> exp -> lval +val find_lv : Cvalue.Model.t -> exp -> lval val get_influential_vars : Cvalue.Model.t -> exp -> location list @@ -157,8 +150,8 @@ val offsetmap_of_lv: with_alarms:CilE.warn_mode -> Cvalue.Model.t -> lval -> - Precise_locs.precise_location * Cvalue.Model.t * Cvalue.V_Offsetmap.t option - + Precise_locs.precise_location * Cvalue.Model.t * Cvalue.V_Offsetmap.t_top_bottom +(** May raise [Int_Base.Error_Top] *) (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/value/eval_funs.ml frama-c-20150201+sodium+dfsg/src/value/eval_funs.ml --- frama-c-20140301+neon+dfsg/src/value/eval_funs.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/eval_funs.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -55,14 +55,8 @@ let active_behaviors = ab end) in - let module Compute = Dataflow2.Forwards(Computer) in - let start = Kernel_function.find_first_stmt kf in - (* Init the dataflow state for the first statement *) - let dinit = { Computer.to_propagate = with_locals} in - let dinit = Computer.computeFirstPredecessor start dinit in - Computer.StmtStartData.add start dinit; begin - try Compute.compute [start] + try Computer.compute with_locals with Db.Value.Aborted as e -> (* analysis was aborted: pop the call stack and inform the caller *) Computer.mark_degeneration (); @@ -114,9 +108,7 @@ and add them to the current state of the evaluation in acc *) let one_from_contents acc { it_content = t } = let r = Eval_terms.eval_term ~with_alarms env t in - List.fold_left - (fun acc v -> Cvalue.V.join acc (Cvalue.V.topify_arith_origin v)) - acc r.Eval_terms.evalue + Cvalue.V.join acc (Cvalue.V.topify_arith_origin r.Eval_terms.eover) in (* evaluation of the entire from clause *) let froms_contents = @@ -135,14 +127,15 @@ let treat_output_loc acc loc = let valid = Locations.valid_part ~for_writing:true loc in if Locations.is_bottom_loc valid then - (Value_parameters.warning ~current:true ~once:true - "@[Completely invalid destination@ for assigns@ clause %a.@ \ - Ignoring.@]" Printer.pp_term out; - acc) + (if (not (Locations.is_bottom_loc loc)) + then (Value_parameters.warning ~current:true ~once:true + "@[Completely invalid destination@ for assigns@ clause %a.@ \ + Ignoring.@]" Printer.pp_term out); + acc) else ( Locals_scoping.remember_if_locals_in_value clob loc froms_contents; - let state' = Cvalue.Model.add_binding ~with_alarms - ~exact:false acc loc froms_contents + let state' = + snd (Cvalue.Model.add_binding ~exact:false acc loc froms_contents) in if Cvalue.Model.equal Cvalue.Model.top state' then ( Value_parameters.error ~once:true ~current:true @@ -160,10 +153,8 @@ ) else try (* TODO: warn about errors during evaluation *) - let locs, _deps = - Eval_terms.eval_tlval_as_locations ~with_alarms env out - in - List.fold_left treat_output_loc state locs + let loc = Eval_terms.eval_tlval_as_location ~with_alarms env out in + treat_output_loc state loc with | Eval_terms.LogicEvalError e -> warning_once_current @@ -209,7 +200,7 @@ else let offsetmap = Eval_op.offsetmap_of_v return_type !returned_value in let rvi, state = - Library_functions.add_retres_to_state ~with_alarms kf offsetmap state + Library_functions.add_retres_to_state kf offsetmap state in Some rvi, state in @@ -218,9 +209,8 @@ (** Evaluate [kf] in state [with_formals], first by reducing by the preconditions, then by evaluating the assigns, then by reducing - by the post-conditions. The resulting states contain formals only - if [clear_formals] is false. *) -let compute_using_specification (kf, spec) ?(clear_formals=true) ~call_kinstr ~with_formals () = + by the post-conditions. *) +let compute_using_specification (kf, spec) ~call_kinstr ~with_formals () = if Value_parameters.InterpreterMode.get() then begin warning_once_current "Library function call. Stopping."; @@ -237,7 +227,8 @@ let (with_formals,trace) = State_set.join stateset in let return_used = match call_kinstr with | Kglobal -> true - | Kstmt {skind = Instr (Call (lv, _, _, _))} -> lv <> None + | Kstmt {skind = Instr (Call (lv, _, _, _))} -> + lv <> None || Value_util.postconditions_mention_result spec | _ -> assert false in let retres_vi, result_state, sclob = @@ -250,25 +241,18 @@ Normal in let aux state = - let ret, state = match retres_vi with + match retres_vi with | None -> None, state | Some vi -> - if not (Cvalue.Model.is_reachable state) then - (* This test prevents the call to Model.find_base that would - raise Not_found in this case. *) - None, state - else + match state with + | Cvalue.Model.Bottom -> None, state + | Cvalue.Model.Top -> Warn.warn_top () + | Cvalue.Model.Map _ -> let retres_base = Base.of_varinfo vi in let without_ret = Cvalue.Model.remove_base retres_base state in - (Some (Cvalue.Model.find_base retres_base state)), - without_ret - in - if clear_formals then - let formals = Kernel_function.get_formals kf in - let without = Value_util.remove_formals_from_state formals state in - ret, without - else - ret, state + match Cvalue.Model.find_base retres_base state with + | `Map m -> Some m, without_ret + | `Bottom (*tested above*) | `Top (*state is not top*)-> assert false in { Value_types.c_values = List.map aux (State_set.to_list result_state); c_clobbered = sclob; @@ -283,22 +267,20 @@ the statuses of the preconditions of [kf]. If [show_progress] is true, the callstack and additional information are printed. *) let compute_using_spec_or_body ~with_formals ~call_kinstr ~show_progress kf = - Kf_state.mark_as_called kf; + Value_results.mark_kf_as_called kf; let pp = show_progress && Value_parameters.ValShowProgress.get() in let entry_time = if pp then Unix.time () else 0. in if pp then Value_parameters.feedback "@[computing for function %a.@\nCalled from %a.@]" pretty_call_stack_short (call_stack ()) - Cil_datatype.Location.pretty - (Cil_datatype.Kinstr.loc (CilE.current_stmt())); + Cil_datatype.Location.pretty (Cil_datatype.Kinstr.loc call_kinstr); let use_spec = match kf.fundec with | Declaration (_,_,_,_) -> `Spec (Annotations.funspec kf) | Definition (def, _) -> - if Datatype.String.Set.mem - def.svar.vname (Value_parameters.UsePrototype.get ()) - then `Spec (Annotations.funspec kf) - else `Def def + if Kernel_function.Set.mem kf (Value_parameters.UsePrototype.get ()) + then `Spec (Annotations.funspec kf) + else `Def def in let result = match use_spec with | `Spec spec -> @@ -325,7 +307,7 @@ let kf, library = Globals.entry_point () in clear_call_stack (); Stop_at_nth.clear (); - Kf_state.mark_as_called kf; + Value_results.mark_kf_as_called kf; Value_parameters.feedback "Analyzing a%scomplete application starting at %a" (if library then "n in" else " ") Kernel_function.pretty kf; @@ -357,7 +339,6 @@ initialization is not computable."; end else begin - Mark_noresults.run(); let with_formals = match Db.Value.fun_get_args () with | None -> @@ -374,8 +355,8 @@ initial_state_globals (List.map2 treat_one_formal formals actuals) in - Db.Value.merge_initial_state kf with_formals; push_call_stack kf Kglobal; + Db.Value.merge_initial_state (call_stack ()) with_formals; Db.Value.Call_Value_Callbacks.apply (with_formals, [ kf, Kglobal ]); ignore(compute_using_spec_or_body kf ~call_kinstr:Kglobal ~with_formals ~show_progress:false); @@ -392,7 +373,7 @@ than the entire offsetmap *) let conv_arg with_alarms (exp, offsm) = let typ = typeOf exp in - CilE.set_syntactic_context (CilE.SyUnOp exp); + Valarms.set_syntactic_context (Valarms.SyUnOp exp); let v = Eval_op.v_of_offsetmap ~with_alarms ~typ offsm in (exp, v, offsm) in @@ -408,10 +389,10 @@ (* Advanced builtins which override a Cil function with a Caml one, but use the Cil one as backup if the Caml one fails. (None by default) *) try - let name = Value_parameters.BuiltinsOverrides.find name in + let name = Value_parameters.BuiltinsOverrides.find kf in (* This is an interesting C function. Mark it as called, otherwise it would get skipped, eg. from the Gui. *) - Kf_state.mark_as_called kf; + Value_results.mark_kf_as_called kf; name, true with Not_found -> name, false in @@ -452,7 +433,7 @@ push_call_stack kf call_kinstr; (* Store the initial state, but do not called mark_as_called. Uninteresting Value builtins are intentionally skipped *) - Db.Value.merge_initial_state kf with_formals; + Db.Value.merge_initial_state (call_stack ()) with_formals; try let stack_with_call = call_stack () in Db.Value.Call_Value_Callbacks.apply (with_formals, stack_with_call); @@ -476,8 +457,11 @@ | Some (res, i) -> (* Evaluate the preconditions of kf, to update the statuses at this call. *) - if Eval_annots.has_requires kf then begin - let ab = Eval_annots.ActiveBehaviors.create with_formals kf in + let spec = Annotations.funspec kf in + if Eval_annots.has_requires spec then begin + let ab = + Eval_annots.ActiveBehaviors.create_from_spec with_formals spec + in ignore (Eval_annots.check_fct_preconditions kf ab call_kinstr with_formals); end; @@ -501,14 +485,16 @@ let compute_recursive_call kf ~call_kinstr state actuals = push_call_stack kf call_kinstr; - (* Update formals. For formals that might be referenced, we must perform - a join with the previous values *) - let exact vi = not vi.vaddrof in let with_formals = Function_args.actualize_formals - ~check:Function_args.check_arg_size ~exact kf state actuals + ~check:Function_args.check_arg_size kf state actuals in - Db.Value.merge_initial_state kf with_formals; + (* For formals that might be referenced, we must perform a join with the + previous values *) + let with_formals = + Function_args.merge_referenced_formals kf state with_formals + in + Db.Value.merge_initial_state (call_stack ()) with_formals; let initial_spec = Annotations.funspec ~populate:false kf in let assigns_spec () = let assigns = Infer_annotations.assigns_from_prototype kf in @@ -531,9 +517,7 @@ ~silent_about_merging_behav:true spec initial_spec; spec in - let r = compute_using_specification (kf, spec) - ~clear_formals:false ~call_kinstr ~with_formals () - in + let r = compute_using_specification (kf, spec) ~call_kinstr ~with_formals() in pop_call_stack (); (* Restore one formal of [kf] to a correct value: either the value before the call if the variable cannot have been modified during this call, @@ -546,12 +530,14 @@ (* Any copy of the formal may have been modified by the call, join the possible values *) let post = Cvalue.Model.find_base b post_state in - let r = Cvalue.V_Offsetmap.join old post in + let r = Cvalue.V_Offsetmap.join_top_bottom old post in r else old in - Cvalue.Model.add_base b offsm post_state + match offsm with + | `Top | `Bottom -> assert false + | `Map offsm -> Cvalue.Model.add_base b offsm post_state in let formals = Kernel_function.get_formals kf in let restore_formals state = List.fold_left restore_formal state formals in @@ -562,13 +548,13 @@ (** Compute a call to [kf], called from [call_kinstr], in the state [state]. In - this state, the value of actuals in [actuals] are not yet bound to formals.*) -let compute_call kf ~call_kinstr state actuals = - if Warn.check_no_recursive_call kf then - compute_non_recursive_call kf ~call_kinstr state actuals - else + this state, the value of actuals in [actuals] are not yet bound to formals. + [recursive] means that the call is recursive. *) +let compute_call kf ~recursive ~call_kinstr state actuals = + if recursive then compute_recursive_call kf ~call_kinstr state actuals - + else + compute_non_recursive_call kf ~call_kinstr state actuals let () = Eval_stmt.compute_call_ref := compute_call @@ -578,47 +564,51 @@ let u = u /. 2. in 0. < u && u < min_float +let need_assigns kf = + let spec = Annotations.funspec ~populate:false kf in + match Cil.find_default_behavior spec with + | None -> true + | Some bhv -> bhv.b_assigns = WritesAny + let options_ok () = (* Check that we can parse the values specified for the options that require advanced parsing. Just make a query, as this will force the kernel to parse them. *) - let check f = try ignore (f "") with Not_found -> () in - check Value_parameters.SplitReturnFunction.find; - check Value_parameters.BuiltinsOverrides.find; - check Value_parameters.SlevelFunction.find; + let check f = try ignore (f ()) with Not_found -> () in + check Value_parameters.SplitReturnFunction.get; + check Value_parameters.BuiltinsOverrides.get; + check Value_parameters.SlevelFunction.get; + let check_assigns kf = + if need_assigns kf then + Value_parameters.error "@[no assigns@ specified@ for function '%a',@ for \ + which@ a builtin@ or the specification@ will be used.@ \ + Potential unsoundness.@]" Kernel_function.pretty kf + in + Value_parameters.BuiltinsOverrides.iter (fun (kf, _) -> check_assigns kf); + Value_parameters.UsePrototype.iter (fun kf -> check_assigns kf); + ;; (* Preliminary checks before Value starts *) let check () = assert (floats_ok ()); options_ok (); + Split_return.pretty_strategies (); ;; - (* Do something tasteless in case the user did not put a spec on functions for which he set [-val-use-spec]: generate an incorrect one ourselves *) let generate_specs () = - let aux kf_name = - try - let kf = Globals.Functions.find_by_name kf_name in - let spec = Annotations.funspec kf in - let open Cil_types in - let need_generation = - match Cil.find_default_behavior spec with - | None -> true - | Some bhv -> bhv.b_assigns = WritesAny - in - if need_generation then begin - Value_parameters.warning "Generating potentially incorrect assigns \ - for function '%s' for which option %s is set" - kf_name Value_parameters.UsePrototype.option_name; - (* The function populate_spec may emit a warning. Position a loc. *) - Cil.CurrentLoc.set (Kernel_function.get_location kf); - ignore (!Annotations.populate_spec_ref kf spec) - end - with Not_found -> - Value_parameters.error "Unknown function '%s' for option %s" - kf_name Value_parameters.UsePrototype.option_name + let aux kf = + if need_assigns kf then begin + let spec = Annotations.funspec ~populate:false kf in + Value_parameters.warning "Generating potentially incorrect assigns \ + for function '%a' for which option %s is set" + Kernel_function.pretty kf Value_parameters.UsePrototype.option_name; + (* The function populate_spec may emit a warning. Position a loc. *) + Cil.CurrentLoc.set (Kernel_function.get_location kf); + ignore (!Annotations.populate_spec_ref kf spec) + end in Value_parameters.UsePrototype.iter aux @@ -632,6 +622,10 @@ ;; let post_cleanup ~aborted = + (* Precompute consolidated states if required *) + if Value_parameters.JoinResults.get () then + Db.Value.Table_By_Callstack.iter + (fun s _ -> ignore (Db.Value.get_stmt_state s)); if not aborted then begin (* Keep memexec results for users that want to resume the analysis *) Mem_exec.cleanup_results (); @@ -661,9 +655,16 @@ pre (); ignore (compute_from_entry_point ()); Db.Value.mark_as_computed (); - (* Mark unreachable and RTE statuses. Do not do this in post_cleanup, - as all reachable code has not been analysed. *) - Eval_annots.mark_unreachable (); + (* Mark unreachable and RTE statuses. Only do this there, not when the + analysis was aborted (hence, not in post_cleanup), because the + propagation is incomplete. *) + if (Cvalue.Model.is_reachable (Db.Value.globals_state ())) then + (* Do not mark unreachable statutes if there is an alarm in the + initialisers, as we would mark the alarm as dead. *) + Eval_annots.mark_unreachable (); + (* Try to refine the 'Unknown' statuses that have been emitted during + this analysis. *) + Eval_annots.mark_green_and_red (); Eval_annots.mark_rte (); post_cleanup ~aborted:false; (* Remove redundant alarms *) diff -Nru frama-c-20140301+neon+dfsg/src/value/eval_funs.mli frama-c-20150201+sodium+dfsg/src/value/eval_funs.mli --- frama-c-20140301+neon+dfsg/src/value/eval_funs.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/eval_funs.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/eval_op.ml frama-c-20150201+sodium+dfsg/src/value/eval_op.ml --- frama-c-20140301+neon+dfsg/src/value/eval_op.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/eval_op.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -35,7 +35,9 @@ let wrap_int i = Some (offsetmap_of_v ~typ:Cil.intType i) let wrap_ptr p = Some (offsetmap_of_v ~typ:Cil.intPtrType p) let wrap_double d = Some (offsetmap_of_v ~typ:Cil.doubleType d) - +let wrap_float d = Some (offsetmap_of_v ~typ:Cil.floatType d) +let wrap_size_t i = + Some (offsetmap_of_v ~typ:(Cil.theMachine.Cil.typeOfSizeOf) i) let is_bitfield typlv = match Cil.unrollType typlv with @@ -55,23 +57,38 @@ (* TODO: this should probably be also put directly in reinterpret_int *) -let cast_lval_bitfield typlv size v = +let cast_lval_if_bitfield typlv size v = match size with | Int_Base.Top -> v (* Bitfields have known sizes *) | Int_Base.Value size -> - if is_bitfield typlv then + if is_bitfield typlv then begin + try + ignore (V.project_ival v); let signed = Bit_utils.is_signed_int_enum_pointer typlv in let v, _ok = Cvalue.V.cast ~size ~signed v in v (* TODO: handle not ok case as a downcast *) - else v - + with + | V.Not_based_on_null (* from [project_ival] *) -> + (* [v] is a pointer: check there are enough bits in + the bit-field to contain it. *) + if Int.ge size (Int.of_int (Bit_utils.sizeofpointer ())) || + V.is_imprecise v + then v + else begin + Value_parameters.result + "casting address to a bit-field of %s bits: \ + this is smaller than sizeof(void*)" (Int.to_string size); + V.topify_arith_origin v + end + end + else v let reinterpret_int ~with_alarms ikind v = let size = Int.of_int (Cil.bitsSizeOfInt ikind) in let signed = Cil.isSigned ikind in let v', ok = V.cast ~signed ~size v in if not ok then - CilE.do_warn with_alarms.CilE.imprecision_tracing + Valarms.do_warn with_alarms.CilE.imprecision_tracing (fun _ -> Kernel.warning ~once:true ~current:true "@[casting address@ to a type@ smaller@ than sizeof(void*):@ \ @@ -80,22 +97,17 @@ v' let reinterpret_float ~with_alarms fkind v = - let conv = match fkind with - | FFloat -> + let conv = match Value_util.float_kind fkind with + | Ival.Float_abstract.Float32 -> let rounding_mode = Value_util.get_rounding_mode () in Cvalue.V.cast_float ~rounding_mode - | FDouble -> Cvalue.V.cast_double - | FLongDouble -> - let mach = Cil.theMachine.Cil.theMachine in - if mach.sizeof_longdouble <> mach.sizeof_double then - Value_parameters.error ~once:true - "type long double not implemented. Using double instead"; - Cvalue.V.cast_double + | Ival.Float_abstract.Float64 -> Cvalue.V.cast_double in let addresses, overflow, r = conv v in if overflow || addresses then begin - CilE.warn_nan_infinite with_alarms (Some fkind) (fun fmt -> V.pretty fmt v); + Valarms.warn_nan_infinite + with_alarms (Some fkind) (fun fmt -> V.pretty fmt v); end; r @@ -108,7 +120,7 @@ | TFloat (fkind, _) -> reinterpret_float ~with_alarms fkind v | TBuiltin_va_list _ -> - (CilE.do_warn with_alarms.CilE.imprecision_tracing + (Valarms.do_warn with_alarms.CilE.imprecision_tracing (fun _ -> Value_util.warning_once_current "cast to __builtin_va_list is not precisely implemented yet%t" @@ -118,7 +130,7 @@ | TComp _ | TArray _ | TFun _ -> (* Nothing can/should be done on struct and arrays, that are either already imprecise as a Cvalue.V, or read in a precise way. It is not clear - that a TFun can be obtained here, but one never know. *) + that a TFun can be obtained here, but one never knows. *) v | TNamed _ -> assert false | TVoid _ -> assert false @@ -131,8 +143,11 @@ | Int_Base.Value size -> let validity = Base.Known (Integer.zero, Integer.pred size) in let offsets = Ival.singleton_zero in - V_Offsetmap.find - ~with_alarms ~validity ~conflate_bottom:false ~offsets ~size offsm + let alarm, r = + V_Offsetmap.find ~validity ~conflate_bottom:false ~offsets ~size offsm + in + if alarm then Valarms.warn_mem_read with_alarms; + r let v_of_offsetmap ~with_alarms ~typ offsm = let v_uninit = v_uninit_of_offsetmap ~with_alarms ~typ offsm in @@ -149,16 +164,17 @@ | TInt (kind,_), TFloat (fkind, _) -> let size = Cil.bitsSizeOfInt kind in let signed = Cil.isSigned kind in - let addr, top, overflow, r = + let addr, non_finite, overflows, r = Cvalue.V.cast_float_to_int ~signed ~size v in - Warn.warn_float ~with_alarms ~overflow:top ~addr (Some fkind) msg; - if overflow + Warn.warn_float ~with_alarms ~non_finite ~addr (Some fkind) msg; + if overflows <> (false, false) then begin let dst_range = Ival.create_all_values ~modu:Int.one ~signed ~size in let mn, mx = Ival.min_and_max dst_range in - (* TODO: Currently, we always emit the alarm for both sides *) - CilE.warn_float_to_int_overflow with_alarms mn mx msg; + let mn = if fst overflows then mn else None in + let mx = if snd overflows then mx else None in + Valarms.warn_float_to_int_overflow with_alarms mn mx msg; end; r | TInt (ikind, _), TInt _ -> @@ -212,7 +228,7 @@ Cvalue.V.inject_ival (Ival.inject_range (Some mn) (Some mx)) in - CilE.warn_integer_overflow with_alarms + Valarms.warn_integer_overflow with_alarms ~signed ~min:warn_under ~max:warn_over; (* Take care of pointers addresses that may have crept in, as they may alias with the NULL base *) @@ -241,22 +257,22 @@ try let alarm, f = f round f1 f2 in if alarm then - CilE.warn_nan_infinite + Valarms.warn_nan_infinite with_alarms flkind (fun fmt -> Ival.Float_abstract.pretty fmt f); V.inject_ival (Ival.inject_float f) with | Ival.Float_abstract.Nan_or_infinite -> - CilE.warn_nan_infinite with_alarms flkind (pp_v V.top_int); + Valarms.warn_nan_infinite with_alarms flkind (pp_v V.top_int); V.top_float | Ival.Float_abstract.Bottom -> - CilE.warn_nan_infinite with_alarms flkind (pp_v V.bottom); + Valarms.warn_nan_infinite with_alarms flkind (pp_v V.bottom); V.bottom in match op with - | PlusA -> binary_float_floats "+." Ival.Float_abstract.add_float - | MinusA -> binary_float_floats "-." Ival.Float_abstract.sub_float - | Mult -> binary_float_floats "*." Ival.Float_abstract.mult_float - | Div -> binary_float_floats "/." Ival.Float_abstract.div_float + | PlusA -> binary_float_floats "+." Ival.Float_abstract.add + | MinusA -> binary_float_floats "-." Ival.Float_abstract.sub + | Mult -> binary_float_floats "*." Ival.Float_abstract.mul + | Div -> binary_float_floats "/." Ival.Float_abstract.div | Eq -> let contains_zero, contains_non_zero = Ival.Float_abstract.equal_float_ieee f1 f2 @@ -285,87 +301,66 @@ ~contains_non_zero:(Ival.Float_abstract.maybe_le_ieee_float f2 f1) | _ -> assert false +let eval_minus_pp ~with_alarms ~te1 ev1 ev2 = + (* Difference between the two pointers is [minus_offs] bytes, convert + to pointer difference. *) + let conv minus_offs = + try + let size = Int_Base.project (Bit_utils.osizeof_pointed te1) in + if Int.is_one size then + minus_offs + else + Ival.scale_div ~pos:true size minus_offs + with Int_Base.Error_Top -> Ival.top + in + if not (Value_parameters.WarnPointerSubstraction.get ()) then begin + (* Generate garbled mix if the two pointers disagree on their base *) + let minus_val = V.add_untyped Int_Base.minus_one ev1 ev2 in + try + V.inject_ival (conv (Cvalue.V.project_ival minus_val)) + with Cvalue.V.Not_based_on_null -> + V.join (V.topify_arith_origin ev1) (V.topify_arith_origin ev2) + end else begin + (* Pointwise arithmetics.*) + (* TODO: we may be able to reduce the bases that appear only on one side *) + let minus_offs, warn = V.sub_untyped_pointwise ev1 ev2 in + if warn then Valarms.warn_pointer_subtraction with_alarms; + let offs = conv minus_offs in + V.inject_ival offs + end + (* eval some operations on location_bytes. This function is more low-level than eval_binop, that evaluates the expressions in the given state. Here, we suppose someone else has done the evaluation, and combine the results. - [te1] is the type of [ev1]. [typ] is optional. If it is not passed, the - function must behave as if it was acting on unbounded integers *) -let eval_binop_int ~with_alarms ?typ ~te1 ev1 op ev2 = - match op with + [te1] is the type of [ev1]. The function must behave as if it was acting on + unbounded integers *) +let eval_binop_int ~with_alarms ~te1 ev1 op ev2 = + let r = match op with | PlusPI | IndexPI -> V.add_untyped (Bit_utils.osizeof_pointed te1) ev1 ev2 | MinusPI -> V.add_untyped (Int_Base.neg (Bit_utils.osizeof_pointed te1)) ev1 ev2 | PlusA -> V.add_untyped (Int_Base.one) ev1 ev2 | MinusA -> V.add_untyped Int_Base.minus_one ev1 ev2 - | MinusPP -> - if not (Value_parameters.WarnPointerSubstraction.get ()) then begin - (* Generate garbled mix if the two pointers disagree on their base *) - let minus_val = V.add_untyped Int_Base.minus_one ev1 ev2 in - try - let size = Int_Base.project (Bit_utils.sizeof_pointed te1) in - let size = Int.div size Int.eight in - if Int.is_one size then - minus_val - else - let minus_val = Cvalue.V.project_ival minus_val in - Cvalue.V.inject_ival (Ival.scale_div ~pos:true size minus_val) - with - | Int_Base.Error_Top - | Cvalue.V.Not_based_on_null -> - V.join (V.topify_arith_origin ev1) (V.topify_arith_origin ev2) - end else begin - (* Pointwise arithmetics.*) - (* TODO: we may be able to reduce the bases that appear only on one - side *) - let minus_offs, warn = V.sub_untyped_pointwise ev1 ev2 in - if warn then CilE.warn_pointer_subtraction with_alarms; - let offs = - try - let size = Int_Base.project (Bit_utils.sizeof_pointed te1) in - let size = Int.div size Int.eight in - if Int.is_one size - then minus_offs - else Ival.scale_div ~pos:true size minus_offs - with Int_Base.Error_Top -> Ival.top - in - V.inject_ival offs - end - | Mod -> V.c_rem ~with_alarms ev1 ev2 - | Div -> V.div ~with_alarms ev1 ev2 - | Mult -> V.mul ~with_alarms ev1 ev2 - | BXor -> V.bitwise_xor ~with_alarms ev1 ev2 - | BOr -> V.bitwise_or ~with_alarms ev1 ev2 + | MinusPP -> eval_minus_pp ~with_alarms ~te1 ev1 ev2 + | Mod -> V.c_rem ev1 ev2 + | Div -> V.div ev1 ev2 + | Mult -> V.mul ev1 ev2 + | BXor -> V.bitwise_xor ev1 ev2 + | BOr -> V.bitwise_or ev1 ev2 | BAnd -> let size = Cil.bitsSizeOf te1 in let signed = Bit_utils.is_signed_int_enum_pointer te1 in V.bitwise_and ~size ~signed ev1 ev2 - | Eq | Ne | Ge | Le | Gt | Lt -> let warn = Warn.check_not_comparable op ev1 ev2 in - if warn then CilE.warn_pointer_comparison with_alarms; + if warn then Valarms.warn_pointer_comparison with_alarms; if warn && Value_parameters.UndefinedPointerComparisonPropagateAll.get () then V.zero_or_one else let signed = Bit_utils.is_signed_int_enum_pointer(Cil.unrollType te1) in V.eval_comp ~signed op ev1 ev2 - | Shiftrt | Shiftlt -> - begin - let f = - if op = Shiftlt then V.shift_left else V.shift_right - in - let size = match typ with - | None -> None - | Some t -> - let t = Cil.unrollType t in - let warn_negative = - Value_parameters.WarnLeftShiftNegative.get() && - Bit_utils.is_signed_int_enum_pointer t - in - Some (warn_negative, Cil.bitsSizeOf t) - in - f ~with_alarms ~size ev1 ev2 - end - + | Shiftrt -> V.shift_right ev1 ev2 + | Shiftlt -> V.shift_left ev1 ev2 (* Strict evaluation. The caller of this function is supposed to take into account the lazyness of those operators itself *) | LOr -> V.interp_boolean @@ -374,6 +369,17 @@ | LAnd -> V.interp_boolean ~contains_zero: (V.contains_zero ev1 || V.contains_zero ev2) ~contains_non_zero:(V.contains_non_zero ev1 && V.contains_non_zero ev2) + in + begin + match r, ev1, ev2 with + | V.Top _, V.Map _, V.Map _ -> + Valarms.do_warn with_alarms.CilE.imprecision_tracing + (fun _ -> Value_parameters.warning ~once:true ~current:true + "Operation %a %a %a incurs a loss of precision" + V.pretty ev1 Printer.pp_binop op V.pretty ev2) + | _ -> () + end; + r (* This function evaluates a unary minus, but does _not_ check for overflows. This is left to the caller *) @@ -384,19 +390,19 @@ let v = V.project_ival v in let f = Ival.project_float v in V.inject_ival - (Ival.inject_float (Ival.Float_abstract.neg_float f)) + (Ival.inject_float (Ival.Float_abstract.neg f)) with | V.Not_based_on_null -> Warn.warn_float ~with_alarms ~addr:true (Some fkind) (pp_v v); V.topify_arith_origin v | Ival.Float_abstract.Nan_or_infinite -> - Warn.warn_float ~with_alarms ~overflow:true (Some fkind) (pp_v v); + Warn.warn_float ~with_alarms ~non_finite:true (Some fkind) (pp_v v); V.top_float ) | _ -> try let v = V.project_ival v in - V.inject_ival (Ival.neg v) + V.inject_ival (Ival.neg_int v) with V.Not_based_on_null -> V.topify_arith_origin v @@ -417,7 +423,7 @@ | LNot -> (* TODO: on float, LNot is equivalent to == 0.0 *) let warn = Warn.check_not_comparable Eq V.singleton_zero v in - if warn then CilE.warn_pointer_comparison with_alarms; + if warn then Valarms.warn_pointer_comparison with_alarms; if (warn && Value_parameters.UndefinedPointerComparisonPropagateAll.get ()) || not (Cil.isIntegralType t || Cil.isPointerType t) @@ -428,51 +434,50 @@ ~contains_zero:(V.contains_non_zero v) ~contains_non_zero:(V.is_included V.singleton_zero v) - - -let reduce_rel_symmetric_int positive binop cond_expr value = - match positive,binop with +let inv_binop_rel = function + | Gt -> Le + | Lt -> Ge + | Le -> Gt + | Ge -> Lt + | Eq -> Ne + | Ne -> Eq + | _ -> assert false + + +let reduce_rel_int positive binop cond_expr value = + if (Value_parameters.UndefinedPointerComparisonPropagateAll.get()) + && Warn.check_not_comparable binop value cond_expr + then value + else + match positive,binop with | false, Eq | true, Ne -> V.diff_if_one value cond_expr - | true, Eq | false, Ne -> - if (Value_parameters.UndefinedPointerComparisonPropagateAll.get()) - && Warn.check_not_comparable binop value cond_expr - then value - else V.narrow value cond_expr + | true, Eq | false, Ne -> V.narrow value cond_expr + | true, (Le | Ge | Lt | Gt) -> + V.filter_le_ge_lt_gt_int binop value ~cond_expr + | false, (Le | Ge | Lt | Gt) -> + V.filter_le_ge_lt_gt_int (inv_binop_rel binop) value ~cond_expr | _,_ -> value -let reduce_rel_symmetric_float = reduce_rel_symmetric_int - -let reduce_rel_antisymmetric_int ~typ_loc:_ positive binop cond_expr value = - match positive,binop with - | true, Le | false, Gt -> V.filter_le value ~cond_expr - | true, Ge | false, Lt -> V.filter_ge value ~cond_expr - | false, Le | true, Gt -> V.filter_gt value ~cond_expr - | false, Ge | true, Lt -> V.filter_lt value ~cond_expr - | _,_ -> value - -let reduce_rel_antisymmetric_float round ~typ_loc positive binop cond_expr value = +let reduce_rel_float_double round fkind positive binop cond_expr value = match positive,binop with - | true, Le | false, Gt -> V.filter_le_float round ~typ_loc value ~cond_expr - | true, Ge | false, Lt -> V.filter_ge_float round ~typ_loc value ~cond_expr - | false, Le | true, Gt -> V.filter_gt_float round ~typ_loc value ~cond_expr - | false, Ge | true, Lt -> V.filter_lt_float round ~typ_loc value ~cond_expr + (* Shared with [int] case *) + | false, Eq | true, Ne -> V.diff_if_one value cond_expr + | true, Eq | false, Ne -> V.narrow value cond_expr + (* Float functions *) + | true, (Le | Ge | Lt | Gt) -> + V.filter_le_ge_lt_gt_float binop round fkind value ~cond_expr + | false, (Le | Ge | Lt | Gt) -> + let inv_binop = inv_binop_rel binop in + V.filter_le_ge_lt_gt_float inv_binop round fkind value ~cond_expr | _,_ -> value - -type reduce_rel_int_float = { - reduce_rel_symmetric: bool -> binop -> V.t -> V.t -> V.t; - reduce_rel_antisymmetric: typ_loc:typ -> bool -> binop -> V.t -> V.t -> V.t; -} - -let reduce_rel_int = { - reduce_rel_symmetric = reduce_rel_symmetric_int; - reduce_rel_antisymmetric = reduce_rel_antisymmetric_int; -} - -let reduce_rel_float round = { - reduce_rel_symmetric = reduce_rel_symmetric_float; - reduce_rel_antisymmetric = reduce_rel_antisymmetric_float round; -} +let reduce_rel_from_type t = + match Cil.unrollType t with + | TInt _ | TEnum _ | TPtr _ -> reduce_rel_int + | TFloat (fk, _) -> + reduce_rel_float_double + (Value_parameters.AllRoundingModes.get ()) (Value_util.float_kind fk) + | _ -> (fun _ _ _ v -> v) (* should never occur anyway *) let eval_float_constant ~with_alarms f fkind fstring = let fl, fu = @@ -485,26 +490,201 @@ let fl = Ival.F.of_float fl in let fu = Ival.F.of_float fu in try - let overflow, af = Ival.Float_abstract.inject_r fl fu in + let non_finite, af = Ival.Float_abstract.inject_r fl fu in let v = V.inject_ival (Ival.inject_float af) in - if overflow then begin - Warn.warn_float ~with_alarms ~overflow:true (Some fkind) (pp_v v) + if non_finite then begin + Warn.warn_float ~with_alarms ~non_finite (Some fkind) (pp_v v) end; v with Ival.Float_abstract.Bottom -> - Warn.warn_float ~with_alarms ~overflow:true (Some fkind) + Warn.warn_float ~with_alarms ~non_finite:true (Some fkind) (fun fmt -> Format.pp_print_string fmt "INFINITY"); Value_parameters.result ~current:true "Floating-point literal (or constant expression) is not \ finite. This path is assumed to be dead."; V.bottom -let light_topify v = - match v with - | V.Top _ -> v - | V.Map m -> - let aux b _ acc = V.join acc (V.inject b Ival.top) in - V.M.fold aux m V.bottom +let make_volatile ?typ v = + let is_volatile = match typ with + | None -> true + | Some typ -> Cil.typeHasQualifier "volatile" typ + in + if is_volatile && not (Cvalue.V.is_bottom v) + then + match v with + | V.Top _ -> v + | V.Map m -> + let aux b _ acc = V.join acc (V.inject b Ival.top) in + V.M.fold aux m V.bottom + else v + +let add_binding_unspecified ~with_alarms ?(remove_invalid=false) ~exact state loc value = + let loc', reduced_loc = + if remove_invalid then + let loc' = Locations.valid_part ~for_writing:true loc in + loc', not (Locations.Location.equal loc loc') + else loc, false + in + let alarm, state = Model.add_binding_unspecified ~exact state loc' value in + if alarm || reduced_loc then Valarms.warn_mem_write with_alarms; + state + +let add_binding ~with_alarms ?(remove_invalid=false) ~exact state loc value = + let value = V_Or_Uninitialized.initialized value in + add_binding_unspecified ~with_alarms ~remove_invalid ~exact state loc value + +let copy_offsetmap ~with_alarms src_loc size mm = + let alarm, r = Model.copy_offsetmap src_loc size mm in + if alarm then Valarms.warn_mem_read with_alarms; + r + +let paste_offsetmap ~with_alarms ?(remove_invalid=false) ~reducing ~from ~dst_loc ~size ~exact m = + let dst_loc, reduced_loc = + if remove_invalid then + let loc = Locations.make_loc dst_loc (Int_Base.inject size) in + let for_writing = not reducing in + let loc' = Locations.valid_part ~for_writing loc in + let dst_loc' = loc'.Locations.loc in + dst_loc', not (Locations.Location_Bits.equal dst_loc dst_loc') + else dst_loc, false + in + let alarm, r = + Cvalue.Model.paste_offsetmap ~reducing ~from ~dst_loc ~size ~exact m + in + if alarm || reduced_loc then Valarms.warn_mem_write with_alarms; + r + +let project_with_alarms ~with_alarms ~conflate_bottom loc v = + let v_v = V_Or_Uninitialized.get_v v in + (* Warn about indeterminateness only when [conflate_bottom] is true. + Otherwise, the alarm [\initialized(loc)] or [\dangling_bits(loc)] may be + emitted for padding bits, and will be unprovable. This is a bit of + a hack, though. *) + if conflate_bottom then ignore (Warn.maybe_warn_indeterminate ~with_alarms v); + Warn.maybe_warn_completely_indeterminate ~with_alarms loc v v_v; + v_v + + +let find ~with_alarms ?(conflate_bottom=true) state loc = + let alarm, v = Model.find_unspecified ~conflate_bottom state loc in + if alarm then Valarms.warn_mem_read with_alarms; + project_with_alarms ~with_alarms ~conflate_bottom loc v + + +exception Unchanged +exception Reduce_to_bottom + +let reduce_by_initialized_defined f loc state = + try + let base, offset = + Locations.Location_Bits.find_lonely_key loc.Locations.loc + in + let size = Int_Base.project loc.Locations.size in + let ll = Ival.project_int offset in + let lh = Int.pred (Int.add ll size) in + let offsm = match Model.find_base_or_default base state with + | `Bottom | `Top -> raise Unchanged + | `Map offsm -> offsm + in + let aux (offl, offh) (v, modu, shift) acc = + let v' = f v in + if v' != v then begin + if V_Or_Uninitialized.is_bottom v' then raise Reduce_to_bottom; + let il = Int.max offl ll and ih = Int.min offh lh in + let abs_shift = Integer.pos_rem (Rel.add_abs offl shift) modu in + (* il and ih are the bounds of the interval to reduce. + We change the initialized flags in the following cases: + - either we overwrite entire values, or the partly overwritten + value is at the beginning or at the end of the subrange + - or we do not lose information on misaligned or partial values: + the result is a singleton *) + if V_Or_Uninitialized.(cardinal_zero_or_one v' || is_isotropic v') || + ((Int.equal offl il || Int.equal (Int.pos_rem ll modu) abs_shift) && + (Int.equal offh ih || Int.equal + (Int.pos_rem (Int.succ lh) modu) abs_shift)) + then + let diff = Rel.sub_abs il offl in + let shift_il = Rel.pos_rem (Rel.sub shift diff) modu in + V_Offsetmap.add (il, ih) (v', modu, shift_il) acc + else acc + end + else acc + in + let noffsm = + V_Offsetmap.fold_between ~entire:true (ll, lh) aux offsm offsm + in + Model.add_base base noffsm state + with + | Reduce_to_bottom -> Model.bottom + | Unchanged -> state + | Int_Base.Error_Top (* from Int_Base.project *) + | Not_found (* from find_lonely_key *) + | Ival.Not_Singleton_Int (* from Ival.project_int *) -> + state + +let reduce_by_valid_loc ~positive ~for_writing loc typ state = + try + let _, value = Cvalue.Model.find state loc in + if Cvalue.V.is_imprecise value then + (* we won't reduce anything anyway, and we may lose information if loc + contains misaligned data *) + raise Exit; + let loc_bits = Locations.loc_bytes_to_loc_bits value in + let size = Bit_utils.sizeof_pointed typ in + let value_as_loc = Locations.make_loc loc_bits size in + let reduced_value = + Locations.loc_to_loc_without_size + (if positive + then Locations.valid_part ~for_writing value_as_loc + else Locations.invalid_part value_as_loc ) + in + if V.equal value reduced_value + then state + else begin + if V.equal V.bottom reduced_value + then Cvalue.Model.bottom + else + Cvalue.Model.reduce_previous_binding state loc reduced_value + end + with Exit -> state + +let apply_on_all_locs f loc state = + match loc.Locations.size with + | Int_Base.Top -> state + | Int_Base.Value _ as size -> + try + let loc = Locations.valid_part ~for_writing:false loc in + let loc = loc.Locations.loc in + let plevel = Value_parameters.ArrayPrecisionLevel.get() in + ignore (Locations.Location_Bits.cardinal_less_than loc plevel); + Locations.Location_Bits.fold_enum + (fun l acc -> f (Locations.make_loc l size) acc) loc state + with Not_less_than | Locations.Location_Bits.Error_Top -> state + + +let write_abstract_value ~with_alarms state lv typ_lv loc_lv v = + let v = + if Cil.typeHasQualifier "volatile" typ_lv then + make_volatile v (* Do not cast further, the offsetmap layer + prefers this form. *) + else + cast_lval_if_bitfield typ_lv loc_lv.Locations.size v + in + match loc_lv.Locations.loc with + | Locations.Location_Bits.Top (Base.SetLattice.Top, orig) -> + Value_parameters.result + "State before degeneration:@\n======%a@\n=======" + Cvalue.Model.pretty state; + Value_util.warning_once_current + "writing at a completely unknown address@[%a@].@\nAborting." + Origin.pretty_as_reason orig; + raise Db.Value.Aborted + | _ -> + let exact = Locations.cardinal_zero_or_one loc_lv in + Valarms.set_syntactic_context (Valarms.SyMem lv); + add_binding ~with_alarms ~exact state loc_lv v + + (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/value/eval_op.mli frama-c-20150201+sodium+dfsg/src/value/eval_op.mli --- frama-c-20140301+neon+dfsg/src/value/eval_op.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/eval_op.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -29,9 +29,11 @@ val offsetmap_of_v: typ:Cil_types.typ -> V.t -> V_Offsetmap.t (** Specialization of the function above for standard types *) +val wrap_size_t: V.t -> V_Offsetmap.t option val wrap_int: V.t -> V_Offsetmap.t option val wrap_ptr: V.t -> V_Offsetmap.t option val wrap_double: V.t -> V_Offsetmap.t option +val wrap_float: V.t -> V_Offsetmap.t option (** Reads the contents of the offsetmap (assuming it contains [sizeof(typ)] bytes), and return them as an uninterpreted value. *) @@ -49,7 +51,10 @@ (** Bitfields *) val is_bitfield: typ -> bool -val cast_lval_bitfield : typ -> Int_Base.t -> Cvalue.V.t -> Cvalue.V.t +val cast_lval_if_bitfield : typ -> Int_Base.t -> Cvalue.V.t -> Cvalue.V.t +(** if needed, cast the given abstract value to the given size. Useful + to handle bitfield. The type given as argument must be the type of + the l-value the abstract value is written into, which is of size [size]. *) val sizeof_lval_typ: typ -> Int_Base.t (** Size of the type of a lval, taking into account that the lval might have @@ -77,7 +82,6 @@ val eval_binop_int : with_alarms:CilE.warn_mode -> - ?typ:typ -> te1:typ -> Cvalue.V.t -> binop -> Cvalue.V.t -> Cvalue.V.t @@ -99,16 +103,6 @@ dst_typ:Cil_types.typ -> Cvalue.V.t -> (Format.formatter -> unit) -> Cvalue.V.t -type reduce_rel_int_float = { - reduce_rel_symmetric : - bool -> binop -> Cvalue.V.t -> Cvalue.V.t -> Cvalue.V.t; - reduce_rel_antisymmetric : - typ_loc:typ -> - bool -> binop -> Cvalue.V.t -> Cvalue.V.t -> Cvalue.V.t; -} -val reduce_rel_int : reduce_rel_int_float -val reduce_rel_float : bool -> reduce_rel_int_float - val eval_float_constant: with_alarms:CilE.warn_mode -> float -> fkind -> string option -> Cvalue.V.t (** The arguments are the approximate float value computed during parsing, the @@ -117,10 +111,96 @@ constant is outside of the representable range, or that may be imprecise if it is not exactly representable. *) +val make_volatile: ?typ:typ -> V.t -> V.t +(** [make_volatile ?typ v] makes the value [v] more general (to account for + external modifications), whenever [typ] is [None] or when it has type + qualifier [volatile] *) + +val reduce_rel_from_type: + Cil_types.typ -> (bool -> binop -> Cvalue.V.t -> Cvalue.V.t -> Cvalue.V.t) +(** Reduction of a {!Cvalue.V.t} by [==], [!=], [>=], [>], [<=] and [<]. + [reduce_rel_from_type typ positive op vexpr v] reduces [v] + so that the relation [v op vexpr] holds. [typ] is the type of the + expression being reduced. *) + +val find: + with_alarms:CilE.warn_mode -> + ?conflate_bottom:bool -> Model.t -> Locations.location -> V.t +(** Tempory. Re-export of [Cvalue.Model.find] with a [~with_alarms] argument *) + +val add_binding : + with_alarms:CilE.warn_mode -> + ?remove_invalid:bool -> + exact:bool -> + Model.t -> + Locations.location -> + V.t -> + Model.t +(** Temporary. Re-export of [Cvalue.Model.add_binding] with a [with_alarms] + argument *) + +val add_binding_unspecified : + with_alarms:CilE.warn_mode -> + ?remove_invalid:bool -> + exact:bool -> + Model.t -> + Locations.location -> + V_Or_Uninitialized.t -> + Model.t +(** Temporary. Re-export of [Cvalue.Model.add_binding_unspecifed] with a + [with_alarms] argument *) + +val copy_offsetmap : + with_alarms:CilE.warn_mode -> + Locations.Location_Bits.t -> Integer.t -> Model.t -> + [ `Bottom | `Map of V_Offsetmap.t | `Top ] +(** Tempory. Re-export of [Cvalue.Model.copy_offsetmap] with a [with_alarms] + argument *) + +val paste_offsetmap: + with_alarms:CilE.warn_mode -> + ?remove_invalid:bool -> + reducing:bool -> + from:V_Offsetmap.t -> + dst_loc:Locations.Location_Bits.t -> + size:Integer.t -> + exact:bool -> + Model.t -> Model.t +(** Temporary. Re-exportation of [Cvalue.Model.paste_offsetmap] with a + [~with_alarms] argument. If [remove_invalid] is set to [true] (default + is [false], [dst_loc] will be pre-reduced to its valid part. Should be + set unless you reduce [dst_loc] yourself. *) + +val reduce_by_initialized_defined : + (V_Or_Uninitialized.t -> V_Or_Uninitialized.t) -> + Locations.location -> Model.t -> Model.t + +val apply_on_all_locs: + (Locations.location -> 'a -> 'a) -> Locations.location -> 'a -> 'a +(** [apply_all_locs f loc state] folds [f] on all the atomic locations + in [loc], provided there are less than [plevel]. Useful mainly + when [loc] is exact or an over-approximation. *) + +val reduce_by_valid_loc: + positive:bool -> + for_writing:bool -> + Locations.location -> typ -> Model.t -> Model.t +(* [reduce_by_valid_loc positive ~for_writing loc typ state] reduces + [state] so that [loc] contains a pointer [p] such that [(typ* )p] is + valid if [positive] holds (or invalid otherwise). *) + + +(** [write_abstract_value ~with_alarms state lv typ_lv loc_lv v] + writes [v] at [loc_lv] in [state], casting [v] to respect the type + [typ_lv] of [lv]. Currently Does 4 things: + - cast the value to the type of the bitfield it is written into, if needed + - honor an eventual "volatile" qualifier on [lv] + - check that [loc_lv] is not catastrophically imprecise. + - perform the actual abstract write +*) +val write_abstract_value: with_alarms:CilE.warn_mode -> + Model.t -> lval -> typ -> Locations.Location.t -> V.t -> Model.t -(** Change all offsets to top_int. Currently used to approximate volatile - values. *) -val light_topify: Cvalue.V.t -> Cvalue.V.t (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/value/eval_slevel.ml frama-c-20150201+sodium+dfsg/src/value/eval_slevel.ml --- frama-c-20140301+neon+dfsg/src/value/eval_slevel.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/eval_slevel.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -40,15 +40,14 @@ end), (fun () -> signal_emitted := true) - module Computer - (AnalysisParam:sig - val kf: kernel_function - val initial_states : State_set.t - val active_behaviors: Eval_annots.ActiveBehaviors.t - end) = - struct - let debug = false - let name = "Values analysis" +module type Arg = sig + val kf: kernel_function + val initial_states : State_set.t + val active_behaviors: Eval_annots.ActiveBehaviors.t +end + +module Computer(AnalysisParam: Arg) = +struct let current_kf = AnalysisParam.kf let current_fundec = Kernel_function.get_definition current_kf @@ -70,8 +69,6 @@ (fun s -> is_natural_loop s || is_basic_loop s || Stmt.Set.mem s non_natural) - let slevel_merge_after_loop = Value_parameters.SlevelMergeAfterLoop.get () - let obviously_terminates = Value_parameters.ObviouslyTerminatesAll.get() (* TODO: by function *) @@ -86,7 +83,105 @@ let (initial_state,_) = State_set.join AnalysisParam.initial_states - let current_table = Current_table.create () + (** State propagated by the dataflow, that contains only 'new' states + (i.e. not propagated before). All the states that have been seen so far + are stored in an object of type *) + type diff = { mutable to_propagate : State_set.t ; } + + (** The real state for a given statement, used in particular to detect + convergence. Stored by us, not by the dataflow itself. *) + type stmt_state = { + (** All the state that have been propagated separately, by slevel *) + superposition : State_imp.t; + (** Bottom if we have never consumed all the slevel allocated. If no + more slevel is available, the state that is being propgated. This + state is *not* present in [superposition]. *) + mutable widening_state : Cvalue.Model.t ; + (** should we widen the statement at the current iteration. + [widening_state] is decremented each time we visit the statement, + unless it is equal to zero. (In which case we widen, and set + [widening_state] to a non-zero value, currently 1.) *) + mutable widening : int; + (** Number of states that were put in [superposition]; i.e. the + sum of the cardinals of the state sets that were added with + [update_and_tell_if_changed]. It may be different + (i.e. larger) from the cardinal of [state_imp], that merge + states that are equal. *) + mutable counter_unroll : int ; + } + + let empty_record () = { + superposition = State_imp.empty () ; + widening = Value_parameters.WideningLevel.get () ; + widening_state = Cvalue.Model.bottom ; + counter_unroll = 0; + } + + type t = stmt_state Stmt.Hashtbl.t + + let current_table : t = Stmt.Hashtbl.create 128 + + let stmt_state s = + try Stmt.Hashtbl.find current_table s + with Not_found -> + let record = empty_record () in + Stmt.Hashtbl.add current_table s record; + record + + let stmt_widening_info s = + let r = stmt_state s in + r.widening, r.widening_state + + (* merges [set] into the state associated to [stmt], and returns the subset + of [set] that was not already in the superposition. *) + let update_stmt_states stmt set = + let record = stmt_state stmt in + if Cvalue.Model.is_reachable record.widening_state + then + let (state, tr) = State_set.join set in + if Cvalue.Model.is_included state record.widening_state + then State_set.empty + else State_set.singleton (state, tr) + else + State_imp.merge_set_return_new set record.superposition + + let update_stmt_widening_info kinstr wcounter wstate = + let record = stmt_state kinstr in + record.widening <- wcounter; + record.widening_state <- wstate + + let states_unmerged_for_callbacks () = + let r = Stmt.Hashtbl.create (Stmt.Hashtbl.length current_table) in + let aux stmt record = + let states = State_imp.to_list record.superposition in + let states = + if Cvalue.Model.is_reachable record.widening_state + then record.widening_state :: states + else states + in + Stmt.Hashtbl.add r stmt states + in + Stmt.Hashtbl.iter aux current_table; + r + + let states_for_callbacks () = + let r = Stmt.Hashtbl.create (Stmt.Hashtbl.length current_table) in + let aux stmt record = + Stmt.Hashtbl.add r stmt + (Cvalue.Model.join + (State_imp.join record.superposition) + record.widening_state) + in + Stmt.Hashtbl.iter aux current_table; + r + + let states_unmerged s = + let record = stmt_state s in + let s = State_imp.to_set record.superposition in + if Cvalue.Model.is_reachable record.widening_state + (* Forget about the trace. TODO: preserve the trace. *) + then State_set.add (record.widening_state, Trace.top) s + else s let states_after = Cil_datatype.Stmt.Hashtbl.create 5 @@ -135,47 +230,28 @@ states_after ) - (* Merging of 'after statement' states in the global table *) - let merge_after after_full callstack = - Cil_datatype.Stmt.Hashtbl.iter - (fun stmt st -> - begin - try - let prev = Db.Value.AfterTable.find stmt in - Db.Value.AfterTable.replace stmt (Cvalue.Model.join prev st) - with Not_found -> - Db.Value.AfterTable.add stmt st - end; - if Value_parameters.ResultsCallstack.get () then - Db.Value.update_callstack_table ~after:true stmt callstack st) - (Lazy.force after_full) - (* Table storing whether conditions on 'if' have been evaluated to true or false *) let conditions_table = Cil_datatype.Stmt.Hashtbl.create 5 let merge_results () = - let superposed = lazy (Current_table.states current_table) in + let superposed = lazy (states_for_callbacks ()) in let after_full = local_after_states superposed in let stack_for_callbacks = call_stack () in if Mark_noresults.should_memorize_function current_fundec then begin - Current_table.merge_db_table superposed stack_for_callbacks; + Value_results.merge_states_in_db superposed stack_for_callbacks; Db.Value.merge_conditions conditions_table; - if Value_parameters.ResultsAfter.get () then - merge_after after_full stack_for_callbacks; + Value_results.merge_after_states_in_db after_full stack_for_callbacks; end; if not (Db.Value.Record_Value_Superposition_Callbacks.is_empty ()) then begin - let current_superpositions = - lazy (Current_table.superpositions current_table) - in + let current_superpositions = lazy (states_unmerged_for_callbacks ()) in if Value_parameters.ValShowProgress.get () then Value_parameters.debug ~dkey:dkey_callbacks "now calling Record_Value_Superposition callbacks"; Db.Value.Record_Value_Superposition_Callbacks.apply (stack_for_callbacks, current_superpositions); end ; - if not (Db.Value.Record_Value_Callbacks.is_empty ()) then begin if Value_parameters.ValShowProgress.get () then @@ -184,17 +260,21 @@ Db.Value.Record_Value_Callbacks.apply (stack_for_callbacks, superposed) end; - if not (Db.Value.Record_Value_Callbacks_New.is_empty ()) then begin if Value_parameters.ValShowProgress.get () then Value_parameters.debug ~dkey:dkey_callbacks "now calling Record_Value_New callbacks"; - Db.Value.Record_Value_Callbacks_New.apply - (stack_for_callbacks, - Value_types.NormalStore (superposed, (Mem_exec.new_counter ()))) + if Value_parameters.MemExecAll.get () then + Db.Value.Record_Value_Callbacks_New.apply + (stack_for_callbacks, + Value_types.NormalStore ((superposed, after_full), + (Mem_exec.new_counter ()))) + else + Db.Value.Record_Value_Callbacks_New.apply + (stack_for_callbacks, + Value_types.Normal (superposed, after_full)) end; - if not (Db.Value.Record_Value_After_Callbacks.is_empty ()) then begin if Value_parameters.ValShowProgress.get () then @@ -205,34 +285,20 @@ end; ;; - type u = - { mutable to_propagate : State_set.t ; (* This mutable field is there to - avoid re-propagating previously seens states. It contains only the - new states that must be propagated on this statement, not all the - states that have been seen so far (that are stored through module - Current_table). *) - } + (** Clobbered list for bases containing addresses of local variables. *) + let clob = Locals_scoping.bottom () - module StmtStartData = - Dataflow2.StartData(struct type t = u let size = 107 end) + let cacheable = ref Value_types.Cacheable + + module DataflowArg: Dataflow2.ForwardsTransfer with type t = diff = struct + + let debug = false + let name = "Values analysis" - (* Walk through all the statements for which [to_propagate] is not empty. - Those statements are marked as "not fully propagated", for ulterior - display in the gui. Also mark the current statement as root if relevant.*) - let mark_degeneration () = - StmtStartData.iter - (fun stmt v -> - if not (State_set.is_empty v.to_propagate) then - Value_util.DegenerationPoints.replace stmt false); - match CilE.current_stmt () with - | Kglobal -> () - | Kstmt s -> - let kf = Kernel_function.find_englobing_kf s in - if Kernel_function.equal kf current_kf then ( - Value_util.DegenerationPoints.replace s true; - CilE.end_stmt ()) + module StmtStartData = + Dataflow2.StartData(struct type t = diff let size = 107 end) - type t = u + type t = diff let copy (d: t) = d @@ -271,8 +337,8 @@ thus we need to add the statement here (instead of e.g. in doStmt, which would be too late). *) let new_v = State_set.add_statement new_v s in - let current_info = Current_table.find_current current_table s in - let old_counter = current_info.Current_table.counter_unroll in + let current_info = stmt_state s in + let old_counter = current_info.counter_unroll in (* Check whether there is enough slevel available. If not, merge all states together. However, do not perform merge on return instructions. This needelessly degrades precision for @@ -302,7 +368,7 @@ reached; counter_unroll_target := reached + period; end; - current_info.Current_table.counter_unroll <- new_counter_unroll; + current_info.counter_unroll <- new_counter_unroll; old.to_propagate <- merged; Some old with State_set.Unchanged -> None @@ -312,11 +378,6 @@ r end - (** Clobbered list for bases containing addresses of local variables. *) - let clob = Locals_scoping.bottom () - - let cacheable = ref Value_types.Cacheable - let interp_call stmt lval_to_assign funcexp argl d_value = let with_alarms = warn_all_quiet_mode () in let aux = @@ -334,7 +395,7 @@ let doInstr stmt (i: instr) (d: t) = !Db.progress (); - CilE.start_stmt (Kstmt stmt); + Valarms.start_stmt (Kstmt stmt); let d_states = d.to_propagate in let unreachable = State_set.is_empty d_states in let result = @@ -371,8 +432,8 @@ apply_each_state (fun state -> let loc = Eval_exprs.lval_to_loc ~with_alarms state lv in - CilE.set_syntactic_context (CilE.SyMem lv); - Model.add_binding ~with_alarms + Valarms.set_syntactic_context (Valarms.SyMem lv); + Eval_op.add_binding ~with_alarms ~exact:true state loc V.top_int ) | Call (_, @@ -393,7 +454,7 @@ let locbytes = eval_expr ~with_alarms state dst in let locbits = Locations.loc_bytes_to_loc_bits locbytes in let loc = Locations.make_loc locbits size in - Model.add_binding ~with_alarms + Eval_op.add_binding ~with_alarms ~exact:true state loc V.top_int ) | Call (lval_to_assign,funcexp,argl,_loc) -> @@ -408,14 +469,14 @@ annotation table *) end in - CilE.end_stmt (); + Valarms.end_stmt (); result let doStmtSpecific s _d states = match s.skind with | Loop _ -> - let current_info = Current_table.find_current current_table s in - let counter = current_info.Current_table.counter_unroll in + let current_info = stmt_state s in + let counter = current_info.counter_unroll in if counter >= slevel s then Value_parameters.result ~level:1 ~once:true ~current:true "entering loop for the first time"; @@ -439,27 +500,31 @@ along the back edges of the loop. Since this is not currently easy, we use an approximation that consists in merging all the states on the loop node. *) - let merge_if_loop s (d: t) = + let maybe_merge_loop s (d: t) = match s.skind with | Loop _ -> - d.to_propagate <- - State_set.singleton (State_set.join d.to_propagate) + let kf = Kernel_function.find_englobing_kf s in + if Kernel_function.Set.mem kf + (Value_parameters.SlevelMergeAfterLoop.get ()) + then + d.to_propagate <- + State_set.singleton (State_set.join d.to_propagate) | _ -> () let doStmt (s: stmt) (d: t) = + Valarms.start_stmt (Kstmt s); check_signals (); - if slevel_merge_after_loop then merge_if_loop s d; + maybe_merge_loop s d; let states = d.to_propagate in Db.Value.Compute_Statement_Callbacks.apply (s, call_stack(), State_set.to_list states); - CilE.start_stmt (Kstmt s); (* Cleanup function, to be called on all exit paths *) let ret result = (* Do this as late as possible, as a non-empty to_propagate field is shown in a special way in case of degeneration *) d.to_propagate <- State_set.empty; - CilE.end_stmt (); + Valarms.end_stmt (); result in if State_set.is_empty states then ret Dataflow2.SDefault @@ -467,7 +532,7 @@ let states = (* Remove states already present *) if obviously_terminates then states - else Current_table.update_and_tell_if_changed current_table s states + else update_stmt_states s states in if State_set.is_empty states then ret Dataflow2.SDefault else @@ -490,15 +555,13 @@ if State_set.is_empty states then ret Dataflow2.SDefault else let is_return = is_return s in - let current_info = Current_table.find_current current_table s in - let old_counter = current_info.Current_table.counter_unroll in + let current_info = stmt_state s in + let old_counter = current_info.counter_unroll in let new_states = if (old_counter >= slevel && not is_return) || (is_return && obviously_terminates) then (* No slevel left, perform some join and/or widening *) - let curr_wcounter, curr_wstate = - Current_table.find_widening_info current_table s - in + let curr_wcounter, curr_wstate = stmt_widening_info s in (* Note: curr_wstate is the previous widening state, so there is no need to attach any trace to it: it would just be a prefix of the currently propagated trace. *) @@ -510,7 +573,7 @@ else if obviously_terminates then begin - Current_table.update_widening_info current_table s 0 joined; + update_stmt_widening_info s 0 joined; states end else @@ -526,7 +589,7 @@ in let new_state = State_set.singleton (r, trace) in if Cvalue.Model.equal r joined then ( - Current_table.update_widening_info current_table s new_wcounter r; + update_stmt_widening_info s new_wcounter r; new_state) else begin (* Try to correct over-widenings *) let new_states = @@ -537,8 +600,7 @@ List.fold_left (interp_annot false) new_state annots in let (new_joined,tr) = State_set.join new_states in - Current_table.update_widening_info - current_table s new_wcounter new_joined; + update_stmt_widening_info s new_wcounter new_joined; State_set.singleton (new_joined,tr) end else states @@ -551,13 +613,11 @@ let doEdge s succ d = let kinstr = Kstmt s in let states = d.to_propagate in - CilE.start_stmt kinstr; + Valarms.start_stmt kinstr; (* We store the state after the execution of [s] for the callback {Value.Record_Value_After_Callbacks}. This is done here because we want to see the values of the variables local to the block *) - if (Value_parameters.ResultsAfter.get () || - not (Db.Value.Record_Value_After_Callbacks.is_empty ())) - && (store_state_after_during_dataflow s succ) + if store_state_after_during_dataflow s succ then ( let old = try Cil_datatype.Stmt.Hashtbl.find states_after s @@ -585,61 +645,15 @@ State_set.empty states; in - CilE.end_stmt (); + Valarms.end_stmt (); d.to_propagate <- states; d - (* Check that the dataflow is indeed finished *) - let checkConvergence () = - StmtStartData.iter (fun k v -> - if not (State_set.is_empty (v.to_propagate)) then - Value_parameters.fatal "sid:%d@\n%a@\n" - k.sid State_set.pretty v.to_propagate - ) - - (* Final states of the function, reduced by the post-condition *) - let final_states () = - let states = Current_table.find_superposition current_table return in - (* Reduce final states according to the function postcondition *) - let result = match return_lv with - | Some (Var v, NoOffset) -> Some v - | Some _ -> assert false - | None -> None - in - Eval_annots.check_fct_postconditions - current_kf AnalysisParam.active_behaviors - ~result - ~init_state:initial_state - ~post_states:states - Normal (* termination kind*) - - let externalize states = - CilE.start_stmt (Kstmt return); - let with_alarms = warn_all_quiet_mode () in - (* Partial application is useful, do not inline *) - let externalize = - Eval_stmt.externalize ~with_alarms current_kf ~return_lv clob - in - let states = - Split_return.join_final_states current_kf ~return_lv states in - let r = List.map externalize states in - CilE.end_stmt (); - r - - let results () = - if debug then checkConvergence (); - let final_states = final_states () in - let externalized = externalize final_states in { - Value_types.c_values = externalized; - c_clobbered = clob.Locals_scoping.clob; - c_cacheable = !cacheable; - } - let doGuardOneCond stmt context exp t = if State_set.is_empty (t.to_propagate) then Dataflow2.GUnreachable else begin - CilE.start_stmt (Kstmt stmt); + Valarms.start_stmt (Kstmt stmt); let with_alarms = warn_all_quiet_mode () in let new_values = State_set.fold @@ -647,7 +661,7 @@ let state, _, test = eval_expr_with_deps_state None ~with_alarms state exp in - CilE.set_syntactic_context context; + Valarms.set_syntactic_context context; let warn = Warn.check_not_comparable Eq V.singleton_zero test in let do_it = (warn && Value_parameters.UndefinedPointerComparisonPropagateAll.get ()) || @@ -670,7 +684,7 @@ if State_set.is_empty new_values then Dataflow2.GUnreachable else Dataflow2.GUse { to_propagate = new_values} in - CilE.end_stmt (); + Valarms.end_stmt (); result end @@ -681,7 +695,7 @@ let doGuard stmt exp t = let not_exp = new_exp ~loc:exp.eloc (UnOp(LNot, exp, intType)) in let th, el as thel = - let context = CilE.SyUnOp exp in + let context = Valarms.SyUnOp exp in doGuardOneCond stmt context exp t, doGuardOneCond stmt context not_exp t in let th_reachable = @@ -711,9 +725,85 @@ if new_status <> 0 then Cil_datatype.Stmt.Hashtbl.replace conditions_table stmt new_status; Separate.filter_if stmt thel + + end + + module Dataflow = Dataflow2.Forwards(DataflowArg) + + (* Walk through all the statements for which [to_propagate] is not empty. + Those statements are marked as "not fully propagated", for ulterior + display in the gui. Also mark the current statement as root if relevant.*) + let mark_degeneration () = + DataflowArg.StmtStartData.iter + (fun stmt v -> + if not (State_set.is_empty v.to_propagate) then + Value_util.DegenerationPoints.replace stmt false); + match Valarms.current_stmt () with + | Kglobal -> () + | Kstmt s -> + let kf = Kernel_function.find_englobing_kf s in + if Kernel_function.equal kf current_kf then ( + Value_util.DegenerationPoints.replace s true; + Valarms.end_stmt ()) + + + (* Check that the dataflow is indeed finished *) + let checkConvergence () = + DataflowArg.StmtStartData.iter (fun k v -> + if not (State_set.is_empty (v.to_propagate)) then + Value_parameters.fatal "sid:%d@\n%a@\n" + k.sid State_set.pretty v.to_propagate + ) + + (* Final states of the function, reduced by the post-condition *) + let final_states () = + let states = states_unmerged return in + (* Reduce final states according to the function postcondition *) + let result = match return_lv with + | Some (Var v, NoOffset) -> Some v + | Some _ -> assert false + | None -> None + in + Eval_annots.check_fct_postconditions + current_kf AnalysisParam.active_behaviors + ~result + ~init_state:initial_state + ~post_states:states + Normal (* termination kind*) + + let externalize states = + Valarms.start_stmt (Kstmt return); + let with_alarms = warn_all_quiet_mode () in + (* Partial application is useful, do not inline *) + let externalize = + Eval_stmt.externalize ~with_alarms current_kf ~return_lv clob + in + let states = Split_return.join_final_states current_kf ~return_lv states in + let r = List.map externalize states in + Valarms.end_stmt (); + r + + let results () = + if DataflowArg.debug then checkConvergence (); + let final_states = final_states () in + let externalized = externalize final_states in { + Value_types.c_values = externalized; + c_clobbered = clob.Locals_scoping.clob; + c_cacheable = !cacheable; + } + + let compute states = + let start = Kernel_function.find_first_stmt AnalysisParam.kf in + (* Init the dataflow state for the first statement *) + let dinit = { to_propagate = states} in + let dinit = DataflowArg.computeFirstPredecessor start dinit in + DataflowArg.StmtStartData.add start dinit; + Dataflow.compute [start] + end + (* Local Variables: compile-command: "make -C ../.." diff -Nru frama-c-20140301+neon+dfsg/src/value/eval_slevel.mli frama-c-20150201+sodium+dfsg/src/value/eval_slevel.mli --- frama-c-20140301+neon+dfsg/src/value/eval_slevel.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/eval_slevel.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -30,10 +30,9 @@ val active_behaviors : Eval_annots.ActiveBehaviors.t end) : sig - type u = { mutable to_propagate : State_set.t; } - include Dataflow2.ForwardsTransfer with type t = u + val compute: State_set.t -> unit + val results: unit -> Value_types.call_result val merge_results : unit -> unit val mark_degeneration : unit -> unit - val results: unit -> Value_types.call_result end diff -Nru frama-c-20140301+neon+dfsg/src/value/eval_stmt.ml frama-c-20150201+sodium+dfsg/src/value/eval_stmt.ml --- frama-c-20140301+neon+dfsg/src/value/eval_stmt.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/eval_stmt.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -26,7 +26,6 @@ open Cil open Locations open Abstract_interp -open Bit_utils open Cvalue open Value_util open Eval_exprs @@ -45,73 +44,14 @@ | _ -> true -(** Precondition: the type of [v] and the type of [loc_lv] may be different - only through a truncation or an extension. - This function will not perform any conversion (float->int, int->float, ...) - [exp] should not be bottom (for optimization purposes in the caller). *) - let do_assign_abstract_value ~with_alarms state typ_lv loc_lv v = - assert (not (Cvalue.V.is_bottom v)); - (* Or one may propagate bottoms uselessly for too long. *) - let exp = (* truncate the value if the [lv] is too small: this may - happen when the [lv] is a bit-field. Otherwise, the - cast is explicit thanks to Cil and no truncation is - necessary. *) - try - (* if it is a bit-field, the size is statically known. *) - let size = Int_Base.project loc_lv.size in (* TODOBY: ignore this case*) - try - ignore (V.project_ival v); - Eval_op.cast_lval_bitfield typ_lv loc_lv.size v - with - | V.Not_based_on_null (* from [project_ival] *) -> - (* The exp is a pointer: check there are enough bits in - the bit-field to contain it. *) - if Int.ge size (Int.of_int (sizeofpointer ())) || V.is_imprecise v - then v - else begin - Value_parameters.result - "casting address to a bit-field of %s bits: this is smaller than sizeof(void*)" - (Int.to_string size); - V.topify_arith_origin v - end - | Neither_Int_Nor_Enum_Nor_Pointer - (* from [signof_typeof_lval] *) -> v - with - | Int_Base.Error_Top (* from Int_Base.project *) -> - (* Imprecise location, handled below *) v - in - (match loc_lv.loc with - | Location_Bits.Top (Base.SetLattice.Top, orig) -> - Value_parameters.result - "State before degeneration:@\n======%a@\n=======" - Cvalue.Model.pretty state; - warning_once_current - "writing at a completely unknown address@[%a@].@\nAborting." - Origin.pretty_as_reason orig; - raise Db.Value.Aborted - - | Location_Bits.Top((Base.SetLattice.Set _) as param,orig) -> - Value_parameters.result ~current:true ~once:true - "writing somewhere in @[%a@]@[%a@]." - Base.SetLattice.pretty param - Origin.pretty_as_reason orig - - | Location_Bits.Map _ -> (* everything is normal *) () - ); - let exact = valid_cardinal_zero_or_one ~for_writing:true loc_lv in - let value = Cvalue.Model.add_binding ~with_alarms ~exact state loc_lv exp in - value - - exception Do_assign_imprecise_copy - (* Assigns [exp] to [lv] in [state]. [lv_is_volatile] and [typ_lv] are - information about [lv] that are computed by the caller. [left_loc] is - one of the locations [lv] evaluates to. Returns [state] modified by + (* Assigns [exp] to [lv] in [state]. [typ_lv] is the type if [lv]. [left_loc] + is one of the locations [lv] evaluates to. Returns [state] modified by the assignment, and whether [left_loc] was at least partially valid. If [warn_indeterminate] is [true], indetermine values inside [exp] are caught, signaled to the user, and removed. *) - let do_assign_one_loc ~with_alarms clob ~warn_indeterminate state lv lv_is_volatile typ_lv exp left_loc = + let do_assign_one_loc ~with_alarms clob ~warn_indeterminate state lv typ_lv exp left_loc = let state, left_loc = if Locations.is_bottom_loc left_loc then Model.bottom, left_loc @@ -133,11 +73,7 @@ Locations.is_bottom_loc left_loc || not (Cvalue.Model.is_reachable state) then Cvalue.Model.bottom - else begin - CilE.set_syntactic_context (CilE.SyMem lv); - let v = if lv_is_volatile then Eval_op.light_topify v else v in - do_assign_abstract_value ~with_alarms state typ_lv left_loc v - end + else Eval_op.write_abstract_value ~with_alarms state lv typ_lv left_loc v in (* More precise copy, in case exp is in fact an lval (and has a known size). We copy the entire lval in one operation. This is typically useful for @@ -157,36 +93,48 @@ if not (Cvalue.Model.is_reachable state) then Cvalue.Model.bottom else begin - (* tested before this function is called, in which case the imprecise - mode is used *) + (* top size is tested before this function is called, in which case + the imprecise copy mode is used *) let size = Int_Base.project right_loc.size in - CilE.set_syntactic_context (CilE.SyMem exp_lv); + Valarms.set_syntactic_context (Valarms.SyMem exp_lv); let offsetmap = - Cvalue.Model.copy_offsetmap ~with_alarms right_loc state + Eval_op.copy_offsetmap ~with_alarms right_loc.loc size state in - let offsetmap = - Extlib.opt_bind - (fun o -> - if warn_indeterminate - then Warn.warn_indeterminate_offsetmap ~with_alarms typ_lv o - else Some o) - offsetmap + let make_volatile = + typeHasQualifier "volatile" typ_lv || + typeHasQualifier "volatile" (Cil.typeOfLval exp_lv) + in + let offsetmap_state = match offsetmap with + | `Map o -> + let o = + (* TODO: this is the good place to handle partially volatile + struct, whether as source or destination *) + if make_volatile then begin + V_Offsetmap.map_on_values + (V_Or_Uninitialized.map Eval_op.make_volatile) o + end else o + in + (* Warn for unitialized/escaping addresses. May return bottom + when a part of the offsetmap contains no value. *) + if warn_indeterminate then + Warn.warn_reduce_indeterminate_offsetmap + ~with_alarms typ_lv o (`Loc right_loc) state + else `Res (o, state) + | `Top -> Warn.warn_top (); + | `Bottom -> `Bottom in - match offsetmap with - | None -> Model.bottom - | Some offsetmap -> - assert (not (Cvalue.V_Offsetmap.is_empty offsetmap)); + match offsetmap_state with + | `Bottom -> Model.bottom + | `Res (offsetmap, state) -> Locals_scoping.remember_if_locals_in_offsetmap clob left_loc offsetmap; - (* TODO: message "assigning non deterministic value for - the first time" *) (match Warn.offsetmap_contains_imprecision offsetmap with | Some v -> Warn.warn_right_exp_imprecision ~with_alarms lv left_loc v | _ -> ()); - CilE.set_syntactic_context (CilE.SyMem lv); - Cvalue.Model.paste_offsetmap with_alarms - offsetmap left_loc.loc Int.zero size true state + Valarms.set_syntactic_context (Valarms.SyMem lv); + Eval_op.paste_offsetmap ~reducing:false ~with_alarms + ~from:offsetmap ~dst_loc:left_loc.loc ~size ~exact:true state end in if Locations.is_bottom_loc left_loc @@ -211,28 +159,38 @@ in let state_res = try - if lv_is_volatile || Eval_op.is_bitfield typ_lv + if Eval_op.is_bitfield typ_lv then default () else (* An lval assignement might be hidden by a dummy cast *) - let exp_lv = find_lv ~with_alarms state exp in + let exp_lv = find_lv state exp in right_is_lval exp_lv with Cannot_find_lv | Do_assign_imprecise_copy -> default () in state_res, not (Locations.is_bottom_loc left_loc) + (* Evaluate a location with the intent of writing in it. Signal an error + if the lvalue is constant *) + let lval_to_precise_loc_state_for_writing ~with_alarms state lv = + let (_, _, typ as r) = lval_to_precise_loc_state ~with_alarms state lv in + if Value_util.is_const_write_invalid typ then begin + Valarms.set_syntactic_context (Valarms.SyMem lv); + Valarms.warn_mem_write with_alarms; + Model.bottom, Precise_locs.loc_bottom, typ + end else + r + (* Assigns [exp] to [lv] in [state] *) let do_assign ~with_alarms kf clob state lv exp = assert (Cvalue.Model.is_reachable state); let state, precise_left_loc, typ_lv = - lval_to_precise_loc_state ~with_alarms state lv + lval_to_precise_loc_state_for_writing ~with_alarms state lv in - let lv_is_volatile = hasAttribute "volatile" (typeAttrs typ_lv) in let warn_indeterminate = Value_util.warn_indeterminate kf in let aux_loc loc (acc_state, acc_non_bottom_loc) = let state', non_bottom_loc = do_assign_one_loc ~with_alarms - clob ~warn_indeterminate state lv lv_is_volatile typ_lv exp loc + clob ~warn_indeterminate state lv typ_lv exp loc in Model.join acc_state state', non_bottom_loc || acc_non_bottom_loc in @@ -240,7 +198,7 @@ Precise_locs.fold aux_loc precise_left_loc (Model.bottom, false) in if not non_bottom_loc then - CilE.do_warn with_alarms.CilE.imprecision_tracing + Valarms.do_warn with_alarms.CilE.imprecision_tracing (fun _ -> Kernel.warning ~current:true ~once:true "@[@[all target addresses were invalid. This path is \ assumed to be dead.@]%t@]" pp_callstack @@ -262,13 +220,7 @@ try if not (List.exists (fun x -> Locations.loc_equal v x) tail) then raise Too_linear; - let value = - Cvalue.Model.find - ~conflate_bottom:true - ~with_alarms:CilE.warn_none_mode - state - v - in + let _, value = Cvalue.Model.find state v in if Location_Bytes.is_included value Location_Bytes.top_float then raise Too_linear; (* any value is possible, provided it is not too hight *) @@ -304,70 +256,100 @@ ~for_writing:true state loc lv in if Locations.is_bottom_loc loc then - state, false + state else - let is_bitfield = Eval_op.is_bitfield lvtyp in - if not (is_bitfield) && not (need_cast lvtyp rettype) then + if not (Eval_op.is_bitfield lvtyp) && not (need_cast lvtyp rettype) then (* Direct paste *) let size = Int_Base.project loc.size in - CilE.set_syntactic_context (CilE.SyMem lv); + Valarms.set_syntactic_context (Valarms.SyMem lv); let result = - Cvalue.Model.paste_offsetmap with_alarms - return loc.loc Int.zero size true state + Eval_op.paste_offsetmap ~with_alarms ~reducing:false + ~from:return ~dst_loc:loc.loc ~size ~exact:true state in Locals_scoping.remember_if_locals_in_offsetmap clob loc return; - result, false + result else (* Size mismatch. We read then cast the returned value *) let size = Int.of_int (bitsSizeOf rettype) in let validity = Base.Known (Int.zero, Int.pred size) in - let value_with_init = - V_Offsetmap.find - ~conflate_bottom:false ~validity ~with_alarms:CilE.warn_none_mode - ~offsets:Ival.zero ~size return + let alarm, value_with_init = + V_Offsetmap.find ~validity ~offsets:Ival.zero ~size return in - let flags = V_Or_Uninitialized.get_flags value_with_init in - let init = V_Or_Uninitialized.is_initialized flags in - let no_esc = V_Or_Uninitialized.is_noesc flags in + if alarm then Valarms.warn_mem_read with_alarms; let value = V_Or_Uninitialized.get_v value_with_init in (* Cf. bts #997 and #1024 for the syntactic context below *) - CilE.set_syntactic_context CilE.SyCallResult; + Valarms.set_syntactic_context Valarms.SyCallResult; let evaled_exp = Eval_op.reinterpret ~with_alarms rettype value in - if not init then CilE.warn_uninitialized with_alarms; - if not no_esc then CilE.warn_escapingaddr with_alarms; - let exact = valid_cardinal_zero_or_one ~for_writing:true loc in + ignore (Warn.maybe_warn_indeterminate ~with_alarms value_with_init); (* Type of [lv] and [return] might differ, perform a cast (bug #798) *) - let evaled_exp = - if is_bitfield - then Eval_op.cast_lval_bitfield lvtyp loc.size evaled_exp - else - let msg fmt = - Format.fprintf fmt "call result (%a)" V.pretty evaled_exp - in - Eval_op.do_promotion ~with_alarms (get_rounding_mode()) - ~src_typ:rettype ~dst_typ:lvtyp evaled_exp msg + let v_exp = + let msg fmt = + Format.fprintf fmt "call result (%a)" V.pretty evaled_exp + in + Eval_op.do_promotion ~with_alarms (get_rounding_mode()) + ~src_typ:rettype ~dst_typ:lvtyp evaled_exp msg in - Locals_scoping.remember_if_locals_in_value clob loc evaled_exp; - CilE.set_syntactic_context (CilE.SyMem lv); - let res = Model.add_binding ~with_alarms ~exact state loc evaled_exp in - let failed = Cvalue.V.is_bottom value && not (init && no_esc) in - res, failed + Locals_scoping.remember_if_locals_in_value clob loc v_exp; + Eval_op.write_abstract_value ~with_alarms state lv lvtyp loc v_exp (* Same as function above, but for multiple locations. *) let assign_return_to_lv ~with_alarms clob rettype (lv, ploc, lvtyp) return state = - let aux loc (acc_state, acc_failed) = - let state, failed = + let aux loc acc_state = + let state = assign_return_to_lv_one_loc ~with_alarms clob rettype (lv, loc, lvtyp) return state in - Model.join acc_state state, acc_failed || failed + Model.join acc_state state in - let state, failed = Precise_locs.fold aux ploc (Model.bottom, false) in - if failed then - Value_parameters.result ~current:true - "Function call returned an unspecified value. \ - This path is assumed to be dead."; - state + Precise_locs.fold aux ploc Model.bottom + (** This function unbinds [formals] in [state]. Also, when possible, given + a formal [f], it reduces the corresponding actual [act_f] to the value + of [f] in [state]. It it is used after a call to clean up the state, + and to gain some informations on the actuals. *) + let reduce_actuals_by_formals formals actuals state = + let rec find_actual_varinfo e = match e.enode with + | Lval (Var vi, NoOffset) -> + if not vi.vaddrof && not (Cil.typeHasQualifier "volatile" vi.vtype) + then Some vi else None + | CastE (typ, e') -> begin + match find_actual_varinfo e' with + | None -> None + | Some vi as ovi -> + (* we can ignore casts, but only if they have no effect on the + abstract value *) + match Cil.unrollType typ, Cil.unrollType vi.vtype with + | (TInt (ik, _) | TEnum ({ekind = ik}, _)), + (TInt (ik', _) | TEnum ({ekind = ik'}, _)) -> + if Cil.bytesSizeOfInt ik = Cil.bytesSizeOfInt ik' && + Cil.isSigned ik = Cil.isSigned ik' + then ovi else None + | TPtr _, TPtr _ -> ovi + | TFloat (fk, _), TFloat (fk', _) -> + if fk = fk' then ovi else None + | _ -> None + end + | _ -> None + in + let cleanup acc exp v = + let b = Base.of_varinfo v in + let reduced = match find_actual_varinfo exp with + | Some vi -> begin + (* Replace [vi] by [b] when the latter is is bound in [state]. This + is sound because, had [b] been written during the call, it would + have been removed. (see {!externalize} below). Thus, either [b] + is equal to [vi], or it has been reduced during the call (in which + case it is useful to reduce [vi]). *) + try + match Model.find_base b acc with + | `Bottom | `Top -> acc + | `Map offsm -> Model.add_base (Base.of_varinfo vi) offsm acc + with Not_found -> acc + end + | None -> acc + in + Cvalue.Model.remove_base b reduced + in + Function_args.fold_left2_best_effort cleanup state actuals formals let interp_call ~with_alarms clob stmt lval_to_assign funcexp argl state = let cacheable = ref Value_types.Cacheable in @@ -388,10 +370,14 @@ let warn_indeterminate = Kernel_function.Hptset.exists warn_indeterminate functions in - let compute_actual = - Function_args.compute_actual ~with_alarms ~warn_indeterminate + let aux_actual e (state, actuals) = + let offsm, state = + Function_args.compute_actual + ~with_alarms ~warn_indeterminate state e + in + state, (e, offsm) :: actuals in - let actuals = List.map (compute_actual state) argl in + let state, actuals = List.fold_right aux_actual argl (state, []) in (* TODO: check that lval_to_assign is not modified during the call: evaluate its dependencies here, and intersect them with the outs of the called function. The code below is not sound. *) @@ -414,15 +400,16 @@ in *) let caller = current_kf (), stmt in (* Remove bottom state from results, assigns result to retlv *) - let treat_one_result res (return, state) = + let treat_one_result formals res (return, state) = if not (Cvalue.Model.is_reachable state) then res else + let state = reduce_actuals_by_formals formals argl state in match lval_to_assign with | None -> state :: res | Some lv -> let state, ploc, typlv = - lval_to_precise_loc_state ~with_alarms state lv + lval_to_precise_loc_state_for_writing ~with_alarms state lv in (* See comments above. Warn.warn_modified_result_loc with_alarms kf locret state lvret; @@ -443,16 +430,23 @@ in let treat_one_function f acc_rt_res = try - Kf_state.add_caller f ~caller; + Value_results.add_kf_caller f ~caller; let call_kinstr = Kstmt stmt in - let res = !compute_call_ref f ~call_kinstr state actuals in + let recursive = not (Warn.check_no_recursive_call f) in + let res = + !compute_call_ref f ~recursive ~call_kinstr state actuals in CurrentLoc.set call_site_loc; (* Changed by compute_call_ref *) if res.Value_types.c_cacheable = Value_types.NoCacheCallers then (* Propagate info that callers cannot be cached either *) cacheable := Value_types.NoCacheCallers; Locals_scoping.remember_bases_with_locals clob res.Value_types.c_clobbered; - List.fold_left treat_one_result acc_rt_res res.Value_types.c_values + (* If the call is recursive, we must not remove the formals: they + have been restored to their values during the original call. *) + let formals = + if recursive then [] else Kernel_function.get_formals f in + let treat = treat_one_result formals in + List.fold_left treat acc_rt_res res.Value_types.c_values with | Function_args.WrongFunctionType -> warning_once_current @@ -464,7 +458,6 @@ let results = Kernel_function.Hptset.fold treat_one_function functions [] in - if results <> [] then Value_results.mark_call_terminating stmt; results, !cacheable with | Function_args.Actual_is_bottom -> (* from compute_actual *) @@ -478,7 +471,9 @@ let conv lv = let loc = lval_to_precise_loc ~with_alarms:CilE.warn_none_mode state lv in let for_writing = false in - let exact = lazy (Precise_locs.cardinal_zero_or_one ~for_writing loc) in + let exact = + lazy (Precise_locs.valid_cardinal_zero_or_one ~for_writing loc) + in let z = Precise_locs.enumerate_valid_bits ~for_writing loc in lv, exact, z in @@ -489,8 +484,8 @@ List.iter (fun (lv2, exact2, z2) -> if Locations.Zone.intersects z1 z2 then begin - CilE.set_syntactic_context (CilE.SySep(lv1, lv2)); - CilE.warn_separated warn_all_mode; + Valarms.set_syntactic_context (Valarms.SySep(lv1, lv2)); + Valarms.warn_separated warn_all_mode; if Lazy.force exact1 && Lazy.force exact2 then raise AlwaysOverlap end; @@ -521,7 +516,8 @@ List.iter (fun x -> check_one_stmt x seq) seq - (* Remove locals from the given, and extract the content of \result *) + (* Remove locals and overwritten variables from the given state, and extract + the content of \result. *) let externalize ~with_alarms kf ~return_lv clob = let fundec = Kernel_function.get_definition kf in let offsetmap_top_addresses_of_locals, state_top_addresses_of_locals = @@ -534,30 +530,42 @@ state, None | Some lv -> let typ_ret = Cil.typeOfLval lv in - let _loc, state, oret = - Eval_exprs.offsetmap_of_lv ~with_alarms state lv + let _loc, state, oret = + try + Eval_exprs.offsetmap_of_lv ~with_alarms state lv + with Int_Base.Error_Top -> + Value_parameters.abort ~current:true + "Function %a returns a value of unknown size. Aborting" + Kernel_function.pretty kf in match oret with - | None -> + | `Bottom -> assert (Model.equal Model.bottom state); state, None - | Some oret -> - CilE.set_syntactic_context (CilE.SyMem lv); - let o = + | `Top -> Warn.warn_top (); + | `Map oret -> + Valarms.set_syntactic_context (Valarms.SyMem lv); + let offsetmap_state = if Value_util.warn_indeterminate kf then - Warn.warn_indeterminate_offsetmap ~with_alarms typ_ret oret - else Some oret + Warn.warn_reduce_indeterminate_offsetmap + ~with_alarms typ_ret oret `NoLoc state + else `Res (oret, state) in - match o with - | None -> (* Completely indeterminate return *) + match offsetmap_state with + | `Bottom -> (* Completely indeterminate return *) Model.bottom, None - | Some ret_val -> + | `Res (ret_val, state) -> let locals, r = offsetmap_top_addresses_of_locals ret_val in if not (Cvalue.V_Offsetmap.equal r ret_val) then Warn.warn_locals_escape_result fundec locals; state, Some r in - let state = Cvalue.Model.uninitialize_formals_locals fundec state in + let state = Cvalue.Model.remove_variables fundec.slocals state in + (* We only remove from [state] the locals that have been overwritten + during the call. The other ones will be used by the caller. See + {!reduce_actuals_by_formals} above. *) + let written_formals = Value_util.written_formals kf in + let state = Cvalue.Model.remove_variables written_formals state in let state = state_top_addresses_of_locals state in ret_val, state diff -Nru frama-c-20140301+neon+dfsg/src/value/eval_stmt.mli frama-c-20150201+sodium+dfsg/src/value/eval_stmt.mli --- frama-c-20140301+neon+dfsg/src/value/eval_stmt.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/eval_stmt.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -25,6 +25,7 @@ val compute_call_ref : (kernel_function -> + recursive:bool -> call_kinstr:kinstr -> Model.t -> (exp * V_Offsetmap.t) list -> diff -Nru frama-c-20140301+neon+dfsg/src/value/eval_terms.ml frama-c-20150201+sodium+dfsg/src/value/eval_terms.ml --- frama-c-20140301+neon+dfsg/src/value/eval_terms.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/eval_terms.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -79,7 +79,7 @@ Format.fprintf fmt "unsupported logic var %s" tv.lv_name | AstError s -> Format.fprintf fmt "error in AST: %s; please report" s | NoEnv (LogicLabel (_, s)) -> - Format.fprintf fmt "no environment to evaluate \\at(%s,_)" s + Format.fprintf fmt "no environment to evaluate \\at(_,%s)" s | NoEnv (StmtLabel _) -> Format.fprintf fmt "\\at() on a C label is unsupported" | NoResult -> Format.fprintf fmt "meaning of \\result not specified" @@ -134,7 +134,7 @@ L: x = 1; \assert \at(x == 1, L); - A nave implementation of assertions involving C labels is likely to miss + A naïve implementation of assertions involving C labels is likely to miss the fact that the assertion is false after the else branch. A good solution is to use a dummy edge that flows from L to the assertion, to force its re-evaluation. @@ -183,45 +183,52 @@ let overwrite_current_state env state = overwrite_state env state env.e_cur -let lbl_here = LogicLabel (None, "Here") +let lbl_here = Logic_const.here_label -let add_logic ll state states = - Logic_label.Map.add (LogicLabel (None, ll)) state states -let add_here = add_logic "Here" -let add_pre = add_logic "Pre" -let add_post = add_logic "Post" -let add_old = add_logic "Old" +let add_logic ll state (states: labels_states): labels_states = + Logic_label.Map.add ll state states +let add_here = add_logic Logic_const.here_label +let add_pre = add_logic Logic_const.pre_label +let add_post = add_logic Logic_const.post_label +let add_old = add_logic Logic_const.old_label +(* Init is a bit special, it is constant and always added to the initial state*) +let add_init state = + add_logic Logic_const.init_label (Db.Value.globals_state ()) state -let env_pre_f ?(c_labels=Logic_label.Map.empty) ~init () = { +let env_pre_f ?(c_labels=Logic_label.Map.empty) ~pre () = { e_cur = lbl_here; - e_states = add_here init (add_pre init c_labels); + e_states = add_here pre (add_pre pre (add_init c_labels)); result = None (* Never useful in a pre *); } let env_post_f ?(c_labels=Logic_label.Map.empty) ~pre ~post ~result () = { e_cur = lbl_here; - e_states = - add_post post (add_here post (add_pre pre (add_old pre c_labels))); + e_states = add_post post + (add_here post (add_pre pre (add_old pre (add_init c_labels)))); result = result; } let env_annot ?(c_labels=Logic_label.Map.empty) ~pre ~here () = { e_cur = lbl_here; - e_states = add_here here (add_pre pre c_labels); - result = None (* Never useful in a 'assert' *) (* TODO: will be needed for stmt contracts *); + e_states = add_here here (add_pre pre (add_init c_labels)); + result = None (* Never useful in a 'assert'. TODO: will be needed for stmt + contracts *); } -let env_assigns ~init = { +let env_assigns ~pre = { e_cur = lbl_here; - (* YYY: is missing, but is too difficult in the current evaluation scheme *) - e_states = add_old init (add_here init (add_pre init Logic_label.Map.empty)); + (* YYY: Post label is missing, but is too difficult in the current evaluation + scheme, since we build it by evaluating the assigns... *) + e_states = add_old pre + (add_here pre (add_pre pre (add_init Logic_label.Map.empty))); result = None (* Treated in a special way in callers *) } -let env_here state = { +let env_only_here state = { e_cur = lbl_here; - e_states = add_here state Logic_label.Map.empty; - result = None (* Never useful in a 'assert' *) (* TODO: will be needed for stmt contracts *); + e_states = add_here state (add_init Logic_label.Map.empty); + result = None (* Never useful in a 'assert'. TODO: will be needed for stmt + contracts *); } (* Return the base and the type corresponding to the logic var if it is within @@ -339,19 +346,60 @@ (* Type holding the result of an evaluation. Currently, 'a is either [Cvalue.V.t] for [eval_term], and [Location_Bits.t] for - [eval_tlval_as_loc], and [Ival.t] for [eval_toffset]. [evalue] is - a list because logic evaluate sets of terms (or tsets); so [evalue] - represents the set of the results of evaluation of a tset. Note - that this is an exact (not over-approximated) set of - over-approximated values. *) + [eval_tlval_as_loc], and [Ival.t] for [eval_toffset]. [eover] + contains an over-approximation of the evaluation. [eunder] contains an + under-approximation, under the hypothesis that the state in which we + evaluate is not Bottom. (Otherwise, all under-approximations would be + Bottom themselves). The following two invariants should hold: + (1) eunder \subset eover. + (2) when evaluating something that is not a Tset, either eunder = Bottom, + or eunder = eover, and cardinal(eover) <= 1. This is due to the fact + that under-approximations are not propagated as an abstract domain, but + only created from Trange or inferred from exact over-approximations. *) type 'a eval_result = { etype: Cil_types.typ; - evalue: 'a list; + eunder: 'a; + eover: 'a; ldeps: logic_deps; } -let einteger v = { etype = Cil.intType; evalue = [v]; ldeps = empty_logic_deps} -let ereal v = { etype = Cil.doubleType; evalue = [v]; ldeps = empty_logic_deps} +(* When computing an under-approximation, we make the hypothesis that the state + is not Bottom. Hence, over-approximations of cardinal <= 1 are actually of + cardinal 1, and are thus exact. *) +let under_from_over eover = + if Cvalue.V.cardinal_zero_or_one eover + then eover + else Cvalue.V.bottom +;; + +let is_noop_cast ~src_typ ~dst_typ = + let src_typ = Logic_const.plain_or_set + (fun lt -> + match Logic_utils.unroll_type lt with + | Ctype typ -> Some (Cil.unrollType typ) + | _ -> None + ) (Logic_utils.unroll_type src_typ) + in + match src_typ, Cil.unrollType dst_typ with + | Some (TInt (srckind,_)), TInt(destkind,_) -> + Cil.intTypeIncluded srckind destkind + | Some (TFloat(srckind,_)), TFloat(destkind,_) -> + Cil.frank srckind <= Cil.frank destkind + | Some (TPtr _), TPtr _ -> true + | _ -> false + +(* Note: non-constant integers can happen e.g. for sizeof of structures of an unknown size. *) +let einteger v = + { etype = Cil.intType; + eunder = under_from_over v; + eover = v; + ldeps = empty_logic_deps} + +(* Note: some reals cannot be exactly represented as floats; in which + case we do not know their under-approximation. *) +let ereal v = + let eunder = under_from_over v in + { etype = Cil.doubleType; eunder; eover = v; ldeps = empty_logic_deps} let rec eval_term ~with_alarms env t = match t.term_node with @@ -360,18 +408,19 @@ | TConst (Integer (v, _)) -> einteger (Cvalue.V.inject_int v) | TConst (LEnum e) -> - (match (Cil.constFold true e.eival).enode with - | Const (CInt64 (v, _, _)) -> einteger (Cvalue.V.inject_int v) + (match Cil.constFoldToInt e.eival with + | Some v -> einteger (Cvalue.V.inject_int v) | _ -> ast_error "non-evaluable constant") - | TConst (LChr c) -> - let i = match Cil.charConstToInt c with - | CInt64 (i,_,_) -> i - | _ -> assert false - in - einteger (Cvalue.V.inject_int i) - | TConst (LReal { r_lower ; r_upper }) -> - let f = Ival.inject_float_interval r_lower r_upper in - ereal (Cvalue.V.inject_ival f) + | TConst (LChr c) -> einteger (Cvalue.V.inject_int (Cil.charConstToInt c)) + | TConst (LReal { r_lower ; r_upper }) -> begin + try + let r_lower = Ival.F.of_float r_lower in + let r_upper = Ival.F.of_float r_upper in + let inf, f = Ival.Float_abstract.inject_r r_lower r_upper in + if inf then c_alarm (); + ereal (Cvalue.V.inject_ival (Ival.inject_float f)) + with Ival.Float_abstract.Bottom -> c_alarm () + end (* | TConst ((CStr | CWstr) Missing cases *) @@ -379,41 +428,48 @@ let r = eval_thost_toffset ~with_alarms env thost toffs in { etype = TPtr (r.etype, []); ldeps = r.ldeps; - evalue = List.map loc_bits_to_loc_bytes r.evalue } + eunder = loc_bits_to_loc_bytes_under r.eunder; + eover = loc_bits_to_loc_bytes r.eover } | TStartOf (thost, toffs) -> let r = eval_thost_toffset ~with_alarms env thost toffs in { etype = TPtr (Cil.typeOf_array_elem r.etype, []); ldeps = r.ldeps; - evalue = List.map loc_bits_to_loc_bytes r.evalue } + eunder = loc_bits_to_loc_bytes_under r.eunder; + eover = loc_bits_to_loc_bytes r.eover } | TLval _ -> - let lvals = eval_tlval ~with_alarms env t in - let typ = lvals.etype in + let lval = eval_tlval ~with_alarms env t in + let typ = lval.etype in let size = Bit_utils.sizeof typ in - let eval_lval (l, deps) loc = - let state = env_current_state env in - let loc = make_loc loc size in - let v = - Cvalue.Model.find ~conflate_bottom:true ~with_alarms state loc - in - (* Skip dependencies if state is dead *) - let deps = - if Cvalue.Model.is_reachable state then - add_deps env.e_cur deps - (enumerate_valid_bits ~for_writing:false loc) - else deps - in - Eval_op.reinterpret ~with_alarms typ v :: l, deps + let state = env_current_state env in + let eover_loc = make_loc (lval.eover) size in + let eover = Eval_op.find ~with_alarms state eover_loc in + let eover = Eval_op.make_volatile ~typ eover in + let eover = Eval_op.reinterpret ~with_alarms typ eover in + (* Skip dependencies if state is dead *) + let deps = + if Cvalue.Model.is_reachable state then + add_deps env.e_cur empty_logic_deps + (enumerate_valid_bits ~for_writing:false eover_loc) + else empty_logic_deps in - let l, deps = List.fold_left eval_lval ([], lvals.ldeps) lvals.evalue in + + (* TODO: This is a rough evaluation of the + underapproximation. A better one can be obtained as + follows: whenever a memory case in the under-approximation + contains a singleton in [state] (which is an + overapproximation), it can be added to the resulting + [eunder]. This requires a new special "Eval_op.find" + operation. *) + let eunder = under_from_over eover in { etype = typ; - ldeps = deps; - evalue = l } + ldeps = join_logic_deps deps (lval.ldeps); + eunder; eover } (* TBinOp ((LOr | LAnd), _t1, _t2) -> TODO: a special case would be useful. But this requires reducing the state after having evaluated t1 by - a term that is in fact a predicate *) + a term that is in fact a predicate *) | TBinOp (op,t1,t2) -> eval_binop ~with_alarms env op t1 t2 | TUnOp (op, t) -> @@ -426,87 +482,74 @@ let eval v = Eval_op.eval_unop ~check_overflow:false ~with_alarms v r.etype op in + let eover = eval r.eover in { etype = typ'; ldeps = r.ldeps; - evalue = List.map eval r.evalue } - - | Trange (otlow, othigh) -> - (* Eval one bound. `SureInf corresponds to an ACSL 'omitted bound', - `MayInf to a value analysis approximation. There are subtle - differences between, that are not completely exploited for now. *) - let deps = ref empty_logic_deps in - let eval = function - | None -> `SureInf - | Some t -> - try - let r = eval_term ~with_alarms env t in - let v = match r.evalue with - | [e] -> e - | _ -> ast_error "found set in range bound" - in - if not (Cil.isIntegralType r.etype) - then ast_error "non-integer range bound"; - deps := join_logic_deps !deps r.ldeps; - try (match Ival.min_and_max (Cvalue.V.project_ival v) with - | None, _ | _, None -> `MayInf - | Some l, Some h -> `Finite (l, h) - ) - with Cvalue.V.Not_based_on_null -> `MayInf - with LogicEvalError e -> - if e <> CAlarm then - Value_parameters.result ~current:true ~once:true - "Cannot evaluate@ range bound %a@ (%a). Approximating" - Printer.pp_term t pretty_logic_evaluation_error e; - `MayInf - in - let range low high = - V.inject_ival (Ival.inject_range low high) in - let r = match eval otlow, eval othigh with - | `Finite (ilowlow, ilow), `Finite (ihigh, ihighhigh) -> - if Int.gt ilowlow ihighhigh then [] - else - if Int.equal ilowlow ihighhigh then - if Int.equal ilowlow ilow && Int.equal ihigh ihighhigh - then [V.inject_int ilow] - else (* complicated case. Due to the imprecisions, the range - might be empty, but the intersection is a single integer, - which is considered precise by all the other functions *) - c_alarm () (* TODO. (but what?) *) - else - let middle = (* Compute elements that are guaranteed to - be in the range, if possible one by one *) - if Int.ge ihigh ilow then - let plevel = Value_parameters.ArrayPrecisionLevel.get ()in - if Int.equal ilow ihigh then [V.inject_int ilow] - else - if Int.le (Int.sub ihigh ilow) (Int.of_int plevel) then - let rec enum i acc = - if Int.lt i ilow then acc - else enum (Int.sub i Int.one) (V.inject_int i ::acc) - in enum ihigh [] - else [range (Some ilow) (Some ihigh)] - else [] - in - if Int.equal ilowlow ilow && Int.equal ihigh ihighhigh - then middle - else range (Some ilowlow) (Some ihighhigh) :: middle - (* TODO: improve. Returning middle kills a lot of - possible reductions *) - (* If an 'exact' flag is added to the evaluation of the logic, the - code below must be rewritten as follows: - `MayInf, `Finite (_h, hh) -> [(None, hh, inexact)] - `SureInf, `Finite (h, hh) -> [(None, h, exact); (h, hh, inexact)]*) - | (`MayInf | `SureInf), `Finite (_ihigh, ihighhigh) -> - [range None (Some ihighhigh)] - | `Finite (ilowlow, _ilow), (`MayInf | `SureInf) -> - [range (Some ilowlow) None] - | (`MayInf | `SureInf), (`MayInf | `SureInf) -> [range None None] - in - (*Value_parameters.debug "Range %a: %a@." - d_term t (Pretty_utils.pp_list V.pretty) (List.map snd r);*) - { etype = Cil.intType; - ldeps = !deps; - evalue = r } + eover; eunder = under_from_over eover } + | Trange(otlow, othigh) -> + (* The overapproximation is the range [min(low.eover)..max(high.eover)]. + The underapproximation is the range [max(low.eover)..min(high.eover)]. + Perhaps surprisingly, we do not use the under-approximations of + otlow and othigh to compute the underapproximation. We could + potentially compute [min(max(low.over), min(low.under) .. + max(min(high.over), max(high.under)] + However, tsets cannot be used as bounds of ranges. By invariant (2), + eunder is either Bottom, or equal to eover, both being of cardinal + one. In both cases, using eover is more precise. *) + let deps = ref empty_logic_deps in + let min v = + try (match Ival.min_int (Cvalue.V.project_ival v) with + | None -> `Approx + | Some(x) -> `Finite(x)) + with Cvalue.V.Not_based_on_null -> `Approx + in + let max v = + try (match Ival.max_int (Cvalue.V.project_ival v) with + | None -> `Approx + | Some(x) -> `Finite(x)) + with Cvalue.V.Not_based_on_null -> `Approx + in + (* Evaluate a bound: + - [sure_bound_under] is returned for the under-approximation when the + bound is explicitly omitted in the ACSL term + - [min_max_*] is the function to retrieve the bound from the + over_approximation, for both the underapproximation and the + overapproximation. *) + let eval_bound sure_bound_under min_max_under min_max_over = function + | None -> sure_bound_under, `Approx + | Some(result) -> + try + let result = eval_term ~with_alarms env result in + deps := join_logic_deps !deps result.ldeps; + let under = min_max_under result.eover in + let over = min_max_over result.eover in + under, over + with LogicEvalError e -> + if e <> CAlarm then + Value_parameters.result ~current:true ~once:true + "Cannot evaluate@ range bound %a@ (%a). Approximating" + Printer.pp_term result pretty_logic_evaluation_error e; + `Approx, `Approx + in + let min_under, min_over = eval_bound `MinusInf max min otlow in + let max_under, max_over = eval_bound `PlusInf min max othigh in + let to_bound = function + | `Finite x -> Some x + | `PlusInf | `MinusInf | `Approx -> None + in + let eunder = match (min_under, max_under) with + | `Approx, _ | _, `Approx -> Cvalue.V.bottom + | (`MinusInf | `Finite _), (`PlusInf | `Finite _) -> + Cvalue.V.inject_ival + (Ival.inject_range (to_bound min_under) (to_bound max_under)) + in + let eover = + Cvalue.V.inject_ival + (Ival.inject_range (to_bound min_over) (to_bound max_over)) + in + { ldeps = !deps; + etype = Cil.intType; + eunder; eover } | TCastE (typ, t) -> let r = eval_term ~with_alarms env t in @@ -514,17 +557,27 @@ let msg fmt = Format.fprintf fmt "%a (%a)" Printer.pp_term t V.pretty v in + (* This is a bit tricky. do_promotion ignores the *size* of src_typ, + and is only interested in the distinction between float and + integer/pointers. Thus, we can use r.etype as its argument. *) Eval_op.do_promotion ~with_alarms real_mode ~src_typ:r.etype ~dst_typ:typ v msg in + let eover, eunder = + (* See if the cast does something. If not, we can keep eunder as is.*) + if is_noop_cast ~src_typ:t.term_type ~dst_typ:typ + then r.eover, r.eunder + else + let eover = conv r.eover in + eover, under_from_over eover + in { etype = typ; - ldeps = r.ldeps; - evalue = List.map conv r.evalue } + ldeps = r.ldeps; eunder; eover } | Tif (tcond, ttrue, tfalse) -> let r = eval_term ~with_alarms env tcond in - let ctrue = List.exists (Cvalue.V.contains_non_zero) r.evalue - and cfalse = List.exists (Cvalue.V.contains_zero) r.evalue in + let ctrue = Cvalue.V.contains_non_zero r.eover + and cfalse = Cvalue.V.contains_zero r.eover in (match ctrue, cfalse with | true, true -> let vtrue = eval_term ~with_alarms env ttrue in @@ -534,15 +587,11 @@ "Incoherent types in conditional '%a': %a vs. %a. \ Please report" Printer.pp_term t Printer.pp_typ vtrue.etype Printer.pp_typ vfalse.etype; - let lr = vtrue.evalue @ vfalse.evalue in - let r = - if Logic_const.is_plain_type t.term_type - then [List.fold_left V.join V.bottom lr] - else lr - in + let eover = V.join vtrue.eover vfalse.eover in + let eunder = V.meet vtrue.eunder vfalse.eunder in { etype = vtrue.etype; ldeps = join_logic_deps vtrue.ldeps vfalse.ldeps; - evalue = r } + eunder; eover } | true, false -> eval_term ~with_alarms env ttrue | false, true -> eval_term ~with_alarms env tfalse | false, false -> @@ -558,25 +607,29 @@ einteger v | Tunion l -> - let tres = infer_type t.term_type in - let l, deps = List.fold_left - (fun (accv, accdeps) t -> - let r = eval_term ~with_alarms env t in - r.evalue @ accv, join_logic_deps accdeps r.ldeps) - ([], empty_logic_deps) l + let eunder, eover, deps = List.fold_left + (fun (accunder, accover, accdeps) t -> + let r = eval_term ~with_alarms env t in + (Cvalue.V.link accunder r.eunder, + Cvalue.V.join accover r.eover, + join_logic_deps accdeps r.ldeps)) + (Cvalue.V.bottom, Cvalue.V.bottom, empty_logic_deps) l in - { etype = tres; - ldeps = deps; - evalue = l } + { etype = infer_type t.term_type; + ldeps = deps; eunder; eover } | Tempty_set -> - { etype = infer_type t.term_type; evalue = []; - ldeps = empty_logic_deps } + { etype = infer_type t.term_type; + ldeps = empty_logic_deps; + eunder = Cvalue.V.bottom; + eover = Cvalue.V.bottom } | Tnull -> { etype = Cil.voidPtrType; ldeps = empty_logic_deps; - evalue = [Cvalue.V.singleton_zero] } + eunder = Cvalue.V.singleton_zero; + eover = Cvalue.V.singleton_zero; + } | TLogic_coerce(typ, t) -> let r = eval_term ~with_alarms env t in @@ -594,7 +647,8 @@ in { etype = Cil.doubleType; ldeps = r.ldeps; - evalue = List.map conv r.evalue } + eunder = under_from_over r.eover; + eover = conv r.eover } else r (* already a floating-point number (hopefully) *) | Ltype ({lt_name = "set"}, [typ]) when Logic_utils.is_same_type typ t.term_type -> @@ -612,19 +666,21 @@ | Toffset (_lbl, t) -> let r = eval_term ~with_alarms env t in let add_offset _ offs acc = Ival.join offs acc in - let aux acc v = Location_Bytes.fold_topset_ok add_offset v acc in - let offs = List.fold_left aux Ival.bottom r.evalue in + let offs = Location_Bytes.fold_topset_ok add_offset r.eover Ival.bottom in + let eover = Cvalue.V.inject_ival offs in { etype = Cil.intType; ldeps = r.ldeps; - evalue = [Cvalue.V.inject_ival offs] } + eover; + eunder = under_from_over eover } | Tbase_addr (_lbl, t) -> let r = eval_term ~with_alarms env t in let add_base b acc = V.join acc (V.inject b Ival.zero) in - let aux acc v = Location_Bytes.fold_bases add_base v acc in + let eover = Location_Bytes.fold_bases add_base r.eover V.bottom in { etype = Cil.charPtrType; ldeps = r.ldeps; - evalue = [List.fold_left aux V.bottom r.evalue] } + eover; + eunder = under_from_over eover } | Tblock_length (_lbl, t) -> (* TODO: take label into account for locals *) let r = eval_term ~with_alarms env t in @@ -639,11 +695,12 @@ in Ival.join acc bl in - let aux acc v = Location_Bytes.fold_bases add_block_length v acc in - let bl = List.fold_left aux Ival.bottom r.evalue in + let bl = Location_Bytes.fold_bases add_block_length r.eover Ival.bottom in + let eover = V.inject_ival bl in { etype = Cil.charPtrType; ldeps = r.ldeps; - evalue = [V.inject_ival bl] } + eover; + eunder = under_from_over eover } | Tapp _ | Tlambda _ -> unsupported "logic functions or predicates" | TDataCons _ -> unsupported "logic inductive types" @@ -658,157 +715,171 @@ | TConst (LWStr _) -> unsupported "wide constant strings" and eval_binop ~with_alarms env op t1 t2 = - if isLogicNonCompositeType t1.term_type then + if not (isLogicNonCompositeType t1.term_type) then + unsupported (Pretty_utils.sfprintf + "%a operation on non-supported type %a" Printer.pp_binop op + Printer.pp_logic_type t1.term_type) + else let r1 = eval_term ~with_alarms env t1 in let r2 = eval_term ~with_alarms env t2 in let te1 = Cil.unrollType r1.etype in (* We use the type of t1 to determine whether we are performing an int or float operation.*) - let kop = match te1 with - | TInt _ | TPtr _ | TEnum _ -> - (* Do not pass ~typ here. We want the operations to be performed on - unbounded integers mode *) - Eval_op.eval_binop_int ~with_alarms ~te1 ?typ:None - | TFloat _ -> Eval_op.eval_binop_float ~with_alarms real_mode None + let int_or_float_op int_op float_op = + match te1 with + | TInt _ | TPtr _ | TEnum _ -> int_op + | TFloat _ -> float_op | _ -> ast_error (Pretty_utils.sfprintf "binop on incorrect type %a" Printer.pp_typ te1) in + let kop = int_or_float_op + (Eval_op.eval_binop_int ~with_alarms ~te1) + (Eval_op.eval_binop_float ~with_alarms real_mode None) + in let kop v1 v2 = kop v1 op v2 in let typ_res = infer_binop_res_type op te1 in - let l1 = r1.evalue and l2 = r2.evalue in - let r = match op, l1, l2 with - | (PlusA | PlusPI | IndexPI | MinusA | MinusPI), _, _ -> - List.fold_left (fun acc e1 -> - List.fold_left (fun acc e2 -> kop e1 e2 :: acc) acc l2) [] l1 - - (* Sets are compared by joining all their elements. This is correct, - although imprecise *) - | (Eq | Ne), _ , _ -> - (match l1, l2 with - | [], [] -> - [if op = Eq then V.singleton_one else V.singleton_zero] - | [], _ :: _ | _ :: _, [] -> - [if op = Eq then V.singleton_zero else V.singleton_one] - | h1 :: q1, h2 :: q2 -> - let e1 = List.fold_left V.join h1 q1 in - let e2 = List.fold_left V.join h2 q2 in - let r = kop e1 e2 in - let contains_zero = V.contains_zero r in - let contains_non_zero = V.contains_non_zero r in - [V.interp_boolean ~contains_zero ~contains_non_zero] - ) - | _, [e1], [e2] -> [kop e1 e2] - | _ -> ast_error "meaningless binop" + let eover = kop r1.eover r2.eover in + let default _r1 _r2 = under_from_over eover in + let add_untyped_op factor = + int_or_float_op (V.add_untyped_under factor) default + in + let eunder_op = match op with + | PlusPI | IndexPI -> begin + match Bit_utils.osizeof_pointed te1 with + | Int_Base.Top -> fun _ _ -> V.bottom + | Int_Base.Value _ as size -> add_untyped_op size + end + | PlusA -> add_untyped_op (Int_Base.one) + | MinusA -> add_untyped_op (Int_Base.minus_one) + | _ -> default in + let eunder = eunder_op r1.eunder r2.eunder in { etype = typ_res; ldeps = join_logic_deps r1.ldeps r2.ldeps; - evalue = r } - else - unsupported (Pretty_utils.sfprintf - "%a operation on non-supported type %a" Printer.pp_binop op - Printer.pp_logic_type t1.term_type) + eunder; eover } and eval_tlhost ~with_alarms env lv = match lv with | TVar { lv_origin = Some v } -> let loc = Location_Bits.inject (Base.of_varinfo v) Ival.zero in - { etype = v.vtype; - ldeps = empty_logic_deps; - evalue = [loc] } + { etype = v.vtype; + ldeps = empty_logic_deps; + eunder = loc; + eover = loc } | TResult typ -> (match env.result with | Some v -> let loc = Location_Bits.inject (Base.of_varinfo v) Ival.zero in { etype = typ; ldeps = empty_logic_deps; - evalue = [loc] } + eunder = loc; eover = loc } | None -> no_result ()) | TVar ({ lv_origin = None } as tlv) -> let b, ty = supported_logic_var tlv in let loc = Location_Bits.inject b Ival.zero in + let eunder = + if Location_Bits.cardinal_zero_or_one loc then loc + else Location_Bits.bottom + in { etype = ty; ldeps = empty_logic_deps; - evalue = [loc] } + eover = loc; eunder } | TMem t -> - let r = eval_term ~with_alarms env t in - let tres = match Cil.unrollType r.etype with - | TPtr (t, _) -> t - | _ -> ast_error "*p where p is not a pointer" - in - { etype = tres; - ldeps = r.ldeps; - evalue = List.map loc_bytes_to_loc_bits r.evalue } + let r = eval_term ~with_alarms env t in + let tres = match Cil.unrollType r.etype with + | TPtr (t, _) -> t + | _ -> ast_error "*p where p is not a pointer" + in + { etype = tres; + ldeps = r.ldeps; + eunder = loc_bytes_to_loc_bits r.eunder; + eover = loc_bytes_to_loc_bits r.eover } and eval_toffset ~with_alarms env typ toffset = match toffset with | TNoOffset -> { etype = typ; ldeps = empty_logic_deps; - evalue = [Ival.singleton_zero] } + eunder = Ival.singleton_zero; + eover = Ival.singleton_zero } | TIndex (idx, remaining) -> let typ_pointed = match Cil.unrollType typ with | TArray (t, _, _, _) -> t - | TPtr(t,_) -> - (match Cil.unrollType t with - | TArray (t, _,_,_) -> t - | _ -> ast_error "index on a non-array") | _ -> ast_error "index on a non-array" in let idxs = eval_term ~with_alarms env idx in let offsrem = eval_toffset ~with_alarms env typ_pointed remaining in - let aux idx = + let eover = let offset = - try Cvalue.V.project_ival idx + try Cvalue.V.project_ival_bottom idxs.eover with Cvalue.V.Not_based_on_null -> Ival.top in - let shift v = - let offset = Ival.scale_int_base (sizeof typ_pointed) offset in - Ival.add_int offset v + let offset = Ival.scale_int_base (sizeof typ_pointed) offset in + Ival.add_int offset offsrem.eover + in + let eunder = + let offset = + try Cvalue.V.project_ival idxs.eunder + with Cvalue.V.Not_based_on_null -> Ival.bottom in - List.map shift offsrem.evalue + let offset = match (sizeof typ_pointed) with + | Int_Base.Top -> Ival.bottom + (* Note: scale_int_base would overapproximate when given a + Float. Should never happen. *) + | Int_Base.Value f -> + (match offset with | Ival.Float _ -> assert false | _ -> ()); + Ival.scale f offset + in + Ival.add_int_under offset offsrem.eunder in { etype = offsrem.etype; ldeps = join_logic_deps idxs.ldeps offsrem.ldeps; - evalue = List.fold_left (fun r trm -> aux trm @ r) [] idxs.evalue; } + eunder; eover } | TField (fi, remaining) -> - let current = + let current default = try Ival.of_int (fst (Cil.bitsOffset typ (Field(fi, NoOffset)))) - with Cil.SizeOfError _ -> Ival.top + with Cil.SizeOfError _ -> default in let offsrem = eval_toffset ~with_alarms env fi.ftype remaining in { etype = offsrem.etype; ldeps = offsrem.ldeps; - evalue = List.map (Ival.add_int current) offsrem.evalue } + eover = Ival.add_int (current Ival.top) offsrem.eover; + eunder = Ival.add_int_under (current Ival.bottom) offsrem.eunder } + | TModel _ -> unsupported "model fields" and eval_thost_toffset ~with_alarms env thost toffs = let rhost = eval_tlhost ~with_alarms env thost in let roffset = eval_toffset ~with_alarms env rhost.etype toffs in - let shift l lochost = - let shift offs = Location_Bits.shift offs lochost in - List.map shift roffset.evalue @ l - in { etype = roffset.etype; ldeps = join_logic_deps rhost.ldeps roffset.ldeps; - evalue = List.fold_left shift [] rhost.evalue } + eunder = Location_Bits.shift_under roffset.eunder rhost.eunder; + eover = Location_Bits.shift roffset.eover rhost.eover; + } and eval_tlval ~with_alarms env t = match t.term_node with | TLval (thost, toffs) -> eval_thost_toffset ~with_alarms env thost toffs | Tunion l -> - let aux (lr, deps) t = - let r = eval_tlval ~with_alarms env t in - r.evalue :: lr, join_logic_deps deps r.ldeps + let eunder, eover, deps = List.fold_left + (fun (accunder, accover, accdeps) t -> + let r = eval_tlval ~with_alarms env t in + (Location_Bits.link accunder r.eunder, + Location_Bits.join accover r.eover, + join_logic_deps accdeps r.ldeps)) + (Location_Bits.top, Location_Bits.bottom, empty_logic_deps) l in - let l, deps = List.fold_left aux ([], empty_logic_deps) l in { etype = infer_type t.term_type; ldeps = deps; - evalue = List.concat l } + eover; eunder } | Tempty_set -> - { etype = infer_type t.term_type; evalue = []; ldeps = empty_logic_deps } + { etype = infer_type t.term_type; + ldeps = empty_logic_deps; + eunder = Location_Bits.bottom; + eover = Location_Bits.bottom } | Tat (t, lab) -> eval_tlval ~with_alarms { env with e_cur = lab } t | _ -> ast_error "non-lval term" @@ -816,32 +887,28 @@ let eval_tlval_as_location ~with_alarms env t = let r = eval_tlval ~with_alarms env t in let s = Bit_utils.sizeof r.etype in - let aux acc loc = - assert (is_bottom_loc acc || Int_Base.equal s acc.size); - make_loc (Location_Bits.join loc acc.loc) s - in - List.fold_left aux loc_bottom r.evalue + make_loc r.eover s -let eval_tlval_as_locations ~with_alarms env t = +let eval_tlval_as_location_with_deps ~with_alarms env t = let r = eval_tlval ~with_alarms env t in let s = Bit_utils.sizeof r.etype in - List.map (fun loc -> make_loc loc s) r.evalue, r.ldeps + (make_loc r.eover s, r.ldeps) -let eval_tlval_as_zone ~with_alarms ~for_writing env t = + +(* Return a pair of (under-approximating, over-approximating) zones. *) +let eval_tlval_as_zone_under_over ~with_alarms ~for_writing env t = let r = eval_tlval ~with_alarms env t in let s = Bit_utils.sizeof r.etype in - let aux acc loc = - let loc = make_loc loc s in - let z = enumerate_valid_bits ~for_writing loc in - Zone.join acc z - in - List.fold_left aux Zone.bottom r.evalue + let under = enumerate_valid_bits_under ~for_writing (make_loc r.eunder s) in + let over = enumerate_valid_bits ~for_writing (make_loc r.eover s) in + (under, over) +let eval_tlval_as_zone ~with_alarms ~for_writing env t = + snd (eval_tlval_as_zone_under_over ~with_alarms ~for_writing env t) (* If casting [trm] to [typ] has no effect in terms of the values contained in [trm], do nothing. Otherwise, raise [exn]. Adapted from [pass_cast] *) let pass_logic_cast exn typ trm = - (* TODOBY: add checks for volatile? *) match Logic_utils.unroll_type typ, Logic_utils.unroll_type trm.term_type with | Linteger, Ctype (TInt _ | TEnum _) -> () (* Always inclusion *) | Ctype (TInt _ | TEnum _ as typ), Ctype (TInt _ | TEnum _ as typeoftrm) -> @@ -873,16 +940,16 @@ let rec eval_term_as_exact_loc ~with_alarms env t = match t with | { term_node = TLval _ } -> - let locs = eval_tlval ~with_alarms env t in - let typ = locs.etype in - (match locs.evalue with - | [] | _ :: _ :: _ -> raise Not_an_exact_loc - | [loc] -> - let loc = Locations.make_loc loc (Bit_utils.sizeof typ) in - if not (cardinal_zero_or_one loc) - then raise Not_an_exact_loc; - typ, loc - ) + let loc = eval_tlval ~with_alarms env t in + let typ = loc.etype in + (* eval_term_as_exact_loc is only used for reducing values, and we must + NOT reduce volatile locations. *) + if Cil.typeHasQualifier "volatile" typ then raise Not_an_exact_loc; + let loc = Locations.make_loc loc.eover (Bit_utils.sizeof typ) in + if not (cardinal_zero_or_one loc) + then raise Not_an_exact_loc; + typ, loc + | { term_node = TLogic_coerce(_, t)} -> (* It is always ok to pass through a TLogic_coerce, as the destination type is always a supertype *) @@ -896,6 +963,7 @@ exception DoNotReduce +exception Reduce_to_bottom let is_same_term_coerce t1 t2 = match t1.term_node, t2.term_node with @@ -917,10 +985,10 @@ (* desugared form of a <= b <= c <= d *) | true, Pand ( - {content=Prel ((Rlt | Rgt | Rle | Rge | Req as op),_ta,tb) as p1}, {content=Pand ( - {content=Prel (op', tb',tc) as p2}, - {content=Prel (op'',tc',_td) as p3})}) + {content=Prel ((Rlt | Rgt | Rle | Rge | Req as op),_ta,tb) as p1}, + {content=Prel (op', tb',tc) as p2})}, + {content=Prel (op'',tc',_td) as p3}) when op = op' && op' = op'' && is_same_term_coerce tb tb' && @@ -977,19 +1045,11 @@ | _,Prel (op,t1,t2) -> begin try - let eval = match t1.term_type with - | t when Cil.isLogicRealOrFloatType t -> - Eval_op.reduce_rel_float - (Value_parameters.AllRoundingModes.get ()) - | t when Cil.isLogicIntegralType t -> Eval_op.reduce_rel_int - | Ctype ct when Cil.isPointerType ct -> Eval_op.reduce_rel_int - | _ -> raise DoNotReduce - in - reduce_by_relation eval env positive t1 op t2 + reduce_by_relation env positive t1 op t2 with | DoNotReduce -> env | LogicEvalError ee -> display_evaluation_error ee; env - | Eval_exprs.Reduce_to_bottom -> + | Reduce_to_bottom -> overwrite_current_state env Cvalue.Model.bottom (* if the exception was obtained without an alarm emitted, it is correct to return the bottom state *) @@ -1002,23 +1062,25 @@ | _,Pvalid_read (_label,tsets) -> reduce_by_valid env positive ~for_writing:false tsets - | _,Pinitialized (lbl_initialized,tsets) -> + | _,(Pinitialized (lbl_initialized,tsets) + | Pdangling (lbl_initialized,tsets)) -> begin try let rlocb = eval_term ~with_alarms env tsets in let size = Bit_utils.sizeof_pointed rlocb.etype in - let size = - try Int_Base.project size - with _ -> c_alarm () (* Not really an alarm, an imprecision *) - in let state = env_state env lbl_initialized in + let fred = match p_content with + | Pinitialized _ -> V_Or_Uninitialized.reduce_by_initializedness + | Pdangling _ -> V_Or_Uninitialized.reduce_by_danglingness + | _ -> assert false + in + let fred = Eval_op.reduce_by_initialized_defined (fred positive) in let state_reduced = - List.fold_left - (fun state loc -> - let loc_bits = loc_bytes_to_loc_bits loc in - Model.reduce_by_initialized_defined_loc - (Cvalue.V_Or_Uninitialized.change_initialized positive) - loc_bits size state - ) state rlocb.evalue + let loc_bits = loc_bytes_to_loc_bits rlocb.eunder in + let loc = make_loc loc_bits size in + (* TODO: This is sub-optimal because apply_on_all_locs will not + notice that the locations are contiguous, and may end up + performing too many operations, or do nothing altogether. *) + Eval_op.apply_on_all_locs fred loc state in overwrite_state env state_reduced lbl_initialized with @@ -1042,8 +1104,10 @@ let fkind = match (Cil.unrollType typ_loc) with | TFloat( fkind, _) -> fkind | _ -> assert false in - let v = Cvalue.Model.find ~conflate_bottom:true ~with_alarms state loc in - let v = Eval_op.reinterpret_float ~with_alarms:CilE.warn_none_mode fkind v in + let v = Eval_op.find ~with_alarms state loc in + let v = + Eval_op.reinterpret_float ~with_alarms:CilE.warn_none_mode fkind v + in let state' = Cvalue.Model.reduce_previous_binding state loc v in let env = overwrite_current_state env state' in env @@ -1071,20 +1135,20 @@ and reduce_by_valid env positive ~for_writing (tset: term) = let with_alarms = warn_raise_mode in - (* Auxiliary function that reduces \valid( *lvloc+offs), where lvloc is atomic + (* Auxiliary function that reduces \valid(lv+offs), where lv is atomic (no more tsets), and offs is a bits-expressed constant offset. [offs_typ] is supposed to be the type of the pointed location after [offs] - has been applied; it can be different from [typeOf_pointed lv_typ], for + has been applied; it can be different from [typeOf_pointed lv], for example if offset is a field access. *) - let aux (lv_typ, lvloc) env (offs_typ, offs) = + let aux lv env (offs_typ, offs) = try - if not (Location_Bits.is_relationable lvloc) || + if not (Location_Bits.is_relationable lv.eover) || not (Ival.cardinal_zero_or_one offs) then raise DoNotReduce; let state = env_current_state env in - let lvloc = make_loc lvloc (Bit_utils.sizeof lv_typ) in + let lvloc = make_loc lv.eover (Bit_utils.sizeof lv.etype) in (* [p] is the range that we attempt to reduce *) - let p_orig = Model.find ~with_alarms ~conflate_bottom:true state lvloc in + let p_orig = Eval_op.find ~with_alarms state lvloc in let pb = Locations.loc_bytes_to_loc_bits p_orig in let shifted_p = Location_Bits.shift offs pb in let lshifted_p = make_loc shifted_p (Bit_utils.sizeof offs_typ) in @@ -1098,7 +1162,7 @@ then env else (* Shift back *) - let shift = Ival.neg offs in + let shift = Ival.neg_int offs in let pb = Location_Bits.shift shift valid in let p = Locations.loc_bits_to_loc_bytes pb in (* Store the result *) @@ -1108,44 +1172,52 @@ | DoNotReduce | V.Not_based_on_null | Cil.SizeOfError _ -> env | LogicEvalError ee -> display_evaluation_error ee; env in + (** Auxiliary function to reduce by the under-approximation of an offset. + Since validities are contiguous, we simply reduce by the minimum and + maximum of the under-approximation. *) + let aux_min_max_offset f env off = + try + let env = match Ival.min_int off with + | None -> env + | Some min -> f env (Ival.inject_singleton min) + in + match Ival.max_int off with + | None -> env + | Some max -> f env (Ival.inject_singleton max) + with Ival.Error_Bottom -> env + in let rec do_one env t = match t.term_node with | Tunion l -> List.fold_left do_one env l | TLval _ -> - let aux typ env lval = + let aux typ loc env = try - let loc = make_loc lval (Bit_utils.sizeof typ) in - if cardinal_zero_or_one loc then - let state = - Eval_exprs.reduce_by_valid_loc ~positive ~for_writing - loc typ (env_current_state env) - in - overwrite_current_state env state - else env + let state = + Eval_op.reduce_by_valid_loc ~positive ~for_writing + loc typ (env_current_state env) + in + overwrite_current_state env state with LogicEvalError ee -> display_evaluation_error ee; env in (try let r = eval_tlval ~with_alarms env t in - List.fold_left (aux r.etype) env r.evalue + let loc = make_loc r.eunder (Bit_utils.sizeof r.etype) in + Eval_op.apply_on_all_locs (aux r.etype) loc env with LogicEvalError ee -> display_evaluation_error ee; env) | TAddrOf (TMem ({term_node = TLval _} as t), offs) -> (try let lt = eval_tlval ~with_alarms env t in let typ = lt.etype in - List.fold_left - (fun env lv -> - (* Compute the offsets, that depend on the type of the lval. - The computed list is exactly what [aux] requires *) - let roffs = - eval_toffset ~with_alarms env (Cil.typeOf_pointed typ) offs - in - List.fold_left - (fun env offs -> aux (typ, lv) env (roffs.etype, offs)) - env roffs.evalue - ) env lt.evalue + (* Compute the offsets, that depend on the type of the lval. + The computed list is exactly what [aux] requires *) + let roffs = + eval_toffset ~with_alarms env (Cil.typeOf_pointed typ) offs + in + let aux env offs = aux lt env (roffs.etype, offs) in + aux_min_max_offset aux env roffs.eunder with LogicEvalError ee -> display_evaluation_error ee; env) | TBinOp ((PlusPI | MinusPI) as op, ({term_node = TLval _} as tlv), i) -> @@ -1153,73 +1225,64 @@ let rtlv = eval_tlval ~with_alarms env tlv in let ri = eval_term ~with_alarms env i in (* Convert offsets to a simpler form if [op] is [MinusPI] *) - let li = - List.fold_left - (fun acc offs -> - try - let i = V.project_ival offs in - let i = if op = PlusPI then i else Ival.neg i in - (ri.etype, i) :: acc - with V.Not_based_on_null -> acc - ) [] ri.evalue - in + let li = + try V.project_ival ri.eunder + with V.Not_based_on_null -> raise Exit + in + let li = if op = PlusPI then li else Ival.neg_int li in let typ_p = Cil.typeOf_pointed rtlv.etype in let sbits = Int.of_int (Cil.bitsSizeOf typ_p) in - List.fold_left - (fun env elv -> - (* Compute the offsets expected by [aux], which are - [i * 8 * sizeof( *tlv)] *) - let li = List.map - (fun (_, offs) -> typ_p, Ival.scale sbits offs) li - in - List.fold_left (aux (typ_p, elv)) env li - ) env rtlv.evalue - with LogicEvalError ee -> display_evaluation_error ee; env) + (* Compute the offsets expected by [aux], which are [i * + 8 * sizeof( *tlv)] *) + let li = Ival.scale sbits li in + (* Now reduce [tlv] by values possible for [i] *) + let aux env offs = aux rtlv env (typ_p, offs) in + aux_min_max_offset aux env li + with + | LogicEvalError ee -> display_evaluation_error ee; env + | Exit -> env + ) | _ -> env in do_one env tset -and reduce_by_relation eval env positive t1 rel t2 = - let env = reduce_by_left_relation eval env positive t1 rel t2 in - let inv_binop = match rel with +and reduce_by_relation env positive t1 rel t2 = + let env = reduce_by_left_relation env positive t1 rel t2 in + let sym_rel = match rel with | Rgt -> Rlt | Rlt -> Rgt | Rle -> Rge | Rge -> Rle | Req -> Req | Rneq -> Rneq in - reduce_by_left_relation eval env positive t2 inv_binop t1 + reduce_by_left_relation env positive t2 sym_rel t1 -and reduce_by_left_relation eval env positive tl rel tr = +and reduce_by_left_relation env positive tl rel tr = let with_alarms = warn_raise_mode in try let debug = false in let state = env_current_state env in if debug then Format.printf "#Left term %a@." Printer.pp_term tl; let typ_loc, loc = eval_term_as_exact_loc ~with_alarms env tl in + let reduce = Eval_op.reduce_rel_from_type typ_loc in if debug then Format.printf "#Left term as lv loc %a, typ %a@." Locations.pretty loc Printer.pp_typ typ_loc; - let v = Cvalue.Model.find ~conflate_bottom:true ~with_alarms state loc in + let v = Eval_op.find ~with_alarms state loc in if debug then Format.printf "#Val left lval %a@." V.pretty v; let v = Eval_op.reinterpret ~with_alarms typ_loc v in if debug then Format.printf "#Cast left lval %a@." V.pretty v; let rtl = eval_term ~with_alarms env tr in - let cond_v = - List.fold_left Location_Bytes.join Location_Bytes.bottom rtl.evalue - in + let cond_v = rtl.eover in if debug then Format.printf "#Val right term %a@." V.pretty cond_v; let op = lop_to_cop rel in - let v_sym = - eval.Eval_op.reduce_rel_symmetric positive op cond_v v in - let v_asym = - eval.Eval_op.reduce_rel_antisymmetric ~typ_loc positive op cond_v v_sym in - if debug then Format.printf "#Val reduced %a@." V.pretty v_asym; + let v' = reduce positive op cond_v v in + if debug then Format.printf "#Val reduced %a@." V.pretty v'; (* TODOBY: if loc is an int that has been silently cast to real, we end up reducing an int according to a float. Instead, we should convert v to real, then cast back v_asym to the good range *) - if V.is_bottom v_asym then raise Eval_exprs.Reduce_to_bottom; - if V.equal v_asym v then + if V.is_bottom v' then raise Reduce_to_bottom; + if V.equal v' v then env else let state' = - Cvalue.Model.reduce_previous_binding state loc v_asym + Cvalue.Model.reduce_previous_binding state loc v' in overwrite_current_state env state' with @@ -1285,44 +1348,53 @@ let for_writing = (match p.content with Pvalid_read _ -> false | _ -> true) in let state = env_current_state env in - let size = match Logic_utils.unroll_type tsets.term_type with + let typ_pointed = match Logic_utils.unroll_type tsets.term_type with | Ctype (TPtr _ | TArray _ as t) - | Ltype ({lt_name = "set"},[Ctype t]) -> sizeof_pointed t + | Ltype ({lt_name = "set"},[Ctype t]) -> Cil.typeOf_pointed t | _ -> ast_error "valid on incorrect location %a" in + (* Check if we are trying to write in a const l-value *) + if for_writing && Value_util.is_const_write_invalid typ_pointed then + raise Stop; + let size = Bit_utils.sizeof typ_pointed in (* Check that the given location is valid *) - let valid locbytes = - let loc = loc_bytes_to_loc_bits locbytes in + let valid ~over:locbytes_over ~under:locbytes_under = + let loc = loc_bytes_to_loc_bits locbytes_over in let loc = Locations.make_loc loc size in if not (Locations.is_valid ~for_writing loc) then ( - (* Maybe the location is guaranteed to be invalid? *) + (* \valid does not hold if the over-approximation is invalid + everywhere, or if a part of the under-approximation is invalid + *) let valid = valid_part ~for_writing loc in - if Locations.is_bottom_loc valid - then raise Stop - else raise DoNotReduce) + if Locations.is_bottom_loc valid then raise Stop; + let loc_under = loc_bytes_to_loc_bits locbytes_under in + let loc_under = Locations.make_loc loc_under size in + let valid_loc_under = + Locations.valid_part ~for_writing loc_under + in + if not (Location.equal loc_under valid_loc_under) then + raise Stop; + raise DoNotReduce (* In any case *)) in (match tsets.term_node with | TLval _ -> (* Evaluate the left-value, and check that it is initialized and not an escaping pointer *) - List.iter - (fun loc -> - let v = Model.find_unspecified ~with_alarms - ~conflate_bottom:true state loc - in - let v, ok = match v with - | Cvalue.V_Or_Uninitialized.C_uninit_esc v - | Cvalue.V_Or_Uninitialized.C_uninit_noesc v - | Cvalue.V_Or_Uninitialized.C_init_esc v -> v, false - | Cvalue.V_Or_Uninitialized.C_init_noesc v -> v, true - in - if Cvalue.V.is_bottom v && not ok then raise Stop; - valid v; - if not ok then raise DoNotReduce - ) - (fst (eval_tlval_as_locations ~with_alarms env tsets)) + let loc = eval_tlval_as_location ~with_alarms env tsets in + let alarm, v = Model.find_unspecified state loc in + if alarm then c_alarm (); + let v, ok = match v with + | Cvalue.V_Or_Uninitialized.C_uninit_esc v + | Cvalue.V_Or_Uninitialized.C_uninit_noesc v + | Cvalue.V_Or_Uninitialized.C_init_esc v -> v, false + | Cvalue.V_Or_Uninitialized.C_init_noesc v -> v, true + in + if Cvalue.V.is_bottom v && not ok then raise Stop; + valid ~over:v ~under:V.bottom (*No precise under-approxition*); + if not ok then raise DoNotReduce | _ -> - List.iter valid (eval_term ~with_alarms env tsets).evalue + let v = eval_term ~with_alarms env tsets in + valid ~over:v.eover ~under:v.eunder ); True with @@ -1331,29 +1403,36 @@ | Stop -> False end - | Pinitialized (label,tsets) -> begin + | Pinitialized (label,tsets) | Pdangling (label,tsets) -> begin try let locb = eval_term ~with_alarms env tsets in let state = env_state env label in let typ = locb.etype in if not (Cil.isPointerType typ) then - ast_error "initialized on incorrect location"; - let statuses = List.map - (fun loc -> - let locbi = loc_bytes_to_loc_bits loc in - let loc = make_loc locbi (sizeof_pointed typ) in - let value = Model.find_unspecified ~with_alarms - ~conflate_bottom:true state loc - in - match value with - | V_Or_Uninitialized.C_uninit_esc v - | V_Or_Uninitialized.C_uninit_noesc v -> - if Location_Bytes.is_bottom v then False else Unknown - | V_Or_Uninitialized.C_init_esc _ - | V_Or_Uninitialized.C_init_noesc _ -> True - ) locb.evalue - in - join_list_predicate_status statuses + ast_error "\\initialized or \\dangling on \ + incorrect location"; + let locbi = loc_bytes_to_loc_bits locb.eover in + let loc = make_loc locbi (sizeof_pointed typ) in + let alarm, value = Model.find_unspecified state loc in + if alarm then c_alarm (); + match p.content with + | Pinitialized _ -> begin + match value with + | V_Or_Uninitialized.C_uninit_esc _ -> Unknown + | V_Or_Uninitialized.C_uninit_noesc v -> + if Location_Bytes.is_bottom v then False else Unknown + | V_Or_Uninitialized.C_init_esc _ + | V_Or_Uninitialized.C_init_noesc _ -> True + end + | Pdangling _ -> begin + match value with + | V_Or_Uninitialized.C_init_esc v -> + if Location_Bytes.is_bottom v then True else Unknown + | V_Or_Uninitialized.C_uninit_esc _ -> Unknown + | V_Or_Uninitialized.C_init_noesc _ + | V_Or_Uninitialized.C_uninit_noesc _ -> False + end + | _ -> assert false with | Eval_exprs.Cannot_find_lv -> Unknown | LogicEvalError ee -> display_evaluation_error ee; Unknown @@ -1361,14 +1440,11 @@ | Prel (op,t1,t2) -> begin try let r = eval_binop ~with_alarms env (lop_to_cop op) t1 t2 in -(* if lop_to_cop op = Eq then - Format.printf "## Logic deps for %a: @[%a@]@." - Printer.pp_predicate_named p Zone.pretty r.ldeps; *) - if List.for_all (V.equal V.singleton_zero) r.evalue - then False - else if List.for_all (V.equal V.singleton_one) r.evalue - then True - else Unknown + if V.equal V.singleton_zero r.eover + then False + else if V.equal V.singleton_one r.eover + then True + else Unknown with | LogicEvalError ee -> display_evaluation_error ee; Unknown end @@ -1397,37 +1473,33 @@ | Pseparated ltsets -> (try - let to_locs tset = + let to_zones tset = let rtset = eval_term ~with_alarms env tset in let typ = rtset.etype in if not (Cil.isPointerType typ) then ast_error "separated on non-pointers"; let size = sizeof_pointed typ in - List.map - (fun loc -> - let loc = loc_bytes_to_loc_bits loc in - Locations.make_loc loc size - ) rtset.evalue + let loc_over = loc_bytes_to_loc_bits rtset.eover in + let loc_under = loc_bytes_to_loc_bits rtset.eunder in + Locations.enumerate_bits (Locations.make_loc loc_over size), + Locations.enumerate_bits_under (Locations.make_loc loc_under size) in - let locs = List.map to_locs ltsets in - let to_zone = Locations.enumerate_bits in - let lz = List.map (List.map (fun l -> l, to_zone l)) locs in + let lz = List.map to_zones ltsets in let unknown = ref false in (* Are those two lists of locations separated? *) - let do_two l1 l2 = - let combine (loc1, z1) (loc2, z2) = - if Zone.intersects z1 z2 then - if Locations.cardinal_zero_or_one loc1 && - Locations.cardinal_zero_or_one loc2 - then raise Exit - else unknown := true + let do_two (z1, zu1) l2 = + let combine (z2, zu2) = + if Zone.intersects z1 z2 then begin + unknown := true; + if Zone.intersects zu1 zu2 then raise Exit; + end in - List.iter (fun e1 -> List.iter (combine e1) l2) l1 + List.iter combine l2 in let rec aux = function | [] | [_] -> () - | locs :: qlocs -> - List.iter (do_two locs) qlocs; + | loc :: qlocs -> + do_two loc qlocs; aux qlocs in aux lz; @@ -1447,17 +1519,12 @@ let arg = (match args with [x] -> x | _ -> assert false (* caught by typechecking. *)) in (try let eval_result = eval_term ~with_alarms env arg in - let statuses = List.map - (fun cvalue -> - try - let ival = V.project_ival cvalue in - try - let _ = Ival.project_float ival in True - with Ival.Float_abstract.Nan_or_infinite -> Unknown - with Cvalue.V.Not_based_on_null -> Unknown - ) eval_result.evalue - in - join_list_predicate_status statuses + (try + let ival = V.project_ival eval_result.eover in + try + let _ = Ival.project_float ival in True + with Ival.Float_abstract.Nan_or_infinite -> Unknown + with Cvalue.V.Not_based_on_null -> Unknown) with LogicEvalError ee -> display_evaluation_error ee; Unknown) | Papp _ @@ -1494,15 +1561,11 @@ | Pvalid_read (_, tsets) -> (eval_tlval ~with_alarms env tsets).ldeps - | Pinitialized (lbl, tsets) -> - let loc, deploc = eval_tlval_as_locations ~with_alarms env tsets in - let zones = - List.fold_left - (fun z loc -> - Zone.join (enumerate_valid_bits ~for_writing:false loc) z) - Zone.bottom loc - in - Logic_label.Map.add lbl zones deploc + | Pinitialized (lbl, tsets) | Pdangling (lbl, tsets) -> + let loc, deploc = + eval_tlval_as_location_with_deps ~with_alarms env tsets in + let zone = enumerate_valid_bits ~for_writing:false loc in + Logic_label.Map.add lbl zone deploc | Pnot p -> do_eval env p @@ -1578,13 +1641,14 @@ with LogicEvalError _ -> raise (Invalid_argument "not an lvalue") ); (* TODO: specify better evaluation environment *) - Db.Properties.Interp.loc_to_locs := + Db.Properties.Interp.loc_to_loc_under_over := (fun ~result state t -> let env = env_post_f ~pre:state ~post:state ~result () in let with_alarms = CilE.warn_none_mode in try - let r, deps = eval_tlval_as_locations ~with_alarms env t in - r, deps_at lbl_here deps + let r= eval_tlval ~with_alarms env t in + let s = Bit_utils.sizeof r.etype in + make_loc r.eunder s, make_loc r.eover s, deps_at lbl_here r.ldeps with LogicEvalError _ -> raise (Invalid_argument "not an lvalue") ); diff -Nru frama-c-20140301+neon+dfsg/src/value/eval_terms.mli frama-c-20150201+sodium+dfsg/src/value/eval_terms.mli --- frama-c-20140301+neon+dfsg/src/value/eval_terms.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/eval_terms.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -55,21 +55,32 @@ the environment to evaluate an annotation *) type eval_env val env_pre_f : - ?c_labels:labels_states -> init:Model.t -> unit -> eval_env + ?c_labels:labels_states -> pre:Model.t -> unit -> eval_env val env_annot : ?c_labels:labels_states -> pre:Model.t -> here:Model.t -> unit -> eval_env val env_post_f : ?c_labels:labels_states -> pre:Model.t -> post:Model.t -> result:varinfo option -> unit -> eval_env -val env_assigns: init:Model.t -> eval_env -val env_here: Model.t -> eval_env +val env_assigns: pre:Model.t -> eval_env + +(** Used by auxiliary plugins, that do not supply the other states *) +val env_only_here: Model.t -> eval_env (** Dependencies needed to evaluate a term or a predicate *) type logic_deps = Zone.t Cil_datatype.Logic_label.Map.t + + +(** Return a pair of (under-approximating, over-approximating) zones. *) +val eval_tlval_as_zone_under_over: + with_alarms:CilE.warn_mode -> + for_writing:bool -> eval_env -> term -> Zone.t * Zone.t + +(* ML: Should not be exported. *) type 'a eval_result = { etype: Cil_types.typ; - evalue: 'a list; + eunder: 'a; + eover: 'a; ldeps: logic_deps; } @@ -85,10 +96,6 @@ with_alarms:CilE.warn_mode -> eval_env -> term -> location -val eval_tlval_as_locations : - with_alarms:CilE.warn_mode -> - eval_env -> term -> location list * logic_deps - val eval_tlval_as_zone : with_alarms:CilE.warn_mode -> for_writing:bool -> eval_env -> term -> Zone.t diff -Nru frama-c-20140301+neon+dfsg/src/value/function_args.ml frama-c-20150201+sodium+dfsg/src/value/function_args.ml --- frama-c-20140301+neon+dfsg/src/value/function_args.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/function_args.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -21,8 +21,6 @@ (**************************************************************************) open Cil_types -open Abstract_interp -open Locations exception Actual_is_bottom exception WrongFunctionType (* at a call through a pointer *) @@ -43,23 +41,32 @@ | [],_ -> raise WrongFunctionType (* Too few arguments *) | (x1::r1),(x2::r2) -> fold_left2_best_effort f (f acc x1 x2) r1 r2 -let actualize_formals ?(check = fun _ _ -> ()) ?(exact = fun _ -> true) kf state actuals = +let actualize_formals ?(check = fun _ _ -> ()) kf state actuals = let formals = Kernel_function.get_formals kf in let treat_one_formal acc (expr, actual_o) formal = (check expr formal: unit); - let loc_without_size = - Location_Bits.inject (Base.of_varinfo formal) (Ival.zero) - in - Cvalue.Model.paste_offsetmap ~with_alarms:CilE.warn_none_mode - ~from:actual_o - ~dst_loc:loc_without_size - ~start:Int.zero - ~size:(Int_Base.project (Bit_utils.sizeof_vid formal)) - ~exact:(exact formal) - acc + Cvalue.Model.add_base (Base.of_varinfo formal) actual_o acc in fold_left2_best_effort treat_one_formal state actuals formals +(** For all formals of [kf] whose address is taken, merge their values + in [prev_state] and [new_state], and update [new_state]. This is + useful to handle recursive calls. *) +let merge_referenced_formals kf prev_state new_state = + let formals = Kernel_function.get_formals kf in + let aux state vi = + if vi.vaddrof then + let b = Base.of_varinfo vi in + let prev_offsm = Cvalue.Model.find_base b prev_state in + let new_offsm = Cvalue.Model.find_base b new_state in + match Cvalue.V_Offsetmap.join_top_bottom prev_offsm new_offsm with + | `Top -> assert false + | `Bottom -> Cvalue.Model.bottom + | `Map m -> Cvalue.Model.add_base b m state + else state + in + List.fold_left aux new_state formals + let main_initial_state_with_formals kf (state:Cvalue.Model.t) = match kf.fundec with | Declaration (_, _, None, _) -> state @@ -78,54 +85,50 @@ let compute_actual ~with_alarms ~warn_indeterminate state e = - let offsm = match e with + let warn kind = + if with_alarms.CilE.imprecision_tracing.CilE.a_log != None then + Value_parameters.result ~current:true ~once:true + "completely invalid@ %s in evaluation of@ argument %a" + kind Printer.pp_exp e; + raise Actual_is_bottom + in + match e with | { enode = Lval lv } when not (Eval_op.is_bitfield (Cil.typeOfLval lv)) -> - let ploc, _, o = Eval_exprs.offsetmap_of_lv ~with_alarms state lv in - (match o with - | Some o -> - let warn () = - if with_alarms.CilE.imprecision_tracing.CilE.a_log != None then - Value_parameters.result ~current:true ~once:true - "completely invalid@ value in evaluation of@ argument %a" - Printer.pp_lval lv; - raise Actual_is_bottom - in + let ploc, state, o = + try Eval_exprs.offsetmap_of_lv ~with_alarms state lv + with Int_Base.Error_Top -> + Value_parameters.abort ~current:true "Function argument %a has \ + unknown size. Aborting" Printer.pp_exp e; + in begin + match o with + | `Map o -> let typ_lv = Cil.typeOfLval lv in - let o = - if warn_indeterminate - then Warn.warn_indeterminate_offsetmap ~with_alarms typ_lv o - else Some o + let o, state = + if warn_indeterminate then + match Warn.warn_reduce_indeterminate_offsetmap + ~with_alarms typ_lv o (`PreciseLoc ploc) state + with + | `Bottom -> warn "value" + | `Res r -> r + else o, state in - begin match o with - | None -> warn () - | Some o -> - (match Warn.offsetmap_contains_imprecision o with - | Some v -> - let loc = Precise_locs.imprecise_location ploc in - Warn.warn_imprecise_lval_read ~with_alarms lv loc v - | None -> ()); - o - end - | None -> - if with_alarms.CilE.imprecision_tracing.CilE.a_log != None then - Value_parameters.result ~current:true ~once:true - "completely invalid@ location in evaluation of@ argument %a" - Printer.pp_lval lv; - raise Actual_is_bottom) + begin match Warn.offsetmap_contains_imprecision o with + | Some v -> + let loc = Precise_locs.imprecise_location ploc in + Warn.warn_imprecise_lval_read ~with_alarms lv loc v + | None -> () + end; + o, state + | `Bottom -> warn "location" + | `Top -> Warn.warn_top () + end | _ -> - let interpreted_expr = Eval_exprs.eval_expr ~with_alarms state e in - if Cvalue.V.is_bottom interpreted_expr - then begin - if with_alarms.CilE.imprecision_tracing.CilE.a_log != None then - Value_parameters.result ~current:true - "all evaluations are invalid@ for function call argument@ @[%a@]" - Printer.pp_exp e; - raise Actual_is_bottom - end; - let typ = Cil.typeOf e in - Eval_op.offsetmap_of_v ~typ interpreted_expr - in - e, offsm + let state, _, interpreted_expr = + Eval_exprs.eval_expr_with_deps_state ~with_alarms None state e + in + if Cvalue.V.is_bottom interpreted_expr then warn "value"; + let typ = Cil.typeOf e in + Eval_op.offsetmap_of_v ~typ interpreted_expr, state let () = Db.Value.add_formals_to_state := @@ -134,7 +137,9 @@ let compute_actual = compute_actual ~with_alarms:CilE.warn_none_mode ~warn_indeterminate:false in - let actuals = List.map (compute_actual state) exps in + let actuals = + List.map (fun e -> e, fst (compute_actual state e)) exps + in actualize_formals kf state actuals with Actual_is_bottom -> Cvalue.Model.bottom) diff -Nru frama-c-20140301+neon+dfsg/src/value/initial_state.ml frama-c-20150201+sodium+dfsg/src/value/initial_state.ml --- frama-c-20140301+neon+dfsg/src/value/initial_state.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/initial_state.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -28,10 +28,13 @@ open Locations open Value_util -exception Initialization_failed +let dkey = Value_parameters.register_category "initial_state" -let typeHasAttribute attr typ = Cil.hasAttribute attr (Cil.typeAttrs typ) +exception Initialization_failed +(** Those functions intentionally ignore 'const' attributes. Functions of + Eval_op should not be used in this module, unless they have a 'reducing' + argument. *) let add_initialized state loc v = Cvalue.Model.add_initial_binding state loc (V_Or_Uninitialized.initialized v) let add_unitialized state loc = @@ -74,10 +77,7 @@ maybe invalid on the remainder of its validity *) let create_hidden_base ~valid ~hidden_var_name ~name_desc pointed_typ = - let hidden_var = - Cil.makeGlobalVar ~generated:false ~logic:true hidden_var_name pointed_typ - in - Library_functions.register_new_var hidden_var pointed_typ; + let hidden_var = Value_util.create_new_var hidden_var_name pointed_typ in hidden_var.vdescr <- Some name_desc; let validity = match valid with @@ -92,41 +92,71 @@ match validity with | Base.Known (a,b) when not (Value_parameters.AllocatedContextValid.get ()) -> + (* Weaken validity, because the created variables are not supposed + to be valid *) (match valid with - | KnownThenUnknownValidity size -> + | KnownThenUnknownValidity size -> (*except here, for size bits*) let size = Integer.pred size in assert (Integer.le size b); Base.Unknown (a, Some size, b) | _ -> Base.Unknown (a, None, b) ) - | Base.Unknown _ | Base.Known _ | Base.Invalid as s -> s - | Base.Periodic _ -> assert false + | Base.Unknown _ -> (* Unknown validity is caused by strange type *) + Value_parameters.result ~dkey "creating variable %s with imprecise \ + size (type %a)" hidden_var_name Printer.pp_typ pointed_typ; + validity + | Base.Known _ | Base.Invalid -> validity in Base.register_memory_var hidden_var validity +(* Alternative version of the code in {!Locations}, but we catch 0 size + explicitly and raise an error. *) +let loc_of_typoffset b typ offset = + try + let offs, size = Cil.bitsOffset typ offset in + if size = 0 then + Value_parameters.abort ~current:true + "@[Zero-sized@ location %a%a@ (type '%a').@ Aborting@]" + Base.pretty b Printer.pp_offset + offset Printer.pp_typ (Cil.typeOffset typ offset); + let size = Int_Base.inject (Int.of_int size) in + Locations.make_loc (Location_Bits.inject b (Ival.of_int offs)) size + with Cil.SizeOfError _ as _e -> + Locations.make_loc (Location_Bits.inject b Ival.top) Int_Base.top + +let reject_empty_struct b offset typ = + match Cil.unrollType typ with + | TComp (ci, _, _) -> + if ci.cfields = [] && ci.cdefined then + Value_parameters.abort ~current:true + "@[empty %s@ are unsupported@ (type '%a',@ location %a%a).@ Aborting@]" + (if ci.cstruct then "struct" else "union") + Printer.pp_typ typ Base.pretty b Printer.pp_offset offset + | _ -> () + + (** [initialize_var_using_type varinfo state] uses the type of [varinfo] to create an initial value in [state]. *) let initialize_var_using_type varinfo state = let with_alarms = CilE.warn_none_mode in Cil.CurrentLoc.set varinfo.vdecl; - let rec add_offsetmap depth v name_desc name typ offset_orig typ_orig state = + let rec add_offsetmap depth b name_desc name typ offset_orig typ_orig state = let typ = Cil.unrollType typ in - let loc = loc_of_typoffset v typ_orig offset_orig in + let loc = lazy (loc_of_typoffset b typ_orig offset_orig) in let bind_entire_loc ?(state=state) v = (* Shortcut *) - add_initialized state loc v + add_initialized state (Lazy.force loc) v in match typ with | TInt _ | TEnum (_, _)-> bind_entire_loc Cvalue.V.top_int - | TFloat ((FDouble | FLongDouble as fkind), _) -> - if fkind = FLongDouble - then - Value_parameters.warning ~once:true - "Warning: unsupported long double treated as double"; - bind_entire_loc Cvalue.V.top_float - | TFloat (FFloat, _) -> + | TFloat (fkind, _) -> begin + match Value_util.float_kind fkind with + | Ival.Float_abstract.Float32 -> bind_entire_loc Cvalue.V.top_single_precision_float + | Ival.Float_abstract.Float64 -> + bind_entire_loc Cvalue.V.top_float + end | TFun _ -> state @@ -144,7 +174,7 @@ in let arr_pointed_typ = TArray(typ, - Some (Cil.kinteger64 ~loc:varinfo.vdecl IULong i), + Some (Cil.kinteger64 ~loc:varinfo.vdecl i), Cil.empty_size_cache (), []) in @@ -190,7 +220,7 @@ let hidden_base = create_hidden_base ~valid ~hidden_var_name ~name_desc typ in - make_well ~filled hidden_base state loc + make_well ~filled hidden_base state (Lazy.force loc) | TArray (typ, len, _, _) -> begin try @@ -214,46 +244,32 @@ let name = string_of_int i ^ "_" ^ name in let name_desc = name_desc ^ "[" ^ string_of_int i ^ "]" in state := - add_offsetmap depth v name_desc name typ offset typ_orig !state; - let loc = loc_of_typoffset v typ_orig offset in - if Locations.loc_size loc = Int_Base.Top - then begin - Value_parameters.warning "During initialization of variable %a (of type %a), an array of type %a of unknown size was encountered. It's impossible to represent this array without knowning the size of %a. Bailing out" - Base.pretty v - Printer.pp_typ typ_orig - Printer.pp_typ typ - Printer.pp_typ typ; - raise Initialization_failed; - end; + add_offsetmap depth b name_desc name typ offset typ_orig !state; + let loc = loc_of_typoffset b typ_orig offset in locs := loc :: !locs; done; if max_precise_size < size then begin (* Some elements remain to be initialized *) let offsm_of_loc loc = (* This rereads one of the first cells*) - Extlib.the - (Cvalue.Model.copy_offsetmap ~with_alarms loc !state) + let _alarm, offsm = + Cvalue.Model.copy_offsetmap loc size_elt !state + in + match offsm with `Bottom | `Top -> assert false | `Map m -> m in let last_loc, locs = match !locs with | [] -> assert false (* AutomaticContextMaxWidth is at least 1*) | l :: ll -> l, ll in - let last_offsm = offsm_of_loc last_loc in + let last_offsm = offsm_of_loc last_loc.loc in (* Join of the contents of the first elements *) - let offsm_joined = - List.fold_left - (fun offsm loc -> - let offsm' = offsm_of_loc loc in - Cvalue.V_Offsetmap.join offsm offsm') - last_offsm - locs + let aux_loc offsm loc = + Cvalue.V_Offsetmap.join offsm (offsm_of_loc loc.loc) in + let offsm_joined = List.fold_left aux_loc last_offsm locs in (* TODO: add Offsetmap.paste_repeated_slices to Offsetmap, and replace everything below by a call to it. *) let nb_fields = - Cvalue.V_Offsetmap.fold - (fun _itv _ -> succ) - offsm_joined - 0 + Cvalue.V_Offsetmap.fold (fun _itv _ -> succ) offsm_joined 0 in if nb_fields = 1 then (* offsm_joined is very regular (typically Top_int, or some @@ -275,10 +291,9 @@ (* paste [size - max_precise_size] elements, starting from the last location initialized + 1 *) state := - Cvalue.Model.paste_offsetmap ~with_alarms + Eval_op.paste_offsetmap ~reducing:true ~with_alarms ~from:offsm_repeat ~dst_loc:loc - ~start:Int.zero ~size:total_size ~exact:true !state @@ -294,10 +309,9 @@ loc := Location_Bits.shift (Ival.inject_singleton size_elt) !loc; state := - Cvalue.Model.paste_offsetmap ~with_alarms + Eval_op.paste_offsetmap ~reducing:true ~with_alarms ~from:offsm_joined ~dst_loc:!loc - ~start:Int.zero ~size:size_elt ~exact:true !state @@ -307,14 +321,18 @@ with | Cil.LenOfArray -> Value_parameters.result ~once:true ~current:true - "could not find a size for array"; - state (* TODOBY: use same strategy as for pointer *) + "no size specified for array, assuming 0"; + (* This is either a flexible array member (for which Cil + implicitely returns a size of 0, so we are doing the proper + thing), or an incomplete array (which is forbidden) *) + state | Cil.SizeOfError (s, t) -> warn_unknown_size varinfo (s, t); bind_entire_loc Cvalue.V.top_int; end | TComp ({cstruct=true;} as compinfo, _, _) -> (* Struct *) + reject_empty_struct b offset_orig typ; let treat_field (next_offset,state) field = let new_offset = Field (field, NoOffset) in let offset = Cil.addOffset new_offset offset_orig in @@ -322,7 +340,7 @@ let state = if field_offset>next_offset then (* padding bits need filling*) let loc = make_loc - (Location_Bits.inject v (Ival.of_int next_offset)) + (Location_Bits.inject b (Ival.of_int next_offset)) (Int_Base.inject (Int.of_int (field_offset-next_offset))) in add_unitialized state loc @@ -331,7 +349,7 @@ field_offset+field_width, add_offsetmap depth - v + b (name_desc ^ "." ^ field.fname) (field.fname^"_"^name) field.ftype @@ -348,7 +366,7 @@ in if last_offset<(boff+bwidth) then (* padding at end of struct*) let loc = make_loc - (Location_Bits.inject v (Ival.of_int last_offset)) + (Location_Bits.inject b (Ival.of_int last_offset)) (Int_Base.inject (Int.of_int (boff+bwidth-last_offset))) in add_unitialized state loc @@ -359,6 +377,7 @@ end | TComp ({cstruct=false}, _, _) when Cil.is_fully_arithmetic typ -> + reject_empty_struct b offset_orig typ; (* Union of arithmetic types *) bind_entire_loc Cvalue.V.top_int @@ -367,21 +386,21 @@ bind_entire_loc Cvalue.V.singleton_zero | TBuiltin_va_list _ | TComp _ | TVoid _ | TPtr _ -> + reject_empty_struct b offset_orig typ; (* variable arguments or union with non-arithmetic type or deep pointers *) - (* first create a new varid and offsetmap for the "hidden location" *) let hidden_var_name = Cabs2cil.fresh_global ("WELL_"^name) in let hidden_var = - Cil.makeGlobalVar ~logic:true hidden_var_name Cil.charType + Value_util.create_new_var hidden_var_name Cil.charType in hidden_var.vdescr <- Some (name_desc^"_WELL"); let validity = Base.Known (Int.zero, Bit_utils.max_bit_address ()) in let hidden_base = Base.register_memory_var hidden_var validity in - make_well ~filled:true hidden_base state loc + make_well ~filled:true hidden_base state (Lazy.force loc) | TNamed (_, _) -> assert false in add_offsetmap @@ -393,7 +412,7 @@ let init_var_zero vi state = let loc = Locations.loc_of_varinfo vi in let v = - if typeHasAttribute "volatile" vi.vtype + if Cil.typeHasQualifier "volatile" vi.vtype then V.top_int else V.singleton_zero in @@ -422,20 +441,14 @@ | Var vinfo, _ -> let base = Base.of_varinfo vinfo in let size_to_add = Int.of_int size_to_add in - let offset, size = - match Base.validity base with - | Base.Periodic (mn, _mx, p) when Int.ge size_to_add p -> - Ival.inject_singleton mn, p - | _ -> offset, size_to_add - in let loc = Location_Bits.inject base offset in - make_loc loc (Int_Base.inject size) + make_loc loc (Int_Base.inject size_to_add) | _ -> assert false in if initialized_padding () then let v = - if typeHasAttribute "volatile" typ + if Cil.typeHasQualifier "volatile" typ then V.top_int else V.singleton_zero in @@ -465,12 +478,9 @@ "Evaluation of initializer '%a' failed@." Printer.pp_exp exp; raise Initialization_failed); let v = - if typeHasAttribute "volatile" typ_lval + if Cil.typeHasQualifier "volatile" typ_lval then V.top_int - else - if Eval_op.is_bitfield typ_lval - then Eval_op.cast_lval_bitfield typ_lval loc.Locations.size value - else value + else Eval_op.cast_lval_if_bitfield typ_lval loc.Locations.size value in add_initialized state loc v @@ -480,7 +490,7 @@ | SingleInit exp -> eval_single_initializer state lval exp | CompoundInit (base_typ, l) -> - if typeHasAttribute "volatile" base_typ + if Cil.typeHasQualifier "volatile" base_typ then state (* initializer is not useful *) else let last_bitsoffset, state = @@ -513,7 +523,7 @@ end else (assert (acc=o); state) in - if typeHasAttribute "volatile" typ then + if Cil.typeHasQualifier "volatile" typ then warning_once_current "global initialization of volatile %s ignored" (match off with @@ -545,15 +555,14 @@ match init with | SingleInit exp -> let typ_lval = Cil.typeOfLval lval in - let attrs = Cil.typeAttrs typ_lval in - if Cil.hasAttribute "const" attrs && - not (Cil.hasAttribute "volatile" attrs) + if Cil.typeHasQualifier "const" typ_lval && + not (Cil.typeHasQualifier "volatile" typ_lval) then eval_single_initializer state lval exp else state | CompoundInit (base_typ, l) -> - if typeHasAttribute "volatile" base_typ || + if Cil.typeHasQualifier "volatile" base_typ || not (Cil.typeHasAttributeDeep "const" base_typ) then state (* initializer is not useful *) else @@ -590,9 +599,9 @@ in Globals.Vars.iter_in_file_order (fun varinfo init -> - if not varinfo.vlogic then begin + if varinfo.vsource then begin Cil.CurrentLoc.set varinfo.vdecl; - let volatile = typeHasAttribute "volatile" varinfo.vtype in + let volatile = Cil.typeHasQualifier "volatile" varinfo.vtype in match init.init, volatile with | None, _ | _, true -> (* Default to zero init *) if volatile && init.init != None then diff -Nru frama-c-20140301+neon+dfsg/src/value/initial_state.mli frama-c-20150201+sodium+dfsg/src/value/initial_state.mli --- frama-c-20140301+neon+dfsg/src/value/initial_state.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/initial_state.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/kf_state.ml frama-c-20150201+sodium+dfsg/src/value/kf_state.ml --- frama-c-20140301+neon+dfsg/src/value/kf_state.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/kf_state.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,96 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -open Cil_datatype - -(* ************************************************************************* *) -(** {2 Is called} *) -(* ************************************************************************* *) - -module Is_Called = - Kernel_function.Make_Table - (Datatype.Bool) - (struct - let name = "is_called" - let dependencies = [ Db.Value.self ] - let size = 17 - end) - -let is_called = - Is_Called.memo - (fun kf -> - try Db.Value.is_reachable_stmt (Kernel_function.find_first_stmt kf) - with Kernel_function.No_Statement -> false) - -let mark_as_called kf = - Is_Called.replace kf true - -(* ************************************************************************* *) -(** {2 Callers} *) -(* ************************************************************************* *) - -module Callers = - Kernel_function.Make_Table - (Kernel_function.Map.Make(Stmt.Set)) - (struct - let name = "Callers" - let dependencies = [ Db.Value.self ] - let size = 17 - end) - -let add_caller ~caller:(caller_kf, call_site) kf = - let add m = Kernel_function.Map.add caller_kf (Stmt.Set.singleton call_site) m - in - let change m = - try - let call_sites = Kernel_function.Map.find caller_kf m in - Kernel_function.Map.add caller_kf (Stmt.Set.add call_site call_sites) m - with Not_found -> - add m - in - ignore (Callers.memo ~change (fun _kf -> add Kernel_function.Map.empty) kf) - - -let callers kf = - try - let m = Callers.find kf in - Kernel_function.Map.fold - (fun key v acc -> (key, Stmt.Set.elements v) :: acc) - m - [] - with Not_found -> - [] - -(* ************************************************************************* *) -(** {2 Registration.} *) -(* ************************************************************************* *) - -let () = - Db.Value.is_called := is_called; - Db.Value.callers := callers; - - -(* -Local Variables: -compile-command: "make -C ../.." -End: -*) diff -Nru frama-c-20140301+neon+dfsg/src/value/kf_state.mli frama-c-20150201+sodium+dfsg/src/value/kf_state.mli --- frama-c-20140301+neon+dfsg/src/value/kf_state.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/kf_state.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -(** Keep information attached to kernel functions. *) - -open Cil_types - -val mark_as_called: kernel_function -> unit -val add_caller: caller:kernel_function*stmt -> kernel_function -> unit - -(* -Local Variables: -compile-command: "make -C ../.." -End: -*) diff -Nru frama-c-20140301+neon+dfsg/src/value/library_functions.ml frama-c-20150201+sodium+dfsg/src/value/library_functions.ml --- frama-c-20140301+neon+dfsg/src/value/library_functions.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/library_functions.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -46,7 +46,7 @@ let typ = Cil.getReturnType vi.vtype in makeVarinfo false false "__retres" typ) -let add_retres_to_state ~with_alarms kf offsetmap state = +let add_retres_to_state kf offsetmap state = let retres_vi = get kf in let retres_base = Base.of_varinfo retres_vi in let loc = Location_Bits.inject retres_base Ival.zero in @@ -56,8 +56,9 @@ Value_parameters.abort "library function return type size unknown. \ Please report" in - let state = Cvalue.Model.paste_offsetmap - with_alarms offsetmap loc Int.zero size true state + let state = + snd (Cvalue.Model.paste_offsetmap + ~reducing:true ~from:offsetmap ~dst_loc:loc ~size ~exact:true state) in retres_vi, state @@ -74,11 +75,6 @@ end) let () = Ast.add_monotonic_state Returned_Val.self -let register_new_var v typ = - if isFunctionType typ then - Globals.Functions.replace_by_declaration (Cil.empty_funspec()) v v.vdecl - else - Globals.Vars.add_decl v let returned_value kf state = (* Process return of function *) @@ -94,14 +90,11 @@ (* Value_parameters.warning "Undefined function returning a pointer: %a" Kernel_function.pretty kf; *) - let new_varinfo = - makeGlobalVar - ~logic:true ~generated:false - (Cabs2cil.fresh_global - ("alloced_return_" ^ Kernel_function.get_name kf)) - typ + let v_name = + Cabs2cil.fresh_global + ("alloced_return_" ^ Kernel_function.get_name kf) in - register_new_var new_varinfo typ; + let new_varinfo = Value_util.create_new_var v_name typ in let validity = Base.Known (Int.zero, Int.pred size) in Base.register_memory_var new_varinfo validity ) kf @@ -109,8 +102,11 @@ let initial_value = match Cil.unrollType typ with | TInt _ | TEnum _ -> V.top_int - | TFloat (FFloat, _) -> V.top_single_precision_float - | TFloat ((FDouble | FLongDouble), _) -> V.top_float + | TFloat (fk, _) -> begin + match Value_util.float_kind fk with + | Ival.Float_abstract.Float32 -> V.top_single_precision_float + | Ival.Float_abstract.Float64 -> V.top_float + end | _ -> let origin = Origin.current Origin.K_Leaf in V.inject_top_origin origin (Base.Hptset.singleton new_base) @@ -127,11 +123,8 @@ let returned_base = Location_Bytes.inject new_base - (Ival.filter_ge_int (Some Int.zero) - (Ival.create_all_values - ~signed:true - ~modu:size_v - ~size:(sizeofpointer ()))) + (Ival.create_all_values + ~signed:false ~modu:size_v ~size:(sizeofpointer()-1)) in let returned_value = V.join V.top_int returned_base in let v = Cvalue.V_Or_Uninitialized.initialized initial_value in diff -Nru frama-c-20140301+neon+dfsg/src/value/library_functions.mli frama-c-20150201+sodium+dfsg/src/value/library_functions.mli --- frama-c-20140301+neon+dfsg/src/value/library_functions.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/library_functions.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -23,7 +23,6 @@ open Cil_types val add_retres_to_state: - with_alarms:CilE.warn_mode -> kernel_function -> Cvalue.V_Offsetmap.t -> Cvalue.Model.t -> @@ -34,9 +33,6 @@ Cvalue.Model.t -> Cvalue.V.t * Cvalue.Model.t -(** Auxiliary function that registers a new variable declared by Value - within the kernel internal tables *) -val register_new_var: varinfo -> typ -> unit (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/value/locals_scoping.ml frama-c-20150201+sodium+dfsg/src/value/locals_scoping.ml --- frama-c-20140301+neon+dfsg/src/value/locals_scoping.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/locals_scoping.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -41,7 +41,7 @@ let remember_if_locals_in_offsetmap clob left_loc offm = try Cvalue.V_Offsetmap.iter_on_values - (fun v _ -> + (fun v -> if Cvalue.V.contains_addresses_of_any_locals (Cvalue.V_Or_Uninitialized.get_v v) then @@ -67,7 +67,6 @@ [snd (topify v)], and gather [fst (topify v)] within [acc_locals] *) let top_gather_locals test topify join acc_locals : topify_offsetmap = fun offsm -> - assert (not (Cvalue.V_Offsetmap.is_empty offsm)); Cvalue.V_Offsetmap.fold (fun (_,_ as i) (v, m, r) (acc_locals, acc_o as acc) -> if test v @@ -86,9 +85,6 @@ (* Partial application is important, this function has a cache *) let is_local_bytes = Location_Bytes.contains_addresses_of_locals is_local in fun ~exact offsetmap -> - if Cvalue.V_Offsetmap.is_empty offsetmap - then Base.SetLattice.top, offsetmap - else let loc_contains_addresses_of_locals t = let v = Cvalue.V_Or_Uninitialized.get_v t in is_local_bytes v @@ -118,19 +114,19 @@ (* Clean the locals in the offsetmap bound to [base] in [state] *) let aux' base state = try - let offsm = Cvalue.Model.find_base base state in - aux base offsm state + match Cvalue.Model.find_base base state with + | `Top | `Bottom -> state + | `Map offsm -> aux base offsm state with Not_found -> state in try (* Iterate on all the bases that might contain a local, and clean them*) Base.SetLattice.fold aux' bases.clob (aux' Base.null state) with Base.SetLattice.Error_Top -> - begin (* [bases] is too imprecise. Iterate on the entire memory state - instead, which is much slower *) - try - Cvalue.Model.fold_base_offsetmap aux state state - with Cvalue.Model.Error_Bottom -> Cvalue.Model.bottom - end + (* [bases] is too imprecise. Iterate on the entire memory state instead, + which is much slower *) + match state with + | Cvalue.Model.Top | Cvalue.Model.Bottom -> state + | Cvalue.Model.Map m -> Cvalue.Model.fold aux m state (* Topifies all references to the locals and formals of [fdec]*) let top_addresses_of_locals fdec clob = @@ -156,7 +152,7 @@ let block_top_addresses_of_locals fdec clob blocks = (* no need to topify references to [v] if it is not referenced, or if it a Cil temporary *) - let safe_var v = v.vgenerated || not v.vreferenced in + let safe_var v = v.vtemp || not v.vreferenced in if List.for_all (fun b -> List.for_all safe_var b.blocals) blocks then fun x -> x else diff -Nru frama-c-20140301+neon+dfsg/src/value/locals_scoping.mli frama-c-20150201+sodium+dfsg/src/value/locals_scoping.mli --- frama-c-20140301+neon+dfsg/src/value/locals_scoping.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/locals_scoping.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/mark_noresults.ml frama-c-20150201+sodium+dfsg/src/value/mark_noresults.ml --- frama-c-20140301+neon+dfsg/src/value/mark_noresults.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/mark_noresults.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,32 +20,13 @@ (* *) (**************************************************************************) -open Cil_types - -class mark_visitor = object(_self) - inherit Cil.nopCilVisitor - - method! vstmt s = - Db.Value.update_table s Cvalue.Model.top; - Cil.DoChildren - -end - -let should_memorize_function name = - not (Value_parameters.NoResultsAll.get() || - (Value_parameters.ObviouslyTerminatesAll.get()) || - let name = name.svar.vname in - let mem = Datatype.String.Set.mem in - mem name (Value_parameters.NoResultsFunctions.get ()) - || mem name (Value_parameters.ObviouslyTerminatesFunctions.get ())) - -let run () = - let visitor = new mark_visitor in - Globals.Functions.iter_on_fundecs - (fun afundec -> - if not (should_memorize_function afundec) - then - ignore (Cil.visitCilFunction (visitor:>Cil.cilVisitor) afundec)) +let should_memorize_function f = + not (Value_parameters.NoResultsAll.get() + || Value_parameters.ObviouslyTerminatesAll.get () + || Cil_datatype.Fundec.Set.mem + f (Value_parameters.NoResultsFunctions.get ()) + || Cil_datatype.Fundec.Set.mem + f (Value_parameters.ObviouslyTerminatesFunctions.get ())) let () = Db.Value.no_results := (fun fd -> not (should_memorize_function fd)) diff -Nru frama-c-20140301+neon+dfsg/src/value/mem_exec.ml frama-c-20150201+sodium+dfsg/src/value/mem_exec.ml --- frama-c-20140301+neon+dfsg/src/value/mem_exec.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/mem_exec.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,8 +20,6 @@ (* *) (**************************************************************************) -open Cil_types - exception TooImprecise (* Extract all the bases from a zone *) @@ -102,6 +100,11 @@ ;; +let map_to_outputs f = + List.map + (fun ((res: Cvalue.V_Offsetmap.t option), (out: Cvalue.Model.t)) -> + (res, f out)) + let register_callback () = if Value_parameters.MemExecAll.get () then Db.Operational_inputs.Record_Inout_Callbacks.extend_once @@ -131,10 +134,10 @@ (* TODO. add only outputs that are not completely overwritten *) let input_bases = Base.Hptset.union input_bases output_bases in let state_input = filter_state input_bases input_state in - let clear = filter_state output_bases in - let outputs = - Value_util.map_outputs clear callres.Value_types.c_values - in + (* Outputs bases, that is bases that are copy-pasted, also include + input bases. Indeed, those may get reduced during the call. *) + let clear state = filter_state input_bases state in + let outputs = map_to_outputs clear callres.Value_types.c_values in let call_number = current_counter () in let map_a = try PreviousStates.find kf @@ -166,43 +169,41 @@ exception Result_found of ValueOutputs.t * int -let previous_matches st (map_inputs: MapBasesInputsPrevious.t) = - let aux binputs hstates = - let st_filtered = filter_state binputs st in +(** Find a previous execution in [map_inputs] that matches [st]. + raise [Result_found] when this execution exists, or do nothing. *) +let find_match_in_previous (map_inputs: MapBasesInputsPrevious.t) state = + let aux_previous_call binputs hstates = + (* restrict [state] to the inputs of this call *) + let st_filtered = filter_state binputs state in try - let old = Cvalue.Model.Hashtbl.find hstates st_filtered in - let (outputs, clobbered), i = old in - let aux st_outputs = - if Cvalue.Model.is_reachable st_outputs then - Cvalue.Model.fold_base_offsetmap - Cvalue.Model.add_base st_outputs st(*=acc*) - else st_outputs + let (outputs, clobbered), i = + Cvalue.Model.Hashtbl.find hstates st_filtered in - let outputs = Value_util.map_outputs aux outputs in + (* We have found a previous execution, in which the outputs are + [outputs]. Copy them in [state] and return this result. *) + let aux = function + | Cvalue.Model.Bottom | Cvalue.Model.Top as state -> state + | Cvalue.Model.Map outputs -> + Cvalue.Model.fold Cvalue.Model.add_base outputs state(*=acc*) + in + let outputs = map_to_outputs aux outputs in raise (Result_found ((outputs, clobbered), i)) with Not_found -> () in - Base.Hptset.Hashtbl.iter aux map_inputs + Base.Hptset.Hashtbl.iter aux_previous_call map_inputs let reuse_previous_call (kf, _ as _callsite: Value_types.call_site) state actuals = try let previous_kf = PreviousStates.find kf in let previous = ActualsList.Map.find actuals previous_kf in - previous_matches state previous; + find_match_in_previous previous state; None with | Not_found -> None | Result_found ((out, clob), i) -> - (* TODO: check this. Do we record the result too early? *) - let st_without_formals = match kf.fundec with - | Definition (fdec, _) -> - Value_util.map_outputs - (Value_util.remove_formals_from_state fdec.sformals) out - | Declaration _ -> out - in let res_call = { - Value_types.c_values = st_without_formals; + Value_types.c_values = out; c_clobbered = clob; c_cacheable = Value_types.Cacheable (* call can be cached since it was cached once *); diff -Nru frama-c-20140301+neon+dfsg/src/value/mem_exec.mli frama-c-20150201+sodium+dfsg/src/value/mem_exec.mli --- frama-c-20140301+neon+dfsg/src/value/mem_exec.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/mem_exec.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/non_linear.ml frama-c-20150201+sodium+dfsg/src/value/non_linear.ml --- frama-c-20140301+neon+dfsg/src/value/non_linear.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/non_linear.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/non_linear.mli frama-c-20150201+sodium+dfsg/src/value/non_linear.mli --- frama-c-20140301+neon+dfsg/src/value/non_linear.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/non_linear.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/per_stmt_slevel.ml frama-c-20150201+sodium+dfsg/src/value/per_stmt_slevel.ml --- frama-c-20140301+neon+dfsg/src/value/per_stmt_slevel.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/per_stmt_slevel.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -38,46 +38,44 @@ module Dfs = Graph.Traverse.Dfs(G) -module LocalSlevelId = State_builder.SharedCounter(struct - let name = "Local_slevel.LocalSlevelId" -end) - -module LocalSlevelAnnots = - State_builder.Int_hashtbl - (Datatype.Option(Datatype.Int)) - (struct - let name = "Local_slevel.LocalSlevelAnnots" - let dependencies = [Ast.self] - let size = 17 - end) -(* Link this state to the AST. Otherwise, it gets removed when parsing hooks - (such as loop unrolling) are used. *) -let () = Ast.add_linked_state LocalSlevelAnnots.self -(* TODO: it would be great to be able to add annotations dynamically during - analysis. We must find to allow the user to fill this table. *) - -let retrieve_annot i = - try LocalSlevelAnnots.find i - with Not_found -> assert false (*This table is always filled at parsing time*) - +(* We use the following encoding to store the directives in the AST + [slevel i] => predicate + [slevel default] => predicate *) + +let retrieve_annot lp = + match lp with + | [{ip_content = Prel (_, {term_node = TConst (Integer (i, _))}, _)}] -> + Some (Integer.to_int i) + | [{ip_content = Ptrue}] -> None + | _ -> None (* be kind. Someone is bound to write a visitor that will + simplify our term into something unrecognizable... *) let () = Logic_typing.register_behavior_extension "slevel" (fun ~typing_context:_ ~loc bhv args -> - let id = LocalSlevelId.next () in + let abort () = + Value_parameters.abort ~source:(fst loc) "Invalid slevel directive" + in let open Logic_ptree in - bhv.b_extended <- ("slevel", id, []) :: bhv.b_extended; - match args with + let p = match args with | [{lexpr_node = PLvar "default"}] -> - LocalSlevelAnnots.add id None; + Logic_const.(new_predicate ptrue) | [{lexpr_node = PLconstant (IntConstant i)}] -> - LocalSlevelAnnots.add id (Some (int_of_string i)) - | _ -> Value_parameters.abort ~source:(fst loc) - "Invalid slevel directive" + begin + try + let i = int_of_string i in + if i < 0 then abort (); + let i = Logic_const.tinteger i in + Logic_const.(new_predicate (prel (Req, i, i))) + with Failure _ -> abort () + end + | _ -> abort () + in + bhv.b_extended <- ("slevel", 0, [p]) :: bhv.b_extended; ) let () = Cil_printer.register_behavior_extension "slevel" - (fun _pp fmt (i, _) -> - match retrieve_annot i with + (fun _pp fmt (_, lp) -> + match retrieve_annot lp with | None -> Format.pp_print_string fmt "default" | Some i -> Format.pp_print_int fmt i ) @@ -99,8 +97,8 @@ match l with | [] -> None | {annot_content = - AStmtSpec (_, { spec_behavior = [{b_extended = ["slevel", i, _]}]})} - :: _ -> Some (retrieve_annot i) + AStmtSpec (_, { spec_behavior = [{b_extended = ["slevel", _, lp]}]})} + :: _ -> Some (retrieve_annot lp) | _ :: q -> find_one q in find_one (Annotations.code_annot s) @@ -171,9 +169,7 @@ (struct let size = 17 let dependencies = - [LocalSlevelAnnots.self; - Value_parameters.SemanticUnrollingLevel.self; - Value_parameters.ShowSlevel.self] + [Ast.self; Value_parameters.SemanticUnrollingLevel.self;] let name = "Value.Local_slevel.ForKf" end) diff -Nru frama-c-20140301+neon+dfsg/src/value/per_stmt_slevel.mli frama-c-20150201+sodium+dfsg/src/value/per_stmt_slevel.mli --- frama-c-20140301+neon+dfsg/src/value/per_stmt_slevel.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/per_stmt_slevel.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/precise_locs.ml frama-c-20150201+sodium+dfsg/src/value/precise_locs.ml --- frama-c-20140301+neon+dfsg/src/value/precise_locs.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/precise_locs.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,309 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -open Abstract_interp -open Locations - -type precise_offset = - | POBottom (* No offset *) - | POZero (* Offset zero *) - | POSingleton of Int.t (* Single offset *) - | POPrecise of Ival.t * (Int.t (* cardinal *)) - (* Offset exactly represented by an ival *) - | POImprecise of Ival.t (* Offset that could not be represented precisely *) - | POShift of (* Shifted offset *) - Ival.t (* number of bits/bytes to shift *) * - precise_offset * - Int.t (* cardinal*) - -(* Cardinals are over-approximated: the combination [{0, 1} + {0, 1}] - is considered as having cardinal 4 instead of 3. POBottom is the - only way to represent Bottom (ie [POImprecise Ival.bottom] is - forbidden). Other invariants, ie. [POSingleton i] means that [i] is - non-zero, are not required for correction -- only for performance. *) - - -let rec pretty_offset fmt = function - | POBottom -> Format.fprintf fmt "" - | POZero -> Format.fprintf fmt "<0>" - | POSingleton i -> Format.fprintf fmt "<%a>_0" Int.pretty i - | POPrecise (po, _) -> Format.fprintf fmt "<%a>p" Ival.pretty po - | POImprecise po -> Format.fprintf fmt "<%a>i" Ival.pretty po - | POShift (i, po, _) -> - Format.fprintf fmt "<%a+%a>" pretty_offset po Ival.pretty i - -let offset_zero = POZero -let offset_bottom = POBottom -let offset_top = POImprecise Ival.top - -let is_bottom_offset off = off = POBottom - -let cardinal_zero_or_one_offset = function - | POBottom | POZero | POSingleton _ -> true - | POPrecise (_, c) | POShift (_, _, c) -> Int.le c Int.one - | POImprecise _ -> false - - -let small_cardinal c = Int.le c (Int.of_int !Lattice_Interval_Set.plevel) - -let _cardinal_offset = function - | POBottom -> Some Int.zero - | POZero | POSingleton _ -> Some Int.one - | POPrecise (_, c) -> Some c - | POImprecise _ -> None - | POShift (_, _, c) -> Some c - -let rec imprecise_offset = function - | POBottom -> Ival.bottom - | POZero -> Ival.singleton_zero - | POSingleton i -> Ival.inject_singleton i - | POPrecise (i, _) | POImprecise i -> i - | POShift (shift, po, _) -> Ival.add_int shift (imprecise_offset po) - -let rec _scale_offset scale po = - assert (Int.gt scale Int.zero); - match po with - | POBottom -> POBottom - | POZero -> POZero - | POSingleton i -> POSingleton (Int.mul i scale) - | POPrecise (i, c) -> POPrecise (Ival.scale scale i, c) - | POImprecise i -> POImprecise (Ival.scale scale i) - | POShift (shift, po, c) -> - POShift (Ival.scale scale shift, _scale_offset scale po, c) - -let shift_offset_by_singleton shift po = - if Int.is_zero shift then - po - else - match po with - | POBottom -> POBottom - | POZero -> POSingleton shift - | POSingleton i -> POSingleton (Int.add i shift) - | POPrecise (i, c) -> POPrecise (Ival.add_singleton_int shift i, c) - | POImprecise i -> POImprecise (Ival.add_singleton_int shift i) - | POShift (shift', po, c) -> - POShift (Ival.add_singleton_int shift shift', po, c) - -let shift_offset shift po = - if Ival.is_bottom shift then - POBottom - else - match po with - | POBottom -> POBottom - - | POZero -> - (match Ival.cardinal shift with - | Some c when small_cardinal c -> - if Int.equal c Int.one then - POSingleton (Ival.project_int shift) - else - POPrecise (shift, c) - | _ -> POImprecise shift) - - | POImprecise i -> POImprecise (Ival.add_int shift i) - - | POSingleton i -> - (match Ival.cardinal shift with - | Some c when small_cardinal c -> - if Int.equal c Int.one then - POSingleton (Int.add (Ival.project_int shift) i) - else - POPrecise (Ival.add_singleton_int i shift, c) - | _ -> POImprecise (Ival.add_int shift (imprecise_offset po))) - - | POPrecise (_i, cpo) -> - (match Ival.cardinal shift with - | Some cs -> - let new_card = Int.mul cs cpo in - if small_cardinal new_card then - POShift (shift, po, new_card) (* may be a POPrecise depending - on ilevel *) - else - POImprecise (Ival.add_int shift (imprecise_offset po)) - | None -> - POImprecise (Ival.add_int shift (imprecise_offset po))) - - | POShift (_shift', _po', cpo) -> - (match Ival.cardinal shift with - | Some cs -> - let new_card = Int.mul cs cpo in - if small_cardinal new_card then - POShift (shift, po, new_card) (* may be a single POShift depending - on the cardinals of shift/shift'*) - else - POImprecise (Ival.add_int shift (imprecise_offset po)) - | None -> - POImprecise (Ival.add_int shift (imprecise_offset po))) - -type precise_location_bits = - | PLBottom - | PLLoc of Location_Bits.t - | PLVarOffset of Base.t * precise_offset - | PLLocOffset of Location_Bits.t * precise_offset - -let pretty_loc fmt = function - | PLBottom -> Format.fprintf fmt "[Bot]" - | PLLoc loc -> Format.fprintf fmt "[%a]" Location_Bits.pretty loc - | PLVarOffset (b, po) -> - Format.fprintf fmt "[%a+%a]" Base.pretty b pretty_offset po - | PLLocOffset (loc, po) -> - Format.fprintf fmt "[%a+%a]" Location_Bits.pretty loc pretty_offset po - -let bottom_location_bits = PLBottom - -let cardinal_zero_or_one_location_bits = function - | PLBottom -> true - | PLLoc loc -> Location_Bits.cardinal_zero_or_one loc - | PLVarOffset (_, po) -> cardinal_zero_or_one_offset po - | PLLocOffset (loc, po) -> - Location_Bits.cardinal_zero_or_one loc && cardinal_zero_or_one_offset po - -let inject_location_bits loc = - if Location_Bits.is_bottom loc then PLBottom else PLLoc loc - -let combine_base_precise_offset base po = - match po with - | POBottom -> PLBottom - | POZero -> PLLoc (Location_Bits.inject base Ival.singleton_zero) - | POSingleton i -> - PLLoc (Location_Bits.inject base (Ival.inject_singleton i)) - | POImprecise i | POPrecise (i, _) -> PLLoc (Location_Bits.inject base i) - | POShift _ -> PLVarOffset (base, po) - -let combine_loc_precise_offset loc po = - match po with - | POBottom -> PLBottom - | POZero -> PLLoc loc - | POImprecise i -> - PLLoc (Location_Bits.shift i loc) - | POSingleton i -> - PLLoc (Location_Bits.shift (Ival.inject_singleton i) loc) - | POPrecise (i, _c) when Location_Bits.cardinal_zero_or_one loc -> - PLLoc (Location_Bits.shift i loc) - | POPrecise (_, c) | POShift (_, _, c) -> - (match Location_Bits.cardinal loc with - | Some card when small_cardinal (Int.mul card c) -> - PLLocOffset (loc, po) - | _ -> - PLLoc (Location_Bits.shift (imprecise_offset po) loc) - ) - -let imprecise_location_bits = function - | PLBottom -> Location_Bits.bottom - | PLLoc l -> l - | PLVarOffset (b, po) -> Location_Bits.inject b (imprecise_offset po) - | PLLocOffset (loc, po) -> Location_Bits.shift (imprecise_offset po) loc - -type precise_location = { - loc: precise_location_bits; - size: Int_Base.t -} - -let imprecise_location pl = - make_loc (imprecise_location_bits pl.loc) pl.size - -let make_precise_loc loc ~size = { loc; size } - -let loc_size loc = loc.size - -let loc_bottom = { - loc = PLBottom; - size = Int_Base.top; -} -let is_bottom_loc pl = pl.loc = PLBottom - -let rec fold_offset f po acc = - match po with - | POBottom -> f Ival.bottom acc - | POZero -> f Ival.singleton_zero acc - | POSingleton i -> f (Ival.inject_singleton i) acc - | POPrecise (iv, _) | POImprecise iv -> f iv acc - | POShift (shift, po', _) -> - let aux_po ival acc = - let aux_ival shift_i acc = - let ival' = Ival.add_singleton_int shift_i ival in - f ival' acc - in - Ival.fold_int aux_ival shift acc - in - fold_offset aux_po po' acc - -let fold f pl acc = - match pl.loc with - | PLBottom -> f Locations.loc_bottom acc - | PLLoc l -> f (make_loc l pl.size) acc - | PLVarOffset (b, po) -> - let aux_po ival acc = - let loc_b = Location_Bits.inject b ival in - let loc = make_loc loc_b pl.size in - f loc acc - in - fold_offset aux_po po acc - | PLLocOffset (loc, po) -> - let aux_po ival_po acc = - let aux_loc b ival_loc acc = - let aux_ival_loc i acc = - let ival = Ival.add_singleton_int i ival_po in - let loc_b = Location_Bits.inject b ival in - let loc = make_loc loc_b pl.size in - f loc acc - in - Ival.fold_int aux_ival_loc ival_loc acc - in - Location_Bits.fold_i aux_loc loc acc - in - fold_offset aux_po po acc - -let enumerate_valid_bits ~for_writing loc = - let aux loc z = Zone.join z (enumerate_valid_bits ~for_writing loc) in - fold aux loc Zone.bottom - - -let cardinal_zero_or_one ~for_writing pl = - if true then - match pl.loc with - | PLBottom -> true - | PLLoc lb -> - let loc = make_loc lb pl.size in - Locations.valid_cardinal_zero_or_one ~for_writing loc - | _ -> - try - ignore - (fold (fun loc found_one -> - let valid = Locations.valid_part ~for_writing loc in - if Locations.is_bottom_loc loc then found_one - else - if Locations.cardinal_zero_or_one valid then - if found_one then raise Exit else true - else raise Exit - ) pl false); - true - with Exit -> false - else - not (Int_Base.is_top pl.size) && cardinal_zero_or_one_location_bits pl.loc - - -(* -Local Variables: -compile-command: "make -C ../.." -End: -*) diff -Nru frama-c-20140301+neon+dfsg/src/value/precise_locs.mli frama-c-20150201+sodium+dfsg/src/value/precise_locs.mli --- frama-c-20140301+neon+dfsg/src/value/precise_locs.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/precise_locs.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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 module provide transient datastructures that may be more precise - than an {!Ival.t}, {!Locations.Location_Bits.t} and {!Locations.location} - respectively, typically for l-values such as [t[i][j]], [p->t[i]], etc. - Those structures do not have a lattice structure, and cannot be stored - as an abstract domain. However, they can be use to model more precisely - read or write accesses to semi-imprecise l-values. *) - - -(** {2 Precise offsets} *) - -type precise_offset -val pretty_offset : Format.formatter -> precise_offset -> unit - -val offset_zero : precise_offset -val offset_bottom : precise_offset -val offset_top : precise_offset - -val is_bottom_offset : precise_offset -> bool - -val imprecise_offset : precise_offset -> Ival.t - -(*val _scale_offset : Integer.t -> precise_offset -> precise_offset*) -val shift_offset_by_singleton : Integer.t -> precise_offset -> precise_offset -val shift_offset : Ival.t -> precise_offset -> precise_offset - - -(** {2 Precise location_bits} *) - -type precise_location_bits -val pretty_loc : Format.formatter -> precise_location_bits -> unit -val bottom_location_bits : precise_location_bits - -val inject_location_bits : Locations.Location_Bits.t -> precise_location_bits -val combine_base_precise_offset : - Base.t -> precise_offset -> precise_location_bits -val combine_loc_precise_offset : - Locations.Location_Bits.t -> precise_offset -> precise_location_bits - -val imprecise_location_bits : - precise_location_bits -> Locations.Location_Bits.t - - -(** {2 Precise locations} *) - -type precise_location - -val loc_size: precise_location -> Int_Base.t - -val make_precise_loc : - precise_location_bits -> size:Int_Base.t -> precise_location - -val imprecise_location : precise_location -> Locations.location - -val loc_bottom : precise_location -val is_bottom_loc: precise_location -> bool - -val fold: - (Locations.location -> 'a -> 'a) -> precise_location -> 'a -> 'a - -val enumerate_valid_bits: - for_writing:bool -> precise_location -> Locations.Zone.t - -val cardinal_zero_or_one: for_writing:bool -> precise_location -> bool diff -Nru frama-c-20140301+neon+dfsg/src/value/register_gui.ml frama-c-20150201+sodium+dfsg/src/value/register_gui.ml --- frama-c-20140301+neon+dfsg/src/value/register_gui.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/register_gui.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -25,6 +25,112 @@ open Pretty_source open Gtk_helper +(* Catch the fact that we are in a function for which [-no-results] or one + of its variants is set. Without this check, we would display + much non-sensical information. *) +let results_kf_computed = function + | { fundec = Definition (fundec, _) } -> + Mark_noresults.should_memorize_function fundec + | { fundec = Declaration _ } -> true (* This value is not really used *) + + +(** Generic functions working for lvalues and expressions. *) + +(* special [with_alarms] value that logs important alarms, but allows execution + to continue *) +let log_alarms () = + let ok = ref true in + let not_ok () = ok := false in + let with_alarms = { + CilE.others = {CilE.a_ignore with CilE.a_call=not_ok}; + unspecified = {CilE.a_ignore with CilE.a_call=not_ok}; + defined_logic = CilE.a_ignore; + imprecision_tracing = CilE.a_ignore; + } in + with_alarms, ok + +let pp_eval_ok fmt ok = + if not ok then + Format.fprintf fmt " (evaluation may have failed in some cases) " + +type ('states, 'expr, 'v) evaluation_functions = { + eval_and_warn: 'states -> 'expr -> 'v * bool; + equal: 'v -> 'v -> bool; + bottom: 'v; + join: 'v -> 'v -> 'v; + pretty: 'expr -> Format.formatter -> 'v -> unit +} + +let pretty_before_after ev (main_ui: Design.main_window) ~before ~after expr = + let pp fmt = main_ui#pretty_information fmt in + try + let vbefore, okbef = ev.eval_and_warn before expr in + let res_after = Extlib.opt_map (fun a -> ev.eval_and_warn a expr) after in + let pretty = ev.pretty expr in + match res_after with + | Some (vafter, okafter) + when ev.equal vbefore vafter -> + pp "Before this statement / after this statement%a:@. %a@." + pp_eval_ok (okbef && okafter) pretty vbefore + | Some (vafter, okafter) -> + pp "Before this statement%a:@. %a@." + pp_eval_ok okbef pretty vbefore; + pp "After this statement%a:@. %a@." + pp_eval_ok okafter pretty vafter + | None -> + pp "Before this statement%a:@. %a@." + pp_eval_ok okbef pretty vbefore; + with Eval_terms.LogicEvalError ee -> + Value_parameters.debug "Cannot evaluate term (%a)" + Eval_terms.pretty_logic_evaluation_error ee + +let pretty_per_callstacks ev (main_ui: Design.main_window) ~before ~after v = + let pp_info fmt = main_ui#pretty_information fmt in + let aux callstack before = + let after = + Extlib.opt_map + (fun cafter -> + try Value_types.Callstack.Hashtbl.find cafter callstack + with Not_found -> Cvalue.Model.bottom) + after + in + pp_info "@.For callstack [%a]@." Value_util.pretty_call_stack callstack; + pretty_before_after ev main_ui ~before ~after v + in + (* TODO: we should sort the callstacks by prefix *) + Value_types.Callstack.Hashtbl.iter aux before + +let callstack_fold ev h a = + let f _callstack state (acc_res, acc_w) = + let res, w = ev.eval_and_warn state a in + ev.join res acc_res, w || acc_w + in + Value_types.Callstack.Hashtbl.fold f h (ev.bottom, false) + +let pretty_callstack_summary ev main_ui ~before ~after v = + let ev = { ev with eval_and_warn = callstack_fold ev } in + pretty_before_after ev main_ui ~before ~after v + +let pretty_at_stmt ev main_ui stmt v = + (* Display 'after' states only in instructions. On blocks and if/switch + statements, the notion of 'after' is counter-intuitive. *) + let is_instr = match stmt.skind with Instr _ -> true | _ -> false in + (* Standard printing, without callstacks *) + let before = + match Db.Value.get_stmt_state_callstack ~after:false stmt with + | None -> Value_types.Callstack.Hashtbl.create 1 + | Some x -> x + in + let after = + if is_instr + then Db.Value.get_stmt_state_callstack ~after:true stmt + else None + in + if Value_types.Callstack.Hashtbl.length before > 1 + then pretty_callstack_summary ev main_ui ~before ~after v; + pretty_per_callstacks ev main_ui ~before ~after v + +(** lvalues-related functions *) type lval_or_absolute = TLVal of term | LVal of lval | AbsoluteMem @@ -35,14 +141,21 @@ type offsetmap_result = | Bottom (* Bottom memory state *) + | Top (* State or size was Top *) | InvalidLoc (* Location is always invalid *) | Offsetmap of Cvalue.V_Offsetmap.t (* Normal result *) let equal_offsetmap_result r1 r2 = match r1, r2 with | Bottom, Bottom -> true + | Top, Top -> true | InvalidLoc, InvalidLoc -> true | Offsetmap o1, Offsetmap o2 -> Cvalue.V_Offsetmap.equal o1 o2 - | (Bottom | InvalidLoc | Offsetmap _), _ -> false + | (Bottom | Top | InvalidLoc | Offsetmap _), _ -> false + +let join_offsetmap_result r1 r2 = match r1, r2 with + | Top, _ | _, Top -> Top + | (Bottom | InvalidLoc), x | x, (Bottom | InvalidLoc) -> x + | Offsetmap o1, Offsetmap o2 -> Offsetmap (Cvalue.V_Offsetmap.join o1 o2) (* Display [o] as a single value, when this is more readable and more precise than the standard display. *) @@ -62,52 +175,43 @@ begin match r with | Bottom -> Format.pp_print_string fmt "" | InvalidLoc -> Format.pp_print_string fmt "" + | Top -> Format.pp_print_string fmt "" | Offsetmap off -> let typ = match lv with | LVal lv -> Some (Cil.unrollType (typeOfLval lv)) - | TLVal tlv -> + | TLVal tlv -> Some (Cil.unrollType (Logic_utils.logicCType tlv.term_type)) | AbsoluteMem -> None in pretty_lval_or_absolute fmt lv; - Cvalue.V_Offsetmap.pretty_typ typ fmt off; + Cvalue.V_Offsetmap.pretty_generic ?typ () fmt off; match typ with | None -> () | Some typ -> pretty_stitched_offsetmap fmt typ off end -(* special [with_alarms] value that log important alarms, but allow execution - to continue *) -let log_alarms () = - let ok = ref true in - let not_ok () = ok := false in - let with_alarms = { - CilE.others = {CilE.a_ignore with CilE.a_call=not_ok}; - unspecified = {CilE.a_ignore with CilE.a_call=not_ok}; - defined_logic = CilE.a_ignore; - imprecision_tracing = CilE.a_ignore; - } in - with_alarms, ok - -let pp_eval_ok fmt ok = - if not ok then - Format.fprintf fmt " (evaluation may have failed in some cases) " - let lval_or_absolute_to_offsetmap state lv = let with_alarms, ok = log_alarms () in (* Evaluate the given location in [state]. Catch an unreachable state, an invalid location, or another error during the evaluation. *) let reduce_loc_and_eval loc = - if Cvalue.Model.is_reachable state then + if Cvalue.Model.is_top state then + Top, true + else if Cvalue.Model.is_reachable state then let loc' = Locations.valid_part ~for_writing:false loc in if Locations.is_bottom_loc loc' then - InvalidLoc, true + InvalidLoc, false else - match Cvalue.Model.copy_offsetmap ~with_alarms loc' state with - | None -> Bottom, true - | Some offsm -> + try + match Eval_op.copy_offsetmap ~with_alarms + loc'.Locations.loc (Int_Base.project loc'.Locations.size) state + with + | `Bottom -> Bottom, false + | `Top -> Top, true + | `Map offsm -> let ok = !ok && (Locations.loc_equal loc loc') in Offsetmap offsm, ok + with Int_Base.Error_Top -> Top, true else Bottom, true in @@ -117,126 +221,70 @@ let aux loc (acc_res, acc_ok) = let res, ok = reduce_loc_and_eval loc in match acc_res, res with - | Offsetmap e, r when Cvalue.V_Offsetmap.is_empty e -> - r, ok (* Hack for the initial value passed to [fold] *) | Offsetmap o1, Offsetmap o2 -> Offsetmap (Cvalue.V_Offsetmap.join o1 o2), acc_ok && ok - | (Offsetmap _ as r), _ | _, (Offsetmap _ as r)-> - r, false (* a problem occurred at least once *) - | InvalidLoc, InvalidLoc -> InvalidLoc, acc_ok && ok - | Bottom, Bottom | InvalidLoc, Bottom | Bottom, InvalidLoc -> - Bottom, acc_ok && ok (* one of the locations evaluated to valid *) + | Bottom, v | v, Bottom -> v, acc_ok && ok + | Top, Top -> Top, acc_ok && ok + | InvalidLoc, InvalidLoc -> InvalidLoc, false + | InvalidLoc, Offsetmap _ -> res, false + | Offsetmap _, InvalidLoc -> acc_res, false + | Top, (InvalidLoc | Offsetmap _ as r) + | (InvalidLoc | Offsetmap _ as r), Top -> + r, acc_ok && ok (* cannot happen, we should get Top everywhere *) in - Precise_locs.fold aux ploc (Offsetmap (Cvalue.V_Offsetmap.empty), true) + Precise_locs.fold aux ploc (Bottom, true) | TLVal tlv -> let env = Eval_terms.env_annot ~pre:Cvalue.Model.top ~here:state () in let loc = Eval_terms.eval_tlval_as_location env ~with_alarms tlv in reduce_loc_and_eval loc | AbsoluteMem -> - try Offsetmap (Cvalue.Model.find_base Base.null state), true - with Not_found -> InvalidLoc, true - -let pretty_lva_before_after (main_ui: Design.main_window) ~before ~after lva = - let pp fmt = main_ui#pretty_information fmt in - try - let offbefore, okbef = lval_or_absolute_to_offsetmap before lva in - let res_after = - if Cvalue.Model.is_reachable before then - Extlib.opt_map - (fun (after, precise_after) -> - lval_or_absolute_to_offsetmap after lva, precise_after - ) after - else None - in - match res_after with - | Some ((offafter, okafter), precise_after) - when equal_offsetmap_result offbefore offafter -> - pp "Before this statement / %s statement%a:@. %a@." - (if precise_after then "after this" else "at next") - pp_eval_ok (okbef && okafter) (pretty_offsetmap_result lva) offbefore - | Some ((offafter, okafter), precise_after) -> - pp "Before this statement%a:@. %a@." - pp_eval_ok okbef (pretty_offsetmap_result lva) offbefore; - pp "%s statement%a:@. %a@." - (if precise_after then "After this" else "At next") - pp_eval_ok okafter (pretty_offsetmap_result lva) offafter - | None -> - pp "Before this statement%a:@. %a@." - pp_eval_ok okbef (pretty_offsetmap_result lva) offbefore; - with Eval_terms.LogicEvalError ee -> - Value_parameters.debug "Cannot evaluate term (%a)" - Eval_terms.pretty_logic_evaluation_error ee -;; - -let pretty_lva_callstacks (main_ui: Design.main_window) ~cbefore ~cafter lva = - let pp fmt = main_ui#pretty_information fmt in - let aux callstack before = - let after = - Extlib.opt_map - (fun cafter -> - try Value_types.Callstack.Hashtbl.find cafter callstack, true - with Not_found -> Cvalue.Model.bottom, true - ) cafter - in - pp "@.For callstack [%a]@." Value_util.pretty_call_stack callstack; - pretty_lva_before_after main_ui ~before ~after lva - in - (* TODO: we should sort the callstacks by prefix *) - Value_types.Callstack.Hashtbl.iter aux cbefore - -(* Compute an after state by picking the pre state of the successors *) -let approximated_after_state = function - | { Cil_types.succs = (_::_ as l) } -> - List.fold_left - (fun acc s -> - let state = Db.Value.get_stmt_state s in - Cvalue.Model.join acc state - ) Cvalue.Model.bottom l - | { skind = Return _ } as s -> Db.Value.get_stmt_state s - | _ -> Cvalue.Model.bottom - - -let pretty_lva_at_stmt main_ui stmt lva = - (* Standard printing, without callstacks *) - let default () = - let before = Db.Value.get_stmt_state stmt in - let after = - match stmt.skind with - | Instr _ -> - let kf = Kernel_function.find_englobing_kf stmt in - let fundec = Kernel_function.get_definition kf in - let precise = Value_parameters.ResultsAfter.get () && - Mark_noresults.should_memorize_function fundec - in - let state = - if precise then - try Db.Value.AfterTable.find stmt - with Not_found -> Cvalue.Model.bottom - else - approximated_after_state stmt - in - Some (state, precise) - | _ -> None - in - pretty_lva_before_after main_ui ~before ~after lva - in - let cbefore = Db.Value.get_stmt_state_callstack ~after:false stmt in - let cafter = Db.Value.get_stmt_state_callstack ~after:true stmt in - match cbefore with - | Some cbefore -> - if Value_types.Callstack.Hashtbl.length cbefore > 1 then default (); - pretty_lva_callstacks main_ui ~cbefore ~cafter lva - | None -> default () - - -let pretty_formal_initial_state (main_ui: Design.main_window_extension_points) vi state = + match Cvalue.Model.find_base_or_default Base.null state with + | `Bottom -> InvalidLoc, true + | `Top -> Top, true + | `Map m -> Offsetmap m, true + +let lval_ev = + {eval_and_warn=lval_or_absolute_to_offsetmap; + equal=equal_offsetmap_result; + bottom=Bottom; + pretty=pretty_offsetmap_result; + join=join_offsetmap_result} + +let pretty_lva_at_stmt = pretty_at_stmt lval_ev + +(** Expressions-related functions *) + +let eval_exp_and_warn state e = + let with_alarms,ok = log_alarms () in + Eval_exprs.eval_expr ~with_alarms state e, + !ok + +let pretty_exp_result e fmt v = + Format.fprintf fmt + "%a @[%s %a@]" + Printer.pp_exp e + (Unicode.inset_string ()) + (Cvalue.V.pretty_typ (Some (Cil.typeOf e))) v + +let exp_ev = + {eval_and_warn=eval_exp_and_warn; + equal=Cvalue.V.equal; + bottom=Cvalue.V.bottom; + pretty=pretty_exp_result; + join=Cvalue.V.join} + +let pretty_exp_at_stmt = pretty_at_stmt exp_ev + +(** Special case for formals *) +let pretty_formal_initial_state + (main_ui: Design.main_window_extension_points) lvoa state = (* Callstack information not available yet *) - let lval = LVal (Var vi, NoOffset) in - let offsm,_ = lval_or_absolute_to_offsetmap state lval in + let offsm,_ = lval_or_absolute_to_offsetmap state lvoa in let pp fmt = main_ui#pretty_information fmt in pp "Initial value (before preconditions):@.%a@." - (pretty_offsetmap_result lval) offsm + (pretty_offsetmap_result lvoa) offsm +(** Core of the graphical interface. *) let gui_compute_values (main_ui:Design.main_window_extension_points) = if not (Db.Value.is_computed ()) @@ -250,6 +298,31 @@ let filter = Locations.Zone.filter_base accept in Extlib.opt_map filter outs +module C_labels = + State_builder.Ref(Datatype.Option(Cil_datatype.Logic_label.Map.Make(Cvalue.Model))) + (struct + let name = "GUI.c_labels" + let dependencies = [ Db.Value.Table_By_Callstack.self ] + let default () = None + end) + +let c_labels () = + match C_labels.get () with + | Some h -> h + | None -> + let h = + Db.Value.Table_By_Callstack.fold + (fun stmt _ acc -> + if stmt.labels != [] + then Cil_datatype.Logic_label.Map.add + (StmtLabel (ref stmt)) + (Db.Value.get_stmt_state stmt) acc + else acc) + Cil_datatype.Logic_label.Map.empty + in + C_labels.set (Some h); + h + (* Evaluate the user-supplied term contained in the string [txt] *) let eval_user_term main_ui kf stmt txt = Cil.CurrentLoc.set (Cil_datatype.Stmt.loc stmt); @@ -260,13 +333,7 @@ let term = !Db.Properties.Interp.expr kf stmt txt in let pre = Db.Value.get_initial_state kf in let here = Db.Value.get_stmt_state stmt in - let open Cil_datatype in - let c_labels = - Db.Value.Table.fold - (fun stmt -> Logic_label.Map.add (StmtLabel (ref stmt))) - Logic_label.Map.empty - in - let env = Eval_terms.env_annot ~c_labels ~pre ~here () + let env = Eval_terms.env_annot ~c_labels:(c_labels ()) ~pre ~here () in begin match term.term_node with | TLval _ | TStartOf _ -> @@ -274,13 +341,15 @@ | _ -> let with_alarms, ok = log_alarms () in let evaled = Eval_terms.eval_term ~with_alarms env term in - let v = List.fold_left - Cvalue.V.join Cvalue.V.bottom evaled.Eval_terms.evalue + let v = evaled.Eval_terms.eover in + let typ = match Logic_utils.unroll_type term.term_type with + | Ctype typ -> Some typ + | _ -> None in main_ui#pretty_information "Before the selected statement, all the values \ taken by the term %a are contained in %a%a@." - Printer.pp_term term Cvalue.V.pretty v pp_eval_ok (!ok) + Printer.pp_term term (Cvalue.V.pretty_typ typ) v pp_eval_ok (!ok) end with | Logic_interp.Error (_, mess) -> @@ -293,6 +362,7 @@ | e -> main_ui#error "Invalid expression: %s" (Cmdline.protect e) +let last_evaluate_acsl_request = ref "" let to_do_on_select (popup_factory:GMenu.menu GMenu.factory) @@ -300,46 +370,72 @@ = if button_nb = 1 then begin - if Db.Value.is_computed () - then begin - match selected with + if Db.Value.is_computed () then begin + try + match selected with | PStmt (kf,stmt) -> begin - (* Is it an accessible statement ? *) - if Db.Value.is_reachable_stmt stmt then begin - if Value_results.is_non_terminating_call stmt then - main_ui#pretty_information "This call never terminates@." - else - (* Out for this statement *) - let outs = cleant_outputs kf stmt in - match outs with + if results_kf_computed kf then begin + (* Is it an accessible statement ? *) + if Db.Value.is_reachable_stmt stmt then begin + if Value_results.is_non_terminating_instr stmt then + match stmt.skind with + | Instr (Call (_lvopt, _, _, _)) -> + (* This is not 100% accurate: the instr can also fail + when storing the result in [lvopt] *) + main_ui#pretty_information "This call never terminates.@." + | Instr _ -> + main_ui#pretty_information "This instruction always fail.@." + | _ -> () + else + (* Out for this statement *) + let outs = cleant_outputs kf stmt in + match outs with | Some outs -> - main_ui#pretty_information - "Modifies @[%a@]@." Db.Outputs.pretty outs + main_ui#pretty_information + "Modifies @[%a@]@." Db.Outputs.pretty outs | _ -> () + end + else main_ui#pretty_information "This code is dead@."; end - else main_ui#pretty_information "This code is dead@."; end | PLval (_kf, Kstmt stmt,lv) -> if Db.Value.is_reachable_stmt stmt && not (isFunctionType (typeOfLval lv)) then pretty_lva_at_stmt main_ui stmt (LVal lv) + | PExp (_kf, Kstmt stmt,e) -> + if Db.Value.is_reachable_stmt stmt + then + pretty_exp_at_stmt main_ui stmt e | PTermLval (_kf, Kstmt stmt, tlv) -> if Db.Value.is_reachable_stmt stmt then let ltyp = Cil.typeOfTermLval tlv in let term = Logic_const.term (TLval tlv) ltyp in pretty_lva_at_stmt main_ui stmt (TLVal term) + | PTermLval (Some kf, Kglobal, tlv) -> + let state = Db.Value.get_initial_state kf in + if Cvalue.Model.is_reachable state then + let ltyp = Cil.typeOfTermLval tlv in + let term = Logic_const.term (TLval tlv) ltyp in + let lvoa = TLVal term in + pretty_formal_initial_state main_ui lvoa state | PVDecl (Some kf, vi) when vi.vformal -> let state = Db.Value.get_initial_state kf in if Cvalue.Model.is_reachable state then - pretty_formal_initial_state main_ui vi state - | PLval (_, Kglobal, _) | PTermLval (_, Kglobal, _) -> () + let lvoa = LVal (Var vi, NoOffset) in + pretty_formal_initial_state main_ui lvoa state + | PExp (_,Kglobal,_)| PLval (_, Kglobal, _) + | PTermLval (None, Kglobal, _)-> () | PVDecl (_kf,_vi) -> () | PGlobal _ | PIP _ -> () - end + with + | Eval_terms.LogicEvalError ee -> + main_ui#pretty_information "Cannot evaluate term: %a@." + Eval_terms.pretty_logic_evaluation_error ee + end end else if button_nb = 3 then begin - match selected with + match selected with | PVDecl (_,vi) -> begin try @@ -386,18 +482,21 @@ end | PStmt (kf,stmt) -> - if Db.Value.is_computed () + if Db.Value.is_computed () && results_kf_computed kf then let eval_expr () = let txt = GToolbox.input_string ~title:"Evaluate" + ~text:!last_evaluate_acsl_request " Enter an ACSL expression to evaluate " (* the spaces at beginning and end should not be necessary but are the quickest fix for an aesthetic GTK problem *) in match txt with | None -> () - | Some txt -> eval_user_term main_ui kf stmt txt + | Some txt -> + last_evaluate_acsl_request:=txt; + eval_user_term main_ui kf stmt txt in begin try @@ -455,6 +554,7 @@ | _ -> () ) end + | PExp _ -> () (* No C function only in exp *) | PTermLval _ -> () (* No C function calls in logic *) | PGlobal _ -> () | PIP _ -> () @@ -496,14 +596,14 @@ (fun kf -> try let vi = Kernel_function.get_vi kf in - let strikethrough = - Db.Value.is_computed () && not (!Db.Value.is_called kf) - in + let strikethrough = + Db.Value.is_computed () && not (!Db.Value.is_called kf) + in filetree#set_global_attribute ~strikethrough vi with Not_found -> ()); Globals.Vars.iter (fun vi _ -> - if vi.vlogic = false then + if vi.vsource = true then filetree#set_global_attribute ~strikethrough:(Db.Value.is_computed () && not (used_var vi)) vi @@ -555,13 +655,13 @@ GButton.button ~label:"Run" ~packing:(box#pack) () in let w = - GPack.table ~packing:(box#pack ~expand:true ~fill:true) ~columns:2 () + GPack.table ~packing:(box#pack ~expand:true ~fill:true) ~columns:2 () in let box_1_1 = GPack.hbox ~packing:(w#attach ~left:1 ~top:1) () in - let slevel_refresh = - let tooltip = + let slevel_refresh = + let tooltip = Pretty_utils.sfprintf "%s" - Value_parameters.SemanticUnrollingLevel.parameter.Typed_parameter.help + Value_parameters.SemanticUnrollingLevel.parameter.Typed_parameter.help in Gtk_helper.on_int ~lower:0 ~upper:1000000 ~tooltip box_1_1 @@ -570,10 +670,15 @@ Value_parameters.SemanticUnrollingLevel.set in let box_1_2 = GPack.hbox ~packing:(w#attach ~left:1 ~top:2) () in + let validator s = + not + (Kernel_function.Set.is_empty + (Parameter_customize.get_c_ified_functions s)) + in let main_refresh = Gtk_helper.on_string ~tooltip:(Pretty_utils.sfprintf "%s" - Kernel.MainFunction.parameter.Typed_parameter.help) - ~validator:(fun s->List.mem s (Kernel.MainFunction.get_possible_values ())) + Kernel.MainFunction.parameter.Typed_parameter.help) + ~validator box_1_2 "main" Kernel.MainFunction.get @@ -582,14 +687,13 @@ let refresh () = slevel_refresh (); main_refresh() in - ignore (run_button#connect#pressed - (fun () -> + ignore (run_button#connect#pressed + (fun () -> main_ui#protect ~cancelable:true (fun () -> refresh (); !Db.Value.compute (); main_ui#reset ()); )); "Value", box#coerce, Some refresh - let main (main_ui:Design.main_window_extension_points) = (* Hide unused functions and variables. Must be registered only once *) let hide, _filter_menu = @@ -598,15 +702,12 @@ ~key:"value_hide_unused" hide_unused_function_or_var in hide_unused := hide; - main_ui#file_tree#register_reset_extension sync_filetree; - (* Very first display, we need to do a few things by hand *) if !hide_unused () then main_ui#file_tree#reset () else sync_filetree main_ui#file_tree; - let value_selector menu (main_ui:Design.main_window_extension_points) ~button localizable = to_do_on_select @@ -616,53 +717,47 @@ localizable in main_ui#register_source_selector value_selector; - let highlighter (buffer:GSourceView2.source_buffer) localizable ~start ~stop = (* highlight dead code areas, non-terminating calls, and degeneration points if Value has run.*) - if Db.Value.is_computed () && - (match localizable with PStmt _ -> true | _ -> false) - then - let ki = ki_of_localizable localizable in - let degenerate = match ki with - | Kglobal -> None - | Kstmt s -> + if Db.Value.is_computed () then + match localizable with + | PStmt (kf, stmt) -> begin + let degenerate = try Some ( - if Value_util.DegenerationPoints.find s + if Value_util.DegenerationPoints.find stmt then (make_tag buffer ~name:"degeneration" [`BACKGROUND "orange"]) else (make_tag buffer ~name:"unpropagated" [`BACKGROUND "yellow"]) ) with Not_found -> None - in - match degenerate with + in + match degenerate with | Some color_area -> apply_tag buffer color_area start stop | None -> - if Db.Value.is_accessible ki then - match ki with - | Kstmt stmt when Value_results.is_non_terminating_call stmt -> - let non_terminating = - Gtk_helper.make_tag - buffer ~name:"value_non_terminating" - [`BACKGROUND "tomato"] + if results_kf_computed kf then begin + if Db.Value.is_reachable_stmt stmt then begin + if Value_results.is_non_terminating_instr stmt then + let non_terminating = + Gtk_helper.make_tag + buffer ~name:"value_non_terminating" + [`BACKGROUND "tomato"] + in + apply_tag buffer non_terminating (stop-1) stop + end + else + let dead_code_area = + make_tag buffer "deadcode" [`BACKGROUND "tomato";`STYLE `ITALIC] in - apply_tag buffer non_terminating (stop-1) stop - | _ -> () - else - let dead_code_area = - make_tag - buffer - "deadcode" - [`BACKGROUND "tomato"; - `STYLE `ITALIC;] - in - apply_tag buffer dead_code_area start stop - + apply_tag buffer dead_code_area start stop + end + end + | _ -> () in main_ui#register_source_highlighter highlighter; main_ui#register_panel value_panel - + let () = Design.register_extension main ;; diff -Nru frama-c-20140301+neon+dfsg/src/value/register_gui.mli frama-c-20150201+sodium+dfsg/src/value/register_gui.mli --- frama-c-20140301+neon+dfsg/src/value/register_gui.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/register_gui.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/register.ml frama-c-20150201+sodium+dfsg/src/value/register.ml --- frama-c-20140301+neon+dfsg/src/value/register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/register.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -31,7 +31,7 @@ let filter_generated_and_locals base = match base with | Base.Var (v, _) -> - if v.vgenerated then v.vname = "__retres" + if v.vtemp then v.vname = "__retres" else ((not (Kernel_function.is_local v kf)) (* only locals of outermost block *) @@ -101,51 +101,53 @@ Extlib.opt_conv Zone.bottom deps, r let lval_to_loc_with_deps kinstr ~with_alarms ~deps lv = - CilE.start_stmt kinstr; + Valarms.start_stmt kinstr; let state = Db.Value.noassert_get_state kinstr in let result = lval_to_loc_with_deps_state ~with_alarms state ~deps lv in - CilE.end_stmt (); + Valarms.end_stmt (); result let lval_to_loc_kinstr kinstr ~with_alarms lv = - CilE.start_stmt kinstr; + Valarms.start_stmt kinstr; let state = Db.Value.noassert_get_state kinstr in let r = lval_to_loc ~with_alarms state lv in - CilE.end_stmt (); + Valarms.end_stmt (); r -let lval_to_precise_loc_with_deps_state ~with_alarms state ~deps lv = - let _state, deps, r, _ = +let lval_to_precise_loc_with_deps_state_alarm ~with_alarms state ~deps lv = + let _state, deps, ploc, _ = lval_to_precise_loc_deps_state ~with_alarms ~deps ~reduce_valid_index:(Kernel.SafeArrays.get ()) state lv in - Extlib.opt_conv Zone.bottom deps, r + let deps = Extlib.opt_conv Zone.bottom deps in + deps, ploc +let lval_to_precise_loc_with_deps_state = + lval_to_precise_loc_with_deps_state_alarm ~with_alarms:CilE.warn_none_mode let lval_to_zone kinstr ~with_alarms lv = - CilE.start_stmt kinstr; + Valarms.start_stmt kinstr; let state = Db.Value.noassert_get_state kinstr in let _, r = - lval_to_precise_loc_with_deps_state ~with_alarms state ~deps:None lv + lval_to_precise_loc_with_deps_state_alarm ~with_alarms state ~deps:None lv in - CilE.end_stmt (); + Valarms.end_stmt (); Precise_locs.enumerate_valid_bits ~for_writing:false r let lval_to_zone_state state lv = - let _, r = - lval_to_precise_loc_with_deps_state ~with_alarms:CilE.warn_none_mode - state ~deps:None lv - in + let _, r = lval_to_precise_loc_with_deps_state state ~deps:None lv in Precise_locs.enumerate_valid_bits ~for_writing:false r let lval_to_zone_with_deps_state state ~for_writing ~deps lv = - let deps, r = - lval_to_precise_loc_with_deps_state ~with_alarms:CilE.warn_none_mode - state ~deps lv + let deps, r = lval_to_precise_loc_with_deps_state state ~deps lv in + let r = (* No write effect if [lv] is const *) + if for_writing && (Value_util.is_const_write_invalid (Cil.typeOfLval lv)) + then Precise_locs.loc_bottom + else r in let zone = Precise_locs.enumerate_valid_bits ~for_writing r in - let exact = Precise_locs.cardinal_zero_or_one ~for_writing r in + let exact = Precise_locs.valid_cardinal_zero_or_one ~for_writing r in deps, zone, exact @@ -154,13 +156,13 @@ Extlib.opt_conv Zone.bottom deps, r let expr_to_kernel_function kinstr ~with_alarms ~deps exp = - CilE.start_stmt kinstr; + Valarms.start_stmt kinstr; let state = Db.Value.noassert_get_state kinstr in (* Format.printf "STATE IS %a@\n" Cvalue.Model.pretty state;*) let r = expr_to_kernel_function_state ~with_alarms state ~deps exp in - CilE.end_stmt (); + Valarms.end_stmt (); r let expr_to_kernel_function_state = @@ -171,7 +173,7 @@ then Eval_terms.pretty_logic_evaluation_error fmt e let assigns_inputs_to_zone state assigns = - let env = Eval_terms.env_pre_f ~init:state () in + let env = Eval_terms.env_pre_f ~pre:state () in let treat_asgn acc (_,ins as asgn) = match ins with | FromAny -> Zone.top @@ -228,25 +230,26 @@ ~join:(fun v l -> v :: l) +let lval_to_offsetmap_aux ~with_alarms state lv = + let loc = + Locations.valid_part ~for_writing:false (lval_to_loc ~with_alarms state lv) + in + match loc.size with + | Int_Base.Top -> None + | Int_Base.Value size -> + match snd (Cvalue.Model.copy_offsetmap loc.loc size state) with + | `Top | `Bottom -> None + | `Map m -> Some m + let lval_to_offsetmap kinstr lv ~with_alarms = - CilE.start_stmt kinstr; + Valarms.start_stmt kinstr; let state = Db.Value.noassert_get_state kinstr in - let loc = Locations.valid_part ~for_writing:false - (lval_to_loc ~with_alarms state lv) - in - let offsetmap = - Cvalue.Model.copy_offsetmap ~with_alarms loc state - in - CilE.end_stmt (); - offsetmap + let r = lval_to_offsetmap_aux ~with_alarms state lv in + Valarms.end_stmt (); + r let lval_to_offsetmap_state state lv = - let with_alarms = CilE.warn_none_mode in - let loc = - Locations.valid_part ~for_writing:false - (lval_to_loc ~with_alarms state lv) - in - Cvalue.Model.copy_offsetmap ~with_alarms loc state + lval_to_offsetmap_aux ~with_alarms:CilE.warn_none_mode state lv (* "access" functions before evaluation, registered in Db.Value *) @@ -264,7 +267,7 @@ let find_deps_term_no_transitivity_state state t = try - let env = Eval_terms.env_here state in + let env = Eval_terms.env_only_here state in let r = Eval_terms.eval_term ~with_alarms:CilE.warn_none_mode env t in r.Eval_terms.ldeps with Eval_terms.LogicEvalError _ -> @@ -275,10 +278,9 @@ \assigns and \from clauses, that give an approximation of the result *) let use_spec_instead_of_definition kf = not (Kernel_function.is_definition kf) || - (let name = Kernel_function.get_name kf in - Builtins.overridden_by_builtin name || - Datatype.String.Set.mem name (Value_parameters.UsePrototype.get ()) - ) + Ast_info.is_frama_c_builtin (Kernel_function.get_name kf) || + Builtins.overridden_by_builtin kf || + Kernel_function.Set.mem kf (Value_parameters.UsePrototype.get ()) let eval_predicate ~pre ~here p = let open Eval_terms in @@ -302,6 +304,8 @@ Db.Value.lval_to_zone_state := lval_to_zone_state; Db.Value.lval_to_zone := lval_to_zone; Db.Value.lval_to_zone_with_deps_state := lval_to_zone_with_deps_state; + Db.Value.lval_to_precise_loc_with_deps_state := + lval_to_precise_loc_with_deps_state; Db.Value.lval_to_offsetmap := lval_to_offsetmap; Db.Value.lval_to_offsetmap_state := lval_to_offsetmap_state; Db.Value.assigns_outputs_to_zone := assigns_outputs_to_zone; @@ -314,9 +318,7 @@ s,v); Db.Value.eval_lval := (fun ~with_alarms deps state lval -> - let _, deps, r, _ = - eval_lval ~conflate_bottom:true ~with_alarms deps state lval - in + let _, deps, r, _ = eval_lval ~with_alarms deps state lval in deps, r); Db.Value.access := access_value_of_lval; Db.Value.access_location := access_value_of_location; diff -Nru frama-c-20140301+neon+dfsg/src/value/separate.ml frama-c-20150201+sodium+dfsg/src/value/separate.ml --- frama-c-20140301+neon+dfsg/src/value/separate.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/separate.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/separate.mli frama-c-20150201+sodium+dfsg/src/value/separate.mli --- frama-c-20140301+neon+dfsg/src/value/separate.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/separate.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/split_return.ml frama-c-20150201+sodium+dfsg/src/value/split_return.ml --- frama-c-20140301+neon+dfsg/src/value/split_return.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/split_return.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -36,7 +36,7 @@ type return_usage_by_lv = { ret_callees: Kernel_function.Hptset.t (* all the functions that put their results in this lvalue *); - ret_compared: Datatype.Big_int.Set.t (* all the constant values this + ret_compared: Datatype.Integer.Set.t (* all the constant values this lvalue is compared against *); } (* Per-function usage: all interesting lvalues are mapped to the way @@ -44,15 +44,15 @@ and return_usage_per_fun = return_usage_by_lv MapLval.t (* Per-program usage. Lvalues are no longer used, functions are mapped to the values their return code is compared against *) - and return_usage = Datatype.Big_int.Set.t Kernel_function.Map.t + and return_usage = Datatype.Integer.Set.t Kernel_function.Map.t - module RUDatatype = Kernel_function.Map.Make(Datatype.Big_int.Set) + module RUDatatype = Kernel_function.Map.Make(Datatype.Integer.Set) let find_or_default uf lv = try MapLval.find lv uf with Not_found -> { ret_callees = Kernel_function.Hptset.empty; - ret_compared = Datatype.Big_int.Set.empty; + ret_compared = Datatype.Integer.Set.empty; } (* Treat a [Call] instruction. Immediate calls (no functions pointers) @@ -60,7 +60,7 @@ let add_call (uf: return_usage_per_fun) lv_opt e_fun = match e_fun.enode, lv_opt with | Lval (Var vi, NoOffset), Some lv - when Cil.isIntegralType (Cil.typeOfLval lv) -> + when Cil.isIntegralOrPointerType (Cil.typeOfLval lv) -> let kf = Globals.Functions.get vi in let u = find_or_default uf lv in let funs = Kernel_function.Hptset.add kf u.ret_callees in @@ -75,7 +75,8 @@ let add_alias (uf: return_usage_per_fun) lv_dest e = match e.enode with | CastE (typ, { enode = Lval lve }) - when Cil.isIntegralType typ && Cil.isIntegralType (Cil.typeOfLval lve) + when Cil.isIntegralOrPointerType typ && + Cil.isIntegralOrPointerType (Cil.typeOfLval lve) -> let u = find_or_default uf lve in MapLval.add lv_dest u uf @@ -83,9 +84,9 @@ (* add a comparison with the integer [i] to the lvalue [lv] *) let add_compare_ct uf i lv = - if Cil.isIntegralType (Cil.typeOfLval lv) then + if Cil.isIntegralOrPointerType (Cil.typeOfLval lv) then let u = find_or_default uf lv in - let v = Datatype.Big_int.Set.add i u.ret_compared in + let v = Datatype.Integer.Set.add i u.ret_compared in let u = { u with ret_compared = v } in if debug then Format.printf "[Usage] Comparing %a to %a@." Printer.pp_lval lv Int.pretty i; @@ -99,8 +100,8 @@ let add_compare (uf: return_usage_per_fun) cond = (* if [ct] is an integer constant, memoize it is compared to [lv] *) let add ct lv = - (match (Cil.constFold true ct).enode with - | Const (CInt64 (i, _, _)) -> add_compare_ct uf i lv + (match Cil.constFoldToInt ct with + | Some i -> add_compare_ct uf i lv | _ -> uf) in match cond.enode with @@ -109,15 +110,17 @@ | BinOp ((Eq | Ne), {enode = CastE (typ, {enode = Lval lv})}, ct, _) | BinOp ((Eq | Ne), ct, {enode = CastE (typ, {enode = Lval lv})}, _) - when Cil.isIntegralType typ && Cil.isIntegralType (Cil.typeOfLval lv) -> - add ct lv + when Cil.isIntegralOrPointerType typ && + Cil.isIntegralOrPointerType (Cil.typeOfLval lv) -> + add ct lv | UnOp (LNot, {enode = Lval lv}, _) -> add_compare_ct uf Int.zero lv | UnOp (LNot, {enode = CastE (typ, {enode = Lval lv})}, _) - when Cil.isIntegralType typ && Cil.isIntegralType (Cil.typeOfLval lv) -> - add_compare_ct uf Int.zero lv + when Cil.isIntegralOrPointerType typ && + Cil.isIntegralOrPointerType (Cil.typeOfLval lv) -> + add_compare_ct uf Int.zero lv | _ -> uf @@ -132,7 +135,8 @@ add_compare_ct uf Int.zero lv | CastE (typ, {enode = Lval lv}) - when Cil.isIntegralType typ && Cil.isIntegralType (Cil.typeOfLval lv) -> + when Cil.isIntegralOrPointerType typ && + Cil.isIntegralOrPointerType (Cil.typeOfLval lv) -> add_compare_ct uf Int.zero lv | BinOp ((LAnd | LOr), e1, e2, _) -> @@ -146,14 +150,14 @@ are tested against *) let summarize (uf: return_usage_per_fun) = let aux _lv u acc = - if Datatype.Big_int.Set.is_empty u.ret_compared then acc + if Datatype.Integer.Set.is_empty u.ret_compared then acc else let aux' kf (acc:return_usage) : return_usage = let cur = try Kernel_function.Map.find kf acc - with Not_found -> Datatype.Big_int.Set.empty + with Not_found -> Datatype.Integer.Set.empty in - let s = Datatype.Big_int.Set.union cur u.ret_compared in + let s = Datatype.Integer.Set.union cur u.ret_compared in Kernel_function.Map.add kf s acc in Kernel_function.Hptset.fold aux' u.ret_callees acc @@ -198,20 +202,8 @@ Visitor.visitFramacFileSameGlobals (vis:> Visitor.frama_c_visitor) file; vis#result () - let pretty_usage fmt u = - let pp_set = - Pretty_utils.pp_iter ~sep:",@ " Datatype.Big_int.Set.iter Int.pretty in - let pp kf s = - Format.fprintf fmt "@[\\return(%a) == %a@]@ " - Kernel_function.pretty kf pp_set s - in - Format.fprintf fmt "@["; - Kernel_function.Map.iter pp u; - Format.fprintf fmt "@]" - end - module AutoStrategy = State_builder.Option_ref (ReturnUsage.RUDatatype) (struct @@ -227,33 +219,29 @@ let name = "Value.Split_return.Kfstrategy" end) +(* Inference (and saving) of strategies when -split-return-auto is set *) +let auto_strategy () = + match AutoStrategy.get_option () with + | None -> + let v = + if Value_parameters.SplitReturnAuto.get () + then ReturnUsage.compute (Ast.get ()) + else Kernel_function.Map.empty + in + AutoStrategy.set v; + v + | Some v -> v let strategy = KfStrategy.memo (fun kf -> - let name = Kernel_function.get_name kf in - try - Value_parameters.SplitReturnFunction.find name + (* User strategies take precedence *) + try Value_parameters.SplitReturnFunction.find kf with Not_found -> - let auto = - match AutoStrategy.get_option () with - | None -> - let v = - if Value_parameters.SplitReturnAuto.get () then - let ast = Ast.get () in - let v = ReturnUsage.compute ast in - Value_parameters.result "Splitting return states on:@.%a" - ReturnUsage.pretty_usage v; - v - else Kernel_function.Map.empty - in - AutoStrategy.set v; - v - | Some v -> v - in + let auto = auto_strategy () in try let set = Kernel_function.Map.find kf auto in - let li = Datatype.Big_int.Set.fold (fun i acc -> i :: acc) set [] in + let li = Datatype.Integer.Set.fold (fun i acc -> i :: acc) set [] in Split_strategy.SplitEqList li with Not_found -> Split_strategy.NoSplit) @@ -268,7 +256,7 @@ let (eq, neq, mess) = List.fold_left (fun (eq, neq, mess) state -> if Model.is_reachable state then - let v' = Model.find ~with_alarms ~conflate_bottom:false state loc in + let _, v' = Model.find state loc in (*Format.printf "## vi %a, v %a@." V.pretty v_i V.pretty v'; *) if V.equal v_i v' then (Model.join state eq, neq, mess) @@ -306,7 +294,7 @@ match return_lv with | None -> default states | Some (Var v, NoOffset as lv) -> - if Cil.isIntegralType v.vtype then + if Cil.isIntegralOrPointerType v.vtype then split_eq_multiple kf lv i states else default states @@ -318,6 +306,36 @@ | Split_strategy.FullSplit -> State_set.to_list states +let pretty_strategies fmt = + Format.fprintf fmt "@["; + let pp_set = + Pretty_utils.pp_iter ~sep:",@ " Datatype.Integer.Set.iter Int.pretty in + let pp_list = Pretty_utils.pp_list ~sep:",@ " Int.pretty in + let pp_user (kf, strategy) = + match strategy with + | Some (Split_strategy.NoSplit) | None -> () + | Some (Split_strategy.SplitEqList l) -> + Format.fprintf fmt "@[\\return(%a) == %a (user)@]@ " + Kernel_function.pretty kf pp_list l + | Some Split_strategy.FullSplit -> + Format.fprintf fmt "@[\\full_split(%a) (user)@]@ " + Kernel_function.pretty kf + in + Value_parameters.SplitReturnFunction.iter pp_user; + let pp_auto kf s = + if not (Value_parameters.SplitReturnFunction.mem kf) then + Format.fprintf fmt "@[\\return(%a) == %a (auto)@]@ " + Kernel_function.pretty kf pp_set s + in + Kernel_function.Map.iter pp_auto (auto_strategy ()); + Format.fprintf fmt "@]" + +let pretty_strategies () = + if not (Value_parameters.SplitReturnFunction.is_empty ()) || + Value_parameters.SplitReturnAuto.is_set () + then + Value_parameters.result "Splitting return states on:@.%t" pretty_strategies + (* diff -Nru frama-c-20140301+neon+dfsg/src/value/split_return.mli frama-c-20150201+sodium+dfsg/src/value/split_return.mli --- frama-c-20140301+neon+dfsg/src/value/split_return.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/split_return.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -31,6 +31,7 @@ State_set.t -> Cvalue.Model.t list +val pretty_strategies: unit -> unit (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/value/split_strategy.ml frama-c-20150201+sodium+dfsg/src/value/split_strategy.ml --- frama-c-20140301+neon+dfsg/src/value/split_strategy.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/split_strategy.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -24,7 +24,7 @@ type split_strategy = | NoSplit - | SplitEqList of Datatype.Big_int.t list + | SplitEqList of Datatype.Integer.t list | FullSplit (* To be completed with more involved strategies *) @@ -58,7 +58,7 @@ | FullSplit -> Format.pp_print_string fmt "full split" | SplitEqList l -> Format.fprintf fmt "Split on \\result == %a" - (Pretty_utils.pp_list ~sep:",@ " Datatype.Big_int.pretty) l + (Pretty_utils.pp_list ~sep:",@ " Datatype.Integer.pretty) l let varname _ = "v" let mem_project = Datatype.never_any_project end) diff -Nru frama-c-20140301+neon+dfsg/src/value/split_strategy.mli frama-c-20150201+sodium+dfsg/src/value/split_strategy.mli --- frama-c-20140301+neon+dfsg/src/value/split_strategy.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/split_strategy.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -22,7 +22,7 @@ type split_strategy = | NoSplit - | SplitEqList of Datatype.Big_int.t list + | SplitEqList of Datatype.Integer.t list | FullSplit include Datatype.S_with_collections with type t = split_strategy diff -Nru frama-c-20140301+neon+dfsg/src/value/state_imp.ml frama-c-20150201+sodium+dfsg/src/value/state_imp.ml --- frama-c-20140301+neon+dfsg/src/value/state_imp.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/state_imp.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/state_imp.mli frama-c-20150201+sodium+dfsg/src/value/state_imp.mli --- frama-c-20140301+neon+dfsg/src/value/state_imp.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/state_imp.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/state_set.ml frama-c-20150201+sodium+dfsg/src/value/state_set.ml --- frama-c-20140301+neon+dfsg/src/value/state_set.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/state_set.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/state_set.mli frama-c-20150201+sodium+dfsg/src/value/state_set.mli --- frama-c-20140301+neon+dfsg/src/value/state_set.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/state_set.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/stop_at_nth.ml frama-c-20150201+sodium+dfsg/src/value/stop_at_nth.ml --- frama-c-20140301+neon+dfsg/src/value/stop_at_nth.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/stop_at_nth.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/stop_at_nth.mli frama-c-20150201+sodium+dfsg/src/value/stop_at_nth.mli --- frama-c-20140301+neon+dfsg/src/value/stop_at_nth.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/stop_at_nth.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/valarms.ml frama-c-20150201+sodium+dfsg/src/value/valarms.ml --- frama-c-20140301+neon+dfsg/src/value/valarms.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/valarms.ml 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,471 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) + +open Cil_types +open CilE + +type syntactic_context = + | SyNone + | SyCallResult + | SyBinOp of Cil_types.exp * Cil_types.binop * Cil_types.exp * Cil_types.exp + | SyUnOp of Cil_types.exp + | SyMem of Cil_types.lval + | SyMemLogic of Cil_types.term + | SySep of Cil_types.lval * Cil_types.lval + +(* Printer that shows additional information about temporaries *) +let local_printer: Printer.extensible_printer = object (self) + inherit Printer.extensible_printer () as super + + (* Temporary variables for which we want to print more information *) + val mutable temporaries = Cil_datatype.Varinfo.Set.empty + + method! code_annotation fmt ca = + temporaries <- Cil_datatype.Varinfo.Set.empty; + match ca.annot_content with + | AAssert(_, p) -> + (* ignore the ACSL name *) + Format.fprintf fmt "@[@[assert@ %a;@]" self#predicate p.content; + (* print temporary variables information *) + if not (Cil_datatype.Varinfo.Set.is_empty temporaries) then begin + Format.fprintf fmt "@ @[(%t)@]" self#pp_temporaries + end; + Format.fprintf fmt "@]"; + | _ -> assert false + + method private pp_temporaries fmt = + let pp_var fmt vi = + Format.fprintf fmt "%s from@ @[%s@]" vi.vname (Extlib.the vi.vdescr) + in + Pretty_utils.pp_iter Cil_datatype.Varinfo.Set.iter + ~pre:"" ~suf:"" ~sep:",@ " pp_var fmt temporaries + + method! logic_var fmt lvi = + (match lvi.lv_origin with + | None | Some { vdescr = None }-> () + | Some ({ vdescr = Some _ } as vi) -> + temporaries <- Cil_datatype.Varinfo.Set.add vi temporaries + ); + super#logic_var fmt lvi +end + +let current_stmt_tbl = + let s = Stack.create () in + Stack.push Kglobal s; + s + +let start_stmt ki = Stack.push ki current_stmt_tbl + +let end_stmt () = + try ignore (Stack.pop current_stmt_tbl) + with Stack.Empty -> assert false + +let current_stmt () = + try Stack.top current_stmt_tbl + with Stack.Empty -> assert false + +let syntactic_context = ref SyNone +let set_syntactic_context e = + syntactic_context := e + +let get_syntactic_context () = current_stmt (),!syntactic_context + +let sc_kinstr_loc ki = + match ki with + | Kglobal -> (* can occur in case of obscure bugs (already happended) + with wacky initializers. Module Initial_state of + value analysis correctly positions the loc *) + assert (Cil_datatype.Kinstr.equal Kglobal + (fst (get_syntactic_context ()))); + Cil.CurrentLoc.get () + | Kstmt s -> Cil_datatype.Stmt.loc s + +let do_warn {a_log=log;a_call=call} f = + Extlib.may f log; + call () + +let register_alarm ?kf ?(status=Property_status.Dont_know) e ki a = + Value_messages.new_alarm ki a status; + Alarms.register ~loc:(sc_kinstr_loc ki) ?kf ~status e ki a + +let warn_pointer_comparison warn_mode = + do_warn warn_mode.defined_logic + (fun (emitter, suffix) -> + let aux ki e1 e2 = + let annot, is_new = + register_alarm emitter ki (Alarms.Pointer_comparison (e1, e2)) + in + if is_new then + Kernel.warning ~current:true + "@[pointer comparison:@ %a@]%t" + local_printer#code_annotation annot suffix; + in + match get_syntactic_context () with + | _,SyNone -> () + | _,(SyMem _ | SyMemLogic _ | SySep _ | SyCallResult) -> + assert false + | ki, SyUnOp e -> aux ki None e + | ki, SyBinOp (_, (Eq|Ne|Ge|Le|Gt|Lt), e1, e2) -> aux ki (Some e1) e2 + | _, SyBinOp _ -> + assert false) + +(* warn for division by 0. If [addresses] holds, also emit an alarm about the + denominator not being comparable to \null. This is somewhat a hack, made + mandatory because in the logic we are able to prove [&x + 2 != 0], with [x] + having a non-array type. If we give a True status to such an assertion, + no alarm remains for e.g. [1/((int)(&x +2))] .) *) +let warn_div warn_mode ~addresses = + if addresses then begin + (* Warn for the denominator not being comparable to Null *) + do_warn warn_mode.defined_logic + (fun _ -> + match get_syntactic_context () with + | _,SyNone -> () + | _,(SyUnOp _ | SyMem _ | SyMemLogic _ | SySep _ | SyCallResult) -> + assert false + | _, (SyBinOp (_, (Div|Mod), _, e) as old_sc) -> + (* Extract the relevant part of the syntactic context *) + set_syntactic_context (SyUnOp e); + warn_pointer_comparison warn_mode; + (* Restore it for the 'denominator-non-null' alarm below. *) + set_syntactic_context old_sc + |_, SyBinOp _ -> assert false + ) + end; + (* Warn for a null denominator *) + do_warn warn_mode.others + (fun (emitter, suffix) -> + match get_syntactic_context () with + | _,SyNone -> () + | _,(SyUnOp _ | SyMem _ | SyMemLogic _ | SySep _ | SyCallResult) -> + assert false + | ki, (SyBinOp (_, (Div|Mod), _, e)) -> + let annot, is_new = + register_alarm emitter ki (Alarms.Division_by_zero e) + in + if is_new then + Kernel.warning ~current:true + "@[division by zero:@ %a@]%t" + local_printer#code_annotation annot suffix; + |_, SyBinOp _ -> assert false) + +(** Auxiliary function that displays two simultaneous alarms as a conjunction *) +let warn_conjuctive_annots warn annot1 annot2 = + match annot1, annot2 with + | Some annot, None | None, Some annot -> warn annot + | Some { annot_content = AAssert(_, pmn) }, + Some { annot_content = AAssert(_, pmx) } + -> + let p = Logic_const.pand (pmn, pmx) in + let annot = Logic_const.new_code_annotation (AAssert([], p)) in + warn annot + | _, _ -> () + +let warn_integer_overflow warn_mode ~signed ~min:mn ~max:mx = + do_warn warn_mode.others + (fun (emitter, suffix) -> + match get_syntactic_context () with + | ki, (SyUnOp e | SyBinOp(e, _, _, _)) -> + let warn annot = + Kernel.warning ~current:true + "@[%s overflow.@ %a@]%t" + (if signed then "signed" else "unsigned") + local_printer#code_annotation annot suffix + in + let signed lower bound = + Extlib.may_map ~dft:None + (fun n -> + let kind = if signed then Alarms.Signed else Alarms.Unsigned in + let annot, is_new = + register_alarm emitter ki + (Alarms.Overflow(kind, e, n, lower)) + in + if is_new then Some annot else None) + bound + in + warn_conjuctive_annots + warn + (signed Alarms.Lower_bound mn) + (signed Alarms.Upper_bound mx) + | _ -> assert false) + +let warn_float_to_int_overflow warn_mode mn mx msg = + do_warn warn_mode.others + (fun (emitter, suffix) -> + match get_syntactic_context () with + | ki, SyUnOp e -> + let warn annot = + Kernel.warning ~current:true + "@[overflow@ in conversion@ of %t@ from@ floating-point@ \ + to integer.@ %a@]%t" msg + local_printer#code_annotation annot suffix + in + let aux lower bound = + Extlib.may_map ~dft:None + (fun n -> + let annot, is_new = + register_alarm emitter ki (Alarms.Float_to_int(e, n, lower)) + in + if is_new then Some annot else None + ) + bound + in + warn_conjuctive_annots + warn + (aux Alarms.Lower_bound mn) + (aux Alarms.Upper_bound mx) + | _ -> assert false) + +let warn_shift warn_mode size = + do_warn warn_mode.others + (fun (emitter, suffix) -> + match get_syntactic_context () with + | _,SyNone -> () + | _,(SyUnOp _ | SyMem _ | SyMemLogic _ | SySep _ | SyCallResult) -> + assert false + | ki,SyBinOp (_, (Shiftrt | Shiftlt),_,exp_d) -> + let annot, is_new = + register_alarm emitter ki (Alarms.Invalid_shift(exp_d, Some size)) + in + if is_new then + Kernel.warning ~current:true + "@[invalid RHS operand for shift.@ %a@]%t" + local_printer#code_annotation annot suffix; + | _, SyBinOp _ -> + assert false) + +let warn_shift_left_positive warn_mode = + do_warn warn_mode.others + (fun (emitter, suffix) -> + match get_syntactic_context () with + | _,SyNone -> () + | _, (SyUnOp _ | SyMem _ | SyMemLogic _ | SySep _ | SyCallResult) -> + assert false + | ki, SyBinOp (_, (Shiftrt | Shiftlt),exp_l,_) -> + let annot, is_new = + register_alarm emitter ki (Alarms.Invalid_shift(exp_l, None)) + in + if is_new then + Kernel.warning ~current:true + "@[invalid LHS operand for left shift.@ %a@]%t" + local_printer#code_annotation annot suffix + | _, SyBinOp _ -> + assert false) + +let pretty_warn_mem_mode fmt m = + Format.pp_print_string fmt + (match m with Alarms.For_reading -> "read" | Alarms.For_writing -> "write") + +let warn_mem warn_mode wmm = + do_warn warn_mode.others + (fun (emitter, suffix) -> + let warn_term ki mk_alarm = + let valid = wmm in + let annot, is_new = register_alarm emitter ki (mk_alarm valid) in + if is_new then + Kernel.warning ~current:true "@[out of bounds %a.@ %a@]%t" + pretty_warn_mem_mode wmm + local_printer#code_annotation annot suffix; + in + match get_syntactic_context () with + | _,SyNone -> () + | _,(SyBinOp _ | SyUnOp _ | SySep _ | SyCallResult) -> assert false + | ki,SyMem lv_d -> + warn_term ki (fun v -> Alarms.Memory_access(lv_d, v)); + | ki,SyMemLogic term -> + warn_term ki (fun v -> Alarms.Logic_memory_access(term, v))) + +let warn_mem_read warn_mode = warn_mem warn_mode Alarms.For_reading +let warn_mem_write warn_mode = warn_mem warn_mode Alarms.For_writing + +let warn_index warn_mode ~positive ~range = + do_warn warn_mode.others + (fun (emitter, suffix) -> + match get_syntactic_context () with + | _,SyNone -> () + | _,(SyMem _ | SyMemLogic _ | SyUnOp _ | SySep _ | SyCallResult) -> + assert false + | ki ,SyBinOp (_, IndexPI, e1, e2) -> + let left = + if not positive then + Some + (register_alarm + emitter ki (Alarms.Index_out_of_bound(e1, None))) + else None + in + let annot, is_new = + register_alarm emitter ki (Alarms.Index_out_of_bound(e1, Some e2)) + in + let warn a = + Kernel.warning ~current:true + "@[accessing out of bounds index %s.@ @[%a@]@]%t" + range + local_printer#code_annotation a + suffix + in + if is_new then + let a = match left, annot with + | None, _ | Some(_, false), _ -> annot + | Some({ annot_content = AAssert(_, l) }, true), + { annot_content = AAssert(_, r) } -> + let p = Logic_const.pand (l, r) in + Logic_const.new_code_annotation (AAssert([], p)) + | Some _, _ -> assert false + in + warn a + else + Extlib.may (fun (a, b) -> if b then warn a) left + | _, SyBinOp _ -> + assert false) + +let warn_valid_string warn_mode = + do_warn warn_mode.defined_logic + (fun (emitter, suffix) -> + let aux ki e = + let annot, is_new = + register_alarm emitter ki (Alarms.Valid_string e) + in + if is_new then + Kernel.warning ~current:true + "@[may not point to a valid string:@ %a@]%t" + local_printer#code_annotation annot suffix; + in + match get_syntactic_context () with + | _,SyNone -> () + | _,(SyMemLogic _ | SySep _ | SyCallResult | SyMem _ | SyBinOp _) -> + assert false + | ki, SyUnOp e -> + aux ki e) + +let warn_pointer_subtraction warn_mode = + do_warn warn_mode.defined_logic + (fun (emitter, suffix) -> + match get_syntactic_context () with + | _,SyNone -> () + | _,(SyMem _ | SyMemLogic _ | SySep _ | SyCallResult | SyUnOp _) -> + assert false + | ki, SyBinOp (_, _, e1, e2) -> + let annot, is_new = + register_alarm emitter ki (Alarms.Differing_blocks (e1, e2)) + in + if is_new then + Kernel.warning ~current:true + "@[pointer subtraction:@ %a@]%t" + local_printer#code_annotation annot suffix) + +let warn_nan_infinite warn_mode fkind pp = + let sfkind = match fkind with + | None -> "real" + | Some FFloat -> "float" + | Some FDouble -> "double" + | Some FLongDouble -> "long double" + in + do_warn warn_mode.others + (fun (emitter, suffix) -> + match get_syntactic_context () with + | _,SyNone -> () + | _,(SyBinOp _ | SyMem _ | SyMemLogic _ | SySep _) -> assert false + | _, SyCallResult -> (* cf. bug 997 *) + Kernel.warning ~current:true ~once:true + "@[non-finite@ %s@ value being@ returned:@ \ + assert(\\is_finite(\\returned_value))@]%t" sfkind suffix; + | ki,SyUnOp (exp_r) -> + (* Should always be called with a non-none fkind, except in logic + mode (in which case this code is not executed *) + let fkind = Extlib.the fkind in + let annot, is_new = + register_alarm emitter ki (Alarms.Is_nan_or_infinite (exp_r, fkind)) + in + if is_new then + Kernel.warning ~current:true ~once:true + "@[non-finite@ %s@ value@ (%t):@ %a@]%t" + sfkind pp local_printer#code_annotation annot suffix) + +let warn_uninitialized warn_mode = + do_warn warn_mode.unspecified + (fun (emitter, suffix) -> + match get_syntactic_context () with + | _, SyNone + | _, (SyBinOp _ | SyUnOp _ | SySep _ | SyMemLogic _) -> assert false + | _, SyCallResult -> + Kernel.warning ~once:true ~current:true + "@[returned value may be uninitialized:@ \ + assert \\initialized(\\returned_value)@]%t" suffix; + | ki, SyMem lv_d -> + let annot, is_new = + register_alarm emitter ki (Alarms.Uninitialized lv_d) + in + if is_new then + Kernel.warning ~current:true + "@[accessing uninitialized left-value:@ %a@]%t" + local_printer#code_annotation annot suffix) + +let warn_escapingaddr warn_mode = + do_warn warn_mode.unspecified + (fun (emitter, suffix) -> + match get_syntactic_context () with + | _,SyNone -> () + | _,(SyBinOp _ | SyUnOp _ | SySep _ | SyMemLogic _) -> assert false + | _, SyCallResult -> + Kernel.warning ~once:true ~current:true + "@[returned value may be contain escaping addresses:@ \ + assert \\dangling(\\returned_value)@]%t" suffix; + | ki,SyMem lv_d -> + let annot, is_new = + register_alarm emitter ki (Alarms.Dangling lv_d) + in + if is_new then + Kernel.warning ~current:true + "@[accessing left-value@ that contains@ escaping@ addresses:\ + @ %a@]%t" local_printer#code_annotation annot suffix) + +let warn_separated warn_mode = + do_warn warn_mode.others + (fun (emitter, suffix) -> + match get_syntactic_context () with + | _,SyNone -> () + | _,(SyBinOp _ | SyUnOp _ | SyMem _ | SyMemLogic _| SyCallResult) -> + assert false + | ki,SySep(lv1,lv2) -> + let annot, is_new = + register_alarm emitter ki (Alarms.Not_separated(lv1, lv2)) + in + if is_new then + Kernel.warning ~current:true + "@[undefined multiple accesses in expression.@ %a@]%t" + local_printer#code_annotation annot suffix) + +let warn_overlap msg warn_mode = + do_warn warn_mode.others + (fun (emitter, suffix) -> + match get_syntactic_context () with + | _,SyNone -> () + | _,(SyBinOp _ | SyUnOp _ | SyMem _ | SyMemLogic _| SyCallResult) -> + assert false + | ki,SySep(lv1,lv2) -> + let annot, is_new = + register_alarm emitter ki (Alarms.Overlap(lv1, lv2)) + in + if is_new then + Kernel.warning ~current:true + "@[partially overlapping@ lvalue assignment%t.@ %a@]%t" + msg local_printer#code_annotation annot suffix) diff -Nru frama-c-20140301+neon+dfsg/src/value/valarms.mli frama-c-20150201+sodium+dfsg/src/value/valarms.mli --- frama-c-20140301+neon+dfsg/src/value/valarms.mli 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/valarms.mli 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,76 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) + +open CilE + +type syntactic_context = + | SyNone + | SyCallResult + | SyBinOp of Cil_types.exp * Cil_types.binop * Cil_types.exp * Cil_types.exp + | SyUnOp of Cil_types.exp + | SyMem of Cil_types.lval + | SyMemLogic of Cil_types.term + | SySep of Cil_types.lval * Cil_types.lval + +val start_stmt : Cil_types.kinstr -> unit +val end_stmt : unit -> unit +val current_stmt : unit -> Cil_types.kinstr + +val set_syntactic_context : syntactic_context -> unit + +val do_warn: alarm_behavior -> + ((Emitter.t * (Format.formatter -> unit)) -> unit) -> unit + +val warn_div : warn_mode -> addresses:bool -> unit +(** division. If [addresses] holds, also emit an alarm about the denominator + not being comparable to \null. *) + +val warn_shift : warn_mode -> int -> unit +val warn_shift_left_positive : warn_mode -> unit +val warn_mem_read : warn_mode -> unit +val warn_mem_write : warn_mode -> unit +val warn_integer_overflow : + warn_mode -> signed:bool -> min:Integer.t option -> max:Integer.t option -> unit +val warn_float_to_int_overflow: + warn_mode -> + Integer.t option -> Integer.t option -> (Format.formatter -> unit) -> unit + +val warn_index : warn_mode -> positive:bool -> range:string -> unit +(** [warn_index w ~positive ~range] emits a warning signaling an out of bounds + access. The expression used as index is taken from the syntactic context. + [range] is used to display the inferred values for the index. + If [positive] is true, the generated assertion is of the form + [e < upper_bound]; otherwise, two assertions are generated: [0 <= e] + and [e < upper_bound]. +*) +val warn_pointer_comparison : warn_mode -> unit +val warn_valid_string : warn_mode -> unit +val warn_pointer_subtraction : warn_mode -> unit +val warn_nan_infinite: + warn_mode -> Cil_types.fkind option -> (Format.formatter -> unit) -> unit +val warn_uninitialized : warn_mode -> unit +val warn_escapingaddr : warn_mode -> unit +(** warning to be emitted when two incompatible accesses to a location are + done in unspecified order. Must be called in a [SyNone] or [SySep] context. +*) +val warn_separated : warn_mode -> unit +val warn_overlap : (Format.formatter -> unit) -> warn_mode -> unit diff -Nru frama-c-20140301+neon+dfsg/src/value/Value.mli frama-c-20150201+sodium+dfsg/src/value/Value.mli --- frama-c-20140301+neon+dfsg/src/value/Value.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/Value.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/value_parameters.ml frama-c-20150201+sodium+dfsg/src/value/value_parameters.ml --- frama-c-20140301+neon+dfsg/src/value/value_parameters.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/value_parameters.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -27,6 +27,9 @@ Kernel.AbsoluteValidRange.parameter; Kernel.SafeArrays.parameter; Kernel.UnspecifiedAccess.parameter; + Kernel.SignedOverflow.parameter; + Kernel.UnsignedOverflow.parameter; + Kernel.ConstReadonly.parameter; ] let parameters_correctness = ref [] @@ -69,22 +72,13 @@ let alarms = add_group "Propagation and alarms " (* -------------------------------------------------------------------------- *) -(* --- Aux --- *) -(* -------------------------------------------------------------------------- *) - -let check_c_function_exists ~f ~option ~arg = - try ignore (Globals.Functions.find_by_name f) - with Not_found -> - warning "option '%s %s': function '%s' does not exist" option arg f - -(* -------------------------------------------------------------------------- *) (* --- Performance options --- *) (* -------------------------------------------------------------------------- *) -let () = Parameter_customize.argument_is_function_name () let () = Parameter_customize.set_group performance + module NoResultsFunctions = - StringSet + Fundec_set (struct let option_name = "-no-results-function" let arg_name = "f" @@ -105,24 +99,41 @@ let () = add_dep NoResultsAll.parameter let () = Parameter_customize.set_group performance +let () = Parameter_customize.is_invisible () module ResultsAfter = Bool (struct let option_name = "-val-after-results" let help = "record precisely the values obtained after the evaluation of each statement" - let default = !Fc_config.is_gui + let default = true end) -let () = add_dep ResultsAfter.parameter +let () = + ResultsAfter.add_set_hook + (fun _ new_ -> + if new_ then + Kernel.feedback "@[Option -val-after-results is now always set.@]" + else + Kernel.warning "@[Option -val-after-results can no longer be unset.@]") let () = Parameter_customize.set_group performance +let () = Parameter_customize.is_invisible () module ResultsCallstack = Bool (struct let option_name = "-val-callstack-results" - let help = "record precisely the values obtained for each callstack leading to each statement" + let help = "always enabled, cannot be disabled: used to record precisely the values obtained for each callstack leading to each statement" let default = false end) -let () = add_dep ResultsCallstack.parameter +let () = add_precision_dep ResultsCallstack.parameter + +let () = Parameter_customize.set_group performance +module JoinResults = + Bool + (struct + let option_name = "-val-join-results" + let help = "precompute consolidated states once value is computed" + let default = true + end) let () = Parameter_customize.set_group performance let () = Parameter_customize.is_invisible () @@ -224,16 +235,16 @@ end) let () = add_correctness_dep IgnoreRecursiveCalls.parameter - let () = Parameter_customize.set_group alarms + module WarnCopyIndeterminate = - StringSet + Kernel_function_set (struct let option_name = "-val-warn-copy-indeterminate" let arg_name = "f | @all" let help = "warn when a statement of the specified functions copies a \ value that may be indeterminate (uninitalized or containing escaping address). \ -Any number of function must be specified. If '@all' is present, this option \ +Any number of function may be specified. If '@all' is present, this option \ becomes active for all functions. Inactive by default." end) let () = add_correctness_dep WarnCopyIndeterminate.parameter @@ -337,85 +348,83 @@ end) let () = add_precision_dep SemanticUnrollingLevel.parameter -let split_option = - let rx = Str.regexp_string ":" in - fun s -> - try - match Str.split rx s with - | [ f ; n ] -> (f, n) - | _ -> failwith "" - with _ -> failwith "split_option" - let () = Parameter_customize.set_group precision_tuning +let () = Parameter_customize.argument_may_be_fundecl () module SlevelFunction = - StringHashtbl + Kernel_function_map + (struct + include Datatype.Int + type key = Cil_types.kernel_function + let of_string ~key:_ ~prev:_ s = + Extlib.opt_map + (fun s -> + try int_of_string s + with Failure _ -> + raise (Cannot_build ("'" ^ s ^ "' is not an integer"))) + s + let to_string ~key:_ = Extlib.opt_map string_of_int + end) (struct let option_name = "-slevel-function" let arg_name = "f:n" let help = "override slevel with when analyzing " + let default = Kernel_function.Map.empty end) - (struct - include Datatype.Int - - let parse s = - try - let f, n = split_option s in - check_c_function_exists ~f:f ~option:"-slevel-function" ~arg:s; - let n = int_of_string n in - f, n - with - | Failure _ -> abort "Could not parse option \"-slevel-function %s\"" s - let redefine_binding _k ~old:_ new_v = new_v - let no_binding _ = SemanticUnrollingLevel.get () - end) let () = add_precision_dep SlevelFunction.parameter let () = Parameter_customize.set_group precision_tuning module SlevelMergeAfterLoop = - False + Kernel_function_set (struct - let option_name = "-slevel-merge-after-loop" + let option_name = "-val-slevel-merge-after-loop" + let arg_name = "f | @all" let help = "when set, the different execution paths that originate from the body \ of a loop are merged before entering the next excution. Experimental." end) let () = add_precision_dep SemanticUnrollingLevel.parameter -let split_option_multiple = - let rx = Str.regexp_string ":" in - fun s -> - try - match Str.split rx s with - | f :: q -> f, q - | _ -> failwith "" - with _ -> failwith "split_option" - let () = Parameter_customize.set_group precision_tuning +let () = Parameter_customize.argument_may_be_fundecl () module SplitReturnFunction = - StringHashtbl + Kernel_function_map + (struct + (* this type is ad-hoc: cannot use Kernel_function_multiple_map here *) + include Split_strategy + type key = Cil_types.kernel_function + let of_string = + let r = Str.regexp ":" in + fun ~key:_ ~prev:_ s -> + Extlib.opt_map + (fun s -> + if s = "" then NoSplit + else if s = "full" then FullSplit + else + let conv s = + try Integer.of_string s + with Failure _ -> + raise (Cannot_build ("'" ^ s ^ "' is not an integer")) + in + SplitEqList (List.map conv (Str.split r s))) + s + let to_string ~key:_ v = + Extlib.opt_map + (function + | NoSplit -> "" + | FullSplit -> "full" + | SplitEqList l -> + Pretty_utils.sfprintf "%t" + (fun fmt -> + Pretty_utils.pp_list ~sep:":" Datatype.Integer.pretty fmt l)) + v + end) (struct let option_name = "-val-split-return-function" let arg_name = "f:n" let help = "split return states of function according to \ \\result == n and \\result != n" + let default = Kernel_function.Map.empty end) - (struct - include Split_strategy - let parse s = - try - let f, l = split_option_multiple s in - check_c_function_exists - ~f:f ~option:"-val-split-return-function" ~arg:s; - ( match l with - [ "full" ] -> f, FullSplit - | _ -> - let l = List.map Integer.of_string l in - f, SplitEqList l) - with Failure _ -> - abort "Could not parse option \"-val-split-return %s\"" s - let redefine_binding _k ~old:_ new_v = new_v - let no_binding _ = raise Not_found - end) let () = add_precision_dep SplitReturnFunction.parameter let () = Parameter_customize.set_group precision_tuning @@ -429,26 +438,30 @@ let () = add_precision_dep SplitReturnAuto.parameter let () = Parameter_customize.set_group precision_tuning +let () = Parameter_customize.argument_may_be_fundecl () module BuiltinsOverrides = - StringHashtbl + Kernel_function_map (struct - let option_name = "-val-builtin" - let arg_name = "f:ffc" - let help = "when analyzing function , try to use Frama-C builtin instead. Fall back to if cannot handle its arguments (experimental)." + include Datatype.String + type key = Cil_types.kernel_function + let of_string ~key:kf ~prev:_ nameopt = + begin match nameopt with + | Some name -> + if not (!Db.Value.mem_builtin name) then + abort "option '-val-builtin %a:%s': undeclared builtin '%s'" + Kernel_function.pretty kf name name; + | _ -> () + end; + nameopt + let to_string ~key:_ name = name end) (struct - include Datatype.String - let parse s = - try - let (fc, focaml) as r = split_option s in - if not (!Db.Value.mem_builtin focaml) then - abort "option '-val-builtin %s': undeclared builtin '%s'" - s focaml; - check_c_function_exists ~f:fc ~option:"-val-builtin" ~arg:s; - r - with Failure _ -> abort "Could not parse option \"-val-builtin %s\"" s - let redefine_binding _k ~old:_ new_v = new_v - let no_binding _ = raise Not_found + let option_name = "-val-builtin" + let arg_name = "f:ffc" + let help = "when analyzing function , try to use Frama-C builtin \ + instead. Fall back to if cannot handle its arguments \ +(experimental)." + let default = Kernel_function.Map.empty end) let () = add_precision_dep BuiltinsOverrides.parameter @@ -463,10 +476,9 @@ end) let () = add_precision_dep Subdivide_float_in_expr.parameter -let () = Parameter_customize.argument_is_function_name () let () = Parameter_customize.set_group precision_tuning module UsePrototype = - StringSet + Kernel_function_set (struct let option_name = "-val-use-spec" let arg_name = "f1,..,fn" @@ -513,11 +525,11 @@ end) let () = add_precision_dep ArrayPrecisionLevel.parameter let () = ArrayPrecisionLevel.add_update_hook - (fun _ v -> Lattice_Interval_Set.plevel := v) + (fun _ v -> Offsetmap.set_plevel v) let () = Parameter_customize.set_group precision_tuning module SeparateStmtStart = - StringSet + String_set (struct let option_name = "-separate-stmts" let arg_name = "n1,..,nk" @@ -626,10 +638,10 @@ arguments, on undecided branches" end) -let () = Parameter_customize.argument_is_function_name () let () = Parameter_customize.set_group interpreter + module ObviouslyTerminatesFunctions = - StringSet + Fundec_set (struct let option_name = "-obviously-terminates-function" let arg_name = "f" diff -Nru frama-c-20140301+neon+dfsg/src/value/value_parameters.mli frama-c-20150201+sodium+dfsg/src/value/value_parameters.mli --- frama-c-20140301+neon+dfsg/src/value/value_parameters.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/value_parameters.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -34,23 +34,26 @@ module AllRoundingModes: Parameter_sig.Bool module AllRoundingModesConstants: Parameter_sig.Bool -module NoResultsFunctions: Parameter_sig.String_set +module NoResultsFunctions: Parameter_sig.Fundec_set module NoResultsAll: Parameter_sig.Bool -module ResultsAfter: Parameter_sig.Bool module ResultsCallstack: Parameter_sig.Bool +module JoinResults: Parameter_sig.Bool module WarnLeftShiftNegative: Parameter_sig.Bool module WarnPointerSubstraction: Parameter_sig.Bool -module WarnCopyIndeterminate: Parameter_sig.String_set +module WarnCopyIndeterminate: Parameter_sig.Kernel_function_set module IgnoreRecursiveCalls: Parameter_sig.Bool module MemoryFootprint: Parameter_sig.Int module SemanticUnrollingLevel: Parameter_sig.Int -module SlevelFunction: Parameter_sig.String_hashtbl with type value = int -module SlevelMergeAfterLoop: Parameter_sig.Bool +module SlevelFunction: + Parameter_sig.Map with type key = Cil_types.kernel_function + and type value = int + +module SlevelMergeAfterLoop: Parameter_sig.Kernel_function_set module WideningLevel: Parameter_sig.Int module ArrayPrecisionLevel: Parameter_sig.Int @@ -60,14 +63,17 @@ module UndefinedPointerComparisonPropagateAll: Parameter_sig.Bool -module UsePrototype: Parameter_sig.String_set +module UsePrototype: Parameter_sig.Kernel_function_set module RmAssert: Parameter_sig.Bool module Subdivide_float_in_expr: Parameter_sig.Int -module BuiltinsOverrides: Parameter_sig.String_hashtbl with type value = string -module SplitReturnFunction: Parameter_sig.String_hashtbl - with type value = Split_strategy.t +module BuiltinsOverrides: + Parameter_sig.Map with type key = Cil_types.kernel_function + and type value = string +module SplitReturnFunction: + Parameter_sig.Map with type key = Cil_types.kernel_function + and type value = Split_strategy.t module SplitReturnAuto: Parameter_sig.Bool module ValShowProgress: Parameter_sig.Bool @@ -82,7 +88,7 @@ module InterpreterMode: Parameter_sig.Bool module ObviouslyTerminatesAll: Parameter_sig.Bool -module ObviouslyTerminatesFunctions: Parameter_sig.String_set +module ObviouslyTerminatesFunctions: Parameter_sig.Fundec_set module StopAtNthAlarm: Parameter_sig.Int diff -Nru frama-c-20140301+neon+dfsg/src/value/value_perf.ml frama-c-20150201+sodium+dfsg/src/value/value_perf.ml --- frama-c-20140301+neon+dfsg/src/value/value_perf.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/value_perf.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -35,6 +35,8 @@ *) let does_not_account_smaller_than = 1.667 +(* OCaml time is not always increasing, so we use max to fix this. *) +let duration a b = max (b -. a) 0.0 (****************************************************************) (* The metrics being computed and displayed. *) @@ -68,7 +70,7 @@ let total_duration current_time call_info = let additional_time = match call_info.since with | [] -> 0.0 - | since::_ -> current_time -. since + | since::_ -> duration current_time since in assert (additional_time >= 0.0); additional_time +. call_info.total_duration @@ -112,7 +114,7 @@ let after_call t to_ = let since = List.hd t.since in - let duration = to_ -. since in + let duration = duration to_ since in assert (duration >= 0.0); t.total_duration <- t.total_duration +. duration; t.nb_calls <- t.nb_calls + 1; @@ -171,7 +173,7 @@ (if !nb_others > 0 then Format.fprintf fmt "| %d others: %.3fs (%.1f%%) " !nb_others !total_others (100.0 *. !total_others /. caller_duration)); - let self_duration = caller_duration -. !total_sub in + let self_duration = duration caller_duration !total_sub in Format.fprintf fmt "| self: %.3fs (%.1f%%)|\n" self_duration (100.0 *. (self_duration /. caller_duration)) @@ -319,7 +321,7 @@ let node = Perf_by_callstack.find perf callstack in Call_info.before_call node.call_info_per_stack time; - if (time -. !last_time_displayed) > display_interval + if (duration time !last_time_displayed) > display_interval then (last_time_displayed := time; Kernel.feedback "%t" display) end ;; diff -Nru frama-c-20140301+neon+dfsg/src/value/value_perf.mli frama-c-20150201+sodium+dfsg/src/value/value_perf.mli --- frama-c-20140301+neon+dfsg/src/value/value_perf.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/value_perf.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/value/value_results.ml frama-c-20150201+sodium+dfsg/src/value/value_results.ml --- frama-c-20140301+neon+dfsg/src/value/value_results.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/value_results.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,29 +20,120 @@ (* *) (**************************************************************************) -open Cil_types +open Cil_datatype -(* This file will ultimately contain all the results computed by Value - (which must be moved out of Db.Value), both per stack and globally. *) +(* ************************************************************************* *) +(** {2 Is called} *) +(* ************************************************************************* *) -(* Does the given call statement terminate at least once. Filled only - for [Instr (Call _)] stmts *) -module Terminating_calls = - Cil_state_builder.Stmt_hashtbl +module Is_Called = + Kernel_function.Make_Table (Datatype.Bool) (struct - let name = "Value_results.Terminating_calls" - let size = 17 - let dependencies = [ Db.Value.self ] - end) - -let mark_call_terminating stmt = - Terminating_calls.replace stmt true - -let is_non_terminating_call stmt = match stmt.skind with - | Instr (Call _) -> not (Terminating_calls.mem stmt) - | _ -> false - + let name = "is_called" + let dependencies = [ Db.Value.self ] + let size = 17 + end) + +let is_called = + Is_Called.memo + (fun kf -> + try Db.Value.is_reachable_stmt (Kernel_function.find_first_stmt kf) + with Kernel_function.No_Statement -> false) + +let mark_kf_as_called kf = + Is_Called.replace kf true + +(* ************************************************************************* *) +(** {2 Callers} *) +(* ************************************************************************* *) + +module Callers = + Kernel_function.Make_Table + (Kernel_function.Map.Make(Stmt.Set)) + (struct + let name = "Callers" + let dependencies = [ Db.Value.self ] + let size = 17 + end) + +let add_kf_caller ~caller:(caller_kf, call_site) kf = + let add m = Kernel_function.Map.add caller_kf (Stmt.Set.singleton call_site) m + in + let change m = + try + let call_sites = Kernel_function.Map.find caller_kf m in + Kernel_function.Map.add caller_kf (Stmt.Set.add call_site call_sites) m + with Not_found -> + add m + in + ignore (Callers.memo ~change (fun _kf -> add Kernel_function.Map.empty) kf) + + +let callers kf = + try + let m = Callers.find kf in + Kernel_function.Map.fold + (fun key v acc -> (key, Stmt.Set.elements v) :: acc) + m + [] + with Not_found -> + [] + +(* ************************************************************************* *) +(** {2 Termination.} *) +(* ************************************************************************* *) + +let partition_terminating_instr stmt = + let ho = + try Some (Db.Value.AfterTable_By_Callstack.find stmt) + with Not_found -> None + in + match ho with + | None -> ([], []) + | Some h -> + let terminating = ref [] in + let non_terminating = ref [] in + let add x xs = xs := x :: !xs in + Value_types.Callstack.Hashtbl.iter (fun cs state -> + if Db.Value.is_reachable state + then add cs terminating + else add cs non_terminating) h; + (!terminating, !non_terminating) + +let is_non_terminating_instr stmt = + match partition_terminating_instr stmt with + | [], _ -> true + | _, _ -> false + + +(* ************************************************************************* *) +(** {2 Merging results.} *) +(* ************************************************************************* *) + +type state_per_stmt = Cvalue.Model.t Cil_datatype.Stmt.Hashtbl.t + +let merge_states_in_db hash_states callstack = + let treat_stmt k sum = + Db.Value.update_callstack_table ~after:false k callstack sum + in + Stmt.Hashtbl.iter treat_stmt (Lazy.force hash_states) + +(* Merging of 'after statement' states in the global table *) +let merge_after_states_in_db after_full callstack = + Cil_datatype.Stmt.Hashtbl.iter + (fun stmt st -> + Db.Value.update_callstack_table ~after:true stmt callstack st) + (Lazy.force after_full) + + +(* ************************************************************************* *) +(** {2 Registration.} *) +(* ************************************************************************* *) + +let () = + Db.Value.is_called := is_called; + Db.Value.callers := callers; (* diff -Nru frama-c-20140301+neon+dfsg/src/value/value_results.mli frama-c-20150201+sodium+dfsg/src/value/value_results.mli --- frama-c-20140301+neon+dfsg/src/value/value_results.mli 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/value_results.mli 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,50 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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 will ultimately contain all the results computed by Value + (which must be moved out of Db.Value), both per stack and globally. *) + + +open Cil_types + +val mark_kf_as_called: kernel_function -> unit +val add_kf_caller: caller:kernel_function * stmt -> kernel_function -> unit + +val partition_terminating_instr: stmt -> Db.Value.callstack list * Db.Value.callstack list +(** Returns the list of terminating callstacks and the list of non-terminating callstacks. + Must be called *only* on statements that are instructions. *) +val is_non_terminating_instr: stmt -> bool +(** Returns [true] iff there exists executions of the statement that does + not always fail/loop (for function calls). Must be called *only* on + statements that are instructions. *) + +type state_per_stmt = Cvalue.Model.t Cil_datatype.Stmt.Hashtbl.t +val merge_states_in_db: + state_per_stmt Lazy.t -> Db.Value.callstack -> unit +val merge_after_states_in_db: + state_per_stmt Lazy.t -> Db.Value.callstack -> unit + +(* +Local Variables: +compile-command: "make -C ../.." +End: +*) diff -Nru frama-c-20140301+neon+dfsg/src/value/value_util.ml frama-c-20150201+sodium+dfsg/src/value/value_util.ml --- frama-c-20140301+neon+dfsg/src/value/value_util.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/value_util.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -132,8 +132,8 @@ { warn_all_mode with CilE.imprecision_tracing = CilE.a_ignore } let get_slevel kf = - let name = Kernel_function.get_name kf in - Value_parameters.SlevelFunction.find name + try Value_parameters.SlevelFunction.find kf + with Not_found -> Value_parameters.SemanticUnrollingLevel.get () let set_loc kinstr = match kinstr with @@ -150,8 +150,8 @@ end) let pretty_actuals fmt actuals = - Pretty_utils.pp_flowlist (fun fmt (_,x,_) -> Cvalue.V.pretty fmt x) - fmt actuals + let pp fmt (e,x,_) = Cvalue.V.pretty_typ (Some (Cil.typeOf e)) fmt x in + Pretty_utils.pp_flowlist pp fmt actuals let pretty_current_cfunction_name fmt = Kernel_function.pretty fmt (current_kf()) @@ -171,17 +171,6 @@ Base.SetLattice.pretty last_clob -let map_outputs f = - List.map - (fun ((res: Cvalue.V_Offsetmap.t option), (out: Cvalue.Model.t)) -> (res, f out)) - - -let remove_formals_from_state formals state = - if formals <> [] then - let formals = List.map Base.of_varinfo formals in - let cleanup acc v = Cvalue.Model.remove_base v acc in - List.fold_left cleanup state formals - else state module DegenerationPoints = @@ -195,10 +184,86 @@ let warn_indeterminate kf = let params = Value_parameters.WarnCopyIndeterminate.get () in - if Datatype.String.Set.mem "@all" params then - not (Datatype.String.Set.mem ("-" ^ Kernel_function.get_name kf) params) + Kernel_function.Set.mem kf params + +let register_new_var v typ = + if Cil.isFunctionType typ then + Globals.Functions.replace_by_declaration (Cil.empty_funspec()) v v.vdecl else - Datatype.String.Set.mem (Kernel_function.get_name kf) params + Globals.Vars.add_decl v + +let create_new_var name typ = + let vi = Cil.makeGlobalVar ~source:false ~temp:false name typ in + register_new_var vi typ; + vi + +let is_const_write_invalid typ = + Kernel.ConstReadonly.get () && Cil.typeHasQualifier "const" typ + +let float_kind = function + | FFloat -> Ival.Float_abstract.Float32 + | FDouble -> Ival.Float_abstract.Float64 + | FLongDouble -> + if Cil.theMachine.Cil.theMachine.sizeof_longdouble <> 8 then + Value_parameters.error ~once:true + "type long double not implemented. Using double instead"; + Ival.Float_abstract.Float64 + +(** Find if a postcondition contains [\result] *) +class postconditions_mention_result = object + inherit Visitor.frama_c_inplace + + method! vterm_lhost = function + | TResult _ -> raise Exit + | _ -> Cil.DoChildren +end +let postconditions_mention_result spec = + let vis = new postconditions_mention_result in + let aux_bhv bhv = + let aux (_, post) = ignore (Visitor.visitFramacIdPredicate vis post) in + List.iter aux bhv.b_post_cond + in + try + List.iter aux_bhv spec.spec_behavior; + false + with Exit -> true + +let written_formals kf = + let module S = Cil_datatype.Varinfo.Set in + match kf.fundec with + | Declaration _ -> [] + | Definition (fdec, _) -> + let add_addr_taken acc vi = if vi.vaddrof then S.add vi acc else acc in + let referenced_formals = + ref (List.fold_left add_addr_taken S.empty fdec.sformals) + in + let obj = object + inherit Visitor.frama_c_inplace + + method! vinst i = + begin match i with + | Call (Some (Var vi, _), _, _, _) + | Set ((Var vi, _), _, _) -> + if Kernel_function.is_formal vi kf then + referenced_formals := S.add vi !referenced_formals + | _ -> () + end; + Cil.SkipChildren + end + in + ignore (Visitor.visitFramacFunction (obj :> Visitor.frama_c_visitor) fdec); + S.elements !referenced_formals + +module WrittenFormals = + Kernel_function.Make_Table(Datatype.List(Cil_datatype.Varinfo)) + (struct + let size = 17 + let dependencies = [Ast.self] + let name = "Value_util.WrittenFormals" + end) + +let written_formals = WrittenFormals.memo written_formals + (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/value/value_util.mli frama-c-20150201+sodium+dfsg/src/value/value_util.mli --- frama-c-20140301+neon+dfsg/src/value/value_util.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/value_util.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -55,18 +55,14 @@ val warn_indeterminate: Kernel_function.t -> bool val set_loc : kinstr -> unit module Got_Imprecise_Value : State_builder.Ref with type data = Datatype.Bool.t -val pretty_actuals : Format.formatter -> ('a * Cvalue.V.t * 'b) list -> unit +val pretty_actuals : + Format.formatter -> (Cil_types.exp * Cvalue.V.t * 'b) list -> unit val pretty_current_cfunction_name : Format.formatter -> unit val warning_once_current : ('a, Format.formatter, unit) format -> 'a val debug_result : Kernel_function.t -> Cvalue.V_Offsetmap.t option * 'a * Base.SetLattice.t -> unit -val map_outputs : - (Cvalue.Model.t -> 'a) -> - (Cvalue.V_Offsetmap.t option * Cvalue.Model.t) list -> - (Cvalue.V_Offsetmap.t option * 'a) list -val remove_formals_from_state : - varinfo list -> Cvalue.Model.t -> Cvalue.Model.t + (* Statements for which the analysis has degenerated. [true] means that this is the statement on which the degeneration occurred, or a statement above in @@ -74,6 +70,27 @@ module DegenerationPoints: State_builder.Hashtbl with type key = stmt and type data = bool + +val create_new_var: string -> typ -> varinfo +(** Create and register a new variable inside Frama-C. The variable + has its [vlogic] field set, meaning it is not a source variable. The + freshness of the name must be ensured by the user. *) + +val is_const_write_invalid: typ -> bool +(** Detect that the type is const, and that option [-global-const] is set. In + this case, we forbid writing in a l-value that has this type. *) + +val float_kind: Cil_types.fkind -> Ival.Float_abstract.float_kind +(** Classify a [Cil_types.fkind] as either a 32 or 64 floating-point type. + Emit a warning when the argument is [long double], and [long double] + is not equal to [double] *) + +val postconditions_mention_result: Cil_types.funspec -> bool +(** Does the post-conditions of this specification mention [\result]? *) + +val written_formals: Cil_types.kernel_function -> Cil_types.varinfo list +(** Over-approximation of its formals the given function may write into. *) + (* Local Variables: compile-command: "make -C ../.." diff -Nru frama-c-20140301+neon+dfsg/src/value/warn.ml frama-c-20150201+sodium+dfsg/src/value/warn.ml --- frama-c-20140301+neon+dfsg/src/value/warn.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/warn.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -145,7 +145,7 @@ Kernel_function.pretty kf pretty_call_stack (call_stack ()) Value_parameters.IgnoreRecursiveCalls.option_name; - Value_parameters.not_yet_implemented "recursive call" + raise Db.Value.Aborted end end) @@ -170,7 +170,7 @@ if not (Location.equal validlocret validlocret') then let loc = Cil_datatype.Location.unknown in let exp = Cil.mkAddrOrStartOf ~loc lvret in - CilE.do_warn with_alarms.CilE.others + Valarms.do_warn with_alarms.CilE.others (fun (_emit, suffix) -> Value_parameters.warning ~current:true ~once:true "@[possible@ side-effect@ modifying %a@ within@ call@ \ @@ -214,20 +214,22 @@ let warn_imprecise_lval_read ~with_alarms lv loc contents = if with_alarms.CilE.imprecision_tracing.CilE.a_log <> None then + let pretty_gm fmt s = + let s = Base.SetLattice.(inject (O.remove Base.null s)) in + Base.SetLattice.pretty fmt s + in let pretty_param fmt param = match param with | Base.SetLattice.Top -> Format.fprintf fmt "is imprecise" - | Base.SetLattice.Set _s -> - Format.fprintf fmt "is a garbled mix of %a" - Base.SetLattice.pretty param + | Base.SetLattice.Set s -> + Format.fprintf fmt "is a garbled mix of %a" pretty_gm s in let pretty_param_b fmt param = match param with | Base.SetLattice.Top -> Format.fprintf fmt "The contents@ are imprecise" - | Base.SetLattice.Set _s -> - Format.fprintf fmt "It contains@ a garbled@ mix@ of@ %a" - Base.SetLattice.pretty param + | Base.SetLattice.Set s -> + Format.fprintf fmt "It contains@ a garbled@ mix@ of@ %a" pretty_gm s in let something_to_warn = match loc.loc with Location_Bits.Top _ -> true @@ -236,7 +238,7 @@ | Location_Bytes.Top _ -> true | Location_Bytes.Map _ -> false in - if something_to_warn then CilE.do_warn with_alarms.CilE.imprecision_tracing + if something_to_warn then Valarms.do_warn with_alarms.CilE.imprecision_tracing (fun _ -> Value_parameters.result ~current:true ~once:true "@[@[Reading left-value %a.@]@ %t%t%t@]" @@ -268,13 +270,12 @@ | Location_Bytes.Map _ -> ()) pp_callstack) - (* Auxiliary function for [do_assign] below. When computing the result of [lv = exp], warn if the evaluation of [exp] results in an imprecision. [loc_lv] is the location pointed to by [lv]. [exp_val] is the part of the evaluation of [exp] that is imprecise. *) let warn_right_exp_imprecision ~with_alarms lv loc_lv exp_val = - CilE.do_warn with_alarms.CilE.imprecision_tracing + Valarms.do_warn with_alarms.CilE.imprecision_tracing (fun _ -> match exp_val with | Location_Bytes.Top(_topparam,origin) -> @@ -283,7 +284,8 @@ Printer.pp_lval lv (fun fmt -> match lv with | (Mem _, _) -> - Format.fprintf fmt "@ (i.e. %a)" Locations.pretty loc_lv + Format.fprintf fmt "@ (pointing to %a)" + (Locations.pretty_english ~prefix:false) loc_lv | (Var _, _) -> ()) (fun fmt org -> if not (Origin.is_top origin) then @@ -292,17 +294,7 @@ Origin.pretty org) origin pp_callstack - | Location_Bytes.Map _ -> - if not (Got_Imprecise_Value.get ()) && - not (Cvalue.V.cardinal_zero_or_one exp_val) - then begin - Got_Imprecise_Value.set true; - if (Value_parameters.ValShowProgress.get()) - then - Value_parameters.result ~current:true - "assigning non deterministic value for the first time"; - end) - + | Location_Bytes.Map _ -> ()) (* Auxiliary function for do_assign (currently), that warns when the left-hand side and the right-hand side of an assignment overlap *) @@ -316,8 +308,15 @@ | Int_Base.Value size when big_enough size -> if Location_Bits.partially_overlaps size right_loc.loc left_loc.loc then begin - CilE.set_syntactic_context (CilE.SySep (lv, exp_lv)); - CilE.warn_overlap (left_loc, right_loc) with_alarms; + Valarms.set_syntactic_context (Valarms.SySep (lv, exp_lv)); + let msg fmt = + Format.fprintf fmt "@ (%a,@ size %a bits;@ %a,@ size %a bits)" + (Locations.pretty_english ~prefix:false) left_loc + Int_Base.pretty left_loc.Locations.size + (Locations.pretty_english ~prefix:false) right_loc + Int_Base.pretty right_loc.Locations.size + in + Valarms.warn_overlap msg with_alarms; end | _ -> () @@ -326,7 +325,7 @@ let offsetmap_contains_imprecision offs = try Cvalue.V_Offsetmap.iter_on_values - (fun v _ -> + (fun v -> match Cvalue.V_Or_Uninitialized.get_v v with | Location_Bytes.Map _ -> () | Location_Bytes.Top _ as v -> raise (Got_imprecise v) @@ -334,16 +333,35 @@ None with Got_imprecise v -> Some v -let warn_indeterminate_offsetmap ~with_alarms typ offsm = +let warn_reduce_indeterminate_offsetmap ~with_alarms typ offsm loc state = if Cil.isArithmeticOrPointerType typ then ( let uninit = ref false in let escaping = ref false in + let res = ref offsm in + let reduce loc = + let size = Int_Base.project loc.size in + let _alarm, state = + Cvalue.Model.paste_offsetmap ~reducing:true ~from:!res + ~dst_loc:loc.loc ~size ~exact:true state + in + state + in + let reduce () = + match loc with + | `NoLoc -> state + | `PreciseLoc ploc -> + if Precise_locs.cardinal_zero_or_one ploc then + let loc = Precise_locs.imprecise_location ploc in + reduce loc + else state + | `Loc loc -> + if Locations.cardinal_zero_or_one loc then reduce loc else state + in let warn () = - if !uninit then CilE.warn_uninitialized with_alarms; - if !escaping then CilE.warn_escapingaddr with_alarms; + if !uninit then Valarms.warn_uninitialized with_alarms; + if !escaping then Valarms.warn_escapingaddr with_alarms; in try - let res = ref offsm in Cvalue.V_Offsetmap.iter (fun itv (v, size, offs) -> let open Cvalue.V_Or_Uninitialized in @@ -360,28 +378,65 @@ res := Cvalue.V_Offsetmap.add itv (C_init_noesc v', size, offs) !res ) offsm; warn (); - Some !res + let state = if !uninit || !escaping then reduce () else state in + `Res (!res, state) with Exit -> warn (); - None + `Bottom ) else - Some offsm + `Res (offsm, state) +let maybe_warn_indeterminate ~with_alarms v = + let open Cvalue.V_Or_Uninitialized in + match v with + | C_uninit_esc _ -> + Valarms.warn_uninitialized with_alarms; + Valarms.warn_escapingaddr with_alarms; + true + | C_uninit_noesc _ -> + Valarms.warn_uninitialized with_alarms; + true + | C_init_esc _ -> + Valarms.warn_escapingaddr with_alarms; + true + | C_init_noesc _ -> false + +let maybe_warn_completely_indeterminate ~with_alarms loc vi v = + if Cvalue.V.is_bottom v && not (Cvalue.V_Or_Uninitialized.is_bottom vi) && + with_alarms.CilE.unspecified.CilE.a_log <> None + then + Valarms.do_warn with_alarms.CilE.unspecified + (fun _ -> + Kernel.warning ~current:true ~once:true + "completely indeterminate value %a." + (Locations.pretty_english ~prefix:true) loc) let warn_float_addr ~with_alarms msg = - CilE.do_warn with_alarms.CilE.imprecision_tracing + Valarms.do_warn with_alarms.CilE.imprecision_tracing (fun (_, pp) -> Value_parameters.result ~once:true ~current:true "@[float@ value@ contains@ addresses (%t)]%t" msg pp ); ;; -let warn_float ~with_alarms ?(overflow=false) ?(addr=false) flkind msg = +let warn_float ~with_alarms ?(non_finite=false) ?(addr=false) flkind msg = if addr then warn_float_addr ~with_alarms msg; - if addr || overflow then - CilE.warn_nan_infinite with_alarms flkind msg; + if addr || non_finite then + Valarms.warn_nan_infinite with_alarms flkind msg; ;; +let maybe_warn_div ~with_alarms e = + if Cvalue.V.contains_zero e then + let addresses = + try ignore (Cvalue.V.project_ival e); false + with Cvalue.V.Not_based_on_null -> true + in + Valarms.warn_div with_alarms ~addresses + +let warn_top () = + Value_parameters.abort ~current:true ~once:true + "completely imprecise state during evaluation. Aborting." + (* Local Variables: diff -Nru frama-c-20140301+neon+dfsg/src/value/warn.mli frama-c-20150201+sodium+dfsg/src/value/warn.mli --- frama-c-20140301+neon+dfsg/src/value/warn.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/warn.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -57,7 +57,7 @@ val warn_float: with_alarms:CilE.warn_mode -> - ?overflow:bool -> ?addr:bool -> + ?non_finite:bool -> ?addr:bool -> fkind option -> (Format.formatter -> unit) -> unit @@ -70,10 +70,34 @@ (** If the supplied offsetmap has an arithmetic type and contains indeterminate bits (uninitialized, or escaping address), raises the corresponding alarm(s) - and returns the reduced offsetmap. + and returns the reduced offsetmap and state. The location is the original + source of the offsetmap, and is used to reduce [state]. The syntactic context must have been positioned by the caller. If - some bits are guaranteed to be indeterminate, returns [None]; this indicates - completely erroneous code. *) -val warn_indeterminate_offsetmap: - with_alarms:CilE.warn_mode -> - typ -> Cvalue.V_Offsetmap.t -> Cvalue.V_Offsetmap.t option + some bits are guaranteed to be indeterminate, returns [`Bottom]; this + indicates completely erroneous code. *) +val warn_reduce_indeterminate_offsetmap: + with_alarms:CilE.warn_mode -> + typ -> Cvalue.V_Offsetmap.t -> + [`PreciseLoc of Precise_locs.precise_location | `Loc of location | `NoLoc] -> + Cvalue.Model.t -> + [`Bottom | `Res of Cvalue.V_Offsetmap.t * Cvalue.Model.t] + +val maybe_warn_div: with_alarms:CilE.warn_mode -> Cvalue.V.t -> unit +(** Emit an alarm about a non-null divisor when the supplied value may + contain zero. *) + +val maybe_warn_indeterminate: + with_alarms:CilE.warn_mode -> Cvalue.V_Or_Uninitialized.t -> bool +(** Warn for unitialized or escaping bits in the value passed + as argument. Returns [true] when an alarm has been raised *) + +val maybe_warn_completely_indeterminate: + with_alarms:CilE.warn_mode -> + Locations.location -> Cvalue.V_Or_Uninitialized.t -> Cvalue.V.t -> unit +(** Print a message about the given location containing a completely + indeterminate value. *) + +val warn_top: unit -> 'a +(** Abort the analysis, signaling that Top has been found. (Should not + actually appear. No operation should produce Top, or those operations + should be abstracted unsoundly.) *) diff -Nru frama-c-20140301+neon+dfsg/src/value/widen.ml frama-c-20150201+sodium+dfsg/src/value/widen.ml --- frama-c-20140301+neon+dfsg/src/value/widen.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/widen.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) @@ -20,208 +20,141 @@ (* *) (**************************************************************************) - open Cil_types open Cil_datatype -class widen_visitor kf init_widen_hints init_enclosing_loop_info = object - (* visit all sub-expressions from [kf] definition *) +class widen_visitor kf init_widen_hints init_enclosing_loops = object(self) inherit Visitor.frama_c_inplace val widen_hints = init_widen_hints - val enclosing_loop_info = init_enclosing_loop_info + val enclosing_loops = init_enclosing_loops + + (* Caution: except for user pragmas (loop pragma WIDEN_HINTS), [stmt] is + always [None]. Because our current dataflow does not stabilize inner loop + before the outer ones, we sometimes end up widening an inner variable + inside an outer loop. Hence, we need to have the inner widening hints in + the outer loops. To do so, the simplest is to avoid specifying statements + altogether. This may be inefficient for codes that reuse loop indexes... *) + method private add_num_hints ?stmt ?base hints = + widen_hints := Widen_type.add_num_hints stmt base hints !widen_hints + + method private add_var_hints ~stmt hints = + widen_hints := Widen_type.add_var_hints stmt hints !widen_hints + + method private process_loop_pragma stmt p = match p with + | Widen_variables l -> begin + let f (lv, lt) t = match t with + | { term_node= TLval (TVar {lv_origin = Some vi}, _)} -> + (Base.Set.add (Base.of_varinfo vi) lv, lt) + | _ -> (lv, t::lt) + in + match List.fold_left f (Base.Set.empty, []) l with + | (var_hints, []) -> + (* the annotation is empty or contains only variables *) + self#add_var_hints ~stmt var_hints + | (_lv, _lt) -> + Kernel.warning ~once:true ~current:true + "could not interpret loop pragma relative to widening variables" + end + | Widen_hints l -> begin + let f (lv, lnum, lt) t = match t with + | { term_node= TLval (TVar { lv_origin = Some vi}, _)} -> + (Base.of_varinfo vi :: lv, lnum, lt) + | { term_node= TConst (Integer(v,_))} -> + (lv, Ival.Widen_Hints.add v lnum, lt) + | _ -> (lv, lnum, t::lt) + in + match List.fold_left f ([], Ival.Widen_Hints.empty, []) l with + | (vars, hints, []) -> + (* the annotation is empty or contains only variables *) + if vars = [] then + self#add_num_hints ~stmt hints + else + List.iter (fun base -> self#add_num_hints ~stmt ~base hints) vars + | _ -> + Kernel.warning ~once:true ~current:true + "could not interpret loop pragma relative to widening hint" + end + | _ -> () method! vstmt (s:stmt) = - begin - let infer_widen_variables bl enclosing_loop_info = - (* Look at the if-goto and if-break statements. - The variables of the condition are added to the - widening variable set for this loop. - These variables may control the loop. That may be not the case ! *) - (* Format.printf "Look at widening variables.\n" ; *) - let visitor = new widen_visitor kf widen_hints enclosing_loop_info + match s.skind with + | Loop (_, bl, _, _, _) -> begin + (* ZZZ: this code does not handle loops that are created using gotos. We + could improve this by finding the relevants statements using a + traversal of the CFG. *) + let annot = Annotations.code_annot s in + let pragmas = Logic_utils.extract_loop_pragma annot in + List.iter (self#process_loop_pragma s) pragmas; + let new_loop_info = s :: enclosing_loops in + let visitor = new widen_visitor kf widen_hints new_loop_info in + ignore (Visitor.visitFramacBlock visitor bl); + Cil.SkipChildren (* Otherwise the inner statements are visited multiple + times needlessly *) + end + | If (exp, bl_then, bl_else, _) -> begin + (* Look for if-goto and if-break statements. The variables of the + condition are added to the early widening variable set for this loop.*) + let aux_loop loop = + let loop_stmts = Stmts_graph.get_stmt_stmts loop in + let rec aux_block_loop bl = + match bl with + | {bstmts = []} -> () + | {bstmts = [{skind = Block bl}]} -> aux_block_loop bl + | {bstmts = ({skind = Break _; succs = [stmt]}| + {skind = Goto ({contents=stmt},_)}) + ::_} when not (Stmt.Set.mem stmt loop_stmts) -> + (* This block goes out of [loop]. The variables of [exp] are hints*) + let varinfos = Cil.extract_varinfos_from_exp exp in + let var_hints = + Varinfo.Set.fold + (fun vi set -> Base.Set.add (Base.of_varinfo vi) set) + varinfos Base.Set.empty + in + self#add_var_hints ~stmt:loop var_hints + | _ -> () in - ignore (Visitor.visitFramacBlock visitor bl); - Cil.SkipChildren + aux_block_loop bl_then; + aux_block_loop bl_else in - begin match s.skind with - | Loop (_, bl, _, _, _) -> - let annot = Annotations.code_annot s in - let l_pragma = Logic_utils.extract_loop_pragma annot in - let widening_stmts = match bl.bstmts with - | [] -> [ s] - | x :: _ -> [ s; x ] - in - (* Look at the loop pragmas *) - let is_pragma_widen_variables = ref false - in let f p = - match p with - | Widen_variables l -> - let f (lv, lt) t = - match t with - | { term_node= TLval (TVar {lv_origin = Some vi}, _)} -> - let b = Base.of_varinfo vi in - (* Format.printf "Reading user pragma for widening variable: %a.\n" - Base.pretty (Base.Var vi); *) - (Base.Set.add b lv, lt) - | _ -> (lv, t::lt) - in - begin match List.fold_left f (Base.Set.empty, []) l with - | (var_hints, []) -> - (* the annotation is empty or else, - there are only variables *) - List.iter - (fun widening_stmt -> - widen_hints := - Widen_type.add_var_hints - widening_stmt - var_hints - !widen_hints) - widening_stmts; - is_pragma_widen_variables := true - - | (_lv, _lt) -> - Kernel.warning ~once:true ~current:true - "could not interpret loop pragma relative to widening \ - variables" - end - | Widen_hints l -> - let f (lv, lnum, lt) t = - match t with - | { term_node= - TLval (TVar { lv_origin = Some vi}, _)} -> - let b = Base.of_varinfo vi in - (b::lv, lnum, lt) - | { term_node= TConst (Integer(v,_))} -> - (lv, Ival.Widen_Hints.add v lnum, lt) - | _ -> (lv, lnum, t::lt) - in begin - match List.fold_left f ([], Ival.Widen_Hints.empty, []) l with - | (vars, hints, []) -> - (* the annotation is empty or there are only variables *) - if vars = [] then - List.iter - (fun widening_stmt -> - widen_hints := - Widen_type.add_num_hints - (Some widening_stmt) None hints !widen_hints - ) widening_stmts - else - List.iter - (fun key -> - List.iter - (fun widening_stmt -> widen_hints := - Widen_type.add_num_hints (Some(widening_stmt)) - (Some key) hints !widen_hints) - widening_stmts) - vars - | _ -> - Kernel.warning ~once:true ~current:true - "could not interpret loop pragma relative to widening hint" - end - | _ -> () - in List.iter f l_pragma ; - if not !is_pragma_widen_variables then - (* ZZZ: this function does not handle loops that are created - using gotos. We could improve this by finding the relevants - statements using a traversal of the CFG. *) - let loop_stmts = Stmts_graph.get_stmt_stmts s in - (* There is no Widen_variables pragma for this loop. *) - infer_widen_variables bl (Some (widening_stmts, loop_stmts)) - else - Cil.DoChildren - | If (exp, bl_then, bl_else, _) -> - begin - match enclosing_loop_info with - | None -> () - | Some (widening_stmts, loop_stmts) -> - List.iter - (fun bl -> - match bl with - | {bstmts = []} -> () - | {bstmts = - ({skind = Break _; succs = [stmt]}| - {skind = Goto ({contents=stmt},_)})::_} - when not (Stmt.Set.mem stmt loop_stmts) -> - let varinfos = Cil.extract_varinfos_from_exp exp - in let var_hints = - Varinfo.Set.fold - (fun vi lv -> - (*Format.printf "Inferring pragma for widening variable: %a.\n" Base.pretty (Base.Var vi);*) - Base.Set.add (Base.of_varinfo vi) lv) - varinfos - Base.Set.empty - in - List.iter - (fun widening_stmt -> - widen_hints := - Widen_type.add_var_hints - widening_stmt - var_hints - !widen_hints) - widening_stmts - | _ -> ()) - [bl_then ; bl_else] - end; - Cil.DoChildren - | _ -> - Cil.DoChildren - end ; + List.iter aux_loop enclosing_loops; + Cil.DoChildren end + | _ -> Cil.DoChildren + method! vexpr (e:exp) = begin let with_succ v = [v ; Integer.succ v] and with_pred v = [Integer.pred v ; v ] and with_s_p_ v = [Integer.pred v; v; Integer.succ v] - and default_visit e = - match Cil.isInteger e with - | Some _int64 -> - (* - let v = Ival.Widen_Hints.V.of_int64 int64 - in widen_hints := Db.Widen_Hints.add_to_all v !widen_hints ; - *) - Cil.SkipChildren - | _ -> - Cil.DoChildren + and default_visit _e = Cil.DoChildren and unop_visit e = match e with | {enode=(CastE(_, { enode=Lval (Var varinfo, _)}) | Lval (Var varinfo, _))} -> let hints = Ival.Widen_Hints.singleton Integer.zero in let base = Base.of_varinfo varinfo in - widen_hints := - Widen_type.add_num_hints None (Some base) hints !widen_hints; - Cil.SkipChildren + self#add_num_hints ~base hints; + Cil.DoChildren | _ -> Cil.DoChildren and comparison_visit add1 add2 e1 e2 = - let add key set = + let add base set = let hints = - List.fold_right - Ival.Widen_Hints.add - set - Ival.Widen_Hints.empty + List.fold_right Ival.Widen_Hints.add set Ival.Widen_Hints.empty in - (*Format.printf "Adding widen hint %a for base %a@\n" Ival.Widen_Hints.pretty hints - Base.pretty key;*) - widen_hints := - Widen_type.add_num_hints None (Some key) hints !widen_hints + self#add_num_hints ~base hints in - begin - let e1,e2 = Cil.constFold true e1, Cil.constFold true e2 in - match (Cil.isInteger e1, Cil.isInteger e2, e1, e2) with - | Some int64, _, - _, {enode=(CastE(_, { enode=Lval (Var varinfo, _)}) - | Lval (Var varinfo, _))}-> - add (Base.of_varinfo varinfo) (add1 int64); - Cil.SkipChildren - | _, Some int64, - {enode=(CastE(_, { enode=Lval (Var varinfo, _)}) - | Lval (Var varinfo, _))}, _ -> - add (Base.of_varinfo varinfo) (add2 int64); - Cil.SkipChildren - | _ -> - Cil.DoChildren - end + let i1, i2 = Cil.constFoldToInt e1, Cil.constFoldToInt e2 in begin + match i1, i2, e1, e2 with + | Some int64, _, _, {enode=(CastE(_, { enode=Lval (Var varinfo, _)}) + | Lval (Var varinfo, _))}-> + add (Base.of_varinfo varinfo) (add1 int64) + | _, Some int64, {enode=(CastE(_, { enode=Lval (Var varinfo, _)}) + | Lval (Var varinfo, _))}, _ -> + add (Base.of_varinfo varinfo) (add2 int64) + | _ -> () + end; + Cil.DoChildren in match e.enode with | BinOp (Lt, e1, e2, _) @@ -238,6 +171,70 @@ unop_visit e | _ -> default_visit e end + + (* [idx] is an expression that serves as index in an access to an array + of size [size]. When possible, add hints for the variables in [idx] *) + method private add_index_hints size idx = + (* add the bounds [size-shift, size-shift-1] to the hints for [vidx] *) + let add_hint vidx size shift = + let bound1 = Integer.sub size shift in + let bound2 = Integer.(sub bound1 one) in + let hints = Ival.Widen_Hints.of_list [bound1; bound2] in + self#add_num_hints ~base:(Base.of_varinfo vidx) hints + in + (* Find insided [idx] a variable on which we will add hints. [shift] is an + integer that indicates that we access to [idx+shift], instead of to + [idx] directly *) + let rec aux_idx idx shift = + match idx.enode with + | Lval (Var vidx, _) -> add_hint vidx size shift + | CastE (typ, e') when Cil.isIntegralType typ -> + (* It is safe to ignore casts: hints do not need to be sound. *) + aux_idx e' shift + | BinOp ((PlusA | MinusA as op), e1, e2, _) -> begin + (* See if either [e1] or [e2] is constant. If so, find a variable in + the other expression and add a hint for this variable, shifted. *) + let shift' s = + if op = PlusA then Integer.add shift s else Integer.sub shift s + in + match Cil.constFoldToInt e1 with + | Some shift1 -> aux_idx e2 (shift' shift1) + | None -> begin + match Cil.constFoldToInt e2 with + | None -> () + | Some shift2 -> aux_idx e1 (shift' shift2) + end + end + | _ -> () + in + aux_idx idx Integer.zero + + (* Find an array access and infer hints for the variables involved. We visit + the l-value ourselves. This way, we catch all accesses, including in + sub-structures. *) + method private find_array_accesses (host, off) = + let rec aux_offset typ offs = + match offs with + | NoOffset -> () + | Field (fi, off) -> aux_offset fi.ftype off + | Index (idx, off) -> begin + match Cil.unrollType typ with + | TArray (typ_e, size, _, _) -> begin + aux_offset typ_e off; + try + let size = Cil.lenOfArray64 size in + if Integer.(gt size zero) then + self#add_index_hints size idx + with Cil.LenOfArray -> () + end + | _ -> () + end + in + aux_offset (Cil.typeOfLhost host) off + + method! vlval lv = + self#find_array_accesses lv; + Cil.DoChildren end let compute_widen_hints kf default_widen_hints = @@ -248,7 +245,7 @@ | Definition (fd,_) -> begin let widen_hints = ref default_widen_hints in - let visitor = new widen_visitor kf widen_hints None in + let visitor = new widen_visitor kf widen_hints [] in ignore (Visitor.visitFramacFunction visitor fd); !widen_hints end diff -Nru frama-c-20140301+neon+dfsg/src/value/widen.mli frama-c-20150201+sodium+dfsg/src/value/widen.mli --- frama-c-20140301+neon+dfsg/src/value/widen.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/value/widen.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/calculus.ml frama-c-20150201+sodium+dfsg/src/wp/calculus.ml --- frama-c-20140301+neon+dfsg/src/wp/calculus.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/calculus.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -499,7 +499,7 @@ | Switch _-> assert false | Block _-> assert false | UnspecifiedSequence _-> assert false - | TryExcept _ | TryFinally _ -> assert false + | TryExcept _ | TryFinally _ | Throw _ | TryCatch _ -> assert false let wp_scope wenv vars scope obj = debug "[wp_scope] %s : %a@." @@ -667,32 +667,57 @@ let lv = Cil.addOffsetLval off lv in init_global_variable wenv lv init obj) implicit_defaults (List.rev initl) - + + let compute_global_init wenv filter obj = + Globals.Vars.fold_in_file_order + (fun var initinfo obj -> + if var.vstorage = Extern then obj else + let do_init = match filter with + | `All -> true + | `InitConst -> WpStrategy.isGlobalInitConst var + in if not do_init then obj + else + let old_loc = Cil.CurrentLoc.get () in + Cil.CurrentLoc.set var.vdecl ; + let obj = + match initinfo.init with + | None -> + W.init_value + wenv (Var var,NoOffset) var.vtype None obj + | Some init -> + let lv = Var var, NoOffset in + init_global_variable wenv lv init obj + in Cil.CurrentLoc.set old_loc ; obj + ) obj + + let process_global_const wenv obj = + Globals.Vars.fold_in_file_order + (fun var _initinfo obj -> + if WpStrategy.isGlobalInitConst var + then W.init_const wenv var obj + else obj + ) obj (* WP of global initialisations. *) let process_global_init wenv kf obj = - if WpStrategy.is_main_init kf then - List.fold_left - (fun obj global -> - match global with - | GVar (var, initinfo, loc) -> - if var.vstorage = Extern then obj - else - let old_loc = Cil.CurrentLoc.get () in - Cil.CurrentLoc.set loc ; - let obj = - match initinfo.init with - | None -> - W.init_value - wenv (Var var,NoOffset) var.vtype None obj - | Some init -> - let lv = Var var, NoOffset in - init_global_variable wenv lv init obj - in Cil.CurrentLoc.set old_loc ; obj - | _ -> obj - ) obj (Ast.get()).globals + if WpStrategy.is_main_init kf then + begin + let obj = W.label wenv Clabels.Init obj in + compute_global_init wenv `All obj + end + else if W.has_init wenv then + begin + let obj = + if WpStrategy.isInitConst () + then process_global_const wenv obj else obj in + let obj = W.use_assigns wenv None None WpPropId.mk_init_assigns obj in + let obj = W.label wenv Clabels.Init obj in + compute_global_init wenv `All obj + end else - obj + if WpStrategy.isInitConst () + then compute_global_init wenv `InitConst obj + else obj let get_weakest_precondition cfg ((kf, _g, strategy, res, wenv) as env) = debug "[wp-cfg] start Pass1"; diff -Nru frama-c-20140301+neon+dfsg/src/wp/calculus.mli frama-c-20150201+sodium+dfsg/src/wp/calculus.mli --- frama-c-20140301+neon+dfsg/src/wp/calculus.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/calculus.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/cfgDump.ml frama-c-20150201+sodium+dfsg/src/wp/cfgDump.ml --- frama-c-20140301+neon+dfsg/src/wp/cfgDump.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/cfgDump.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -36,9 +36,9 @@ let init kf bhv = begin let name = - match bhv with - | None -> Kernel_function.get_name kf - | Some bname -> Kernel_function.get_name kf ^ "_" ^ bname + match bhv with + | None -> Kernel_function.get_name kf + | Some bname -> Kernel_function.get_name kf ^ "_" ^ bname in let file = Filename.concat (Wp_parameters.get_output ()) name in Wp_parameters.feedback "CFG %a -> %s@." Kernel_function.pretty kf name ; @@ -56,11 +56,11 @@ Format.fprintf !out "}@." ; out := Format.std_formatter ; match !fc with - | None -> () - | Some (fout,file) -> - close_out fout ; - ignore (Sys.command - (Printf.sprintf "dot -Tpdf %s.dot > %s.pdf" file file)) + | None -> () + | Some (fout,file) -> + close_out fout ; + ignore (Sys.command + (Printf.sprintf "dot -Tpdf %s.dot > %s.pdf" file file)) end (* -------------------------------------------------------------------------- *) @@ -78,13 +78,15 @@ let merge _env k1 k2 = if k1=0 then k2 else - if k2=0 then k1 else - let u = node () in - Format.fprintf !out " %a [ label=\"\" , shape=circle ] ;@." pretty u ; - link u k1 ; link u k2 ; u + if k2=0 then k1 else + let u = node () in + Format.fprintf !out " %a [ label=\"\" , shape=circle ] ;@." pretty u ; + link u k1 ; link u k2 ; u let empty = 0 + let has_init _ = false + type t_env = Kernel_function.t let new_env ?lvars kf : t_env = ignore lvars ; kf @@ -106,14 +108,14 @@ let u = node () in Format.fprintf !out " %a [ color=red , label=\"Assigns %a\" ] ;@." pretty u WpPropId.pp_propid pid ; merge env u k - + let use_assigns _env _stmt region _ k = let u = node () in begin match region with | None -> - Format.fprintf !out " %a [ color=orange , label=\"Havoc All\" ] ;@." pretty u + Format.fprintf !out " %a [ color=orange , label=\"Havoc All\" ] ;@." pretty u | Some pid -> - Format.fprintf !out " %a [ color=orange , label=\"Havoc %a\" ] ;@." pretty u WpPropId.pp_propid pid + Format.fprintf !out " %a [ color=orange , label=\"Havoc %a\" ] ;@." pretty u WpPropId.pp_propid pid end ; link u k ; u @@ -133,11 +135,11 @@ let u = node () in begin match r with - | None -> - Format.fprintf !out " %a [ color=orange , label=\"Return\" ] ;@." pretty u - | Some e -> - Format.fprintf !out " %a [ color=orange , label=\"Return %a\" ] ;@." pretty u - Printer.pp_exp e + | None -> + Format.fprintf !out " %a [ color=orange , label=\"Return\" ] ;@." pretty u + | Some e -> + Format.fprintf !out " %a [ color=orange , label=\"Return %a\" ] ;@." pretty u + Printer.pp_exp e end ; link u k ; u @@ -154,15 +156,16 @@ let init_value _ _ _ _ k = k let init_range _ _ _ _ _ k = k + let init_const _ _ k = k let tag s k = let u = node () in Format.fprintf !out " %a [ color=cyan , label=\"Tag %s\" ] ;@." pretty u s ; link u k ; u - + let loop_entry w = tag "BeforeLoop" w let loop_step w = tag "InLoop" w - + let call_dynamic _env _stmt _pid fct calls = let u = node () in Format.fprintf !out " %a [ color=red , label \"CallPtr %a\" ];@." pretty u @@ -174,14 +177,14 @@ Format.fprintf !out " %a [ color=red , label=\"Prove PreCond %a\" ] ;@." pretty u Kernel_function.pretty kf ; ignore pre ; merge env u k - + let call _env _stmt _r kf _es ~pre ~post ~pexit ~assigns ~p_post ~p_exit = let u = node () in Format.fprintf !out " %a [ color=orange , label=\"Call %a\" ] ;@." pretty u Kernel_function.pretty kf ; ignore pre ; ignore post ; ignore pexit ; ignore assigns ; link u p_post ; link u p_exit ; u - + let pp_scope sc fmt xs = let title = match sc with | Mcfg.SC_Global -> "Global" @@ -201,7 +204,7 @@ Format.fprintf !out " %a [ color=lightblue , label=\"%a\" ] ;@." pretty u (pp_scope scope) xs ; link u k ; u - + let close kfenv k = let u = node () in Format.fprintf !out " %a [ color=cyan , label=\"Function %a\" ] ;@." pretty u @@ -219,35 +222,35 @@ (* ------------------------------------------------------------------------ *) class computer = -object - - val mutable wptasks = [] - - method lemma = true - method add_lemma (_ : LogicUsage.logic_lemma) = () - - method add_strategy strategy = - wptasks <- strategy :: wptasks - - method compute : Wpo.t Bag.t = - begin - - (* Generates Wpos and accumulate exported goals *) - List.iter - (fun strategy -> - let cfg = WpStrategy.cfg_of_strategy strategy in - let kf = Cil2cfg.cfg_kf cfg in - let bhv = WpStrategy.behavior_name_of_strategy strategy in - VC.init kf bhv ; - try ignore (WP.compute cfg strategy) ; VC.flush () - with err -> VC.flush () ; raise err - ) wptasks ; - wptasks <- [] ; - Bag.empty - - end (* method compute *) - -end (* class computer *) - + object + + val mutable wptasks = [] + + method lemma = true + method add_lemma (_ : LogicUsage.logic_lemma) = () + + method add_strategy strategy = + wptasks <- strategy :: wptasks + + method compute : Wpo.t Bag.t = + begin + + (* Generates Wpos and accumulate exported goals *) + List.iter + (fun strategy -> + let cfg = WpStrategy.cfg_of_strategy strategy in + let kf = Cil2cfg.cfg_kf cfg in + let bhv = WpStrategy.behavior_name_of_strategy strategy in + VC.init kf bhv ; + try ignore (WP.compute cfg strategy) ; VC.flush () + with err -> VC.flush () ; raise err + ) wptasks ; + wptasks <- [] ; + Bag.empty + + end (* method compute *) + + end (* class computer *) + let create () = (new computer :> Generator.computer) diff -Nru frama-c-20140301+neon+dfsg/src/wp/cfgDump.mli frama-c-20150201+sodium+dfsg/src/wp/cfgDump.mli --- frama-c-20140301+neon+dfsg/src/wp/cfgDump.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/cfgDump.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/CfgLib.ml frama-c-20150201+sodium+dfsg/src/wp/CfgLib.ml --- frama-c-20140301+neon+dfsg/src/wp/CfgLib.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/CfgLib.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -36,7 +36,7 @@ type node = int type transition = node T.transition - + type cfg = cell Vector.t and cell = { mutable pred : node list ; @@ -53,15 +53,15 @@ let set_pred cfg n t = T.iter (fun p -> - let cell = Vector.get cfg p in - cell.pred <- n :: cell.pred - ) t + let cell = Vector.get cfg p in + cell.pred <- n :: cell.pred + ) t let del_pred cfg n t = T.iter (fun p -> - let cell = Vector.get cfg p in - cell.pred <- remove n cell.pred - ) t + let cell = Vector.get cfg p in + cell.pred <- remove n cell.pred + ) t let node cfg = Vector.addi cfg { next=T.empty ; pred=[] } @@ -104,7 +104,7 @@ Format.kfprintf (fun fmt -> Format.fprintf fmt "] ;@.") fmt msg - + let dot cfg label file = let name , format = let base = Filename.chop_extension file in @@ -114,32 +114,32 @@ in let fdot,out = if format = "dot" then - (file , open_out file) + (file , open_out file) else - Filename.open_temp_file "cfg" ".dot" in + Filename.open_temp_file "cfg" ".dot" in let fmt = Format.formatter_of_out_channel out in let s = try - Format.fprintf fmt "digraph %S {@\n" name ; - Format.fprintf fmt " rankdir = TB ;@\n" ; - Format.fprintf fmt " node [ style = filled, shape = box ] ;@\n" ; - iter (fun n t -> label fmt n t) cfg ; - Format.fprintf fmt "}@." ; - close_out out ; - if format = "dot" then 0 else - let cmd = Printf.sprintf "dot -T%s %s > %s" format fdot file - in Sys.command cmd + Format.fprintf fmt "digraph %S {@\n" name ; + Format.fprintf fmt " rankdir = TB ;@\n" ; + Format.fprintf fmt " node [ style = filled, shape = box ] ;@\n" ; + iter (fun n t -> label fmt n t) cfg ; + Format.fprintf fmt "}@." ; + close_out out ; + if format = "dot" then 0 else + let cmd = Printf.sprintf "dot -T%s %s > %s" format fdot file + in Sys.command cmd with e -> - Format.pp_print_flush fmt () ; - close_out out ; - raise e + Format.pp_print_flush fmt () ; + close_out out ; + raise e in if s <> 0 then failwith ("CfgLib.dot exit " ^ string_of_int s) end module Attr(C : Cfg) = struct - + type 'a t = 'a * 'a Vector.t let create cfg default = let m = Vector.create () in diff -Nru frama-c-20140301+neon+dfsg/src/wp/CfgLib.mli frama-c-20150201+sodium+dfsg/src/wp/CfgLib.mli --- frama-c-20140301+neon+dfsg/src/wp/CfgLib.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/CfgLib.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -29,7 +29,7 @@ (** Creating CFG *) module Make(T : Transition) : Cfg with module T = T - + (** Labeling nodes *) module Labels(C : Cfg)(H : Hashtbl.S) : @@ -38,9 +38,9 @@ type label = H.key val create : ?size:int -> C.cfg -> t val label : t -> label -> C.node - (** Retrieve (or create) the node associated to the label. *) + (** Retrieve (or create) the node associated to the label. *) val set_label : t -> label -> C.node -> unit - (** Register the label to points to the given node. *) + (** Register the label to points to the given node. *) val iter : (H.key -> C.node -> unit) -> t -> unit end @@ -67,10 +67,10 @@ val create : A.cfg -> B.cfg -> t (** Graph [A] should be static : further nodes in [A] can not be indexed. [B] is free of constraint. *) - + val image : t -> A.node -> B.node val set_image : t -> A.node -> B.node -> unit - + (** Duplicates [A] into [B] with the provided morphism. *) val copy : t -> (A.node -> A.transition -> B.transition) -> unit end diff -Nru frama-c-20140301+neon+dfsg/src/wp/CfgTypes.mli frama-c-20150201+sodium+dfsg/src/wp/CfgTypes.mli --- frama-c-20140301+neon+dfsg/src/wp/CfgTypes.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/CfgTypes.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -72,11 +72,11 @@ val pp_node : dotter -> node -> ('a,Format.formatter,unit) format -> 'a (** Print the attributes of the node in the [.dot] file. Typically : [G.pp_node n "label=\"Root\", color=red" ;] *) - + val pp_edge : dotter -> node -> node -> ('a,Format.formatter,unit) format -> 'a (** Print the attributes of the edge in the [.dot] file. Typically : [G.pp_node n "style=dotted" ;] *) - + type pp_cfg = dotter -> node -> transition -> unit val dot : cfg -> pp_cfg -> string -> unit diff -Nru frama-c-20140301+neon+dfsg/src/wp/cfgWP.ml frama-c-20150201+sodium+dfsg/src/wp/cfgWP.ml --- frama-c-20140301+neon+dfsg/src/wp/cfgWP.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/cfgWP.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -188,9 +188,6 @@ let sigma_opt = function None -> Sigma.create () | Some s -> s let sigma_at w = sigma_opt w.sigma - let sigma_any ~call w = match w.sigma with - | None -> Sigma.create () - | Some s -> Sigma.havoc_any ~call s let sigma_union s1 s2 = match s1 , s2 with | None , s | s , None -> sigma_opt s , Passive.empty , Passive.empty @@ -208,9 +205,10 @@ let intersect_vc vc p = Vars.intersect (F.varsp p) vc.vars || Conditions.intersect p vc.hyps - let assume_vc ~descr ?hpid ?stmt ?warn hs vc = - if hs = [] && warn = None then vc - else + let assume_vc ~descr ?hpid ?stmt ?warn ?(filter=false) hs vc = + if (hs = [] && warn = None) || + (filter && not (List.exists (intersect_vc vc) hs)) + then vc else let path = match stmt with | None -> vc.path | Some s -> S.add s vc.path in @@ -346,6 +344,12 @@ vcs = Gmap.empty ; } + let has_init wenv = + let frame = wenv.frame in + let init = L.mem_at_frame frame Clabels.Init in + let domain = Sigma.domain init in + not (M.Heap.Set.is_empty domain) + let merge wenv wp1 wp2 = L.in_frame wenv.frame (fun () -> @@ -373,7 +377,7 @@ (fun wp -> match wp.sigma with | None -> - let s = sigma_at wp in + let s = Sigma.create () in phi (L.move wenv.main s) { wp with sigma = Some s } | Some s -> phi (L.move wenv.main s) wp) wp @@ -384,7 +388,9 @@ let rec intros hs p = match F.pred p with - | Logic.Bind(Logic.Forall,_,p) -> intros hs p + | Logic.Bind(Logic.Forall,t,p) -> + let x = Lang.freshvar t in + intros hs (F.p_bool (F.lc_open x p)) | Logic.Imply(hs2,p) -> intros (hs @ hs2) p | _ -> hs , p @@ -577,7 +583,7 @@ let use_assigns wenv stmt hpid ainfo wp = in_wenv wenv wp begin fun env wp -> match ainfo.a_assigns with - + | WritesAny -> let sigma = Sigma.havoc_any ~call:false (L.sigma env) in let vcs = do_assigns_everything ?stmt wp.effects wp.vcs in @@ -826,7 +832,7 @@ let warn,hyp = match outcome with | Warning.Failed warn -> warn , F.p_true | Warning.Result(warn , hyp) -> warn , hyp in - let vcs = gmap (assume_vc ~descr:"Initializer" ~warn [hyp]) wp.vcs in + let vcs = gmap (assume_vc ~filter:true ~descr:"Initializer" ~warn [hyp]) wp.vcs in { wp with vcs = vcs }) let init_range wenv lv typ a b wp = in_wenv wenv wp @@ -842,7 +848,17 @@ let warn,hyp = match outcome with | Warning.Failed warn -> warn , F.p_true | Warning.Result(warn , hyp) -> warn , hyp in - let vcs = gmap (assume_vc ~descr:"Initializer" ~warn [hyp]) wp.vcs in + let vcs = gmap (assume_vc ~filter:true ~descr:"Initializer" ~warn [hyp]) wp.vcs in + { wp with vcs = vcs }) + + let init_const wenv v wp = in_wenv wenv wp + (fun env wp -> + let obj = Ctypes.object_of v.vtype in + let loc = M.cvar v in + let value = M.load (L.sigma env) obj loc in + let init = M.load (L.mem_at env Clabels.Init) obj loc in + let hyp = F.p_equal (C.cval value) (C.cval init) in + let vcs = gmap (assume_vc ~filter:true ~descr:"Global Const" [hyp]) wp.vcs in { wp with vcs = vcs }) (* -------------------------------------------------------------------------- *) @@ -920,13 +936,14 @@ wp.vcs pre in { wp with vcs = vcs } | Warning.Result(warn,vs) -> + let init = L.mem_at env Clabels.Init in let call_e = L.call sigma in - let call_f = L.call_pre kf vs sigma in + let call_f = L.call_pre init kf vs sigma in let vcs = List.fold_left (fun vcs (gid,p) -> let outcome = Warning.catch ~severe:true ~effect:"Can not prove call precondition" - (L.in_frame call_f (L.pred ~positive:false call_e)) p in + (L.in_frame call_f (L.pred ~positive:true call_e)) p in match outcome with | Warning.Result(warn2,goal) -> let warn = W.union warn warn2 in @@ -968,7 +985,8 @@ let dummy = Sigma.create () in let vs = List.map (C.exp dummy) es in let env = L.move env0 dummy in - let frame = L.call_pre kf vs dummy in + let init = L.mem_at env0 Clabels.Init in + let frame = L.call_pre init kf vs dummy in Some (A.domain (L.in_frame frame (L.assigns_from env) froms)) let cc_havoc d s = match d with @@ -976,6 +994,7 @@ | Some domain -> { pre = Sigma.havoc s domain ; post = s } let cc_callenv env0 lvr kf es assigns wpost wexit = + let init = L.mem_at env0 Clabels.Init in let dom_call = cc_call_domain env0 kf es assigns in let dom_vret = cc_result_domain lvr in (* Sequences to be considered *) @@ -999,9 +1018,9 @@ seq_exit = seq_exit ; seq_result = seq_result ; loc_result = result ; - frame_pre = L.call_pre kf formals sigma_pre ; - frame_post = L.call_post kf formals seq_post ; - frame_exit = L.call_post kf formals seq_exit ; + frame_pre = L.call_pre init kf formals sigma_pre ; + frame_post = L.call_post init kf formals seq_post ; + frame_exit = L.call_post init kf formals seq_exit ; } type call_vcs = { @@ -1227,7 +1246,8 @@ (* --- WPO Grouper --- *) (* -------------------------------------------------------------------------- *) - module PMAP = FCMap.Make(P) + (* NOTE: bug in ocamldoc in OCaml 4.02 prevents usage of 'P' here *) + module PMAP = FCMap.Make(WpPropId.PropId) type group = { mutable verifs : VC_Annot.t Bag.t ; @@ -1326,8 +1346,8 @@ (* -------------------------------------------------------------------------- *) let add_qed_check collection model ~qed ~raw ~goal = - let id = Printf.sprintf "Qed-%s-%d-%d" - (Lang.F.head raw) (Lang.F.id qed) (Lang.F.id raw) in + let id = Printf.sprintf "Qed-%d-%d" + (Lang.F.id qed) (Lang.F.id raw) in let pip = Property.ip_other id None Kglobal in let pid = WpPropId.mk_check pip in let vck = let open VC_Check in { raw ; qed ; goal } in diff -Nru frama-c-20140301+neon+dfsg/src/wp/cfgWP.mli frama-c-20150201+sodium+dfsg/src/wp/cfgWP.mli --- frama-c-20140301+neon+dfsg/src/wp/cfgWP.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/cfgWP.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Cfloat.ml frama-c-20150201+sodium+dfsg/src/wp/Cfloat.ml --- frama-c-20140301+neon+dfsg/src/wp/Cfloat.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Cfloat.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -41,10 +41,10 @@ let make_fun_float name f = extern_f ~library ~result ~params "%s_%a" name Ctypes.pp_float f - + let make_pred_float name f = extern_f ~library ~result:Logic.Prop ~params "%s_%a" name Ctypes.pp_float f - + let f_of_int = extern_f ~library:"qed" ~result "real_of_int" @@ -90,15 +90,15 @@ let model = Context.create ~default:Real "Cfloat.model" let configure = Context.set model - + (* -------------------------------------------------------------------------- *) (* --- Litterals --- *) (* -------------------------------------------------------------------------- *) let code_lit f = match Context.get model with - | Real -> e_mthfloat f - | Float -> e_hexfloat f + | Real -> e_mthfloat f + | Float -> e_hexfloat f let suffixed r_literal = let n = String.length r_literal in @@ -110,12 +110,12 @@ let open Cil_types in function { r_literal ; r_nearest } -> match Context.get model with - | Float -> - if suffixed r_literal - then e_hexfloat r_nearest - else e_real (R.of_string r_literal) - | Real -> - e_mthfloat r_nearest + | Float -> + if suffixed r_literal + then e_hexfloat r_nearest + else e_real (R.of_string r_literal) + | Real -> + e_mthfloat r_nearest let round_lit flt r = let open Floating_point in @@ -212,10 +212,10 @@ begin add_builtin "\\model" [F Float32] f_model ; add_builtin "\\model" [F Float64] f_model ; - add_builtin "\\delta" [F Float32] f_model ; - add_builtin "\\delta" [F Float64] f_model ; - add_builtin "\\epsilon" [F Float32] f_model ; - add_builtin "\\epsilon" [F Float64] f_model ; + add_builtin "\\delta" [F Float32] f_delta ; + add_builtin "\\delta" [F Float64] f_delta ; + add_builtin "\\epsilon" [F Float32] f_epsilon ; + add_builtin "\\epsilon" [F Float64] f_epsilon ; end (* -------------------------------------------------------------------------- *) @@ -297,24 +297,24 @@ let real_of_int a = e_fun f_of_int [a] let float_of_int f a = fconvert f (real_of_int a) - + let frange = let is_float = Ctypes.fmemo (make_pred_float "is") in fun f a -> p_call (is_float f) [a] - + (* -------------------------------------------------------------------------- *) (* --- Float Arithmetics --- *) (* -------------------------------------------------------------------------- *) - + let runop op f x = match Context.get model with - | Real -> op x - | Float -> e_fun f [x] + | Real -> op x + | Float -> e_fun f [x] let rbinop op f x y = match Context.get model with - | Real -> op x y - | Float -> e_fun f [x;y] + | Real -> op x y + | Float -> e_fun f [x;y] let funop op f x = fconvert f (op x) @@ -337,16 +337,16 @@ let compute_f_of_int = function | [e] -> begin - match F.repr e with - | Qed.Logic.Kint k -> - let m = Z.to_string k in - let r = R.of_string (m ^ ".") in - F.e_real r - | _ -> raise Not_found + match F.repr e with + | Qed.Logic.Kint k -> + let m = Z.to_string k in + let r = R.of_string (m ^ ".") in + F.e_real r + | _ -> raise Not_found end | _ -> raise Not_found let () = F.set_builtin f_of_int compute_f_of_int ; -(* -------------------------------------------------------------------------- *) + (* -------------------------------------------------------------------------- *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Cfloat.mli frama-c-20150201+sodium+dfsg/src/wp/Cfloat.mli --- frama-c-20140301+neon+dfsg/src/wp/Cfloat.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Cfloat.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Changelog frama-c-20150201+sodium+dfsg/src/wp/Changelog --- frama-c-20140301+neon+dfsg/src/wp/Changelog 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Changelog 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,213 @@ +############################################################################### +# Preliminary notes: # +# ------------------ # +# Mark "-": change with an impact for users (and possibly developers). # +# Mark "o": change with an impact for developers only. # +# Mark "+": change for Frama-C-commits audience (not in html version) # +# Mark "*": bug fixed. # +# Mark "!": change that can break compatibility with existing development. # +# '#nnn' : BTS entry #nnn # +# '#!nnn' : BTS private entry #nnn # +# For compatibility with old change log formats: # +# '#?nnn' : OLD-BTS entry #nnn # +############################################################################### +# Categories: +# Cmd: command line interface +# Gui: graphical user interface +# Makefile: Makefile +# WP: proof obligation calculus +# : memory model +# : prover +############################################################################### + +############################# +Plugin WP 0.8 Sodium_20150201 +############################# + +- WP [2014/09/24] Now accept patterns in drivers. +- WP [2014/09/05] Drivers for min/max. +- Typed [2014/09/04] Simplification of assigns and separated. +-* Gui [2014/09/04] Fixed bug #1688 (recover results from cmdline). +-! WP [2014/07/09] Next to the new way the kernel handles command line + options, -wp-include +dir has to be replaced by -wp-include ++dir. + Forward and backward compatibilities are broken. +- WP [2014/06/11] Some improvements on bitwise operators. +- Cmd [2014/05/22] Added option -wp-filename-truncation to truncate + proof obligation filenames. + +########################### +Plugin WP 0.8 Neon_20140301 +########################### + +- Gui [2014/01/30] Edition of current proof script (right-click). +- Gui [2014/01/30] Consistent icons with status. +- Driver [2014/01/30] Refactoring of prover external libraries. + (consult driver section in manual). +-* WP [2014/01/16] Important bug-fix in CFG (missing hyps in goals). +-* WP [2013/12/11] Major speed-up for huge functions. +- WP [2014/01/30] Many improvements on reals and floats. +- WP [2014/01/30] Many improvements on bitwise operators. +- WP [2014/01/30] Better integration with Why-3 and Coq. +- WP [2013/12/09] Clever assigns everything with formals and locals. +- WP [2013/11/26] More type constraints in typed memory model. + +############################### +Plugin WP 0.7 Fluorine_20130501 +############################### + +-* Typed [2013/05/23] Better trigger generation for arrays with Alt-Ergo. +-* Provers [2013/05/23] Fixed various bugs with drivers and provers. +-* WP [2013/05/23] Fixed various bugs on floats. +-* Typed [2013/05/23] Fixed bug on address differences and offsets. + +############################### +Plugin WP 0.7 Fluorine_20130401 +############################### + +-* Makefile [2013/04/17] Fixed bug #1385 about ocamllex.opt. +-! Cmd [2013/04/15] Removed now useless options -wp-huge, -wp-dot, + -wp-trace. +- Cmd [2013/04/15] Added option -wp-skip-fct to exclude functions. +- Cmd [2013/04/15] Using -wp-prover instead of -wp-proof + (kept for compatibility). +- Gui [2013/04/15] New Why3 provers selection, added -wp-detect to + force detection. +- WP [2013/02/29] Added support for string literals (-wp-literals). +- WP [2013/02/01] New simplification engine (specific options). +- WP [2013/02/01] New interface to model selection (unique + -wp-model option). +- WP [2013/02/01] Experimental float and machine-integer models. +- WP [2013/02/01] 'Store' and 'Runtime' models abandonned. +- WP [2013/01/09] 'Typed' becomes the default model. +- Why3 [2012/12/18] Why3 output (-wp-proof why3:xxx). +- Typed [2012/10/23] Extensions of Typed model (unsafe-casts). +- WP [2012/10/09] Drivers for linking ACSL symbols to external + libs (-wp-driver). + +############################# +Plugin WP 0.6 Oxygen_20120901 +############################# + +- WP [2012/09/14] Experimental simplifier with new 'Typed' model + (see manual). +o! WP [2012/09/05] Enhanced Ocaml API (see manual). Old bindings + are preserved, but now emit a deprecated warning. +-* WP [2012/07/31] Fixed issue about -ulevel option (bug #1244). +- WP [2012/06/30] Truncating too long log filenames. +- WP [2012/06/20] Enhanced statistics for -wp-report (see manual). +-* Coq [2012/05/22] Better translation in Coq for floats and reals + (fixed bugs #1174 and #1176). +- Gui [2012/05/15] Graphical version of Alt-Ergo (altgr-ergo) can be + launched from the 'Proof Obligation Panel'. +- Cmd [2012/03/15] Extended selection language: -wp-prop [+|-][@]id + to add or remove property category or name. +- WP [2012/03/06] Better elimination of let constructs for -wp-norm Eqs + option. +- WP [2012/02/08] Limited support for triggers in axioms and lemmas. +- Cmd [2012/02/03] Extended support for external libraries: + Options -wp-coq-lib, -wp-why-lib and now -wp-alt-ergo-lib. + +############################### +Plugin WP 0.5 Nitrogen_20111001 +############################### + ++* Store [2012/01/03] Adding guard for 'fresh' axiomatization in Store. ++ WP [2011/12/23] Timing. +- Gui [2011/12/19] Changes into Gui panel. +- Cmd [2011/12/16] Adding support for reporting with option: -wp-report. ++* WP [2011/11/25] Fixed bug #!1020 on arbitrary invariants. +- Cmd [2011/11/22] Adding support for external proof libraries. + See options -wp-include, -wp-tactic, -wp-coq-lib and -wp-why-lib. +- Cmd [2011/11/21] Adding support for multi-provers in command line. + +############################### +Plugin WP 0.4 Nitrogen_20111001 +############################### + +- WP [2011/10/24] Further improvement for proof of assigns clauses. +- WP [2011/10/14] A warning is now emitted for missing assigns clauses. ++* WP [2011/09/30] Fixed bug #!572 for logic declaration without + 'reads' clause. ++* WP [2011/09/22] Fixed bug #!970 for labels that may escape the + control flow. ++* WP [2011/09/07] Fixed bug #!943 on translation of reals and floats +- Cmd [2011/08/25] Optimization of arguments passing by reference + with option: -wp-byreference. +- WP [2011/09/15] Improvements of conversion between C-integers + and Z-integers. +- WP [2011/07/22] Optimization of arguments passing by reference. +- WP [2011/07/22] Print of formula change. +- Gui [2011/06/29] Feedback for proof of preconditions at call sites. +- Gui [2011/06/29] New menu options to prove preconditions at one + or all call sites. +- Cmd [2011/06/17] Added option -wp-proof-trace to obtain more + informations from provers when available (option 'Trace' in GUI). +-! Ergo [2011/06/17] Alt-Ergo is always used with builtin arrays. + Removed option -wp-arrays. +- Vampire [2011/06/10] Support for Vampire as back-end prover. +-* WP [2011/06/10] In some cases, a proof attempt could silently + failed. It is now properly reported. +- Gui [2011/06/07] Default output directory is set to + /.frama-c-wp in Gui. +- Gui [2011/06/07] Enhancement of Proof-Obligation panel. +-! WP [2011/05/20] Translation of axioms with labels + (removed option -wp-axioms). ++ Caveat [2011/05/19] Suppression of legacy Caveat model. +- Hoare [2011/05/19] New Hoare model + (now implemented on top of logic variables). +- WP [2011/05/19] Handling partial initializers in C global variables. +- Cmd [2011/05/17] New engine to compute proof obligations for + arbitrary invariants. See option -wp-invariants. +-! Ergo [2011/05/17] Alt-Ergo 0.93 now required. +-! Gui [2011/05/17] Removed 'Refresh' button from WP panel. ++* Gui [2011/05/17] Fixed bug #!706 : property status not refreshed. ++* Gui [2011/05/17] Fixed bug #!707 : unexpected run of wp provers + after -then. ++* WP [2011/05/02] Fixed bug #!708 (missing definitions in + environments). +- WP [2011/04/29] Alt-Ergo is now selected (and run) by default. +-* WP [2011/04/29] Fixed problems with -wp-out . +- WP [2011/04/21] Better representation of records and unions in logic. +- WP [2011/04/21] No more logic generic pointers. Pointer arithmetics + moved to memory models. +-* Store [2011/04/21] Better representation of pointers (issue #796). +-* Gui [2011/04/15] Fixed bug on PO status (wrong PO identification). +-* Gui [2011/04/13] Fixed bug #711 (cyclic dependencies). + +############################# +Plugin WP 0.3 Carbon_20110201 +############################# + +-* Coq [2011/04/08] Fixed bug #740 for Coq on Windows. + WP now uses directly coqtop -compile instead of coqc. +- Runtime [2011/04/01] Optimization of effect-assigns. +-* Store [2011/03/30] Fixed bug #766 about offsets in assigns. +- Cmd [2011/03/23] Adding version in -wp-help. ++* WP [2011/03/10] Proof of requires of the main entry point (bug #675). +- Cmd [2011/01/31] Option -wp-warnings to display additional + informations for 'Stronger' and 'Degenerated' goals. +- WP [2011/01/24] New spliting algorithm. See option -wp-split. + Option -wp-split-dim to limit spliting up to 2**n sub-goals. +- WP [2011/01/24] When -rte-precond is not used, + wp generates a separate proof obligation for each call site. +- Cmd [2011/01/20] Options -wp-status-xxx to refine goal selection +- Cmd [2011/01/19] Clarification of -save/-then effect on WP +-* Gui [2011/01/10] Fixed incorrect property status refresh in the GUI. +-* Coq [2011/01/04] Fixed bug #702 on Coq output with large integers. +-* WP [2011/03/10] Proof of requires of the main entry point (bug #675). + +############################# +Plugin WP 0.2 Carbon_20101202 +############################# + +-* Coq [2010/12/16] Fixed bug #639: no more compilation to shared + directory. +- Gui [2010/12/16] Accessibility of all provers from gui. + +############################# +Plugin WP 0.1 Carbon_20101201 +############################# + +- WP [2010/12/06] New WP plugin. + +############################# diff -Nru frama-c-20140301+neon+dfsg/src/wp/cil2cfg.ml frama-c-20150201+sodium+dfsg/src/wp/cil2cfg.ml --- frama-c-20140301+neon+dfsg/src/wp/cil2cfg.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/cil2cfg.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -35,9 +35,9 @@ (** Be careful that only Bstmt are real Block statements *) type block_type = - Bstmt of stmt | Bthen of stmt | Belse of stmt | Bloop of stmt | Bfct + Bstmt of stmt | Bthen of stmt | Belse of stmt | Bloop of stmt | Bfct (* added to identify 2 blocks for tests, else there are mixed up because same - * sid *) + * sid *) type call_type = | Dynamic of exp @@ -57,8 +57,8 @@ | Vtest of bool * stmt * exp (** bool=true for In and false for Out *) | Vswitch of stmt * exp | Vloop of bool option * stmt - (** boolean is is_natural. None means the node has not been detected - * as a loop *) + (** boolean is is_natural. None means the node has not been detected + * as a loop *) | Vloop2 of bool * int type node_info = { kind : node_type ; mutable reachable : bool } @@ -79,26 +79,26 @@ (** gives a identifier to each CFG node in order to hash them *) let node_type_id t : node_id = match t with - | Vstart -> (0, 0) - | VfctIn -> (0, 1) - | VfctOut -> (0, 2) - | Vexit -> (0, 3) - | Vend -> (0, 4) - | Vstmt s | Vtest (true, s, _) | Vswitch (s,_) | Vcall (s, _, _, _) -> - (1, s.sid) - | Vloop (_, s) -> (2, s.sid) - | Vloop2 (_, n) -> (3, n) - | VblkIn (Bfct, _) -> (4, 0) - | VblkIn (Bstmt s,_) -> (5, s.sid) - | VblkIn (Bthen s,_) -> (6, s.sid) - | VblkIn (Belse s,_) -> (7, s.sid) - | VblkIn (Bloop s,_) -> (8, s.sid) - | VblkOut (Bfct, _) -> (9, 0) - | VblkOut (Bstmt s,_) -> (10, s.sid) - | VblkOut (Bthen s,_) -> (11, s.sid) - | VblkOut (Belse s,_) -> (12, s.sid) - | VblkOut (Bloop s,_) -> (13, s.sid) - | Vtest (false, s, _) -> (14, s.sid) + | Vstart -> (0, 0) + | VfctIn -> (0, 1) + | VfctOut -> (0, 2) + | Vexit -> (0, 3) + | Vend -> (0, 4) + | Vstmt s | Vtest (true, s, _) | Vswitch (s,_) | Vcall (s, _, _, _) -> + (1, s.sid) + | Vloop (_, s) -> (2, s.sid) + | Vloop2 (_, n) -> (3, n) + | VblkIn (Bfct, _) -> (4, 0) + | VblkIn (Bstmt s,_) -> (5, s.sid) + | VblkIn (Bthen s,_) -> (6, s.sid) + | VblkIn (Belse s,_) -> (7, s.sid) + | VblkIn (Bloop s,_) -> (8, s.sid) + | VblkOut (Bfct, _) -> (9, 0) + | VblkOut (Bstmt s,_) -> (10, s.sid) + | VblkOut (Bthen s,_) -> (11, s.sid) + | VblkOut (Belse s,_) -> (12, s.sid) + | VblkOut (Bloop s,_) -> (13, s.sid) + | Vtest (false, s, _) -> (14, s.sid) let node_id n = node_type_id (node_type n) @@ -126,7 +126,7 @@ | Vloop2 (_, n) -> Format.fprintf fmt "" n let same_node v v' = - (node_id v) = (node_id v') + (node_id v) = (node_id v') (** the CFG nodes *) module VL = @@ -145,20 +145,20 @@ let pp_node fmt v = VL.pretty fmt v let start_stmt_of_node v = match node_type v with - | Vstart | Vtest (false, _, _) | VblkOut _ - | VfctIn | VfctOut | Vend | Vexit | Vloop2 _ -> None - | VblkIn (bk, _) -> bkind_stmt bk - | Vstmt s | Vtest (true, s, _) | Vloop (_, s) | Vswitch (s,_) - | Vcall (s, _, _, _) - -> Some s + | Vstart | Vtest (false, _, _) | VblkOut _ + | VfctIn | VfctOut | Vend | Vexit | Vloop2 _ -> None + | VblkIn (bk, _) -> bkind_stmt bk + | Vstmt s | Vtest (true, s, _) | Vloop (_, s) | Vswitch (s,_) + | Vcall (s, _, _, _) + -> Some s let node_stmt_opt v = match node_type v with - | Vstart | Vtest (false, _, _) - | VfctIn | VfctOut | Vend | Vexit | Vloop2 _ -> None - | VblkIn (bk, _) | VblkOut (bk, _) -> bkind_stmt bk - | Vstmt s | Vtest (true, s, _) | Vloop (_, s) | Vswitch (s,_) - | Vcall (s, _, _, _) - -> Some s + | Vstart | Vtest (false, _, _) + | VfctIn | VfctOut | Vend | Vexit | Vloop2 _ -> None + | VblkIn (bk, _) | VblkOut (bk, _) -> bkind_stmt bk + | Vstmt s | Vtest (true, s, _) | Vloop (_, s) | Vswitch (s,_) + | Vcall (s, _, _, _) + -> Some s let node_stmt_exn v = match node_stmt_opt v with None -> raise Not_found | Some s -> s @@ -195,7 +195,7 @@ | EbackThen, (EbackElse | Ecase _ | Enext) | EbackElse, (Ecase _ | Enext) | Ecase _, Enext - -> -1 + -> -1 | Enext, (Ecase _ | EbackElse | EbackThen | Eback | Eelse | Ethen | Enone) | Ecase _, (EbackElse | EbackThen | Eback | Eelse | Ethen | Enone) @@ -231,8 +231,8 @@ type 'a return = unit let empty = () - (* never called and not visible for the user thanks to signature - constraints *) + (* never called and not visible for the user thanks to signature + constraints *) let create ?size () = ignore size ; ref M.empty @@ -266,25 +266,25 @@ module CFG: Graph.Sig.I with type V.t = VL.t - and type V.label = VL.t - and type E.t = VL.t * EL.t * VL.t - and type E.label = EL.t - = - struct - include MyGraph.Digraph.ConcreteBidirectionalLabeled(VL)(EL) - let add_vertex g v = ignore (add_vertex g v) - let add_edge g v1 v2 = ignore (add_edge g v1 v2) - let remove_edge g v1 v2 = ignore (remove_edge g v1 v2) - let remove_edge_e g e = ignore (remove_edge_e g e) - let add_edge_e g e = ignore (add_edge_e g e) - let remove_vertex g v = - if HM.mem v g then begin - ignore (HM.remove v g); - let remove v = S.filter (fun (v2,_) -> not (V.equal v v2)) in - HM.iter (fun k (s1, s2) -> - ignore (HM.add k (remove v s1, remove v s2) g)) g - end - end + and type V.label = VL.t + and type E.t = VL.t * EL.t * VL.t + and type E.label = EL.t += +struct + include MyGraph.Digraph.ConcreteBidirectionalLabeled(VL)(EL) + let add_vertex g v = ignore (add_vertex g v) + let add_edge g v1 v2 = ignore (add_edge g v1 v2) + let remove_edge g v1 v2 = ignore (remove_edge g v1 v2) + let remove_edge_e g e = ignore (remove_edge_e g e) + let add_edge_e g e = ignore (add_edge_e g e) + let remove_vertex g v = + if HM.mem v g then begin + ignore (HM.remove v g); + let remove v = S.filter (fun (v2,_) -> not (V.equal v v2)) in + HM.iter (fun k (s1, s2) -> + ignore (HM.add k (remove v s1, remove v s2) g)) g + end +end (** Set of edges. *) module Eset = FCSet.Make (CFG.E) @@ -347,7 +347,7 @@ let pred_e cfg n = try - let edges = CFG.pred_e cfg.graph n in + let edges = CFG.pred_e cfg.graph n in List.filter (fun e -> not (is_next_edge e)) edges with Invalid_argument _ -> (Wp_parameters.warning "[cfg.pred_e] pb with node %a" pp_node n; []) @@ -355,7 +355,7 @@ let succ_e cfg n = try let edges = CFG.succ_e cfg.graph n in - List.filter (fun e -> not (is_next_edge e)) edges + List.filter (fun e -> not (is_next_edge e)) edges with Invalid_argument _ -> (Wp_parameters.warning "[cfg.succ_e] pb with node %a" pp_node n; []) @@ -427,41 +427,41 @@ let cfg_start cfg = Hashtbl.find cfg.stmt_node (node_type_id Vstart) let start_edge cfg = match succ_e cfg (cfg_start cfg) with [e] -> e - | _ -> Wp_parameters.fatal "[cfg] should have exactly ONE starting edge !" + | _ -> Wp_parameters.fatal "[cfg] should have exactly ONE starting edge !" exception Found of node let _find_stmt_node cfg stmt = let find n = match node_stmt_opt n with None -> () - | Some s -> if s.sid = stmt.sid then raise (Found n) + | Some s -> if s.sid = stmt.sid then raise (Found n) in - try (iter_nodes find cfg; raise Not_found) - with Found n -> n + try (iter_nodes find cfg; raise Not_found) + with Found n -> n (** Get the edges going out a test node with the then branch first *) let get_test_edges cfg v = match succ_e cfg v with - | [e1; e2] -> - begin match (edge_type e1), (edge_type e2) with - | (Ethen|EbackThen), (Eelse|EbackElse) -> e1, e2 - | (Eelse|EbackElse), (Ethen|EbackThen) -> e2, e1 - | _, (Eelse|EbackElse) -> - Wp_parameters.fatal "[cfg] test node with invalid edges %a" - pp_edge e1 - | _, _ -> - Wp_parameters.fatal "[cfg] test node with invalid edges %a" - pp_edge e2 - end - | _ -> raise (Invalid_argument "[cfg:get_test_edges] not a test") + | [e1; e2] -> + begin match (edge_type e1), (edge_type e2) with + | (Ethen|EbackThen), (Eelse|EbackElse) -> e1, e2 + | (Eelse|EbackElse), (Ethen|EbackThen) -> e2, e1 + | _, (Eelse|EbackElse) -> + Wp_parameters.fatal "[cfg] test node with invalid edges %a" + pp_edge e1 + | _, _ -> + Wp_parameters.fatal "[cfg] test node with invalid edges %a" + pp_edge e2 + end + | _ -> raise (Invalid_argument "[cfg:get_test_edges] not a test") let get_switch_edges cfg v = match node_type v with | Vswitch _ -> begin - let get_case (cl, dl) e = match (edge_type e) with - | Ecase [] -> cl, e::dl - | Ecase c -> (c, e)::cl, dl - | _ -> Wp_parameters.fatal ("[cfg] switch node with invalid edges") - in match List.fold_left get_case ([],[]) (succ_e cfg v) with + let get_case (cl, dl) e = match (edge_type e) with + | Ecase [] -> cl, e::dl + | Ecase c -> (c, e)::cl, dl + | _ -> Wp_parameters.fatal ("[cfg] switch node with invalid edges") + in match List.fold_left get_case ([],[]) (succ_e cfg v) with | cl, [d] -> cl, d | _ -> Wp_parameters.fatal ("[cfg] switch node with several 'default' ?") @@ -475,9 +475,9 @@ in let en, ee = match node_type (edge_dst e1) , node_type (edge_dst e2) with - | _, Vexit -> e1, e2 - | Vexit, _ -> e2, e1 - | _, _ -> assert false + | _, Vexit -> e1, e2 + | Vexit, _ -> e2, e1 + | _, _ -> assert false in en, ee let get_edge_labels e = @@ -499,15 +499,15 @@ in let v_before = edge_src e in match node_type v_before with - | VfctIn -> Clabels.Pre::l - | Vloop (_, s) -> (Clabels.mk_loop_label s)::l - | _ -> l + | VfctIn -> Clabels.Pre::l + | Vloop (_, s) -> (Clabels.mk_loop_label s)::l + | _ -> l let next_edge cfg n = let edges = match node_type n with | VblkIn _ | Vswitch _ | Vtest _ | Vloop _ -> let edges = CFG.succ_e cfg.graph n in - List.filter is_next_edge edges + List.filter is_next_edge edges | Vcall _ -> let en, _ee = get_call_out_edges cfg n in [en] | Vstmt _ -> @@ -522,15 +522,15 @@ debug "[next_edge] not found for %a@." pp_node n; raise Not_found (* No Enext information on this node *) in - match edges with - | [] -> (* can append when nodes have been removed *) raise Not_found - | [e] -> e - | _ -> Wp_parameters.fatal "several (%d) Enext edges to node %a" - (List.length edges) pp_node n + match edges with + | [] -> (* can append when nodes have been removed *) raise Not_found + | [e] -> e + | _ -> Wp_parameters.fatal "several (%d) Enext edges to node %a" + (List.length edges) pp_node n (** Find the node that follows the input node statement. -* The statement postcondition can then be stored to the edges before that node. -* @raise Not_found when the node after has been removed (unreachable) *) + * The statement postcondition can then be stored to the edges before that node. + * @raise Not_found when the node after has been removed (unreachable) *) let node_after cfg n = edge_dst (next_edge cfg n) let get_pre_edges cfg n = pred_e cfg n @@ -553,10 +553,10 @@ e :: acc | _ -> acc in match node_type n with - | Vstart -> (* In it is a problem a domination which is not solved here *) - Wp_parameters.warning "[cfg] Forget exits clause of node %a" pp_node src; - raise Exit - | _ -> fold_succ_e add_exit cfg n acc + | Vstart -> (* In it is a problem a domination which is not solved here *) + Wp_parameters.warning "[cfg] Forget exits clause of node %a" pp_node src; + raise Exit + | _ -> fold_succ_e add_exit cfg n acc in let rec do_node_and_preds n (seen, edges as acc) = if Nset.mem n seen then acc (* Don't loop over the same node. *) @@ -571,15 +571,15 @@ let edges = try let edge = next_edge cfg src in - if false || is_next_edge edge then - (* needs to look at all node between the next node and the source *) - snd (do_preds (edge_dst edge) (Nset.empty, [])) - else do_node src [] + if false || is_next_edge edge then + (* needs to look at all node between the next node and the source *) + snd (do_preds (edge_dst edge) (Nset.empty, [])) + else do_node src [] with Exit -> [] in - if edges = [] then - debug "[get_exit_edges] -> empty"; - edges + if edges = [] then + debug "[get_exit_edges] -> empty"; + edges let add_edges_before cfg src set e_after = let rec add_preds set e = @@ -596,7 +596,7 @@ let edges = try pred_e cfg (node_after cfg n) with Not_found -> [] in let set = Eset.empty in let set = List.fold_left (add_edges_before cfg n) set edges in - edges, set + edges, set let rec get_edge_next_stmt cfg e = let v_after = edge_dst e in @@ -608,40 +608,40 @@ match node_type v_after with | VblkOut _ | VblkIn ((Bthen _|Belse _|Bloop _|Bfct),_) -> get_next v_after | _ -> - match node_stmt_opt v_after with - | Some s -> Some s - | None -> get_next v_after + match node_stmt_opt v_after with + | Some s -> Some s + | None -> get_next v_after let get_post_logic_label cfg v = match get_post_edges cfg v with [] -> None - | e::_ -> (* TODO: is this ok to consider only one edge ? *) - match get_edge_next_stmt cfg e with - | None -> None - | Some s -> Some (Clabels.mk_logic_label s) + | e::_ -> (* TODO: is this ok to consider only one edge ? *) + match get_edge_next_stmt cfg e with + | None -> None + | Some s -> Some (Clabels.mk_logic_label s) let blocks_closed_by_edge cfg e = debug "[blocks_closed_by_edge] for %a...@." pp_edge e; let v_before = edge_src e in let blocks = match node_type v_before with | Vstmt s | Vtest (true, s, _) | Vloop (_, s) | Vswitch (s,_) -> - ignore (Ast.get ()); (* Since CIL Cfg computation is required and - Ast.get () have to do this well. *) - begin match s.succs with - | [s'] -> (try Kernel_function.blocks_closed_by_edge s s' - with Not_found as e -> debug "[blocks_closed_by_edge] not found sid:%d -> sid:%d@." - s.sid s'.sid; - raise e) - | [] | _ :: _ -> - let s' = get_edge_next_stmt cfg e in - match s' with - | None -> [] - | Some s' -> - debug - "[blocks_closed_by_edge] found sid:%d -> sid:%d@." - s.sid s'.sid; - try Kernel_function.blocks_closed_by_edge s s' - with Invalid_argument _ -> [] - end + ignore (Ast.get ()); (* Since CIL Cfg computation is required and + Ast.get () have to do this well. *) + begin match s.succs with + | [s'] -> (try Kernel_function.blocks_closed_by_edge s s' + with Not_found as e -> debug "[blocks_closed_by_edge] not found sid:%d -> sid:%d@." + s.sid s'.sid; + raise e) + | [] | _ :: _ -> + let s' = get_edge_next_stmt cfg e in + match s' with + | None -> [] + | Some s' -> + debug + "[blocks_closed_by_edge] found sid:%d -> sid:%d@." + s.sid s'.sid; + try Kernel_function.blocks_closed_by_edge s s' + with Invalid_argument _ -> [] + end | _ -> (* TODO ? *) [] in let v_after = edge_dst e in @@ -654,8 +654,8 @@ try let node = Hashtbl.find cfg.stmt_node (node_type_id Vexit) in match pred_e cfg node with - | [] -> false - | _ -> true + | [] -> false + | _ -> true with Not_found | Invalid_argument _ -> false (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*) @@ -723,8 +723,8 @@ let add_edge env n1 edge_type n2 = let e = CFG.E.create n1 (ref edge_type) n2 in - debug "add edge : %a@." pp_edge e; - CFG.add_edge_e env.graph e + debug "add edge : %a@." pp_edge e; + CFG.add_edge_e env.graph e let remove_edge env e = debug "remove edge : %a@." pp_edge e; @@ -736,8 +736,8 @@ add_edge env (edge_src e) (edge_type e) n_loop; remove_edge env e in iter_pred_e mv_pred_edge env loop_head; - add_edge env n_loop Enone loop_head; - n_loop + add_edge env n_loop Enone loop_head; + n_loop let init_cfg spec_only kf = let env = new_cfg_env spec_only kf in @@ -749,7 +749,7 @@ let nend = add_node env (Vend) in let _ = add_edge env fct_out Enone nend in let _ = add_edge env nexit Enone nend in - env, fct_in, fct_out + env, fct_in, fct_out let get_node env t = let id = node_type_id t in @@ -761,45 +761,45 @@ (** Setup the preconditions at all the call points of [e_kf], when possible *) let setup_preconditions_proxies e_kf = match e_kf.enode with - | Lval (Var vkf, NoOffset) -> - let kf = Globals.Functions.get vkf in - Statuses_by_call.setup_all_preconditions_proxies kf - | _ -> () (* call through function pointer *) + | Lval (Var vkf, NoOffset) -> + let kf = Globals.Functions.get vkf in + Statuses_by_call.setup_all_preconditions_proxies kf + | _ -> () (* call through function pointer *) let get_call_type fct = match Kernel_function.get_called fct with - | None -> Dynamic fct - | Some kf -> Static kf + | None -> Dynamic fct + | Some kf -> Static kf (** In some cases (goto for instance) we have to create a node before having -* processed if through [cfg_stmt]. It is important that the created node -* is the same than while the 'normal' processing ! That is why -* this pattern matching might seem redondant with the other one. *) + * processed if through [cfg_stmt]. It is important that the created node + * is the same than while the 'normal' processing ! That is why + * this pattern matching might seem redondant with the other one. *) let get_stmt_node env s = match s.skind with | Instr (Call (res, fct, args, _)) -> get_node env (Vcall (s, res, get_call_type fct, args)) | Block b -> get_node env (VblkIn (Bstmt s,b)) | UnspecifiedSequence seq -> let b = Cil.block_from_unspecified_sequence seq in - get_node env (VblkIn (Bstmt s,b)) + get_node env (VblkIn (Bstmt s,b)) | If (e, _, _, _) -> get_node env (Vtest (true, s, e)) | Loop _ -> get_node env (Vloop (None, s)) | Break _ | Continue _ | Goto _ | Instr _ | Return _ -> get_node env (Vstmt s) | Switch (e, _, _, _) -> get_node env (Vswitch (s, e)) - | TryExcept _ | TryFinally _ -> + | TryExcept _ | TryFinally _ | Throw _ | TryCatch _ -> Wp_parameters.not_yet_implemented "[cfg] exception handling" (** build the nodes for the [stmts], connect the last one with [next], -* and return the node of the first stmt. *) + * and return the node of the first stmt. *) let rec cfg_stmts env stmts next = match stmts with -| [] -> next -| [s] -> cfg_stmt env s next -| s::tl -> - let next = cfg_stmts env tl next in - let ns = cfg_stmt env s next in - ns + | [] -> next + | [s] -> cfg_stmt env s next + | s::tl -> + let next = cfg_stmts env tl next in + let ns = cfg_stmt env s next in + ns and cfg_block env bkind b next = (* @@ -807,33 +807,33 @@ | [] -> next | _ -> *) - let in_blk = get_node env (VblkIn (bkind, b)) in - let _ = add_edge env in_blk Enext next in - let out_blk = get_node env (VblkOut (bkind, b)) in - let _ = add_edge env out_blk Enone next in - let first_in_blk = cfg_stmts env b.bstmts out_blk in - let _ = add_edge env in_blk Enone first_in_blk in - in_blk + let in_blk = get_node env (VblkIn (bkind, b)) in + let _ = add_edge env in_blk Enext next in + let out_blk = get_node env (VblkOut (bkind, b)) in + let _ = add_edge env out_blk Enone next in + let first_in_blk = cfg_stmts env b.bstmts out_blk in + let _ = add_edge env in_blk Enone first_in_blk in + in_blk and cfg_switch env switch_stmt switch_exp blk case_stmts next = let n_switch = get_node env (Vswitch (switch_stmt, switch_exp)) in - add_edge env n_switch Enext next; + add_edge env n_switch Enext next; let _first = cfg_stmts env blk.bstmts next in let branch with_def s = let n = get_stmt_node env s in let rec find_case l = match l with - | [] -> false, [] - | Case (e, _)::tl -> - let r = match find_case tl with - | true, [] -> true, [] - | true, _ -> assert false - | false, l -> false, e::l - in r - | Default _ :: _ -> - (* we don't check if we have several Default because it is impossible: - * CIL gives an error *) - true, [] - | _::tl -> find_case tl + | [] -> false, [] + | Case (e, _)::tl -> + let r = match find_case tl with + | true, [] -> true, [] + | true, _ -> assert false + | false, l -> false, e::l + in r + | Default _ :: _ -> + (* we don't check if we have several Default because it is impossible: + * CIL gives an error *) + true, [] + | _::tl -> find_case tl in let def, case = find_case s.labels in if case = [] && not def then @@ -868,31 +868,31 @@ begin let n_in = get_stmt_node env s (*get_node env (Vtest (true, s, e))*) in let n_out = get_node env (Vtest (false, s, e)) in - (* this node is to ensure that there is only one edge before - * the [next] node of a if to put post properties about the IF. *) - add_edge env n_out Enone next; + (* this node is to ensure that there is only one edge before + * the [next] node of a if to put post properties about the IF. *) + add_edge env n_out Enone next; let in_b1 = cfg_block env (Bthen s) b1 n_out in let in_b2 = cfg_block env (Belse s) b2 n_out in - add_edge env n_in Ethen in_b1; - add_edge env n_in Eelse in_b2; - add_edge env n_in Enext next; - n_in + add_edge env n_in Ethen in_b1; + add_edge env n_in Eelse in_b2; + add_edge env n_in Enext next; + n_in end | Loop(_, b, _, _, _) -> let loop = get_stmt_node env s in - add_edge env loop Enext next; + add_edge env loop Enext next; let in_b = cfg_block env (Bloop s) b loop in add_edge env loop Enone in_b; loop | Break _ | Continue _ | Goto _ -> let n = get_stmt_node env s in let _ = match s.succs with - | [s'] -> add_edge env n Enone (get_stmt_node env s') - | _ -> Wp_parameters.fatal "[cfg] jump with more than one successor ?" + | [s'] -> add_edge env n Enone (get_stmt_node env s') + | _ -> Wp_parameters.fatal "[cfg] jump with more than one successor ?" in n | Switch (e, b, lstmts, _) -> cfg_switch env s e b lstmts next - | TryExcept _ | TryFinally _ -> + | TryExcept _ | TryFinally _ | Throw _ | TryCatch _ -> Wp_parameters.not_yet_implemented "[cfg] exception handling" (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*) @@ -909,34 +909,34 @@ else begin debug "remove unreachable node %a@." VL.pretty n; let v = node_type n in - CFG.remove_vertex graph n; - Hashtbl.remove cfg.stmt_node (node_type_id v); - v::acc + CFG.remove_vertex graph n; + Hashtbl.remove cfg.stmt_node (node_type_id v); + v::acc end in let unreach = fold_nodes clean cfg [] in - { cfg with unreachables = unreach } + { cfg with unreachables = unreach } (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*) (** {3 About loops} -* Let's first remind some definitions about loops : -* - {b back edge} : edge n->h such that h dominates n. -* - {b natural loop} : defined by a back edge n->h -* * h is called the {b loop header}, -* * the body of the loop is the set of nodes n that are "between" h and n, -* ie all n predecessors until h. -* Because h dominates n, every backward path from n go through h. -* Notice that each node in the loop body is dominated by h. -* -* A loop is not a natural loop if it has several entries (no loop header), -* or if it has some irreducible region (no back edge). -* -* Below, we use an algorithm from the paper : + * Let's first remind some definitions about loops : + * - {b back edge} : edge n->h such that h dominates n. + * - {b natural loop} : defined by a back edge n->h + * * h is called the {b loop header}, + * * the body of the loop is the set of nodes n that are "between" h and n, + * ie all n predecessors until h. + * Because h dominates n, every backward path from n go through h. + * Notice that each node in the loop body is dominated by h. + * + * A loop is not a natural loop if it has several entries (no loop header), + * or if it has some irreducible region (no back edge). + * + * Below, we use an algorithm from the paper : * "A New Algorithm for Identifying Loops in Decompilation" * of Tao Wei, Jian Mao, Wei Zou, and Yu Chen, * to gather information about the loops in the builted CFG. - *) +*) module type WeiMaoZouChenInput = sig type graph @@ -944,7 +944,7 @@ type tenv (** build a new env from a graph, - * and also return the entry point of the graph which has to be unique. *) + * and also return the entry point of the graph which has to be unique. *) val init : graph -> tenv * node (** apply the function on the node successors *) @@ -953,26 +953,26 @@ val eq_nodes : node -> node -> bool (** store the position for the node and also the fact that the node has - * been seen *) + * been seen *) val set_pos : tenv -> node -> int -> tenv (** reset the position (set the position to 0), but should keep the - * information that the node has been seen already. *) + * information that the node has been seen already. *) val reset_pos : tenv -> node -> tenv - (** get the previously stored position of the node or 0 if nothing has been - * stored *) + (** get the previously stored position of the node or 0 if nothing has been + * stored *) val get_pos : tenv -> node -> int - (** get the previously stored position of the node if any, or None - * if [set_pos] hasn't been called already for this node. *) + (** get the previously stored position of the node if any, or None + * if [set_pos] hasn't been called already for this node. *) val get_pos_if_traversed : tenv -> node -> int option (** [set_iloop_header env b h] store h as the innermost loop header for b. - * Beware that this function can be called several times for the same b - * with different values of h during the computation. Only the last one - * will give the correct information. - * *) + * Beware that this function can be called several times for the same b + * with different values of h during the computation. Only the last one + * will give the correct information. + * *) val set_iloop_header : tenv -> node -> node -> tenv (** get the node innermost loop header if any *) @@ -985,8 +985,8 @@ val add_irreducible : tenv -> node -> tenv (** store the edge between the two nodes (n1, n2) as a reentry edge. - * n2 is the reentry point which means that it is in a loop, - * but it is not the loop header, and n1 is not in the loop. *) + * n2 is the reentry point which means that it is in a loop, + * but it is not the loop header, and n1 is not in the loop. *) val add_reentry_edge : tenv -> node -> node -> tenv (* val pretty_node : Format.formatter -> node -> unit *) @@ -1004,53 +1004,53 @@ | Some h -> if G.eq_nodes h b then (* already done *) env else - let rec do_cur env cur_b cur_h = - match G.get_iloop_header env cur_b with - | None -> G.set_iloop_header env cur_b cur_h - | Some hb when G.eq_nodes hb cur_h -> (* nothing to do *) env - | Some hb -> - if (G.get_pos env hb) < (G.get_pos env cur_h) then - let env = G.set_iloop_header env cur_b cur_h in + let rec do_cur env cur_b cur_h = + match G.get_iloop_header env cur_b with + | None -> G.set_iloop_header env cur_b cur_h + | Some hb when G.eq_nodes hb cur_h -> (* nothing to do *) env + | Some hb -> + if (G.get_pos env hb) < (G.get_pos env cur_h) then + let env = G.set_iloop_header env cur_b cur_h in do_cur env cur_h hb - else do_cur env hb cur_h - in do_cur env b h + else do_cur env hb cur_h + in do_cur env b h (** @return innermost loop header of b0 (None if b0 is not in a loop) *) let rec trav_loops_DFS env b0 pos = let env = G.set_pos env b0 pos in let do_b env b = match G.get_pos_if_traversed env b with - | None -> (* case A : b is not traversed already *) - let env, nh = trav_loops_DFS env b (pos + 1) in - tag_lhead env b0 nh - | Some b_pos when (b_pos > 0) -> - begin (* case B : b already in path -> it is a loop *) - let env = G.add_loop_header env b in - tag_lhead env b0 (Some b) - end - | Some 0 -> - begin - match G.get_iloop_header env b with - | None -> (* case C : do nothing *) env - | Some h when (G.get_pos env h > 0) -> - (* case D : b not in path, but h is *) - tag_lhead env b0 (Some h) - | Some h -> (* h not in path *) - begin (* case E : reentry *) - assert (G.get_pos env h = 0); - let env = G.add_irreducible env h in - let env = G.add_reentry_edge env b0 b in - let rec f env h = match G.get_iloop_header env h with - | Some h when (G.get_pos env h > 0) -> - tag_lhead env b0 (Some h) - | Some h -> - let env = G.add_irreducible env h in - f env h - | None -> env - in f env h - end - end - | _ -> assert false (* b_pos cannot be < 0 *) + | None -> (* case A : b is not traversed already *) + let env, nh = trav_loops_DFS env b (pos + 1) in + tag_lhead env b0 nh + | Some b_pos when (b_pos > 0) -> + begin (* case B : b already in path -> it is a loop *) + let env = G.add_loop_header env b in + tag_lhead env b0 (Some b) + end + | Some 0 -> + begin + match G.get_iloop_header env b with + | None -> (* case C : do nothing *) env + | Some h when (G.get_pos env h > 0) -> + (* case D : b not in path, but h is *) + tag_lhead env b0 (Some h) + | Some h -> (* h not in path *) + begin (* case E : reentry *) + assert (G.get_pos env h = 0); + let env = G.add_irreducible env h in + let env = G.add_reentry_edge env b0 b in + let rec f env h = match G.get_iloop_header env h with + | Some h when (G.get_pos env h > 0) -> + tag_lhead env b0 (Some h) + | Some h -> + let env = G.add_irreducible env h in + f env h + | None -> env + in f env h + end + end + | _ -> assert false (* b_pos cannot be < 0 *) in let env = G.fold_succ do_b env b0 in let env = G.reset_pos env b0 in @@ -1060,7 +1060,7 @@ let identify_loops g = let env, start = G.init g in let env, _ = trav_loops_DFS env start 1 in - env + env end @@ -1080,7 +1080,7 @@ let env = { graph = cfg ; dfsp = Ntbl.create 97; iloop_header = Ntbl.create 7; loop_headers = []; irreducible = []; unstruct_coef = 0 } in - env, cfg_start cfg + env, cfg_start cfg let eq_nodes = CFG.V.equal @@ -1106,7 +1106,7 @@ let k = float_of_int env.unstruct_coef in let k = k /. (float_of_int (CFG.nb_edges (cfg_graph env.graph))) in let k = 1. +. k in - k + k end @@ -1116,30 +1116,30 @@ let set_back_edge e = let info = CFG.E.label e in - match !info with - | Eback | EbackThen | EbackElse -> () - | Enone -> info := Eback - | Ethen -> info := EbackThen - | Eelse -> info := EbackElse - | Ecase _ | Enext -> assert false + match !info with + | Eback | EbackThen | EbackElse -> () + | Enone -> info := Eback + | Ethen -> info := EbackThen + | Eelse -> info := EbackElse + | Ecase _ | Enext -> assert false let mark_loops cfg = let env = Mloop.identify_loops cfg in let mark_loop_back_edge h = match node_stmt_opt h with | None -> (* Because we use !Db.Dominators that work on statements, - we don't know how to detect back edge here. - TODO: compute dominators on our cfg ? *) false + we don't know how to detect back edge here. + TODO: compute dominators on our cfg ? *) false | Some h_stmt -> let mark_back_edge e = let n = edge_src e in let is_back_edge = try let n_stmt = node_stmt_exn n in - Dominators.dominates h_stmt n_stmt + Dominators.dominates h_stmt n_stmt with Not_found -> false (* pred of h is not a stmt *) in - if is_back_edge then set_back_edge e; - debug "to loop edge %a@." pp_edge e + if is_back_edge then set_back_edge e; + debug "to loop edge %a@." pp_edge e in iter_pred_e mark_back_edge cfg h; true in let mark_loop loops h = @@ -1150,12 +1150,12 @@ else true in let back_edges_ok = if is_natural then mark_loop_back_edge h else true - in + in let loop = match node_type h with - | Vloop (_, h_stmt) -> - assert (back_edges_ok); - change_node_kind cfg h (Vloop (Some is_natural, h_stmt)) - | _ -> match node_stmt_opt h with + | Vloop (_, h_stmt) -> + assert (back_edges_ok); + change_node_kind cfg h (Vloop (Some is_natural, h_stmt)) + | _ -> match node_stmt_opt h with | Some h_stmt when back_edges_ok -> insert_loop_node cfg h (Vloop (Some is_natural, h_stmt)) | None when back_edges_ok -> @@ -1167,12 +1167,12 @@ in loop::loops in let loops = List.fold_left mark_loop [] env.LoopInfo.loop_headers in - debug2 "unstructuredness coef = %f@." (LoopInfo.unstructuredness env); - { cfg with loop_nodes = Some loops } + debug2 "unstructuredness coef = %f@." (LoopInfo.unstructuredness env); + { cfg with loop_nodes = Some loops } let loop_nodes cfg = match cfg.loop_nodes with Some l -> l - | None -> Wp_parameters.fatal - "Cannot use the loop nodes before having computed them" + | None -> Wp_parameters.fatal + "Cannot use the loop nodes before having computed them" let strange_loops cfg = let strange n = match node_type n with @@ -1180,9 +1180,9 @@ | _ -> true in let loops = loop_nodes cfg in let strange_loops = List.filter strange loops in - debug "%d/%d strange loops" - (List.length strange_loops) (List.length loops); - strange_loops + debug "%d/%d strange loops" + (List.length strange_loops) (List.length loops); + strange_loops let very_strange_loops cfg = let strange n = match node_type n with @@ -1190,9 +1190,9 @@ | _ -> true in let loops = loop_nodes cfg in let strange_loops = List.filter strange loops in - debug "%d/%d very strange loops" - (List.length strange_loops) (List.length loops); - strange_loops + debug "%d/%d very strange loops" + (List.length strange_loops) (List.length loops); + strange_loops (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*) (** {3 Create CFG} *) @@ -1203,25 +1203,25 @@ let in_b = cfg_block cfg Bfct f.sbody fct_out in let _ = add_edge cfg fct_in Enone in_b in let graph = cfg_graph cfg in - debug "for function '%s': %d vertex - %d edges@." - kf_name (CFG.nb_edges graph) (CFG.nb_vertex graph); - debug - "start removing unreachable in %s@." kf_name; + debug "for function '%s': %d vertex - %d edges@." + kf_name (CFG.nb_edges graph) (CFG.nb_vertex graph); + debug + "start removing unreachable in %s@." kf_name; !Db.progress (); let cfg = clean_graph cfg in - debug "for function '%s': %d vertex - %d edges@." - kf_name (CFG.nb_edges graph) (CFG.nb_vertex graph); + debug "for function '%s': %d vertex - %d edges@." + kf_name (CFG.nb_edges graph) (CFG.nb_vertex graph); !Db.progress (); - debug - "start loop analysis for %s@." kf_name; + debug + "start loop analysis for %s@." kf_name; let cfg = mark_loops cfg in - cfg + cfg let cfg_from_proto kf = let cfg, fct_in, fct_out = init_cfg true kf in let _ = add_edge cfg fct_in Enone fct_out in let cfg = { cfg with loop_nodes = Some [] } in - cfg + cfg (* ------------------------------------------------------------------------ *) (** {2 Export dot graph} *) @@ -1255,22 +1255,24 @@ | VblkOut (bk,_) -> Pretty_utils.sfprintf "BLOCKout <%a>" pp_bkind bk | Vcall _ -> Format.sprintf "CALL" | Vtest (true, s, e) -> - Pretty_utils.sfprintf "IF <%d>\n%a" s.sid Printer.pp_exp e + Pretty_utils.sfprintf "IF <%d>\n%a" s.sid Printer.pp_exp e | Vtest (false, s, _e) -> Pretty_utils.sfprintf "IFout <%d>" s.sid | Vstmt s | Vloop (_, s) | Vswitch (s, _) -> begin match s.skind with - | Instr _ -> Format.sprintf "INSTR <%d>\n%s" s.sid (pretty_raw_stmt s) - | If _ -> "invalid IF ?" - | Return _ -> Format.sprintf "RETURN <%d>" s.sid - | Goto _ -> Format.sprintf "%s <%d>" (pretty_raw_stmt s) s.sid - | Break _ -> Format.sprintf "BREAK <%d>" s.sid - | Continue _ -> Format.sprintf "CONTINUE <%d>" s.sid - | Switch _ -> Format.sprintf "SWITCH <%d>" s.sid - | Loop _ -> Format.sprintf "WHILE(1) <%d>" s.sid - | Block _ -> Format.sprintf "BLOCK??? <%d>" s.sid - | TryExcept _ -> Format.sprintf "TRY EXCEPT <%d>" s.sid - | TryFinally _ -> Format.sprintf "TRY FINALLY <%d>" s.sid - | UnspecifiedSequence _ -> Format.sprintf "UnspecifiedSeq <%d>" s.sid + | Instr _ -> Format.sprintf "INSTR <%d>\n%s" s.sid (pretty_raw_stmt s) + | If _ -> "invalid IF ?" + | Return _ -> Format.sprintf "RETURN <%d>" s.sid + | Goto _ -> Format.sprintf "%s <%d>" (pretty_raw_stmt s) s.sid + | Break _ -> Format.sprintf "BREAK <%d>" s.sid + | Continue _ -> Format.sprintf "CONTINUE <%d>" s.sid + | Switch _ -> Format.sprintf "SWITCH <%d>" s.sid + | Loop _ -> Format.sprintf "WHILE(1) <%d>" s.sid + | Block _ -> Format.sprintf "BLOCK??? <%d>" s.sid + | TryExcept _ -> Format.sprintf "TRY EXCEPT <%d>" s.sid + | TryFinally _ -> Format.sprintf "TRY FINALLY <%d>" s.sid + | Throw _ -> Format.sprintf "THROW <%d>" s.sid + | TryCatch _ -> Format.sprintf "TRY CATCH <%d>" s.sid + | UnspecifiedSequence _ -> Format.sprintf "UnspecifiedSeq <%d>" s.sid end | Vloop2 (_, n) -> Format.sprintf "Loop-%d" n in @@ -1278,9 +1280,9 @@ | Vstart | Vend | Vexit -> [`Color 0x0000FF; `Shape `Doublecircle] | VfctIn | VfctOut -> [`Color 0x0000FF; `Shape `Box] | VblkIn _ | VblkOut _ -> [`Shape `Box] - | Vloop _ | Vloop2 _ -> [`Color 0xFF0000; `Style [`Filled]] + | Vloop _ | Vloop2 _ -> [`Color 0xFF0000; `Style `Filled] | Vtest _ | Vswitch _ -> - [`Color 0x00FF00; `Style [`Filled]; `Shape `Diamond] + [`Color 0x00FF00; `Style `Filled; `Shape `Diamond] | Vcall _ | Vstmt _ -> [] in (`Label (String.escaped label))::attr @@ -1290,38 +1292,38 @@ let attr = [] in let attr = (`Label (String.escaped (PE.edge_txt e)))::attr in let attr = - if is_back_edge e then (`Constraint false)::(`Style [`Bold])::attr + if is_back_edge e then (`Constraint false)::(`Style `Bold)::attr else attr in let attr = match (edge_type e) with | Ethen | EbackThen -> (`Color 0x00FF00)::attr | Eelse | EbackElse -> (`Color 0xFF0000)::attr - | Ecase [] -> (`Color 0x0000FF)::(`Style [`Dashed])::attr + | Ecase [] -> (`Color 0x0000FF)::(`Style `Dashed)::attr | Ecase _ -> (`Color 0x0000FF)::attr - | Enext -> (`Style [`Dotted])::attr + | Enext -> (`Style `Dotted)::attr | Eback -> attr (* see is_back_edge above *) | Enone -> attr in - attr + attr let default_edge_attributes _ = [] let get_subgraph v = - let mk_subgraph name attrib = - let attrib = (`Style [`Filled]) :: attrib in - Some { Graph.Graphviz.DotAttributes.sg_name= name; - sg_parent = None; - sg_attributes = attrib } + let mk_subgraph name attrib = + let attrib = (`Style `Filled) :: attrib in + Some { Graph.Graphviz.DotAttributes.sg_name= name; + sg_parent = None; + sg_attributes = attrib } in - match node_type (V.label v) with - | Vcall (s,_,_,_) -> - let name = Format.sprintf "Call_%d" s.sid in - let call_txt = pretty_raw_stmt s in - let label = Format.sprintf "Call <%d> : %s" s.sid call_txt in - let attrib = [(`Label label)] in - let attrib = (`Fillcolor 0xB38B4D) :: attrib in - mk_subgraph name attrib - | _ -> None + match node_type (V.label v) with + | Vcall (s,_,_,_) -> + let name = Format.sprintf "Call_%d" s.sid in + let call_txt = pretty_raw_stmt s in + let label = Format.sprintf "Call <%d> : %s" s.sid call_txt in + let attrib = [(`Label label)] in + let attrib = (`Fillcolor 0xB38B4D) :: attrib in + mk_subgraph name attrib + | _ -> None end @@ -1333,21 +1335,21 @@ let export ~file ?pp_edge_fun cfg = Kernel.Unicode.without_unicode (fun () -> - let edge_txt = match pp_edge_fun with - | None -> - (fun e -> match (edge_type e) with - | Ecase (_::_) -> Pretty_utils.sfprintf "%a" EL.pretty (edge_type e) - | _ -> "" - ) - | Some pp -> (fun e -> Pretty_utils.sfprintf "%a" pp e) - in - let module P = Printer (struct let edge_txt = edge_txt end) in - let module GPrint = Graph.Graphviz.Dot(P) in - (* [JS 2011/03/11] open_out and output_graph (and close_out?) may raise - exception. Should be caught. *) - let oc = open_out file in - GPrint.output_graph oc (cfg_graph cfg, edge_txt); - close_out oc + let edge_txt = match pp_edge_fun with + | None -> + (fun e -> match (edge_type e) with + | Ecase (_::_) -> Pretty_utils.sfprintf "%a" EL.pretty (edge_type e) + | _ -> "" + ) + | Some pp -> (fun e -> Pretty_utils.sfprintf "%a" pp e) + in + let module P = Printer (struct let edge_txt = edge_txt end) in + let module GPrint = Graph.Graphviz.Dot(P) in + (* [JS 2011/03/11] open_out and output_graph (and close_out?) may raise + exception. Should be caught. *) + let oc = open_out file in + GPrint.output_graph oc (cfg_graph cfg, edge_txt); + close_out oc ) () (* ------------------------------------------------------------------------ *) @@ -1359,22 +1361,22 @@ let cfg = try let f = Kernel_function.get_definition kf in - cfg_from_definition kf f + cfg_from_definition kf f with Kernel_function.No_Definition -> cfg_from_proto kf in debug "done for %s@." kf_name; - !Db.progress (); - cfg + !Db.progress (); + cfg module KfCfg = Kernel_function.Make_Table (Datatype.Make (struct - include Datatype.Undefined - type tt = t - type t = tt - let name = "WpCfg" - let mem_project = Datatype.never_any_project + include Datatype.Undefined + type tt = t + type t = tt + let name = "WpCfg" + let mem_project = Datatype.never_any_project let reprs = List.map (fun kf -> @@ -1386,18 +1388,18 @@ loop_nodes = None; loop_cpt = 0; } - ) + ) Kernel_function.reprs let equal t1 t2 = Kernel_function.equal t1.kernel_function t2.kernel_function let hash t = Kernel_function.hash t.kernel_function let compare t1 t2 = Kernel_function.compare t1.kernel_function t2.kernel_function - end)) + end)) (struct let name = "KfCfg" - let dependencies = [Ast.self] - let size = 17 - end) + let dependencies = [Ast.self] + let size = 17 + end) let get kf = KfCfg.memo create kf diff -Nru frama-c-20140301+neon+dfsg/src/wp/cil2cfg.mli frama-c-20150201+sodium+dfsg/src/wp/cil2cfg.mli --- frama-c-20140301+neon+dfsg/src/wp/cil2cfg.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/cil2cfg.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -78,8 +78,8 @@ | Vtest of bool * stmt * exp | Vswitch of stmt * exp | Vloop of bool option * stmt - (** boolean is is_natural. None means the node has not been - * detected as a loop. *) + (** boolean is is_natural. None means the node has not been + * detected as a loop. *) | Vloop2 of bool * int val node_type : node -> node_type @@ -89,21 +89,21 @@ val start_stmt_of_node : node -> stmt option (** @return the nodes that are unreachable from the 'start' node. -* These nodes have been removed from the cfg already. *) + * These nodes have been removed from the cfg already. *) val unreachable_nodes : t -> node_type list (** similar to [succ_e g v] -* but tests the branch to return (then-edge, else-edge) + * but tests the branch to return (then-edge, else-edge) * @raise Invalid_argument if the node is not a test. -* *) + * *) val get_test_edges : t -> node -> edge * edge (** similar to [succ_e g v] -but give the switch cases and the default edge *) + but give the switch cases and the default edge *) val get_switch_edges : t -> node -> (exp list * edge) list * edge (** similar to [succ_e g v] -but gives the edge to VcallOut first and the edge to Vexit second. *) + but gives the edge to VcallOut first and the edge to Vexit second. *) val get_call_out_edges : t -> node -> edge * edge val blocks_closed_by_edge : t -> edge -> block list @@ -111,13 +111,13 @@ val is_back_edge : edge -> bool (** detect is there are non natural loops or natural loops where we didn't -* manage to compute back edges (see [mark_loops]). Must be empty in the mode -* [-wp-no-invariants]. (see also [very_strange_loops]) *) + * manage to compute back edges (see [mark_loops]). Must be empty in the mode + * [-wp-no-invariants]. (see also [very_strange_loops]) *) val strange_loops : t -> node list (** detect is there are natural loops where we didn't manage to compute -* back edges (see [mark_loops]). At the moment, we are not able to handle those -* loops. *) + * back edges (see [mark_loops]). At the moment, we are not able to handle those + * loops. *) val very_strange_loops : t -> node list (** @return the (normalized) labels at the program point of the edge. *) @@ -130,31 +130,31 @@ val has_exit : t -> bool (** Find the edges where the precondition of the node statement have to be -* checked. *) + * checked. *) val get_pre_edges : t -> node -> edge list (** Find the edges where the postconditions of the node statement have to be -* checked. *) + * checked. *) val get_post_edges : t -> node -> edge list (** Get the label to be used for the Post state of the node contract if any. *) val get_post_logic_label : t -> node -> logic_label option (** Find the edges [e] that goes to the [Vexit] node inside the statement -* begining at node [n] *) + * begining at node [n] *) val get_exit_edges : t -> node -> edge list (** Find the edges [e] of the statement node [n] postcondition -* and the set of edges that are inside the statement ([e] excluded). -* For instance, for a single statement node, [e] is [succ_e n], -* and the set is empty. For a test node, [e] are the last edges of the 2 -* branches, and the set contains all the edges between [n] and the [e] edges. -* *) + * and the set of edges that are inside the statement ([e] excluded). + * For instance, for a single statement node, [e] is [succ_e n], + * and the set is empty. For a test node, [e] are the last edges of the 2 + * branches, and the set contains all the edges between [n] and the [e] edges. + * *) val get_internal_edges : t -> node -> edge list * Eset.t val cfg_kf : t -> Kernel_function.t val cfg_spec_only : t -> bool - (** returns [true] is this CFG is degenerated (no code available) *) +(** returns [true] is this CFG is degenerated (no code available) *) (** signature of a mapping table from cfg edges to some information. *) module type HEsig = diff -Nru frama-c-20140301+neon+dfsg/src/wp/Cint.ml frama-c-20150201+sodium+dfsg/src/wp/Cint.ml --- frama-c-20140301+neon+dfsg/src/wp/Cint.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Cint.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -176,7 +176,7 @@ (* -------------------------------------------------------------------------- *) (* --- Arithmetics --- *) (* -------------------------------------------------------------------------- *) - + (* C Code Semantics *) let iopp = iunop e_opp let iadd = ibinop e_add @@ -239,7 +239,6 @@ | _ -> (* 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.Var _v -> let _tau = F.tau_of_var _v in false | _ -> false in if improved_is_positive_or_null e then true else match F.is_true (F.e_leq e_zero e) with diff -Nru frama-c-20140301+neon+dfsg/src/wp/Cint.mli frama-c-20150201+sodium+dfsg/src/wp/Cint.mli --- frama-c-20140301+neon+dfsg/src/wp/Cint.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Cint.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -44,7 +44,7 @@ val imul : c_int -> binop val idiv : c_int -> binop val imod : c_int -> binop - + val bnot : c_int -> unop val band : c_int -> binop val bxor : c_int -> binop diff -Nru frama-c-20140301+neon+dfsg/src/wp/clabels.ml frama-c-20150201+sodium+dfsg/src/wp/clabels.ml --- frama-c-20140301+neon+dfsg/src/wp/clabels.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/clabels.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -28,6 +28,7 @@ type c_label = | Here + | Init | Pre | Post | Exit @@ -44,7 +45,7 @@ let has_prefix p s = let rec scan k p s = ( k >= String.length p ) || - ( k < String.length s && p.[k] = s.[k] && scan (succ k) p s ) + ( k < String.length s && p.[k] = s.[k] && scan (succ k) p s ) in scan 0 p s let rec names_at = function @@ -57,13 +58,14 @@ else l :: names_at labels | Case(e,_) :: labels -> match Ctypes.get_int e with - | None -> "case" :: names_at labels - | Some n -> - if n < 0L - then ("caseneg" ^ Int64.to_string (Int64.neg n)) :: names_at labels - else ("case" ^ Int64.to_string n) :: names_at labels + | None -> "case" :: names_at labels + | Some n -> + if n < 0L + then ("caseneg" ^ Int64.to_string (Int64.neg n)) :: names_at labels + else ("case" ^ Int64.to_string n) :: names_at labels let c_label = function + | LogicLabel (None, "Init") -> Init | LogicLabel (None, "Here") -> Here | LogicLabel (None, "Pre") -> Pre | LogicLabel (None, "Post") -> Post @@ -84,6 +86,7 @@ let mk_loop_label s = (* TODO: clean that !*) c_label (loop_head_label s) let pretty fmt = function + | Init -> Format.pp_print_string fmt "\\init" | Here -> Format.pp_print_string fmt "\\here" | Pre -> Format.pp_print_string fmt "\\pre" | Post -> Format.pp_print_string fmt "\\post" @@ -94,6 +97,7 @@ | At([],sid) -> Format.fprintf fmt "Stmt sid:%d" sid let lookup_name = function + | Init -> "Init" | Pre -> "Pre" | Here -> "Here" | Post -> "Post" @@ -107,4 +111,4 @@ let is_param p = function (LogicLabel (None, a),_) -> a = p | _ -> false in c_label (snd (List.find (is_param param) labels)) with Not_found -> Wp_parameters.fatal - "Unbound label parameter '%s' in predicate or function call" param + "Unbound label parameter '%s' in predicate or function call" param diff -Nru frama-c-20140301+neon+dfsg/src/wp/clabels.mli frama-c-20150201+sodium+dfsg/src/wp/clabels.mli --- frama-c-20140301+neon+dfsg/src/wp/clabels.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/clabels.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -31,6 +31,7 @@ type c_label = | Here + | Init | Pre | Post | Exit @@ -55,13 +56,13 @@ val mk_loop_label : Cil_types.stmt -> c_label val c_label : Cil_types.logic_label -> c_label - (** - Assumes the logic label only comes from normalized labels. +(** + Assumes the logic label only comes from normalized labels. - This is the case inside [Wp] module, where all ACSL formula comes - from [WpAnnot], which in turns always preprocess the labels - through [NormAtLabels]. - *) + This is the case inside [Wp] module, where all ACSL formula comes + from [WpAnnot], which in turns always preprocess the labels + through [NormAtLabels]. +*) val pretty : Format.formatter -> c_label -> unit @@ -69,5 +70,5 @@ val lookup_name : c_label -> string val lookup : (logic_label * logic_label) list -> string -> c_label - (** [lookup bindings lparam] retrieves the actual label - for the label in [bindings] for label parameter [lparam]. *) +(** [lookup bindings lparam] retrieves the actual label + for the label in [bindings] for label parameter [lparam]. *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Cleaning.ml frama-c-20150201+sodium+dfsg/src/wp/Cleaning.ml --- frama-c-20140301+neon+dfsg/src/wp/Cleaning.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Cleaning.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -63,33 +63,33 @@ let rec add_pred m p = match F.pred p with - | And ps -> List.fold_left add_pred m ps - | If(e,a,b) -> add_pred (add_pred (set_top m e) a) b - | Eq(a,b) -> - begin - match F.pred a , F.pred b with - | Var x , Var y -> add_var x y (add_var y x m) - | _ -> set_top m p - end - | Var x -> add_true m x - | Not p -> - begin - match F.pred p with - | Var x -> add_false m x - | _ -> set_top m p - end - | _ -> set_top m p + | And ps -> List.fold_left add_pred m ps + | If(e,a,b) -> add_pred (add_pred (set_top m e) a) b + | Eq(a,b) -> + begin + match F.pred a , F.pred b with + | Fvar x , Fvar y -> add_var x y (add_var y x m) + | _ -> set_top m p + end + | Fvar x -> add_true m x + | Not p -> + begin + match F.pred p with + | Fvar x -> add_false m x + | _ -> set_top m p + end + | _ -> set_top m p let rec add_type m p = match F.pred p with - | And ps -> List.fold_left add_type m ps - | Fun(f,[e]) -> - begin - match F.pred e with - | Var x -> add_fun x f m - | _ -> set_top m p - end - | _ -> set_top m p + | And ps -> List.fold_left add_type m ps + | Fun(f,[e]) -> + begin + match F.pred e with + | Fvar x -> add_fun x f m + | _ -> set_top m p + end + | _ -> set_top m p (* -------------------------------------------------------------------------- *) (* --- Usage --- *) @@ -122,12 +122,12 @@ let is_var x m = try match Vmap.find x m.eq_var with | EQ y -> - begin - match get x m.eq_fun , get y m.eq_fun with - | None , _ -> true (* we eliminate x, which has no guard... *) - | Some (EQ f) , Some (EQ g) -> Fun.equal f g - | _ -> false - end + begin + match get x m.eq_fun , get y m.eq_fun with + | None , _ -> true (* we eliminate x, which has no guard... *) + | Some (EQ f) , Some (EQ g) -> Fun.equal f g + | _ -> false + end | _ -> false with Not_found -> false @@ -137,31 +137,31 @@ let rec filter_pred m p = match F.pred p with - | And ps -> F.p_all (filter_pred m) ps - | If(e,a,b) -> p_if e (filter_pred m a) (filter_pred m b) - | Eq(a,b) -> - begin - match F.pred a , F.pred b with - | Var x , Var y when is_var x m || is_var y m -> p_true - | _ -> p - end - | Var x when is_true x m.eq_var -> p_true - | Not q -> - begin - match F.pred q with - | Var x when is_false x m.eq_var -> p_true - | _ -> p - end - | _ -> p + | And ps -> F.p_all (filter_pred m) ps + | If(e,a,b) -> p_if e (filter_pred m a) (filter_pred m b) + | Eq(a,b) -> + begin + match F.pred a , F.pred b with + | Fvar x , Fvar y when is_var x m || is_var y m -> p_true + | _ -> p + end + | Fvar x when is_true x m.eq_var -> p_true + | Not q -> + begin + match F.pred q with + | Fvar x when is_false x m.eq_var -> p_true + | _ -> p + end + | _ -> p let rec filter_type m p = match F.pred p with - | And ps -> F.p_all (filter_type m) ps - | Fun(_,[e]) -> - begin - match F.pred e with - | Var x when is_var x m -> p_true - | _ -> p - end - | _ -> p + | And ps -> F.p_all (filter_type m) ps + | Fun(_,[e]) -> + begin + match F.pred e with + | Fvar x when is_var x m -> p_true + | _ -> p + end + | _ -> p diff -Nru frama-c-20140301+neon+dfsg/src/wp/Cleaning.mli frama-c-20150201+sodium+dfsg/src/wp/Cleaning.mli --- frama-c-20140301+neon+dfsg/src/wp/Cleaning.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Cleaning.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/CodeSemantics.ml frama-c-20150201+sodium+dfsg/src/wp/CodeSemantics.ml --- frama-c-20140301+neon+dfsg/src/wp/CodeSemantics.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/CodeSemantics.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -38,6 +38,10 @@ type value = M.loc Memory.value type sigma = M.Sigma.t + let print_value fmt = function + | Val e -> Format.fprintf fmt "Val:%a" F.pp_term e + | Loc l-> Format.fprintf fmt "Loc:%a" M.pretty l + let cval = function | Val e -> e | Loc l -> M.pointer_val l @@ -62,32 +66,32 @@ let rec is_zero sigma obj l = match obj with - | C_int _ -> is_zero_int (M.load sigma obj l) - | C_float _ -> is_zero_float (M.load sigma obj l) - | C_pointer _ -> is_zero_ptr (M.load sigma obj l) - | C_comp c -> - p_all - (fun f -> is_zero sigma (Ctypes.object_of f.ftype) (M.field l f)) - c.cfields - | C_array a -> - (*TODO[LC] make zero-initializers model-dependent. - For instance, a[N][M] becomes a[N*M] in MemTyped, but not in MemVar *) - let x = Lang.freshvar ~basename:"k" Logic.Int in - let k = e_var x in - let obj = Ctypes.object_of a.arr_element in - let range = match a.arr_flat with - | None -> [] - | Some f -> [ p_leq e_zero k ; p_lt k (e_int f.arr_size) ] in - let init = is_zero sigma obj (M.shift l obj k) in - p_forall [x] (p_hyps range init) - + | C_int _ -> is_zero_int (M.load sigma obj l) + | C_float _ -> is_zero_float (M.load sigma obj l) + | C_pointer _ -> is_zero_ptr (M.load sigma obj l) + | C_comp c -> + p_all + (fun f -> is_zero sigma (Ctypes.object_of f.ftype) (M.field l f)) + c.cfields + | C_array a -> + (*TODO[LC] make zero-initializers model-dependent. + For instance, a[N][M] becomes a[N*M] in MemTyped, but not in MemVar *) + let x = Lang.freshvar ~basename:"k" Logic.Int in + let k = e_var x in + let obj = Ctypes.object_of a.arr_element in + let range = match a.arr_flat with + | None -> [] + | Some f -> [ p_leq e_zero k ; p_lt k (e_int f.arr_size) ] in + let init = is_zero sigma obj (M.shift l obj k) in + p_forall [x] (p_hyps range init) + let is_zero_range sigma l obj a b = let x = Lang.freshvar ~basename:"k" Logic.Int in let k = e_var x in - let range = [ p_leq a k ; p_leq k b ] in + let range = [ p_leq a k ; p_lt k b ] in let init = is_zero sigma obj (M.shift l obj k) in p_forall [x] (p_hyps range init) - + (* -------------------------------------------------------------------------- *) (* --- Recursion --- *) (* -------------------------------------------------------------------------- *) @@ -110,10 +114,10 @@ | NoOffset -> l | Field(f,offset) -> loc_of_offset env (M.field l f) f.ftype offset | Index(e,offset) -> - let k = val_of_exp env e in - let te = Cil.typeOf_array_elem typ in - let obj = Ctypes.object_of te in - loc_of_offset env (M.shift l obj k) te offset + let k = val_of_exp env e in + let te = Cil.typeOf_array_elem typ in + let obj = Ctypes.object_of te in + loc_of_offset env (M.shift l obj k) te offset let lval env (lhost,offset) = loc_of_offset env (loc_of_lhost env lhost) (Cil.typeOfLhost lhost) offset @@ -125,14 +129,14 @@ let exp_unop env typ unop e = let v = match Ctypes.object_of typ , unop with - | C_int i , Neg -> Cint.iopp i (val_of_exp env e) - | C_int i , BNot -> Cint.bnot i (val_of_exp env e) - | C_float f , Neg -> Cfloat.fopp f (val_of_exp env e) - | C_int _ , LNot -> Cvalues.bool_eq (val_of_exp env e) e_zero - | C_float _ , LNot -> Cvalues.bool_eq (val_of_exp env e) e_zero_real - | C_pointer _ , LNot -> Cvalues.is_true (M.is_null (loc_of_exp env e)) - | _ -> - Warning.error "Undefined unary operator (%a)" Printer.pp_typ typ + | C_int i , Neg -> Cint.iopp i (val_of_exp env e) + | C_int i , BNot -> Cint.bnot i (val_of_exp env e) + | C_float f , Neg -> Cfloat.fopp f (val_of_exp env e) + | C_int _ , LNot -> Cvalues.bool_eq (val_of_exp env e) e_zero + | C_float _ , LNot -> Cvalues.bool_eq (val_of_exp env e) e_zero_real + | C_pointer _ , LNot -> Cvalues.is_true (M.is_null (loc_of_exp env e)) + | _ -> + Warning.error "Undefined unary operator (%a)" Printer.pp_typ typ in Val v (* -------------------------------------------------------------------------- *) @@ -141,14 +145,14 @@ let arith env tr iop fop e1 e2 = match Ctypes.object_of tr with - | C_int i -> Val (iop i (val_of_exp env e1) (val_of_exp env e2)) - | C_float f -> Val (fop f (val_of_exp env e1) (val_of_exp env e2)) - | _ -> assert false + | C_int i -> Val (iop i (val_of_exp env e1) (val_of_exp env e2)) + | C_float f -> Val (fop f (val_of_exp env e1) (val_of_exp env e2)) + | _ -> assert false let arith_int env tr iop e1 e2 = match Ctypes.object_of tr with - | C_int i -> Val (iop i (val_of_exp env e1) (val_of_exp env e2)) - | _ -> assert false + | C_int i -> Val (iop i (val_of_exp env e1) (val_of_exp env e2)) + | _ -> assert false let bool_of_comp env iop lop e1 e2 = let t1 = Cil.typeOf e1 in @@ -160,11 +164,11 @@ let bool_of_exp env e = match Ctypes.object_of (Cil.typeOf e) with - | C_int _ -> Cvalues.bool_neq (val_of_exp env e) e_zero - | C_float _ -> Cvalues.bool_neq (val_of_exp env e) e_zero_real - | C_pointer _ -> Cvalues.is_false (M.is_null (loc_of_exp env e)) - | _ -> assert false - + | C_int _ -> Cvalues.bool_neq (val_of_exp env e) e_zero + | C_float _ -> Cvalues.bool_neq (val_of_exp env e) e_zero_real + | C_pointer _ -> Cvalues.is_false (M.is_null (loc_of_exp env e)) + | _ -> assert false + let exp_binop env tr binop e1 e2 = match binop with | PlusA -> arith env tr Cint.iadd Cfloat.fadd e1 e2 | MinusA -> arith env tr Cint.isub Cfloat.fsub e1 e2 @@ -185,17 +189,17 @@ | 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 -> - 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)) + 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)) | MinusPI -> - 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 (e_opp (val_of_exp env e2))) + 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 (e_opp (val_of_exp env e2))) | MinusPP -> - let te = Cil.typeOf_pointed (Cil.typeOf e1) in - let obj = Ctypes.object_of te in - Val(M.loc_diff obj (loc_of_exp env e1) (loc_of_exp env e2)) + let te = Cil.typeOf_pointed (Cil.typeOf e1) in + let obj = Ctypes.object_of te in + Val(M.loc_diff obj (loc_of_exp env e1) (loc_of_exp env e2)) (* -------------------------------------------------------------------------- *) (* --- Cast --- *) @@ -204,37 +208,37 @@ let cast tr te ve = match Ctypes.object_of tr , Ctypes.object_of te with - | C_int ir , C_int ie -> - let v = cval ve in - Val( if Ctypes.sub_c_int ie ir then v else Cint.iconvert ir v ) - - | C_float fr , C_float fe -> - let v = cval ve in - Val( if Ctypes.sub_c_float fe fr then v else Cfloat.fconvert fr v ) - - | C_int ir , C_float _ -> Val(Cint.of_real ir (cval ve)) - | C_float fr , C_int _ -> Val(Cfloat.float_of_int fr (cval ve)) - - | C_pointer tr , C_pointer te -> - let obj_r = Ctypes.object_of tr in - let obj_e = Ctypes.object_of te in - if Ctypes.compare obj_r obj_e = 0 - then ve - else Loc (M.cast {pre=obj_e;post=obj_r} (cloc ve)) - - | C_pointer te , C_int _ -> - let e = cval ve in - Loc(if F.equal e (F.e_zero) then M.null - else M.loc_of_int (Ctypes.object_of te) e) - - | C_int ir , C_pointer _ -> - Val (M.int_of_loc ir (cloc ve)) - - | t1, t2 when Ctypes.equal t1 t2 -> ve - - | _ -> - Warning.error "cast (%a) into (%a) not yet implemented" - Printer.pp_typ te Printer.pp_typ tr + | C_int ir , C_int ie -> + let v = cval ve in + Val( if Ctypes.sub_c_int ie ir then v else Cint.iconvert ir v ) + + | C_float fr , C_float fe -> + let v = cval ve in + Val( if Ctypes.sub_c_float fe fr then v else Cfloat.fconvert fr v ) + + | C_int ir , C_float _ -> Val(Cint.of_real ir (cval ve)) + | C_float fr , C_int _ -> Val(Cfloat.float_of_int fr (cval ve)) + + | C_pointer tr , C_pointer te -> + let obj_r = Ctypes.object_of tr in + let obj_e = Ctypes.object_of te in + if Ctypes.compare obj_r obj_e = 0 + then ve + else Loc (M.cast {pre=obj_e;post=obj_r} (cloc ve)) + + | C_pointer te , C_int _ -> + let e = cval ve in + Loc(if F.equal e (F.e_zero) then M.null + else M.loc_of_int (Ctypes.object_of te) e) + + | C_int ir , C_pointer _ -> + Val (M.int_of_loc ir (cloc ve)) + + | t1, t2 when Ctypes.equal t1 t2 -> ve + + | _ -> + Warning.error "cast (%a) into (%a) not yet implemented" + Printer.pp_typ te Printer.pp_typ tr (* -------------------------------------------------------------------------- *) (* --- Exp-Node --- *) @@ -243,43 +247,43 @@ let exp_node env e = match e.enode with - | Const (CStr s) -> Loc (M.literal ~eid:e.eid (Cstring.C_str s)) - | Const (CWStr s) -> Loc (M.literal ~eid:e.eid (Cstring.W_str s)) - | Const c -> Val (Cvalues.constant c) - - | Lval lv -> - let loc = lval env lv in - let typ = Cil.typeOfLval lv in - let obj = Ctypes.object_of typ in - let data = M.load env obj loc in - Lang.assume (Cvalues.is_object obj data) ; - data - - | AddrOf lv | StartOf lv -> Loc (lval env lv) - - | UnOp(op,e,ty) -> exp_unop env ty op e - | BinOp(op,e1,e2,tr) -> exp_binop env tr op e1 e2 + | Const (CStr s) -> Loc (M.literal ~eid:e.eid (Cstring.C_str s)) + | Const (CWStr s) -> Loc (M.literal ~eid:e.eid (Cstring.W_str s)) + | Const c -> Val (Cvalues.constant c) + + | Lval lv -> + let loc = lval env lv in + let typ = Cil.typeOfLval lv in + let obj = Ctypes.object_of typ in + let data = M.load env obj loc in + Lang.assume (Cvalues.is_object obj data) ; + data + + | AddrOf lv | StartOf lv -> Loc (lval env lv) + + | 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 + | Info(e,_) -> !s_exp env e - | AlignOfE _ | AlignOf _ - | SizeOfE _ | SizeOf _ | SizeOfStr _ -> Val (Cvalues.constant_exp e) + | AlignOfE _ | AlignOf _ + | SizeOfE _ | SizeOf _ | SizeOfStr _ -> Val (Cvalues.constant_exp e) + + | CastE(tr,e) -> cast tr (Cil.typeOf e) (!s_exp env e) - | CastE(tr,e) -> cast tr (Cil.typeOf e) (!s_exp env e) - let rec call_node env e = match e.enode with - | CastE(_,e) -> call_node env e - | AddrOf lv | StartOf lv | Lval lv -> lval env lv - | _ -> Warning.error ~source:"call" "Unsupported function pointer" - + | CastE(_,e) -> call_node env e + | AddrOf lv | StartOf lv | Lval lv -> lval env lv + | _ -> Warning.error ~source:"call" "Unsupported function pointer" + (* -------------------------------------------------------------------------- *) (* --- Exp with Error --- *) (* -------------------------------------------------------------------------- *) let exp_handler e = let ty = Cil.typeOf e in - let x = Lang.freshvar ~basename:"W" (Lang.tau_of_ctype ty) in + let x = Lang.freshvar ~basename:"w" (Lang.tau_of_ctype ty) in Val (e_var x) let exp_protected env e = @@ -295,22 +299,22 @@ let equal_typ t v1 v2 = match v1 , v2 with - | Loc p , Loc q -> M.loc_eq p q - | Val a , Val b -> p_equal a b - | _ -> - if Cil.isPointerType t - then M.loc_eq (cloc v1) (cloc v2) - else p_equal (cval v1) (cval v2) + | Loc p , Loc q -> M.loc_eq p q + | Val a , Val b -> p_equal a b + | _ -> + if Cil.isPointerType t + then M.loc_eq (cloc v1) (cloc v2) + else p_equal (cval v1) (cval v2) let equal_obj t v1 v2 = match v1 , v2 with - | Loc p , Loc q -> M.loc_eq p q - | Val a , Val b -> p_equal a b - | _ -> - if Ctypes.is_pointer t - then M.loc_eq (cloc v1) (cloc v2) - else p_equal (cval v1) (cval v2) - + | Loc p , Loc q -> M.loc_eq p q + | Val a , Val b -> p_equal a b + | _ -> + if Ctypes.is_pointer t + then M.loc_eq (cloc v1) (cloc v2) + else p_equal (cval v1) (cval v2) + let compare env vop lop e1 e2 = let t1 = Cil.typeOf e1 in let t2 = Cil.typeOf e2 in @@ -322,24 +326,24 @@ let cond_node env e = match e.enode with - | UnOp( LNot, e,_) -> p_not (!s_cond env e) - | BinOp( LAnd, e1,e2,_) -> p_and (!s_cond env e1) (!s_cond env e2) - | BinOp( LOr, e1,e2,_) -> p_or (!s_cond env e1) (!s_cond env e2) - | BinOp( Eq, e1,e2,_) -> compare env p_equal M.loc_eq e1 e2 - | BinOp( Ne, e1,e2,_) -> compare env p_neq M.loc_neq e1 e2 - | BinOp( Lt, e1,e2,_) -> compare env p_lt M.loc_lt e1 e2 - | BinOp( Gt, e1,e2,_) -> compare env p_lt M.loc_lt e2 e1 - | BinOp( Le, e1,e2,_) -> compare env p_leq M.loc_leq e1 e2 - | BinOp( Ge, e1,e2,_) -> compare env p_leq M.loc_leq e2 e1 - - | _ -> - begin - match Ctypes.object_of (Cil.typeOf e) with - | C_int _ -> p_neq (val_of_exp env e) e_zero - | C_float _ -> p_neq (val_of_exp env e) e_zero_real - | C_pointer _ -> p_not (M.is_null (loc_of_exp env e)) - | obj -> Warning.error "Condition from (%a)" Ctypes.pretty obj - end + | UnOp( LNot, e,_) -> p_not (!s_cond env e) + | BinOp( LAnd, e1,e2,_) -> p_and (!s_cond env e1) (!s_cond env e2) + | BinOp( LOr, e1,e2,_) -> p_or (!s_cond env e1) (!s_cond env e2) + | BinOp( Eq, e1,e2,_) -> compare env p_equal M.loc_eq e1 e2 + | BinOp( Ne, e1,e2,_) -> compare env p_neq M.loc_neq e1 e2 + | BinOp( Lt, e1,e2,_) -> compare env p_lt M.loc_lt e1 e2 + | BinOp( Gt, e1,e2,_) -> compare env p_lt M.loc_lt e2 e1 + | BinOp( Le, e1,e2,_) -> compare env p_leq M.loc_leq e1 e2 + | BinOp( Ge, e1,e2,_) -> compare env p_leq M.loc_leq e2 e1 + + | _ -> + begin + match Ctypes.object_of (Cil.typeOf e) with + | C_int _ -> p_neq (val_of_exp env e) e_zero + | C_float _ -> p_neq (val_of_exp env e) e_zero_real + | C_pointer _ -> p_not (M.is_null (loc_of_exp env e)) + | obj -> Warning.error "Condition from (%a)" Ctypes.pretty obj + end (* -------------------------------------------------------------------------- *) (* --- BootStrapping --- *) @@ -352,8 +356,8 @@ let () = s_exp := exp let () = s_cond := cond - + let instance_of floc kf = M.loc_eq floc (M.cvar (Kernel_function.get_vi kf)) - + end diff -Nru frama-c-20140301+neon+dfsg/src/wp/CodeSemantics.mli frama-c-20150201+sodium+dfsg/src/wp/CodeSemantics.mli --- frama-c-20140301+neon+dfsg/src/wp/CodeSemantics.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/CodeSemantics.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Conditions.ml frama-c-20150201+sodium+dfsg/src/wp/Conditions.ml --- frama-c-20140301+neon+dfsg/src/wp/Conditions.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Conditions.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -71,6 +71,8 @@ | Branch(p,(xs,_),(ys,_)) -> Vars.union (F.varsp p) (Vars.union xs ys) | Either cases -> vars_list cases +let vars_sequent (hs,g) = Vars.union (F.varsp g) (vars_seq hs) + (* -------------------------------------------------------------------------- *) (* --- Utilities --- *) (* -------------------------------------------------------------------------- *) @@ -256,9 +258,10 @@ List.iter (pp_step fmt env) seq let dump fmt (b:bundle) = - pp_sequence fmt "Assume" F.empty (snd (Bundle.freeze b)) + let xs,seq = Bundle.freeze b in + pp_sequence fmt "Assume" (F.env xs) seq -let pp_seq title fmt s = pp_sequence fmt title F.empty s +let pp_seq title fmt s = pp_sequence fmt title (F.env (vars_seq s)) s (* -------------------------------------------------------------------------- *) (* --- Extraction --- *) @@ -279,11 +282,12 @@ (* --- Pretty Printer --- *) (* -------------------------------------------------------------------------- *) -let pretty ?linker fmt (hyps,goal) = +let pretty ?linker fmt s = try glinker := linker ; - let env = F.closed (Vars.union (F.varsp goal) (vars_seq hyps)) in + let env = F.env (vars_sequent s) in let m = F.marker env in + let (hyps,goal) = s in mark_seq m hyps ; F.mark_p m goal ; let env = F.define diff -Nru frama-c-20140301+neon+dfsg/src/wp/Conditions.mli frama-c-20150201+sodium+dfsg/src/wp/Conditions.mli --- frama-c-20140301+neon+dfsg/src/wp/Conditions.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Conditions.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -33,11 +33,11 @@ val dump : Format.formatter -> bundle -> unit type 'a attributed = - ( ?descr:string -> - ?stmt:stmt -> - ?deps:Property.t list -> - ?warn:Warning.Set.t -> - 'a ) + ( ?descr:string -> + ?stmt:stmt -> + ?deps:Property.t list -> + ?warn:Warning.Set.t -> + 'a ) val empty : bundle val occurs : F.var -> bundle -> bool @@ -54,7 +54,7 @@ type hypotheses val hypotheses : bundle -> hypotheses - + type sequent = hypotheses * F.pred (** Simplifier *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/configure frama-c-20150201+sodium+dfsg/src/wp/configure --- frama-c-20140301+neon+dfsg/src/wp/configure 2014-03-12 15:07:57.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/configure 2015-06-01 13:17:44.000000000 +0000 @@ -1799,6 +1799,13 @@ + +# Usage: plugin_disable([plugin],[reason]) + + + + + # Implementation of an ordering $1 < $2: "" < yes < partial < no lt_mark () { first=`echo "$1" | sed -e 's/ .*//' ` @@ -2152,7 +2159,6 @@ fi -if test "$ENABLE_WP" != "no"; then @@ -2168,13 +2174,31 @@ - USE_RTE_ANNOTATION=$USE_RTE_ANNOTATION" "wp - USED_WP=$USED_WP" "rte_annotation + USE_RTEGEN=$USE_RTEGEN" "wp + USED_WP=$USED_WP" "rtegen + + + +# First, initialize some variables +for fp in ${PLUGINS_FORCE_LIST}; do + if test "$fp" != "FORCE_GTKSOURCEVIEW"; then + plugin=`echo $fp | sed -e "s/FORCE_\(.*\)/\1/" ` + TODOLIST=$TODOLIST" "$plugin + eval MARK_$plugin= + eval REMEMBER_$plugin= + fi +done +# main call +compute_dependency + + +# NB: this would deserve to use plugin_requires mechanism +if test "$ENABLE_WP" != "no"; then ## Configuring for WP-COQ if test "$WPCOQ" = "yes" ; then @@ -2281,7 +2305,7 @@ if test "$WHY3COQC" = "yes" ; then WHY3VERSION=`why3 --version | sed -n -e 's|.*version* *\([^ ]*\) .*$|\1|p' ` case $WHY3VERSION in - 0.82*) + 0.85*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: why3 version $WHY3VERSION found" >&5 $as_echo "why3 version $WHY3VERSION found" >&6; } WHY3LIB=`why3 --print-libdir` @@ -2295,34 +2319,20 @@ fi ;; *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: wp needs needs why3 0.82" >&5 -$as_echo "wp needs needs why3 0.82" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: wp needs why3 0.85" >&5 +$as_echo "wp needs why3 0.85" >&6; } WHY3COQC="no" ;; esac else - { $as_echo "$as_me:${as_lineno-$LINENO}: rerun configure to make wp using why3 0.82" >&5 -$as_echo "$as_me: rerun configure to make wp using why3 0.82" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: rerun configure to make wp using why3 0.85" >&5 +$as_echo "$as_me: rerun configure to make wp using why3 0.85" >&6;} fi else WHY3COQC="no" fi - - -# First, initialize some variables -for fp in ${PLUGINS_FORCE_LIST}; do - if test "$fp" != "FORCE_GTKSOURCEVIEW"; then - plugin=`echo $fp | sed -e "s/FORCE_\(.*\)/\1/" ` - TODOLIST=$TODOLIST" "$plugin - eval MARK_$plugin= - eval REMEMBER_$plugin= - fi -done -# main call -compute_dependency - fi diff -Nru frama-c-20140301+neon+dfsg/src/wp/configure.ac frama-c-20150201+sodium+dfsg/src/wp/configure.ac --- frama-c-20140301+neon+dfsg/src/wp/configure.ac 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/configure.ac 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of WP plug-in of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat a l'energie atomique et aux energies # # alternatives) # # # @@ -49,9 +49,13 @@ WPWHY3COQ=yes ) +plugin_use(wp,gui) +plugin_use(wp,rtegen) + +check_plugin_dependencies + +# NB: this would deserve to use plugin_requires mechanism if test "$ENABLE_WP" != "no"; then - plugin_use(wp,gui) - plugin_use(wp,rte_annotation) ## Configuring for WP-COQ if test "$WPCOQ" = "yes" ; then @@ -81,7 +85,7 @@ if test "$WHY3COQC" = "yes" ; then WHY3VERSION=`why3 --version | sed -n -e 's|.*version* *\([[^ ]]*\) .*$|\1|p' ` case $WHY3VERSION in - 0.82*) + 0.85*) AC_MSG_RESULT(why3 version $WHY3VERSION found) WHY3LIB=`why3 --print-libdir` if test -f $WHY3LIB/coq/BuiltIn.vo ; then @@ -92,19 +96,18 @@ fi ;; *) - AC_MSG_RESULT(wp needs needs why3 0.82, found $WHY3VERSION) + AC_MSG_RESULT(wp needs why3 0.85, found $WHY3VERSION) WHY3COQC="no" ;; esac else - AC_MSG_NOTICE(rerun configure to make wp using why3 0.82) + AC_MSG_NOTICE(rerun configure to make wp using why3 0.85) fi else WHY3COQC="no" fi AC_SUBST(WHY3COQC) - check_plugin_dependencies fi write_plugin_config(Makefile) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Context.ml frama-c-20150201+sodium+dfsg/src/wp/Context.ml --- frama-c-20140301+neon+dfsg/src/wp/Context.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Context.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -49,8 +49,8 @@ let get env = match env.current with - | Some e -> e - | None -> Wp_parameters.fatal "Context '%s' non-initialized." env.name + | Some e -> e + | None -> Wp_parameters.fatal "Context '%s' non-initialized." env.name let set env s = env.current <- Some s @@ -60,8 +60,8 @@ let update env f = match env.current with - | Some e -> env.current <- Some (f e) - | None -> Wp_parameters.fatal "Context '%s' non-initialized." env.name + | Some e -> env.current <- Some (f e) + | None -> Wp_parameters.fatal "Context '%s' non-initialized." env.name let bind_with env w f e = let tmp = env.current in env.current <- w ; diff -Nru frama-c-20140301+neon+dfsg/src/wp/Context.mli frama-c-20150201+sodium+dfsg/src/wp/Context.mli --- frama-c-20140301+neon+dfsg/src/wp/Context.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Context.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -29,29 +29,29 @@ type 'a value val create : ?default:'a -> string -> 'a value - (** Creates a new context with name *) +(** Creates a new context with name *) val defined : 'a value -> bool - (** The current value is defined. *) +(** The current value is defined. *) val get : 'a value -> 'a - (** Retrieves the current value of the context. - Raise an exception if not bound. *) +(** Retrieves the current value of the context. + Raise an exception if not bound. *) val set : 'a value -> 'a -> unit - (** Define the current value. Previous one is lost *) +(** Define the current value. Previous one is lost *) val update : 'a value -> ('a -> 'a) -> unit - (** Modification of the current value *) +(** Modification of the current value *) val bind : 'a value -> 'a -> ('b -> 'c) -> 'b -> 'c - (** Performs the job with local context bound to local value. *) +(** Performs the job with local context bound to local value. *) val free : 'a value -> ('b -> 'c) -> 'b -> 'c - (** Performs the job with local context cleared. *) +(** Performs the job with local context cleared. *) val clear : 'a value -> unit - (** Clear the current value. *) +(** Clear the current value. *) val push : 'a value -> 'a -> 'a option val pop : 'a value -> 'a option -> unit @@ -59,5 +59,5 @@ val name : 'a value -> string val once : (unit -> unit) -> unit -> unit - (** A global configure, executed once. *) - +(** A global configure, executed once. *) + diff -Nru frama-c-20140301+neon+dfsg/src/wp/Cstring.ml frama-c-20150201+sodium+dfsg/src/wp/Cstring.ml --- frama-c-20140301+neon+dfsg/src/wp/Cstring.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Cstring.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -39,7 +39,7 @@ let pretty fmt = function | C_str s -> Format.fprintf fmt "%S" s | W_str _ -> Format.fprintf fmt "\"L<...>\"" - let hash (c:t) = Hashtbl.hash c land 0xFFFF + let hash (c:t) = FCHashtbl.hash c land 0xFFFF end let pretty = STR.pretty @@ -48,63 +48,63 @@ Definitions.cluster ~id:"cstring" ~title:"String Literals" () module LIT = Model.Generator(STR) - (struct - type key = cst - type data = int * F.term - let name = "Cstring.Litterals" - - let hid = Hashtbl.create 31 - - let rec lookup id = - if id=0 || Hashtbl.mem hid id - then lookup (succ id) - else (Hashtbl.add hid id () ; id) - - let export_literal prefix lfun str = - let chars = ref [] in - let array = F.e_fun lfun [] in - let n = String.length str in - for i = 0 to n do - let a = F.e_get array (F.e_int i) in - let c = - if i = n - then F.e_zero - else F.e_int (int_of_char str.[i]) - in - chars := (F.p_equal a c) :: !chars ; - done ; - define_lemma { - l_name = prefix ^ "_literal" ; - l_cluster = cluster () ; - l_assumed = true ; - l_types = 0 ; - l_forall = [] ; - l_triggers = [] ; - l_lemma = F.p_conj (List.rev !chars) ; - } - - let compile s = - let id = lookup (STR.hash s) in - let lfun = Lang.generated_f ~result:(Array(Int,Int)) "Lit_%04X" id in - (** Since its a generated it is the unique name given ["Lit_%04X" id] *) - let prefix = Lang.Fun.debug lfun in - define_symbol { - d_lfun = lfun ; - d_cluster = cluster () ; - d_types = 0 ; - d_params = [] ; - d_definition = Logic (Array(Int,Int)) ; - } ; - if Wp_parameters.Literals.get () then - begin match s with - | C_str str -> export_literal prefix lfun str - | W_str _ -> - Wp_parameters.warning ~current:false ~once:true - "Content of wide string literals not exported." - end ; - id , F.e_fun lfun [] - - end) + (struct + type key = cst + type data = int * F.term + let name = "Cstring.Litterals" + + let hid = Hashtbl.create 31 + + let rec lookup id = + if id=0 || Hashtbl.mem hid id + then lookup (succ id) + else (Hashtbl.add hid id () ; id) + + let export_literal prefix lfun str = + let chars = ref [] in + let array = F.e_fun lfun [] in + let n = String.length str in + for i = 0 to n do + let a = F.e_get array (F.e_int i) in + let c = + if i = n + then F.e_zero + else F.e_int (int_of_char str.[i]) + in + chars := (F.p_equal a c) :: !chars ; + done ; + define_lemma { + l_name = prefix ^ "_literal" ; + l_cluster = cluster () ; + l_assumed = true ; + l_types = 0 ; + l_forall = [] ; + l_triggers = [] ; + l_lemma = F.p_conj (List.rev !chars) ; + } + + let compile s = + let id = lookup (STR.hash s) in + let lfun = Lang.generated_f ~result:(Array(Int,Int)) "Lit_%04X" id in + (** Since its a generated it is the unique name given ["Lit_%04X" id] *) + let prefix = Lang.Fun.debug lfun in + define_symbol { + d_lfun = lfun ; + d_cluster = cluster () ; + d_types = 0 ; + d_params = [] ; + d_definition = Logic (Array(Int,Int)) ; + } ; + if Wp_parameters.Literals.get () then + begin match s with + | C_str str -> export_literal prefix lfun str + | W_str _ -> + Wp_parameters.warning ~current:false ~once:true + "Content of wide string literals not exported." + end ; + id , F.e_fun lfun [] + + end) let str_id s = fst (LIT.get s) let str_val s = snd (LIT.get s) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Cstring.mli frama-c-20150201+sodium+dfsg/src/wp/Cstring.mli --- frama-c-20140301+neon+dfsg/src/wp/Cstring.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Cstring.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -39,5 +39,5 @@ val char_at : cst -> term -> term val cluster : unit -> Definitions.cluster - (** The cluster where all strings are defined. *) +(** The cluster where all strings are defined. *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/ctypes.ml frama-c-20150201+sodium+dfsg/src/wp/ctypes.ml --- frama-c-20140301+neon+dfsg/src/wp/ctypes.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/ctypes.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -74,18 +74,18 @@ let c_int ikind = let mach = Cil.theMachine.Cil.theMachine in match ikind with - | IBool -> make_c_int false mach.sizeof_int - | IChar -> if mach.char_is_unsigned then UInt8 else SInt8 - | ISChar -> SInt8 - | IUChar -> UInt8 - | IInt -> make_c_int true mach.sizeof_int - | IUInt -> make_c_int false mach.sizeof_int - | IShort -> make_c_int true mach.sizeof_short - | IUShort -> make_c_int false mach.sizeof_short - | ILong -> make_c_int true mach.sizeof_long - | IULong -> make_c_int false mach.sizeof_long - | ILongLong -> make_c_int true mach.sizeof_longlong - | IULongLong -> make_c_int false mach.sizeof_longlong + | IBool -> make_c_int false mach.sizeof_int + | IChar -> if mach.char_is_unsigned then UInt8 else SInt8 + | ISChar -> SInt8 + | IUChar -> UInt8 + | IInt -> make_c_int true mach.sizeof_int + | IUInt -> make_c_int false mach.sizeof_int + | IShort -> make_c_int true mach.sizeof_short + | IUShort -> make_c_int false mach.sizeof_short + | ILong -> make_c_int true mach.sizeof_long + | IULong -> make_c_int false mach.sizeof_long + | ILongLong -> make_c_int true mach.sizeof_longlong + | IULongLong -> make_c_int false mach.sizeof_longlong (* Bounds of an integer according to c_int ti : An integer i : i \in [c_int_bounds ti] if @@ -100,14 +100,14 @@ and uint64 = Integer.zero, Integer.of_string "18446744073709551616" and sint64 = Integer.of_string "-9223372036854775808", Integer.of_string "9223372036854775808" in function - | UInt8 -> uint8 - | SInt8 -> sint8 - | UInt16 -> uint16 - | SInt16 -> sint16 - | UInt32 -> uint32 - | SInt32 -> sint32 - | UInt64 -> uint64 - | SInt64 -> sint64 + | UInt8 -> uint8 + | SInt8 -> sint8 + | UInt16 -> uint16 + | SInt16 -> sint16 + | UInt32 -> uint32 + | SInt32 -> sint32 + | UInt64 -> uint64 + | SInt64 -> sint64 let c_int_all = [ UInt8 ; SInt8 ; UInt16 ; SInt16 ; UInt32 ; SInt32 ; UInt64 ; SInt64 ] @@ -119,7 +119,7 @@ let sub_c_int t1 t2 = if (signed t1 = signed t2) then i_bits t1 <= i_bits t2 - else (not(signed t1) && (i_bits t1 < i_bits t2)) + else (not(signed t1) && (i_bits t1 < i_bits t2)) type c_float = | Float32 @@ -143,9 +143,9 @@ let c_float fkind = let mach = Cil.theMachine.Cil.theMachine in match fkind with - | FFloat -> make_c_float mach.sizeof_float - | FDouble -> make_c_float mach.sizeof_double - | FLongDouble -> make_c_float mach.sizeof_longdouble + | FFloat -> make_c_float mach.sizeof_float + | FDouble -> make_c_float mach.sizeof_double + | FLongDouble -> make_c_float mach.sizeof_longdouble let sub_c_float f1 f2 = f_bits f1 <= f_bits f2 @@ -190,8 +190,8 @@ fun i -> let k = idx i in match m.(k) with - | Some r -> r - | None -> let r = f i in m.(k) <- Some r ; r + | Some r -> r + | None -> let r = f i in m.(k) <- Some r ; r let fdx = function | Float32 -> 0 @@ -202,15 +202,15 @@ fun z -> let k = fdx z in match m.(k) with - | Some r -> r - | None -> let r = f z in m.(k) <- Some r ; r + | Some r -> r + | None -> let r = f z in m.(k) <- Some r ; r (* -------------------------------------------------------------------------- *) (* --- Pretty Printers --- *) (* -------------------------------------------------------------------------- *) let pp_int fmt i = Format.fprintf fmt "%cint%d" - (if signed i then 's' else 'u') (i_bits i) + (if signed i then 's' else 'u') (i_bits i) let pp_float fmt f = Format.fprintf fmt "float%d" (f_bits f) @@ -225,28 +225,23 @@ (* --- Array Info --- *) (* -------------------------------------------------------------------------- *) -let char c = - match Cil.charConstToInt c with - | CInt64(k,_,_) -> Integer.to_int64 k - | _ -> WpLog.fatal "char-const-to-int" +let char c = Integer.to_int64 (Cil.charConstToInt c) let constant e = match (Cil.constFold true e).enode with - | Const(CInt64(k,_,_)) -> Integer.to_int64 k - | Const(CChr c) -> char c - | _ -> WpLog.fatal "Non-constant expression (%a)" Printer.pp_exp e + | Const(CInt64(k,_,_)) -> Integer.to_int64 k + | _ -> WpLog.fatal "Non-constant expression (%a)" Printer.pp_exp e let get_int e = match (Cil.constFold true e).enode with - | Const(CInt64(k,_,_)) -> Some (Integer.to_int64 k) - | Const(CChr c) -> Some (char c) - | _ -> None + | Const(CInt64(k,_,_)) -> Some (Integer.to_int64 k) + | _ -> None let dimension t = let rec flat k d = function | TNamed _ as t -> flat k d (Cil.unrollType t) | TArray(ty,Some e,_,_) -> - flat (succ k) (Int64.mul d (constant e)) ty + flat (succ k) (Int64.mul d (constant e)) ty | te -> k , d , te in flat 1 Int64.one t @@ -260,51 +255,51 @@ let is_void typ = match Cil.unrollType typ with - | TVoid _ -> true - | _ -> false + | TVoid _ -> true + | _ -> false let object_of typ = - match Cil.unrollType typ with - | TInt(i,_) -> C_int (c_int i) - | TFloat(f,_) -> C_float (c_float f) - | TPtr(typ,_) -> - begin - match Cil.unrollType typ with - | TVoid _ -> C_pointer (TInt (IChar,[])) - | _ -> C_pointer typ - end - | TFun _ -> C_pointer (TVoid []) - | TEnum ({ekind=i},_) -> C_int (c_int i) - | TComp (comp,_,_) -> C_comp comp - | TArray (typ_elt,e_opt,_,_) -> - begin - match e_opt with - | None -> - C_array { - arr_element = typ_elt; - arr_flat = None; - } - - | Some e -> - let dim,ncells,ty_cell = dimension typ in - C_array { - arr_element = typ_elt ; - arr_flat = Some { - arr_size = Int64.to_int (constant e) ; - arr_dim = dim ; - arr_cell = ty_cell ; - arr_cell_nbr = Int64.to_int (ncells) ; - } + match Cil.unrollType typ with + | TInt(i,_) -> C_int (c_int i) + | TFloat(f,_) -> C_float (c_float f) + | TPtr(typ,_) -> + begin + match Cil.unrollType typ with + | TVoid _ -> C_pointer (TInt (IChar,[])) + | _ -> C_pointer typ + end + | TFun _ -> C_pointer (TVoid []) + | TEnum ({ekind=i},_) -> C_int (c_int i) + | TComp (comp,_,_) -> C_comp comp + | TArray (typ_elt,e_opt,_,_) -> + begin + match e_opt with + | None -> + C_array { + arr_element = typ_elt; + arr_flat = None; + } + + | Some e -> + let dim,ncells,ty_cell = dimension typ in + C_array { + arr_element = typ_elt ; + arr_flat = Some { + arr_size = Int64.to_int (constant e) ; + arr_dim = dim ; + arr_cell = ty_cell ; + arr_cell_nbr = Int64.to_int (ncells) ; } - end - | TBuiltin_va_list _ -> - WpLog.warning ~current:true ~once:true "variadyc type (considered as void*)" ; - C_pointer (TVoid []) - | TVoid _ -> - WpLog.warning ~current:true "void object" ; - C_int (c_int IInt) - | TNamed _ -> - WpLog.fatal "non-unrolled named type (%a)" Printer.pp_typ typ + } + end + | TBuiltin_va_list _ -> + WpLog.warning ~current:true ~once:true "variadyc type (considered as void*)" ; + C_pointer (TVoid []) + | TVoid _ -> + WpLog.warning ~current:true "void object" ; + C_int (c_int IInt) + | TNamed _ -> + WpLog.fatal "non-unrolled named type (%a)" Printer.pp_typ typ let object_of_pointed = function C_int _ | C_float _ | C_comp _ as o -> @@ -317,49 +312,49 @@ let object_of_array_elem = function | C_array arr -> object_of arr.arr_element | o -> Wp_parameters.fatal ~current:true - "object_of_array_elem called on non-array %a." pp_object o + "object_of_array_elem called on non-array %a." pp_object o let rec object_of_logic_type t = match Logic_utils.unroll_type t with - | Ctype ty -> object_of ty - | Ltype({lt_name="set"},[t]) -> object_of_logic_type t - | t -> Wp_parameters.fatal ~current:true - "@[c-object of logic type@ (%a)@]" - Printer.pp_logic_type t - + | Ctype ty -> object_of ty + | Ltype({lt_name="set"},[t]) -> object_of_logic_type t + | t -> Wp_parameters.fatal ~current:true + "@[c-object of logic type@ (%a)@]" + Printer.pp_logic_type t + let rec object_of_logic_pointed t = match Logic_utils.unroll_type t with - | Ctype ty -> object_of_pointed (object_of ty) - | Ltype({lt_name="set"},[t]) -> object_of_logic_pointed t - | t -> Wp_parameters.fatal ~current:true - "@[pointed of logic type@ (%a)@]" - Printer.pp_logic_type t - + | Ctype ty -> object_of_pointed (object_of ty) + | Ltype({lt_name="set"},[t]) -> object_of_logic_pointed t + | t -> Wp_parameters.fatal ~current:true + "@[pointed of logic type@ (%a)@]" + Printer.pp_logic_type t + let no_infinite_array = function - | C_array {arr_flat = None} -> false - | _ -> true + | C_array {arr_flat = None} -> false + | _ -> true let array_dim arr = match arr.arr_flat with - | Some f -> object_of f.arr_cell , f.arr_dim - 1 - | None -> - let rec collect_dim arr n = - match object_of arr.arr_element with - | C_array arr -> collect_dim arr (succ n) - | te -> te,n - in collect_dim arr 1 + | Some f -> object_of f.arr_cell , f.arr_dim - 1 + | None -> + let rec collect_dim arr n = + match object_of arr.arr_element with + | C_array arr -> collect_dim arr (succ n) + | te -> te,n + in collect_dim arr 1 let rec array_dimensions a = let te = object_of a.arr_element in let d = match a.arr_flat with None -> None | Some f -> Some f.arr_size in match te with - | C_array a -> let te,ds = array_dimensions a in te , d::ds - | _ -> te , [d] + | C_array a -> let te,ds = array_dimensions a in te , d::ds + | _ -> te , [d] let array_size typ = match object_of typ with - | C_array { arr_flat=Some { arr_size=s } } -> Some s - | _ -> None + | C_array { arr_flat=Some { arr_size=s } } -> Some s + | _ -> None let dimension_of_object = function | C_int _ | C_float _ | C_pointer _ | C_comp _ | C_array { arr_flat=None } -> None @@ -369,23 +364,23 @@ if Int64.compare a b < 0 then b else a let rec sizeof_object = function - | C_int i -> i_bytes i - | C_float f -> f_bytes f - | C_pointer _ty -> i_bytes (c_ptr()) - | C_comp cinfo -> - let ctype = TComp(cinfo,Cil.empty_size_cache(),[]) in - (Cil.bitsSizeOf ctype / 8) - | C_array ainfo -> - match ainfo.arr_flat with - | Some a -> - let csize = Cil.integer ~loc:Cil.builtinLoc a.arr_cell_nbr in - let ctype = TArray(a.arr_cell,Some csize,Cil.empty_size_cache(),[]) in - (Cil.bitsSizeOf ctype / 8) - | None -> - if WpLog.ExternArrays.get () then - max_int - else - WpLog.fatal ~current:true "Sizeof unknown-size array" + | C_int i -> i_bytes i + | C_float f -> f_bytes f + | C_pointer _ty -> i_bytes (c_ptr()) + | C_comp cinfo -> + let ctype = TComp(cinfo,Cil.empty_size_cache(),[]) in + (Cil.bitsSizeOf ctype / 8) + | C_array ainfo -> + match ainfo.arr_flat with + | Some a -> + let csize = Cil.integer ~loc:Cil.builtinLoc a.arr_cell_nbr in + let ctype = TArray(a.arr_cell,Some csize,Cil.empty_size_cache(),[]) in + (Cil.bitsSizeOf ctype / 8) + | None -> + if WpLog.ExternArrays.get () then + max_int + else + WpLog.fatal ~current:true "Sizeof unknown-size array" let sizeof_typ t = Cil.bitsSizeOf t / 8 @@ -419,12 +414,12 @@ let promote a1 a2 = match a1 , a2 with - | C_int i1 , C_int i2 -> C_int (i_convert i1 i2) - | C_float f1 , C_float f2 -> C_float (f_convert f1 f2) - | C_int _ , C_float _ -> a2 - | C_float _ , C_int _ -> a1 - | _ -> WpLog.not_yet_implemented - "promotion between arithmetics and pointer types" + | C_int i1 , C_int i2 -> C_int (i_convert i1 i2) + | C_float f1 , C_float f2 -> C_float (f_convert f1 f2) + | C_int _ , C_float _ -> a2 + | C_float _ , C_int _ -> a1 + | _ -> WpLog.not_yet_implemented + "promotion between arithmetics and pointer types" (* ------------------------------------------------------------------------ *) (* --- Comparable --- *) @@ -440,10 +435,10 @@ let obj_a = object_of a.arr_element in let obj_b = object_of b.arr_element in (!cmp obj_a obj_b = 0) && - (match a.arr_flat , b.arr_flat with - | Some a , Some b -> a.arr_size = b.arr_size - | None , None -> true - | _ -> false) + (match a.arr_flat , b.arr_flat with + | Some a , Some b -> a.arr_size = b.arr_size + | None , None -> true + | _ -> false) let compare a b = let obj_a = object_of a.arr_element in let obj_b = object_of b.arr_element in @@ -465,29 +460,29 @@ let equal a b = match a,b with - | C_int i, C_int i' -> i=i' - | C_float f , C_float f' -> f=f' - | C_pointer te , C_pointer te' -> Typ.equal te te' - | C_comp c , C_comp c' -> Compinfo.equal c c' - | C_array a , C_array a' -> AinfoComparable.equal a a' - | _ -> false + | C_int i, C_int i' -> i=i' + | C_float f , C_float f' -> f=f' + | C_pointer te , C_pointer te' -> Typ.equal te te' + | C_comp c , C_comp c' -> Compinfo.equal c c' + | C_array a , C_array a' -> AinfoComparable.equal a a' + | _ -> false let compare a b = if a==b then 0 else match a,b with - | C_int i, C_int i' -> compare_c_int i i' - | C_int _ , _ -> (-1) - | _ , C_int _ -> 1 - | C_float f , C_float f' -> compare_c_float f f' - | C_float _ , _ -> (-1) - | _ , C_float _ -> 1 - | C_pointer te , C_pointer te' -> Typ.compare te te' - | C_pointer _ , _ -> (-1) - | _ , C_pointer _ -> 1 - | C_comp c , C_comp c' -> Compinfo.compare c c' - | C_comp _ , _ -> (-1) - | _ , C_comp _ -> 1 - | C_array a , C_array a' -> AinfoComparable.compare a a' + | C_int i, C_int i' -> compare_c_int i i' + | C_int _ , _ -> (-1) + | _ , C_int _ -> 1 + | C_float f , C_float f' -> compare_c_float f f' + | C_float _ , _ -> (-1) + | _ , C_float _ -> 1 + | C_pointer te , C_pointer te' -> Typ.compare te te' + | C_pointer _ , _ -> (-1) + | _ , C_pointer _ -> 1 + | C_comp c , C_comp c' -> Compinfo.compare c c' + | C_comp _ , _ -> (-1) + | _ , C_comp _ -> 1 + | C_array a , C_array a' -> AinfoComparable.compare a a' let () = begin @@ -497,9 +492,9 @@ let merge a b = match a,b with - | C_int i, C_int i' -> if sub_c_int i' i then a else b - | C_float f , C_float f' -> if sub_c_float f' f then a else b - | _ -> assert (equal a b) ; a + | C_int i, C_int i' -> if sub_c_int i' i then a else b + | C_float f , C_float f' -> if sub_c_float f' f then a else b + | _ -> assert (equal a b) ; a let rec basename = function | C_int i -> Pretty_utils.sfprintf "%a" pp_int i @@ -509,8 +504,8 @@ | C_array a -> let te = basename (object_of a.arr_element) in match a.arr_flat with - | None -> te ^ "_array" - | Some f -> te ^ "_" ^ string_of_int f.arr_size + | None -> te ^ "_array" + | Some f -> te ^ "_" ^ string_of_int f.arr_size let rec pretty fmt = function | C_int i -> pp_int fmt i @@ -520,5 +515,57 @@ | C_array a -> let te = object_of a.arr_element in match a.arr_flat with - | None -> Format.fprintf fmt "%a[]" pretty te - | Some f -> Format.fprintf fmt "%a[%d]" pretty te f.arr_size + | None -> Format.fprintf fmt "%a[]" pretty te + | Some f -> Format.fprintf fmt "%a[%d]" pretty te f.arr_size + + +module C_object = Datatype.Make(struct + type t = c_object + let name = "Ctypes.C_object" + + let rehash = Datatype.Undefined.rehash + let structural_descr = Datatype.Undefined.structural_descr + + let reprs = [C_int UInt8] + + let equal = equal + let pretty = pretty + let hash = hash + let compare = compare + + let copy = Datatype.Undefined.copy + + let internal_pretty_code = Datatype.Undefined.internal_pretty_code + let mem_project = Datatype.Undefined.mem_project + + let varname _ = "co" + end) + +let rec compare_ptr_conflated a b = + if a==b then 0 else + match a,b with + | C_int i, C_int i' -> compare_c_int i i' + | C_int _ , _ -> (-1) + | _ , C_int _ -> 1 + | C_float f , C_float f' -> compare_c_float f f' + | C_float _ , _ -> (-1) + | _ , C_float _ -> 1 + | C_pointer _ , C_pointer _ -> 0 + | C_pointer _ , _ -> (-1) + | _ , C_pointer _ -> 1 + | C_comp c , C_comp c' -> Compinfo.compare c c' + | C_comp _ , _ -> (-1) + | _ , C_comp _ -> 1 + | C_array a , C_array a' -> compare_array_ptr_conflated a a' + +and compare_array_ptr_conflated a b = + let obj_a = object_of a.arr_element in + let obj_b = object_of b.arr_element in + let c = compare_ptr_conflated obj_a obj_b in + if c <> 0 then c + else match a.arr_flat , b.arr_flat with + | Some a , Some b -> Pervasives.compare a.arr_size b.arr_size + | None , Some _ -> (-1) + | Some _ , None -> 1 + | None , None -> 0 + diff -Nru frama-c-20140301+neon+dfsg/src/wp/ctypes.mli frama-c-20150201+sodium+dfsg/src/wp/ctypes.mli --- frama-c-20140301+neon+dfsg/src/wp/ctypes.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/ctypes.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -110,10 +110,10 @@ val array_dim : arrayinfo -> c_object * int val array_size : typ -> int option val array_dimensions : arrayinfo -> c_object * int option list - (** Returns the list of dimensions the array consists of. - None-dimension means undefined one. *) +(** Returns the list of dimensions the array consists of. + None-dimension means undefined one. *) val dimension_of_object : c_object -> (int * int) option - (** Returns None for 1-dimension objects, and Some(d,N) for d-matrix with N cells *) +(** Returns None for 1-dimension objects, and Some(d,N) for d-matrix with N cells *) val i_convert : c_int -> c_int -> c_int val f_convert : c_float -> c_float -> c_float @@ -130,6 +130,8 @@ val hash : c_object -> int val pretty : Format.formatter -> c_object -> unit +module C_object: Datatype.S with type t = c_object + module AinfoComparable : sig type t = arrayinfo @@ -137,3 +139,6 @@ val equal : t -> t -> bool val hash : t -> int end + +val compare_ptr_conflated : c_object -> c_object -> int +(** same as {!compare} but all PTR are considered the same *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Cvalues.ml frama-c-20150201+sodium+dfsg/src/wp/Cvalues.ml --- frama-c-20140301+neon+dfsg/src/wp/Cvalues.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Cvalues.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -35,7 +35,7 @@ (* -------------------------------------------------------------------------- *) (* --- C Constants --- *) (* -------------------------------------------------------------------------- *) - + let rec constant = function | CInt64(z,_,_) -> e_bigint z | CChr c -> e_int64 (Ctypes.char c) @@ -49,29 +49,29 @@ | LReal r -> Cfloat.acsl_lit r | LEnum e -> constant_exp e.eival | LStr _ | LWStr _ -> Warning.error "String constants not yet implemented" - + and constant_exp e = let e = Cil.constFold true e in match e.enode with - | Const c -> constant c - | _ -> Warning.error "constant(%a)" Printer.pp_exp e + | Const c -> constant c + | _ -> Warning.error "constant(%a)" Printer.pp_exp e and constant_term t = let e = Cil.constFoldTerm true t in match e.term_node with - | TConst c -> logic_constant c - | _ -> Warning.error "constant(%a)" Printer.pp_term t + | TConst c -> logic_constant c + | _ -> Warning.error "constant(%a)" Printer.pp_term t (* -------------------------------------------------------------------------- *) (* The type contains C-integers *) let rec is_constrained ty = match Ctypes.object_of ty with - | C_int _ -> true - | C_float _ -> false - | C_pointer _ -> false - | C_array a -> is_constrained a.arr_element - | C_comp c -> is_constrained_comp c + | C_int _ -> true + | C_float _ -> false + | C_pointer _ -> false + | C_array a -> is_constrained a.arr_element + | C_comp c -> is_constrained_comp c and is_constrained_comp c = List.exists (fun f -> is_constrained f.ftype) c.cfields @@ -80,8 +80,8 @@ sig val prefix : string val model : Cint.model - (* Natural : all types are constrained, but only with their natural values *) - (* Machine : only atomic types are constrained *) + (* Natural : all types are constrained, but only with their natural values *) + (* Machine : only atomic types are constrained *) val is_int : c_int -> term -> pred val is_float : c_float -> term -> pred val is_pointer : term -> pred @@ -97,38 +97,38 @@ let constrained_comp c = match C.model with | Cint.Natural -> true | Cint.Machine -> is_constrained_comp c - + let model_int fmt i = match C.model with | Cint.Natural -> Format.pp_print_string fmt "int" | Cint.Machine -> Ctypes.pp_int fmt i - + let array_name te ds = let dim = List.length ds in match te with - | C_int i -> - Pretty_utils.sfprintf "%sArray%d_%a" C.prefix dim model_int i - | C_float _ -> - Pretty_utils.sfprintf "%sArray%d_float" C.prefix dim - | C_pointer _ -> - Pretty_utils.sfprintf "%sArray%d_pointer" C.prefix dim - | C_comp c -> - Pretty_utils.sfprintf "%sArray%d%s" C.prefix dim (Lang.comp_id c) - | C_array _ -> - Wp_parameters.fatal "Unflatten array (%s %a)" C.prefix Ctypes.pretty te + | C_int i -> + Pretty_utils.sfprintf "%sArray%d_%a" C.prefix dim model_int i + | C_float _ -> + Pretty_utils.sfprintf "%sArray%d_float" C.prefix dim + | C_pointer _ -> + Pretty_utils.sfprintf "%sArray%d_pointer" C.prefix dim + | C_comp c -> + Pretty_utils.sfprintf "%sArray%d%s" C.prefix dim (Lang.comp_id c) + | C_array _ -> + Wp_parameters.fatal "Unflatten array (%s %a)" C.prefix Ctypes.pretty te let rec is_obj obj t = match obj with - | C_int i -> C.is_int i t - | C_float f -> C.is_float f t - | C_pointer _ty -> C.is_pointer t - | C_comp c -> - if constrained_comp c then is_record c t else p_true - | C_array a -> - if constrained_elt a.arr_element - then - let te,ds = Ctypes.array_dimensions a in - is_array te ds t - else p_true + | C_int i -> C.is_int i t + | C_float f -> C.is_float f t + | C_pointer _ty -> C.is_pointer t + | C_comp c -> + if constrained_comp c then is_record c t else p_true + | C_array a -> + if constrained_elt a.arr_element + then + let te,ds = Ctypes.array_dimensions a in + is_array te ds t + else p_true and is_typ typ t = is_obj (Ctypes.object_of typ) t @@ -136,32 +136,32 @@ Definitions.call_pred (Lang.generated_p (C.prefix ^ Lang.comp_id c)) (fun lfun -> - let basename = if c.cstruct then "S" else "U" in - let s = Lang.freshvar ~basename (Lang.tau_of_comp c) in - let def = p_all - (fun f -> is_typ f.ftype (e_getfield (e_var s) (Lang.Cfield f))) - c.cfields - in { - d_lfun = lfun ; d_types = 0 ; d_params = [s] ; - d_cluster = Definitions.compinfo c ; - d_definition = Predicate(Def,def) ; - }) + let basename = if c.cstruct then "S" else "U" in + let s = Lang.freshvar ~basename (Lang.tau_of_comp c) in + let def = p_all + (fun f -> is_typ f.ftype (e_getfield (e_var s) (Lang.Cfield f))) + c.cfields + in { + d_lfun = lfun ; d_types = 0 ; d_params = [s] ; + d_cluster = Definitions.compinfo c ; + d_definition = Predicate(Def,def) ; + }) [s] and is_array te ds t = Definitions.call_pred - (Lang.generated_p (array_name te ds)) - (fun lfun -> - let x = Lang.freshvar ~basename:"T" (Matrix.tau te ds) in - let ks = List.map (fun _d -> Lang.freshvar ~basename:"k" Logic.Int) ds in - let e = List.fold_left (fun a k -> e_get a (e_var k)) (e_var x) ks in - let def = p_forall ks (is_obj te e) in - { - d_lfun = lfun ; d_types = 0 ; d_params = [x] ; - d_cluster = Definitions.matrix te ; - d_definition = Predicate(Def,def) ; - } - ) [t] + (Lang.generated_p (array_name te ds)) + (fun lfun -> + let x = Lang.freshvar ~basename:"T" (Matrix.tau te ds) in + let ks = List.map (fun _d -> Lang.freshvar ~basename:"k" Logic.Int) ds in + let e = List.fold_left (fun a k -> e_get a (e_var k)) (e_var x) ks in + let def = p_forall ks (is_obj te e) in + { + d_lfun = lfun ; d_types = 0 ; d_params = [x] ; + d_cluster = Definitions.matrix te ; + d_definition = Predicate(Def,def) ; + } + ) [t] end @@ -171,31 +171,31 @@ let null = Context.create "Lang.null" module NULL = STRUCTURAL - (struct - let prefix = "Null" - let model = Cint.Natural - let is_int _i = p_equal e_zero - let is_float _f = p_equal e_zero_real - let is_pointer p = Context.get null p - end) + (struct + let prefix = "Null" + let model = Cint.Natural + let is_int _i = p_equal e_zero + let is_float _f = p_equal e_zero_real + let is_pointer p = Context.get null p + end) let is_null = NULL.is_obj module TYPE = STRUCTURAL - (struct - let prefix = "Is" - let model = Cint.Machine - let is_int = Cint.irange - let is_float = Cfloat.frange - let is_pointer _ = p_true - end) + (struct + let prefix = "Is" + let model = Cint.Machine + let is_int = Cint.irange + let is_float = Cfloat.frange + let is_pointer _ = p_true + end) let has_ctype = TYPE.is_typ let has_ltype ltype e = match Logic_utils.unroll_type ltype with - | Ctype typ -> has_ctype typ e - | Ltype _ | Lvar _ | Linteger | Lreal | Larrow _ -> p_true + | Ctype typ -> has_ctype typ e + | Ltype _ | Lvar _ | Linteger | Lreal | Larrow _ -> p_true let is_object obj = function | Loc _ -> p_true @@ -206,8 +206,8 @@ let ldomain ltype = match Logic_utils.unroll_type ltype with - | Ctype typ -> cdomain typ - | Ltype _ | Lvar _ | Linteger | Lreal | Larrow _ -> None + | Ctype typ -> cdomain typ + | Ltype _ | Lvar _ | Linteger | Lreal | Larrow _ -> None (* -------------------------------------------------------------------------- *) (* --- ACSL Equality --- *) @@ -216,62 +216,62 @@ let s_eq = ref (fun _ _ _ -> assert false) (* recursion for equal_object *) module EQARRAY = Model.Generator(Matrix.NATURAL) - (struct - open Matrix - type key = matrix - type data = Lang.lfun - let name = "Cvalues.EqArray" - let compile (te,ds) = - let lfun = Lang.generated_f ~sort:Logic.Sprop "EqArray%s_%s" - (Matrix.id ds) (Matrix.natural_id te) - in - let cluster = Definitions.matrix te in - let denv = Matrix.denv ds in - let tau = Matrix.tau te ds in - let xa = Lang.freshvar ~basename:"T" tau in - let xb = Lang.freshvar ~basename:"T" tau in - let ta = e_var xa in - let tb = e_var xb in - let ta_xs = List.fold_left e_get ta denv.index_val in - let tb_xs = List.fold_left e_get tb denv.index_val in - let eq = p_call lfun (denv.size_val @ [ta ; tb]) in - let property = p_hyps (denv.index_range) (!s_eq te ta_xs tb_xs) in - let definition = p_forall denv.index_var property in - (* Definition of the symbol *) - Definitions.define_symbol { - d_lfun = lfun ; d_types = 0 ; - d_params = denv.size_var @ [xa ; xb ] ; - d_definition = Predicate(Def,definition) ; - d_cluster = cluster ; - } ; - (* Extensionnal Definition (with triggers) *) - let name = Printf.sprintf "EqArrayExt%s_%s" - (Matrix.id ds) (Matrix.natural_id te) - in - Definitions.define_lemma { - l_name = name ; - l_cluster = cluster ; - l_types = 0 ; - l_forall = denv.size_var @ [xa ; xb ] @ denv.index_var ; - l_assumed = true ; - l_triggers = [ - [ Trigger.of_pred eq ; Trigger.of_term ta_xs ] ; - [ Trigger.of_pred eq ; Trigger.of_term tb_xs ] - ] ; - l_lemma = property ; - } ; - (* Finally return symbol *) - lfun - end) + (struct + open Matrix + type key = matrix + type data = Lang.lfun + let name = "Cvalues.EqArray" + let compile (te,ds) = + let lfun = Lang.generated_f ~sort:Logic.Sprop "EqArray%s_%s" + (Matrix.id ds) (Matrix.natural_id te) + in + let cluster = Definitions.matrix te in + let denv = Matrix.denv ds in + let tau = Matrix.tau te ds in + let xa = Lang.freshvar ~basename:"T" tau in + let xb = Lang.freshvar ~basename:"T" tau in + let ta = e_var xa in + let tb = e_var xb in + let ta_xs = List.fold_left e_get ta denv.index_val in + let tb_xs = List.fold_left e_get tb denv.index_val in + let eq = p_call lfun (denv.size_val @ [ta ; tb]) in + let property = p_hyps (denv.index_range) (!s_eq te ta_xs tb_xs) in + let definition = p_forall denv.index_var property in + (* Definition of the symbol *) + Definitions.define_symbol { + d_lfun = lfun ; d_types = 0 ; + d_params = denv.size_var @ [xa ; xb ] ; + d_definition = Predicate(Def,definition) ; + d_cluster = cluster ; + } ; + (* Extensionnal Definition (with triggers) *) + let name = Printf.sprintf "EqArrayExt%s_%s" + (Matrix.id ds) (Matrix.natural_id te) + in + Definitions.define_lemma { + l_name = name ; + l_cluster = cluster ; + l_types = 0 ; + l_forall = denv.size_var @ [xa ; xb ] @ denv.index_var ; + l_assumed = true ; + l_triggers = [ + [ Trigger.of_pred eq ; Trigger.of_term ta_xs ] ; + [ Trigger.of_pred eq ; Trigger.of_term tb_xs ] + ] ; + l_lemma = property ; + } ; + (* Finally return symbol *) + lfun + end) let rec equal_object obj a b = match obj with - | C_int _ | C_float _ | C_pointer _ -> p_equal a b - | C_array t -> - equal_array (Matrix.of_array t) a b - | C_comp c -> - equal_comp c a b - + | C_int _ | C_float _ | C_pointer _ -> p_equal a b + | C_array t -> + equal_array (Matrix.of_array t) a b + | C_comp c -> + equal_comp c a b + and equal_typ typ a b = equal_object (Ctypes.object_of typ) a b and equal_comp c a b = @@ -284,22 +284,22 @@ let ra = e_var xa in let rb = e_var xb in let def = p_all - (fun f -> - let fd = Cfield f in - equal_typ f.ftype - (e_getfield ra fd) (e_getfield rb fd)) - c.cfields + (fun f -> + let fd = Cfield f in + equal_typ f.ftype + (e_getfield ra fd) (e_getfield rb fd)) + c.cfields in { - d_lfun = lfun ; d_types = 0 ; d_params = [xa;xb] ; - d_cluster = Definitions.compinfo c ; - d_definition = Predicate(Def,def) ; + d_lfun = lfun ; d_types = 0 ; d_params = [xa;xb] ; + d_cluster = Definitions.compinfo c ; + d_definition = Predicate(Def,def) ; } ) [a;b] and equal_array m a b = match m with - | _obj , [None] -> p_equal a b - | _ -> p_call (EQARRAY.get m) (Matrix.size m @ [a;b]) + | _obj , [None] -> p_equal a b + | _ -> p_call (EQARRAY.get m) (Matrix.size m @ [a;b]) let () = s_eq := equal_object @@ -326,16 +326,17 @@ (* -------------------------------------------------------------------------- *) (* --- Int-As-Boolans --- *) (* -------------------------------------------------------------------------- *) - + let bool_eq a b = e_if (e_eq a b) e_one e_zero let bool_lt a b = e_if (e_lt a b) e_one e_zero let bool_neq a b = e_if (e_eq a b) e_zero e_one let bool_leq a b = e_if (e_leq a b) e_one e_zero let bool_and a b = e_and [e_neq a e_zero ; e_neq b e_zero] let bool_or a b = e_or [e_neq a e_zero ; e_neq b e_zero] +let bool_val e = e_if e e_one e_zero let is_true p = e_if (e_prop p) e_one e_zero let is_false p = e_if (e_prop p) e_zero e_one - + (* -------------------------------------------------------------------------- *) (* --- Lifting Memory Model to Values --- *) (* -------------------------------------------------------------------------- *) @@ -366,32 +367,32 @@ | Sloc l -> [],l,p_true | Sdescr(xs,l,p) -> xs,l,p | Sarray(l,obj,s) -> - let x = Lang.freshvar ~basename:"k" Logic.Int in - let k = e_var x in - [x],M.shift l obj k,Vset.in_size k s + let x = Lang.freshvar ~basename:"k" Logic.Int in + let k = e_var x in + [x],M.shift l obj k,Vset.in_size k s | Srange(l,obj,a,b) -> - let x = Lang.freshvar ~basename:"k" Logic.Int in - let k = e_var x in - [x],M.shift l obj k,Vset.in_range k a b + let x = Lang.freshvar ~basename:"k" Logic.Int in + let k = e_var x in + [x],M.shift l obj k,Vset.in_range k a b let vset_of_sloc sloc = List.map (function - | Sloc p -> Vset.Singleton (M.pointer_val p) - | u -> - let xs,l,p = rdescr u in - Vset.Descr( xs , M.pointer_val l , p ) + | Sloc p -> Vset.Singleton (M.pointer_val p) + | u -> + let xs,l,p = rdescr u in + Vset.Descr( xs , M.pointer_val l , p ) ) sloc - + let sloc_of_vset vset = List.map (function - | Vset.Singleton e -> Sloc (M.pointer_loc e) - | w -> - let xs,t,p = Vset.descr w in - Sdescr(xs,M.pointer_loc t,p) + | Vset.Singleton e -> Sloc (M.pointer_loc e) + | w -> + let xs,t,p = Vset.descr w in + Sdescr(xs,M.pointer_loc t,p) ) vset - + let vset = function | Vexp v -> Vset.singleton v | Vloc l -> Vset.singleton (M.pointer_val l) @@ -403,7 +404,7 @@ | Vloc l -> [Sloc l] | Lset ls -> ls | Vset vset -> sloc_of_vset vset - + (* -------------------------------------------------------------------------- *) (* --- Morphisms --- *) (* -------------------------------------------------------------------------- *) @@ -412,9 +413,9 @@ let map_lift f1 f2 a = match a with - | Vexp e -> Vexp (f1 e) - | Vloc l -> Vexp (f1 (M.pointer_val l)) - | _ -> Vset(f2 (vset a)) + | Vexp e -> Vexp (f1 e) + | Vloc l -> Vexp (f1 (M.pointer_val l)) + | _ -> Vset(f2 (vset a)) let apply_lift f1 f2 a b = if is_single a && is_single b then @@ -432,29 +433,29 @@ let map_loc f lv = if is_single lv then Vloc (f (loc lv)) else Lset - (List.map - (function - | Sloc l -> Sloc (f l) - | s -> let xs,l,p = rdescr s in Sdescr(xs,f l,p) - ) (sloc lv)) + (List.map + (function + | Sloc l -> Sloc (f l) + | s -> let xs,l,p = rdescr s in Sdescr(xs,f l,p) + ) (sloc lv)) let map_l2t f lv = if is_single lv then Vexp (f (loc lv)) else Vset - (List.map - (function - | Sloc l -> Vset.Singleton (f l) - | s -> let xs,l,p = rdescr s in Vset.Descr(xs,f l,p) - ) (sloc lv)) + (List.map + (function + | Sloc l -> Vset.Singleton (f l) + | s -> let xs,l,p = rdescr s in Vset.Descr(xs,f l,p) + ) (sloc lv)) let map_t2l f sv = if is_single sv then Vloc (f (value sv)) else Lset - (List.map - (function - | Vset.Singleton e -> Sloc (f e) - | s -> let xs,l,p = Vset.descr s in Sdescr(xs,f l,p) - ) (vset sv)) + (List.map + (function + | Vset.Singleton e -> Sloc (f e) + | s -> let xs,l,p = Vset.descr s in Sdescr(xs,f l,p) + ) (vset sv)) (* -------------------------------------------------------------------------- *) (* --- Locations --- *) @@ -465,46 +466,46 @@ let restrict kset = function | None -> kset | Some s -> - match kset with - | Vset.Singleton _ | Vset.Set _ -> kset - | Vset.Range(a,b) -> - let cap l = function None -> Some l | u -> u in - Vset.Range(cap e_zero a,cap (e_int (s-1)) b) - | Vset.Descr(xs,k,p) -> - let a = e_zero in - let b = e_int s in - Vset.Descr(xs,k,p_conj [p_leq a k;p_lt k b;p]) + match kset with + | Vset.Singleton _ | Vset.Set _ -> kset + | Vset.Range(a,b) -> + let cap l = function None -> Some l | u -> u in + Vset.Range(cap e_zero a,cap (e_int (s-1)) b) + | Vset.Descr(xs,k,p) -> + let a = e_zero in + let b = e_int s in + Vset.Descr(xs,k,p_conj [p_leq a k;p_lt k b;p]) let shift_set sloc obj (size : int option) kset = match sloc , kset , size with - | Sloc l , Vset.Range(None,None) , Some s -> Sarray(l,obj,s) - | _ -> - match sloc , restrict kset size with - | Sloc l , Vset.Singleton k -> Sloc(M.shift l obj k) - | Sloc l , Vset.Range(a,b) -> Srange(l,obj,a,b) - | Srange(l,obj0,a0,b0) , Vset.Singleton k - when Ctypes.equal obj0 obj -> - Srange(l,obj0, Vset.bound_add a0 (Some k), Vset.bound_add b0 (Some k)) - | Srange(l,obj0,a0,b0) , Vset.Range(a1,b1) - when Ctypes.equal obj0 obj -> - Srange(l,obj0, Vset.bound_add a0 a1, Vset.bound_add b0 b1) - | _ -> - let xs,l,p = rdescr sloc in - let ys,k,q = Vset.descr kset in - Sdescr( xs @ ys , M.shift l obj k , p_and p q ) - + | Sloc l , Vset.Range(None,None) , Some s -> Sarray(l,obj,s) + | _ -> + match sloc , restrict kset size with + | Sloc l , Vset.Singleton k -> Sloc(M.shift l obj k) + | Sloc l , Vset.Range(a,b) -> Srange(l,obj,a,b) + | Srange(l,obj0,a0,b0) , Vset.Singleton k + when Ctypes.equal obj0 obj -> + Srange(l,obj0, Vset.bound_add a0 (Some k), Vset.bound_add b0 (Some k)) + | Srange(l,obj0,a0,b0) , Vset.Range(a1,b1) + when Ctypes.equal obj0 obj -> + Srange(l,obj0, Vset.bound_add a0 a1, Vset.bound_add b0 b1) + | _ -> + let xs,l,p = rdescr sloc in + let ys,k,q = Vset.descr kset in + Sdescr( xs @ ys , M.shift l obj k , p_and p q ) + let shift lv obj ?size kv = if is_single kv then let k = value kv in map_loc (fun l -> M.shift l obj k) lv else let ks = vset kv in Lset(List.fold_left - (fun s sloc -> - List.fold_left - (fun s kset -> - shift_set sloc obj size kset :: s - ) s ks - ) [] (sloc lv)) + (fun s sloc -> + List.fold_left + (fun s kset -> + shift_set sloc obj size kset :: s + ) s ks + ) [] (sloc lv)) (* -------------------------------------------------------------------------- *) (* --- Load in Memory --- *) @@ -514,38 +515,38 @@ mutable sloc : M.loc sloc list ; mutable vset : Vset.vset list ; } - + let flush prefer_loc a = match a with | { vset=[] } -> Lset (List.rev a.sloc) | { sloc=[] } -> Vset (List.rev a.vset) | _ -> - if prefer_loc then - Lset (a.sloc @ sloc_of_vset a.vset) - else - Vset (vset_of_sloc a.sloc @ a.vset) - + if prefer_loc then + Lset (a.sloc @ sloc_of_vset a.vset) + else + Vset (vset_of_sloc a.sloc @ a.vset) + let loadsloc a sigma obj = function | Sloc l -> - begin - match M.load sigma obj l with - | Val t -> a.vset <- Vset.Singleton t :: a.vset - | Loc l -> a.sloc <- Sloc l :: a.sloc - end + begin + match M.load sigma obj l with + | Val t -> a.vset <- Vset.Singleton t :: a.vset + | Loc l -> a.sloc <- Sloc l :: a.sloc + end | (Sarray _ | Srange _ | Sdescr _) as s -> - let xs , l , p = rdescr s in - begin - match M.load sigma obj l with - | Val t -> a.vset <- Vset.Descr(xs,t,p) :: a.vset - | Loc l -> a.sloc <- Sdescr(xs,l,p) :: a.sloc - end - + let xs , l , p = rdescr s in + begin + match M.load sigma obj l with + | Val t -> a.vset <- Vset.Descr(xs,t,p) :: a.vset + | Loc l -> a.sloc <- Sdescr(xs,l,p) :: a.sloc + end + let load sigma obj lv = if is_single lv then let data = M.load sigma obj (loc lv) in Lang.assume (is_object obj data) ; match data with - | Val t -> Vexp t - | Loc l -> Vloc l + | Val t -> Vexp t + | Loc l -> Vloc l else let a = { vset=[] ; sloc=[] } in List.iter (loadsloc a sigma obj) (sloc lv) ; @@ -555,22 +556,22 @@ let a = { vset=[] ; sloc=[] } in List.iter (function - | Vexp e -> a.vset <- Vset.Singleton e::a.vset - | Vloc l -> a.sloc <- Sloc l :: a.sloc - | Vset s -> a.vset <- List.rev_append s a.vset - | Lset s -> a.sloc <- List.rev_append s a.sloc + | Vexp e -> a.vset <- Vset.Singleton e::a.vset + | Vloc l -> a.sloc <- Sloc l :: a.sloc + | Vset s -> a.vset <- List.rev_append s a.vset + | Lset s -> a.sloc <- List.rev_append s a.sloc ) vs ; flush (Logic_typing.is_pointer_type t) a let inter t vs = match List.map (fun v -> Vset.concretize (vset v)) vs with - | [] -> - if Logic_typing.is_pointer_type t - then Lset [] else Vset [] - | v::vs -> - let s = List.fold_left Vset.inter v vs in - let t = Lang.tau_of_ltype t in - Vset [Vset.Set(t,s)] + | [] -> + if Logic_typing.is_pointer_type t + then Lset [] else Vset [] + | v::vs -> + let s = List.fold_left Vset.inter v vs in + let t = Lang.tau_of_ltype t in + Vset [Vset.Set(t,s)] (* -------------------------------------------------------------------------- *) (* --- Sloc to Rloc --- *) @@ -589,20 +590,20 @@ let separated_sloc w (obj1,sloc1) (obj2,sloc2) = List.fold_left (fun w s1 -> - List.fold_left - (fun w s2 -> - let cond = - try M.separated (rloc obj1 s1) (rloc obj2 s2) - with Exit -> - let xs,l1,p1 = rdescr s1 in - let ys,l2,p2 = rdescr s2 in - let se1 = Rloc(obj1,l1) in - let se2 = Rloc(obj2,l2) in - p_forall (xs@ys) (p_hyps [p1;p2] (M.separated se1 se2)) - in cond::w - ) w sloc2 + List.fold_left + (fun w s2 -> + let cond = + try M.separated (rloc obj1 s1) (rloc obj2 s2) + with Exit -> + let xs,l1,p1 = rdescr s1 in + let ys,l2,p2 = rdescr s2 in + let se1 = Rloc(obj1,l1) in + let se2 = Rloc(obj2,l2) in + p_forall (xs@ys) (p_hyps [p1;p2] (M.separated se1 se2)) + in cond::w + ) w sloc2 ) w sloc1 - + let rec separated_from w r1 = function | r2::rs -> separated_from (separated_sloc w r1 r2) r1 rs | [] -> w diff -Nru frama-c-20140301+neon+dfsg/src/wp/Cvalues.mli frama-c-20150201+sodium+dfsg/src/wp/Cvalues.mli --- frama-c-20140301+neon+dfsg/src/wp/Cvalues.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Cvalues.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -30,7 +30,8 @@ open Lang.F (** {2 Int-As-Boolans} *) - + +val bool_val : unop val bool_eq : binop val bool_lt : binop val bool_neq : binop diff -Nru frama-c-20140301+neon+dfsg/src/wp/Definitions.ml frama-c-20150201+sodium+dfsg/src/wp/Definitions.ml --- frama-c-20140301+neon+dfsg/src/wp/Definitions.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Definitions.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -79,17 +79,17 @@ let rec of_exp mode t = match F.repr t with - | Var x -> TgVar x - | Aget(a,k) -> TgGet(of_exp Cterm a,of_exp Cterm k) - | Aset(a,k,v) -> TgSet(of_exp Cterm a,of_exp Cterm k,of_exp Cterm v) - | Fun(f,ts) -> - let ts = List.map (of_exp Cterm) ts in - begin - match mode with - | Cterm -> TgFun(f,ts) - | Cprop -> TgProp(f,ts) - end - | _ -> TgAny + | Fvar x -> TgVar x + | Aget(a,k) -> TgGet(of_exp Cterm a,of_exp Cterm k) + | Aset(a,k,v) -> TgSet(of_exp Cterm a,of_exp Cterm k,of_exp Cterm v) + | Fun(f,ts) -> + let ts = List.map (of_exp Cterm) ts in + begin + match mode with + | Cterm -> TgFun(f,ts) + | Cprop -> TgProp(f,ts) + end + | _ -> TgAny let of_term t = of_exp Cterm t let of_pred p = of_exp Cprop (F.e_prop p) @@ -103,22 +103,6 @@ let vars = collect Vars.empty - let binders p = - let rec collect xs p = - match F.repr p with - | Bind( Forall , x , p ) -> collect (x::xs) p - | Imply( hs , p ) -> - let xs , p = collect xs p in - xs , F.e_imply hs p - | _ -> List.rev xs , p - in collect [] p - - let plug tgs p = - let vars,lemma = binders (F.e_prop p) in - let used = List.fold_left (List.fold_left collect) Vars.empty tgs in - let xs , ys = List.partition (fun x -> Vars.mem x used) vars in - xs , F.p_forall ys (F.p_bool lemma) - end (* -------------------------------------------------------------------------- *) @@ -126,31 +110,31 @@ (* -------------------------------------------------------------------------- *) module Cluster = Model.Index - (struct - type key = string - type data = cluster - let name = "Definitions.Cluster" - let compare = String.compare - let pretty = Format.pp_print_string - end) + (struct + type key = string + type data = cluster + let name = "Definitions.Cluster" + let compare = String.compare + let pretty = Format.pp_print_string + end) module Symbol = Model.Index - (struct - type key = lfun - type data = dfun - let name = "Definitions.Symbol" - let compare = Lang.Fun.compare - let pretty = Lang.Fun.pretty - end) + (struct + type key = lfun + type data = dfun + let name = "Definitions.Symbol" + let compare = Lang.Fun.compare + let pretty = Lang.Fun.pretty + end) module Lemma = Model.Index - (struct - type key = string - type data = dlemma - let name = "Definitions.Lemma" - let compare = String.compare - let pretty = Format.pp_print_string - end) + (struct + type key = string + type data = dlemma + let name = "Definitions.Lemma" + let compare = String.compare + let pretty = Format.pp_print_string + end) let touch c = c.c_age <- succ c.c_age let compare_symbol f g = Fun.compare f.d_lfun g.d_lfun @@ -160,12 +144,12 @@ begin Symbol.callback (fun _ f -> - touch f.d_cluster ; - f.d_cluster.c_symbols <- f :: f.d_cluster.c_symbols) ; + touch f.d_cluster ; + f.d_cluster.c_symbols <- f :: f.d_cluster.c_symbols) ; Lemma.callback (fun _ a -> - touch a.l_cluster ; - a.l_cluster.c_lemmas <- a :: a.l_cluster.c_lemmas) ; + touch a.l_cluster ; + a.l_cluster.c_lemmas <- a :: a.l_cluster.c_lemmas) ; end let define_symbol f = Symbol.define f.d_lfun f @@ -181,6 +165,14 @@ c.c_types <- t :: c.c_types ; end +let parameters f = + if Model.is_model_defined () then + try List.map Lang.F.sort_of_var (Symbol.find f).d_params + with Not_found -> [] + else [] + +let () = Lang.parameters parameters + (* -------------------------------------------------------------------------- *) (* --- Helpers --- *) (* -------------------------------------------------------------------------- *) @@ -223,14 +215,14 @@ let title = Printf.sprintf "Global Definitions (continued #%d)" n in cluster ~id ~title () | Axiomatic ax -> axiomatic ax - + let compinfo c = Cluster.memoize (fun id -> let title = - if c.cstruct - then Printf.sprintf "Struct '%s'" c.cname - else Printf.sprintf "Union '%s'" c.cname in + if c.cstruct + then Printf.sprintf "Struct '%s'" c.cname + else Printf.sprintf "Union '%s'" c.cname in let cluster = newcluster ~id ~title () in cluster.c_records <- [c] ; cluster) (Lang.comp_id c) @@ -240,12 +232,12 @@ | C_comp c -> compinfo c | C_int _ | C_float _ | C_pointer _ -> Cluster.memoize - (fun id -> newcluster ~id ~title:"Basic Arrays" ()) "Matrix" + (fun id -> newcluster ~id ~title:"Basic Arrays" ()) "Matrix" let call_fun lfun cc es = Symbol.compile (Lang.local cc) lfun ; e_fun lfun es - + let call_pred lfun cc es = Symbol.compile (Lang.local cc) lfun ; p_call lfun es @@ -259,10 +251,10 @@ module DS = Datatype.String.Set module DF = FCSet.Make(Lang.Fun) module DC = FCSet.Make - (struct - type t = cluster - let compare = cluster_compare - end) + (struct + type t = cluster + let compare = cluster_compare + end) (* -------------------------------------------------------------------------- *) (* --- Markers (test and set) --- *) @@ -271,234 +263,235 @@ type axioms = cluster * logic_lemma list class virtual visitor main = -object(self) - - val mutable terms = Tset.empty - val mutable types = DT.empty - val mutable comps = DR.empty - val mutable symbols = DF.empty - val mutable dlemmas = DS.empty - val mutable lemmas = DS.empty - val mutable clusters = DC.empty - val mutable theories = DS.empty - val mutable locals = DC.add main DC.empty - - method set_local c = locals <- DC.add c locals - - method do_local c = - if DC.mem c locals then true else - (self#vcluster c ; false) - - method private vtypedef = function - | None -> () - | Some (LTsum cs) -> - List.iter (fun c -> self#vadt (Lang.atype c.ctor_type)) cs - | Some (LTsyn lt) -> self#vtau (Lang.tau_of_ltype lt) - - method vtype t = - if not (DT.mem t types) then - begin - types <- DT.add t types ; - let c = section (LogicUsage.section_of_type t) in - if self#do_local c then - begin - self#vtypedef t.lt_def ; - let def = match t.lt_def with - | None -> Qed.Engine.Tabs - | Some (LTsyn lt) -> Qed.Engine.Tdef (Lang.tau_of_ltype lt) - | Some (LTsum cs) -> - let cases = List.map - (fun ct -> - Lang.CTOR ct , - List.map Lang.tau_of_ltype ct.ctor_params - ) cs in - Qed.Engine.Tsum cases - in self#on_type t def ; - end - end - - method vcomp r = - if not (DR.mem r comps) then - begin - comps <- DR.add r comps ; - let c = compinfo r in - if self#do_local c then - begin - let fts = List.map - (fun f -> - let t = Lang.tau_of_ctype f.ftype in - self#vtau t ; Cfield f , t - ) r.cfields - in self#on_comp r fts ; - end - end + object(self) - method vfield = function - | Mfield(a,_,_,_) -> self#vlibrary a.ext_library - | Cfield f -> self#vcomp f.fcomp - - method vadt = function - | Mtype a | Mrecord(a,_) -> self#vlibrary a.ext_library - | Comp r -> self#vcomp r - | Atype t -> self#vtype t - - method vtau = function - | Prop | Bool | Int | Real | Tvar _ -> () - | Array(a,b) -> self#vtau a ; self#vtau b - | Record _ -> assert false - | Data(a,ts) -> self#vadt a ; List.iter self#vtau ts + val mutable terms = Tset.empty + val mutable types = DT.empty + val mutable comps = DR.empty + val mutable symbols = DF.empty + val mutable dlemmas = DS.empty + val mutable lemmas = DS.empty + val mutable clusters = DC.empty + val mutable theories = DS.empty + val mutable locals = DC.add main DC.empty + + method set_local c = locals <- DC.add c locals + + method do_local c = + if DC.mem c locals then true else + (self#vcluster c ; false) + + method private vtypedef = function + | None -> () + | Some (LTsum cs) -> + List.iter (fun c -> self#vadt (Lang.atype c.ctor_type)) cs + | Some (LTsyn lt) -> self#vtau (Lang.tau_of_ltype lt) + + method vtype t = + if not (DT.mem t types) then + begin + types <- DT.add t types ; + let c = section (LogicUsage.section_of_type t) in + if self#do_local c then + begin + self#vtypedef t.lt_def ; + let def = match t.lt_def with + | None -> Qed.Engine.Tabs + | Some (LTsyn lt) -> Qed.Engine.Tdef (Lang.tau_of_ltype lt) + | Some (LTsum cs) -> + let cases = List.map + (fun ct -> + Lang.CTOR ct , + List.map Lang.tau_of_ltype ct.ctor_params + ) cs in + Qed.Engine.Tsum cases + in self#on_type t def ; + end + end + + method vcomp r = + if not (DR.mem r comps) then + begin + comps <- DR.add r comps ; + let c = compinfo r in + if self#do_local c then + begin + let fts = List.map + (fun f -> + let t = Lang.tau_of_ctype f.ftype in + self#vtau t ; Cfield f , t + ) r.cfields + in self#on_comp r fts ; + end + end + + method vfield = function + | Mfield(a,_,_,_) -> self#vlibrary a.ext_library + | Cfield f -> self#vcomp f.fcomp + + method vadt = function + | Mtype a | Mrecord(a,_) -> self#vlibrary a.ext_library + | Comp r -> self#vcomp r + | Atype t -> self#vtype t + + method vtau = function + | Prop | Bool | Int | Real | Tvar _ -> () + | Array(a,b) -> self#vtau a ; self#vtau b + | Record _ -> assert false + | Data(a,ts) -> self#vadt a ; List.iter self#vtau ts + + method vparam x = self#vtau (tau_of_var x) + + method vterm t = + if not (Tset.mem t terms) then + begin + terms <- Tset.add t terms ; + F.lc_iter self#vterm t ; + match F.repr t with + | Fun(f,_) -> self#vsymbol f + | Rget(_,f) -> self#vfield f + | Rdef fts -> List.iter (fun (f,_) -> self#vfield f) fts + | Fvar x -> self#vparam x + | Bind(_,t,_) -> self#vtau t + | True | False | Kint _ | Kreal _ | Bvar _ + | Times _ | Add _ | Mul _ | Div _ | Mod _ + | Eq _ | Neq _ | Leq _ | Lt _ + | Aget _ | Aset _ + | And _ | Or _ | Not _ | Imply _ | If _ | Apply _ -> () + end + + method vpred p = self#vterm (F.e_prop p) + + method private vdefinition = function + | Logic t -> self#vtau t + | Value(t,_,e) -> self#vtau t ; self#vterm e + | Predicate(_,p) -> self#vpred p + | Inductive _ -> () + + method private vproperties = function + | Logic _ | Value _ | Predicate _ -> () + | Inductive cases -> List.iter self#vdlemma cases - method vparam x = self#vtau (tau_of_var x) - - method vterm t = - if not (Tset.mem t terms) then + method private vdfun d = begin - terms <- Tset.add t terms ; - F.e_iter self#vterm t ; - match F.repr t with - | Fun(f,_) -> self#vsymbol f - | Rget(_,f) -> self#vfield f - | Rdef fts -> List.iter (fun (f,_) -> self#vfield f) fts - | Var x | Bind(_,x,_) -> self#vparam x - | True | False | Kint _ | Kreal _ - | Times _ | Add _ | Mul _ | Div _ | Mod _ - | Eq _ | Neq _ | Leq _ | Lt _ - | Aget _ | Aset _ - | And _ | Or _ | Not _ | Imply _ | If _ | Apply _ -> () + List.iter self#vparam d.d_params ; + self#vdefinition d.d_definition ; + self#on_dfun d ; + self#vproperties d.d_definition ; end - - method vpred p = self#vterm (F.e_prop p) - - method private vdefinition = function - | Logic t -> self#vtau t - | Value(t,_,e) -> self#vtau t ; self#vterm e - | Predicate(_,p) -> self#vpred p - | Inductive _ -> () - - method private vproperties = function - | Logic _ | Value _ | Predicate _ -> () - | Inductive cases -> List.iter self#vdlemma cases - - method private vdfun d = - begin - List.iter self#vparam d.d_params ; - self#vdefinition d.d_definition ; - self#on_dfun d ; - self#vproperties d.d_definition ; - end - - method private vlfun f = - try - let d = Symbol.find f in - let c = d.d_cluster in - if self#do_local c then self#vdfun d - with Not_found -> - Wp_parameters.fatal "Undefined symbol '%a'" Fun.pretty f - method vsymbol f = - if not (DF.mem f symbols) then - begin - symbols <- DF.add f symbols ; - match f with - | Model { m_source = Extern e } -> self#vlibrary e.ext_library - | Model { m_source = Generated _ } | ACSL _ -> self#vlfun f - | CTOR c -> self#vadt (Lang.atype c.ctor_type) - end + method private vlfun f = + try + let d = Symbol.find f in + let c = d.d_cluster in + if self#do_local c then self#vdfun d + with Not_found -> + Wp_parameters.fatal "Undefined symbol '%a'" Fun.pretty f + + method vsymbol f = + if not (DF.mem f symbols) then + begin + symbols <- DF.add f symbols ; + match f with + | Model { m_source = Extern e } -> self#vlibrary e.ext_library + | Model { m_source = Generated _ } | ACSL _ -> self#vlfun f + | CTOR c -> self#vadt (Lang.atype c.ctor_type) + end + + method private vtrigger = function + | Qed.Engine.TgAny -> () + | Qed.Engine.TgVar x -> self#vparam x + | Qed.Engine.TgGet(a,k) -> + begin + self#vtrigger a ; + self#vtrigger k ; + end + | Qed.Engine.TgSet(a,k,v) -> + begin + self#vtrigger a ; + self#vtrigger k ; + self#vtrigger v ; + end + | Qed.Engine.TgFun(f,tgs) + | Qed.Engine.TgProp(f,tgs) -> + self#vsymbol f ; List.iter self#vtrigger tgs + + method private vdlemma a = + if not (DS.mem a.l_name dlemmas) then + begin + dlemmas <- DS.add a.l_name dlemmas ; + List.iter self#vparam a.l_forall ; + List.iter (List.iter self#vtrigger) a.l_triggers ; + self#vpred a.l_lemma ; + self#on_dlemma a ; + end + + method vlemma lem = + let l = lem.lem_name in + if not (DS.mem l lemmas) then + begin + lemmas <- DS.add l lemmas ; + try + let a = Lemma.find l in + if self#do_local a.l_cluster then self#vdlemma a + with Not_found -> + Wp_parameters.fatal "Lemma '%s' undefined" l + end + + method vcluster c = + if not (DC.mem c clusters) then + begin + clusters <- DC.add c clusters ; + self#on_cluster c ; + end + + method vlibrary thy = + if not (DS.mem thy theories) then + begin + theories <- DS.add thy theories ; + try + let deps = LogicBuiltins.dependencies thy in + List.iter self#vlibrary deps ; + self#on_library thy ; + with Not_found -> + Wp_parameters.fatal + ~current:false "Unknown library '%s'" thy + end - method private vtrigger = function - | Qed.Engine.TgAny -> () - | Qed.Engine.TgVar x -> self#vparam x - | Qed.Engine.TgGet(a,k) -> - begin - self#vtrigger a ; - self#vtrigger k ; - end - | Qed.Engine.TgSet(a,k,v) -> - begin - self#vtrigger a ; - self#vtrigger k ; - self#vtrigger v ; - end - | Qed.Engine.TgFun(f,tgs) - | Qed.Engine.TgProp(f,tgs) -> - self#vsymbol f ; List.iter self#vtrigger tgs - - method private vdlemma a = - if not (DS.mem a.l_name dlemmas) then - begin - dlemmas <- DS.add a.l_name dlemmas ; - List.iter self#vparam a.l_forall ; - List.iter (List.iter self#vtrigger) a.l_triggers ; - self#vpred a.l_lemma ; - self#on_dlemma a ; - end - - method vlemma lem = - let l = lem.lem_name in - if not (DS.mem l lemmas) then - begin - lemmas <- DS.add l lemmas ; - try - let a = Lemma.find l in - if self#do_local a.l_cluster then self#vdlemma a - with Not_found -> - Wp_parameters.fatal "Lemma '%s' undefined" l - end - - method vcluster c = - if not (DC.mem c clusters) then - begin - clusters <- DC.add c clusters ; - self#on_cluster c ; - end + method vgoal (axioms : axioms option) prop = + match axioms with + | None -> + (** Print a goal *) + begin + let hs = LogicUsage.proof_context () in + List.iter self#vlemma hs ; + self#vpred prop ; + end + | Some(cluster,hs) -> + (** Print the goal corresponding to a lemma *) + begin + self#section (cluster_title cluster) ; + self#set_local cluster ; + List.iter self#vlemma hs ; + self#vpred prop ; + end - method vlibrary thy = - if not (DS.mem thy theories) then + method vself = (** Print a cluster *) begin - theories <- DS.add thy theories ; - try - let deps = LogicBuiltins.dependencies thy in - List.iter self#vlibrary deps ; - self#on_library thy ; - with Not_found -> - Wp_parameters.fatal - ~current:false "Unknown library '%s'" thy + List.iter self#vcomp main.c_records ; + List.iter self#vtype main.c_types ; + List.iter (fun d -> self#vsymbol d.d_lfun) main.c_symbols ; + List.iter (fun l -> self#vdlemma l) main.c_lemmas ; end - method vgoal (axioms : axioms option) prop = - match axioms with - | None -> - (** Print a goal *) - begin - let hs = LogicUsage.proof_context () in - List.iter self#vlemma hs ; - self#vpred prop ; - end - | Some(cluster,hs) -> - (** Print the goal corresponding to a lemma *) - begin - self#section (cluster_title cluster) ; - self#set_local cluster ; - List.iter self#vlemma hs ; - self#vpred prop ; - end - - method vself = (** Print a cluster *) - begin - List.iter self#vcomp main.c_records ; - List.iter self#vtype main.c_types ; - List.iter (fun d -> self#vsymbol d.d_lfun) main.c_symbols ; - List.iter (fun l -> self#vdlemma l) main.c_lemmas ; - end - - method virtual section : string -> unit - method virtual on_library : string -> unit - method virtual on_cluster : cluster -> unit - method virtual on_type : logic_type_info -> typedef -> unit - method virtual on_comp : compinfo -> (field * tau) list -> unit - method virtual on_dlemma : dlemma -> unit - method virtual on_dfun : dfun -> unit + method virtual section : string -> unit + method virtual on_library : string -> unit + method virtual on_cluster : cluster -> unit + method virtual on_type : logic_type_info -> typedef -> unit + method virtual on_comp : compinfo -> (field * tau) list -> unit + method virtual on_dlemma : dlemma -> unit + method virtual on_dfun : dfun -> unit -end + end (* -------------------------------------------------------------------------- *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Definitions.mli frama-c-20150201+sodium+dfsg/src/wp/Definitions.mli --- frama-c-20140301+neon+dfsg/src/wp/Definitions.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Definitions.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -75,12 +75,11 @@ val of_term : term -> trigger val of_pred : pred -> trigger val vars : trigger -> Vars.t - val plug : trigger list list -> pred -> var list * pred end val define_symbol : dfun -> unit val update_symbol : dfun -> unit -val find_lemma : logic_lemma -> dlemma (* raises Not_found *) +val find_lemma : logic_lemma -> dlemma (** raises Not_found *) val compile_lemma : (logic_lemma -> dlemma) -> logic_lemma -> unit val define_lemma : dlemma -> unit val define_type : cluster -> logic_type_info -> unit @@ -91,41 +90,41 @@ type axioms = cluster * logic_lemma list class virtual visitor : cluster -> -object + object - (** {2 Locality} *) + (** {2 Locality} *) - method set_local : cluster -> unit - method do_local : cluster -> bool + method set_local : cluster -> unit + method do_local : cluster -> bool - (** {2 Visiting items} *) + (** {2 Visiting items} *) - method vadt : ADT.t -> unit - method vtype : logic_type_info -> unit - method vcomp : compinfo -> unit - method vfield : Field.t -> unit - method vtau : tau -> unit - method vparam : var -> unit - method vterm : term -> unit - method vpred : pred -> unit - method vsymbol : lfun -> unit - method vlemma : logic_lemma -> unit - method vcluster : cluster -> unit - method vlibrary : string -> unit - method vgoal : axioms option -> F.pred -> unit - method vself : unit - - (** {2 Visited definitions} *) - - method virtual section : string -> unit (** Comment *) - method virtual on_library : string -> unit (** External library to import *) - method virtual on_cluster : cluster -> unit (** Outer cluster to import *) - method virtual on_type : logic_type_info -> typedef -> unit (** This local type must be defined *) - method virtual on_comp : compinfo -> (field * tau) list -> unit (** This local compinfo must be defined *) - method virtual on_dlemma : dlemma -> unit (** This local lemma must be defined *) - method virtual on_dfun : dfun -> unit (** This local function must be defined *) + method vadt : ADT.t -> unit + method vtype : logic_type_info -> unit + method vcomp : compinfo -> unit + method vfield : Field.t -> unit + method vtau : tau -> unit + method vparam : var -> unit + method vterm : term -> unit + method vpred : pred -> unit + method vsymbol : lfun -> unit + method vlemma : logic_lemma -> unit + method vcluster : cluster -> unit + method vlibrary : string -> unit + method vgoal : axioms option -> F.pred -> unit + method vself : unit + + (** {2 Visited definitions} *) + + method virtual section : string -> unit (** Comment *) + method virtual on_library : string -> unit (** External library to import *) + method virtual on_cluster : cluster -> unit (** Outer cluster to import *) + method virtual on_type : logic_type_info -> typedef -> unit (** This local type must be defined *) + method virtual on_comp : compinfo -> (field * tau) list -> unit (** This local compinfo must be defined *) + method virtual on_dlemma : dlemma -> unit (** This local lemma must be defined *) + method virtual on_dfun : dfun -> unit (** This local function must be defined *) -end + end diff -Nru frama-c-20140301+neon+dfsg/src/wp/driver.ml frama-c-20150201+sodium+dfsg/src/wp/driver.ml --- frama-c-20140301+neon+dfsg/src/wp/driver.ml 2014-03-12 15:07:54.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/driver.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,1575 +0,0 @@ -# 27 "src/wp/driver.mll" - - - open Qed.Logic - open Lexing - open Cil_types - open LogicBuiltins - - type bal = [ `Default | `Left | `Right | `Nary ] - - type token = - | EOF - | KEY of string - | BOOLEAN - | INTEGER - | REAL - | INT of ikind - | FLT of fkind - | KIND of kind - | ID of string - | LINK of string - | RECLINK of (string * (string * bal)) list - | FIELD of string * string - - let keywords = [ - "library" , KEY "library" ; - "type" , KEY "type" ; - "ctor" , KEY "ctor" ; - "logic" , KEY "logic" ; - "predicate" , KEY "predicate" ; - "boolean" , BOOLEAN ; - "integer" , INTEGER ; - "real" , REAL ; - "char" , INT IChar ; - "short" , INT IShort ; - "int" , INT IInt ; - "unsigned" , INT IUInt ; - "float" , FLT FFloat ; - "float32" , KIND (F Ctypes.Float32) ; - "float64" , KIND (F Ctypes.Float64) ; - "double" , FLT FDouble ; - ] - - let ident x = try List.assoc x keywords with Not_found -> ID x - - let newline lexbuf = - lexbuf.lex_curr_p <- - { lexbuf.lex_curr_p with pos_lnum = succ lexbuf.lex_curr_p.pos_lnum } - - let rec conv_bal default (name,bal) = - match bal with - | `Default -> conv_bal default (name,default) - | `Nary -> Qed.Engine.F_call name - | `Left -> Qed.Engine.F_left name - | `Right -> Qed.Engine.F_right name - - -# 59 "src/wp/driver.ml" -let __ocaml_lex_tables = { - Lexing.lex_base = - "\000\000\246\255\000\000\001\000\248\255\249\255\078\000\160\000\ - \017\000\003\000\254\255\255\255\251\255\027\000\252\255\236\000\ - \055\001\130\001\029\001\252\255\253\255\013\000\255\255\254\255\ - \244\001\251\255\252\255\063\002\148\002\004\000\255\255\187\001\ - \250\255\005\003\254\255\255\255\251\255\252\255\253\255\057\003\ - \251\255\135\003\217\003\253\255\254\255\006\000\255\255\192\000\ - \252\255\253\255\254\255\007\000\075\004\251\255\252\255\150\004\ - \235\004\254\255\008\000\025\003\251\255\252\255\253\255\009\000\ - \255\255\093\005\251\255\171\005\253\005\253\255\254\255\010\000\ - \255\255\018\002\252\255\253\255\254\255\012\000\111\006\251\255\ - \252\255\186\006\015\007\254\255\013\000\248\001\028\000\014\000\ - \255\255\024\000\040\000\034\000\037\000\037\000\053\000\022\000\ - \253\255\056\000\050\000\050\000\252\255\070\000\058\000\052\000\ - \251\255"; - Lexing.lex_backtrk = - "\255\255\255\255\009\000\009\000\255\255\255\255\005\000\009\000\ - \009\000\002\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \008\000\255\255\255\255\255\255\255\255\003\000\255\255\255\255\ - \255\255\255\255\255\255\002\000\004\000\001\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\003\000\004\000\255\255\255\255\000\000\255\255\255\255\ - \255\255\255\255\255\255\000\000\255\255\255\255\255\255\002\000\ - \004\000\255\255\000\000\255\255\255\255\255\255\255\255\001\000\ - \255\255\255\255\255\255\003\000\004\000\255\255\255\255\000\000\ - \255\255\255\255\255\255\255\255\255\255\000\000\255\255\255\255\ - \255\255\002\000\004\000\255\255\000\000\004\000\255\255\001\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255"; - Lexing.lex_default = - "\001\000\000\000\255\255\255\255\000\000\000\000\255\255\255\255\ - \255\255\255\255\000\000\000\000\000\000\013\000\000\000\255\255\ - \255\255\255\255\019\000\000\000\000\000\255\255\000\000\000\000\ - \025\000\000\000\000\000\255\255\255\255\255\255\000\000\034\000\ - \000\000\036\000\000\000\000\000\000\000\000\000\000\000\040\000\ - \000\000\255\255\255\255\000\000\000\000\255\255\000\000\048\000\ - \000\000\000\000\000\000\255\255\053\000\000\000\000\000\255\255\ - \255\255\000\000\255\255\060\000\000\000\000\000\000\000\255\255\ - \000\000\066\000\000\000\255\255\255\255\000\000\000\000\255\255\ - \000\000\074\000\000\000\000\000\000\000\255\255\079\000\000\000\ - \000\000\255\255\255\255\000\000\255\255\255\255\255\255\255\255\ - \000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \000\000\255\255\255\255\255\255\000\000\255\255\255\255\255\255\ - \000\000"; - Lexing.lex_trans = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\009\000\010\000\000\000\009\000\029\000\000\000\045\000\ - \051\000\058\000\063\000\071\000\000\000\077\000\084\000\087\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \009\000\000\000\005\000\009\000\029\000\014\000\045\000\051\000\ - \058\000\063\000\071\000\002\000\077\000\084\000\087\000\008\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\003\000\012\000\023\000\001\000\001\000\096\000\ - \013\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\100\000\007\000\104\000\000\000\006\000\ - \000\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\004\000\015\000\101\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \089\000\097\000\090\000\092\000\093\000\094\000\091\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\095\000\098\000\099\000\102\000\006\000\103\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\051\000\050\000\000\000\000\000\000\000\000\000\000\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \051\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\000\000\000\000\049\000\000\000\006\000\ - \011\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\255\255\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\000\000\020\000\ - \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\021\000\ - \017\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\ - \255\255\000\000\000\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\035\000\000\000\000\000\ - \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\029\000\030\000\000\000\ - \000\000\087\000\088\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\029\000\000\000\026\000\033\000\ - \087\000\000\000\000\000\077\000\076\000\022\000\000\000\000\000\ - \086\000\000\000\000\000\000\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\000\000\000\000\ - \000\000\000\000\077\000\000\000\000\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\075\000\ - \028\000\000\000\000\000\027\000\000\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\000\000\000\000\000\000\000\000\027\000\000\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\000\000\032\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\000\000\ - \000\000\000\000\000\000\027\000\255\255\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\037\000\ - \000\000\000\000\255\255\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\063\000\064\000\000\000\000\000\000\000\038\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\063\000\000\000\062\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\045\000\044\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\045\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\038\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\038\000\046\000\000\000\000\000\038\000\ - \000\000\038\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\061\000\042\000\000\000\000\000\ - \041\000\000\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\000\000\000\000\043\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\000\000\000\000\000\000\000\000\041\000\000\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\000\000\000\000\000\000\255\255\000\000\000\000\ - \000\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\255\255\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\000\000\000\000\000\000\000\000\ - \041\000\255\255\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\058\000\057\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\058\000\000\000\054\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\000\000\056\000\ - \000\000\000\000\055\000\000\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\000\000\000\000\000\000\000\000\055\000\000\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\000\000\000\000\ - \000\000\000\000\055\000\255\255\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\071\000\070\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\071\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\000\000\ - \072\000\000\000\000\000\000\000\000\000\000\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \000\000\068\000\000\000\000\000\067\000\000\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \000\000\000\000\069\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\000\000\000\000\ - \000\000\000\000\067\000\000\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \000\000\000\000\000\000\000\000\067\000\255\255\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \084\000\083\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\084\000\ - \000\000\080\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\000\000\082\000\000\000\000\000\081\000\000\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\000\000\000\000\000\000\ - \000\000\081\000\000\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\000\000\000\000\000\000\000\000\081\000\255\255\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - "; - Lexing.lex_check = - "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\000\000\000\000\255\255\009\000\029\000\255\255\045\000\ - \051\000\058\000\063\000\071\000\255\255\077\000\084\000\087\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \000\000\255\255\000\000\009\000\029\000\013\000\045\000\051\000\ - \058\000\063\000\071\000\000\000\077\000\084\000\087\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\008\000\021\000\002\000\003\000\095\000\ - \008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\099\000\000\000\103\000\255\255\000\000\ - \255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\006\000\089\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \086\000\090\000\086\000\091\000\092\000\093\000\086\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\094\000\097\000\098\000\101\000\006\000\102\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\047\000\047\000\255\255\255\255\255\255\255\255\255\255\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \047\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\255\255\255\255\047\000\255\255\007\000\ - \000\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\013\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\255\255\018\000\ - \255\255\255\255\255\255\255\255\255\255\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\018\000\ - \015\000\255\255\255\255\015\000\255\255\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\255\255\255\255\255\255\255\255\016\000\255\255\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\017\000\017\000\017\000\017\000\017\000\017\000\ - \017\000\017\000\017\000\017\000\255\255\255\255\255\255\255\255\ - \047\000\255\255\255\255\017\000\017\000\017\000\017\000\017\000\ - \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\ - \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\ - \017\000\017\000\017\000\017\000\017\000\031\000\255\255\255\255\ - \255\255\017\000\255\255\017\000\017\000\017\000\017\000\017\000\ - \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\ - \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\ - \017\000\017\000\017\000\017\000\017\000\024\000\024\000\255\255\ - \255\255\085\000\085\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\024\000\255\255\024\000\031\000\ - \085\000\255\255\255\255\073\000\073\000\018\000\255\255\255\255\ - \085\000\255\255\255\255\255\255\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\255\255\255\255\ - \255\255\255\255\073\000\255\255\255\255\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\073\000\ - \024\000\255\255\255\255\024\000\255\255\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\255\255\255\255\255\255\255\255\027\000\255\255\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\255\255\031\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\255\255\ - \255\255\255\255\255\255\028\000\024\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ - \028\000\028\000\028\000\028\000\028\000\028\000\028\000\033\000\ - \255\255\255\255\073\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\059\000\059\000\255\255\255\255\255\255\033\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\059\000\255\255\059\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\039\000\039\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\039\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\033\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\033\000\039\000\255\255\255\255\033\000\ - \255\255\033\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\059\000\039\000\255\255\255\255\ - \039\000\255\255\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\039\000\039\000\255\255\255\255\039\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\255\255\255\255\255\255\255\255\041\000\255\255\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\255\255\255\255\255\255\033\000\255\255\255\255\ - \255\255\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\059\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\255\255\255\255\255\255\255\255\ - \042\000\039\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\052\000\052\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\052\000\255\255\052\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\255\255\052\000\ - \255\255\255\255\052\000\255\255\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ - \052\000\052\000\052\000\052\000\052\000\052\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\255\255\255\255\255\255\255\255\055\000\255\255\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\056\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\255\255\255\255\ - \255\255\255\255\056\000\052\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\065\000\065\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\065\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\255\255\ - \065\000\255\255\255\255\255\255\255\255\255\255\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \255\255\065\000\255\255\255\255\065\000\255\255\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ - \255\255\255\255\065\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\255\255\255\255\ - \255\255\255\255\067\000\255\255\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \255\255\255\255\255\255\255\255\068\000\065\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ - \078\000\078\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\078\000\ - \255\255\078\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\255\255\078\000\255\255\255\255\078\000\255\255\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\ - \078\000\078\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\255\255\255\255\255\255\ - \255\255\081\000\255\255\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\ - \081\000\081\000\081\000\081\000\081\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\082\000\ - \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ - \082\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ - \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ - \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ - \082\000\082\000\255\255\255\255\255\255\255\255\082\000\078\000\ - \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ - \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ - \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\ - \082\000\082\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - "; - Lexing.lex_base_code = - "\000\000\000\000\000\000\000\000\000\000\000\000\075\000\150\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000"; - Lexing.lex_backtrk_code = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000"; - Lexing.lex_default_code = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000"; - Lexing.lex_trans_code = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\000\000\000\000\000\000\000\000\001\000\ - \000\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\000\000\000\000\ - \000\000\000\000\001\000\000\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\000\000\000\000\000\000\000\000\001\000\000\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ - \001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000"; - Lexing.lex_check_code = - "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\255\255\255\255\255\255\255\255\000\000\ - \255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\255\255\255\255\ - \255\255\255\255\006\000\255\255\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\007\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\255\255\255\255\255\255\255\255\007\000\255\255\007\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255"; - Lexing.lex_code = - "\255\001\255\255\000\001\255"; -} - -let rec tok lexbuf = - lexbuf.Lexing.lex_mem <- Array.create 2 (-1) ; __ocaml_lex_tok_rec lexbuf 0 -and __ocaml_lex_tok_rec lexbuf __ocaml_lex_state = - match Lexing.new_engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 88 "src/wp/driver.mll" - ( EOF ) -# 786 "src/wp/driver.ml" - - | 1 -> -# 89 "src/wp/driver.mll" - ( newline lexbuf ; tok lexbuf ) -# 791 "src/wp/driver.ml" - - | 2 -> -# 90 "src/wp/driver.mll" - ( tok lexbuf ) -# 796 "src/wp/driver.ml" - - | 3 -> -# 91 "src/wp/driver.mll" - ( newline lexbuf ; tok lexbuf ) -# 801 "src/wp/driver.ml" - - | 4 -> -# 92 "src/wp/driver.mll" - ( comment lexbuf ) -# 806 "src/wp/driver.ml" - - | 5 -> -let -# 93 "src/wp/driver.mll" - a -# 812 "src/wp/driver.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in -# 93 "src/wp/driver.mll" - ( ident a ) -# 816 "src/wp/driver.ml" - - | 6 -> -# 94 "src/wp/driver.mll" - ( LINK (string_val (Buffer.create 10) lexbuf) ) -# 821 "src/wp/driver.ml" - - | 7 -> -# 95 "src/wp/driver.mll" - ( RECLINK(reclink [] lexbuf) ) -# 826 "src/wp/driver.ml" - - | 8 -> -let -# 96 "src/wp/driver.mll" - group -# 832 "src/wp/driver.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_mem.(0) -and -# 96 "src/wp/driver.mll" - var -# 837 "src/wp/driver.ml" -= Lexing.sub_lexeme lexbuf (lexbuf.Lexing.lex_mem.(0) + 1) lexbuf.Lexing.lex_curr_pos in -# 96 "src/wp/driver.mll" - ( FIELD(group,var) ) -# 841 "src/wp/driver.ml" - - | 9 -> -# 97 "src/wp/driver.mll" - ( KEY (Lexing.lexeme lexbuf) ) -# 846 "src/wp/driver.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_tok_rec lexbuf __ocaml_lex_state - -and comment lexbuf = - __ocaml_lex_comment_rec lexbuf 18 -and __ocaml_lex_comment_rec lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 100 "src/wp/driver.mll" - ( failwith "Unterminated comment" ) -# 857 "src/wp/driver.ml" - - | 1 -> -# 101 "src/wp/driver.mll" - ( tok lexbuf ) -# 862 "src/wp/driver.ml" - - | 2 -> -# 102 "src/wp/driver.mll" - ( newline lexbuf ; comment lexbuf ) -# 867 "src/wp/driver.ml" - - | 3 -> -# 103 "src/wp/driver.mll" - ( comment lexbuf ) -# 872 "src/wp/driver.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_comment_rec lexbuf __ocaml_lex_state - -and value lexbuf = - __ocaml_lex_value_rec lexbuf 24 -and __ocaml_lex_value_rec lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 106 "src/wp/driver.mll" - ( newline lexbuf ; value lexbuf ) -# 883 "src/wp/driver.ml" - - | 1 -> -# 107 "src/wp/driver.mll" - ( value lexbuf ) -# 888 "src/wp/driver.ml" - - | 2 -> -let -# 108 "src/wp/driver.mll" - a -# 894 "src/wp/driver.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in -# 108 "src/wp/driver.mll" - ( a ) -# 898 "src/wp/driver.ml" - - | 3 -> -# 109 "src/wp/driver.mll" - ( string_val (Buffer.create 10) lexbuf ) -# 903 "src/wp/driver.ml" - - | 4 -> -# 110 "src/wp/driver.mll" - ( failwith "Ident or String expected" ) -# 908 "src/wp/driver.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_value_rec lexbuf __ocaml_lex_state - -and string_val buf lexbuf = - __ocaml_lex_string_val_rec buf lexbuf 31 -and __ocaml_lex_string_val_rec buf lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 113 "src/wp/driver.mll" - ( Buffer.contents buf;) -# 919 "src/wp/driver.ml" - - | 1 -> -let -# 114 "src/wp/driver.mll" - c -# 925 "src/wp/driver.ml" -= Lexing.sub_lexeme_char lexbuf lexbuf.Lexing.lex_start_pos in -# 115 "src/wp/driver.mll" - ( Buffer.add_char buf c; - string_val buf lexbuf ) -# 930 "src/wp/driver.ml" - - | 2 -> -let -# 117 "src/wp/driver.mll" - c -# 936 "src/wp/driver.ml" -= Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 1) in -# 118 "src/wp/driver.mll" - ( Buffer.add_char buf - (match c with 'n' -> '\n' | 'r' -> '\r' | 't' -> '\t' | _ -> c); - string_val buf lexbuf ) -# 942 "src/wp/driver.ml" - - | 3 -> -# 122 "src/wp/driver.mll" - ( string_val buf lexbuf ) -# 947 "src/wp/driver.ml" - - | 4 -> -let -# 123 "src/wp/driver.mll" - c -# 953 "src/wp/driver.ml" -= Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 1) in -# 124 "src/wp/driver.mll" - ( Buffer.add_char buf '\\'; - Buffer.add_char buf c; - string_val buf lexbuf ) -# 959 "src/wp/driver.ml" - - | 5 -> -# 128 "src/wp/driver.mll" - ( failwith "Unterminated string" ) -# 964 "src/wp/driver.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_string_val_rec buf lexbuf __ocaml_lex_state - -and recstring acc lexbuf = - __ocaml_lex_recstring_rec acc lexbuf 39 -and __ocaml_lex_recstring_rec acc lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 131 "src/wp/driver.mll" - ( recstring acc lexbuf ) -# 975 "src/wp/driver.ml" - - | 1 -> -# 132 "src/wp/driver.mll" - ( newline lexbuf ; recstring acc lexbuf ) -# 980 "src/wp/driver.ml" - - | 2 -> -# 133 "src/wp/driver.mll" - ( acc ) -# 985 "src/wp/driver.ml" - - | 3 -> -let -# 134 "src/wp/driver.mll" - field -# 991 "src/wp/driver.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in -# 134 "src/wp/driver.mll" - ( recstring_bis acc field lexbuf ) -# 995 "src/wp/driver.ml" - - | 4 -> -# 135 "src/wp/driver.mll" - ( failwith "Identifier or '}' expected" ) -# 1000 "src/wp/driver.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_recstring_rec acc lexbuf __ocaml_lex_state - -and recstring_bis acc field lexbuf = - __ocaml_lex_recstring_bis_rec acc field lexbuf 47 -and __ocaml_lex_recstring_bis_rec acc field lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 137 "src/wp/driver.mll" - ( recstring_bis acc field lexbuf ) -# 1011 "src/wp/driver.ml" - - | 1 -> -# 138 "src/wp/driver.mll" - ( newline lexbuf ; recstring_bis acc field lexbuf ) -# 1016 "src/wp/driver.ml" - - | 2 -> -# 139 "src/wp/driver.mll" - ( recstring_ter acc field lexbuf ) -# 1021 "src/wp/driver.ml" - - | 3 -> -# 140 "src/wp/driver.mll" - ( failwith "'=' expected" ) -# 1026 "src/wp/driver.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_recstring_bis_rec acc field lexbuf __ocaml_lex_state - -and recstring_ter acc field lexbuf = - __ocaml_lex_recstring_ter_rec acc field lexbuf 52 -and __ocaml_lex_recstring_ter_rec acc field lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 142 "src/wp/driver.mll" - ( recstring_ter acc field lexbuf ) -# 1037 "src/wp/driver.ml" - - | 1 -> -# 143 "src/wp/driver.mll" - ( newline lexbuf ; recstring_ter acc field lexbuf ) -# 1042 "src/wp/driver.ml" - - | 2 -> -let -# 144 "src/wp/driver.mll" - name -# 1048 "src/wp/driver.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in -# 144 "src/wp/driver.mll" - ( recstring ((field,name)::acc) lexbuf ) -# 1052 "src/wp/driver.ml" - - | 3 -> -# 146 "src/wp/driver.mll" - ( let name = string_val (Buffer.create 10) lexbuf in - recstring ((field,name)::acc) lexbuf - ) -# 1059 "src/wp/driver.ml" - - | 4 -> -# 149 "src/wp/driver.mll" - ( failwith "Identifier or String expected" ) -# 1064 "src/wp/driver.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_recstring_ter_rec acc field lexbuf __ocaml_lex_state - -and recorstring lexbuf = - __ocaml_lex_recorstring_rec lexbuf 59 -and __ocaml_lex_recorstring_rec lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 152 "src/wp/driver.mll" - ( newline lexbuf ; recorstring lexbuf ) -# 1075 "src/wp/driver.ml" - - | 1 -> -# 153 "src/wp/driver.mll" - ( recorstring lexbuf ) -# 1080 "src/wp/driver.ml" - - | 2 -> -# 154 "src/wp/driver.mll" - ( `String (string_val (Buffer.create 10) lexbuf) ) -# 1085 "src/wp/driver.ml" - - | 3 -> -# 155 "src/wp/driver.mll" - ( `RecString (recstring [] lexbuf) ) -# 1090 "src/wp/driver.ml" - - | 4 -> -let -# 156 "src/wp/driver.mll" - c -# 1096 "src/wp/driver.ml" -= Lexing.sub_lexeme_char lexbuf lexbuf.Lexing.lex_start_pos in -# 156 "src/wp/driver.mll" - ( failwith (Printf.sprintf "found '%c' instead of \" or {" c) ) -# 1100 "src/wp/driver.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_recorstring_rec lexbuf __ocaml_lex_state - -and reclink acc lexbuf = - __ocaml_lex_reclink_rec acc lexbuf 65 -and __ocaml_lex_reclink_rec acc lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 159 "src/wp/driver.mll" - ( reclink acc lexbuf ) -# 1111 "src/wp/driver.ml" - - | 1 -> -# 160 "src/wp/driver.mll" - ( newline lexbuf ; reclink acc lexbuf ) -# 1116 "src/wp/driver.ml" - - | 2 -> -# 161 "src/wp/driver.mll" - ( acc ) -# 1121 "src/wp/driver.ml" - - | 3 -> -let -# 162 "src/wp/driver.mll" - field -# 1127 "src/wp/driver.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in -# 162 "src/wp/driver.mll" - ( reclink_bis acc field lexbuf ) -# 1131 "src/wp/driver.ml" - - | 4 -> -# 163 "src/wp/driver.mll" - ( failwith "Identifier or '}' expected" ) -# 1136 "src/wp/driver.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_reclink_rec acc lexbuf __ocaml_lex_state - -and reclink_bis acc field lexbuf = - __ocaml_lex_reclink_bis_rec acc field lexbuf 73 -and __ocaml_lex_reclink_bis_rec acc field lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 165 "src/wp/driver.mll" - ( reclink_bis acc field lexbuf ) -# 1147 "src/wp/driver.ml" - - | 1 -> -# 166 "src/wp/driver.mll" - ( newline lexbuf ; reclink_bis acc field lexbuf ) -# 1152 "src/wp/driver.ml" - - | 2 -> -# 167 "src/wp/driver.mll" - ( reclink_ter acc field lexbuf ) -# 1157 "src/wp/driver.ml" - - | 3 -> -# 168 "src/wp/driver.mll" - ( failwith "'=' expected" ) -# 1162 "src/wp/driver.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_reclink_bis_rec acc field lexbuf __ocaml_lex_state - -and reclink_ter acc field lexbuf = - __ocaml_lex_reclink_ter_rec acc field lexbuf 78 -and __ocaml_lex_reclink_ter_rec acc field lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 170 "src/wp/driver.mll" - ( reclink_ter acc field lexbuf ) -# 1173 "src/wp/driver.ml" - - | 1 -> -# 171 "src/wp/driver.mll" - ( newline lexbuf ; reclink_ter acc field lexbuf ) -# 1178 "src/wp/driver.ml" - - | 2 -> -let -# 172 "src/wp/driver.mll" - name -# 1184 "src/wp/driver.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in -# 173 "src/wp/driver.mll" - ( let link = name,(bal lexbuf) in - reclink ((field,link)::acc) lexbuf - ) -# 1190 "src/wp/driver.ml" - - | 3 -> -# 177 "src/wp/driver.mll" - ( let name = string_val (Buffer.create 10) lexbuf in - let link = name,(bal lexbuf) in - reclink ((field,link)::acc) lexbuf - ) -# 1198 "src/wp/driver.ml" - - | 4 -> -# 181 "src/wp/driver.mll" - ( failwith "Identifier or String expected" ) -# 1203 "src/wp/driver.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_reclink_ter_rec acc field lexbuf __ocaml_lex_state - -and bal lexbuf = - __ocaml_lex_bal_rec lexbuf 85 -and __ocaml_lex_bal_rec lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 184 "src/wp/driver.mll" - ( newline lexbuf ; bal lexbuf ) -# 1214 "src/wp/driver.ml" - - | 1 -> -# 185 "src/wp/driver.mll" - ( bal lexbuf ) -# 1219 "src/wp/driver.ml" - - | 2 -> -# 186 "src/wp/driver.mll" - ( `Right ) -# 1224 "src/wp/driver.ml" - - | 3 -> -# 187 "src/wp/driver.mll" - ( `Nary ) -# 1229 "src/wp/driver.ml" - - | 4 -> -let -# 188 "src/wp/driver.mll" - c -# 1235 "src/wp/driver.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in -# 188 "src/wp/driver.mll" - ( if c = "" then `Default else `Left ) -# 1239 "src/wp/driver.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_bal_rec lexbuf __ocaml_lex_state - -;; - -# 190 "src/wp/driver.mll" - - - let pretty fmt = function - | EOF -> Format.pp_print_string fmt "" - | KEY a | ID a -> Format.fprintf fmt "'%s'" a - | LINK s -> Format.fprintf fmt "\"%s\"" s - | BOOLEAN | INTEGER | REAL | INT _ | FLT _ | KIND _ -> - Format.pp_print_string fmt "" - | FIELD(group,name) -> Format.fprintf fmt "%s.%s" group name - | RECLINK _ -> Format.pp_print_string fmt "" - - type input = { - lexbuf : Lexing.lexbuf ; - mutable current : token ; - } - - let skip input = - if input.current <> EOF then input.current <- tok input.lexbuf - - let token input = input.current - - let value input = - if input.current = EOF then failwith "Value expected" - else - let v = value input.lexbuf in - skip input; v - - let key input a = match token input with - | KEY b when a=b -> skip input ; true - | _ -> false - - let skipkey input a = match token input with - | KEY b when a=b -> skip input - | _ -> failwith (Printf.sprintf "Missing '%s'" a) - - let noskipkey input a = match token input with - | KEY b when a=b -> () - | _ -> failwith (Printf.sprintf "Missing '%s'" a) - - - let ident input = match token input with - | ID x | LINK x -> skip input ; x - | _ -> failwith "missing identifier" - - let kind input = - let kd = match token input with - | INTEGER -> Z - | REAL -> R - | BOOLEAN -> A - | INT i -> I (Ctypes.c_int i) - | FLT f -> F (Ctypes.c_float f) - | KIND x -> x - | ID _ -> A - | _ -> failwith " expected" - in skip input ; kd - - let parameter input = - let k = kind input in - match token input with - | ID _ -> skip input ; k - | _ -> k - - let rec parameters input = - if key input ")" then [] else - let p = parameter input in - if key input "," then p :: parameters input else - if key input ")" then [p] else - failwith "Missing ',' or ')'" - - let signature input = - if key input "(" then parameters input else [] - - let rec depend input = - match token input with - | ID a | LINK a -> - skip input ; - ignore (key input ",") ; - a :: depend input - | _ -> [] - - let link def input = - match token input with - | LINK f | ID f -> - let link = conv_bal def (f,(bal input.lexbuf)) in - skip input; Lang.infoprover link - | RECLINK l -> - skip input ; - begin try - {Lang.altergo = conv_bal def (List.assoc "alt-ergo" l); - why3 = conv_bal def (List.assoc "why3" l); - coq = conv_bal def (List.assoc "coq" l) } - with Not_found -> - failwith "a link must contain an entry for alt-ergo, why3 and coq" - end - | _ -> failwith "Missing link symbol" - - let linkstring input = - match recorstring input.lexbuf with - | `String f -> - skip input ; Lang.infoprover f - | `RecString l -> - skip input ; - begin try - {Lang.altergo = List.assoc "alt-ergo" l; - why3 = List.assoc "why3" l; - coq = List.assoc "coq" l } - with Not_found -> - failwith "a link must contain an entry for alt-ergo, why3 and coq" - end - | _ -> failwith "Missing link symbol" - - let input_string input = - match token input with - | LINK f | ID f -> - skip input ; f - | _ -> failwith "String or ident expected" - - - let op = { - inversible = false ; - associative = false ; - commutative = false ; - idempotent = false ; - neutral = E_none ; - absorbant = E_none ; - } - - let op_elt input = - ignore (key input ":") ; - let op = input_string input in - skipkey input ":" ; - match op with - | "0" -> E_int 0 - | "1" -> E_int 1 - | "-1" -> E_int (-1) - | "\\true" -> E_true - | "\\false" -> E_false - | _ -> - match LogicBuiltins.constant op with - | ACSLDEF -> failwith (Printf.sprintf "Symbol '%s' not found" op) - | CONST _ -> - failwith "Invariant broken only true and false can be const" - | LFUN lfun -> E_const lfun - - let rec op_link op input = - match token input with - | LINK _ | RECLINK _ -> - Operator op, link `Left input - | ID "associative" -> skip input ; skipkey input ":" ; - op_link { op with associative = true } input - | ID "commutative" -> skip input ; skipkey input ":" ; - op_link { op with commutative = true } input - | ID "ac" -> skip input ; skipkey input ":" ; - op_link { op with commutative = true ; associative = true } input - | ID "idempotent" -> skip input ; skipkey input ":" ; - op_link { op with idempotent = true } input - | ID "inversible" -> skip input ; skipkey input ":" ; - op_link { op with inversible = true } input - | ID "neutral" -> - skip input ; let e = op_elt input in - op_link { op with neutral = e } input - | ID "absorbant" -> - skip input ; let e = op_elt input in - op_link { op with absorbant = e } input - | ID t -> failwith (Printf.sprintf "Unknown tag '%s'" t) - | _ -> failwith "Missing or " - - let logic_link input = - match token input with - | LINK _ | RECLINK _ -> - Function, link `Nary input - | ID "constructor" -> - skip input ; skipkey input ":" ; - Constructor, link `Nary input - | ID "injective" -> - skip input ; skipkey input ":" ; - Injection, link `Nary input - | _ -> op_link op input - - let rec parse ~driver_dir library input = - match token input with - | EOF -> () - | KEY "library" -> - skip input ; - let name = input_string input in - ignore (key input ":") ; - let depends = depend input in - ignore (key input ";") ; - add_library name depends ; - parse ~driver_dir name input - | KEY "type" -> - skip input ; - let name = ident input in - noskipkey input "=" ; - let link = linkstring input in - add_type name ~library ~link () ; - skipkey input ";" ; - parse ~driver_dir library input - | KEY "ctor" -> - skip input ; - let name = ident input in - let args = signature input in - skipkey input "=" ; - let link = link `Nary input in - add_ctor name args ~library ~link () ; - skipkey input ";" ; - parse ~driver_dir library input - | KEY "logic" -> - skip input ; - let result = kind input in - let name = ident input in - let args = signature input in - if key input ":=" then - begin - let alias = ident input in - add_alias name args ~alias () ; - end - else - begin - skipkey input "=" ; - let category,link = logic_link input in - add_logic result name args ~library ~category ~link () ; - end ; - skipkey input ";" ; - parse ~driver_dir library input - | KEY "predicate" -> - skip input ; - let name = ident input in - let args = signature input in - if key input ":=" then - begin - let alias = ident input in - add_alias name args ~alias () ; - end - else - begin - noskipkey input "=" ; - let link = linkstring input in - add_predicate name args ~library ~link () ; - end ; - skipkey input ";" ; - parse ~driver_dir library input - | FIELD (group,var) -> - skip input ; - begin match token input with - | KEY ":=" -> - let v = value input in - set_option ~driver_dir group var ~library v - | KEY "+=" -> - let v = value input in - add_option ~driver_dir group var ~library v - | _ -> failwith "Missing ':=' or '+='" - end; - skipkey input ";" ; - parse ~driver_dir library input - | _ -> failwith "Unexpected entry" - - let load ?(feedback=true) file = - try - if feedback then - Wp_parameters.feedback "Loading driver '%s'" (Filepath.pretty file) ; - let driver_dir = Filename.dirname file in - let inc = open_in file in - let lex = Lexing.from_channel inc in - lex.Lexing.lex_curr_p <- - { lex.Lexing.lex_curr_p with Lexing.pos_fname = file } ; - let input = { current = tok lex ; lexbuf = lex } in - try - parse ~driver_dir "qed" input ; - close_in inc - with Failure msg -> - close_in inc ; - let source = lex.Lexing.lex_start_p in - Wp_parameters.abort ~current:false - ~source "(Driver Error) %s (at %a)" msg - pretty (token input) - with exn -> - Wp_parameters.abort - ~current:false - "Error in driver '%s': %s" file (Printexc.to_string exn) - - (*TODO[LC] Think about projectification ... *) - let dkey = Wp_parameters.register_category "includes" - - let loaded : (string list * string list, driver) Hashtbl.t =Hashtbl.create 10 - let load_driver () = - let drivers = Wp_parameters.Drivers.get () in - let includes = Wp_parameters.get_includes () in - let key = (drivers,includes) in - begin try - let driver = Hashtbl.find loaded key in - Context.set LogicBuiltins.driver driver - with Not_found -> - let driver_basename file = - let base = Filename.basename file in - try Filename.chop_extension base - with Invalid_argument _ -> base in - let drvs = List.map driver_basename drivers in - let id = String.concat "_" drvs in - let descr = String.concat "," drvs in - let directories = - let shared = - try [Wp_parameters.Share.dir ~error:false ()] - with Wp_parameters.Share.No_dir -> [] in - let directories = includes @ shared in - if Wp_parameters.has_dkey "includes" then - Wp_parameters.debug ~dkey "Included directories:%t" - (fun fmt -> - List.iter - (fun d -> Format.fprintf fmt "@\n - '%s'" d) - directories - ); - directories - in - LogicBuiltins.new_driver ~includes:directories ~id ~descr ; - let drivers = - List.map (fun file -> - if Sys.file_exists file - then Sysutil.absolutize_filename (Sys.getcwd ()) file - else LogicBuiltins.find_lib file) - drivers in - let default = Wp_parameters.Share.file ~error:true "wp.driver" in - let feedback = Wp_parameters.Share.Dir_name.is_set () in - load ~feedback default; - List.iter load drivers; - Hashtbl.add loaded key (Context.get LogicBuiltins.driver); - if Wp_parameters.has_dkey "driver" then LogicBuiltins.dump () - end ; Context.get LogicBuiltins.driver - - -# 1576 "src/wp/driver.ml" diff -Nru frama-c-20140301+neon+dfsg/src/wp/driver.mli frama-c-20150201+sodium+dfsg/src/wp/driver.mli --- frama-c-20140301+neon+dfsg/src/wp/driver.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/driver.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -25,5 +25,5 @@ (* -------------------------------------------------------------------------- *) val load_driver : unit -> LogicBuiltins.driver - (** Memoized loading of drivers according to current - WP options. Finally sets [LogicBuiltins.driver] and returns it. *) +(** Memoized loading of drivers according to current + WP options. Finally sets [LogicBuiltins.driver] and returns it. *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/driver.mll frama-c-20150201+sodium+dfsg/src/wp/driver.mll --- frama-c-20140301+neon+dfsg/src/wp/driver.mll 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/driver.mll 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -75,13 +75,16 @@ let rec conv_bal default (name,bal) = match bal with | `Default -> conv_bal default (name,default) - | `Nary -> Qed.Engine.F_call name | `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 } -let blank = [ ' ' '\t' ] +let blank = [ ' ' '\t' '\r' ] let ident = '\\'? [ 'a'-'z' 'A'-'Z' '_' '0'-'9' ]+ rule tok = parse @@ -275,11 +278,11 @@ | RECLINK l -> skip input ; begin try - {Lang.altergo = conv_bal def (List.assoc "alt-ergo" l); + {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) } with Not_found -> - failwith "a link must contain an entry for alt-ergo, why3 and coq" + failwith "a link must contain an entry for 'altergo', 'why3' and 'coq'" end | _ -> failwith "Missing link symbol" @@ -290,11 +293,11 @@ | `RecString l -> skip input ; begin try - {Lang.altergo = List.assoc "alt-ergo" l; + {Lang.altergo = List.assoc "altergo" l; why3 = List.assoc "why3" l; coq = List.assoc "coq" l } with Not_found -> - failwith "a link must contain an entry for alt-ergo, why3 and coq" + failwith "a link must contain an entry for 'altergo', 'why3' and 'coq'" end | _ -> failwith "Missing link symbol" diff -Nru frama-c-20140301+neon+dfsg/src/wp/dyncall.ml frama-c-20150201+sodium+dfsg/src/wp/dyncall.ml --- frama-c-20140301+neon+dfsg/src/wp/dyncall.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/dyncall.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -39,14 +39,14 @@ let fs = List.map (fun p -> - let loc = p.lexpr_loc in - match p.lexpr_node with - | PLvar f -> - let fv = find_call typing_context loc f in - Logic_const.term ~loc (TLval(TVar fv,TNoOffset)) fv.lv_type - | _ -> - typing_context.error loc "Function name expected for calls" ; - assert false + let loc = p.lexpr_loc in + match p.lexpr_node with + | PLvar f -> + let fv = find_call typing_context loc f in + Logic_const.term ~loc (TLval(TVar fv,TNoOffset)) fv.lv_type + | _ -> + typing_context.error loc "Function name expected for calls" ; + assert false ) ps in let kfs = Logic_const.pseparated ~loc fs in let ext = cmd,0,[Logic_const.new_predicate kfs] in @@ -68,8 +68,8 @@ let get_called_kf (p : identified_predicate) : kernel_function list = try match p.ip_content with - | Pseparated ts -> List.map get_call ts - | _ -> raise Not_found + | Pseparated ts -> List.map get_call ts + | _ -> raise Not_found with Not_found -> let source = fst p.ip_loc in Wp_parameters.failure ~source "Calls annotation not well-formed" ; [] @@ -79,11 +79,11 @@ (fun bhv calls -> let fs = ref [] in List.iter - (function - | cmd,_,ps when cmd = ecmd -> - List.iter (fun p -> fs := !fs @ get_called_kf p) ps - | _ -> ()) - bhv.b_extended ; + (function + | cmd,_,ps when cmd = ecmd -> + List.iter (fun p -> fs := !fs @ get_called_kf p) ps + | _ -> ()) + bhv.b_extended ; let fs = !fs in if fs <> [] then (bhv.b_name , fs) :: calls else calls ) bhvs [] @@ -122,63 +122,63 @@ let dkey = Wp_parameters.register_category "calls" class dyncall = -object(self) - inherit Visitor.frama_c_inplace + object(self) + inherit Visitor.frama_c_inplace - val mutable count = 0 - val mutable scope = [] + val mutable count = 0 + val mutable scope = [] - method count = count + method count = count - method private stmt = - match self#current_stmt with None -> assert false | Some stmt -> stmt - - method! vfunc _ = - scope <- [] ; - DoChildren - - method! vspec spec = - let calls = get_calls "wp:calls" spec.spec_behavior in - if calls <> [] && scope <> [] then - List.iter - (fun stmt -> - count <- succ count ; - List.iter - (fun (bhv,kfs) -> - begin - if Wp_parameters.has_dkey "calls" then - let source = snd (Stmt.loc stmt) in - if Cil.default_behavior_name = bhv then - Wp_parameters.result ~source - "@[Calls%a@]" pp_calls kfs - else - Wp_parameters.result ~source - "@[Calls (for %s)%a@]" bhv pp_calls kfs - end ; - CallPoints.add (bhv,stmt) kfs - ) calls - ) scope ; - scope <- [] ; - let calls = get_calls "wp:instanceof" spec.spec_behavior in - if calls <> [] then - begin - match self#current_kf with None -> () | Some kf -> - List.iter - (fun (bhv,kfs) -> - Wp_parameters.result - "@[%a for %s instance of%a" - Kernel_function.pretty kf bhv pp_calls kfs) - calls - end ; - DoChildren - - method! vinst = function - | Call( _ , fct , _ , _ ) when Kernel_function.get_called fct = None -> - scope <- self#stmt :: scope ; - SkipChildren - | _ -> SkipChildren + method private stmt = + match self#current_stmt with None -> assert false | Some stmt -> stmt + + method! vfunc _ = + scope <- [] ; + DoChildren + + method! vspec spec = + let calls = get_calls "wp:calls" spec.spec_behavior in + if calls <> [] && scope <> [] then + List.iter + (fun stmt -> + count <- succ count ; + List.iter + (fun (bhv,kfs) -> + begin + if Wp_parameters.has_dkey "calls" then + let source = snd (Stmt.loc stmt) in + if Cil.default_behavior_name = bhv then + Wp_parameters.result ~source + "@[Calls%a@]" pp_calls kfs + else + Wp_parameters.result ~source + "@[Calls (for %s)%a@]" bhv pp_calls kfs + end ; + CallPoints.add (bhv,stmt) kfs + ) calls + ) scope ; + scope <- [] ; + let calls = get_calls "wp:instanceof" spec.spec_behavior in + if calls <> [] then + begin + match self#current_kf with None -> () | Some kf -> + List.iter + (fun (bhv,kfs) -> + Wp_parameters.result + "@[%a for %s instance of%a" + Kernel_function.pretty kf bhv pp_calls kfs) + calls + end ; + DoChildren + + method! vinst = function + | Call( _ , fct , _ , _ ) when Kernel_function.get_called fct = None -> + scope <- self#stmt :: scope ; + SkipChildren + | _ -> SkipChildren -end + end let once = ref false @@ -191,9 +191,9 @@ Visitor .visitFramacFile (d :> Visitor.frama_c_visitor) (Ast.get()) ; let n = d#count in if n > 0 then - Wp_parameters.feedback "Dynamic call(s): %d." n + Wp_parameters.feedback "Dynamic call(s): %d." n else - Wp_parameters.feedback "No dynamic call." + Wp_parameters.feedback "No dynamic call." end (* -------------------------------------------------------------------------- *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/dyncall.mli frama-c-20150201+sodium+dfsg/src/wp/dyncall.mli --- frama-c-20140301+neon+dfsg/src/wp/dyncall.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/dyncall.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -26,12 +26,12 @@ val property : kf:kernel_function -> ?bhv:string -> stmt:stmt -> calls:kernel_function list -> Property.t - (** Returns an property identifier for the precondition. *) - +(** Returns an property identifier for the precondition. *) + val get : ?bhv:string -> stmt -> kernel_function list - (** Returns empty list if there is no specified dynamic call. *) - +(** Returns empty list if there is no specified dynamic call. *) + val compute : unit -> unit - (** Forces computation of dynamic calls. - Otherwize, they are computed lazily on [get]. - Requires [-wp-dynamic]. *) +(** Forces computation of dynamic calls. + Otherwize, they are computed lazily on [get]. + Requires [-wp-dynamic]. *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Factory.ml frama-c-20150201+sodium+dfsg/src/wp/Factory.ml --- frama-c-20140301+neon+dfsg/src/wp/Factory.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Factory.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -136,11 +136,11 @@ let wp (s:setup) : Model.t -> Generator.computer = match s.mheap , s.mvar with - | Hoare , (Raw|Var) -> WP_HoareVar.create - | Hoare , Ref -> WP_HoareRef.create - | Typed _ , Raw -> WP_TypedRaw.create - | Typed _ , Var -> WP_TypedVar.create - | Typed _ , Ref -> WP_TypedRef.create + | Hoare , (Raw|Var) -> WP_HoareVar.create + | Hoare , Ref -> WP_HoareRef.create + | Typed _ , Raw -> WP_TypedRaw.create + | Typed _ , Var -> WP_TypedVar.create + | Typed _ , Ref -> WP_TypedRef.create (* -------------------------------------------------------------------------- *) (* --- Tuning --- *) @@ -163,12 +163,12 @@ (* -------------------------------------------------------------------------- *) module MODEL = FCMap.Make - (struct - type t = setup * driver - let compare (s,d) (s',d') = - let cmp = Pervasives.compare s s' in - if cmp <> 0 then cmp else LogicBuiltins.compare d d' - end) + (struct + type t = setup * driver + let compare (s,d) (s',d') = + let cmp = Pervasives.compare s s' in + if cmp <> 0 then cmp else LogicBuiltins.compare d d' + end) type instance = { model : Model.t ; @@ -185,13 +185,13 @@ let id,descr = if LogicBuiltins.is_default d then id,descr else - ( id ^ "_" ^ LogicBuiltins.id d , - descr ^ " (Driver " ^ LogicBuiltins.descr d ^ ")" ) + ( id ^ "_" ^ LogicBuiltins.id d , + descr ^ " (Driver " ^ LogicBuiltins.descr d ^ ")" ) in let model = Model.register ~id ~descr ~tuning () in let instance = { model = model ; driver = d } in instances := MODEL.add (s,d) instance !instances ; instance - + let ident s = fst (descr s) let descr s = snd (descr s) let computer (s:setup) (d:driver) = wp s (instance s d).model @@ -202,17 +202,17 @@ let flush () = if Buffer.length buffer > 0 then begin - tk := !tk @ [Buffer.contents buffer] ; - Buffer.clear buffer ; + tk := !tk @ [Buffer.contents buffer] ; + Buffer.clear buffer ; end in String.iter (fun c -> match c with - | 'A' .. 'Z' -> Buffer.add_char buffer c - | '_' | ',' | '@' | '+' | ' ' | '\t' | '\n' | '(' | ')' -> flush () - | _ -> Wp_parameters.error - "In model spec %S : unexpected character '%c'" m c + | 'A' .. 'Z' -> Buffer.add_char buffer c + | '_' | ',' | '@' | '+' | ' ' | '\t' | '\n' | '(' | ')' -> flush () + | _ -> Wp_parameters.error + "In model spec %S : unexpected character '%c'" m c ) (String.uppercase m) ; flush () ; !tk @@ -229,14 +229,14 @@ | "REAL" -> { s with cfloat = Cfloat.Real } | "FLOAT" | "CFLOAT" -> { s with cfloat = Cfloat.Float } | t -> Wp_parameters.error - "In model spec %S : unknown '%s' selector@." m t ; s + "In model spec %S : unknown '%s' selector@." m t ; s let apply_config (s:setup) m : setup = List.fold_left (update_config m) s (split m) let parse = List.fold_left apply_config { - mheap = Typed MemTyped.Fits ; - mvar = Var ; - cint = Cint.Natural ; - cfloat = Cfloat.Real ; -} + mheap = Typed MemTyped.Fits ; + mvar = Var ; + cint = Cint.Natural ; + cfloat = Cfloat.Real ; + } diff -Nru frama-c-20140301+neon+dfsg/src/wp/Factory.mli frama-c-20150201+sodium+dfsg/src/wp/Factory.mli --- frama-c-20140301+neon+dfsg/src/wp/Factory.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Factory.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Fixpoint.ml frama-c-20150201+sodium+dfsg/src/wp/Fixpoint.ml --- frama-c-20140301+neon+dfsg/src/wp/Fixpoint.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Fixpoint.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -91,11 +91,11 @@ let y = var.(x) in if y != 0 then y else begin - var.(x) <- x ; - r.join <- map (visit sys var) r.join ; - if r.fct = [] then - match r.join with [e] -> var.(x) <- e ; e | _ -> x - else x + var.(x) <- x ; + r.join <- map (visit sys var) r.join ; + if r.fct = [] then + match r.join with [e] -> var.(x) <- e ; e | _ -> x + else x end let rec id var x = @@ -134,7 +134,7 @@ type fixpoint = D.t array let get = Array.get - + let fixpoint ~system ~root ~timeout = let size = Vector.size system in let var = Array.create size 0 in @@ -142,10 +142,10 @@ let deps = Array.create size [] in for x = 0 to size-1 do if var.(x) == x then - let r = Vector.get system x in - let depx = depend var deps x in - r.join <- List.map depx r.join ; - r.fct <- List.map (fmap depx) r.fct ; + let r = Vector.get system x in + let depx = depend var deps x in + r.join <- List.map depx r.join ; + r.fct <- List.map (fmap depx) r.fct ; done ; let succ f e = List.iter f deps.(e) in let root = id var root in @@ -157,5 +157,5 @@ (fun x y -> if x!=y then domain.(x) <- domain.(y)) var ; domain - + end diff -Nru frama-c-20140301+neon+dfsg/src/wp/Fixpoint.mli frama-c-20150201+sodium+dfsg/src/wp/Fixpoint.mli --- frama-c-20140301+neon+dfsg/src/wp/Fixpoint.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Fixpoint.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Generator.ml frama-c-20150201+sodium+dfsg/src/wp/Generator.ml --- frama-c-20140301+neon+dfsg/src/wp/Generator.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Generator.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -25,12 +25,12 @@ (* -------------------------------------------------------------------------- *) class type computer = -object - method lemma : bool - method add_strategy : WpStrategy.strategy -> unit - method add_lemma : LogicUsage.logic_lemma -> unit - method compute : Wpo.t Bag.t -end + object + method lemma : bool + method add_strategy : WpStrategy.strategy -> unit + method add_lemma : LogicUsage.logic_lemma -> unit + method compute : Wpo.t Bag.t + end (* -------------------------------------------------------------------------- *) (* --- Property Entry Point --- *) @@ -38,40 +38,43 @@ let compute_ip cc ip = match ip with - | Property.IPLemma _ - | Property.IPAxiomatic _ - -> - let rec iter cc = function - | Property.IPLemma(name,_,_,_,_) -> cc#add_lemma (LogicUsage.logic_lemma name) - | Property.IPAxiomatic(_,ips) -> List.iter (iter cc) ips - | _ -> () - in iter cc ip ; - cc#compute - - | Property.IPBehavior (kf,_,b) -> + | Property.IPLemma _ + | Property.IPAxiomatic _ + -> + let rec iter cc = function + | Property.IPLemma(name,_,_,_,_) -> cc#add_lemma (LogicUsage.logic_lemma name) + | Property.IPAxiomatic(_,ips) -> List.iter (iter cc) ips + | _ -> () + in iter cc ip ; + cc#compute + + | Property.IPBehavior (kf,_,b) -> let bhv = [b.Cil_types.b_name] in List.iter cc#add_strategy - (WpAnnot.get_function_strategies ~assigns:WpAnnot.WithAssigns ~bhv kf) ; + (WpAnnot.get_function_strategies ~assigns:WpAnnot.WithAssigns ~bhv kf) ; cc#compute - | Property.IPComplete _ - | Property.IPDisjoint _ - | Property.IPCodeAnnot _ - | Property.IPAllocation _ - | Property.IPAssigns _ - | Property.IPDecrease _ - | Property.IPPredicate _ - -> - List.iter cc#add_strategy - (WpAnnot.get_id_prop_strategies ~assigns:WpAnnot.WithAssigns ip) ; - cc#compute - - | Property.IPFrom _ - | Property.IPAxiom _ - | Property.IPReachable _ - | Property.IPOther _ - -> - Wp_parameters.result "Nothing to compute for '%a'" Property.pretty ip ; - Bag.empty + | Property.IPComplete _ + | Property.IPDisjoint _ + | Property.IPCodeAnnot _ + | Property.IPAllocation _ + | Property.IPAssigns _ + | Property.IPDecrease _ + | Property.IPPredicate _ + -> + List.iter cc#add_strategy + (WpAnnot.get_id_prop_strategies ~assigns:WpAnnot.WithAssigns ip) ; + cc#compute + + | Property.IPFrom _ + | Property.IPAxiom _ + | Property.IPReachable _ + | Property.IPPropertyInstance _ + | Property.IPOther _ + | Property.IPTypeInvariant _ + | Property.IPGlobalInvariant _ + -> + Wp_parameters.result "Nothing to compute for '%a'" Property.pretty ip ; + Bag.empty (* -------------------------------------------------------------------------- *) (* --- Annotations Entry Point --- *) @@ -89,16 +92,16 @@ let iter_fct phi = function | F_All -> Globals.Functions.iter phi | F_Skip fs -> Globals.Functions.iter - (fun kf -> - let f = Kernel_function.get_name kf in - if not (List.mem f fs) then phi kf) + (fun kf -> + let f = Kernel_function.get_name kf in + if not (List.mem f fs) then phi kf) | F_List fs -> List.iter - (fun f -> - try phi (Globals.Functions.find_by_name f) - with Not_found -> - Wp_parameters.error "Unknown function '%s' (skipped)" f - ) fs - + (fun f -> + try phi (Globals.Functions.find_by_name f) + with Not_found -> + Wp_parameters.error "Unknown function '%s' (skipped)" f + ) fs + let add_kf cc ?bhv ?prop kf = List.iter cc#add_strategy (WpAnnot.get_function_strategies ~assigns:WpAnnot.WithAssigns ?bhv ?prop kf) @@ -115,19 +118,19 @@ begin if do_lemmas fct then begin - match prop with - | None | Some[] -> - LogicUsage.iter_lemmas - (fun lem -> - let idp = WpPropId.mk_lemma_id lem in - if WpAnnot.filter_status idp then cc#add_lemma lem) - | Some ps -> - if List.mem "-@lemmas" ps then () - else LogicUsage.iter_lemmas - (fun lem -> - let idp = WpPropId.mk_lemma_id lem in - if WpAnnot.filter_status idp && WpPropId.select_by_name ps idp - then cc#add_lemma lem) + match prop with + | None | Some[] -> + LogicUsage.iter_lemmas + (fun lem -> + let idp = WpPropId.mk_lemma_id lem in + if WpAnnot.filter_status idp then cc#add_lemma lem) + | Some ps -> + if List.mem "-@lemmas" ps then () + else LogicUsage.iter_lemmas + (fun lem -> + let idp = WpPropId.mk_lemma_id lem in + if WpAnnot.filter_status idp && WpPropId.select_by_name ps idp + then cc#add_lemma lem) end ; iter_fct (add_kf cc ?bhv ?prop) fct ; cc#compute diff -Nru frama-c-20140301+neon+dfsg/src/wp/Generator.mli frama-c-20150201+sodium+dfsg/src/wp/Generator.mli --- frama-c-20140301+neon+dfsg/src/wp/Generator.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Generator.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -25,12 +25,12 @@ (* -------------------------------------------------------------------------- *) class type computer = -object - method lemma : bool - method add_strategy : WpStrategy.strategy -> unit - method add_lemma : LogicUsage.logic_lemma -> unit - method compute : Wpo.t Bag.t -end + object + method lemma : bool + method add_strategy : WpStrategy.strategy -> unit + method add_lemma : LogicUsage.logic_lemma -> unit + method compute : Wpo.t Bag.t + end type functions = | F_All diff -Nru frama-c-20140301+neon+dfsg/src/wp/GuiConfig.ml frama-c-20150201+sodium+dfsg/src/wp/GuiConfig.ml --- frama-c-20140301+neon+dfsg/src/wp/GuiConfig.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/GuiConfig.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -21,117 +21,117 @@ (**************************************************************************) open ProverWhy3 - + (* ------------------------------------------------------------------------ *) (* --- Prover List in Configuration --- *) (* ------------------------------------------------------------------------ *) class provers config = -object(self) - inherit [dp list] Toolbox.selector [] - - method private load () = - let open Gtk_helper.Configuration in - let rec collect w = function - | ConfString s -> ProverWhy3.parse s :: w - | ConfList fs -> List.fold_left collect w fs - | _ -> w in - try - let data = Gtk_helper.Configuration.find config in - self#set (List.rev (collect [] data)) - with Not_found -> () - - method private save () = - let open Gtk_helper.Configuration in - Gtk_helper.Configuration.set config - (ConfList (List.map (fun dp -> ConfString dp.dp_prover) self#get)) - - initializer - begin - self#load () ; - self#on_event self#save ; - end + object(self) + inherit [dp list] Toolbox.selector [] + + method private load () = + let open Gtk_helper.Configuration in + let rec collect w = function + | ConfString s -> ProverWhy3.parse s :: w + | ConfList fs -> List.fold_left collect w fs + | _ -> w in + try + let data = Gtk_helper.Configuration.find config in + self#set (List.rev (collect [] data)) + with Not_found -> () + + method private save () = + let open Gtk_helper.Configuration in + Gtk_helper.Configuration.set config + (ConfList (List.map (fun dp -> ConfString dp.dp_prover) self#get)) + + initializer + begin + self#load () ; + self#on_event self#save ; + end -end + end (* ------------------------------------------------------------------------ *) (* --- WP Provers Configuration Panel --- *) (* ------------------------------------------------------------------------ *) class dp_chooser - ~(main:Design.main_window_extension_points) - ~(available:provers) - ~(enabled:provers) + ~(main:Design.main_window_extension_points) + ~(available:provers) + ~(enabled:provers) = let dialog = new Toolbox.dialog ~title:"Why3 Provers" ~window:main#main_window ~resize:false () in let array = new Toolbox.warray () in -object(self) - - val mutable provers = [] - - method private enable dp e = - let rec hook dp e = function - | [] -> [dp,e] - | head :: tail -> - if fst head = dp then (dp,e) :: tail - else head :: hook dp e tail - in provers <- hook dp e provers - - method private lookup dp = - try List.assoc dp provers - with Not_found -> false - - method private entry dp = - let text = Printf.sprintf "%s (%s)" dp.dp_name dp.dp_version in - let sw = new Toolbox.switchbox () in - let lb = new Toolbox.label ~align:`Left ~text () in - sw#set (self#lookup dp) ; - sw#connect (self#enable dp) ; - let hbox = GPack.hbox ~spacing:10 ~homogeneous:false () in - hbox#pack ~expand:false sw#coerce ; - hbox#pack ~expand:true lb#coerce ; - (object - method widget = hbox#coerce - method update () = sw#set (self#lookup dp) - method delete () = () - end) - - method private configure dps = - begin - available#set dps ; - array#set dps ; - provers <- List.map (fun dp -> dp , self#lookup dp) dps ; - array#update () ; - end + object(self) + + val mutable provers = [] - method private detect () = ProverWhy3.detect_provers self#configure + method private enable dp e = + let rec hook dp e = function + | [] -> [dp,e] + | head :: tail -> + if fst head = dp then (dp,e) :: tail + else head :: hook dp e tail + in provers <- hook dp e provers + + method private lookup dp = + try List.assoc dp provers + with Not_found -> false + + method private entry dp = + let text = Printf.sprintf "%s (%s)" dp.dp_name dp.dp_version in + let sw = new Toolbox.switchbox () in + let lb = new Toolbox.label ~align:`Left ~text () in + sw#set (self#lookup dp) ; + sw#connect (self#enable dp) ; + let hbox = GPack.hbox ~spacing:10 ~homogeneous:false () in + hbox#pack ~expand:false sw#coerce ; + hbox#pack ~expand:true lb#coerce ; + (object + method widget = hbox#coerce + method update () = sw#set (self#lookup dp) + method delete () = () + end) + + method private configure dps = + begin + available#set dps ; + array#set dps ; + provers <- List.map (fun dp -> dp , self#lookup dp) dps ; + array#update () ; + end + + method private detect () = ProverWhy3.detect_provers self#configure + + method private select () = + let dps = List.fold_right + (fun (dp,e) dps -> if e then dp :: dps else dps) + provers [] + in enabled#set dps + + method run () = + available#send self#configure () ; + List.iter (fun dp -> self#enable dp true) enabled#get ; + array#update () ; + dialog#run () - method private select () = - let dps = List.fold_right - (fun (dp,e) dps -> if e then dp :: dps else dps) - provers [] - in enabled#set dps - - method run () = - available#send self#configure () ; - List.iter (fun dp -> self#enable dp true) enabled#get ; - array#update () ; - dialog#run () - - initializer - begin - dialog#button ~action:(`ACTION self#detect) ~label:"Detect Provers" () ; - dialog#button ~action:(`CANCEL) ~label:"Cancel" () ; - dialog#button ~action:(`APPLY) ~label:"Apply" () ; - array#create self#entry ; - dialog#add_block array#coerce ; - dialog#on_value `APPLY self#select ; - end + initializer + begin + dialog#button ~action:(`ACTION self#detect) ~label:"Detect Provers" () ; + dialog#button ~action:(`CANCEL) ~label:"Cancel" () ; + dialog#button ~action:(`APPLY) ~label:"Apply" () ; + array#create self#entry ; + dialog#add_block array#coerce ; + dialog#on_value `APPLY self#select ; + end -end + end (* ------------------------------------------------------------------------ *) (* --- WP Prover Switch Panel --- *) @@ -154,68 +154,68 @@ in let items = [ NoProver ; AltErgo ; Coq ; Why3ide ] in let button = new Toolbox.menulist ~default:AltErgo ~render ~items () in -object(self) - method coerce = button#coerce - method set_enabled = button#set_enabled + object(self) + method coerce = button#coerce + method set_enabled = button#set_enabled + + method private import = + match Wp_parameters.Provers.get () with + | [] -> () + | spec :: _ -> + match VCS.prover_of_name spec with + | Some (VCS.Why3 p) -> + let dps = available#get in + let dp = ProverWhy3.find p dps in + if not (List.mem dp dps) then available#set (dps @ [dp]) ; + let en = dp :: enabled#get in + enabled#set + (List.filter (fun q -> List.mem q en) available#get) + | _ -> () + + method private set_provers dps = + button#set_items (items @ List.map (fun dp -> Why3 dp) dps) + + method private get_selection = function + | NoProver -> "none" + | AltErgo -> "alt-ergo" + | Coq -> "coqide" + | Why3ide -> "why3ide" + | Why3 dp -> "why3:" ^ dp.dp_prover - method private import = - match Wp_parameters.Provers.get () with + method private set_selection = function | [] -> () | spec :: _ -> - match VCS.prover_of_name spec with - | Some (VCS.Why3 p) -> - let dps = available#get in - let dp = ProverWhy3.find p dps in - if not (List.mem dp dps) then available#set (dps @ [dp]) ; - let en = dp :: enabled#get in - enabled#set - (List.filter (fun q -> List.mem q en) available#get) - | _ -> () - - method private set_provers dps = - button#set_items (items @ List.map (fun dp -> Why3 dp) dps) - - method private get_selection = function - | NoProver -> "none" - | AltErgo -> "alt-ergo" - | Coq -> "coqide" - | Why3ide -> "why3ide" - | Why3 dp -> "why3:" ^ dp.dp_prover - - method private set_selection = function - | [] -> () - | spec :: _ -> - match VCS.prover_of_name spec with - | None | Some VCS.Qed -> button#set NoProver - | Some VCS.AltErgo -> button#set AltErgo - | Some VCS.Coq -> button#set Coq - | Some VCS.Why3ide -> button#set Why3ide - | Some (VCS.Why3 spec) -> - let dp = ProverWhy3.find spec enabled#get in - button#set (Why3 dp) - - val mutable last = [] - val mutable init = true - - method update () = - begin - if init then self#import ; - let current = Wp_parameters.Provers.get () in - if current <> last then - self#set_selection (Wp_parameters.Provers.get ()) ; - last <- current ; - if init then - begin - self#set_provers enabled#get ; - enabled#connect self#set_provers ; - init <- false ; - end - end - - initializer - begin - button#connect - (fun mp -> Wp_parameters.Provers.set [self#get_selection mp]) ; - end + match VCS.prover_of_name spec with + | None | Some VCS.Qed -> button#set NoProver + | Some VCS.AltErgo -> button#set AltErgo + | Some VCS.Coq -> button#set Coq + | Some VCS.Why3ide -> button#set Why3ide + | Some (VCS.Why3 spec) -> + let dp = ProverWhy3.find spec enabled#get in + button#set (Why3 dp) + + val mutable last = [] + val mutable init = true + + method update () = + begin + if init then self#import ; + let current = Wp_parameters.Provers.get () in + if current <> last then + self#set_selection (Wp_parameters.Provers.get ()) ; + last <- current ; + if init then + begin + self#set_provers enabled#get ; + enabled#connect self#set_provers ; + init <- false ; + end + end + + initializer + begin + button#connect + (fun mp -> Wp_parameters.Provers.set [self#get_selection mp]) ; + end -end + end diff -Nru frama-c-20140301+neon+dfsg/src/wp/GuiConfig.mli frama-c-20150201+sodium+dfsg/src/wp/GuiConfig.mli --- frama-c-20140301+neon+dfsg/src/wp/GuiConfig.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/GuiConfig.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -32,14 +32,14 @@ main:Design.main_window_extension_points -> available:provers -> enabled:provers -> -object - method run : unit -> unit (** Edit enabled provers *) -end + object + method run : unit -> unit (** Edit enabled provers *) + end class dp_button : available:provers -> enabled:provers -> -object - inherit Toolbox.widget - method update : unit -> unit -end + object + inherit Toolbox.widget + method update : unit -> unit + end diff -Nru frama-c-20140301+neon+dfsg/src/wp/GuiGoal.ml frama-c-20150201+sodium+dfsg/src/wp/GuiGoal.ml --- frama-c-20140301+neon+dfsg/src/wp/GuiGoal.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/GuiGoal.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -45,77 +45,77 @@ class prover prv = let label = VCS.name_of_prover prv in let button = new Toolbox.button ~label () in -object(self) - val mutable state = PS_nogoal - val mutable run = (fun _ _ -> ()) - val mutable log = (fun _ _ -> ()) - method widget = (button :> Toolbox.widget) - method set_display = function - | DSP_nogoal -> - begin - state <- PS_nogoal ; - button#set_relief false ; - button#set_icon None ; - button#set_enabled false ; - end - | DSP_goal (w,p) -> - button#set_enabled true ; - let v = (Wpo.get_result w prv).VCS.verdict in - begin - match v with - | VCS.NoResult -> - begin - state <- PS_click_to_play w ; - button#set_relief true ; - button#set_icon (Some `MEDIA_PLAY) ; - end - | VCS.Computing kill -> - let me = match p with None -> false | Some p -> p=prv in - if me then - begin - state <- PS_click_to_stop(w,kill) ; - button#set_relief true ; - button#set_icon (Some `MEDIA_STOP) ; - end - else - begin - state <- PS_click_to_log w ; - button#set_relief false ; - button#set_icon (Some `EXECUTE) ; - end - | _ -> - let me = match p with None -> false | Some p -> p=prv in - if me then - begin - state <- PS_click_to_play w ; - button#set_relief true ; - button#set_icon (Some (icon v)) ; - end - else - begin - state <- PS_click_to_log w ; - button#set_relief false ; - button#set_icon (Some (icon v)) ; - end - - end - - method on_run f = run <- f - method on_log f = log <- f - - method click = match state with - | PS_nogoal -> () - | PS_click_to_log w -> log w prv - | PS_click_to_play w -> run w prv - | PS_click_to_stop(w,kill) -> kill () ; log w prv - - initializer - begin - self#set_display DSP_nogoal ; - button#connect (fun () -> self#click) ; - end + object(self) + val mutable state = PS_nogoal + val mutable run = (fun _ _ -> ()) + val mutable log = (fun _ _ -> ()) + method widget = (button :> Toolbox.widget) + method set_display = function + | DSP_nogoal -> + begin + state <- PS_nogoal ; + button#set_relief false ; + button#set_icon None ; + button#set_enabled false ; + end + | DSP_goal (w,p) -> + button#set_enabled true ; + let v = (Wpo.get_result w prv).VCS.verdict in + begin + match v with + | VCS.NoResult -> + begin + state <- PS_click_to_play w ; + button#set_relief true ; + button#set_icon (Some `MEDIA_PLAY) ; + end + | VCS.Computing kill -> + let me = match p with None -> false | Some p -> p=prv in + if me then + begin + state <- PS_click_to_stop(w,kill) ; + button#set_relief true ; + button#set_icon (Some `MEDIA_STOP) ; + end + else + begin + state <- PS_click_to_log w ; + button#set_relief false ; + button#set_icon (Some `EXECUTE) ; + end + | _ -> + let me = match p with None -> false | Some p -> p=prv in + if me then + begin + state <- PS_click_to_play w ; + button#set_relief true ; + button#set_icon (Some (icon v)) ; + end + else + begin + state <- PS_click_to_log w ; + button#set_relief false ; + button#set_icon (Some (icon v)) ; + end + + end + + method on_run f = run <- f + method on_log f = log <- f + + method click = match state with + | PS_nogoal -> () + | PS_click_to_log w -> log w prv + | PS_click_to_play w -> run w prv + | PS_click_to_stop(w,kill) -> kill () ; log w prv + + initializer + begin + self#set_display DSP_nogoal ; + button#connect (fun () -> self#click) ; + end -end + end class pane () = let goal = new Toolbox.button ~tooltip:"Proof Obligation" ~icon:`FILE () in @@ -124,76 +124,76 @@ let hbox = GPack.hbox ~show:true () in let vbox = GPack.vbox ~show:true () in let provers = List.map (new prover) - [VCS.AltErgo ; VCS.Coq ; VCS.Why3ide] in -object(self) - - val mutable state = DSP_nogoal - val mutable run = fun _ _ -> () - val mutable src = fun (_:Wpo.t option) -> () - - initializer - begin - hbox#pack ~expand:false goal#coerce ; - hbox#pack ~padding:3 ~expand:true ~fill:true title#coerce ; - let tabs = List.map (fun p -> p#widget) provers in - let rack = new Toolbox.rack tabs in - hbox#pack ~expand:false rack#coerce ; - vbox#pack ~expand:false hbox#coerce ; - vbox#pack ~expand:true ~fill:true text#coerce ; - (* Connections *) - goal#connect (fun () -> self#goal) ; - List.iter (fun p -> p#on_log self#log) provers ; - List.iter (fun p -> p#on_run self#run) provers ; - end + [VCS.AltErgo ; VCS.Coq ; VCS.Why3ide] in + object(self) - method private goal = - match state with + val mutable state = DSP_nogoal + val mutable run = fun _ _ -> () + val mutable src = fun (_:Wpo.t option) -> () + + initializer + begin + hbox#pack ~expand:false goal#coerce ; + hbox#pack ~padding:3 ~expand:true ~fill:true title#coerce ; + let tabs = List.map (fun p -> p#widget) provers in + let rack = new Toolbox.rack tabs in + hbox#pack ~expand:false rack#coerce ; + vbox#pack ~expand:false hbox#coerce ; + vbox#pack ~expand:true ~fill:true text#coerce ; + (* Connections *) + goal#connect (fun () -> self#goal) ; + List.iter (fun p -> p#on_log self#log) provers ; + List.iter (fun p -> p#on_run self#run) provers ; + end + + method private goal = + match state with | DSP_nogoal | DSP_goal(_,None) -> () | DSP_goal(w,Some _) -> state <- DSP_goal(w,None) ; self#update - method private log w p = - begin - state <- DSP_goal(w,Some p) ; - self#update ; - end - - method private run w p = - begin - state <- DSP_goal(w,Some p) ; - run w p ; - self#update ; - end - - method on_run f = run <- f - method on_src f = src <- f - - method select = function - | None -> state <- DSP_nogoal ; self#update - | Some w -> state <- DSP_goal(w,None) ; self#update - - method update = - text#clear ; - begin - List.iter (fun p -> p#set_display state) provers ; - match state with - | DSP_nogoal -> - begin - title#set_text "No Goal" ; - end - | DSP_goal(w,None) -> - begin - title#set_text (Pretty_utils.to_string Wpo.pp_title w) ; - Wpo.pp_goal text#fmt w ; - Format.pp_print_flush text#fmt () ; - end - | DSP_goal(w,Some p) -> - begin - title#set_text (Pretty_utils.to_string Wpo.pp_title w) ; - Wpo.pp_logfile text#fmt w p ; - Format.pp_print_flush text#fmt () ; - end - end - - method coerce = vbox#coerce + method private log w p = + begin + state <- DSP_goal(w,Some p) ; + self#update ; + end + + method private run w p = + begin + state <- DSP_goal(w,Some p) ; + run w p ; + self#update ; + end + + method on_run f = run <- f + method on_src f = src <- f + + method select = function + | None -> state <- DSP_nogoal ; self#update + | Some w -> state <- DSP_goal(w,None) ; self#update + + method update = + text#clear ; + begin + List.iter (fun p -> p#set_display state) provers ; + match state with + | DSP_nogoal -> + begin + title#set_text "No Goal" ; + end + | DSP_goal(w,None) -> + begin + title#set_text (Pretty_utils.to_string Wpo.pp_title w) ; + Wpo.pp_goal text#fmt w ; + Format.pp_print_flush text#fmt () ; + end + | DSP_goal(w,Some p) -> + begin + title#set_text (Pretty_utils.to_string Wpo.pp_title w) ; + Wpo.pp_logfile text#fmt w p ; + Format.pp_print_flush text#fmt () ; + end + end + + method coerce = vbox#coerce -end + end diff -Nru frama-c-20140301+neon+dfsg/src/wp/GuiGoal.mli frama-c-20150201+sodium+dfsg/src/wp/GuiGoal.mli --- frama-c-20140301+neon+dfsg/src/wp/GuiGoal.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/GuiGoal.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -25,12 +25,12 @@ (* -------------------------------------------------------------------------- *) class pane : unit -> -object + object - method select : Wpo.t option -> unit - method update : unit - method coerce : GObj.widget - method on_run : (Wpo.t -> VCS.prover -> unit) -> unit - method on_src : (Wpo.t option -> unit) -> unit - -end + method select : Wpo.t option -> unit + method update : unit + method coerce : GObj.widget + method on_run : (Wpo.t -> VCS.prover -> unit) -> unit + method on_src : (Wpo.t option -> unit) -> unit + + end diff -Nru frama-c-20140301+neon+dfsg/src/wp/GuiList.ml frama-c-20150201+sodium+dfsg/src/wp/GuiList.ml --- frama-c-20140301+neon+dfsg/src/wp/GuiList.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/GuiList.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/GuiList.mli frama-c-20150201+sodium+dfsg/src/wp/GuiList.mli --- frama-c-20140301+neon+dfsg/src/wp/GuiList.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/GuiList.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -25,22 +25,22 @@ (* -------------------------------------------------------------------------- *) class pane : GuiConfig.provers -> -object + object - method show : Wpo.t -> unit - method on_click : (Wpo.t -> VCS.prover option -> unit) -> unit - method on_right_click : (Wpo.t -> VCS.prover option -> unit) -> unit - method on_double_click : (Wpo.t -> VCS.prover option -> unit) -> unit - method reload : unit - method update : Wpo.t -> unit - method update_all : unit - method count_selected : int - method on_selection : (int -> unit) -> unit - method iter_selected : (Wpo.t -> unit) -> unit - method add : Wpo.t -> unit - method size : int - method index : Wpo.t -> int - method get : int -> Wpo.t - method coerce : GObj.widget + method show : Wpo.t -> unit + method on_click : (Wpo.t -> VCS.prover option -> unit) -> unit + method on_right_click : (Wpo.t -> VCS.prover option -> unit) -> unit + method on_double_click : (Wpo.t -> VCS.prover option -> unit) -> unit + method reload : unit + method update : Wpo.t -> unit + method update_all : unit + method count_selected : int + method on_selection : (int -> unit) -> unit + method iter_selected : (Wpo.t -> unit) -> unit + method add : Wpo.t -> unit + method size : int + method index : Wpo.t -> int + method get : int -> Wpo.t + method coerce : GObj.widget -end + end diff -Nru frama-c-20140301+neon+dfsg/src/wp/GuiNavigator.ml frama-c-20150201+sodium+dfsg/src/wp/GuiNavigator.ml --- frama-c-20140301+neon+dfsg/src/wp/GuiNavigator.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/GuiNavigator.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -264,12 +264,12 @@ match popup_target with | Some(w,Some p) -> (popup_target <- None ; self#prove ~mode w p) | _ -> popup_target <- None - + method private popup_why3ide () = match popup_target with | Some(w,_) -> (popup_target <- None ; self#prove w VCS.Why3ide) | _ -> popup_target <- None - + method private popup_proofmodes popup modes = List.iter (fun (label,mode) -> diff -Nru frama-c-20140301+neon+dfsg/src/wp/GuiNavigator.mli frama-c-20150201+sodium+dfsg/src/wp/GuiNavigator.mli --- frama-c-20140301+neon+dfsg/src/wp/GuiNavigator.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/GuiNavigator.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/GuiPanel.ml frama-c-20150201+sodium+dfsg/src/wp/GuiPanel.ml --- frama-c-20140301+neon+dfsg/src/wp/GuiPanel.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/GuiPanel.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -44,7 +44,7 @@ let name = "GuiSource.Rte_generated" let size = 7 let dependencies = [ Ast.self ] - end) + end) let kf_of_selection = function | S_none -> None @@ -54,32 +54,32 @@ let rte_generated s = match kf_of_selection s with - | None -> false - | Some kf -> - if Wp_parameters.RTE.get () then - let mem = Rte_generated.mem kf in - if not mem then - Rte_generated.add kf () ; - not mem - else false + | None -> false + | Some kf -> + if Wp_parameters.RTE.get () then + let mem = Rte_generated.mem kf in + if not mem then + Rte_generated.add kf () ; + not mem + else false let run_and_prove (main:Design.main_window_extension_points) (selection:GuiSource.selection) - = + = begin try begin - match selection with - | S_none -> raise Stop - | S_fun kf -> Register.wp_compute_kf (Some kf) [] [] - | S_prop ip -> Register.wp_compute_ip ip - | S_call s -> Register.wp_compute_call s.s_stmt + match selection with + | S_none -> raise Stop + | S_fun kf -> Register.wp_compute_kf (Some kf) [] [] + | S_prop ip -> Register.wp_compute_ip ip + | S_call s -> Register.wp_compute_call s.s_stmt end ; if rte_generated selection then - main#redisplay () + main#redisplay () else - reload () + reload () with Stop -> () end @@ -100,63 +100,63 @@ let c_cint = new Toolbox.checkbox ~label:"Machine Integers" () in let c_cfloat = new Toolbox.checkbox ~label:"Floating Points" () in let m_label = new Toolbox.label ~style:`Title () in -object(self) - - initializer - begin - dialog#add_row r_hoare#coerce ; - dialog#add_row r_typed#coerce ; - dialog#add_row c_casts#coerce ; - dialog#add_row c_byref#coerce ; - dialog#add_row c_cint#coerce ; - dialog#add_row c_cfloat#coerce ; - dialog#add_row m_label#coerce ; - dialog#button ~label:"Cancel" ~icon:`CANCEL ~action:(`CANCEL) () ; - dialog#button ~label:"Apply" ~icon:`APPLY ~action:(`APPLY) () ; - memory#on_check TYPED c_casts#set_enabled ; - memory#on_event self#connect ; - c_casts#on_event self#connect ; - c_byref#on_event self#connect ; - c_cint#on_event self#connect ; - c_cfloat#on_event self#connect ; - dialog#on_value `APPLY self#update ; - end - - method update () = Wp_parameters.Model.set [Factory.ident self#get] - - method set (s:setup) = - begin - (match s.mheap with - | Hoare -> memory#set HOARE - | Typed m -> memory#set TYPED ; c_casts#set (m = MemTyped.Unsafe)) ; - c_byref#set (s.mvar = Ref) ; - c_cint#set (s.cint = Cint.Machine) ; - c_cfloat#set (s.cfloat = Cfloat.Float) ; - end - - method get : setup = - let m = match memory#get with - | HOARE -> Hoare - | TYPED -> Typed - (if c_casts#get then MemTyped.Unsafe else MemTyped.Fits) - in { - mheap = m ; - mvar = if c_byref#get then Ref else Var ; - cint = if c_cint#get then Cint.Machine else Cint.Natural ; - cfloat = if c_cfloat#get then Cfloat.Float else Cfloat.Real ; - } - - method connect () = m_label#set_text (Factory.descr self#get) - - method run = - begin - let s = Factory.parse (Wp_parameters.Model.get ()) in - self#set s ; - self#connect () ; - dialog#run () ; - end + object(self) -end + initializer + begin + dialog#add_row r_hoare#coerce ; + dialog#add_row r_typed#coerce ; + dialog#add_row c_casts#coerce ; + dialog#add_row c_byref#coerce ; + dialog#add_row c_cint#coerce ; + dialog#add_row c_cfloat#coerce ; + dialog#add_row m_label#coerce ; + dialog#button ~label:"Cancel" ~icon:`CANCEL ~action:(`CANCEL) () ; + dialog#button ~label:"Apply" ~icon:`APPLY ~action:(`APPLY) () ; + memory#on_check TYPED c_casts#set_enabled ; + memory#on_event self#connect ; + c_casts#on_event self#connect ; + c_byref#on_event self#connect ; + c_cint#on_event self#connect ; + c_cfloat#on_event self#connect ; + dialog#on_value `APPLY self#update ; + end + + method update () = Wp_parameters.Model.set [Factory.ident self#get] + + method set (s:setup) = + begin + (match s.mheap with + | Hoare -> memory#set HOARE + | Typed m -> memory#set TYPED ; c_casts#set (m = MemTyped.Unsafe)) ; + c_byref#set (s.mvar = Ref) ; + c_cint#set (s.cint = Cint.Machine) ; + c_cfloat#set (s.cfloat = Cfloat.Float) ; + end + + method get : setup = + let m = match memory#get with + | HOARE -> Hoare + | TYPED -> Typed + (if c_casts#get then MemTyped.Unsafe else MemTyped.Fits) + in { + mheap = m ; + mvar = if c_byref#get then Ref else Var ; + cint = if c_cint#get then Cint.Machine else Cint.Natural ; + cfloat = if c_cfloat#get then Cfloat.Float else Cfloat.Real ; + } + + method connect () = m_label#set_text (Factory.descr self#get) + + method run = + begin + let s = Factory.parse (Wp_parameters.Model.get ()) in + self#set s ; + self#connect () ; + dialog#run () ; + end + + end (* ------------------------------------------------------------------------ *) (* --- WP Panel --- *) @@ -166,12 +166,12 @@ let wp_script () = let file = GToolbox.select_file - ~title:"Script File for Coq proofs" - ~dir:wp_dir ~filename:"wp.script" () + ~title:"Script File for Coq proofs" + ~dir:wp_dir ~filename:"wp.script" () in match file with - | Some f -> Wp_parameters.Script.set f - | None -> () + | Some f -> Wp_parameters.Script.set f + | None -> () let wp_update_model label () = let s = Factory.parse (Wp_parameters.Model.get ()) in @@ -193,7 +193,7 @@ ~(available_provers:GuiConfig.provers) ~(enabled_provers:GuiConfig.provers) ~(configure_provers:unit -> unit) - = + = let vbox = GPack.vbox () in let demon = Gtk_form.demon () in let packing = vbox#pack in @@ -252,7 +252,7 @@ ~packing:options#pack Wp_parameters.Invariants.get Wp_parameters.Invariants.set demon ; - let control = GPack.table ~columns:4 ~col_spacings:8 ~rows:2 ~packing () in + let control = GPack.table ~columns:2 ~col_spacings:8 ~rows:4 ~packing () in let addcontrol line col w = control#attach ~left:(col-1) ~top:(line-1) ~expand:`NONE w in Gtk_form.label ~text:"Steps" ~packing:(addcontrol 1 1) () ; @@ -261,27 +261,27 @@ ~packing:(addcontrol 1 2) Wp_parameters.Steps.get Wp_parameters.Steps.set demon ; - Gtk_form.label ~text:"Depth" ~packing:(addcontrol 1 3) () ; + Gtk_form.label ~text:"Depth" ~packing:(addcontrol 2 1) () ; Gtk_form.spinner ~lower:0 ~upper:100000 ~tooltip:"Search space bound for alt-ergo prover" - ~packing:(addcontrol 1 4) + ~packing:(addcontrol 2 2) Wp_parameters.Depth.get Wp_parameters.Depth.set demon ; - Gtk_form.label ~text:"Timeout" ~packing:(addcontrol 2 1) () ; + Gtk_form.label ~text:"Timeout" ~packing:(addcontrol 3 1) () ; Gtk_form.spinner ~lower:0 ~upper:100000 ~tooltip:"Timeout for proving one proof obligation" - ~packing:(addcontrol 2 2) + ~packing:(addcontrol 3 2) Wp_parameters.Timeout.get Wp_parameters.Timeout.set demon ; - Gtk_form.label ~text:"Process" ~packing:(addcontrol 2 3) () ; + Gtk_form.label ~text:"Process" ~packing:(addcontrol 4 1) () ; Gtk_form.spinner ~lower:1 ~upper:32 ~tooltip:"Maximum number of parallel running provers" - ~packing:(addcontrol 2 4) + ~packing:(addcontrol 4 2) Wp_parameters.Procs.get (fun n -> Wp_parameters.Procs.set n ; ignore (ProverTask.server ()) - (* to make server procs updated is server exists *) + (* to make server procs updated is server exists *) ) demon ; let pbox = GPack.hbox ~packing ~show:false () in diff -Nru frama-c-20140301+neon+dfsg/src/wp/GuiPanel.mli frama-c-20150201+sodium+dfsg/src/wp/GuiPanel.mli --- frama-c-20140301+neon+dfsg/src/wp/GuiPanel.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/GuiPanel.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/GuiSource.ml frama-c-20150201+sodium+dfsg/src/wp/GuiSource.ml --- frama-c-20140301+neon+dfsg/src/wp/GuiSource.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/GuiSource.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -33,7 +33,7 @@ | S_none | S_fun of Kernel_function.t | S_prop of Property.t - | S_call of call + | S_call of call and call = { s_caller : Kernel_function.t ; @@ -47,103 +47,103 @@ | PTermLval( Some kf , Kstmt stmt , _ ) -> begin match stmt with - | { skind=Instr(Call(_,e,_,_)) } -> - begin - match Kernel_function.get_called e with - | None -> S_none - | Some called -> - S_call { - s_called = called ; - s_caller = kf ; - s_stmt = stmt ; - } - end - | _ -> S_none + | { skind=Instr(Call(_,e,_,_)) } -> + begin + match Kernel_function.get_called e with + | None -> S_none + | Some called -> + S_call { + s_called = called ; + s_caller = kf ; + s_stmt = stmt ; + } + end + | _ -> S_none end | PVDecl (Some kf,{vglob=true}) -> S_fun kf | PIP ip -> S_prop ip - | PVDecl _ | PLval _ | PTermLval _ | PGlobal _ -> S_none + | PVDecl _ | PLval _ | PExp _ | PTermLval _ | PGlobal _ -> S_none let kind_of_property = function | Property.IPLemma _ -> "lemma" | Property.IPCodeAnnot _ -> "annotation" - | Property.IPPredicate( Property.PKRequires _ , _ , Kglobal , _ ) -> + | Property.IPPredicate( Property.PKRequires _ , _ , Kglobal , _ ) -> "precondition for callers" | _ -> "property" - + (* -------------------------------------------------------------------------- *) (* --- Popup Menu for WP --- *) (* -------------------------------------------------------------------------- *) - + let is_rte_generated kf = List.for_all (fun (_, _, lookup) -> lookup kf) (!Db.RteGen.get_all_status ()) - + let is_rte_precond kf = - let _, _, lookup = !Db.RteGen.get_precond_status () in + let _, _, lookup = !Db.RteGen.get_precond_status () in lookup kf class popup () = -object(self) + object(self) - val mutable click : selection -> unit = (fun _ -> ()) - val mutable prove : selection -> unit = (fun _ -> ()) + val mutable click : selection -> unit = (fun _ -> ()) + val mutable prove : selection -> unit = (fun _ -> ()) - method on_click f = click <- f - method on_prove f = prove <- f + method on_click f = click <- f + method on_prove f = prove <- f - method private add_rte - (menu : GMenu.menu GMenu.factory) - (main : Design.main_window_extension_points) title action kf = - ignore (menu#add_item title - ~callback:(fun () -> !action kf ; main#redisplay ())) - - method private rte_popup menu main loc = - match loc with + method private add_rte + (menu : GMenu.menu GMenu.factory) + (main : Design.main_window_extension_points) title action kf = + ignore (menu#add_item title + ~callback:(fun () -> !action kf ; main#redisplay ())) + + method private rte_popup menu main loc = + match loc with | PVDecl (Some kf,{vglob=true}) -> - if not (is_rte_generated kf) then - self#add_rte menu main "Insert WP-safety guards" - Db.RteGen.do_all_rte kf ; - if not (is_rte_precond kf) then - self#add_rte menu main "Insert all callees contract" - Db.RteGen.do_precond kf; + if not (is_rte_generated kf) then + self#add_rte menu main "Insert WP-safety guards" + Db.RteGen.do_all_rte kf ; + if not (is_rte_precond kf) then + self#add_rte menu main "Insert all callees contract" + Db.RteGen.do_precond kf; | PStmt(kf,({ skind=Instr(Call _) })) -> - if not (is_rte_precond kf) then - self#add_rte menu main "Insert callees contract (all calls)" - Db.RteGen.do_precond kf; + if not (is_rte_precond kf) then + self#add_rte menu main "Insert callees contract (all calls)" + Db.RteGen.do_precond kf; | _ -> () - method private wp_popup (menu : GMenu.menu GMenu.factory) = function - | S_none -> () - | s -> - let target = match s with - | S_none -> "none" - | S_prop ip -> kind_of_property ip - | S_call _ -> "call preconditions" - | S_fun _ -> "function annotations" - in - let title = Printf.sprintf "Prove %s by WP" target in - ignore (menu#add_item title ~callback:(fun () -> prove s)) - - method register - (menu : GMenu.menu GMenu.factory) - (main : Design.main_window_extension_points) - ~(button:int) (loc:Pretty_source.localizable) = - begin match button with - | 1 -> - begin - match selection_of_localizable loc with - | S_none -> () - | s -> click s - end - | 3 -> - begin - self#wp_popup menu (selection_of_localizable loc) ; - self#rte_popup menu main loc ; - end - | _ -> () - end + method private wp_popup (menu : GMenu.menu GMenu.factory) = function + | S_none -> () + | s -> + let target = match s with + | S_none -> "none" + | S_prop ip -> kind_of_property ip + | S_call _ -> "call preconditions" + | S_fun _ -> "function annotations" + in + let title = Printf.sprintf "Prove %s by WP" target in + ignore (menu#add_item title ~callback:(fun () -> prove s)) + + method register + (menu : GMenu.menu GMenu.factory) + (main : Design.main_window_extension_points) + ~(button:int) (loc:Pretty_source.localizable) = + begin match button with + | 1 -> + begin + match selection_of_localizable loc with + | S_none -> () + | s -> click s + end + | 3 -> + begin + self#wp_popup menu (selection_of_localizable loc) ; + self#rte_popup menu main loc ; + end + | _ -> () + end -end + end (* -------------------------------------------------------------------------- *) (* --- Source Highlighter for WP --- *) @@ -168,86 +168,86 @@ | _ -> false) path -let lemmas ls = +let lemmas ls = List.fold_left (fun s l -> DEPS.add (LogicUsage.ip_lemma l) s) DEPS.empty ls class highlighter (main:Design.main_window_extension_points) = -object(self) + object(self) - val mutable goal = None (* orange *) - val mutable effect = None (* blue *) - val mutable path = PATH.empty (* yellow *) - val mutable deps = DEPS.empty (* green *) - val mutable current = None - - method private clear = - begin - goal <- None ; - effect <- None ; - path <- PATH.empty ; - deps <- DEPS.empty ; - end - - method private scroll () = - main#rehighlight () ; - match goal with - | None -> () - | Some ip -> main#scroll (PIP ip) + val mutable goal = None (* orange *) + val mutable effect = None (* blue *) + val mutable path = PATH.empty (* yellow *) + val mutable deps = DEPS.empty (* green *) + val mutable current = None - method set s = - let moved = match current, s with - | None , None -> false - | Some s0 , Some s1 -> s0.po_gid <> s1.po_gid - | None , Some _ | Some _ , None -> true - in if moved then + method private clear = begin - current <- s ; - self#clear ; - match s with - | None -> Gtk_helper.later main#rehighlight ; - | Some { Wpo.po_pid = pid ; Wpo.po_formula = f } -> - begin - match f with - | GoalCheck _ -> () - | GoalLemma l -> - deps <- lemmas l.VC_Lemma.depends - | GoalAnnot a -> - effect <- a.VC_Annot.effect ; - path <- instructions a.VC_Annot.path ; - deps <- a.VC_Annot.deps ; - end ; - if not (WpPropId.is_check pid) then - ( let ip = WpPropId.property_of_id pid in - goal <- Some ip ) ; - Gtk_helper.later self#scroll ; + goal <- None ; + effect <- None ; + path <- PATH.empty ; + deps <- DEPS.empty ; end - method update = main#rehighlight () - - method highlight - (buffer : GSourceView2.source_buffer) - (loc : Pretty_source.localizable) - ~(start:int) ~(stop:int) = - begin match loc with - | PStmt( _ , stmt ) -> - begin - match effect with - | Some(s,_) when Stmt.equal stmt s -> - apply_effect buffer start stop - | _ -> - if PATH.mem stmt path then - apply_path buffer start stop - end - | PIP ip -> - begin - match goal with - | Some g when Property.equal g ip -> - apply_goal buffer start stop - | _ -> - if DEPS.mem ip deps then - apply_depend buffer start stop - end - | PGlobal _|PVDecl _|PTermLval _|PLval _ -> () - end + method private scroll () = + main#rehighlight () ; + match goal with + | None -> () + | Some ip -> main#scroll (PIP ip) + + method set s = + let moved = match current, s with + | None , None -> false + | Some s0 , Some s1 -> s0.po_gid <> s1.po_gid + | None , Some _ | Some _ , None -> true + in if moved then + begin + current <- s ; + self#clear ; + match s with + | None -> Gtk_helper.later main#rehighlight ; + | Some { Wpo.po_pid = pid ; Wpo.po_formula = f } -> + begin + match f with + | GoalCheck _ -> () + | GoalLemma l -> + deps <- lemmas l.VC_Lemma.depends + | GoalAnnot a -> + effect <- a.VC_Annot.effect ; + path <- instructions a.VC_Annot.path ; + deps <- a.VC_Annot.deps ; + end ; + if not (WpPropId.is_check pid) then + ( let ip = WpPropId.property_of_id pid in + goal <- Some ip ) ; + Gtk_helper.later self#scroll ; + end + + method update = main#rehighlight () + + method highlight + (buffer : GSourceView2.source_buffer) + (loc : Pretty_source.localizable) + ~(start:int) ~(stop:int) = + begin match loc with + | PStmt( _ , stmt ) -> + begin + match effect with + | Some(s,_) when Stmt.equal stmt s -> + apply_effect buffer start stop + | _ -> + if PATH.mem stmt path then + apply_path buffer start stop + end + | PIP ip -> + begin + match goal with + | Some g when Property.equal g ip -> + apply_goal buffer start stop + | _ -> + if DEPS.mem ip deps then + apply_depend buffer start stop + end + | PGlobal _|PVDecl _|PTermLval _|PLval _| PExp _ -> () + end -end + end diff -Nru frama-c-20140301+neon+dfsg/src/wp/GuiSource.mli frama-c-20150201+sodium+dfsg/src/wp/GuiSource.mli --- frama-c-20140301+neon+dfsg/src/wp/GuiSource.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/GuiSource.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -39,23 +39,23 @@ } class popup : unit -> -object - method on_click : (selection -> unit) -> unit - method on_prove : (selection -> unit) -> unit - method register : - GMenu.menu GMenu.factory -> - Design.main_window_extension_points -> - button:int -> Pretty_source.localizable -> unit -end + object + method on_click : (selection -> unit) -> unit + method on_prove : (selection -> unit) -> unit + method register : + GMenu.menu GMenu.factory -> + Design.main_window_extension_points -> + button:int -> Pretty_source.localizable -> unit + end class highlighter : Design.main_window_extension_points -> -object - - method set : Wpo.t option -> unit - method update : unit - method highlight : GSourceView2.source_buffer -> Pretty_source.localizable -> - start:int -> stop:int -> unit + object -end + method set : Wpo.t option -> unit + method update : unit + method highlight : GSourceView2.source_buffer -> Pretty_source.localizable -> + start:int -> stop:int -> unit + + end diff -Nru frama-c-20140301+neon+dfsg/src/wp/Lang.ml frama-c-20150201+sodium+dfsg/src/wp/Lang.ml --- frama-c-20140301+neon+dfsg/src/wp/Lang.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Lang.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -47,22 +47,22 @@ Names starting with a lower-case character belong to logic language or external model(s). - 'pointer' Pointer type - 'Lit_' String Literal Values - 'Str_' String Literal Pointers - 'S_' Structure - 'U_' Union - 'F__' Field in compound - 'A_' ACSL Logic type - 'C_' ACSL Constructor - 'P_

' ACSL Predicate

(see LogicUsage.get_name) - 'L_' ACSL Logic function (see LogicUsage.get_name) - 'FixP_

' ACSL Recursive Predicate

(see LogicUsage.get_name) - 'FixL_' ACSL Recursive Logic function (see LogicUsage.get_name) - 'Q_' ACSL Lemma or Axiom - 'S_' Set comprehension predicate - 'Is' Typing predicate for type - 'Null' Null value for type + 'pointer' Pointer type + 'Lit_' String Literal Values + 'Str_' String Literal Pointers + 'S_' Structure + 'U_' Union + 'F__' Field in compound + 'A_' ACSL Logic type + 'C_' ACSL Constructor + 'P_

' ACSL Predicate

(see LogicUsage.get_name) + 'L_' ACSL Logic function (see LogicUsage.get_name) + 'FixP_

' ACSL Recursive Predicate

(see LogicUsage.get_name) + 'FixL_' ACSL Recursive Logic function (see LogicUsage.get_name) + 'Q_' ACSL Lemma or Axiom + 'S_' Set comprehension predicate + 'Is' Typing predicate for type + 'Null' Null value for type *) let avoid_leading_backlash s = if s.[0]='\\' then @@ -103,16 +103,16 @@ (* generic way to have different informations for the provers *) let infoprover x = { - altergo = x; - why3 = x; - coq = x; - } + altergo = x; + why3 = x; + coq = x; +} let map_infoprover f i = { - altergo = f i.altergo; - why3 = f i.why3; - coq = f i.coq; - } + altergo = f i.altergo; + why3 = f i.why3; + coq = f i.coq; +} type library = string @@ -138,11 +138,11 @@ let new_extern_id = ref (-1) let new_extern ~debug ~library ~link = - incr new_extern_id; - {ext_id = !new_extern_id; - ext_library = library; - ext_debug = debug; - ext_link = link} + incr new_extern_id; + {ext_id = !new_extern_id; + ext_library = library; + ext_debug = debug; + ext_link = link} let ext_compare a b = Datatype.Int.compare a.ext_id b.ext_id (* -------------------------------------------------------------------------- *) @@ -191,15 +191,15 @@ | Lvar x -> Logic.Tvar (varpoly 1 x (Context.get poly)) | Larrow _ -> Warning.error "array type non-supported(%a)" - Printer.pp_logic_type t + Printer.pp_logic_type t | Ltype _ as b when Logic_const.is_boolean_type b -> Logic.Bool | Ltype(lt,ps) -> try - let mdt = Hashtbl.find builtins lt.lt_name in - assert (ps = []) ; - Logic.Data(Mtype mdt,[]) + let mdt = Hashtbl.find builtins lt.lt_name in + assert (ps = []) ; + Logic.Data(Mtype mdt,[]) with Not_found -> - Logic.Data(Atype lt,List.map tau_of_ltype ps) + Logic.Data(Atype lt,List.map tau_of_ltype ps) let tau_of_return l = match l.l_type with | None -> Logic.Prop @@ -208,7 +208,7 @@ (* -------------------------------------------------------------------------- *) (* --- Datatypes --- *) (* -------------------------------------------------------------------------- *) - + module ADT = struct @@ -227,23 +227,23 @@ | Atype lt -> type_id lt let hash = function - | Mtype a | Mrecord(a,_) -> Hashtbl.hash a + | Mtype a | Mrecord(a,_) -> FCHashtbl.hash a | Comp c -> Compinfo.hash c | Atype lt -> Logic_type_info.hash lt let compare a b = if a==b then 0 else match a,b with - | Mtype a , Mtype b -> ext_compare a b - | Mtype _ , _ -> (-1) - | _ , Mtype _ -> 1 - | Mrecord(a,_) , Mrecord(b,_) -> ext_compare a b - | Mrecord _ , _ -> (-1) - | _ , Mrecord _ -> 1 - | Comp a , Comp b -> Compinfo.compare a b - | Comp _ , _ -> (-1) - | _ , Comp _ -> 1 - | Atype a , Atype b -> Logic_type_info.compare a b + | Mtype a , Mtype b -> ext_compare a b + | Mtype _ , _ -> (-1) + | _ , Mtype _ -> 1 + | Mrecord(a,_) , Mrecord(b,_) -> ext_compare a b + | Mrecord _ , _ -> (-1) + | _ , Mrecord _ -> 1 + | Comp a , Comp b -> Compinfo.compare a b + | Comp _ , _ -> (-1) + | _ , Comp _ -> 1 + | Atype a , Atype b -> Logic_type_info.compare a b let equal a b = (compare a b = 0) @@ -275,12 +275,12 @@ let field t f = match t with - | Mrecord(_,r) -> - begin - try List.find (function Mfield(_,_,g,_) -> f = g | _ -> false) r.fields - with Not_found -> Wp_parameters.fatal "No field <%s> in record" f - end - | _ -> Wp_parameters.fatal "No field <%s> in type '%a'" f ADT.pretty t + | Mrecord(_,r) -> + begin + try List.find (function Mfield(_,_,g,_) -> f = g | _ -> false) r.fields + with Not_found -> Wp_parameters.fatal "No field <%s> in record" f + end + | _ -> Wp_parameters.fatal "No field <%s> in type '%a'" f ADT.pretty t let comp c = Comp c @@ -312,17 +312,17 @@ | Cfield f -> field_id f let hash = function - | Mfield(_,_,f,_) -> Hashtbl.hash f + | Mfield(_,_,f,_) -> FCHashtbl.hash f | Cfield f -> Fieldinfo.hash f let compare f g = if f==g then 0 else match f , g with - | Mfield(_,_,f,_) , Mfield(_,_,g,_) -> String.compare f g - | Mfield _ , Cfield _ -> (-1) - | Cfield _ , Mfield _ -> 1 - | Cfield f , Cfield g -> Fieldinfo.compare f g - + | Mfield(_,_,f,_) , Mfield(_,_,g,_) -> String.compare f g + | Mfield _ , Cfield _ -> (-1) + | Cfield _ , Mfield _ -> 1 + | Cfield f , Cfield g -> Fieldinfo.compare f g + let equal f g = (compare f g = 0) let pretty fmt f = Format.pp_print_string fmt (debug f) @@ -363,10 +363,10 @@ else raise Not_found | Model { m_result = Some t } -> t | Model m -> match m.m_resort with - | Sint -> Int - | Sreal -> Real - | Sbool -> Bool - | _ -> raise Not_found + | Sint -> Int + | Sreal -> Real + | Sbool -> Bool + | _ -> raise Not_found type balance = Nary | Left | Right @@ -393,28 +393,28 @@ let source = match library with | None -> assert (link = None); Generated name | Some th -> - let conv n = function - | Nary -> Engine.F_call n - | Left -> Engine.F_left n - | Right -> Engine.F_right n - in - let link = match link with - | None -> infoprover (conv name balance) - | Some info -> info - in - Extern (new_extern ~library:th ~link ~debug:name) in + let conv n = function + | Nary -> Engine.F_call n + | Left -> Engine.F_left n + | Right -> Engine.F_right n + in + let link = match link with + | None -> infoprover (conv name balance) + | Some info -> info + in + Extern (new_extern ~library:th ~link ~debug:name) in let resort,result = match sort,result with - | _,Some t -> Kind.of_tau t,result - | Sint,None -> sort,Some Int - | Sreal,None -> sort,Some Real - | Sbool,None -> sort,Some Bool - | Sprop,None -> sort,Some Prop - | _ -> sort,None in + | _,Some t -> Kind.of_tau t,result + | Sint,None -> sort,Some Int + | Sreal,None -> sort,Some Real + | Sbool,None -> sort,Some Bool + | Sprop,None -> sort,Some Prop + | _ -> sort,None in Model { - m_category = category ; - m_params = params ; - m_result = result ; - m_resort = resort ; + m_category = category ; + m_params = params ; + m_result = result ; + m_resort = resort ; m_source = source; } ) (Format.formatter_of_buffer buffer) name @@ -428,9 +428,9 @@ let extern_p ~library ?bool ?prop ?link ?(params=[]) () = let link = match bool,prop,link with - | Some b , Some p , None -> infoprover (Engine.F_bool_prop(b,p)) - | _ , _ , Some info -> info - | _ , _ , _ -> assert false + | Some b , Some p , None -> infoprover (Engine.F_bool_prop(b,p)) + | _ , _ , Some info -> info + | _ , _ , _ -> assert false in let debug = Export.debug link.altergo in Model { @@ -491,18 +491,18 @@ let compare f g = if f==g then 0 else match f , g with - | Model({m_source=Generated f}), Model({m_source=Generated g}) - -> String.compare f g - | Model({m_source=Generated _}), _ -> (-1) - | _, Model({m_source=Generated _}) -> 1 - | Model({m_source=Extern f}), Model({m_source=Extern g}) - -> ext_compare f g - | Model({m_source=Extern _}), _ -> (-1) - | _, Model({m_source=Extern _}) -> 1 - | ACSL f , ACSL g -> Logic_info.compare f g - | ACSL _ , _ -> (-1) - | _ , ACSL _ -> 1 - | CTOR c , CTOR d -> Logic_ctor_info.compare c d + | Model({m_source=Generated f}), Model({m_source=Generated g}) + -> String.compare f g + | Model({m_source=Generated _}), _ -> (-1) + | _, Model({m_source=Generated _}) -> 1 + | Model({m_source=Extern f}), Model({m_source=Extern g}) + -> ext_compare f g + | Model({m_source=Extern _}), _ -> (-1) + | _, Model({m_source=Extern _}) -> 1 + | ACSL f , ACSL g -> Logic_info.compare f g + | ACSL _ , _ -> (-1) + | _ , ACSL _ -> 1 + | CTOR c , CTOR d -> Logic_ctor_info.compare c d let equal f g = (compare f g = 0) @@ -519,16 +519,17 @@ | ACSL { l_type=Some t } -> sort_of_ltype t | CTOR _ -> Logic.Sdata + let parameters = ref (fun _ -> []) + let params = function | Model m -> m.m_params - | ACSL lt -> - if lt.l_labels=[] then - List.map (fun x -> sort_of_ltype x.lv_type) lt.l_profile - else [] | CTOR ct -> List.map sort_of_ltype ct.ctor_params + | (ACSL _) as f -> !parameters f end +let parameters phi = Fun.parameters := phi + class virtual idprinting = object(self) method virtual basename : string -> string @@ -547,10 +548,10 @@ | Mfield(_,_,f,_) -> self#fieldname f | Cfield f -> self#fieldname (field_id f) method link = function - | ACSL f -> Engine.F_call (self#funname (logic_id f)) - | CTOR c -> Engine.F_call (self#funname (ctor_id c)) - | Model({m_source=Generated n}) -> Engine.F_call (self#funname n) - | Model({m_source=Extern e}) -> self#infoprover e.ext_link + | ACSL f -> Engine.F_call (self#funname (logic_id f)) + | CTOR c -> Engine.F_call (self#funname (ctor_id c)) + | Model({m_source=Generated n}) -> Engine.F_call (self#funname n) + | Model({m_source=Extern e}) -> self#infoprover e.ext_link end (* -------------------------------------------------------------------------- *) @@ -563,11 +564,12 @@ module ZInteger = struct include Integer - let pretty = Integer.pretty ~hexa:false let leq = Integer.le end module T = Qed.Term.Make(ZInteger)(ADT)(Field)(Fun) + module TT = T (* NOTE: this is only to avoid ocamldoc errors in OCaml 4.02 *) + (* -------------------------------------------------------------------------- *) (* --- Qed Projectified State --- *) @@ -590,7 +592,7 @@ let internal_pretty_code = Datatype.undefined let mem_project _ _ = false end) - + module STATE = State_builder.Register(DATA) (struct @@ -612,7 +614,7 @@ (* -------------------------------------------------------------------------- *) module Pretty = Qed.Pretty.Make(T) - include T + include TT (* NOTE: using TT instead of T to avoid ocamldoc errors in OCaml 4.02 *) (* -------------------------------------------------------------------------- *) (* --- Term Checking --- *) @@ -620,7 +622,7 @@ let do_checks = ref false let iter_checks f = T.iter_checks - (fun ~qed ~raw -> f ~qed ~raw ~goal:(T.check_unit ~qed ~raw)) + (fun ~qed ~raw -> f ~qed ~raw ~goal:(T.check_unit ~qed ~raw)) let e_add a b = let r = T.e_add a b in @@ -665,7 +667,7 @@ let hex_of_float f = Pretty_utils.to_string (Floating_point.pretty_normal ~use_hex:true) f - + let e_int64 z = e_zint (Z.of_string (Int64.to_string z)) let e_fact k e = e_times (Z.of_int k) e let e_bigint z = e_zint (Z.of_string (Integer.to_string z)) @@ -676,8 +678,8 @@ let e_setfield r f v = (*TODO:NUPW: check for UNIONS *) let r = List.map - (fun g -> g,if Field.equal f g then v else e_getfield r g) - (fields_of_field f) + (fun g -> g,if Field.equal f g then v else e_getfield r g) + (fields_of_field f) in e_record r (* -------------------------------------------------------------------------- *) @@ -744,37 +746,6 @@ let pred = repr let idp = id - let head e = match T.repr e with - | Kint _ -> "int" - | Kreal _ -> "real" - | True -> "true" - | False -> "false" - | Var _ -> "var" - | Add _ -> "add" - | Mul _ -> "mul" - | Times _ -> "times" - | Div _ -> "div" - | Mod _ -> "mod" - | Eq _ -> "eq" - | Neq _ -> "neq" - | Not _ -> "not" - | Lt _ -> "lt" - | Leq _ -> "leq" - | And _ -> "and" - | Or _ -> "or" - | Imply _ -> "imply" - | If _ -> "if" - | Fun _ -> "fun" - | Aget _ -> "access" - | Aset _ -> "update" - | Rget _ -> "getfield" - | Rdef _ -> "record" - | Bind(Forall,_,_) -> "forall" - | Bind(Exists,_,_) -> "exists" - | Bind(Lambda,_,_) -> "lambda" - | Apply _ -> "apply" - - let pp_term fmt e = if Wp_parameters.has_dkey "pretty" then T.debug fmt e @@ -790,20 +761,21 @@ Vars.iter (fun x -> Format.fprintf fmt "@ %a" pp_var x) xs ; Format.fprintf fmt " }@]" ; end - + let debugp = T.debug + type env = Pretty.env - let empty = Pretty.empty - let closed = Pretty.closed + let env xs = Pretty.known Pretty.empty xs let marker = Pretty.marks + let mark_vars = Pretty.known let mark_e = T.mark let mark_p = T.mark let define f env m = List.fold_left (fun env t -> - let x,env_x = Pretty.fresh env t in - f env x t ; env_x) + let x,env_x = Pretty.fresh env t in + f env x t ; env_x) env (T.defs m) let pp_eterm = Pretty.pp_term @@ -811,30 +783,30 @@ module Pmap = Tmap module Pset = Tset - + let set_builtin_1 f r = set_builtin f (function [e] -> r e | _ -> raise Not_found) let set_builtin_2 f r = set_builtin f (function [a;b] -> r a b | _ -> raise Not_found) - + let set_builtin_eqp = set_builtin_eq end open F - + (* -------------------------------------------------------------------------- *) (* --- Fresh Variables & Local Assumptions --- *) (* -------------------------------------------------------------------------- *) - + type gamma = { mutable hyps : pred list ; mutable vars : var list ; } (* -------------------------------------------------------------------------- *) - + let cpool = Context.create "Lang.pool" let cgamma = Context.create "Lang.gamma" let apool = function None -> F.pool () | Some p -> p @@ -843,19 +815,19 @@ let new_pool = F.pool let new_gamma ?copy () = match copy with - | None -> { hyps=[] ; vars=[] } - | Some g -> { hyps = g.hyps ; vars = g.vars } + | None -> { hyps=[] ; vars=[] } + | Some g -> { hyps = g.hyps ; vars = g.vars } let get_pool () = Context.get cpool let get_gamma () = Context.get cgamma - + let freshvar ?basename tau = F.fresh (Context.get cpool) ?basename tau let freshen x = F.alpha (Context.get cpool) x - + let local ?pool ?gamma f = Context.bind cpool (apool pool) (Context.bind cgamma (agamma gamma) f) - + (* -------------------------------------------------------------------------- *) (* --- Hypotheses --- *) (* -------------------------------------------------------------------------- *) @@ -873,7 +845,7 @@ if p != p_true && not !masked then let d = Context.get cgamma in d.hyps <- p :: d.hyps - + let epsilon ?basename t phi = let d = Context.get cgamma in let x = freshvar ?basename t in @@ -897,45 +869,25 @@ module Vmap = FCMap.Make(Var) - type t = { - mutable vars : var Vmap.t ; - mutable cache : term Tmap.t ; - } - - let create () = { vars = Vmap.empty ; cache = Tmap.empty } + type t = var Vmap.t ref + + let create () = ref Vmap.empty let get w x = - try Vmap.find x w.vars + try Vmap.find x !w with Not_found -> let y = freshen x in - w.vars <- Vmap.add x y w.vars ; y - - let iter f w = Vmap.iter f w.vars - - let rec convert w e = - try Tmap.find e w.cache - with Not_found -> - let a = - match F.repr e with - | Logic.Var x -> e_var (get w x) - | Logic.Bind(q,x,t) -> - let v_temp = w.vars in - let c_temp = w.cache in - let y = freshen x in - w.vars <- Vmap.add x y w.vars ; - let b = convert w t in - w.vars <- - if Vmap.mem x v_temp then - Vmap.add x (Vmap.find x v_temp) w.vars - else - Vmap.remove x w.vars ; - w.cache <- c_temp ; - F.e_bind q y b - | _ -> e_map (convert w) e - in w.cache <- Tmap.add e a w.cache ; a + w := Vmap.add x y !w ; y + + let iter f w = Vmap.iter f !w + + let convert w = e_subst + (fun e -> match T.repr e with + | Logic.Fvar x -> e_var (get w x) + | _ -> raise Not_found) let convertp = convert - + end (* -------------------------------------------------------------------------- *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Lang.mli frama-c-20150201+sodium+dfsg/src/wp/Lang.mli --- frama-c-20140301+neon+dfsg/src/wp/Lang.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Lang.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -154,6 +154,7 @@ val pointer : (typ -> tau) Context.value (** type of pointers *) val poly : string list Context.value (** polymorphism *) +val parameters : (lfun -> sort list) -> unit (** definitions *) (** {2 Logic Formulae} *) @@ -182,17 +183,15 @@ sig (** {3 Expressions} *) - + include Logic.Term with type Z.t = Integer.t - and module ADT = ADT - and module Field = Field - and module Fun = Fun + and module ADT = ADT + and module Field = Field + and module Fun = Fun type unop = term -> term type binop = term -> term -> term - val head : term -> string - val e_zero : term val e_one : term val e_minus_one : term @@ -247,7 +246,7 @@ val p_conj : pred list -> pred val p_disj : pred list -> pred - + val p_any : ('a -> pred) -> 'a list -> pred val p_all : ('a -> pred) -> 'a list -> pred @@ -257,7 +256,8 @@ val p_exists : var list -> pred -> pred val p_bind : binder -> var -> pred -> pred - val p_subst : ?pool:pool -> var -> term -> pred -> pred + val e_subst : ?sigma:sigma -> (term -> term) -> term -> term + val p_subst : ?sigma:sigma -> (term -> term) -> pred -> pred val p_close : pred -> pred @@ -275,8 +275,7 @@ val debugp : Format.formatter -> pred -> unit type env - val empty : env - val closed : Vars.t -> env + val env : Vars.t -> env val marker : env -> marks val mark_e : marks -> term -> unit val mark_p : marks -> pred -> unit @@ -308,7 +307,7 @@ (** {2 Fresh Variables and Constraints} *) open F - + type gamma val new_pool : ?copy:pool -> unit -> pool val new_gamma : ?copy:gamma -> unit -> gamma @@ -337,7 +336,7 @@ val create : unit -> t val get : t -> var -> var val iter : (var -> var -> unit) -> t -> unit - + val convert : t -> term -> term val convertp : t -> pred -> pred diff -Nru frama-c-20140301+neon+dfsg/src/wp/Letify.ml frama-c-20150201+sodium+dfsg/src/wp/Letify.ml --- frama-c-20140301+neon+dfsg/src/wp/Letify.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Letify.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -66,9 +66,9 @@ def : term Vmap.t ; (* Definitions *) ceq : Ceq.t ; (* Variable Classes *) cst : term Tmap.t ; (* Constants *) - mutable mem : term Tmap.t ; (* Memoization *) + mutable mem : term Tmap.t array ; (* Memoization *) } - + let empty = { dcod = Vars.empty ; dvar = Vars.empty ; @@ -76,7 +76,7 @@ ceq = Ceq.empty ; def = Vmap.empty ; cst = Tmap.empty ; - mem = Tmap.empty ; + mem = Array.create 5 Tmap.empty ; } let equal s1 s2 = @@ -85,54 +85,51 @@ let mem x sigma = Vmap.mem x sigma.def let find x sigma = Vmap.find x sigma.def let iter f sigma = Vmap.iter f sigma.def - - let rec m_apply sigma xs (e:term) = + + let rec m_apply sigma n (e:term) = match F.repr e with - | Var y -> - if Vars.mem y xs then e - else - begin - (* memoization or definition *) - try Tmap.find e sigma.mem - with Not_found -> - let r = try Vmap.find y sigma.def with Not_found -> e in - sigma.mem <- Tmap.add e r sigma.mem ; r - end - | _ -> - let ys = F.vars e in - if not (Vars.intersect ys sigma.dall) - then e (* no subst *) - else - if Vars.intersect ys xs - then (* bound variables *) F.f_map (m_apply sigma) xs e - else - begin - (* memoization *) - try Tmap.find e sigma.mem - with Not_found -> - let r = F.f_map (m_apply sigma) xs e in - sigma.mem <- Tmap.add e r sigma.mem ; r - end - - let e_apply sigma e = m_apply sigma Vars.empty e - let p_apply sigma p = F.p_bool (m_apply sigma Vars.empty (F.e_prop p)) - let s_apply sigma x e = m_apply sigma (Vars.singleton x) e - + | Fvar x -> + begin + try Vmap.find x sigma.def + with Not_found -> e + end + | _ -> + let ys = F.vars e in + if not (Vars.intersect ys sigma.dall) + then e (* no subst *) + else + begin + (* memoization *) + try Tmap.find e sigma.mem.(n) + with Not_found | Invalid_argument _ -> + let r = + try + if n > 0 then raise Not_found ; + Tmap.find e sigma.cst + with Not_found -> + F.f_map (m_apply sigma) n e + in + sigma.mem.(n) <- Tmap.add e r sigma.mem.(n) ; r + end + + let e_apply sigma e = m_apply sigma 0 e + let p_apply sigma p = F.p_bool (e_apply sigma (F.e_prop p)) + (* Returns true if [x:=a] applied to [y:=b] raises a circularity *) let occur_check sigma x a = try if vmem x a then raise Exit ; Vmap.iter - (fun y b -> if vmem x b && vmem y a then raise Exit) - sigma.def ; + (fun y b -> if vmem x b && vmem y a then raise Exit) + sigma.def ; false with Exit -> true let add_ceq x e ceq = match F.repr e with - | Var y -> Ceq.join x y ceq - | _ -> ceq - + | Fvar y -> Ceq.join x y ceq + | _ -> ceq + let single x e = let sx = Vars.singleton x in { @@ -140,32 +137,33 @@ def = Vmap.add x e Vmap.empty ; ceq = add_ceq x e Ceq.empty ; cst = Tmap.empty ; - mem = Tmap.empty ; + mem = [| Tmap.empty |] ; } - + let add x e sigma = let e = e_apply sigma e in if Vmap.mem x sigma.def then sigma else - if occur_check sigma x e then sigma - else - let sx = single x e in - let def = Vmap.add x e (Vmap.map (s_apply sx) sigma.def) in - let cst0 = Tmap.filter (fun e _c -> not (vmem x e)) sigma.cst in - let cst1 = Tmap.fold - (fun e c cst -> - if vmem x e then Tmap.add e c cst else cst) - cst0 sigma.cst - in - { - mem = cst1 ; - cst = cst1 ; - def = def ; - ceq = add_ceq x e sigma.ceq ; - dvar = Vars.add x sigma.dvar ; - dall = Vars.add x sigma.dall ; - dcod = Vars.union (F.vars e) sigma.dcod ; - } + if occur_check sigma x e then sigma + else + let sx = single x e in + let def = Vmap.add x e (Vmap.map (fun _ d -> e_apply sx d) sigma.def) in + let cst0 = Tmap.filter (fun e _c -> not (vmem x e)) sigma.cst in + let cst1 = Tmap.fold + (fun e c cst -> + if vmem x e then Tmap.add (e_apply sx e) c cst else cst) + cst0 sigma.cst in + let cache = Array.create (Array.length sigma.mem) Tmap.empty in + cache.(0) <- cst1 ; + { + mem = cache ; + cst = cst1 ; + def = def ; + ceq = add_ceq x e sigma.ceq ; + dvar = Vars.add x sigma.dvar ; + dall = Vars.add x sigma.dall ; + dcod = Vars.union (F.vars e) sigma.dcod ; + } let domain sigma = sigma.dvar let codomain sigma = sigma.dcod @@ -180,19 +178,21 @@ if compare c c0 < 0 then raise Not_found else sigma with Not_found -> let cst = Tmap.add e c sigma.cst in - let all = Vars.union (F.vars e) sigma.dall - in { - mem = cst ; - cst = cst ; - dall = all ; - dvar = sigma.dvar ; - dcod = sigma.dcod ; - def = sigma.def ; - ceq = sigma.ceq ; + let all = Vars.union (F.vars e) sigma.dall in + let cache = Array.create (Array.length sigma.mem) Tmap.empty in + cache.(0) <- cst ; + { + mem = cache ; + cst = cst ; + dall = all ; + dvar = sigma.dvar ; + dcod = sigma.dcod ; + def = sigma.def ; + ceq = sigma.ceq ; } let mem_lit l sigma = - try Tmap.find l sigma.mem == e_true + try Tmap.find l sigma.mem.(0) == e_true with Not_found -> false let add_lit l sigma = @@ -201,40 +201,49 @@ let rec add_pred sigma p = match F.repr p with | And ps -> List.fold_left add_pred sigma ps | Eq(a,b) -> - begin - match F.is_closed a , F.is_closed b with - | true , false -> add_cst b a sigma - | false , true -> add_cst a b sigma - | _ -> add_lit p sigma - end + begin + match F.repr a , F.repr b with + | Fvar x , _ when not (F.occurs x b) -> add x b sigma + | _ , Fvar x when not (F.occurs x a) -> add x a sigma + | _ -> + match F.is_closed a , F.is_closed b with + | true , false -> add_cst b a sigma + | false , true -> add_cst a b sigma + | _ -> add_lit p sigma + end | Leq(a,b) -> - if mem_lit (e_leq b a) sigma - then add_pred sigma (e_eq a b) - else add_lit p sigma + if mem_lit (e_leq b a) sigma + then add_pred sigma (e_eq a b) + else add_lit p sigma | Lt(a,b) -> - add_lit p (add_lit (e_leq a b) (add_lit (e_neq a b) sigma)) + add_lit p (add_lit (e_leq a b) (add_lit (e_neq a b) sigma)) | Neq _ | Fun _ | Not _ -> add_lit p sigma | _ -> sigma let assume sigma p = add_pred sigma (F.e_prop p) (* --- Pretty --- *) - + module Xmap = FCMap.Make(Var) - + let pretty title fmt sigma = let def = Vmap.fold Xmap.add sigma.def Xmap.empty in begin Format.fprintf fmt "@[@[%s {" title ; Format.fprintf fmt "@ @[vars: %a;@]" F.pp_vars sigma.dall ; Xmap.iter - (fun x e -> - Format.fprintf fmt "@ @[%a := %a ;@]" F.pp_term (F.e_var x) F.pp_term e - ) def ; - Tmap.iter - (fun e m -> - Format.fprintf fmt "@ @[%a ::= %a ;@]" F.pp_term e F.pp_term m - ) sigma.mem ; + (fun x e -> + Format.fprintf fmt "@ @[%a := %a ;@]" + F.pp_term (F.e_var x) F.pp_term e + ) def ; + Array.iteri + (fun i w -> + Tmap.iter + (fun e m -> + Format.fprintf fmt "@ C%d: @[%a := %a ;@]" i + F.pp_term e F.pp_term m + ) w + ) sigma.mem ; Format.fprintf fmt "@ @]}@]" ; end @@ -254,43 +263,43 @@ let add_def (w : t ref) x e = let es = try Vmap.find x !w with Not_found -> Tset.empty in w := Vmap.add x (Tset.add e es) !w - + let rec diff s y = function | [] -> s | e::es -> - match F.repr e with - | Var x when x==y -> diff s y es - | _ -> diff (e_opp e :: s) y es + match F.repr e with + | Fvar x when x==y -> diff s y es + | _ -> diff (e_opp e :: s) y es let add_linear w x pos neg = add_def w x (e_sum (diff pos x neg)) - + let terms e = match F.repr e with Add es -> es | _ -> [e] let rec atoms = function | [] -> [] - | e::es -> - match F.repr e with - | Var x -> x :: atoms es - | _ -> atoms es - + | e::es -> + match F.repr e with + | Fvar x -> x :: atoms es + | _ -> atoms es + let rec defs w p = match F.repr p with - | And ps -> List.iter (defs w) ps - | Eq(a,b) -> - begin - match F.congruence_eq a b with - | None -> defs_eq w a b - | Some eqs -> List.iter (fun (a,b) -> defs_eq w a b) eqs - end - | Not p -> - begin - match F.repr p with - | Var x -> add_def w x e_false - | _ -> () - end - | Var x -> add_def w x e_true - | _ -> () - + | And ps -> List.iter (defs w) ps + | Eq(a,b) -> + begin + match F.congruence_eq a b with + | None -> defs_eq w a b + | Some eqs -> List.iter (fun (a,b) -> defs_eq w a b) eqs + end + | Not p -> + begin + match F.repr p with + | Fvar x -> add_def w x e_false + | _ -> () + end + | Fvar x -> add_def w x e_true + | _ -> () + and defs_affine w a b = let ta = terms a in let tb = terms b in @@ -303,12 +312,12 @@ and defs_eq w a b = match F.repr a , F.repr b with - | Add _ , _ | _ , Add _ -> defs_affine w a b - | Var x , Var y -> add_def w x b ; add_def w y a - | Var x , _ -> add_def w x b - | _ , Var y -> add_def w y a - | _ -> () - + | Add _ , _ | _ , Add _ -> defs_affine w a b + | Fvar x , Fvar y -> add_def w x b ; add_def w y a + | Fvar x , _ -> add_def w x b + | _ , Fvar y -> add_def w y a + | _ -> () + let extract p = let w = ref empty in defs w (F.e_prop p) ; !w @@ -336,24 +345,24 @@ let es = ref [] in (* possible definitions *) let rs = ref [] in (* sigma definitions *) Tset.iter - (fun e -> - if not (occurs cycle e) then - match F.repr e with - | Var y -> - begin - try let d = Sigma.find y !sref in rs := d :: !rs - with Not_found -> ys := y :: !ys - end - | _ -> es := e :: !es - ) ds ; + (fun e -> + if not (occurs cycle e) then + match F.repr e with + | Fvar y -> + begin + try let d = Sigma.find y !sref in rs := d :: !rs + with Not_found -> ys := y :: !ys + end + | _ -> es := e :: !es + ) ds ; (* Now choose the represent of x and the dependencies *) let select d = sref := Sigma.add x d !sref ; d , F.vars d in let ceq , depends = - match List.sort F.compare !rs with - | r :: _ -> select r - | [] -> match List.sort F.compare !es with - | e :: _ -> select e - | [] -> e_var x , Vars.empty + match List.sort F.compare !rs with + | r :: _ -> select r + | [] -> match List.sort F.compare !es with + | e :: _ -> select e + | [] -> e_var x , Vars.empty in List.iter (fun y -> sref := Sigma.add y ceq !sref) !ys ; iter (extract defs sref cycle) depends @@ -371,7 +380,7 @@ let rec add_eq ps y = function | z::zs -> add_eq (p_equal (e_var y) (e_var z) :: ps) y zs | [] -> ps - + let add_equals ys ps = match ys with [] -> ps | y::ys -> add_eq ps y ys @@ -390,38 +399,38 @@ module Split = struct - + type occur = int F.Tmap.t ref - + let create () = ref Tmap.empty - + let literal m p = try let n = Tmap.find p !m in m := Tmap.add p (succ n) !m with Not_found -> m := Tmap.add p 1 !m - + let rec occur m p = match F.repr p with - | And ps | Or ps -> List.iter (occur m) ps - | Imply(hs,p) -> List.iter (occur m) (p::hs) - | Not p -> occur m p - | If(p,a,b) -> occur m p ; occur m a ; occur m b - | Eq(a,b) when F.is_closed a || F.is_closed b -> literal m p - | Neq(a,b) when F.is_closed a || F.is_closed b -> literal m (e_not p) - | Fun _ | Leq _ -> literal m p - | Lt _ -> literal m (e_not p) - | _ -> () - + | And ps | Or ps -> List.iter (occur m) ps + | Imply(hs,p) -> List.iter (occur m) (p::hs) + | Not p -> occur m p + | If(p,a,b) -> occur m p ; occur m a ; occur m b + | Eq(a,b) when F.is_closed a || F.is_closed b -> literal m p + | Neq(a,b) when F.is_closed a || F.is_closed b -> literal m (e_not p) + | Fun _ | Leq _ -> literal m p + | Lt _ -> literal m (e_not p) + | _ -> () + let add m p = occur m (F.e_prop p) let select m = let compare (c1,n1) (c2,n2) = (* most often first *) if n1 < n2 then 1 else - if n1 > n2 then (-1) else - F.comparep c1 c2 + if n1 > n2 then (-1) else + F.comparep c1 c2 in List.sort compare (Tmap.fold (fun c n s -> (F.p_bool c,n)::s) !m []) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Letify.mli frama-c-20150201+sodium+dfsg/src/wp/Letify.mli --- frama-c-20140301+neon+dfsg/src/wp/Letify.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Letify.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -52,21 +52,21 @@ end val bind : Sigma.t -> Defs.t -> Vars.t -> Sigma.t - (** [bind sigma defs xs] select definitions in [defs] - targeting variables [xs]. The result is a new substitution that - potentially augment [sigma] with definitions for [xs] (and others). *) +(** [bind sigma defs xs] select definitions in [defs] + targeting variables [xs]. The result is a new substitution that + potentially augment [sigma] with definitions for [xs] (and others). *) val add_definitions : Sigma.t -> Defs.t -> Vars.t -> pred list -> pred list - (** [add_definitions sigma defs xs ps] keep all - definitions of variables [xs] from [sigma] that comes from [defs]. - They are added to [ps]. *) +(** [add_definitions sigma defs xs ps] keep all + definitions of variables [xs] from [sigma] that comes from [defs]. + They are added to [ps]. *) (** Pruning strategy ; selects most occuring literals to split cases. *) module Split : sig - + type occur - + val create : unit -> occur val add : occur -> pred -> unit val select : occur -> (pred * int) list diff -Nru frama-c-20140301+neon+dfsg/src/wp/LogicAssigns.ml frama-c-20150201+sodium+dfsg/src/wp/LogicAssigns.ml --- frama-c-20140301+neon+dfsg/src/wp/LogicAssigns.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/LogicAssigns.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -41,9 +41,9 @@ end module Make - ( M : Memory.Model ) - ( C : Code with type loc = M.loc ) - ( L : Logic with type loc = M.loc ) = + ( M : Memory.Model ) + ( C : Code with type loc = M.loc ) + ( L : Logic with type loc = M.loc ) = struct open M @@ -68,8 +68,8 @@ let domain (r:region) = List.fold_left (fun d (obj,slocs) -> - List.fold_left - (fun d sloc -> Dom.union d (dsloc obj sloc)) d slocs + List.fold_left + (fun d sloc -> Dom.union d (dsloc obj sloc)) d slocs ) Dom.empty r (* -------------------------------------------------------------------------- *) @@ -80,25 +80,25 @@ | [] -> Bag.concat (M.Sigma.assigned s.pre s.post Dom.empty) hs | [obj,sloc] -> - let hs_sloc = Bag.list (M.assigned s obj sloc) in - let hs_sdom = M.Sigma.assigned s.pre s.post (dsloc obj sloc) in - Bag.concat (Bag.concat hs_sloc hs_sdom) hs + let hs_sloc = Bag.list (M.assigned s obj sloc) in + let hs_sdom = M.Sigma.assigned s.pre s.post (dsloc obj sloc) in + Bag.concat (Bag.concat hs_sloc hs_sdom) hs | (obj,sloc)::tail -> - let sigma = M.Sigma.havoc s.post (dsloc obj sloc) in - let s_local = { pre = sigma ; post = s.post } in - let s_other = { pre = s.pre ; post = sigma } in - let hs_sloc = Bag.list (M.assigned s_local obj sloc) in - assigned_seq (Bag.concat hs_sloc hs) s_other tail + let sigma = M.Sigma.havoc s.post (dsloc obj sloc) in + let s_local = { pre = sigma ; post = s.post } in + let s_other = { pre = s.pre ; post = sigma } in + let hs_sloc = Bag.list (M.assigned s_local obj sloc) in + assigned_seq (Bag.concat hs_sloc hs) s_other tail let assigned (s:sigma sequence) (r:region) = let hs = assigned_seq Bag.empty s - begin - List.fold_left - (fun w (obj,slocs) -> - List.fold_left (fun w sloc -> (obj,sloc) :: w) w slocs - ) [] r - end + begin + List.fold_left + (fun w (obj,slocs) -> + List.fold_left (fun w sloc -> (obj,sloc) :: w) w slocs + ) [] r + end in Bag.elements hs - + end diff -Nru frama-c-20140301+neon+dfsg/src/wp/LogicAssigns.mli frama-c-20150201+sodium+dfsg/src/wp/LogicAssigns.mli --- frama-c-20140301+neon+dfsg/src/wp/LogicAssigns.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/LogicAssigns.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -40,9 +40,9 @@ end module Make - ( M : Memory.Model ) - ( C : Code with type loc = M.loc ) - ( L : Logic with type loc = M.loc ) : + ( M : Memory.Model ) + ( C : Code with type loc = M.loc ) + ( L : Logic with type loc = M.loc ) : sig open M diff -Nru frama-c-20140301+neon+dfsg/src/wp/LogicBuiltins.ml frama-c-20150201+sodium+dfsg/src/wp/LogicBuiltins.ml --- frama-c-20140301+neon+dfsg/src/wp/LogicBuiltins.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/LogicBuiltins.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -60,11 +60,11 @@ let rec lkind t = match Logic_utils.unroll_type t with - | Ctype ty -> ckind ty - | Ltype({lt_name="set"},[t]) -> lkind t - | Lreal -> R - | Linteger -> Z - | Ltype _ | Larrow _ | Lvar _ -> A + | Ctype ty -> ckind ty + | Ltype({lt_name="set"},[t]) -> lkind t + | Lreal -> R + | Linteger -> Z + | Ltype _ | Larrow _ | Lvar _ -> A let pp_kind fmt = function | I i -> Ctypes.pp_int fmt i @@ -125,23 +125,23 @@ try List.assoc kinds sigs with Not_found -> Wp_parameters.feedback ~once:true - "Use -wp-logs 'driver' for debugging drivers" ; + "Use -wp-logs 'driver' for debugging drivers" ; if kinds=[] then W.error ~current:true "Builtin %s undefined as a constant" name else W.error ~current:true "Builtin %s undefined with signature %a" name - pp_kinds kinds ; + pp_kinds kinds ; ACSLDEF - with Not_found -> - if name.[0] == '\\' then - W.error "Builtin %s%a not defined" name pp_kinds kinds ; - ACSLDEF + with Not_found -> + if name.[0] == '\\' then + W.error "Builtin %s%a not defined" name pp_kinds kinds ; + ACSLDEF let register name kinds link = let sigs = try Hashtbl.find (cdriver ()).hlogic name with Not_found -> [] in begin if List.exists (fun (s,_) -> s = kinds) sigs then let msg = Pretty_utils.sfprintf "Builtin %s%a already defined" name - pp_kinds kinds + pp_kinds kinds in failwith msg ; end ; let entry = (kinds,link) in @@ -166,17 +166,17 @@ begin fun fmt -> Format.fprintf fmt "Builtins:@\n" ; iter_libs - (fun (name,libs) -> Format.fprintf fmt " * Library %s%a@\n" - name pp_libs libs) ; + (fun (name,libs) -> Format.fprintf fmt " * Library %s%a@\n" + name pp_libs libs) ; iter_table - (fun (name,k,lnk) -> Format.fprintf fmt " * Logic %s%a = %a@\n" - name pp_kinds k pp_link lnk) ; + (fun (name,k,lnk) -> Format.fprintf fmt " * Logic %s%a = %a@\n" + name pp_kinds k pp_link lnk) ; end (* -------------------------------------------------------------------------- *) (* --- Implemented Builtins --- *) (* -------------------------------------------------------------------------- *) - + let logic phi = lookup phi.l_var_info.lv_name (List.map (fun v -> lkind v.lv_type) phi.l_profile) @@ -204,7 +204,7 @@ let params = List.map skind kinds in let lfun = Lang.extern_s ~library ?category ~sort ~params ~link name in register name kinds (LFUN lfun) - + let add_predicate name kinds ~library ~link () = let params = List.map skind kinds in let lfun = Lang.extern_fp ~library ~params ~link name in @@ -259,8 +259,8 @@ let rec lookup file = function | [] -> Wp_parameters.abort "File '%s' not found (see -wp-include)" file | dir::dirs -> - let path = Printf.sprintf "%s/%s" dir file in - if Sys.file_exists path then path else lookup file dirs + let path = Printf.sprintf "%s/%s" dir file in + if Sys.file_exists path then path else lookup file dirs in lookup file (cdriver ()).includes diff -Nru frama-c-20140301+neon+dfsg/src/wp/LogicBuiltins.mli frama-c-20150201+sodium+dfsg/src/wp/LogicBuiltins.mli --- frama-c-20140301+neon+dfsg/src/wp/LogicBuiltins.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/LogicBuiltins.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -50,7 +50,7 @@ (** find a file in the includes of the current drivers *) val dependencies : string -> string list (** Of external theories. - Raises Not_found if undefined *) + Raises Not_found if undefined *) val add_library : string -> string list -> unit (** External theories *) @@ -73,10 +73,10 @@ val add_option : driver_dir:string -> string -> string -> library:string -> string -> unit - (** add a value to an option (group, name) *) +(** add a value to an option (group, name) *) val set_option : driver_dir:string -> string -> string -> library:string -> string -> unit - (** reset and add a value to an option (group, name) *) +(** reset and add a value to an option (group, name) *) type doption @@ -86,8 +86,8 @@ add a sanitizer for group [group] and option [name] *) val get_option : doption -> library:string -> string list - (** return the values of option (group, name), - return the empty list if not set *) +(** return the values of option (group, name), + return the empty list if not set *) type builtin = | ACSLDEF diff -Nru frama-c-20140301+neon+dfsg/src/wp/LogicCompiler.ml frama-c-20150201+sodium+dfsg/src/wp/LogicCompiler.ml --- frama-c-20140301+neon+dfsg/src/wp/LogicCompiler.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/LogicCompiler.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -62,13 +62,13 @@ let rec wrap_lvar xs vs = match xs , vs with - | x::xs , v::vs -> Logic_var.Map.add x v (wrap_lvar xs vs) - | _ -> Logic_var.Map.empty + | x::xs , v::vs -> Logic_var.Map.add x v (wrap_lvar xs vs) + | _ -> Logic_var.Map.empty let rec wrap_var xs vs = match xs , vs with - | x::xs , v::vs -> Varinfo.Map.add x v (wrap_var xs vs) - | _ -> Varinfo.Map.empty + | x::xs , v::vs -> Varinfo.Map.add x v (wrap_var xs vs) + | _ -> Varinfo.Map.empty let rec wrap_mem = function | (label,mem) :: m -> LabelMap.add label mem (wrap_mem m) @@ -104,16 +104,16 @@ begin Format.fprintf fmt "Frame '%s':@\n" f.name ; LabelMap.iter - (fun l m -> - Format.fprintf fmt "@[Label '%a': %a@]@\n" - Clabels.pretty l Sigma.pretty m - ) f.labels ; + (fun l m -> + Format.fprintf fmt "@[Label '%a': %a@]@\n" + Clabels.pretty l Sigma.pretty m + ) f.labels ; end (* -------------------------------------------------------------------------- *) (* --- Frames Builders --- *) (* -------------------------------------------------------------------------- *) - + let logic_frame a types = { name = a ; @@ -142,7 +142,7 @@ labels = LabelMap.empty ; } - let call_pre kf vs mem = + let call_pre init kf vs mem = { name = "Pre " ^ Kernel_function.get_name kf ; types = [] ; @@ -153,10 +153,10 @@ kf = None ; result = None ; status = None ; - labels = wrap_mem [ Clabels.Pre , mem ] ; + labels = wrap_mem [ Clabels.Init , init ; Clabels.Pre , mem ] ; } - let call_post kf vs seq = + let call_post init kf vs seq = { name = "Post " ^ Kernel_function.get_name kf ; types = [] ; @@ -167,14 +167,18 @@ kf = Some kf ; result = None ; status = None ; - labels = wrap_mem [ Clabels.Pre , seq.pre ; Clabels.Post , seq.post ] ; + labels = wrap_mem [ + Clabels.Init , init ; + Clabels.Pre , seq.pre ; + Clabels.Post , seq.post ; + ] ; } let frame_copy f = { f with - pool = Lang.new_pool ~copy:f.pool () ; - gamma = Lang.new_gamma ~copy:f.gamma () ; - labels = LabelMap.map Sigma.copy f.labels ; + pool = Lang.new_pool ~copy:f.pool () ; + gamma = Lang.new_gamma ~copy:f.gamma () ; + labels = LabelMap.map Sigma.copy f.labels ; } (* -------------------------------------------------------------------------- *) @@ -182,13 +186,13 @@ (* -------------------------------------------------------------------------- *) let cframe : frame Context.value = Context.create "LogicSemantics.frame" - + let get_frame () = Context.get cframe let in_frame f cc = Context.bind Lang.poly f.types (Context.bind cframe f - (Lang.local ~pool:f.pool ~gamma:f.gamma cc)) + (Lang.local ~pool:f.pool ~gamma:f.gamma cc)) let mem_at_frame frame label = assert (label <> Clabels.Here) ; @@ -207,35 +211,35 @@ let return () = let f = Context.get cframe in match f.kf with - | None -> Wp_parameters.fatal "No function in frame '%s'" f.name - | Some kf -> - if Kernel_function.returns_void kf then - Wp_parameters.fatal "No result in frame '%s'" f.name ; - Kernel_function.get_return_type kf + | None -> Wp_parameters.fatal "No function in frame '%s'" f.name + | Some kf -> + if Kernel_function.returns_void kf then + Wp_parameters.fatal "No result in frame '%s'" f.name ; + Kernel_function.get_return_type kf let result () = let f = Context.get cframe in match f.result with - | Some x -> x - | None -> - match f.kf with - | None -> Wp_parameters.fatal "No function in frame '%s'" f.name - | Some kf -> - if Kernel_function.returns_void kf then - Wp_parameters.fatal "No result in frame '%s'" f.name ; - let tr = Kernel_function.get_return_type kf in - let basename = Kernel_function.get_name kf in - let x = fresh_cvar ~basename tr in - f.result <- Some x ; x + | Some x -> x + | None -> + match f.kf with + | None -> Wp_parameters.fatal "No function in frame '%s'" f.name + | Some kf -> + if Kernel_function.returns_void kf then + Wp_parameters.fatal "No result in frame '%s'" f.name ; + let tr = Kernel_function.get_return_type kf in + let basename = Kernel_function.get_name kf in + let x = fresh_cvar ~basename tr in + f.result <- Some x ; x let status () = let f = Context.get cframe in match f.status with - | Some x -> x - | None -> - let x = fresh_cvar ~basename:"status" Cil.intType in - f.status <- Some x ; x - + | Some x -> x + | None -> + let x = fresh_cvar ~basename:"status" Cil.intType in + f.status <- Some x ; x + let trigger tg = if tg <> Qed.Engine.TgAny then let f = Context.get cframe in @@ -262,11 +266,11 @@ let new_env lvars = let lvars = List.fold_left - (fun lvars lv -> - let x = fresh_lvar ~basename:lv.lv_name lv.lv_type in - let v = Vexp(e_var x) in - Logic_var.Map.add lv v lvars) - Logic_var.Map.empty lvars in + (fun lvars lv -> + let x = fresh_lvar ~basename:lv.lv_name lv.lv_type in + let v = Vexp(e_var x) in + Logic_var.Map.add lv v lvars) + Logic_var.Map.empty lvars in { lhere = None ; current = None ; vars = lvars } let sigma e = match e.current with Some s -> s | None -> @@ -282,8 +286,8 @@ let mem_at env label = match label with - | Clabels.Here -> sigma env - | _ -> mem_frame label + | Clabels.Here -> sigma env + | _ -> mem_frame label let env_let env x v = { env with vars = Logic_var.Map.add x v env.vars } let env_letval env x = function @@ -298,17 +302,22 @@ let t = Lang.tau_of_ltype lv.lv_type in freshvar ~basename:lv.lv_name t - let rec profile_env vars sigv = function - | [] -> { vars=vars ; lhere=None ; current=None } , List.rev sigv + let rec profile_env vars domain sigv = function + | [] -> { vars=vars ; lhere=None ; current=None } , domain , List.rev sigv | lv :: profile -> - let x = param_of_lv lv in - let v = plain_of_exp lv.lv_type (e_var x) in - profile_env (Logic_var.Map.add lv v vars) ((lv,x)::sigv) profile + let x = param_of_lv lv in + let h = Cvalues.has_ltype lv.lv_type (e_var x) in + let v = plain_of_exp lv.lv_type (e_var x) in + profile_env + (Logic_var.Map.add lv v vars) + (h::domain) + ((lv,x)::sigv) + profile let default_label env = function | [l] -> move env (mem_frame (Clabels.c_label l)) | _ -> env - + let compile_step (name:string) (types:string list) @@ -317,41 +326,41 @@ (cc : env -> 'a -> 'b) (filter : 'b -> var -> bool) (data : 'a) - : var list * trigger list * 'b * sig_param list = + : var list * trigger list * pred list * 'b * sig_param list = let frame = logic_frame name types in in_frame frame begin fun () -> - let env,sigv = profile_env Logic_var.Map.empty [] profile in - let env = default_label env labels in - let result = cc env data in - let used = List.filter (fun (_,x) -> filter result x) sigv in - let parp = List.map snd used in - let sigp = List.map (fun (lv,_) -> Sig_value lv) used in - let (parm,sigm) = - LabelMap.fold - (fun label sigma -> - Heap.Set.fold_sorted - (fun chunk acc -> - if filter result (Sigma.get sigma chunk) then - let (parm,sigm) = acc in - let x = Sigma.get sigma chunk in - let s = Sig_chunk(chunk,label) in - ( x::parm , s::sigm ) - else acc) - (Sigma.domain sigma)) - frame.labels (parp,sigp) - in - parm , frame.triggers , result , sigm + let env,domain,sigv = profile_env Logic_var.Map.empty [] [] profile in + let env = default_label env labels in + let result = cc env data in + let used = List.filter (fun (_,x) -> filter result x) sigv in + let parp = List.map snd used in + let sigp = List.map (fun (lv,_) -> Sig_value lv) used in + let (parm,sigm) = + LabelMap.fold + (fun label sigma -> + Heap.Set.fold_sorted + (fun chunk acc -> + if filter result (Sigma.get sigma chunk) then + let (parm,sigm) = acc in + let x = Sigma.get sigma chunk in + let s = Sig_chunk(chunk,label) in + ( x::parm , s::sigm ) + else acc) + (Sigma.domain sigma)) + frame.labels (parp,sigp) + in + parm , frame.triggers , domain , result , sigm end () let cc_term : (env -> Cil_types.term -> term) ref - = ref (fun _ _ -> assert false) + = ref (fun _ _ -> assert false) let cc_pred : (bool -> env -> predicate named -> pred) ref - = ref (fun _ _ -> assert false) + = ref (fun _ _ -> assert false) let cc_logic : (env -> Cil_types.term -> logic) ref - = ref (fun _ _ -> assert false) + = ref (fun _ _ -> assert false) let cc_region : (env -> Cil_types.term -> loc sloc list) ref - = ref (fun _ _ -> assert false) + = ref (fun _ _ -> assert false) let term env t = !cc_term env t let pred positive env t = !cc_pred positive env t @@ -376,30 +385,35 @@ (* -------------------------------------------------------------------------- *) module Axiomatic = Model.Index - (struct - type key = string - type data = unit - let name = "LogicCompiler." ^ M.datatype ^ ".Axiomatic" - let compare = String.compare - let pretty = Format.pp_print_string - end) + (struct + type key = string + type data = unit + let name = "LogicCompiler." ^ M.datatype ^ ".Axiomatic" + let compare = String.compare + let pretty = Format.pp_print_string + end) module Signature = Model.Index - (struct - type key = logic_info - type data = signature - let name = "LogicCompiler." ^ M.datatype ^ ".Signature" - let compare = Logic_info.compare - let pretty fmt l = Logic_var.pretty fmt l.l_var_info - end) + (struct + type key = logic_info + type data = signature + let name = "LogicCompiler." ^ M.datatype ^ ".Signature" + let compare = Logic_info.compare + let pretty fmt l = Logic_var.pretty fmt l.l_var_info + end) (* -------------------------------------------------------------------------- *) (* --- Compiling Lemmas --- *) (* -------------------------------------------------------------------------- *) + let rec strip_forall xs p = match p.content with + | Pforall(qs,q) -> strip_forall (xs @ qs) q + | _ -> xs , p + let compile_lemma cluster name ~assumed types labels lemma = - let xs,tgs,prop,_ = compile_step name types [] labels (pred true) in_pred lemma in - let xs,prop = Definitions.Trigger.plug [tgs] (p_forall xs prop) in + let qs,prop = strip_forall [] lemma in + let xs,tgs,domain,prop,_ = + compile_step name types qs labels (pred true) in_pred prop in { l_name = name ; l_types = List.length types ; @@ -407,7 +421,7 @@ l_triggers = [tgs] ; l_forall = xs ; l_cluster = cluster ; - l_lemma = prop ; + l_lemma = F.p_hyps domain prop ; } (* -------------------------------------------------------------------------- *) @@ -416,31 +430,31 @@ let type_for_signature l ldef sigp = match l.l_type with - | None -> () - | Some tr -> - match Cvalues.ldomain tr with - | None -> () - | Some p -> - let name = "T" ^ Lang.logic_id l in - let vs = List.map e_var ldef.d_params in - let rec conditions vs sigp = - match vs , sigp with - | v::vs , Sig_value lv :: sigp -> - let cond = Cvalues.has_ltype lv.lv_type v in - cond :: conditions vs sigp - | _ -> [] in - let result = F.e_fun ldef.d_lfun vs in - let lemma = p_hyps (conditions vs sigp) (p result) in - let trigger = Trigger.of_term result in - Definitions.define_lemma { - l_name = name ; - l_assumed = true ; - l_types = ldef.d_types ; - l_forall = ldef.d_params ; - l_triggers = [[trigger]] ; - l_cluster = ldef.d_cluster ; - l_lemma = lemma ; - } + | None -> () + | Some tr -> + match Cvalues.ldomain tr with + | None -> () + | Some p -> + let name = "T" ^ Lang.logic_id l in + let vs = List.map e_var ldef.d_params in + let rec conditions vs sigp = + match vs , sigp with + | v::vs , Sig_value lv :: sigp -> + let cond = Cvalues.has_ltype lv.lv_type v in + cond :: conditions vs sigp + | _ -> [] in + let result = F.e_fun ldef.d_lfun vs in + let lemma = p_hyps (conditions vs sigp) (p result) in + let trigger = Trigger.of_term result in + Definitions.define_lemma { + l_name = name ; + l_assumed = true ; + l_types = ldef.d_types ; + l_forall = ldef.d_params ; + l_triggers = [[trigger]] ; + l_cluster = ldef.d_cluster ; + l_lemma = lemma ; + } (* -------------------------------------------------------------------------- *) (* --- Compiling Pure Logic Function --- *) @@ -474,22 +488,22 @@ let (parm,sigm) = if vars = [] then (parp,sigp) else - let heap = List.fold_left - (fun m x -> - let obj = object_of x.vtype in - Heap.Set.union m (M.domain obj (M.cvar x)) - ) Heap.Set.empty vars - in List.fold_left - (fun acc l -> - let label = Clabels.c_label l in - let sigma = Sigma.create () in - Heap.Set.fold_sorted - (fun chunk (parm,sigm) -> - let x = Sigma.get sigma chunk in - let s = Sig_chunk (chunk,label) in - ( x::parm , s :: sigm ) - ) heap acc - ) (parp,sigp) l.l_labels + let heap = List.fold_left + (fun m x -> + let obj = object_of x.vtype in + Heap.Set.union m (M.domain obj (M.cvar x)) + ) Heap.Set.empty vars + in List.fold_left + (fun acc l -> + let label = Clabels.c_label l in + let sigma = Sigma.create () in + Heap.Set.fold_sorted + (fun chunk (parm,sigm) -> + let x = Sigma.get sigma chunk in + let s = Sig_chunk (chunk,label) in + ( x::parm , s :: sigm ) + ) heap acc + ) (parp,sigp) l.l_labels in let ldef = { d_lfun = lfun ; @@ -509,9 +523,9 @@ let lfun = ACSL l in let name = l.l_var_info.lv_name in let tau = Lang.tau_of_return l in - let xs,_,(),s = + let xs,_,_,(),s = compile_step name l.l_tparams l.l_profile l.l_labels - reads in_reads ts + reads in_reads ts in let ldef = { d_lfun = lfun ; @@ -534,9 +548,9 @@ let result = compile_step name types profile labels cc filter data in if LogicUsage.is_recursive l then begin - let (_,_,_,s) = result in - Signature.update l (SIG s) ; - compile_step name types profile labels cc filter data + let (_,_,_,_,s) = result in + Signature.update l (SIG s) ; + compile_step name types profile labels cc filter data end else result @@ -547,19 +561,19 @@ let compile_lbterm cluster l t = let name = l.l_var_info.lv_name in let tau = Lang.tau_of_return l in - let xs,_,r,s = compile_rec name l term in_term t in + let xs,_,_,r,s = compile_rec name l term in_term t in match F.repr r with - | Qed.Logic.Kint c -> CST c - | _ -> - let ldef = { - d_lfun = ACSL l ; - d_types = List.length l.l_tparams ; - d_params = xs ; - d_cluster = cluster ; - d_definition = Value(tau,is_recursive l,r) ; - } in - Definitions.define_symbol ldef ; - type_for_signature l ldef s ; SIG s + | Qed.Logic.Kint c -> CST c + | _ -> + let ldef = { + d_lfun = ACSL l ; + d_types = List.length l.l_tparams ; + d_params = xs ; + d_cluster = cluster ; + d_definition = Value(tau,is_recursive l,r) ; + } in + Definitions.define_symbol ldef ; + type_for_signature l ldef s ; SIG s (* -------------------------------------------------------------------------- *) (* --- Compiling Logic Predicate with Definition --- *) @@ -568,7 +582,7 @@ let compile_lbpred cluster l p = let lfun = ACSL l in let name = l.l_var_info.lv_name in - let xs,_,r,s = compile_rec name l (pred true) in_pred p in + let xs,_,_,r,s = compile_rec name l (pred true) in_pred p in let ldef = { d_lfun = lfun ; d_types = List.length l.l_tparams ; @@ -581,15 +595,15 @@ let heap_case labels_used support = function | Sig_value _ -> support | Sig_chunk(chk,l_case) -> - let l_ind = - try LabelMap.find l_case labels_used - with Not_found -> LabelSet.empty - in - let l_chk = - try Heap.Map.find chk support - with Not_found -> LabelSet.empty - in - Heap.Map.add chk (LabelSet.union l_chk l_ind) support + let l_ind = + try LabelMap.find l_case labels_used + with Not_found -> LabelSet.empty + in + let l_chk = + try Heap.Map.find chk support + with Not_found -> LabelSet.empty + in + Heap.Map.add chk (LabelSet.union l_chk l_ind) support (* -------------------------------------------------------------------------- *) (* --- Compiling Inductive Logic --- *) @@ -600,27 +614,28 @@ let parp,sigp = compile_lbpure cluster l in (* Compile cases with default definition and collect used chunks *) let support = List.fold_left - (fun support (case,labels,types,lemma) -> - let _,_,_,s = compile_step case types [] labels (pred true) in_pred lemma in - let labels_used = LogicUsage.get_induction_labels l case in - List.fold_left (heap_case labels_used) support s) - Heap.Map.empty cases in + (fun support (case,labels,types,lemma) -> + let _,_,_,_,s = + compile_step case types [] labels (pred true) in_pred lemma in + let labels_used = LogicUsage.get_induction_labels l case in + List.fold_left (heap_case labels_used) support s) + Heap.Map.empty cases in (* Make signature with collected chunks *) let (parm,sigm) = let frame = logic_frame l.l_var_info.lv_name l.l_tparams in in_frame frame - (fun () -> - Heap.Map.fold_sorted - (fun chunk labels acc -> - let basename = Chunk.basename_of_chunk chunk in - let tau = Chunk.tau_of_chunk chunk in - LabelSet.fold - (fun label (parm,sigm) -> - let x = Lang.freshvar ~basename tau in - x :: parm , Sig_chunk(chunk,label) :: sigm - ) labels acc) - support (parp,sigp) - ) () in + (fun () -> + Heap.Map.fold_sorted + (fun chunk labels acc -> + let basename = Chunk.basename_of_chunk chunk in + let tau = Chunk.tau_of_chunk chunk in + LabelSet.fold + (fun label (parm,sigm) -> + let x = Lang.freshvar ~basename tau in + x :: parm , Sig_chunk(chunk,label) :: sigm + ) labels acc) + support (parp,sigp) + ) () in (* Set global Signature *) let lfun = ACSL l in let ldef = { @@ -634,29 +649,29 @@ Signature.update l (SIG sigm) ; (* Re-compile final cases *) let cases = List.map - (fun (case,labels,types,lemma) -> - compile_lemma cluster ~assumed:true case types labels lemma) - cases in + (fun (case,labels,types,lemma) -> + compile_lemma cluster ~assumed:true case types labels lemma) + cases in Definitions.update_symbol { ldef with d_definition = Inductive cases } ; type_for_signature l ldef sigp (* sufficient *) ; SIG sigm - + let compile_logic cluster section l = let s_rec = List.map (fun x -> Sig_value x) l.l_profile in Signature.update l (SIG s_rec) ; match l.l_body with - | LBnone -> - let vars = match section with - | Toplevel _ -> [] - | Axiomatic a -> Varinfo.Set.elements a.ax_reads - in if l.l_labels <> [] && vars = [] then - Wp_parameters.warning ~once:true ~current:false - "No definition for '%s' interpreted as reads nothing" - l.l_var_info.lv_name ; - compile_lbnone cluster l vars - | LBterm t -> compile_lbterm cluster l t - | LBpred p -> compile_lbpred cluster l p - | LBreads ts -> compile_lbreads cluster l ts - | LBinductive cases -> compile_lbinduction cluster l cases + | LBnone -> + let vars = match section with + | Toplevel _ -> [] + | Axiomatic a -> Varinfo.Set.elements a.ax_reads + in if l.l_labels <> [] && vars = [] then + Wp_parameters.warning ~once:true ~current:false + "No definition for '%s' interpreted as reads nothing" + l.l_var_info.lv_name ; + compile_lbnone cluster l vars + | LBterm t -> compile_lbterm cluster l t + | LBpred p -> compile_lbpred cluster l p + | LBreads ts -> compile_lbreads cluster l ts + | LBinductive cases -> compile_lbinduction cluster l cases (* -------------------------------------------------------------------------- *) (* --- Retrieving Signature --- *) @@ -667,11 +682,11 @@ let define_lemma c l = if l.lem_labels <> [] && Wp_parameters.has_dkey "lemma" then Wp_parameters.warning ~source:l.lem_position - "Lemma '%s' has labels, consider using global invariant instead." - l.lem_name ; + "Lemma '%s' has labels, consider using global invariant instead." + l.lem_name ; Definitions.define_lemma (compile_lemma c ~assumed:l.lem_axiom - l.lem_name l.lem_types l.lem_labels l.lem_property) + l.lem_name l.lem_types l.lem_labels l.lem_property) let define_axiomatic cluster ax = begin @@ -686,9 +701,9 @@ let section = LogicUsage.section_of_lemma l.lem_name in let cluster = Definitions.section section in begin - match section with - | Toplevel _ -> define_lemma cluster l - | Axiomatic ax -> define_axiomatic cluster ax + match section with + | Toplevel _ -> define_lemma cluster l + | Axiomatic ax -> define_axiomatic cluster ax end ; Definitions.find_lemma l @@ -698,16 +713,16 @@ let section = LogicUsage.section_of_logic phi in let cluster = Definitions.section section in match section with - | Toplevel _ -> - Signature.memoize (compile_logic cluster section) phi - | Axiomatic ax -> - (* force compilation of entire axiomatics *) - define_axiomatic cluster ax ; - try Signature.find phi - with Not_found -> - Wp_parameters.fatal ~current:true - "Axiomatic '%s' compiled, but '%a' not" - ax.ax_name Printer.pp_logic_var phi.l_var_info + | Toplevel _ -> + Signature.memoize (compile_logic cluster section) phi + | Axiomatic ax -> + (* force compilation of entire axiomatics *) + define_axiomatic cluster ax ; + try Signature.find phi + with Not_found -> + Wp_parameters.fatal ~current:true + "Axiomatic '%s' compiled, but '%a' not" + ax.ax_name Printer.pp_logic_var phi.l_var_info (* -------------------------------------------------------------------------- *) (* --- Binding Formal with Actual w.r.t Signature --- *) @@ -715,69 +730,69 @@ let rec bind_labels env labels : M.Sigma.t LabelMap.t = match labels with - | [] -> LabelMap.empty - | (l1,l2) :: labels -> - let l1 = Clabels.c_label l1 in - let l2 = Clabels.c_label l2 in - LabelMap.add l1 (mem_at env l2) (bind_labels env labels) - + | [] -> LabelMap.empty + | (l1,l2) :: labels -> + let l1 = Clabels.c_label l1 in + let l2 = Clabels.c_label l2 in + LabelMap.add l1 (mem_at env l2) (bind_labels env labels) + let call_params env (phi:logic_info) (labels:(logic_label * logic_label) list) (sparam : sig_param list) (parameters:F.term list) - : F.term list = + : F.term list = let mparams = wrap_lvar phi.l_profile parameters in let mlabels = bind_labels env labels in List.map (function - | Sig_value lv -> Logic_var.Map.find lv mparams - | Sig_chunk(c,l) -> - let sigma = - try LabelMap.find l mlabels - with Not_found -> - Wp_parameters.fatal "*** Label %a not-found@." Clabels.pretty l - in - M.Sigma.value sigma c + | Sig_value lv -> Logic_var.Map.find lv mparams + | Sig_chunk(c,l) -> + let sigma = + try LabelMap.find l mlabels + with Not_found -> + Wp_parameters.fatal "*** Label %a not-found@." Clabels.pretty l + in + M.Sigma.value sigma c ) sparam - + let call_fun env (phi:logic_info) (labels:(logic_label * logic_label) list) (parameters:F.term list) : F.term = match signature phi with - | CST c -> e_zint c - | SIG sparam -> - let es = call_params env phi labels sparam parameters in - F.e_fun (ACSL phi) es + | CST c -> e_zint c + | SIG sparam -> + let es = call_params env phi labels sparam parameters in + F.e_fun (ACSL phi) es let call_pred env (phi:logic_info) (labels:(logic_label * logic_label) list) (parameters:F.term list) : F.pred = match signature phi with - | CST _ -> assert false - | SIG sparam -> - let es = call_params env phi labels sparam parameters in - F.p_call (ACSL phi) es + | CST _ -> assert false + | SIG sparam -> + let es = call_params env phi labels sparam parameters in + F.p_call (ACSL phi) es (* -------------------------------------------------------------------------- *) (* --- Variable Bindings --- *) (* -------------------------------------------------------------------------- *) - + let logic_var env x = try Logic_var.Map.find x env.vars with Not_found -> try - let cst = Logic_env.find_logic_cons x in - let v = - match LogicBuiltins.logic cst with - | ACSLDEF -> call_fun env cst [] [] - | LFUN phi -> e_fun phi [] - | CONST e -> e - in plain_of_exp x.lv_type v + let cst = Logic_env.find_logic_cons x in + let v = + match LogicBuiltins.logic cst with + | ACSLDEF -> call_fun env cst [] [] + | LFUN phi -> e_fun phi [] + | CONST e -> e + in plain_of_exp x.lv_type v with Not_found -> - Wp_parameters.fatal "Unbound logic variable '%a'" - Printer.pp_logic_var x - + Wp_parameters.fatal "Unbound logic variable '%a'" + Printer.pp_logic_var x + end diff -Nru frama-c-20140301+neon+dfsg/src/wp/LogicCompiler.mli frama-c-20150201+sodium+dfsg/src/wp/LogicCompiler.mli --- frama-c-20140301+neon+dfsg/src/wp/LogicCompiler.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/LogicCompiler.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -50,8 +50,8 @@ val frame : kernel_function -> frame val frame_copy : frame -> frame - val call_pre : kernel_function -> value list -> sigma -> frame - val call_post : kernel_function -> value list -> sigma sequence -> frame + val call_pre : sigma -> kernel_function -> value list -> sigma -> frame + val call_post : sigma -> kernel_function -> value list -> sigma sequence -> frame val formal : varinfo -> value option val return : unit -> typ diff -Nru frama-c-20140301+neon+dfsg/src/wp/LogicSemantics.ml frama-c-20150201+sodium+dfsg/src/wp/LogicSemantics.ml --- frama-c-20140301+neon+dfsg/src/wp/LogicSemantics.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/LogicSemantics.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -76,16 +76,17 @@ | Vexp e -> F.pp_term fmt e | Vloc l -> M.pretty fmt l | Lset _ | Vset _ -> Format.pp_print_string fmt "" - + let pp_bound fmt = function None -> () | Some p -> F.pp_term fmt p let pp_sloc fmt = function | Sloc l -> M.pretty fmt l | Sarray(l,_,s) -> Format.fprintf fmt "@[%a@,+[%d]@]" - M.pretty l s + M.pretty l s | Srange(l,_,a,b) -> Format.fprintf fmt "@[%a@,+(%a@,..%a)@]" - M.pretty l pp_bound a pp_bound b - | Sdescr _ -> Format.fprintf fmt "" + M.pretty l pp_bound a pp_bound b + | Sdescr(xs,l,p) -> Format.fprintf fmt "@[{ %a | %a }@]" + M.pretty l F.pp_pred (F.p_forall xs p) let pp_region fmt sloc = List.iter (fun s -> Format.fprintf fmt "@ %a" pp_sloc s) sloc @@ -106,41 +107,41 @@ let loc_of_term env t = match C.logic env t with - | Vexp e -> M.pointer_loc e - | Vloc l -> l - | _ -> - Wp_parameters.abort ~current:true "Unexpected set (%a)" - Printer.pp_term t + | Vexp e -> M.pointer_loc e + | Vloc l -> l + | _ -> + Wp_parameters.abort ~current:true "Unexpected set (%a)" + Printer.pp_term t let val_of_term env t = match C.logic env t with - | Vexp e -> e - | Vloc l -> M.pointer_val l - | _ -> - Wp_parameters.abort ~current:true "Unexpected set (%a)" - Printer.pp_term t + | Vexp e -> e + | Vloc l -> M.pointer_val l + | _ -> + Wp_parameters.abort ~current:true "Unexpected set (%a)" + Printer.pp_term t let set_of_term env t = let v = C.logic env t in match v with - | Vexp s when Logic_typing.is_set_type t.term_type -> - let te = Logic_typing.type_of_set_elem t.term_type in - [Vset.Set(tau_of_ltype te,s)] - | _ -> L.vset v + | Vexp s when Logic_typing.is_set_type t.term_type -> + let te = Logic_typing.type_of_set_elem t.term_type in + [Vset.Set(tau_of_ltype te,s)] + | _ -> L.vset v let collection_of_term env t = let v = C.logic env t in match v with - | Vexp s when Logic_typing.is_set_type t.term_type -> - let te = Logic_typing.type_of_set_elem t.term_type in - Vset [Vset.Set(tau_of_ltype te,s)] - | w -> w + | Vexp s when Logic_typing.is_set_type t.term_type -> + let te = Logic_typing.type_of_set_elem t.term_type in + Vset [Vset.Set(tau_of_ltype te,s)] + | w -> w let term env t = match C.logic env t with - | Vexp e -> e - | Vloc l -> M.pointer_val l - | s -> Vset.concretize (L.vset s) + | Vexp e -> e + | Vloc l -> M.pointer_val l + | s -> Vset.concretize (L.vset s) (* -------------------------------------------------------------------------- *) (* --- Accessing an Offset (sub field-index in a compound) --- *) @@ -150,12 +151,12 @@ | TNoOffset -> v | TModel _ -> Wp_parameters.not_yet_implemented "Model field" | TField(f,offset) -> - let v_f = L.map (fun r -> e_getfield r (Cfield f)) v in - access_offset env v_f offset + let v_f = L.map (fun r -> e_getfield r (Cfield f)) v in + access_offset env v_f offset | TIndex(k,offset) -> - let rk = C.logic env k in - let v_k = L.apply e_get v rk in - access_offset env v_k offset + let rk = C.logic env k in + let v_k = L.apply e_get v rk in + access_offset env v_k offset (* -------------------------------------------------------------------------- *) (* --- Updating an Offset (sub field-index in a compound) --- *) @@ -165,13 +166,13 @@ | TNoOffset -> v | TModel _ -> Wp_parameters.not_yet_implemented "Model field" | TField(f,offset) -> - let r_f = e_getfield r (Cfield f) in - let r_fv = update_offset env r_f offset v in - e_setfield r (Cfield f) r_fv + let r_f = e_getfield r (Cfield f) in + let r_fv = update_offset env r_f offset v in + e_setfield r (Cfield f) r_fv | TIndex(k,offset) -> - let k = val_of_term env k in - let r_kv = update_offset env (e_get r k) offset v in - e_set r k r_kv + let k = val_of_term env k in + let r_kv = update_offset env (e_get r k) offset v in + e_set r k r_kv (* -------------------------------------------------------------------------- *) (* --- Shifting Location of an Offset (pointer shift) --- *) @@ -182,13 +183,13 @@ | TNoOffset -> typ , v | TModel _ -> Wp_parameters.not_yet_implemented "Model field" | TField(f,offset) -> - shift_offset env f.ftype (L.field v f) offset + shift_offset env f.ftype (L.field v f) offset | TIndex(k,offset) -> - let te = Cil.typeOf_array_elem typ in - let size = Ctypes.array_size typ in - let obj = Ctypes.object_of te in - let vloc = L.shift v obj ?size (C.logic env k) in - shift_offset env te vloc offset + let te = Cil.typeOf_array_elem typ in + let size = Ctypes.array_size typ in + let obj = Ctypes.object_of te in + let vloc = L.shift v obj ?size (C.logic env k) in + shift_offset env te vloc offset (* -------------------------------------------------------------------------- *) (* --- --- *) @@ -200,12 +201,12 @@ let logic_var env lv = match lv.lv_origin with - | None -> VAL (C.logic_var env lv) - | Some x -> - if x.vformal then match C.formal x with - | Some v -> VAL (logic_of_value v) - | None -> VAR x - else VAR x + | None -> VAL (C.logic_var env lv) + | Some x -> + if x.vformal then match C.formal x with + | Some v -> VAL (logic_of_value v) + | None -> VAR x + else VAR x (* -------------------------------------------------------------------------- *) (* --- Term L-Values (this means 'loading' the l-value) --- *) @@ -217,22 +218,22 @@ let term_lval env (lhost,loffset) = match lhost with - | TResult _ -> - let r = C.result () in - access_offset env (Vexp (e_var r)) loffset - | TMem e -> - let te = Logic_typing.ctype_of_pointed e.term_type in - let te , lp = shift_offset env te (C.logic env e) loffset in - L.load (C.sigma env) (Ctypes.object_of te) lp - | TVar{lv_name="\\exit_status"} -> - assert (loffset = TNoOffset) ; (* int ! *) - Vexp (e_var (C.status ())) - | TVar lv -> - begin - match logic_var env lv with - | VAL v -> access_offset env v loffset - | VAR x -> load_loc env x.vtype (M.cvar x) loffset - end + | TResult _ -> + let r = C.result () in + access_offset env (Vexp (e_var r)) loffset + | TMem e -> + let te = Logic_typing.ctype_of_pointed e.term_type in + let te , lp = shift_offset env te (C.logic env e) loffset in + L.load (C.sigma env) (Ctypes.object_of te) lp + | TVar{lv_name="\\exit_status"} -> + assert (loffset = TNoOffset) ; (* int ! *) + Vexp (e_var (C.status ())) + | TVar lv -> + begin + match logic_var env lv with + | VAL v -> access_offset env v loffset + | VAR x -> load_loc env x.vtype (M.cvar x) loffset + end (* -------------------------------------------------------------------------- *) (* --- Address of L-Values --- *) @@ -240,18 +241,19 @@ let addr_lval env (lhost,loffset) = match lhost with - | TResult _ -> Wp_parameters.fatal "Address of \\result" - | TMem e -> - let te = Logic_typing.ctype_of_pointed e.term_type in - snd (shift_offset env te (C.logic env e) loffset) - | TVar lv -> - begin - match logic_var env lv with - | VAL v -> Wp_parameters.fatal - "Address of logic value (%a)@." pp_logic v - | VAR x -> - snd (shift_offset env x.vtype (Vloc (M.cvar x)) loffset) - end + | TResult _ -> Wp_parameters.abort ~current:true "Address of \\result" + | TMem e -> + let te = Logic_typing.ctype_of_pointed e.term_type in + snd (shift_offset env te (C.logic env e) loffset) + | TVar lv -> + begin + match logic_var env lv with + | VAL v -> + Wp_parameters.abort ~current:true + "Address of logic value (%a)@." pp_logic v + | VAR x -> + snd (shift_offset env x.vtype (Vloc (M.cvar x)) loffset) + end (* -------------------------------------------------------------------------- *) (* --- Unary Operators --- *) @@ -277,71 +279,71 @@ let eqsort_of_type t = match Logic_utils.unroll_type t with - | Ltype({lt_name="set"},[_]) -> EQ_set - | Linteger | Lreal | Lvar _ | Larrow _ | Ltype _ -> EQ_plain - | Ctype t -> - match Ctypes.object_of t with - | C_pointer _ -> EQ_loc - | C_int _ | C_float _ -> EQ_plain - | C_comp c -> EQ_comp c - | C_array a -> EQ_array (Matrix.of_array a) + | Ltype({lt_name="set"},[_]) -> EQ_set + | Linteger | Lreal | Lvar _ | Larrow _ | Ltype _ -> EQ_plain + | Ctype t -> + match Ctypes.object_of t with + | C_pointer _ -> EQ_loc + | C_int _ | C_float _ -> EQ_plain + | C_comp c -> EQ_comp c + | C_array a -> EQ_array (Matrix.of_array a) let eqsort_of_comparison a b = match eqsort_of_type a.term_type , eqsort_of_type b.term_type with - | EQ_set , _ | _ , EQ_set -> EQ_set - | EQ_loc , EQ_loc -> EQ_loc - | EQ_comp c1 , EQ_comp c2 -> - if Compinfo.equal c1 c2 then EQ_comp c1 else EQ_incomparable - | EQ_array (t1,d1) , EQ_array (t2,d2) -> - if Ctypes.equal t1 t2 then - match Matrix.merge d1 d2 with - | Some d -> EQ_array(t1,d) - | None -> EQ_incomparable - else EQ_incomparable - | EQ_plain , EQ_plain -> EQ_plain - | _ -> EQ_incomparable + | EQ_set , _ | _ , EQ_set -> EQ_set + | EQ_loc , EQ_loc -> EQ_loc + | EQ_comp c1 , EQ_comp c2 -> + if Compinfo.equal c1 c2 then EQ_comp c1 else EQ_incomparable + | EQ_array (t1,d1) , EQ_array (t2,d2) -> + if Ctypes.equal t1 t2 then + match Matrix.merge d1 d2 with + | Some d -> EQ_array(t1,d) + | None -> EQ_incomparable + else EQ_incomparable + | EQ_plain , EQ_plain -> EQ_plain + | _ -> EQ_incomparable let use_equal positive = not positive && Wp_parameters.ExtEqual.get () let term_equal positive env a b = match eqsort_of_comparison a b with - - | EQ_set -> - let sa = set_of_term env a in - let sb = set_of_term env b in - (* TODO: should be parametric in the equality of elements *) - Vset.equal sa sb - - | EQ_loc -> - let la = loc_of_term env a in - let lb = loc_of_term env b in - M.loc_eq la lb - - | EQ_comp c -> - let va = val_of_term env a in - let vb = val_of_term env b in - if use_equal positive - then p_equal va vb - else Cvalues.equal_comp c va vb - - | EQ_array m -> - let va = val_of_term env a in - let vb = val_of_term env b in - if use_equal positive - then p_equal va vb - else Cvalues.equal_array m va vb - - | EQ_plain -> - p_equal (val_of_term env a) (val_of_term env b) - - | EQ_incomparable -> - (* incomparrable terms *) - Wp_parameters.warning ~current:true - "@[Incomparable terms (comparison is False):@ type %a with@ type %a@]" - Printer.pp_logic_type a.term_type - Printer.pp_logic_type b.term_type ; - p_false + + | EQ_set -> + let sa = set_of_term env a in + let sb = set_of_term env b in + (* TODO: should be parametric in the equality of elements *) + Vset.equal sa sb + + | EQ_loc -> + let la = loc_of_term env a in + let lb = loc_of_term env b in + M.loc_eq la lb + + | EQ_comp c -> + let va = val_of_term env a in + let vb = val_of_term env b in + if use_equal positive + then p_equal va vb + else Cvalues.equal_comp c va vb + + | EQ_array m -> + let va = val_of_term env a in + let vb = val_of_term env b in + if use_equal positive + then p_equal va vb + else Cvalues.equal_array m va vb + + | EQ_plain -> + p_equal (val_of_term env a) (val_of_term env b) + + | EQ_incomparable -> + (* incomparrable terms *) + Wp_parameters.warning ~current:true + "@[Incomparable terms (comparison is False):@ type %a with@ type %a@]" + Printer.pp_logic_type a.term_type + Printer.pp_logic_type b.term_type ; + p_false let term_diff positive env a b = p_not (term_equal (not positive) env a b) @@ -360,7 +362,7 @@ let exp_diff env a b = Vexp(e_prop (term_diff true env a b)) - + let exp_compare env vrel lrel a b = Vexp(e_prop (compare_term env vrel lrel a b)) @@ -382,45 +384,46 @@ let term_binop env binop a b = match binop with - | PlusA -> arith env L.apply_add (L.apply F.e_add) a b - | MinusA -> arith env L.apply_sub (L.apply F.e_sub) a b - | 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 -> - 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 - L.shift va (Ctypes.object_of te) vb - | MinusPI -> - 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 - L.shift va (Ctypes.object_of te) (L.map_opp vb) - | MinusPP -> - let te = Logic_typing.ctype_of_pointed a.term_type in - let la = loc_of_term env a in - let lb = loc_of_term env b in - Vexp(M.loc_diff (Ctypes.object_of te) la lb) - | Shiftlt -> L.apply Cint.l_lsl (C.logic env a) (C.logic env b) - | Shiftrt -> L.apply Cint.l_lsr (C.logic env a) (C.logic env b) - | BAnd -> L.apply Cint.l_and (C.logic env a) (C.logic env b) - | BXor -> L.apply Cint.l_xor (C.logic env a) (C.logic env b) - | BOr -> L.apply Cint.l_or (C.logic env a) (C.logic env b) - | LAnd -> Vexp(e_and [val_of_term env a;val_of_term env b]) - | LOr -> Vexp(e_or [val_of_term env a;val_of_term env b]) - | Lt -> exp_compare env p_lt M.loc_lt a b - | Gt -> exp_compare env p_lt M.loc_lt b a - | Le -> exp_compare env p_leq M.loc_leq a b - | Ge -> exp_compare env p_leq M.loc_leq b a - | Eq -> exp_equal env a b - | Ne -> exp_diff env a b + | PlusA -> arith env L.apply_add (L.apply F.e_add) a b + | MinusA -> arith env L.apply_sub (L.apply F.e_sub) a b + | 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 -> + 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 + L.shift va (Ctypes.object_of te) vb + | MinusPI -> + 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 + L.shift va (Ctypes.object_of te) (L.map_opp vb) + | MinusPP -> + let te = Logic_typing.ctype_of_pointed a.term_type in + let la = loc_of_term env a in + let lb = loc_of_term env b in + Vexp(M.loc_diff (Ctypes.object_of te) la lb) + | Shiftlt -> L.apply Cint.l_lsl (C.logic env a) (C.logic env b) + | Shiftrt -> L.apply Cint.l_lsr (C.logic env a) (C.logic env b) + | BAnd -> L.apply Cint.l_and (C.logic env a) (C.logic env b) + | BXor -> L.apply Cint.l_xor (C.logic env a) (C.logic env b) + | BOr -> L.apply Cint.l_or (C.logic env a) (C.logic env b) + | LAnd -> Vexp(e_and [val_of_term env a;val_of_term env b]) + | LOr -> Vexp(e_or [val_of_term env a;val_of_term env b]) + | Lt -> exp_compare env p_lt M.loc_lt a b + | Gt -> exp_compare env p_lt M.loc_lt b a + | Le -> exp_compare env p_leq M.loc_leq a b + | Ge -> exp_compare env p_leq M.loc_leq b a + | Eq -> exp_equal env a b + | Ne -> exp_diff env a b (* -------------------------------------------------------------------------- *) (* --- Term Cast --- *) (* -------------------------------------------------------------------------- *) type cvsort = + | L_bool | L_real | L_integer | L_cint of c_int @@ -429,51 +432,54 @@ let rec cvsort_of_type t = match Logic_utils.unroll_type t with - | Ltype({lt_name="set"},[t]) -> cvsort_of_type t - | Linteger -> L_integer - | Lreal -> L_real - | Ctype c -> - begin - match Ctypes.object_of c with - | C_int i -> L_cint i - | C_float f -> L_cfloat f - | C_pointer te -> L_pointer te - | C_array a -> L_pointer a.arr_element - | obj -> Warning.error "cast from (%a) not yet implemented" - Ctypes.pretty obj - end - | _ -> Warning.error "cast from (%a) not yet implemented" - Printer.pp_logic_type t + | Ltype({lt_name="set"},[t]) -> cvsort_of_type t + | Ltype _ as b when Logic_const.is_boolean_type b -> L_bool + | Linteger -> L_integer + | Lreal -> L_real + | Ctype c -> + begin + match Ctypes.object_of c with + | C_int i -> L_cint i + | C_float f -> L_cfloat f + | C_pointer te -> L_pointer te + | C_array a -> L_pointer a.arr_element + | obj -> Warning.error "cast from (%a) not implemented yet" + Ctypes.pretty obj + end + | _ -> Warning.error "cast from (%a) not implemented yet" + Printer.pp_logic_type t let term_cast env typ t = match Ctypes.object_of typ , cvsort_of_type t.term_type with - | C_int i , L_cint i0 -> - let v = C.logic env t in - if (Ctypes.sub_c_int i0 i) then v - else L.map (Cint.iconvert i) v - | C_int i , L_integer -> - L.map (Cint.iconvert i) (C.logic env t) - | C_int i , L_pointer _ -> - L.map_l2t (M.int_of_loc i) (C.logic env t) - | C_int i , (L_cfloat _ | L_real) -> - L.map (Cint.of_real i) (C.logic env t) - | C_float f , (L_cfloat _ | L_real) -> - L.map (Cfloat.fconvert f) (C.logic env t) - | C_float f , (L_cint _ | L_integer) -> - L.map (Cfloat.float_of_int f) (C.logic env t) - | C_pointer ty , L_pointer t0 -> - let value = C.logic env t in - let o_src = Ctypes.object_of t0 in - let o_dst = Ctypes.object_of ty in - if Ctypes.compare o_src o_dst = 0 - then value - else L.map_loc (M.cast { pre=o_src ; post=o_dst }) value - | C_pointer ty , (L_integer | L_cint _) -> - let obj = Ctypes.object_of ty in - L.map_t2l (M.loc_of_int obj) (C.logic env t) - | _ -> - Warning.error "Cast from (%a) to (%a) not yet implemented" - Printer.pp_typ typ Printer.pp_logic_type t.term_type + | C_int i , L_cint i0 -> + let v = C.logic env t in + if (Ctypes.sub_c_int i0 i) then v + else L.map (Cint.iconvert i) v + | C_int i , L_integer -> + L.map (Cint.iconvert i) (C.logic env t) + | C_int i , L_pointer _ -> + L.map_l2t (M.int_of_loc i) (C.logic env t) + | C_int i , (L_cfloat _ | L_real) -> + L.map (Cint.of_real i) (C.logic env t) + | C_float f , (L_cfloat _ | L_real) -> + L.map (Cfloat.fconvert f) (C.logic env t) + | C_float f , (L_cint _ | L_integer) -> + L.map (Cfloat.float_of_int f) (C.logic env t) + | C_pointer ty , L_pointer t0 -> + let value = C.logic env t in + let o_src = Ctypes.object_of t0 in + let o_dst = Ctypes.object_of ty in + if Ctypes.compare o_src o_dst = 0 + then value + else L.map_loc (M.cast { pre=o_src ; post=o_dst }) value + | C_pointer ty , (L_integer | L_cint _) -> + let obj = Ctypes.object_of ty in + L.map_t2l (M.loc_of_int obj) (C.logic env t) + | C_int _ , L_bool -> + L.map Cvalues.bool_val (C.logic env t) + | _ -> + Warning.error "Cast from (%a) to (%a) not implemented yet" + Printer.pp_logic_type t.term_type Printer.pp_typ typ (* -------------------------------------------------------------------------- *) (* --- Environment Binding --- *) @@ -483,11 +489,11 @@ let rec acc xs env hs = function | [] -> List.rev xs , env , hs | v::vs -> - let t = Lang.tau_of_ltype v.lv_type in - let x = Lang.freshvar ~basename:v.lv_name t in - let h = Cvalues.has_ltype v.lv_type (e_var x) in - let e = C.env_let env v (Vexp (e_var x)) in - acc (x::xs) e (h::hs) vs in + let t = Lang.tau_of_ltype v.lv_type in + let x = Lang.freshvar ~basename:v.lv_name t in + let h = Cvalues.has_ltype v.lv_type (e_var x) in + let e = C.env_let env v (Vexp (e_var x)) in + acc (x::xs) e (h::hs) vs in acc [] env [] qs (* -------------------------------------------------------------------------- *) @@ -496,113 +502,113 @@ let rec term_node (env:env) t = match t.term_node with - | TConst c -> Vexp (Cvalues.logic_constant c) - | TSizeOf _ | TSizeOfE _ | TSizeOfStr _ | TAlignOf _ | TAlignOfE _ -> - Vexp (Cvalues.constant_term t) - - | TLval lval -> term_lval env lval - | TAddrOf lval | TStartOf lval -> addr_lval env lval - - | TUnOp(Neg,t) when not (Logic_typing.is_integral_type t.term_type) -> - L.map F.e_opp (C.logic env t) - | TUnOp(unop,t) -> term_unop unop (C.logic env t) - | TBinOp(binop,a,b) -> term_binop env binop a b - - | TCastE(ty,t) -> term_cast env ty t - - | Tapp(f,ls,ts) -> - begin - match LogicBuiltins.logic f with - | ACSLDEF -> - let es = List.map (val_of_term env) ts in - Vexp( C.call_fun env f ls es ) - | CONST e -> Vexp e - | LFUN phi -> - let vs = List.map (val_of_term env) ts in - Vexp( e_fun phi vs ) - end - - | Tlambda _ -> - Warning.error "Lambda-functions not yet implemented" - - | TDataCons(c,ts) -> - let es = List.map (val_of_term env) ts in - begin - match LogicBuiltins.ctor c with - | ACSLDEF -> Vexp( e_fun (CTOR c) es ) - | CONST e -> Vexp e - | LFUN phi -> Vexp( e_fun phi es ) - end - - | Tif( cond , a , b ) -> - let c = val_of_term env cond in - let a = val_of_term env a in - let b = val_of_term env b in - Vexp (e_if c a b) - - | Tat( t , label ) -> - let clabel = Clabels.c_label label in - C.logic (C.env_at env clabel) t - - | Tbase_addr (label,t) -> - ignore label ; - L.map_loc M.base_addr (C.logic env t) - - | Toffset (label, _t) -> - ignore label ; - Warning.error "Offset construct not implemented yet" - - | Tblock_length (label,t) -> - let obj = object_of (Logic_typing.ctype_of_pointed t.term_type) in - let sigma = C.mem_at env (c_label label) in - L.map_l2t (M.block_length sigma obj) (C.logic env t) - - | Tnull -> - Vloc M.null - - | TCoerce (_,_) - | TCoerceE (_,_) -> - Wp_parameters.fatal "Jessie constructs" - - | TUpdate(a,offset,b) -> - Vexp (update_offset env (val_of_term env a) offset (val_of_term env b)) - - | Tempty_set -> Vset [] - | Tunion ts -> - L.union t.term_type (List.map (collection_of_term env) ts) - | Tinter ts -> - L.inter t.term_type (List.map (collection_of_term env) ts) - | Tcomprehension(t,qs,cond) -> - begin - let xs,env,domain = bind_quantifiers env qs in - let condition = match cond with - | None -> p_conj domain - | Some p -> - let p = Lang.without_assume (C.pred true env) p in - p_conj (p :: domain) - in match C.logic env t with - | Vexp e -> Vset[Vset.Descr(xs,e,condition)] - | Vloc l -> Lset[Sdescr(xs,l,condition)] - | _ -> Wp_parameters.fatal "comprehension set of sets" - end - - | Tlet( { l_var_info=v ; l_body=LBterm a } , b ) -> - let va = C.logic env a in - C.logic (C.env_let env v va) b - - | Tlet _ -> - Warning.error "Complex let-binding not implemented yet (%a)" - Printer.pp_term t - - | Trange(a,b) -> - let bound env = function - | None -> None - | Some x -> Some (val_of_term env x) - in Vset(Vset.range (bound env a) (bound env b)) - - | Ttypeof _ | Ttype _ -> - Warning.error "Type tag not implemented yet" - | TLogic_coerce(_,t) -> term_node env t + | TConst c -> Vexp (Cvalues.logic_constant c) + | TSizeOf _ | TSizeOfE _ | TSizeOfStr _ | TAlignOf _ | TAlignOfE _ -> + Vexp (Cvalues.constant_term t) + + | TLval lval -> term_lval env lval + | TAddrOf lval | TStartOf lval -> addr_lval env lval + + | TUnOp(Neg,t) when not (Logic_typing.is_integral_type t.term_type) -> + L.map F.e_opp (C.logic env t) + | TUnOp(unop,t) -> term_unop unop (C.logic env t) + | TBinOp(binop,a,b) -> term_binop env binop a b + + | TCastE(ty,t) -> term_cast env ty t + + | Tapp(f,ls,ts) -> + begin + match LogicBuiltins.logic f with + | ACSLDEF -> + let es = List.map (val_of_term env) ts in + Vexp( C.call_fun env f ls es ) + | CONST e -> Vexp e + | LFUN phi -> + let vs = List.map (val_of_term env) ts in + Vexp( e_fun phi vs ) + end + + | Tlambda _ -> + Warning.error "Lambda-functions not yet implemented" + + | TDataCons(c,ts) -> + let es = List.map (val_of_term env) ts in + begin + match LogicBuiltins.ctor c with + | ACSLDEF -> Vexp( e_fun (CTOR c) es ) + | CONST e -> Vexp e + | LFUN phi -> Vexp( e_fun phi es ) + end + + | Tif( cond , a , b ) -> + let c = val_of_term env cond in + let a = val_of_term env a in + let b = val_of_term env b in + Vexp (e_if c a b) + + | Tat( t , label ) -> + let clabel = Clabels.c_label label in + C.logic (C.env_at env clabel) t + + | Tbase_addr (label,t) -> + ignore label ; + L.map_loc M.base_addr (C.logic env t) + + | Toffset (label, _t) -> + ignore label ; + Warning.error "Offset construct not implemented yet" + + | Tblock_length (label,t) -> + let obj = object_of (Logic_typing.ctype_of_pointed t.term_type) in + let sigma = C.mem_at env (c_label label) in + L.map_l2t (M.block_length sigma obj) (C.logic env t) + + | Tnull -> + Vloc M.null + + | TCoerce (_,_) + | TCoerceE (_,_) -> + Wp_parameters.fatal "Jessie constructs" + + | TUpdate(a,offset,b) -> + Vexp (update_offset env (val_of_term env a) offset (val_of_term env b)) + + | Tempty_set -> Vset [] + | Tunion ts -> + L.union t.term_type (List.map (collection_of_term env) ts) + | Tinter ts -> + L.inter t.term_type (List.map (collection_of_term env) ts) + | Tcomprehension(t,qs,cond) -> + begin + let xs,env,domain = bind_quantifiers env qs in + let condition = match cond with + | None -> p_conj domain + | Some p -> + let p = Lang.without_assume (C.pred true env) p in + p_conj (p :: domain) + in match C.logic env t with + | Vexp e -> Vset[Vset.Descr(xs,e,condition)] + | Vloc l -> Lset[Sdescr(xs,l,condition)] + | _ -> Wp_parameters.fatal "comprehension set of sets" + end + + | Tlet( { l_var_info=v ; l_body=LBterm a } , b ) -> + let va = C.logic env a in + C.logic (C.env_let env v va) b + + | Tlet _ -> + Warning.error "Complex let-binding not implemented yet (%a)" + Printer.pp_term t + + | Trange(a,b) -> + let bound env = function + | None -> None + | Some x -> Some (val_of_term env x) + in Vset(Vset.range (bound env a) (bound env b)) + + | Ttypeof _ | Ttype _ -> + Warning.error "Type tag not implemented yet" + | TLogic_coerce(_,t) -> term_node env t (* -------------------------------------------------------------------------- *) (* --- Separated --- *) @@ -611,12 +617,12 @@ let separated_terms env ts = L.separated begin - List.map - (fun t -> - let te = Logic_typing.ctype_of_pointed t.term_type in - let obj = Ctypes.object_of te in - obj , L.sloc (C.logic env t) - ) ts + List.map + (fun t -> + let te = Logic_typing.ctype_of_pointed t.term_type in + let obj = Ctypes.object_of te in + obj , L.sloc (C.logic env t) + ) ts end (* -------------------------------------------------------------------------- *) @@ -625,12 +631,12 @@ let relation positive env rel a b = match rel with - | Rlt -> compare_term env p_lt M.loc_lt a b - | Rgt -> compare_term env p_lt M.loc_lt b a - | Rle -> compare_term env p_leq M.loc_leq a b - | Rge -> compare_term env p_leq M.loc_leq b a - | Req -> term_equal positive env a b - | Rneq -> term_diff positive env a b + | Rlt -> compare_term env p_lt M.loc_lt a b + | Rgt -> compare_term env p_lt M.loc_lt b a + | Rle -> compare_term env p_leq M.loc_leq a b + | Rge -> compare_term env p_leq M.loc_leq b a + | Req -> term_equal positive env a b + | Rneq -> term_diff positive env a b (* -------------------------------------------------------------------------- *) (* --- Predicates --- *) @@ -641,67 +647,68 @@ let sigma = C.mem_at env (Clabels.c_label label) in let addrs = C.logic env t in L.valid sigma acs (Ctypes.object_of te) (L.sloc addrs) - + let predicate positive env p = match p.content with - | Pfalse -> p_false - | Ptrue -> p_true - | Pseparated ts -> separated_terms env ts - | Prel(rel,a,b) -> relation positive env rel a b - | Pand(a,b) -> p_and (C.pred positive env a) (C.pred positive env b) - | Por(a,b) -> p_or (C.pred positive env a) (C.pred positive env b) - | Pxor(a,b) -> p_not (p_equiv (C.pred positive env a) (C.pred positive env b)) - | Pimplies(a,b) -> p_imply (C.pred (not positive) env a) (C.pred positive env b) - | Piff(a,b) -> p_equiv (C.pred positive env a) (C.pred positive env b) - | Pnot a -> p_not (C.pred (not positive) env a) - | Pif(t,a,b) -> - p_if (p_bool (val_of_term env t)) - (C.pred positive env a) - (C.pred positive env b) - - | Papp(f,ls,ts) -> - begin - match LogicBuiltins.logic f with - | ACSLDEF -> - let es = List.map (val_of_term env) ts in - C.call_pred env f ls es - | CONST e -> p_bool e - | LFUN phi -> - let vs = List.map (val_of_term env) ts in - p_call phi vs - end - - | Plet( { l_var_info=v ; l_body=LBterm a } , p ) -> - let va = C.logic env a in - C.pred positive (C.env_let env v va) p - - | Plet _ -> - Warning.error "Complex let-inding not implemented yet (%a)" - Printer.pp_predicate_named p - - | Pforall(qs,p) -> - let xs,env,hs = bind_quantifiers env qs in - let p = Lang.without_assume (C.pred positive env) p in - p_forall xs (p_hyps hs p) - - | Pexists(qs,p) -> - let xs,env,hs = bind_quantifiers env qs in - let p = Lang.without_assume (C.pred positive env) p in - p_exists xs (p_conj (p :: hs)) - - | Pat(p,label) -> - let clabel = Clabels.c_label label in - C.pred positive (C.env_at env clabel) p - - | Pvalid(label,t) -> valid env RW label t - | Pvalid_read(label,t) -> valid env RD label t - - | Pallocable _ | Pfreeable _ | Pfresh _ | Pinitialized _ -> - Warning.error "Allocable, Freeable, Valid_read, Fresh and Initialized not yet implemented (%a)" - Printer.pp_predicate_named p + | Pfalse -> p_false + | Ptrue -> p_true + | Pseparated ts -> separated_terms env ts + | Prel(rel,a,b) -> relation positive env rel a b + | Pand(a,b) -> p_and (C.pred positive env a) (C.pred positive env b) + | Por(a,b) -> p_or (C.pred positive env a) (C.pred positive env b) + | Pxor(a,b) -> p_not (p_equiv (C.pred positive env a) (C.pred positive env b)) + | Pimplies(a,b) -> p_imply (C.pred (not positive) env a) (C.pred positive env b) + | Piff(a,b) -> p_equiv (C.pred positive env a) (C.pred positive env b) + | Pnot a -> p_not (C.pred (not positive) env a) + | Pif(t,a,b) -> + p_if (p_bool (val_of_term env t)) + (C.pred positive env a) + (C.pred positive env b) + + | Papp(f,ls,ts) -> + begin + match LogicBuiltins.logic f with + | ACSLDEF -> + let es = List.map (val_of_term env) ts in + C.call_pred env f ls es + | CONST e -> p_bool e + | LFUN phi -> + let vs = List.map (val_of_term env) ts in + p_call phi vs + end + + | Plet( { l_var_info=v ; l_body=LBterm a } , p ) -> + let va = C.logic env a in + C.pred positive (C.env_let env v va) p + + | Plet _ -> + Warning.error "Complex let-inding not implemented yet (%a)" + Printer.pp_predicate_named p + + | Pforall(qs,p) -> + let xs,env,hs = bind_quantifiers env qs in + let p = Lang.without_assume (C.pred positive env) p in + p_forall xs (p_hyps hs p) + + | Pexists(qs,p) -> + let xs,env,hs = bind_quantifiers env qs in + let p = Lang.without_assume (C.pred positive env) p in + p_exists xs (p_conj (p :: hs)) + + | Pat(p,label) -> + let clabel = Clabels.c_label label in + C.pred positive (C.env_at env clabel) p + + | Pvalid(label,t) -> valid env RW label t + | Pvalid_read(label,t) -> valid env RD label t + + | Pallocable _ | Pfreeable _ | Pfresh _ | Pinitialized _ | Pdangling _-> + Warning.error + "Allocation, initialization and danglingness not yet implemented@\n\ + @[(%a)@]" Printer.pp_predicate_named p - | Psubtype _ -> - Warning.error "Type tags not implemented yet" + | Psubtype _ -> + Warning.error "Type tags not implemented yet" (* -------------------------------------------------------------------------- *) (* --- Set of locations for a term representing a set of l-values --- *) @@ -709,81 +716,112 @@ let assignable_lval env lv = match fst lv with - | TResult _ -> [] (* special case ! *) - | _ -> L.sloc (addr_lval env lv) + | TResult _ -> [] (* special case ! *) + | _ -> L.sloc (addr_lval env lv) let assignable env t = match t.term_node with - | Tempty_set -> [] - | TLval lv | TStartOf lv -> assignable_lval env lv - | Tunion ts -> List.concat (List.map (C.region env) ts) - | Tinter _ -> Warning.error "Intersection in assigns not implemented yet" - - | Tcomprehension(t,qs,cond) -> - begin - let xs,env,domain = bind_quantifiers env qs in - let conditions = match cond with - | None -> domain - | Some p -> C.pred true env p :: domain - in - List.map - (function - | Sloc l -> Sdescr(xs,l,p_conj conditions) - | (Sarray _ | Srange _ | Sdescr _) as sloc -> - let ys,l,extend = L.rdescr sloc in - Sdescr(xs@ys,l,p_conj (extend :: conditions)) - ) (C.region env t) - end - - | Tat(t,label) -> - C.region (C.env_at env (Clabels.c_label label)) t - - | Tlet( { l_var_info=v ; l_body=LBterm a } , b ) -> - let va = C.logic env a in - C.region (C.env_let env v va) b - - | Tlet _ -> - Warning.error "Complex let-binding not implemented yet (%a)" - Printer.pp_term t - - | TCastE(_,t) -> C.region env t - | TLogic_coerce(_,t) -> C.region env t - - | TBinOp _ | TUnOp _ | Trange _ | TUpdate _ | Tapp _ | Tif _ - | TConst _ | Tnull | TDataCons _ | Tlambda _ - | Ttype _ | Ttypeof _ - | TAlignOfE _ | TAlignOf _ | TSizeOfStr _ | TSizeOfE _ | TSizeOf _ - | Tblock_length _ | Tbase_addr _ | Toffset _ | TAddrOf _ - -> Wp_parameters.fatal "Non-assignable term (%a)" Printer.pp_term t - - | TCoerce (_,_) - | TCoerceE (_,_) -> - Wp_parameters.fatal "Jessie constructs" + | Tempty_set -> [] + | TLval lv | TStartOf lv -> assignable_lval env lv + | Tunion ts -> List.concat (List.map (C.region env) ts) + | Tinter _ -> Warning.error "Intersection in assigns not implemented yet" + + | Tcomprehension(t,qs,cond) -> + begin + let xs,env,domain = bind_quantifiers env qs in + let conditions = match cond with + | None -> domain + | Some p -> C.pred true env p :: domain + in + List.map + (function + | Sloc l -> Sdescr(xs,l,p_conj conditions) + | (Sarray _ | Srange _ | Sdescr _) as sloc -> + let ys,l,extend = L.rdescr sloc in + Sdescr(xs@ys,l,p_conj (extend :: conditions)) + ) (C.region env t) + end + + | Tat(t,label) -> + C.region (C.env_at env (Clabels.c_label label)) t + + | Tlet( { l_var_info=v ; l_body=LBterm a } , b ) -> + let va = C.logic env a in + C.region (C.env_let env v va) b + + | Tlet _ -> + Warning.error "Complex let-binding not implemented yet (%a)" + Printer.pp_term t + + | TCastE(_,t) -> C.region env t + | TLogic_coerce(_,t) -> C.region env t + + | TBinOp _ | TUnOp _ | Trange _ | TUpdate _ | Tapp _ | Tif _ + | TConst _ | Tnull | TDataCons _ | Tlambda _ + | Ttype _ | Ttypeof _ + | TAlignOfE _ | TAlignOf _ | TSizeOfStr _ | TSizeOfE _ | TSizeOf _ + | Tblock_length _ | Tbase_addr _ | Toffset _ | TAddrOf _ + -> Wp_parameters.abort ~current:true + "Non-assignable term (%a)" Printer.pp_term t + + | TCoerce (_,_) + | TCoerceE (_,_) -> + Wp_parameters.fatal "Jessie constructs" + + (* -------------------------------------------------------------------------- *) + (* --- Protection --- *) + (* -------------------------------------------------------------------------- *) + + let term_handler t = + let x = Lang.freshvar ~basename:"w" (Lang.tau_of_ltype t.term_type) in + Vexp (e_var x) + + let term_protected env t = + Warning.handle + ~handler:term_handler + ~severe:false + ~effect:"Hide sub-term definition" + (term_node env) t + + let pred_handler positive _p = + if positive then p_false else p_true + + let pred_protected positive env p = + let effect = + if positive then "Target turned to false" else "Ignored hypothesis" + in + Warning.handle + ~handler:(pred_handler positive) ~severe:positive + ~effect (predicate positive env) p (* -------------------------------------------------------------------------- *) (* --- Boot Strapping --- *) (* -------------------------------------------------------------------------- *) let term_trigger env t = - let v = term_node env t in + let v = term_protected env t in if List.mem "TRIGGER" t.term_name then begin - match v with - | Vexp e -> C.trigger (Trigger.of_term e) - | Vloc l -> C.trigger (Trigger.of_term (M.pointer_val l)) - | _ -> Wp_parameters.warning ~current:true - "Can not trigger on tset" + match v with + | Vexp e -> C.trigger (Trigger.of_term e) + | Vloc l -> C.trigger (Trigger.of_term (M.pointer_val l)) + | _ -> Wp_parameters.warning ~current:true + "Can not trigger on tset" end ; v let pred_trigger positive env np = - let p = predicate positive env np in + let p = pred_protected positive env np in if List.mem "TRIGGER" np.Cil_types.name then C.trigger (Trigger.of_pred p) ; p - let pred ~positive env p = Context.with_current_loc p.loc - (pred_trigger positive env) p - let logic env t = Context.with_current_loc t.term_loc (term_trigger env) t - let region env t = Context.with_current_loc t.term_loc (assignable env) t + let pred ~positive env p = + Context.with_current_loc p.loc (pred_trigger positive env) p + + let logic env t = + Context.with_current_loc t.term_loc (term_trigger env) t + + let region env t = + Context.with_current_loc t.term_loc (assignable env) t let () = C.bootstrap_pred (fun positive env p -> pred ~positive env p) let () = C.bootstrap_term term @@ -799,8 +837,8 @@ let assigns_from env froms = List.map (fun ({it_content=wr},_deps) -> - object_of_logic_type wr.term_type , - region env wr) + object_of_logic_type wr.term_type , + region env wr) froms let assigns env = function @@ -818,9 +856,9 @@ | Sarray(l,_,_) -> M.occurs x l | Srange(l,_,a,b) -> M.occurs x l || occurs_opt x a || occurs_opt x b | Sdescr(xs,l,p) -> - if List.exists (Var.equal x) xs then false - else (M.occurs x l || F.occursp x p) - + if List.exists (Var.equal x) xs then false + else (M.occurs x l || F.occursp x p) + let occurs x = List.exists (occurs_sloc x) let vars_opt = function None -> Vars.empty | Some t -> F.vars t @@ -829,13 +867,13 @@ | Sloc l | Sarray(l,_,_) -> M.vars l | Srange(l,_,a,b) -> - Vars.union (M.vars l) (Vars.union (vars_opt a) (vars_opt b)) + Vars.union (M.vars l) (Vars.union (vars_opt a) (vars_opt b)) | Sdescr(xs,l,p) -> - List.fold_left - (fun xs x -> Vars.remove x xs) - (Vars.union (M.vars l) (F.varsp p)) xs + List.fold_left + (fun xs x -> Vars.remove x xs) + (Vars.union (M.vars l) (F.varsp p)) xs let vars sloc = List.fold_left - (fun xs s -> Vars.union xs (vars_sloc s)) Vars.empty sloc + (fun xs s -> Vars.union xs (vars_sloc s)) Vars.empty sloc end diff -Nru frama-c-20140301+neon+dfsg/src/wp/LogicSemantics.mli frama-c-20150201+sodium+dfsg/src/wp/LogicSemantics.mli --- frama-c-20140301+neon+dfsg/src/wp/LogicSemantics.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/LogicSemantics.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -58,8 +58,8 @@ val frame : kernel_function -> frame val frame_copy : frame -> frame - val call_pre : kernel_function -> value list -> sigma -> frame - val call_post : kernel_function -> value list -> sigma sequence -> frame + val call_pre : sigma -> kernel_function -> value list -> sigma -> frame + val call_post : sigma -> kernel_function -> value list -> sigma sequence -> frame val return : unit -> typ val result : unit -> var @@ -70,7 +70,7 @@ (** {3 Traductions} *) type env - + val new_env : logic_var list -> env val move : env -> sigma -> env val sigma : env -> sigma @@ -95,5 +95,5 @@ val valid : sigma -> acs -> c_object -> region -> pred val included : c_object -> region -> c_object -> region -> pred val separated : (c_object * region) list -> pred - + end diff -Nru frama-c-20140301+neon+dfsg/src/wp/LogicUsage.ml frama-c-20150201+sodium+dfsg/src/wp/LogicUsage.ml --- frama-c-20140301+neon+dfsg/src/wp/LogicUsage.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/LogicUsage.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -45,10 +45,10 @@ let p = first name 0 n in let q = last name (pred n) in if p <= q then - let name = String.sub name p (q+1-p) in - match name.[0] with - | '0' .. '9' -> "_" ^ name - | _ -> name + let name = String.sub name p (q+1-p) in + match name.[0] with + | '0' .. '9' -> "_" ^ name + | _ -> name else "_" else name else "_" @@ -127,19 +127,19 @@ } module DatabaseType = Datatype.Make - (struct - type t = database - include Datatype.Serializable_undefined - let reprs = [empty_database ()] - let name = "Wp.LogicUsage.DatabaseType" - end) + (struct + type t = database + include Datatype.Serializable_undefined + let reprs = [empty_database ()] + let name = "Wp.LogicUsage.DatabaseType" + end) module Database = State_builder.Ref(DatabaseType) - (struct - let name = "Wp.LogicUsage.Database" - let dependencies = [Ast.self;Annotations.code_annot_state] - let default = empty_database - end) + (struct + let name = "Wp.LogicUsage.Database" + let dependencies = [Ast.self;Annotations.code_annot_state] + let default = empty_database + end) let pp_logic fmt l = Printer.pp_logic_var fmt l.l_var_info @@ -159,15 +159,15 @@ with Not_found -> LSet.empty (*TODO: Undected usage -> overloading issue *) in match LSet.elements over with - | [] | [_] -> d.names <- LMap.add l base d.names ; base - | symbols -> - let rec register k = function - | l::ls -> - let name = Printf.sprintf "%s_%d_" base k in - d.names <- LMap.add l name d.names ; - register (succ k) ls - | [] -> () - in register 1 symbols ; LMap.find l d.names + | [] | [_] -> d.names <- LMap.add l base d.names ; base + | symbols -> + let rec register k = function + | l::ls -> + let name = Printf.sprintf "%s_%d_" base k in + d.names <- LMap.add l name d.names ; + register (succ k) ls + | [] -> () + in register 1 symbols ; LMap.find l d.names let is_overloaded l = let d = Database.get () in @@ -177,14 +177,14 @@ let pp_profile fmt l = Format.fprintf fmt "%s" l.l_var_info.lv_name ; match l.l_profile with - | [] -> () - | x::xs -> - Format.fprintf fmt "@[(%a" Printer.pp_logic_type x.lv_type ; - List.iter - (fun y -> Format.fprintf fmt ",@,%a" - Printer.pp_logic_type y.lv_type) - xs ; - Format.fprintf fmt ")@]" + | [] -> () + | x::xs -> + Format.fprintf fmt "@[(%a" Printer.pp_logic_type x.lv_type ; + List.iter + (fun y -> Format.fprintf fmt ",@,%a" + Printer.pp_logic_type y.lv_type) + xs ; + Format.fprintf fmt ")@]" (* -------------------------------------------------------------------------- *) (* --- Utilities --- *) @@ -194,7 +194,7 @@ (if l.lem_axiom then Property.ip_axiom else Property.ip_lemma) (l.lem_name,l.lem_labels,l.lem_types, l.lem_property,(l.lem_position,l.lem_position)) - + let lemma_of_global proof = function | Dlemma(name,axiom,labels,types,pred,loc) -> { lem_name = name ; @@ -215,17 +215,17 @@ let ip_of_axiomatic g = match Property.ip_of_global_annotation_single g with - | None -> assert false - | Some ip -> ip + | None -> assert false + | Some ip -> ip let axiomatic_of_global proof = function | Daxiomatic(name,globals,loc) as g -> let a = { - ax_name = name ; - ax_position = fst loc ; - ax_property = ip_of_axiomatic g ; - ax_reads = Varinfo.Set.empty ; - ax_types = [] ; ax_lemmas = [] ; ax_logics = [] ; + ax_name = name ; + ax_position = fst loc ; + ax_property = ip_of_axiomatic g ; + ax_reads = Varinfo.Set.empty ; + ax_types = [] ; ax_lemmas = [] ; ax_logics = [] ; } in List.iter (populate a proof) globals ; a.ax_types <- List.rev a.ax_types ; @@ -287,125 +287,125 @@ (* -------------------------------------------------------------------------- *) class visitor = -object(self) + object(self) - inherit Visitor.frama_c_inplace + inherit Visitor.frama_c_inplace - val database = Database.get () - val mutable caller : logic_info option = None - val mutable axiomatic : axiomatic option = None - val mutable inductive : inductive_case option = None - val mutable toplevel = 0 + val database = Database.get () + val mutable caller : logic_info option = None + val mutable axiomatic : axiomatic option = None + val mutable inductive : inductive_case option = None + val mutable toplevel = 0 - method private section = - match axiomatic with + method private section = + match axiomatic with | None -> Toplevel toplevel | Some a -> Axiomatic a - method private do_var x = - match axiomatic with + method private do_var x = + match axiomatic with | None -> () | Some a -> a.ax_reads <- Varinfo.Set.add x a.ax_reads - method private do_lvar x = - try self#do_call (Logic_env.find_logic_cons x) [] - with Not_found -> () + method private do_lvar x = + try self#do_call (Logic_env.find_logic_cons x) [] + with Not_found -> () - method private do_call l labels = - match inductive with + method private do_call l labels = + match inductive with | Some case -> - if Logic_info.equal l case.ind_logic then - case.ind_call <- List.fold_left add_call case.ind_call labels + if Logic_info.equal l case.ind_logic then + case.ind_call <- List.fold_left add_call case.ind_call labels | None -> - match caller with - | None -> () - | Some f -> - if Logic_info.equal f l then - database.recursives <- LSet.add f database.recursives - - method private do_case l (case,_labels,_types,pnamed) = - begin - let indcase = { - ind_logic = l ; - ind_case = case ; - ind_call = LabelMap.empty ; - } in - inductive <- Some indcase ; - ignore (visitFramacPredicateNamed (self :> frama_c_visitor) pnamed) ; - inductive <- None ; indcase - end - - (* --- LVALUES --- *) - - method! vlval = function - | (Var x,_) -> self#do_var x ; DoChildren - | _ -> DoChildren - - method! vterm_lval = function - | (TVar { lv_origin=Some x } , _ ) -> self#do_var x ; DoChildren - | (TVar x , _ ) -> self#do_lvar x ; DoChildren - | _ -> DoChildren - - (* --- TERMS --- *) + match caller with + | None -> () + | Some f -> + if Logic_info.equal f l then + database.recursives <- LSet.add f database.recursives + + method private do_case l (case,_labels,_types,pnamed) = + begin + let indcase = { + ind_logic = l ; + ind_case = case ; + ind_call = LabelMap.empty ; + } in + inductive <- Some indcase ; + ignore (visitFramacPredicateNamed (self :> frama_c_visitor) pnamed) ; + inductive <- None ; indcase + end + + (* --- LVALUES --- *) + + method! vlval = function + | (Var x,_) -> self#do_var x ; DoChildren + | _ -> DoChildren + + method! vterm_lval = function + | (TVar { lv_origin=Some x } , _ ) -> self#do_var x ; DoChildren + | (TVar x , _ ) -> self#do_lvar x ; DoChildren + | _ -> DoChildren + + (* --- TERMS --- *) + + method! vterm_node = function + | Tapp(l,labels,_) -> self#do_call l labels ; DoChildren + | _ -> DoChildren + + (* --- PREDICATE --- *) + + method! vpredicate = function + | Papp(l,labels,_) -> self#do_call l labels ; DoChildren + | _ -> DoChildren - method! vterm_node = function - | Tapp(l,labels,_) -> self#do_call l labels ; DoChildren - | _ -> DoChildren - - (* --- PREDICATE --- *) - - method! vpredicate = function - | Papp(l,labels,_) -> self#do_call l labels ; DoChildren - | _ -> DoChildren - - method! vannotation global = - match global with + method! vannotation global = + match global with (* --- AXIOMATICS --- *) | Daxiomatic _ -> - begin - let pf = database.proofcontext in - let ax = axiomatic_of_global pf global in - register_axiomatic database ax ; - axiomatic <- Some ax ; - DoChildrenPost - (fun g -> - if not (is_global_axiomatic ax) then - database.proofcontext <- pf ; - axiomatic <- None ; - toplevel <- succ toplevel ; - g) - end + begin + let pf = database.proofcontext in + let ax = axiomatic_of_global pf global in + register_axiomatic database ax ; + axiomatic <- Some ax ; + DoChildrenPost + (fun g -> + if not (is_global_axiomatic ax) then + database.proofcontext <- pf ; + axiomatic <- None ; + toplevel <- succ toplevel ; + g) + end (* --- LOGIC INFO --- *) | Dfun_or_pred(l,_) -> - begin - register_logic database self#section l ; - match l.l_body with - | LBnone when axiomatic = None -> SkipChildren - - | LBnone | LBreads _ | LBterm _ | LBpred _ -> - caller <- Some l ; - DoChildrenPost (fun g -> caller <- None ; g) - - | LBinductive cases -> - register_cases l (List.map (self#do_case l) cases) ; - SkipChildren - end + begin + register_logic database self#section l ; + match l.l_body with + | LBnone when axiomatic = None -> SkipChildren + + | LBnone | LBreads _ | LBterm _ | LBpred _ -> + caller <- Some l ; + DoChildrenPost (fun g -> caller <- None ; g) + + | LBinductive cases -> + register_cases l (List.map (self#do_case l) cases) ; + SkipChildren + end (* --- LEMMAS --- *) - + | Dlemma _ -> - let lem = lemma_of_global database.proofcontext global in - register_lemma database self#section lem ; - database.proofcontext <- lem :: database.proofcontext ; - SkipChildren + let lem = lemma_of_global database.proofcontext global in + register_lemma database self#section lem ; + database.proofcontext <- lem :: database.proofcontext ; + SkipChildren | Dtype(t,_) -> - register_type database self#section t ; - SkipChildren + register_type database self#section t ; + SkipChildren (* --- OTHERS --- *) @@ -414,11 +414,11 @@ | Dtype_annot _ | Dmodel_annot _ | Dcustom_annot _ - -> SkipChildren + -> SkipChildren - method! vfunc _ = SkipChildren - -end + method! vfunc _ = SkipChildren + + end let compute () = Wp_parameters.feedback "Collecting axiomatic usage" ; @@ -445,9 +445,9 @@ try (List.find (fun i -> i.ind_case = case) cases).ind_call with Not_found -> Wp_parameters.fatal "No case '%s' for inductive '%s'" - case l.l_var_info.lv_name - with Not_found -> - Wp_parameters.fatal "Non-inductive '%s'" l.l_var_info.lv_name + case l.l_var_info.lv_name + with Not_found -> + Wp_parameters.fatal "Non-inductive '%s'" l.l_var_info.lv_name let axiomatic a = compute () ; @@ -516,17 +516,17 @@ let cases = LMap.find l d.cases in dump_profile fmt "inductive" l ; List.iter - (fun ind -> - Format.fprintf fmt " @[case %s:" ind.ind_case ; - LabelMap.iter - (fun l s -> - Format.fprintf fmt "@ @[{%a:" Clabels.pretty l ; - LabelSet.iter (fun l -> Format.fprintf fmt "@ %a" - Clabels.pretty l) s ; - Format.fprintf fmt "}@]" - ) ind.ind_call ; - Format.fprintf fmt "@]@\n" - ) cases ; + (fun ind -> + Format.fprintf fmt " @[case %s:" ind.ind_case ; + LabelMap.iter + (fun l s -> + Format.fprintf fmt "@ @[{%a:" Clabels.pretty l ; + LabelSet.iter (fun l -> Format.fprintf fmt "@ %a" + Clabels.pretty l) s ; + Format.fprintf fmt "}@]" + ) ind.ind_call ; + Format.fprintf fmt "@]@\n" + ) cases ; with Not_found -> let kind = if l.l_type = None then "predicate" else "function" in dump_profile fmt kind l ; @@ -551,28 +551,28 @@ begin fun fmt -> let d = Database.get () in SMap.iter - (fun _ a -> - Format.fprintf fmt "Axiomatic %s {@\n" a.ax_name ; - List.iter (dump_type fmt) a.ax_types ; - List.iter (dump_logic fmt d) a.ax_logics ; - List.iter (dump_lemma fmt) a.ax_lemmas ; - Format.fprintf fmt "}@\n" - ) d.axiomatics ; + (fun _ a -> + Format.fprintf fmt "Axiomatic %s {@\n" a.ax_name ; + List.iter (dump_type fmt) a.ax_types ; + List.iter (dump_logic fmt d) a.ax_logics ; + List.iter (dump_lemma fmt) a.ax_lemmas ; + Format.fprintf fmt "}@\n" + ) d.axiomatics ; TMap.iter - (fun t s -> - Format.fprintf fmt " * type '%s' in %a@\n" - t.lt_name pp_section s) - d.types ; + (fun t s -> + Format.fprintf fmt " * type '%s' in %a@\n" + t.lt_name pp_section s) + d.types ; LMap.iter - (fun l s -> - Format.fprintf fmt " * logic '%a' in %a@\n" - pp_logic l pp_section s) - d.logics ; + (fun l s -> + Format.fprintf fmt " * logic '%a' in %a@\n" + pp_logic l pp_section s) + d.logics ; SMap.iter - (fun l (lem,s) -> - Format.fprintf fmt " * %s '%s' in %a@\n" - (if lem.lem_axiom then "axiom" else "lemma") - l pp_section s) - d.lemmas ; + (fun l (lem,s) -> + Format.fprintf fmt " * %s '%s' in %a@\n" + (if lem.lem_axiom then "axiom" else "lemma") + l pp_section s) + d.lemmas ; Format.fprintf fmt "-------------------------------------------------@." ; end diff -Nru frama-c-20140301+neon+dfsg/src/wp/LogicUsage.mli frama-c-20150201+sodium+dfsg/src/wp/LogicUsage.mli --- frama-c-20140301+neon+dfsg/src/wp/LogicUsage.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/LogicUsage.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -64,13 +64,13 @@ val section_of_type : logic_type_info -> logic_section val section_of_logic : logic_info -> logic_section val proof_context : unit -> logic_lemma list - (** Lemmas that are not in an axiomatic. *) +(** Lemmas that are not in an axiomatic. *) val is_recursive : logic_info -> bool val get_induction_labels : logic_info -> string -> LabelSet.t LabelMap.t - (** Given an inductive [phi{...A...}]. - Whenever in [case C{...B...}] we have a call to [phi{...B...}], - then [A] belongs to [(induction phi C).[B]]. *) +(** Given an inductive [phi{...A...}]. + Whenever in [case C{...B...}] we have a call to [phi{...B...}], + then [A] belongs to [(induction phi C).[B]]. *) val get_name : logic_info -> string val pp_profile : Format.formatter -> logic_info -> unit diff -Nru frama-c-20140301+neon+dfsg/src/wp/Makefile.in frama-c-20150201+sodium+dfsg/src/wp/Makefile.in --- frama-c-20140301+neon+dfsg/src/wp/Makefile.in 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Makefile.in 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of WP plug-in of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat a l'energie atomique et aux energies # # alternatives) # # # @@ -34,16 +34,6 @@ # Coq Resources Installation -ifeq (@COQC@,yes) -byte:: .make-wp-coq -opt:: .make-wp-coq -endif - -ifeq (@WHY3COQC@,yes) -byte:: .make-wp-why3 -opt:: .make-wp-why3 -endif - include $(PLUGIN_DIR)/share/Makefile.resources # Extension of the GUI for wp is compilable @@ -70,7 +60,7 @@ cil2cfg normAtLabels \ wpPropId wpStrategy wpAnnot \ Context Warning Model Lang Matrix Passive Splitter \ - Letify Cleaning Partitioning Conditions \ + Letify Cleaning Conditions \ LogicBuiltins Definitions \ Cint Cfloat Vset Region Cstring Cvalues \ CodeSemantics \ @@ -92,7 +82,8 @@ $(PLUGIN_DIR)/script.ml \ $(PLUGIN_DIR)/rformat.ml \ $(PLUGIN_DIR)/driver.ml \ - $(PLUGIN_DIR)/why3_xml.ml + $(PLUGIN_DIR)/why3_xml.ml \ + $(PLUGIN_DIR)/qed/src/numbers.ml \ PLUGIN_UNDOC+= PLUGIN_DOCFLAGS+= -I $(PLUGIN_DIR)/qed/bin @@ -100,6 +91,7 @@ PLUGIN_HAS_MLI:=yes PLUGIN_DISTRIBUTED:=$(PLUGIN_ENABLE) PLUGIN_DISTRIB_EXTERNAL:= \ + Changelog \ Makefile.in \ configure.ac \ configure \ @@ -116,6 +108,7 @@ UNMODIFIED_WHY3+= $(addprefix $(PLUGIN_DIR)/share/, $(ALL_UNMODIFIED_WHY3_RESOURCES)) MODIFIED_WHY3+= $(addprefix $(PLUGIN_DIR)/share/, $(ALL_MODIFIED_WHY3_RESOURCES)) +NO_CHECK_HEADERS+=$(addprefix $(PLUGIN_DIR), Changelog) # -------------------------------------------------------------------------- # --- Qed Dependencies --- @@ -174,8 +167,8 @@ endif $(Wp_DIR)/Makefile: $(Wp_DIR)/Makefile.in $(Wp_DIR)/share/Makefile.resources $(QED_SRC)/Makefile.src $(CONFIG_STATUS_DIR)/config.status - @cd $(CONFIG_STATUS_DIR) && ./config.status - $(QUIET_MAKE) depend + @cd $(CONFIG_STATUS_DIR) && ./config.status --file $@ + #$(QUIET_MAKE) depend # -------------------------------------------------------------------------- # --- Qed Dependencies --- @@ -252,7 +245,7 @@ $(ALL_WHY3_SOURCES) INSTALL_OPT?= -INSTALL=@$(Wp_DIR)/share/instwp $(INSTALL_OPT) +INSTALL_SHARE=@$(Wp_DIR)/share/instwp $(INSTALL_OPT) byte:: $(Wp_DIR)/share/instwp opt:: $(Wp_DIR)/share/instwp @@ -271,33 +264,20 @@ wp-coq-all: wp-coq wp-why3 -wp-coq: .make-wp-coq +wp-coq: coqwpcompile @echo "Run 'make wp-coq-install' to install all precompiled libraries" -wp-why3: .make-wp-why3 +wp-why3: why3compile @echo "Run 'make wp-coq-install' to install all precompiled libraries" -.make-wp-coq: $(addprefix $(Wp_DIR)/share/, $(WP_COQ_SOURCES)) - @echo "Compiling Wp-Coq Library" - $(QUIET_MAKE) -C $(Wp_DIR)/share/coqwp depend - $(MAKE) -C $(Wp_DIR)/share/coqwp all - @touch .make-wp-coq - -.make-wp-why3: $(addprefix $(Wp_DIR)/share/, $(WHY3_COQ_SOURCES)) - @echo "Compiling Wp-Why3 Coq Library" - $(QUIET_MAKE) -C $(Wp_DIR)/share/why3 depend - $(MAKE) -C $(Wp_DIR)/share/why3 all - @touch .make-wp-why3 - -wp-coq-clean: - @echo "Cleaning All Coq Libraries" - @rm -f .make-wp-coq .make-why3-coq - $(QUIET_MAKE) -C $(Wp_DIR)/share/coqwp clean - $(QUIET_MAKE) -C $(Wp_DIR)/share/why3 clean +WP_COQC_ENABLED=@COQC@ +WP_WHY3COQC_ENABLED=@WHY3COQC@ + +include $(Wp_DIR)/share/Makefile wp-coq-install: $(PRINT_INSTALL) "Coq Libraries" - $(INSTALL) -f -p -s \ + $(INSTALL_SHARE) -f -p -s \ -i $(Wp_DIR)/share \ -d $(FRAMAC_DATADIR)/wp \ $(ALL_COQ_BINARIES) @@ -308,7 +288,6 @@ @rm -f $(FRAMAC_DATADIR)/wp/coqwp/*.vo @rm -f $(FRAMAC_DATADIR)/wp/coqwp/*/*.vo -clean:: wp-coq-clean # -------------------------------------------------------------------------- # --- Why3 configuration @@ -339,7 +318,7 @@ install:: $(PRINT_INSTALL) WP shared files $(MKDIR) $(FRAMAC_DATADIR)/wp - $(INSTALL) -p \ + $(INSTALL_SHARE) -p \ -i $(Wp_DIR)/share \ -d $(FRAMAC_DATADIR)/wp \ $(ALL_RESOURCES) -f -b $(ALL_COQ_BINARIES) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Matrix.ml frama-c-20150201+sodium+dfsg/src/wp/Matrix.ml --- frama-c-20140301+neon+dfsg/src/wp/Matrix.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Matrix.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -41,17 +41,17 @@ | Some _,None -> (-1) | None,Some _ -> 1 | Some _,Some _ -> 0 - + let compare (e1,ds1) (e2,ds2) = let cmp = E.compare e1 e2 in if cmp = 0 then Qed.Hcons.compare_list compare_dim ds1 ds2 else cmp - + let pretty fmt (obj,ds) = Ctypes.pretty fmt obj ; List.iter (function - | None -> Format.pp_print_string fmt "[]" - | Some d -> Format.fprintf fmt "[%d]" d + | None -> Format.pp_print_string fmt "[]" + | Some d -> Format.fprintf fmt "[%d]" d ) ds end @@ -106,13 +106,13 @@ let rec collect rank = function | [] -> { - size_var = [] ; - size_val = [] ; - index_var = [] ; - index_val = [] ; - index_range = [] ; - index_offset = [] ; - monotonic = true ; + size_var = [] ; + size_val = [] ; + index_var = [] ; + index_val = [] ; + index_range = [] ; + index_offset = [] ; + monotonic = true ; } | d::ds -> let denv = collect (succ rank) ds in @@ -121,29 +121,29 @@ let k_val = e_var k_var in let k_ofs = e_prod (k_val :: denv.size_val) in match d with - | None -> - { denv with - index_var = k_var :: denv.index_var ; - index_val = k_val :: denv.index_val ; - index_offset = k_ofs :: denv.index_offset ; - monotonic = false ; - } - | Some _ -> - let n_base = match rank with 0 -> "n" | 1 -> "m" | _ -> "d" in - let n_var = Lang.freshvar ~basename:n_base Qed.Logic.Int in - let n_val = e_var n_var in - let k_inf = p_leq e_zero k_val in - let k_sup = p_lt k_val n_val in - { - size_var = n_var :: denv.size_var ; - size_val = n_val :: denv.size_val ; - index_var = k_var :: denv.index_var ; - index_val = k_val :: denv.index_val ; - index_offset = k_ofs :: denv.index_offset ; - index_range = k_inf :: k_sup :: denv.index_range ; - monotonic = denv.monotonic ; - } - + | None -> + { denv with + index_var = k_var :: denv.index_var ; + index_val = k_val :: denv.index_val ; + index_offset = k_ofs :: denv.index_offset ; + monotonic = false ; + } + | Some _ -> + let n_base = match rank with 0 -> "n" | 1 -> "m" | _ -> "d" in + let n_var = Lang.freshvar ~basename:n_base Qed.Logic.Int in + let n_val = e_var n_var in + let k_inf = p_leq e_zero k_val in + let k_sup = p_lt k_val n_val in + { + size_var = n_var :: denv.size_var ; + size_val = n_val :: denv.size_val ; + index_var = k_var :: denv.index_var ; + index_val = k_val :: denv.index_val ; + index_offset = k_ofs :: denv.index_offset ; + index_range = k_inf :: k_sup :: denv.index_range ; + monotonic = denv.monotonic ; + } + let denv = collect 0 let rec dval = function | [] -> [] @@ -156,13 +156,13 @@ let rec do_merge ds1 ds2 = match ds1 , ds2 with - | [] , [] -> [] - | [] , _ | _ , [] -> raise Exit - | d1::ds1 , d2::ds2 -> - let d = match d1 , d2 with - | None , _ | _ , None -> None - | Some n1 , Some n2 -> if n1=n2 then d1 else raise Exit - in d :: do_merge ds1 ds2 + | [] , [] -> [] + | [] , _ | _ , [] -> raise Exit + | d1::ds1 , d2::ds2 -> + let d = match d1 , d2 with + | None , _ | _ , None -> None + | Some n1 , Some n2 -> if n1=n2 then d1 else raise Exit + in d :: do_merge ds1 ds2 let merge ds1 ds2 = try Some(do_merge ds1 ds2) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Matrix.mli frama-c-20150201+sodium+dfsg/src/wp/Matrix.mli --- frama-c-20140301+neon+dfsg/src/wp/Matrix.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Matrix.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/mcfg.mli frama-c-20150201+sodium+dfsg/src/wp/mcfg.mli --- frama-c-20140301+neon+dfsg/src/wp/mcfg.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/mcfg.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -82,12 +82,17 @@ val return : t_env -> stmt -> exp option -> t_prop -> t_prop val test : t_env -> stmt -> exp -> t_prop -> t_prop -> t_prop val switch : t_env -> stmt -> exp -> (exp list * t_prop) list -> t_prop -> t_prop + + val has_init : t_env -> bool val init_value : t_env -> lval -> typ -> exp option -> t_prop -> t_prop - (** init_value env lv t v_opt wp: - put value of type t (or default if None) in lv *) + (** init_value env lv t v_opt wp: + put value of type t (or default if None) in lv *) val init_range : t_env -> lval -> typ -> int64 -> int64 -> t_prop -> t_prop - (** init_range env lv t_elt a b wp : - put default values of type t_elt in lv[k] with a <= k < b *) + (** init_range env lv t_elt a b wp : + put default values of type t_elt in lv[k] with a <= k < b *) + + val init_const : t_env -> varinfo -> t_prop -> t_prop + (** the (entire) variable has its initial value *) val loop_entry : t_prop -> t_prop val loop_step : t_prop -> t_prop diff -Nru frama-c-20140301+neon+dfsg/src/wp/MemEmpty.ml frama-c-20150201+sodium+dfsg/src/wp/MemEmpty.ml --- frama-c-20140301+neon+dfsg/src/wp/MemEmpty.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/MemEmpty.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -98,6 +98,7 @@ let valid _sigma _l = Warning.error ~source "No validity" let scope sigma _s _xs = sigma , [] +let global _sigma _p = p_true let included _s1 _s2 = no_pointer () let separated _s1 _s2 = no_pointer () diff -Nru frama-c-20140301+neon+dfsg/src/wp/MemEmpty.mli frama-c-20150201+sodium+dfsg/src/wp/MemEmpty.mli --- frama-c-20140301+neon+dfsg/src/wp/MemEmpty.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/MemEmpty.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Memory.mli frama-c-20150201+sodium+dfsg/src/wp/Memory.mli --- frama-c-20140301+neon+dfsg/src/wp/Memory.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Memory.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -44,12 +44,14 @@ | Rloc of c_object * 'a | Rarray of 'a * c_object * int | Rrange of 'a * c_object * term option * term option +(** a contiguous set of location *) type 'a sloc = | Sloc of 'a | Sarray of 'a * c_object * int (** full sized-array range *) | Srange of 'a * c_object * term option * term option | Sdescr of var list * 'a * pred +(** a set of location *) type 'a logic = | Vexp of term @@ -57,7 +59,10 @@ | Vset of Vset.set | Lset of 'a sloc list -(** Memory Variables *) +(** Memory Variables + + The memory is partitionned into chunk, set of memory location. + *) module type Chunk = sig @@ -72,14 +77,17 @@ val is_framed : t -> bool (** Whether the Chunk is local to a function. Means the chunk is separated from any call side-effect. *) - + end -(** Memory Environment *) +(** Memory Environment + + Represent the content of the memory + *) module type Sigma = sig - + type chunk type domain type t @@ -119,49 +127,135 @@ module Sigma : Sigma with type chunk = Chunk.t - and type domain = Heap.set + and type domain = Heap.set type loc + (** Representation of the memory location in the model. *) + type chunk = Chunk.t type sigma = Sigma.t type segment = loc rloc val pretty : Format.formatter -> loc -> unit + (** pretty printing of memory location *) + val vars : loc -> Vars.t + (** Return the logic variables from which the given location depend on. *) + val occurs : var -> loc -> bool + (** Test if a location depend on a given logic variable *) val null : loc + (** Return the location of the null pointer *) + val literal : eid:int -> Cstring.cst -> loc + (** Return the memory location of a constant string, + the id is a unique identifier. + *) + val cvar : varinfo -> loc + (** Return the location of a C variable *) + val pointer_loc : term -> loc + (** ??? *) + val pointer_val : loc -> term + (** ??? *) + val field : loc -> fieldinfo -> loc + (** Return the memory location obtained by field access from a given + memory location + *) + val shift : loc -> c_object -> term -> loc + (** Return the memory location obtained by array access at an index + represented by the given {!term}. The element of the array are of + the given {!c_object} type *) + val base_addr : loc -> loc + (** Return the memory location of the base address of a given memory + location *) + val block_length : sigma -> c_object -> loc -> term + (** Returns the length (in bytes) of the allocated block containing + the given location *) val cast : c_object sequence -> loc -> loc + (** Cast a memory location into another memory location. + For [cast ty loc] the cast is done from [ty.pre] to [ty.post] + *) + val loc_of_int : c_object -> term -> loc + (** Cast a term representing a pointer to a c_object into a memory + location *) + val int_of_loc : c_int -> loc -> term + (** Cast a memory location into an integer of the given type *) val domain : c_object -> loc -> Heap.set + (** Give the set of chunk where an object of the given type at the + given location is stored. Over approximation of this set is + allowed. + *) val load : sigma -> c_object -> loc -> loc value + (** Return the value of the object of the given type at the given + location in the given memory state *) + val copied : sigma sequence -> c_object -> loc -> loc -> pred list + (** Return a set of formula that express a copy between two memory state. + [copied sigma ty loc1 loc2] returns a set of formula that express that + the content for an object [ty] is the same in [sigma.pre] at [loc1] and + in [sigma.post] at [loc2] + *) + val stored : sigma sequence -> c_object -> loc -> term -> pred list + (** Return a set of formula that express a modification between two + memory state. + [copied sigma ty loc t] returns a set of formula that express that + [sigma.pre] and [sigma.post] are identical except for an object [ty] at + location [loc] which is represented by [t] in [sigma.post]. + *) + val assigned : sigma sequence -> c_object -> loc sloc -> pred list + (** + Return a set of formula that express that two memory state are the same + except at the given set of memory location. This function can + over-approximate the set of given memory location (e.g it can + return [true] as if the all set of memory location was given) + *) val is_null : loc -> pred + (** Return the formula that check if a given location is null *) + val loc_eq : loc -> loc -> pred val loc_lt : loc -> loc -> pred val loc_neq : loc -> loc -> pred val loc_leq : loc -> loc -> pred + (** Memory location comparisons *) + val loc_diff : c_object -> loc -> loc -> term + (** Compute the length in bytes between two memory locations *) val valid : sigma -> acs -> segment -> pred + (** Return the formula that tests if a memory state is valid + (according to {!acs}) in the given memory state at the given + segment. + *) + val scope : sigma -> Mcfg.scope -> varinfo list -> sigma * pred list + (** Manage the scope of variables. Returns the updated memory model + and hypotheses modeling the new validity-scope of the variables. *) + + val global : sigma -> term -> pred + (** Given a pointer value [p], assumes this pointer [p] (when valid) + is allocated outside the function frame under analysis. This means + separated from the formals and locals of the function. *) val included : segment -> segment -> pred + (** Return the formula that tests if two segment are included *) + val separated : segment -> segment -> pred + (** Return the formula that tests if two segment are separated *) end diff -Nru frama-c-20140301+neon+dfsg/src/wp/MemTyped.ml frama-c-20150201+sodium+dfsg/src/wp/MemTyped.ml --- frama-c-20140301+neon+dfsg/src/wp/MemTyped.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/MemTyped.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -49,6 +49,11 @@ why3 = Qed.Engine.F_subst("%1.offset"); coq = Qed.Engine.F_subst("(offset %1)"); } "offset" +let f_mk_addr = Lang.extern_f ~library ~result:t_addr + ~link:{altergo = Qed.Engine.F_subst("{base = %1; offset = %2}"); + why3 = Qed.Engine.F_subst("(Mk_addr %1 %2)"); + coq = Qed.Engine.F_subst("(mk_addr %1 %2)"); + } "mk_addr" 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" @@ -75,6 +80,7 @@ let a_null = F.constant (e_fun f_null []) let a_base p = e_fun f_base [p] let a_offset p = e_fun f_offset [p] +let a_mk_addr b p = e_fun f_mk_addr [b;p] let a_global b = e_fun f_global [b] let a_shift l k = e_fun f_shift [l;k] let a_addr b k = a_shift (a_global b) k @@ -83,7 +89,45 @@ (* --- Qed Simplifiers --- *) (* -------------------------------------------------------------------------- *) + +(* + Pointer arithmetic for structure access and array access could be + defined directly using the record [{ base = p.base; offset = p.offset + + c*i + c' }]. However that gives very bad triggers for the memory + model axiomatization, so `shift p (c*i+c')` was used instead. It is + not sufficient for user axiomatisation because memory access in + axioms require trigger with arithmetic operators which is badly + handled by provers. So for each c and c', ie for each kind of + structure access and array access a specific function is used + `shift_xxx`. + + Moreover no simplification of `shift_xxx` is done for keeping the + same terms in axioms and the goal. `base` and `offset` function + simplify all the `shift_xxx` because it seems they don't appear + often in axioms and they are useful for simplifying `separated`, + `assigns` and pointer comparisons in goals. + + To sum up memory access should match, but not `\base`, `\offset`, + `\separated`, ... +*) + +let phi_shift f0 p i = match F.repr p with + | L.Fun(f,[q;j]) when f==f0 -> e_fun f0 [q;e_add i j] + | _ -> raise Not_found + +type registered_shift = + | RS_Field of term (* offset of the field *) + | RS_Shift of Z.t (* size of the element *) + +module RegisterShift = Model.Static(struct + type key = lfun + type data = registered_shift + let name = "MemTyped.RegisterShift" + include Lang.Fun + end) + let phi_base l = match F.repr l with + | L.Fun(f,p::_) when RegisterShift.mem f -> a_base p | L.Fun(f,[p;_]) when f==f_shift -> a_base p | L.Fun(f,[b]) when f==f_global -> b | L.Fun(f,[]) when f==f_null -> e_zero @@ -92,10 +136,13 @@ let phi_offset l = match F.repr l with | L.Fun(f,[p;k]) when f==f_shift -> e_add (a_offset p) k | L.Fun(f,_) when f==f_global || f==f_null -> F.e_zero - | _ -> raise Not_found - -let phi_shift l k = match F.repr l with - | L.Fun(f,[p;i]) when f==f_shift -> a_shift p (e_add i k) + | L.Fun(f,p::args) -> + begin match RegisterShift.get f, args with + | Some (RS_Field offset), [] -> e_add offset (a_offset p) + | Some (RS_Shift size), [k] -> e_add (a_offset p) ((F.e_times size) k) + | Some _, _ -> assert false (* absurd: constructed at one place only *) + | None, _ -> raise Not_found + end | _ -> raise Not_found let eq_shift a b = @@ -105,22 +152,103 @@ let j = a_offset b in if i==j then F.p_equal p q else match F.is_equal p q with - | L.No -> F.p_false - | L.Yes -> F.p_equal i j - | L.Maybe -> raise Not_found + | L.No -> F.p_false + | L.Yes -> F.p_equal i j + | L.Maybe -> raise Not_found + +(* -------------------------------------------------------------------------- *) +(* --- Simplifier for 'separated' --- *) +(* -------------------------------------------------------------------------- *) + +(* +logic a : int +logic b : int +logic S : prop + +predicate separated = a <= 0 or b <= 0 or S +*) let r_separated = function - | [p;a;q;b] when a == F.e_one && b == F.e_one -> F.e_neq p q + | [p;a;q;b] -> + if a == F.e_one && b == F.e_one then F.e_neq p q + else + begin + let a_negative = F.e_leq a F.e_zero in + let b_negative = F.e_leq b F.e_zero in + if a_negative == e_true || b_negative == e_true then e_true else + let bp = a_base p in + let bq = a_base q in + let open Qed.Logic in + match F.is_true (F.e_eq bp bq) with + | No -> e_true (* Have S *) + | Yes when (a_negative == e_false && b_negative == e_false) -> + (* Reduced to S *) + let p_ofs = a_offset p in + let q_ofs = a_offset q in + let p_ofs' = F.e_add p_ofs a in + let q_ofs' = F.e_add q_ofs b in + F.e_or [ F.e_leq q_ofs' p_ofs ; + F.e_leq p_ofs' q_ofs ] + | _ -> raise Not_found + end + | _ -> raise Not_found + +(* -------------------------------------------------------------------------- *) +(* --- Simplifier for 'included' --- *) +(* -------------------------------------------------------------------------- *) + +(* +logic a : int +logic b : int +logic S : prop + +predicate included = 0 < a -> ( 0 <= b and R ) +predicate a_negative = a <= 0 +predicate b_negative = b <= 0 + +goal INC_1: a_empty -> (included <-> true) +goal INC_2: b_negative -> (included <-> a_empty) +goal INC_3: not R -> (included <-> a_empty) +goal INC_4: not a_empty -> not b_negative -> (included <-> R) +*) + +let r_included = function + | [p;a;q;b] -> + if (F.e_eq a b == F.e_true) && (F.e_lt F.e_zero a == F.e_true) + then F.e_eq p q + else + begin + let a_empty = F.e_leq a F.e_zero in + let b_negative = F.e_lt b F.e_zero in + if a_empty == F.e_true then F.e_true (* INC_1 *) else + if b_negative == F.e_true then a_empty (* INC_2 *) else + let bp = a_base p in + let bq = a_base q in + let open Qed.Logic in + match F.is_true (F.e_eq bp bq) with + | No -> a_empty (* INC_3 *) + | Yes when (a_empty == e_false && b_negative == e_false) -> + (* INC_4 *) + let p_ofs = a_offset p in + let q_ofs = a_offset q in + if a == b then F.e_eq p_ofs q_ofs + else + let p_ofs' = e_add p_ofs a in + let q_ofs' = e_add q_ofs b in + e_and [ F.e_leq q_ofs p_ofs ; F.e_leq p_ofs' q_ofs' ] + | _ -> raise Not_found + end | _ -> raise Not_found let () = begin F.set_builtin_1 f_base phi_base ; F.set_builtin_1 f_offset phi_offset ; - F.set_builtin_2 f_shift phi_shift ; + F.set_builtin_2 f_shift (phi_shift f_shift) ; F.set_builtin_eqp f_shift eq_shift ; F.set_builtin_eqp f_global eq_shift ; F.set_builtin p_separated r_separated ; + F.set_builtin p_included r_included ; end (* -------------------------------------------------------------------------- *) @@ -229,7 +357,7 @@ n * (size_of_typ elt) | C_array _ as a -> Wp_parameters.abort ~current:true "Undefined array-size (%a)" - Ctypes.pretty a + Ctypes.pretty a and size_of_typ t = size_of_object (object_of t) and size_of_field f = size_of_typ f.ftype and size_of_comp c = @@ -241,8 +369,8 @@ let rec fnext k f = function | [] -> assert false | g::gs -> - if Fieldinfo.equal f g then k - else fnext (k + size_of_field g) f gs + if Fieldinfo.equal f g then k + else fnext (k + size_of_field g) f gs in fnext 0 f f.fcomp.cfields (* -------------------------------------------------------------------------- *) @@ -257,16 +385,10 @@ let occurs x l = F.occurs x l (* -------------------------------------------------------------------------- *) -(* --- Basic Manipulation --- *) +(* --- Generated Axiomatization --- *) (* -------------------------------------------------------------------------- *) let loadrec = ref (fun _ _ _ -> assert false) -let field l f = a_shift l (F.e_int (offset_of_field f)) -let shift l obj k = a_shift l (F.e_mul (F.e_int (size_of_object obj)) k) - -(* -------------------------------------------------------------------------- *) -(* --- Generated Axiomatization --- *) -(* -------------------------------------------------------------------------- *) let cluster_globals () = Definitions.cluster ~id:"Globals" ~title:"Global Variables" () @@ -274,6 +396,88 @@ let cluster_memory () = Definitions.cluster ~id:"Compound" ~title:"Memory Compound Updates" () +module ShiftField = Model.Generator(Cil_datatype.Fieldinfo) + (struct + let name = "MemTyped.ShiftField" + type key = fieldinfo + type data = lfun + + let generate f = + let result = t_addr in + let lfun = Lang.generated_f ~result "shiftfield_%s" (Lang.field_id f) in + let offset = (F.e_int (offset_of_field f)) in + RegisterShift.define lfun (RS_Field offset); + F.set_builtin_eqp lfun eq_shift; + (* Since its a generated it is the unique name given *) + let xloc = Lang.freshvar ~basename:"p" t_addr in + let loc = e_var xloc in + let def = a_shift loc offset in + let dfun = Definitions.Value( result , Def , def) in + Definitions.define_symbol { + d_lfun = lfun ; d_types = 0 ; + d_params = [xloc] ; + d_definition = dfun ; + d_cluster = cluster_memory () ; + } ; + lfun + + let compile = Lang.local generate + end) + +module Shift = + Model.Generator( + struct + type t = c_object + let pretty = C_object.pretty + let compare = compare_ptr_conflated + end) + (struct + let name = "MemTyped.Shift" + type key = c_object + type data = lfun + + + let rec c_object_id fmt = function + | C_int i -> pp_int fmt i + | C_float f -> pp_float fmt f + | C_pointer _ -> Format.fprintf fmt "PTR" + | C_comp c -> Format.pp_print_string fmt c.cname + | C_array a -> + let te = object_of a.arr_element in + match a.arr_flat with + | None -> Format.fprintf fmt "A_%a" c_object_id te + | Some f -> Format.fprintf fmt "A%d_%a" f.arr_size c_object_id te + + let c_object_id c = Pretty_utils.sfprintf "%a@?" c_object_id c + + let generate obj = + let result = t_addr in + let lfun = Lang.generated_f ~result "shift_%s" (c_object_id obj) in + let size = Integer.of_int (size_of_object obj) in + RegisterShift.define lfun (RS_Shift size); + F.set_builtin_eqp lfun eq_shift; + (* Since its a generated it is the unique name given *) + let xloc = Lang.freshvar ~basename:"p" t_addr in + let loc = e_var xloc in + let xk = Lang.freshvar ~basename:"k" Qed.Logic.Int in + let k = e_var xk in + let def = a_shift loc (F.e_times size k) in + let dfun = Definitions.Value( result , Def , def) in + Definitions.define_symbol { + d_lfun = lfun ; d_types = 0 ; + d_params = [xloc;xk] ; + d_definition = dfun ; + d_cluster = cluster_memory () ; + } ; + F.set_builtin_2 lfun (phi_shift lfun) ; + lfun + + let compile = Lang.local generate + end) + +let field l f = e_fun (ShiftField.get f) [l] +let shift l obj k = e_fun (Shift.get obj) [l;k] + module LITERAL = struct type t = int * Cstring.cst @@ -282,132 +486,139 @@ end module STRING = Model.Generator(LITERAL) - (struct - let name = "MemTyped.STRING" - type key = LITERAL.t - type data = term - - let linked prefix base cst = - let name = prefix ^ "_linked" in - let a = Lang.freshvar ~basename:"alloc" (Chunk.tau_of_chunk T_alloc) in - let m = e_var a in - let m_linked = p_call p_linked [m] in - let base_size = Cstring.str_len cst (F.e_get m base) in - Definitions.define_lemma { - l_assumed = true ; - l_name = name ; l_types = 0 ; - l_triggers = [] ; l_forall = [] ; - l_lemma = p_forall [a] (p_imply m_linked base_size) ; - l_cluster = Cstring.cluster () ; - } - - let region prefix base cst = - let name = prefix ^ "_region" in - let re = - Cstring.str_id cst in - Definitions.define_lemma { - l_assumed = true ; - l_name = name ; l_types = 0 ; l_triggers = [] ; l_forall = [] ; - l_lemma = p_equal (e_fun f_region [base]) (e_int re) ; - l_cluster = Cstring.cluster () ; - } - - let sconst prefix base cst = - let name = prefix ^ "_literal" in - let i = Lang.freshvar ~basename:"i" L.Int in - let c = Cstring.char_at cst (e_var i) in - let addr = a_addr base (e_var i) in - let m = Lang.freshvar ~basename:"mchar" (Chunk.tau_of_chunk M_char) in - let m_sconst = F.p_call p_sconst [e_var m] in - let v = F.e_get (e_var m) addr in - let read = F.p_equal c v in - Definitions.define_lemma { - l_assumed = true ; - l_name = name ; l_types = 0 ; l_triggers = [] ; - l_forall = [m;i] ; - l_cluster = Cstring.cluster () ; - l_lemma = F.p_imply m_sconst read ; - } - - let compile (eid,cst) = - let lfun = Lang.generated_f ~result:L.Int "Str_%d" eid in - (** Since its a generated it is the unique name given *) - let prefix = Lang.Fun.debug lfun in - let base = F.e_fun lfun [] in - Definitions.define_symbol { - d_lfun = lfun ; d_types = 0 ; d_params = [] ; - d_definition = Logic L.Int ; - d_cluster = Cstring.cluster () ; - } ; - Definitions.define_lemma { - l_name = prefix ^ "_base" ; - l_assumed = true ; - l_types = 0 ; l_triggers = [] ; l_forall = [] ; - l_lemma = F.p_lt base F.e_zero ; - l_cluster = Cstring.cluster () ; - } ; - region prefix base cst ; - linked prefix base cst ; - sconst prefix base cst ; - base + (struct + let name = "MemTyped.STRING" + type key = LITERAL.t + type data = term + + let linked prefix base cst = + let name = prefix ^ "_linked" in + let a = Lang.freshvar ~basename:"alloc" (Chunk.tau_of_chunk T_alloc) in + let m = e_var a in + let m_linked = p_call p_linked [m] in + let base_size = Cstring.str_len cst (F.e_get m base) in + Definitions.define_lemma { + l_assumed = true ; + l_name = name ; l_types = 0 ; + l_triggers = [] ; l_forall = [] ; + l_lemma = p_forall [a] (p_imply m_linked base_size) ; + l_cluster = Cstring.cluster () ; + } + + let region prefix base cst = + let name = prefix ^ "_region" in + let re = - Cstring.str_id cst in + Definitions.define_lemma { + l_assumed = true ; + l_name = name ; l_types = 0 ; l_triggers = [] ; l_forall = [] ; + l_lemma = p_equal (e_fun f_region [base]) (e_int re) ; + l_cluster = Cstring.cluster () ; + } + + let sconst prefix base cst = + let name = prefix ^ "_literal" in + let i = Lang.freshvar ~basename:"i" L.Int in + let c = Cstring.char_at cst (e_var i) in + let addr = shift (a_global base) (C_int (Ctypes.c_char ())) (e_var i) in + let m = Lang.freshvar ~basename:"mchar" (Chunk.tau_of_chunk M_char) in + let m_sconst = F.p_call p_sconst [e_var m] in + let v = F.e_get (e_var m) addr in + let read = F.p_equal c v in + Definitions.define_lemma { + l_assumed = true ; + l_name = name ; l_types = 0 ; l_triggers = [] ; + l_forall = [m;i] ; + l_cluster = Cstring.cluster () ; + l_lemma = F.p_imply m_sconst read ; + } + + let compile (eid,cst) = + let lfun = Lang.generated_f ~result:L.Int "Str_%d" eid in + (* Since its a generated it is the unique name given *) + let prefix = Lang.Fun.debug lfun in + let base = F.e_fun lfun [] in + Definitions.define_symbol { + d_lfun = lfun ; d_types = 0 ; d_params = [] ; + d_definition = Logic L.Int ; + d_cluster = Cstring.cluster () ; + } ; + Definitions.define_lemma { + l_name = prefix ^ "_base" ; + l_assumed = true ; + l_types = 0 ; l_triggers = [] ; l_forall = [] ; + l_lemma = F.p_lt base F.e_zero ; + l_cluster = Cstring.cluster () ; + } ; + region prefix base cst ; + linked prefix base cst ; + sconst prefix base cst ; + base - end) + end) module BASE = Model.Generator(Varinfo) - (struct - let name = "MemTyped.BASE" - type key = varinfo - type data = term - - let region prefix x base = - let name = prefix ^ "_region" in - let re = if x.vglob then 0 else if x.vformal then 1 else 2 in - Definitions.define_lemma { - l_assumed = true ; - l_name = name ; l_types = 0 ; l_triggers = [] ; l_forall = [] ; - l_lemma = p_equal (e_fun f_region [base]) (e_int re) ; - l_cluster = cluster_globals () ; - } - - let linked prefix x base = - let name = prefix ^ "_linked" in - let size = Ctypes.sizeof_typ x.vtype in - let a = Lang.freshvar ~basename:"alloc" (Chunk.tau_of_chunk T_alloc) in - let m = e_var a in - let m_linked = p_call p_linked [m] in - let base_size = p_equal (F.e_get m base) (e_int size) in - Definitions.define_lemma { - l_assumed = true ; - l_name = name ; l_types = 0 ; - l_triggers = [] ; l_forall = [] ; - l_lemma = p_forall [a] (p_imply m_linked base_size) ; - l_cluster = cluster_globals () ; - } - - let generate x = - let prefix = if x.vglob then "G" else if x.vformal then "P" else "L" in - let lfun = Lang.generated_f - ~category:L.Constructor ~result:L.Int - "%s_%s_%d" prefix x.vorig_name x.vid in - (** Since its a generated it is the unique name given *) - let prefix = Lang.Fun.debug lfun in - let dfun = Definitions.Value( L.Int , Def , e_int (succ x.vid) ) in - Definitions.define_symbol { - d_lfun = lfun ; d_types = 0 ; d_params = [] ; d_definition = dfun ; - d_cluster = cluster_globals () ; - } ; - let base = e_fun lfun [] in - region prefix x base ; linked prefix x base ; base + (struct + let name = "MemTyped.BASE" + type key = varinfo + type data = term + + let region prefix x base = + let name = prefix ^ "_region" in + let re = if x.vglob then 0 else if x.vformal then 1 else 2 in + Definitions.define_lemma { + l_assumed = true ; + l_name = name ; l_types = 0 ; l_triggers = [] ; l_forall = [] ; + l_lemma = p_equal (e_fun f_region [base]) (e_int re) ; + l_cluster = cluster_globals () ; + } + + let linked prefix x base = + let name = prefix ^ "_linked" in + let size = Ctypes.sizeof_typ x.vtype in + let a = Lang.freshvar ~basename:"alloc" (Chunk.tau_of_chunk T_alloc) in + let m = e_var a in + let m_linked = p_call p_linked [m] in + let base_size = p_equal (F.e_get m base) (e_int size) in + Definitions.define_lemma { + l_assumed = true ; + l_name = name ; l_types = 0 ; + l_triggers = [] ; l_forall = [] ; + l_lemma = p_forall [a] (p_imply m_linked base_size) ; + l_cluster = cluster_globals () ; + } + + let generate x = + let acs_rd = Cil.typeHasQualifier "const" x.vtype in + let prefix = + if x.vglob + then if acs_rd then "K" else "G" + else if x.vformal then "P" else "L" in + let lfun = Lang.generated_f + ~category:L.Constructor ~result:L.Int "%s_%s_%d" + prefix x.vorig_name x.vid in + (* Since its a generated it is the unique name given *) + let prefix = Lang.Fun.debug lfun in + let vid = if acs_rd then (-x.vid-1) else succ x.vid in + let dfun = Definitions.Value( L.Int , Def , e_int vid ) in + Definitions.define_symbol { + d_lfun = lfun ; d_types = 0 ; d_params = [] ; d_definition = dfun ; + d_cluster = cluster_globals () ; + } ; + let base = e_fun lfun [] in + region prefix x base ; linked prefix x base ; base + + let compile = Lang.local generate + end) - let compile = Lang.local generate - end) +(* Add frame lemmas for generated logical function *) module MONOTONIC : sig val generate : string -> lfun -> var list -> chunk list -> (term list -> term) -> unit end = struct - + type env = { lfun : lfun ; sigma : sigma ; @@ -419,12 +630,12 @@ } let _cluster () = Definitions.cluster ~id:"TypedMemory" () - (* projectified *) + (* projectified *) let update env c m = List.map (fun c' -> - if Chunk.equal c c' then m else Sigma.value env.sigma c' + if Chunk.equal c c' then m else Sigma.value env.sigma c' ) env.chunks let separated env q k = F.p_call p_separated [q;k;List.hd env.params;env.range] @@ -461,14 +672,14 @@ l_assumed = true ; l_name = name ; l_types = 0 ; l_triggers = [ - [Trigger.of_pred eqmem ; Trigger.of_term phi ] ; - [Trigger.of_pred eqmem ; Trigger.of_term phi'] ; + [Trigger.of_pred eqmem ; Trigger.of_term phi ] ; + [Trigger.of_pred eqmem ; Trigger.of_term phi'] ; ] ; l_forall = Vars.elements (F.varsp lemma) ; l_lemma = lemma ; l_cluster = cluster_memory () ; } - + let generate_havoc prefix env c = let name = prefix ^ "_havoc_" ^ Chunk.name c in let q = e_var (Lang.freshvar ~basename:"q" (Chunk.key_of_chunk c)) in @@ -483,8 +694,8 @@ l_assumed = true ; l_name = name ; l_types = 0 ; l_triggers = [ - [ Trigger.of_pred havoc ; Trigger.of_term phi ] ; - [ Trigger.of_pred havoc ; Trigger.of_term phi'] ; + [ Trigger.of_pred havoc ; Trigger.of_term phi ] ; + [ Trigger.of_pred havoc ; Trigger.of_term phi'] ; ] ; l_forall = Vars.elements (F.varsp lemma) ; l_lemma = lemma ; @@ -505,87 +716,87 @@ } in List.iter (fun chunk -> - generate_update prefix env chunk ; - generate_eqmem prefix env chunk ; - generate_havoc prefix env chunk ; + generate_update prefix env chunk ; + generate_eqmem prefix env chunk ; + generate_havoc prefix env chunk ; ) cs end module COMP = Model.Generator(Compinfo) - (struct - let name = "MemTyped.COMP" - type key = compinfo - type data = lfun * chunk list - - let generate c = - let result = Lang.tau_of_comp c in - let lfun = Lang.generated_f ~result "Load_%s" (Lang.comp_id c) in - (** Since its a generated it is the unique name given *) - let prefix = Lang.Fun.debug lfun in - let xmem,ft,sigma = signature (footprint_comp c) in - let xloc = Lang.freshvar ~basename:"p" t_addr in - let loc = e_var xloc in - let def = List.map - (fun f -> - Cfield f , !loadrec sigma (object_of f.ftype) (field loc f) - ) c.cfields in - let dfun = Definitions.Value( result , Def , e_record def ) in - Definitions.define_symbol { - d_lfun = lfun ; d_types = 0 ; - d_params = xloc :: xmem ; - d_definition = dfun ; - d_cluster = cluster_memory () ; - } ; - let range = e_int (size_of_comp c) in - MONOTONIC.generate prefix lfun [] ft (fun _ -> range) ; - lfun , ft + (struct + let name = "MemTyped.COMP" + type key = compinfo + type data = lfun * chunk list + + let generate c = + let result = Lang.tau_of_comp c in + let lfun = Lang.generated_f ~result "Load_%s" (Lang.comp_id c) in + (* Since its a generated it is the unique name given *) + let prefix = Lang.Fun.debug lfun in + let xmem,ft,sigma = signature (footprint_comp c) in + let xloc = Lang.freshvar ~basename:"p" t_addr in + let loc = e_var xloc in + let def = List.map + (fun f -> + Cfield f , !loadrec sigma (object_of f.ftype) (field loc f) + ) c.cfields in + let dfun = Definitions.Value( result , Def , e_record def ) in + Definitions.define_symbol { + d_lfun = lfun ; d_types = 0 ; + d_params = xloc :: xmem ; + d_definition = dfun ; + d_cluster = cluster_memory () ; + } ; + let range = e_int (size_of_comp c) in + MONOTONIC.generate prefix lfun [] ft (fun _ -> range) ; + lfun , ft - let compile = Lang.local generate - end) + let compile = Lang.local generate + end) module ARRAY = Model.Generator(Matrix.NATURAL) - (struct - open Matrix - let name = "MemTyped.ARRAY" - type key = matrix - type data = lfun * chunk list - - let generate (obj,ds) = - let result = Matrix.tau obj ds in - let lfun = Lang.generated_f ~result "Array%s_%s" - (Matrix.id ds) (Matrix.natural_id obj) in - let prefix = Lang.Fun.debug lfun in - let axiom = prefix ^ "_access" in - let xmem,ft,sigma = signature (footprint obj) in - let xloc = Lang.freshvar ~basename:"p" t_addr in - let loc = e_var xloc in - let denv = Matrix.denv ds in - let phi = e_fun lfun (loc :: denv.size_val @ List.map e_var xmem) in - let arr = List.fold_left e_get phi denv.index_val in - let elt = !loadrec sigma obj (shift loc obj (e_sum denv.index_offset)) in - let lemma = p_hyps denv.index_range (p_equal arr elt) in - let cluster = cluster_memory () in - Definitions.define_symbol { - d_lfun = lfun ; d_types = 0 ; - d_params = xloc :: denv.size_var @ xmem ; - d_definition = Logic result ; - d_cluster = cluster ; - } ; - Definitions.define_lemma { - l_assumed = true ; - l_name = axiom ; l_types = 0 ; - l_forall = Vars.elements (F.varsp lemma) ; - l_triggers = [[Trigger.of_term arr]] ; - l_lemma = lemma ; - l_cluster = cluster ; - } ; - if denv.monotonic then - MONOTONIC.generate prefix lfun denv.size_var ft F.e_prod ; - lfun , ft + (struct + open Matrix + let name = "MemTyped.ARRAY" + type key = matrix + type data = lfun * chunk list + + let generate (obj,ds) = + let result = Matrix.tau obj ds in + let lfun = Lang.generated_f ~result "Array%s_%s" + (Matrix.id ds) (Matrix.natural_id obj) in + let prefix = Lang.Fun.debug lfun in + let axiom = prefix ^ "_access" in + let xmem,ft,sigma = signature (footprint obj) in + let xloc = Lang.freshvar ~basename:"p" t_addr in + let loc = e_var xloc in + let denv = Matrix.denv ds in + let phi = e_fun lfun (loc :: denv.size_val @ List.map e_var xmem) in + let arr = List.fold_left e_get phi denv.index_val in + let elt = !loadrec sigma obj (shift loc obj (e_sum denv.index_offset)) in + let lemma = p_hyps denv.index_range (p_equal arr elt) in + let cluster = cluster_memory () in + Definitions.define_symbol { + d_lfun = lfun ; d_types = 0 ; + d_params = xloc :: denv.size_var @ xmem ; + d_definition = Logic result ; + d_cluster = cluster ; + } ; + Definitions.define_lemma { + l_assumed = true ; + l_name = axiom ; l_types = 0 ; + l_forall = Vars.elements (F.varsp lemma) ; + l_triggers = [[Trigger.of_term arr]] ; + l_lemma = lemma ; + l_cluster = cluster ; + } ; + if denv.monotonic then + MONOTONIC.generate prefix lfun denv.size_var ft F.e_prod ; + lfun , ft - let compile = Lang.local generate - end) + let compile = Lang.local generate + end) (* -------------------------------------------------------------------------- *) (* --- Loading Elementary Values --- *) @@ -612,8 +823,9 @@ (* -------------------------------------------------------------------------- *) let null = a_null -let literal ~eid cst = a_addr (STRING.get (eid,cst)) e_zero -let cvar x = a_addr (BASE.get x) e_zero +let literal ~eid cst = + shift (a_global (STRING.get (eid,cst))) (C_int (Ctypes.c_char ())) e_zero +let cvar x = shift (a_global (BASE.get x)) (Ctypes.object_of x.vtype) e_zero let pointer_loc t = t let pointer_val t = t @@ -640,9 +852,9 @@ let eqatom a1 a2 = match a1 , a2 with - | P _ , P _ -> true - | _ -> (a1 = a2) - + | P _ , P _ -> true + | _ -> (a1 = a2) + type block = | Str of atom * int | Arr of layout * int (* non-homogeneous, more than one *) @@ -655,56 +867,56 @@ | Str(a,n) -> Format.fprintf fmt "%a[%d]" pp_atom a n | Arr(ly,n) -> Format.fprintf fmt "%a[%d]" pp_layout ly n | Garbled -> Format.fprintf fmt "..." - + and pp_layout fmt = function | [b] -> pp_block fmt b | bs -> - begin - Format.fprintf fmt "@[{" ; - List.iter (fun b -> Format.fprintf fmt "@ %a" pp_block b) bs ; - Format.fprintf fmt " }@]" ; - end + begin + Format.fprintf fmt "@[{" ; + List.iter (fun b -> Format.fprintf fmt "@ %a" pp_block b) bs ; + Format.fprintf fmt " }@]" ; + end let add_atom a ly = match ly with - | Str(b,m) :: w when eqatom a b -> Str(b,m+1)::w - | _ -> Str(a,1) :: ly - + | Str(b,m) :: w when eqatom a b -> Str(b,m+1)::w + | _ -> Str(a,1) :: ly + let add_block p ly = match p , ly with - | Str(a,n) , Str(b,m)::w when eqatom a b -> Str(b,n+m)::w - | Garbled , Garbled::_ -> ly - | _ -> p :: ly + | Str(a,n) , Str(b,m)::w when eqatom a b -> Str(b,n+m)::w + | Garbled , Garbled::_ -> ly + | _ -> p :: ly (* requires n > 1 *) let add_many ly n w = match ly with - | [] -> w - | [Str(a,m)] -> add_block (Str(a,n*m)) w - | Garbled::_ -> add_block Garbled w - | ly -> Arr(ly,n) :: w + | [] -> w + | [Str(a,m)] -> add_block (Str(a,n*m)) w + | Garbled::_ -> add_block Garbled w + | ly -> Arr(ly,n) :: w let rec rlayout w = function | C_int i -> add_atom (I i) w | C_float f -> add_atom (F f) w | C_pointer t -> add_atom (P t) w | C_comp c -> - if c.cstruct - then List.fold_left flayout w c.cfields - else - (* TODO: can be the longuest common prefix *) - add_block Garbled w + if c.cstruct + then List.fold_left flayout w c.cfields + else + (* TODO: can be the longuest common prefix *) + add_block Garbled w | C_array { arr_flat = Some a } -> - let ly = rlayout [] (Ctypes.object_of a.arr_cell) in - if a.arr_cell_nbr = 1 - then ly @ w (* ly is in reversed order *) - else add_many (List.rev ly) a.arr_cell_nbr w + let ly = rlayout [] (Ctypes.object_of a.arr_cell) in + if a.arr_cell_nbr = 1 + then ly @ w (* ly is in reversed order *) + else add_many (List.rev ly) a.arr_cell_nbr w | C_array { arr_element = e } -> - if Wp_parameters.ExternArrays.get () then - let ly = rlayout [] (Ctypes.object_of e) in - add_many (List.rev ly) max_int w - else - add_block Garbled w + if Wp_parameters.ExternArrays.get () then + let ly = rlayout [] (Ctypes.object_of e) in + add_many (List.rev ly) max_int w + else + add_block Garbled w and flayout w f = rlayout w (Ctypes.object_of f.ftype) @@ -717,56 +929,56 @@ let rec compare l1 l2 = match l1 , l2 with - | [] , [] -> Equal - | [] , _ -> Fit - | _ , [] -> Mismatch - | p::w1 , q::w2 -> - match p , q with - | Garbled , _ | _ , Garbled -> Mismatch - | Str(a,n) , Str(b,m) -> - if eqatom a b then - if n < m then - let w2 = Str(a,m-n)::w2 in - compare w1 w2 - else if n > m then - let w1 = Str(a,n-m)::w1 in - compare w1 w2 - else - (* n = m *) - compare w1 w2 - else Mismatch - | Arr(u,n) , Arr(v,m) -> - begin - match compare u v with - | Mismatch -> Mismatch - | Fit -> if n=1 then Fit else Mismatch - | Equal -> - if n < m then - let w2 = add_array v (m-n) w2 in - compare w1 w2 - else if n > m then - let w1 = add_array u (n-m) w1 in - compare w1 w2 - else - (* n = m *) - compare w1 w2 - end - | Arr(v,n) , Str _ -> - compare (v @ add_array v (n-1) w1) l2 - | Str _ , Arr(v,n) -> - compare l1 (v @ add_array v (n-1) w2) + | [] , [] -> Equal + | [] , _ -> Fit + | _ , [] -> Mismatch + | p::w1 , q::w2 -> + match p , q with + | Garbled , _ | _ , Garbled -> Mismatch + | Str(a,n) , Str(b,m) -> + if eqatom a b then + if n < m then + let w2 = Str(a,m-n)::w2 in + compare w1 w2 + else if n > m then + let w1 = Str(a,n-m)::w1 in + compare w1 w2 + else + (* n = m *) + compare w1 w2 + else Mismatch + | Arr(u,n) , Arr(v,m) -> + begin + match compare u v with + | Mismatch -> Mismatch + | Fit -> if n=1 then Fit else Mismatch + | Equal -> + if n < m then + let w2 = add_array v (m-n) w2 in + compare w1 w2 + else if n > m then + let w1 = add_array u (n-m) w1 in + compare w1 w2 + else + (* n = m *) + compare w1 w2 + end + | Arr(v,n) , Str _ -> + compare (v @ add_array v (n-1) w1) l2 + | Str _ , Arr(v,n) -> + compare l1 (v @ add_array v (n-1) w2) let rec fits obj1 obj2 = match obj1 , obj2 with - | C_int i1 , C_int i2 -> i1 = i2 - | C_float f1 , C_float f2 -> f1 = f2 - | C_comp c , C_comp d when Compinfo.equal c d -> true - | C_pointer _ , C_pointer _ -> true - | _ -> - match compare (layout obj1) (layout obj2) with - | Equal | Fit -> true - | Mismatch -> false - + | C_int i1 , C_int i2 -> i1 = i2 + | C_float f1 , C_float f2 -> f1 = f2 + | C_comp c , C_comp d when Compinfo.equal c d -> true + | C_pointer _ , C_pointer _ -> true + | _ -> + match compare (layout obj1) (layout obj2) with + | Equal | Fit -> true + | Mismatch -> false + let rec pretty fmt = function | C_pointer ty -> Format.fprintf fmt "%a*" pretty (Ctypes.object_of ty) | obj -> pp_layout fmt (layout obj) @@ -778,33 +990,39 @@ if Context.get pointer <> NoCast && Wp_parameters.has_dkey "layout" then Format.fprintf fmt "Cast with incompatible pointers types@\n\ - @[@[Source: %a*@]@ @[(layout: %a)@]@]@\n\ - @[@[Target: %a*@]@ @[(layout: %a)@]@]" + @[@[Source: %a*@]@ @[(layout: %a)@]@]@\n\ + @[@[Target: %a*@]@ @[(layout: %a)@]@]" Ctypes.pretty s.pre Layout.pretty s.pre Ctypes.pretty s.post Layout.pretty s.post else Format.fprintf fmt "@[Cast with incompatible pointers types\ - @ (source: %a*)@ (target: %a*)@]" + @ (source: %a*)@ (target: %a*)@]" Ctypes.pretty s.pre Ctypes.pretty s.post -let cast s l = if F.is_zero l then null else - match Context.get pointer with - | NoCast -> Warning.error ~source:"Typed Model" "%a" pp_mismatch s - | Fits -> - if Layout.fits s.post s.pre then l else - Warning.error ~source:"Typed Model" "%a" pp_mismatch s - | Unsafe -> - if not (Layout.fits s.post s.pre) then - Warning.emit ~severe:false ~source:"Typed Model" - ~effect:"Keep pointer value" - "%a" pp_mismatch s - ; l - +let cast s l = + if l==null then null else + begin + match Context.get pointer with + | NoCast -> Warning.error ~source:"Typed Model" "%a" pp_mismatch s + | Fits -> + if Layout.fits s.post s.pre then l else + Warning.error ~source:"Typed Model" "%a" pp_mismatch s + | Unsafe -> + if not (Layout.fits s.post s.pre) then + Warning.emit ~severe:false ~source:"Typed Model" + ~effect:"Keep pointer value" + "%a" pp_mismatch s ; l + end + let loc_of_int _ v = - match F.repr v with - | L.Kint _ -> a_addr e_zero (e_fun a_hardware [v]) - | _ -> Warning.error ~source:"Typed Model" "Forbidden cast of int to pointer" + if F.is_zero v then null else + begin + match F.repr v with + | L.Kint _ -> a_addr e_zero (e_fun a_hardware [v]) + | _ -> Warning.error ~source:"Typed Model" + "Forbidden cast of int to pointer" + end let int_of_loc _i loc = e_fun a_cast [pointer_val loc] @@ -838,7 +1056,7 @@ let m1 = Sigma.value s.pre c in let m2 = Sigma.value s.post c in if m1 != m2 then - ps := F.p_call p_eqmem [m1;m2;l;n] :: !ps + ps := F.p_call p_eqmem [m1;m2;l;n] :: !ps ) (footprint obj) ; !ps (* -------------------------------------------------------------------------- *) @@ -847,11 +1065,11 @@ let stored s obj l v = match obj with - | C_int i -> updated s (m_int i) l v - | C_float _ -> updated s M_float l v - | C_pointer _ -> updated s M_pointer l v - | C_comp _ | C_array _ -> - p_equal (loadvalue s.post obj l) v :: havoc s obj l + | C_int i -> updated s (m_int i) l v + | C_float _ -> updated s M_float l v + | C_pointer _ -> updated s M_pointer l v + | C_comp _ | C_array _ -> + p_equal (loadvalue s.post obj l) v :: havoc s obj l let copied s obj p q = stored s obj p (loadvalue s.pre obj q) @@ -861,16 +1079,16 @@ let assigned_loc s obj l = match obj with - | C_int _ | C_float _ | C_pointer _ -> - let x = Lang.freshvar ~basename:"v" (Lang.tau_of_object obj) in - stored s obj l (e_var x) - | C_comp _ | C_array _ -> havoc s obj l + | C_int _ | C_float _ | C_pointer _ -> + let x = Lang.freshvar ~basename:"v" (Lang.tau_of_object obj) in + stored s obj l (e_var x) + | C_comp _ | C_array _ -> havoc s obj l let equal_loc s obj l = match obj with - | C_int _ | C_float _ | C_pointer _ -> - [p_equal (loadvalue s.pre obj l) (loadvalue s.post obj l)] - | C_comp _ | C_array _ -> eqmem s obj l + | C_int _ | C_float _ | C_pointer _ -> + [p_equal (loadvalue s.pre obj l) (loadvalue s.post obj l)] + | C_comp _ | C_array _ -> eqmem s obj l let assigned_range s obj l a b = let l = shift l obj a in @@ -880,8 +1098,13 @@ let assigned s obj = function | Sloc l -> assigned_loc s obj l | Sdescr(xs,l,p) -> - let hs = equal_loc s obj l in - List.map (fun h -> p_forall xs (p_or p h)) hs + let xa = Lang.freshvar ~basename:"p" t_addr in + let la = F.e_var xa in + let n = F.e_int (size_of_object obj) in + let sep = F.p_call p_separated [la;n;l;n] in + let sep_all = F.p_forall xs (F.p_imply p sep) in + let eq_loc = F.p_conj (equal_loc s obj la) in + [F.p_forall [xa] (F.p_imply sep_all eq_loc)] | Sarray(l,obj,n) -> assigned_range s obj l (e_zero) (e_int (n-1)) | Srange(l,obj,u,v) -> @@ -895,8 +1118,8 @@ let loc_compare f_cmp i_cmp p q = match F.is_equal (a_base p) (a_base q) with - | L.Yes -> i_cmp (a_offset p) (a_offset q) - | L.Maybe | L.No -> p_call f_cmp [p;q] + | L.Yes -> i_cmp (a_offset p) (a_offset q) + | L.Maybe | L.No -> p_call f_cmp [p;q] let is_null l = p_equal l null let loc_eq = p_equal @@ -944,12 +1167,12 @@ let spre = Sigma.havoc_chunk spost T_alloc in let alloc = List.fold_left - (fun m x -> - let size = match a with - | FREE -> 0 - | ALLOC -> size_of_typ x.vtype - in F.e_set m (BASE.get x) (e_int size)) - (Sigma.value spre T_alloc) xs in + (fun m x -> + let size = match a with + | FREE -> 0 + | ALLOC -> size_of_typ x.vtype + in F.e_set m (BASE.get x) (e_int size)) + (Sigma.value spre T_alloc) xs in spre , [ p_equal (Sigma.value spost T_alloc) alloc ] let framed sigma = @@ -968,6 +1191,8 @@ | Mcfg.SC_Function_frame | Mcfg.SC_Block_in -> allocates sigma xs ALLOC | Mcfg.SC_Function_out | Mcfg.SC_Block_out -> allocates sigma xs FREE +let global _sigma p = p_leq (e_fun f_region [a_base p]) e_zero + (* -------------------------------------------------------------------------- *) (* --- Domain --- *) (* -------------------------------------------------------------------------- *) @@ -1004,21 +1229,21 @@ let r_included r1 r2 = match r1 , r2 with - | LOC(l1,n1) , LOC(l2,n2) -> - p_call p_included [l1;n1;l2;n2] - | _ -> - let base1,set1 = range_set r1 in - let base2,set2 = range_set r2 in - p_and (p_equal base1 base2) (Vset.subset set1 set2) + | LOC(l1,n1) , LOC(l2,n2) -> + p_call p_included [l1;n1;l2;n2] + | _ -> + let base1,set1 = range_set r1 in + let base2,set2 = range_set r2 in + p_and (p_equal base1 base2) (Vset.subset set1 set2) let r_disjoint r1 r2 = match r1 , r2 with - | LOC(l1,n1) , LOC(l2,n2) -> - p_call p_separated [l1;n1;l2;n2] - | _ -> - let base1,set1 = range_set r1 in - let base2,set2 = range_set r2 in - p_imply (p_equal base1 base2) (Vset.disjoint set1 set2) + | LOC(l1,n1) , LOC(l2,n2) -> + p_call p_separated [l1;n1;l2;n2] + | _ -> + let base1,set1 = range_set r1 in + let base2,set2 = range_set r2 in + p_imply (p_equal base1 base2) (Vset.disjoint set1 set2) let included s1 s2 = r_included (range s1) (range s2) let separated s1 s2 = r_disjoint (range s1) (range s2) diff -Nru frama-c-20140301+neon+dfsg/src/wp/MemTyped.mli frama-c-20150201+sodium+dfsg/src/wp/MemTyped.mli --- frama-c-20140301+neon+dfsg/src/wp/MemTyped.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/MemTyped.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/MemVar.ml frama-c-20150201+sodium+dfsg/src/wp/MemVar.ml --- frama-c-20140301+neon+dfsg/src/wp/MemVar.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/MemVar.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -60,7 +60,7 @@ match V.param x with | ByValue -> true | ByRef | InHeap -> false - + module VAR = struct type t = varinfo @@ -71,11 +71,12 @@ let pretty = Varinfo.pretty let typ_of_param x = match V.param x with - | ByValue | InHeap -> x.vtype - | ByRef -> Cil.typeOf_pointed x.vtype + | ByValue | InHeap -> x.vtype + | ByRef -> Cil.typeOf_pointed x.vtype let tau_of_chunk x = Lang.tau_of_ctype (typ_of_param x) let basename_of_chunk = LogicUsage.basename let is_framed = is_framed_var + let is_pointer x = Cil.isPointerType (typ_of_param x) end module VALLOC = @@ -89,8 +90,8 @@ let tau_of_chunk _x = Qed.Logic.Bool let basename_of_chunk x = match V.param x with - | ByRef -> "ra_" ^ LogicUsage.basename x - | ByValue | InHeap -> "ta_" ^ LogicUsage.basename x + | ByRef -> "ra_" ^ LogicUsage.basename x + | ByValue | InHeap -> "ta_" ^ LogicUsage.basename x let is_framed = is_framed_var end @@ -104,14 +105,14 @@ | Mem m -> 7 * M.Chunk.hash m let compare c1 c2 = if c1 == c2 then 0 else - match c1 , c2 with - | Var x , Var y - | Alloc x , Alloc y -> Varinfo.compare x y - | Mem p , Mem q -> M.Chunk.compare p q - | Var _ , _ -> (-1) - | _ , Var _ -> 1 - | Alloc _ , _ -> (-1) - | _ , Alloc _ -> 1 + match c1 , c2 with + | Var x , Var y + | Alloc x , Alloc y -> Varinfo.compare x y + | Mem p , Mem q -> M.Chunk.compare p q + | Var _ , _ -> (-1) + | _ , Var _ -> 1 + | Alloc _ , _ -> (-1) + | _ , Alloc _ -> 1 let equal c1 c2 = (compare c1 c2 = 0) let pretty fmt = function | Var x -> Varinfo.pretty fmt x @@ -171,11 +172,11 @@ Passive.union (Passive.union pa2 ta2) qa2 let join s1 s2 = Passive.union - (Passive.union - (SIGMA.join s1.vars s2.vars) - (ALLOC.join s1.alloc s2.alloc)) - (M.Sigma.join s1.mem s2.mem) - + (Passive.union + (SIGMA.join s1.vars s2.vars) + (ALLOC.join s1.alloc s2.alloc)) + (M.Sigma.join s1.mem s2.mem) + let get s = function | Var x -> SIGMA.get s.vars x | Alloc x -> ALLOC.get s.alloc x @@ -187,34 +188,34 @@ let value s c = e_var (get s c) let iter f s = begin - SIGMA.iter (fun x -> f (Var x)) s.vars ; - ALLOC.iter (fun x -> f (Alloc x)) s.alloc ; - M.Sigma.iter (fun m -> f (Mem m)) s.mem ; + SIGMA.iter (fun x -> f (Var x)) s.vars ; + ALLOC.iter (fun x -> f (Alloc x)) s.alloc ; + M.Sigma.iter (fun m -> f (Mem m)) s.mem ; end let iter2 f s t = begin - SIGMA.iter2 (fun x a b -> f (Var x) a b) s.vars t.vars ; - ALLOC.iter2 (fun x a b -> f (Alloc x) a b) s.alloc t.alloc ; - M.Sigma.iter2 (fun m p q -> f (Mem m) p q) s.mem t.mem ; + SIGMA.iter2 (fun x a b -> f (Var x) a b) s.vars t.vars ; + ALLOC.iter2 (fun x a b -> f (Alloc x) a b) s.alloc t.alloc ; + M.Sigma.iter2 (fun m p q -> f (Mem m) p q) s.mem t.mem ; end let domain_partition r = begin - let xs = ref HEAP.Set.empty in - let ts = ref TALLOC.Set.empty in - let ms = ref M.Heap.Set.empty in - Heap.Set.iter - (function - | Var x -> xs := HEAP.Set.add x !xs - | Alloc x -> ts := TALLOC.Set.add x !ts - | Mem c -> ms := M.Heap.Set.add c !ms - ) r ; - !xs , !ts , !ms + let xs = ref HEAP.Set.empty in + let ts = ref TALLOC.Set.empty in + let ms = ref M.Heap.Set.empty in + Heap.Set.iter + (function + | Var x -> xs := HEAP.Set.add x !xs + | Alloc x -> ts := TALLOC.Set.add x !ts + | Mem c -> ms := M.Heap.Set.add c !ms + ) r ; + !xs , !ts , !ms end - + let domain_var xs = HEAP.Set.fold (fun x s -> Heap.Set.add (Var x) s) xs Heap.Set.empty - + let domain_alloc ts = TALLOC.Set.fold (fun x s -> Heap.Set.add (Alloc x) s) ts Heap.Set.empty @@ -231,11 +232,11 @@ let havoc s r = let rvar , ralloc , rmem = domain_partition r in { - vars = SIGMA.havoc s.vars rvar ; - alloc = ALLOC.havoc s.alloc ralloc ; - mem = M.Sigma.havoc s.mem rmem ; + vars = SIGMA.havoc s.vars rvar ; + alloc = ALLOC.havoc s.alloc ralloc ; + mem = M.Sigma.havoc s.mem rmem ; } - + let havoc_chunk s = function | Var x -> { s with vars = SIGMA.havoc_chunk s.vars x } | Alloc x -> { s with alloc = ALLOC.havoc_chunk s.alloc x } @@ -249,16 +250,16 @@ let domain s = Heap.Set.union - (Heap.Set.union - (domain_var (SIGMA.domain s.vars)) - (domain_alloc (ALLOC.domain s.alloc))) - (domain_mem (M.Sigma.domain s.mem)) + (Heap.Set.union + (domain_var (SIGMA.domain s.vars)) + (domain_alloc (ALLOC.domain s.alloc))) + (domain_mem (M.Sigma.domain s.mem)) let pretty fmt s = Format.fprintf fmt "@[{X:@[%a@]@ T:@[%a@]@ M:@[%a@]}@]" - SIGMA.pretty s.vars - ALLOC.pretty s.alloc - M.Sigma.pretty s.mem + SIGMA.pretty s.vars + ALLOC.pretty s.alloc + M.Sigma.pretty s.mem end @@ -288,9 +289,9 @@ | Mloc l -> Format.fprintf fmt "ptr(%a)" M.pretty l | Fref x -> Format.fprintf fmt "ref(%a)" VAR.pretty x | Fval(x,ofs) -> - Format.fprintf fmt "@[var(%a)%a@]" VAR.pretty x pp_ofs ofs + Format.fprintf fmt "@[var(%a)%a@]" VAR.pretty x pp_ofs ofs | Mval(x,ofs) -> - Format.fprintf fmt "@[mem(%a)%a@]" VAR.pretty x pp_ofs ofs + Format.fprintf fmt "@[mem(%a)%a@]" VAR.pretty x pp_ofs ofs let rec ofs_vars xs = function | [] -> xs @@ -328,15 +329,15 @@ let mloc x ofs = List.fold_left (fun l d -> match d with - | Field f -> M.field l f - | Index(e,k) -> M.shift l e k) + | Field f -> M.field l f + | Index(e,k) -> M.shift l e k) (M.cvar x) ofs - + let mloc_of_loc = function | Mloc l -> l | Fref _ -> - (* x should never be ByRef when its address is taken *) - Wp_parameters.fatal "Addr of ref-var" + (* x should never be ByRef when its address is taken *) + Wp_parameters.fatal "Addr of ref-var" | Fval(x,ofs) | Mval(x,ofs) -> mloc x ofs let pointer_loc p = Mloc (M.pointer_loc p) @@ -350,9 +351,9 @@ let rec index ofs obj k = match ofs with - | [] -> [Index(obj,k)] - | [Index(elt,i)] when Ctypes.equal elt obj -> [Index(elt,e_add i k)] - | delta :: ofs -> delta :: index ofs obj k + | [] -> [Index(obj,k)] + | [Index(elt,i)] when Ctypes.equal elt obj -> [Index(elt,e_add i k)] + | delta :: ofs -> delta :: index ofs obj k let shift l obj k = match l with | Mloc l -> Mloc (M.shift l obj k) @@ -387,14 +388,14 @@ let rec update a ofs v = match ofs with | [] -> v | Field f :: ofs -> - let phi = Cfield f in - let a_f = F.e_getfield a phi in - let a_f_v = update a_f ofs v in - F.e_setfield a phi a_f_v + let phi = Cfield f in + let a_f = F.e_getfield a phi in + let a_f_v = update a_f ofs v in + F.e_setfield a phi a_f_v | Index(_,k) :: ofs -> - let a_k = F.e_get a k in - let a_k_v = update a_k ofs v in - F.e_set a k a_k_v + let a_k = F.e_get a k in + let a_k_v = update a_k ofs v in + F.e_set a k a_k_v let mload sigma obj l = Cvalues.map_value (fun l -> Mloc l) (M.load sigma.mem obj l) @@ -414,9 +415,9 @@ let stored seq obj l v = match l with | Fref _ -> Wp_parameters.fatal "Write to ref-var" | Fval(x,ofs) -> - let v1 = get_term seq.pre x in - let v2 = get_term seq.post x in - [ F.p_equal v2 (update v1 ofs v) ] + let v1 = get_term seq.pre x in + let v2 = get_term seq.post x in + [ F.p_equal v2 (update v1 ofs v) ] | (Mloc _ | Mval _) as l -> mstored seq obj (mloc_of_loc l) v let copied seq obj l1 l2 = @@ -440,25 +441,25 @@ let loc_diff obj a b = match a , b with - | Mloc l1 , Mloc l2 -> M.loc_diff obj l1 l2 - | Fref x , Fref y when Varinfo.equal x y -> e_zero - | (Fval(x,p)|Mval(x,p)) , (Fval(y,q)|Mval(y,q)) when Varinfo.equal x y -> - e_div (e_sub (offset p) (offset q)) (e_int (Ctypes.sizeof_object obj)) - | Mval _ , _ | _ , Mval _ - | Fval _ , _ | _ , Fval _ - | Fref _ , _ | _ , Fref _ - -> Warning.error ~source:"Reference Variable Model" - "Uncomparable locations %a and %a" pretty a pretty b - + | Mloc l1 , Mloc l2 -> M.loc_diff obj l1 l2 + | Fref x , Fref y when Varinfo.equal x y -> e_zero + | (Fval(x,p)|Mval(x,p)) , (Fval(y,q)|Mval(y,q)) when Varinfo.equal x y -> + e_div (e_sub (offset p) (offset q)) (e_int (Ctypes.sizeof_object obj)) + | Mval _ , _ | _ , Mval _ + | Fval _ , _ | _ , Fval _ + | Fref _ , _ | _ , Fref _ + -> Warning.error ~source:"Reference Variable Model" + "Uncomparable locations %a and %a" pretty a pretty b + let loc_compare lcmp icmp same a b = match a , b with - | Mloc l1 , Mloc l2 -> lcmp l1 l2 - | Fref x , Fref y -> - if Varinfo.equal x y then same else p_not same - | (Fval(x,p)|Mval(x,p)) , (Fval(y,q)|Mval(y,q)) -> - if Varinfo.equal x y then icmp (offset p) (offset q) else p_not same - | (Fval _|Mval _|Mloc _) , (Fval _|Mval _|Mloc _) -> lcmp (mloc_of_loc a) (mloc_of_loc b) - | Fref _ , _ | _ , Fref _ -> p_not same + | Mloc l1 , Mloc l2 -> lcmp l1 l2 + | Fref x , Fref y -> + if Varinfo.equal x y then same else p_not same + | (Fval(x,p)|Mval(x,p)) , (Fval(y,q)|Mval(y,q)) -> + if Varinfo.equal x y then icmp (offset p) (offset q) else p_not same + | (Fval _|Mval _|Mloc _) , (Fval _|Mval _|Mloc _) -> lcmp (mloc_of_loc a) (mloc_of_loc b) + | Fref _ , _ | _ , Fref _ -> p_not same let loc_eq = loc_compare M.loc_eq F.p_equal F.p_true let loc_lt = loc_compare M.loc_lt F.p_lt F.p_false @@ -472,92 +473,95 @@ let size_of_array_type typ = match object_of typ with | C_int _ | C_float _ | C_pointer _ | C_comp _ -> assert false | C_array { arr_flat=None } -> - if not (Wp_parameters.ExternArrays.get ()) - then Wp_parameters.warning ~once:true - "Validity of unsized array not implemented yet (considered valid)." ; - None + if not (Wp_parameters.ExternArrays.get ()) + then Wp_parameters.warning ~once:true + "Validity of unsized array not implemented yet (considered valid)." ; + None | C_array { arr_flat=Some s } -> Some (e_int s.arr_size) (* offset *) - + let first_index = Some e_zero - + let range_offset typ k = match size_of_array_type typ with - | None -> p_positive k - | Some s -> p_and (p_positive k) (p_lt k s) + | None -> p_positive k + | Some s -> p_and (p_positive k) (p_lt k s) let rec valid_offset typ = function | [] -> p_true | Field f :: ofs -> valid_offset f.ftype ofs | Index(_,k) :: ofs -> - let h = range_offset typ k in - p_and h (valid_offset (Cil.typeOf_array_elem typ) ofs) + let h = range_offset typ k in + p_and h (valid_offset (Cil.typeOf_array_elem typ) ofs) let rec valid_offsetrange typ p a b = match p with | Field f :: ofs -> valid_offsetrange f.ftype ofs a b | [Index(obj,k)] -> - let te = Cil.typeOf_array_elem typ in - let elt = Ctypes.object_of te in - if Ctypes.equal elt obj then - let n = size_of_array_type typ in - let a = Vset.bound_shift a k in - let b = Vset.bound_shift b k in - let p_inf = Vset.ordered ~limit:true ~strict:false first_index a in - let p_sup = Vset.ordered ~limit:true ~strict:true b n in - p_and p_inf p_sup - else - let rg = range_offset typ k in - let te = Cil.typeOf_array_elem typ in - p_and rg (valid_offsetrange te [] a b) + let te = Cil.typeOf_array_elem typ in + let elt = Ctypes.object_of te in + if Ctypes.equal elt obj then + let n = size_of_array_type typ in + let a = Vset.bound_shift a k in + let b = Vset.bound_shift b k in + let p_inf = Vset.ordered ~limit:true ~strict:false first_index a in + let p_sup = Vset.ordered ~limit:true ~strict:true b n in + p_and p_inf p_sup + else + let rg = range_offset typ k in + let te = Cil.typeOf_array_elem typ in + p_and rg (valid_offsetrange te [] a b) | Index(_,k) :: ofs -> - let rg = range_offset typ k in - let te = Cil.typeOf_array_elem typ in - p_and rg (valid_offsetrange te ofs a b) + let rg = range_offset typ k in + let te = Cil.typeOf_array_elem typ in + p_and rg (valid_offsetrange te ofs a b) | [] -> - let n = size_of_array_type typ in - let p_inf = Vset.ordered ~limit:true ~strict:false first_index a in - let p_sup = Vset.ordered ~limit:true ~strict:true b n in - p_and p_inf p_sup + let n = size_of_array_type typ in + let p_inf = Vset.ordered ~limit:true ~strict:false first_index a in + let p_sup = Vset.ordered ~limit:true ~strict:true b n in + p_and p_inf p_sup (* varinfo + offset *) - let valid_base sigma x = - if x.vglob then p_true else - p_bool (ALLOC.value sigma.alloc x) + let valid_base sigma acs x = + if x.vglob then + if acs = RW && Cil.typeHasQualifier "const" x.vtype + then p_false + else p_true + else p_bool (ALLOC.value sigma.alloc x) - let valid_path sigma x t ofs = + let valid_path sigma acs x t ofs = p_and - (valid_base sigma x) + (valid_base sigma acs x) (valid_offset t ofs) - let valid_pathrange sigma x t ofs a b = + let valid_pathrange sigma acs x t ofs a b = p_and - (valid_base sigma x) + (valid_base sigma acs x) (p_imply - (Vset.ordered ~limit:true ~strict:false a b) - (valid_offsetrange t ofs a b)) + (Vset.ordered ~limit:true ~strict:false a b) + (valid_offsetrange t ofs a b)) (* segment *) - let valid_loc sigma acs obj = function + let valid_loc sigma (acs:acs) obj = function | Fref _ -> p_true - | Fval(x,p) | Mval(x,p) -> valid_path sigma x (VAR.typ_of_param x) p + | Fval(x,p) | Mval(x,p) -> valid_path sigma acs x (VAR.typ_of_param x) p | Mloc _ as l -> M.valid sigma.mem acs (Rloc(obj,mloc_of_loc l)) - + let valid_range sigma acs l obj a b = match l with | Fref _ -> Wp_parameters.fatal "range of ref-var" - | Fval(x,p) | Mval(x,p) -> valid_pathrange sigma x (VAR.typ_of_param x) p a b + | Fval(x,p) | Mval(x,p) -> valid_pathrange sigma acs x (VAR.typ_of_param x) p a b | Mloc _ as l -> M.valid sigma.mem acs (Rrange(mloc_of_loc l,obj,a,b)) let valid_array sigma acs l obj s = match l with | Fref _ -> Wp_parameters.fatal "range of ref-var" - | Fval(x,p) | Mval(x,p) -> valid_path sigma x (VAR.typ_of_param x) p + | Fval(x,p) | Mval(x,p) -> valid_path sigma acs x (VAR.typ_of_param x) p | Mloc _ as l -> - let a = Some e_zero in - let b = Some (e_int (s-1)) in - M.valid sigma.mem acs (Rrange(mloc_of_loc l,obj,a,b)) - + let a = Some e_zero in + let b = Some (e_int (s-1)) in + M.valid sigma.mem acs (Rrange(mloc_of_loc l,obj,a,b)) + let valid sigma acs = function | Rloc(obj,l) -> valid_loc sigma acs obj l | Rarray(l,obj,s) -> valid_array sigma acs l obj s @@ -584,21 +588,32 @@ let h_out = alloc_var ta_out xs_all (if valid then e_false else e_true) in let h_in = alloc_var ta_in xs_all (if valid then e_true else e_false) in begin - ta_in , h_in @ h_out + ta_in , h_in @ h_out end - let scope_vars ta sc xs = + let framed sigma = + let pool = ref [] in + SIGMA.iter + (fun x p -> + if (x.vglob || x.vformal) && VAR.is_pointer x then + pool := M.global sigma.mem (e_var p) :: !pool + ) sigma.vars ; + !pool + + let scope_vars sigma sc xs = match sc with - | Mcfg.SC_Global | Mcfg.SC_Function_in -> ta , [] - | Mcfg.SC_Function_frame | Mcfg.SC_Block_in -> allocates ta xs false - | Mcfg.SC_Function_out | Mcfg.SC_Block_out -> allocates ta xs true + | Mcfg.SC_Global | Mcfg.SC_Function_in -> sigma.alloc , framed sigma + | Mcfg.SC_Function_frame | Mcfg.SC_Block_in -> allocates sigma.alloc xs false + | Mcfg.SC_Function_out | Mcfg.SC_Block_out -> allocates sigma.alloc xs true let scope sigma sc xs = let xmem = List.filter is_mem xs in let smem , hmem = M.scope sigma.mem sc xmem in - let ta , hvars = scope_vars sigma.alloc sc xs in + let ta , hvars = scope_vars sigma sc xs in { vars = sigma.vars ; alloc = ta ; mem = smem } , hvars @ hmem + let global sigma p = M.global sigma.mem p + (* -------------------------------------------------------------------------- *) (* --- Segment --- *) (* -------------------------------------------------------------------------- *) @@ -611,7 +626,7 @@ and delta = | Dfield of fieldinfo | Drange of term option * term option - + let dofs = function | Field f -> Dfield f | Index(_,k) -> let u = Some k in Drange(u,u) @@ -620,10 +635,10 @@ let rec range ofs obj a b = match ofs with - | [] -> [ Drange(a,b) ] - | [Index(elt,k)] when Ctypes.equal elt obj -> - [ Drange( Vset.bound_shift a k , Vset.bound_shift b k ) ] - | d :: ofs -> dofs d :: range ofs obj a b + | [] -> [ Drange(a,b) ] + | [Index(elt,k)] when Ctypes.equal elt obj -> + [ Drange( Vset.bound_shift a k , Vset.bound_shift b k ) ] + | d :: ofs -> dofs d :: range ofs obj a b let dsize s = Drange(Some (e_int 0) , Some (e_int (s-1))) let rsize ofs s = delta ofs @ [ dsize s ] @@ -634,7 +649,7 @@ | Rloc(_,Fref x) -> Rseg x | Rarray(Fref _,_,_) | Rrange(Fref _,_,_,_) -> - Wp_parameters.fatal "range of ref-var" + Wp_parameters.fatal "range of ref-var" | Rloc(obj,Mloc l) -> Lseg (Rloc(obj,l)) | Rloc(_,Fval(x,ofs)) -> Fseg(x,delta ofs) @@ -645,13 +660,13 @@ | Rrange(Mloc l,obj,a,b) -> Lseg (Rrange(l,obj,a,b)) | Rrange(Fval(x,ofs),obj,a,b) -> Fseg(x,range ofs obj a b) - (* in M: *) + (* in M: *) | Rloc(obj,Mval(x,ofs)) -> - Mseg(Rloc(obj,mloc x ofs),x,delta ofs) + Mseg(Rloc(obj,mloc x ofs),x,delta ofs) | Rarray(Mval(x,ofs),obj,s) -> - Mseg(Rarray(mloc x ofs,obj,s),x,rsize ofs s) + Mseg(Rarray(mloc x ofs,obj,s),x,rsize ofs s) | Rrange(Mval(x,ofs),obj,a,b) -> - Mseg(Rrange(mloc x ofs,obj,a,b),x,range ofs obj a b) + Mseg(Rrange(mloc x ofs,obj,a,b),x,range ofs obj a b) (* -------------------------------------------------------------------------- *) (* --- Segment Inclusion --- *) @@ -659,30 +674,30 @@ let rec included_delta d1 d2 = match d1 , d2 with - | _ , [] -> p_true - | [] , _ -> p_false - | u :: d1 , v :: d2 -> - match u , v with - | Dfield f , Dfield g when Fieldinfo.equal f g -> - included_delta d1 d2 - | Dfield _ , _ | _ , Dfield _ -> p_false - | Drange(a1,b1) , Drange(a2,b2) -> - p_conj [ Vset.ordered ~strict:false ~limit:true a2 a1 ; - Vset.ordered ~strict:false ~limit:true b1 b2 ; - included_delta d1 d2 ] + | _ , [] -> p_true + | [] , _ -> p_false + | u :: d1 , v :: d2 -> + match u , v with + | Dfield f , Dfield g when Fieldinfo.equal f g -> + included_delta d1 d2 + | Dfield _ , _ | _ , Dfield _ -> p_false + | Drange(a1,b1) , Drange(a2,b2) -> + p_conj [ Vset.ordered ~strict:false ~limit:true a2 a1 ; + Vset.ordered ~strict:false ~limit:true b1 b2 ; + included_delta d1 d2 ] let included s1 s2 = match locseg s1 , locseg s2 with - | Rseg x , Rseg y -> if Varinfo.equal x y then p_true else p_false - | Rseg _ , _ | _ , Rseg _ -> p_false + | Rseg x , Rseg y -> if Varinfo.equal x y then p_true else p_false + | Rseg _ , _ | _ , Rseg _ -> p_false - | Fseg(x1,d1) , Fseg(x2,d2) - | Mseg(_,x1,d1) , Mseg(_,x2,d2) -> - if Varinfo.equal x1 x2 then included_delta d1 d2 else p_false + | Fseg(x1,d1) , Fseg(x2,d2) + | Mseg(_,x1,d1) , Mseg(_,x2,d2) -> + if Varinfo.equal x1 x2 then included_delta d1 d2 else p_false - | Fseg _ , _ | _ , Fseg _ -> p_false + | Fseg _ , _ | _ , Fseg _ -> p_false - | (Lseg s1|Mseg(s1,_,_)) , (Lseg s2|Mseg(s2,_,_)) -> M.included s1 s2 + | (Lseg s1|Mseg(s1,_,_)) , (Lseg s2|Mseg(s2,_,_)) -> M.included s1 s2 (* -------------------------------------------------------------------------- *) (* --- Segment Separation --- *) @@ -690,28 +705,28 @@ let rec separated_delta d1 d2 = match d1 , d2 with - | [] , _ | _ , [] -> p_false - | u :: d1 , v :: d2 -> - match u , v with - | Dfield f , Dfield g when Fieldinfo.equal f g - -> separated_delta d1 d2 - | Dfield _ , _ | _ , Dfield _ -> p_true - | Drange(a1,b1) , Drange(a2,b2) -> - p_disj [ Vset.ordered ~strict:true ~limit:false b1 a2 ; - Vset.ordered ~strict:true ~limit:false b2 a1 ; - separated_delta d1 d2 ] + | [] , _ | _ , [] -> p_false + | u :: d1 , v :: d2 -> + match u , v with + | Dfield f , Dfield g when Fieldinfo.equal f g + -> separated_delta d1 d2 + | Dfield _ , _ | _ , Dfield _ -> p_true + | Drange(a1,b1) , Drange(a2,b2) -> + p_disj [ Vset.ordered ~strict:true ~limit:false b1 a2 ; + Vset.ordered ~strict:true ~limit:false b2 a1 ; + separated_delta d1 d2 ] let separated r1 r2 = match locseg r1 , locseg r2 with - | Rseg x , Rseg y -> if Varinfo.equal x y then p_false else p_true - | Rseg _ , _ | _ , Rseg _ -> p_true + | Rseg x , Rseg y -> if Varinfo.equal x y then p_false else p_true + | Rseg _ , _ | _ , Rseg _ -> p_true - | Fseg(x1,d1) , Fseg(x2,d2) - | Mseg(_,x1,d1) , Mseg(_,x2,d2) -> - if Varinfo.equal x1 x2 then separated_delta d1 d2 else p_true - | Fseg _ , _ | _ , Fseg _ -> p_true + | Fseg(x1,d1) , Fseg(x2,d2) + | Mseg(_,x1,d1) , Mseg(_,x2,d2) -> + if Varinfo.equal x1 x2 then separated_delta d1 d2 else p_true + | Fseg _ , _ | _ , Fseg _ -> p_true - | (Lseg s1|Mseg(s1,_,_)) , (Lseg s2|Mseg(s2,_,_)) -> M.separated s1 s2 + | (Lseg s1|Mseg(s1,_,_)) , (Lseg s2|Mseg(s2,_,_)) -> M.separated s1 s2 (* -------------------------------------------------------------------------- *) (* --- Segment Assignation --- *) @@ -721,13 +736,13 @@ | Sloc l -> [],l,p_true | Sdescr(xs,l,p) -> xs,l,p | Sarray(l,obj,s) -> - let x = Lang.freshvar ~basename:"k" Qed.Logic.Int in - let k = e_var x in - [x],shift l obj k,Vset.in_size k s + let x = Lang.freshvar ~basename:"k" Qed.Logic.Int in + let k = e_var x in + [x],shift l obj k,Vset.in_size k s | Srange(l,obj,a,b) -> - let x = Lang.freshvar ~basename:"k" Qed.Logic.Int in - let k = e_var x in - [x],shift l obj k,Vset.in_range k a b + let x = Lang.freshvar ~basename:"k" Qed.Logic.Int in + let k = e_var x in + [x],shift l obj k,Vset.in_range k a b let floc_path = function | Mloc _ | Mval _ -> assert false (* Filtered in assigned *) @@ -740,82 +755,82 @@ (ys : var list) (* variable quantifying others locations *) (a : term) (* pre-term for root + current offset *) (b : term) (* post-term for root + current offset *) - = function - | [] -> hs + = function + | [] -> hs + + (*TODO: optimized version for terminal [Field _] and [Index _] *) + + | Field f :: ofs -> + let cf = Cfield f in + let af = e_getfield a cf in + let bf = e_getfield b cf in + let hs = assigned_path hs xs ys af bf ofs in + List.fold_left + (fun hs g -> + if Fieldinfo.equal f g then hs else + let cg = Cfield g in + let ag = e_getfield a cg in + let bg = e_getfield b cg in + let eqg = p_forall ys (p_equal ag bg) in + eqg :: hs + ) hs f.fcomp.cfields + + | Index(_,e) :: ofs -> + let y = Lang.freshvar ~basename:"k" Qed.Logic.Int in + let k = e_var y in + let ak = e_get a k in + let bk = e_get b k in + if List.exists (fun x -> F.occurs x e) xs then + (* index [e] is covered by [xs]: + must explore deeper the remaining path. *) + assigned_path hs xs (y::ys) ak bk ofs + else + (* index [e] is not covered by [xs]: + any indice different from e is disjoint. + explore also deeply with index [e]. *) + let ae = e_get a e in + let be = e_get b e in + let ek = p_neq e k in + let eqk = p_forall (y::ys) (p_imply ek (p_equal ak bk)) in + assigned_path (eqk :: hs) xs ys ae be ofs - (*TODO: optimized version for terminal [Field _] and [Index _] *) - - | Field f :: ofs -> - let cf = Cfield f in - let af = e_getfield a cf in - let bf = e_getfield b cf in - let hs = assigned_path hs xs ys af bf ofs in - List.fold_left - (fun hs g -> - if Fieldinfo.equal f g then hs else - let cg = Cfield f in - let ag = e_getfield a cg in - let bg = e_getfield b cg in - let eqg = p_forall ys (p_equal ag bg) in - eqg :: hs - ) hs f.fcomp.cfields - - | Index(_,e) :: ofs -> - let y = Lang.freshvar ~basename:"k" Qed.Logic.Int in - let k = e_var y in - let ak = e_get a k in - let bk = e_get b k in - if List.exists (fun x -> F.occurs x e) xs then - (* index [e] is covered by [xs]: - must explore deeper the remaining path. *) - assigned_path hs xs (y::ys) ak bk ofs - else - (* index [e] is not covered by [xs]: - any indice different from e is disjoint. - explore also deeply with index [e]. *) - let ae = e_get a e in - let be = e_get b e in - let ek = p_neq e k in - let eqk = p_forall (y::ys) (p_imply ek (p_equal ak bk)) in - assigned_path (eqk :: hs) xs ys ae be ofs - let assigned s obj = function (* Optimisation for functional updates in one variable *) | Sloc(Fval(_,_::_) as loc) -> - let v = Lang.freshvar ~basename:"v" (Lang.tau_of_object obj) in - stored s obj loc (e_var v) + let v = Lang.freshvar ~basename:"v" (Lang.tau_of_object obj) in + stored s obj loc (e_var v) (* Optimisation for full update of one array variable *) | Sarray(Fval(_,[]),_,_) -> [] | Sarray(Fval(x,ofs),_,_) -> - let a = get_term s.pre x in - let b = get_term s.post x in - assigned_path [] [] [] a b ofs + let a = get_term s.pre x in + let b = get_term s.post x in + assigned_path [] [] [] a b ofs | sloc -> - (* Transfer the job to memory model M if sloc is in M *) - try - let sloc = Cvalues.map_sloc - (function - | (Mloc _ | Mval _) as l -> mloc_of_loc l - | Fval _ | Fref _ -> raise Exit - ) sloc in - M.assigned { pre=s.pre.mem ; post=s.post.mem } obj sloc - with Exit -> - - (* Otherwize compute a set of equalities for each sub-path - of the assigned location *) - - let xs,l,p = sloc_descr sloc in - let x,ofs = floc_path l in - let a = get_term s.pre x in - let b = get_term s.post x in - let a_ofs = access a ofs in - let b_ofs = access b ofs in - let p_sloc = p_forall xs (p_imply (p_not p) (p_equal a_ofs b_ofs)) in - assigned_path [p_sloc] xs [] a b ofs + (* Transfer the job to memory model M if sloc is in M *) + try + let sloc = Cvalues.map_sloc + (function + | (Mloc _ | Mval _) as l -> mloc_of_loc l + | Fval _ | Fref _ -> raise Exit + ) sloc in + M.assigned { pre=s.pre.mem ; post=s.post.mem } obj sloc + with Exit -> + + (* Otherwize compute a set of equalities for each sub-path + of the assigned location *) + + let xs,l,p = sloc_descr sloc in + let x,ofs = floc_path l in + let a = get_term s.pre x in + let b = get_term s.post x in + let a_ofs = access a ofs in + let b_ofs = access b ofs in + let p_sloc = p_forall xs (p_imply (p_not p) (p_equal a_ofs b_ofs)) in + assigned_path [p_sloc] xs [] a b ofs (* -------------------------------------------------------------------------- *) (* --- Domain --- *) @@ -823,11 +838,11 @@ let domain obj = function | (Mloc _ | Mval _) as l -> - M.Heap.Set.fold - (fun m s -> Heap.Set.add (Mem m) s) - (M.domain obj (mloc_of_loc l)) Heap.Set.empty + M.Heap.Set.fold + (fun m s -> Heap.Set.add (Mem m) s) + (M.domain obj (mloc_of_loc l)) Heap.Set.empty | Fref x | Fval(x,_) -> - Heap.Set.singleton (Var x) + Heap.Set.singleton (Var x) (* -------------------------------------------------------------------------- *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/MemVar.mli frama-c-20150201+sodium+dfsg/src/wp/MemVar.mli --- frama-c-20140301+neon+dfsg/src/wp/MemVar.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/MemVar.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Model.ml frama-c-20150201+sodium+dfsg/src/wp/Model.ml --- frama-c-20140301+neon+dfsg/src/wp/Model.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Model.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -40,26 +40,26 @@ } module D = Datatype.Make_with_collections(struct - type t = model - let name = "WP.Model" + type t = model + let name = "WP.Model" - let rehash = Datatype.identity (** TODO: register and find below? *) - let structural_descr = - let open Structural_descr in - t_record [| p_string; p_string; pack (t_option t_string) ; - Emitter.packed_descr; pack (t_list t_unknown) |] - - let reprs = [repr] - - let equal x y = Datatype.String.equal x.id y.id - let compare x y = Datatype.String.compare x.id y.id - let hash x = Datatype.String.hash x.id - let copy = Datatype.identity - let internal_pretty_code _ fmt x = Format.pp_print_string fmt x.id - let pretty fmt x = Format.pp_print_string fmt x.descr - let mem_project = Datatype.never_any_project - let varname _ = "m" -end) + let rehash = Datatype.identity (** TODO: register and find below? *) + let structural_descr = + let open Structural_descr in + t_record [| p_string; p_string; pack (t_option t_string) ; + Emitter.packed_descr; pack (t_list t_unknown) |] + + let reprs = [repr] + + let equal x y = Datatype.String.equal x.id y.id + let compare x y = Datatype.String.compare x.id y.id + let hash x = Datatype.String.hash x.id + let copy = Datatype.identity + let internal_pretty_code _ fmt x = Format.pp_print_string fmt x.id + let pretty fmt x = Format.pp_print_string fmt x.descr + let mem_project = Datatype.never_any_project + let varname _ = "m" + end) module MODELS = @@ -99,7 +99,7 @@ let get_id m = m.id let get_descr m = m.descr - + let model = Context.create "Wp.Model" let rec bind = function [] -> () | f::fs -> f () ; bind fs @@ -118,6 +118,7 @@ let get_model () = Context.get model let get_emitter model = model.emitter +let is_model_defined () = Context.defined model let directory () = Wp_parameters.get_output_dir (Context.get model).id @@ -152,7 +153,7 @@ struct module E = E - + type key = E.key type data = E.data @@ -171,21 +172,21 @@ module ENTRIES : Datatype.S with type t = entries = Datatype.Make (struct - type t = entries - include Datatype.Serializable_undefined - let reprs = [{ident=0;index=MAP.empty;lock=SET.empty}] - let name = "Wp.Model.Index." ^ E.name - end) + type t = entries + include Datatype.Serializable_undefined + let reprs = [{ident=0;index=MAP.empty;lock=SET.empty}] + let name = "Wp.Model.Index." ^ E.name + end) module REGISTRY = State_builder.Hashtbl - (Datatype.String.Hashtbl) - (ENTRIES) - (struct - let name = "Wp.Model." ^ E.name - let dependencies = [Ast.self] - let size = 32 - end) - (* Projectified entry map, indexed by model *) + (Datatype.String.Hashtbl) + (ENTRIES) + (struct + let name = "Wp.Model." ^ E.name + let dependencies = [Ast.self] + let size = 32 + end) + (* Projectified entry map, indexed by model *) let entries () : entries = let mid = (Context.get model).id in @@ -208,9 +209,101 @@ begin let e = entries () in if MAP.mem k e.index then - Wp_parameters.fatal "Duplicate definition (%s:%a)" E.name E.pretty k ; + Wp_parameters.fatal "Duplicate definition (%s:%a)" E.name E.pretty k ; + if SET.mem k e.lock then + Wp_parameters.fatal "Locked definition (%s:%a)" E.name E.pretty k ; + e.index <- MAP.add k d e.index ; + fire k d ; + end + + let update k d = + begin + let e = entries () in + e.index <- MAP.add k d e.index ; + fire k d ; + end + + let memoize f k = + let e = entries () in + try MAP.find k e.index + with Not_found -> + let lock = e.lock in + e.lock <- SET.add k e.lock ; + let d = f k in + e.index <- MAP.add k d e.index ; + fire k d ; + e.lock <- lock ; + d (* in case of exception, the entry remains intentionally locked *) + + let compile f k = + ignore (memoize f k) + + let iter f = MAP.iter f (entries()).index + + let iter_sorted f = + let e = entries () in + let s = MAP.fold (fun k _ s -> SET.add k s) e.index SET.empty in + SET.iter (fun k -> f k (MAP.find k e.index)) s + +end + +module Static(E : Entries) = +struct + + module E = E + + type key = E.key + type data = E.data + + module KEY = struct type t = E.key let compare = E.compare end + module MAP = FCMap.Make(KEY) + module SET = FCSet.Make(KEY) + + let demon = ref [] + + type entries = { + mutable ident : int ; + mutable index : E.data MAP.t ; + mutable lock : SET.t ; + } + + module ENTRIES : Datatype.S with type t = entries = + Datatype.Make + (struct + type t = entries + include Datatype.Serializable_undefined + let reprs = [{ident=0;index=MAP.empty;lock=SET.empty}] + let name = "Wp.Model.Index." ^ E.name + end) + + module REGISTRY = State_builder.Ref + (ENTRIES) + (struct + let name = "Wp.Model." ^ E.name + let dependencies = [Ast.self] + let default () = { ident=0 ; index=MAP.empty ; lock=SET.empty } + end) + (* Projectified entry map, indexed by model *) + + let entries () : entries = REGISTRY.get () + + let mem k = let e = entries () in MAP.mem k e.index || SET.mem k e.lock + + let find k = let e = entries () in MAP.find k e.index + let get k = try Some (find k) with Not_found -> None + + let fire k d = + List.iter (fun f -> f k d) !demon + + let callback f = demon := !demon @ [f] + + let define k d = + begin + let e = entries () in + if MAP.mem k e.index then + Wp_parameters.fatal "Duplicate definition (%s:%a)" E.name E.pretty k ; if SET.mem k e.lock then - Wp_parameters.fatal "Locked definition (%s:%a)" E.name E.pretty k ; + Wp_parameters.fatal "Locked definition (%s:%a)" E.name E.pretty k ; e.index <- MAP.add k d e.index ; fire k d ; end @@ -272,10 +365,10 @@ struct module G = Index - (struct - include K - include D - end) + (struct + include K + include D + end) type key = D.key type data = D.data diff -Nru frama-c-20140301+neon+dfsg/src/wp/Model.mli frama-c-20150201+sodium+dfsg/src/wp/Model.mli --- frama-c-20140301+neon+dfsg/src/wp/Model.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Model.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -43,6 +43,7 @@ val with_model : model -> ('a -> 'b) -> 'a -> 'b val on_model : model -> (unit -> unit) -> unit val get_model : unit -> model (** Current model *) +val is_model_defined : unit -> bool val directory : unit -> string (** Current model in ["-wp-out"] directory *) @@ -66,13 +67,13 @@ val find : key -> data val get : key -> data option val define : key -> data -> unit - (** no redefinition ; circularity protected *) + (** no redefinition ; circularity protected *) val update : key -> data -> unit - (** set current value, with no protection *) + (** set current value, with no protection *) val memoize : (key -> data) -> key -> data - (** with circularity protection *) + (** with circularity protection *) val compile : (key -> data) -> key -> unit - (** with circularity protection *) + (** with circularity protection *) val callback : (key -> data -> unit) -> unit @@ -81,6 +82,10 @@ end module Index(E : Entries) : Registry with module E = E +(** projectified, depend on the model, not serialized *) + +module Static(E : Entries) : Registry with module E = E +(** projectified, not serialized *) module type Key = sig @@ -106,4 +111,4 @@ module Generator(K : Key)(D : Data with type key = K.t) : Generator with type key = D.key - and type data = D.data + and type data = D.data diff -Nru frama-c-20140301+neon+dfsg/src/wp/normAtLabels.ml frama-c-20150201+sodium+dfsg/src/wp/normAtLabels.ml --- frama-c-20140301+neon+dfsg/src/wp/normAtLabels.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/normAtLabels.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -26,12 +26,12 @@ (** push the Tat down to the 'data' operations. -* This can be useful in cases like \at (x + \at(y, Ly), Lx) because -* it gives \at(x, Lx) + \at(y, Ly) so there is no more \at imbrications. + * This can be useful in cases like \at (x + \at(y, Ly), Lx) because + * it gives \at(x, Lx) + \at(y, Ly) so there is no more \at imbrications. * Also try to "normalize" label : * - remove Here because its meaning change when propagating, * - remove Old because its meaning depend on where it comes from. -* *) + * *) class norm_at label_map = object(self) inherit Visitor.generic_frama_c_visitor (Cil.copy_visit (Project.current ())) @@ -59,35 +59,35 @@ method! vterm t = match t.term_node with - | Tat (t, l) -> - let old_label = self#change_label l in - let new_t = {t with term_node = Ttypeof t} in - Cil.ChangeDoChildrenPost (new_t, self#restore_term old_label) - | TAddrOf (h, _) | TLval (h, _) | TStartOf (h, _) -> - let old_label = current_label in - let at_label = match h with - | TResult _ -> Some Logic_const.post_label - | _ -> old_label - in - current_label <- None; - let post t = - current_label <- old_label; - match at_label with - | Some label -> {t with term_node = Tat (t, label)} - | None -> t - in Cil.ChangeDoChildrenPost (t, post) - | Tapp _ -> - let post = function - | {term_node=Tapp(predicate,labels,args)} as t -> - let new_labels = - List.map - (fun (logic_lab, stmt_lab) -> logic_lab, label_map stmt_lab) - labels - in { t with term_node=Tapp(predicate,new_labels,args) } - | _ -> assert false - in - Cil.ChangeDoChildrenPost (t,post) - | _ -> Cil.DoChildren + | Tat (t, l) -> + let old_label = self#change_label l in + let new_t = {t with term_node = Ttypeof t} in + Cil.ChangeDoChildrenPost (new_t, self#restore_term old_label) + | TAddrOf (h, _) | TLval (h, _) | TStartOf (h, _) -> + let old_label = current_label in + let at_label = match h with + | TResult _ -> Some Logic_const.post_label + | _ -> old_label + in + current_label <- None; + let post t = + current_label <- old_label; + match at_label with + | Some label -> {t with term_node = Tat (t, label)} + | None -> t + in Cil.ChangeDoChildrenPost (t, post) + | Tapp _ -> + let post = function + | {term_node=Tapp(predicate,labels,args)} as t -> + let new_labels = + List.map + (fun (logic_lab, stmt_lab) -> logic_lab, label_map stmt_lab) + labels + in { t with term_node=Tapp(predicate,new_labels,args) } + | _ -> assert false + in + Cil.ChangeDoChildrenPost (t,post) + | _ -> Cil.DoChildren method! vpredicate_named p = match p.content with | Pat (p, l) -> @@ -117,16 +117,19 @@ (* -------------------------------------------------------------------------- *) let labels_fct_pre = function + | LogicLabel (None, "Init") -> Logic_const.init_label | LogicLabel (None, ("Pre" | "Here")) -> Logic_const.pre_label | l -> raise (LabelError l) let labels_fct_post = function + | LogicLabel (None, "Init") -> Logic_const.init_label | LogicLabel (None, ("Pre" | "Old")) -> Logic_const.pre_label | LogicLabel (None, ("Post" | "Here")) -> Logic_const.post_label | l -> raise (LabelError l) let labels_fct_assigns = function + | LogicLabel (None, "Init") -> Logic_const.init_label | LogicLabel (None, "Post") -> Logic_const.post_label | LogicLabel (None, ("Pre" | "Old")) -> Logic_const.pre_label | l -> raise (LabelError l) @@ -135,6 +138,7 @@ (* --- Statements Contracts --- *) (* -------------------------------------------------------------------------- *) let labels_stmt_pre s = function + | LogicLabel (None, "Init") -> Logic_const.init_label | LogicLabel (None, "Pre") -> Logic_const.pre_label (* fct pre-state *) | LogicLabel (None, "Here") -> Clabels.mk_logic_label s | LogicLabel (Some s, _) -> Clabels.mk_logic_label s @@ -142,17 +146,19 @@ | l -> raise (LabelError l) let labels_stmt_post s l_post = function + | LogicLabel (None, "Init") -> Logic_const.init_label | LogicLabel (None, "Pre") -> Logic_const.pre_label (* fct pre-state *) | LogicLabel (None, "Old") -> Clabels.mk_logic_label s (* contract pre-state *) | LogicLabel (None, ("Here" | "Post")) as l -> begin match l_post with Some l -> l - | None -> (* TODO ? *) raise (LabelError l) + | None -> (* TODO ? *) raise (LabelError l) end | LogicLabel (Some s, _) -> Clabels.mk_logic_label s | StmtLabel rs -> Clabels.mk_logic_label !rs | l -> raise (LabelError l) let labels_stmt_assigns s l_post = function + | LogicLabel (None, "Init") -> Logic_const.init_label | LogicLabel (None, "Pre") -> Logic_const.pre_label (* fct pre-state *) | LogicLabel (None, ("Here" | "Old")) -> (* contract pre-state *) Clabels.mk_logic_label s @@ -166,6 +172,7 @@ (* -------------------------------------------------------------------------- *) let labels_assert_before s = function + | LogicLabel (None, "Init") -> Logic_const.init_label | LogicLabel (None, "Pre") -> Logic_const.pre_label | LogicLabel (None, "Here") -> Clabels.mk_logic_label s | LogicLabel (Some s, _) -> Clabels.mk_logic_label s @@ -173,6 +180,7 @@ | l -> raise (LabelError l) let labels_assert_after s l_post = function + | LogicLabel (None, "Init") -> Logic_const.init_label | LogicLabel (None, "Pre") -> Logic_const.pre_label | LogicLabel (None, "Here") -> labels_stmt_post s l_post Logic_const.post_label @@ -181,6 +189,7 @@ | l -> raise (LabelError l) let labels_loop_inv s = function + | LogicLabel (None, "Init") -> Logic_const.init_label | LogicLabel (None, "Pre") -> Logic_const.pre_label | LogicLabel (None, "Here") -> Logic_const.here_label | LogicLabel (None, "LoopEntry") -> Clabels.mk_logic_label s @@ -198,22 +207,22 @@ with Not_found -> l let labels_axiom = function - | LogicLabel (None, ("Pre"|"Old"|"Post")) as l -> raise (LabelError l) - | LogicLabel (None, _) as l -> l - | l -> raise (LabelError l) + | LogicLabel (None, ("Pre"|"Old"|"Post")) as l -> raise (LabelError l) + | LogicLabel (None, _) as l -> l + | l -> raise (LabelError l) (* -------------------------------------------------------------------------- *) (* --- Apply Normalization --- *) (* -------------------------------------------------------------------------- *) (** @raise LabelError if there is a label in [p] that is incompatible -* with the [labels] translation *) + * with the [labels] translation *) let preproc_annot labels p = let visitor = new norm_at labels in Visitor.visitFramacPredicateNamed visitor p (** @raise LabelError if there is a label in [p] that is incompatible -* with the [labels] translation *) + * with the [labels] translation *) let preproc_assigns labels asgns = let visitor = new norm_at labels in List.map (Visitor.visitFramacFrom visitor) asgns diff -Nru frama-c-20140301+neon+dfsg/src/wp/normAtLabels.mli frama-c-20150201+sodium+dfsg/src/wp/normAtLabels.mli --- frama-c-20140301+neon+dfsg/src/wp/normAtLabels.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/normAtLabels.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Partitioning.ml frama-c-20150201+sodium+dfsg/src/wp/Partitioning.ml --- frama-c-20140301+neon+dfsg/src/wp/Partitioning.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Partitioning.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,163 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -(* -------------------------------------------------------------------------- *) -(* --- Variables Partitioning --- *) -(* -------------------------------------------------------------------------- *) - -open Qed.Logic -open Lang -open Lang.F - -type partition = { - mutable color : var Vmap.t ; - mutable depend : Vars.t Vmap.t ; - mutable mem : var Tmap.t ; -} - -let zero = Var.dummy -let create () = { - color = Vmap.empty ; - depend = Vmap.empty ; - mem = Tmap.empty ; -} - -(* -------------------------------------------------------------------------- *) -(* --- Current Partition --- *) -(* -------------------------------------------------------------------------- *) - -let rec color w x = - try - let y = Vmap.find x w.color in - let z = color w y in - if z != y then w.color <- Vmap.add x z w.color ; z - with Not_found -> x - -let depend w x = - try Vmap.find (color w x) w.depend - with Not_found -> Vars.empty - -(* -------------------------------------------------------------------------- *) -(* --- Unification & Dependencies --- *) -(* -------------------------------------------------------------------------- *) - -(* keep x, bind y *) -let merge w x y = - w.color <- Vmap.add y x w.color ; - let xs = depend w x in - let ys = depend w y in - let zs = Vars.union xs ys in - w.depend <- Vmap.add x zs (Vmap.remove y w.depend) - -let unify w x y = - if x == zero then y else - if y == zero then x else - let x = color w x in - let y = color w y in - let cmp = Var.compare x y in - if cmp < 0 then (merge w x y ; x) else - if cmp > 0 then (merge w y x ; y) else - x - -let add_depend w x xs = - let x = color w x in - let ys = depend w x in - w.depend <- Vmap.add x (Vars.union xs ys) w.depend - -(* -------------------------------------------------------------------------- *) -(* --- Segregation --- *) -(* -------------------------------------------------------------------------- *) - -let is_varray x = match Var.sort x with Sarray _ -> true | _ -> false - -let color_of w xs c e = - let ms,xs = Vars.partition is_varray (Vars.diff (F.varsp e) xs) in - let c = Vars.fold (unify w) ms c in - let d = Vars.fold (unify w) xs zero in - if c == zero then d else - (if d != zero then add_depend w c (Vars.singleton d) ; c) - -(* -------------------------------------------------------------------------- *) -(* --- Collection --- *) -(* -------------------------------------------------------------------------- *) - -let rec walk w xs p = - match F.pred p with - | Eq(a,b) | Leq(a,b) | Lt(a,b) | Neq(a,b) -> - let ca = color_of w xs zero a in - let cb = color_of w xs zero b in - ignore (unify w ca cb) - | Fun(_,es) -> - ignore - (List.fold_left - (fun c e -> - let ce = color_of w xs zero e in - unify w c ce) - zero es) - | And ps | Or ps -> List.iter (walk w xs) ps - | Not p -> walk w xs p - | Imply(hs,p) -> List.iter (walk w xs) (p::hs) - | Bind(_,x,p) -> walk w (Vars.add x xs) p - | _ -> ignore (color_of w xs zero p) - -let collect w = walk w Vars.empty - -(* -------------------------------------------------------------------------- *) -(* --- Partition --- *) -(* -------------------------------------------------------------------------- *) - -type classeq = partition * Vars.t - -(* dependencies must be normalized *) -let rec closure w x xs = - let x = color w x in - if Vars.mem x xs then xs else - Vars.fold (closure w) (depend w x) (Vars.add x xs) - -let classes w = - w.depend <- Vmap.map (fun _ xs -> Vars.map (color w) xs) w.depend ; - Vars.fold - (fun x cs -> ( w , closure w x Vars.empty ) :: cs) - (Vmap.fold - (fun _ x xs -> Vars.add (color w x) xs) - w.color Vars.empty) - [] - -(* Tautologies: False ==> P and P ==> True for all P *) -(* Requires: filter false p ==> p *) -(* Requires: p ==> filter true p *) -let rec filter w positive xs p = - match F.pred p with - | And ps -> F.p_all (filter w positive xs) ps - | Or ps -> F.p_any (filter w positive xs) ps - | Not p -> F.p_not (filter w (not positive) xs p) - | Imply(hs,p) -> - let hs = List.map (filter w (not positive) xs) hs in - F.p_hyps hs (filter w positive xs p) - | Bind(q,x,p) -> F.p_bind q x (filter w positive (Vars.add x xs) p) - | _ -> - if Vars.exists (fun x -> Vars.mem (color w x) xs) (F.varsp p) - then p - else if positive then p_true else p_false - -let filter_hyp (w,xs) = filter w true xs -let filter_goal (w,xs) = filter w false xs diff -Nru frama-c-20140301+neon+dfsg/src/wp/Partitioning.mli frama-c-20150201+sodium+dfsg/src/wp/Partitioning.mli --- frama-c-20140301+neon+dfsg/src/wp/Partitioning.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Partitioning.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -(* -------------------------------------------------------------------------- *) -(* --- Variables Cleaning --- *) -(* -------------------------------------------------------------------------- *) - -open Cil_types -open Lang -open Lang.F - -type partition -type classeq - -val create : unit -> partition -val collect : partition -> F.pred -> unit -val classes : partition -> classeq list -val filter_hyp : classeq -> F.pred -> F.pred -val filter_goal : classeq -> F.pred -> F.pred - diff -Nru frama-c-20140301+neon+dfsg/src/wp/Passive.ml frama-c-20150201+sodium+dfsg/src/wp/Passive.ml --- frama-c-20140301+neon+dfsg/src/wp/Passive.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Passive.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -57,9 +57,9 @@ List.iter begin function | B1(x,p) -> - Format.fprintf fmt "@ @[([%a] %a)@]" - F.pp_var x F.pp_pred p + Format.fprintf fmt "@ @[([%a] %a)@]" + F.pp_var x F.pp_pred p | B2(x,y,p) -> - Format.fprintf fmt "@ @[([%a,%a] %a)@]" - F.pp_var x F.pp_var y F.pp_pred p + Format.fprintf fmt "@ @[([%a,%a] %a)@]" + F.pp_var x F.pp_var y F.pp_pred p end diff -Nru frama-c-20140301+neon+dfsg/src/wp/Passive.mli frama-c-20150201+sodium+dfsg/src/wp/Passive.mli --- frama-c-20140301+neon+dfsg/src/wp/Passive.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Passive.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/proof.ml frama-c-20150201+sodium+dfsg/src/wp/proof.ml --- frama-c-20140301+neon+dfsg/src/wp/proof.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/proof.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -25,7 +25,7 @@ (* -------------------------------------------------------------------------- *) let scriptbase : (string, string list * string) Hashtbl.t = Hashtbl.create 81 - (* [ goal name -> sorted hints , script ] *) +(* [ goal name -> sorted hints , script ] *) 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 *) @@ -49,11 +49,11 @@ | _ -> raise Exit done ; true with Exit -> false - + let register_script goal hints proof = let hints = List.sort String.compare (List.filter sanitize hints) in Hashtbl.replace scriptbase goal (hints,proof) - + let delete_script goal = Hashtbl.remove scriptbase goal @@ -75,9 +75,9 @@ try let rec fetch_proof input = match token input with - | Proof p -> Some p - | Eof -> None - | _ -> skip input ; fetch_proof input + | Proof p -> Some p + | Eof -> None + | _ -> skip input ; fetch_proof input in let proof = fetch_proof input in Script.close input ; proof @@ -91,14 +91,14 @@ eat input "." ; let xs = if key input "Hint" then - let xs = idents input in - eat input "." ; xs + let xs = idents input in + eat input "." ; xs else [] in let p = match token input with - | Proof p -> skip input ; p - | _ -> error input "Missing proof" + | Proof p -> skip input ; p + | _ -> error input "Missing proof" in register_script g xs p done ; @@ -110,7 +110,7 @@ begin let input = Script.open_file file in try - collect_scripts input ; + collect_scripts input ; Script.close input ; with e -> Script.close input ; @@ -125,14 +125,14 @@ let goals = Hashtbl.fold (fun goal _ gs -> goal::gs) scriptbase [] in List.iter (fun goal -> - let (hints,proof) = Hashtbl.find scriptbase goal in - Format.fprintf fmt "Goal %s.@\n" goal ; + let (hints,proof) = 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"); + | [] -> () + | 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%sQed.@\n@." proof ) (List.sort String.compare goals) ; Format.pp_print_newline fmt () ; @@ -153,29 +153,29 @@ 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" + | 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 @@ -190,27 +190,27 @@ (Printexc.to_string e) end ; if Wp_parameters.UpdateScript.get () then - if user = "" then - (* update new file *) - begin - let ftmp = choose 0 in + 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 + 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 + (* do not update *) + begin + scriptfile := Some user ; + needback := false ; + end end let find_script_for_goal goal = @@ -224,31 +224,31 @@ let new_hints = List.sort String.compare hints in if Pervasives.compare new_hints old_hints <> 0 then begin - Hashtbl.replace scriptbase goal (new_hints,script) ; - needsave := true ; + Hashtbl.replace scriptbase goal (new_hints,script) ; + 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 + | 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 - + | [] , _ -> 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 = @@ -258,12 +258,12 @@ List.sort most_suitable begin Hashtbl.fold - (fun g (xs,p) scripts -> - try - let n = matches 0 hints (filter required xs) in - (n,g,p)::scripts - with Not_found -> scripts) - scriptbase [] + (fun g (xs,p) scripts -> + try + let n = matches 0 hints (filter required xs) in + (n,g,p)::scripts + with Not_found -> scripts) + scriptbase [] end let add_script goal hints proof = @@ -275,16 +275,16 @@ let script_for ~pid ~gid = match find_script_for_goal gid with - | None -> None - | (Some _) as script -> - let required,hints = WpPropId.prop_id_keys pid in - let all = List.merge String.compare required hints in - update_hints_for_goal gid all ; - script - + | None -> None + | (Some _) as script -> + let required,hints = WpPropId.prop_id_keys pid in + let all = List.merge String.compare required hints in + update_hints_for_goal gid all ; + script + let rec head n = function [] -> [] - | x::xs -> if n > 0 then x :: head (pred n) xs else [] - + | 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" -> [] @@ -298,28 +298,28 @@ default @ List.map (fun (_,_,s) -> "Hint",s) (head nhints scripts) else default else default - + let script_for_ide ~pid ~gid = match find_script_for_goal gid with - | Some script -> script - | None -> - let required,hints = WpPropId.prop_id_keys pid in - let scripts = find_script_with_hints required hints in - if scripts = [] then - begin - match Wp_parameters.CoqTactic.get () with - | "none" -> "" - | tactic -> Pretty_utils.sfprintf "(* %s. *)\n" tactic - end - else - begin - let nhints = Wp_parameters.Hints.get () in - Pretty_utils.sfprintf "%t" - (fun fmt -> - List.iter - (fun (_,g,script) -> - Format.fprintf fmt - "(*@ --------------------------------------\n \ - @ From '%s': \n%s*)\n%!" g script - ) (head nhints scripts)) - end + | Some script -> script + | None -> + let required,hints = WpPropId.prop_id_keys pid in + let scripts = find_script_with_hints required hints in + if scripts = [] then + begin + match Wp_parameters.CoqTactic.get () with + | "none" -> "" + | tactic -> Pretty_utils.sfprintf "(* %s. *)\n" tactic + end + else + begin + let nhints = Wp_parameters.Hints.get () in + Pretty_utils.sfprintf "%t" + (fun fmt -> + List.iter + (fun (_,g,script) -> + Format.fprintf fmt + "(*@ --------------------------------------\n \ + @ From '%s': \n%s*)\n%!" g script + ) (head nhints scripts)) + end diff -Nru frama-c-20140301+neon+dfsg/src/wp/proof.mli frama-c-20150201+sodium+dfsg/src/wp/proof.mli --- frama-c-20140301+neon+dfsg/src/wp/proof.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/proof.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -28,44 +28,44 @@ val delete_script : string -> unit val add_script : string -> string list -> string -> unit - (** [new_script goal keys proof] registers the script [proof] for goal [goal] - and keywords [keys] *) +(** [new_script goal keys proof] registers the script [proof] for goal [goal] + and keywords [keys] *) val find_script_for_goal : string -> string option - (** Retrieve script file for one specific goal. - The file specified by [-wp-script f] is loaded if necessary. *) +(** Retrieve script file for one specific goal. + The file specified by [-wp-script f] is loaded if necessary. *) val update_hints_for_goal : string -> string list -> unit - (** Update the hints for one specific goal. The script file will be saved if hints - are different. *) +(** Update the hints for one specific goal. The script file will be saved if hints + are different. *) val find_script_with_hints : string list -> string list -> (int * string * string) list - (** Retrieve matchable script files for w.r.t provided required and hints keywords. - Most suitable scripts comes first, with format [(n,g,p)] where [p] is a script - matching [n] hints from possibly deprecated goal [g]. *) +(** Retrieve matchable script files for w.r.t provided required and hints keywords. + Most suitable scripts comes first, with format [(n,g,p)] where [p] is a script + matching [n] hints from possibly deprecated goal [g]. *) val clear : unit -> unit val loadscripts : unit -> unit - (** Load scripts from [-wp-script f]. Automatically invoked by [find_xxx] unless - [loadscripts] flags is unset. *) +(** Load scripts from [-wp-script f]. Automatically invoked by [find_xxx] unless + [loadscripts] flags is unset. *) val savescripts : unit -> unit - (** If necessary, dump the scripts database into the file - specified by [-wp-script f]. *) +(** If necessary, dump the scripts database into the file + specified by [-wp-script f]. *) (** {2 Low-level Parsers and Printers} *) val is_empty : string -> bool val parse_coqproof : string -> string option - (** [parse_coqproof f] parses a coq-file [f] and fetch the first proof. *) +(** [parse_coqproof f] parses a coq-file [f] and fetch the first proof. *) val parse_scripts : string -> unit - (** [parse_scripts f] parses all scripts from file [f] and put them in the database. *) +(** [parse_scripts f] parses all scripts from file [f] and put them in the database. *) val dump_scripts : string -> unit - (** [dump_scripts f] saves all scripts from the database into file [f]. *) +(** [dump_scripts f] saves all scripts from the database into file [f]. *) (* -------------------------------------------------------------------------- *) (** Proof Script Interaction *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/ProverCoq.ml frama-c-20150201+sodium+dfsg/src/wp/ProverCoq.ml --- frama-c-20140301+neon+dfsg/src/wp/ProverCoq.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/ProverCoq.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -42,8 +42,8 @@ (* 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" + (fun ~driver_dir x -> driver_dir ^ "/" ^ x) + "coq" "file" type coqlib = { c_id : string ; (* Identifies the very original file. *) @@ -74,14 +74,14 @@ let name = String.copy path in for i = 0 to String.length name - 1 do if name.[i] = '/' then name.[i] <- '.' - else if name.[i] = '\\' then name.[i] <- '.' + else if name.[i] = '\\' then name.[i] <- '.' done ; name end 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 + opt.[1] = ':' && (opt.[2] = '/' || opt.[2] = '\\') && p = 1 then (* windows absolute path, not :

/ format. *) raise Not_found else p @@ -125,31 +125,31 @@ let engine = let module E = Qed.Export_coq.Make(Lang.F) in -object - inherit E.engine - inherit Lang.idprinting + object + inherit E.engine + inherit Lang.idprinting - method infoprover p = p.coq -end + method infoprover p = p.coq + end class visitor fmt c = -object(self) - - inherit Definitions.visitor c - inherit ProverTask.printer fmt (cluster_title c) + object(self) + + inherit Definitions.visitor c + inherit ProverTask.printer fmt (cluster_title c) val mutable deps : depend list = [] - (* --- Managing Formatter --- *) + (* --- Managing Formatter --- *) - method flush = - begin - Format.pp_print_newline fmt () ; - List.rev deps - end + method flush = + begin + Format.pp_print_newline fmt () ; + List.rev deps + end - (* --- Files, Theories and Clusters --- *) + (* --- Files, Theories and Clusters --- *) method add_coqfile opt = let clib = c_option opt in @@ -159,58 +159,58 @@ 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_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.atype lt) (List.length lt.lt_params) def ; - end - method on_comp c fts = - begin - self#paragraph ; - engine#declare_type fmt (Lang.comp c) 0 (Qed.Engine.Trec fts) ; - end + method on_type lt def = + begin + self#lines ; + engine#declare_type fmt (Lang.atype lt) (List.length lt.lt_params) def ; + end - 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_comp c fts = + begin + self#paragraph ; + engine#declare_type fmt (Lang.comp c) 0 (Qed.Engine.Trec fts) ; + 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 ; - | Value(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 _ -> - engine#declare_signature fmt - d.d_lfun (List.map F.tau_of_var d.d_params) Logic.Prop - end + 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 -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 ; + | Value(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 _ -> + engine#declare_signature fmt + d.d_lfun (List.map F.tau_of_var d.d_params) Logic.Prop + end + + end let write_cluster c = let f = cluster_file c in @@ -237,17 +237,17 @@ 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 = Model.Index - (struct - type key = cluster - type data = int * depend list - let name = "ProverCoq.FILES" - let compare = cluster_compare - let pretty = pp_cluster - end) + (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 @@ -301,21 +301,19 @@ 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 + 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 c.c_file in let dir = Printf.sprintf "%s/%s" tgtdir c.c_path in - Format.printf "tgtdir:%s@\nsource:%s@\ntarget:%s@\ndir:%s@." - tgtdir source target dir; if need_recompile ~source ~target then begin Wp_parameters.make_output_dir dir ; - Command.copy source target ; + Command.copy source target ; end ; add_include coqcc (dir,c.c_name) ; - add_source coqcc target; + add_source coqcc target; end (* -------------------------------------------------------------------------- *) @@ -329,27 +327,27 @@ let file = Printf.sprintf "%s/%s.coq" model 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" ; + 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 "@[Goal@ %a.@]@." - engine#pp_prop (F.e_prop prop) ; - end ; - v#flush - end in + v#hline ; + end ; + v#paragraph ; + engine#global + begin fun () -> + v#printf "@[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 , "") :: List.rev coqcc.includes in @@ -369,68 +367,68 @@ max coqtimeout gentimeout let coqidelock = Task.mutex () - + class runcoq includes source = let base = Filename.chop_extension source in let logout = base ^ "_Coq.out" in let logerr = base ^ "_Coq.err" in -object(coq) - - inherit ProverTask.command "coq" - - initializer - begin + object(coq) + + inherit ProverTask.command "coq" + + initializer + begin List.iter (fun (dir,name) -> coq#add ["-I";dir] ; if name <> "" then coq#add ["-as";name] ) includes ; - coq#add [ "-noglob" ] ; - end + coq#add [ "-noglob" ] ; + end - - method failed : 'a. 'a task = - begin - let name = Filename.basename source in - Wp_parameters.feedback "[Coq] '%s' compilation failed." name ; - if Sys.file_exists logout then - Log.print_on_output (fun fmt -> Command.pp_from_file fmt logout) ; - if Sys.file_exists logerr then - Log.print_on_output (fun fmt -> Command.pp_from_file fmt logerr) ; - Task.failed "Compilation of '%s' failed." name ; - end - - method compile = - coq#set_command "coqc" ; - coq#add [ source ] ; - coq#timeout (coq_timeout ()) ; - Task.call - (fun () -> - if not (Wp_parameters.Check.get ()) then - let name = Filename.basename source in - Wp_parameters.feedback "[Coq] Compiling '%s'." name) () - >>= coq#run ~logout ~logerr - >>= fun r -> + + method failed : 'a. 'a task = + begin + let name = Filename.basename source in + Wp_parameters.feedback "[Coq] '%s' compilation failed." name ; + if Sys.file_exists logout then + Log.print_on_output (fun fmt -> Command.pp_from_file fmt logout) ; + if Sys.file_exists logerr then + Log.print_on_output (fun fmt -> Command.pp_from_file fmt logerr) ; + Task.failed "Compilation of '%s' failed." name ; + end + + method compile = + coq#set_command "coqc" ; + coq#add [ source ] ; + coq#timeout (coq_timeout ()) ; + Task.call + (fun () -> + if not (Wp_parameters.Check.get ()) then + let name = Filename.basename source in + Wp_parameters.feedback "[Coq] Compiling '%s'." name) () + >>= coq#run ~logout ~logerr + >>= fun r -> if r <> 0 then coq#failed else Task.return () - method check = - coq#set_command "coqc" ; - coq#add [ source ] ; - coq#timeout (coq_timeout ()) ; - coq#run ~logout ~logerr () >>= function + method check = + coq#set_command "coqc" ; + coq#add [ source ] ; + coq#timeout (coq_timeout ()) ; + coq#run ~logout ~logerr () >>= function | 0 -> Task.return true | 1 -> Task.return false | _ -> coq#failed method coqide = - coq#set_command "coqide" ; - coq#add [ source ] ; - let script = Wp_parameters.Script.get () in - if Sys.file_exists script then coq#add [ script ] ; - Task.sync coqidelock (coq#run ~logout ~logerr) + coq#set_command "coqide" ; + coq#add [ source ] ; + let script = Wp_parameters.Script.get () in + if Sys.file_exists script then coq#add [ script ] ; + Task.sync coqidelock (coq#run ~logout ~logerr) -end + end (* -------------------------------------------------------------------------- *) (* --- Compilation Helpers --- *) @@ -444,13 +442,13 @@ 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) ; + shared_demon := false ; + let server = ProverTask.server () in + Task.on_server_stop server (fun () -> Hashtbl.clear shared_headers) ; end ; let descr = Printf.sprintf "Coqc '%s'" source in let shared = Task.shared ~descr ~retry:true - (fun () -> (new runcoq includes source)#compile) + (fun () -> (new runcoq includes source)#compile) in Hashtbl.add shared_headers source shared ; shared let rec compile_headers includes forced = function @@ -458,10 +456,10 @@ | 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 + begin + let cc = shared includes source in + Task.share cc >>= fun () -> compile_headers includes true headers + end else compile_headers includes forced headers (* -------------------------------------------------------------------------- *) @@ -498,53 +496,53 @@ | (kind,script) :: hints -> Wp_parameters.feedback "[Coq] Goal %s : %s" w.cw_gid kind ; try_script w script >>= 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 w.cw_gid keys script ; - Task.return true - else - try_hints w hints - + 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 w.cw_gid keys script ; + 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 with - | Some script -> - Wp_parameters.feedback "[Coq] Goal %s : Saved script" w.cw_gid ; - try_script w script - | None -> Task.return false + | Some script -> + Wp_parameters.feedback "[Coq] Goal %s : Saved script" w.cw_gid ; + try_script w script + | None -> Task.return false end >>= fun succeed -> - if succeed then - Task.return true - else - try_hints w (Proof.hints_for ~pid:w.cw_pid) + if succeed then + Task.return true + else + try_hints w (Proof.hints_for ~pid:w.cw_pid) let try_coqide w = let script = Proof.script_for_ide ~pid:w.cw_pid ~gid:w.cw_gid in make_script w script ; (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 -> - if Proof.is_empty script then - begin - Proof.delete_script 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 w.cw_gid hints script ; - Wp_parameters.feedback "[Coq] Goal %s : Script" w.cw_gid ; - try_script w script - end - else - Task.failed "[Coq] coqide exit with status %d" 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 -> + if Proof.is_empty script then + begin + Proof.delete_script 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 w.cw_gid hints script ; + Wp_parameters.feedback "[Coq] Goal %s : Script" w.cw_gid ; + try_script w script + end + else + Task.failed "[Coq] coqide exit with status %d" st let prove_session ~mode w = begin @@ -556,8 +554,8 @@ | FixMode -> begin try_prove w >>> function - | Task.Result true -> Task.return true - | Task.Failed e -> Task.raised e + | Task.Result true -> Task.return true + | Task.Failed e -> Task.raised e | Task.Canceled | Task.Timeout | Task.Result false -> try_coqide w end end @@ -568,10 +566,10 @@ let check_session w = compile_headers w.cw_includes false w.cw_headers >>= - (fun () -> try_script ~admitted:true w "") >>> function - | Task.Result true -> Task.return VCS.unknown - | Task.Failed e -> Task.raised e - | Task.Canceled | Task.Timeout | Task.Result false -> + (fun () -> try_script ~admitted:true w "") >>> function + | Task.Result true -> Task.return VCS.unknown + | Task.Failed e -> Task.raised e + | Task.Canceled | Task.Timeout | Task.Result false -> Task.raised Admitted_not_proved let prove_session ~mode w = @@ -586,25 +584,26 @@ let script = DISK.file_goal ~pid ~model ~prover:Coq in let includes , headers , goal = Model.with_model model (assemble_goal ~pid axioms) prop - in + in + Wp_parameters.print_generated script; if Wp_parameters.Generate.get () then Task.return VCS.no_result else prove_session ~mode { - cw_pid = pid ; - cw_gid = gid ; - cw_goal = goal ; - cw_script = script ; - cw_headers = headers ; - cw_includes = includes ; - } - + cw_pid = pid ; + cw_gid = gid ; + cw_goal = goal ; + cw_script = script ; + cw_headers = headers ; + cw_includes = includes ; + } + let prove_annot wpo vcq ~mode = Task.todo begin fun () -> let prop = GOAL.compute_proof vcq.VC_Annot.goal in prove_prop wpo ~mode ~axioms:None ~prop end - + let prove_lemma wpo vca ~mode = Task.todo begin fun () -> @@ -614,7 +613,7 @@ let axioms = Some(lemma.l_cluster,depends) in prove_prop wpo ~mode ~axioms ~prop end - + let prove_check wpo vck ~mode = Task.todo begin fun () -> @@ -625,6 +624,6 @@ let prove mode wpo = match wpo.Wpo.po_formula with - | GoalAnnot vcq -> prove_annot wpo vcq ~mode - | GoalLemma vca -> prove_lemma wpo vca ~mode - | GoalCheck vck -> prove_check wpo vck ~mode + | GoalAnnot vcq -> prove_annot wpo vcq ~mode + | GoalLemma vca -> prove_lemma wpo vca ~mode + | GoalCheck vck -> prove_check wpo vck ~mode diff -Nru frama-c-20140301+neon+dfsg/src/wp/ProverCoq.mli frama-c-20150201+sodium+dfsg/src/wp/ProverCoq.mli --- frama-c-20140301+neon+dfsg/src/wp/ProverCoq.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/ProverCoq.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/ProverErgo.ml frama-c-20150201+sodium+dfsg/src/wp/ProverErgo.ml --- frama-c-20140301+neon+dfsg/src/wp/ProverErgo.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/ProverErgo.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -32,8 +32,8 @@ let dkey = Wp_parameters.register_category "prover" let option_file = LogicBuiltins.create_option - (fun ~driver_dir x -> Filename.concat driver_dir x) - "altergo" "file" + (fun ~driver_dir x -> Filename.concat driver_dir x) + "altergo" "file" (* -------------------------------------------------------------------------- *) (* --- Making Goal File --- *) @@ -44,8 +44,8 @@ begin let x = Command.command "altgr-ergo" [| "-version" |] in match x with - | Unix.WEXITED 0 -> true - | _ -> Wp_parameters.error ~current:false "Command 'altgr-ergo' does not work." ; false + | Unix.WEXITED 0 -> true + | _ -> Wp_parameters.error ~current:false "Command 'altgr-ergo' does not work." ; false end let append_file out file = @@ -60,10 +60,10 @@ 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) + | [] -> 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 = Model.directory () in @@ -73,7 +73,7 @@ (* -------------------------------------------------------------------------- *) (* --- Exporting Formulae to Alt-Ergo --- *) (* -------------------------------------------------------------------------- *) - + type depend = | D_file of string | D_cluster of cluster @@ -81,125 +81,125 @@ 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 + Definitions.pp_cluster cluster module TYPES = Model.Index - (struct - type key = adt - type data = tau - let name = "ProverErgo.TYPES" - let compare = ADT.compare - let pretty = ADT.pretty - end) + (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) in -object - inherit E.engine as super - inherit Lang.idprinting - - method infoprover p = p.altergo - method set_typedef = TYPES.define - method get_typedef = TYPES.get - method! typeof_call = Lang.tau_of_lfun - method! typeof_getfield = Lang.tau_of_field - method! typeof_setfield = Lang.tau_of_record - val mutable share = true - method! is_shareable e = share && super#is_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 -end + object + inherit E.engine as super + inherit Lang.idprinting + + method infoprover p = p.altergo + method set_typedef = TYPES.define + method get_typedef = TYPES.get + method! typeof_call = Lang.tau_of_lfun + method! typeof_getfield = Lang.tau_of_field + method! typeof_setfield = Lang.tau_of_record + val mutable share = true + method! is_shareable e = share && super#is_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 + end class visitor fmt c = -object(self) - - inherit Definitions.visitor c - inherit ProverTask.printer fmt (cluster_title c) + object(self) - val mutable deps = [] + inherit Definitions.visitor c + inherit ProverTask.printer fmt (cluster_title c) - (* --- Managing Formatter --- *) + val mutable deps = [] - method flush = - begin - Format.pp_print_newline fmt () ; - List.rev deps - end + (* --- Managing Formatter --- *) - (* --- Files, Theories and Clusters --- *) + method flush = + begin + Format.pp_print_newline fmt () ; + List.rev deps + end - 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.file ~error:true f) - 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) + (* --- Files, Theories and Clusters --- *) - method on_type lt def = - begin - self#lines ; - engine#declare_type fmt (Lang.atype lt) (List.length lt.lt_params) def ; - end + method add_dfile f = + let df = D_file f in + if not (List.mem df deps) then deps <- df :: deps - method on_comp c fts = - begin - self#lines ; - engine#declare_type fmt (Lang.comp c) 0 (Qed.Engine.Trec fts) ; - end + method add_shared f = self#add_dfile (Wp_parameters.Share.file ~error:true f) + method add_library f = self#add_dfile f - 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_cluster c = deps <- (D_cluster c) :: deps - 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 ; - | Value(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 _ -> - engine#declare_signature fmt - d.d_lfun (List.map F.tau_of_var d.d_params) Logic.Prop - end + 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.atype lt) (List.length lt.lt_params) def ; + end -end + method on_comp c fts = + begin + self#lines ; + engine#declare_type fmt (Lang.comp c) 0 (Qed.Engine.Trec fts) ; + end + + 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 ; + | Value(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 _ -> + engine#declare_signature fmt + d.d_lfun (List.map F.tau_of_var d.d_params) Logic.Prop + 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 - job v ; v#flush - end + begin fun fmt -> + let v = new visitor fmt c in + job v ; v#flush + end in if Wp_parameters.has_dkey "cluster" then Log.print_on_output begin fun fmt -> - Format.fprintf fmt "---------------------------------------------@\n" ; - Format.fprintf fmt "--- File '%s.ergo' @\n" (cluster_id c) ; - Format.fprintf fmt "---------------------------------------------@\n" ; - Command.pp_from_file fmt f ; + Format.fprintf fmt "---------------------------------------------@\n" ; + Format.fprintf fmt "--- File '%s.ergo' @\n" (cluster_id c) ; + Format.fprintf fmt "---------------------------------------------@\n" ; + Command.pp_from_file fmt f ; end ; output @@ -208,13 +208,13 @@ (* -------------------------------------------------------------------------- *) module CLUSTERS = Model.Index - (struct - type key = cluster - type data = int * depend list - let name = "ProverErgo.CLUSTERS" - let compare = cluster_compare - let pretty = pp_cluster - end) + (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 ; @@ -230,7 +230,7 @@ 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 = @@ -252,26 +252,24 @@ let assemble_goal ~file ~id ~title ~axioms prop = let goal = cluster ~id ~title () in - let model = if Wp_parameters.ProofTrace.get () then 1 else 0 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#global - begin fun () -> - v#printf "@[goal %s:@ %a@]@." id - (engine#pp_goal ~model) - (F.e_prop prop) ; - end ; - engine#set_quantify_let false ; - with error -> - engine#set_quantify_let false ; - raise error - end in + 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#global + begin fun () -> + v#printf "@[goal %s:@ %a@]@." id + engine#pp_goal (F.e_prop prop) ; + end ; + engine#set_quantify_let false ; + with error -> + engine#set_quantify_let false ; + raise error + end in Command.write_file file begin fun out -> let export = { files = [] ; out = out } in @@ -302,107 +300,106 @@ let re_unsat = Str.regexp p_unsat class altergo ~pid ~gui ~file ~lines ~logout ~logerr = -object(ergo) - - initializer ignore pid - - inherit ProverTask.command "alt-ergo" - - val mutable files = [] - val mutable error = None - val mutable valid = false - val mutable limit = false - val mutable unsat = false - val mutable time = 0.0 - val mutable steps = 0 - - method private time t = time <- 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 ; - time <- a#get_float 3 ; - steps <- a#get_int 4 ; - end + object(ergo) - method private limit (a : pattern) = - begin - limit <- true ; - steps <- pred (a#get_int 1) ; - end + initializer ignore pid - method private unsat (_ : pattern) = - begin - unsat <- true ; - end + inherit ProverTask.command "alt-ergo" + + val mutable files = [] + val mutable error = None + val mutable valid = false + val mutable limit = false + val mutable unsat = false + val mutable time = 0.0 + val mutable steps = 0 + + method private time t = time <- 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 ; + time <- a#get_float 3 ; + steps <- a#get_int 4 ; + end - method result r = - match error with + 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 = + match error with | Some(pos,message) -> - Wp_parameters.error ~source:pos "Alt-Ergo error:@\n%s" message ; - VCS.failed ~pos message + Wp_parameters.error ~source:pos "Alt-Ergo error:@\n%s" message ; + VCS.failed ~pos message | None -> - 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 time) ~steps verdict - with + 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 time) ~steps verdict + with | Not_found when Wp_parameters.Check.get () -> - if r = 0 then VCS.no_result - else + if r = 0 then VCS.no_result + else + begin + ProverTask.pp_file ~message:"Alt-Ergo (stdout)" ~file:logout ; + ProverTask.pp_file ~message:"Alt-Ergo (stderr)" ~file:logerr ; + VCS.failed "Alt-Ergo type-checking failed" + end + | Not_found -> begin - ProverTask.pp_file ~message:"Alt-Ergo (stdout)" ~file:logout ; - ProverTask.pp_file ~message:"Alt-Ergo (stderr)" ~file:logerr ; - VCS.failed "Alt-Ergo type-checking failed" + ProverTask.pp_file ~message:"Alt-Ergo (stdout)" ~file:logout ; + ProverTask.pp_file ~message:"Alt-Ergo (stderr)" ~file:logerr ; + if r <> 0 then + VCS.failed (Printf.sprintf "Alt-Ergo exits with status [%d]" r) + else + VCS.failed "Can not understand Alt-Ergo output." end - | Not_found -> - begin - ProverTask.pp_file ~message:"Alt-Ergo (stdout)" ~file:logout ; - ProverTask.pp_file ~message:"Alt-Ergo (stderr)" ~file:logerr ; - if r <> 0 then - VCS.failed (Printf.sprintf "Alt-Ergo exits with status [%d]" r) - else - VCS.failed "Can not understand Alt-Ergo output." - end - - method prove = - let depth = Wp_parameters.Depth.get () in - let steps = Wp_parameters.Steps.get () in - let time = Wp_parameters.Timeout.get () in - files <- lines ; - if gui then ergo#set_command "altgr-ergo" ; - if Wp_parameters.Check.get () then - ergo#add ["-type-only"] - else - begin - ergo#add_positive ~name:"-age-bound" ~value:depth ; - ergo#add_positive ~name:"-stop-bound" ~value:depth ; - ergo#add_positive ~name:"-steps-bound" ~value:steps ; - ergo#add_parameter ~name:"-proof" Wp_parameters.ProofTrace.get ; - ergo#add_parameter ~name:"-model" Wp_parameters.ProofTrace.get ; - end ; - let flags = List.filter - (fun p -> p <> "qlet") - (Wp_parameters.AltErgoFlags.get ()) in - ergo#add flags ; - ergo#add [ file ] ; - if not gui then ergo#timeout time ; - 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 + + method prove = + let depth = Wp_parameters.Depth.get () in + let steps = Wp_parameters.Steps.get () in + let time = Wp_parameters.Timeout.get () in + files <- lines ; + if gui then ergo#set_command "altgr-ergo" ; + if Wp_parameters.Check.get () then + ergo#add ["-type-only"] + else + begin + ergo#add_positive ~name:"-age-bound" ~value:depth ; + ergo#add_positive ~name:"-steps-bound" ~value:steps ; + ergo#add_parameter ~name:"-proof" Wp_parameters.ProofTrace.get ; + ergo#add_parameter ~name:"-model" Wp_parameters.ProofTrace.get ; + end ; + let flags = List.filter + (fun p -> p <> "qlet") + (Wp_parameters.AltErgoFlags.get ()) in + ergo#add flags ; + ergo#add [ file ] ; + if not gui then ergo#timeout time ; + 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 @@ -411,20 +408,20 @@ let try_prove ~pid ~gui ~file ~lines ~logout ~logerr = let ergo = new altergo ~pid ~gui ~file ~lines ~logout ~logerr in ergo#prove () >>> function - | Task.Timeout -> Task.return VCS.timeout - | Task.Result r -> Task.call ergo#result r - | st -> Task.status (Task.map (fun _ -> assert false) st) + | Task.Timeout -> Task.return VCS.timeout + | Task.Result r -> Task.call ergo#result r + | st -> Task.status (Task.map (fun _ -> assert false) st) let prove_file ~pid ~mode ~file ~lines ~logout ~logerr = let gui = match mode with | EditMode -> Lazy.force altergo_gui | BatchMode | FixMode -> false in try_prove ~pid ~gui ~file ~lines ~logout ~logerr >>= function - | { verdict=(VCS.Unknown|VCS.Timeout|VCS.Stepout) } + | { verdict=(VCS.Unknown|VCS.Timeout|VCS.Stepout) } when mode = FixMode && Lazy.force altergo_gui -> - try_prove ~pid ~gui:true ~file ~lines ~logout ~logerr - | r -> Task.return r - + try_prove ~pid ~gui:true ~file ~lines ~logout ~logerr + | r -> Task.return r + let prove_prop ~pid ~mode ~model ~axioms ~prop = let prover = AltErgo in let file = DISK.file_goal ~pid ~model ~prover in @@ -432,8 +429,9 @@ 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 = Model.with_model model - (assemble_goal ~file ~id ~title ~axioms) prop in + let lines = Model.with_model model + (assemble_goal ~file ~id ~title ~axioms) prop in + Wp_parameters.print_generated file; if Wp_parameters.Generate.get () then Task.return VCS.no_result else prove_file ~pid ~mode ~file ~lines ~logout ~logerr @@ -468,7 +466,7 @@ let pid = wpo.Wpo.po_pid in let model = wpo.Wpo.po_model in match wpo.Wpo.po_formula with - | Wpo.GoalAnnot vcq -> prove_annot model pid vcq ~mode - | Wpo.GoalLemma vca -> prove_lemma model pid vca ~mode - | Wpo.GoalCheck vck -> prove_check model pid vck ~mode + | Wpo.GoalAnnot vcq -> prove_annot model pid vcq ~mode + | Wpo.GoalLemma vca -> prove_lemma model pid vca ~mode + | Wpo.GoalCheck vck -> prove_check model pid vck ~mode diff -Nru frama-c-20140301+neon+dfsg/src/wp/ProverErgo.mli frama-c-20150201+sodium+dfsg/src/wp/ProverErgo.mli --- frama-c-20140301+neon+dfsg/src/wp/ProverErgo.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/ProverErgo.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/prover.ml frama-c-20150201+sodium+dfsg/src/wp/prover.ml --- frama-c-20140301+neon+dfsg/src/wp/prover.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/prover.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -32,72 +32,76 @@ let dispatch wpo mode prover = begin match prover with - | AltErgo -> ProverErgo.prove mode wpo - | Coq -> ProverCoq.prove mode wpo - | Why3 prover -> ProverWhy3.prove ~prover wpo - | Qed -> Task.return VCS.unknown - | _ -> Task.failed "Prover '%a' not available" VCS.pp_prover prover + | AltErgo -> ProverErgo.prove mode wpo + | Coq -> ProverCoq.prove mode wpo + | Why3 prover -> ProverWhy3.prove ~prover wpo + | Qed -> Task.return VCS.unknown + | _ -> Task.failed "Prover '%a' not available" VCS.pp_prover prover end let qed_time wpo = match wpo.po_formula with - | GoalCheck _ | GoalLemma _ -> 0.0 - | GoalAnnot vcq -> GOAL.qed_time vcq.VC_Annot.goal + | GoalCheck _ | GoalLemma _ -> 0.0 + | GoalAnnot vcq -> GOAL.qed_time vcq.VC_Annot.goal let signal ?callin wpo prover = match callin with - | None -> () - | Some f -> f wpo prover + | None -> () + | Some f -> f wpo prover let update ?callback wpo prover result = Wpo.set_result wpo prover result ; match callback with - | None -> () - | Some f -> f wpo prover result + | None -> () + | Some f -> f wpo prover result let run_prover wpo ?(mode=BatchMode) ?callback prover = dispatch wpo mode prover >>> - fun status -> - let result = match status with - | Task.Result r -> r - | Task.Canceled -> VCS.no_result - | Task.Timeout -> VCS.timeout - | Task.Failed exn -> VCS.failed (error exn) - in - let result = { result with solver_time = qed_time wpo } in - update ?callback wpo prover result ; - Task.return (Wpo.is_valid result) + fun status -> + let result = match status with + | Task.Result r -> r + | Task.Canceled -> VCS.no_result + | Task.Timeout -> VCS.timeout + | Task.Failed exn -> VCS.failed (error exn) + in + let result = { result with solver_time = qed_time wpo } in + update ?callback wpo prover result ; + Task.return (Wpo.is_valid result) let resolve wpo = match wpo.po_formula with - | GoalAnnot vcq -> VC_Annot.resolve vcq - | GoalLemma vca -> VC_Lemma.is_trivial vca - | GoalCheck _ -> false + | GoalAnnot vcq -> VC_Annot.resolve vcq + | GoalLemma vca -> VC_Lemma.is_trivial vca + | GoalCheck _ -> false let simplify ?callin ?callback wpo prover = Task.call (fun wpo -> - signal ?callin wpo prover ; - if resolve wpo then - let time = qed_time wpo in - let result = VCS.result ~time VCS.Valid in - (update ?callback wpo VCS.Qed result ; true) - else false) + let r = Wpo.get_result wpo VCS.Qed in + VCS.( r.verdict == Valid ) || + begin + signal ?callin wpo prover ; + if resolve wpo then + let time = qed_time wpo in + let result = VCS.result ~time VCS.Valid in + (update ?callback wpo VCS.Qed result ; true) + else false + end) wpo let prove wpo ?mode ?callin ?callback prover = simplify ?callin ?callback wpo prover >>= fun succeed -> - if succeed - then Task.return true - else (run_prover wpo ?mode ?callback prover) - + if succeed + then Task.return true + else (run_prover wpo ?mode ?callback prover) + let spawn wpo ?callin ?callback provers = ProverTask.spawn begin List.map - (fun (mode,prover) -> - prove wpo ~mode ?callin ?callback prover) - provers + (fun (mode,prover) -> + prove wpo ~mode ?callin ?callback prover) + provers end (* ------------------------------------------------------------------------ *) @@ -116,29 +120,29 @@ let module HStr = String.Hashtbl in let session = read_session filename_session in Wpo.S.Hashtbl.iter (fun wpo g -> - match g with - | None -> (* proved by QED *) - let time = qed_time wpo in - let result = VCS.result ~time VCS.Valid in - update ?callback wpo VCS.Qed result; - update ?callback wpo VCS.Why3ide (VCS.result VCS.NoResult) - | Some g -> - try - let filename = Sysutil.relativize_filename filename_session g.gfile in - let file = HStr.find session.session_files filename in - let theory = HStr.find file.file_theories g.gtheory in - let goal = HStr.find theory.theory_goals g.ggoal in - let result = VCS.result - (if goal.goal_verified then VCS.Valid else VCS.NoResult) in - update ?callback wpo VCS.Why3ide result - with Not_found -> - if Wp_parameters.has_dkey "prover" then - Wp_parameters.feedback - "[WP.Why3ide] a goal normally present in generated file \ - is not present in the session: %s %s %s@." - g.gfile g.gtheory g.ggoal; - update ?callback wpo VCS.Why3ide (VCS.result VCS.NoResult) - ) goals; + match g with + | None -> (* proved by QED *) + let time = qed_time wpo in + let result = VCS.result ~time VCS.Valid in + update ?callback wpo VCS.Qed result; + update ?callback wpo VCS.Why3ide (VCS.result VCS.NoResult) + | Some g -> + try + let filename = Sysutil.relativize_filename filename_session g.gfile in + let file = HStr.find session.session_files filename in + let theory = HStr.find file.file_theories g.gtheory in + let goal = HStr.find theory.theory_goals g.ggoal in + let result = VCS.result + (if goal.goal_verified then VCS.Valid else VCS.NoResult) in + update ?callback wpo VCS.Why3ide result + with Not_found -> + if Wp_parameters.has_dkey "prover" then + Wp_parameters.feedback + "[WP.Why3ide] a goal normally present in generated file \ + is not present in the session: %s %s %s@." + g.gfile g.gtheory g.ggoal; + update ?callback wpo VCS.Why3ide (VCS.result VCS.NoResult) + ) goals; why3ide_running := false let wp_why3ide ?callback iter = @@ -148,11 +152,11 @@ let on_goal wpo = match ProverWhy3.assemble_wpo wpo with | None -> - Wpo.S.Hashtbl.add goals wpo None; + Wpo.S.Hashtbl.add goals wpo None; | Some (incs,goal) -> - Wpo.S.Hashtbl.add goals wpo (Some goal); - List.iter (fun f -> String.Hashtbl.replace includes f ()) incs; - String.Hashtbl.replace files goal.ProverWhy3.gfile () + Wpo.S.Hashtbl.add goals wpo (Some goal); + List.iter (fun f -> String.Hashtbl.replace includes f ()) incs; + String.Hashtbl.replace files goal.ProverWhy3.gfile () in iter on_goal; let dir = Wp_parameters.get_output () in @@ -164,16 +168,16 @@ else begin ProverWhy3.call_ide ~includes ~files ~session >>= - fun ok -> begin - if ok then begin - try update_wpo_from_session ?callback ~goals ~session () - with Why3_session.LoadError -> - Wp_parameters.error - "[WP] why3session: can't import back why3 results because of \ - previous error" - end; - Task.return () - end + fun ok -> begin + if ok then begin + try update_wpo_from_session ?callback ~goals ~session () + with Why3_session.LoadError -> + Wp_parameters.error + "[WP] why3session: can't import back why3 results because of \ + previous error" + end; + Task.return () + end end let wp_why3ide ?callback iter = diff -Nru frama-c-20140301+neon+dfsg/src/wp/prover.mli frama-c-20150201+sodium+dfsg/src/wp/prover.mli --- frama-c-20140301+neon+dfsg/src/wp/prover.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/prover.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/ProverTask.ml frama-c-20150201+sodium+dfsg/src/wp/ProverTask.ml --- frama-c-20140301+neon+dfsg/src/wp/ProverTask.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/ProverTask.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/ProverTask.mli frama-c-20150201+sodium+dfsg/src/wp/ProverTask.mli --- frama-c-20140301+neon+dfsg/src/wp/ProverTask.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/ProverTask.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -25,26 +25,26 @@ (* -------------------------------------------------------------------------- *) class printer : Format.formatter -> string -> -object - method paragraph : unit - method lines : unit - method section : string -> unit - method hline : unit - method printf : 'a. ('a,Format.formatter,unit) format -> 'a -end + object + method paragraph : unit + method lines : unit + method section : string -> unit + method hline : unit + method printf : 'a. ('a,Format.formatter,unit) format -> 'a + end val pp_file : message:string -> file:string -> unit (** never fails *) class type pattern = -object - method get_after : ?offset:int -> int -> string + object + method get_after : ?offset:int -> int -> string (** [get_after ~offset:p k] returns the end of the message - starting [p] characters after the end of group [k]. *) - method get_string : int -> string - method get_int : int -> int - method get_float : int -> float -end + starting [p] characters after the end of group [k]. *) + method get_string : int -> string + method get_int : int -> int + method get_float : int -> float + end val p_group : string -> string (** Put pattern in group [\(p\)] *) val p_int : string (** Int group pattern [\([0-9]+\)] *) @@ -57,25 +57,25 @@ type logs = [ `OUT | `ERR | `BOTH ] class virtual command : string -> -object + object - method set_command : string -> unit - method add : string list -> unit - method add_int : name:string -> value:int -> unit - method add_positive : name:string -> value:int -> unit - method add_float : name:string -> value:float -> unit - method add_parameter : name:string -> (unit -> bool) -> unit - method add_list : name:string -> string list -> unit - method timeout : int -> unit - method validate_time : (float -> unit) -> unit - method validate_pattern : ?logs:logs -> ?repeat:bool -> - Str.regexp -> (pattern -> unit) -> unit - method run : ?echo:bool -> ?logout:string -> ?logerr:string -> - unit -> int Task.task + method set_command : string -> unit + method add : string list -> unit + method add_int : name:string -> value:int -> unit + method add_positive : name:string -> value:int -> unit + method add_float : name:string -> value:float -> unit + method add_parameter : name:string -> (unit -> bool) -> unit + method add_list : name:string -> string list -> unit + method timeout : int -> unit + method validate_time : (float -> unit) -> unit + method validate_pattern : ?logs:logs -> ?repeat:bool -> + Str.regexp -> (pattern -> unit) -> unit + method run : ?echo:bool -> ?logout:string -> ?logerr:string -> + unit -> int Task.task -end + end val server : unit -> Task.server val spawn : bool Task.task list -> unit - (** Spawn all the tasks over the server and retain the first 'validated' one *) +(** Spawn all the tasks over the server and retain the first 'validated' one *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/ProverWhy3.ml frama-c-20150201+sodium+dfsg/src/wp/ProverWhy3.ml --- frama-c-20140301+neon+dfsg/src/wp/ProverWhy3.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/ProverWhy3.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -371,12 +371,12 @@ age_max := max (!age_max) (Wpo.age wpo); match wpo.Wpo.po_formula with | Wpo.GoalAnnot vcq -> - let prop = Wpo.GOAL.compute_proof vcq.Wpo.VC_Annot.goal in - if Lang.F.p_true != prop then - let id = WpPropId.get_propid pid in - let title = Pretty_utils.to_string WpPropId.pretty pid in - let axioms = None in - assemble_goal ~pid ~id ~title ~axioms prop fmt + let prop = Wpo.GOAL.compute_proof vcq.Wpo.VC_Annot.goal in + if Lang.F.p_true != prop then + let id = WpPropId.get_propid pid in + let title = Pretty_utils.to_string WpPropId.pretty pid in + let axioms = None in + assemble_goal ~pid ~id ~title ~axioms prop fmt | Wpo.GoalLemma _ | Wpo.GoalCheck _ -> assert false end in Command.print_file file @@ -413,10 +413,10 @@ let assemble_wpo wpo = match wpo.Wpo.po_formula with | Wpo.GoalCheck vck -> - Some (Model.with_model wpo.Wpo.po_model (assemble_check wpo) vck) + Some (Model.with_model wpo.Wpo.po_model (assemble_check wpo) vck) | Wpo.GoalAnnot vcq when Lang.F.p_true == Wpo.GOAL.compute_proof vcq.Wpo.VC_Annot.goal -> - (** The wpo is trivial *) + (** The wpo is trivial *) None | _ -> Some (Model.with_model wpo.Wpo.po_model assemble_wpo wpo) @@ -520,6 +520,7 @@ end method prove = + why#add [ "prove" ] ; let time = Wp_parameters.Timeout.get () in if Wp_parameters.Check.get () then why#add ["--type-only"] ; why#add ["--extra-config"; Wp_parameters.Share.file "why3/why3.conf"]; @@ -534,8 +535,8 @@ when it is implemented. *) why#add ["--debug"; "call_prover"]; why#timeout time ; - why#add_list ~name:"-I" includes; - why#add ["-I";Wp_parameters.Share.file "why3"]; + why#add_list ~name:"-L" includes; + why#add ["-L";Wp_parameters.Share.file "why3"]; why#validate_time why#time ; (* The order is important. Warning are detected as error which they are not. *) @@ -561,6 +562,7 @@ match assemble_wpo wpo with | None -> Task.return VCS.no_result | Some (includes,file) -> + Wp_parameters.print_generated file.gfile; if Wp_parameters.Generate.get () then Task.return VCS.no_result else @@ -580,13 +582,14 @@ class why3ide ~includes ~files ~session = object(why) - inherit ProverTask.command "why3ide" + inherit ProverTask.command "why3" method start () = + why#add [ "ide" ] ; why#add ["--extra-config"; Wp_parameters.Share.file "why3/why3.conf"]; why#add (Wp_parameters.WhyFlags.get ()) ; - why#add_list ~name:"-I" includes; - why#add ["-I";Wp_parameters.Share.file "why3"]; + why#add_list ~name:"-L" includes; + why#add ["-L";Wp_parameters.Share.file "why3"]; why#add [session]; why#add files; why#run ~echo:true () @@ -594,6 +597,7 @@ end let call_ide ~includes ~files ~session = + List.iter Wp_parameters.print_generated files; if Wp_parameters.Generate.get () then Task.return false else diff -Nru frama-c-20140301+neon+dfsg/src/wp/ProverWhy3.mli frama-c-20150201+sodium+dfsg/src/wp/ProverWhy3.mli --- frama-c-20140301+neon+dfsg/src/wp/ProverWhy3.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/ProverWhy3.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/arith.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/arith.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/arith.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/arith.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -47,7 +47,6 @@ val of_int : int -> t val of_string : string -> t val to_string : t -> string - val pretty : Format.formatter -> t -> unit val hash : t -> int val compare : t -> t -> int diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/bvars.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/bvars.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/bvars.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/bvars.ml 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,68 @@ +(**************************************************************************) +(* *) +(* This file is part of WP plug-in of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) + +(* -------------------------------------------------------------------------- *) +(* --- Upper approximated Set of (un-)bound variables --- *) +(* -------------------------------------------------------------------------- *) + +type t = { + lower : int ; (* lower bound of variables, or 0 if empty *) + upper : int ; (* upper bound of variables +1, or 0 is empty *) + order : int ; (* depth of binders inside *) +} + +let empty = { lower=0 ; upper=0 ; order=0 } + +let is_empty a = (a.upper = 0) +let closed s = s.upper <= s.order +let closed_at d s = s.upper = 0 || d <= s.lower + +let union a b = + if is_empty a then b else + if is_empty b then a else + { + lower = min a.lower b.lower ; + order = max a.order b.order ; + upper = max a.upper b.upper ; + } + +let singleton k = { + order = 0 ; + lower = k ; + upper = k+1 ; +} + +let contains k s = s.lower <= k && k < s.upper +let overlap k n s = s.lower < k+n && k < s.upper + +let order s = s.order +let bind s = { + upper = s.upper ; + lower = s.lower ; + order = succ s.order ; +} + +let pretty fmt s = + if is_empty s then + Format.fprintf fmt "" + else + Format.fprintf fmt "\\%d.[%d-%d]" s.order s.lower (s.upper - 1) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/bvars.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/bvars.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/bvars.mli 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/bvars.mli 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,54 @@ +(**************************************************************************) +(* *) +(* This file is part of WP plug-in of Frama-C. *) +(* *) +(* Copyright (C) 2007-2015 *) +(* 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). *) +(* *) +(**************************************************************************) + +(* -------------------------------------------------------------------------- *) +(** Bound Variables Footprints. + + All provided operation are constant-time bitwise and integer operations. +*) +(* -------------------------------------------------------------------------- *) + +type t (** An over-approximation of set of integers *) + +val empty : t +val singleton : int -> t + +val order : t -> int (** Max stack of binders *) +val bind : t -> t (** Decrease all elements in [s] after removing [0] *) + +val union : t -> t -> t + +val closed : t -> bool (** All variables are bound *) +val closed_at : int -> t -> bool + (** [closed_at n a] Does not contains variables [k bool + (** No bound variables *) + +val contains : int -> t -> bool + (** if [may_constains k s] returns [false] then [k] does not belong to [s] *) + +val overlap : int -> int -> t -> bool + (** if [may_overlap k n s] returns [false] then no variable [i] with + [k<=i t -> unit diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/cache.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/cache.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/cache.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/cache.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -43,14 +43,14 @@ let rec log2up n a b = let c = (a+b) / 2 in let s = 1 lsl c in - if s = n then s else - if c = a then 1 lsl b else + if s = n then c else + if c = a then b else if s < n then log2up n c b else log2up n a c -let alloc size = - if size >= Sys.max_array_length - then Sys.max_array_length - else log2up size 0 (Sys.word_size - 3) +let max_cache_log = + log2up Sys.max_array_length 0 (Sys.word_size - 3) - 1 + +let alloc size = 1 lsl (log2up size 0 max_cache_log) module Unary(A : S) = struct diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/cache.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/cache.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/cache.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/cache.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/collection.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/collection.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/collection.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/collection.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -45,6 +45,7 @@ val find : key -> 'a t -> 'a val findk : key -> 'a t -> key * 'a val size : 'a t -> int + val is_empty : 'a t -> bool (** [insert (fun key v old -> ...) key v map] *) val insert : (key -> 'a -> 'a -> 'a) -> key -> 'a -> 'a t -> 'a t @@ -91,6 +92,7 @@ val add : elt -> t -> t val singleton : elt -> t val elements : t -> elt list + val is_empty : t -> bool val mem : elt -> t -> bool val iter : (elt -> unit) -> t -> unit diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/collection.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/collection.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/collection.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/collection.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -45,6 +45,7 @@ val find : key -> 'a t -> 'a val findk : key -> 'a t -> key * 'a val size : 'a t -> int + val is_empty : 'a t -> bool (** [insert (fun key v old -> ...) key v map] *) val insert : (key -> 'a -> 'a -> 'a) -> key -> 'a -> 'a t -> 'a t @@ -91,6 +92,7 @@ val add : elt -> t -> t val singleton : elt -> t val elements : t -> elt list + val is_empty : t -> bool val mem : elt -> t -> bool val iter : (elt -> unit) -> t -> unit diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/engine.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/engine.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/engine.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/engine.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -29,7 +29,6 @@ open Format open Logic open Plib -open Linker type op = | Op of string (** Infix or prefix operator *) @@ -93,9 +92,6 @@ (** {3 Global and Local Environment} *) - method declare : string -> unit - method declare_all : string list -> unit - method local : (unit -> unit) -> unit (** Calls the continuation in a local copy of the environment. Previous environment is restored after return, but allocators @@ -105,6 +101,9 @@ (** Calls the continuation in a fresh local environment. Previous environment is restored after return. *) + method bind : 'var -> string + method find : 'var -> string + (** {3 Types} *) method t_int : string @@ -150,7 +149,7 @@ (** {3 Variables} *) - method pp_var : 'var printer (** Default to local env *) + method pp_var : string printer (** {3 Calls} @@ -220,14 +219,13 @@ (** {3 Binders} *) - method pp_forall : 'tau -> 'var list printer (** with separator *) - method pp_exists : 'tau -> 'var list printer (** with separator *) - method pp_lambda : 'var list printer + method pp_forall : 'tau -> string list printer + method pp_exists : 'tau -> string list printer + method pp_lambda : (string * 'tau) list printer (** {3 Bindings} *) - method is_shareable : 'term -> bool - method bind : 'var -> unit + method is_shareable : 'term -> bool method pp_let : formatter -> pmode -> string -> 'term -> unit (** {3 Terms} *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/export_altergo.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/export_altergo.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/export_altergo.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/export_altergo.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -27,7 +27,6 @@ open Logic open Format open Plib -open Linker open Engine open Export @@ -65,15 +64,6 @@ inherit E.engine as super - initializer - begin - self#declare_all [ - "type" ; "logic" ; "predicate" ; "function" ; - "axiom" ; "goal" ; - "farray" ; "true" ; "false" ; - ] ; - end - (* -------------------------------------------------------------------------- *) (* --- Types --- *) (* -------------------------------------------------------------------------- *) @@ -114,8 +104,8 @@ (* -------------------------------------------------------------------------- *) method pp_int amode fmt z = match amode with - | Aint -> Z.pretty fmt z - | Areal -> fprintf fmt "%a.0" Z.pretty z + | Aint -> pp_print_string fmt (Z.to_string z) + | Areal -> fprintf fmt "%s.0" (Z.to_string z) method pp_cst fmt cst = let open Numbers in @@ -244,7 +234,7 @@ | Sprop -> raise Not_found | Sdata | Sarray _ -> match T.repr e with - | Var x -> tau_of_var x + | Fvar x -> tau_of_var x | Aset(m,k,v) -> (try self#typecheck m with Not_found -> Array(self#typecheck k,self#typecheck v)) @@ -279,7 +269,7 @@ x self#pp_tau tau x self#pp_flow e | _ -> fprintf fmt "@[let %s = %a : %a in@]@ " - x self#pp_flow e self#pp_tau tau + x self#pp_atom e self#pp_tau tau with Not_found -> fprintf fmt "@[let %s = %a in@]@ " x self#pp_flow e @@ -312,7 +302,7 @@ method pp_trigger fmt t = let rec pretty fmt = function | TgAny -> assert false - | TgVar x -> self#pp_var fmt x + | TgVar x -> self#pp_var fmt (self#find x) | TgGet(t,k) -> fprintf fmt "@[%a[%a]@]" pretty t pretty k | TgSet(t,k,v) -> fprintf fmt "@[%a[%a@ <- %a]@]" pretty t pretty k pretty v | TgFun(f,ts) -> call Cterm f fmt ts @@ -330,22 +320,7 @@ in fprintf fmt "@[%a@]" pretty t - method pp_goal ~model fmt p = - if model <= 0 then self#pp_prop fmt p - else - begin - let rec intros xs p = match T.repr p with - | Bind(Forall,x,p) -> intros (x::xs) p - | _ -> xs , p in - let xs,p = intros [] p in - List.iter - (fun x -> - self#bind x ; - fprintf fmt "@[forall %a \"model:%d\" : %a.@]@ " - self#pp_var x model self#pp_tau (tau_of_var x)) - (List.rev xs) ; - self#pp_prop fmt p ; - end + method pp_goal fmt p = self#pp_prop fmt p (* -------------------------------------------------------------------------- *) (* --- Declarations --- *) @@ -378,9 +353,9 @@ Plib.iteri (fun index (c,_) -> match index with | Ifirst | Isingle -> - fprintf fmt " = %s" (declare_name (self#link c)) + fprintf fmt " = %s" (link_name (self#link c)) | Imiddle | Ilast -> - fprintf fmt "@ | %s" (declare_name (self#link c)) + fprintf fmt "@ | %s" (link_name (self#link c)) ) cases ; fprintf fmt "@]" end @@ -403,7 +378,7 @@ fprintf fmt "forall x%d:%a.@ " k self#pp_tau t ; Printf.sprintf "x%d" k) ts in - let f = declare_name (self#link c) 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 @@ -412,7 +387,7 @@ method declare_signature fmt f ts t = begin - fprintf fmt "@[logic %s :@ " (declare_name (self#link f)) ; + fprintf fmt "@[logic %s :@ " (link_name (self#link f)) ; if ts <> [] then begin Plib.pp_listcompact ~sep:"," self#pp_tau fmt ts ; @@ -428,9 +403,9 @@ fprintf fmt "@[%a@,(" (self#pp_declare_symbol cmode) f ; Plib.pp_listsep ~sep:"," (fun fmt x -> - self#bind x ; + let a = self#bind x in let t = T.tau_of_var x in - fprintf fmt "%a:%a" self#pp_var x self#pp_tau t + fprintf fmt "%a:%a" self#pp_var a self#pp_tau t ) fmt xs ; match cmode with | Cprop -> diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/export_altergo.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/export_altergo.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/export_altergo.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/export_altergo.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -23,7 +23,6 @@ open Logic open Format open Plib -open Linker open Engine (** Exportation Engine for Alt-Ergo. @@ -54,16 +53,16 @@ inherit [Z.t,ADT.t,Field.t,Fun.t,tau,var,term] Engine.engine method op_spaced : string -> bool method op_record : string * string - method pp_forall : tau -> var list printer - method pp_intros : tau -> var list printer - method pp_exists : tau -> var list printer - method pp_param : var printer + 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 : model:int -> formatter -> term -> unit + method pp_goal : formatter -> term -> unit method declare_prop : kind:string -> formatter -> string -> T.var list -> trigger list list -> term -> unit diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/export_coq.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/export_coq.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/export_coq.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/export_coq.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -27,7 +27,6 @@ open Logic open Format open Plib -open Linker open Engine open Export @@ -54,17 +53,6 @@ inherit E.engine - initializer - begin - self#declare_all ["Z";"Real";"bool";"Prop";"array";"farray"] ; - for i=1 to 26 do - let c = int_of_char 'A' + i - 1 in - self#declare (Printf.sprintf "%c" (char_of_int c)) - done ; - self#declare_all ["true";"false";"True";"False"] ; - self#declare_all ["IZT"] ; - end - (* -------------------------------------------------------------------------- *) (* --- Types --- *) (* -------------------------------------------------------------------------- *) @@ -106,7 +94,7 @@ method callstyle = CallApply method op_scope = function Aint -> Some "%Z" | Areal -> Some "%R" - method pp_int _amode fmt z = Z.pretty fmt z + method pp_int _amode fmt z = pp_print_string fmt (Z.to_string z) method pp_cst fmt cst = let open Numbers in let man,exp = significant cst in @@ -248,8 +236,8 @@ fprintf fmt ")@]" end - method private pp_param fmt x = - fprintf fmt "(%a : %a)" self#pp_var x self#pp_tau (T.tau_of_var x) + 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 | [] -> () @@ -325,7 +313,7 @@ let result = Data(adt,Kind.type_params n) in List.iter (fun (c,ts) -> - fprintf fmt "@ | @[%s : " (declare_name (self#link c)) ; + fprintf fmt "@ | @[%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 ; @@ -334,7 +322,7 @@ method declare_signature fmt f ts t = begin - fprintf fmt "@[Parameter %s :" (declare_name (self#link f)) ; + fprintf fmt "@[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 @@ -342,12 +330,12 @@ method declare_definition fmt f xs t e = self#global begin fun () -> - fprintf fmt "@[Definition %s" (declare_name (self#link f)) ; + fprintf fmt "@[Definition %s" (link_name (self#link f)) ; List.iter (fun x -> - self#bind x ; + let a = self#bind x in let t = T.tau_of_var x in - fprintf fmt "@ (%a : %a)" self#pp_var x self#pp_tau t + fprintf fmt "@ (%a : %a)" self#pp_var a self#pp_tau t ) xs ; fprintf fmt "@ : %a :=@ " self#pp_tau t ; fprintf fmt "@[%a@]@].@\n" (self#pp_expr t) e ; @@ -356,7 +344,7 @@ 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 ^ (declare_name (self#link f)) in + let fix = prefix ^ (link_name (self#link f)) in self#declare_axiom fmt fix xs [] (e_eq (e_fun f (List.map e_var xs)) e) ; end diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/export_coq.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/export_coq.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/export_coq.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/export_coq.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -23,7 +23,6 @@ open Logic open Format open Plib -open Linker (** Exportation Engine for Coq. diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/export.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/export.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/export.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/export.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -27,7 +27,6 @@ open Format open Logic open Plib -open Linker open Engine let cmode = function @@ -60,71 +59,124 @@ | Prop -> Cprop | _ -> Cterm -let declare_name = function +let link_name = function | F_call f -> f | _ -> assert false (** Only normal function call F_call can be declared *) let debug = function | F_call f | F_left f | F_right f | F_bool_prop(_,f) | F_subst f | F_assoc f -> f +(* -------------------------------------------------------------------------- *) +(* --- Identifiers --- *) +(* -------------------------------------------------------------------------- *) + +let is_letter = function + | '0' .. '9' | 'a' .. 'z' | 'A' .. 'Z' -> true + | _ -> false + +let is_ident op = + try + for i = 0 to String.length op - 1 do + if not (is_letter op.[i]) then raise Exit + done ; true + with Exit -> false + +let extract_ident base = + let p = Buffer.create 32 in + for i=0 to String.length base - 1 do + let c = base.[i] in + if is_letter c then Buffer.add_char p c + done ; + Buffer.contents p + +(* -------------------------------------------------------------------------- *) +(* --- Generic Engine --- *) +(* -------------------------------------------------------------------------- *) + module Make(T : Term) = struct open T + type trigger = (var,Fun.t) ftrigger + type typedef = (tau,Field.t,Fun.t) ftypedef + (* -------------------------------------------------------------------------- *) - (* --- Linkers --- *) + (* --- Allocator --- *) (* -------------------------------------------------------------------------- *) - module ADT = T.ADT - module Field = T.Field - module Fun = T.Fun - - type tau = (Field.t,ADT.t) datatype - type var = Var.t - type term = T.term - type record = (Field.t * term) list - type trigger = (var,Fun.t) ftrigger - type typedef = (tau,Field.t,Fun.t) ftypedef + module VarMap = Map.Make(T.Var) + module Ident = Map.Make(String) + + type allocator = { + mutable base : string -> string ; + mutable index : int Ident.t ; + mutable fvars : string VarMap.t ; + mutable bvars : string Intmap.t ; + mutable share : string Tmap.t ; + } + + let identity x = x + + let create_alloc base = { + base ; + index = Ident.empty ; + fvars = VarMap.empty ; + bvars = Intmap.empty ; + share = Tmap.empty ; + } + + let copy_alloc lnk = { + base = lnk.base ; + index = lnk.index ; + fvars = lnk.fvars ; + bvars = lnk.bvars ; + share = lnk.share ; + } + + let fresh basename lnk = + let basename = lnk.base basename in + let k = try Ident.find basename lnk.index with Not_found -> 0 in + lnk.index <- Ident.add basename (succ k) lnk.index ; + if k=0 && String.length basename = 1 then basename + else Printf.sprintf "%s_%d" basename k + + let bind_bvar k t lnk = + let x = fresh (Tau.basename t) lnk in + lnk.bvars <- Intmap.add k x lnk.bvars ; x + + let find_bvar k lnk = + try Intmap.find k lnk.bvars + with Not_found -> assert false + + let bind_fvar v lnk = + let x = fresh (Var.basename v) lnk in + lnk.fvars <- VarMap.add v x lnk.fvars ; x + + let find_fvar v lnk = VarMap.find v lnk.fvars - module Mvar = Map.Make(Var) - module Ladt = Link(ADT) - module Lfield = Link(Field) - module Lfun = Link(Fun) - module Lvar = Link(Var) - module STerm = Link - (struct - type t = term - let hash = T.hash - let equal = T.equal - let compare = T.compare - let pretty = T.pretty - let debug t = Printf.sprintf "E%03d" (T.id t) - end) + let bind_term x t lnk = + lnk.share <- Tmap.add t x lnk.share (* -------------------------------------------------------------------------- *) - (* --- Pretty Printing Engine --- *) + (* --- Binders --- *) (* -------------------------------------------------------------------------- *) - module TauMap = Map.Make - (struct - type t = T.tau - let compare = Kind.compare_tau Field.compare ADT.compare - end) - - let add_var x vars = - let tx = T.tau_of_var x in - let xs = try TauMap.find tx vars with Not_found -> [] in - TauMap.add tx (x::xs) vars - - let rec binders q xs p = - match T.repr p with - | Bind(q',y,p') when q'=q -> binders q (add_var y xs) p' - | _ -> xs,p - - let rec lambda xs p = - match T.repr p with - | Bind(Lambda,y,p') -> lambda (y::xs) p' - | _ -> List.rev xs , p + module TauMap = Map.Make(T.Tau) + + let add_var k t vars = + let ks = try TauMap.find t vars with Not_found -> [] in + TauMap.add t (k::ks) vars + + let rec binders q k vars e = + match T.repr e with + | Bind(q',t,e) when q'=q -> + binders q (succ k) (add_var k t vars) (lc_repr e) + | _ -> k,vars,e + + let rec lambda k kts e = + match T.repr e with + | Bind(Lambda,t,e) -> lambda (succ k) ((k,t)::kts) (lc_repr e) + | _ -> k,List.rev kts,e let rec has_prop_form link e = match T.repr e with | Eq _ | Neq _ | Leq _ | Lt _ | Imply _ | And _ | Or _ | If _ @@ -144,49 +196,23 @@ method virtual field : Field.t -> string method basename : string -> string = fun x -> x - val mutable global = allocator () - val mutable vars = Vars.empty - - method declare = Linker.declare global - method declare_all = List.iter (Linker.declare global) - - val linker_variable = Lvar.linker () - val linker_shared = STerm.linker () - - method private push = - let gstack = global in - begin - global <- copy global ; - linker_variable#alloc_with global ; - linker_shared#alloc_with global ; - gstack , linker_variable#push , linker_shared#push - end - - method private pop (gstack,idx_var,idx_shared) = - begin - global <- gstack ; - linker_variable#alloc_with gstack ; - linker_variable#pop idx_var ; - linker_shared#alloc_with gstack ; - linker_shared#pop idx_shared ; - end + val mutable alloc = create_alloc identity (* self is not available yet *) + initializer alloc.base <- self#basename method local (job : unit -> unit) = - let gstack = self#push in - try job () ; self#pop gstack - with err -> self#pop gstack ; raise err + let stack = alloc in + alloc <- copy_alloc alloc ; + try job () ; alloc <- stack + with err -> alloc <- stack ; raise err method global (job : unit -> unit) = - let gstack = self#push in - try - linker_variable#clear ; - linker_shared#clear ; - vars <- Vars.empty ; - job () ; - self#pop gstack - with err -> - self#pop gstack ; - raise err + let stack = alloc in + alloc <- create_alloc self#basename ; + try job () ; alloc <- stack + with err -> alloc <- stack ; raise err + + method bind v = bind_fvar v alloc + method find v = VarMap.find v alloc.fvars (* -------------------------------------------------------------------------- *) (* --- Types --- *) @@ -235,7 +261,7 @@ (* --- Variables --- *) (* -------------------------------------------------------------------------- *) - method pp_var = linker_variable#print + method pp_var = Format.pp_print_string (* -------------------------------------------------------------------------- *) (* --- Atoms --- *) @@ -565,43 +591,43 @@ (* --- Quantifiers --- *) (* -------------------------------------------------------------------------- *) - method virtual pp_forall : tau -> var list printer - method virtual pp_exists : tau -> var list printer - method virtual pp_lambda : var list printer - - method private pp_binders fmt p = - match T.repr p with - - | Bind(Lambda,x,p) -> - let xs,p = lambda [x] p in - List.iter self#bind xs ; - self#pp_lambda fmt xs ; - self#pp_binders fmt p + method virtual pp_forall : tau -> string list printer + method virtual pp_exists : tau -> string list printer + method virtual pp_lambda : (string * tau) list printer - | Bind((Forall|Exists) as q,x,p) -> - let vars,p = binders q (add_var x TauMap.empty) p in + method private pp_binders fmt e = + match T.repr e with + + | Bind(Lambda,t,e) -> + let e = lc_repr e in + let n,kts,e = lambda 1 [0,t] e in + let last = Bvars.order (lc_vars e) + n - 1 in + let xts = List.map (fun (k,t) -> bind_bvar (last-k) t alloc,t) kts in + self#pp_lambda fmt xts ; + self#pp_binders fmt e + + | Bind((Forall|Exists) as q,t,e) -> + let e = lc_repr e in + let n,vars,e = binders q 1 (add_var 0 t TauMap.empty) e in + let last = Bvars.order (lc_vars e) + n - 1 in TauMap.iter - (fun t xs -> - List.iter self#bind xs ; - let xs = List.sort Var.compare xs in + (fun t ks -> + let xs = List.fold_left + (fun xs k -> bind_bvar (last-k) t alloc :: xs) [] ks in match q with | Forall -> fprintf fmt "%a@ " (self#pp_forall t) xs | Exists -> fprintf fmt "%a@ " (self#pp_exists t) xs | Lambda -> assert false ) vars ; - self#pp_binders fmt p + self#pp_binders fmt e - | _ -> self#pp_shared fmt p + | _ -> + self#pp_shared fmt e (* -------------------------------------------------------------------------- *) (* --- Sharing --- *) (* -------------------------------------------------------------------------- *) - method bind x = - let basename = self#basename (T.base_of_var x) in - ignore (linker_variable#alloc ~basename x) ; - vars <- Vars.add x vars - method is_shareable e = match T.repr e with | Kint _ | Kreal _ | True | False -> false @@ -610,39 +636,30 @@ | Aget _ | Aset _ | Rget _ | Rdef _ -> true | And _ | Or _ | Not _ | Imply _ | If _ -> false | Fun _ -> not (T.is_prop e) - | Var _ | Apply _ | Bind _ -> false + | Bvar _ | Fvar _ | Apply _ | Bind _ -> false method virtual pp_let : Format.formatter -> pmode -> string -> term -> unit - method private pp_lets fmt xes e = - begin - let m0 = mode in - let p0 = pmode m0 in - List.iter - (fun (x,e) -> - mode <- Mterm ; - self#pp_let fmt p0 x e ; - linker_shared#bind_reserved e x ; - ) xes ; - mode <- m0 ; - self#pp_flow fmt e ; - end - method private pp_shared fmt e = - let shared e = linker_shared#mem e in + let shared e = Tmap.mem e alloc.share in let shareable e = self#is_shareable e in - let es = T.shared ~shareable ~shared ~closed:vars [e] in + let es = T.shared ~shareable ~shared [e] in if es <> [] then self#local - (fun () -> - let xes = - List.map - (fun e -> - let basename = self#basename (T.basename e) in - let var = linker_shared#reserve ~basename in - var , e - ) es - in self#pp_lets fmt xes e) + begin fun () -> + let m0 = mode in + let p0 = pmode m0 in + List.iter + (fun e -> + let base = self#basename (T.basename e) in + let x = fresh base alloc in + mode <- Mterm ; + self#pp_let fmt p0 x e ; + bind_term x e alloc ; + ) es ; + mode <- m0 ; + self#pp_flow fmt e ; + end else self#pp_flow fmt e @@ -669,7 +686,7 @@ method pp_flow fmt e = self#pp_bool self#pp_do_flow fmt e method private pp_do_atom fmt e = - try pp_print_string fmt (linker_shared#find e) + try self#pp_var fmt (Tmap.find e alloc.share) with Not_found -> if self#is_atomic e then self#pp_repr fmt e @@ -679,7 +696,7 @@ | Some s -> pp_print_string fmt s method private pp_do_flow fmt e = - try pp_print_string fmt (linker_shared#find e) + try self#pp_var fmt (Tmap.find e alloc.share) with Not_found -> match self#op_scope_for e with | None -> self#pp_repr fmt e @@ -727,7 +744,8 @@ match T.repr e with | True -> pp_print_string fmt (self#e_true (cmode mode)) | False -> pp_print_string fmt (self#e_false (cmode mode)) - | Var x -> self#pp_var fmt x + | Fvar x -> self#pp_var fmt (find_fvar x alloc) + | Bvar(k,_) -> self#pp_var fmt (find_bvar k alloc) | Not p -> self#pp_not fmt p | Kint x -> self#pp_int (amode mode) fmt x | Kreal x -> self#pp_real fmt x @@ -756,8 +774,7 @@ (* --- Formulae --- *) (* -------------------------------------------------------------------------- *) - method private pp_expr_mode m fmt e = - mode <- m ; self#pp_shared fmt e + method private pp_expr_mode m fmt e = mode <- m ; self#pp_shared fmt e method pp_term = self#pp_expr_mode Mterm method pp_prop = self#pp_expr_mode Mpositive diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/export.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/export.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/export.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/export.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -29,7 +29,6 @@ open Format open Logic open Plib -open Linker open Engine val cmode : mode -> cmode @@ -38,19 +37,22 @@ val tmode : ('a,'f) Logic.datatype -> mode val ctau : ('a,'f) Logic.datatype -> cmode -val declare_name : link -> string +val is_ident : string -> bool +val extract_ident : string -> string + val debug : link -> string +val link_name : link -> string module Make(T : Term) : sig open T - type tau = (Field.t,ADT.t) datatype - type record = (Field.t * term) list type trigger = (var,Fun.t) ftrigger type typedef = (tau,Field.t,Fun.t) ftypedef + module TauMap : Map.S with type key = tau + class virtual engine : object @@ -60,11 +62,10 @@ (** Allows to sanitize the basename used for in this engine for variable. *) method virtual link : Fun.t -> link - method declare : string -> unit - method declare_all : string list -> unit - method local : (unit -> unit) -> unit method global : (unit -> unit) -> unit + method bind : var -> string + method find : var -> string method virtual t_int : string method virtual t_real : string @@ -128,11 +129,9 @@ method virtual pp_conditional : formatter -> term -> term -> term -> unit - method virtual pp_forall : tau -> var list printer - method virtual pp_exists : tau -> var list printer - method virtual pp_lambda : var list printer - - method bind : var -> unit + method virtual pp_forall : tau -> string list printer + method virtual pp_exists : tau -> string list printer + method virtual pp_lambda : (string * tau) list printer method is_shareable : term -> bool method virtual pp_let : formatter -> pmode -> string -> term -> unit @@ -140,7 +139,7 @@ method pp_flow : term printer method pp_tau : tau printer - method pp_var : var printer + method pp_var : string printer method pp_term : term printer method pp_prop : term printer method pp_expr : tau -> term printer diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/export_why3.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/export_why3.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/export_why3.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/export_why3.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -56,17 +56,6 @@ inherit E.engine as super - initializer - begin - self#declare_all [ - "theory" ; "use" ; "import" ; "clone" ; "namespace" ; "end" ; "as" ; - "type" ; "function" ; "predicate" ; "inductive" ; - "axiom" ; "lemma" ; "goal" ; - "map" ; "get" ; "set" ; - "true" ; "false" ; "True" ; "False" ; "from_int" ; - ] ; - end - method! basename s = (** TODO: better uncapitalization of the first letter? utf8? *) let lower0 = Char.lowercase s.[0] in @@ -113,13 +102,13 @@ (* -------------------------------------------------------------------------- *) method pp_int amode fmt k = match amode with - | Aint -> Z.pretty fmt k + | Aint -> pp_print_string fmt (Z.to_string k) | Areal -> if Z.lt k Z.zero then (* unary minus is -. instead of - in Why3... *) - fprintf fmt "-.%a.0" Z.pretty (Z.neg k) + fprintf fmt "-.%s.0" (Z.to_string (Z.neg k)) else - fprintf fmt "%a.0" Z.pretty k + fprintf fmt "%s.0" (Z.to_string k) method pp_cst fmt cst = let open Numbers in @@ -238,7 +227,7 @@ method pp_trigger fmt t = let rec pretty fmt = function | TgAny -> assert false - | TgVar x -> self#pp_var fmt x + | TgVar x -> self#pp_var fmt (self#find x) | TgGet(t,k) -> fprintf fmt "@[%a[%a]@]" pretty t pretty k | TgSet(t,k,v) -> fprintf fmt "@[%a[%a@ <- %a]@]" pretty t pretty k pretty v | TgFun(f,ts) -> call Cterm f fmt ts @@ -253,7 +242,6 @@ | 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 - in fprintf fmt "@[%a@]" pretty t (* -------------------------------------------------------------------------- *) @@ -279,7 +267,7 @@ self#pp_declare_adt fmt adt n ; List.iter (fun (c,ts) -> - fprintf fmt "@ @[| %s@]" (declare_name (self#link c)) ; + fprintf fmt "@ @[| %s@]" (link_name (self#link c)) ; List.iter (fun t -> fprintf fmt "@ %a" self#pp_tau t) ts ; ) cases ; fprintf fmt "@]" @@ -302,9 +290,9 @@ fprintf fmt "@[%a" (self#pp_declare_symbol cmode) f ; List.iter (fun x -> - self#bind x ; + let a = self#bind x in let t = T.tau_of_var x in - fprintf fmt "@ (%a : %a)" self#pp_var x self#pp_tau t + fprintf fmt "@ (%a : %a)" self#pp_var a self#pp_tau t ) xs ; match cmode with | Cprop -> @@ -318,7 +306,7 @@ 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 ^ (declare_name (self#link f)) in + let fix = prefix ^ (link_name (self#link f)) in self#declare_axiom fmt fix xs [] (e_eq (e_fun f (List.map e_var xs)) e) ; end diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/export_why3.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/export_why3.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/export_why3.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/export_why3.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -23,7 +23,6 @@ open Logic open Format open Plib -open Linker open Engine (** Exportation Engine for Why-3. @@ -43,10 +42,10 @@ inherit [Z.t,ADT.t,Field.t,Fun.t,tau,var,term] Engine.engine method op_spaced : string -> bool method op_record : string * string - method pp_forall : tau -> var list printer - method pp_intros : tau -> var list printer - method pp_exists : tau -> var list printer - method pp_param : var printer + 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 diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/export_whycore.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/export_whycore.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/export_whycore.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/export_whycore.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -27,7 +27,6 @@ open Logic open Format open Plib -open Linker open Engine open Export @@ -55,22 +54,11 @@ | [] -> full_triggers tgs | ts -> ts :: full_triggers tgs - module TauMap = Map.Make - (struct - type t = T.tau - let compare = Kind.compare_tau T.Field.compare T.ADT.compare - end) - class virtual engine = object(self) inherit E.engine - initializer - begin - self#declare_all [ "int" ; "real" ; "bool" ; "prop" ] ; - end - (* -------------------------------------------------------------------------- *) (* --- Types --- *) (* -------------------------------------------------------------------------- *) @@ -145,10 +133,10 @@ (* --- Higher Order --- *) (* -------------------------------------------------------------------------- *) - method pp_param fmt x = - fprintf fmt "%a:%a" self#pp_var x self#pp_tau (T.tau_of_var x) + method pp_param fmt ((x,t) : string * tau) = + fprintf fmt "%a:%a" self#pp_var x self#pp_tau t - method pp_lambda (_:formatter) (_:var list) = + method pp_lambda (_:formatter) (_: (string * tau) list) = failwith "Qed.Export.Why : lambda abstraction" (* -------------------------------------------------------------------------- *) @@ -187,13 +175,13 @@ end method pp_declare_symbol t fmt f = - let name = declare_name (self#link f) in + let name = link_name (self#link f) in match t with | Cprop -> fprintf fmt "predicate %s" name | Cterm -> fprintf fmt "function %s" name method virtual pp_trigger : trigger printer - method virtual pp_intros : tau -> var list printer (* forall with no separatyor *) + method virtual pp_intros : tau -> string list printer (* forall with no separatyor *) method declare_prop ~kind fmt lemma xs tgs (p : term) = self#global @@ -201,13 +189,13 @@ fprintf fmt "@[%s %s:" kind lemma ; let groups = List.fold_left (fun groups x -> - self#bind x ; + let a = self#bind x in let t = T.tau_of_var x in - let xs = try TauMap.find t groups with Not_found -> [] in - TauMap.add t (x::xs) groups - ) TauMap.empty xs in - let order = TauMap.fold - (fun t xs order -> (t,List.sort Var.compare xs)::order) + let xs = try E.TauMap.find t groups with Not_found -> [] in + E.TauMap.add t (a::xs) groups + ) E.TauMap.empty xs in + let order = E.TauMap.fold + (fun t xs order -> (t,List.sort String.compare xs)::order) groups [] in let tgs = full_triggers tgs in Plib.iteri diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/export_whycore.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/export_whycore.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/export_whycore.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/export_whycore.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -47,9 +47,6 @@ method basename : string -> string method virtual link : Fun.t -> link - method declare : string -> unit - method declare_all : string list -> unit - method local : (unit -> unit) -> unit method global : (unit -> unit) -> unit @@ -118,12 +115,13 @@ method virtual pp_conditional : formatter -> term -> term -> term -> unit - method virtual pp_forall : tau -> var list printer - method virtual pp_intros : tau -> var list printer - method virtual pp_exists : tau -> var list printer - method pp_lambda : var list printer + method virtual pp_forall : tau -> string list printer + method virtual pp_intros : tau -> string list printer + method virtual pp_exists : tau -> string list printer + method pp_lambda : (string * tau) list printer - method bind : var -> unit + method bind : var -> string + method find : var -> string method virtual pp_let : formatter -> pmode -> string -> term -> unit method is_shareable : term -> bool @@ -131,12 +129,12 @@ method pp_flow : term printer method pp_tau : tau printer - method pp_var : var printer + method pp_var : string printer method pp_term : term printer method pp_prop : term printer method pp_expr : tau -> term printer - method pp_param : var printer + method pp_param : (string * tau) printer method virtual pp_trigger : trigger printer method virtual pp_declare_adt : formatter -> ADT.t -> int -> unit method virtual pp_declare_def : formatter -> ADT.t -> int -> tau -> unit diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/hcons.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/hcons.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/hcons.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/hcons.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/hcons.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/hcons.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/hcons.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/hcons.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/idxmap.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/idxmap.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/idxmap.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/idxmap.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/idxmap.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/idxmap.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/idxmap.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/idxmap.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/idxset.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/idxset.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/idxset.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/idxset.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/idxset.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/idxset.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/idxset.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/idxset.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/intmap.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/intmap.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/intmap.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/intmap.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/intmap.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/intmap.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/intmap.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/intmap.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/intset.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/intset.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/intset.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/intset.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/intset.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/intset.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/intset.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/intset.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/kind.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/kind.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/kind.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/kind.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -132,6 +132,22 @@ | Data(a,ts) -> pp_data pdata (pp_tau pvar pfield pdata) fmt a ts | Record fts -> pp_record pfield (pp_tau pvar pfield pdata) fmt fts +let rec hash_tau hfield hadt = function + | Int -> 0 + | Real -> 1 + | Bool -> 2 + | Prop -> 3 + | Tvar k -> 4+k + | Array(tk,te) -> + 7 * Hcons.hash_pair (hash_tau hfield hadt tk) (hash_tau hfield hadt te) + | Data(a,te) -> + 11 * Hcons.hash_list (hash_tau hfield hadt) (hadt a) te + | Record fts -> + Hcons.hash_list (hash_field hfield hadt) 13 fts + +and hash_field hfield hadt (f,t) = + Hcons.hash_pair (hfield f) (hash_tau hfield hadt t) + let rec eq_tau cfield cadt t1 t2 = match t1 , t2 with | (Bool|Int|Real|Prop|Tvar _) , (Bool|Int|Real|Prop|Tvar _) -> t1 = t2 @@ -180,3 +196,39 @@ let c = cfield f g in if c = 0 then compare_tau cfield cadt t t' else c ) fts gts + +module MakeTau(F : Field)(A : Data) = +struct + + type t = (F.t,A.t) datatype + + let equal = eq_tau F.equal A.equal + let compare = compare_tau F.compare A.compare + let hash = hash_tau F.hash A.hash + let pretty = pp_tau + (fun fmt k -> Format.fprintf fmt "`%d" k) + F.pretty A.pretty + + let debug f = + let buffer = Buffer.create 80 in + let fmt = Format.formatter_of_buffer buffer in + pretty fmt f ; + Format.pp_print_flush fmt () ; + Buffer.contents buffer + + let basename = function + | Int -> "i" + | Real -> "r" + | Prop -> "p" + | Bool -> "p" + | Data(a,_) -> A.basename a + | Array _ -> "t" + | Tvar 1 -> "a" + | Tvar 2 -> "b" + | Tvar 3 -> "c" + | Tvar 4 -> "d" + | Tvar 5 -> "e" + | Tvar _ -> "f" + | Record _ -> "r" + +end diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/kind.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/kind.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/kind.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/kind.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -72,3 +72,6 @@ ('a -> 'a -> int) -> ('f,'a) datatype -> ('f,'a) datatype -> int +module MakeTau(F : Field)(A : Data) : + Data with type t = (F.t,A.t) datatype + diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/linker.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/linker.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/linker.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/linker.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,166 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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 Format -open Logic -open Plib - -module B = Map.Make(String) -module S = Set.Make(String) - -(* -------------------------------------------------------------------------- *) -(* --- Identifiers --- *) -(* -------------------------------------------------------------------------- *) - -let is_letter c = c = '_' - || ('a' <= c && c <= 'z') - || ('a' <= c && c <= 'z') - || ('0' <= c && c <= '9') - -let is_ident op = is_letter op.[String.length op - 1] - -let ident base = - let p = Buffer.create 32 in - for i=0 to String.length base - 1 do - let c = base.[i] in - if is_letter c then Buffer.add_char p c - done ; - Buffer.contents p - -(* -------------------------------------------------------------------------- *) -(* --- Allocation --- *) -(* -------------------------------------------------------------------------- *) - -type allocator = { - mutable base : int B.t ; - mutable domain : S.t ; -} - -let rec lookup d a k = - let s = Printf.sprintf "%s_%d" a k in - if S.mem s d then lookup d a (succ k) else s,k - -let fresh m a = - let k0 = try B.find a m.base with Not_found -> 0 in - let s,k = lookup m.domain a k0 in - m.base <- B.add a (succ k) m.base ; - m.domain <- S.add s m.domain ; s - -let declare m x = m.domain <- S.add x m.domain - -let allocator () = { domain = S.empty ; base = B.empty } - -let copy m = { domain = m.domain ; base = m.base } - -(* -------------------------------------------------------------------------- *) -(* --- Linker --- *) -(* -------------------------------------------------------------------------- *) - -class type ['a,'idx] linker = - object - method lock : unit - method clear : unit - method push : 'idx - method pop : 'idx -> unit - method mem : 'a -> bool - method find : 'a -> string - method link : 'a -> string -> unit - method print : 'a printer - method alloc : basename:string -> 'a -> string - method alloc_with : allocator -> unit - method reserve : basename:string -> string - method bind_reserved : 'a -> string -> unit - end - -module Link(A : Symbol) = -struct - module I = Map.Make(A) - - type index = string I.t - - class alinker = - object(self) - val mutable alloc : allocator option = None - val mutable index : index = I.empty - - method push = index - method pop idx = index <- idx - - method lock = alloc <- None - method alloc_with allocator = alloc <- Some allocator - method clear = index <- I.empty - method find a = I.find a index - method mem a = I.mem a index - method print fmt a = - try pp_print_string fmt (I.find a index) - with Not_found -> fprintf fmt "<%a>" A.pretty a - method link a f = - match alloc with - | None -> failwith "Qed.Linker.Locked" - | Some allocator -> - declare allocator f ; - index <- I.add a f index - method alloc ~basename a = - let s = self#reserve ~basename in - index <- I.add a s index ; s - method reserve ~basename = - match alloc with - | None -> failwith "Qed.Linker.Locked" - | Some allocator -> fresh allocator basename - method bind_reserved a s = index <- I.add a s index - end - - let linker () = (new alinker :> (A.t,index) linker) -end - -(* -------------------------------------------------------------------------- *) -(* --- Records --- *) -(* -------------------------------------------------------------------------- *) - -module Record(T : Logic.Term) = -struct - - module Smap = Map.Make - (struct - type t = T.Field.t list - let compare = Hcons.compare_list T.Field.compare - end) - - module Amap = Map.Make(T.ADT) - - type t = { - mutable fields : T.Field.t list Amap.t ; - mutable record : T.ADT.t Smap.t ; - } - - let create () = { fields = Amap.empty ; record = Smap.empty } - - let register m adt fs = - begin - m.fields <- Amap.add adt fs m.fields ; - m.record <- Smap.add fs adt m.record ; - end - - let get_fields m a = Amap.find a m.fields - let get_record m s = Smap.find s m.record - -end diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/linker.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/linker.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/linker.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/linker.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -(* -------------------------------------------------------------------------- *) -(* --- Identifiers Management --- *) -(* -------------------------------------------------------------------------- *) - -open Format -open Logic -open Plib - -(** {2 Identifiers} *) - -val is_ident : string -> bool (** Operators is an identifier *) -val ident : string -> string (** Filter out non-letter characters *) - -(** {2 Allocators} *) - -type allocator - -val allocator : unit -> allocator -val declare : allocator -> string -> unit -val fresh : allocator -> string -> string -val copy : allocator -> allocator - -(** {2 Linkers} *) - -class type ['a,'idx] linker = - object - method lock : unit - method clear : unit - method push : 'idx - method pop : 'idx -> unit - method mem : 'a -> bool - method find : 'a -> string - method link : 'a -> string -> unit - method print : 'a printer - method alloc : basename:string -> 'a -> string - method reserve : basename:string -> string - method bind_reserved : 'a -> string -> unit - method alloc_with : allocator -> unit - end - -module Link(A : Symbol) : -sig - type index - val linker : unit -> (A.t,index) linker -end - -module Record(T : Logic.Term) : -sig - - type t - val create : unit -> t - val register : t -> T.ADT.t -> T.Field.t list -> unit - val get_fields : t -> T.ADT.t -> T.Field.t list - val get_record : t -> T.Field.t list -> T.ADT.t - -end diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/listmap.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/listmap.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/listmap.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/listmap.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -64,7 +64,7 @@ (match f k v with | None -> (* remove *) aux ((rev_append_until i rest res),resti) resti | Some v' -> - if v' = v then (* add idem *) aux acc resti + if v'==v then (* add idem *) aux acc resti else (* add new *) aux (((k,v')::(rev_append_until i rest res)),resti) resti) in aux ([],l) l diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/listmap.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/listmap.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/listmap.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/listmap.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/listset.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/listset.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/listset.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/listset.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/listset.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/listset.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/listset.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/listset.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/logic.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/logic.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/logic.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/logic.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -124,7 +124,7 @@ params : ('f,'a) datatype list ; (** Type of parameters *) } -type ('z,'f,'d,'x,'e) term_repr = +type ('z,'f,'a,'d,'x,'b,'e) term_repr = | True | False | Kint of 'z @@ -148,9 +148,10 @@ | Imply of 'e list * 'e | If of 'e * 'e * 'e | Fun of 'd * 'e list - | Var of 'x + | Fvar of 'x + | Bvar of int * ('f,'a) datatype | Apply of 'e * 'e list - | Bind of binder * 'x * 'e + | Bind of binder * ('f,'a) datatype * 'b type ('z,'a) affine = { constant : 'z ; factors : ('z * 'a) list } @@ -165,6 +166,7 @@ module Var : Variable type term + type bind (** {3 Variables} *) @@ -172,6 +174,7 @@ type tau = (Field.t,ADT.t) datatype type signature = (Field.t,ADT.t) funtype + module Tau : Data with type t = tau module Vars : Idxset.S with type elt = var module Vmap : Idxmap.S with type key = var @@ -186,11 +189,12 @@ val alpha : pool -> var -> var val tau_of_var : var -> tau + val sort_of_var : var -> sort val base_of_var : var -> string (** {3 Terms} *) - type 'a expression = (Z.t,Field.t,Fun.t,var,'a) term_repr + type 'a expression = (Z.t,Field.t,ADT.t,Fun.t,var,bind,'a) term_repr type repr = term expression type path = int list (** position of a subterm in a term. *) @@ -260,25 +264,34 @@ val e_exists : var list -> term -> term val e_lambda : var list -> term -> term val e_bind : binder -> var -> term -> term - val e_subst : ?pool:pool -> var -> term -> term -> term - val e_apply : ?pool:pool -> term -> term list -> term + val e_apply : term -> term list -> term - (** {3 Recursion Scheme} *) + (** {3 Generalized Substitutions} *) + + type sigma + val sigma : unit -> sigma - val r_map : ('a -> term) -> 'a expression -> term - (** @raise Invalid_argument on Bind constructor *) + val e_subst : ?sigma:sigma -> (term -> term) -> term -> term - val e_map : (term -> term) -> term -> term - (** @raise Invalid_argument on Bind constructor *) + (** {3 Localy Nameless Representation} *) + + val lc_bind : var -> term -> bind (** Close [x] as a new bound variable *) + val lc_open : var -> bind -> term (** Instanciate top bound variable *) + val lc_closed : term -> bool + val lc_closed_at : int -> term -> bool + val lc_vars : term -> Bvars.t + val lc_repr : bind -> term + + (** {3 Recursion Scheme} *) - val e_iter : (term -> unit) -> term -> unit - (** Also goes into Bind constructor *) + val e_map : pool -> (term -> term) -> term -> term + val e_iter : pool -> (term -> unit) -> term -> unit - val f_map : (Vars.t -> term -> term) -> Vars.t -> term -> term - (** Pass the bound variables in context *) + val f_map : (int -> term -> term) -> int -> term -> term + val f_iter : (int -> term -> unit) -> int -> term -> unit - val f_iter : (Vars.t -> term -> unit) -> Vars.t -> term -> unit - (** Pass the bound variables in context *) + val lc_map : (term -> term) -> term -> term + val lc_iter : (term -> unit) -> term -> unit (** {3 Support for Builtins} *) @@ -353,6 +366,7 @@ val pp_rid : Format.formatter -> t -> unit (** head symbol with children id's *) val pp_repr : Format.formatter -> repr -> unit (** head symbol with children id's *) + module Term : Symbol with type t = term module Tset : Idxset.S with type elt = term module Tmap : Idxmap.S with type key = term @@ -361,7 +375,6 @@ val shared : ?shared:(term -> bool) -> ?shareable:(term -> bool) -> - ?closed:Vars.t -> term list -> term list (** Computes the sub-terms that appear several times. [shared marked linked e] returns the shared subterms of [e]. @@ -372,7 +385,6 @@ The traversal is controled by two optional arguments: - [atomic] those terms are not traversed (considered as atomic) - [shareable] those terms that can be shared (all by default) - - [closed] free variables of [t] authorized in sub-terms *) (** Low-level shared primitives: [shared] is actually a combination of @@ -384,7 +396,6 @@ val marks : ?shared:(term -> bool) -> ?shareable:(term -> bool) -> - ?closed:Vars.t -> unit -> marks val mark : marks -> term -> unit val defs : marks -> term list diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/Makefile frama-c-20150201+sodium+dfsg/src/wp/qed/src/Makefile --- frama-c-20140301+neon+dfsg/src/wp/qed/src/Makefile 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/Makefile 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of WP plug-in of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat a l'energie atomique et aux energies # # alternatives) # # # @@ -88,13 +88,14 @@ distclean:: rm -f ../bin/Qed.* +OPTML= -annot -w PSUZ+7-3 -warn-error PSUZ+7-3 INCLUDES= OPTCMI= -OPTCMO= -annot -w PSUZ+7 -warn-error PSUZ+7 +OPTCMO= ifeq ($(PACK),no) -OPTCMX= -annot -w PSUZ+7 -warn-error PSUZ+7 -for-pack Qed +OPTCMX= -for-pack Qed else -OPTCMX= -annot -w PSUZ+7 -warn-error PSUZ+7 -for-pack $(PACK).Qed +OPTCMX= -for-pack $(PACK).Qed endif include MakeOcaml diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/Makefile.src frama-c-20150201+sodium+dfsg/src/wp/qed/src/Makefile.src --- frama-c-20140301+neon+dfsg/src/wp/qed/src/Makefile.src 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/Makefile.src 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of WP plug-in of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat a l'energie atomique et aux energies # # alternatives) # # # @@ -23,13 +23,13 @@ # Shared with WP's Makefile in order to facilitate recompilation of Qed # from Frama-C -QED_LIB_ML = r numbers hcons cache intmap intset idxset idxmap \ +QED_LIB_ML = r bvars numbers hcons cache intmap intset idxset idxmap \ listset listmap mergeset mergemap collection \ - partition relation sigma plib topology + partition relation plib topology QED_SRC_ML = kind pool term pretty \ - linker export export_coq export_whycore export_why3 export_altergo \ - pattern simplify + export export_coq export_whycore export_why3 export_altergo \ + pattern QED_SRC_MLI = arith logic engine diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/MakeOcaml frama-c-20150201+sodium+dfsg/src/wp/qed/src/MakeOcaml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/MakeOcaml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/MakeOcaml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of WP plug-in of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat a l'energie atomique et aux energies # # alternatives) # # # @@ -32,13 +32,13 @@ .SUFFIXES: .ml .mli .mll .mly .cmo .cmi .cmx .ml.cmo: - $(OCAMLC) $(OPTCMO) -c $(INCLUDES) $< + $(OCAMLC) $(OPTML) $(OPTCMO) -c $(INCLUDES) $< .mli.cmi: - $(OCAMLC) $(OPTCMI) -c $(INCLUDES) $< + $(OCAMLC) $(OPTML) $(OPTCMI) -c $(INCLUDES) $< .ml.cmx: - $(OCAMLOPT) $(OPTCMX) -c $(INCLUDES) $< + $(OCAMLOPT) $(OPTML) $(OPTCMX) -c $(INCLUDES) $< .mll.ml: @rm -f $@ @@ -52,16 +52,13 @@ ####################################################### -#OPTC=$(shell if which ocamlc.opt > /dev/null; then echo -n .opt; else echo -n ""; fi) OPTC?=.opt OCAMLC?=$(OCAMLROOT)ocamlc$(OPTC) OCAMLOPT?=$(OCAMLROOT)ocamlopt$(OPTC) -#OCAMLLEX?=$(OCAMLROOT)ocamllex$(OPTC) OCAMLLEX?=$(OCAMLROOT)ocamllex OCAMLYACC?=$(OCAMLROOT)ocamlyacc -OCAMLDOC?=$(OCAMLROOT)ocamldoc +OCAMLDOC?=$(OCAMLROOT)ocamldoc$(OPTC) OCAMLDEP?=$(OCAMLROOT)ocamldep OCAMLMKLIB?=$(OCAMLROOT)ocamlmklib -#OCAMLLIB=$(shell $(OCAMLC) -where) ####################################################### diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/mergemap.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/mergemap.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/mergemap.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/mergemap.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/mergemap.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/mergemap.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/mergemap.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/mergemap.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/mergeset.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/mergeset.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/mergeset.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/mergeset.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/mergeset.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/mergeset.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/mergeset.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/mergeset.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/numbers.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/numbers.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/numbers.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/numbers.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/numbers.mll frama-c-20150201+sodium+dfsg/src/wp/qed/src/numbers.mll --- frama-c-20140301+neon+dfsg/src/wp/qed/src/numbers.mll 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/numbers.mll 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/ocamldoc.css frama-c-20150201+sodium+dfsg/src/wp/qed/src/ocamldoc.css --- frama-c-20140301+neon+dfsg/src/wp/qed/src/ocamldoc.css 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/ocamldoc.css 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of WP plug-in of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat a l'energie atomique et aux energies */ /* alternatives) */ /* */ diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/partition.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/partition.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/partition.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/partition.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/partition.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/partition.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/partition.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/partition.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/pattern.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/pattern.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/pattern.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/pattern.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -80,7 +80,7 @@ let rec pretty fmt = function | Pvar k -> Format.fprintf fmt "#%d" k | Pguard(k,_) -> Format.fprintf fmt "#%d?" k - | Pint z -> T.Z.pretty fmt z + | Pint z -> Format.pp_print_string fmt (T.Z.to_string z) | Ptrue -> Format.fprintf fmt "true" | Pfalse -> Format.fprintf fmt "false" | Pfun(f,ps) -> Plib.pp_call_var (T.Fun.debug f) pretty fmt ps diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/pattern.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/pattern.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/pattern.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/pattern.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/plib.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/plib.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/plib.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/plib.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -159,11 +159,20 @@ replace 0 let regexp_arg_pos = Str.regexp "%\\([0-9]+\\)" + +let is_template p = + try let _ = Str.search_forward regexp_arg_pos p 0 in true + with Not_found -> false + let substitute_list print s fmt l = let args = Array.of_list l in let repl_fun fmt grp = let i = int_of_string grp in - print fmt args.(i-1) in + let v = try args.(i-1) with Invalid_argument _ -> + let msg = "Qed.Plib.substitute_list %" ^ string_of_int (i-1) in + raise (Invalid_argument msg) + in print fmt v + in global_substitute_fmt regexp_arg_pos repl_fun fmt s (** the regexp shouldn't match empty *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/plib.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/plib.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/plib.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/plib.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -77,6 +77,9 @@ val substitute_list : 'a printer -> string -> 'a list printer (** [substitute_list templ print_arg fmt l] prints in the formatter [fmt] the list [l] using the template [templ] and the printer [print_arg]. - The template use %[0-9]+ hole. + The template use [%[0-9]+] hole. *) +val is_template : string -> bool +(** Check whether the string contains [%[0-9]+] holes to be used + with [substitute_list]. *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/pool.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/pool.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/pool.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/pool.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/pool.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/pool.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/pool.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/pool.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/pretty.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/pretty.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/pretty.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/pretty.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -53,6 +53,15 @@ else Kind.pp_tau pp_tvarn Field.pretty ADT.pretty fmt t (* -------------------------------------------------------------------------- *) + (* --- Shareable --- *) + (* -------------------------------------------------------------------------- *) + + let shareable e = match T.repr e with + | And _ | Or _ | Not _ | Imply _ | Eq _ | Neq _ | Leq _ | Lt _ -> false + | Fun(f,_) -> (Fun.sort f <> Sprop && Fun.sort f <> Sbool) + | _ -> true + + (* -------------------------------------------------------------------------- *) (* --- Variables --- *) (* -------------------------------------------------------------------------- *) @@ -60,10 +69,10 @@ module Ids = Set.Make(String) type env = { + mutable bound : string Intmap.t ; (* bound var *) mutable named : string Tmap.t ; (* named terms *) mutable index : int Idx.t ; (* index names *) mutable known : Ids.t ; (* known names *) - mutable closed : Vars.t ; } (* -------------------------------------------------------------------------- *) @@ -71,97 +80,90 @@ (* -------------------------------------------------------------------------- *) let empty = { - named=Tmap.empty ; - index=Idx.empty ; - known=Ids.empty ; - closed=Vars.empty ; + bound = Intmap.empty ; + named = Tmap.empty ; + index = Idx.empty ; + known = Ids.empty ; } - let closed vars = - { - named=Tmap.empty ; - index=Idx.empty ; - known=Vars.fold - (fun x s -> Ids.add (Plib.to_string Var.pretty x) s) - vars Ids.empty ; - closed=vars ; - } - let copy env = { + bound = env.bound ; named = env.named ; index = env.index ; known = env.known ; - closed = env.closed ; } - let bind x t env = - let env = copy env in - env.named <- Tmap.add t x env.named ; - env.known <- Ids.add x env.known ; - env - - (* -------------------------------------------------------------------------- *) - (* --- Shareable --- *) - (* -------------------------------------------------------------------------- *) - - let shareable e = match T.repr e with - | And _ | Or _ | Not _ | Imply _ | Eq _ | Neq _ | Leq _ | Lt _ -> false - | _ -> true - (* -------------------------------------------------------------------------- *) (* --- Fresh --- *) (* -------------------------------------------------------------------------- *) - let freshid env term ?id base = + let freshname env base = let rec scan env base k = let a = Printf.sprintf "%s_%d" base k in if Ids.mem a env.known then scan env base (succ k) else (env.index <- Idx.add base (succ k) env.index ; a) in - let freshname env base = scan env base - (try Idx.find base env.index with Not_found -> 0) in - let x = - match id with - | None -> freshname env base - | Some a -> if Ids.mem a env.known then freshname env base else a - in - env.known <- Ids.add x env.known ; - env.named <- Tmap.add term x env.named ; x + scan env base + (try Idx.find base env.index with Not_found -> 0) + + let known env xs = + let env = copy env in + Vars.iter + (fun x -> + let x = Plib.to_string Var.pretty x in + env.known <- Ids.add x env.known + ) xs ; env let marks env = T.marks ~shareable - ~shared:(fun t -> Tmap.mem t env.named) - ~closed:env.closed () + ~shared:(fun t -> Tmap.mem t env.named) () + + let bind x t env = + let env = copy env in + env.named <- Tmap.add t x env.named ; + env.known <- Ids.add x env.known ; + env let fresh env t = let env = copy env in - let x = freshid env t (T.basename t) in + let x = freshname env (T.basename t) in + env.named <- Tmap.add t x env.named ; + env.known <- Ids.add x env.known ; x , env + let bind_var env k t = + let x = freshname env (Tau.basename t) in + env.known <- Ids.add x env.known ; + env.bound <- Intmap.add k x env.bound ; x + + let find_var env k = + try Intmap.find k env.bound + with Not_found -> Printf.sprintf "#%d" k + (* -------------------------------------------------------------------------- *) - (* --- Bunch of Quantifier --- *) + (* --- Groups of Quantifiers --- *) (* -------------------------------------------------------------------------- *) - module TauMap = Map.Make - (struct - type t = T.tau - let compare = Kind.compare_tau T.Field.compare T.ADT.compare - end) + module TauMap = Map.Make(T.Tau) + + type group = binder * int list TauMap.t + + let group_var t k = TauMap.add t [k] TauMap.empty - let group_add m x = - let t = tau_of_var x in - let xs = try TauMap.find t m with Not_found -> [] in - TauMap.add t (x::xs) m + let group_add t k tks = + let ks = k :: try TauMap.find t tks with Not_found -> [] in + TauMap.add t ks tks - let rec group_binders = function + let rec group_binders k = function | [] -> [] - | (q,x)::qxs -> - let m = TauMap.add (tau_of_var x) [x] TauMap.empty in - group_binder q m qxs - - and group_binder q m = function - | (q0,y)::qxs when q0 = q -> - group_binder q (group_add m y) qxs - | qxs -> (q,m)::group_binders qxs + | (q,t)::qts -> group_collect q (succ k) (group_var t k) qts + + and group_collect q k kts = function + | [] -> [q,kts] + | (q0,t) :: qts -> + if q = q0 && q0 <> Lambda then + group_collect q (succ k) (group_add t k kts) qts + else + (q,kts) :: group_collect q0 (succ k) (group_var t k) qts (* -------------------------------------------------------------------------- *) (* --- Output Form --- *) @@ -179,9 +181,10 @@ | Closure of term * term list | Access of term * term | Update of term * term * term - | Abstraction of ( (binder * var) list * term ) | Record of field list | GetField of term * Field.t + | Abstraction of (binder * tau) list * term + | Bind of int and field = | With of term @@ -195,12 +198,13 @@ let rec abstraction qxs e = match T.repr e with - | Bind(q,x,t) -> abstraction ((q,x)::qxs) t + | Logic.Bind(q,x,t) -> abstraction ((q,x)::qxs) (lc_repr t) | _ -> Abstraction( List.rev qxs , e ) let out e = match T.repr e with - | Var x -> Atom( Plib.to_string Var.pretty x ) + | Bvar(k,_) -> Bind k + | Fvar x -> Atom( Plib.to_string Var.pretty x ) | True -> Atom "true" | False -> Atom "false" | Kint z -> Atom (Z.to_string z) @@ -227,7 +231,7 @@ | If(c,a,b) -> Cond(c,a,b) | Aget(a,b) -> Access(a,b) | Aset(a,b,c) -> Update(a,b,c) - | Bind(q,x,t) -> abstraction [q,x] t + | Logic.Bind(q,x,e) -> abstraction [q,x] (lc_repr e) | Rget(e,f) -> GetField(e,f) | Rdef fvs -> Record begin @@ -248,6 +252,7 @@ pp_atom_out env fmt (named_out env e) and pp_atom_out env fmt = function + | Bind k -> pp_print_string fmt (find_var env k) | Atom x -> pp_print_string fmt x | Call(f,es) -> pp_call env fmt f es | Sum es -> fprintf fmt "@[(%a)@]" (pp_sum false env) es @@ -257,7 +262,7 @@ | Binop op -> fprintf fmt "@[(%a)@]" (pp_binop env) op | Cond c -> fprintf fmt "@[(%a)@]" (pp_cond env) c | Closure(e,es) -> pp_closure env fmt e es - | Abstraction abs -> fprintf fmt "@[(%a)@]" (pp_abstraction env) abs + | Abstraction(qts,abs) -> fprintf fmt "@[(%t)@]" (pp_abstraction env qts abs) | Access(a,b) -> fprintf fmt "@[%a@,[%a]@]" (pp_atom env) a (pp_free env) b | Update(a,b,c) -> fprintf fmt "@[%a@,[%a@,->%a]@]" @@ -266,6 +271,7 @@ | Record fs -> pp_fields env fmt fs and pp_free_out env fmt = function + | Bind k -> pp_print_string fmt (find_var env k) | Atom x -> pp_print_string fmt x | Call(f,es) -> pp_call env fmt f es | Sum es -> fprintf fmt "@[%a@]" (pp_sum true env) es @@ -275,7 +281,7 @@ | Binop op -> fprintf fmt "@[%a@]" (pp_binop env) op | Cond c -> fprintf fmt "@[%a@]" (pp_cond env) c | Closure(e,es) -> pp_closure env fmt e es - | Abstraction abs -> fprintf fmt "@[%a@]" (pp_abstraction env) abs + | Abstraction(qts,abs) -> fprintf fmt "@[%t@]" (pp_abstraction env qts abs) | (Access _ | Update _ | Record _ | GetField _) as a -> pp_atom_out env fmt a and pp_fields (env:env) (fmt:formatter) fs = @@ -375,31 +381,32 @@ (* --- Abstraction --- *) (* -------------------------------------------------------------------------- *) - and pp_abstraction (env:env) (fmt:formatter) (qxs,t) = - let groups = group_binders qxs in + and pp_abstraction (env:env) qts abs (fmt:formatter) = + let env = copy env in + let groups = group_binders 0 qts in + let size = List.length qts in + let last = Bvars.order (lc_vars abs) + size - 1 in List.iter (fun (q,m) -> match q with - | Forall -> fprintf fmt "@[forall %a.@]@ " (pp_group env) m - | Exists -> fprintf fmt "@[exists %a.@]@ " (pp_group env) m - | Lambda -> fprintf fmt "@[fun %a ->@]@ " (pp_group env) m + | Forall -> fprintf fmt "@[forall %a.@]@ " (pp_group env last) m + | Exists -> fprintf fmt "@[exists %a.@]@ " (pp_group env last) m + | Lambda -> fprintf fmt "@[fun %a ->@]@ " (pp_group env last) m ) groups ; - pp_share env fmt t + pp_share env fmt abs - and pp_group (env:env) (fmt:formatter) m = + and pp_group (env:env) (last:int) (fmt:formatter) m = let sep = ref false in TauMap.iter - (fun t xs -> + (fun t ks -> if !sep then fprintf fmt ",@," ; Plib.iteri - (fun idx x -> - let id = Plib.to_string Var.pretty x in - let a = freshid env (T.e_var x) ~id (Var.basename x) in - env.closed <- Vars.add x env.closed ; + (fun idx k -> + let x = bind_var env (last - k) t in match idx with - | Isingle | Ifirst -> pp_print_string fmt a - | Imiddle | Ilast -> fprintf fmt ",@,%s" a - ) (List.rev xs) ; + | Isingle | Ifirst -> pp_print_string fmt x + | Imiddle | Ilast -> fprintf fmt ",@,%s" x + ) (List.rev ks) ; fprintf fmt ":%a" pp_tau t ; sep := true ; ) m @@ -411,16 +418,15 @@ and pp_share (env:env) (fmt:formatter) t = begin fprintf fmt "@[" ; - let ts = T.shared ~shareable - ~shared:(fun t -> Tmap.mem t env.named) - ~closed:env.closed [t] - in - List.iter - (fun t -> - let e0 = copy env in - let x = freshid env t (Kind.basename (T.sort t)) in - fprintf fmt "@[let %s =@ %a in@]@ " x (pp_atom e0) t - ) ts ; + let shared t = Tmap.mem t env.named in + let ts = T.shared ~shareable ~shared [t] in + let env = + List.fold_left + (fun env t -> + let x,env_x = fresh env t in + fprintf fmt "@[let %s =@ %a in@]@ " x (pp_atom env) t ; + env_x) + env ts in pp_free env fmt t ; fprintf fmt "@]" ; end diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/pretty.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/pretty.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/pretty.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/pretty.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -34,10 +34,10 @@ type env val empty : env - val closed : Vars.t -> env val marks : env -> marks - val bind : string -> term -> env -> env + val known : env -> Vars.t -> env val fresh : env -> term -> string * env + val bind : string -> term -> env -> env val pp_tau : formatter -> tau -> unit val pp_term : env -> formatter -> term -> unit diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/relation.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/relation.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/relation.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/relation.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/relation.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/relation.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/relation.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/relation.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/r.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/r.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/r.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/r.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/r.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/r.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/r.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/r.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/sigma.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/sigma.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/sigma.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/sigma.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,138 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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 - -module type S = -sig - type t - type term - type explain - exception Contradiction of explain - val empty : t - val assume : ?explain:explain -> term -> t -> t - val rewrite : ?explain:explain -> term -> term -> t -> t - val reduce : t -> term -> term * explain - val is_true : t -> term -> explain option - val is_false : t -> term -> explain option - val iter : (term -> term -> explain -> unit) -> t -> unit -end - -module type Explain = -sig - type t - val bot : t - val cup : t -> t -> t -end - -module Make(T : Logic.Term)(E : Explain) = -struct - - type term = T.term - type explain = E.t - exception Contradiction of explain - - open T - - type t = { - domain : Vars.t ; - def : (term * explain) Tmap.t ; (* core facts *) - mutable mem : (term * explain) Tmap.t ; (* memoization *) - } - - let empty = { - domain = Vars.empty ; - def = Tmap.empty ; - mem = Tmap.empty ; - } - - let iter f s = Tmap.iter (fun a (b,e) -> f a b e) s.def - - let rec apply s xs a = - let ys = T.vars a in - if Vars.intersect xs ys - then (* Filter out bound variables *) apply_sub s xs a - else - if not (Vars.intersect s.domain ys) - then (* Filter out-of-scope *) a , E.bot - else - (* Memoization *) - try Tmap.find a s.mem - with Not_found -> - let w = apply_sub s xs a in - s.mem <- Tmap.add a w s.mem ; w - - and apply_sub s xs a = - let w = ref E.bot in - let b = T.f_map - (fun xs a -> let (a,e) = apply s xs a in w := E.cup !w e ; a) xs a in - b , !w - - let reduce s a = apply s Vars.empty a - - let is_true s a = - let r,e = reduce s a in if r == e_true then Some e else None - - let is_false s a = - let r,e = reduce s a in if r == e_false then Some e else None - - let add_def e a b s = - try - let b0,e0 = Tmap.find a s.mem in - match T.are_equal b b0 with - | No -> raise (Contradiction(E.cup e0 e)) - | Yes -> s (* nothing to do *) - | Maybe -> raise Not_found - with Not_found -> - let def = Tmap.add a (b,e) s.def in - { domain = Vars.union (T.vars a) s.domain ; mem = def ; def } - - let add_lit e a s = add_def e a e_true (add_def e (e_not a) e_false s) - - let rec add_pred e p s = match T.repr p with - | True -> s - | False -> raise (Contradiction e) - | And ps -> add_all e ps s - | Fun _ | Not _ | Neq _ -> add_lit e p s - | Lt(x,y) -> add_lit e p (add_lit e (e_leq x y) (add_lit e (e_neq x y) s)) - | Leq(x,y) -> - begin - match is_true s (e_leq y x) with - | Some e0 -> add_pred (E.cup e e0) (e_eq x y) s - | None -> add_lit e p s - end - | Eq(x,y) -> - begin - match T.is_closed x , T.is_closed y with - | true , false -> add_def e y x s - | false , true -> add_def e x y s - | _ -> add_lit e p s - end - | _ -> s - - and add_all e ps s = match ps with - | [] -> s | p::ps -> add_all e ps (add_pred e p s) - - let assume ?(explain=E.bot) p s = add_pred explain p s - let rewrite ?(explain=E.bot) a b s = add_def explain a b s - -end diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/sigma.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/sigma.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/sigma.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/sigma.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -(** Generalized Substitutions *) - -module type S = -sig - type t (** Substitution *) - type term (** Terms *) - type explain (** Explanations *) - - exception Contradiction of explain - - val empty : t - - val assume : ?explain:explain -> term -> t -> t - (** Raises [Contradiction]. *) - - val rewrite : ?explain:explain -> term -> term -> t -> t - (** Raises [Contradiction]. *) - - val reduce : t -> term -> term * explain - (** Produces a normalized form, with its explanation. *) - - val is_true : t -> term -> explain option - (** Checks whether [reduce] returns [e_true] and returns the explanation. *) - - val is_false : t -> term -> explain option - (** Checks whether [reduce] returns [e_false] and returns the explanation. *) - - val iter : (term -> term -> explain -> unit) -> t -> unit - (** Iterates over all core equalities. *) - -end - -(** Type of Explanations *) -module type Explain = -sig - type t - val bot : t - val cup : t -> t -> t -end - -(** Substitution Factory *) -module Make(T : Logic.Term)(E : Explain) : S - with type term = T.term and type explain = E.t diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/simplify.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/simplify.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/simplify.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/simplify.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,226 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -(* -------------------------------------------------------------------------- *) -(* --- Solver infrastructure for Qed --- *) -(* -------------------------------------------------------------------------- *) - -open Logic - -exception Absurd -exception Unknown - -module Make(T : Logic.Term) = -struct - - open T - - type var = T.term - type exp = var T.expression - - module Vmap = Tmap - module Vset = Tset - - let vtrue = T.e_true - let vfalse = T.e_false - - let map f r = match r with - | Bind _ -> r - | _ -> T.repr (T.r_map f r) - - let vmap eq map merge m = - Tmap.fold - (fun x a m -> - let y = eq x in - let b = map a in - let b = try merge b (Tmap.find y m) with Not_found -> b in - Tmap.add y b m - ) m Vmap.empty - - class type context = - object - method build : exp -> var - method query : exp -> maybe - method infer : exp -> unit - end - - class type theory = - object - method copy : theory - method define : var -> exp -> unit - method assume : exp -> bool -> unit - method rewrite : Vset.t -> (var -> var) -> unit - method resolve : context -> exp -> var - end - - type state = { - theories : theory list ; - mutable variables : Tset.t ; - mutable merged : Tset.t ; - mutable equalities : term Tmap.t ; - mutable hypotheses : Tset.t ; - mutable queries : Tset.t ; - } - - let rec find s a = - try - let a0 = Tmap.find a s.equalities in - let a1 = find s a0 in - if a0 != a1 then s.equalities <- Tmap.add a a1 s.equalities ; a1 - with Not_found -> a - - let rec register s a = - match T.repr a with - | True | False | Kint _ | Kreal _ | Var _ | Bind _ -> a - | _ -> - if Tset.mem a s.variables then find s a - else - begin - (* a is nor defined, nor in lookup *) - let r = T.repr (find s (T.e_map (register s) a)) in - (* a and r are generally (==) *) - List.iter (fun th -> th#define a r) s.theories ; - s.variables <- Tset.add a s.variables ; a - end - - let rewrite s a b = - let a = find s a in - let b = find s b in - begin - s.equalities <- Tmap.add a b s.equalities ; - s.merged <- Tset.add a s.merged ; - end - - let propagate s = - begin - let hs = s.hypotheses in - s.hypotheses <- Tset.empty ; - Tset.iter - (fun h -> - rewrite s h e_true ; - rewrite s (e_not h) e_false ; - let v,l = T.literal h in - let e = T.repr l in - List.iter (fun th -> th#assume e v) s.theories ; - ) hs ; - let domain = s.merged in - s.merged <- Tset.empty ; - List.iter - (fun th -> th#rewrite domain (find s)) - s.theories ; - end - - let create ths = { - theories = ths ; - variables = Tset.empty ; - merged = Tset.empty ; - equalities = Tmap.empty ; - hypotheses = Tset.empty ; - queries = Tset.empty ; - } - - let copy s = { s with theories = List.map (fun th -> th#copy) s.theories } - - let rec hyps s p = - match T.repr p with - | And ps -> List.iter (hyps s) ps - | True -> () - | False -> raise Absurd - | Eq(a,b) -> - let a = register s a in - let b = register s b in - let cmp = T.compare a b in - begin - if cmp < 0 then rewrite s b a ; - if cmp > 0 then rewrite s a b ; - end - | _ -> - let p = register s p in - s.hypotheses <- Tset.add p s.hypotheses - - let assume s p = hyps s p ; propagate s - - class local s = - object - - method build = function - | Bind(q,x,p) -> e_bind q x p - | r -> find s (r_map (find s) r) - - method query r = - let e = find s (T.e_repr r) in - match T.repr e with - | True -> Logic.Yes - | False -> Logic.No - | _ -> s.queries <- Tset.add e s.queries ; Logic.Maybe - - method infer r = hyps s (T.e_repr r) - - end - - let resolve s e = - let c = new local s in - List.iter - (fun th -> - try - let r = th#resolve c (T.repr e) in - rewrite s e r ; - with Unknown -> () - ) s.theories ; - find s e - - let fixpoint s = - begin - let qs = s.queries in - s.queries <- Tset.empty ; - Tset.iter - (fun q -> - let q' = resolve s q in - if not (T.is_primitive q') then - s.queries <- Tset.add q' s.queries ; - ) qs ; - Tset.equal qs s.queries ; - end - - let rec query s a = - if not (T.is_primitive a) && not (Tset.mem a s.queries) then - begin - s.queries <- Tset.add a s.queries ; - T.e_iter (query s) a ; - end - - let rec rebuild s m xs e = - try Tmap.find e !m - with Not_found -> - let m = match T.repr e with Bind _ -> ref Tmap.empty | _ -> m in - let r0 = T.f_map (rebuild s m) xs e in - let r1 = if Vars.intersect (T.vars e) xs then r0 else find s r0 in - m := Tmap.add e r1 !m ; r1 - - let simplify s ?(timeout=128) e = - let e = register s e in - query s e ; - let n = ref timeout in - while !n > 0 && not (fixpoint s) do decr n done ; - rebuild s (ref Tmap.empty) Vars.empty e - -end diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/simplify.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/simplify.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/simplify.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/simplify.mli 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2014 *) -(* 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). *) -(* *) -(**************************************************************************) - -(* -------------------------------------------------------------------------- *) -(* --- Solver infrastructure for Qed --- *) -(* -------------------------------------------------------------------------- *) - -open Logic - -exception Absurd -exception Unknown - -module Make(T : Logic.Term) : -sig - - type var - type exp = var T.expression - - module Vset : Idxset.S with type elt = var - module Vmap : Idxmap.S with type key = var - - val vtrue : var - val vfalse : var - - val map : (var -> var) -> exp -> exp - val vmap : - (var -> var) -> ('a -> 'b) -> ('b -> 'b -> 'b) -> - 'a Vmap.t -> 'b Vmap.t - - class type context = - object - method build : exp -> var - method query : exp -> maybe - method infer : exp -> unit - end - - class type theory = - object - method copy : theory - (** Never fails. *) - - method define : var -> exp -> unit - (** May raise [Absurd]. *) - - method assume : exp -> bool -> unit - (** May raise [Absurd]. *) - - method rewrite : Vset.t -> (var -> var) -> unit - (** May raise [Absurd]. *) - - method resolve : context -> exp -> var - (** May raise [Absurd] or [Unknown]. *) - end - - type state - - val create : theory list -> state - val copy : state -> state - - val assume : state -> T.term -> unit - (** May raise [Absurd] when the {i augmented} state is inconsistent. *) - - val simplify : state -> ?timeout:int -> T.term -> T.term - (** May raise [Absurd] when the state is inconsistent. *) - -end diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/term.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/term.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/term.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/term.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -42,6 +42,8 @@ type signature = (Field.t,ADT.t) Logic.funtype type path = int list + module Tau = Kind.MakeTau(Field)(ADT) + module POOL = Pool.Make (struct type t = tau @@ -56,17 +58,20 @@ module Vars = Idxset.Make(VID) module Vmap = Idxmap.Make(VID) - type 'a expression = (Z.t,Field.t,Fun.t,var,'a) term_repr - type term = { id : int ; hash : int ; size : int ; vars : Vars.t ; + bind : Bvars.t ; sort : sort ; repr : repr ; } - and repr = term expression + and repr = (Z.t,Field.t,ADT.t,Fun.t,var,term,term) term_repr + + type bind = term + + type 'a expression = (Z.t,Field.t,ADT.t,Fun.t,var,bind,'a) term_repr (* ------------------------------------------------------------------------ *) (* --- Term Set,Map and Vars --- *) @@ -107,23 +112,9 @@ (* -------------------------------------------------------------------------- *) let tau_of_var x = x.vtau + let sort_of_var x = Kind.of_tau x.vtau let base_of_var x = x.vbase - let base_of_tau = function - | Int -> "i" - | Real -> "r" - | Prop -> "p" - | Bool -> "p" - | Data(a,_) -> ADT.basename a - | Array _ -> "t" - | Tvar 1 -> "a" - | Tvar 2 -> "b" - | Tvar 3 -> "c" - | Tvar 4 -> "d" - | Tvar 5 -> "e" - | Tvar _ -> "f" - | Record _ -> "r" - type pool = POOL.pool let pool = POOL.create @@ -132,8 +123,9 @@ let add_term pool t = Vars.iter (POOL.add pool) t.vars let fresh pool ?basename tau = - let base = match basename with Some base -> base | None -> base_of_tau tau in - POOL.fresh pool base tau + let base = match basename with + | Some base -> base | None -> Tau.basename tau + in POOL.fresh pool base tau let alpha pool x = POOL.alpha pool x @@ -168,10 +160,11 @@ | Rdef fxs -> hash_list (fun (f,x) -> hash_pair (Field.hash f) x.hash) 0 fxs | Rget(e,f) -> hash_pair e.hash (Field.hash f) - | Var x -> Var.hash x - | Bind(Forall,x,e) -> 1 + 7 * Var.hash x + 31 * e.hash - | Bind(Exists,x,e) -> 2 + 7 * Var.hash x + 31 * e.hash - | Bind(Lambda,x,e) -> 3 + 7 * Var.hash x + 31 * e.hash + | Fvar x -> Var.hash x + | Bvar(k,_) -> k + | Bind(Forall,_,e) -> 1 + 31 * e.hash + | Bind(Exists,_,e) -> 2 + 31 * e.hash + | Bind(Lambda,_,e) -> 3 + 31 * e.hash | Apply(a,xs) -> hash_list hash a.hash xs let hash_head = function @@ -194,13 +187,14 @@ | Imply _ -> 16 | If _ -> 17 | Fun _ -> 18 - | Var _ -> 19 - | Bind _ -> 20 - | Apply _ -> 21 - | Aset _ -> 22 - | Aget _ -> 23 - | Rdef _ -> 24 - | Rget _ -> 25 + | Fvar _ -> 19 + | Bvar _ -> 20 + | Bind _ -> 21 + | Apply _ -> 22 + | Aset _ -> 23 + | Aget _ -> 24 + | Rdef _ -> 25 + | Rget _ -> 26 let hash_repr t = hash_head t + 31 * hash_subterms t @@ -227,8 +221,9 @@ | If(e,a,b) , If(e',a',b') | Aset(e,a,b) , Aset(e',a',b') -> e==e' && a==a' && b==b' | Fun(f,xs) , Fun(g,ys) -> Fun.equal f g && eq_list xs ys - | Var x , Var y -> Var.equal x y - | Bind(q,x,e) , Bind(q',x',e') -> q=q' && Var.equal x x' && e==e' + | Fvar x , Fvar y -> Var.equal x y + | Bvar(k,t) , Bvar(k',t') -> k = k' && Tau.equal t t' + | Bind(q,t,e) , Bind(q',t',e') -> q=q' && Tau.equal t t' && e==e' | Apply(x,ys) , Apply(x',ys') -> x==x' && eq_list ys ys' | Rget(x,f) , Rget(x',g) -> x==x' && Field.equal f g | Rdef fxs , Rdef gys -> @@ -238,6 +233,7 @@ let sort x = x.sort let vars x = x.vars + let bvars x = x.bind let vars_repr = function | True | False | Kint _ | Kreal _ -> Vars.empty @@ -249,10 +245,26 @@ | Imply(xs,a) | Apply(a,xs) -> Hcons.fold_list Vars.union vars a.vars xs | If(e,a,b) | Aset(e,a,b) -> Vars.union e.vars (Vars.union a.vars b.vars) - | Var x -> Vars.singleton x - | Bind(_,x,e) -> Vars.remove x e.vars + | Fvar x -> Vars.singleton x + | Bvar _ -> Vars.empty + | Bind(_,_,e) -> e.vars | Rdef fxs -> List.fold_left (fun s (_,x) -> Vars.union s x.vars) Vars.empty fxs + let bind_repr = function + | True | False | Kint _ | Kreal _ -> Bvars.empty + | Times(_,x) | Not x | Rget(x,_) -> x.bind + | Add xs | Mul xs | And xs | Or xs | Fun(_,xs) -> + Hcons.fold_list Bvars.union (fun x -> x.bind) Bvars.empty xs + | Div(x,y) | Mod(x,y) | Eq(x,y) | Neq(x,y) | Leq(x,y) | Lt(x,y) | Aget(x,y) -> + Bvars.union x.bind y.bind + | Imply(xs,a) | Apply(a,xs) -> + Hcons.fold_list Bvars.union bvars a.bind xs + | If(e,a,b) | Aset(e,a,b) -> Bvars.union e.bind (Bvars.union a.bind b.bind) + | Bvar(k,_) -> Bvars.singleton k + | Fvar _ -> Bvars.empty + | Bind(_,_,e) -> Bvars.bind e.bind + | Rdef fxs -> List.fold_left (fun s (_,x) -> Bvars.union s x.bind) Bvars.empty fxs + let sort_repr = function | True | False -> Sbool | Kint _ -> Sint @@ -272,7 +284,8 @@ | Eq(x,y) | Neq(x,y) -> Kind.merge x.sort y.sort | Apply(x,_) -> x.sort | If(_,a,b) -> Kind.merge a.sort b.sort - | Var x -> Kind.of_tau x.vtau + | Fvar x -> Kind.of_tau x.vtau + | Bvar(_,t) -> Kind.of_tau t | Bind((Forall|Exists),_,_) -> Sprop | Bind(Lambda,_,e) -> e.sort @@ -286,7 +299,7 @@ let size_repr = function | True | False | Kint _ -> 0 - | Var _ | Kreal _ -> 1 + | Fvar _ | Bvar _ | Kreal _ -> 1 | Times(_,x) -> succ x.size | Add xs | Mul xs | And xs | Or xs -> size_list 1 0 xs | Imply(hs,p) -> size_list 1 p.size hs @@ -335,10 +348,13 @@ | Kreal _ , _ -> (-1) | _ , Kreal _ -> 1 - | Var x , Var y -> Var.compare x y - | Var _ , _ -> (-1) - | _ , Var _ -> 1 - + | Fvar x , Fvar y -> Var.compare x y + | Fvar _ , _ -> (-1) + | _ , Fvar _ -> 1 + + | Bvar(k1,_) , Bvar(k2,_) -> k1 - k2 + | Bvar _ , _ -> (-1) + | _ , Bvar _ -> 1 | Eq(a1,b1) , Eq(a2,b2) | Neq(a1,b1) , Neq(a2,b2) @@ -435,11 +451,12 @@ | Apply _ , _ -> (-1) | _ , Apply _ -> 1 - | Bind(q1,x1,p1) , Bind(q2,x2,p2) -> + | Bind(q1,t1,p1) , Bind(q2,t2,p2) -> let cmp = cmp_bind q1 q2 in if cmp <> 0 then cmp else let cmp = phi p1 p2 in - if cmp <> 0 then cmp else Var.compare x1 x2 + if cmp <> 0 then cmp else + Tau.compare t1 t2 let rec compare a b = if a == b then 0 else @@ -550,27 +567,29 @@ let h = hash_repr r in (* Only [hash] and [repr] are significant for lookup in weak hmap *) let e0 = { - id=0 ; - hash=h ; - repr=r ; - size=0; - vars=Vars.empty ; - sort=Sdata ; + id = 0 ; + hash = h ; + repr = r ; + size = 0; + vars = Vars.empty ; + bind = Bvars.empty ; + sort = Sdata ; } in try W.find !state.weak e0 with Not_found -> - let k = !state.kid in - !state.kid <- succ k ; - assert (k <> -1) ; - let e = { - id = k ; - hash = h ; - repr = r ; - vars = vars_repr r ; - sort = sort_repr r ; - size = size_repr r ; - } - in W.add !state.weak e ; e + let k = !state.kid in + !state.kid <- succ k ; + assert (k <> -1) ; + let e = { + id = k ; + hash = h ; + repr = r ; + vars = vars_repr r ; + bind = bind_repr r ; + sort = sort_repr r ; + size = size_repr r ; + } + in W.add !state.weak e ; e (* -------------------------------------------------------------------------- *) (* --- Checker --- *) @@ -588,8 +607,8 @@ x let check_unit ~qed ~raw = - let p = insert (Eq(qed,raw)) in - Vars.fold (fun x p -> insert (Bind(Forall,x,p))) p.vars p + let p = insert (Eq(qed,raw)) in p + (* TODO:VAR: Vars.fold (fun x p -> insert (Bind(Forall,x,p))) p.vars p *) let iter_checks f = Tmap.iter @@ -607,7 +626,8 @@ let e_int n = insert (Kint (Z.of_int n)) let e_zint z = insert (Kint z) let e_real x = insert (Kreal x) - let e_var x = insert(Var x) + let e_var x = insert(Fvar x) + let e_bvar k t = insert(Bvar(k,t)) let c_div x y = insert (Div(x,y)) let c_mod x y = insert (Mod(x,y)) @@ -655,7 +675,9 @@ let c_apply a es = if es=[] then a else insert(Apply(a,es)) - let c_bind q x e = insert(Bind(q,x,e)) + let c_bind q t e = + if Bvars.closed e.bind then e else + insert(Bind(q,t,e)) let c_get m k = insert(Aget(m,k)) @@ -676,7 +698,7 @@ let r = base fx in List.iter (fun gy -> if base gy != r then raise Exit) gys ; r with Exit -> - insert(Rdef (List.sort compare_field fxs)) + insert(Rdef (List.sort compare_field fxs)) let insert _ = assert false (* [insert] should not be used afterwards *) @@ -684,7 +706,7 @@ [] -> e | n :: l -> let children = match e.repr with - | True | False | Kint _ | Kreal _ | Var _ -> [] + | True | False | Kint _ | Kreal _ | Bvar _ | Fvar _ -> [] | Times (n,e) -> [ e_zint n; e] | Add l | Mul l | And l | Or l | Fun (_,l) -> l | Div (e1,e2) | Mod (e1,e2) | Eq(e1,e2) | Neq(e1,e2) @@ -716,8 +738,8 @@ match a.repr with | Fun(f,_) -> (try simplify f with Not_found -> (match b.repr with - | Fun(g,_) when not (Fun.equal f g) -> simplify g - | _ -> raise Not_found)) + | Fun(g,_) when not (Fun.equal f g) -> simplify g + | _ -> raise Not_found)) | _ -> (match b.repr with | Fun(g,_) -> simplify g | _ -> raise Not_found) let builtin_eq a b = @@ -726,8 +748,8 @@ match a.repr with | Fun(f,_) -> (try simplify f a b with Not_found -> (match b.repr with - | Fun(g,_) when not (Fun.equal f g) -> simplify g b a - | _ -> raise Not_found)) + | Fun(g,_) when not (Fun.equal f g) -> simplify g b a + | _ -> raise Not_found)) | _ -> (match b.repr with | Fun(g,_) -> simplify g b a | _ -> raise Not_found) @@ -748,11 +770,11 @@ | NEQ -> !extern_not (builtin_eq a b) | LT -> !extern_not (builtin_leq b a) with Not_found -> - match cmp with - | EQ -> c_eq a b - | NEQ -> c_neq a b - | LT -> c_lt a b - | LEQ -> c_leq a b + match cmp with + | EQ -> c_eq a b + | NEQ -> c_neq a b + | LT -> c_lt a b + | LEQ -> c_leq a b let dispatch = function | NOT p -> !cached_not p.repr @@ -763,23 +785,23 @@ let distribute_if_over_operation op x y f a b = match a.repr, b.repr with | _, _ when true (* [PB] true: until alt-ergo 0.95.2 trouble *) - -> op x y + -> op x y | If(ac,a1,a2), _ when (is_primitive a1 || is_primitive a2) && is_primitive b - -> !extern_ite ac (f a1 b) (f a2 b) + -> !extern_ite ac (f a1 b) (f a2 b) | _, If(bc,b1,b2) when (is_primitive b1 || is_primitive b2) && is_primitive a - -> !extern_ite bc (f a b1) (f a b2) + -> !extern_ite bc (f a b1) (f a b2) | If(ac,a1,a2), If(bc,b1,b2) when ac == bc - -> !extern_ite ac (f a1 b1) (f a2 b2) + -> !extern_ite ac (f a1 b1) (f a2 b2) | If(ac,a1,a2), If(_,b1,b2) when (is_primitive a1 && is_primitive a2) && (is_primitive b1 || is_primitive b2) - -> !extern_ite ac (f a1 b) (f a2 b) + -> !extern_ite ac (f a1 b) (f a2 b) | If(_,a1,a2), If(bc,b1,b2) when (is_primitive a1 || is_primitive a2) && (is_primitive b1 && is_primitive b2) - -> !extern_ite bc (f a b1) (f a b2) + -> !extern_ite bc (f a b1) (f a b2) | _ -> op x y let c_builtin_fun f = function | x::[] as xs -> (match x.repr with - | If(c,a,b) -> !extern_ite c (!extern_fun f [a]) (!extern_fun f [b]) - | _ -> operation (FUN(f,xs))) + | If(c,a,b) -> !extern_ite c (!extern_fun f [a]) (!extern_fun f [b]) + | _ -> operation (FUN(f,xs))) | a::b::[] as xs -> distribute_if_over_operation (fun f xs -> operation (FUN(f,xs))) f xs (fun a b -> !extern_fun f [a;b]) a b | xs -> operation (FUN(f,xs)) let c_builtin_eq a b = distribute_if_over_operation (fun a b -> operation (CMP(EQ ,a,b))) a b !extern_eq a b @@ -928,12 +950,12 @@ let is_atomic e = match e.repr with - | True | False | Kint _ | Kreal _ | Var _ -> true + | True | False | Kint _ | Kreal _ | Fvar _ | Bvar _ -> true | _ -> false let is_simple e = match e.repr with - | True | False | Kint _ | Kreal _ | Var _ | Fun(_,[]) -> true + | True | False | Kint _ | Kreal _ | Fvar _ | Bvar _ | Fun(_,[]) -> true | _ -> false let is_closed e = Vars.is_empty e.vars @@ -1465,7 +1487,7 @@ let rebuild f e = match e.repr with - | Kint _ | Kreal _ | True | False -> e + | Kint _ | Kreal _ | Fvar _ | Bvar _ | True | False -> e | Not e -> e_not (f e) | Add xs -> addition (List.map f xs) | Mul xs -> multiplication (List.map f xs) @@ -1485,130 +1507,132 @@ | Aset(x,y,z) -> e_set (f x) (f y) (f z) | Rget(x,g) -> e_getfield (f x) g | Rdef gxs -> e_record (List.map (fun (g,x) -> g, f x) gxs) - | Var _ | Bind _ | Apply _ -> assert false + | Apply(e,es) -> c_apply (f e) (List.map f es) + | Bind(q,t,e) -> c_bind q t (f e) (* -------------------------------------------------------------------------- *) - (* --- Binders --- *) + (* --- Locally Memoized --- *) (* -------------------------------------------------------------------------- *) - exception Applies + type sigma = term Tmap.t ref - let e_bind q x a = - match q with - | (Forall | Exists) -> - if not (Vars.mem x a.vars) then a - else c_bind q x a - | Lambda -> - c_bind q x a + let sigma () = ref Tmap.empty - let rec e_forall xs a = - match xs with - | [] -> a - | x::xs -> - let a = e_forall xs a in - if Vars.mem x a.vars then c_bind Forall x a else a + let cache_find m e = Tmap.find e !m + let cache_bind m e v = m := Tmap.add e v !m ; v - let rec e_exists xs a = - match xs with - | [] -> a - | x::xs -> - let a = e_exists xs a in - if Vars.mem x a.vars then c_bind Exists x a else a + (* -------------------------------------------------------------------------- *) + (* --- Locally Nameless --- *) + (* -------------------------------------------------------------------------- *) - let rec e_lambda xs a = - match xs with - | [] -> a - | x::xs -> e_bind Lambda x (e_lambda xs a) + let rec lc_bind m x v e = + if not (Vars.mem x e.vars) then e else + match e.repr with + | Fvar y when Var.equal x y -> v + | _ -> + try cache_find m e + with Not_found -> cache_bind m e (rebuild (lc_bind m x v) e) + + let lc_bind x e = + let k = Bvars.order e.bind in + let t = tau_of_var x in + lc_bind (sigma ()) x (e_bvar k t) e + + let rec lc_open m k v e = + if not (Bvars.contains k e.bind) then e else + match e.repr with + | Bvar _ -> v + | _ -> + try cache_find m e + with Not_found -> cache_bind m e (rebuild (lc_open m k v) e) + + let lc_open x e = + let k = Bvars.order e.bind in + lc_open (sigma ()) k (e_var x) e + + let lc_closed e = Bvars.closed e.bind + let lc_closed_at n e = Bvars.closed_at n e.bind + let lc_vars e = e.bind + let lc_repr e = e + + (* -------------------------------------------------------------------------- *) + (* --- Binders --- *) + (* -------------------------------------------------------------------------- *) + + let e_bind q x a = + assert (lc_closed a) ; + let do_bind = + match q with Forall | Exists -> Vars.mem x a.vars | Lambda -> true in + if do_bind then c_bind q (tau_of_var x) (lc_bind x a) else a + + let rec bind_xs q xs e = + match xs with [] -> e | x::xs -> e_bind q x (bind_xs q xs e) + + let e_forall = bind_xs Forall + let e_exists = bind_xs Exists + let e_lambda = bind_xs Lambda (* -------------------------------------------------------------------------- *) (* --- Substitutions --- *) (* -------------------------------------------------------------------------- *) - (* substitution environment *) - type senv = { - pool : POOL.pool ; - mutable hmem : term Intmap.t ; (* memoization table *) - sigma : term Intmap.t ; (* substitution : var.id -> term *) - domain : Vars.t ; (* Domain(sigma) *) - codomain : Vars.t ; (* Codomain (sigma) *) - } + let r_apply = ref (fun _ _ _ -> assert false) - let senv pool = { - pool = pool ; - hmem = Intmap.empty ; - sigma = Intmap.empty ; - domain = Vars.empty ; - codomain = Vars.empty ; - } + let rec subst sigma xs d e = + (* substitute bound variable d+i with xs.(i) for 0 <= i < xs.length *) + if not (Bvars.overlap d (Array.length xs) e.bind) + then e else + match e.repr with + | Bvar(k,_) -> xs.(k-d) + | _ -> + try cache_find sigma e + with Not_found -> + cache_bind sigma e + begin match e.repr with + | Apply(e,es) -> + let e = subst sigma xs d e in + let es = List.map (subst sigma xs d) es in + !r_apply [] e es + | _ -> + rebuild (subst sigma xs d) e + end - let rec e_apply ?pool (a:term) (xs:term list) : term = - if xs=[] then a else - let pool = match pool with Some p -> p | None -> - let p = POOL.create () in - add_term p a ; List.iter (add_term p) xs ; p - in - reduction (senv pool) a xs - - and reduction senv (a:term) (args:term list) : term = - match a.repr , args with - | Bind(_,x,core) , arg::args -> - let senv = - { senv with - sigma = Intmap.add x.vid arg senv.sigma ; - domain = Vars.add x senv.domain ; - codomain = Vars.union arg.vars senv.codomain ; - } in - reduction senv core args + let rec apply xs a es = + match a.repr , es with + | Bind(_,_,a) , e::es -> apply (e::xs) a es | _ -> - (* sigma is now as much as possible *) - if Vars.is_empty senv.domain - then c_apply a args - else c_apply (apply_subst senv a) args + let core = + if xs=[] then a else + let sigma = sigma () in + let xs = Array.of_list xs in + let d = Bvars.order a.bind + 1 - Array.length xs in + subst sigma xs d a + in c_apply core es - and apply_subst senv (a:term) : term = - if not (Vars.intersect a.vars senv.domain) then a - else - try Intmap.find a.id senv.hmem (* memoized *) - with Not_found -> - let result = - match a.repr with - | Var x -> - (try Intmap.find x.vid senv.sigma with Not_found -> a) - | Bind(q,x,b) -> - if Vars.mem x senv.codomain then - let y = POOL.alpha senv.pool x in - let senv0 = { - pool = senv.pool ; - hmem = Intmap.empty ; - domain = Vars.add x senv.domain ; - codomain = Vars.add y senv.codomain ; - sigma = Intmap.add x.vid (e_var y) senv.sigma - } in - e_bind q y (apply_subst senv0 b) - else - e_bind q x (apply_subst senv b) - | Apply(phi,vs) -> - let vs' = List.map (apply_subst senv) vs in - let phi' = apply_subst senv phi in - e_apply phi' vs' - | _ -> - rebuild (apply_subst senv) a - in (* memoization *) - senv.hmem <- Intmap.add a.id result senv.hmem ; - result - - let e_subst ?pool x a b = - let pool = match pool with Some p -> p | None -> - let p = POOL.create () in - add_var p x ; add_term p a ; add_term p b ; p in - let senv = { - pool = pool ; - hmem = Intmap.empty ; - domain = Vars.singleton x ; - codomain = a.vars ; - sigma = Intmap.add x.vid a Intmap.empty ; - } in - apply_subst senv b + let () = r_apply := apply + + let e_apply e es = apply [] e es + + (* -------------------------------------------------------------------------- *) + (* --- General Substitutions --- *) + (* -------------------------------------------------------------------------- *) + + let rec gsubst mu sigma e = + match e.repr with + | True | False | Kint _ | Kreal _ | Bvar _ -> e + | _ -> + try cache_find mu e + with Not_found -> + cache_bind mu e + (if lc_closed e + then + try sigma e + with Not_found -> rebuild (gsubst mu sigma) e + else rebuild (gsubst mu sigma) e) + + let e_subst ?sigma f e = + let cache = match sigma with None -> ref Tmap.empty | Some c -> c in + gsubst cache f e (* -------------------------------------------------------------------------- *) (* --- Smart Constructors --- *) @@ -1762,8 +1786,9 @@ | False -> e_false | Kint z -> e_zint z | Kreal r -> e_real r - | Var x -> e_var x - | Bind(q,x,e) -> e_bind q x e + | Fvar x -> e_var x + | Bvar(k,t) -> e_bvar k t + | Bind(q,t,e) -> c_bind q t e | Apply(a,xs) -> e_apply a xs | Times(k,e) -> e_times k e | Not e -> e_not e @@ -1785,65 +1810,52 @@ | Rget(r,f) -> e_getfield r f | Rdef fvs -> e_record fvs - let e_map f e = + let e_map pool f e = match e.repr with - | Var _ -> e | Apply(a,xs) -> e_apply (f a) (List.map f xs) - | Bind _ -> raise (Invalid_argument "Qed.Term.e_map") + | Bind(q,t,e) -> + add_term pool e ; + let x = fresh pool t in + e_bind q x (f (lc_open x e)) | _ -> rebuild f e - let f_map f xs e = + let f_map f n e = match e.repr with - | Var _ -> e - | Apply(a,ps) -> e_apply (f xs a) (List.map (f xs) ps) - | Bind(q,x,p) -> e_bind q x (f (Vars.add x xs) p) - | _ -> rebuild (f xs) e + | Bind(q,t,e) -> c_bind q t (f (succ n) e) + | Apply(a,xs) -> e_apply (f n a) (List.map (f n) xs) + | _ -> rebuild (f n) e - let r_map f = function - | True -> e_true - | False -> e_false - | Kint z -> e_zint z - | Kreal r -> e_real r - | Var x -> e_var x + let lc_map f e = + match e.repr with | Apply(a,xs) -> e_apply (f a) (List.map f xs) - | Bind _ -> raise (Invalid_argument "Qed.Term.r_map") - | Not e -> e_not (f e) - | Add xs -> addition (List.map f xs) - | Mul xs -> multiplication (List.map f xs) - | And xs -> e_and (List.map f xs) - | Or xs -> e_or (List.map f xs) - | Mod(x,y) -> e_mod (f x) (f y) - | Div(x,y) -> e_div (f x) (f y) - | Eq(x,y) -> e_eq (f x) (f y) - | Neq(x,y) -> e_neq (f x) (f y) - | Lt(x,y) -> e_lt (f x) (f y) - | Leq(x,y) -> e_leq (f x) (f y) - | Times(z,t) -> times z (f t) - | If(e,a,b) -> e_if (f e) (f a) (f b) - | Imply(hs,p) -> e_imply (List.map f hs) (f p) - | Fun(g,xs) -> e_fun g (List.map f xs) - | Aget(x,y) -> e_get (f x) (f y) - | Aset(x,y,z) -> e_set (f x) (f y) (f z) - | Rget(x,g) -> e_getfield (f x) g - | Rdef gxs -> e_record (List.map (fun (g,x) -> g, f x) gxs) - - let e_iter f e = + | _ -> rebuild f e + + let lc_iter f e = match e.repr with - | True | False | Kint _ | Kreal _ | Var _ -> () - | Times(_,e) | Not e | Bind(_,_,e) | Rget(e,_) -> f e + | True | False | Kint _ | Kreal _ | Fvar _ | Bvar _ -> () + | Times(_,e) | Not e | Rget(e,_) -> f e | Add xs | Mul xs | And xs | Or xs -> List.iter f xs | Mod(x,y) | Div(x,y) | Eq(x,y) | Neq(x,y) | Leq(x,y) | Lt(x,y) | Aget(x,y) -> f x ; f y | Rdef fvs -> List.iter (fun (_,v) -> f v) fvs | If(e,a,b) | Aset(e,a,b) -> f e ; f a ; f b | Imply(xs,x) -> List.iter f xs ; f x - | Apply(x,xs) -> f x ; List.iter f xs | Fun(_,xs) -> List.iter f xs + | Apply(x,xs) -> f x ; List.iter f xs + | Bind(_,_,e) -> f e + + let e_iter pool f e = + match e.repr with + | Bind(_,t,e) -> + add_term pool e ; + let x = fresh pool t in + lc_iter f (lc_open x e) + | _ -> lc_iter f e - let f_iter f xs e = + let f_iter f n e = match e.repr with - | Bind(_,x,e) -> f (Vars.add x xs) e - | _ -> e_iter (f xs) e + | Bind(_,_,e) -> f (succ n) e + | _ -> lc_iter (f n) e (* -------------------------------------------------------------------------- *) (* --- Sub-terms --- *) @@ -1864,7 +1876,7 @@ [] -> child | i::l -> begin match e.repr with - | True | False | Kint _ | Kreal _ | Var _ -> + | True | False | Kint _ | Kreal _ | Fvar _ | Bvar _ -> bad_position () | Times (_,e) when i = 0 && l = [] -> begin @@ -1917,7 +1929,7 @@ | Rdef _ | Rget _ -> failwith "change in place for records not yet implemented" | Fun (f,ops) -> e_fun f (change_in_list ops i l) - | Bind(q,x,t) when i = 0 -> e_bind q x (aux t l) + | Bind(q,x,t) when i = 0 -> c_bind q x (aux t l) | Bind _ -> bad_position () | Apply(f,args) when i = 0 -> e_apply (aux f l) args @@ -1961,8 +1973,9 @@ | Not e -> Format.fprintf fmt "not%a" pp_id e | Fun(f,es) -> Format.fprintf fmt "fun %a%a" Fun.pretty f pp_ids es | Apply(phi,es) -> Format.fprintf fmt "apply%a%a" pp_id phi pp_ids es - | Var x -> Format.fprintf fmt "var %a" pp_var x - | Bind(q,x,e) -> Format.fprintf fmt "bind %a %a. %a" pp_bind q pp_var x pp_id e + | Fvar x -> Format.fprintf fmt "var %a" pp_var x + | Bvar(k,_) -> Format.fprintf fmt "bvar #%d" k + | Bind(q,t,e) -> Format.fprintf fmt "bind %a %a. %a" pp_bind q Tau.pretty t pp_id e | Rdef fxs -> Format.fprintf fmt "@[record {%a }@]" pp_record fxs | Rget(e,f) -> Format.fprintf fmt "field %a.%a" pp_id e Field.pretty f | Aset(m,k,v) -> Format.fprintf fmt "array%a[%a :=%a ]" pp_id m pp_id k pp_id v @@ -1972,12 +1985,13 @@ let rec pp_debug disp fmt e = if not (Intset.mem e.id !disp) then begin - Format.fprintf fmt "%a = %a@." pp_id e pp_repr e.repr ; + Format.fprintf fmt "%a{%a} = %a@." + pp_id e Bvars.pretty e.bind pp_repr e.repr ; disp := Intset.add e.id !disp ; pp_children disp fmt e ; end - and pp_children disp fmt e = e_iter (pp_debug disp fmt) e + and pp_children disp fmt e = lc_iter (pp_debug disp fmt) e let debug fmt e = Format.fprintf fmt "%a with:@." pp_id e ; @@ -1985,7 +1999,6 @@ let pretty = debug - (* ------------------------------------------------------------------------ *) (* --- Record Decomposition --- *) (* ------------------------------------------------------------------------ *) @@ -2021,6 +2034,20 @@ Some ( base , fothers ) (* ------------------------------------------------------------------------ *) + (* --- Symbol --- *) + (* ------------------------------------------------------------------------ *) + + module Term = + struct + type t = term + let hash = hash + let equal = equal + let compare = compare + let pretty = pretty + let debug e = Printf.sprintf "E%03d" e.id + end + + (* ------------------------------------------------------------------------ *) (* --- Sizing Terms --- *) (* ------------------------------------------------------------------------ *) @@ -2029,7 +2056,7 @@ begin incr k ; m := Tset.add e !m ; - e_iter (count k m) e ; + lc_iter (count k m) e ; end let size e = @@ -2045,7 +2072,6 @@ | Marked (* finished *) type marks = { - closed : Vars.t ; (* context-declared variables *) marked : (term -> bool) ; (* context-letified terms *) shareable : (term -> bool) ; (* terms that can be shared *) mutable mark : mark Tmap.t ; (* current marks during traversal *) @@ -2060,7 +2086,12 @@ let set_mark m e t = m.mark <- Tmap.add e t m.mark - let rec walk m xs e = + (* r is the order of the root term being marked, + it is constant during the recursive traversal. + This is also the floor of bound variables ; + bvars k > r can not be shared, as they are not free in the term. + *) + let rec walk m r e = if not (is_simple e) then begin match get_mark m e with @@ -2070,20 +2101,20 @@ else begin set_mark m e FirstMark ; - f_iter (walk m) xs e ; + lc_iter (walk m r) e ; end | FirstMark -> - if m.shareable e - && Vars.subset e.vars m.closed - && not (Vars.intersect e.vars xs) - then m.shared <- Tset.add e m.shared - else f_iter (walk m) xs e ; + if m.shareable e && lc_closed_at r e + then m.shared <- Tset.add e m.shared + else lc_iter (walk m r) e ; set_mark m e Marked | Marked -> () end - let mark m e = m.roots <- e :: m.roots ; walk m Vars.empty e + let mark m e = + m.roots <- e :: m.roots ; + walk m (Bvars.order e.bind) e type defs = { mutable stack : term list ; @@ -2093,32 +2124,31 @@ let rec collect shared defs e = if not (Tset.mem e defs.defined) then begin - e_iter (collect shared defs) e ; + lc_iter (collect shared defs) e ; if Tset.mem e shared then defs.stack <- e :: defs.stack ; defs.defined <- Tset.add e defs.defined ; end - let marks - ?(shared=fun _ -> false) - ?(shareable=fun _ -> true) - ?(closed=Vars.empty) - () = { - closed = closed ; - marked = shared ; - shareable = shareable ; - shared = Tset.empty ; - mark = Tmap.empty ; - roots = [] ; - } + let none = fun _ -> false + let all = fun _ -> true + let marks ?(shared=none) ?(shareable=all) () = + { + shareable ; + marked = shared ; + shared = Tset.empty ; + mark = Tmap.empty ; + roots = [] ; + } + let defs m = let defines = { stack=[] ; defined=Tset.empty } in List.iter (collect m.shared defines) m.roots ; List.rev defines.stack - let shared ?shared ?shareable ?closed es = - let m = marks ?shared ?shareable ?closed () in + let shared ?shared ?shareable es = + let m = marks ?shared ?shareable () in List.iter (mark m) es ; defs m diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/term.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/term.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/term.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/term.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -60,16 +60,6 @@ val check_unit : qed:term -> raw:term -> term val iter_checks : (qed:term -> raw:term -> unit) -> unit - (* - (** {2 Contextual Rewritings} *) - - type context - val push : unit -> context (** Save current context. *) - val pop : context -> unit (** Back to (any) previously pushed context. *) - val merge : term -> term -> unit (** Insert in current context the merge. *) - val rewrite : term -> term (** Rebuild recursively the input term. *) - *) - (** {2 Context Release} *) val release : unit -> unit diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/topology.ml frama-c-20150201+sodium+dfsg/src/wp/qed/src/topology.ml --- frama-c-20140301+neon+dfsg/src/wp/qed/src/topology.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/topology.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/qed/src/topology.mli frama-c-20150201+sodium+dfsg/src/wp/qed/src/topology.mli --- frama-c-20140301+neon+dfsg/src/wp/qed/src/topology.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/qed/src/topology.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/RefUsage.ml frama-c-20150201+sodium+dfsg/src/wp/RefUsage.ml --- frama-c-20140301+neon+dfsg/src/wp/RefUsage.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/RefUsage.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -62,7 +62,7 @@ | ByValue (* The expression ["x"], equal to [load(&x)] *) | ByArray (* The expression ["x[_]"], equal to [load(shift(load(&x),_))] *) | ByRef (* The expression ["*x"], equal to [load(load(&x))] *) - + module Access : sig type t = access @@ -77,11 +77,11 @@ (* let is_bot = function NoAccess -> true | _ -> false *) (* unused for now *) (* let pretty x fmt = function - | NoAccess -> Format.fprintf fmt "-" - | ByValue -> Var.pretty fmt x - | ByAddr -> Format.fprintf fmt "&%a" Var.pretty x - | ByRef -> Format.fprintf fmt "*%a" Var.pretty x - | ByArray -> Format.fprintf fmt "%a[_]" Var.pretty x + | NoAccess -> Format.fprintf fmt "-" + | ByValue -> Var.pretty fmt x + | ByAddr -> Format.fprintf fmt "&%a" Var.pretty x + | ByRef -> Format.fprintf fmt "*%a" Var.pretty x + | ByArray -> Format.fprintf fmt "%a[_]" Var.pretty x *) let rank = function | NoAccess -> 0 @@ -89,7 +89,7 @@ | ByArray -> 2 | ByValue -> 3 | ByAddr -> 4 -(* let leq a b = (rank a) <= (rank b)*) (* unused for now *) + (* let leq a b = (rank a) <= (rank b)*) (* unused for now *) let cup a b = if rank a < rank b then b else a end @@ -113,14 +113,14 @@ module Xmap = Qed.Mergemap.Make(Var) type t = access Xmap.t - + let bot = Xmap.empty let cup = Xmap.union (fun _ -> Access.cup) (* unused for now *) (* let leq = Xmap.subset (fun _ -> Access.leq) *) (* unused for now *) -(* let rec lcup = function [] -> bot | [x] -> x | x::xs -> cup x (lcup xs)*) + (* let rec lcup = function [] -> bot | [x] -> x | x::xs -> cup x (lcup xs)*) let rec fcup f = function [] -> bot | [x] -> f x | x::xs -> cup (f x) (fcup f xs) let get x e = try Xmap.find x e with Not_found -> NoAccess @@ -194,14 +194,14 @@ let cast_obj tgt src = match tgt , src with - | (C_int _ | C_float _) , (C_int _ | C_float _) -> Convert - | C_pointer tr , C_pointer te -> - let obj_r = Ctypes.object_of tr in - let obj_e = Ctypes.object_of te in - if Ctypes.compare obj_r obj_e = 0 - then Identity - else Cast - | _ -> if Ctypes.equal tgt src then Identity else Cast + | (C_int _ | C_float _) , (C_int _ | C_float _) -> Convert + | C_pointer tr , C_pointer te -> + let obj_r = Ctypes.object_of tr in + let obj_e = Ctypes.object_of te in + if Ctypes.compare obj_r obj_e = 0 + then Identity + else Cast + | _ -> if Ctypes.equal tgt src then Identity else Cast let cast_ctyp tgt src = cast_obj (Ctypes.object_of tgt) (Ctypes.object_of src) let cast_ltyp tgt src = match Logic_utils.unroll_type src with @@ -257,29 +257,29 @@ and expr (e:Cil_types.exp) : model = match e.enode with - (* Logics *) - | Const _ | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ | AlignOfE _ -> L + (* Logics *) + | Const _ | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ | AlignOfE _ -> L - (* Unary *) - | UnOp((Neg|BNot|LNot),e,_) | Info(e,_) -> expr e + (* Unary *) + | UnOp((Neg|BNot|LNot),e,_) | 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,_ ) - -> vcup (vexpr a) (vexpr b) - - (* Shifts *) - | BinOp((PlusPI|IndexPI|MinusPI),a,b,_) -> shift (expr a) (vexpr b) - - (* Casts *) - | CastE(ty_tgt,e) -> cast (cast_ctyp ty_tgt (Cil.typeOf e)) (expr e) - - (* Address *) - | AddrOf lval | StartOf lval -> lvalue lval + (* Binary *) + | BinOp( (MinusPP|PlusA|MinusA|Mult|Div|Mod + |Shiftlt|Shiftrt|BAnd|BXor|BOr|LAnd|LOr + |Lt|Gt|Le|Ge|Eq|Ne), a,b,_ ) + -> vcup (vexpr a) (vexpr b) - (* Load *) - | Lval lval -> load (lvalue lval) + (* Shifts *) + | BinOp((PlusPI|IndexPI|MinusPI),a,b,_) -> shift (expr a) (vexpr b) + + (* Casts *) + | CastE(ty_tgt,e) -> cast (cast_ctyp ty_tgt (Cil.typeOf e)) (expr e) + + (* Address *) + | AddrOf lval | StartOf lval -> lvalue lval + + (* Load *) + | Lval lval -> load (lvalue lval) and lvalue (h,ofs) = offset (host h) ofs and host = function @@ -311,8 +311,8 @@ (* Binary *) | TBinOp( (MinusPP|PlusA|MinusA|Mult|Div|Mod - |Shiftlt|Shiftrt|BAnd|BXor|BOr|LAnd|LOr - |Lt|Gt|Le|Ge|Eq|Ne), a,b ) + |Shiftlt|Shiftrt|BAnd|BXor|BOr|LAnd|LOr + |Lt|Gt|Le|Ge|Eq|Ne), a,b ) -> vcup (vterm env a) (vterm env b) (* Shifts *) @@ -341,7 +341,7 @@ | Toffset(_,t) | Tbase_addr(_,t) -> E (vterm env t) | Tnull | Tempty_set -> L | Tunion ts | Tinter ts -> fcup (vterm env) ts - + (* Binders *) | Tlambda(xs,b) -> E (E.bind xs (vterm env b)) | Tcomprehension(t,xs,None) -> E (E.bind xs (vterm env t)) @@ -370,12 +370,12 @@ | TModel _ -> Wp_parameters.not_yet_implemented "Model fields" and addr_lval env (h,ofs) = match h with - | TResult _ -> Wp_parameters.fatal "Address of \\result" + | TResult _ -> Wp_parameters.abort ~current:true "Address of \\result" | TMem t -> term_offset env (term env t) ofs | TVar( {lv_origin=Some x} ) -> term_offset env (Loc_var x) ofs | TVar( {lv_origin=None} as x ) -> - Wp_parameters.fatal "Address of logic variable (%a)" - Logic_var.pretty x + Wp_parameters.abort ~current:true + "Address of logic variable (%a)" Logic_var.pretty x and pred (_:context) _ = E.bot diff -Nru frama-c-20140301+neon+dfsg/src/wp/RefUsage.mli frama-c-20150201+sodium+dfsg/src/wp/RefUsage.mli --- frama-c-20140301+neon+dfsg/src/wp/RefUsage.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/RefUsage.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Region.ml frama-c-20150201+sodium+dfsg/src/wp/Region.ml --- frama-c-20140301+neon+dfsg/src/wp/Region.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Region.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -41,14 +41,14 @@ let rec update e path v = match path with - | [] -> v - | Oindex k :: tail -> - let e_k = update (e_get e k) tail v in - e_set e k e_k - | Ofield f :: tail -> - let e_f = update (e_getfield e f) tail v in - e_setfield e f e_f - + | [] -> v + | Oindex k :: tail -> + let e_k = update (e_get e k) tail v in + e_set e k e_k + | Ofield f :: tail -> + let e_f = update (e_getfield e f) tail v in + e_setfield e f e_f + (* -------------------------------------------------------------------------- *) (* --- Region --- *) (* -------------------------------------------------------------------------- *) @@ -63,8 +63,8 @@ | Full | Fields of (field * region) list (* SORTED, DEFAULT : empty *) | Indices of set * ( set * region ) list - (* Indices for FULL region. - Then indices for non-FULL and non-EMPTY regions *) + (* Indices for FULL region. + Then indices for non-FULL and non-EMPTY regions *) let empty = Empty let full = Full @@ -75,9 +75,9 @@ let r = path tail in let s = Vset.singleton k in begin - match r with (* never Empty *) - | Full -> Indices(s,[]) - | _ -> Indices(Vset.empty,[s,r]) + match r with (* never Empty *) + | Full -> Indices(s,[]) + | _ -> Indices(Vset.empty,[s,r]) end | Ofield f :: tail -> Fields [f,path tail] @@ -87,31 +87,31 @@ | Rindex s :: tail -> let r = rpath tail in begin - match r with (* never Empty *) - | Full -> Indices(s,[]) - | _ -> Indices(Vset.empty,[s,r]) + match r with (* never Empty *) + | Full -> Indices(s,[]) + | _ -> Indices(Vset.empty,[s,r]) end | Rfield f :: tail -> Fields [f,rpath tail] let rec merge a b = match a , b with - | Full , _ | _ , Full -> Full - | Empty , c | c , Empty -> c - | Fields fxs , Fields gys -> Fields (merge_fields fxs gys) - | Indices(s1,kxs) , Indices(s2,kys) -> - Indices(Vset.union s1 s2,kxs @ kys) - | Fields _ , Indices _ - | Indices _ , Fields _ -> assert false - + | Full , _ | _ , Full -> Full + | Empty , c | c , Empty -> c + | Fields fxs , Fields gys -> Fields (merge_fields fxs gys) + | Indices(s1,kxs) , Indices(s2,kys) -> + Indices(Vset.union s1 s2,kxs @ kys) + | Fields _ , Indices _ + | Indices _ , Fields _ -> assert false + and merge_fields fxs gys = match fxs , gys with - | [] , w | w , [] -> w - | (f,x)::fxstail , (g,y)::gystail -> - let c = Field.compare f g in - if c < 0 then (f,x)::merge_fields fxstail gys else - if c > 0 then (g,y)::merge_fields fxs gystail else - (f,merge x y) :: merge_fields fxstail gystail + | [] , w | w , [] -> w + | (f,x)::fxstail , (g,y)::gystail -> + let c = Field.compare f g in + if c < 0 then (f,x)::merge_fields fxstail gys else + if c > 0 then (g,y)::merge_fields fxs gystail else + (f,merge x y) :: merge_fields fxstail gystail (* -------------------------------------------------------------------------- *) (* --- Disjonction --- *) @@ -119,34 +119,34 @@ let rec disjoint a b = match a , b with - | Empty , _ | _ , Empty -> p_true - | Full , _ | _ , Full -> p_false + | Empty , _ | _ , Empty -> p_true + | Full , _ | _ , Full -> p_false - | Fields fxs , Fields gys -> - p_conj (disjoint_fields fxs gys) + | Fields fxs , Fields gys -> + p_conj (disjoint_fields fxs gys) - | Indices(s,xs) , Indices(t,ts) -> - p_conj (disjoint_indices [Vset.disjoint s t] xs ts) + | Indices(s,xs) , Indices(t,ts) -> + p_conj (disjoint_indices [Vset.disjoint s t] xs ts) - | Fields _ , Indices _ - | Indices _ , Fields _ -> assert false + | Fields _ , Indices _ + | Indices _ , Fields _ -> assert false and disjoint_fields frs grs = match frs , grs with - | [] , _ | _ , [] -> [] - | (f,r)::ftail , (g,s)::gtail -> - let c = Field.compare f g in - if c < 0 then disjoint_fields ftail grs else - if c > 0 then disjoint_fields frs gtail else - disjoint r s :: disjoint_fields ftail gtail + | [] , _ | _ , [] -> [] + | (f,r)::ftail , (g,s)::gtail -> + let c = Field.compare f g in + if c < 0 then disjoint_fields ftail grs else + if c > 0 then disjoint_fields frs gtail else + disjoint r s :: disjoint_fields ftail gtail and disjoint_indices w sr1 sr2 = List.fold_left (fun w (s1,r1) -> List.fold_left - (fun w (s2,r2) -> - (p_or (Vset.disjoint s1 s2) (disjoint r1 r2)) :: w - ) w sr2 + (fun w (s2,r2) -> + (p_or (Vset.disjoint s1 s2) (disjoint r1 r2)) :: w + ) w sr2 ) w sr1 (* -------------------------------------------------------------------------- *) @@ -155,29 +155,29 @@ let rec subset r1 r2 = match r1 , r2 with - | _ , Full -> p_true - | Empty , _ -> p_true - | _ , Empty -> p_false - | Full , _ -> p_false - | Fields frs , Fields grs -> subset_fields frs grs - | Indices(s1,ks1) , Indices(s2,ks2) -> - p_and - (Vset.subset s1 s2) (* because FULL never appears in ks2 *) - (p_all (fun (s1,r1) -> subset_indices s1 r1 ks2) ks1) - | Fields _ , Indices _ - | Indices _ , Fields _ -> assert false + | _ , Full -> p_true + | Empty , _ -> p_true + | _ , Empty -> p_false + | Full , _ -> p_false + | Fields frs , Fields grs -> subset_fields frs grs + | Indices(s1,ks1) , Indices(s2,ks2) -> + p_and + (Vset.subset s1 s2) (* because FULL never appears in ks2 *) + (p_all (fun (s1,r1) -> subset_indices s1 r1 ks2) ks1) + | Fields _ , Indices _ + | Indices _ , Fields _ -> assert false and subset_fields frs grs = match frs , grs with - | [] , _ -> p_true - | _ , [] -> p_false - | (f,r)::ftail , (g,s)::gtail -> - let c = Field.compare f g in - if c < 0 then p_false (* only f is present *) else - if c > 0 then subset_fields frs gtail (* g is not present *) - else (* f=g *) - p_and (subset r s) (subset_fields ftail gtail) - + | [] , _ -> p_true + | _ , [] -> p_false + | (f,r)::ftail , (g,s)::gtail -> + let c = Field.compare f g in + if c < 0 then p_false (* only f is present *) else + if c > 0 then subset_fields frs gtail (* g is not present *) + else (* f=g *) + p_and (subset r s) (subset_fields ftail gtail) + (* All path (k,p) in (s1,r1) are in ks2 = AND (k in s1 -> p in r1 -> (k,p) in ks2 = AND (k in s1 -> p in r1 -> (OR (k in s2 and p in r2) for (s2,r2) in r2) @@ -186,16 +186,16 @@ *) and subset_indices s1 r1 ks2 = p_all (fun w -> - let xs,e,p = Vset.descr w in - p_forall xs - (p_imply p (subset_index e r1 ks2)) - ) s1 + let xs,e,p = Vset.descr w in + p_forall xs + (p_imply p (subset_index e r1 ks2)) + ) s1 (* OR (k in s2 and r1 in r2) for (s2,r2) in r2) *) and subset_index e r1 ks2 = p_any (fun (s2,r2) -> - p_and (Vset.member e s2) (subset r1 r2) - ) ks2 + p_and (Vset.member e s2) (subset r1 r2) + ) ks2 (* -------------------------------------------------------------------------- *) (* --- Equality outside a Region --- *) @@ -203,38 +203,38 @@ let rec equal_but t r a b = match t , r with - | _ , Full -> p_true - | _ , Empty -> p_equal a b - | _ , Fields grs -> - let fs = List.sort Field.compare (fields_of_tau t) in - p_conj (equal_but_fields a b fs grs) - | Array(ta,tb) , Indices(s,krs) -> - let x = freshvar ta in - let k = e_var x in - let a_k = e_get a k in - let b_k = e_get b k in - p_forall [x] (p_conj (equal_but_index tb k a_k b_k s krs)) - | _ -> assert false + | _ , Full -> p_true + | _ , Empty -> p_equal a b + | _ , Fields grs -> + let fs = List.sort Field.compare (fields_of_tau t) in + p_conj (equal_but_fields a b fs grs) + | Array(ta,tb) , Indices(s,krs) -> + let x = freshvar ta in + let k = e_var x in + let a_k = e_get a k in + let b_k = e_get b k in + p_forall [x] (p_conj (equal_but_index tb k a_k b_k s krs)) + | _ -> assert false and equal_but_fields a b fts grs = match fts , grs with - | [] , _ -> [] - | _ , [] -> - List.map (fun f -> p_equal (e_getfield a f) (e_getfield b f)) fts - | f::ftail , (g,r)::gtail -> - let c = Field.compare f g in - if c < 0 then - let eqf = p_equal (e_getfield a f) (e_getfield b f) in - eqf :: equal_but_fields a b ftail grs - else - if c > 0 then - (* field g does not appear *) - equal_but_fields a b fts gtail - else - let tf = tau_of_field f in - let eqf = equal_but tf r (e_getfield a f) (e_getfield b f) in - eqf :: equal_but_fields a b ftail gtail - + | [] , _ -> [] + | _ , [] -> + List.map (fun f -> p_equal (e_getfield a f) (e_getfield b f)) fts + | f::ftail , (g,r)::gtail -> + let c = Field.compare f g in + if c < 0 then + let eqf = p_equal (e_getfield a f) (e_getfield b f) in + eqf :: equal_but_fields a b ftail grs + else + if c > 0 then + (* field g does not appear *) + equal_but_fields a b fts gtail + else + let tf = tau_of_field f in + let eqf = equal_but tf r (e_getfield a f) (e_getfield b f) in + eqf :: equal_but_fields a b ftail gtail + and equal_but_index tb k a_k b_k s krs = List.map (fun (s,r) -> p_or (Vset.member k s) (equal_but tb r a_k b_k)) @@ -255,12 +255,12 @@ | Empty | Full -> Vars.empty | Fields frs -> List.fold_left - (fun xs (_,r) -> Vars.union xs (vars r)) - Vars.empty frs + (fun xs (_,r) -> Vars.union xs (vars r)) + Vars.empty frs | Indices(s,srs) -> List.fold_left - (fun xs (s,r) -> Vars.union xs (Vars.union (Vset.vars s) (vars r))) - (Vset.vars s) srs + (fun xs (s,r) -> Vars.union xs (Vars.union (Vset.vars s) (vars r))) + (Vset.vars s) srs (* -------------------------------------------------------------------------- *) (* --- Pretty --- *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Region.mli frama-c-20150201+sodium+dfsg/src/wp/Region.mli --- frama-c-20140301+neon+dfsg/src/wp/Region.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Region.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/register.ml frama-c-20150201+sodium+dfsg/src/wp/register.ml --- frama-c-20140301+neon+dfsg/src/wp/register.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/register.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -28,30 +28,30 @@ let cmdline () : setup = begin match Wp_parameters.Model.get () with - | ["Runtime"] -> - Wp_parameters.abort - "Model 'Runtime' is no more available.@\nIt will be reintroduced \ - in a future release." - | ["Logic"] -> - Wp_parameters.warning ~once:true - "Deprecated 'Logic' model.@\nUse 'Typed' with option '-wp-ref' \ - instead." ; - { - mheap = Factory.Typed MemTyped.Fits ; - mvar = Factory.Ref ; - cint = Cint.Natural ; - cfloat = Cfloat.Real ; - } - | ["Store"] -> - Wp_parameters.warning ~once:true - "Deprecated 'Store' model.@\nUse 'Typed' instead." ; - { - mheap = Factory.Typed MemTyped.Fits ; - mvar = Factory.Var ; - cint = Cint.Natural ; - cfloat = Cfloat.Real ; - } - | spec -> Factory.parse spec + | ["Runtime"] -> + Wp_parameters.abort + "Model 'Runtime' is no more available.@\nIt will be reintroduced \ + in a future release." + | ["Logic"] -> + Wp_parameters.warning ~once:true + "Deprecated 'Logic' model.@\nUse 'Typed' with option '-wp-ref' \ + instead." ; + { + mheap = Factory.Typed MemTyped.Fits ; + mvar = Factory.Ref ; + cint = Cint.Natural ; + cfloat = Cfloat.Real ; + } + | ["Store"] -> + Wp_parameters.warning ~once:true + "Deprecated 'Store' model.@\nUse 'Typed' instead." ; + { + mheap = Factory.Typed MemTyped.Fits ; + mvar = Factory.Var ; + cint = Cint.Natural ; + cfloat = Cfloat.Real ; + } + | spec -> Factory.parse spec end let set_model (s:setup) = @@ -78,7 +78,7 @@ Log.print_on_output (fun fmt -> Wpo.iter - ~on_axiomatics:(Wpo.pp_axiomatics fmt) + ~on_axiomatics:(Wpo.pp_axiomatics fmt) ~on_behavior:(Wpo.pp_function fmt) ~on_goal:(Wpo.pp_goal_flow fmt) ()) @@ -87,7 +87,7 @@ if Bag.is_empty goals then Wp_parameters.result "No proof obligations" else Log.print_on_output - (fun fmt -> Bag.iter (Wpo.pp_goal_flow fmt) goals) + (fun fmt -> Bag.iter (Wpo.pp_goal_flow fmt) goals) let do_wp_report () = let rfiles = Wp_parameters.Report.get () in @@ -110,31 +110,31 @@ else VCS.pp_result fmt r ; match r.VCS.verdict with - | VCS.Unknown | VCS.Timeout | VCS.Stepout -> - let ws = Wpo.warnings wpo in - if ws <> [] then - let n = List.length ws in - let s = List.exists (fun w -> w.Warning.severe) ws in - begin - match s , n with - | true , 1 -> Format.fprintf fmt " (Degenerated)" - | true , _ -> Format.fprintf fmt " (Degenerated, %d warnings)" n - | false , 1 -> Format.fprintf fmt " (Stronger)" - | false , _ -> Format.fprintf fmt " (Stronger, %d warnings)" n - end - | _ -> () + | VCS.Unknown | VCS.Timeout | VCS.Stepout -> + let ws = Wpo.warnings wpo in + if ws <> [] then + let n = List.length ws in + let s = List.exists (fun w -> w.Warning.severe) ws in + begin + match s , n with + | true , 1 -> Format.fprintf fmt " (Degenerated)" + | true , _ -> Format.fprintf fmt " (Degenerated, %d warnings)" n + | false , 1 -> Format.fprintf fmt " (Stronger)" + | false , _ -> Format.fprintf fmt " (Stronger, %d warnings)" n + end + | _ -> () let do_wpo_start goal prover = if Wp_parameters.has_dkey "prover" then Wp_parameters.feedback "[%a] Goal %s preprocessing" VCS.pp_prover prover (Wpo.get_gid goal) - + let auto_check_valid goal result = match goal with | { Wpo.po_formula = Wpo.GoalCheck _ } -> result.VCS.verdict = VCS.Valid | _ -> false let is_verdict result = Wpo.is_verdict result || Wp_parameters.Check.get () - + let wp_why3ide_launch task = let server = ProverTask.server () in (** Do on_server_stop save why3 session *) @@ -158,19 +158,19 @@ match result.VCS.verdict with | VCS.Computing _ -> () | VCS.Timeout | VCS.Stepout | VCS.Failed -> - Wp_parameters.feedback "[%a] Type error %s : %a" - VCS.pp_prover prover (Wpo.get_gid goal) (pp_result goal) result; + Wp_parameters.feedback "[%a] Type error %s : %a" + VCS.pp_prover prover (Wpo.get_gid goal) (pp_result goal) result; | VCS.NoResult | VCS.Invalid | VCS.Unknown | VCS.Valid - when Wp_parameters.has_dkey "prover" -> - Wp_parameters.feedback "[%a] Type ok %s : %a" - VCS.pp_prover prover (Wpo.get_gid goal) (pp_result goal) result; + when Wp_parameters.has_dkey "prover" -> + Wp_parameters.feedback "[%a] Type ok %s : %a" + VCS.pp_prover prover (Wpo.get_gid goal) (pp_result goal) result; | VCS.NoResult | VCS.Invalid | VCS.Unknown | VCS.Valid -> () in iter_on_goals (fun goal -> - if not (already_valid goal) then - Prover.spawn goal - ~callin:do_wpo_start ~callback:do_wpo_feedback provers + if not (already_valid goal) then + Prover.spawn goal + ~callin:do_wpo_start ~callback:do_wpo_feedback provers ) ; Task.launch server @@ -178,14 +178,14 @@ match Wp_parameters.wpcheck_provers () with | [] -> () | l -> - do_wp_check_iter l (fun f -> Wpo.iter ~on_goal:f ()) + do_wp_check_iter l (fun f -> Wpo.iter ~on_goal:f ()) let do_wp_check_for goals = match Wp_parameters.wpcheck_provers () with | [] -> () | l -> - do_wp_check_iter l (fun f -> Bag.iter f goals) - + do_wp_check_iter l (fun f -> Bag.iter f goals) + (* ------------------------------------------------------------------------ *) (* --- Feedback --- *) (* ------------------------------------------------------------------------ *) @@ -203,7 +203,7 @@ type pstat = { mutable proved : int ; mutable unknown : int ; - mutable interruped : int ; + mutable interrupted : int ; mutable failed : int ; mutable uptime : float ; mutable dntime : float ; @@ -235,7 +235,7 @@ let s = { proved = 0 ; unknown = 0 ; - interruped = 0 ; + interrupted = 0 ; failed = 0 ; steps = 0 ; uptime = 0.0 ; @@ -256,11 +256,11 @@ begin clear_scheduled () ; iter_on_goals - (fun goal -> if not (already_valid goal) then - begin - incr scheduled ; - if !spy then session := GOALS.add goal !session ; - end) ; + (fun goal -> if not (already_valid goal) then + begin + incr scheduled ; + if !spy then session := GOALS.add goal !session ; + end) ; let n = !scheduled in if n > 1 then Wp_parameters.feedback "%d goals scheduled" n @@ -271,19 +271,19 @@ if is_verdict res && not (auto_check_valid goal res) then begin Wp_parameters.feedback "[%a] Goal %s : %a" - VCS.pp_prover prover (Wpo.get_gid goal) (pp_result goal) res; + VCS.pp_prover prover (Wpo.get_gid goal) (pp_result goal) res; let s = get_pstat prover in let open VCS in match res.verdict with - | NoResult | Computing _ | Invalid | Unknown -> s.unknown <- succ s.unknown - | Stepout | Timeout -> s.interruped <- succ s.interruped - | Failed -> s.failed <- succ s.failed - | Valid -> - proved := GOALS.add goal !proved ; - s.proved <- succ s.proved ; - add_step s res.prover_steps ; - add_time s res.prover_time ; - if prover <> Qed then add_time (get_pstat Qed) res.solver_time + | NoResult | Computing _ | Invalid | Unknown -> s.unknown <- succ s.unknown + | Stepout | Timeout -> s.interrupted <- succ s.interrupted + | Failed -> s.failed <- succ s.failed + | Valid -> + proved := GOALS.add goal !proved ; + s.proved <- succ s.proved ; + add_step s res.prover_steps ; + add_time s res.prover_time ; + if prover <> Qed then add_time (get_pstat Qed) res.solver_time end let do_list_scheduled_result () = @@ -291,32 +291,32 @@ begin let proved = GOALS.cardinal !proved in Wp_parameters.result "%t" - (fun fmt -> - Format.fprintf fmt "Proved goals: %4d / %d@\n" proved !scheduled ; - let ptab p = String.length (VCS.name_of_prover p) in - let ntab = PM.fold (fun p _ s -> max (ptab p) s) !provers 12 in - PM.iter - (fun p s -> - let name = VCS.name_of_prover p in - Format.fprintf fmt "%s:%s %4d " - name (String.make (ntab - String.length name) ' ') s.proved ; - if s.uptime > Rformat.epsilon && - not (Wp_parameters.has_dkey "no-time-info") - then - Format.fprintf fmt " (%a-%a)" - Rformat.pp_time s.dntime - Rformat.pp_time s.uptime ; - if s.steps > 0 && not (Wp_parameters.has_dkey "no-step-info") then - Format.fprintf fmt " (%d)" s.steps ; - if s.interruped > 0 then - Format.fprintf fmt " (interruped: %d)" s.interruped ; - if s.unknown > 0 then - Format.fprintf fmt " (unknown: %d)" s.unknown ; - if s.failed > 0 then - Format.fprintf fmt " (failed: %d)" s.failed ; - Format.fprintf fmt "@\n" ; - ) !provers - ) ; + (fun fmt -> + Format.fprintf fmt "Proved goals: %4d / %d@\n" proved !scheduled ; + let ptab p = String.length (VCS.name_of_prover p) in + let ntab = PM.fold (fun p _ s -> max (ptab p) s) !provers 12 in + PM.iter + (fun p s -> + let name = VCS.name_of_prover p in + Format.fprintf fmt "%s:%s %4d " + name (String.make (ntab - String.length name) ' ') s.proved ; + if s.uptime > Rformat.epsilon && + not (Wp_parameters.has_dkey "no-time-info") + then + Format.fprintf fmt " (%a-%a)" + Rformat.pp_time s.dntime + Rformat.pp_time s.uptime ; + if s.steps > 0 && not (Wp_parameters.has_dkey "no-step-info") then + Format.fprintf fmt " (%d)" s.steps ; + if s.interrupted > 0 then + Format.fprintf fmt " (interrupted: %d)" s.interrupted ; + if s.unknown > 0 then + Format.fprintf fmt " (unknown: %d)" s.unknown ; + if s.failed > 0 then + Format.fprintf fmt " (failed: %d)" s.failed ; + Format.fprintf fmt "@\n" ; + ) !provers + ) ; clear_scheduled () ; end @@ -330,18 +330,18 @@ let server = ProverTask.server () in ignore (Wp_parameters.Share.dir ()); (* To prevent further errors *) iter_on_goals - (fun goal -> - if not (already_valid goal) then - Prover.spawn goal - ~callin:do_wpo_start ~callback:do_wpo_feedback provers - ) ; + (fun goal -> + if not (already_valid goal) then + Prover.spawn goal + ~callin:do_wpo_start ~callback:do_wpo_feedback provers + ) ; Task.launch server end else if not (Wp_parameters.Print.get ()) then iter_on_goals (fun goal -> - if not (already_valid goal) then - do_wpo_display goal) + if not (already_valid goal) then + do_wpo_display goal) let get_prover_names () = match Wp_parameters.Provers.get () with [] -> [ "alt-ergo" ] | pnames -> pnames @@ -350,9 +350,9 @@ List.fold_right (fun pname prvs -> match Wpo.prover_of_name pname with - | None -> prvs - | Some VCS.Why3ide -> why3ide := true; prvs - | Some prover -> (VCS.mode_of_prover_name pname , prover) :: prvs) + | None -> prvs + | Some VCS.Why3ide -> why3ide := true; prvs + | Some prover -> (VCS.mode_of_prover_name pname , prover) :: prvs) (get_prover_names ()) [] let do_wp_proofs_iter iter = @@ -382,8 +382,8 @@ let model = computer () in let goals = match ipopt with - | None -> Generator.compute_kf model ?kf ~bhv () - | Some ip -> Generator.compute_ip model ip + | None -> Generator.compute_kf model ?kf ~bhv () + | Some ip -> Generator.compute_ip model ip in do_wp_proofs_for goals let wp_compute_kf kf bhv prop = @@ -410,17 +410,17 @@ Dyncall.compute (); if Wp_parameters.has_dkey "logicusage" then begin - LogicUsage.compute (); - LogicUsage.dump (); + LogicUsage.compute (); + LogicUsage.dump (); end ; if Wp_parameters.has_dkey "varusage" then begin - VarUsage.compute (); - VarUsage.dump (); + VarUsage.compute (); + VarUsage.dump (); end ; if Wp_parameters.has_dkey "builtins" then begin - LogicBuiltins.dump (); + LogicBuiltins.dump (); end ; Variables_analysis.precondition_compute (); let bhv = Wp_parameters.Behaviors.get () in @@ -429,31 +429,31 @@ Generator.compute_selection computer ~fct ~bhv ~prop () in match Wp_parameters.job () with - | Wp_parameters.WP_None -> () - | Wp_parameters.WP_All -> - begin - ignore (wp_main Generator.F_All); - do_wp_proofs (); - do_wp_print (); - do_wp_report (); - do_wp_check (); - end - | jb -> - let fct = - let open Wp_parameters in - match jb with - | WP_None -> Generator.F_List [] - | WP_All -> Generator.F_All - | WP_Fct fs -> Generator.F_List fs - | WP_SkipFct fs -> Generator.F_Skip fs - in - begin - let goals = wp_main fct in - do_wp_proofs_for goals ; - do_wp_print_for goals ; - do_wp_report () ; - do_wp_check_for goals; - end + | Wp_parameters.WP_None -> () + | Wp_parameters.WP_All -> + begin + ignore (wp_main Generator.F_All); + do_wp_proofs (); + do_wp_print (); + do_wp_report (); + do_wp_check (); + end + | jb -> + let fct = + let open Wp_parameters in + match jb with + | WP_None -> Generator.F_List [] + | WP_All -> Generator.F_All + | WP_Fct fs -> Generator.F_List fs + | WP_SkipFct fs -> Generator.F_Skip fs + in + begin + let goals = wp_main fct in + do_wp_proofs_for goals ; + do_wp_print_for goals ; + do_wp_report () ; + do_wp_check_for goals; + end (* ------------------------------------------------------------------------ *) (* --- Register external functions --- *) @@ -496,9 +496,9 @@ wp_clear let run = Dynamic.register ~plugin:"Wp" "run" - (Datatype.func Datatype.unit Datatype.unit) - ~journalize:true - cmdline_run + (Datatype.func Datatype.unit Datatype.unit) + ~journalize:true + cmdline_run let () = let open Datatype in @@ -525,9 +525,9 @@ let spec = Wp_parameters.Model.get () in if spec <> [] && spec <> ["Typed"] then ( let descr = Factory.descr (Factory.parse spec) in - Format.fprintf fmt " -wp-model '%s'" descr ) ; + Format.fprintf fmt " -wp-model '%s'" descr ) ; if not (Wp_parameters.Let.get ()) then Format.pp_print_string fmt - " -wp-no-let" ; + " -wp-no-let" ; if Wp_parameters.Let.get () && not (Wp_parameters.Prune.get ()) then Format.pp_print_string fmt " -wp-no-prune" ; if Wp_parameters.Split.get () then Format.pp_print_string fmt " -wp-split" ; @@ -542,22 +542,22 @@ end let () = Cmdline.run_after_setting_files - (fun _ -> - if Wp_parameters.has_dkey "shell" then - Log.print_on_output pp_wp_parameters) + (fun _ -> + if Wp_parameters.has_dkey "shell" then + Log.print_on_output pp_wp_parameters) let do_prover_detect () = if not !Config.is_gui && Wp_parameters.Detect.get () then ProverWhy3.detect_why3 begin function - | None -> Wp_parameters.error ~current:false "Why3 not found" - | Some dps -> - List.iter - (fun dp -> - let open ProverWhy3 in - Wp_parameters.result "Prover %10s %-10s [%s]" - dp.dp_name dp.dp_version dp.dp_prover - ) dps + | None -> Wp_parameters.error ~current:false "Why3 not found" + | Some dps -> + List.iter + (fun dp -> + let open ProverWhy3 in + Wp_parameters.result "Prover %10s %-10s [%s]" + dp.dp_name dp.dp_version dp.dp_prover + ) dps end (* ------------------------------------------------------------------------ *) @@ -574,9 +574,9 @@ let r1 = try job1 () ; None with error -> Some error in let r2 = try job2 () ; None with error -> Some error in match r1 , r2 with - | None , None -> () - | Some e1 , _ -> raise e1 - | None , Some e2 -> raise e2 + | None , None -> () + | Some e1 , _ -> raise e1 + | None , Some e2 -> raise e2 let (&&&) = do_finally let rec sequence jobs = match jobs with @@ -586,15 +586,15 @@ let tracelog () = if Datatype.String.Set.is_empty (Wp_parameters.Debug_category.get ()) then Wp_parameters.debug - "Logging keys : %s." (Wp_parameters.Debug_category.get_set()) - + "Logging keys: %s." (Wp_parameters.Debug_category.As_string.get ()) + let main = sequence [ - (fun () -> Wp_parameters.debug ~dkey:job_key "Start WP plugin...@.") ; - do_prover_detect ; - cmdline_run ; - tracelog ; - Wp_parameters.reset ; - (fun () -> Wp_parameters.debug ~dkey:job_key "Stop WP plugin...@.") ; -] + (fun () -> Wp_parameters.debug ~dkey:job_key "Start WP plugin...@.") ; + do_prover_detect ; + cmdline_run ; + tracelog ; + Wp_parameters.reset ; + (fun () -> Wp_parameters.debug ~dkey:job_key "Stop WP plugin...@.") ; + ] let () = Db.Main.extend main diff -Nru frama-c-20140301+neon+dfsg/src/wp/rformat.ml frama-c-20150201+sodium+dfsg/src/wp/rformat.ml --- frama-c-20140301+neon+dfsg/src/wp/rformat.ml 2014-03-12 15:07:54.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/rformat.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,813 +0,0 @@ -# 27 "src/wp/rformat.mll" - - - (* -------------------------------------------------------------------------- *) - (* --- Time Utilities --- *) - (* -------------------------------------------------------------------------- *) - - let epsilon = 0.0005 - - let get_time ladder t = - let rec dicho ladder t i j = - let k = (i+j)/2 in - if i=k then j else - let d = ladder.(k) in - if t < d then dicho ladder t i k else - if t > d then dicho ladder t k j else k - in - if t <= ladder.(0) then 0 else - let n = Array.length ladder in - if t > ladder.(n-1) then n else - dicho ladder t 0 (n-1) - - let rdiv t n = - let d = floor (t /. n) in - let r = t -. d *. n in - d , r - - let pp_time fmt t = - if t < 1.0 then Format.fprintf fmt "%dms" (truncate (t *. 1000.0 +. 0.5)) else - if t < 60.0 then - let dt = t -. floor t in - if dt < 0.1 - then Format.fprintf fmt "%.0fs" t - else Format.fprintf fmt "%.1fs" t - else - if t < 3600.0 then - let minutes,seconds = rdiv t 60.0 in - if seconds < 1.0 then - Format.fprintf fmt "%d'" (truncate minutes) - else - Format.fprintf fmt "%d'%ds" (truncate minutes) (truncate seconds) - else - let hours,seconds = rdiv t 3600.0 in - let minutes,_ = rdiv seconds 60.0 in - if minutes < 1.0 then - Format.fprintf fmt "%dh" (truncate hours) - else - Format.fprintf fmt "%dh%d'" (truncate hours) (truncate minutes) - - let pp_time_range ladder fmt t = - let k = get_time ladder t in - let n = Array.length ladder in - if k > n then Format.fprintf fmt ">%a" pp_time ladder.(n-1) - else pp_time fmt ladder.(k) - - (* -------------------------------------------------------------------------- *) - (* --- Formatters Syntax --- *) - (* -------------------------------------------------------------------------- *) - - type command = - | CMD of string - | ARG of string * string - | TEXT - - type console = { - env : (Format.formatter -> string -> string -> unit) ; - line : Buffer.t ; - mutable spaces : int ; - fline : Format.formatter ; - foutput : Format.formatter ; - } - - let spaces = String.make 80 ' ' - - let rec add_spaces buffer n = - if n > 0 then - if n < 80 then Buffer.add_substring buffer spaces 0 n - else ( Buffer.add_string buffer spaces ; add_spaces buffer (n-80) ) - - let spaces console = - begin - Format.pp_print_flush console.fline () ; - if console.spaces > 0 then - ( add_spaces console.line console.spaces ; - console.spaces <- 0 ) ; - end - - let flush console = - begin - spaces console ; - Format.pp_print_string console.foutput (Buffer.contents console.line) ; - Buffer.clear console.line ; - end - - let write console text = spaces console ; Buffer.add_string console.line text - let env console cmd arg = spaces console ; console.env console.fline cmd arg - - -# 100 "src/wp/rformat.ml" -let __ocaml_lex_tables = { - Lexing.lex_base = - "\000\000\247\255\002\000\088\000\253\255\254\255\255\255\098\000\ - \252\255\250\255\112\000\192\000\251\255\014\001\248\255\092\001\ - \170\001\249\255\248\001\070\002\031\000\253\255\148\002\002\000\ - \226\002\032\000\084\003\010\000\027\000\003\000"; - Lexing.lex_backtrk = - "\255\255\255\255\008\000\008\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\007\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\006\000\255\255\255\255\002\000\002\000\ - \255\255\255\255\000\000\000\000\255\255\001\000"; - Lexing.lex_default = - "\001\000\000\000\255\255\255\255\000\000\000\000\000\000\255\255\ - \000\000\000\000\255\255\255\255\000\000\255\255\000\000\255\255\ - \255\255\000\000\255\255\255\255\021\000\000\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\028\000\255\255"; - Lexing.lex_trans = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\005\000\025\000\029\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\027\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \004\000\000\000\025\000\029\000\000\000\002\000\003\000\012\000\ - \023\000\025\000\027\000\000\000\028\000\000\000\000\000\010\000\ - \000\000\000\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\000\000\029\000\000\000\023\000\ - \025\000\000\000\024\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\000\000\000\000\022\000\ - \024\000\000\000\000\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\011\000\008\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\009\000\010\000\000\000\000\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\018\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\000\000\000\000\013\000\000\000\000\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \006\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\255\255\000\000\000\000\000\000\255\255\ - \000\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\000\000\000\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \015\000\000\000\000\000\000\000\000\000\000\000\000\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\000\000\000\000\000\000\000\000\000\000\000\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\016\000\000\000\014\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\019\000\000\000\017\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\000\000\000\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\000\000\000\000\000\000\000\000\000\000\000\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\026\000\000\000\000\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \000\000\000\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\027\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\027\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\026\000\000\000\000\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000"; - Lexing.lex_check = - "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\000\000\023\000\029\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\027\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \000\000\255\255\023\000\029\000\255\255\000\000\000\000\002\000\ - \020\000\025\000\027\000\255\255\027\000\255\255\255\255\002\000\ - \255\255\255\255\002\000\002\000\002\000\002\000\002\000\002\000\ - \002\000\002\000\002\000\002\000\255\255\028\000\255\255\020\000\ - \025\000\255\255\023\000\002\000\002\000\002\000\002\000\002\000\ - \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ - \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ - \002\000\002\000\002\000\002\000\002\000\255\255\255\255\020\000\ - \025\000\255\255\255\255\002\000\002\000\002\000\002\000\002\000\ - \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ - \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ - \002\000\002\000\002\000\002\000\002\000\002\000\003\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ - \003\000\003\000\007\000\007\000\007\000\007\000\007\000\007\000\ - \007\000\007\000\007\000\007\000\007\000\010\000\255\255\255\255\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\255\255\255\255\011\000\255\255\255\255\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \011\000\011\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \000\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \011\000\011\000\011\000\028\000\255\255\255\255\255\255\020\000\ - \255\255\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \011\000\011\000\011\000\013\000\255\255\255\255\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\255\255\255\255\255\255\255\255\255\255\255\255\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\255\255\255\255\255\255\255\255\255\255\255\255\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\015\000\255\255\013\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\016\000\ - \255\255\255\255\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\018\000\255\255\016\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\018\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\018\000\019\000\255\255\255\255\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\255\255\255\255\255\255\255\255\255\255\255\255\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\022\000\255\255\255\255\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\022\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\022\000\024\000\ - \255\255\255\255\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\026\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\026\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\026\000\255\255\255\255\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255"; - Lexing.lex_base_code = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\079\000\157\000\000\000\235\000\011\000\057\001\ - \135\001\027\000\213\001\035\002\000\000\000\000\113\002\027\000\ - \191\002\028\000\013\003\000\000\025\000\000\000"; - Lexing.lex_backtrk_code = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\011\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\027\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\036\000\036\000\000\000\046\000"; - Lexing.lex_default_code = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\024\000\000\000"; - Lexing.lex_trans_code = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\041\000\000\000\000\000\001\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \001\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\001\000\001\000\000\000\000\000\000\000\ - \000\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\001\000\016\000\000\000\000\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\021\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\006\000\000\000\000\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \016\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\021\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\024\000\000\000\ - \000\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\000\000\000\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\000\000\000\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\000\000\000\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\006\000\000\000\ - \000\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\000\000\000\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\000\000\000\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000"; - Lexing.lex_check_code = - "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\027\000\255\255\255\255\000\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\002\000\255\255\255\255\ - \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ - \002\000\002\000\255\255\028\000\255\255\255\255\255\255\255\255\ - \020\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ - \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ - \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ - \002\000\002\000\002\000\023\000\025\000\255\255\255\255\255\255\ - \255\255\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ - \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ - \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ - \002\000\002\000\002\000\002\000\010\000\255\255\255\255\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\011\000\255\255\255\255\011\000\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \013\000\028\000\255\255\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ - \013\000\013\000\013\000\013\000\013\000\013\000\015\000\255\255\ - \255\255\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ - \015\000\015\000\015\000\015\000\016\000\255\255\255\255\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\018\000\255\255\255\255\018\000\018\000\018\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\018\000\018\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\018\000\018\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\ - \019\000\255\255\255\255\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\ - \019\000\019\000\019\000\019\000\019\000\019\000\022\000\255\255\ - \255\255\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\024\000\255\255\255\255\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\026\000\255\255\255\255\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255"; - Lexing.lex_code = - "\255\005\255\004\255\255\007\255\006\255\255\001\005\000\006\255\ - \006\255\007\255\255\008\255\255\009\255\255\003\004\002\007\001\ - \008\000\009\255\000\004\001\006\255\009\255\008\255\255\000\005\ - \001\007\002\008\003\009\255"; -} - -let rec word console lexbuf = - lexbuf.Lexing.lex_mem <- Array.create 10 (-1) ; __ocaml_lex_word_rec console lexbuf 0 -and __ocaml_lex_word_rec console lexbuf __ocaml_lex_state = - match Lexing.new_engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 132 "src/wp/rformat.mll" - ( flush console ) -# 688 "src/wp/rformat.ml" - - | 1 -> -# 135 "src/wp/rformat.mll" - ( flush console ; Format.pp_print_newline console.foutput () ; word console lexbuf ) -# 693 "src/wp/rformat.ml" - - | 2 -> -# 138 "src/wp/rformat.mll" - ( console.spaces <- succ console.spaces ; word console lexbuf ) -# 698 "src/wp/rformat.ml" - - | 3 -> -# 140 "src/wp/rformat.mll" - ( write console "&" ; word console lexbuf ) -# 703 "src/wp/rformat.ml" - - | 4 -> -# 141 "src/wp/rformat.mll" - ( write console "%" ; word console lexbuf ) -# 708 "src/wp/rformat.ml" - - | 5 -> -let -# 143 "src/wp/rformat.mll" - arg -# 714 "src/wp/rformat.ml" -= Lexing.sub_lexeme lexbuf (lexbuf.Lexing.lex_start_pos + 1) (lexbuf.Lexing.lex_curr_pos + -1) in -# 144 "src/wp/rformat.mll" - ( - Format.pp_print_flush console.fline () ; - add_spaces console.line (int_of_string arg - Buffer.length console.line) ; - console.spaces <- 0 ; - word console lexbuf - ) -# 723 "src/wp/rformat.ml" - - | 6 -> -let -# 151 "src/wp/rformat.mll" - cmd -# 729 "src/wp/rformat.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(3) lexbuf.Lexing.lex_mem.(2) -and -# 151 "src/wp/rformat.mll" - arg -# 734 "src/wp/rformat.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(1) lexbuf.Lexing.lex_mem.(0) in -# 154 "src/wp/rformat.mll" - ( env console cmd arg ; word console lexbuf ) -# 738 "src/wp/rformat.ml" - - | 7 -> -let -# 156 "src/wp/rformat.mll" - cmd -# 744 "src/wp/rformat.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(1) lexbuf.Lexing.lex_mem.(0) in -# 159 "src/wp/rformat.mll" - ( env console cmd "" ; word console lexbuf ) -# 748 "src/wp/rformat.ml" - - | 8 -> -# 161 "src/wp/rformat.mll" - ( write console (Lexing.lexeme lexbuf) ; word console lexbuf ) -# 753 "src/wp/rformat.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_word_rec console lexbuf __ocaml_lex_state - -and command lexbuf = - lexbuf.Lexing.lex_mem <- Array.create 10 (-1) ; __ocaml_lex_command_rec lexbuf 20 -and __ocaml_lex_command_rec lexbuf __ocaml_lex_state = - match Lexing.new_engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -let -# 164 "src/wp/rformat.mll" - cmd -# 765 "src/wp/rformat.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(0) lexbuf.Lexing.lex_mem.(1) in -# 164 "src/wp/rformat.mll" - ( CMD cmd ) -# 769 "src/wp/rformat.ml" - - | 1 -> -let -# 165 "src/wp/rformat.mll" - cmd -# 775 "src/wp/rformat.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(0) lexbuf.Lexing.lex_mem.(1) -and -# 165 "src/wp/rformat.mll" - arg -# 780 "src/wp/rformat.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(2) lexbuf.Lexing.lex_mem.(3) in -# 165 "src/wp/rformat.mll" - ( ARG(cmd,arg) ) -# 784 "src/wp/rformat.ml" - - | 2 -> -# 166 "src/wp/rformat.mll" - ( TEXT ) -# 789 "src/wp/rformat.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_command_rec lexbuf __ocaml_lex_state - -;; - -# 168 "src/wp/rformat.mll" - - - let pretty env fmt msg = - let lexbuf = Lexing.from_string msg in - let line = Buffer.create 80 in - word { - line = line ; - fline = Format.formatter_of_buffer line ; - foutput = fmt ; - env = env ; - spaces = 0 ; - } lexbuf - - let command msg = - let lexbuf = Lexing.from_string msg in - command lexbuf - - -# 814 "src/wp/rformat.ml" diff -Nru frama-c-20140301+neon+dfsg/src/wp/rformat.mli frama-c-20150201+sodium+dfsg/src/wp/rformat.mli --- frama-c-20140301+neon+dfsg/src/wp/rformat.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/rformat.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -25,11 +25,11 @@ val epsilon : float val get_time : float array -> float -> int - (** [get_time T t] returns [k] such that [T[k-1] <= t <= T[k]], - [T] is extended with [T[-1]=0] and [T[N]=+oo]. *) +(** [get_time T t] returns [k] such that [T[k-1] <= t <= T[k]], + [T] is extended with [T[-1]=0] and [T[N]=+oo]. *) val pp_time : formatter -> float -> unit - (** Pretty print time in hour, minutes, seconds, or milliseconds, as appropriate *) +(** Pretty print time in hour, minutes, seconds, or milliseconds, as appropriate *) val pp_time_range : float array -> formatter -> float -> unit diff -Nru frama-c-20140301+neon+dfsg/src/wp/rformat.mll frama-c-20150201+sodium+dfsg/src/wp/rformat.mll --- frama-c-20140301+neon+dfsg/src/wp/rformat.mll 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/rformat.mll 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/script.ml frama-c-20150201+sodium+dfsg/src/wp/script.ml --- frama-c-20140301+neon+dfsg/src/wp/script.ml 2014-03-12 15:07:54.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/script.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,508 +0,0 @@ -# 23 "src/wp/script.mll" - - - type token = - | Id of string - | Key of string - | Proof of string - | Word - | Eof - - let fill buffer lexbuf = - Buffer.add_string buffer (Lexing.lexeme lexbuf) - - open Lexing - - let newline lexbuf = - lexbuf.lex_curr_p <- - { lexbuf.lex_curr_p with pos_lnum = succ lexbuf.lex_curr_p.pos_lnum } - - -# 22 "src/wp/script.ml" -let __ocaml_lex_tables = { - Lexing.lex_base = - "\000\000\247\255\248\255\001\000\250\255\081\000\162\000\254\255\ - \002\000\243\000\068\001\149\001\230\001\007\000\253\255\249\255\ - \051\000\251\255\252\255\253\255\005\000\000\000\255\255\254\255\ - \025\002\249\255\250\255\251\255\019\000\020\000\027\000\024\000\ - \027\000\017\000\255\255\010\000\038\000\018\000\028\000\254\255\ - \252\255\132\000\251\255\252\255\253\255\053\000\054\000\255\255\ - \254\255"; - Lexing.lex_backtrk = - "\255\255\255\255\255\255\008\000\255\255\004\000\004\000\255\255\ - \000\000\004\000\004\000\004\000\004\000\003\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\004\000\004\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\006\000\006\000\006\000\006\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\002\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\004\000\004\000\255\255\ - \255\255"; - Lexing.lex_default = - "\001\000\000\000\000\000\255\255\000\000\255\255\255\255\000\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\000\000\000\000\ - \017\000\000\000\000\000\000\000\255\255\255\255\000\000\000\000\ - \025\000\000\000\000\000\000\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\000\000\255\255\255\255\255\255\255\255\000\000\ - \000\000\042\000\000\000\000\000\000\000\255\255\255\255\000\000\ - \000\000"; - Lexing.lex_trans = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\008\000\007\000\008\000\000\000\008\000\000\000\008\000\ - \013\000\014\000\000\000\000\000\013\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \008\000\000\000\008\000\000\000\000\000\000\000\000\000\013\000\ - \003\000\022\000\005\000\015\000\004\000\005\000\004\000\023\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\004\000\004\000\040\000\018\000\038\000\034\000\ - \034\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \006\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\020\000\039\000\021\000\048\000\005\000\ - \047\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\035\000\032\000\005\000\033\000\ - \036\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\037\000\000\000\000\000\043\000\000\000\ - \000\000\000\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\046\000\000\000\045\000\000\000\ - \005\000\000\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\000\000\000\000\005\000\ - \000\000\000\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\ - \002\000\005\000\000\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\009\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\ - \005\000\000\000\000\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\019\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\ - \000\000\000\000\005\000\000\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\010\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\000\000\ - \000\000\005\000\000\000\000\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\044\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\000\000\ - \000\000\000\000\000\000\005\000\000\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\011\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \000\000\000\000\000\000\000\000\005\000\000\000\005\000\005\000\ - \005\000\005\000\005\000\012\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\000\000\000\000\005\000\013\000\000\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \000\000\000\000\000\000\026\000\000\000\000\000\000\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\029\000\000\000\028\000\000\000\005\000\000\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\031\000\000\000\030\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\027\000"; - Lexing.lex_check = - "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\000\000\000\000\008\000\255\255\000\000\255\255\008\000\ - \013\000\013\000\255\255\255\255\013\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \000\000\255\255\008\000\255\255\255\255\255\255\255\255\013\000\ - \000\000\021\000\000\000\003\000\000\000\000\000\000\000\020\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\028\000\016\000\029\000\033\000\ - \037\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\016\000\038\000\016\000\045\000\000\000\ - \046\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\005\000\030\000\031\000\005\000\032\000\ - \035\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\036\000\255\255\255\255\041\000\255\255\ - \255\255\255\255\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\041\000\255\255\041\000\255\255\ - \005\000\255\255\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ - \005\000\005\000\005\000\005\000\006\000\255\255\255\255\006\000\ - \255\255\255\255\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\255\255\255\255\255\255\ - \000\000\006\000\255\255\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ - \006\000\006\000\006\000\006\000\006\000\009\000\255\255\255\255\ - \009\000\255\255\255\255\009\000\009\000\009\000\009\000\009\000\ - \009\000\009\000\009\000\009\000\009\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\016\000\009\000\009\000\009\000\009\000\ - \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ - \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ - \009\000\009\000\009\000\009\000\009\000\009\000\255\255\255\255\ - \255\255\255\255\009\000\255\255\009\000\009\000\009\000\009\000\ - \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ - \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ - \009\000\009\000\009\000\009\000\009\000\009\000\010\000\255\255\ - \255\255\010\000\255\255\255\255\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\041\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\255\255\ - \255\255\255\255\255\255\010\000\255\255\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ - \010\000\010\000\010\000\010\000\010\000\010\000\010\000\011\000\ - \255\255\255\255\011\000\255\255\255\255\011\000\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \255\255\255\255\255\255\255\255\011\000\255\255\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ - \012\000\255\255\255\255\012\000\012\000\255\255\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \255\255\255\255\255\255\024\000\255\255\255\255\255\255\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\024\000\255\255\024\000\255\255\012\000\255\255\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\024\000\255\255\024\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\024\000"; - Lexing.lex_base_code = - ""; - Lexing.lex_backtrk_code = - ""; - Lexing.lex_default_code = - ""; - Lexing.lex_trans_code = - ""; - Lexing.lex_check_code = - ""; - Lexing.lex_code = - ""; -} - -let rec token lexbuf = - __ocaml_lex_token_rec lexbuf 0 -and __ocaml_lex_token_rec lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 46 "src/wp/script.mll" - ( token lexbuf ) -# 271 "src/wp/script.ml" - - | 1 -> -# 47 "src/wp/script.mll" - ( newline lexbuf ; token lexbuf ) -# 276 "src/wp/script.ml" - - | 2 -> -# 49 "src/wp/script.mll" - ( - newline lexbuf ; - let buffer = Buffer.create 512 in - proof buffer 0 lexbuf ; - Proof (Buffer.contents buffer) - ) -# 286 "src/wp/script.ml" - - | 3 -> -# 56 "src/wp/script.mll" - ( - let buffer = Buffer.create 512 in - proof buffer 0 lexbuf ; - Proof (Buffer.contents buffer) - ) -# 295 "src/wp/script.ml" - - | 4 -> -# 62 "src/wp/script.mll" - ( - Id (Lexing.lexeme lexbuf) - ) -# 302 "src/wp/script.ml" - - | 5 -> -# 65 "src/wp/script.mll" - ( Key(Lexing.lexeme lexbuf) ) -# 307 "src/wp/script.ml" - - | 6 -> -# 66 "src/wp/script.mll" - ( comment 0 lexbuf ) -# 312 "src/wp/script.ml" - - | 7 -> -# 67 "src/wp/script.mll" - ( Eof ) -# 317 "src/wp/script.ml" - - | 8 -> -# 68 "src/wp/script.mll" - ( Word ) -# 322 "src/wp/script.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_token_rec lexbuf __ocaml_lex_state - -and comment n lexbuf = - __ocaml_lex_comment_rec n lexbuf 16 -and __ocaml_lex_comment_rec n lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 71 "src/wp/script.mll" - ( if n > 0 then comment (pred n) lexbuf else token lexbuf ) -# 333 "src/wp/script.ml" - - | 1 -> -# 72 "src/wp/script.mll" - ( comment (succ n) lexbuf ) -# 338 "src/wp/script.ml" - - | 2 -> -# 73 "src/wp/script.mll" - ( failwith "Non-terminated comment" ) -# 343 "src/wp/script.ml" - - | 3 -> -# 74 "src/wp/script.mll" - ( newline lexbuf ; comment n lexbuf ) -# 348 "src/wp/script.ml" - - | 4 -> -# 75 "src/wp/script.mll" - ( comment n lexbuf ) -# 353 "src/wp/script.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_comment_rec n lexbuf __ocaml_lex_state - -and proof buffer n lexbuf = - __ocaml_lex_proof_rec buffer n lexbuf 24 -and __ocaml_lex_proof_rec buffer n lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 79 "src/wp/script.mll" - ( - if n > 0 then proof buffer (pred n) lexbuf - ) -# 366 "src/wp/script.ml" - - | 1 -> -# 82 "src/wp/script.mll" - ( skip 0 lexbuf ; proof buffer n lexbuf ) -# 371 "src/wp/script.ml" - - | 2 -> -# 83 "src/wp/script.mll" - ( fill buffer lexbuf ; proof buffer (succ n) lexbuf ) -# 376 "src/wp/script.ml" - - | 3 -> -# 84 "src/wp/script.mll" - ( fill buffer lexbuf ; - if n>0 then proof buffer (pred n) lexbuf - else failwith "Non-terminated comment (inside proof)" ) -# 383 "src/wp/script.ml" - - | 4 -> -# 87 "src/wp/script.mll" - ( failwith "Non-terminated proof" ) -# 388 "src/wp/script.ml" - - | 5 -> -# 88 "src/wp/script.mll" - ( fill buffer lexbuf ; newline lexbuf ; proof buffer n lexbuf ) -# 393 "src/wp/script.ml" - - | 6 -> -# 89 "src/wp/script.mll" - ( fill buffer lexbuf ; proof buffer n lexbuf ) -# 398 "src/wp/script.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_proof_rec buffer n lexbuf __ocaml_lex_state - -and skip n lexbuf = - __ocaml_lex_skip_rec n lexbuf 41 -and __ocaml_lex_skip_rec n lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 92 "src/wp/script.mll" - ( skip (succ n) lexbuf ) -# 409 "src/wp/script.ml" - - | 1 -> -# 93 "src/wp/script.mll" - ( if n>0 then skip (pred n) lexbuf ) -# 414 "src/wp/script.ml" - - | 2 -> -# 94 "src/wp/script.mll" - ( () ) -# 419 "src/wp/script.ml" - - | 3 -> -# 95 "src/wp/script.mll" - ( newline lexbuf ; skip n lexbuf ) -# 424 "src/wp/script.ml" - - | 4 -> -# 96 "src/wp/script.mll" - ( skip n lexbuf ) -# 429 "src/wp/script.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_skip_rec n lexbuf __ocaml_lex_state - -;; - -# 98 "src/wp/script.mll" - - - let filter key = - let lexbuf = Lexing.from_string key in - match token lexbuf with - | Id a -> Some a - | _ -> None - - type input = { - src : string ; - inc : in_channel ; - lexbuf : Lexing.lexbuf ; - mutable token : token ; - mutable tik : int ; - } - - let open_file f = - let inc = open_in f in - let lex = Lexing.from_channel inc in - let tok = token lex in - { src=f ; tik=0 ; inc=inc ; lexbuf=lex ; token=tok } - - let pp_token lexbuf fmt = function - | Id x -> Format.fprintf fmt "ident '%s'" x - | Key k -> Format.fprintf fmt "'%s'" k - | Proof _ -> Format.fprintf fmt "Proof...Qed" - | Eof -> Format.fprintf fmt "end-of-file" - | Word -> Format.fprintf fmt "start of '%s'" (Lexing.lexeme lexbuf) - - let skip input = - if input.token <> Eof then - ( input.tik <- 0 ; input.token <- token input.lexbuf ) - let token input = - input.tik <- succ input.tik ; - if input.tik > 1000 then failwith "Blocked" ; - input.token - let close input = close_in input.inc - let error input text = - let buffer = Buffer.create 80 in - let fmt = Format.formatter_of_buffer buffer in - let line = (Lexing.lexeme_start_p input.lexbuf).Lexing.pos_lnum in - Format.fprintf fmt "%s:%d: " input.src line ; - Format.kfprintf - (fun fmt -> - Format.fprintf fmt "(at %a)" (pp_token input.lexbuf) input.token ; - Format.pp_print_flush fmt () ; - failwith (Buffer.contents buffer) - ) fmt text - - let key input k = - match input.token with - | (Key a) | (Id a) when a=k -> skip input ; true - | _ -> false - - let eat input k = - if not (key input k) then error input "Missing '%s'" k - - let ident input = - match input.token with - | Id a -> skip input ; a - | _ -> error input "Missing identifier" - - let rec idents input = - match input.token with - | Id a -> - skip input ; - if key input "," then a :: idents input else [a] - | Word -> - skip input ; - if key input "," then idents input else [] - | _ -> [] - - -# 509 "src/wp/script.ml" diff -Nru frama-c-20140301+neon+dfsg/src/wp/script.mli frama-c-20150201+sodium+dfsg/src/wp/script.mli --- frama-c-20140301+neon+dfsg/src/wp/script.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/script.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/script.mll frama-c-20150201+sodium+dfsg/src/wp/script.mll --- frama-c-20140301+neon+dfsg/src/wp/script.mll 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/script.mll 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Bits.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Bits.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Bits.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Bits.v 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/bool/Bool.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/bool/Bool.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/bool/Bool.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/bool/Bool.v 2015-05-28 08:53:24.000000000 +0000 @@ -15,7 +15,7 @@ (* Why3 goal *) Lemma andb_def : forall (x:bool) (y:bool), - ((andb x y) = match x with + ((Init.Datatypes.andb x y) = match x with | true => y | false => false end). @@ -26,7 +26,7 @@ (* Why3 goal *) Lemma orb_def : forall (x:bool) (y:bool), - ((orb x y) = match x with + ((Init.Datatypes.orb x y) = match x with | false => y | true => true end). @@ -36,7 +36,8 @@ Qed. (* Why3 goal *) -Lemma xorb_def : forall (x:bool) (y:bool), ((xorb x y) = match (x, +Lemma xorb_def : forall (x:bool) (y:bool), + ((Init.Datatypes.xorb x y) = match (x, y) with | (true, false) => true | (false, true) => true @@ -49,7 +50,7 @@ (* Why3 goal *) Lemma notb_def : forall (x:bool), - ((negb x) = match x with + ((Init.Datatypes.negb x) = match x with | false => true | true => false end). @@ -59,7 +60,8 @@ Qed. (* Why3 goal *) -Lemma implb_def : forall (x:bool) (y:bool), ((implb x y) = match (x, +Lemma implb_def : forall (x:bool) (y:bool), + ((Init.Datatypes.implb x y) = match (x, y) with | (true, false) => false | (_, _) => true diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Cbits.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Cbits.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Cbits.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Cbits.v 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -23,7 +23,6 @@ (* This file is generated by Why3's Coq-realize driver *) (* Beware! Only edit allowed sections below *) Require Import BuiltIn. -Require Import ZOdiv. Require BuiltIn. Require Qed. Require bool.Bool. @@ -100,8 +99,55 @@ Qed. (* Why3 goal *) +Lemma bit_test_extraction_eq : forall (x:Z) (k:Z), (0%Z <= k)%Z -> + (((Cint.land x (Cint.lsl 1%Z k)) = (Cint.lsl 1%Z k)) <-> (Cint.bit_test x + k)). +Proof. + intros x k h1. + unfold Cint.land. + unfold Cint.lsl; unfold Zbits.lsl. + rewrite (Zle_imp_le_bool _ _ h1); unfold Zbits.lsl_def. + + unfold Cint.bit_test; unfold Cint.bit_testb; + unfold_bit_testb h1; unfold Zbits.zbit_test_def. + pose (i:= (Z.abs_nat k)); fold i. + rewrite Zbits.Zbit_extraction_true. + split; auto. +Qed. + +(* Why3 goal *) +Lemma lsl_1_0 : ((Cint.lsl 1%Z 0%Z) = 1%Z). +Proof. + compute. auto. +Qed. + +(* Why3 goal *) +Lemma bit_test_extraction_bis : forall (x:Z), (~ ((Cint.land 1%Z + x) = 0%Z)) -> (Cint.bit_test x 0%Z). +Proof. + intros x. + rewrite <- lsl_1_0. + intro. + apply bit_test_extraction. + omega. + rewrite Zbits.land_commut. + auto. +Qed. + +(* Why3 goal *) +Lemma bit_test_extraction_bis_eq : forall (x:Z), (Cint.bit_test x 0%Z) -> + ((Cint.land 1%Z x) = 1%Z). +Proof. + intros x h1. + rewrite <- lsl_1_0. + rewrite <- Zbits.land_commut. + apply bit_test_extraction_eq; auto with zarith. +Qed. + +(* Why3 goal *) Lemma lnot_extraction_bool : forall (x:Z) (i:Z), (0%Z <= i)%Z -> - ((Cint.bit_testb (Cint.lnot x) i) = (negb (Cint.bit_testb x i))). + ((Cint.bit_testb (Cint.lnot x) i) = (Init.Datatypes.negb (Cint.bit_testb x + i))). Proof. intros x i h1. unfold_bit_testb h1. apply Zbits.lnot_extraction. @@ -120,8 +166,8 @@ (* Why3 goal *) Lemma land_extraction_bool : forall (x:Z) (y:Z) (i:Z), (0%Z <= i)%Z -> - ((Cint.bit_testb (Cint.land x y) i) = (andb (Cint.bit_testb x - i) (Cint.bit_testb y i))). + ((Cint.bit_testb (Cint.land x y) + i) = (Init.Datatypes.andb (Cint.bit_testb x i) (Cint.bit_testb y i))). Proof. intros x y i h1. unfold_bit_testb h1. apply Zbits.land_extraction. @@ -141,7 +187,7 @@ (* Why3 goal *) Lemma lor_extraction_bool : forall (x:Z) (y:Z) (i:Z), (0%Z <= i)%Z -> - ((Cint.bit_testb (Cint.lor x y) i) = (orb (Cint.bit_testb x + ((Cint.bit_testb (Cint.lor x y) i) = (Init.Datatypes.orb (Cint.bit_testb x i) (Cint.bit_testb y i))). Proof. intros x y i h1. unfold_bit_testb h1. @@ -162,8 +208,8 @@ (* Why3 goal *) Lemma lxor_extraction_bool : forall (x:Z) (y:Z) (i:Z), (0%Z <= i)%Z -> - ((Cint.bit_testb (Cint.lxor x y) i) = (xorb (Cint.bit_testb x - i) (Cint.bit_testb y i))). + ((Cint.bit_testb (Cint.lxor x y) + i) = (Init.Datatypes.xorb (Cint.bit_testb x i) (Cint.bit_testb y i))). Proof. intros x y i h1. unfold_bit_testb h1. @@ -186,6 +232,39 @@ destruct H; apply H0; discriminate. Qed. +(* Why3 goal *) +Lemma land_1_lsl_1 : forall (a:Z) (x:Z) (n:Z), (0%Z <= n)%Z -> + ((a < (Cint.lsl 1%Z n))%Z -> (((2%Z * a)%Z + (Cint.land 1%Z + x))%Z < (Cint.lsl 1%Z (1%Z + n)%Z))%Z). +Proof. + intros a x n h1. + unfold Cint.lsl; unfold Zbits.lsl. + case_leq 0%Z (1 + n)%Z ; intro. + case_leq 0%Z (n)%Z ; intro. + + unfold Zbits.lsl_def. + rewrite Zbits.lsl_arithmetic_shift. + unfold Zbits.lsl_arithmetic_def. + rewrite Zabs2Nat.abs_nat_nonneg by auto. + rewrite Zabs2Nat.abs_nat_nonneg by auto. + rewrite Z2Nat.inj_add by omega. + pose (n0:=Z.to_nat n); fold n0. + + replace ((Z.to_nat 1%Z)%nat) with (1%nat) by auto. + rewrite Bits.two_power_nat_plus. + replace ((two_power_nat 1)%Z) with (2%Z) by auto with zarith. + replace ((1 * two_power_nat n0)%Z) with ((two_power_nat n0)%Z) by auto. + replace ((1 * (2 * two_power_nat n0))%Z) with ((2 * two_power_nat n0)%Z) by ring. + + intro. + cut((Cint.land 1 x < 2)%Z) ; auto with zarith. + + case_eq ((Cint.land 1 x)%Z) (0%Z); intros. + rewrite bit_test_extraction_bis_eq; [omega|]. + apply bit_test_extraction_bis. + auto. +Qed. + (** ** Shift operators *) (* Why3 goal *) Lemma lsl_extraction_sup_bool : forall (x:Z) (n:Z) (m:Z), (0%Z <= n)%Z -> @@ -304,6 +383,29 @@ unfold Cint.bit_test; rewrite lsl1_extraction_bool; auto. apply Qed.eqb1. Qed. +(* Why3 goal *) +Lemma pos_extraction_sup : forall (x:Z) (i:Z) (j:Z), (0%Z <= x)%Z -> + ((0%Z <= i)%Z -> ((x < (Cint.lsl 1%Z i))%Z -> ((i <= j)%Z -> + ~ (Cint.bit_test x j)))). +Proof. + intros x i j h1 h2. + unfold Cint.lsl ; unfold Cint.bit_test. + rewrite Zbits.lsl_pos; auto. + unfold Zbits.lsl_def. + rewrite Zbits.lsl_arithmetic_shift. + unfold Zbits.lsl_arithmetic_def. + replace (1 * two_power_nat (Z.abs_nat i)) with (two_power_nat (Z.abs_nat i)) by ring. + intros. + rewrite Zbits.bit_testb_pos ; auto. + assert (HB:(Bits.Zbit x (Z.abs_nat j) = false)). + (apply (Zbits.Zbit_unsigned_trail (Z.abs_nat i) (Z.abs_nat j) x); auto). + apply Zabs_nat_le; omega. + unfold Zbits.zbit_test_def. + + rewrite HB; discriminate. + omega. +Qed. + (** * Link between Bit extraction and C type conversions *) (** Tacticals *) Local Ltac naturalize_int_extraction_inf_bool n vn vz := @@ -372,6 +474,30 @@ int_extraction_inf to_uint8_extraction_inf_bool. Qed. +(* Why3 goal *) +Lemma is_uint8_ext : forall (x:Z) (y:Z), (Cint.is_uint8 x) -> ((Cint.is_uint8 + y) -> ((forall (i:Z), ((0%Z <= i)%Z /\ (i < 8%Z)%Z) -> ((Cint.bit_test x + i) <-> (Cint.bit_test y i))) -> (x = y))). +Proof. + intros x y h1 h2 h3. + assert (forall i: int, (0 <= i)%Z -> (Cint.bit_test x i <-> Cint.bit_test y i)). + intros. + case_leq i 7; intro. + apply h3; omega. + assert (~ Cint.bit_test x i). + apply to_uint8_extraction_sup. omega. auto. + assert (~ Cint.bit_test y i). + apply to_uint8_extraction_sup. omega. auto. + intuition. + clear h1; clear h2; clear h3. + + unfold Cint.bit_test in H. + unfold Cint.bit_testb in H. + apply Zbits.bit_testb_ext; intros. + rewrite <- Zbits.bool2_eq_true. + apply H; auto. +Qed. + (** *** Cast to uint16 C type *) (* Why3 goal *) Lemma to_uint16_extraction_sup : forall (x:Z) (i:Z), (16%Z <= i)%Z -> @@ -397,6 +523,30 @@ int_extraction_inf to_uint16_extraction_inf_bool. Qed. +(* Why3 goal *) +Lemma is_uint16_ext : forall (x:Z) (y:Z), (Cint.is_uint16 x) -> + ((Cint.is_uint16 y) -> ((forall (i:Z), ((0%Z <= i)%Z /\ (i < 16%Z)%Z) -> + ((Cint.bit_test x i) <-> (Cint.bit_test y i))) -> (x = y))). +Proof. + intros x y h1 h2 h3. + assert (forall i: int, (0 <= i)%Z -> (Cint.bit_test x i <-> Cint.bit_test y i)). + intros. + case_leq i 15; intro. + apply h3; omega. + assert (~ Cint.bit_test x i). + apply to_uint16_extraction_sup. omega. auto. + assert (~ Cint.bit_test y i). + apply to_uint16_extraction_sup. omega. auto. + intuition. + clear h1; clear h2; clear h3. + + unfold Cint.bit_test in H. + unfold Cint.bit_testb in H. + apply Zbits.bit_testb_ext; intros. + rewrite <- Zbits.bool2_eq_true. + apply H; auto. +Qed. + (** *** Cast to uint32 C type *) (* Why3 goal *) Lemma to_uint32_extraction_sup : forall (x:Z) (i:Z), (32%Z <= i)%Z -> @@ -422,6 +572,30 @@ int_extraction_inf to_uint32_extraction_inf_bool. Qed. +(* Why3 goal *) +Lemma is_uint32_ext : forall (x:Z) (y:Z), (Cint.is_uint32 x) -> + ((Cint.is_uint32 y) -> ((forall (i:Z), ((0%Z <= i)%Z /\ (i < 32%Z)%Z) -> + ((Cint.bit_test x i) <-> (Cint.bit_test y i))) -> (x = y))). +Proof. + intros x y h1 h2 h3. + assert (forall i: int, (0 <= i)%Z -> (Cint.bit_test x i <-> Cint.bit_test y i)). + intros. + case_leq i 31; intro. + apply h3; omega. + assert (~ Cint.bit_test x i). + apply to_uint32_extraction_sup. omega. auto. + assert (~ Cint.bit_test y i). + apply to_uint32_extraction_sup. omega. auto. + intuition. + clear h1; clear h2; clear h3. + + unfold Cint.bit_test in H. + unfold Cint.bit_testb in H. + apply Zbits.bit_testb_ext; intros. + rewrite <- Zbits.bool2_eq_true. + apply H; auto. +Qed. + (** *** Cast to uint64 C type *) (* Why3 goal *) Lemma to_uint64_extraction_sup : forall (x:Z) (i:Z), (64%Z <= i)%Z -> @@ -447,6 +621,30 @@ int_extraction_inf to_uint64_extraction_inf_bool. Qed. +(* Why3 goal *) +Lemma is_uint64_ext : forall (x:Z) (y:Z), (Cint.is_uint64 x) -> + ((Cint.is_uint64 y) -> ((forall (i:Z), ((0%Z <= i)%Z /\ (i < 64%Z)%Z) -> + ((Cint.bit_test x i) <-> (Cint.bit_test y i))) -> (x = y))). +Proof. + intros x y h1 h2 h3. + assert (forall i: int, (0 <= i)%Z -> (Cint.bit_test x i <-> Cint.bit_test y i)). + intros. + case_leq i 63; intro. + apply h3; omega. + assert (~ Cint.bit_test x i). + apply to_uint64_extraction_sup. omega. auto. + assert (~ Cint.bit_test y i). + apply to_uint64_extraction_sup. omega. auto. + intuition. + clear h1; clear h2; clear h3. + + unfold Cint.bit_test in H. + unfold Cint.bit_testb in H. + apply Zbits.bit_testb_ext; intros. + rewrite <- Zbits.bool2_eq_true. + apply H; auto. +Qed. + (** ** Signed conversions *) (** Tactical *) Local Ltac sint_extraction_sup is_sint vn vz := @@ -462,13 +660,6 @@ apply (Zbits.Zbit_trail vn (Z.abs_nat i) x); auto. (** *** To sint8 C type*) -(* Why3 goal *) -Lemma to_sint8_extraction_sup : forall (x:Z) (i:Z), (7%Z <= i)%Z -> - ((Cint.is_sint8 x) -> ((Cint.bit_test x i) <-> (x < 0%Z)%Z)). -Proof. - sint_extraction_sup Cint.is_sint8 7%nat 7. -Qed. - Local Ltac sint_extraction_inf m x to_sint n vz wz:= unfold to_sint; unfold Cint.to_range; (replace (vz - wz) with (2 * two_power_nat n) by (auto with zarith)); @@ -479,98 +670,9 @@ rewrite Zbits.Zbit_sint_mod_two_power_nat; auto. -(* Why3 goal *) -Lemma to_sint8_extraction_inf_bool : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ - (i < 7%Z)%Z) -> ((Cint.bit_testb (Cint.to_sint8 x) i) = (Cint.bit_testb x - i)). -Proof. - naturalize_int_extraction_inf_bool n 7%nat 7. - sint_extraction_inf n x Cint.to_sint8 7%nat 128 (-128). -Qed. - -(* Why3 goal *) -Lemma to_sint8_extraction_inf : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ - (i < 7%Z)%Z) -> ((Cint.bit_test (Cint.to_sint8 x) i) <-> (Cint.bit_test x - i)). -Proof. - int_extraction_inf to_sint8_extraction_inf_bool. -Qed. - (** *** To sint16 C type*) -(* Why3 goal *) -Lemma to_sint16_extraction_sup : forall (x:Z) (i:Z), (15%Z <= i)%Z -> - ((Cint.is_sint16 x) -> ((Cint.bit_test x i) <-> (x < 0%Z)%Z)). -Proof. - sint_extraction_sup Cint.is_sint16 15%nat 15. -Qed. - -(* Why3 goal *) -Lemma to_sint16_extraction_inf_bool : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ - (i < 15%Z)%Z) -> ((Cint.bit_testb (Cint.to_sint16 x) i) = (Cint.bit_testb x - i)). -Proof. - naturalize_int_extraction_inf_bool n 16%nat 16. - sint_extraction_inf n x Cint.to_sint16 15%nat 32768 (-32768). -Qed. - -(* Why3 goal *) -Lemma to_sint16_extraction_inf : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ - (i < 15%Z)%Z) -> ((Cint.bit_test (Cint.to_sint16 x) i) <-> (Cint.bit_test x - i)). -Proof. - int_extraction_inf to_sint16_extraction_inf_bool. -Qed. - (** *** To sint32 C type *) -(* Why3 goal *) -Lemma to_sint32_extraction_sup : forall (x:Z) (i:Z), (31%Z <= i)%Z -> - ((Cint.is_sint32 x) -> ((Cint.bit_test x i) <-> (x < 0%Z)%Z)). -Proof. - sint_extraction_sup Cint.is_sint32 31%nat 31. -Qed. - -(* Why3 goal *) -Lemma to_sint32_extraction_inf_bool : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ - (i < 31%Z)%Z) -> ((Cint.bit_testb (Cint.to_sint32 x) i) = (Cint.bit_testb x - i)). -Proof. - naturalize_int_extraction_inf_bool n 32%nat 32. - sint_extraction_inf n x Cint.to_sint32 31%nat 2147483648 (-2147483648). -Qed. - -(* Why3 goal *) -Lemma to_sint32_extraction_inf : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ - (i < 31%Z)%Z) -> ((Cint.bit_test (Cint.to_sint32 x) i) <-> (Cint.bit_test x - i)). -Proof. - int_extraction_inf to_sint32_extraction_inf_bool. -Qed. - (** *** To sint64 C type *) -(* Why3 goal *) -Lemma to_sint64_extraction_sup : forall (x:Z) (i:Z), (63%Z <= i)%Z -> - ((Cint.is_sint64 x) -> ((Cint.bit_test x i) <-> (x < 0%Z)%Z)). -Proof. - sint_extraction_sup Cint.is_sint64 63%nat 63. -Qed. - -(* Why3 goal *) -Lemma to_sint64_extraction_inf_bool : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ - (i < 63%Z)%Z) -> ((Cint.bit_testb (Cint.to_sint64 x) i) = (Cint.bit_testb x - i)). -Proof. - naturalize_int_extraction_inf_bool n 64%nat 64. - sint_extraction_inf n x Cint.to_sint64 63%nat 9223372036854775808 (-9223372036854775808). -Qed. - -(* Why3 goal *) -Lemma to_sint64_extraction_inf : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ - (i < 63%Z)%Z) -> ((Cint.bit_test (Cint.to_sint64 x) i) <-> (Cint.bit_test x - i)). -Proof. - int_extraction_inf to_sint64_extraction_inf_bool. -Qed. - (** * Some C-Integer Bits Conversions are identity *) (** Tacticals *) Local Ltac unfold_hyp h := @@ -674,6 +776,237 @@ apply Z_mod_mult. (** *** Cast to uint8 C type *) +(** *** Cast to uint16 C type *) +(** *** Cast to uint32 C type *) +(** *** Cast to uint64 C type *) +(* Why3 goal *) +Lemma to_sint8_extraction_sup : forall (x:Z) (i:Z), (7%Z <= i)%Z -> + ((Cint.is_sint8 x) -> ((Cint.bit_test x i) <-> (x < 0%Z)%Z)). +Proof. + sint_extraction_sup Cint.is_sint8 7%nat 7. +Qed. + +(* Why3 goal *) +Lemma to_sint8_extraction_inf_bool : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ + (i < 7%Z)%Z) -> ((Cint.bit_testb (Cint.to_sint8 x) i) = (Cint.bit_testb x + i)). +Proof. + naturalize_int_extraction_inf_bool n 7%nat 7. + sint_extraction_inf n x Cint.to_sint8 7%nat 128 (-128). +Qed. + +(* Why3 goal *) +Lemma to_sint8_extraction_inf : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ + (i < 7%Z)%Z) -> ((Cint.bit_test (Cint.to_sint8 x) i) <-> (Cint.bit_test x + i)). +Proof. + int_extraction_inf to_sint8_extraction_inf_bool. +Qed. + +(* Why3 goal *) +Lemma is_sint8_ext : forall (x:Z) (y:Z), (Cint.is_sint8 x) -> ((Cint.is_sint8 + y) -> ((forall (i:Z), ((0%Z <= i)%Z /\ (i <= 7%Z)%Z) -> ((Cint.bit_test x + i) <-> (Cint.bit_test y i))) -> (x = y))). +Proof. + intros x y h1 h2 h3. + assert (forall i: int, (0 <= i)%Z -> (Cint.bit_test x i <-> Cint.bit_test y i)). + intros. + case_lt i 8; intro. + apply h3; omega. + assert (0<=7<=7) by omega. + specialize ((h3 7) H1); clear H1. + assert (7<=7) by omega. + generalize ((to_sint8_extraction_sup x 7) H1 h1). + generalize ((to_sint8_extraction_sup y 7) H1 h2). + clear H1; intros. + rewrite h3 in H2. rewrite H2 in H1. clear H2. + assert ((Cint.bit_test x i) <-> x < 0). + apply to_sint8_extraction_sup. omega. auto. + assert ((Cint.bit_test y i) <-> y < 0). + apply to_sint8_extraction_sup. omega. auto. + rewrite H2. + rewrite H3. + auto. + clear h1; clear h2; clear h3. + + unfold Cint.bit_test in H. + unfold Cint.bit_testb in H. + apply Zbits.bit_testb_ext; intros. + rewrite <- Zbits.bool2_eq_true. + apply H; auto. +Qed. + +(* Why3 goal *) +Lemma to_sint16_extraction_sup : forall (x:Z) (i:Z), (15%Z <= i)%Z -> + ((Cint.is_sint16 x) -> ((Cint.bit_test x i) <-> (x < 0%Z)%Z)). +Proof. + sint_extraction_sup Cint.is_sint16 15%nat 15. +Qed. + +(* Why3 goal *) +Lemma to_sint16_extraction_inf_bool : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ + (i < 15%Z)%Z) -> ((Cint.bit_testb (Cint.to_sint16 x) i) = (Cint.bit_testb x + i)). +Proof. + naturalize_int_extraction_inf_bool n 16%nat 16. + sint_extraction_inf n x Cint.to_sint16 15%nat 32768 (-32768). +Qed. + +(* Why3 goal *) +Lemma to_sint16_extraction_inf : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ + (i < 15%Z)%Z) -> ((Cint.bit_test (Cint.to_sint16 x) i) <-> (Cint.bit_test x + i)). +Proof. + int_extraction_inf to_sint16_extraction_inf_bool. +Qed. + +(* Why3 goal *) +Lemma is_sint16_ext : forall (x:Z) (y:Z), (Cint.is_sint16 x) -> + ((Cint.is_sint16 y) -> ((forall (i:Z), ((0%Z <= i)%Z /\ (i <= 15%Z)%Z) -> + ((Cint.bit_test x i) <-> (Cint.bit_test y i))) -> (x = y))). +Proof. + intros x y h1 h2 h3. + assert (forall i: int, (0 <= i)%Z -> (Cint.bit_test x i <-> Cint.bit_test y i)). + intros. + case_lt i 16; intro. + apply h3; omega. + assert (0<=15<=15) by omega. + specialize ((h3 15) H1); clear H1. + assert (15<=15) by omega. + generalize ((to_sint16_extraction_sup x 15) H1 h1). + generalize ((to_sint16_extraction_sup y 15) H1 h2). + clear H1; intros. + rewrite h3 in H2. rewrite H2 in H1. clear H2. + assert ((Cint.bit_test x i) <-> x < 0). + apply to_sint16_extraction_sup. omega. auto. + assert ((Cint.bit_test y i) <-> y < 0). + apply to_sint16_extraction_sup. omega. auto. + rewrite H2. + rewrite H3. + auto. + clear h1; clear h2; clear h3. + + unfold Cint.bit_test in H. + unfold Cint.bit_testb in H. + apply Zbits.bit_testb_ext; intros. + rewrite <- Zbits.bool2_eq_true. + apply H; auto. +Qed. + +(* Why3 goal *) +Lemma to_sint32_extraction_sup : forall (x:Z) (i:Z), (31%Z <= i)%Z -> + ((Cint.is_sint32 x) -> ((Cint.bit_test x i) <-> (x < 0%Z)%Z)). +Proof. + sint_extraction_sup Cint.is_sint32 31%nat 31. +Qed. + +(* Why3 goal *) +Lemma to_sint32_extraction_inf_bool : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ + (i < 31%Z)%Z) -> ((Cint.bit_testb (Cint.to_sint32 x) i) = (Cint.bit_testb x + i)). +Proof. + naturalize_int_extraction_inf_bool n 32%nat 32. + sint_extraction_inf n x Cint.to_sint32 31%nat 2147483648 (-2147483648). +Qed. + +(* Why3 goal *) +Lemma to_sint32_extraction_inf : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ + (i < 31%Z)%Z) -> ((Cint.bit_test (Cint.to_sint32 x) i) <-> (Cint.bit_test x + i)). +Proof. + int_extraction_inf to_sint32_extraction_inf_bool. +Qed. + +(* Why3 goal *) +Lemma is_sint32_ext : forall (x:Z) (y:Z), (Cint.is_sint32 x) -> + ((Cint.is_sint32 y) -> ((forall (i:Z), ((0%Z <= i)%Z /\ (i <= 31%Z)%Z) -> + ((Cint.bit_test x i) <-> (Cint.bit_test y i))) -> (x = y))). +Proof. + intros x y h1 h2 h3. + assert (forall i: int, (0 <= i)%Z -> (Cint.bit_test x i <-> Cint.bit_test y i)). + intros. + case_lt i 31; intro. + apply h3; omega. + assert (0<=31<=31) by omega. + specialize ((h3 31) H1); clear H1. + assert (31<=31) by omega. + generalize ((to_sint32_extraction_sup x 31) H1 h1). + generalize ((to_sint32_extraction_sup y 31) H1 h2). + clear H1; intros. + rewrite h3 in H2. rewrite H2 in H1. clear H2. + assert ((Cint.bit_test x i) <-> x < 0). + apply to_sint32_extraction_sup. omega. auto. + assert ((Cint.bit_test y i) <-> y < 0). + apply to_sint32_extraction_sup. omega. auto. + rewrite H2. + rewrite H3. + auto. + clear h1; clear h2; clear h3. + + unfold Cint.bit_test in H. + unfold Cint.bit_testb in H. + apply Zbits.bit_testb_ext; intros. + rewrite <- Zbits.bool2_eq_true. + apply H; auto. +Qed. + +(* Why3 goal *) +Lemma to_sint64_extraction_sup : forall (x:Z) (i:Z), (63%Z <= i)%Z -> + ((Cint.is_sint64 x) -> ((Cint.bit_test x i) <-> (x < 0%Z)%Z)). +Proof. + sint_extraction_sup Cint.is_sint64 63%nat 63. +Qed. + +(* Why3 goal *) +Lemma to_sint64_extraction_inf_bool : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ + (i < 63%Z)%Z) -> ((Cint.bit_testb (Cint.to_sint64 x) i) = (Cint.bit_testb x + i)). +Proof. + naturalize_int_extraction_inf_bool n 64%nat 64. + sint_extraction_inf n x Cint.to_sint64 63%nat 9223372036854775808 (-9223372036854775808). +Qed. + +(* Why3 goal *) +Lemma to_sint64_extraction_inf : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ + (i < 63%Z)%Z) -> ((Cint.bit_test (Cint.to_sint64 x) i) <-> (Cint.bit_test x + i)). +Proof. + int_extraction_inf to_sint64_extraction_inf_bool. +Qed. + +(* Why3 goal *) +Lemma is_sint64_ext : forall (x:Z) (y:Z), (Cint.is_sint64 x) -> + ((Cint.is_sint64 y) -> ((forall (i:Z), ((0%Z <= i)%Z /\ (i <= 63%Z)%Z) -> + ((Cint.bit_test x i) <-> (Cint.bit_test y i))) -> (x = y))). +Proof. + intros x y h1 h2 h3. + assert (forall i: int, (0 <= i)%Z -> (Cint.bit_test x i <-> Cint.bit_test y i)). + intros. + case_lt i 64; intro. + apply h3; omega. + assert (0<=63<=63) by omega. + specialize ((h3 63) H1); clear H1. + assert (63<=63) by omega. + generalize ((to_sint64_extraction_sup x 63) H1 h1). + generalize ((to_sint64_extraction_sup y 63) H1 h2). + clear H1; intros. + rewrite h3 in H2. rewrite H2 in H1. clear H2. + assert ((Cint.bit_test x i) <-> x < 0). + apply to_sint64_extraction_sup. omega. auto. + assert ((Cint.bit_test y i) <-> y < 0). + apply to_sint64_extraction_sup. omega. auto. + rewrite H2. + rewrite H3. + auto. + clear h1; clear h2; clear h3. + + unfold Cint.bit_test in H. + unfold Cint.bit_testb in H. + apply Zbits.bit_testb_ext; intros. + rewrite <- Zbits.bool2_eq_true. + apply H; auto. +Qed. + (* Why3 goal *) Lemma is_uint8_lor : forall (x:Z) (y:Z), (Cint.is_uint8 x) -> ((Cint.is_uint8 y) -> ((Cint.to_uint8 (Cint.lor x y)) = (Cint.lor x y))). @@ -711,7 +1044,6 @@ uint_lsl1_sup n Cint.to_uint8 8%nat 256. Qed. -(** *** Cast to uint16 C type *) (* Why3 goal *) Lemma is_uint16_lor : forall (x:Z) (y:Z), (Cint.is_uint16 x) -> ((Cint.is_uint16 y) -> ((Cint.to_uint16 (Cint.lor x y)) = (Cint.lor x y))). @@ -750,7 +1082,6 @@ uint_lsl1_sup n Cint.to_uint16 16%nat 65536. Qed. -(** *** Cast to uint32 C type *) (* Why3 goal *) Lemma is_uint32_lor : forall (x:Z) (y:Z), (Cint.is_uint32 x) -> ((Cint.is_uint32 y) -> ((Cint.to_uint32 (Cint.lor x y)) = (Cint.lor x y))). @@ -789,7 +1120,6 @@ uint_lsl1_sup n Cint.to_uint32 32%nat 4294967296. Qed. -(** *** Cast to uint64 C type *) (* Why3 goal *) Lemma is_uint64_lor : forall (x:Z) (y:Z), (Cint.is_uint64 x) -> ((Cint.is_uint64 y) -> ((Cint.to_uint64 (Cint.lor x y)) = (Cint.lor x y))). diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Cfloat.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Cfloat.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Cfloat.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Cfloat.v 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -23,8 +23,8 @@ (* This file is generated by Why3's Coq-realize driver *) (* Beware! Only edit allowed sections below *) Require Import BuiltIn. -Require Import Rbasic_fun. -Require Import R_sqrt. +Require Reals.Rbasic_fun. +Require Reals.R_sqrt. Require BuiltIn. Require real.Real. Require real.RealInfix. @@ -100,26 +100,27 @@ Definition mul_float64 (x:R) (y:R): R := (to_float64 (x * y)%R). (* Why3 assumption *) -Definition div_float32 (x:R) (y:R): R := (to_float32 (Rdiv x y)%R). +Definition div_float32 (x:R) (y:R): R := (to_float32 (x / y)%R). (* Why3 assumption *) -Definition div_float64 (x:R) (y:R): R := (to_float64 (Rdiv x y)%R). +Definition div_float64 (x:R) (y:R): R := (to_float64 (x / y)%R). (* Why3 assumption *) -Definition sqrt_float32 (x:R): R := (to_float32 (sqrt x)). +Definition sqrt_float32 (x:R): R := (to_float32 (Reals.R_sqrt.sqrt x)). (* Why3 assumption *) -Definition sqrt_float64 (x:R): R := (to_float64 (sqrt x)). +Definition sqrt_float64 (x:R): R := (to_float64 (Reals.R_sqrt.sqrt x)). (* Why3 goal *) Definition model: R -> R. Admitted. (* Why3 assumption *) -Definition delta (x:R): R := (Rabs (x - (model x))%R). +Definition delta (x:R): R := (Reals.Rbasic_fun.Rabs (x - (model x))%R). (* Why3 assumption *) -Definition error (x:R): R := (Rdiv (delta x) (Rabs (model x)))%R. +Definition error (x:R): R := + ((delta x) / (Reals.Rbasic_fun.Rabs (model x)))%R. (* Why3 goal *) Lemma model_float_32 : forall (x:R), ((model (to_float32 x)) = (model x)). @@ -141,10 +142,11 @@ (* Why3 goal *) Lemma model_div : forall (x:R) (y:R), - ((model (Rdiv x y)%R) = (Rdiv (model x) (model y))%R). + ((model (x / y)%R) = ((model x) / (model y))%R). Admitted. (* Why3 goal *) -Lemma model_sqrt : forall (x:R), ((model (sqrt x)) = (sqrt (model x))). +Lemma model_sqrt : forall (x:R), + ((model (Reals.R_sqrt.sqrt x)) = (Reals.R_sqrt.sqrt (model x))). Admitted. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Cint.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Cint.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Cint.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Cint.v 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Cmath.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Cmath.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Cmath.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Cmath.v 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -23,7 +23,7 @@ (* This file is generated by Why3's Coq-realize driver *) (* Beware! Only edit allowed sections below *) Require Import BuiltIn. -Require Import R_sqrt. +Require Reals.R_sqrt. Require BuiltIn. Require int.Int. Require int.Abs. @@ -34,36 +34,37 @@ Require Import RIneq. (* Why3 goal *) -Lemma abs_def : forall (x:Z), ((0%Z <= x)%Z -> ((Zabs x) = x)) /\ - ((~ (0%Z <= x)%Z) -> ((Zabs x) = (-x)%Z)). +Lemma abs_def : forall (x:Z), ((0%Z <= x)%Z -> + ((ZArith.BinInt.Z.abs x) = x)) /\ ((~ (0%Z <= x)%Z) -> + ((ZArith.BinInt.Z.abs x) = (-x)%Z)). Proof. exact int.Abs.abs_def. Qed. (* Why3 goal *) -Lemma sqrt_lin1 : forall (x:R), (1%R < x)%R -> ((sqrt x) < x)%R. +Lemma sqrt_lin1 : forall (x:R), (1%R < x)%R -> ((Reals.R_sqrt.sqrt x) < x)%R. Proof. intros x h1. -refine (sqrt_less _ _ h1). +refine (Reals.R_sqrt.sqrt_less _ _ h1). apply (Rle_trans 0 1 x Rle_0_1)%R. exact (Rlt_le _ _ h1). Qed. (* Why3 goal *) Lemma sqrt_lin0 : forall (x:R), ((0%R < x)%R /\ (x < 1%R)%R) -> - (x < (sqrt x))%R. + (x < (Reals.R_sqrt.sqrt x))%R. Proof. intros x (h1,h2). -exact (sqrt_more x h1 h2). +exact (Reals.R_sqrt.sqrt_more x h1 h2). Qed. (* Why3 goal *) -Lemma sqrt_0 : ((sqrt 0%R) = 0%R). -exact sqrt_0. +Lemma sqrt_0 : ((Reals.R_sqrt.sqrt 0%R) = 0%R). +exact Reals.R_sqrt.sqrt_0. Qed. (* Why3 goal *) -Lemma sqrt_1 : ((sqrt 1%R) = 1%R). -exact sqrt_1. +Lemma sqrt_1 : ((Reals.R_sqrt.sqrt 1%R) = 1%R). +exact Reals.R_sqrt.sqrt_1. Qed. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/int/Abs.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/int/Abs.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/int/Abs.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/int/Abs.v 2015-05-28 08:53:24.000000000 +0000 @@ -15,11 +15,12 @@ Require int.Int. (* Why3 comment *) -(* abs is replaced with (Zabs x) by the coq driver *) +(* abs is replaced with (ZArith.BinInt.Z.abs x) by the coq driver *) (* Why3 goal *) -Lemma abs_def : forall (x:Z), ((0%Z <= x)%Z -> ((Zabs x) = x)) /\ - ((~ (0%Z <= x)%Z) -> ((Zabs x) = (-x)%Z)). +Lemma abs_def : forall (x:Z), ((0%Z <= x)%Z -> + ((ZArith.BinInt.Z.abs x) = x)) /\ ((~ (0%Z <= x)%Z) -> + ((ZArith.BinInt.Z.abs x) = (-x)%Z)). intros x. split ; intros H. now apply Zabs_eq. @@ -31,15 +32,15 @@ Qed. (* Why3 goal *) -Lemma Abs_le : forall (x:Z) (y:Z), ((Zabs x) <= y)%Z <-> (((-y)%Z <= x)%Z /\ - (x <= y)%Z). +Lemma Abs_le : forall (x:Z) (y:Z), ((ZArith.BinInt.Z.abs x) <= y)%Z <-> + (((-y)%Z <= x)%Z /\ (x <= y)%Z). intros x y. zify. omega. Qed. (* Why3 goal *) -Lemma Abs_pos : forall (x:Z), (0%Z <= (Zabs x))%Z. +Lemma Abs_pos : forall (x:Z), (0%Z <= (ZArith.BinInt.Z.abs x))%Z. exact Zabs_pos. Qed. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/int/ComputerDivision.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/int/ComputerDivision.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/int/ComputerDivision.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/int/ComputerDivision.v 2015-05-28 08:53:24.000000000 +0000 @@ -11,125 +11,127 @@ (* This file is generated by Why3's Coq-realize driver *) (* Beware! Only edit allowed sections below *) Require Import BuiltIn. -Require Import ZOdiv. Require BuiltIn. Require int.Int. Require int.Abs. +Require Import Zquot. + (* Why3 comment *) -(* div is replaced with (ZOdiv x x1) by the coq driver *) +(* div is replaced with (ZArith.BinInt.Z.quot x x1) by the coq driver *) (* Why3 comment *) -(* mod1 is replaced with (ZOmod x x1) by the coq driver *) +(* mod1 is replaced with (ZArith.BinInt.Z.rem x x1) by the coq driver *) (* Why3 goal *) Lemma Div_mod : forall (x:Z) (y:Z), (~ (y = 0%Z)) -> - (x = ((y * (ZOdiv x y))%Z + (ZOmod x y))%Z). + (x = ((y * (ZArith.BinInt.Z.quot x y))%Z + (ZArith.BinInt.Z.rem x y))%Z). intros x y _. -apply ZO_div_mod_eq. +apply Z.quot_rem'. Qed. (* Why3 goal *) Lemma Div_bound : forall (x:Z) (y:Z), ((0%Z <= x)%Z /\ (0%Z < y)%Z) -> - ((0%Z <= (ZOdiv x y))%Z /\ ((ZOdiv x y) <= x)%Z). + ((0%Z <= (ZArith.BinInt.Z.quot x y))%Z /\ + ((ZArith.BinInt.Z.quot x y) <= x)%Z). intros x y (Hx,Hy). split. -apply ZO_div_pos with (1 := Hx). -now apply Zlt_le_weak. +now apply Z.quot_pos. destruct (Z_eq_dec y 1) as [H|H]. -rewrite H, ZOdiv_1_r. +rewrite H, Z.quot_1_r. apply Zle_refl. destruct (Zle_lt_or_eq 0 x Hx) as [H'|H']. apply Zlt_le_weak. -apply ZO_div_lt with (1 := H'). +apply Z.quot_lt with (1 := H'). omega. -now rewrite <- H', ZOdiv_0_l. +now rewrite <- H', Zquot_0_l. Qed. (* Why3 goal *) Lemma Mod_bound : forall (x:Z) (y:Z), (~ (y = 0%Z)) -> - (((-(Zabs y))%Z < (ZOmod x y))%Z /\ ((ZOmod x y) < (Zabs y))%Z). + (((-(ZArith.BinInt.Z.abs y))%Z < (ZArith.BinInt.Z.rem x y))%Z /\ + ((ZArith.BinInt.Z.rem x y) < (ZArith.BinInt.Z.abs y))%Z). intros x y Zy. destruct (Zle_or_lt 0 x) as [Hx|Hx]. refine ((fun H => conj (Zlt_le_trans _ 0 _ _ (proj1 H)) (proj2 H)) _). clear -Zy ; zify ; omega. -now apply ZOmod_lt_pos. +now apply Zrem_lt_pos. refine ((fun H => conj (proj1 H) (Zle_lt_trans _ 0 _ (proj2 H) _)) _). clear -Zy ; zify ; omega. -apply ZOmod_lt_neg with (2 := Zy). +apply Zrem_lt_neg with (2 := Zy). now apply Zlt_le_weak. Qed. (* Why3 goal *) Lemma Div_sign_pos : forall (x:Z) (y:Z), ((0%Z <= x)%Z /\ (0%Z < y)%Z) -> - (0%Z <= (ZOdiv x y))%Z. + (0%Z <= (ZArith.BinInt.Z.quot x y))%Z. intros x y (Hx, Hy). -apply ZO_div_pos with (1 := Hx). -now apply Zlt_le_weak. +now apply Z.quot_pos. Qed. (* Why3 goal *) Lemma Div_sign_neg : forall (x:Z) (y:Z), ((x <= 0%Z)%Z /\ (0%Z < y)%Z) -> - ((ZOdiv x y) <= 0%Z)%Z. + ((ZArith.BinInt.Z.quot x y) <= 0%Z)%Z. intros x y (Hx, Hy). -generalize (ZO_div_pos (-x) y). -rewrite ZOdiv_opp_l. +generalize (Z.quot_pos (-x) y). +rewrite Zquot_opp_l. omega. Qed. (* Why3 goal *) Lemma Mod_sign_pos : forall (x:Z) (y:Z), ((0%Z <= x)%Z /\ ~ (y = 0%Z)) -> - (0%Z <= (ZOmod x y))%Z. + (0%Z <= (ZArith.BinInt.Z.rem x y))%Z. intros x y (Hx, Zy). -now apply ZOmod_lt_pos. +now apply Zrem_lt_pos. Qed. (* Why3 goal *) Lemma Mod_sign_neg : forall (x:Z) (y:Z), ((x <= 0%Z)%Z /\ ~ (y = 0%Z)) -> - ((ZOmod x y) <= 0%Z)%Z. + ((ZArith.BinInt.Z.rem x y) <= 0%Z)%Z. intros x y (Hx, Zy). -now apply ZOmod_lt_neg. +now apply Zrem_lt_neg. Qed. (* Why3 goal *) Lemma Rounds_toward_zero : forall (x:Z) (y:Z), (~ (y = 0%Z)) -> - ((Zabs ((ZOdiv x y) * y)%Z) <= (Zabs x))%Z. + ((ZArith.BinInt.Z.abs ((ZArith.BinInt.Z.quot x y) * y)%Z) <= (ZArith.BinInt.Z.abs x))%Z. intros x y Zy. rewrite Zmult_comm. zify. -generalize (ZO_mult_div_le x y). -generalize (ZO_mult_div_ge x y). +generalize (Z.mul_quot_le x y). +generalize (Z.mul_quot_ge x y). omega. Qed. (* Why3 goal *) -Lemma Div_1 : forall (x:Z), ((ZOdiv x 1%Z) = x). -exact ZOdiv_1_r. +Lemma Div_1 : forall (x:Z), ((ZArith.BinInt.Z.quot x 1%Z) = x). +exact Z.quot_1_r. Qed. (* Why3 goal *) -Lemma Mod_1 : forall (x:Z), ((ZOmod x 1%Z) = 0%Z). -exact ZOmod_1_r. +Lemma Mod_1 : forall (x:Z), ((ZArith.BinInt.Z.rem x 1%Z) = 0%Z). +exact Z.rem_1_r. Qed. (* Why3 goal *) Lemma Div_inf : forall (x:Z) (y:Z), ((0%Z <= x)%Z /\ (x < y)%Z) -> - ((ZOdiv x y) = 0%Z). -exact ZOdiv_small. + ((ZArith.BinInt.Z.quot x y) = 0%Z). +exact Z.quot_small. Qed. (* Why3 goal *) Lemma Mod_inf : forall (x:Z) (y:Z), ((0%Z <= x)%Z /\ (x < y)%Z) -> - ((ZOmod x y) = x). -exact ZOmod_small. + ((ZArith.BinInt.Z.rem x y) = x). +exact Z.rem_small. Qed. (* Why3 goal *) Lemma Div_mult : forall (x:Z) (y:Z) (z:Z), ((0%Z < x)%Z /\ ((0%Z <= y)%Z /\ - (0%Z <= z)%Z)) -> ((ZOdiv ((x * y)%Z + z)%Z x) = (y + (ZOdiv z x))%Z). + (0%Z <= z)%Z)) -> + ((ZArith.BinInt.Z.quot ((x * y)%Z + z)%Z x) = (y + (ZArith.BinInt.Z.quot z x))%Z). intros x y z (Hx&Hy&Hz). rewrite (Zplus_comm y). -rewrite <- ZO_div_plus. +rewrite <- Z_quot_plus. now rewrite Zplus_comm, Zmult_comm. apply Zmult_le_0_compat with (2 := Hz). apply Zplus_le_0_compat with (1 := Hz). @@ -141,10 +143,11 @@ (* Why3 goal *) Lemma Mod_mult : forall (x:Z) (y:Z) (z:Z), ((0%Z < x)%Z /\ ((0%Z <= y)%Z /\ - (0%Z <= z)%Z)) -> ((ZOmod ((x * y)%Z + z)%Z x) = (ZOmod z x)). + (0%Z <= z)%Z)) -> + ((ZArith.BinInt.Z.rem ((x * y)%Z + z)%Z x) = (ZArith.BinInt.Z.rem z x)). intros x y z (Hx&Hy&Hz). rewrite Zplus_comm, Zmult_comm. -apply ZO_mod_plus. +apply Z_rem_plus. apply Zmult_le_0_compat with (2 := Hz). apply Zplus_le_0_compat with (1 := Hz). apply Zmult_le_0_compat with (1 := Hy). diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/int/MinMax.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/int/MinMax.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/int/MinMax.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/int/MinMax.v 2015-05-28 08:53:24.000000000 +0000 @@ -15,76 +15,72 @@ Require int.Int. (* Why3 comment *) -(* min is replaced with (Zmin x x1) by the coq driver *) - -(* Why3 comment *) -(* max is replaced with (Zmax x x1) by the coq driver *) - -(* Why3 goal *) -Lemma Max_is_ge : forall (x:Z) (y:Z), (x <= (Zmax x y))%Z /\ - (y <= (Zmax x y))%Z. -split. -apply Zle_max_l. -apply Zle_max_r. -Qed. +(* min is replaced with (ZArith.BinInt.Z.min x x1) by the coq driver *) (* Why3 goal *) -Lemma Max_is_some : forall (x:Z) (y:Z), ((Zmax x y) = x) \/ ((Zmax x y) = y). +Lemma min_def : forall (x:Z) (y:Z), ((x <= y)%Z -> + ((ZArith.BinInt.Z.min x y) = x)) /\ ((~ (x <= y)%Z) -> + ((ZArith.BinInt.Z.min x y) = y)). +Proof. intros x y. -unfold Zmax. -case Zcompare. -now left. -now right. -now left. +split ; intros H. +now apply Zmin_l. +apply Zmin_r. +omega. Qed. -(* Why3 goal *) -Lemma Min_is_le : forall (x:Z) (y:Z), ((Zmin x y) <= x)%Z /\ - ((Zmin x y) <= y)%Z. -split. -apply Zle_min_l. -apply Zle_min_r. -Qed. +(* Why3 comment *) +(* max is replaced with (ZArith.BinInt.Z.max x x1) by the coq driver *) (* Why3 goal *) -Lemma Min_is_some : forall (x:Z) (y:Z), ((Zmin x y) = x) \/ ((Zmin x y) = y). +Lemma max_def : forall (x:Z) (y:Z), ((x <= y)%Z -> + ((ZArith.BinInt.Z.max x y) = y)) /\ ((~ (x <= y)%Z) -> + ((ZArith.BinInt.Z.max x y) = x)). +Proof. intros x y. -unfold Zmin. -case Zcompare. -now left. -now left. -now right. +split ; intros H. +now apply Zmax_r. +apply Zmax_l. +omega. Qed. (* Why3 goal *) -Lemma Max_x : forall (x:Z) (y:Z), (y <= x)%Z -> ((Zmax x y) = x). -exact Zmax_l. +Lemma Min_r : forall (x:Z) (y:Z), (y <= x)%Z -> + ((ZArith.BinInt.Z.min x y) = y). +exact Zmin_r. Qed. (* Why3 goal *) -Lemma Max_y : forall (x:Z) (y:Z), (x <= y)%Z -> ((Zmax x y) = y). -exact Zmax_r. +Lemma Max_l : forall (x:Z) (y:Z), (y <= x)%Z -> + ((ZArith.BinInt.Z.max x y) = x). +exact Zmax_l. Qed. (* Why3 goal *) -Lemma Min_x : forall (x:Z) (y:Z), (x <= y)%Z -> ((Zmin x y) = x). -exact Zmin_l. +Lemma Min_comm : forall (x:Z) (y:Z), + ((ZArith.BinInt.Z.min x y) = (ZArith.BinInt.Z.min y x)). +exact Zmin_comm. Qed. (* Why3 goal *) -Lemma Min_y : forall (x:Z) (y:Z), (y <= x)%Z -> ((Zmin x y) = y). -exact Zmin_r. +Lemma Max_comm : forall (x:Z) (y:Z), + ((ZArith.BinInt.Z.max x y) = (ZArith.BinInt.Z.max y x)). +exact Zmax_comm. Qed. (* Why3 goal *) -Lemma Max_sym : forall (x:Z) (y:Z), (y <= x)%Z -> ((Zmax x y) = (Zmax y x)). -intros x y _. -apply Zmax_comm. +Lemma Min_assoc : forall (x:Z) (y:Z) (z:Z), + ((ZArith.BinInt.Z.min (ZArith.BinInt.Z.min x y) z) = (ZArith.BinInt.Z.min x (ZArith.BinInt.Z.min y z))). +Proof. +intros x y z. +apply eq_sym, Zmin_assoc. Qed. (* Why3 goal *) -Lemma Min_sym : forall (x:Z) (y:Z), (y <= x)%Z -> ((Zmin x y) = (Zmin y x)). -intros x y _. -apply Zmin_comm. +Lemma Max_assoc : forall (x:Z) (y:Z) (z:Z), + ((ZArith.BinInt.Z.max (ZArith.BinInt.Z.max x y) z) = (ZArith.BinInt.Z.max x (ZArith.BinInt.Z.max y z))). +Proof. +intros x y z. +apply eq_sym, Zmax_assoc. Qed. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Makefile frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Makefile --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Makefile 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -########################################################################## -# # -# This file is part of WP plug-in of Frama-C. # -# # -# Copyright (C) 2007-2014 # -# 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). # -# # -########################################################################## - -# -------------------------------------------------------------------------- -# --- WP-Coq Libraries -# -------------------------------------------------------------------------- - -INCLUDES= -R . -as "" - -include ../Makefile.resources -include ../Makefile.coq - -compile: $(addsuffix o, $(COQ_LIBS_CEA) $(COQ_LIBS_INRIA)) - -# End of file - diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/map/Map.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/map/Map.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/map/Map.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/map/Map.v 2015-05-28 08:53:24.000000000 +0000 @@ -19,8 +19,7 @@ | _map_constr : (a -> b) -> _map a b. (* Why3 goal *) -Definition map : forall (a:Type) {a_WT:WhyType a} (b:Type) {b_WT:WhyType b}, - Type. +Definition map : forall (a:Type) (b:Type), Type. intros. exact (_map a b). Defined. @@ -36,14 +35,14 @@ (* Why3 goal *) Definition get: forall {a:Type} {a_WT:WhyType a} {b:Type} {b_WT:WhyType b}, - (@map a a_WT b b_WT) -> a -> b. + (map a b) -> a -> b. intros a a_WT b b_WT (m) x. exact (m x). Defined. (* Why3 goal *) Definition set: forall {a:Type} {a_WT:WhyType a} {b:Type} {b_WT:WhyType b}, - (@map a a_WT b b_WT) -> a -> b -> (@map a a_WT b b_WT). + (map a b) -> a -> b -> (map a b). intros a a_WT b b_WT (m) x y. split. intros x'. @@ -54,8 +53,8 @@ (* Why3 goal *) Lemma Select_eq : forall {a:Type} {a_WT:WhyType a} {b:Type} {b_WT:WhyType b}, - forall (m:(@map a a_WT b b_WT)), forall (a1:a) (a2:a), forall (b1:b), - (a1 = a2) -> ((get (set m a1 b1) a2) = b1). + forall (m:(map a b)), forall (a1:a) (a2:a), forall (b1:b), (a1 = a2) -> + ((get (set m a1 b1) a2) = b1). Proof. intros a a_WT b b_WT (m) a1 a2 b1 h1. unfold get, set. @@ -64,9 +63,8 @@ (* Why3 goal *) Lemma Select_neq : forall {a:Type} {a_WT:WhyType a} - {b:Type} {b_WT:WhyType b}, forall (m:(@map a a_WT b b_WT)), forall (a1:a) - (a2:a), forall (b1:b), (~ (a1 = a2)) -> ((get (set m a1 b1) a2) = (get m - a2)). + {b:Type} {b_WT:WhyType b}, forall (m:(map a b)), forall (a1:a) (a2:a), + forall (b1:b), (~ (a1 = a2)) -> ((get (set m a1 b1) a2) = (get m a2)). Proof. intros a a_WT b b_WT (m) a1 a2 b1 h1. unfold get, set. @@ -75,14 +73,14 @@ (* Why3 goal *) Definition const: forall {a:Type} {a_WT:WhyType a} {b:Type} {b_WT:WhyType b}, - b -> (@map a a_WT b b_WT). + b -> (map a b). intros a a_WT b b_WT y. exact (_map_constr _ _ (fun _ => y)). Defined. (* Why3 goal *) Lemma Const : forall {a:Type} {a_WT:WhyType a} {b:Type} {b_WT:WhyType b}, - forall (b1:b) (a1:a), ((get (const b1:(@map a a_WT b b_WT)) a1) = b1). + forall (b1:b) (a1:a), ((get (const b1: (map a b)) a1) = b1). Proof. easy. Qed. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Memory.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Memory.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Memory.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Memory.v 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -137,29 +137,27 @@ (((offset p) + a)%Z <= (offset q))%Z))). (* Why3 assumption *) -Definition eqmem {a:Type} {a_WT:WhyType a} (m1:(@map.Map.map - addr addr_WhyType a a_WT)) (m2:(@map.Map.map addr addr_WhyType a a_WT)) - (p:addr) (a1:Z): Prop := forall (q:addr), (included q 1%Z p a1) -> - ((map.Map.get m1 q) = (map.Map.get m2 q)). +Definition eqmem {a:Type} {a_WT:WhyType a} (m1:(map.Map.map addr a)) + (m2:(map.Map.map addr a)) (p:addr) (a1:Z): Prop := forall (q:addr), + (included q 1%Z p a1) -> ((map.Map.get m1 q) = (map.Map.get m2 q)). (* Why3 assumption *) -Definition havoc {a:Type} {a_WT:WhyType a} (m1:(@map.Map.map - addr addr_WhyType a a_WT)) (m2:(@map.Map.map addr addr_WhyType a a_WT)) - (p:addr) (a1:Z): Prop := forall (q:addr), (separated q 1%Z p a1) -> - ((map.Map.get m1 q) = (map.Map.get m2 q)). +Definition havoc {a:Type} {a_WT:WhyType a} (m1:(map.Map.map addr a)) + (m2:(map.Map.map addr a)) (p:addr) (a1:Z): Prop := forall (q:addr), + (separated q 1%Z p a1) -> ((map.Map.get m1 q) = (map.Map.get m2 q)). (* Why3 assumption *) -Definition valid_rd (m:(@map.Map.map Z _ Z _)) (p:addr) (n:Z): Prop := +Definition valid_rd (m:(map.Map.map Z Z)) (p:addr) (n:Z): Prop := (0%Z < n)%Z -> ((0%Z <= (offset p))%Z /\ (((offset p) + n)%Z <= (map.Map.get m (base p)))%Z). (* Why3 assumption *) -Definition valid_rw (m:(@map.Map.map Z _ Z _)) (p:addr) (n:Z): Prop := +Definition valid_rw (m:(map.Map.map Z Z)) (p:addr) (n:Z): Prop := (0%Z < n)%Z -> ((0%Z < (base p))%Z /\ ((0%Z <= (offset p))%Z /\ (((offset p) + n)%Z <= (map.Map.get m (base p)))%Z)). (* Why3 goal *) -Lemma valid_rw_rd : forall (m:(@map.Map.map Z _ Z _)), forall (p:addr), +Lemma valid_rw_rd : forall (m:(map.Map.map Z Z)), forall (p:addr), forall (n:Z), (valid_rw m p n) -> (valid_rd m p n). intros m p n. unfold valid_rw. unfold valid_rd. @@ -167,7 +165,7 @@ Qed. (* Why3 goal *) -Lemma valid_string : forall (m:(@map.Map.map Z _ Z _)), forall (p:addr), +Lemma valid_string : forall (m:(map.Map.map Z Z)), forall (p:addr), ((base p) < 0%Z)%Z -> (((0%Z <= (offset p))%Z /\ ((offset p) < (map.Map.get m (base p)))%Z) -> ((valid_rd m p 1%Z) /\ ~ (valid_rw m p 1%Z))). @@ -227,17 +225,16 @@ Admitted. (* Why3 goal *) -Definition linked: (@map.Map.map Z _ Z _) -> Prop. +Definition linked: (map.Map.map Z Z) -> Prop. Admitted. (* Why3 goal *) -Definition sconst: (@map.Map.map addr addr_WhyType Z _) -> Prop. +Definition sconst: (map.Map.map addr Z) -> Prop. Admitted. (* Why3 assumption *) -Definition framed (m:(@map.Map.map addr addr_WhyType - addr addr_WhyType)): Prop := forall (p:addr), ((region (base (map.Map.get m - p))) <= 0%Z)%Z. +Definition framed (m:(map.Map.map addr addr)): Prop := forall (p:addr), + ((region (base (map.Map.get m p))) <= 0%Z)%Z. (* Why3 goal *) Lemma separated_included : forall (p:addr) (q:addr), forall (a:Z) (b:Z), @@ -283,23 +280,23 @@ (* Why3 goal *) Lemma eqmem_included : forall {a:Type} {a_WT:WhyType a}, - forall (m1:(@map.Map.map addr addr_WhyType a a_WT)) (m2:(@map.Map.map - addr addr_WhyType a a_WT)), forall (p:addr) (q:addr), forall (a1:Z) (b:Z), - (included p a1 q b) -> ((eqmem m1 m2 q b) -> (eqmem m1 m2 p a1)). + forall (m1:(map.Map.map addr a)) (m2:(map.Map.map addr a)), forall (p:addr) + (q:addr), forall (a1:Z) (b:Z), (included p a1 q b) -> ((eqmem m1 m2 q b) -> + (eqmem m1 m2 p a1)). intros a a_WT m1 m2 p q a1 b h1 h2. Admitted. (* Why3 goal *) -Lemma eqmem_sym : forall {a:Type} {a_WT:WhyType a}, forall (m1:(@map.Map.map - addr addr_WhyType a a_WT)) (m2:(@map.Map.map addr addr_WhyType a a_WT)), - forall (p:addr), forall (a1:Z), (eqmem m1 m2 p a1) -> (eqmem m2 m1 p a1). +Lemma eqmem_sym : forall {a:Type} {a_WT:WhyType a}, forall (m1:(map.Map.map + addr a)) (m2:(map.Map.map addr a)), forall (p:addr), forall (a1:Z), (eqmem + m1 m2 p a1) -> (eqmem m2 m1 p a1). intros A m1 m2 p a. unfold eqmem. Admitted. (* Why3 goal *) -Lemma havoc_sym : forall {a:Type} {a_WT:WhyType a}, forall (m1:(@map.Map.map - addr addr_WhyType a a_WT)) (m2:(@map.Map.map addr addr_WhyType a a_WT)), - forall (p:addr), forall (a1:Z), (havoc m1 m2 p a1) -> (havoc m2 m1 p a1). +Lemma havoc_sym : forall {a:Type} {a_WT:WhyType a}, forall (m1:(map.Map.map + addr a)) (m2:(map.Map.map addr a)), forall (p:addr), forall (a1:Z), (havoc + m1 m2 p a1) -> (havoc m2 m1 p a1). Admitted. (* Why3 goal *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Qedlib.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Qedlib.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Qedlib.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Qedlib.v 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -187,13 +187,13 @@ Record farray (A B : Type) := { whytype1 : BuiltIn.WhyType A ; whytype2 : BuiltIn.WhyType B ; - access :> @Map.map A whytype1 B whytype2 }. + access :> @Map.map A B }. Definition array (A : Type) := farray Z A. Hypothesis extensionality: forall (A B : Type) (f g : A -> B), (forall x, f x = g x) -> f = g. Definition select {A B : Type} - (m : farray A B) (k : A) : B := Map.get m k. + (m : farray A B) (k : A) : B := @Map.get A (whytype1 m) B (whytype2 m) m k. Lemma farray_eq : forall A B (m1 m2 : farray A B), whytype1 m1 = whytype1 m2 -> whytype2 m1 = whytype2 m2 -> @@ -210,7 +210,7 @@ Definition update {A B : Type} (m : farray A B) (k : A) (v : B) : (farray A B) := - {| whytype1 := whytype1 m; whytype2 := whytype2 m; access := Map.set m k v|}. + {| whytype1 := whytype1 m; whytype2 := whytype2 m; access := @Map.set A (whytype1 m) B (whytype2 m) m k v|}. Notation " a .[ k ] " := (select a k) (at level 60). Notation " a .[ k <- v ] " := (update a k v) (at level 60). diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Qed.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Qed.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Qed.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Qed.v 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -23,7 +23,6 @@ (* This file is generated by Why3's Coq-realize driver *) (* Beware! Only edit allowed sections below *) Require Import BuiltIn. -Require Import ZOdiv. Require BuiltIn. Require bool.Bool. Require int.Int. @@ -130,21 +129,21 @@ Admitted. (* Why3 assumption *) -Definition real_of_int (x:Z): R := (IZR x). +Definition real_of_int (x:Z): R := (Reals.Raxioms.IZR x). (* Why3 goal *) Lemma truncate_of_int : forall (x:Z), ((truncate (real_of_int x)) = x). Admitted. (* Why3 comment *) -(* pdiv is replaced with (ZOdiv x x1) by the coq driver *) +(* pdiv is replaced with (ZArith.BinInt.Z.quot x x1) by the coq driver *) (* Why3 comment *) -(* pmod is replaced with (ZOmod x x1) by the coq driver *) +(* pmod is replaced with (ZArith.BinInt.Z.rem x x1) by the coq driver *) (* Why3 goal *) Lemma c_euclidian : forall (n:Z) (d:Z), (~ (d = 0%Z)) -> - (n = (((ZOdiv n d) * d)%Z + (ZOmod n d))%Z). + (n = (((ZArith.BinInt.Z.quot n d) * d)%Z + (ZArith.BinInt.Z.rem n d))%Z). intros n d. intros H. rewrite Int.Comm1. @@ -170,10 +169,13 @@ (* Why3 goal *) Lemma cdiv_cases : forall (n:Z) (d:Z), ((0%Z <= n)%Z -> ((0%Z < d)%Z -> - ((ZOdiv n d) = (ZOdiv n d)))) /\ (((n <= 0%Z)%Z -> ((0%Z < d)%Z -> - ((ZOdiv n d) = (-(ZOdiv (-n)%Z d))%Z))) /\ (((0%Z <= n)%Z -> - ((d < 0%Z)%Z -> ((ZOdiv n d) = (-(ZOdiv n (-d)%Z))%Z))) /\ ((n <= 0%Z)%Z -> - ((d < 0%Z)%Z -> ((ZOdiv n d) = (ZOdiv (-n)%Z (-d)%Z)))))). + ((ZArith.BinInt.Z.quot n d) = (ZArith.BinInt.Z.quot n d)))) /\ + (((n <= 0%Z)%Z -> ((0%Z < d)%Z -> + ((ZArith.BinInt.Z.quot n d) = (-(ZArith.BinInt.Z.quot (-n)%Z d))%Z))) /\ + (((0%Z <= n)%Z -> ((d < 0%Z)%Z -> + ((ZArith.BinInt.Z.quot n d) = (-(ZArith.BinInt.Z.quot n (-d)%Z))%Z))) /\ + ((n <= 0%Z)%Z -> ((d < 0%Z)%Z -> + ((ZArith.BinInt.Z.quot n d) = (ZArith.BinInt.Z.quot (-n)%Z (-d)%Z)))))). intros n d. rewrite Zquot.Zquot_opp_l. rewrite Zquot.Zquot_opp_r. @@ -187,10 +189,13 @@ (* Why3 goal *) Lemma cmod_cases : forall (n:Z) (d:Z), ((0%Z <= n)%Z -> ((0%Z < d)%Z -> - ((ZOmod n d) = (ZOmod n d)))) /\ (((n <= 0%Z)%Z -> ((0%Z < d)%Z -> - ((ZOmod n d) = (-(ZOmod (-n)%Z d))%Z))) /\ (((0%Z <= n)%Z -> - ((d < 0%Z)%Z -> ((ZOmod n d) = (ZOmod n (-d)%Z)))) /\ ((n <= 0%Z)%Z -> - ((d < 0%Z)%Z -> ((ZOmod n d) = (-(ZOmod (-n)%Z (-d)%Z))%Z))))). + ((ZArith.BinInt.Z.rem n d) = (ZArith.BinInt.Z.rem n d)))) /\ + (((n <= 0%Z)%Z -> ((0%Z < d)%Z -> + ((ZArith.BinInt.Z.rem n d) = (-(ZArith.BinInt.Z.rem (-n)%Z d))%Z))) /\ + (((0%Z <= n)%Z -> ((d < 0%Z)%Z -> + ((ZArith.BinInt.Z.rem n d) = (ZArith.BinInt.Z.rem n (-d)%Z)))) /\ + ((n <= 0%Z)%Z -> ((d < 0%Z)%Z -> + ((ZArith.BinInt.Z.rem n d) = (-(ZArith.BinInt.Z.rem (-n)%Z (-d)%Z))%Z))))). intros n d. rewrite Zquot.Zrem_opp_l. rewrite Zquot.Zrem_opp_r. @@ -204,11 +209,14 @@ (* Why3 goal *) Lemma cmod_remainder : forall (n:Z) (d:Z), ((0%Z <= n)%Z -> ((0%Z < d)%Z -> - ((0%Z <= (ZOmod n d))%Z /\ ((ZOmod n d) < d)%Z))) /\ (((n <= 0%Z)%Z -> - ((0%Z < d)%Z -> (((-d)%Z < (ZOmod n d))%Z /\ ((ZOmod n d) <= 0%Z)%Z))) /\ - (((0%Z <= n)%Z -> ((d < 0%Z)%Z -> ((0%Z <= (ZOmod n d))%Z /\ - ((ZOmod n d) < (-d)%Z)%Z))) /\ ((n <= 0%Z)%Z -> ((d < 0%Z)%Z -> - ((d < (ZOmod n d))%Z /\ ((ZOmod n d) <= 0%Z)%Z))))). + ((0%Z <= (ZArith.BinInt.Z.rem n d))%Z /\ + ((ZArith.BinInt.Z.rem n d) < d)%Z))) /\ (((n <= 0%Z)%Z -> ((0%Z < d)%Z -> + (((-d)%Z < (ZArith.BinInt.Z.rem n d))%Z /\ + ((ZArith.BinInt.Z.rem n d) <= 0%Z)%Z))) /\ (((0%Z <= n)%Z -> + ((d < 0%Z)%Z -> ((0%Z <= (ZArith.BinInt.Z.rem n d))%Z /\ + ((ZArith.BinInt.Z.rem n d) < (-d)%Z)%Z))) /\ ((n <= 0%Z)%Z -> + ((d < 0%Z)%Z -> ((d < (ZArith.BinInt.Z.rem n d))%Z /\ + ((ZArith.BinInt.Z.rem n d) <= 0%Z)%Z))))). intros n d. (split;[|split;[|split]]);intros; [exact (Zquot.Zrem_lt_pos_pos _ _ H H0)| @@ -218,13 +226,14 @@ Qed. (* Why3 goal *) -Lemma cdiv_neutral : forall (a:Z), ((ZOdiv a 1%Z) = a). +Lemma cdiv_neutral : forall (a:Z), ((ZArith.BinInt.Z.quot a 1%Z) = a). intro a. exact (Z.quot_1_r a). Qed. (* Why3 goal *) -Lemma cdiv_inv : forall (a:Z), (~ (a = 0%Z)) -> ((ZOdiv a a) = 1%Z). +Lemma cdiv_inv : forall (a:Z), (~ (a = 0%Z)) -> + ((ZArith.BinInt.Z.quot a a) = 1%Z). intros a h1. exact (Z.quot_same a h1). Qed. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/real/Abs.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/real/Abs.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/real/Abs.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/real/Abs.v 2015-05-28 08:53:24.000000000 +0000 @@ -11,16 +11,19 @@ (* This file is generated by Why3's Coq-realize driver *) (* Beware! Only edit allowed sections below *) Require Import BuiltIn. -Require Import Rbasic_fun. +Require Reals.Rbasic_fun. Require BuiltIn. Require real.Real. +Import Rbasic_fun. + (* Why3 comment *) -(* abs is replaced with (Rabs x) by the coq driver *) +(* abs is replaced with (Reals.Rbasic_fun.Rabs x) by the coq driver *) (* Why3 goal *) -Lemma abs_def : forall (x:R), ((0%R <= x)%R -> ((Rabs x) = x)) /\ - ((~ (0%R <= x)%R) -> ((Rabs x) = (-x)%R)). +Lemma abs_def : forall (x:R), ((0%R <= x)%R -> + ((Reals.Rbasic_fun.Rabs x) = x)) /\ ((~ (0%R <= x)%R) -> + ((Reals.Rbasic_fun.Rabs x) = (-x)%R)). split ; intros H. apply Rabs_right. now apply Rle_ge. @@ -29,8 +32,8 @@ Qed. (* Why3 goal *) -Lemma Abs_le : forall (x:R) (y:R), ((Rabs x) <= y)%R <-> (((-y)%R <= x)%R /\ - (x <= y)%R). +Lemma Abs_le : forall (x:R) (y:R), ((Reals.Rbasic_fun.Rabs x) <= y)%R <-> + (((-y)%R <= x)%R /\ (x <= y)%R). intros x y. unfold Rabs. case Rcase_abs ; intros H ; (split ; [intros H0;split | intros (H0,H1)]). @@ -55,25 +58,25 @@ Qed. (* Why3 goal *) -Lemma Abs_pos : forall (x:R), (0%R <= (Rabs x))%R. +Lemma Abs_pos : forall (x:R), (0%R <= (Reals.Rbasic_fun.Rabs x))%R. exact Rabs_pos. Qed. (* Why3 goal *) Lemma Abs_sum : forall (x:R) (y:R), - ((Rabs (x + y)%R) <= ((Rabs x) + (Rabs y))%R)%R. + ((Reals.Rbasic_fun.Rabs (x + y)%R) <= ((Reals.Rbasic_fun.Rabs x) + (Reals.Rbasic_fun.Rabs y))%R)%R. exact Rabs_triang. Qed. (* Why3 goal *) Lemma Abs_prod : forall (x:R) (y:R), - ((Rabs (x * y)%R) = ((Rabs x) * (Rabs y))%R). + ((Reals.Rbasic_fun.Rabs (x * y)%R) = ((Reals.Rbasic_fun.Rabs x) * (Reals.Rbasic_fun.Rabs y))%R). exact Rabs_mult. Qed. (* Why3 goal *) Lemma triangular_inequality : forall (x:R) (y:R) (z:R), - ((Rabs (x - z)%R) <= ((Rabs (x - y)%R) + (Rabs (y - z)%R))%R)%R. + ((Reals.Rbasic_fun.Rabs (x - z)%R) <= ((Reals.Rbasic_fun.Rabs (x - y)%R) + (Reals.Rbasic_fun.Rabs (y - z)%R))%R)%R. intros x y z. replace (x - z)%R with ((x - y) + (y - z))%R by ring. apply Rabs_triang. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/real/FromInt.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/real/FromInt.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/real/FromInt.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/real/FromInt.v 2015-05-28 08:53:24.000000000 +0000 @@ -16,35 +16,39 @@ Require real.Real. (* Why3 comment *) -(* from_int is replaced with (IZR x) by the coq driver *) +(* from_int is replaced with (Reals.Raxioms.IZR x) by the coq driver *) (* Why3 goal *) -Lemma Zero : ((IZR 0%Z) = 0%R). +Lemma Zero : ((Reals.Raxioms.IZR 0%Z) = 0%R). split. Qed. (* Why3 goal *) -Lemma One : ((IZR 1%Z) = 1%R). +Lemma One : ((Reals.Raxioms.IZR 1%Z) = 1%R). split. Qed. (* Why3 goal *) -Lemma Add : forall (x:Z) (y:Z), ((IZR (x + y)%Z) = ((IZR x) + (IZR y))%R). +Lemma Add : forall (x:Z) (y:Z), + ((Reals.Raxioms.IZR (x + y)%Z) = ((Reals.Raxioms.IZR x) + (Reals.Raxioms.IZR y))%R). exact plus_IZR. Qed. (* Why3 goal *) -Lemma Sub : forall (x:Z) (y:Z), ((IZR (x - y)%Z) = ((IZR x) - (IZR y))%R). +Lemma Sub : forall (x:Z) (y:Z), + ((Reals.Raxioms.IZR (x - y)%Z) = ((Reals.Raxioms.IZR x) - (Reals.Raxioms.IZR y))%R). exact minus_IZR. Qed. (* Why3 goal *) -Lemma Mul : forall (x:Z) (y:Z), ((IZR (x * y)%Z) = ((IZR x) * (IZR y))%R). +Lemma Mul : forall (x:Z) (y:Z), + ((Reals.Raxioms.IZR (x * y)%Z) = ((Reals.Raxioms.IZR x) * (Reals.Raxioms.IZR y))%R). exact mult_IZR. Qed. (* Why3 goal *) -Lemma Neg : forall (x:Z), ((IZR (-x)%Z) = (-(IZR x))%R). +Lemma Neg : forall (x:Z), + ((Reals.Raxioms.IZR (-x)%Z) = (-(Reals.Raxioms.IZR x))%R). exact opp_IZR. Qed. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/real/MinMax.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/real/MinMax.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/real/MinMax.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/real/MinMax.v 2015-05-28 08:53:24.000000000 +0000 @@ -16,51 +16,104 @@ Require Import Rbasic_fun. -(* Why3 goal *) -Definition min: R -> R -> R. -exact Rmin. -Defined. - -(* Why3 goal *) -Definition max: R -> R -> R. -exact Rmax. -Defined. +(* Why3 comment *) +(* min is replaced with (Reals.Rbasic_fun.Rmin x x1) by the coq driver *) (* Why3 goal *) -Lemma Max_is_ge : forall (x:R) (y:R), (x <= (max x y))%R /\ (y <= (max x - y))%R. -split. -apply Rmax_l. -apply Rmax_r. +Lemma min_def : forall (x:R) (y:R), ((x <= y)%R -> + ((Reals.Rbasic_fun.Rmin x y) = x)) /\ ((~ (x <= y)%R) -> + ((Reals.Rbasic_fun.Rmin x y) = y)). +Proof. +intros x y. +split ; intros H. +now apply Rmin_left. +apply Rmin_right. +now apply Rlt_le, Rnot_le_lt. Qed. +(* Why3 comment *) +(* max is replaced with (Reals.Rbasic_fun.Rmax x x1) by the coq driver *) + (* Why3 goal *) -Lemma Max_is_some : forall (x:R) (y:R), ((max x y) = x) \/ ((max x y) = y). +Lemma max_def : forall (x:R) (y:R), ((x <= y)%R -> + ((Reals.Rbasic_fun.Rmax x y) = y)) /\ ((~ (x <= y)%R) -> + ((Reals.Rbasic_fun.Rmax x y) = x)). +Proof. intros x y. -destruct (Rle_or_lt x y) as [H|H]. -right. +split ; intros H. now apply Rmax_right. -left. apply Rmax_left. -now apply Rlt_le. +now apply Rlt_le, Rnot_le_lt. Qed. (* Why3 goal *) -Lemma Min_is_le : forall (x:R) (y:R), ((min x y) <= x)%R /\ ((min x - y) <= y)%R. -split. +Lemma Min_r : forall (x:R) (y:R), (y <= x)%R -> + ((Reals.Rbasic_fun.Rmin x y) = y). +exact Rmin_right. +Qed. + +(* Why3 goal *) +Lemma Max_l : forall (x:R) (y:R), (y <= x)%R -> + ((Reals.Rbasic_fun.Rmax x y) = x). +exact Rmax_left. +Qed. + +(* Why3 goal *) +Lemma Min_comm : forall (x:R) (y:R), + ((Reals.Rbasic_fun.Rmin x y) = (Reals.Rbasic_fun.Rmin y x)). +exact Rmin_comm. +Qed. + +(* Why3 goal *) +Lemma Max_comm : forall (x:R) (y:R), + ((Reals.Rbasic_fun.Rmax x y) = (Reals.Rbasic_fun.Rmax y x)). +exact Rmax_comm. +Qed. + +(* Why3 goal *) +Lemma Min_assoc : forall (x:R) (y:R) (z:R), + ((Reals.Rbasic_fun.Rmin (Reals.Rbasic_fun.Rmin x y) z) = (Reals.Rbasic_fun.Rmin x (Reals.Rbasic_fun.Rmin y z))). +Proof. +intros x y z. +destruct (Rle_or_lt x y) as [Hxy|Hxy]. +rewrite Rmin_left with (1 := Hxy). +destruct (Rle_or_lt x z) as [Hxz|Hxz]. +rewrite Rmin_left with (1 := Hxz). +apply eq_sym, Rmin_left. +now apply Rmin_case. +rewrite (Rmin_right y z). +reflexivity. +apply Rlt_le. +now apply Rlt_le_trans with x. +rewrite (Rmin_right x y) by now apply Rlt_le. +apply eq_sym, Rmin_right. +apply Rlt_le. +apply Rle_lt_trans with (2 := Hxy). apply Rmin_l. -apply Rmin_r. Qed. (* Why3 goal *) -Lemma Min_is_some : forall (x:R) (y:R), ((min x y) = x) \/ ((min x y) = y). -intros x y. -destruct (Rle_or_lt x y) as [H|H]. -left. -now apply Rmin_left. -right. -apply Rmin_right. +Lemma Max_assoc : forall (x:R) (y:R) (z:R), + ((Reals.Rbasic_fun.Rmax (Reals.Rbasic_fun.Rmax x y) z) = (Reals.Rbasic_fun.Rmax x (Reals.Rbasic_fun.Rmax y z))). +Proof. +intros x y z. +destruct (Rle_or_lt x y) as [Hxy|Hxy]. +rewrite Rmax_right with (1 := Hxy). +apply eq_sym, Rmax_right. +apply Rle_trans with (1 := Hxy). +apply Rmax_l. +rewrite (Rmax_left x y) by now apply Rlt_le. +destruct (Rle_or_lt x z) as [Hxz|Hxz]. +rewrite Rmax_right with (1 := Hxz). +rewrite Rmax_right. +apply eq_sym, Rmax_right. +apply Rlt_le. +now apply Rlt_le_trans with x. +apply Rle_trans with (1 := Hxz). +apply Rmax_r. +rewrite Rmax_left. +apply eq_sym, Rmax_left. +apply Rmax_case ; now apply Rlt_le. now apply Rlt_le. Qed. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/real/Real.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/real/Real.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/real/Real.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/real/Real.v 2015-05-28 08:53:24.000000000 +0000 @@ -116,21 +116,23 @@ Qed. (* Why3 comment *) -(* inv is replaced with (Rinv x) by the coq driver *) +(* inv is replaced with (Reals.Rdefinitions.Rinv x) by the coq driver *) (* Why3 goal *) -Lemma Inverse : forall (x:R), (~ (x = 0%R)) -> ((x * (Rinv x))%R = 1%R). +Lemma Inverse : forall (x:R), (~ (x = 0%R)) -> + ((x * (Reals.Rdefinitions.Rinv x))%R = 1%R). exact Rinv_r. Qed. (* Why3 goal *) -Lemma infix_sl_def : forall (x:R) (y:R), ((Rdiv x y)%R = (x * (Rinv y))%R). +Lemma infix_sl_def : forall (x:R) (y:R), + ((x / y)%R = (x * (Reals.Rdefinitions.Rinv y))%R). reflexivity. Qed. (* Why3 goal *) Lemma add_div : forall (x:R) (y:R) (z:R), (~ (z = 0%R)) -> - ((Rdiv (x + y)%R z)%R = ((Rdiv x z)%R + (Rdiv y z)%R)%R). + (((x + y)%R / z)%R = ((x / z)%R + (y / z)%R)%R). Proof. intros. field. @@ -139,7 +141,7 @@ (* Why3 goal *) Lemma sub_div : forall (x:R) (y:R) (z:R), (~ (z = 0%R)) -> - ((Rdiv (x - y)%R z)%R = ((Rdiv x z)%R - (Rdiv y z)%R)%R). + (((x - y)%R / z)%R = ((x / z)%R - (y / z)%R)%R). Proof. intros. field. @@ -148,7 +150,7 @@ (* Why3 goal *) Lemma neg_div : forall (x:R) (y:R), (~ (y = 0%R)) -> - ((Rdiv (-x)%R y)%R = (-(Rdiv x y)%R)%R). + (((-x)%R / y)%R = (-(x / y)%R)%R). Proof. intros. field. @@ -157,7 +159,7 @@ (* Why3 goal *) Lemma assoc_mul_div : forall (x:R) (y:R) (z:R), (~ (z = 0%R)) -> - ((Rdiv (x * y)%R z)%R = (x * (Rdiv y z)%R)%R). + (((x * y)%R / z)%R = (x * (y / z)%R)%R). Proof. intros x y z _. apply Rmult_assoc. @@ -165,7 +167,7 @@ (* Why3 goal *) Lemma assoc_div_mul : forall (x:R) (y:R) (z:R), ((~ (y = 0%R)) /\ - ~ (z = 0%R)) -> ((Rdiv (Rdiv x y)%R z)%R = (Rdiv x (y * z)%R)%R). + ~ (z = 0%R)) -> (((x / y)%R / z)%R = (x / (y * z)%R)%R). Proof. intros x y z (Zy, Zz). unfold Rdiv. @@ -175,7 +177,7 @@ (* Why3 goal *) Lemma assoc_div_div : forall (x:R) (y:R) (z:R), ((~ (y = 0%R)) /\ - ~ (z = 0%R)) -> ((Rdiv x (Rdiv y z)%R)%R = (Rdiv (x * z)%R y)%R). + ~ (z = 0%R)) -> ((x / (y / z)%R)%R = ((x * z)%R / y)%R). Proof. intros x y z (Zy, Zz). field. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/real/Square.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/real/Square.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/real/Square.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/real/Square.v 2015-05-28 08:53:24.000000000 +0000 @@ -11,43 +11,48 @@ (* This file is generated by Why3's Coq-realize driver *) (* Beware! Only edit allowed sections below *) Require Import BuiltIn. -Require Import R_sqrt. +Require Reals.R_sqrt. Require BuiltIn. Require real.Real. +Import R_sqrt. + (* Why3 goal *) -Lemma sqr_def : forall (x:R), ((Rsqr x) = (x * x)%R). +Lemma sqr_def : forall (x:R), ((Reals.RIneq.Rsqr x) = (x * x)%R). reflexivity. Qed. (* Why3 comment *) -(* sqrt is replaced with (sqrt x) by the coq driver *) +(* sqrt is replaced with (Reals.R_sqrt.sqrt x) by the coq driver *) (* Why3 goal *) -Lemma Sqrt_positive : forall (x:R), (0%R <= x)%R -> (0%R <= (sqrt x))%R. +Lemma Sqrt_positive : forall (x:R), (0%R <= x)%R -> + (0%R <= (Reals.R_sqrt.sqrt x))%R. intros x _. apply sqrt_pos. Qed. (* Why3 goal *) -Lemma Sqrt_square : forall (x:R), (0%R <= x)%R -> ((Rsqr (sqrt x)) = x). +Lemma Sqrt_square : forall (x:R), (0%R <= x)%R -> + ((Reals.RIneq.Rsqr (Reals.R_sqrt.sqrt x)) = x). exact sqrt_sqrt. Qed. (* Why3 goal *) -Lemma Square_sqrt : forall (x:R), (0%R <= x)%R -> ((sqrt (x * x)%R) = x). +Lemma Square_sqrt : forall (x:R), (0%R <= x)%R -> + ((Reals.R_sqrt.sqrt (x * x)%R) = x). exact sqrt_square. Qed. (* Why3 goal *) Lemma Sqrt_mul : forall (x:R) (y:R), ((0%R <= x)%R /\ (0%R <= y)%R) -> - ((sqrt (x * y)%R) = ((sqrt x) * (sqrt y))%R). + ((Reals.R_sqrt.sqrt (x * y)%R) = ((Reals.R_sqrt.sqrt x) * (Reals.R_sqrt.sqrt y))%R). intros x y (hx & hy); now apply sqrt_mult. Qed. (* Why3 goal *) Lemma Sqrt_le : forall (x:R) (y:R), ((0%R <= x)%R /\ (x <= y)%R) -> - ((sqrt x) <= (sqrt y))%R. + ((Reals.R_sqrt.sqrt x) <= (Reals.R_sqrt.sqrt y))%R. intros x y (h1 & h2); apply sqrt_le_1; auto. apply Rle_trans with x; auto. Qed. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Vset.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Vset.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Vset.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Vset.v 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -28,68 +28,67 @@ Require int.Int. (* Why3 goal *) -Definition set : forall (a:Type) {a_WT:WhyType a}, Type. +Definition set : forall (a:Type), Type. Admitted. (* Why3 goal *) -Definition empty: forall {a:Type} {a_WT:WhyType a}, (@set a a_WT). +Definition empty: forall {a:Type} {a_WT:WhyType a}, (set a). Admitted. (* Why3 goal *) -Definition singleton: forall {a:Type} {a_WT:WhyType a}, a -> (@set a a_WT). +Definition singleton: forall {a:Type} {a_WT:WhyType a}, a -> (set a). Admitted. (* Why3 goal *) -Definition union: forall {a:Type} {a_WT:WhyType a}, (@set a a_WT) -> (@set - a a_WT) -> (@set a a_WT). +Definition union: forall {a:Type} {a_WT:WhyType a}, (set a) -> (set a) -> + (set a). Admitted. (* Why3 goal *) -Definition inter: forall {a:Type} {a_WT:WhyType a}, (@set a a_WT) -> (@set - a a_WT) -> (@set a a_WT). +Definition inter: forall {a:Type} {a_WT:WhyType a}, (set a) -> (set a) -> + (set a). Admitted. (* Why3 goal *) -Definition member: forall {a:Type} {a_WT:WhyType a}, a -> (@set a a_WT) -> - Prop. +Definition member: forall {a:Type} {a_WT:WhyType a}, a -> (set a) -> Prop. Admitted. (* Why3 goal *) -Definition member_bool: forall {a:Type} {a_WT:WhyType a}, a -> (@set - a a_WT) -> bool. +Definition member_bool: forall {a:Type} {a_WT:WhyType a}, a -> (set a) -> + bool. Admitted. (* Why3 goal *) -Definition range: Z -> Z -> (@set Z _). +Definition range: Z -> Z -> (set Z). Admitted. (* Why3 goal *) -Definition range_sup: Z -> (@set Z _). +Definition range_sup: Z -> (set Z). Admitted. (* Why3 goal *) -Definition range_inf: Z -> (@set Z _). +Definition range_inf: Z -> (set Z). Admitted. (* Why3 goal *) -Definition range_all: (@set Z _). +Definition range_all: (set Z). Admitted. (* Why3 assumption *) -Definition eqset {a:Type} {a_WT:WhyType a} (a1:(@set a a_WT)) (b:(@set - a a_WT)): Prop := forall (x:a), (member x a1) <-> (member x b). +Definition eqset {a:Type} {a_WT:WhyType a} (a1:(set a)) (b:(set a)): Prop := + forall (x:a), (member x a1) <-> (member x b). (* Why3 assumption *) -Definition subset {a:Type} {a_WT:WhyType a} (a1:(@set a a_WT)) (b:(@set - a a_WT)): Prop := forall (x:a), (member x a1) -> (member x b). +Definition subset {a:Type} {a_WT:WhyType a} (a1:(set a)) (b:(set a)): Prop := + forall (x:a), (member x a1) -> (member x b). (* Why3 assumption *) -Definition disjoint {a:Type} {a_WT:WhyType a} (a1:(@set a a_WT)) (b:(@set - a a_WT)): Prop := forall (x:a), (member x a1) -> ~ (member x b). +Definition disjoint {a:Type} {a_WT:WhyType a} (a1:(set a)) (b:(set + a)): Prop := forall (x:a), (member x a1) -> ~ (member x b). (* Why3 goal *) Lemma member_bool1 : forall {a:Type} {a_WT:WhyType a}, forall (x:a), - forall (s:(@set a a_WT)), ((member x s) -> ((member_bool x s) = true)) /\ + forall (s:(set a)), ((member x s) -> ((member_bool x s) = true)) /\ ((~ (member x s)) -> ((member_bool x s) = false)). Proof. intros a a_WT x s. @@ -98,7 +97,7 @@ (* Why3 goal *) Lemma member_empty : forall {a:Type} {a_WT:WhyType a}, forall (x:a), - ~ (member x (empty :(@set a a_WT))). + ~ (member x (empty : (set a))). Proof. intros a a_WT x. @@ -114,8 +113,8 @@ (* Why3 goal *) Lemma member_union : forall {a:Type} {a_WT:WhyType a}, forall (x:a), - forall (a1:(@set a a_WT)) (b:(@set a a_WT)), (member x (union a1 b)) <-> - ((member x a1) \/ (member x b)). + forall (a1:(set a)) (b:(set a)), (member x (union a1 b)) <-> ((member x + a1) \/ (member x b)). Proof. intros a a_WT x a1 b. @@ -123,26 +122,25 @@ (* Why3 goal *) Lemma member_inter : forall {a:Type} {a_WT:WhyType a}, forall (x:a), - forall (a1:(@set a a_WT)) (b:(@set a a_WT)), (member x (inter a1 b)) <-> - ((member x a1) /\ (member x b)). + forall (a1:(set a)) (b:(set a)), (member x (inter a1 b)) <-> ((member x + a1) /\ (member x b)). Proof. intros a a_WT x a1 b. Admitted. (* Why3 goal *) -Lemma union_empty : forall {a:Type} {a_WT:WhyType a}, forall (a1:(@set - a a_WT)), ((union a1 (empty :(@set a a_WT))) = a1) /\ ((union (empty :(@set - a a_WT)) a1) = a1). +Lemma union_empty : forall {a:Type} {a_WT:WhyType a}, forall (a1:(set a)), + ((union a1 (empty : (set a))) = a1) /\ ((union (empty : (set a)) a1) = a1). Proof. intros a a_WT a1. Admitted. (* Why3 goal *) -Lemma inter_empty : forall {a:Type} {a_WT:WhyType a}, forall (a1:(@set - a a_WT)), ((inter a1 (empty :(@set a a_WT))) = (empty :(@set a a_WT))) /\ - ((inter (empty :(@set a a_WT)) a1) = (empty :(@set a a_WT))). +Lemma inter_empty : forall {a:Type} {a_WT:WhyType a}, forall (a1:(set a)), + ((inter a1 (empty : (set a))) = (empty : (set a))) /\ ((inter (empty : (set + a)) a1) = (empty : (set a))). Proof. intros a a_WT a1. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Zbits.v frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Zbits.v --- frama-c-20140301+neon+dfsg/src/wp/share/coqwp/Zbits.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/coqwp/Zbits.v 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -62,6 +62,27 @@ | _ => idtac end. +Lemma bool3_eq : forall b1 b2: bool, (forall b: bool, b1=b <-> b2=b) <-> b1=b2. +Proof. + intros. + intuition. + rewrite H; auto. + rewrite <- H; auto. + rewrite H; auto. +Qed. + +Lemma bool2_eq_true : forall b1 b2:bool, (b1=true <-> b2=true) <-> b1=b2. +Proof. + intros. + destruct b1. + destruct b2. + intuition. + intuition. + destruct b2. + intuition. + intuition. +Qed. + Lemma split_range: forall a x b: Z, a <= x -> x < b -> a <= x < b. Proof. @@ -961,6 +982,14 @@ if Zle_bool 0 y then lsl_def x y else lsl_undef x y. +Theorem lsl_pos: forall x n: Z, + 0<=n -> lsl x n = lsl_def x n. +Proof. + intros. + unfold lsl. + case_leq 0 n. +Qed. + (* Lemma test_compute: lsl 2 1 = 4. *) (* Proof. *) (* compute; reflexivity. *) @@ -975,6 +1004,14 @@ if Zle_bool 0 y then lsr_def x y else lsr_undef x y. +Theorem lsr_pos: forall x n: Z, + 0<=n -> lsr x n = lsr_def x n. +Proof. + intros. + unfold lsr. + case_leq 0 n. +Qed. + (** ** Properties of shifting operators *) Theorem Zbit_lsl: forall (x n: Z) (k: nat), @@ -1130,6 +1167,46 @@ apply beq_nat_false_iff; omega. Qed. +Theorem Zbit_extraction_true : +forall (x:Z) (i:nat), + (land x (lsl_shift_def 1 i) = (lsl_shift_def 1 i) <-> (Zbit x i) = true). +Proof. + intros. + rewrite lsl_arithmetic_shift; unfold lsl_arithmetic_def. + replace (1 * two_power_nat i) with (two_power_nat i) by ring. + unfold land. + split. + (** 1st impl *) + intro H. + assert (Zbit (Z_bitwise andb x (two_power_nat i)) i = Zbit (two_power_nat i) i). + rewrite H; reflexivity. + (* assert done *) + rewrite Zbit_bitwise in H0. + rewrite Zbit_power in H0. + rewrite <- beq_nat_refl in H0. + rewrite Bool.andb_true_r in H0. + assumption. + (** 2sd impl *) + intro. + Zbit_ext k. + rewrite Zbit_bitwise; rewrite Zbit_power. + (** proof by case *) + case (lt_eq_lt_dec i k); intro cas. destruct cas. + (** i bit_testb x n = zbit_test_def x n. +Proof. + intros. + unfold bit_testb. + case_leq 0 n. + intro. auto. +Qed. + +Theorem bit_testb_ext: forall x y: Z, + (forall n: Z, 0<=n -> bit_testb x n = bit_testb y n) -> x=y. +Proof. + intros. + Zbit_ext j. + specialize (H (Z.of_nat j)). + specialize (H (Zle_0_nat j)). + rewrite bit_testb_pos in H. + rewrite bit_testb_pos in H. + unfold zbit_test_def in H. + rewrite Zabs2Nat.id in H. + auto. + apply (Zle_0_nat j). + apply (Zle_0_nat j). +Qed. + (** Tactical *) Local Ltac bit_extraction bin_op := intros; unfold zbit_test_def; unfold bin_op; rewrite Zbit_bitwise; auto. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/ergo/Cbits.mlw frama-c-20150201+sodium+dfsg/src/wp/share/ergo/Cbits.mlw --- frama-c-20140301+neon+dfsg/src/wp/share/ergo/Cbits.mlw 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/ergo/Cbits.mlw 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -48,6 +48,16 @@ (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))))) @@ -94,6 +104,11 @@ ((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) -> diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/ergo/Cfloat.mlw frama-c-20150201+sodium+dfsg/src/wp/share/ergo/Cfloat.mlw --- frama-c-20140301+neon+dfsg/src/wp/share/ergo/Cfloat.mlw 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/ergo/Cfloat.mlw 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/ergo/Cint.mlw frama-c-20150201+sodium+dfsg/src/wp/share/ergo/Cint.mlw --- frama-c-20140301+neon+dfsg/src/wp/share/ergo/Cint.mlw 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/ergo/Cint.mlw 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/ergo/Cmath.mlw frama-c-20150201+sodium+dfsg/src/wp/share/ergo/Cmath.mlw --- frama-c-20140301+neon+dfsg/src/wp/share/ergo/Cmath.mlw 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/ergo/Cmath.mlw 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -33,12 +33,12 @@ axiom abs_def1 : (forall x:int [abs_int(x)]. ((not (0 <= x)) -> (abs_int(x) = (-x)))) -axiom sqrt_lin1 : (forall x:real [sqrt(x)]. ((1. < x) -> (sqrt(x) < x))) +axiom sqrt_lin1 : (forall x:real [sqrt(x)]. ((1.0 < x) -> (sqrt(x) < x))) axiom sqrt_lin0 : - (forall x:real [sqrt(x)]. (((0. < x) and (x < 1.)) -> (x < sqrt(x)))) + (forall x:real [sqrt(x)]. (((0.0 < x) and (x < 1.0)) -> (x < sqrt(x)))) -axiom sqrt_0 : (sqrt(0.) = 0.) +axiom sqrt_0 : (sqrt(0.0) = 0.0) -axiom sqrt_1 : (sqrt(1.) = 1.) +axiom sqrt_1 : (sqrt(1.0) = 1.0) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/ergo/int.MinMax.mlw frama-c-20150201+sodium+dfsg/src/wp/share/ergo/int.MinMax.mlw --- frama-c-20140301+neon+dfsg/src/wp/share/ergo/int.MinMax.mlw 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/ergo/int.MinMax.mlw 2015-05-28 08:53:24.000000000 +0000 @@ -18,33 +18,35 @@ (** The theory int_Int_ must be appended to this file*) logic min_int : int, int -> int -logic max_int : int, int -> int - -axiom Max_is_ge : (forall x:int. forall y:int. (x <= max_int(x, y))) +axiom min_def : + (forall x:int. forall y:int. ((x <= y) -> (min_int(x, y) = x))) -axiom Max_is_ge1 : (forall x:int. forall y:int. (y <= max_int(x, y))) +axiom min_def1 : + (forall x:int. forall y:int. ((not (x <= y)) -> (min_int(x, y) = y))) -axiom Max_is_some : - (forall x:int. forall y:int. ((max_int(x, y) = x) or (max_int(x, y) = y))) - -axiom Min_is_le : (forall x:int. forall y:int. (min_int(x, y) <= x)) +logic max_int : int, int -> int -axiom Min_is_le1 : (forall x:int. forall y:int. (min_int(x, y) <= y)) +axiom max_def : + (forall x:int. forall y:int. ((x <= y) -> (max_int(x, y) = y))) -axiom Min_is_some : - (forall x:int. forall y:int. ((min_int(x, y) = x) or (min_int(x, y) = y))) +axiom max_def1 : + (forall x:int. forall y:int. ((not (x <= y)) -> (max_int(x, y) = x))) -axiom Max_x : (forall x:int. forall y:int. ((y <= x) -> (max_int(x, y) = x))) +axiom Min_r : (forall x:int. forall y:int. ((y <= x) -> (min_int(x, y) = y))) -axiom Max_y : (forall x:int. forall y:int. ((x <= y) -> (max_int(x, y) = y))) +axiom Max_l : (forall x:int. forall y:int. ((y <= x) -> (max_int(x, y) = x))) -axiom Min_x : (forall x:int. forall y:int. ((x <= y) -> (min_int(x, y) = x))) +axiom Min_comm : + (forall x:int. forall y:int. (min_int(x, y) = min_int(y, x))) -axiom Min_y : (forall x:int. forall y:int. ((y <= x) -> (min_int(x, y) = y))) +axiom Max_comm : + (forall x:int. forall y:int. (max_int(x, y) = max_int(y, x))) -axiom Max_sym : - (forall x:int. forall y:int. ((y <= x) -> (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 Min_sym : - (forall x:int. forall y:int. ((y <= x) -> (min_int(x, y) = min_int(y, x)))) +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 -Nru frama-c-20140301+neon+dfsg/src/wp/share/ergo/Memory.mlw frama-c-20150201+sodium+dfsg/src/wp/share/ergo/Memory.mlw --- frama-c-20140301+neon+dfsg/src/wp/share/ergo/Memory.mlw 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/ergo/Memory.mlw 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/ergo/Qed.mlw frama-c-20150201+sodium+dfsg/src/wp/share/ergo/Qed.mlw --- frama-c-20140301+neon+dfsg/src/wp/share/ergo/Qed.mlw 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/ergo/Qed.mlw 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/ergo/real.MinMax.mlw frama-c-20150201+sodium+dfsg/src/wp/share/ergo/real.MinMax.mlw --- frama-c-20140301+neon+dfsg/src/wp/share/ergo/real.MinMax.mlw 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/ergo/real.MinMax.mlw 2015-05-28 08:53:24.000000000 +0000 @@ -18,21 +18,37 @@ (** 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_is_ge : (forall x:real. forall y:real. (x <= max_real(x, y))) +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_is_ge1 : (forall x:real. forall y:real. (y <= max_real(x, y))) +axiom Max_l : + (forall x:real. forall y:real. ((y <= x) -> (max_real(x, y) = x))) -axiom Max_is_some : - (forall x:real. forall y:real. ((max_real(x, y) = x) or (max_real(x, - y) = y))) +axiom Min_comm : + (forall x:real. forall y:real. (min_real(x, y) = min_real(y, x))) -axiom Min_is_le : (forall x:real. forall y:real. (min_real(x, y) <= x)) +axiom Max_comm : + (forall x:real. forall y:real. (max_real(x, y) = max_real(y, x))) -axiom Min_is_le1 : (forall x:real. forall y:real. (min_real(x, y) <= y)) +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 Min_is_some : - (forall x:real. forall y:real. ((min_real(x, y) = x) or (min_real(x, - y) = y))) +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 -Nru frama-c-20140301+neon+dfsg/src/wp/share/ergo/Vset.mlw frama-c-20150201+sodium+dfsg/src/wp/share/ergo/Vset.mlw --- frama-c-20140301+neon+dfsg/src/wp/share/ergo/Vset.mlw 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/ergo/Vset.mlw 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/install.ml frama-c-20150201+sodium+dfsg/src/wp/share/install.ml --- frama-c-20140301+neon+dfsg/src/wp/share/install.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/install.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/Makefile frama-c-20150201+sodium+dfsg/src/wp/share/Makefile --- frama-c-20140301+neon+dfsg/src/wp/share/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/Makefile 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,103 @@ +########################################################################## +# # +# This file is part of WP plug-in of Frama-C. # +# # +# Copyright (C) 2007-2015 # +# 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). # +# # +########################################################################## + + +# -------------------------------------------------------------------------- +# --- Coq Compilation +# -------------------------------------------------------------------------- + +.PHONY: all why3compile coqwpcompile clean depend + +WPLSHARE=$(Wp_DIR)/share + +clean:: + find $(WPLSHARE) \( -name "*.vo" -or -name "*.glob" \) -print -delete + rm -f $(WPLSHARE)/coqwp/.depend $(WPLSHARE)/why3/.depend + +######################### +## For why3 directory ## + +ifeq ($(WP_WHY3COQC_ENABLED),yes) + +byte:: why3compile +opt:: why3compile + +why3compile: $(addprefix $(WPLSHARE)/why3/, $(addsuffix o, $(COQ_LIBS_CEA))) + +WHY3LIB:=$(shell why3 --print-libdir) +WHY3INCLUDES= -R $(WHY3LIB)/coq -as Why3 -I $(WPLSHARE)/why3 + +$(WPLSHARE)/why3/%.vo: $(WPLSHARE)/why3/%.v + echo "Coqc $@" + @coqc $(WHY3INCLUDES) $< + +$(WPLSHARE)/why3/.depend: $(addprefix $(WPLSHARE)/, $(WHY3_COQ_SOURCES)) + echo "Coqdep for $(WPLSHARE)/why3" + @coqdep $(WHY3INCLUDES) -slash $(WPLSHARE)/why3/*.v $(WPLSHARE)/why3/**/*.v > $@ + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(MAKECMDGOALS),distclean) +ifneq ($(MAKECMDGOALS),smartclean) +include $(WPLSHARE)/why3/.depend +endif +endif +endif + +endif # ($(WP_WHY3COQC_ENABLED),yes) + +######################### +## For coqwp directory ## + +ifeq ($(WP_COQC_ENABLED),yes) + +byte:: coqwpcompile +opt:: coqwpcompile + + +coqwpcompile: $(addprefix $(WPLSHARE)/coqwp/, $(addsuffix o, $(COQ_LIBS_CEA) $(COQ_LIBS_INRIA))) + +COQWPINCLUDES= -R $(WPLSHARE)/coqwp/ -as "" + +$(WPLSHARE)/coqwp/%.vo: $(WPLSHARE)/coqwp/%.v + echo "Coqc $<" + @coqc $(COQWPINCLUDES) $< + +$(WPLSHARE)/coqwp/.depend: $(addprefix $(WPLSHARE)/, $(WP_COQ_SOURCES)) + echo "Coqdep for $(WPLSHARE)/coqwp" + @coqdep $(COQWPINCLUDES) -slash $(WPLSHARE)/coqwp/*.v $(WPLSHARE)/coqwp/**/*.v > $@ + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(MAKECMDGOALS),distclean) +ifneq ($(MAKECMDGOALS),smartclean) +include $(WPLSHARE)/coqwp/.depend +endif +endif +endif + +endif #($(WP_COQC_ENABLED),yes) + +# End of file + +########################################################################## +# Local Variables: +# mode: makefile +# End: diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/Makefile.coq frama-c-20150201+sodium+dfsg/src/wp/share/Makefile.coq --- frama-c-20140301+neon+dfsg/src/wp/share/Makefile.coq 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/Makefile.coq 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -########################################################################## -# # -# This file is part of WP plug-in of Frama-C. # -# # -# Copyright (C) 2007-2014 # -# 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). # -# # -########################################################################## - -# -------------------------------------------------------------------------- -# --- Coq Compilation -# -------------------------------------------------------------------------- - -.PHONY: all compile clean depend - -all: compile - -.SUFFIXES: .v .vo - -.v.vo: - coqc $(INCLUDES) $< - -depend: - coqdep $(INCLUDES) -slash *.v **/*.v > .depend - -clean: - rm -f *.glob *.vo **/*.glob **/*.vo - -sinclude .depend - -# End of file - -########################################################################## -# Local Variables: -# mode: makefile -# End: diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/Makefile.resources frama-c-20150201+sodium+dfsg/src/wp/share/Makefile.resources --- frama-c-20140301+neon+dfsg/src/wp/share/Makefile.resources 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/Makefile.resources 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ # # # This file is part of WP plug-in of Frama-C. # # # -# Copyright (C) 2007-2014 # +# Copyright (C) 2007-2015 # # CEA (Commissariat a l'energie atomique et aux energies # # alternatives) # # # @@ -100,19 +100,20 @@ # Resource classes for license header files # These files are relatives to this directory -ALL_CEA_RESOURCES+= \ +WP_SHARE_SRC_CEA_RESOURCES:= \ wp.driver \ why3/coq.drv \ - install.ml \ - Makefile.resources \ - Makefile.coq \ - why3/Makefile \ - coqwp/Makefile \ $(addprefix why3/, $(WHY3_LIBS_CEA)) \ $(addprefix why3/, $(COQ_LIBS_CEA)) \ $(addprefix coqwp/, $(COQ_LIBS_CEA)) \ $(addprefix ergo/, $(ERGO_LIBS_CEA)) +ALL_CEA_RESOURCES+= \ + install.ml \ + Makefile.resources \ + Makefile \ + $(WP_SHARE_SRC_CEA_RESOURCES) + ALL_UNMODIFIED_WHY3_RESOURCES:= \ $(addprefix coqwp/, $(COQ_LIBS_INRIA)) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Bits.v frama-c-20150201+sodium+dfsg/src/wp/share/why3/Bits.v --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Bits.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Bits.v 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Cbits.v frama-c-20150201+sodium+dfsg/src/wp/share/why3/Cbits.v --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Cbits.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Cbits.v 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -23,7 +23,6 @@ (* This file is generated by Why3's Coq-realize driver *) (* Beware! Only edit allowed sections below *) Require Import BuiltIn. -Require Import ZOdiv. Require BuiltIn. Require Qed. Require bool.Bool. @@ -100,8 +99,55 @@ Qed. (* Why3 goal *) +Lemma bit_test_extraction_eq : forall (x:Z) (k:Z), (0%Z <= k)%Z -> + (((Cint.land x (Cint.lsl 1%Z k)) = (Cint.lsl 1%Z k)) <-> (Cint.bit_test x + k)). +Proof. + intros x k h1. + unfold Cint.land. + unfold Cint.lsl; unfold Zbits.lsl. + rewrite (Zle_imp_le_bool _ _ h1); unfold Zbits.lsl_def. + + unfold Cint.bit_test; unfold Cint.bit_testb; + unfold_bit_testb h1; unfold Zbits.zbit_test_def. + pose (i:= (Z.abs_nat k)); fold i. + rewrite Zbits.Zbit_extraction_true. + split; auto. +Qed. + +(* Why3 goal *) +Lemma lsl_1_0 : ((Cint.lsl 1%Z 0%Z) = 1%Z). +Proof. + compute. auto. +Qed. + +(* Why3 goal *) +Lemma bit_test_extraction_bis : forall (x:Z), (~ ((Cint.land 1%Z + x) = 0%Z)) -> (Cint.bit_test x 0%Z). +Proof. + intros x. + rewrite <- lsl_1_0. + intro. + apply bit_test_extraction. + omega. + rewrite Zbits.land_commut. + auto. +Qed. + +(* Why3 goal *) +Lemma bit_test_extraction_bis_eq : forall (x:Z), (Cint.bit_test x 0%Z) -> + ((Cint.land 1%Z x) = 1%Z). +Proof. + intros x h1. + rewrite <- lsl_1_0. + rewrite <- Zbits.land_commut. + apply bit_test_extraction_eq; auto with zarith. +Qed. + +(* Why3 goal *) Lemma lnot_extraction_bool : forall (x:Z) (i:Z), (0%Z <= i)%Z -> - ((Cint.bit_testb (Cint.lnot x) i) = (negb (Cint.bit_testb x i))). + ((Cint.bit_testb (Cint.lnot x) i) = (Init.Datatypes.negb (Cint.bit_testb x + i))). Proof. intros x i h1. unfold_bit_testb h1. apply Zbits.lnot_extraction. @@ -120,8 +166,8 @@ (* Why3 goal *) Lemma land_extraction_bool : forall (x:Z) (y:Z) (i:Z), (0%Z <= i)%Z -> - ((Cint.bit_testb (Cint.land x y) i) = (andb (Cint.bit_testb x - i) (Cint.bit_testb y i))). + ((Cint.bit_testb (Cint.land x y) + i) = (Init.Datatypes.andb (Cint.bit_testb x i) (Cint.bit_testb y i))). Proof. intros x y i h1. unfold_bit_testb h1. apply Zbits.land_extraction. @@ -141,7 +187,7 @@ (* Why3 goal *) Lemma lor_extraction_bool : forall (x:Z) (y:Z) (i:Z), (0%Z <= i)%Z -> - ((Cint.bit_testb (Cint.lor x y) i) = (orb (Cint.bit_testb x + ((Cint.bit_testb (Cint.lor x y) i) = (Init.Datatypes.orb (Cint.bit_testb x i) (Cint.bit_testb y i))). Proof. intros x y i h1. unfold_bit_testb h1. @@ -162,8 +208,8 @@ (* Why3 goal *) Lemma lxor_extraction_bool : forall (x:Z) (y:Z) (i:Z), (0%Z <= i)%Z -> - ((Cint.bit_testb (Cint.lxor x y) i) = (xorb (Cint.bit_testb x - i) (Cint.bit_testb y i))). + ((Cint.bit_testb (Cint.lxor x y) + i) = (Init.Datatypes.xorb (Cint.bit_testb x i) (Cint.bit_testb y i))). Proof. intros x y i h1. unfold_bit_testb h1. @@ -186,6 +232,39 @@ destruct H; apply H0; discriminate. Qed. +(* Why3 goal *) +Lemma land_1_lsl_1 : forall (a:Z) (x:Z) (n:Z), (0%Z <= n)%Z -> + ((a < (Cint.lsl 1%Z n))%Z -> (((2%Z * a)%Z + (Cint.land 1%Z + x))%Z < (Cint.lsl 1%Z (1%Z + n)%Z))%Z). +Proof. + intros a x n h1. + unfold Cint.lsl; unfold Zbits.lsl. + case_leq 0%Z (1 + n)%Z ; intro. + case_leq 0%Z (n)%Z ; intro. + + unfold Zbits.lsl_def. + rewrite Zbits.lsl_arithmetic_shift. + unfold Zbits.lsl_arithmetic_def. + rewrite Zabs2Nat.abs_nat_nonneg by auto. + rewrite Zabs2Nat.abs_nat_nonneg by auto. + rewrite Z2Nat.inj_add by omega. + pose (n0:=Z.to_nat n); fold n0. + + replace ((Z.to_nat 1%Z)%nat) with (1%nat) by auto. + rewrite Bits.two_power_nat_plus. + replace ((two_power_nat 1)%Z) with (2%Z) by auto with zarith. + replace ((1 * two_power_nat n0)%Z) with ((two_power_nat n0)%Z) by auto. + replace ((1 * (2 * two_power_nat n0))%Z) with ((2 * two_power_nat n0)%Z) by ring. + + intro. + cut((Cint.land 1 x < 2)%Z) ; auto with zarith. + + case_eq ((Cint.land 1 x)%Z) (0%Z); intros. + rewrite bit_test_extraction_bis_eq; [omega|]. + apply bit_test_extraction_bis. + auto. +Qed. + (** ** Shift operators *) (* Why3 goal *) Lemma lsl_extraction_sup_bool : forall (x:Z) (n:Z) (m:Z), (0%Z <= n)%Z -> @@ -304,6 +383,29 @@ unfold Cint.bit_test; rewrite lsl1_extraction_bool; auto. apply Qed.eqb1. Qed. +(* Why3 goal *) +Lemma pos_extraction_sup : forall (x:Z) (i:Z) (j:Z), (0%Z <= x)%Z -> + ((0%Z <= i)%Z -> ((x < (Cint.lsl 1%Z i))%Z -> ((i <= j)%Z -> + ~ (Cint.bit_test x j)))). +Proof. + intros x i j h1 h2. + unfold Cint.lsl ; unfold Cint.bit_test. + rewrite Zbits.lsl_pos; auto. + unfold Zbits.lsl_def. + rewrite Zbits.lsl_arithmetic_shift. + unfold Zbits.lsl_arithmetic_def. + replace (1 * two_power_nat (Z.abs_nat i)) with (two_power_nat (Z.abs_nat i)) by ring. + intros. + rewrite Zbits.bit_testb_pos ; auto. + assert (HB:(Bits.Zbit x (Z.abs_nat j) = false)). + (apply (Zbits.Zbit_unsigned_trail (Z.abs_nat i) (Z.abs_nat j) x); auto). + apply Zabs_nat_le; omega. + unfold Zbits.zbit_test_def. + + rewrite HB; discriminate. + omega. +Qed. + (** * Link between Bit extraction and C type conversions *) (** Tacticals *) Local Ltac naturalize_int_extraction_inf_bool n vn vz := @@ -372,6 +474,30 @@ int_extraction_inf to_uint8_extraction_inf_bool. Qed. +(* Why3 goal *) +Lemma is_uint8_ext : forall (x:Z) (y:Z), (Cint.is_uint8 x) -> ((Cint.is_uint8 + y) -> ((forall (i:Z), ((0%Z <= i)%Z /\ (i < 8%Z)%Z) -> ((Cint.bit_test x + i) <-> (Cint.bit_test y i))) -> (x = y))). +Proof. + intros x y h1 h2 h3. + assert (forall i: int, (0 <= i)%Z -> (Cint.bit_test x i <-> Cint.bit_test y i)). + intros. + case_leq i 7; intro. + apply h3; omega. + assert (~ Cint.bit_test x i). + apply to_uint8_extraction_sup. omega. auto. + assert (~ Cint.bit_test y i). + apply to_uint8_extraction_sup. omega. auto. + intuition. + clear h1; clear h2; clear h3. + + unfold Cint.bit_test in H. + unfold Cint.bit_testb in H. + apply Zbits.bit_testb_ext; intros. + rewrite <- Zbits.bool2_eq_true. + apply H; auto. +Qed. + (** *** Cast to uint16 C type *) (* Why3 goal *) Lemma to_uint16_extraction_sup : forall (x:Z) (i:Z), (16%Z <= i)%Z -> @@ -397,6 +523,30 @@ int_extraction_inf to_uint16_extraction_inf_bool. Qed. +(* Why3 goal *) +Lemma is_uint16_ext : forall (x:Z) (y:Z), (Cint.is_uint16 x) -> + ((Cint.is_uint16 y) -> ((forall (i:Z), ((0%Z <= i)%Z /\ (i < 16%Z)%Z) -> + ((Cint.bit_test x i) <-> (Cint.bit_test y i))) -> (x = y))). +Proof. + intros x y h1 h2 h3. + assert (forall i: int, (0 <= i)%Z -> (Cint.bit_test x i <-> Cint.bit_test y i)). + intros. + case_leq i 15; intro. + apply h3; omega. + assert (~ Cint.bit_test x i). + apply to_uint16_extraction_sup. omega. auto. + assert (~ Cint.bit_test y i). + apply to_uint16_extraction_sup. omega. auto. + intuition. + clear h1; clear h2; clear h3. + + unfold Cint.bit_test in H. + unfold Cint.bit_testb in H. + apply Zbits.bit_testb_ext; intros. + rewrite <- Zbits.bool2_eq_true. + apply H; auto. +Qed. + (** *** Cast to uint32 C type *) (* Why3 goal *) Lemma to_uint32_extraction_sup : forall (x:Z) (i:Z), (32%Z <= i)%Z -> @@ -422,6 +572,30 @@ int_extraction_inf to_uint32_extraction_inf_bool. Qed. +(* Why3 goal *) +Lemma is_uint32_ext : forall (x:Z) (y:Z), (Cint.is_uint32 x) -> + ((Cint.is_uint32 y) -> ((forall (i:Z), ((0%Z <= i)%Z /\ (i < 32%Z)%Z) -> + ((Cint.bit_test x i) <-> (Cint.bit_test y i))) -> (x = y))). +Proof. + intros x y h1 h2 h3. + assert (forall i: int, (0 <= i)%Z -> (Cint.bit_test x i <-> Cint.bit_test y i)). + intros. + case_leq i 31; intro. + apply h3; omega. + assert (~ Cint.bit_test x i). + apply to_uint32_extraction_sup. omega. auto. + assert (~ Cint.bit_test y i). + apply to_uint32_extraction_sup. omega. auto. + intuition. + clear h1; clear h2; clear h3. + + unfold Cint.bit_test in H. + unfold Cint.bit_testb in H. + apply Zbits.bit_testb_ext; intros. + rewrite <- Zbits.bool2_eq_true. + apply H; auto. +Qed. + (** *** Cast to uint64 C type *) (* Why3 goal *) Lemma to_uint64_extraction_sup : forall (x:Z) (i:Z), (64%Z <= i)%Z -> @@ -447,6 +621,30 @@ int_extraction_inf to_uint64_extraction_inf_bool. Qed. +(* Why3 goal *) +Lemma is_uint64_ext : forall (x:Z) (y:Z), (Cint.is_uint64 x) -> + ((Cint.is_uint64 y) -> ((forall (i:Z), ((0%Z <= i)%Z /\ (i < 64%Z)%Z) -> + ((Cint.bit_test x i) <-> (Cint.bit_test y i))) -> (x = y))). +Proof. + intros x y h1 h2 h3. + assert (forall i: int, (0 <= i)%Z -> (Cint.bit_test x i <-> Cint.bit_test y i)). + intros. + case_leq i 63; intro. + apply h3; omega. + assert (~ Cint.bit_test x i). + apply to_uint64_extraction_sup. omega. auto. + assert (~ Cint.bit_test y i). + apply to_uint64_extraction_sup. omega. auto. + intuition. + clear h1; clear h2; clear h3. + + unfold Cint.bit_test in H. + unfold Cint.bit_testb in H. + apply Zbits.bit_testb_ext; intros. + rewrite <- Zbits.bool2_eq_true. + apply H; auto. +Qed. + (** ** Signed conversions *) (** Tactical *) Local Ltac sint_extraction_sup is_sint vn vz := @@ -462,13 +660,6 @@ apply (Zbits.Zbit_trail vn (Z.abs_nat i) x); auto. (** *** To sint8 C type*) -(* Why3 goal *) -Lemma to_sint8_extraction_sup : forall (x:Z) (i:Z), (7%Z <= i)%Z -> - ((Cint.is_sint8 x) -> ((Cint.bit_test x i) <-> (x < 0%Z)%Z)). -Proof. - sint_extraction_sup Cint.is_sint8 7%nat 7. -Qed. - Local Ltac sint_extraction_inf m x to_sint n vz wz:= unfold to_sint; unfold Cint.to_range; (replace (vz - wz) with (2 * two_power_nat n) by (auto with zarith)); @@ -479,98 +670,9 @@ rewrite Zbits.Zbit_sint_mod_two_power_nat; auto. -(* Why3 goal *) -Lemma to_sint8_extraction_inf_bool : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ - (i < 7%Z)%Z) -> ((Cint.bit_testb (Cint.to_sint8 x) i) = (Cint.bit_testb x - i)). -Proof. - naturalize_int_extraction_inf_bool n 7%nat 7. - sint_extraction_inf n x Cint.to_sint8 7%nat 128 (-128). -Qed. - -(* Why3 goal *) -Lemma to_sint8_extraction_inf : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ - (i < 7%Z)%Z) -> ((Cint.bit_test (Cint.to_sint8 x) i) <-> (Cint.bit_test x - i)). -Proof. - int_extraction_inf to_sint8_extraction_inf_bool. -Qed. - (** *** To sint16 C type*) -(* Why3 goal *) -Lemma to_sint16_extraction_sup : forall (x:Z) (i:Z), (15%Z <= i)%Z -> - ((Cint.is_sint16 x) -> ((Cint.bit_test x i) <-> (x < 0%Z)%Z)). -Proof. - sint_extraction_sup Cint.is_sint16 15%nat 15. -Qed. - -(* Why3 goal *) -Lemma to_sint16_extraction_inf_bool : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ - (i < 15%Z)%Z) -> ((Cint.bit_testb (Cint.to_sint16 x) i) = (Cint.bit_testb x - i)). -Proof. - naturalize_int_extraction_inf_bool n 16%nat 16. - sint_extraction_inf n x Cint.to_sint16 15%nat 32768 (-32768). -Qed. - -(* Why3 goal *) -Lemma to_sint16_extraction_inf : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ - (i < 15%Z)%Z) -> ((Cint.bit_test (Cint.to_sint16 x) i) <-> (Cint.bit_test x - i)). -Proof. - int_extraction_inf to_sint16_extraction_inf_bool. -Qed. - (** *** To sint32 C type *) -(* Why3 goal *) -Lemma to_sint32_extraction_sup : forall (x:Z) (i:Z), (31%Z <= i)%Z -> - ((Cint.is_sint32 x) -> ((Cint.bit_test x i) <-> (x < 0%Z)%Z)). -Proof. - sint_extraction_sup Cint.is_sint32 31%nat 31. -Qed. - -(* Why3 goal *) -Lemma to_sint32_extraction_inf_bool : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ - (i < 31%Z)%Z) -> ((Cint.bit_testb (Cint.to_sint32 x) i) = (Cint.bit_testb x - i)). -Proof. - naturalize_int_extraction_inf_bool n 32%nat 32. - sint_extraction_inf n x Cint.to_sint32 31%nat 2147483648 (-2147483648). -Qed. - -(* Why3 goal *) -Lemma to_sint32_extraction_inf : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ - (i < 31%Z)%Z) -> ((Cint.bit_test (Cint.to_sint32 x) i) <-> (Cint.bit_test x - i)). -Proof. - int_extraction_inf to_sint32_extraction_inf_bool. -Qed. - (** *** To sint64 C type *) -(* Why3 goal *) -Lemma to_sint64_extraction_sup : forall (x:Z) (i:Z), (63%Z <= i)%Z -> - ((Cint.is_sint64 x) -> ((Cint.bit_test x i) <-> (x < 0%Z)%Z)). -Proof. - sint_extraction_sup Cint.is_sint64 63%nat 63. -Qed. - -(* Why3 goal *) -Lemma to_sint64_extraction_inf_bool : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ - (i < 63%Z)%Z) -> ((Cint.bit_testb (Cint.to_sint64 x) i) = (Cint.bit_testb x - i)). -Proof. - naturalize_int_extraction_inf_bool n 64%nat 64. - sint_extraction_inf n x Cint.to_sint64 63%nat 9223372036854775808 (-9223372036854775808). -Qed. - -(* Why3 goal *) -Lemma to_sint64_extraction_inf : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ - (i < 63%Z)%Z) -> ((Cint.bit_test (Cint.to_sint64 x) i) <-> (Cint.bit_test x - i)). -Proof. - int_extraction_inf to_sint64_extraction_inf_bool. -Qed. - (** * Some C-Integer Bits Conversions are identity *) (** Tacticals *) Local Ltac unfold_hyp h := @@ -674,6 +776,237 @@ apply Z_mod_mult. (** *** Cast to uint8 C type *) +(** *** Cast to uint16 C type *) +(** *** Cast to uint32 C type *) +(** *** Cast to uint64 C type *) +(* Why3 goal *) +Lemma to_sint8_extraction_sup : forall (x:Z) (i:Z), (7%Z <= i)%Z -> + ((Cint.is_sint8 x) -> ((Cint.bit_test x i) <-> (x < 0%Z)%Z)). +Proof. + sint_extraction_sup Cint.is_sint8 7%nat 7. +Qed. + +(* Why3 goal *) +Lemma to_sint8_extraction_inf_bool : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ + (i < 7%Z)%Z) -> ((Cint.bit_testb (Cint.to_sint8 x) i) = (Cint.bit_testb x + i)). +Proof. + naturalize_int_extraction_inf_bool n 7%nat 7. + sint_extraction_inf n x Cint.to_sint8 7%nat 128 (-128). +Qed. + +(* Why3 goal *) +Lemma to_sint8_extraction_inf : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ + (i < 7%Z)%Z) -> ((Cint.bit_test (Cint.to_sint8 x) i) <-> (Cint.bit_test x + i)). +Proof. + int_extraction_inf to_sint8_extraction_inf_bool. +Qed. + +(* Why3 goal *) +Lemma is_sint8_ext : forall (x:Z) (y:Z), (Cint.is_sint8 x) -> ((Cint.is_sint8 + y) -> ((forall (i:Z), ((0%Z <= i)%Z /\ (i <= 7%Z)%Z) -> ((Cint.bit_test x + i) <-> (Cint.bit_test y i))) -> (x = y))). +Proof. + intros x y h1 h2 h3. + assert (forall i: int, (0 <= i)%Z -> (Cint.bit_test x i <-> Cint.bit_test y i)). + intros. + case_lt i 8; intro. + apply h3; omega. + assert (0<=7<=7) by omega. + specialize ((h3 7) H1); clear H1. + assert (7<=7) by omega. + generalize ((to_sint8_extraction_sup x 7) H1 h1). + generalize ((to_sint8_extraction_sup y 7) H1 h2). + clear H1; intros. + rewrite h3 in H2. rewrite H2 in H1. clear H2. + assert ((Cint.bit_test x i) <-> x < 0). + apply to_sint8_extraction_sup. omega. auto. + assert ((Cint.bit_test y i) <-> y < 0). + apply to_sint8_extraction_sup. omega. auto. + rewrite H2. + rewrite H3. + auto. + clear h1; clear h2; clear h3. + + unfold Cint.bit_test in H. + unfold Cint.bit_testb in H. + apply Zbits.bit_testb_ext; intros. + rewrite <- Zbits.bool2_eq_true. + apply H; auto. +Qed. + +(* Why3 goal *) +Lemma to_sint16_extraction_sup : forall (x:Z) (i:Z), (15%Z <= i)%Z -> + ((Cint.is_sint16 x) -> ((Cint.bit_test x i) <-> (x < 0%Z)%Z)). +Proof. + sint_extraction_sup Cint.is_sint16 15%nat 15. +Qed. + +(* Why3 goal *) +Lemma to_sint16_extraction_inf_bool : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ + (i < 15%Z)%Z) -> ((Cint.bit_testb (Cint.to_sint16 x) i) = (Cint.bit_testb x + i)). +Proof. + naturalize_int_extraction_inf_bool n 16%nat 16. + sint_extraction_inf n x Cint.to_sint16 15%nat 32768 (-32768). +Qed. + +(* Why3 goal *) +Lemma to_sint16_extraction_inf : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ + (i < 15%Z)%Z) -> ((Cint.bit_test (Cint.to_sint16 x) i) <-> (Cint.bit_test x + i)). +Proof. + int_extraction_inf to_sint16_extraction_inf_bool. +Qed. + +(* Why3 goal *) +Lemma is_sint16_ext : forall (x:Z) (y:Z), (Cint.is_sint16 x) -> + ((Cint.is_sint16 y) -> ((forall (i:Z), ((0%Z <= i)%Z /\ (i <= 15%Z)%Z) -> + ((Cint.bit_test x i) <-> (Cint.bit_test y i))) -> (x = y))). +Proof. + intros x y h1 h2 h3. + assert (forall i: int, (0 <= i)%Z -> (Cint.bit_test x i <-> Cint.bit_test y i)). + intros. + case_lt i 16; intro. + apply h3; omega. + assert (0<=15<=15) by omega. + specialize ((h3 15) H1); clear H1. + assert (15<=15) by omega. + generalize ((to_sint16_extraction_sup x 15) H1 h1). + generalize ((to_sint16_extraction_sup y 15) H1 h2). + clear H1; intros. + rewrite h3 in H2. rewrite H2 in H1. clear H2. + assert ((Cint.bit_test x i) <-> x < 0). + apply to_sint16_extraction_sup. omega. auto. + assert ((Cint.bit_test y i) <-> y < 0). + apply to_sint16_extraction_sup. omega. auto. + rewrite H2. + rewrite H3. + auto. + clear h1; clear h2; clear h3. + + unfold Cint.bit_test in H. + unfold Cint.bit_testb in H. + apply Zbits.bit_testb_ext; intros. + rewrite <- Zbits.bool2_eq_true. + apply H; auto. +Qed. + +(* Why3 goal *) +Lemma to_sint32_extraction_sup : forall (x:Z) (i:Z), (31%Z <= i)%Z -> + ((Cint.is_sint32 x) -> ((Cint.bit_test x i) <-> (x < 0%Z)%Z)). +Proof. + sint_extraction_sup Cint.is_sint32 31%nat 31. +Qed. + +(* Why3 goal *) +Lemma to_sint32_extraction_inf_bool : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ + (i < 31%Z)%Z) -> ((Cint.bit_testb (Cint.to_sint32 x) i) = (Cint.bit_testb x + i)). +Proof. + naturalize_int_extraction_inf_bool n 32%nat 32. + sint_extraction_inf n x Cint.to_sint32 31%nat 2147483648 (-2147483648). +Qed. + +(* Why3 goal *) +Lemma to_sint32_extraction_inf : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ + (i < 31%Z)%Z) -> ((Cint.bit_test (Cint.to_sint32 x) i) <-> (Cint.bit_test x + i)). +Proof. + int_extraction_inf to_sint32_extraction_inf_bool. +Qed. + +(* Why3 goal *) +Lemma is_sint32_ext : forall (x:Z) (y:Z), (Cint.is_sint32 x) -> + ((Cint.is_sint32 y) -> ((forall (i:Z), ((0%Z <= i)%Z /\ (i <= 31%Z)%Z) -> + ((Cint.bit_test x i) <-> (Cint.bit_test y i))) -> (x = y))). +Proof. + intros x y h1 h2 h3. + assert (forall i: int, (0 <= i)%Z -> (Cint.bit_test x i <-> Cint.bit_test y i)). + intros. + case_lt i 31; intro. + apply h3; omega. + assert (0<=31<=31) by omega. + specialize ((h3 31) H1); clear H1. + assert (31<=31) by omega. + generalize ((to_sint32_extraction_sup x 31) H1 h1). + generalize ((to_sint32_extraction_sup y 31) H1 h2). + clear H1; intros. + rewrite h3 in H2. rewrite H2 in H1. clear H2. + assert ((Cint.bit_test x i) <-> x < 0). + apply to_sint32_extraction_sup. omega. auto. + assert ((Cint.bit_test y i) <-> y < 0). + apply to_sint32_extraction_sup. omega. auto. + rewrite H2. + rewrite H3. + auto. + clear h1; clear h2; clear h3. + + unfold Cint.bit_test in H. + unfold Cint.bit_testb in H. + apply Zbits.bit_testb_ext; intros. + rewrite <- Zbits.bool2_eq_true. + apply H; auto. +Qed. + +(* Why3 goal *) +Lemma to_sint64_extraction_sup : forall (x:Z) (i:Z), (63%Z <= i)%Z -> + ((Cint.is_sint64 x) -> ((Cint.bit_test x i) <-> (x < 0%Z)%Z)). +Proof. + sint_extraction_sup Cint.is_sint64 63%nat 63. +Qed. + +(* Why3 goal *) +Lemma to_sint64_extraction_inf_bool : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ + (i < 63%Z)%Z) -> ((Cint.bit_testb (Cint.to_sint64 x) i) = (Cint.bit_testb x + i)). +Proof. + naturalize_int_extraction_inf_bool n 64%nat 64. + sint_extraction_inf n x Cint.to_sint64 63%nat 9223372036854775808 (-9223372036854775808). +Qed. + +(* Why3 goal *) +Lemma to_sint64_extraction_inf : forall (x:Z) (i:Z), ((0%Z <= i)%Z /\ + (i < 63%Z)%Z) -> ((Cint.bit_test (Cint.to_sint64 x) i) <-> (Cint.bit_test x + i)). +Proof. + int_extraction_inf to_sint64_extraction_inf_bool. +Qed. + +(* Why3 goal *) +Lemma is_sint64_ext : forall (x:Z) (y:Z), (Cint.is_sint64 x) -> + ((Cint.is_sint64 y) -> ((forall (i:Z), ((0%Z <= i)%Z /\ (i <= 63%Z)%Z) -> + ((Cint.bit_test x i) <-> (Cint.bit_test y i))) -> (x = y))). +Proof. + intros x y h1 h2 h3. + assert (forall i: int, (0 <= i)%Z -> (Cint.bit_test x i <-> Cint.bit_test y i)). + intros. + case_lt i 64; intro. + apply h3; omega. + assert (0<=63<=63) by omega. + specialize ((h3 63) H1); clear H1. + assert (63<=63) by omega. + generalize ((to_sint64_extraction_sup x 63) H1 h1). + generalize ((to_sint64_extraction_sup y 63) H1 h2). + clear H1; intros. + rewrite h3 in H2. rewrite H2 in H1. clear H2. + assert ((Cint.bit_test x i) <-> x < 0). + apply to_sint64_extraction_sup. omega. auto. + assert ((Cint.bit_test y i) <-> y < 0). + apply to_sint64_extraction_sup. omega. auto. + rewrite H2. + rewrite H3. + auto. + clear h1; clear h2; clear h3. + + unfold Cint.bit_test in H. + unfold Cint.bit_testb in H. + apply Zbits.bit_testb_ext; intros. + rewrite <- Zbits.bool2_eq_true. + apply H; auto. +Qed. + (* Why3 goal *) Lemma is_uint8_lor : forall (x:Z) (y:Z), (Cint.is_uint8 x) -> ((Cint.is_uint8 y) -> ((Cint.to_uint8 (Cint.lor x y)) = (Cint.lor x y))). @@ -711,7 +1044,6 @@ uint_lsl1_sup n Cint.to_uint8 8%nat 256. Qed. -(** *** Cast to uint16 C type *) (* Why3 goal *) Lemma is_uint16_lor : forall (x:Z) (y:Z), (Cint.is_uint16 x) -> ((Cint.is_uint16 y) -> ((Cint.to_uint16 (Cint.lor x y)) = (Cint.lor x y))). @@ -750,7 +1082,6 @@ uint_lsl1_sup n Cint.to_uint16 16%nat 65536. Qed. -(** *** Cast to uint32 C type *) (* Why3 goal *) Lemma is_uint32_lor : forall (x:Z) (y:Z), (Cint.is_uint32 x) -> ((Cint.is_uint32 y) -> ((Cint.to_uint32 (Cint.lor x y)) = (Cint.lor x y))). @@ -789,7 +1120,6 @@ uint_lsl1_sup n Cint.to_uint32 32%nat 4294967296. Qed. -(** *** Cast to uint64 C type *) (* Why3 goal *) Lemma is_uint64_lor : forall (x:Z) (y:Z), (Cint.is_uint64 x) -> ((Cint.is_uint64 y) -> ((Cint.to_uint64 (Cint.lor x y)) = (Cint.lor x y))). diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Cbits.why frama-c-20150201+sodium+dfsg/src/wp/share/why3/Cbits.why --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Cbits.why 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Cbits.why 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -37,6 +37,14 @@ Cint.land (Cint.lsl 1 k) x]. (Int.(<=) (0) (k)) -> not ((Cint.land x (Cint.lsl 1 k)) = (0)) <-> Cint.bit_test x k +axiom lsl_1_0 : ((Cint.lsl 1 0) = (1)) + +axiom bit_test_extraction_bis : forall x:int [Cint.land x 1| Cint.land 1 x]. + not ((Cint.land 1 x) = (0)) -> Cint.bit_test x 0 + +axiom bit_test_extraction_bis_eq : forall x:int [Cint.land x 1| Cint.land 1 + x]. Cint.bit_test x 0 -> ((Cint.land 1 x) = (1)) + axiom lnot_extraction : forall x:int, i:int [Cint.bit_test (Cint.lnot x) i]. (Int.(<=) (0) (i)) -> Cint.bit_test (Cint.lnot x) i <-> not Cint.bit_test x i @@ -53,6 +61,12 @@ x y) i]. (Int.(<=) (0) (i)) -> Cint.bit_test (Cint.lxor x y) i <-> Cint.bit_test x i <-> not Cint.bit_test y i +axiom land_1_lsl_1 : forall a:int, x:int, n:int [Cint.lsl 1 + (Int.(+) (1) (n)), Cint.lsl 1 n, (Int.(+) ((Int.(*) (2) (a))) (Cint.land 1 + x))]. (Int.(<=) (0) (n)) -> (Int.(<) (a) (Cint.lsl 1 n)) -> + (Int.(<) ((Int.(+) ((Int.(*) (2) (a))) (Cint.land 1 x))) (Cint.lsl 1 + (Int.(+) (1) (n)))) + axiom lsl_extraction_sup : forall x:int, n:int, m:int [Cint.bit_test (Cint.lsl x n) m]. (Int.(<=) (0) (n)) -> (Int.(<=) (0) (m)) -> (Int.(>=) (m) (n)) -> Cint.bit_test (Cint.lsl x n) m <-> Cint.bit_test x diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Cfloat.v frama-c-20150201+sodium+dfsg/src/wp/share/why3/Cfloat.v --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Cfloat.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Cfloat.v 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -23,8 +23,8 @@ (* This file is generated by Why3's Coq-realize driver *) (* Beware! Only edit allowed sections below *) Require Import BuiltIn. -Require Import Rbasic_fun. -Require Import R_sqrt. +Require Reals.Rbasic_fun. +Require Reals.R_sqrt. Require BuiltIn. Require real.Real. Require real.RealInfix. @@ -100,26 +100,27 @@ Definition mul_float64 (x:R) (y:R): R := (to_float64 (x * y)%R). (* Why3 assumption *) -Definition div_float32 (x:R) (y:R): R := (to_float32 (Rdiv x y)%R). +Definition div_float32 (x:R) (y:R): R := (to_float32 (x / y)%R). (* Why3 assumption *) -Definition div_float64 (x:R) (y:R): R := (to_float64 (Rdiv x y)%R). +Definition div_float64 (x:R) (y:R): R := (to_float64 (x / y)%R). (* Why3 assumption *) -Definition sqrt_float32 (x:R): R := (to_float32 (sqrt x)). +Definition sqrt_float32 (x:R): R := (to_float32 (Reals.R_sqrt.sqrt x)). (* Why3 assumption *) -Definition sqrt_float64 (x:R): R := (to_float64 (sqrt x)). +Definition sqrt_float64 (x:R): R := (to_float64 (Reals.R_sqrt.sqrt x)). (* Why3 goal *) Definition model: R -> R. Admitted. (* Why3 assumption *) -Definition delta (x:R): R := (Rabs (x - (model x))%R). +Definition delta (x:R): R := (Reals.Rbasic_fun.Rabs (x - (model x))%R). (* Why3 assumption *) -Definition error (x:R): R := (Rdiv (delta x) (Rabs (model x)))%R. +Definition error (x:R): R := + ((delta x) / (Reals.Rbasic_fun.Rabs (model x)))%R. (* Why3 goal *) Lemma model_float_32 : forall (x:R), ((model (to_float32 x)) = (model x)). @@ -141,10 +142,11 @@ (* Why3 goal *) Lemma model_div : forall (x:R) (y:R), - ((model (Rdiv x y)%R) = (Rdiv (model x) (model y))%R). + ((model (x / y)%R) = ((model x) / (model y))%R). Admitted. (* Why3 goal *) -Lemma model_sqrt : forall (x:R), ((model (sqrt x)) = (sqrt (model x))). +Lemma model_sqrt : forall (x:R), + ((model (Reals.R_sqrt.sqrt x)) = (Reals.R_sqrt.sqrt (model x))). Admitted. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Cfloat.why frama-c-20150201+sodium+dfsg/src/wp/share/why3/Cfloat.why --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Cfloat.why 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Cfloat.why 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Cint.v frama-c-20150201+sodium+dfsg/src/wp/share/why3/Cint.v --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Cint.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Cint.v 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Cint.why frama-c-20150201+sodium+dfsg/src/wp/share/why3/Cint.why --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Cint.why 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Cint.why 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Cmath.v frama-c-20150201+sodium+dfsg/src/wp/share/why3/Cmath.v --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Cmath.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Cmath.v 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -23,7 +23,7 @@ (* This file is generated by Why3's Coq-realize driver *) (* Beware! Only edit allowed sections below *) Require Import BuiltIn. -Require Import R_sqrt. +Require Reals.R_sqrt. Require BuiltIn. Require int.Int. Require int.Abs. @@ -34,36 +34,37 @@ Require Import RIneq. (* Why3 goal *) -Lemma abs_def : forall (x:Z), ((0%Z <= x)%Z -> ((Zabs x) = x)) /\ - ((~ (0%Z <= x)%Z) -> ((Zabs x) = (-x)%Z)). +Lemma abs_def : forall (x:Z), ((0%Z <= x)%Z -> + ((ZArith.BinInt.Z.abs x) = x)) /\ ((~ (0%Z <= x)%Z) -> + ((ZArith.BinInt.Z.abs x) = (-x)%Z)). Proof. exact int.Abs.abs_def. Qed. (* Why3 goal *) -Lemma sqrt_lin1 : forall (x:R), (1%R < x)%R -> ((sqrt x) < x)%R. +Lemma sqrt_lin1 : forall (x:R), (1%R < x)%R -> ((Reals.R_sqrt.sqrt x) < x)%R. Proof. intros x h1. -refine (sqrt_less _ _ h1). +refine (Reals.R_sqrt.sqrt_less _ _ h1). apply (Rle_trans 0 1 x Rle_0_1)%R. exact (Rlt_le _ _ h1). Qed. (* Why3 goal *) Lemma sqrt_lin0 : forall (x:R), ((0%R < x)%R /\ (x < 1%R)%R) -> - (x < (sqrt x))%R. + (x < (Reals.R_sqrt.sqrt x))%R. Proof. intros x (h1,h2). -exact (sqrt_more x h1 h2). +exact (Reals.R_sqrt.sqrt_more x h1 h2). Qed. (* Why3 goal *) -Lemma sqrt_0 : ((sqrt 0%R) = 0%R). -exact sqrt_0. +Lemma sqrt_0 : ((Reals.R_sqrt.sqrt 0%R) = 0%R). +exact Reals.R_sqrt.sqrt_0. Qed. (* Why3 goal *) -Lemma sqrt_1 : ((sqrt 1%R) = 1%R). -exact sqrt_1. +Lemma sqrt_1 : ((Reals.R_sqrt.sqrt 1%R) = 1%R). +exact Reals.R_sqrt.sqrt_1. Qed. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Cmath.why frama-c-20150201+sodium+dfsg/src/wp/share/why3/Cmath.why --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Cmath.why 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Cmath.why 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/coq.drv frama-c-20150201+sodium+dfsg/src/wp/share/why3/coq.drv --- frama-c-20140301+neon+dfsg/src/wp/share/why3/coq.drv 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/coq.drv 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -21,10 +21,10 @@ (**************************************************************************) (* generated automatically at developer compilation time *) -theory Qed.Qed meta "realized_theory" "Qed.Qed", "Qed" end -theory Cmath.Cmath meta "realized_theory" "Cmath.Cmath", "Cmath" end -theory Cint.Cint meta "realized_theory" "Cint.Cint", "Cint" end -theory Cbits.Cbits meta "realized_theory" "Cbits.Cbits", "Cbits" end -theory Memory.Memory meta "realized_theory" "Memory.Memory", "Memory" end -theory Vset.Vset meta "realized_theory" "Vset.Vset", "Vset" end -theory Cfloat.Cfloat meta "realized_theory" "Cfloat.Cfloat", "Cfloat" end +theory qed.Qed meta "realized_theory" "qed.Qed", "Qed" end +theory cmath.Cmath meta "realized_theory" "cmath.Cmath", "Cmath" end +theory cint.Cint meta "realized_theory" "cint.Cint", "Cint" end +theory cbits.Cbits meta "realized_theory" "cbits.Cbits", "Cbits" end +theory memory.Memory meta "realized_theory" "memory.Memory", "Memory" end +theory vset.Vset meta "realized_theory" "vset.Vset", "Vset" end +theory cfloat.Cfloat meta "realized_theory" "cfloat.Cfloat", "Cfloat" end diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Makefile frama-c-20150201+sodium+dfsg/src/wp/share/why3/Makefile --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Makefile 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -########################################################################## -# # -# This file is part of WP plug-in of Frama-C. # -# # -# Copyright (C) 2007-2014 # -# 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). # -# # -########################################################################## - -# -------------------------------------------------------------------------- -# --- WP-Coq Libraries -# -------------------------------------------------------------------------- - -WHY3LIB=$(shell why3 --print-libdir) -INCLUDES= -R $(WHY3LIB)/coq -as Why3 -I . - -include ../Makefile.resources -include ../Makefile.coq - -compile: $(addsuffix o, $(COQ_LIBS_CEA)) - -# End of file - - diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Memory.v frama-c-20150201+sodium+dfsg/src/wp/share/why3/Memory.v --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Memory.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Memory.v 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -137,29 +137,27 @@ (((offset p) + a)%Z <= (offset q))%Z))). (* Why3 assumption *) -Definition eqmem {a:Type} {a_WT:WhyType a} (m1:(@map.Map.map - addr addr_WhyType a a_WT)) (m2:(@map.Map.map addr addr_WhyType a a_WT)) - (p:addr) (a1:Z): Prop := forall (q:addr), (included q 1%Z p a1) -> - ((map.Map.get m1 q) = (map.Map.get m2 q)). +Definition eqmem {a:Type} {a_WT:WhyType a} (m1:(map.Map.map addr a)) + (m2:(map.Map.map addr a)) (p:addr) (a1:Z): Prop := forall (q:addr), + (included q 1%Z p a1) -> ((map.Map.get m1 q) = (map.Map.get m2 q)). (* Why3 assumption *) -Definition havoc {a:Type} {a_WT:WhyType a} (m1:(@map.Map.map - addr addr_WhyType a a_WT)) (m2:(@map.Map.map addr addr_WhyType a a_WT)) - (p:addr) (a1:Z): Prop := forall (q:addr), (separated q 1%Z p a1) -> - ((map.Map.get m1 q) = (map.Map.get m2 q)). +Definition havoc {a:Type} {a_WT:WhyType a} (m1:(map.Map.map addr a)) + (m2:(map.Map.map addr a)) (p:addr) (a1:Z): Prop := forall (q:addr), + (separated q 1%Z p a1) -> ((map.Map.get m1 q) = (map.Map.get m2 q)). (* Why3 assumption *) -Definition valid_rd (m:(@map.Map.map Z _ Z _)) (p:addr) (n:Z): Prop := +Definition valid_rd (m:(map.Map.map Z Z)) (p:addr) (n:Z): Prop := (0%Z < n)%Z -> ((0%Z <= (offset p))%Z /\ (((offset p) + n)%Z <= (map.Map.get m (base p)))%Z). (* Why3 assumption *) -Definition valid_rw (m:(@map.Map.map Z _ Z _)) (p:addr) (n:Z): Prop := +Definition valid_rw (m:(map.Map.map Z Z)) (p:addr) (n:Z): Prop := (0%Z < n)%Z -> ((0%Z < (base p))%Z /\ ((0%Z <= (offset p))%Z /\ (((offset p) + n)%Z <= (map.Map.get m (base p)))%Z)). (* Why3 goal *) -Lemma valid_rw_rd : forall (m:(@map.Map.map Z _ Z _)), forall (p:addr), +Lemma valid_rw_rd : forall (m:(map.Map.map Z Z)), forall (p:addr), forall (n:Z), (valid_rw m p n) -> (valid_rd m p n). intros m p n. unfold valid_rw. unfold valid_rd. @@ -167,7 +165,7 @@ Qed. (* Why3 goal *) -Lemma valid_string : forall (m:(@map.Map.map Z _ Z _)), forall (p:addr), +Lemma valid_string : forall (m:(map.Map.map Z Z)), forall (p:addr), ((base p) < 0%Z)%Z -> (((0%Z <= (offset p))%Z /\ ((offset p) < (map.Map.get m (base p)))%Z) -> ((valid_rd m p 1%Z) /\ ~ (valid_rw m p 1%Z))). @@ -227,17 +225,16 @@ Admitted. (* Why3 goal *) -Definition linked: (@map.Map.map Z _ Z _) -> Prop. +Definition linked: (map.Map.map Z Z) -> Prop. Admitted. (* Why3 goal *) -Definition sconst: (@map.Map.map addr addr_WhyType Z _) -> Prop. +Definition sconst: (map.Map.map addr Z) -> Prop. Admitted. (* Why3 assumption *) -Definition framed (m:(@map.Map.map addr addr_WhyType - addr addr_WhyType)): Prop := forall (p:addr), ((region (base (map.Map.get m - p))) <= 0%Z)%Z. +Definition framed (m:(map.Map.map addr addr)): Prop := forall (p:addr), + ((region (base (map.Map.get m p))) <= 0%Z)%Z. (* Why3 goal *) Lemma separated_included : forall (p:addr) (q:addr), forall (a:Z) (b:Z), @@ -283,23 +280,23 @@ (* Why3 goal *) Lemma eqmem_included : forall {a:Type} {a_WT:WhyType a}, - forall (m1:(@map.Map.map addr addr_WhyType a a_WT)) (m2:(@map.Map.map - addr addr_WhyType a a_WT)), forall (p:addr) (q:addr), forall (a1:Z) (b:Z), - (included p a1 q b) -> ((eqmem m1 m2 q b) -> (eqmem m1 m2 p a1)). + forall (m1:(map.Map.map addr a)) (m2:(map.Map.map addr a)), forall (p:addr) + (q:addr), forall (a1:Z) (b:Z), (included p a1 q b) -> ((eqmem m1 m2 q b) -> + (eqmem m1 m2 p a1)). intros a a_WT m1 m2 p q a1 b h1 h2. Admitted. (* Why3 goal *) -Lemma eqmem_sym : forall {a:Type} {a_WT:WhyType a}, forall (m1:(@map.Map.map - addr addr_WhyType a a_WT)) (m2:(@map.Map.map addr addr_WhyType a a_WT)), - forall (p:addr), forall (a1:Z), (eqmem m1 m2 p a1) -> (eqmem m2 m1 p a1). +Lemma eqmem_sym : forall {a:Type} {a_WT:WhyType a}, forall (m1:(map.Map.map + addr a)) (m2:(map.Map.map addr a)), forall (p:addr), forall (a1:Z), (eqmem + m1 m2 p a1) -> (eqmem m2 m1 p a1). intros A m1 m2 p a. unfold eqmem. Admitted. (* Why3 goal *) -Lemma havoc_sym : forall {a:Type} {a_WT:WhyType a}, forall (m1:(@map.Map.map - addr addr_WhyType a a_WT)) (m2:(@map.Map.map addr addr_WhyType a a_WT)), - forall (p:addr), forall (a1:Z), (havoc m1 m2 p a1) -> (havoc m2 m1 p a1). +Lemma havoc_sym : forall {a:Type} {a_WT:WhyType a}, forall (m1:(map.Map.map + addr a)) (m2:(map.Map.map addr a)), forall (p:addr), forall (a1:Z), (havoc + m1 m2 p a1) -> (havoc m2 m1 p a1). Admitted. (* Why3 goal *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Memory.why frama-c-20150201+sodium+dfsg/src/wp/share/why3/Memory.why --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Memory.why 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Memory.why 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Qedlib.v frama-c-20150201+sodium+dfsg/src/wp/share/why3/Qedlib.v --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Qedlib.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Qedlib.v 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -187,13 +187,13 @@ Record farray (A B : Type) := { whytype1 : BuiltIn.WhyType A ; whytype2 : BuiltIn.WhyType B ; - access :> @Map.map A whytype1 B whytype2 }. + access :> @Map.map A B }. Definition array (A : Type) := farray Z A. Hypothesis extensionality: forall (A B : Type) (f g : A -> B), (forall x, f x = g x) -> f = g. Definition select {A B : Type} - (m : farray A B) (k : A) : B := Map.get m k. + (m : farray A B) (k : A) : B := @Map.get A (whytype1 m) B (whytype2 m) m k. Lemma farray_eq : forall A B (m1 m2 : farray A B), whytype1 m1 = whytype1 m2 -> whytype2 m1 = whytype2 m2 -> @@ -210,7 +210,7 @@ Definition update {A B : Type} (m : farray A B) (k : A) (v : B) : (farray A B) := - {| whytype1 := whytype1 m; whytype2 := whytype2 m; access := Map.set m k v|}. + {| whytype1 := whytype1 m; whytype2 := whytype2 m; access := @Map.set A (whytype1 m) B (whytype2 m) m k v|}. Notation " a .[ k ] " := (select a k) (at level 60). Notation " a .[ k <- v ] " := (update a k v) (at level 60). diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Qed.v frama-c-20150201+sodium+dfsg/src/wp/share/why3/Qed.v --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Qed.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Qed.v 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -23,7 +23,6 @@ (* This file is generated by Why3's Coq-realize driver *) (* Beware! Only edit allowed sections below *) Require Import BuiltIn. -Require Import ZOdiv. Require BuiltIn. Require bool.Bool. Require int.Int. @@ -130,21 +129,21 @@ Admitted. (* Why3 assumption *) -Definition real_of_int (x:Z): R := (IZR x). +Definition real_of_int (x:Z): R := (Reals.Raxioms.IZR x). (* Why3 goal *) Lemma truncate_of_int : forall (x:Z), ((truncate (real_of_int x)) = x). Admitted. (* Why3 comment *) -(* pdiv is replaced with (ZOdiv x x1) by the coq driver *) +(* pdiv is replaced with (ZArith.BinInt.Z.quot x x1) by the coq driver *) (* Why3 comment *) -(* pmod is replaced with (ZOmod x x1) by the coq driver *) +(* pmod is replaced with (ZArith.BinInt.Z.rem x x1) by the coq driver *) (* Why3 goal *) Lemma c_euclidian : forall (n:Z) (d:Z), (~ (d = 0%Z)) -> - (n = (((ZOdiv n d) * d)%Z + (ZOmod n d))%Z). + (n = (((ZArith.BinInt.Z.quot n d) * d)%Z + (ZArith.BinInt.Z.rem n d))%Z). intros n d. intros H. rewrite Int.Comm1. @@ -170,10 +169,13 @@ (* Why3 goal *) Lemma cdiv_cases : forall (n:Z) (d:Z), ((0%Z <= n)%Z -> ((0%Z < d)%Z -> - ((ZOdiv n d) = (ZOdiv n d)))) /\ (((n <= 0%Z)%Z -> ((0%Z < d)%Z -> - ((ZOdiv n d) = (-(ZOdiv (-n)%Z d))%Z))) /\ (((0%Z <= n)%Z -> - ((d < 0%Z)%Z -> ((ZOdiv n d) = (-(ZOdiv n (-d)%Z))%Z))) /\ ((n <= 0%Z)%Z -> - ((d < 0%Z)%Z -> ((ZOdiv n d) = (ZOdiv (-n)%Z (-d)%Z)))))). + ((ZArith.BinInt.Z.quot n d) = (ZArith.BinInt.Z.quot n d)))) /\ + (((n <= 0%Z)%Z -> ((0%Z < d)%Z -> + ((ZArith.BinInt.Z.quot n d) = (-(ZArith.BinInt.Z.quot (-n)%Z d))%Z))) /\ + (((0%Z <= n)%Z -> ((d < 0%Z)%Z -> + ((ZArith.BinInt.Z.quot n d) = (-(ZArith.BinInt.Z.quot n (-d)%Z))%Z))) /\ + ((n <= 0%Z)%Z -> ((d < 0%Z)%Z -> + ((ZArith.BinInt.Z.quot n d) = (ZArith.BinInt.Z.quot (-n)%Z (-d)%Z)))))). intros n d. rewrite Zquot.Zquot_opp_l. rewrite Zquot.Zquot_opp_r. @@ -187,10 +189,13 @@ (* Why3 goal *) Lemma cmod_cases : forall (n:Z) (d:Z), ((0%Z <= n)%Z -> ((0%Z < d)%Z -> - ((ZOmod n d) = (ZOmod n d)))) /\ (((n <= 0%Z)%Z -> ((0%Z < d)%Z -> - ((ZOmod n d) = (-(ZOmod (-n)%Z d))%Z))) /\ (((0%Z <= n)%Z -> - ((d < 0%Z)%Z -> ((ZOmod n d) = (ZOmod n (-d)%Z)))) /\ ((n <= 0%Z)%Z -> - ((d < 0%Z)%Z -> ((ZOmod n d) = (-(ZOmod (-n)%Z (-d)%Z))%Z))))). + ((ZArith.BinInt.Z.rem n d) = (ZArith.BinInt.Z.rem n d)))) /\ + (((n <= 0%Z)%Z -> ((0%Z < d)%Z -> + ((ZArith.BinInt.Z.rem n d) = (-(ZArith.BinInt.Z.rem (-n)%Z d))%Z))) /\ + (((0%Z <= n)%Z -> ((d < 0%Z)%Z -> + ((ZArith.BinInt.Z.rem n d) = (ZArith.BinInt.Z.rem n (-d)%Z)))) /\ + ((n <= 0%Z)%Z -> ((d < 0%Z)%Z -> + ((ZArith.BinInt.Z.rem n d) = (-(ZArith.BinInt.Z.rem (-n)%Z (-d)%Z))%Z))))). intros n d. rewrite Zquot.Zrem_opp_l. rewrite Zquot.Zrem_opp_r. @@ -204,11 +209,14 @@ (* Why3 goal *) Lemma cmod_remainder : forall (n:Z) (d:Z), ((0%Z <= n)%Z -> ((0%Z < d)%Z -> - ((0%Z <= (ZOmod n d))%Z /\ ((ZOmod n d) < d)%Z))) /\ (((n <= 0%Z)%Z -> - ((0%Z < d)%Z -> (((-d)%Z < (ZOmod n d))%Z /\ ((ZOmod n d) <= 0%Z)%Z))) /\ - (((0%Z <= n)%Z -> ((d < 0%Z)%Z -> ((0%Z <= (ZOmod n d))%Z /\ - ((ZOmod n d) < (-d)%Z)%Z))) /\ ((n <= 0%Z)%Z -> ((d < 0%Z)%Z -> - ((d < (ZOmod n d))%Z /\ ((ZOmod n d) <= 0%Z)%Z))))). + ((0%Z <= (ZArith.BinInt.Z.rem n d))%Z /\ + ((ZArith.BinInt.Z.rem n d) < d)%Z))) /\ (((n <= 0%Z)%Z -> ((0%Z < d)%Z -> + (((-d)%Z < (ZArith.BinInt.Z.rem n d))%Z /\ + ((ZArith.BinInt.Z.rem n d) <= 0%Z)%Z))) /\ (((0%Z <= n)%Z -> + ((d < 0%Z)%Z -> ((0%Z <= (ZArith.BinInt.Z.rem n d))%Z /\ + ((ZArith.BinInt.Z.rem n d) < (-d)%Z)%Z))) /\ ((n <= 0%Z)%Z -> + ((d < 0%Z)%Z -> ((d < (ZArith.BinInt.Z.rem n d))%Z /\ + ((ZArith.BinInt.Z.rem n d) <= 0%Z)%Z))))). intros n d. (split;[|split;[|split]]);intros; [exact (Zquot.Zrem_lt_pos_pos _ _ H H0)| @@ -218,13 +226,14 @@ Qed. (* Why3 goal *) -Lemma cdiv_neutral : forall (a:Z), ((ZOdiv a 1%Z) = a). +Lemma cdiv_neutral : forall (a:Z), ((ZArith.BinInt.Z.quot a 1%Z) = a). intro a. exact (Z.quot_1_r a). Qed. (* Why3 goal *) -Lemma cdiv_inv : forall (a:Z), (~ (a = 0%Z)) -> ((ZOdiv a a) = 1%Z). +Lemma cdiv_inv : forall (a:Z), (~ (a = 0%Z)) -> + ((ZArith.BinInt.Z.quot a a) = 1%Z). intros a h1. exact (Z.quot_same a h1). Qed. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Qed.why frama-c-20150201+sodium+dfsg/src/wp/share/why3/Qed.why --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Qed.why 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Qed.why 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Vset.v frama-c-20150201+sodium+dfsg/src/wp/share/why3/Vset.v --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Vset.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Vset.v 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -28,68 +28,67 @@ Require int.Int. (* Why3 goal *) -Definition set : forall (a:Type) {a_WT:WhyType a}, Type. +Definition set : forall (a:Type), Type. Admitted. (* Why3 goal *) -Definition empty: forall {a:Type} {a_WT:WhyType a}, (@set a a_WT). +Definition empty: forall {a:Type} {a_WT:WhyType a}, (set a). Admitted. (* Why3 goal *) -Definition singleton: forall {a:Type} {a_WT:WhyType a}, a -> (@set a a_WT). +Definition singleton: forall {a:Type} {a_WT:WhyType a}, a -> (set a). Admitted. (* Why3 goal *) -Definition union: forall {a:Type} {a_WT:WhyType a}, (@set a a_WT) -> (@set - a a_WT) -> (@set a a_WT). +Definition union: forall {a:Type} {a_WT:WhyType a}, (set a) -> (set a) -> + (set a). Admitted. (* Why3 goal *) -Definition inter: forall {a:Type} {a_WT:WhyType a}, (@set a a_WT) -> (@set - a a_WT) -> (@set a a_WT). +Definition inter: forall {a:Type} {a_WT:WhyType a}, (set a) -> (set a) -> + (set a). Admitted. (* Why3 goal *) -Definition member: forall {a:Type} {a_WT:WhyType a}, a -> (@set a a_WT) -> - Prop. +Definition member: forall {a:Type} {a_WT:WhyType a}, a -> (set a) -> Prop. Admitted. (* Why3 goal *) -Definition member_bool: forall {a:Type} {a_WT:WhyType a}, a -> (@set - a a_WT) -> bool. +Definition member_bool: forall {a:Type} {a_WT:WhyType a}, a -> (set a) -> + bool. Admitted. (* Why3 goal *) -Definition range: Z -> Z -> (@set Z _). +Definition range: Z -> Z -> (set Z). Admitted. (* Why3 goal *) -Definition range_sup: Z -> (@set Z _). +Definition range_sup: Z -> (set Z). Admitted. (* Why3 goal *) -Definition range_inf: Z -> (@set Z _). +Definition range_inf: Z -> (set Z). Admitted. (* Why3 goal *) -Definition range_all: (@set Z _). +Definition range_all: (set Z). Admitted. (* Why3 assumption *) -Definition eqset {a:Type} {a_WT:WhyType a} (a1:(@set a a_WT)) (b:(@set - a a_WT)): Prop := forall (x:a), (member x a1) <-> (member x b). +Definition eqset {a:Type} {a_WT:WhyType a} (a1:(set a)) (b:(set a)): Prop := + forall (x:a), (member x a1) <-> (member x b). (* Why3 assumption *) -Definition subset {a:Type} {a_WT:WhyType a} (a1:(@set a a_WT)) (b:(@set - a a_WT)): Prop := forall (x:a), (member x a1) -> (member x b). +Definition subset {a:Type} {a_WT:WhyType a} (a1:(set a)) (b:(set a)): Prop := + forall (x:a), (member x a1) -> (member x b). (* Why3 assumption *) -Definition disjoint {a:Type} {a_WT:WhyType a} (a1:(@set a a_WT)) (b:(@set - a a_WT)): Prop := forall (x:a), (member x a1) -> ~ (member x b). +Definition disjoint {a:Type} {a_WT:WhyType a} (a1:(set a)) (b:(set + a)): Prop := forall (x:a), (member x a1) -> ~ (member x b). (* Why3 goal *) Lemma member_bool1 : forall {a:Type} {a_WT:WhyType a}, forall (x:a), - forall (s:(@set a a_WT)), ((member x s) -> ((member_bool x s) = true)) /\ + forall (s:(set a)), ((member x s) -> ((member_bool x s) = true)) /\ ((~ (member x s)) -> ((member_bool x s) = false)). Proof. intros a a_WT x s. @@ -98,7 +97,7 @@ (* Why3 goal *) Lemma member_empty : forall {a:Type} {a_WT:WhyType a}, forall (x:a), - ~ (member x (empty :(@set a a_WT))). + ~ (member x (empty : (set a))). Proof. intros a a_WT x. @@ -114,8 +113,8 @@ (* Why3 goal *) Lemma member_union : forall {a:Type} {a_WT:WhyType a}, forall (x:a), - forall (a1:(@set a a_WT)) (b:(@set a a_WT)), (member x (union a1 b)) <-> - ((member x a1) \/ (member x b)). + forall (a1:(set a)) (b:(set a)), (member x (union a1 b)) <-> ((member x + a1) \/ (member x b)). Proof. intros a a_WT x a1 b. @@ -123,26 +122,25 @@ (* Why3 goal *) Lemma member_inter : forall {a:Type} {a_WT:WhyType a}, forall (x:a), - forall (a1:(@set a a_WT)) (b:(@set a a_WT)), (member x (inter a1 b)) <-> - ((member x a1) /\ (member x b)). + forall (a1:(set a)) (b:(set a)), (member x (inter a1 b)) <-> ((member x + a1) /\ (member x b)). Proof. intros a a_WT x a1 b. Admitted. (* Why3 goal *) -Lemma union_empty : forall {a:Type} {a_WT:WhyType a}, forall (a1:(@set - a a_WT)), ((union a1 (empty :(@set a a_WT))) = a1) /\ ((union (empty :(@set - a a_WT)) a1) = a1). +Lemma union_empty : forall {a:Type} {a_WT:WhyType a}, forall (a1:(set a)), + ((union a1 (empty : (set a))) = a1) /\ ((union (empty : (set a)) a1) = a1). Proof. intros a a_WT a1. Admitted. (* Why3 goal *) -Lemma inter_empty : forall {a:Type} {a_WT:WhyType a}, forall (a1:(@set - a a_WT)), ((inter a1 (empty :(@set a a_WT))) = (empty :(@set a a_WT))) /\ - ((inter (empty :(@set a a_WT)) a1) = (empty :(@set a a_WT))). +Lemma inter_empty : forall {a:Type} {a_WT:WhyType a}, forall (a1:(set a)), + ((inter a1 (empty : (set a))) = (empty : (set a))) /\ ((inter (empty : (set + a)) a1) = (empty : (set a))). Proof. intros a a_WT a1. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Vset.why frama-c-20150201+sodium+dfsg/src/wp/share/why3/Vset.why --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Vset.why 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Vset.why 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/why3/Zbits.v frama-c-20150201+sodium+dfsg/src/wp/share/why3/Zbits.v --- frama-c-20140301+neon+dfsg/src/wp/share/why3/Zbits.v 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/why3/Zbits.v 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -62,6 +62,27 @@ | _ => idtac end. +Lemma bool3_eq : forall b1 b2: bool, (forall b: bool, b1=b <-> b2=b) <-> b1=b2. +Proof. + intros. + intuition. + rewrite H; auto. + rewrite <- H; auto. + rewrite H; auto. +Qed. + +Lemma bool2_eq_true : forall b1 b2:bool, (b1=true <-> b2=true) <-> b1=b2. +Proof. + intros. + destruct b1. + destruct b2. + intuition. + intuition. + destruct b2. + intuition. + intuition. +Qed. + Lemma split_range: forall a x b: Z, a <= x -> x < b -> a <= x < b. Proof. @@ -961,6 +982,14 @@ if Zle_bool 0 y then lsl_def x y else lsl_undef x y. +Theorem lsl_pos: forall x n: Z, + 0<=n -> lsl x n = lsl_def x n. +Proof. + intros. + unfold lsl. + case_leq 0 n. +Qed. + (* Lemma test_compute: lsl 2 1 = 4. *) (* Proof. *) (* compute; reflexivity. *) @@ -975,6 +1004,14 @@ if Zle_bool 0 y then lsr_def x y else lsr_undef x y. +Theorem lsr_pos: forall x n: Z, + 0<=n -> lsr x n = lsr_def x n. +Proof. + intros. + unfold lsr. + case_leq 0 n. +Qed. + (** ** Properties of shifting operators *) Theorem Zbit_lsl: forall (x n: Z) (k: nat), @@ -1130,6 +1167,46 @@ apply beq_nat_false_iff; omega. Qed. +Theorem Zbit_extraction_true : +forall (x:Z) (i:nat), + (land x (lsl_shift_def 1 i) = (lsl_shift_def 1 i) <-> (Zbit x i) = true). +Proof. + intros. + rewrite lsl_arithmetic_shift; unfold lsl_arithmetic_def. + replace (1 * two_power_nat i) with (two_power_nat i) by ring. + unfold land. + split. + (** 1st impl *) + intro H. + assert (Zbit (Z_bitwise andb x (two_power_nat i)) i = Zbit (two_power_nat i) i). + rewrite H; reflexivity. + (* assert done *) + rewrite Zbit_bitwise in H0. + rewrite Zbit_power in H0. + rewrite <- beq_nat_refl in H0. + rewrite Bool.andb_true_r in H0. + assumption. + (** 2sd impl *) + intro. + Zbit_ext k. + rewrite Zbit_bitwise; rewrite Zbit_power. + (** proof by case *) + case (lt_eq_lt_dec i k); intro cas. destruct cas. + (** i bit_testb x n = zbit_test_def x n. +Proof. + intros. + unfold bit_testb. + case_leq 0 n. + intro. auto. +Qed. + +Theorem bit_testb_ext: forall x y: Z, + (forall n: Z, 0<=n -> bit_testb x n = bit_testb y n) -> x=y. +Proof. + intros. + Zbit_ext j. + specialize (H (Z.of_nat j)). + specialize (H (Zle_0_nat j)). + rewrite bit_testb_pos in H. + rewrite bit_testb_pos in H. + unfold zbit_test_def in H. + rewrite Zabs2Nat.id in H. + auto. + apply (Zle_0_nat j). + apply (Zle_0_nat j). +Qed. + (** Tactical *) Local Ltac bit_extraction bin_op := intros; unfold zbit_test_def; unfold bin_op; rewrite Zbit_bitwise; auto. diff -Nru frama-c-20140301+neon+dfsg/src/wp/share/wp.driver frama-c-20150201+sodium+dfsg/src/wp/share/wp.driver --- frama-c-20140301+neon+dfsg/src/wp/share/wp.driver 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/share/wp.driver 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ /* */ /* This file is part of WP plug-in of Frama-C. */ /* */ -/* Copyright (C) 2007-2014 */ +/* Copyright (C) 2007-2015 */ /* CEA (Commissariat a l'energie atomique et aux energies */ /* alternatives) */ /* */ @@ -42,6 +42,28 @@ altergo.file += "ergo/real.FromInt.mlw"; altergo.file += "ergo/Qed.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"}; +logic integer "\\min"(integer,integer) = + commutative:associative:idempotent: + {coq="Zmin";altergo="min_int";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"}; +logic real "\\min"(real,real) = + commutative:associative:idempotent: + {coq="Rmin";altergo="min_real";why3="Rg.min"}; + library cint: coq.file += "coqwp/Cint.v"; why3.file += "why3/Cint.why"; @@ -54,11 +76,6 @@ altergo.file += "ergo/Cbits.mlw"; why3.file += "why3/Cbits.why"; -logic integer "\\max"(integer,integer) = commutative:associative:idempotent:"max_int"; -logic integer "\\min"(integer,integer) = commutative:associative:idempotent:"min_int"; -logic real "\\max"(real,real) = commutative:associative:idempotent:"max_real"; -logic real "\\min"(real,real) = commutative:associative:idempotent:"min_real"; - library cfloat: cmath coq.file += "coqwp/Cfloat.v"; why3.import += "real.Abs:RAbs"; diff -Nru frama-c-20140301+neon+dfsg/src/wp/Sigma.ml frama-c-20150201+sodium+dfsg/src/wp/Sigma.ml --- frama-c-20140301+neon+dfsg/src/wp/Sigma.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Sigma.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -27,8 +27,8 @@ open Lang.F module Make - (C : Memory.Chunk) - (H : Qed.Collection.S with type t = C.t) : + (C : Memory.Chunk) + (H : Qed.Collection.S with type t = C.t) : Memory.Sigma with type chunk = C.t and type domain = H.set = struct @@ -50,10 +50,10 @@ let pb = ref Passive.empty in let merge_chunk c x y = if Var.equal x y then x else - let z = newchunk c in - pa := Passive.bind ~fresh:z ~bound:x !pa ; - pb := Passive.bind ~fresh:z ~bound:y !pb ; - z in + let z = newchunk c in + pa := Passive.bind ~fresh:z ~bound:x !pa ; + pb := Passive.bind ~fresh:z ~bound:y !pb ; + z in let w = H.Map.union merge_chunk a.map b.map in build w , !pa , !pb @@ -69,24 +69,24 @@ let p = ref Passive.empty in H.Map.iter2 (fun chunk x y -> - match x,y with - | Some x , Some y -> p := Passive.join x y !p - | Some x , None -> b.map <- H.Map.add chunk x b.map - | None , Some y -> a.map <- H.Map.add chunk y a.map - | None , None -> ()) + match x,y with + | Some x , Some y -> p := Passive.join x y !p + | Some x , None -> b.map <- H.Map.add chunk x b.map + | None , Some y -> a.map <- H.Map.add chunk y a.map + | None , None -> ()) a.map b.map ; !p let assigned a b written = let p = ref Bag.empty in H.Map.iter2 (fun chunk x y -> - if not (H.Set.mem chunk written) then - match x,y with - | Some x , Some y when x != y -> - p := Bag.add (p_equal (e_var x) (e_var y)) !p - | Some x , None -> b.map <- H.Map.add chunk x b.map - | None , Some y -> a.map <- H.Map.add chunk y a.map - | _ -> ()) + if not (H.Set.mem chunk written) then + match x,y with + | Some x , Some y when x != y -> + p := Bag.add (p_equal (e_var x) (e_var y)) !p + | Some x , None -> b.map <- H.Map.add chunk x b.map + | None , Some y -> a.map <- H.Map.add chunk y a.map + | _ -> ()) a.map b.map ; !p let value w c = e_var (get w c) @@ -103,17 +103,17 @@ build (H.Map.add c x w.map) let havoc_any ~call w = - let frame = - if call - then H.Map.filter (fun c _ -> C.is_framed c) w.map - else H.Map.empty - in build frame - + let framer c x = if call && C.is_framed c then x else newchunk c in + build (H.Map.mapi framer w.map) + let domain w = H.Map.domain w.map let pretty fmt w = - Format.fprintf fmt "@@%s%d" C.self w.id ; - H.Map.iter - (fun c x -> Format.fprintf fmt "@ %a:%a" C.pretty c Var.pretty x) w.map + begin + Format.fprintf fmt "@[@@%s%d[" C.self w.id ; + H.Map.iter + (fun c x -> Format.fprintf fmt "@ %a:%a" C.pretty c Var.pretty x) w.map ; + Format.fprintf fmt " ]@]" ; + end end diff -Nru frama-c-20140301+neon+dfsg/src/wp/Sigma.mli frama-c-20150201+sodium+dfsg/src/wp/Sigma.mli --- frama-c-20140301+neon+dfsg/src/wp/Sigma.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Sigma.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -25,7 +25,7 @@ (* -------------------------------------------------------------------------- *) module Make - (C : Memory.Chunk) - (H : Qed.Collection.S with type t = C.t) : + (C : Memory.Chunk) + (H : Qed.Collection.S with type t = C.t) : Memory.Sigma with type chunk = C.t - and type domain = H.set + and type domain = H.set diff -Nru frama-c-20140301+neon+dfsg/src/wp/Splitter.ml frama-c-20150201+sodium+dfsg/src/wp/Splitter.ml --- frama-c-20140301+neon+dfsg/src/wp/Splitter.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Splitter.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -57,56 +57,56 @@ let compare p q = if p == q then 0 else match p,q with - | MARK s , MARK t -> Stmt.compare s t - | MARK _ , _ -> (-1) - | _ , MARK _ -> 1 - | THEN s , THEN t -> Stmt.compare s t - | THEN _ , _ -> (-1) - | _ , THEN _ -> 1 - | ELSE s , ELSE t -> Stmt.compare s t - | ELSE _ , _ -> (-1) - | _ , ELSE _ -> 1 - | CASE(s1,k1) , CASE(s2,k2) -> - let c = Stmt.compare s1 s2 in - if c = 0 then Pervasives.compare k1 k2 else c - | CASE _ , _ -> (-1) - | _ , CASE _ -> 1 - | DEFAULT s , DEFAULT t -> Stmt.compare s t - | DEFAULT _ , _ -> (-1) - | _ , DEFAULT _ -> 1 - | CALL(s1,f1) , CALL(s2,f2) -> - let c = Stmt.compare s1 s2 in - if c = 0 then Kernel_function.compare f1 f2 else c - | CALL _ , _ -> (-1) - | _ , CALL _ -> 1 - | ASSERT(ip1,k1,_) , ASSERT(ip2,k2,_) -> - let c = Pervasives.compare ip1.ip_id ip2.ip_id in - if c = 0 then k1 - k2 else c + | MARK s , MARK t -> Stmt.compare s t + | MARK _ , _ -> (-1) + | _ , MARK _ -> 1 + | THEN s , THEN t -> Stmt.compare s t + | THEN _ , _ -> (-1) + | _ , THEN _ -> 1 + | ELSE s , ELSE t -> Stmt.compare s t + | ELSE _ , _ -> (-1) + | _ , ELSE _ -> 1 + | CASE(s1,k1) , CASE(s2,k2) -> + let c = Stmt.compare s1 s2 in + if c = 0 then Pervasives.compare k1 k2 else c + | CASE _ , _ -> (-1) + | _ , CASE _ -> 1 + | DEFAULT s , DEFAULT t -> Stmt.compare s t + | DEFAULT _ , _ -> (-1) + | _ , DEFAULT _ -> 1 + | CALL(s1,f1) , CALL(s2,f2) -> + let c = Stmt.compare s1 s2 in + if c = 0 then Kernel_function.compare f1 f2 else c + | CALL _ , _ -> (-1) + | _ , CALL _ -> 1 + | ASSERT(ip1,k1,_) , ASSERT(ip2,k2,_) -> + let c = Pervasives.compare ip1.ip_id ip2.ip_id in + if c = 0 then k1 - k2 else c (* -------------------------------------------------------------------------- *) (* --- Assertion Disjunction --- *) (* -------------------------------------------------------------------------- *) let rec disjunction p = - try unwrap p - with Exit -> [p] + try unwrap p + with Exit -> [p] and unwrap p = match p.content with - | Por(a,b) -> disjunction a @ disjunction b - | Plet(f,a) -> - List.map - (fun q -> { p with content = Plet(f,q) }) - (unwrap a) - | Pexists(qs,p) -> - List.map - (fun q -> { p with content = Pexists(qs,q) }) - (unwrap p) - | Pat(p,l) -> - List.map - (fun q -> { p with content = Pat(q,l) }) - (unwrap p) - | _ -> raise Exit + | Por(a,b) -> disjunction a @ disjunction b + | Plet(f,a) -> + List.map + (fun q -> { p with content = Plet(f,q) }) + (unwrap a) + | Pexists(qs,p) -> + List.map + (fun q -> { p with content = Pexists(qs,q) }) + (unwrap p) + | Pat(p,l) -> + List.map + (fun q -> { p with content = Pat(q,l) }) + (unwrap p) + | _ -> raise Exit let predicate ip = { name = ip.ip_name ; loc = ip.ip_loc ; content = ip.ip_content } @@ -114,7 +114,7 @@ let rec enumerate ip k n = function | [] -> [] | p::ps -> (ASSERT(ip,k,n),p) :: enumerate ip (succ k) n ps - + let cases ip = try let ps = unwrap (predicate ip) in @@ -137,11 +137,11 @@ (* -------------------------------------------------------------------------- *) module Tags = Qed.Listset.Make - (struct - type t = tag - let compare = compare - let equal x y = (compare x y = 0) - end) + (struct + type t = tag + let compare = compare + let equal x y = (compare x y = 0) + end) module M = Qed.Listmap.Make(Tags) module I = FCMap.Make(Tags) @@ -151,26 +151,26 @@ | ([] | [_]) as m -> m | ( (k1,v1) as e )::(( (k2,v2)::r ) as m) -> if Tags.compare k1 k2 = 0 then - collect merge k1 [v2;v1] r + collect merge k1 [v2;v1] r else - e :: compact merge m + e :: compact merge m and collect merge k vs = function | [] -> [k,merge vs] | ((k',v')::r) as m -> if Tags.compare k k' = 0 then - collect merge k (v'::vs) r + collect merge k (v'::vs) r else - (k,merge vs) :: compact merge m + (k,merge vs) :: compact merge m let bytags (k,_) (k',_) = Tags.compare k k' let group tag merge m = let compaction = ref false in let m = List.sort bytags - (List.map - (fun (tgs,v) -> - if not !compaction && Tags.mem tag tgs then compaction := true ; - Tags.add tag tgs , v) m) + (List.map + (fun (tgs,v) -> + if not !compaction && Tags.mem tag tgs then compaction := true ; + Tags.add tag tgs , v) m) in if !compaction then compact merge m else m (* let filter phi m = M.filter (fun key _ -> phi key) m *) @@ -182,17 +182,17 @@ let rec merge ~left ~both ~right m1 m2 = match m1 , m2 with - | [],[] -> [] - | _,[] -> List.map (fun (k,v) -> k , left v) m1 - | [],_ -> List.map (fun (k,v) -> k , right v) m2 - | (k1,v1)::w1 , (k2,v2)::w2 -> - let cmp = Tags.compare k1 k2 in - if cmp < 0 then - (k1 , left v1) :: merge ~left ~both ~right w1 m2 - else if cmp > 0 then - (k2 , right v2) :: merge ~left ~both ~right m1 w2 - else - (k1 , both v1 v2) :: merge ~left ~both ~right w1 w2 + | [],[] -> [] + | _,[] -> List.map (fun (k,v) -> k , left v) m1 + | [],_ -> List.map (fun (k,v) -> k , right v) m2 + | (k1,v1)::w1 , (k2,v2)::w2 -> + let cmp = Tags.compare k1 k2 in + if cmp < 0 then + (k1 , left v1) :: merge ~left ~both ~right w1 m2 + else if cmp > 0 then + (k2 , right v2) :: merge ~left ~both ~right m1 w2 + else + (k1 , both v1 v2) :: merge ~left ~both ~right w1 w2 let merge_all merge = function | [] -> [] @@ -201,19 +201,19 @@ | ms -> let t = ref I.empty in List.iter - (List.iter - (fun (k,v) -> - try - let r = (I.find k !t) in r := v :: !r - with Not_found -> - t := I.add k (ref [v]) !t)) - ms ; + (List.iter + (fun (k,v) -> + try + let r = (I.find k !t) in r := v :: !r + with Not_found -> + t := I.add k (ref [v]) !t)) + ms ; I.fold - (fun k r m -> match !r with - | [] -> m - | [v] -> (k,v)::m - | vs -> (k,merge vs)::m) - !t [] + (fun k r m -> match !r with + | [] -> m + | [v] -> (k,v)::m + | vs -> (k,merge vs)::m) + !t [] let map = M.map let iter = M.iter diff -Nru frama-c-20140301+neon+dfsg/src/wp/Splitter.mli frama-c-20150201+sodium+dfsg/src/wp/Splitter.mli --- frama-c-20140301+neon+dfsg/src/wp/Splitter.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Splitter.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -30,7 +30,7 @@ | CASE of stmt * int64 list | DEFAULT of stmt | ASSERT of identified_predicate * int * int (* part / Npart *) - + val loc : tag -> location val pretty : Format.formatter -> tag -> unit diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/qualif.report frama-c-20150201+sodium+dfsg/src/wp/tests/qualif.report --- frama-c-20140301+neon+dfsg/src/wp/tests/qualif.report 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/qualif.report 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,11 @@ +@CONSOLE +@ZERO " - " +@HEAD +@CHAPTER +---------------------------------------------------------- +%chapter &18: WP &24: Alt-Ergo &36: Total &45:Success +@SECTION +%name &18:%wp &24: %ergo %steps &36:%total &45: %success%% +@TAIL +---------------------------------------------------------- +@END diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/test_config frama-c-20150201+sodium+dfsg/src/wp/tests/test_config --- frama-c-20140301+neon+dfsg/src/wp/tests/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/test_config 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,2 @@ +CMD: @frama-c@ -wp -wp-proof none -wp-print -wp-check -wp-share ./share -wp-log shell +OPT: \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/test_config_qualif frama-c-20150201+sodium+dfsg/src/wp/tests/test_config_qualif --- frama-c-20140301+neon+dfsg/src/wp/tests/test_config_qualif 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/test_config_qualif 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,2 @@ +CMD: @frama-c@ -wp -wp-par 1 -wp-share ./share -wp-log shell,no-time-info,no-step-info -wp-report tests/qualif.report +OPT: diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp/bug_rte.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp/bug_rte.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp/bug_rte.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp/bug_rte.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,7 @@ +/* run.config + OPT: -wp-rte + */ +/* run.config_qualif + DONTRUN: +*/ +int bug(int i, int j) { return i - (j == 1); } diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp/oracle/bug_rte.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp/oracle/bug_rte.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp/oracle/bug_rte.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp/oracle/bug_rte.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,22 @@ +# frama-c -wp -wp-rte [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp/bug_rte.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[rte] annotating function bug +------------------------------------------------------------ + Function bug +------------------------------------------------------------ + +Goal Assertion 'rte,signed_overflow' (file tests/wp/bug_rte.i, line 7): +Assume { (* Domain *) Type: (is_sint32 i_0) /\ (is_sint32 j_0). } +Prove: (if (1=j_0) then 1 else 0)<=(2147483648+i_0). + +------------------------------------------------------------ + +Goal Assertion 'rte,signed_overflow' (file tests/wp/bug_rte.i, line 7): +Assume { (* Domain *) Type: (is_sint32 i_0) /\ (is_sint32 j_0). } +Prove: i_0<=(2147483647+(if (1=j_0) then 1 else 0)). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp/oracle/sharing.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp/oracle/sharing.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp/oracle/sharing.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp/oracle/sharing.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,829 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp/sharing.c (with preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 1 goal scheduled +[wp:print-generated] (**************************************************************************) + (* *) + (* The Why3 Verification Platform / The Why3 Development Team *) + (* Copyright 2010-2013 -- 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 a prelude for Alt-Ergo*) + (* 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*) + (**************************************************************************) + (* *) + (* The Why3 Verification Platform / The Why3 Development Team *) + (* Copyright 2010-2013 -- 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 a prelude for Alt-Ergo*) + (** 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))) + + (**************************************************************************) + (* *) + (* The Why3 Verification Platform / The Why3 Development Team *) + (* Copyright 2010-2013 -- 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 a prelude for Alt-Ergo*) + logic safe_comp_div: int, int -> int + axiom safe_comp_div_def: forall x, y:int. x >= 0 and y > 0 -> safe_comp_div(x,y) = x / y + logic safe_comp_mod: int, int -> int + axiom safe_comp_mod_def: forall x, y:int. x >= 0 and y > 0 -> safe_comp_mod(x,y) = x % y + (** 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*) + axiom Div_bound : + (forall x:int. forall y:int. (((0 <= x) and (0 < y)) -> + (0 <= safe_comp_div(x,y)))) + + axiom Div_bound1 : + (forall x:int. forall y:int. (((0 <= x) and (0 < y)) -> + (safe_comp_div(x,y) <= x))) + + axiom Div_1 : (forall x:int. (safe_comp_div(x,1) = x)) + + axiom Mod_1 : (forall x:int. (safe_comp_mod(x,1) = 0)) + + axiom Div_inf : + (forall x:int. forall y:int. (((0 <= x) and (x < y)) -> + (safe_comp_div(x,y) = 0))) + + axiom Mod_inf : + (forall x:int. forall y:int. (((0 <= x) and (x < y)) -> + (safe_comp_mod(x,y) = x))) + + axiom Div_mult : + (forall x:int. forall y:int. forall z:int [safe_comp_div(((x * y) + z),x)]. + (((0 < x) and ((0 <= y) and (0 <= z))) -> + (safe_comp_div(((x * y) + z),x) = (y + safe_comp_div(z,x))))) + + axiom Mod_mult : + (forall x:int. forall y:int. forall z:int [safe_comp_mod(((x * y) + z),x)]. + (((0 < x) and ((0 <= y) and (0 <= z))) -> + (safe_comp_mod(((x * y) + z),x) = safe_comp_mod(z,x)))) + + (**************************************************************************) + (* *) + (* The Why3 Verification Platform / The Why3 Development Team *) + (* Copyright 2010-2013 -- 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 a prelude for Alt-Ergo*) + (* 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)))) + + (**************************************************************************) + (* *) + (* The Why3 Verification Platform / The Why3 Development Team *) + (* Copyright 2010-2013 -- 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 a prelude for Alt-Ergo*) + (** 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 Why3 Verification Platform / The Why3 Development Team *) + (* Copyright 2010-2013 -- 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 a prelude for Alt-Ergo*) + (** 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)))) + + (**************************************************************************) + (* *) + (* This file is part of WP plug-in of Frama-C. *) + (* *) + (* Copyright (C) 2007-2015 *) + (* 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 a prelude for Alt-Ergo*) + (** 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 ite : bool, 'a, 'a -> 'a + + axiom ite1 : + (forall p:bool. forall x:'a. forall y:'a [ite(p, x, y)]. (((p = true) and + (ite(p, x, y) = x)) or ((p = false) and (ite(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))) + + logic truncate : real -> int + + function real_of_int(x: int) : real = from_int(x) + + axiom truncate_of_int : (forall x:int. (truncate(real_of_int(x)) = x)) + + axiom c_euclidian : + (forall n:int. forall d:int [safe_comp_div(n,d), safe_comp_mod(n,d)]. + ((not (d = 0)) -> (n = ((safe_comp_div(n,d) * d) + safe_comp_mod(n,d))))) + + axiom cdiv_cases : + (forall n:int. forall d:int [safe_comp_div(n,d)]. ((0 <= n) -> ((0 < d) -> + (safe_comp_div(n,d) = (n / d))))) + + axiom cdiv_cases1 : + (forall n:int. forall d:int [safe_comp_div(n,d)]. ((n <= 0) -> ((0 < d) -> + (safe_comp_div(n,d) = (-((-n) / d)))))) + + axiom cdiv_cases2 : + (forall n:int. forall d:int [safe_comp_div(n,d)]. ((0 <= n) -> ((d < 0) -> + (safe_comp_div(n,d) = (-(n / (-d))))))) + + axiom cdiv_cases3 : + (forall n:int. forall d:int [safe_comp_div(n,d)]. ((n <= 0) -> ((d < 0) -> + (safe_comp_div(n,d) = ((-n) / (-d)))))) + + axiom cmod_cases : + (forall n:int. forall d:int [safe_comp_mod(n,d)]. ((0 <= n) -> ((0 < d) -> + (safe_comp_mod(n,d) = (n % d))))) + + axiom cmod_cases1 : + (forall n:int. forall d:int [safe_comp_mod(n,d)]. ((n <= 0) -> ((0 < d) -> + (safe_comp_mod(n,d) = (-((-n) % d)))))) + + axiom cmod_cases2 : + (forall n:int. forall d:int [safe_comp_mod(n,d)]. ((0 <= n) -> ((d < 0) -> + (safe_comp_mod(n,d) = (n % (-d)))))) + + axiom cmod_cases3 : + (forall n:int. forall d:int [safe_comp_mod(n,d)]. ((n <= 0) -> ((d < 0) -> + (safe_comp_mod(n,d) = (-((-n) % (-d))))))) + + axiom cmod_remainder : + (forall n:int. forall d:int [safe_comp_mod(n,d)]. ((0 <= n) -> ((0 < d) -> + (0 <= safe_comp_mod(n,d))))) + + axiom cmod_remainder1 : + (forall n:int. forall d:int [safe_comp_mod(n,d)]. ((0 <= n) -> ((0 < d) -> + (safe_comp_mod(n,d) < d)))) + + axiom cmod_remainder2 : + (forall n:int. forall d:int [safe_comp_mod(n,d)]. ((n <= 0) -> ((0 < d) -> + ((-d) < safe_comp_mod(n,d))))) + + axiom cmod_remainder3 : + (forall n:int. forall d:int [safe_comp_mod(n,d)]. ((n <= 0) -> ((0 < d) -> + (safe_comp_mod(n,d) <= 0)))) + + axiom cmod_remainder4 : + (forall n:int. forall d:int [safe_comp_mod(n,d)]. ((0 <= n) -> ((d < 0) -> + (0 <= safe_comp_mod(n,d))))) + + axiom cmod_remainder5 : + (forall n:int. forall d:int [safe_comp_mod(n,d)]. ((0 <= n) -> ((d < 0) -> + (safe_comp_mod(n,d) < (-d))))) + + axiom cmod_remainder6 : + (forall n:int. forall d:int [safe_comp_mod(n,d)]. ((n <= 0) -> ((d < 0) -> + (d < safe_comp_mod(n,d))))) + + axiom cmod_remainder7 : + (forall n:int. forall d:int [safe_comp_mod(n,d)]. ((n <= 0) -> ((d < 0) -> + (safe_comp_mod(n,d) <= 0)))) + + axiom cdiv_neutral : + (forall a:int [safe_comp_div(a,1)]. (safe_comp_div(a,1) = a)) + + axiom cdiv_inv : + (forall a:int [safe_comp_div(a,a)]. ((not (a = 0)) -> + (safe_comp_div(a,a) = 1))) + + (**************************************************************************) + (* *) + (* This file is part of WP plug-in of Frama-C. *) + (* *) + (* Copyright (C) 2007-2015 *) + (* 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 a prelude for Alt-Ergo*) + (** 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])))) + + predicate havoc(m1: (addr,'a) farray, m2: (addr,'a) farray, p: addr, + a1: int) = + (forall q:addr [(m1[p])| (m2[q])]. (separated(q, 1, p, a1) -> + ((m1[q]) = (m2[q])))) + + predicate valid_rd(m: (int,int) farray, p: addr, n: int) = ((0 < n) -> + ((0 <= (p).offset) and (((p).offset + n) <= (m[(p).base])))) + + 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]))))) + + 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_sym : + (forall m1:(addr,'a) farray. forall m2:(addr,'a) farray. + (forall p:addr. + (forall a1:int. (havoc(m1, m2, p, a1) -> havoc(m2, m1, p, a1))))) + + logic cast : addr -> int + + axiom cast_injective : + (forall p:addr. forall q:addr [cast(p), cast(q)]. ((cast(p) = cast(q)) -> + (p = q))) + + logic hardware : int -> int + + axiom hardnull : (hardware(0) = 0) + + (**************************************************************************) + (* *) + (* This file is part of WP plug-in of Frama-C. *) + (* *) + (* Copyright (C) 2007-2015 *) + (* 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 a prelude for Alt-Ergo*) + (** 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*) + 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))) + + 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 + + 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))) + + 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 + + logic bit_testb : int, int -> bool + + logic bit_test : int, int -> prop + + (* ---------------------------------------------------------- *) + (* --- Memory Compound Updates --- *) + (* ---------------------------------------------------------- *) + + function shift_sint32(p:addr, k:int) : addr = shift(p, k) + + (* ---------------------------------------------------------- *) + (* --- Post-condition (file tests/wp/sharing.c, line 8) in 'f' --- *) + (* ---------------------------------------------------------- *) + + goal f_post: + forall i_1,i : int. + forall t : int farray. + forall t_1 : (addr,int) farray. + forall a : addr. + let a_1 = shift_sint32(a, 0) : addr in + let a_2 = shift_sint32(a, i) : addr in + let m = t_1[a_1 <- t_1[a_2]] : (addr,int) farray in + let m_1 = m[shift_sint32(a, 1) <- m[a_2]] : (addr,int) farray in + let m_2 = m_1[shift_sint32(a, 2) <- m_1[a_2]] : (addr,int) farray in + let m_3 = m_2[shift_sint32(a, 3) <- m_2[a_2]] : (addr,int) farray in + (0 <= i) -> + (0 <= i_1) -> + (i <= 9) -> + (i_1 <= 9) -> + linked(t) -> + is_sint32(i) -> + (region(a.base) <= 0) -> + valid_rw(t, a_1, 10) -> + (forall i_2 : int. (0 <= i_2) -> (i_2 <= 9) -> + (0 <= t_1[shift_sint32(a, i_2)])) -> + (0 <= m_3[shift_sint32(a, 4) <- m_3[a_2]][shift_sint32(a, i_1)]) +[wp] [Alt-Ergo] Goal typed_f_post : Typechecked +[wp] Proved goals: 0 / 1 + Alt-Ergo: 0 (unknown: 1) +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Post-condition (file tests/wp/sharing.c, line 8) in 'f': +Let a_0 = (shift_sint32 t_0 0). +Let a_1 = (shift_sint32 t_0 x_0). +Let m_0 = Mint_5[a_0->Mint_5[a_1]]. +Let m_1 = m_0[(shift_sint32 t_0 1)->m_0[a_1]]. +Let m_2 = m_1[(shift_sint32 t_0 2)->m_1[a_1]]. +Let m_3 = m_2[(shift_sint32 t_0 3)->m_2[a_1]]. +Assume { + (* Domain *) + Type: (is_sint32 x_0). + (* Goal *) + When: (0<=i_0) /\ (i_0<=9). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base t_0))<=0). + (* Pre-condition (file tests/wp/sharing.c, line 5) in 'f' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_0 10). + (* Pre-condition (file tests/wp/sharing.c, line 6) in 'f' *) + (* Pre-condition: *) + Have: (0<=x_0) /\ (x_0<=9). + (* Pre-condition (file tests/wp/sharing.c, line 7) in 'f' *) + (* Pre-condition: *) + Have: forall i_1:int. + (0<=i_1) -> (i_1<=9) -> (0<=Mint_5[(shift_sint32 t_0 i_1)]). +} +Prove: 0<=m_3[(shift_sint32 t_0 4)->m_3[a_1]][(shift_sint32 t_0 i_0)]. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp/oracle/wp_behav.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp/oracle/wp_behav.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp/oracle/wp_behav.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp/oracle/wp_behav.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,518 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp/wp_behav.c (with preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +tests/wp/wp_behav.c:172:[wp] warning: Ignored specification 'for b1' (generalize to all behavior) +[wp] warning: Missing RTE guards +tests/wp/wp_behav.c:176:[wp] warning: Missing assigns clause (assigns 'everything' instead) +tests/wp/wp_behav.c:154:[wp] warning: Missing assigns clause (assigns 'everything' instead) +tests/wp/wp_behav.c:69:[wp] warning: Missing assigns clause (assigns 'everything' instead) +tests/wp/wp_behav.c:81:[wp] warning: Missing assigns clause (assigns 'everything' instead) +------------------------------------------------------------ + Function assert_needed +------------------------------------------------------------ + +Goal Assertion 'ko' (file tests/wp/wp_behav.c, line 117): +Assume { (* Domain *) Type: (is_sint32 x_0). } +Prove: 0 (0<=i_0) -> (is_sint32 i_0) -> (0=T_1[i_0]). + (* tests/wp/wp_behav.c:154: Then *) + Have: i_20][i_1]. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'qed_ok' (file tests/wp/wp_behav.c, line 153): +Assume { (* Goal *) When: false. } +Prove: 0=T_2[i_5]. + +------------------------------------------------------------ +------------------------------------------------------------ + Function razT with behavior b1 +------------------------------------------------------------ + +Goal Post-condition for 'b1' 'e1' in 'razT': +Let x_0 = T_2[0]. +Assume { + (* Domain *) + Type: (is_sint32 i_0) /\ (is_sint32 n_0) /\ (is_sint32 n_1) + /\ (is_sint32 x_0). + (* Pre-condition (file tests/wp/wp_behav.c, line 148) in 'razT' *) + (* Pre-condition: *) + Have: n_1<=9. + (* Pre-condition for 'b1' (file tests/wp/wp_behav.c, line 149) in 'razT' *) + (* Pre-condition for 'b1': *) + Have: 0 (0<=i_1) -> (is_sint32 i_1) -> (0=T_2[i_1]). + (* tests/wp/wp_behav.c:154: Else *) + Have: n_0<=i_0. +} +Prove: 0=x_0. + +------------------------------------------------------------ +------------------------------------------------------------ + Function stmt_assigns +------------------------------------------------------------ + +Goal Post-condition (file tests/wp/wp_behav.c, line 134) in 'stmt_assigns': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function stmt_assigns with behavior default_for_stmt_71 +------------------------------------------------------------ + +Goal Assigns (file tests/wp/wp_behav.c, line 139) at call 'unknown' (file tests/wp/wp_behav.c, line 140): +Call Effect at line 140 +Assume { } +Prove: false. + +------------------------------------------------------------ +------------------------------------------------------------ + Function stmt_contract with behavior default_for_stmt_23 +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok' at block: +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok' at block: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function stmt_contract with behavior ko +------------------------------------------------------------ + +Goal Post-condition for 'ko' 'qed_ko' in 'stmt_contract': +Assume { + (* Domain *) + Type: (is_sint32 stmt_contract_0). + (* Post-condition 'qed_ok' at block *) + (* tests/wp/wp_behav.c:69: Post-condition 'qed_ok' at block: *) + Have: 0 (0<=x_7). + (* Post-condition 'qed_ok,stmt_p' at block *) + (* tests/wp/wp_strategy.c:92: Post-condition 'qed_ok,stmt_p' at block: *) + Have: 0 (0<=x_7). + (* Post-condition 'qed_ok,stmt_p' at block *) + (* tests/wp/wp_strategy.c:92: Post-condition 'qed_ok,stmt_p' at block: *) + Have: 0 0 <= t[n]; + ensures \forall integer n; 0 <= n < 10 ==> 0 <= t[n]; + @*/ +void f(int *t, int x){ + t[0] = t[x]; + t[1] = t[x]; + t[2] = t[x]; + t[3] = t[x]; + t[4] = t[x]; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp/wp_behav.c frama-c-20150201+sodium+dfsg/src/wp/tests/wp/wp_behav.c --- frama-c-20140301+neon+dfsg/src/wp/tests/wp/wp_behav.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp/wp_behav.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,182 @@ +/* run.config_qualif +OPT: -wp-prop="-qed_ko" +OPT: -wp-prop qed_ko -wp-timeout 2 +*/ + +int X, Y, Z; + +/*@ + @ ensures qed_ok: \result > x; + @ ensures qed_ko: \result > 0; + @ behavior x1: + @ assumes x == 1; + @ ensures qed_ok: \result == 3; + @ ensures qed_ko: \result == 4; + @ behavior x2: + @ assumes x == 2; + @ ensures qed_ok: \result == 4; + @ ensures qed_ko: \result == 3; + @ +*/ +int f (int x) { + x++; + //@ for x1: assert qed_ok: x == 2; + //@ for x2: assert qed_ok: x == 3; + return x+1; +} + +/*@ + behavior bx: + assumes x <= y; + ensures qed_ok: \result == x; + ensures qed_ko: \result == y; + behavior by: + assumes x > y; + ensures qed_ok: \result == y; + ensures qed_ko: \result == x; + complete behaviors bx, by; + disjoint behaviors bx, by; +*/ +int min (int x, int y) { + return (x < y) ? x : y; +} + +/*@ requires n != 0; + behavior pos: + assumes n > 0; + ensures qed_ok: \result == x/n; + behavior neg: + assumes n < 0; + ensures qed_ok: \result == x/-n; + complete behaviors pos, neg; // notice that this needs the requires hyp +*/ +int bhv (int x, int n) { + n = (n<0) ? -n : n; + return x/n; +} + +/*@ behavior ok: ensures qed_ok: \result > 0; + behavior ko: ensures qed_ko: \result > 2; + behavior ko_without_asgn: ensures qed_ko: \result > Y; +*/ +int stmt_contract (int c) { + int x = 0; + Y = 0; + + /*@ requires qed_ok: x == 0; + @ ensures qed_ok: x > 0; + */ + if (c) + x = 3; + else + x = 5; + return x; +} + +//@ ensures qed_ok: \result >= 0; +int stmt_contract_label (int c) { + int x = 0; + + //@ ensures qed_ok: x >= \old(x); + if (c) x++; + + return x; +} + +/*@ behavior ok: ensures qed_ok: \result > 0; + behavior ko: ensures qed_ko: \result > 2; + behavior ok_asgn: ensures qed_ok: \result > Y; +*/ +int stmt_contract_assigns (int c) { + int x = 0; + Y = 0; + + /*@ requires qed_ok: x == 0; + @ ensures qed_ok: x > 0; + @ assigns qed_ok: asgn_ok: x; + */ + if (c) + x = 3; + else + x = 5; + return x; +} + +int local_named_behavior (int x) { + int y = 3; + /*@ behavior xpos: + assumes x > 0; + ensures qed_ok: x > 3; + ensures qed_ok: x > y; + */ + x += y; + return x; +} + +void assert_needed (int x) { + //@ assert ko: x > 0; + int a = 0; + a += x; + //@ assert qed_ok: ok_with_hyp: a > 0; +} + +/* we shouldn't be able to prove ko1 from ko2 and then ko2 from ko1 */ +/*@ ensures ko1: \result == x+1; + ensures ko2: \result == x+1; +*/ +int bts0513 (int x) { + return x; +} + +//@ assigns X, Y; +void unknown (int, int); + +//@ ensures \result > X; +int stmt_assigns (int a) { + int x = 0; + int y = 3; + X = x; + //@ assigns Y; + unknown (x, y); + x = x+1; + return x; +} + +int T[10]; + +// use Inv as Hyp for Bhp props +/*@ requires n < 10; + behavior b1: assumes 0 T[k] == 0; + for (int i = 0; i < n; i++) + T[i] = 0; +} + +//@ ensures qed_ok: ok_with_hoare: T[1] == \old(T[1]); +int more_stmt_assigns (int x) { + x = 0; + //@ behavior blk: assigns qed_ok:x, qed_ok:T[x]; + { + T[x] = 1; + x = 1; + } + return x; +} +/*@ behavior b1: + assumes x > 0; + ensures qed_ok: \result > x; +*/ +int part_stmt_bhv (int x) { + /*@ //TODO: not implemented yet. + for b1: behavior bs: + ensures x > \old(x); */ + if (x > 0) + x++; + return x; +} + +//============================================================================== + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp/wp_call_pre.c frama-c-20150201+sodium+dfsg/src/wp/tests/wp/wp_call_pre.c --- frama-c-20140301+neon+dfsg/src/wp/tests/wp/wp_call_pre.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp/wp_call_pre.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,57 @@ +/* run.config +OPT: -wp-model Hoare -wp-no-simpl -wp-prop Rmain +OPT: -wp-model Hoare -wp-no-simpl -wp-fct main +OPT: -wp-model Hoare -wp-no-simpl -wp-prop Rf +OPT: -wp-model Hoare -wp-no-simpl -wp-fct double_call +OPT: -wp-model Hoare -wp-no-simpl -wp-fct stmt_pre -wp-prop Rstmt +*/ + +/* run.config_qualif +OPT: -journal-disable -wp -wp-model Store -wp-par 1 +*/ + +int G = 3; + +//@ requires qed_ok: Rf: a > 0; ensures Ef: \result > 0; +int f (int a); + +// Function with 2 preconditions. +//@ requires qed_ok: Rga: a > 0; requires Rgb: b > 0; ensures Ef: \result > 0; +int g (int a, int b); + +/* This is to test explicitly the case where the post-condition of a call + * is at the same program point than the precondition of the next call */ +//@ requires Rd: x >= 0; +int double_call (int x) { + int x1 = f (x+1); + int x2 = f (x+2); + return x1 + x2; +} + +//@ requires qed_ok: Rmain: G > 0; ensures qed_ok: Emain: \result > 0; +int main (void) { + int x = f(G); + return x; +} + +//@ ensures qed_ok: \result > 0; +int call_main (void) { + G = 1; + return main (); +} + +//@ requires 0 < G; +int stmt_pre (void) { + int x = 0; + //@ requires qed_ok: Rstmt: G > x; + x = G - x; + return x; +} + +// proving the preconditions on [g] call from the GUI should change the +// status of [g] preconditions since it is the only call. +int call_g (void) { + int x = 1; + int y = 2; + return g (1, 2); +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp/wp_inv_in_loop.c frama-c-20150201+sodium+dfsg/src/wp/tests/wp/wp_inv_in_loop.c --- frama-c-20140301+neon+dfsg/src/wp/tests/wp/wp_inv_in_loop.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp/wp_inv_in_loop.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,191 @@ +/* run.config + OPT: -wp-invariants -wp-model Hoare +*/ + +/* run.config_qualif +OPT: -journal-disable -wp -wp-invariants -wp-model Typed+ref -wp-par 1 -wp-prop="-qed_ko" +OPT: -journal-disable -wp -wp-invariants -wp-model Typed+ref -wp-par 1 -wp-prop qed_ko -wp-timeout 2 +*/ + +/* run.config_qed +DONTRUN: (config_qed) see config_qualif +*/ + +//@ensures qed_ok: \result == 5; +int simple_inv (void) { + int i = 0; + while (i < 5) { + //@ invariant qed_ok: 0 <= i < 5 ; + i++; + } + return i; +} +int inv_from_init (void) { + int x = 5; + int i = 0; + //@ loop assigns qed_ok: i ; + while (i < 5) { + //@ invariant qed_ok: I: i < x ; + i++; + } + return i; +} + +int caveat_inv (int n) { + int i, s = 0; + //@ loop assigns qed_ok: i, s; + for (i = 0; i < n; i++) { + //@ invariant qed_ok: 0 <= i < n ; + s++; + } + return s; +} + +int double_loop (void) { + for (int i = 0; i < 10; i++) { + //@ invariant qed_ok: 0 <= i < 10 ; + //@ loop assigns qed_ok: j; + for (int j = 0; j < i; j++) { + //@ invariant qed_ok: 0 <= j < i ; + ; + } + } + return 0; +} + +int T2[10][20]; + +/*@ ensures qed_ok: post: + \forall int ii, jj; 0 <= ii < 10 ==> 0 <= jj < 20 ==> T2[ii][jj] == 0; +*/ +void razT2simple (void) { + for (int i = 0; i < 10; i++) { + /*@ invariant qed_ok: I1: \forall int ki, j; 0 <= ki < i ==> 0 <= j < 20 + ==>T2[ki][j] == 0; + */ + + //@ loop assigns j, T2[i][0..19]; + for (int j = 0; j < 20; j++) { + /*@ invariant qed_ok: I2: + (\forall int ki, kj; 0 <= ki < i ==> 0 <= kj < 20 + ==> T2[ki][kj] == 0) + && (\forall int kj; 0 <= kj < j ==> T2[i][kj] == 0); */ + T2[i][j] = 0; + } + } +} + +/*@ ensures post: + \forall int i, j; 0 <= i < 10 ==> 0 <= j < 20 ==> T2[i][j] == 0; +*/ +void razT2 (void) { + for (int i = 0; i < 10; i++) { + /*@ invariant Ii: \forall int ki, j; 0 <= ki < i ==> 0 <= j < 20 + ==>T2[ki][j] == 0; + */ + //@ loop assigns j, T2[i][0..19]; + for (int j = 0; j < 20; j++) { + /*@ invariant \forall int ki, kj; 0 <= ki < i ==> 0 <= kj < 20 + ==> T2[ki][kj] == 0; */ + /*@ invariant \forall int kj; 0 <= kj < j ==> T2[i][kj] == 0; */ + T2[i][j] = 0; + } + } +} + +//@ requires c > 0; +int bts618 (int c) { + int x = 1; + L : ; + x++; + //@ invariant qed_ok: (0 < c <= \at(c, Pre)) && x == 2 + (\at(c, Pre) - c); + if (--c > 0) goto L; + return x; +} + +int T[10]; + +/* + +int both_inv_and_loop_inv (int n) { + + //@ loop invariant \forall int k; 0 <= k && k < i ==> T[k] == 0; + for (int i = 0; i < 10; i++) + T[i] = 0; +} +*/ + +// Add this test for [new_loops] only +/*@ behavior n_neg : + assumes n < 0; + ensures \result == 10; + behavior n_pos : + assumes n >= 0; + ensures \result == 21; + */ +int non_natural_loop (int n) { + int x = 1; + if (n < 0) { + x = 0; + n = 10; + } + else { + n = 20; + L : x = x + 2; + } + if (x < n) { + //@ for n_neg: invariant x < n && n == 10 && x%2 == 0; + ; + //@ for n_pos: invariant qed_ok: n == 20; + ; + goto L; + } + return x; +} + +//@ requires 0 <= n; ensures qed_ok: 0 <= \result < n + 5; +int test_for_tag (int n) { + int i = 0; + //@ loop assigns qed_ok: i; + while (i < n) { + i += 2; + //@ invariant qed_ok: 2 <= i < n+2; + i += 3; + } + return i; +} + +//@ ensures \old(T[0]) == 0 ==> T[0] == 0; +int double_entry (int n) { + int i = 0; + + if (T[0] == 0) goto L; + + while (i < n) { + if (T[i] == 0) + T[i] ++; + +L: + if (T[i] > 5) + break; + + i++; + } + return i; +} + +/*@ + behavior without_inv : + ensures qed_ko : \result == 6; + behavior qed_ok : + ensures qed_ok: ok : \result == 6; +*/ +int goto_natural_loop (int c) { + int c = 0; +L : if (c > 5) goto R; + //@ for qed_ok: invariant qed_ok: c <= 5; + c++; + goto L; +R : return c; +} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp/wp_strategy.c frama-c-20150201+sodium+dfsg/src/wp/tests/wp/wp_strategy.c --- frama-c-20140301+neon+dfsg/src/wp/tests/wp/wp_strategy.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp/wp_strategy.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,101 @@ +/* run.config +OPT: -journal-disable -wp-model Hoare -wp-verbose 2 +OPT: -journal-disable -wp-model Store -wp-verbose 2 -wp-prop @assigns +*/ + +/* run.config_qualif +OPT: -journal-disable -rte -wp -wp-model Hoare -wp-par 1 -wp-log "no-time-info" +*/ +/*----------------------------------------------------------------------------*/ + +/* This file is to test the strategy generation, so it doesn't need to be tested + * for different models. Let's choose examples that work with Hoare, + * except to test assign properties that need Store. + */ + +/*----------------------------------------------------------------------------*/ +/* we shouldn't be able to prove ko1 from ko2 and then ko2 from ko1 */ +/*@ ensures qed_ko: ko1 : \result == x+1; + ensures qed_ko: ko2 : \result == x+1; +*/ +int bts0513 (int x) { + return x; +} + +int bts0513_bis (int x) { + int i; + //@ assert qed_ko: ko1 : x > 0; + //@ assert qed_ok: ok : x > 0; + return x; +} +/*----------------------------------------------------------------------------*/ +// Problem of dependancies : we should be able to prove A, and the proof +// of E shouldn't depend on A ! + +void dpd1 (int x) { + //@ ensures qed_ko: Eko: x>0; assigns qed_ok: x; + ; + //@ assert qed_ok: A: x>0; +} + +// workaround : +//@ behavior P: +void dpd2 (int x) { + //@ ensures qed_ko: Eko: x>0; assigns qed_ok: x; + ; + //@ for P: assert qed_ok: A: x>0; +} +//============================================================================== +// specification of an IF block : notice that the proof of the ensures property +// shouldn't depend on [spec_if_f] properties. + +int Z; +int T[10]; + +/*@ assigns T[i]; ensures T[i] > i; */ +void spec_if_f (int i); + +//@ ensures qed_ok: T[0] > 0; +void spec_if (int c0, int c1, int c2) { + //@ assigns qed_ok: T[0], Z; ensures qed_ok: T[0] > 0; + if (c0) { spec_if_f (0); } else { T[0] = 5; } + //@ assigns qed_ok: T[1], Z; + if (c1) { spec_if_f (1); } else { Z++; } + //@ assigns qed_ok: T[2], Z; + if (c2) { spec_if_f (2); } else { Z++; } +} + +//============================================================================== +// when a IF condition is a negation, the AST doesn't have the same structure ! +// +void spec_if_cond (int c0) { + int i; + //@ ensures qed_ok: i > 0; + if (c0) { i = 2; } else { i = 1; } +} + +void spec_if_not_cond (int c0) { + int i; + //@ ensures qed_ok: i > 0; + if (!c0) { i = 2; } else { i = 1; } +} + +//============================================================================== +// Test is unnamed (default) behavior for function and blocks are not mixed +// together. + +//@ requires c == 0 ==> x >= 0; ensures qed_ok: \result > 0; +int default_behaviors (int c, int x) { + int y; + + //@ ensures qed_ok: stmt_p: x > 0; assigns qed_ok: x; + if (c) x = 1; + else { + //@ assert qed_ok: x >= 0; + x++; + } + y = 0; + //@ assert qed_ok: x > y; + return x; +} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/arith.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/arith.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/arith.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/arith.i 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,54 @@ +/* run.config_qualif + OPT: -wp -wp-model Typed -wp-proof alt-ergo -wp-par 1 -wp-prop="-qed_ko" + OPT: -wp -wp-model Typed -wp-proof alt-ergo -wp-par 1 -wp-prop qed_ko -wp-timeout 2 +*/ + +/*@ ensures qed_ko: KO:\result < 0; + @ ensures qed_ok: nat:\result >= 0; + @*/ +unsigned int cast_sgn_usgn (void) { + int x = -1; + return x; +} + + +unsigned char uchar_range (unsigned char i) { + //@ assert qed_ok: A1:i >= 0; + //@ assert qed_ok: A2:i <= 255; + return i; +} + +//@ lemma ucL1: qed_ok: (unsigned char) 255 == 255 ; +//@ lemma ucL2: qed_ok: (unsigned char) 256 == 0 ; +//@ lemma ucL3: qed_ok: (unsigned char) -1 == 255 ; +//@ lemma ucL4: qed_ok: (unsigned char) 1023 == (unsigned char) 255 ; + +//@ lemma ucN1: qed_ok: (unsigned char) 256 == 256 ==> \false; +//@ lemma ucN2: qed_ok: (unsigned char) 256 == -1 ==> \false ; + +//@ lemma scL1: qed_ok: (signed char) 127 == 127 ; +//@ lemma scN1: qed_ok: (signed char) 255 == 255 ==> \false; +//@ lemma scN2: qed_ok: (signed char) 256 == 255 ==> \false ; + +//@ lemma L01: lnot: qed_ok: ~(-1) == 0 ; + +//@ lemma L10: land: neutral: qed_ok: (55 & -1) == 55 ; +//@ lemma L11: land: absorbant: qed_ok: (55 & 0) == 0 ; +//@ lemma L12: land: qed_ok: (3 & 2) == 2; +//@ lemma L13: land: qed_ok: (55 & 7 & 1) == 1; + +//@ lemma L20: lor: neutral: qed_ok: (55 | 0) == 55 ; +//@ lemma L21: lor: absorbant: qed_ok: (55 | -1) == (-1) ; + +//@ lemma L30: lxor_neutral: qed_ok: (55 ^ 0) == 55 ; + +//@ axiomatic undefined_x { logic integer x ; } + +//@ lemma L14: land: absorbant: qed_ok: (1 & x & 2) == 0 ; +//@ lemma L15: land: qed_ok: (3 & x & 2) == (2 & x) ; +//@ lemma L16: land: qed_ok: (3 & x & -2) == (2 & x) ; + + +/*@ lemma ASSOC: land: qed_ok: + \forall integer x,y,z,t; x == (y & z) ==> (x & t) == (y & t & z) ; +*/ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/assigns_path.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/assigns_path.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/assigns_path.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/assigns_path.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,21 @@ +typedef struct S { int n ; int a[4]; } ; + +struct S p ; + +/*@ + requires 0 <= n < 4 ; + ensures N: p.n == n ; + ensures A: \forall integer k; 0 <= k < n ==> p.a[k] == b[k]; + assigns p ; + */ + +void job( int n , int * b ) +{ + p.n = n ; + /*@ + loop invariant 0 <= i <= n ; + loop invariant \forall integer k; 0 <= k < i ==> p.a[k] == b[k]; + loop assigns i, p.a[..]; + */ + for (int i = 0; i < n; i++) p.a[i] = b[i]; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/assigns_range.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/assigns_range.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/assigns_range.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/assigns_range.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,67 @@ +/* run.config_qualif + OPT: -wp -wp-par 1 -wp-prop="-qed_ko" + OPT: -wp -wp-par 1 -wp-prop qed_ko -wp-timeout 5 +*/ + +int t1[20], t2[20], t3[20], t4[20], t5[20]; + +/*@ requires 0 <= i <20; + assigns t1[i]; +*/ +void assigns_t1_an_element(int i); + +/*@ requires 0 <= i && i <= j && j < 20 ; + assigns t2[i..j]; +*/ +void assigns_t2_bound (int i, int j); + +/*@ requires 0 <= i < 20 ; + assigns t3[i..]; +*/ +void assigns_t3_inf_bound (int i); + +/*@ requires 0 <= j <20 ; + assigns t4[..j]; +*/ +void assigns_t4_sup_bound (int j); + +/*@ assigns t5[..]; +*/ +void assigns_t5_unbound (void); + +/*@ requires 0 <= i && i <= j && j < 20 ; + assigns qed_ok: t1[(i-1)..(i+1)], t2[..], t3[i..], t4[..j], t5[..99] ; +*/ +void call_assigns_all(int i, int j) +{ + assigns_t1_an_element(i); + assigns_t2_bound(i,j); + assigns_t3_inf_bound(i); + assigns_t4_sup_bound(j); + assigns_t5_unbound(); +} + +/*@ requires 5 <= i && i <= 7 ; + assigns qed_ko: t1[i-1]; // <- false property (wrong index) +*/ +void call_assigns_t1(int i) +{ + assigns_t1_an_element(i); +} + +/*@ requires 5 <= i && i <= 7 ; + assigns qed_ko: t1[i-1]; // <- false property (wrong base) +*/ +void call_assigns_t2(int i) +{ + assigns_t2_bound(i,i+2); +} + +/*@ requires 0 <= i && i <= j && j < 20 ; + assigns qed_ko: t4[i..]; // <- false property (wrong lower bound) +*/ +void call_assigns_t4(int i, int j) +{ + assigns_t4_sup_bound(j); +} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/axioms.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/axioms.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/axioms.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/axioms.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,36 @@ +/* run.config_qualif + OPT: -wp -wp-model Typed -wp-par 1 +*/ + +// Test for the instanciation of axioms with labels. +// The axiomatic A is equivalent (in spirit) to the definition of predicate Q. + +/*@ axiomatic A { + @ predicate P{L}(int *t,int a,int b) reads *t ; + @ axiom D{L}: + @ \forall int * t ; \forall int a,b ; + @ (\forall int k ; a<=k<=b ==> \valid(t+k) ==> t[k] > 0) ==> P(t,a,b) ; + @ } + @ */ + +/*@ predicate Q(int *t,int a,int b) = + @ \forall int k ; a<=k<=b ==> \valid(t+k) ==> t[k] > 0 ; + @ */ + +/*@ requires \valid(t+(a..b)) ; + @ requires a<=b ; + @ ensures P : todo: P(t,a,b) ; + @ ensures Q : Q(t,a,b) ; + @ assigns todo: t[a..b] ; + @ */ + +void f(int *t , int a, int b) +{ + + /*@ loop invariant Index: a<=i<=b+1 ; + @ loop invariant Positive: \forall int k ; a<=k t[k] > 0 ; + @ loop assigns i,t[a..i-1] ; + @ */ + for(int i=a; i<=b; i++) t[i] = 1 ; + +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/bitwise.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/bitwise.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/bitwise.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/bitwise.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,75 @@ +/* run.config_qualif + OPT: -wp -wp-model Typed -wp-par 1 -wp-prop="-zbit" +*/ + +/*@ ensures \result == (int) (a & b & c); + @ ensures band0: 3!=(\result & 0xF0); + @ behavior bit0: + @ assumes bit0: 1==(a & 1) && 1==(b & 1) && 1==(c & 1); + @ ensures band1: 1==(\result & 1); + @ ensures band2: 0!=(\result & 1); + @ behavior bit1: + @ assumes bit1: 0==(b & 2); + @ ensures band3: 0==(\result & 2); + @ behavior bit2: + @ assumes bit2: 0!=(c & 4); + @ ensures band4: (\result & 4) == (a & b & 4); + @ behavior bit3: + @ assumes bit3: 2!=(a & 2) && 0==(b & c & 2) && 1 != (a & b & 1); + @ ensures band5: (\result & 2) == (a & b & 1); + @ behavior bit4: + @ assumes bit4: a==-1 && b==~0 && c==-1; + @ ensures band6: \result==-1; + @ behavior bit5: + @ ensures band7: zbit: (0x55==(0xFFF & a)) ==> (0x5555!=(0xFFFF & a)); + */ +int band(int a,int b,int c) { return a & b & c; } + +/*@ ensures \result == (int) (a | b | c); + @ ensures bor0: 3!=(\result | 0xF0); + @ behavior bit1: + @ assumes bit1: 2==(a & 2); + @ ensures bor1: 2==(\result & 2); + @ behavior bit2: + @ assumes bit2: 0==(a & 4) && 0==((b | c) & 4); + @ ensures bor2: 0==(\result & 4); + @ behavior bit3: + @ assumes bit3: a==0 && b == 0 && c==0; + @ ensures bor3: \result==0; + */ +int bor(int a,int b, int c) { return a | b | c ; } + +/*@ ensures \result == (int) (a ^ b); + @ behavior bit1: + @ assumes a == -1 && 0xFF==(0xF0^b); + @ ensures \result != ~0xF; + @ behavior bit2: + @ assumes a == b; + @ ensures \result == 0; + @ behavior bit3: + @ assumes a == ~b; + @ ensures zbit: \result == -1; + */ +int bxor(int a,int b) { return a ^ b ; } + +//@ ensures \result == (int) (~a) ; +int bnot(int a) { return ~a ; } + +/*@ ensures \result == (int) (a << n) ; + @ behavior shift1: + @ assumes n == 3; + @ ensures lsl1: ((a & 1) != 0) == (0 != (\result & 8)); + @ ensures lsl2: 1 != (\result & 1); + @ behavior shift2: + @ assumes a == 2; + @ ensures lsl3: 0 != ( (a<<(unsigned)(n) ) & ((1 << (1+(unsigned)(n)) ))); +*/ +int lshift(int a,int n) { return a << n ; } + +/*@ ensures \result == (int) (a >> n) ; + @ behavior shift1: + @ assumes n == 3; + @ ensures lsr1: ((a & 8) != 0) == (0 != (\result & 1)); +*/ +int rshift(int a,int n) { return a >> n ; } + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/block_length.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/block_length.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/block_length.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/block_length.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,25 @@ +/* run.config_qualif + OPT: -wp -wp-par 1 +*/ + +int t[20]; + +int mat[10][5]; + +struct S {int i; int tab[4];}; + +int x; + +struct S s; +struct S ts[4]; + +/*@ + ensures Pt: \block_length(t) == 20*sizeof(int) ; + ensures Psiz1 : sizeof(mat[1]) == 5*sizeof(int); + ensures Pmat1 : \block_length(mat[1]) == 50*sizeof(int); + ensures Psiz2 : sizeof(mat) == 50*sizeof(int); + ensures Pmat2 : \block_length(mat) == 50*sizeof(int); + ensures Ps : \block_length(&s) == \block_length(&x) + 4*sizeof(int); + ensures Pts : \block_length(ts) == 4* \block_length(&s); + */ +void f(void){return;} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/equal.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/equal.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/equal.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/equal.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,48 @@ +/* run.config_qualif + OPT: -wp -wp-model Typed -wp-proof alt-ergo -wp-par 1 +*/ + +/* -------------------------------------------------------------------------- */ +/* --- GOAL: equality over records, arrays, pointers --- */ +/* -------------------------------------------------------------------------- */ + +struct S { int a; int b;}; +struct S s0,s1; + +//@ ensures s0 == {{s1 \with .a = s0.a} \with .b = s0.b}; +void simple_struct(void){return;} + +int t0[2]; +int t1[2]; + +//@ ensures t0 == {{t1 \with [0] = t0[0]} \with [1] = t0[1]}; +void simple_array(void){return;} + +struct St {int tab[10];}; +struct St st0,st1; + +//@ ensures st0.tab == st1.tab ==> st0 == st1 ; +void with_array_struct(void){return;} + +struct Sp {int * p ;}; +struct Sp sp0,sp1; + +//@ ensures sp0.p == sp1.p ==> sp0 == sp1; +void with_ptr_struct(void){return;} + +int * tp0[5]; +int * tp1[5]; + +//@ ensures (\forall integer i; 0 <= i < 5 ==> tp0[i] == tp1[i]) ==> tp0 == tp1; +void with_ptr_array(void){return;} + +struct Q {int * qp ; int qt[2] ; struct S qs;}; +struct Q q0,q1; + +/*@ + ensures q0.qp == q1.qp ==> + q0.qs == q1.qs ==> + q0.qt == q1.qt ==> + q0 == q1 ; +*/ +void with_ptr_and_array_struct(void){return;} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/funvar_inv.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/funvar_inv.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/funvar_inv.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/funvar_inv.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,63 @@ +/*run.config + OPT: -wp-model Hoare + OPT: -wp-model Typed+ref +*/ + +/*run.config_qualif + OPT: -wp -wp-model Typed+ref -wp-par 1 -wp-prop qed_ok +*/ + +/* -------------------------------------------------------------------------- */ +/* --- GOAL: Such as funvar is used for the two model, Store and Hoare --- */ +/* --- the oracles of this test have to been unchanged by any change in --- */ +/* --- funvar --- */ +/* --- TODO verify the semantics of startof: is it normal --- */ +/* --- &G+i <> &(G[i]) ? --- */ +/* -------------------------------------------------------------------------- */ + + + +int G [4]; + + +/*@ ensures P_startof: G[0] == 0 ==> \result == &(G[0]) ; + ensures P_addr: G[0] != 0 && G[1] == 0 ==> \result == &(G[1]) ; +*/ +int * f (void) +{ + int i =0; + //@ loop assigns qed_ok: index:i ; + while (i < 4 && G[i] !=0) i++; + if (i>=4) return &(i) ; + else return &(G[i]); + +} + + +/*@ ensures P_startof_shift: G[0] == 0 ==> \result == &(G[0]) ; + ensures P_addr_shift: G[0] != 0 && G[1] == 0 ==> \result == &(G[1]) ; +*/ +int * f2 (void) +{ + int i =0; + //@ loop assigns qed_ok: index:i ; + while (((G+i) < (G+4)) && G[i] !=0) i++; + if (i>=4) return &(i) ; + else return &(G[i]); + +} + + + +/*@ ensures P_addr_startof_shift: G[0] == 0 ==> \result == &(G[0]) ; + ensures P_addr_addr_shift: G[0] != 0 && G[1] == 0 ==> \result == &(G[1]) ; +*/ +int * g (void) +{ + int i =0; + //@ loop assigns qed_ok: i ; + while (((&G+i) < (&G+4)) && G[i] !=0) i++; + if (i>=4) return &(i) ; + else return &(G[i]); + +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/init_label.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/init_label.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/init_label.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/init_label.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,21 @@ + + +int A[20] = {10,11,12} ; + +/*@ + requires OK: A[1]==11 && A[19]==0 ; + */ +int main(void) ; + + +/*@ + requires Init: A == \at( A , Init ); + ensures OK: \result == 12 ; +*/ +int job(void) { return A[2]; } + +/*@ ensures OK: \at( A[8] , Init ) == 0 ; */ +void foreign(void) { return ; } + +/*@ ensures KO: \result == 12 ; */ +int extra(void) { return A[2]; } diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/init_value.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/init_value.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/init_value.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/init_value.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,55 @@ +/* run.config_qualif + OPT: -wp -wp-par 1 -wp-prop="-qed_ko" + OPT: -wp -wp-par 1 -wp-prop qed_ko -wp-timeout 5 +*/ + +/* -------------------------------------------------------------------------- */ +/* --- GOAL: partial and complete initialization of value --- */ +/* -------------------------------------------------------------------------- */ + +struct S { int a; int b;}; + +struct S s = {2}; + +int t[2] = {1}; + +struct St {int tab[10];}; +struct St st = {{1,2,3,4}}; + +struct Sc {int a; int b[3]; int c;}; + +struct Sc sc0 = {1,{2,3,4},5}; +struct Sc sc1 = {1,2,3,4,5}; +struct Sc sc2 = {1,{2,3},4}; +struct Sc sc3 = {1,2,3,4}; + +unsigned char tab[32]; + +int u []; + +/*@ requires qed_ok: Struct_Simple_a: s.a == 2 ; + requires qed_ok: Struct_Simple_b: s.b == 0 ; + requires qed_ok: Simple_Array_0 : t[0] == 1 ; + requires qed_ok: Simple_Array_1 : t[1] == 0 ; + requires qed_ok: With_Array_Struct_5 : st.tab[5] == 0 ; + requires qed_ok: With_Array_Struct_3 : st.tab[3] == 4 ; + requires qed_ok: Sc_eq : sc1 == sc0; + requires qed_ok: Sc_t : sc2.b[2] == 0 ; + requires qed_ok: Sc_t : sc3.b[2] == 4 ; + requires qed_ok: Sc_c_2 : sc2.c == 4; + requires qed_ok: Sc_c_3 : sc3.c == 0; + requires qed_ok: Tab_no_init : tab[5] == 0 ; + requires qed_ok: Tab_todo : \forall int i; 0 <= i <= 31 ==> tab[i] <= 255; + + requires qed_ko: Sc_eq_ko : sc2 == sc3; + requires qed_ko: Sc_t : sc3.b[2] == 3 ; + requires qed_ko: Sc_c_2 : sc2.c == 2; + requires qed_ko: Tab_no_init : tab[5] == 1 ; + requires qed_ko: With_Array_Struct_3 : st.tab[3] == 3 ; + requires qed_ko: Simple_Array_1 : t[1] == 1 ; + */ +void main (void){return;} + + + + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/init_value_mem.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/init_value_mem.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/init_value_mem.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/init_value_mem.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,26 @@ +/* run.config + OPT: -wp-model Typed + OPT: -wp-model Hoare +*/ + +/* run.config_qualif + OPT: -wp -wp-par 1 -wp-model Typed +*/ + +/* run.config_qed + DONTRUN: (config_qed) +*/ + +/* -------------------------------------------------------------------------- */ +/* --- GOAL: complete initialization of value into or out memory --- */ +/* -------------------------------------------------------------------------- */ + + +struct St {int a; int b;}; +struct St v={1,2}, w={1,2} ; +struct St * p = &v ; + +/*@ ensures P: v == w; + @ ensures Q: *p == w; +*/ +void main(void) { return; } diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/intbool.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/intbool.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/intbool.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/intbool.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,2 @@ +/*@ ensures \result == i - (int) (j == 1) ; */ +int bug(int i, int j) { return i - (j == 1); } diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/label_escape.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/label_escape.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/label_escape.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/label_escape.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,29 @@ +/* run.config_qualif + OPT: -wp -wp-par 1 -wp-prop="-qed_ko" + OPT: -wp -wp-par 1 -wp-prop qed_ko -wp-timeout 5 +*/ + +int f(int x) { + int y=1; + if (x) goto M; + L: + y=2; + M: + //@ assert qed_ko: oracle_ko: \at(y,L) == 0 ; + return y; +} + + +int g(int x) { + int y=0; + if (!x) goto M; + y=1 ; + L: + y=2 ; + M: + if (x) { + //@ assert qed_ok: ok: \at(y,L) == 1 ; + return 1; + } + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/logic.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/logic.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/logic.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/logic.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,11 @@ +/* run.config_qualif + OPT: -wp -wp-model Typed -wp-par 1 +*/ + +// Test logic constants + +int x = 1 ; +//@ logic integer k = 1 ; + +//@ requires x == k ; +int main(); diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/looplabels.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/looplabels.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/looplabels.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/looplabels.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,25 @@ +/* run.config_qualif + OPT: -wp -wp-par 1 +*/ + +/*@ predicate IsEqual(int * a , int * b , int n) = + @ \forall integer i; 0 <= i < n ==> a[i] == b[i] ; + @ */ + +/*@ requires n>0 ; + @ requires \valid( a+ (0..n-1) ); + @ requires \valid( b+ (0..n-1) ); + @ requires \separated( a+ (0..n-1) , b + (0..n-1) ); + @ ensures IsEqual(a,b,n); + @ assigns b[0..n-1] ; + @ */ +void copy( int * a , int * b , int n ) +{ + /*@ loop invariant 0 <= i <= n ; + @ loop invariant IsEqual(a,b,i) ; + @ loop assigns i , b[0..n-1] ; + @ */ + for (int i = 0 ; i < n ; i++) { + b[i] = a[i] ; + } +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/null.c frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/null.c --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/null.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/null.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,10 @@ +/* run.config_qualif + OPT: -wp -wp-par 1 +*/ + +#define NULL ((void*)0) +//@ ensures \result == 0; +int null_is_zero (void) { + void * p = NULL; + return (int) p; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/arith.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/arith.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/arith.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/arith.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,181 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/arith.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Global +------------------------------------------------------------ + +Lemma ASSOC: +Assume: 'L16' 'L15' 'L14' 'L30' 'L21' 'L20' 'L13' 'L12' 'L11' 'L10' 'L01' + 'scN2' 'scN1' 'scL1' 'ucN2' 'ucN1' 'ucL4' 'ucL3' 'ucL2' 'ucL1' +Prove: (x_0=(land y_0 z_0)) -> ((land t_0 x_0)=(land t_0 y_0 z_0)) + +------------------------------------------------------------ + +Lemma L01: +Assume: 'scN2' 'scN1' 'scL1' 'ucN2' 'ucN1' 'ucL4' 'ucL3' 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma L10: +Assume: 'L01' 'scN2' 'scN1' 'scL1' 'ucN2' 'ucN1' 'ucL4' 'ucL3' 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma L11: +Assume: 'L10' 'L01' 'scN2' 'scN1' 'scL1' 'ucN2' 'ucN1' 'ucL4' 'ucL3' 'ucL2' + 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma L12: +Assume: 'L11' 'L10' 'L01' 'scN2' 'scN1' 'scL1' 'ucN2' 'ucN1' 'ucL4' 'ucL3' + 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma L13: +Assume: 'L12' 'L11' 'L10' 'L01' 'scN2' 'scN1' 'scL1' 'ucN2' 'ucN1' 'ucL4' + 'ucL3' 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma L14: +Assume: 'L30' 'L21' 'L20' 'L13' 'L12' 'L11' 'L10' 'L01' 'scN2' 'scN1' 'scL1' + 'ucN2' 'ucN1' 'ucL4' 'ucL3' 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma L15: +Assume: 'L14' 'L30' 'L21' 'L20' 'L13' 'L12' 'L11' 'L10' 'L01' 'scN2' 'scN1' + 'scL1' 'ucN2' 'ucN1' 'ucL4' 'ucL3' 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma L16: +Assume: 'L15' 'L14' 'L30' 'L21' 'L20' 'L13' 'L12' 'L11' 'L10' 'L01' 'scN2' + 'scN1' 'scL1' 'ucN2' 'ucN1' 'ucL4' 'ucL3' 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma L20: +Assume: 'L13' 'L12' 'L11' 'L10' 'L01' 'scN2' 'scN1' 'scL1' 'ucN2' 'ucN1' + 'ucL4' 'ucL3' 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma L21: +Assume: 'L20' 'L13' 'L12' 'L11' 'L10' 'L01' 'scN2' 'scN1' 'scL1' 'ucN2' + 'ucN1' 'ucL4' 'ucL3' 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma L30: +Assume: 'L21' 'L20' 'L13' 'L12' 'L11' 'L10' 'L01' 'scN2' 'scN1' 'scL1' 'ucN2' + 'ucN1' 'ucL4' 'ucL3' 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma scL1: +Assume: 'ucN2' 'ucN1' 'ucL4' 'ucL3' 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma scN1: +Assume: 'scL1' 'ucN2' 'ucN1' 'ucL4' 'ucL3' 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma scN2: +Assume: 'scN1' 'scL1' 'ucN2' 'ucN1' 'ucL4' 'ucL3' 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma ucL1: +Prove: true + +------------------------------------------------------------ + +Lemma ucL2: +Assume: 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma ucL3: +Assume: 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma ucL4: +Assume: 'ucL3' 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma ucN1: +Assume: 'ucL4' 'ucL3' 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ + +Lemma ucN2: +Assume: 'ucN1' 'ucL4' 'ucL3' 'ucL2' 'ucL1' +Prove: true + +------------------------------------------------------------ +------------------------------------------------------------ + Function cast_sgn_usgn +------------------------------------------------------------ + +Goal Post-condition 'qed_ko,KO' in 'cast_sgn_usgn': +Assume { } +Prove: false. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,nat' in 'cast_sgn_usgn': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function uchar_range +------------------------------------------------------------ + +Goal Assertion 'qed_ok,A1' (file tests/wp_acsl/arith.i, line 16): +Assume { (* Domain *) Type: (is_uint8 i_0). } +Prove: 0<=i_0. + +------------------------------------------------------------ + +Goal Assertion 'qed_ok,A2' (file tests/wp_acsl/arith.i, line 17): +Assume { + (* Domain *) + Type: (is_uint8 i_0). + (* Assertion 'qed_ok,A1' (file tests/wp_acsl/arith.i, line 16) *) + (* tests/wp_acsl/arith.i:16: Assertion 'qed_ok,A1': *) + Have: 0<=i_0. +} +Prove: i_0<=255. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/assigns_path.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/assigns_path.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/assigns_path.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/assigns_path.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,206 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/assigns_path.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function job +------------------------------------------------------------ + +Goal Post-condition 'N' in 'job': +Let x_0 = p_2.F_S_n. +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 x_0). + (* Heap *) + Have: (region (base b_0))<=0. + (* Pre-condition (file tests/wp_acsl/assigns_path.i, line 6) in 'job' *) + (* Pre-condition: *) + Have: (0<=x_0) /\ (x_0<=3). + (* Invariant (file tests/wp_acsl/assigns_path.i, line 17) *) + (* tests/wp_acsl/assigns_path.i:20: Invariant: *) + Have: forall i_0:int. + (i_0 (0<=i_0) + -> (p_2.F_S_a[i_0]=Mint_2[(shift_sint32 b_0 i_0)]). + (* Invariant (file tests/wp_acsl/assigns_path.i, line 16) *) + (* tests/wp_acsl/assigns_path.i:20: Invariant: *) + Have: (0<=i_2) /\ (i_2<=x_0). + (* tests/wp_acsl/assigns_path.i:20: Else *) + Have: x_0<=i_2. +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'A' in 'job': +Let a_0 = p_2.F_S_a. +Let x_0 = p_2.F_S_n. +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 x_0). + (* Goal *) + When: (0<=i_4) /\ (i_4 (0<=i_0) -> (a_0[i_0]=Mint_1[(shift_sint32 b_1 i_0)]). + (* Invariant (file tests/wp_acsl/assigns_path.i, line 16) *) + (* tests/wp_acsl/assigns_path.i:20: Invariant: *) + Have: (0<=i_2) /\ (i_2<=x_0). + (* tests/wp_acsl/assigns_path.i:20: Else *) + Have: x_0<=i_2. +} +Prove: a_0[i_4]=Mint_1[(shift_sint32 b_1 i_4)]. + +------------------------------------------------------------ + +Goal Preservation of Invariant (file tests/wp_acsl/assigns_path.i, line 16): +Let x_0 = p_3.F_S_n. +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 x_0) /\ (is_sint32 (1+i_2)). + (* Heap *) + Have: (region (base b_0))<=0. + (* Pre-condition (file tests/wp_acsl/assigns_path.i, line 6) in 'job' *) + (* Pre-condition: *) + Have: (0<=x_0) /\ (x_0<=3). + (* Invariant (file tests/wp_acsl/assigns_path.i, line 17) *) + (* tests/wp_acsl/assigns_path.i:20: Invariant: *) + Have: forall i_0:int. + (i_0 (0<=i_0) + -> (p_3.F_S_a[i_0]=Mint_2[(shift_sint32 b_0 i_0)]). + (* Invariant (file tests/wp_acsl/assigns_path.i, line 16) *) + (* tests/wp_acsl/assigns_path.i:20: Invariant: *) + Have: (0<=i_2) /\ (i_2<=x_0). + (* tests/wp_acsl/assigns_path.i:20: Then *) + Have: i_2 (0<=i_0) -> (a_0[i_0]=Mint_0[(shift_sint32 b_0 i_0)]). + (* Invariant (file tests/wp_acsl/assigns_path.i, line 16) *) + (* tests/wp_acsl/assigns_path.i:20: Invariant: *) + Have: (0<=i_2) /\ (i_2<=x_0). + (* tests/wp_acsl/assigns_path.i:20: Then *) + Have: i_2Mint_0[(shift_sint32 b_0 i_2)]][i_1]. + +------------------------------------------------------------ + +Goal Establishment of Invariant (file tests/wp_acsl/assigns_path.i, line 17): +Assume { (* Goal *) When: false. } +Prove: p_6.F_S_a[i_6]=Mint_2[(shift_sint32 b_0 i_6)]. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_acsl/assigns_path.i, line 18) (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_acsl/assigns_path.i, line 18) (2/2): +Effect at line 20 +Let x_0 = p_3.F_S_n. +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 x_0). + (* Goal *) + When: (0<=i_2) /\ (i_2<=3). + (* Heap *) + Have: (region (base b_0))<=0. + (* Pre-condition (file tests/wp_acsl/assigns_path.i, line 6) in 'job' *) + (* Pre-condition: *) + Have: (0<=x_0) /\ (x_0<=3). + (* Invariant (file tests/wp_acsl/assigns_path.i, line 17) *) + (* tests/wp_acsl/assigns_path.i:20: Invariant: *) + Have: forall i_0:int. + (i_0 (0<=i_0) + -> (p_3.F_S_a[i_0]=Mint_2[(shift_sint32 b_0 i_0)]). + (* Invariant (file tests/wp_acsl/assigns_path.i, line 16) *) + (* tests/wp_acsl/assigns_path.i:20: Invariant: *) + Have: i_2<=x_0. + (* tests/wp_acsl/assigns_path.i:20: Then *) + Have: i_2 (t2_0[i_0]=t2_3[i_0]). + Case: + (* Control Flow *) + Have: t2_1=t2_2. + (* tests/wp_acsl/assigns_range.i:38: Exit Effects *) + Have: forall i_0:int. + ((j_2 (t2_1[i_0]=t2_4[i_0]). + } +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'qed_ok' in 'call_assigns_all' (4/5): +Call Effect at line 39 +Assume { + (* Domain *) + Type: (is_sint32 i_0) /\ (is_sint32 j_0). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 32) in 'call_assigns_all' *) + (* Pre-condition: *) + Have: (0<=i_0) /\ (i_0<=j_0) /\ (j_0<=19). + (* tests/wp_acsl/assigns_range.i:37: Call 'assigns_t1_an_element' *) + Have: i_0<=19. + (* tests/wp_acsl/assigns_range.i:38: Call Effects *) + Have: forall i_1:int. ((j_0 (t2_0[i_1]=t2_3[i_1]). + (* Merge *)Either { + Case: + (* Control Flow *) + Have: t3_0=t3_2. + (* tests/wp_acsl/assigns_range.i:39: Call Effects *) + Have: forall i_1:int. + ((i_1 (t3_0[i_1]=t3_3[i_1]). + Case: + (* Control Flow *) + Have: t3_1=t3_2. + (* tests/wp_acsl/assigns_range.i:39: Exit Effects *) + Have: forall i_1:int. + ((i_1 (t3_1[i_1]=t3_4[i_1]). + } +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'qed_ok' in 'call_assigns_all' (5/5): +Call Effect at line 40 +Assume { + (* Domain *) + Type: (is_sint32 i_0) /\ (is_sint32 j_0). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 32) in 'call_assigns_all' *) + (* Pre-condition: *) + Have: (0<=i_0) /\ (i_0<=j_0) /\ (j_0<=19). + (* tests/wp_acsl/assigns_range.i:37: Call 'assigns_t1_an_element' *) + Have: i_0<=19. + (* tests/wp_acsl/assigns_range.i:38: Call Effects *) + Have: forall i_1:int. ((j_0 (t2_0[i_1]=t2_3[i_1]). + (* tests/wp_acsl/assigns_range.i:39: Call Effects *) + Have: forall i_1:int. ((i_1 (t3_0[i_1]=t3_3[i_1]). + (* Merge *)Either { + Case: + (* Control Flow *) + Have: t4_0=t4_2. + (* tests/wp_acsl/assigns_range.i:40: Call 'assigns_t4_sup_bound' *) + Have: 0<=j_0. + (* tests/wp_acsl/assigns_range.i:40: Call Effects *) + Have: forall i_1:int. + ((j_0 (t4_0[i_1]=t4_3[i_1]). + Case: + (* Control Flow *) + Have: t4_1=t4_2. + (* tests/wp_acsl/assigns_range.i:40: Exit 'assigns_t4_sup_bound' *) + Have: 0<=j_0. + (* tests/wp_acsl/assigns_range.i:40: Exit Effects *) + Have: forall i_1:int. + ((j_0 (t4_1[i_1]=t4_4[i_1]). + } +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'qed_ok' in 'call_assigns_all' (1/5): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'qed_ok' in 'call_assigns_all' (2/5): +Call Effect at line 37 +Assume { + (* Domain *) + Type: (is_sint32 i_0) /\ (is_sint32 j_0). + (* Goal *) + When: (0<=i_0) /\ (i_0<=19). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 32) in 'call_assigns_all' *) + (* Pre-condition: *) + Have: (i_0<=j_0) /\ (j_0<=19). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'qed_ok' in 'call_assigns_all' (3/5): +Call Effect at line 38 +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 j_2). + (* Goal *) + When: (i_2<=j_2) -> ((0<=i_2) /\ (j_2<=19)). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 32) in 'call_assigns_all' *) + (* Pre-condition: *) + Have: (0<=i_2) /\ (i_2<=j_2) /\ (j_2<=19). + (* tests/wp_acsl/assigns_range.i:37: Call 'assigns_t1_an_element' *) + Have: i_2<=19. + (* tests/wp_acsl/assigns_range.i:38: Call Effects *) + Have: forall i_0:int. ((j_2 (t2_0[i_0]=t2_3[i_0]). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'qed_ok' in 'call_assigns_all' (4/5): +Call Effect at line 39 +Assume { + (* Domain *) + Type: (is_sint32 i_0) /\ (is_sint32 j_0). + (* Goal *) + When: (i_0<=19) -> (0<=i_0). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 32) in 'call_assigns_all' *) + (* Pre-condition: *) + Have: (0<=i_0) /\ (i_0<=j_0) /\ (j_0<=19). + (* tests/wp_acsl/assigns_range.i:37: Call 'assigns_t1_an_element' *) + Have: i_0<=19. + (* tests/wp_acsl/assigns_range.i:38: Call Effects *) + Have: forall i_1:int. ((j_0 (t2_0[i_1]=t2_3[i_1]). + (* tests/wp_acsl/assigns_range.i:39: Call Effects *) + Have: forall i_1:int. ((i_1 (t3_0[i_1]=t3_3[i_1]). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'qed_ok' in 'call_assigns_all' (5/5): +Call Effect at line 40 +Assume { + (* Domain *) + Type: (is_sint32 i_0) /\ (is_sint32 j_0). + (* Goal *) + When: (0<=j_0) -> (j_0<=19). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 32) in 'call_assigns_all' *) + (* Pre-condition: *) + Have: (0<=i_0) /\ (i_0<=j_0) /\ (j_0<=19). + (* tests/wp_acsl/assigns_range.i:37: Call 'assigns_t1_an_element' *) + Have: i_0<=19. + (* tests/wp_acsl/assigns_range.i:38: Call Effects *) + Have: forall i_1:int. ((j_0 (t2_0[i_1]=t2_3[i_1]). + (* tests/wp_acsl/assigns_range.i:39: Call Effects *) + Have: forall i_1:int. ((i_1 (t3_0[i_1]=t3_3[i_1]). + (* tests/wp_acsl/assigns_range.i:40: Call 'assigns_t4_sup_bound' *) + Have: 0<=j_0. + (* tests/wp_acsl/assigns_range.i:40: Call Effects *) + Have: forall i_1:int. ((j_0 (t4_0[i_1]=t4_3[i_1]). +} +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_acsl/assigns_range.i, line 8) in 'assigns_t1_an_element'' in 'call_assigns_all' at call 'assigns_t1_an_element' (file tests/wp_acsl/assigns_range.i, line 37) +: +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 j_0). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 32) in 'call_assigns_all' *) + (* Pre-condition: *) + Have: (0<=i_2) /\ (i_2<=j_0) /\ (j_0<=19). +} +Prove: i_2<=19. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_acsl/assigns_range.i, line 13) in 'assigns_t2_bound'' in 'call_assigns_all' at call 'assigns_t2_bound' (file tests/wp_acsl/assigns_range.i, line 38) +: +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 j_2). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 32) in 'call_assigns_all' *) + (* Pre-condition: *) + Have: (0<=i_2) /\ (i_2<=j_2) /\ (j_2<=19). + (* tests/wp_acsl/assigns_range.i:37: Call 'assigns_t1_an_element' *) + Have: i_2<=19. +} +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_acsl/assigns_range.i, line 18) in 'assigns_t3_inf_bound'' in 'call_assigns_all' at call 'assigns_t3_inf_bound' (file tests/wp_acsl/assigns_range.i, line 39) +: +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 j_0). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 32) in 'call_assigns_all' *) + (* Pre-condition: *) + Have: (0<=i_2) /\ (i_2<=j_0) /\ (j_0<=19). + (* tests/wp_acsl/assigns_range.i:37: Call 'assigns_t1_an_element' *) + Have: i_2<=19. + (* tests/wp_acsl/assigns_range.i:38: Call Effects *) + Have: forall i_0:int. ((j_0 (t2_0[i_0]=t2_3[i_0]). +} +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_acsl/assigns_range.i, line 23) in 'assigns_t4_sup_bound'' in 'call_assigns_all' at call 'assigns_t4_sup_bound' (file tests/wp_acsl/assigns_range.i, line 40) +: +Assume { + (* Domain *) + Type: (is_sint32 i_0) /\ (is_sint32 j_2). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 32) in 'call_assigns_all' *) + (* Pre-condition: *) + Have: (0<=i_0) /\ (i_0<=j_2) /\ (j_2<=19). + (* tests/wp_acsl/assigns_range.i:37: Call 'assigns_t1_an_element' *) + Have: i_0<=19. + (* tests/wp_acsl/assigns_range.i:38: Call Effects *) + Have: forall i_1:int. ((j_2 (t2_0[i_1]=t2_3[i_1]). + (* tests/wp_acsl/assigns_range.i:39: Call Effects *) + Have: forall i_1:int. ((i_1 (t3_0[i_1]=t3_3[i_1]). +} +Prove: 0<=j_2. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_assigns_t1 +------------------------------------------------------------ + +Goal Assigns 'qed_ko' in 'call_assigns_t1': +Call Effect at line 49 +Assume { + (* Domain *) + Type: (is_sint32 i_0). + (* Goal *) + When: (0<=i_0) /\ (i_0<=19). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 44) in 'call_assigns_t1' *) + (* Pre-condition: *) + Have: (5<=i_0) /\ (i_0<=7). +} +Prove: false. + +------------------------------------------------------------ + +Goal Assigns 'qed_ko' in 'call_assigns_t1': +Call Effect at line 49 +Assume { + (* Domain *) + Type: (is_sint32 i_0). + (* Goal *) + When: (0<=i_0) /\ (i_0<=19). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 44) in 'call_assigns_t1' *) + (* Pre-condition: *) + Have: (5<=i_0) /\ (i_0<=7). +} +Prove: false. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_acsl/assigns_range.i, line 8) in 'assigns_t1_an_element'' in 'call_assigns_t1' at call 'assigns_t1_an_element' (file tests/wp_acsl/assigns_range.i, line 49) +: +Assume { + (* Domain *) + Type: (is_sint32 i_2). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 44) in 'call_assigns_t1' *) + (* Pre-condition: *) + Have: (5<=i_2) /\ (i_2<=7). +} +Prove: (0<=i_2) /\ (i_2<=19). + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_assigns_t2 +------------------------------------------------------------ + +Goal Assigns 'qed_ko' in 'call_assigns_t2': +Call Effect at line 57 +Assume { + (* Domain *) + Type: (is_sint32 i_2). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 52) in 'call_assigns_t2' *) + (* Pre-condition: *) + Have: (5<=i_2) /\ (i_2<=7). + (* tests/wp_acsl/assigns_range.i:57: Exit 'assigns_t2_bound' *) + Have: (0<=i_2) /\ (i_2<=17). + (* tests/wp_acsl/assigns_range.i:57: Exit Effects *) + Have: forall i_0:int. + ((i_0 (t2_1[i_0]=t2_4[i_0]). +} +Prove: false. + +------------------------------------------------------------ + +Goal Assigns 'qed_ko' in 'call_assigns_t2': +Call Effect at line 57 +Assume { + (* Domain *) + Type: (is_sint32 i_2). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 52) in 'call_assigns_t2' *) + (* Pre-condition: *) + Have: (5<=i_2) /\ (i_2<=7). + (* tests/wp_acsl/assigns_range.i:57: Call 'assigns_t2_bound' *) + Have: (0<=i_2) /\ (i_2<=17). + (* tests/wp_acsl/assigns_range.i:57: Call Effects *) + Have: forall i_0:int. + ((i_0 (t2_0[i_0]=t2_3[i_0]). +} +Prove: false. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_acsl/assigns_range.i, line 13) in 'assigns_t2_bound'' in 'call_assigns_t2' at call 'assigns_t2_bound' (file tests/wp_acsl/assigns_range.i, line 57) +: +Assume { + (* Domain *) + Type: (is_sint32 i_2). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 52) in 'call_assigns_t2' *) + (* Pre-condition: *) + Have: (5<=i_2) /\ (i_2<=7). +} +Prove: (0<=i_2) /\ (i_2<=17). + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_assigns_t4 +------------------------------------------------------------ + +Goal Assigns 'qed_ko' in 'call_assigns_t4': +Call Effect at line 65 +Assume { + (* Domain *) + Type: (is_sint32 i_0) /\ (is_sint32 j_1). + (* Goal *) + When: (0<=j_1) -> (j_1<=19). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 60) in 'call_assigns_t4' *) + (* Pre-condition: *) + Have: (0<=i_0) /\ (i_0<=j_1) /\ (j_1<=19). + (* tests/wp_acsl/assigns_range.i:65: Exit 'assigns_t4_sup_bound' *) + Have: 0<=j_1. + (* tests/wp_acsl/assigns_range.i:65: Exit Effects *) + Have: forall i_1:int. ((j_1 (t4_1[i_1]=t4_4[i_1]). +} +Prove: i_0<=0. + +------------------------------------------------------------ + +Goal Assigns 'qed_ko' in 'call_assigns_t4': +Call Effect at line 65 +Assume { + (* Domain *) + Type: (is_sint32 i_0) /\ (is_sint32 j_1). + (* Goal *) + When: (0<=j_1) -> (j_1<=19). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 60) in 'call_assigns_t4' *) + (* Pre-condition: *) + Have: (0<=i_0) /\ (i_0<=j_1) /\ (j_1<=19). + (* tests/wp_acsl/assigns_range.i:65: Call 'assigns_t4_sup_bound' *) + Have: 0<=j_1. + (* tests/wp_acsl/assigns_range.i:65: Call Effects *) + Have: forall i_1:int. ((j_1 (t4_0[i_1]=t4_3[i_1]). +} +Prove: i_0<=0. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_acsl/assigns_range.i, line 23) in 'assigns_t4_sup_bound'' in 'call_assigns_t4' at call 'assigns_t4_sup_bound' (file tests/wp_acsl/assigns_range.i, line 65) +: +Assume { + (* Domain *) + Type: (is_sint32 i_0) /\ (is_sint32 j_1). + (* Pre-condition (file tests/wp_acsl/assigns_range.i, line 60) in 'call_assigns_t4' *) + (* Pre-condition: *) + Have: (0<=i_0) /\ (i_0<=j_1) /\ (j_1<=19). +} +Prove: 0<=j_1. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/axioms.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/axioms.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/axioms.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/axioms.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,289 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/axioms.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Post-condition 'P,todo' in 'f': +Let a_0 = (shift_sint32 t_2 a_1). +Let x_0 = -a_1. +Assume { + (* Domain *) + Type: (is_sint32 a_1) /\ (is_sint32 b_1) /\ (is_sint32 i_2). + (* Heap *) + Have: (linked Malloc_1) /\ ((region (base t_2))<=0). + (* Pre-condition (file tests/wp_acsl/axioms.i, line 20) in 'f' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_1 a_0 (1+b_1-a_1)). + (* Pre-condition (file tests/wp_acsl/axioms.i, line 21) in 'f' *) + (* Pre-condition: *) + Have: a_1<=b_1. + (* tests/wp_acsl/axioms.i:34: Assigns *) + (* tests/wp_acsl/axioms.i:34: Loop assigns ...: *) + Have: (havoc Mint_4 Mint_2 a_0 (i_2-a_1)). + (* Invariant 'Positive' (file tests/wp_acsl/axioms.i, line 31) *) + (* tests/wp_acsl/axioms.i:34: Invariant 'Positive': *) + Have: forall i_0:int. + (i_0 (a_1<=i_0) -> (is_sint32 i_0) + -> (0 (a_1<=i_0) -> (is_sint32 i_0) + -> (0 (a_0<=i_0) -> (is_sint32 i_0) + -> (0 (a_0<=i_0) -> (is_sint32 i_0) + -> (01][(shift_sint32 t_0 i_1)]. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Positive' (file tests/wp_acsl/axioms.i, line 31): +Assume { (* Goal *) When: false. } +Prove: 0 (a_0<=i_0) -> (is_sint32 i_0) + -> (0 (a_0<=i_0) -> (is_sint32 i_0) + -> (0 (included a_1 x_1 a_1 x_2). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/bitwise.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/bitwise.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/bitwise.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/bitwise.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,297 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/bitwise.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function band +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_acsl/bitwise.i, line 5) in 'band': +Let x_0 = (land a_0 b_0 c_0). +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_0) /\ (is_sint32 c_0) + /\ (is_sint32 x_0). +} +Prove: x_0=(to_sint32 x_0). + +------------------------------------------------------------ + +Goal Post-condition 'band0' in 'band': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function band with behavior bit0 +------------------------------------------------------------ + +Goal Post-condition for 'bit0' 'band1' in 'band': +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_0) /\ (is_sint32 c_0) + /\ (is_sint32 (land a_0 b_0 c_0)). + (* Pre-condition for 'bit0' 'bit0' in 'band' *) + (* Pre-condition for 'bit0' 'bit0': *) + Have: (bit_test a_0 0) /\ (bit_test b_0 0) /\ (bit_test c_0 0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition for 'bit0' 'band2' in 'band': +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_0) /\ (is_sint32 c_0) + /\ (is_sint32 (land a_0 b_0 c_0)). + (* Pre-condition for 'bit0' 'bit0' in 'band' *) + (* Pre-condition for 'bit0' 'bit0': *) + Have: (bit_test a_0 0) /\ (bit_test b_0 0) /\ (bit_test c_0 0). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function band with behavior bit1 +------------------------------------------------------------ + +Goal Post-condition for 'bit1' 'band3' in 'band': +Assume { + (* Domain *) + Type: (is_sint32 b_0) /\ (is_sint32 (land a_0 b_0 c_0)). + (* Pre-condition for 'bit1' 'bit1' in 'band' *) + (* Pre-condition for 'bit1' 'bit1': *) + Have: not (bit_test b_0 1). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function band with behavior bit2 +------------------------------------------------------------ + +Goal Post-condition for 'bit2' 'band4' in 'band': +Assume { + (* Domain *) + Type: (is_sint32 c_0) /\ (is_sint32 (land a_0 b_0 c_0)). + (* Pre-condition for 'bit2' 'bit2' in 'band' *) + (* Pre-condition for 'bit2' 'bit2': *) + Have: (bit_test c_0 2). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function band with behavior bit3 +------------------------------------------------------------ + +Goal Post-condition for 'bit3' 'band5' in 'band': +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_0) /\ (is_sint32 c_0) + /\ (is_sint32 (land a_0 b_0 c_0)). + (* Pre-condition for 'bit3' 'bit3' in 'band' *) + (* Pre-condition for 'bit3' 'bit3': *) + Have: (not (bit_test a_0 1)) + /\ ((not (bit_test a_0 0)) \/ (not (bit_test b_0 0))) + /\ ((not (bit_test b_0 1)) \/ (not (bit_test c_0 1))). +} +Prove: (not (bit_test a_0 0)) \/ (not (bit_test b_0 0)). + +------------------------------------------------------------ +------------------------------------------------------------ + Function band with behavior bit4 +------------------------------------------------------------ + +Goal Post-condition for 'bit4' 'band6' in 'band': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function band with behavior bit5 +------------------------------------------------------------ + +Goal Post-condition for 'bit5' 'band7,zbit' in 'band': +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 (land a_0 b_0 c_0)). + (* Goal *) + When: 85=(land 4095 a_0). +} +Prove: 21845!=(land 65535 a_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bnot +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_acsl/bitwise.i, line 55) in 'bnot': +Let x_0 = (lnot a_0). +Assume { (* Domain *) Type: (is_sint32 a_0) /\ (is_sint32 x_0). } +Prove: x_0=(to_sint32 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bor +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_acsl/bitwise.i, line 28) in 'bor': +Let x_0 = (lor a_0 b_0 c_0). +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_0) /\ (is_sint32 c_0) + /\ (is_sint32 x_0). +} +Prove: x_0=(to_sint32 x_0). + +------------------------------------------------------------ + +Goal Post-condition 'bor0' in 'bor': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function bor with behavior bit1 +------------------------------------------------------------ + +Goal Post-condition for 'bit1' 'bor1' in 'bor': +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 (lor a_0 b_0 c_0)). + (* Pre-condition for 'bit1' 'bit1' in 'bor' *) + (* Pre-condition for 'bit1' 'bit1': *) + Have: (bit_test a_0 1). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function bor with behavior bit2 +------------------------------------------------------------ + +Goal Post-condition for 'bit2' 'bor2' in 'bor': +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_0) /\ (is_sint32 c_0) + /\ (is_sint32 (lor a_0 b_0 c_0)). + (* Pre-condition for 'bit2' 'bit2' in 'bor' *) + (* Pre-condition for 'bit2' 'bit2': *) + Have: (not (bit_test a_0 2)) /\ (not (bit_test b_0 2)) + /\ (not (bit_test c_0 2)). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function bor with behavior bit3 +------------------------------------------------------------ + +Goal Post-condition for 'bit3' 'bor3' in 'bor': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function bxor +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_acsl/bitwise.i, line 42) in 'bxor': +Let x_0 = (lxor a_0 b_0). +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_0) /\ (is_sint32 x_0). +} +Prove: x_0=(to_sint32 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bxor with behavior bit1 +------------------------------------------------------------ + +Goal Post-condition for 'bit1' (file tests/wp_acsl/bitwise.i, line 45) in 'bxor': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function bxor with behavior bit2 +------------------------------------------------------------ + +Goal Post-condition for 'bit2' (file tests/wp_acsl/bitwise.i, line 48) in 'bxor': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function bxor with behavior bit3 +------------------------------------------------------------ + +Goal Post-condition for 'bit3' 'zbit' in 'bxor': +Let x_0 = (lnot b_1). +Assume { + (* Domain *) + Type: (is_sint32 b_1) /\ (is_sint32 x_0) /\ (is_sint32 (lxor b_1 x_0)). +} +Prove: b_1=(lnot x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function lshift +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_acsl/bitwise.i, line 58) in 'lshift': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function lshift with behavior shift1 +------------------------------------------------------------ + +Goal Post-condition for 'shift1' 'lsl1' in 'lshift': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition for 'shift1' 'lsl2' in 'lshift': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function lshift with behavior shift2 +------------------------------------------------------------ + +Goal Post-condition for 'shift2' 'lsl3' in 'lshift': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function rshift +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_acsl/bitwise.i, line 69) in 'rshift': +Let x_0 = (lsr a_0 n_0). +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 n_0) /\ (is_sint32 x_0). +} +Prove: x_0=(to_sint32 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function rshift with behavior shift1 +------------------------------------------------------------ + +Goal Post-condition for 'shift1' 'lsr1' in 'rshift': +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/block_length.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/block_length.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/block_length.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/block_length.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,52 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/block_length.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Post-condition 'Pt' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'Psiz1' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'Pmat1' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'Psiz2' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'Pmat2' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'Ps' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'Pts' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/equal.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/equal.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/equal.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/equal.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,92 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/equal.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function simple_array +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_acsl/equal.i, line 18) in 'simple_array': +Let x_0 = t0_0[0]. +Let x_1 = t0_0[1]. +Assume { + (* Domain *) + Type: (IsArray1_sint32 t0_0) /\ (IsArray1_sint32 t1_0) /\ (is_sint32 x_0) + /\ (is_sint32 x_1). +} +Prove: (EqArray1_int 2 t0_0 t1_0[0->x_0][1->x_1]). + +------------------------------------------------------------ +------------------------------------------------------------ + Function simple_struct +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_acsl/equal.i, line 12) in 'simple_struct': +Assume { + (* Domain *) + Type: (IsS_S s0_0) /\ (is_sint32 s0_0.F_S_a) /\ (is_sint32 s0_0.F_S_b). +} +Prove: (EqS_S s0_0 s0_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function with_array_struct +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_acsl/equal.i, line 24) in 'with_array_struct': +Let a_0 = st0_0.F_St_tab. +Let a_1 = st1_0.F_St_tab. +Assume { + (* Domain *) + Type: (IsS_St st0_0) /\ (IsS_St st1_0) /\ (IsArray1_sint32 a_0) + /\ (IsArray1_sint32 a_1). + (* Goal *) + When: (EqArray1_int 10 a_0 a_1). +} +Prove: (EqS_St st0_0 st1_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function with_ptr_and_array_struct +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_acsl/equal.i, line 43) in 'with_ptr_and_array_struct': +Let a_0 = q0_0.F_Q_qs. +Let a_1 = q1_0.F_Q_qs. +Let a_2 = q0_0.F_Q_qt. +Let a_3 = q1_0.F_Q_qt. +Assume { + (* Domain *) + Type: (IsS_Q q0_0) /\ (IsS_Q q1_0) /\ (IsArray1_sint32 a_2) + /\ (IsArray1_sint32 a_3) /\ (IsS_S a_0) /\ (IsS_S a_1). + (* Goal *) + When: (q0_0.F_Q_qp=q1_0.F_Q_qp) /\ (EqS_S a_0 a_1) + /\ (EqArray1_int 2 a_2 a_3). +} +Prove: (EqS_Q q0_0 q1_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function with_ptr_array +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_acsl/equal.i, line 36) in 'with_ptr_array': +Assume { + (* Goal *) + When: forall i_0:int. (0<=i_0) -> (i_0<=4) -> (tp0_0[i_0]=tp1_0[i_0]). +} +Prove: (EqArray1_pointer 5 tp0_0 tp1_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function with_ptr_struct +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_acsl/equal.i, line 30) in 'with_ptr_struct': +Assume { (* Goal *) When: sp0_0.F_Sp_p=sp1_0.F_Sp_p. } +Prove: (EqS_Sp sp0_0 sp1_0). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/funvar_inv.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/funvar_inv.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/funvar_inv.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/funvar_inv.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,335 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/funvar_inv.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Post-condition 'P_startof' in 'f': +Let a_0 = (shift_A4_sint32 (global G_G_67) 0). +Let x_0 = Mint_2[(shift_sint32 a_0 0)]. +Assume { + (* Domain *) + Type: (is_sint32 v_0) + /\ (is_sint32 Mint_2[(shift_sint32 (global L_i_72) 0)]) + /\ (is_sint32 x_0) /\ (is_sint32 Mint_2[(shift_sint32 a_0 1)]). + (* Goal *) + When: 0=x_0. + (* Heap *) + Have: (linked Malloc_2). + (* tests/wp_acsl/funvar_inv.i:30: Conditional *) + If: v_0<=3 + Then { + (* Control Flow *) + Have: Mint_2=Mint_6[(shift_sint32 (global L_i_72) 0)->v_0]. + (* tests/wp_acsl/funvar_inv.i:30: Else *) + Have: 0=Mint_6[(shift_sint32 a_0 v_0)]. + (* tests/wp_acsl/funvar_inv.i:31: Conditional *) + If: 4<=v_0 + Then { + (* tests/wp_acsl/funvar_inv.i:31: Assignment *) + Have: f_0=(shift_sint32 (global L_i_72) 0). + } + Else { + (* tests/wp_acsl/funvar_inv.i:32: Assignment *) + Have: f_0=(shift_sint32 a_0 v_0). + } + } + Else { + (* Control Flow *) + Have: Mint_2=Mint_6[(shift_sint32 (global L_i_72) 0)->v_0]. + (* tests/wp_acsl/funvar_inv.i:31: Conditional *) + If: 4<=v_0 + Then { + (* tests/wp_acsl/funvar_inv.i:31: Assignment *) + Have: f_0=(shift_sint32 (global L_i_72) 0). + } + Else { + (* tests/wp_acsl/funvar_inv.i:32: Assignment *) + Have: f_0=(shift_sint32 a_0 v_0). + } + } +} +Prove: f_0=a_0. + +------------------------------------------------------------ + +Goal Post-condition 'P_addr' in 'f': +Let a_0 = (shift_A4_sint32 (global G_G_67) 0). +Let a_1 = (shift_sint32 a_0 1). +Let x_0 = Mint_2[a_1]. +Let x_1 = Mint_2[(shift_sint32 a_0 0)]. +Assume { + (* Domain *) + Type: (is_sint32 v_0) + /\ (is_sint32 Mint_2[(shift_sint32 (global L_i_72) 0)]) + /\ (is_sint32 x_1) /\ (is_sint32 x_0). + (* Goal *) + When: (0=x_0) /\ (0!=x_1). + (* Heap *) + Have: (linked Malloc_2). + (* tests/wp_acsl/funvar_inv.i:30: Conditional *) + If: v_0<=3 + Then { + (* Control Flow *) + Have: Mint_2=Mint_6[(shift_sint32 (global L_i_72) 0)->v_0]. + (* tests/wp_acsl/funvar_inv.i:30: Else *) + Have: 0=Mint_6[(shift_sint32 a_0 v_0)]. + (* tests/wp_acsl/funvar_inv.i:31: Conditional *) + If: 4<=v_0 + Then { + (* tests/wp_acsl/funvar_inv.i:31: Assignment *) + Have: f_0=(shift_sint32 (global L_i_72) 0). + } + Else { + (* tests/wp_acsl/funvar_inv.i:32: Assignment *) + Have: f_0=(shift_sint32 a_0 v_0). + } + } + Else { + (* Control Flow *) + Have: Mint_2=Mint_6[(shift_sint32 (global L_i_72) 0)->v_0]. + (* tests/wp_acsl/funvar_inv.i:31: Conditional *) + If: 4<=v_0 + Then { + (* tests/wp_acsl/funvar_inv.i:31: Assignment *) + Have: f_0=(shift_sint32 (global L_i_72) 0). + } + Else { + (* tests/wp_acsl/funvar_inv.i:32: Assignment *) + Have: f_0=(shift_sint32 a_0 v_0). + } + } +} +Prove: f_0=a_1. + +------------------------------------------------------------ + +Goal Loop assigns 'qed_ok,index': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function f2 +------------------------------------------------------------ + +Goal Post-condition 'P_startof_shift' in 'f2': +Let a_0 = (shift_A4_sint32 (global G_G_67) 0). +Let x_0 = Mint_2[(shift_sint32 a_0 0)]. +Assume { + (* Domain *) + Type: (is_sint32 v_0) + /\ (is_sint32 Mint_2[(shift_sint32 (global L_i_77) 0)]) + /\ (is_sint32 x_0) /\ (is_sint32 Mint_2[(shift_sint32 a_0 1)]). + (* Goal *) + When: 0=x_0. + (* Heap *) + Have: (linked Malloc_2). + (* tests/wp_acsl/funvar_inv.i:44: Conditional *) + If: (4*v_0)<=15 + Then { + (* Control Flow *) + Have: Mint_2=Mint_6[(shift_sint32 (global L_i_77) 0)->v_0]. + (* tests/wp_acsl/funvar_inv.i:44: Else *) + Have: 0=Mint_6[(shift_sint32 a_0 v_0)]. + (* tests/wp_acsl/funvar_inv.i:45: Conditional *) + If: 4<=v_0 + Then { + (* tests/wp_acsl/funvar_inv.i:45: Assignment *) + Have: f2_0=(shift_sint32 (global L_i_77) 0). + } + Else { + (* tests/wp_acsl/funvar_inv.i:46: Assignment *) + Have: f2_0=(shift_sint32 a_0 v_0). + } + } + Else { + (* Control Flow *) + Have: Mint_2=Mint_6[(shift_sint32 (global L_i_77) 0)->v_0]. + (* tests/wp_acsl/funvar_inv.i:45: Conditional *) + If: 4<=v_0 + Then { + (* tests/wp_acsl/funvar_inv.i:45: Assignment *) + Have: f2_0=(shift_sint32 (global L_i_77) 0). + } + Else { + (* tests/wp_acsl/funvar_inv.i:46: Assignment *) + Have: f2_0=(shift_sint32 a_0 v_0). + } + } +} +Prove: f2_0=a_0. + +------------------------------------------------------------ + +Goal Post-condition 'P_addr_shift' in 'f2': +Let a_0 = (shift_A4_sint32 (global G_G_67) 0). +Let a_1 = (shift_sint32 a_0 1). +Let x_0 = Mint_2[a_1]. +Let x_1 = Mint_2[(shift_sint32 a_0 0)]. +Assume { + (* Domain *) + Type: (is_sint32 v_0) + /\ (is_sint32 Mint_2[(shift_sint32 (global L_i_77) 0)]) + /\ (is_sint32 x_1) /\ (is_sint32 x_0). + (* Goal *) + When: (0=x_0) /\ (0!=x_1). + (* Heap *) + Have: (linked Malloc_2). + (* tests/wp_acsl/funvar_inv.i:44: Conditional *) + If: (4*v_0)<=15 + Then { + (* Control Flow *) + Have: Mint_2=Mint_6[(shift_sint32 (global L_i_77) 0)->v_0]. + (* tests/wp_acsl/funvar_inv.i:44: Else *) + Have: 0=Mint_6[(shift_sint32 a_0 v_0)]. + (* tests/wp_acsl/funvar_inv.i:45: Conditional *) + If: 4<=v_0 + Then { + (* tests/wp_acsl/funvar_inv.i:45: Assignment *) + Have: f2_0=(shift_sint32 (global L_i_77) 0). + } + Else { + (* tests/wp_acsl/funvar_inv.i:46: Assignment *) + Have: f2_0=(shift_sint32 a_0 v_0). + } + } + Else { + (* Control Flow *) + Have: Mint_2=Mint_6[(shift_sint32 (global L_i_77) 0)->v_0]. + (* tests/wp_acsl/funvar_inv.i:45: Conditional *) + If: 4<=v_0 + Then { + (* tests/wp_acsl/funvar_inv.i:45: Assignment *) + Have: f2_0=(shift_sint32 (global L_i_77) 0). + } + Else { + (* tests/wp_acsl/funvar_inv.i:46: Assignment *) + Have: f2_0=(shift_sint32 a_0 v_0). + } + } +} +Prove: f2_0=a_1. + +------------------------------------------------------------ + +Goal Loop assigns 'qed_ok,index': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function g +------------------------------------------------------------ + +Goal Post-condition 'P_addr_startof_shift' in 'g': +Let a_0 = (shift_A4_sint32 (global G_G_67) 0). +Let x_0 = Mint_2[(shift_sint32 a_0 0)]. +Assume { + (* Domain *) + Type: (is_sint32 v_0) + /\ (is_sint32 Mint_2[(shift_sint32 (global L_i_82) 0)]) + /\ (is_sint32 x_0) /\ (is_sint32 Mint_2[(shift_sint32 a_0 1)]). + (* Goal *) + When: 0=x_0. + (* Heap *) + Have: (linked Malloc_2). + (* tests/wp_acsl/funvar_inv.i:59: Conditional *) + If: (16*v_0)<=63 + Then { + (* Control Flow *) + Have: Mint_2=Mint_6[(shift_sint32 (global L_i_82) 0)->v_0]. + (* tests/wp_acsl/funvar_inv.i:59: Else *) + Have: 0=Mint_6[(shift_sint32 a_0 v_0)]. + (* tests/wp_acsl/funvar_inv.i:60: Conditional *) + If: 4<=v_0 + Then { + (* tests/wp_acsl/funvar_inv.i:60: Assignment *) + Have: g_0=(shift_sint32 (global L_i_82) 0). + } + Else { + (* tests/wp_acsl/funvar_inv.i:61: Assignment *) + Have: g_0=(shift_sint32 a_0 v_0). + } + } + Else { + (* Control Flow *) + Have: Mint_2=Mint_6[(shift_sint32 (global L_i_82) 0)->v_0]. + (* tests/wp_acsl/funvar_inv.i:60: Conditional *) + If: 4<=v_0 + Then { + (* tests/wp_acsl/funvar_inv.i:60: Assignment *) + Have: g_0=(shift_sint32 (global L_i_82) 0). + } + Else { + (* tests/wp_acsl/funvar_inv.i:61: Assignment *) + Have: g_0=(shift_sint32 a_0 v_0). + } + } +} +Prove: g_0=a_0. + +------------------------------------------------------------ + +Goal Post-condition 'P_addr_addr_shift' in 'g': +Let a_0 = (shift_A4_sint32 (global G_G_67) 0). +Let a_1 = (shift_sint32 a_0 1). +Let x_0 = Mint_2[a_1]. +Let x_1 = Mint_2[(shift_sint32 a_0 0)]. +Assume { + (* Domain *) + Type: (is_sint32 v_0) + /\ (is_sint32 Mint_2[(shift_sint32 (global L_i_82) 0)]) + /\ (is_sint32 x_1) /\ (is_sint32 x_0). + (* Goal *) + When: (0=x_0) /\ (0!=x_1). + (* Heap *) + Have: (linked Malloc_2). + (* tests/wp_acsl/funvar_inv.i:59: Conditional *) + If: (16*v_0)<=63 + Then { + (* Control Flow *) + Have: Mint_2=Mint_6[(shift_sint32 (global L_i_82) 0)->v_0]. + (* tests/wp_acsl/funvar_inv.i:59: Else *) + Have: 0=Mint_6[(shift_sint32 a_0 v_0)]. + (* tests/wp_acsl/funvar_inv.i:60: Conditional *) + If: 4<=v_0 + Then { + (* tests/wp_acsl/funvar_inv.i:60: Assignment *) + Have: g_0=(shift_sint32 (global L_i_82) 0). + } + Else { + (* tests/wp_acsl/funvar_inv.i:61: Assignment *) + Have: g_0=(shift_sint32 a_0 v_0). + } + } + Else { + (* Control Flow *) + Have: Mint_2=Mint_6[(shift_sint32 (global L_i_82) 0)->v_0]. + (* tests/wp_acsl/funvar_inv.i:60: Conditional *) + If: 4<=v_0 + Then { + (* tests/wp_acsl/funvar_inv.i:60: Assignment *) + Have: g_0=(shift_sint32 (global L_i_82) 0). + } + Else { + (* tests/wp_acsl/funvar_inv.i:61: Assignment *) + Have: g_0=(shift_sint32 a_0 v_0). + } + } +} +Prove: g_0=a_1. + +------------------------------------------------------------ + +Goal Loop assigns 'qed_ok': +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/funvar_inv.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/funvar_inv.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/funvar_inv.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/funvar_inv.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,181 @@ +# frama-c -wp -wp-model 'Hoare' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/funvar_inv.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_acsl/funvar_inv.i:24:[wp] warning: Can not compare pointers in Empty model +tests/wp_acsl/funvar_inv.i:23:[wp] warning: Can not compare pointers in Empty model +tests/wp_acsl/funvar_inv.i:38:[wp] warning: Can not compare pointers in Empty model +tests/wp_acsl/funvar_inv.i:37:[wp] warning: Can not compare pointers in Empty model +tests/wp_acsl/funvar_inv.i:53:[wp] warning: Can not compare pointers in Empty model +tests/wp_acsl/funvar_inv.i:52:[wp] warning: Can not compare pointers in Empty model +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Post-condition 'P_startof' in 'f': +tests/wp_acsl/funvar_inv.i:23: warning from Empty Model: + - Warning: Target turned to false, looking for context inconsistency + Reason: Can not compare pointers in Empty model +Let x_0 = G_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 i_4) /\ (is_sint32 x_0) + /\ (is_sint32 G_0[1]) /\ (is_sint32 G_0[i_3]). + (* tests/wp_acsl/funvar_inv.i:30: Conditional *) + If: i_4<=3 + Then { + (* Control Flow *) + Have: i_2=i_4. + (* tests/wp_acsl/funvar_inv.i:30: Else *) + Have: 0=G_0[i_2]. + } + Else { (* Control Flow *) Have: i_2=i_4. } +} +Prove: 0!=x_0. + +------------------------------------------------------------ + +Goal Post-condition 'P_addr' in 'f': +tests/wp_acsl/funvar_inv.i:24: warning from Empty Model: + - Warning: Target turned to false, looking for context inconsistency + Reason: Can not compare pointers in Empty model +Let x_0 = G_0[0]. +Let x_1 = G_0[1]. +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 i_4) /\ (is_sint32 x_0) + /\ (is_sint32 x_1) /\ (is_sint32 G_0[i_3]). + (* tests/wp_acsl/funvar_inv.i:30: Conditional *) + If: i_4<=3 + Then { + (* Control Flow *) + Have: i_2=i_4. + (* tests/wp_acsl/funvar_inv.i:30: Else *) + Have: 0=G_0[i_2]. + } + Else { (* Control Flow *) Have: i_2=i_4. } +} +Prove: (0=x_0) \/ (0!=x_1). + +------------------------------------------------------------ + +Goal Loop assigns 'qed_ok,index': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function f2 +------------------------------------------------------------ + +Goal Post-condition 'P_startof_shift' in 'f2': +tests/wp_acsl/funvar_inv.i:37: warning from Empty Model: + - Warning: Target turned to false, looking for context inconsistency + Reason: Can not compare pointers in Empty model +Let x_0 = G_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 i_4) /\ (is_sint32 x_0) + /\ (is_sint32 G_0[1]) /\ (is_sint32 G_0[i_3]). + (* tests/wp_acsl/funvar_inv.i:44: Conditional *) + If: (4*i_4)<=15 + Then { + (* Control Flow *) + Have: i_2=i_4. + (* tests/wp_acsl/funvar_inv.i:44: Else *) + Have: 0=G_0[i_2]. + } + Else { (* Control Flow *) Have: i_2=i_4. } +} +Prove: 0!=x_0. + +------------------------------------------------------------ + +Goal Post-condition 'P_addr_shift' in 'f2': +tests/wp_acsl/funvar_inv.i:38: warning from Empty Model: + - Warning: Target turned to false, looking for context inconsistency + Reason: Can not compare pointers in Empty model +Let x_0 = G_0[0]. +Let x_1 = G_0[1]. +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 i_4) /\ (is_sint32 x_0) + /\ (is_sint32 x_1) /\ (is_sint32 G_0[i_3]). + (* tests/wp_acsl/funvar_inv.i:44: Conditional *) + If: (4*i_4)<=15 + Then { + (* Control Flow *) + Have: i_2=i_4. + (* tests/wp_acsl/funvar_inv.i:44: Else *) + Have: 0=G_0[i_2]. + } + Else { (* Control Flow *) Have: i_2=i_4. } +} +Prove: (0=x_0) \/ (0!=x_1). + +------------------------------------------------------------ + +Goal Loop assigns 'qed_ok,index': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function g +------------------------------------------------------------ + +Goal Post-condition 'P_addr_startof_shift' in 'g': +tests/wp_acsl/funvar_inv.i:52: warning from Empty Model: + - Warning: Target turned to false, looking for context inconsistency + Reason: Can not compare pointers in Empty model +Let x_0 = G_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 i_4) /\ (is_sint32 x_0) + /\ (is_sint32 G_0[1]) /\ (is_sint32 G_0[i_3]). + (* tests/wp_acsl/funvar_inv.i:59: Conditional *) + If: (16*i_4)<=63 + Then { + (* Control Flow *) + Have: i_2=i_4. + (* tests/wp_acsl/funvar_inv.i:59: Else *) + Have: 0=G_0[i_2]. + } + Else { (* Control Flow *) Have: i_2=i_4. } +} +Prove: 0!=x_0. + +------------------------------------------------------------ + +Goal Post-condition 'P_addr_addr_shift' in 'g': +tests/wp_acsl/funvar_inv.i:53: warning from Empty Model: + - Warning: Target turned to false, looking for context inconsistency + Reason: Can not compare pointers in Empty model +Let x_0 = G_0[0]. +Let x_1 = G_0[1]. +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 i_4) /\ (is_sint32 x_0) + /\ (is_sint32 x_1) /\ (is_sint32 G_0[i_3]). + (* tests/wp_acsl/funvar_inv.i:59: Conditional *) + If: (16*i_4)<=63 + Then { + (* Control Flow *) + Have: i_2=i_4. + (* tests/wp_acsl/funvar_inv.i:59: Else *) + Have: 0=G_0[i_2]. + } + Else { (* Control Flow *) Have: i_2=i_4. } +} +Prove: (0=x_0) \/ (0!=x_1). + +------------------------------------------------------------ + +Goal Loop assigns 'qed_ok': +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/init_label.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/init_label.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/init_label.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/init_label.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,85 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/init_label.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +tests/wp_acsl/init_label.i:21:[kernel] warning: No code nor implicit assigns clause for function main, generating default assigns from the prototype +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function extra +------------------------------------------------------------ + +Goal Post-condition 'KO' in 'extra': +Let x_0 = A_0[2]. +Assume { (* Domain *) Type: (is_sint32 x_0). } +Prove: 12=x_0. + +------------------------------------------------------------ +------------------------------------------------------------ + Function foreign +------------------------------------------------------------ + +Goal Post-condition 'OK' in 'foreign': +Let x_0 = A_0[8]. +Assume { + (* Domain *) + Type: (is_sint32 x_0). + (* Initializer *) + Have: 10=A_0[0]. + (* Initializer *) + Have: 11=A_0[1]. + (* Initializer *) + Have: 12=A_0[2]. + (* Initializer *) + Have: forall i_0:int. (3<=i_0) -> (i_0<=19) -> (0=A_0[i_0]). +} +Prove: 0=x_0. + +------------------------------------------------------------ +------------------------------------------------------------ + Function job +------------------------------------------------------------ + +Goal Post-condition 'OK' in 'job': +Let x_0 = A_0[2]. +Assume { + (* Domain *) + Type: (IsArray1_sint32 A_0) /\ (IsArray1_sint32 A_2) /\ (is_sint32 x_0). + (* Initializer *) + Have: 10=A_2[0]. + (* Initializer *) + Have: 11=A_2[1]. + (* Initializer *) + Have: 12=A_2[2]. + (* Initializer *) + Have: forall i_0:int. (3<=i_0) -> (i_0<=19) -> (0=A_2[i_0]). + (* Pre-condition 'Init' in 'job' *) + (* Pre-condition 'Init': *) + Have: (EqArray1_int 20 A_0 A_2). +} +Prove: 12=x_0. + +------------------------------------------------------------ +------------------------------------------------------------ + Function main +------------------------------------------------------------ + +Goal Pre-condition 'OK' in 'main': +Let x_0 = A_0[19]. +Let x_1 = A_0[1]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0). + (* Initializer *) + Have: 10=A_0[0]. + (* Initializer *) + Have: 11=x_1. + (* Initializer *) + Have: 12=A_0[2]. + (* Initializer *) + Have: forall i_0:int. (3<=i_0) -> (i_0<=19) -> (0=A_0[i_0]). +} +Prove: 0=x_0. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/init_value.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/init_value.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/init_value.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/init_value.1.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1 @@ +[wp] No proof obligations diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/init_value.2.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/init_value.2.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/init_value.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/init_value.2.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1 @@ +[wp] No proof obligations diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/init_value_mem.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/init_value_mem.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/init_value_mem.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/init_value_mem.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,44 @@ +# frama-c -wp -wp-model 'Hoare' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/init_value_mem.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_acsl/init_value_mem.i:24:[wp] warning: Can not load value in Empty model +------------------------------------------------------------ + Function main +------------------------------------------------------------ + +Goal Post-condition 'P' in 'main': +Assume { + (* Domain *) + Type: (IsS_St v_0) /\ (IsS_St w_1). + (* Initializer *) + Have: 1=w_1.F_St_a. + (* Initializer *) + Have: 2=w_1.F_St_b. + (* Initializer *) + Have: 1=v_0.F_St_a. + (* Initializer *) + Have: 2=v_0.F_St_b. +} +Prove: (EqS_St v_0 w_1). + +------------------------------------------------------------ + +Goal Post-condition 'Q' in 'main': +tests/wp_acsl/init_value_mem.i:24: warning from Empty Model: + - Warning: Hide sub-term definition + Reason: Can not load value in Empty model +Assume { + (* Domain *) + Type: (IsS_St w_1). + (* Initializer *) + Have: 1=w_1.F_St_a. + (* Initializer *) + Have: 2=w_1.F_St_b. +} +Prove: (EqS_St w_0 w_1). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/init_value_mem.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/init_value_mem.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/init_value_mem.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/init_value_mem.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,52 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/init_value_mem.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function main +------------------------------------------------------------ + +Goal Post-condition 'P' in 'main': +Let a_0 = (shift_St (global G_v_67) 0). +Let a_1 = (Load_S_St a_0 Mint_0). +Assume { + (* Domain *) + Type: (IsS_St w_0) /\ (IsS_St a_1). + (* Initializer *) + Have: 1=w_0.F_St_a. + (* Initializer *) + Have: 2=w_0.F_St_b. + (* Initializer *) + Have: 1=Mint_0[(shiftfield_F_St_a a_0)]. + (* Initializer *) + Have: 2=Mint_0[(shiftfield_F_St_b a_0)]. + (* Heap *) + Have: (region G_v_67)<=0. +} +Prove: (EqS_St a_1 w_0). + +------------------------------------------------------------ + +Goal Post-condition 'Q' in 'main': +Let a_0 = (shift_St (global G_v_67) 0). +Let a_1 = (Load_S_St a_0 Mint_0). +Assume { + (* Domain *) + Type: (IsS_St w_0) /\ (IsS_St a_1). + (* Initializer *) + Have: 1=w_0.F_St_a. + (* Initializer *) + Have: 2=w_0.F_St_b. + (* Initializer *) + Have: 1=Mint_0[(shiftfield_F_St_a a_0)]. + (* Initializer *) + Have: 2=Mint_0[(shiftfield_F_St_b a_0)]. + (* Heap *) + Have: (region G_v_67)<=0. +} +Prove: (EqS_St a_1 w_0). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/init_value.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/init_value.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/init_value.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/init_value.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,381 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/init_value.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function main +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok,Struct_Simple_a' in 'main': +Let x_0 = s_0.F_S_b. +Let x_1 = s_0.F_S_a. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0). + (* Initializer *) + Have: 2=x_1. + (* Initializer *) + Have: 0=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok,Struct_Simple_b' in 'main': +Let x_0 = s_0.F_S_b. +Let x_1 = s_0.F_S_a. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0). + (* Initializer *) + Have: 2=x_1. + (* Initializer *) + Have: 0=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok,Simple_Array_0' in 'main': +Let x_0 = t_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 t_0[1]). + (* Initializer *) + Have: 1=x_0. + (* Initializer *) + Have: forall i_0:int. (0 (i_0<=1) -> (0=t_0[i_0]). +} +Prove: true. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok,Simple_Array_1' in 'main': +Let x_0 = t_0[1]. +Let x_1 = t_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0). + (* Initializer *) + Have: 1=x_1. + (* Initializer *) + Have: forall i_0:int. (0 (i_0<=1) -> (0=t_0[i_0]). +} +Prove: 0=x_0. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok,With_Array_Struct_5' in 'main': +Let a_0 = st_0.F_St_tab. +Let a_1 = a_0[5]. +Let a_2 = a_0[3]. +Assume { + (* Domain *) + Type: (is_sint32 a_2) /\ (is_sint32 a_1). + (* Initializer *) + Have: 1=a_0[0]. + (* Initializer *) + Have: 2=a_0[1]. + (* Initializer *) + Have: 3=a_0[2]. + (* Initializer *) + Have: 4=a_2. + (* Initializer *) + Have: forall i_0:int. (4<=i_0) -> (i_0<=9) -> (0=a_0[i_0]). +} +Prove: 0=a_1. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok,With_Array_Struct_3' in 'main': +Let a_0 = st_0.F_St_tab. +Let a_1 = a_0[3]. +Assume { + (* Domain *) + Type: (is_sint32 a_1) /\ (is_sint32 a_0[5]). + (* Initializer *) + Have: 1=a_0[0]. + (* Initializer *) + Have: 2=a_0[1]. + (* Initializer *) + Have: 3=a_0[2]. + (* Initializer *) + Have: 4=a_1. + (* Initializer *) + Have: forall i_0:int. (4<=i_0) -> (i_0<=9) -> (0=a_0[i_0]). +} +Prove: true. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok,Sc_eq' in 'main': +Let a_0 = sc0_0.F_Sc_b. +Let a_1 = sc1_0.F_Sc_b. +Assume { + (* Domain *) + Type: (IsS_Sc sc0_0) /\ (IsS_Sc sc1_0). + (* Initializer *) + Have: 1=sc1_0.F_Sc_a. + (* Initializer *) + Have: 2=a_1[0]. + (* Initializer *) + Have: 3=a_1[1]. + (* Initializer *) + Have: 4=a_1[2]. + (* Initializer *) + Have: 5=sc1_0.F_Sc_c. + (* Initializer *) + Have: 1=sc0_0.F_Sc_a. + (* Initializer *) + Have: 2=a_0[0]. + (* Initializer *) + Have: 3=a_0[1]. + (* Initializer *) + Have: 4=a_0[2]. + (* Initializer *) + Have: 5=sc0_0.F_Sc_c. +} +Prove: (EqS_Sc sc1_0 sc0_0). + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok,Sc_t' in 'main': +Let a_0 = sc2_0.F_Sc_b. +Let a_1 = a_0[2]. +Let x_0 = sc2_0.F_Sc_c. +Assume { + (* Domain *) + Type: (IsS_Sc sc2_0) /\ (is_sint32 x_0) /\ (is_sint32 a_1). + (* Initializer *) + Have: 1=sc2_0.F_Sc_a. + (* Initializer *) + Have: 2=a_0[0]. + (* Initializer *) + Have: 3=a_0[1]. + (* Initializer *) + Have: forall i_0:int. (2<=i_0) -> (i_0<=2) -> (0=a_0[i_0]). + (* Initializer *) + Have: 4=x_0. +} +Prove: 0=a_1. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok,Sc_t' in 'main': +Let x_0 = sc3_0.F_Sc_c. +Let a_0 = sc3_0.F_Sc_b. +Let a_1 = a_0[2]. +Assume { + (* Domain *) + Type: (IsS_Sc sc3_0) /\ (is_sint32 x_0) /\ (is_sint32 a_1). + (* Initializer *) + Have: 1=sc3_0.F_Sc_a. + (* Initializer *) + Have: 2=a_0[0]. + (* Initializer *) + Have: 3=a_0[1]. + (* Initializer *) + Have: 4=a_1. + (* Initializer *) + Have: 0=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok,Sc_c_2' in 'main': +Let x_0 = sc2_0.F_Sc_c. +Let a_0 = sc2_0.F_Sc_b. +Assume { + (* Domain *) + Type: (IsS_Sc sc2_0) /\ (is_sint32 x_0) /\ (is_sint32 a_0[2]). + (* Initializer *) + Have: 1=sc2_0.F_Sc_a. + (* Initializer *) + Have: 2=a_0[0]. + (* Initializer *) + Have: 3=a_0[1]. + (* Initializer *) + Have: forall i_0:int. (2<=i_0) -> (i_0<=2) -> (0=a_0[i_0]). + (* Initializer *) + Have: 4=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok,Sc_c_3' in 'main': +Let x_0 = sc3_0.F_Sc_c. +Let a_0 = sc3_0.F_Sc_b. +Let a_1 = a_0[2]. +Assume { + (* Domain *) + Type: (IsS_Sc sc3_0) /\ (is_sint32 x_0) /\ (is_sint32 a_1). + (* Initializer *) + Have: 1=sc3_0.F_Sc_a. + (* Initializer *) + Have: 2=a_0[0]. + (* Initializer *) + Have: 3=a_0[1]. + (* Initializer *) + Have: 4=a_1. + (* Initializer *) + Have: 0=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok,Tab_no_init' in 'main': +Let x_0 = tab_0[5]. +Assume { + (* Domain *) + Type: (is_uint8 x_0). + (* Initializer *) + Have: forall i_0:int. (0<=i_0) -> (i_0<=31) -> (0=tab_0[i_0]). +} +Prove: 0=x_0. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok,Tab_todo' in 'main': +Assume { + (* Domain *) + Type: (is_uint8 tab_0[5]). + (* Goal *) + When: (0<=i_2) /\ (i_2<=31) /\ (is_sint32 i_2). + (* Initializer *) + Have: forall i_0:int. (0<=i_0) -> (i_0<=31) -> (0=tab_0[i_0]). +} +Prove: tab_0[i_2]<=255. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ko,Sc_eq_ko' in 'main': +Let x_0 = sc2_0.F_Sc_c. +Let a_0 = sc2_0.F_Sc_b. +Let x_1 = sc3_0.F_Sc_c. +Let a_1 = sc3_0.F_Sc_b. +Let a_2 = a_1[2]. +Assume { + (* Domain *) + Type: (IsS_Sc sc2_0) /\ (IsS_Sc sc3_0) /\ (is_sint32 x_0) + /\ (is_sint32 x_1) /\ (is_sint32 a_0[2]) /\ (is_sint32 a_2). + (* Initializer *) + Have: 1=sc3_0.F_Sc_a. + (* Initializer *) + Have: 2=a_1[0]. + (* Initializer *) + Have: 3=a_1[1]. + (* Initializer *) + Have: 4=a_2. + (* Initializer *) + Have: 0=x_1. + (* Initializer *) + Have: 1=sc2_0.F_Sc_a. + (* Initializer *) + Have: 2=a_0[0]. + (* Initializer *) + Have: 3=a_0[1]. + (* Initializer *) + Have: forall i_0:int. (2<=i_0) -> (i_0<=2) -> (0=a_0[i_0]). + (* Initializer *) + Have: 4=x_0. +} +Prove: (EqS_Sc sc2_0 sc3_0). + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ko,Sc_t' in 'main': +Let x_0 = sc3_0.F_Sc_c. +Let a_0 = sc3_0.F_Sc_b. +Let a_1 = a_0[2]. +Assume { + (* Domain *) + Type: (IsS_Sc sc3_0) /\ (is_sint32 x_0) /\ (is_sint32 a_1). + (* Initializer *) + Have: 1=sc3_0.F_Sc_a. + (* Initializer *) + Have: 2=a_0[0]. + (* Initializer *) + Have: 3=a_0[1]. + (* Initializer *) + Have: 4=a_1. + (* Initializer *) + Have: 0=x_0. +} +Prove: false. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ko,Sc_c_2' in 'main': +Let x_0 = sc2_0.F_Sc_c. +Let a_0 = sc2_0.F_Sc_b. +Assume { + (* Domain *) + Type: (IsS_Sc sc2_0) /\ (is_sint32 x_0) /\ (is_sint32 a_0[2]). + (* Initializer *) + Have: 1=sc2_0.F_Sc_a. + (* Initializer *) + Have: 2=a_0[0]. + (* Initializer *) + Have: 3=a_0[1]. + (* Initializer *) + Have: forall i_0:int. (2<=i_0) -> (i_0<=2) -> (0=a_0[i_0]). + (* Initializer *) + Have: 4=x_0. +} +Prove: false. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ko,Tab_no_init' in 'main': +Let x_0 = tab_0[5]. +Assume { + (* Domain *) + Type: (is_uint8 x_0). + (* Initializer *) + Have: forall i_0:int. (0<=i_0) -> (i_0<=31) -> (0=tab_0[i_0]). +} +Prove: 1=x_0. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ko,With_Array_Struct_3' in 'main': +Let a_0 = st_0.F_St_tab. +Let a_1 = a_0[3]. +Assume { + (* Domain *) + Type: (is_sint32 a_1) /\ (is_sint32 a_0[5]). + (* Initializer *) + Have: 1=a_0[0]. + (* Initializer *) + Have: 2=a_0[1]. + (* Initializer *) + Have: 3=a_0[2]. + (* Initializer *) + Have: 4=a_1. + (* Initializer *) + Have: forall i_0:int. (4<=i_0) -> (i_0<=9) -> (0=a_0[i_0]). +} +Prove: false. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ko,Simple_Array_1' in 'main': +Let x_0 = t_0[1]. +Let x_1 = t_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0). + (* Initializer *) + Have: 1=x_1. + (* Initializer *) + Have: forall i_0:int. (0 (i_0<=1) -> (0=t_0[i_0]). +} +Prove: 1=x_0. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/intbool.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/intbool.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/intbool.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/intbool.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/intbool.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function bug +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_acsl/intbool.i, line 1) in 'bug': +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/label_escape.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/label_escape.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/label_escape.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/label_escape.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,31 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/label_escape.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Assertion 'qed_ko,oracle_ko' (file tests/wp_acsl/label_escape.i, line 12): +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 y_1). + (* tests/wp_acsl/label_escape.i:8: Conditional *) + If: 0!=x_0 + Else { (* Control Flow *) Have: 1=y_1. } +} +Prove: 0=y_1. + +------------------------------------------------------------ +------------------------------------------------------------ + Function g +------------------------------------------------------------ + +Goal Assertion 'qed_ok,ok' (file tests/wp_acsl/label_escape.i, line 25): +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/logic.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/logic.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/logic.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/logic.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,16 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/logic.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +tests/wp_acsl/logic.i:11:[kernel] warning: No code nor implicit assigns clause for function main, generating default assigns from the prototype +------------------------------------------------------------ + Function main +------------------------------------------------------------ + +Goal Pre-condition (file tests/wp_acsl/logic.i, line 10) in 'main': +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/looplabels.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/looplabels.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/looplabels.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/looplabels.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,320 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/looplabels.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function copy +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_acsl/looplabels.i, line 13) in 'copy': +Let a_0 = (shift_sint32 b_2 0). +Let a_2 = (shift_sint32 a_1 0). +Assume { + (* Domain *) + Type: (is_sint32 i_1) /\ (is_sint32 n_1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_1))<=0) + /\ ((region (base b_2))<=0). + (* Pre-condition (file tests/wp_acsl/looplabels.i, line 9) in 'copy' *) + (* Pre-condition: *) + Have: 0Mint_1[(shift_sint32 a_0 i_1)]] a_0 + b_0 x_0). + +------------------------------------------------------------ + +Goal Establishment of Invariant (file tests/wp_acsl/looplabels.i, line 19): +Let a_1 = (shift_sint32 a_0 0). +Let a_2 = (shift_sint32 b_0 0). +Assume { + (* Domain *) + Type: (is_sint32 n_0). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_acsl/looplabels.i, line 9) in 'copy' *) + (* Pre-condition: *) + Have: 0 (included a_1 n_0 a_1 n_0). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/null.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/null.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/null.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/null.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/null.c (with preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function null_is_zero +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_acsl/null.c, line 6) in 'null_is_zero': +Assume { } +Prove: 0=(cast null). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/pointer.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/pointer.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/pointer.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/pointer.1.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,3 @@ +[wp] Running WP plugin... +[wp] user error: Model 'Runtime' is no more available until next release. +[kernel] Plug-in wp aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/pointer.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/pointer.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/pointer.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/pointer.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,308 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/pointer.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_acsl/pointer.i:50:[wp] warning: Uncomparable locations ptr(p_0) and mem(t) +tests/wp_acsl/pointer.i:49:[wp] warning: Uncomparable locations ptr(p_0) and mem(t) +tests/wp_acsl/pointer.i:48:[wp] warning: Uncomparable locations ptr(p_0) and mem(t) +tests/wp_acsl/pointer.i:47:[wp] warning: Uncomparable locations ptr(p_0) and mem(t) +tests/wp_acsl/pointer.i:46:[wp] warning: Uncomparable locations ptr(p_0) and mem(t) +tests/wp_acsl/pointer.i:45:[wp] warning: Uncomparable locations ptr(p_0) and mem(t) +------------------------------------------------------------ + Function absurd +------------------------------------------------------------ + +Goal Post-condition 'qed_ko,Base_oracle_ko' in 'absurd': +Let x_0 = (base p_0). +Assume { + (* Goal *) + When: (4*(offset q_0))<(4*(offset p_0)). + (* Heap *) + Have: ((region x_0)<=0) /\ ((region (base q_0))<=0). + (* Pre-condition (file tests/wp_acsl/pointer.i, line 69) in 'absurd' *) + (* Pre-condition: *) + Have: G_t_68=x_0. +} +Prove: (addr_lt q_0 p_0). + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko,Comp_oracle_ko' in 'absurd': +Let x_0 = (base p_0). +Assume { + (* Goal *) + When: i_1<=i_2. + (* Heap *) + Have: ((region x_0)<=0) /\ ((region (base q_0))<=0). + (* Pre-condition (file tests/wp_acsl/pointer.i, line 69) in 'absurd' *) + (* Pre-condition: *) + Have: G_t_68=x_0. +} +Prove: (4*i_2)<=(4*i_1). + +------------------------------------------------------------ +------------------------------------------------------------ + Function array +------------------------------------------------------------ + +Goal Post-condition 'Lt' in 'array': +Assume { (* Goal *) When: i_51+x_0]. +Let x_1 = m_0[v_0]. +Let x_2 = Mint_2[v_0]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 x_2) /\ (is_sint32 x_1). + (* Heap *) + Have: ((region (base u_0))<=0) /\ ((region (base v_0))<=0). + (* Pre-condition (file tests/wp_acsl/reads.i, line 30) in 'g' *) + (* Pre-condition: *) + Have: (P_P Mint_2 u_0 v_0). + (* Pre-condition (file tests/wp_acsl/reads.i, line 31) in 'g' *) + (* Pre-condition: *) + Have: (0<=x_0) /\ (x_0<=10). + (* Pre-condition (file tests/wp_acsl/reads.i, line 32) in 'g' *) + (* Pre-condition: *) + Have: (0<=x_2) /\ (x_2<=10). +} +Prove: (P_P m_0[v_0->1+x_1] u_0 v_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function modifies_x +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,F_OK' in 'modifies_x': +Assume { + (* Domain *) + Type: (is_sint32 x_2). + (* Pre-condition 'H' in 'modifies_x' *) + (* Pre-condition 'H': *) + Have: P_f /\ (P_g x_2) /\ (P_h y_1 x_2) /\ (P_w y_1 x_2). +} +Prove: P_f. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko,G_KO' in 'modifies_x': +Assume { + (* Domain *) + Type: (is_sint32 x_2). + (* Pre-condition 'H' in 'modifies_x' *) + (* Pre-condition 'H': *) + Have: P_f /\ (P_g x_2) /\ (P_h y_1 x_2) /\ (P_w y_1 x_2). +} +Prove: (P_g (1+x_2)). + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko,H_KO' in 'modifies_x': +Assume { + (* Domain *) + Type: (is_sint32 x_2). + (* Pre-condition 'H' in 'modifies_x' *) + (* Pre-condition 'H': *) + Have: P_f /\ (P_g x_2) /\ (P_h y_1 x_2) /\ (P_w y_1 x_2). +} +Prove: (P_h y_1 (1+x_2)). + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,W_OK,todo' in 'modifies_x': +Assume { + (* Domain *) + Type: (is_sint32 x_2). + (* Pre-condition 'H' in 'modifies_x' *) + (* Pre-condition 'H': *) + Have: P_f /\ (P_g x_2) /\ (P_h y_1 x_2) /\ (P_w y_1 x_2). +} +Prove: (P_w y_1 (1+x_2)). + +------------------------------------------------------------ +------------------------------------------------------------ + Function modifies_y +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,F_OK' in 'modifies_y': +Assume { + (* Domain *) + Type: (is_sint32 y_1). + (* Pre-condition 'H' in 'modifies_y' *) + (* Pre-condition 'H': *) + Have: P_f /\ (P_g x_0) /\ (P_h y_1 x_0) /\ (P_w y_1 x_0). +} +Prove: P_f. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,G_OK' in 'modifies_y': +Assume { + (* Domain *) + Type: (is_sint32 y_1). + (* Pre-condition 'H' in 'modifies_y' *) + (* Pre-condition 'H': *) + Have: P_f /\ (P_g x_0) /\ (P_h y_1 x_0) /\ (P_w y_1 x_0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko,H_KO' in 'modifies_y': +Assume { + (* Domain *) + Type: (is_sint32 y_1). + (* Pre-condition 'H' in 'modifies_y' *) + (* Pre-condition 'H': *) + Have: P_f /\ (P_g x_0) /\ (P_h y_1 x_0) /\ (P_w y_1 x_0). +} +Prove: (P_h (1+y_1) x_0). + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,W_OK,todo' in 'modifies_y': +Assume { + (* Domain *) + Type: (is_sint32 y_1). + (* Pre-condition 'H' in 'modifies_y' *) + (* Pre-condition 'H': *) + Have: P_f /\ (P_g x_0) /\ (P_h y_1 x_0) /\ (P_w y_1 x_0). +} +Prove: (P_w (1+y_1) x_0). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/record.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/record.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/record.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/record.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,97 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/record.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Post-condition 'M1,qed_ok' in 'f': +Let x_0 = s2_0.F_T_i. +Assume { + (* Domain *) + Type: (IsS_T s1_0) /\ (IsS_T s2_0) /\ (is_sint32 s1_0.F_T_j) + /\ (is_sint32 x_0) /\ (is_sint32 s2_0.F_T_j). + (* Goal *) + When: (EqS_T s1_0 s2_0). +} +Prove: s1_0.F_T_i=x_0. + +------------------------------------------------------------ + +Goal Post-condition 'M2,qed_ok' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'M3,qed_ok' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'M4,qed_ok' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'M5,qed_ok' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'M6,qed_ok' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'P1,qed_ok' in 'f': +Assume { + (* Domain *) + Type: (IsS_T s2_0) /\ (is_sint32 s2_0.F_T_i) /\ (is_sint32 s2_0.F_T_j). +} +Prove: (EqS_T s2_0 s2_0). + +------------------------------------------------------------ + +Goal Post-condition 'P2,qed_ok' in 'f': +Assume { + (* Domain *) + Type: (IsArray1_sint32 t1_0) /\ (IsArray1_sint32 t2_0). + (* Goal *) + When: forall i_0:int. (0<=i_0) -> (i_0<=9) -> (t1_0[i_0]=t2_0[i_0]). +} +Prove: (EqArray1_int 10 t1_0 t2_0). + +------------------------------------------------------------ + +Goal Post-condition 'P3,qed_ok' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'P4,qed_ok' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'P5,qed_ok' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'KP5,qed_ko' in 'f': +Assume { } +Prove: false. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/sizeof.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/sizeof.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/sizeof.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/sizeof.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/sizeof.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function foo +------------------------------------------------------------ + +Goal Assertion 'A' (file tests/wp_acsl/sizeof.i, line 10): +Assume { } +Prove: not (P_eq 12 9). + +------------------------------------------------------------ + +Goal Assertion 'B' (file tests/wp_acsl/sizeof.i, line 11): +Assume { + (* Assertion 'A' (file tests/wp_acsl/sizeof.i, line 10) *) + (* tests/wp_acsl/sizeof.i:10: Assertion 'A': *) + Have: not (P_eq 12 9). +} +Prove: (P_eq 48 48). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/type_guard.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/type_guard.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/type_guard.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/type_guard.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,22 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/type_guard.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Post-condition 'qed_ok' in 'f': +Assume { (* Domain *) Type: (is_uint8 t_0). } +Prove: (0<=t_0) /\ (t_0<=255). + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'f': +Assume { (* Domain *) Type: (is_uint8 t_0). } +Prove: (0<=t_0) /\ (t_0<=127). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/unit_bit_test.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/unit_bit_test.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/unit_bit_test.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/unit_bit_test.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,44 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/unit_bit_test.c (with preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function rotate_left +------------------------------------------------------------ + +Goal Post-condition 'bit_zero' in 'rotate_left': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'other_bits' in 'rotate_left': +Let x_1 = (lor (lsr x_0 31) (to_uint32 (lsl x_0 1))). +Assume { + (* Domain *) + Type: (is_uint32 x_0) /\ (is_uint32 x_1). + (* Goal *) + When: (0<=i_0) /\ (i_0<=30) /\ (is_sint32 i_0). +} +Prove: (0!=(land x_0 (lsl 1 i_0)))=(0!=(land (lsl 1 (1+i_0)) x_1)). + +------------------------------------------------------------ +------------------------------------------------------------ + Function sum +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'sum': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'ko' in 'sum': +Assume { (* Domain *) Type: (is_sint8 a_0) /\ (is_sint8 b_0). } +Prove: ((bit_test a_0 1) /\ (bit_test b_0 1)) + <-> ((bit_test a_0 1) \/ (bit_test b_0 1)). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/unit_bool.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/unit_bool.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/unit_bool.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/unit_bool.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,15 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/unit_bool.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +------------------------------------------------------------ + Axiomatic 'Foo' +------------------------------------------------------------ + +Lemma f_1: +Assume: 'f_def' +Prove: (L_f 1) + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/unit_compare.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/unit_compare.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/oracle/unit_compare.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/oracle/unit_compare.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,118 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_acsl/unit_compare.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function main +------------------------------------------------------------ + +Goal Pre-condition 'LE_X_Y' in 'main': +Assume { (* Domain *) Type: (is_sint32 x_0) /\ (is_sint32 y_0). } +Prove: x_0<=y_0. + +------------------------------------------------------------ + +Goal Pre-condition 'LE_X1_Y' in 'main': +Assume { (* Domain *) Type: (is_sint32 x_0) /\ (is_sint32 y_0). } +Prove: x_0 t+i < t+j ); + @ ensures Le: ( \forall integer k, integer l; k <= l ==> t+k <= t+l ); + @ ensures Eq: ( \forall integer m, integer n; m == n ==> t+m == t+n ); +*/ +void array (void) { return; } + +/* -------------------------------------------------------------------------- */ +/* --- Testing shift from pointer --- */ +/* -------------------------------------------------------------------------- */ + +/*@ ensures qed_ok: Lt: ( \forall integer i, integer j; i < j ==> p+i < p+j ); + @ ensures qed_ok: Le: ( \forall integer k, integer l; k <= l ==> p+k <= p+l ); + @ ensures qed_ok: Eq: ( \forall integer m, integer n; m == n ==> p+m == p+n ); + @ ensures qed_ok: Eq_0: ( \forall integer n; n == 0 ==> p == p+n ); + @ ensures qed_ok: Eq_0_bis: ( \forall integer n; p+n == p ==> n == 0 ); + @ ensures qed_ko: Le_oracle_ko:(\forall integer i, integer j; i <= j ==> p+i < p+j ); + @ ensures qed_ko: Eq_oracle_ko: ( \forall integer n; p+n == p ==> n == 1 ); +*/ +void pointer (void) { return; } + +/* -------------------------------------------------------------------------- */ +/* --- Testing shift from mixed array and pointers --- */ +/* -------------------------------------------------------------------------- */ + + +/*@ requires \base_addr(p) == \base_addr(t) ; + ensures qed_ok: Lt: p-t > 0 ==> p > (int *) t ; + ensures qed_ok: Le: p-t >= 0 ==> p >= (int *) t ; + ensures qed_ok: Eq: p-t == 0 ==> p == (int *) t ; + ensures qed_ok: Ne: p-t != 0 ==> p != (int *) t ; + ensures qed_ko: Le_oracle_ko: p-t >= 0 ==> p > (int *) t ; + ensures qed_ko: Lt_oracle_ko: p-t > 0 ==> p <= (int *) t ; +*/ + void mixed_array_pointer (int *p) { return; } + +/* -------------------------------------------------------------------------- */ +/* --- Testing pointers comparison, base, and minus --- */ +/* -------------------------------------------------------------------------- */ + +/*@ requires \base_addr(p) == \base_addr(q) ; + ensures qed_ok: Lt: p-q > 0 ==> p > q ; + ensures qed_ok: Le: p-q >= 0 ==> p >= q ; + ensures qed_ok: Eq: p-q == 0 ==> p == q ; + */ +void compare (int * q) { return; } + +/* -------------------------------------------------------------------------- */ +/* --- Testing pointers comparison, base, and minus --- */ +/* -------------------------------------------------------------------------- */ + +/*@ requires \base_addr(p) == \base_addr(t) ; + ensures qed_ko: Base_oracle_ko: p-q > 0 ==> p > q ; // missing base p == base q ! + ensures qed_ko: Comp_oracle_ko: ( \forall integer i, integer j; i <= j ==> t+i >= t+j ); +*/ +void absurd (int * q) { return; } + +/* -------------------------------------------------------------------------- */ +/* --- Testing null --- */ +/* -------------------------------------------------------------------------- */ + +//TODO: fix problem with null (Cf. translate_expr / translate_prop) with Hoare model. +// It is ok with store model. + +/*@ ensures qed_ok: Bool: \result == (p != \null) ; + ensures qed_ok: NotNull: p != \null ==> \result != 0 ; + ensures qed_ok: IsNull: p == \null ==> \result == 0 ; +*/ +int null (int *p) { return p; } diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/range.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/range.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/range.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/range.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,34 @@ +/* run.config_qualif + OPT: -wp -wp-model Typed -wp-par 1 +*/ + +/*@ requires HP: ok: 0 <= i && i <= j && j-i == 10; + assigns p[i..j] ; + ensures P: ok: \valid (p+(i..j)) ; + */ +void val_assigns_p(int * p , int i, int j); + +/*@ requires HQ: ok: 0 <= k && k <= l && l-k == 10; + assigns q[k..l]; + ensures Q: ok: \valid(q+(k..l)) ; + */ +void val_assigns_q(int * q,int k, int l); + +int * r; + +/*@ + requires H1 : a <=b && 0 <= a && b-a == 10; + requires H2 : c <=d && 0 <= c && d-c == 10; + ensures P1 : ok: + 0 <= a && b < 10 && 10 <= c && d < 20 ==> + \valid(r+(a..d)) && \separated (r+(a..b) , r+(c..d)) ; + ensures P2 : ok: + 0 <= c && d < 10 && 10 <= a && b < 20 ==> + \valid(r+(c..b)) && \separated (r+(a..b) , r+(c..d)) ; +*/ + +void test (int a, int b , int c, int d) +{ + val_assigns_p(r,a,b) ; + val_assigns_q(r,c,d) ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/reads.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/reads.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/reads.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/reads.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,65 @@ +/* run.config + OPT: -wp-model Typed +*/ + +/* run.config_qualif + OPT: -wp -wp-model Typed -wp-par 1 -wp-prop="-qed_ko,-ko" + OPT: -wp -wp-model Typed -wp-par 1 -wp-prop="qed_ko,ko" -wp-timeout 2 +*/ + +// Test for implicit variables + +int x ; +int y ; +int *u ; +int *v ; + +/*@ axiomatic A { + @ predicate P(int *p,int *q)= *p <= *q ; + @ predicate Q= x <= y ; + @ } + @ */ + +/*@ requires Q ; + @ requires 0<=x<=10 ; + @ requires 0<=y<=10 ; + @ ensures qed_ok: Q ; + @ */ +void f(void) { x++; y++; } + +/*@ requires P(u,v) ; + @ requires 0<=*u<=10 ; + @ requires 0<=*v<=10 ; + @ ensures qed_ok: P(u,v) ; + @ */ +void g(void) { (*u)++; (*v)++; } + +/*@ axiomatic S { + @ predicate f{L} reads \nothing ; + @ predicate g{L} reads x ; + @ predicate h{L} reads x,y ; + @ predicate w{L} ; + @ } + @*/ + +/*@ requires H: f && g && h && w ; + @ ensures qed_ok: F_OK: f ; + @ ensures qed_ok: G_OK: g ; + @ ensures qed_ko: H_KO: h ; + @ ensures qed_ok: W_OK: todo: w ; + @ */ +void modifies_y () +{ + y++ ; +} + +/*@ requires H: f && g && h && w ; + @ ensures qed_ok: F_OK: f ; + @ ensures qed_ko: G_KO: g ; + @ ensures qed_ko: H_KO: h ; + @ ensures qed_ok: W_OK: todo: w ; + @ */ +void modifies_x () +{ + x++ ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/record.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/record.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/record.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/record.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,46 @@ +/* run.config_qualif + OPT: -wp -wp-model Typed -wp-par 1 -wp-prop="-qed_ko,-ko" + OPT: -wp -wp-model Typed -wp-par 1 -wp-prop="qed_ko,ko" -wp-timeout 2 +*/ + +struct T { + int i ; + int j; +}; +struct T s1, s2; + +int t1[10]; +int t2[10]; + + +struct St { + struct T st; +}s,u; + +struct St2 { + struct St stt; +} st1,st2; + + +struct T1 { + int i ; + int j ; + int q ; +}s3,s4; + +/*@ + ensures M1: qed_ok: \forall integer i; s1.i == i && s1 == s2 ==> s2.i == i ; + ensures M2: qed_ok: {s1 \with .i = (int)3}.i == 3 ; + ensures M3: qed_ok: {s1 \with .i = (int)3}.j == s1.j ; + ensures M4: qed_ok: {{s3 \with .i = (int)3} \with .j = (int) 4}.q == s3.q; + ensures M5: qed_ok: {{s3 \with .i = (int)3} \with .j = (int) 4}.i == 3; + ensures M6: qed_ok: {{s3 \with .i = (int)3} \with .j = (int) 4}.j == 4; + ensures P1: qed_ok: {{s1 \with .i = s2.i}\with .j = s2.j} == s2 ; + ensures P2: qed_ok: (\forall integer i; 0 <= i < 10 ==> t1[i] == t2[i]) ==> t1==t2; + ensures P3: qed_ok: ({st1 \with .stt.st.i = (int)3}).stt.st.i == 3; + ensures P4: qed_ok: ({{st1 \with .stt.st.i = (int)3}\with .stt.st.j = (int)4}).stt.st.i == 3; + ensures P5: qed_ok: ({st1 \with .stt={ \with .st.i = (int)3 , .st.j = (int)4}}).stt.st.i == 3; + + ensures KP5: qed_ko: ({st1 \with .stt={ \with .st.i = (int)3 , .st.j = (int)4}}).stt.st.i == 4; +*/ +void f (void) { return; } diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/sizeof.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/sizeof.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/sizeof.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/sizeof.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,13 @@ +struct S { int x; char c; int y; } ; // There is some padding here ! + +struct S a ; +struct S b[4] ; + +/*@ predicate eq(integer a,integer b) = (a==b) ; */ + +void foo(void) +{ + /*@ assert A: !eq( sizeof(a) , 2 * sizeof(int) + sizeof(char) ); */ + /*@ assert B: eq( sizeof(b) , 4 * sizeof(a) ); */ +} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/type_guard.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/type_guard.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/type_guard.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/type_guard.i 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,8 @@ +/* run.config_qualif + OPT: -wp -wp-model Typed -wp-par 1 -wp-prop="-qed_ko,-ko" + OPT: -wp -wp-model Typed -wp-par 1 -wp-prop="qed_ko,ko" -wp-timeout 2 +*/ + +/*@ ensures qed_ok: 0<=t<256 ; + @ ensures qed_ko: 0<=t<128 ; */ +void f(unsigned char t) {return;} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/unit_bit_test.c frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/unit_bit_test.c --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/unit_bit_test.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/unit_bit_test.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,27 @@ +/* run.config + STDOPT: +"-pp-annot" +*/ + +/* run.config_qualif + STDOPT: +"-pp-annot" +*/ + +#define ST(a) (((a)&2)!=0) + +/*@ + ensures ok: ST(\result) <==> ST(a) || ST(b) ; + ensures ko: ST(\result) <==> ST(a) && ST(b) ; +*/ +char sum( char a , char b ) +{ return a|b; } + +#define BIT_TEST(x,n) (((x)&(1<<(n)))!=0) +/*@ ensures bit_zero: + BIT_TEST(\result,0) == BIT_TEST(x,31); + @ ensures other_bits: + \forall int k ; 0 <= k && k < 31 + ==> ( BIT_TEST(\result,1+k) <==> BIT_TEST(x,k)); + */ +unsigned rotate_left (unsigned x) { + return (x << 1) | (x >> 31); +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/unit_bool.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/unit_bool.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/unit_bool.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/unit_bool.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,8 @@ +/*@ axiomatic Foo { + + logic boolean f(integer x); + axiom f_def: \forall integer x; f(x) == \true <==> (\forall integer y; y < x ==> y < 1) ; + + lemma f_1: f(1); + + }*/ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/unit_compare.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/unit_compare.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/unit_compare.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/unit_compare.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,27 @@ +/* run.config_qualif + DONTRUN: only syntactic check. +*/ + + +/*@ + requires LE_X_Y : x <= y ; + requires LE_X1_Y : x+1 <= y ; + requires LE_X_Y1 : x <= y+1 ; + requires LE_X1_Y1 : x+1 <= y+1 ; + requires LE_Xm1_Y : x-1 <= y ; + requires LE_X_Ym1 : x <= y-1 ; + requires LE_Xm1_Ym1 : x-1 <= y-1 ; + requires LE_X1_Ym1 : x+1 <= y-1 ; + requires LE_Xm1_Y1 : x-1 <= y+1 ; + requires LT_X_Y : x < y ; + requires LT_X1_Y : x+1 < y ; + requires LT_X_Y1 : x < y+1 ; + requires LT_X1_Y1 : x+1 < y+1 ; + requires LT_Xm1_Y : x-1 < y ; + requires LT_X_Ym1 : x < y-1 ; + requires LT_Xm1_Ym1 : x-1 < y-1 ; + requires LT_X1_Ym1 : x+1 < y-1 ; + requires LT_Xm1_Y1 : x-1 < y+1 ; +*/ + +void main(int x,int y) {} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/user_def_type_guard.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/user_def_type_guard.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_acsl/user_def_type_guard.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_acsl/user_def_type_guard.i 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,14 @@ +/* run.config_qualif + OPT: -wp -wp-model Typed -wp-par 1 -wp-prop="-qed_ko,-ko" + OPT: -wp -wp-model Typed -wp-par 1 -wp-prop="qed_ko,ko" -wp-timeout 2 +*/ + +/*@ axiomatic S { + logic unsigned char t; + } + */ + +/*@ ensures qed_ok: 0<=t<256 ; + @ ensures qed_ko: 0<=t<128 ; */ +void f(void) {return;} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts0708.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts0708.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts0708.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts0708.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,20 @@ +/* run.config_qualif + OPT: -wp -wp-prop A -then -wp-prop B +*/ + +/* -------------------------------------------------------------------------- */ +/* - Testing that definition of P is correctly generated for both WP rounds - */ +/* -------------------------------------------------------------------------- */ + +//@ predicate P(integer x) = 0 < x ; + +int x,a,b ; + +/*@ requires P(x) ; + @ ensures A: P(a) ; + @ ensures B: P(b) ; +*/ +void f(void) { + a = x+1 ; + b = x+2 ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts0843.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts0843.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts0843.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts0843.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,16 @@ +/* run.config_qualif + OPT: -wp -wp-par 1 +*/ + +/* Incorrect translation of logic constant. + Runtime needs a memory for creating C-variable location, which leads to + dummy memory state in constant definition of [&p]. */ + +typedef struct { int a; } las; +las * p; +//@ logic las** p_ref = &p; +/*@ requires \valid(p); assigns p->a; */ +void f3() { p->a = 7; } +/*@ requires \valid(p); assigns (*p_ref)->a; */ +void g3() +{ f3(); } diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_0896.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_0896.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_0896.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_0896.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,22 @@ +/* run.config_qualif + DONTRUN: (config_qualif) useless +*/ + +/* run.config_qed + DONTRUN: (config_qed) see config_qed +*/ + +// Checks that the axiom "ax{L}" is defined only once. + +extern int tab[5], x; + +//@ axiomatic A { axiom ax: 10 < \block_length(tab); } + +//@ assigns x; +extern void h(void); + +//@ requires r2: x==0; assigns x; +void g() { h(); } + +//@ requires r1: x==0; +void f(void) { g(); } diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1020.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1020.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1020.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1020.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,53 @@ +/* run.config + OPT: -wp-invariants +*/ + +/* run.config_qualif + DONTRUN: (config_qualif) useless +*/ + +//@ predicate I(integer x) ; +//@ predicate A(integer x) ; +//@ predicate R(integer x) ; +//@ predicate E(integer x, integer y) ; + +int i; +/*@ requires R:R(i) ; + @ assigns Loc:i; + @ ensures E:E(i,\old(i)); +*/ +void g(void); + +void f1 (void) { + //@ loop assigns loc:i; + while (i < 10){ + //@ invariant I:I(i); + g() ; + } +} +void f2 (void) { + //@ loop assigns loc:i; + while (i < 10){ + g() ; + //@ invariant T:I(i); + } +} + + +void f3 (void) { + //@ loop assigns loc:i; + while (i < 10) { + //@ invariant I:I(i); + //@ assert A:A(i); + i = i+1 ; + } +} + +void f4 (void) { + //@ loop assigns loc:i; + while (i < 10) { + //@ assert A:A(i); + i = i+1 ; + //@ invariant I:I(i); + } +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1174.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1174.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1174.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1174.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,13 @@ +/* run.config_qualif + OPT: -wp -wp-proof coq -wp-script tests/wp_bts/bts_1174.s +*/ + +/*@ requires -10. <= x && x <= 10.; */ +void job(int a,double x) +{ + double y; + if (a) { + y = x * 2.; + /*@ assert qed_ok: x >= 0. ==> y >= 0.; */ ; } + return; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1174.s frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1174.s --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1174.s 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1174.s 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,25 @@ +(* Generated by Frama-C WP *) + +Goal store_job_assert_qed_ok. +Hint job,property,qed_ok. +Proof. + intros. + Require Import Fourier. + fourier. +Qed. + +Goal store_main_assert_qed_ok. +Hint main,property,qed_ok. +Proof. + intros. + Require Import Fourier. + fourier. +Qed. + +Goal store_main_pre. +Hint default,main,property. +Proof. +(* auto with zarith. *) +Qed. + + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1176.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1176.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1176.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1176.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,19 @@ +/* run.config_qualif + OPT: -wp -wp-par 1 -wp-timeout 2 +*/ + +typedef struct las { double a; double b; } las; + +/*@ +assigns \nothing; +ensures \result>=x; +*/ +double g(double x); + + +void f(las * p) +{ + p->a = g(p->b); + //@ assert qed_ok: p->a>=p->b; +} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1360.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1360.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1360.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1360.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,31 @@ +/* run.config + OPT: -wp-rte +*/ + +/* run.config_qualif + OPT: -wp -wp-par 1 -wp-rte +*/ + +/* The RTE '*_mem_access_3' obligation should fail in Function 'foo_wrong' */ + +/*@ requires \valid_read(a) && \valid_read(b) ; + requires \separated(a,b); + ensures *a == \old(*a & *b) ; + assigns *a ; +*/ +void foo_wrong(int * a,int *b) +{ + int tmp = *a & *b ; + *a = tmp ; /* ARG ! */ +} + +/*@ requires \valid(a) && \valid_read(b) ; + requires \separated(a,b); + ensures *a == \old(*a & *b) ; + assigns *a ; +*/ +void foo_correct(int * a,int *b) +{ + int tmp = *a & *b ; + *a = tmp ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1382.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1382.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1382.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1382.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,21 @@ +/* run.config_qualif + DONTRUN: nothing to prove +*/ + +//@ assigns *((char*)dst+(0..size-1)) \from *((char*)src+(0..size-1)); +void copy(void* dst, const void* src, unsigned int size); + +//@ assigns *p; +void f(unsigned char *p) ; + +int dest, src; +void loop (void) { + int i ; + i=0 ; + //@ loop assigns i, dest; + while (i<100) { + f(&dest); + copy(&dest, &src, sizeof(dest)); + i++; + } +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1462.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1462.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1462.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1462.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,33 @@ + +void wrong(int c) { + int x = 0; + int y = 0; + /*@ assert for_value: c<= 0 || c == 1 || c>=2; */ + if (c==2) { x=1; y=1; } + L: + /*@ + loop invariant A_KO: \at(x==0,L) ==> i!=0 ==> y == 0; + loop invariant B: \at(x==1,L) ==> i!=0 ==> x == 1; + loop invariant C: \at(c==0,Pre) ==> i==0 ==> x == 0; + loop assigns i,x,y; + */ + for (int i = 0; i<10; i++) { + if (c == 0) { x = 0; } + if (c == 1) { y = 1; } + if (c == 2) { x = 1; } + } + if (c==1) { /*@ assert consequence_of_false_invariant: y==0; */ } +} + + +void local (void) +{ + int y; + /*@ loop invariant \valid(&y); loop assigns y; */ + for(;;) + { + int x; + x++; + y++; + } +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1586.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1586.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1586.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1586.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,54 @@ + +/*@ behavior Bizarre: + assumes x; + ensures TRANS: x ==> \result==1 ; + */ +int compute_bizarre(int x) +{ + if (x) + return 1; + else + return 2; +} + +/*@ behavior Normal: + assumes x; + ensures TRANS: x <==> \result==1 ; + */ +int compute_normal(int x) +{ + if (x) + return 1; + else + return 2; +} + +int main_bizarre_KO(int x) +{ + int trans = compute_bizarre(x); + + switch(trans) { + case 0: + //@ assert FALSE: \false; + return -1; + break; + default: + return -1; + break; + } +} + +int main_normal_KO(int x) +{ + int trans = compute_normal(x); + + switch(trans) { + case 0: + //@ assert FALSE: \false; + return -1; + break; + default: + return -1; + break; + } +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1588.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1588.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1588.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1588.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,23 @@ +void f (int n, int *d ) { + int i = 0, z = 0; + + //@ loop invariant l1_2: d == \at(d,Pre) + i; + while (i < n) + { + ; + //@ assert a1: d == \at(d,Pre) + i; + ; + ; + ; + ; + ; + i++; + d++; + z++; + } + + while (z != 0) { + z--; + } +} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1601.c frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1601.c --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1601.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1601.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,159 @@ +typedef unsigned char BOOL; +#define TRUE 1 +#define FALSE 0 + +typedef unsigned char uint8; +typedef unsigned short int uint16; +typedef unsigned long uint32; + +uint16 F_MIN_R = 15; + +const uint8 RESP_STATE = 30; + + +typedef enum +{ + RESP_MODE, + SS_A_MODE +}tenumMode; + +tenumMode tenumRMode; + + +BOOL gbCaMStatus; +BOOL gbCaaStatus; +uint8 mnPb; +BOOL mbApLYRange; +float gfApYLineSlope; +float gfApYLineConst; +float gfApRLineSlope; +float gfApRLineConst; +float mfAp; +uint16 almC; +uint16 nApLYL = 0; +uint16 nApLRL = 0; +uint16 Ap_Y_L_Ui = 0; +uint16 Ap_R_L_Ui = 0; +float fCaValue=0.0; +float fRrValue = 0.0; +uint16 nCaLYL=0; +uint16 nCaLRL=0; + + +/*@ + @ behavior basic: + @ assumes fRrValue == 0; + @ ensures tenumRMode == SS_A_MODE; + @ +*/ + +void foo() +{ + + float mfNewAp = 0; + BOOL bYAp = FALSE; + BOOL bRAp = FALSE; + BOOL bApAlmC = FALSE; + + if (fRrValue != 0) + { + /* Some code here */ + } + else + { + if (mnPb == 1) + { + mfAp = RESP_STATE; + mnPb = 2; + } + + tenumRMode = SS_A_MODE; + } + //@ assert fRrValue == 0.0 ==> tenumRMode == SS_A_MODE; + + if ( (mfAp >= F_MIN_R) && + ((gbCaMStatus == TRUE) && (gbCaaStatus == FALSE)) ) + { + bApAlmC = TRUE; + almC = 1; + } + else + { + almC = 0; + } + //@ assert fRrValue == 0.0 ==> tenumRMode == SS_A_MODE; + + + if ( (bApAlmC == TRUE) + && (mfAp < nApLYL) + && (fCaValue >= nCaLYL) ) + { + float fmultval = 0; + + fmultval = gfApYLineSlope*fCaValue; + + mfNewAp = fmultval + gfApYLineConst; + + if (mfAp >= mfNewAp) + bYAp = TRUE; + else + bYAp = FALSE; + + Ap_Y_L_Ui = (uint16)mfNewAp; + } + //@ assert fRrValue == 0.0 ==> tenumRMode == SS_A_MODE; + + + if ((bApAlmC == TRUE) && (fCaValue > (float)nCaLYL)) + { + mfNewAp = ((gfApYLineSlope*fCaValue) + gfApYLineConst); + if (mfNewAp < (float)nApLYL); + Ap_Y_L_Ui = (uint16)mfNewAp; + } + + else if ((bApAlmC == TRUE) && (fCaValue <= (float)nCaLYL)) + Ap_Y_L_Ui = F_MIN_R; + + if ( (bApAlmC == TRUE) && (fCaValue >= nCaLRL) ) + { + float fmultval = 0; + + fmultval = gfApRLineSlope*fCaValue; + + mfNewAp = fmultval + gfApRLineConst; + + + if (mfAp >= mfNewAp) + bRAp = TRUE; + else + bRAp = FALSE; + + Ap_R_L_Ui = (uint16)mfNewAp; + } + else if ( (bApAlmC == TRUE) && (fCaValue < nCaLRL) ) + Ap_R_L_Ui = F_MIN_R; + + //@ assert fRrValue == 0.0 ==> tenumRMode == SS_A_MODE; + if ( (mfAp >= nApLYL) + || ((bApAlmC == TRUE) && (fCaValue < nCaLYL)) + || ((bYAp == TRUE) + && (gbCaMStatus == TRUE) && (gbCaaStatus == FALSE) ) ) + { + mbApLYRange = TRUE; + } + else + mbApLYRange = FALSE; + + //@ assert fRrValue == 0.0 ==> tenumRMode == SS_A_MODE; + if ( (mfAp >= nApLRL) + || ((bApAlmC == TRUE) && (fCaValue < nCaLRL)) + || ((bRAp == TRUE) + && (gbCaMStatus == TRUE) && (gbCaaStatus == FALSE) ) ) + { + //@ assert fRrValue == 0.0 ==> tenumRMode == SS_A_MODE; + + } + + //@ assert fRrValue == 0.0 ==> tenumRMode == SS_A_MODE; +} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1647.c frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1647.c --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1647.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1647.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +/* run.config_qualif + DONTRUN: +*/ + +#define NULL ((void *) 0L) + + /*@ + ensures e1: \result == \null; + ensures e2: \result == 0; + ensures e3: \result == (int *) \null; + ensures e4: \result == (int *) 0; + ensures e5: \result == (int *)((void *)0); +*/ +int * f (void) { + return NULL; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1776.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1776.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1776.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1776.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +/* run.config_qualif + DONTRUN: (nothing to prove) +*/ + +int X,Y; + +void g (void) { + X ++; +} + +void f (int x, int y) { + if (x > X) { + g (); + //@ assert KO: ax2: x > X ; + } +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1789.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1789.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1789.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1789.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,12 @@ +/* run.config_qualif + DONTRUN: +*/ + +int *var_ptr; + +//@ logic int *the_var = var_ptr; +//@ assigns the_var; +void function(){ + var_ptr = 0L; +} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1828.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1828.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts_1828.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts_1828.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,21 @@ +/* run.config_qualif + OPT: + OPT: -wp-model "+ref" + */ + +//@ requires \valid(one); +void f(int *one){ + int two; + //@ assert ok: one != &two; +} + +int *zero; +//@ requires \valid(zero) && \valid(one); +void frame(int *one, int arg){ + int two; + //@ assert ok: formal: \separated(one,&arg,&two); + //@ assert ok: global: \separated(zero,&arg,&two); + + // zero and one may overlaps, so next property isn't true. + //@ assert ko: \separated(zero,one); +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts779.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts779.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts779.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts779.i 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,8 @@ +/* run.config_qualif + OPT: -wp -wp-par 1 -wp-rte +*/ + +void f(unsigned char *t) { +//@ assert t[0] < 256; + t[1]=3; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts788.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts788.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts788.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts788.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,15 @@ +/* run.config + OPT: -wp-model +ref +*/ + +/* run.config_qualif + OPT: -wp -wp-proof alt-ergo -wp-par 1 -wp-model +ref +*/ + +int t20[20] = {3} ; + +/*@ ensures I0: t20[0]==3 ; + @ ensures I1: t20[1]==0 ; + @ ensures I2: t20[2]==0 ; +*/ +void main (void) {return; } diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts986.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts986.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/bts986.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/bts986.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,14 @@ +/* run.config_qualif + OPT: -wp -wp-par 1 -wp-timeout 2 +*/ + +void f (void) +{ + int * p ; + { + int x ; + p = &x ; + } + //@ assert A:!\valid(p); +} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/nupw-bcl-bts1120.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/nupw-bcl-bts1120.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/nupw-bcl-bts1120.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/nupw-bcl-bts1120.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,66 @@ +/* run.config_qualif + OPT: -wp -wp-par 1 -wp-fct "g,unreachable_smt_with_contract" +*/ + +/*@ axiomatic ax { + @ predicate ExitF(integer x); + @ predicate ExitP(integer x); + @ predicate Exit1(integer x); + + @ predicate PostF(integer x); + @ predicate PostP(integer x); + @ predicate Post1(integer x); + + @ predicate P(integer x); + + @ predicate PreF(integer x); + @ predicate Pre(integer x); + @ predicate Pre1(integer x); +} */ + +//@ assigns \nothing; ensures PostF(x); exits ExitF(x) ; +int f(int x); + +// corrected. +//@ requires ExitF(max) ==> ExitP(max); assigns \nothing; exits ok:ExitP(max); +void g (int max) { + int tmp = f(max); + //@ loop assigns ok:tmp; + while (tmp<=max) { + tmp ++; + } +} + +//@ requires ok: x > 0 ; assigns \nothing; +extern int f_with_precond (int x); + +// corrected. +//@ requires PostP(max); ensures ok: PostP(max); +void unreachable_smt_with_contract (int max) { + int tmp = f_with_precond(1); + goto L; + //@ requires ok: Pre1(max); assigns ok: tmp; ensures ok: Post1(max); exits ok: Exit1(max); + tmp = f_with_precond(-2); + //@ assert ok: P(tmp); + tmp=3; + L:; +} + +//@ assigns \nothing; exits never: \false; +int f_no_exit(int) ; + +// corrected in stronger the PO (e1 is forgotten and is not provable *) +//@ exits e:ExitP(0); +int cfg_domination_problem (int max) { + int tmp=1; + if (max) { + tmp=f_no_exit(tmp); + goto L; + } + //@ assigns tmp; exits e1:ExitP(max); + { + tmp=f(max); + L: tmp=3; + } + return tmp; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts0708.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts0708.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts0708.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts0708.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,36 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts0708.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Post-condition 'A' in 'f': +Let x_1 = 1+x_0. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 x_1). + (* Pre-condition (file tests/wp_bts/bts0708.i, line 13) in 'f' *) + (* Pre-condition: *) + Have: (P_P x_0). +} +Prove: (P_P x_1). + +------------------------------------------------------------ + +Goal Post-condition 'B' in 'f': +Let x_1 = 2+x_0. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 x_1). + (* Pre-condition (file tests/wp_bts/bts0708.i, line 13) in 'f' *) + (* Pre-condition: *) + Have: (P_P x_0). +} +Prove: (P_P x_1). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts0843.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts0843.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts0843.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts0843.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,76 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts0843.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f3 +------------------------------------------------------------ + +Goal Assigns (file tests/wp_bts/bts0843.i, line 12) in 'f3': +Effect at line 13 +Let a_0 = Mptr_0[(shift_PTR (global G_p_67) 0)]. +Assume { + (* Goal *) + When: (valid_rd Malloc_0 (shiftfield_F___anonstruct_las_1_a a_0) 1). + (* Heap *) + Have: (framed Mptr_0) /\ (linked Malloc_0). + (* Pre-condition (file tests/wp_bts/bts0843.i, line 12) in 'f3' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_0 1). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function g3 +------------------------------------------------------------ + +Goal Assigns (file tests/wp_bts/bts0843.i, line 14) in 'g3': +Call Effect at line 16 +Let a_0 = Mptr_0[(shift_PTR (global G_p_67) 0)]. +Let a_1 = (shiftfield_F___anonstruct_las_1_a a_0). +Assume { + (* Goal *) + When: (valid_rd Malloc_0 a_1 1). + (* Heap *) + Have: (framed Mptr_0) /\ (linked Malloc_0). + (* Pre-condition (file tests/wp_bts/bts0843.i, line 14) in 'g3' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_0 1). +} +Prove: (shiftfield_F___anonstruct_las_1_a Mptr_0[L_p_ref])=a_1. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_bts/bts0843.i, line 14) in 'g3': +Call Effect at line 16 +Let a_0 = Mptr_0[(shift_PTR (global G_p_67) 0)]. +Let a_1 = (shiftfield_F___anonstruct_las_1_a a_0). +Assume { + (* Goal *) + When: (valid_rd Malloc_0 a_1 1). + (* Heap *) + Have: (framed Mptr_0) /\ (linked Malloc_0). + (* Pre-condition (file tests/wp_bts/bts0843.i, line 14) in 'g3' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_0 1). +} +Prove: (shiftfield_F___anonstruct_las_1_a Mptr_0[L_p_ref])=a_1. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_bts/bts0843.i, line 12) in 'f3'' in 'g3' at call 'f3' (file tests/wp_bts/bts0843.i, line 16) +: +Assume { + (* Heap *) + Have: (framed Mptr_2) /\ (linked Malloc_0). + (* Pre-condition (file tests/wp_bts/bts0843.i, line 14) in 'g3' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 Mptr_2[(shift_PTR (global G_p_67) 0)] 1). +} +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts_0896.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts_0896.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts_0896.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts_0896.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,32 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts_0896.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Instance of 'Pre-condition 'r2' in 'g'' in 'f' at call 'g' (file tests/wp_bts/bts_0896.i, line 22) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function g +------------------------------------------------------------ + +Goal Assigns (file tests/wp_bts/bts_0896.i, line 18) in 'g': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_bts/bts_0896.i, line 18) in 'g': +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts_1020.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts_1020.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts_1020.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts_1020.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,162 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts_1020.i (no preprocessing) +tests/wp_bts/bts_1020.i:9:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +tests/wp_bts/bts_1020.i:10:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +tests/wp_bts/bts_1020.i:11:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +tests/wp_bts/bts_1020.i:12:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f1 +------------------------------------------------------------ + +Goal Invariant 'I' (file tests/wp_bts/bts_1020.i, line 24): +Assume { + (* Domain *) + Type: (is_sint32 i_0). + (* tests/wp_bts/bts_1020.i:23: Then *) + Have: i_0<=9. + (* Invariant 'I' (file tests/wp_bts/bts_1020.i, line 24) *) + (* tests/wp_bts/bts_1020.i:24: Invariant 'I': *) + Have: (P_I i_0). + (* tests/wp_bts/bts_1020.i:25: Call 'g' *) + Have: (P_R i_0) /\ (P_E i_0 i_0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns 'loc': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition 'R' in 'g'' in 'f1' at call 'g' (file tests/wp_bts/bts_1020.i, line 25) +: +Assume { + (* Domain *) + Type: (is_sint32 i_3). + (* tests/wp_bts/bts_1020.i:23: Then *) + Have: i_3<=9. + (* Invariant 'I' (file tests/wp_bts/bts_1020.i, line 24) *) + (* tests/wp_bts/bts_1020.i:24: Invariant 'I': *) + Have: (P_I i_3). +} +Prove: (P_R i_3). + +------------------------------------------------------------ +------------------------------------------------------------ + Function f2 +------------------------------------------------------------ + +Goal Invariant 'T' (file tests/wp_bts/bts_1020.i, line 32): +Assume { + (* Domain *) + Type: (is_sint32 i_0). + (* tests/wp_bts/bts_1020.i:30: Then *) + Have: i_0<=9. + (* tests/wp_bts/bts_1020.i:31: Call 'g' *) + Have: (P_R i_0) /\ (P_E i_0 i_0). + (* Invariant 'T' (file tests/wp_bts/bts_1020.i, line 32) *) + (* tests/wp_bts/bts_1020.i:32: Invariant 'T': *) + Have: (P_I i_0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns 'loc': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition 'R' in 'g'' in 'f2' at call 'g' (file tests/wp_bts/bts_1020.i, line 31) +: +Assume { + (* Domain *) + Type: (is_sint32 i_3). + (* tests/wp_bts/bts_1020.i:30: Then *) + Have: i_3<=9. + (* tests/wp_bts/bts_1020.i:31: Call 'g' *) + Have: (P_R i_3) /\ (P_E i_3 i_3). + (* Invariant 'T' (file tests/wp_bts/bts_1020.i, line 32) *) + (* tests/wp_bts/bts_1020.i:32: Invariant 'T': *) + Have: (P_I i_3). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function f3 +------------------------------------------------------------ + +Goal Invariant 'I' (file tests/wp_bts/bts_1020.i, line 40): +Assume { + (* Domain *) + Type: (is_sint32 i_0). + (* tests/wp_bts/bts_1020.i:39: Then *) + Have: i_0<=9. +} +Prove: (P_I i_0). + +------------------------------------------------------------ + +Goal Assertion 'A' (file tests/wp_bts/bts_1020.i, line 41): +Assume { + (* Domain *) + Type: (is_sint32 i_1). + (* tests/wp_bts/bts_1020.i:39: Then *) + Have: i_1<=9. + (* Invariant 'I' (file tests/wp_bts/bts_1020.i, line 40) *) + (* tests/wp_bts/bts_1020.i:40: Invariant 'I': *) + Have: (P_I i_1). +} +Prove: (P_A i_1). + +------------------------------------------------------------ + +Goal Loop assigns 'loc': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function f4 +------------------------------------------------------------ + +Goal Assertion 'A' (file tests/wp_bts/bts_1020.i, line 49): +Assume { + (* Domain *) + Type: (is_sint32 i_1). + (* tests/wp_bts/bts_1020.i:48: Then *) + Have: i_1<=9. +} +Prove: (P_A i_1). + +------------------------------------------------------------ + +Goal Invariant 'I' (file tests/wp_bts/bts_1020.i, line 51): +Let x_0 = 1+i_1. +Assume { + (* Domain *) + Type: (is_sint32 i_1) /\ (is_sint32 x_0). + (* tests/wp_bts/bts_1020.i:48: Then *) + Have: i_1<=9. + (* Assertion 'A' (file tests/wp_bts/bts_1020.i, line 49) *) + (* tests/wp_bts/bts_1020.i:49: Assertion 'A': *) + Have: (P_A i_1). +} +Prove: (P_I x_0). + +------------------------------------------------------------ + +Goal Loop assigns 'loc': +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts_1174.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts_1174.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts_1174.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts_1174.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts_1174.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function job +------------------------------------------------------------ + +Goal Assertion 'qed_ok' (file tests/wp_bts/bts_1174.i, line 11): +Let r_0 = 2.*x_0. +Assume { + (* Domain *) + Type: (is_float64 x_0) /\ (is_sint32 a_0) /\ (is_float64 r_0). + (* Goal *) + When: 0<=x_0. + (* Pre-condition (file tests/wp_bts/bts_1174.i, line 5) in 'job' *) + (* Pre-condition: *) + Have: (-10.<=x_0) /\ (x_0<=10.). + (* tests/wp_bts/bts_1174.i:9: Then *) + Have: 0!=a_0. +} +Prove: 0<=r_0. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts_1176.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts_1176.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts_1176.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts_1176.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,24 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts_1176.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Assertion 'qed_ok' (file tests/wp_bts/bts_1176.i, line 17): +Let r_0 = Mflt_2[(shiftfield_F_las_b p_0)]. +Assume { + (* Domain *) + Type: (is_float64 v_0) /\ (is_float64 r_0). + (* Heap *) + Have: (region (base p_0))<=0. + (* tests/wp_bts/bts_1176.i:16: Call 'g' *) + Have: r_0<=v_0. +} +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts_1360.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts_1360.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts_1360.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts_1360.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,277 @@ +# frama-c -wp -wp-rte [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts_1360.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[rte] annotating function foo_correct +[rte] annotating function foo_wrong +------------------------------------------------------------ + Function foo_correct +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_bts/bts_1360.i, line 24) in 'foo_correct': +Let x_0 = Mint_0[a_0]. +Let x_1 = Mint_0[b_0]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 x_1) /\ (is_sint32 (land x_0 x_1)). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 22) in 'foo_correct' *) + (* Pre-condition: *) + Have: (valid_rd Malloc_0 b_0 1) /\ (valid_rw Malloc_0 a_0 1). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 23) in 'foo_correct' *) + (* Pre-condition: *) + Have: a_0!=b_0. + (* Assertion 'rte,mem_access' (file tests/wp_bts/bts_1360.i, line 29) *) + (* tests/wp_bts/bts_1360.i:29: Assertion 'rte,mem_access': *) + Have: (valid_rd Malloc_0 a_0 1). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'rte,mem_access' (file tests/wp_bts/bts_1360.i, line 29): +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[a_2]) /\ (is_sint32 Mint_0[b_0]) + /\ (is_sint32 Mint_1[a_2]) /\ (is_sint32 Mint_2[a_2]) + /\ (is_sint32 Mint_2[b_0]). + (* Heap *) + Have: (linked Malloc_1) /\ ((region (base a_2))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 22) in 'foo_correct' *) + (* Pre-condition: *) + Have: (valid_rd Malloc_1 b_0 1) /\ (valid_rw Malloc_1 a_2 1). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 23) in 'foo_correct' *) + (* Pre-condition: *) + Have: a_2!=b_0. +} +Prove: (valid_rd Malloc_1 a_2 1). + +------------------------------------------------------------ + +Goal Assertion 'rte,mem_access' (file tests/wp_bts/bts_1360.i, line 29): +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[a_0]) /\ (is_sint32 Mint_0[b_1]) + /\ (is_sint32 Mint_1[a_0]) /\ (is_sint32 Mint_2[a_0]) + /\ (is_sint32 Mint_2[b_1]). + (* Heap *) + Have: (linked Malloc_1) /\ ((region (base a_0))<=0) + /\ ((region (base b_1))<=0). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 22) in 'foo_correct' *) + (* Pre-condition: *) + Have: (valid_rd Malloc_1 b_1 1) /\ (valid_rw Malloc_1 a_0 1). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 23) in 'foo_correct' *) + (* Pre-condition: *) + Have: a_0!=b_1. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'rte,mem_access' (file tests/wp_bts/bts_1360.i, line 30): +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[a_2]) /\ (is_sint32 Mint_0[b_0]) + /\ (is_sint32 Mint_1[a_2]) /\ (is_sint32 Mint_2[a_2]) + /\ (is_sint32 Mint_2[b_0]). + (* Heap *) + Have: (linked Malloc_1) /\ ((region (base a_2))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 22) in 'foo_correct' *) + (* Pre-condition: *) + Have: (valid_rd Malloc_1 b_0 1) /\ (valid_rw Malloc_1 a_2 1). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 23) in 'foo_correct' *) + (* Pre-condition: *) + Have: a_2!=b_0. + (* Assertion 'rte,mem_access' (file tests/wp_bts/bts_1360.i, line 29) *) + (* tests/wp_bts/bts_1360.i:29: Assertion 'rte,mem_access': *) + Have: (valid_rd Malloc_1 a_2 1). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_bts/bts_1360.i, line 25) in 'foo_correct' (1/2): +Effect at line 29 +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[a_0]) /\ (is_sint32 Mint_0[b_0]) + /\ (is_sint32 Mint_1[a_0]) /\ (is_sint32 Mint_2[a_0]) + /\ (is_sint32 Mint_2[b_0]). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 22) in 'foo_correct' *) + (* Pre-condition: *) + Have: (valid_rd Malloc_0 b_0 1) /\ (valid_rw Malloc_0 a_0 1). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 23) in 'foo_correct' *) + (* Pre-condition: *) + Have: a_0!=b_0. + (* Assertion 'rte,mem_access' (file tests/wp_bts/bts_1360.i, line 29) *) + (* tests/wp_bts/bts_1360.i:29: Assertion 'rte,mem_access': *) + Have: (valid_rd Malloc_0 a_0 1). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_bts/bts_1360.i, line 25) in 'foo_correct' (2/2): +Effect at line 30 +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[a_0]) /\ (is_sint32 Mint_0[b_0]) + /\ (is_sint32 Mint_1[a_0]) /\ (is_sint32 Mint_2[a_0]) + /\ (is_sint32 Mint_2[b_0]). + (* Goal *) + When: (valid_rd Malloc_0 a_0 1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 22) in 'foo_correct' *) + (* Pre-condition: *) + Have: (valid_rd Malloc_0 b_0 1) /\ (valid_rw Malloc_0 a_0 1). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 23) in 'foo_correct' *) + (* Pre-condition: *) + Have: a_0!=b_0. +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function foo_wrong +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_bts/bts_1360.i, line 13) in 'foo_wrong': +Let x_0 = Mint_0[a_0]. +Let x_1 = Mint_0[b_0]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 x_1) /\ (is_sint32 (land x_0 x_1)). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 11) in 'foo_wrong' *) + (* Pre-condition: *) + Have: (valid_rd Malloc_0 a_0 1) /\ (valid_rd Malloc_0 b_0 1). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 12) in 'foo_wrong' *) + (* Pre-condition: *) + Have: a_0!=b_0. + (* Assertion 'rte,mem_access' (file tests/wp_bts/bts_1360.i, line 19) *) + (* tests/wp_bts/bts_1360.i:19: Assertion 'rte,mem_access': *) + Have: (valid_rw Malloc_0 a_0 1). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'rte,mem_access' (file tests/wp_bts/bts_1360.i, line 18): +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[a_2]) /\ (is_sint32 Mint_0[b_0]) + /\ (is_sint32 Mint_1[a_2]) /\ (is_sint32 Mint_2[a_2]) + /\ (is_sint32 Mint_2[b_0]). + (* Heap *) + Have: (linked Malloc_1) /\ ((region (base a_2))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 11) in 'foo_wrong' *) + (* Pre-condition: *) + Have: (valid_rd Malloc_1 a_2 1) /\ (valid_rd Malloc_1 b_0 1). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 12) in 'foo_wrong' *) + (* Pre-condition: *) + Have: a_2!=b_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'rte,mem_access' (file tests/wp_bts/bts_1360.i, line 18): +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[a_0]) /\ (is_sint32 Mint_0[b_1]) + /\ (is_sint32 Mint_1[a_0]) /\ (is_sint32 Mint_2[a_0]) + /\ (is_sint32 Mint_2[b_1]). + (* Heap *) + Have: (linked Malloc_1) /\ ((region (base a_0))<=0) + /\ ((region (base b_1))<=0). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 11) in 'foo_wrong' *) + (* Pre-condition: *) + Have: (valid_rd Malloc_1 a_0 1) /\ (valid_rd Malloc_1 b_1 1). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 12) in 'foo_wrong' *) + (* Pre-condition: *) + Have: a_0!=b_1. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'rte,mem_access' (file tests/wp_bts/bts_1360.i, line 19): +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[a_2]) /\ (is_sint32 Mint_0[b_0]) + /\ (is_sint32 Mint_1[a_2]) /\ (is_sint32 Mint_2[a_2]) + /\ (is_sint32 Mint_2[b_0]). + (* Heap *) + Have: (linked Malloc_1) /\ ((region (base a_2))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 11) in 'foo_wrong' *) + (* Pre-condition: *) + Have: (valid_rd Malloc_1 a_2 1) /\ (valid_rd Malloc_1 b_0 1). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 12) in 'foo_wrong' *) + (* Pre-condition: *) + Have: a_2!=b_0. +} +Prove: (valid_rw Malloc_1 a_2 1). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_bts/bts_1360.i, line 14) in 'foo_wrong' (1/2): +Effect at line 18 +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[a_0]) /\ (is_sint32 Mint_0[b_0]) + /\ (is_sint32 Mint_1[a_0]) /\ (is_sint32 Mint_2[a_0]) + /\ (is_sint32 Mint_2[b_0]). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 11) in 'foo_wrong' *) + (* Pre-condition: *) + Have: (valid_rd Malloc_0 a_0 1) /\ (valid_rd Malloc_0 b_0 1). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 12) in 'foo_wrong' *) + (* Pre-condition: *) + Have: a_0!=b_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_bts/bts_1360.i, line 14) in 'foo_wrong' (2/2): +Effect at line 19 +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[a_0]) /\ (is_sint32 Mint_0[b_0]) + /\ (is_sint32 Mint_1[a_0]) /\ (is_sint32 Mint_2[a_0]) + /\ (is_sint32 Mint_2[b_0]). + (* Goal *) + When: (valid_rd Malloc_0 a_0 1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 11) in 'foo_wrong' *) + (* Pre-condition: *) + Have: (valid_rd Malloc_0 b_0 1). + (* Pre-condition (file tests/wp_bts/bts_1360.i, line 12) in 'foo_wrong' *) + (* Pre-condition: *) + Have: a_0!=b_0. + (* Assertion 'rte,mem_access' (file tests/wp_bts/bts_1360.i, line 19) *) + (* tests/wp_bts/bts_1360.i:19: Assertion 'rte,mem_access': *) + Have: (valid_rw Malloc_0 a_0 1). +} +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts_1382.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts_1382.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts_1382.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts_1382.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,77 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts_1382.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_bts/bts_1382.i:18:[wp] warning: Cast with incompatible pointers types (source: sint32*) (target: sint8*) +tests/wp_bts/bts_1382.i:18:[wp] warning: Cast with incompatible pointers types (source: sint32*) (target: sint8*) +tests/wp_bts/bts_1382.i:17:[wp] warning: Cast with incompatible pointers types (source: sint32*) (target: uint8*) +------------------------------------------------------------ + Function loop +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_bts/bts_1382.i, line 15) (1/3): +tests/wp_bts/bts_1382.i:17: warning from Typed Model: + - Warning: Hide sub-term definition + Reason: Cast with incompatible pointers types (source: sint32*) (target: uint8*) +tests/wp_bts/bts_1382.i:18: warning from Typed Model: + - Warning: Hide sub-term definition + Reason: Cast with incompatible pointers types (source: sint32*) (target: sint8*) +tests/wp_bts/bts_1382.i:18: warning from Typed Model: + - Warning: Hide sub-term definition + Reason: Cast with incompatible pointers types (source: sint32*) (target: sint8*) +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_bts/bts_1382.i, line 15) (2/3): +Call Effect at line 17 +tests/wp_bts/bts_1382.i:17: warning from Typed Model: + - Warning: Hide sub-term definition + Reason: Cast with incompatible pointers types (source: sint32*) (target: uint8*) +Assume { + (* Domain *) + Type: (is_sint32 i_0). + (* Goal *) + When: (valid_rd Malloc_0 w_7 1). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0). + (* tests/wp_bts/bts_1382.i:16: Then *) + Have: i_0<=99. + (* tests/wp_bts/bts_1382.i:18: Call Effects *) + Have: (havoc Mchar_0 Mchar_3 (shift_sint8 w_2 0) 4). +} +Prove: w_7=(shift_sint32 (global G_dest_87) 0). + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_bts/bts_1382.i, line 15) (3/3): +Call Effect at line 18 +tests/wp_bts/bts_1382.i:17: warning from Typed Model: + - Warning: Hide sub-term definition + Reason: Cast with incompatible pointers types (source: sint32*) (target: uint8*) +tests/wp_bts/bts_1382.i:18: warning from Typed Model: + - Warning: Hide sub-term definition + Reason: Cast with incompatible pointers types (source: sint32*) (target: sint8*) +tests/wp_bts/bts_1382.i:18: warning from Typed Model: + - Warning: Hide sub-term definition + Reason: Cast with incompatible pointers types (source: sint32*) (target: sint8*) +Let a_0 = (shift_sint8 w_2 0). +Assume { + (* Domain *) + Type: (is_sint32 i_0). + (* Goal *) + When: (valid_rd Malloc_0 a_0 4). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0). + (* tests/wp_bts/bts_1382.i:16: Then *) + Have: i_0<=99. + (* tests/wp_bts/bts_1382.i:18: Call Effects *) + Have: (havoc Mchar_0 Mchar_3 a_0 4). +} +Prove: (included a_0 4 (shift_sint32 (global G_dest_87) 0) 1). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts_1462.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts_1462.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts_1462.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts_1462.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,133 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts_1462.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function local +------------------------------------------------------------ + +Goal Preservation of Invariant (file tests/wp_bts/bts_1462.i, line 26): +Assume { (* Heap *) Have: (linked Malloc_0). } +Prove: true. + +------------------------------------------------------------ + +Goal Establishment of Invariant (file tests/wp_bts/bts_1462.i, line 26): +Assume { (* Heap *) Have: (linked Malloc_0). } +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_bts/bts_1462.i, line 26) (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_bts/bts_1462.i, line 26) (2/2): +Effect at line 30 +Assume { (* Heap *) Have: (linked Malloc_0). } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function wrong +------------------------------------------------------------ + +Goal Assertion 'for_value' (file tests/wp_bts/bts_1462.i, line 5): +Assume { (* Domain *) Type: (is_sint32 c_3). } +Prove: (1=c_3) \/ (2<=c_3) \/ (c_3<=0). + +------------------------------------------------------------ + +Goal Preservation of Invariant 'A_KO' (file tests/wp_bts/bts_1462.i, line 9): +Assume { + (* Domain *) + Type: (is_sint32 c_1) /\ (is_sint32 i_1) /\ (is_sint32 x_5) + /\ (is_sint32 y_0) /\ (is_sint32 y_2) /\ (is_sint32 (1+i_1)). + (* Goal *) + When: -1!=i_1. + (* Assertion 'for_value' (file tests/wp_bts/bts_1462.i, line 5) *) + (* tests/wp_bts/bts_1462.i:5: Assertion 'for_value': *) + Have: (1=c_1) \/ (2<=c_1) \/ (c_1<=0). + (* tests/wp_bts/bts_1462.i:6: Conditional *) + Have: 2!=c_1. + (* Invariant 'C' (file tests/wp_bts/bts_1462.i, line 11) *) + (* tests/wp_bts/bts_1462.i:14: Invariant 'C': *) + Have: (0=c_1) -> (0=i_1) -> (0=x_5). + (* Invariant 'A_KO' (file tests/wp_bts/bts_1462.i, line 9) *) + (* tests/wp_bts/bts_1462.i:14: Invariant 'A_KO': *) + Have: (0!=i_1) -> (0=y_2). + (* tests/wp_bts/bts_1462.i:14: Then *) + Have: i_1<=9. + (* tests/wp_bts/bts_1462.i:16: Conditional *) + If: 1=c_1 + Then { (* tests/wp_bts/bts_1462.i:16: Assignment *) Have: 1=y_0. } + Else { (* Control Flow *) Have: y_0=y_2. } +} +Prove: 0=y_0. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'A_KO' (file tests/wp_bts/bts_1462.i, line 9): +Assume { (* Goal *) When: false. } +Prove: 0=y_5. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'B' (file tests/wp_bts/bts_1462.i, line 10): +Assume { + (* Domain *) + Type: (is_sint32 i_1) /\ (is_sint32 x_3) /\ (is_sint32 (1+i_1)). + (* Goal *) + When: -1!=i_1. + (* Invariant 'B' (file tests/wp_bts/bts_1462.i, line 10) *) + (* tests/wp_bts/bts_1462.i:14: Invariant 'B': *) + Have: (0!=i_1) -> (1=x_3). + (* tests/wp_bts/bts_1462.i:14: Then *) + Have: i_1<=9. +} +Prove: true. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'B' (file tests/wp_bts/bts_1462.i, line 10): +Assume { (* Goal *) When: false. } +Prove: 1=x_6. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'C' (file tests/wp_bts/bts_1462.i, line 11): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'C' (file tests/wp_bts/bts_1462.i, line 11): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'consequence_of_false_invariant' (file tests/wp_bts/bts_1462.i, line 19): +Assume { + (* Domain *) + Type: (is_sint32 i_1) /\ (is_sint32 y_3). + (* Invariant 'A_KO' (file tests/wp_bts/bts_1462.i, line 9) *) + (* tests/wp_bts/bts_1462.i:14: Invariant 'A_KO': *) + Have: (0!=i_1) -> (0=y_3). + (* tests/wp_bts/bts_1462.i:14: Else *) + Have: 9 (i_0<=19) -> (0=t20_0[i_0]). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'I1' in 'main': +Let x_0 = t20_0[1]. +Let x_1 = t20_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0) /\ (is_sint32 t20_0[2]). + (* Initializer *) + Have: 3=x_1. + (* Initializer *) + Have: forall i_0:int. (0 (i_0<=19) -> (0=t20_0[i_0]). +} +Prove: 0=x_0. + +------------------------------------------------------------ + +Goal Post-condition 'I2' in 'main': +Let x_0 = t20_0[2]. +Let x_1 = t20_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 t20_0[1]) /\ (is_sint32 x_0). + (* Initializer *) + Have: 3=x_1. + (* Initializer *) + Have: forall i_0:int. (0 (i_0<=19) -> (0=t20_0[i_0]). +} +Prove: 0=x_0. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts986.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts986.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/bts986.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/bts986.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts986.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Assertion 'A' (file tests/wp_bts/bts986.i, line 12): +Assume { (* Heap *) Have: (linked Malloc_2). } +Prove: not (valid_rw Malloc_2[L_x_70->0] (shift_sint32 (global L_x_70) 0) 1). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/nupw-bcl-bts1120.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/nupw-bcl-bts1120.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle/nupw-bcl-bts1120.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle/nupw-bcl-bts1120.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,123 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/nupw-bcl-bts1120.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +tests/wp_bts/nupw-bcl-bts1120.i:54:[wp] warning: [cfg] Forget exits clause of node +tests/wp_bts/nupw-bcl-bts1120.i:54:[wp] warning: [cfg] Forget exits clause of node +[wp] [WP:unreachability] Goal unreachable_smt_with_contract_stmt_assign : Valid +[wp] [WP:unreachability] Goal unreachable_smt_with_contract_stmt_exit_ok : Valid +[wp] [WP:unreachability] Goal unreachable_smt_with_contract_stmt_post_ok : Valid +[wp] [WP:unreachability] Goal unreachable_smt_with_contract_stmt_pre_ok : Valid +[wp] [WP:unreachability] Goal unreachable_smt_with_contract_assert_ok : Valid +[wp] [WP:unreachability] Goal unreachable_smt_with_contract_call_f_with_precond_pre_ok : Valid +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function cfg_domination_problem +------------------------------------------------------------ + +Goal Exit-condition 'e' in 'cfg_domination_problem': +Assume { + (* tests/wp_bts/nupw-bcl-bts1120.i:62: Exit 'f' *) + Have: (P_ExitF 0). +} +Prove: (P_ExitP 0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function cfg_domination_problem with behavior default_for_stmt_26 +------------------------------------------------------------ + +Goal Assigns (file tests/wp_bts/nupw-bcl-bts1120.i, line 60) at block: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function g +------------------------------------------------------------ + +Goal Exit-condition 'ok' in 'g': +Assume { + (* Domain *) + Type: (is_sint32 max_1). + (* Pre-condition (file tests/wp_bts/nupw-bcl-bts1120.i, line 25) in 'g' *) + (* Pre-condition: *) + Have: (P_ExitF max_1) -> (P_ExitP max_1). + (* tests/wp_bts/nupw-bcl-bts1120.i:27: Exit 'f' *) + Have: (P_ExitF max_1). +} +Prove: (P_ExitP max_1). + +------------------------------------------------------------ + +Goal Loop assigns 'ok': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'g': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'g' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'g' (2/3): +Call Result at line 27 +Assume { + (* Domain *) + Type: (is_sint32 max_0). + (* Pre-condition (file tests/wp_bts/nupw-bcl-bts1120.i, line 25) in 'g' *) + (* Pre-condition: *) + Have: (P_ExitF max_0) -> (P_ExitP max_0). + (* tests/wp_bts/nupw-bcl-bts1120.i:27: Call 'f' *) + Have: (P_PostF max_0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'g' (3/3): +Effect at line 29 +Assume { + (* Domain *) + Type: (is_sint32 max_0). + (* Pre-condition (file tests/wp_bts/nupw-bcl-bts1120.i, line 25) in 'g' *) + (* Pre-condition: *) + Have: (P_ExitF max_0) -> (P_ExitP max_0). + (* tests/wp_bts/nupw-bcl-bts1120.i:27: Call 'f' *) + Have: (P_PostF max_0). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function unreachable_smt_with_contract +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'unreachable_smt_with_contract': +Assume { + (* Domain *) + Type: (is_sint32 max_0). + (* Pre-condition (file tests/wp_bts/nupw-bcl-bts1120.i, line 38) in 'unreachable_smt_with_contract' *) + (* Pre-condition: *) + Have: (P_PostP max_0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition 'ok' in 'f_with_precond'' in 'unreachable_smt_with_contract' at call 'f_with_precond' (file tests/wp_bts/nupw-bcl-bts1120.i, line 40) +: +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts0708.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts0708.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts0708.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts0708.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts0708.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 1 goal scheduled +[wp] [Alt-Ergo] Goal typed_f_post_A : Valid +[wp] Proved goals: 1 / 1 + Qed: 0 + Alt-Ergo: 1 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f - 1 (8) 1 100% +---------------------------------------------------------- +[wp] Running WP plugin... +[wp] 1 goal scheduled +[wp] [Alt-Ergo] Goal typed_f_post_B : Valid +[wp] Proved goals: 1 / 1 + Qed: 0 + Alt-Ergo: 1 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f - 2 (8) 2 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts0843.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts0843.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts0843.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts0843.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,20 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts0843.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 4 goals scheduled +[wp] [Qed] Goal typed_f3_assign : Valid +[wp] [Alt-Ergo] Goal typed_g3_assign_exit : Valid +[wp] [Alt-Ergo] Goal typed_g3_assign_normal : Valid +[wp] [Qed] Goal typed_g3_call_f3_pre : Valid +[wp] Proved goals: 4 / 4 + Qed: 2 + Alt-Ergo: 2 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f3 1 - 1 100% +g3 1 2 (14) 3 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1174.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1174.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1174.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1174.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts_1174.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 1 goal scheduled +[wp] [Coq] Goal typed_job_assert_qed_ok : Default tactic +[wp] [Coq] Goal typed_job_assert_qed_ok : Unknown +[wp] Proved goals: 0 / 1 + Coq: 0 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +job - - 1 0.0% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1176.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1176.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1176.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1176.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,15 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts_1176.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 1 goal scheduled +[wp] [Qed] Goal typed_f_assert_qed_ok : Valid +[wp] Proved goals: 1 / 1 + Qed: 1 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f 1 - 1 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1360.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1360.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1360.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1360.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +# frama-c -wp -wp-rte [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts_1360.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[rte] annotating function foo_correct +[rte] annotating function foo_wrong +[wp] 12 goals scheduled +[wp] [Qed] Goal typed_foo_correct_post : Valid +[wp] [Alt-Ergo] Goal typed_foo_correct_assert_rte_mem_access : Valid +[wp] [Qed] Goal typed_foo_correct_assert_rte_mem_access_2 : Valid +[wp] [Qed] Goal typed_foo_correct_assert_rte_mem_access_3 : Valid +[wp] [Qed] Goal typed_foo_correct_assign_part1 : Valid +[wp] [Qed] Goal typed_foo_correct_assign_part2 : Valid +[wp] [Qed] Goal typed_foo_wrong_post : Valid +[wp] [Qed] Goal typed_foo_wrong_assert_rte_mem_access : Valid +[wp] [Qed] Goal typed_foo_wrong_assert_rte_mem_access_2 : Valid +[wp] [Alt-Ergo] Goal typed_foo_wrong_assert_rte_mem_access_3 : Unknown +[wp] [Qed] Goal typed_foo_wrong_assign_part1 : Valid +[wp] [Qed] Goal typed_foo_wrong_assign_part2 : Valid +[wp] Proved goals: 11 / 12 + Qed: 10 + Alt-Ergo: 1 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +foo_wrong 5 - 6 83.3% +foo_correct 5 1 (20) 6 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1462.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1462.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1462.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1462.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts_1462.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 13 goals scheduled +[wp] [Qed] Goal typed_local_loop_inv_preserved : Valid +[wp] [Qed] Goal typed_local_loop_inv_established : Valid +[wp] [Qed] Goal typed_local_loop_assign_part1 : Valid +[wp] [Qed] Goal typed_local_loop_assign_part2 : Valid +[wp] [Alt-Ergo] Goal typed_wrong_assert_for_value : Valid +[wp] [Alt-Ergo] Goal typed_wrong_loop_inv_A_KO_preserved : Unknown +[wp] [Qed] Goal typed_wrong_loop_inv_A_KO_established : Valid +[wp] [Qed] Goal typed_wrong_loop_inv_B_preserved : Valid +[wp] [Qed] Goal typed_wrong_loop_inv_B_established : Valid +[wp] [Qed] Goal typed_wrong_loop_inv_C_preserved : Valid +[wp] [Qed] Goal typed_wrong_loop_inv_C_established : Valid +[wp] [Alt-Ergo] Goal typed_wrong_assert_consequence_of_false_invariant : Valid +[wp] [Qed] Goal typed_wrong_loop_assign : Valid +[wp] Proved goals: 12 / 13 + Qed: 10 + Alt-Ergo: 2 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +wrong 6 2 (6) 9 88.9% +local 4 - 4 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1586.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1586.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1586.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1586.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,22 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts_1586.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 4 goals scheduled +[wp] [Qed] Goal typed_compute_bizarre_Bizarre_post_TRANS : Valid +[wp] [Qed] Goal typed_compute_normal_Normal_post_TRANS : Valid +[wp] [Alt-Ergo] Goal typed_main_bizarre_KO_assert_FALSE : Unknown +[wp] [Alt-Ergo] Goal typed_main_normal_KO_assert_FALSE : Unknown +[wp] Proved goals: 2 / 4 + Qed: 2 + Alt-Ergo: 0 (unknown: 2) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +compute_bizarre 1 - 1 100% +compute_normal 1 - 1 100% +main_bizarre_KO - - 1 0.0% +main_normal_KO - - 1 0.0% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1588.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1588.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1588.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1588.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts_1588.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_bts/bts_1588.i:19:[wp] warning: Missing assigns clause (assigns 'everything' instead) +tests/wp_bts/bts_1588.i:5:[wp] warning: Missing assigns clause (assigns 'everything' instead) +[wp] 3 goals scheduled +[wp] [Qed] Goal typed_f_loop_inv_l1_2_preserved : Valid +[wp] [Qed] Goal typed_f_loop_inv_l1_2_established : Valid +[wp] [Qed] Goal typed_f_assert_a1 : Valid +[wp] Proved goals: 3 / 3 + Qed: 3 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f 3 - 3 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1601.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1601.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1601.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1601.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,22 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts_1601.c (with preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 8 goals scheduled +[wp] [Qed] Goal typed_foo_assert : Valid +[wp] [Qed] Goal typed_foo_assert_2 : Valid +[wp] [Qed] Goal typed_foo_assert_3 : Valid +[wp] [Qed] Goal typed_foo_assert_4 : Valid +[wp] [Qed] Goal typed_foo_assert_5 : Valid +[wp] [Qed] Goal typed_foo_assert_6 : Valid +[wp] [Qed] Goal typed_foo_assert_7 : Valid +[wp] [Qed] Goal typed_foo_basic_post : Valid +[wp] Proved goals: 8 / 8 + Qed: 8 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +foo 8 - 8 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1828.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1828.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1828.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1828.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,21 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts_1828.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 4 goals scheduled +[wp] [Alt-Ergo] Goal typed_ref_f_assert_ok : Valid +[wp] [Qed] Goal typed_ref_frame_assert_ok_formal : Valid +[wp] [Qed] Goal typed_ref_frame_assert_ok_global : Valid +[wp] [Alt-Ergo] Goal typed_ref_frame_assert_ko : Unknown +[wp] Proved goals: 3 / 4 + Qed: 2 + Alt-Ergo: 1 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f - 1 (15) 1 100% +frame 2 - 3 66.7% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1828.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1828.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1828.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts_1828.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,20 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts_1828.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 4 goals scheduled +[wp] [Alt-Ergo] Goal typed_f_assert_ok : Valid +[wp] [Alt-Ergo] Goal typed_frame_assert_ok_formal : Valid +[wp] [Alt-Ergo] Goal typed_frame_assert_ok_global : Valid +[wp] [Alt-Ergo] Goal typed_frame_assert_ko : Unknown +[wp] Proved goals: 3 / 4 + Qed: 0 + Alt-Ergo: 3 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f - 1 (19) 1 100% +frame - 2 (53) 3 66.7% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts779.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts779.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts779.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts779.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,17 @@ +# frama-c -wp -wp-rte [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts779.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[rte] 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 : Unknown +[wp] Proved goals: 1 / 2 + Qed: 0 + Alt-Ergo: 1 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f - 1 (13) 2 50.0% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts788.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts788.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts788.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts788.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,19 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts788.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 3 goals scheduled +[wp] [Qed] Goal typed_ref_main_post_I0 : Valid +[wp] [Alt-Ergo] Goal typed_ref_main_post_I1 : Valid +[wp] [Alt-Ergo] Goal typed_ref_main_post_I2 : Valid +[wp] Proved goals: 3 / 3 + Qed: 1 + Alt-Ergo: 2 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +main 1 2 (15) 3 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts986.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts986.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts986.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/bts986.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/bts986.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 1 goal scheduled +[wp] [Alt-Ergo] Goal typed_f_assert_A : Valid +[wp] Proved goals: 1 / 1 + Qed: 0 + Alt-Ergo: 1 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f - 1 (15) 1 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/nupw-bcl-bts1120.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/nupw-bcl-bts1120.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_bts/oracle_qualif/nupw-bcl-bts1120.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_bts/oracle_qualif/nupw-bcl-bts1120.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,30 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_bts/nupw-bcl-bts1120.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] [WP:unreachability] Goal unreachable_smt_with_contract_stmt_assign : Valid +[wp] [WP:unreachability] Goal unreachable_smt_with_contract_stmt_exit_ok : Valid +[wp] [WP:unreachability] Goal unreachable_smt_with_contract_stmt_post_ok : Valid +[wp] [WP:unreachability] Goal unreachable_smt_with_contract_stmt_pre_ok : Valid +[wp] [WP:unreachability] Goal unreachable_smt_with_contract_assert_ok : Valid +[wp] [WP:unreachability] Goal unreachable_smt_with_contract_call_f_with_precond_pre_ok : Valid +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 8 goals scheduled +[wp] [Alt-Ergo] Goal typed_g_exit_ok : Valid +[wp] [Qed] Goal typed_g_loop_assign : Valid +[wp] [Qed] Goal typed_g_assign_exit : Valid +[wp] [Qed] Goal typed_g_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_g_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_g_assign_normal_part3 : Valid +[wp] [Qed] Goal typed_unreachable_smt_with_contract_post_ok : Valid +[wp] [Qed] Goal typed_unreachable_smt_with_contract_call_f_with_precond_pre_ok_2 : Valid +[wp] Proved goals: 8 / 8 + Qed: 7 + Alt-Ergo: 1 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +g 5 1 (5) 6 100% +unreachable_smt_with_contract 2 - 2 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/byref.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/byref.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/byref.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/byref.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,44 @@ +/* run.config + OPT: -wp-model +ref +*/ + +/* run.config_qualif + OPT: -wp -wp-proof alt-ergo -wp-par 1 -wp-model +ref -wp-timeout 2 -wp-prop qed_ok + OPT: -wp -wp-proof alt-ergo -wp-par 1 -wp-model +ref -wp-timeout 2 -wp-prop qed_ko +*/ + +//@ requires qed_ok:\valid(r); ensures qed_ok:*r == 1 ; assigns qed_ok:*r ; +void f(int *r) { *r = 1 ; } + +//@ requires qed_ko:\valid(r); ensures qed_ok:*r == 1 ; assigns qed_ok:*r ; +void f_ko(int *r) { *r = 1 ; } + +// Pre-condition of f should never hold +//@ ensures qed_ok:\result == 1 ; +int wrong(int * q) +{ + f_ko(q) ; + return *q ; +} + +//@ requires \valid(p) ; ensures qed_ok:\result == 1 ; +int correct(int * p) +{ + f(p) ; + return *p ; +} + +//@ ensures qed_ok:\result == 1 ; +int local() +{ + int u ; + f(&u) ; + return u ; +} + +//@ ensures qed_ok:\result == 1 ; +int formal(int v) +{ + f(&v) ; + return v ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/dispatch_var2.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/dispatch_var2.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/dispatch_var2.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/dispatch_var2.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,74 @@ +/* run.config + OPT: -wp-model +ref -wp-no-let -wp-log var_kind + OPT: -wp-model +ref -wp-let -wp-log var_kind +*/ + +/* run.config_qualif + OPT: -wp -wp-proof alt-ergo -wp-par 1 -wp-model +ref -wp-no-let + OPT: -wp -wp-proof alt-ergo -wp-par 1 -wp-model +ref -wp-let +*/ + +/*@ + requires \valid(rp); + assigns *rp; + ensures *rp == 0; +*/ +void reset (int *rp) {*rp = 0;} + +/*@ + requires \valid(ip); + assigns *ip; + ensures *ip == \old(*ip)+1; +*/ +void incr (int *ip) {*ip=*ip+1;} + + +/*@ + requires \valid(lp); + assigns \nothing; + ensures \result == *lp ; +*/ +int load (int *lp) {return *lp;} + +int x; + +/*@ + assigns x; + ensures \result == 0; + */ +int call_global (void) +{ + reset(&x); + return (load(&x)); +} + +/*@ requires \valid(&y); + assigns \nothing; + ensures \result == 0; + */ +int call_param (int y) +{ + reset(&y); + return (load(&y)); +} + +/*@ assigns \nothing; + ensures \result == 0; + */ +int call_local(void) +{ + int z; + reset(&z); + return (load(&z)); +} + +/*@ + requires \valid(q); + assigns *q; + ensures \result == 0; + */ +int call_param_ref (int *q) +{ + reset(q); + return (load(q)); +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/dispatch_var.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/dispatch_var.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/dispatch_var.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/dispatch_var.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,209 @@ +/* run.config + OPT: -wp-model +ref -wp-log var_kind +*/ + +/* run.config_qualif + OPT: -wp -wp-proof alt-ergo -wp-par 1 -wp-model +ref +*/ + +/*@ assigns \nothing ; + ensures \result == *p ; + */ +int ref_ctr(int * p); + + +int r1 ; + +/*@ assigns r1; + ensures Ref_r1 : \result == 4; + */ +int call_ref_ctr (void) +{ + r1 = 4 ; + return ref_ctr(&r1); +} + +int n1; + +/*@ assigns n1; + ensures Mem_n1 :\result == 4; + */ +int call_ref_ctr2 (void) +{ + int * s ; s = &n1 ; + n1 = 4 ; + if (ref_ctr(&n1) == 4) return *s; + else return n1; +} + +/*----------------------------------------*/ + +/*@ assigns \nothing ; + ensures \result == *q; + */ +int ref_bd (int * q) +{ + return *q; +} + +int r2 ; + +/*@ assigns r2; + ensures Ref_r2 : \result == 4; + */ +int call_ref_bd (void) +{ + r2 = 4 ; + return ref_bd(&r2); +} + + +int n2; + +/*@ assigns n2; + ensures Mem_n2 :\result == 4; + */ +int call_ref_bd2 (void) +{ + int * p ; p = &n2 ; + n2 = 4 ; + if (ref_bd(&n2) == 4) return *p; + else return n1; +} + + + +/*---------------------------------------*/ + + +/*@ requires \valid(p1); + assigns \nothing; + ensures \result == *p1; + */ +int ref_valid (int *p1); + +int r7, n4 ; + +/*@ assigns r7,n4; + ensures R7_N4: \result == 8; + */ +int call_ref_valid(void) +{ + int * p ; + r7 = 4; n4 = 4; + p = &n4; + return (ref_valid(&r7)+ + ref_valid(&n4)); + +} + +/*---------------------------------------*/ + +/*@ + assigns \nothing; + ensures \result == *q1; + */ +int no_ref_bd(int *q1) +{ + int * q ; q = q1+1 ; + return *q1; +} + +int n5, nr6 ; + +/*@ assigns n5,nr6; + ensures Mem_n5_nr6 :\result == 8; + */ +int call_no_ref_bd(void) +{ + int * p ; + n5 = 4; nr6 = 4; + p = &n5; + return (no_ref_bd(&n5)+ + no_ref_bd(&nr6)); + +} + +/*---------------------------------------*/ + +/*@ requires \valid(ref); + assigns \nothing ; + ensures \result == *ref1 + *ref2; + */ +int ref_ctr_nr(int *ref, int *ref1,int *ref2); + +int r5,r6; +int f3,r4; + +/*@ requires \valid(&r6); + assigns f3,r4, r6; + ensures R_R_R : r5 == 0 ==> \result == 4; + ensures R_R_R : r5 != 0 ==> \result == 4; + */ +int call_ref_ctr_nr(void) +{ + f3 =2 ; r4 = 2 ; r6 = 2; + int k; + if (r5 == 0) k = f3 ; else k = r6; + return ref_ctr_nr(&r5,&k,&r4); + +} + + +/*---------------------------------------*/ + +/*@ assigns \nothing ; + ensures \result == **pp ; + */ +int ref_ctr_nstars(int **pp); + + +/*@ assigns \nothing ; + ensures \result == 4; + */ +int call_ref_ctr_nstars(void) +{ + int x; + x = 4 ; + int * px = &x; + return ref_ctr_nstars(&px); +} + + +/*-------------------------------*/ +int r0; + +/*@ assigns r0; + ensures \result == 8; + */ +int call_two_ref(void) +{ + r0 = 4; + return (ref_bd(&r0)+ref_ctr(&r0)) ; +} + +/*-------------------------------*/ + + + +/*@ + requires *pg == 4; + assigns \nothing; + ensures \result == 4 ; +*/ +int g (int *pg) { + return ref_bd(pg); +} + +/*-------------------------------*/ + + +struct S { int tab[10]; int k;}; +/*@ + requires \valid(sf.tab+(0..5)); + assigns \nothing; + ensures Pload2 : + \forall integer j; 0<=j<5 ==> \result.tab[j] == sf.tab[j] ; +*/ +struct S array_in_struct_param(struct S sf){return sf;} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/isHoare.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/isHoare.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/isHoare.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/isHoare.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,18 @@ +/* run.config + OPT: -wp-model +ref +*/ + +/* run.config_qualif + OPT: -wp -wp-par 1 -wp-model +ref +*/ + +/*@ ensures ok : \result == 0 || \result == 1; */ +int cmp_invalid_addr_as_int (void) { + int p; + int q; + + { int x=1 ; p = (int) &x ; } + { int y=2 ; q = (int) &y ; } + + return (p == q) ? 1 : 0; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/logicarr.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/logicarr.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/logicarr.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/logicarr.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,34 @@ +/* run.config + OPT: -wp-model +ref +*/ + +/* run.config_qualif + OPT: -wp -wp-par 1 -wp-model +ref +*/ + +/*@ predicate p_pointer{L1,L2}(int *a,int i,int j) = + \at(a[i],L1) == \at(a[j],L2) ; +*/ + +// ARRAY PASSED BY VALUES !! +/*@ predicate p_arrays(int a[],int i,int b[],int j) = + a[i] == b[j] ; +*/ + +// USELESS LABELS and USELESS \AT !! +/*@ predicate p_dummy{L1,L2}(int a[],int i,int j) = + \at(a[i],L1) == \at(a[j],L2) ; +*/ + +int arr[10]; + +/*@ ensures qed_ok: PTR: todo: p_pointer{Pre,Here}((int *)arr,i,j); + @ ensures qed_ok: ARR: todo: p_arrays(\old(arr),i,arr,j); + @ ensures qed_ok: DUM: todo: p_dummy{Pre,Here}(arr,j,k); + */ +void job(i,j,k) { + int tmp = arr[i]; + arr[i] = arr[j] ; + arr[j] = tmp ; + arr[k] = tmp ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/logicref.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/logicref.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/logicref.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/logicref.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,24 @@ +/* run.config + OPT: -wp-model +ref -wp-log var_kind +*/ + +/* run.config_qualif + OPT: -wp -wp-proof alt-ergo -wp-par 1 -wp-model +ref +*/ + +//@ predicate vrange(int *p1,integer n) = \valid(p1+(0..n-1)) ; + +//@ requires vrange(a,k) && 0<=i= 0 ; + +//@ requires simple(c) ; assigns \nothing ; ensures \result == 1; +int fsimple (int *c) {return *c+1;} + +int t[10]; + +//@ requires simple_array(&(t[0])); assigns \nothing ; ensures \result == 1 ; +int fsimple_array (void) {return t[3]+1;} + +//@ requires two_star(d) ; assigns \nothing ; ensures \result == 1; +int ftwo_star (int **d) {return **d+1;} + + +//@ requires vpositive(b) ; assigns *b;ensures *b == 0; +void fvpositive (int *b) +{ + //@ assert todo: \valid(b); + *b = 0 ; +} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/byref.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/byref.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/byref.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/byref.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,102 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/byref.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function correct +------------------------------------------------------------ + +Goal Post-condition 'qed_ok' in 'correct': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition 'qed_ok' in 'f'' in 'correct' at call 'f' (file tests/wp_hoare/byref.i, line 27) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Post-condition 'qed_ok' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'qed_ok' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function f_ko +------------------------------------------------------------ + +Goal Post-condition 'qed_ok' in 'f_ko': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'qed_ok' in 'f_ko': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function formal +------------------------------------------------------------ + +Goal Post-condition 'qed_ok' in 'formal': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition 'qed_ok' in 'f'' in 'formal' at call 'f' (file tests/wp_hoare/byref.i, line 42) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function local +------------------------------------------------------------ + +Goal Post-condition 'qed_ok' in 'local': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition 'qed_ok' in 'f'' in 'local' at call 'f' (file tests/wp_hoare/byref.i, line 35) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function wrong +------------------------------------------------------------ + +Goal Post-condition 'qed_ok' in 'wrong': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition 'qed_ko' in 'f_ko'' in 'wrong' at call 'f_ko' (file tests/wp_hoare/byref.i, line 20) +: +Assume { } +Prove: ra_q_0. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/dispatch_var2.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/dispatch_var2.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/dispatch_var2.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/dispatch_var2.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,274 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/dispatch_var2.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function call_global +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var2.i, line 37) in 'call_global': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var2.i, line 36) in 'call_global': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var2.i, line 36) in 'call_global' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var2.i, line 36) in 'call_global' (2/2): +Call Result at line 42 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 12) in 'reset'' in 'call_global' at call 'reset' (file tests/wp_hoare/dispatch_var2.i, line 41) +: +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 27) in 'load'' in 'call_global' at call 'load' (file tests/wp_hoare/dispatch_var2.i, line 42) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_local +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var2.i, line 56) in 'call_local': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_local' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_local' (2/2): +Call Effect at line 61 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_local' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_local' (2/3): +Call Effect at line 61 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_local' (3/3): +Call Result at line 62 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 12) in 'reset'' in 'call_local' at call 'reset' (file tests/wp_hoare/dispatch_var2.i, line 61) +: +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 27) in 'load'' in 'call_local' at call 'load' (file tests/wp_hoare/dispatch_var2.i, line 62) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_param +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var2.i, line 47) in 'call_param': +Assume { + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 45) in 'call_param' *) + (* Pre-condition: *) + Have: false. +} +Prove: 0=call_param_0. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_param' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_param' (2/2): +Call Effect at line 51 +Assume { + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 45) in 'call_param' *) + (* Pre-condition: *) + Have: false. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_param' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_param' (2/3): +Call Effect at line 51 +Assume { + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 45) in 'call_param' *) + (* Pre-condition: *) + Have: false. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_param' (3/3): +Call Result at line 52 +Assume { + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 45) in 'call_param' *) + (* Pre-condition: *) + Have: false. +} +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 12) in 'reset'' in 'call_param' at call 'reset' (file tests/wp_hoare/dispatch_var2.i, line 51) +: +Assume { + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 45) in 'call_param' *) + (* Pre-condition: *) + Have: false. +} +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 27) in 'load'' in 'call_param' at call 'load' (file tests/wp_hoare/dispatch_var2.i, line 52) +: +Assume { + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 45) in 'call_param' *) + (* Pre-condition: *) + Have: false. +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_param_ref +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var2.i, line 68) in 'call_param_ref': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var2.i, line 67) in 'call_param_ref': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var2.i, line 67) in 'call_param_ref' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var2.i, line 67) in 'call_param_ref' (2/2): +Call Result at line 73 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 12) in 'reset'' in 'call_param_ref' at call 'reset' (file tests/wp_hoare/dispatch_var2.i, line 72) +: +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 27) in 'load'' in 'call_param_ref' at call 'load' (file tests/wp_hoare/dispatch_var2.i, line 73) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function incr +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var2.i, line 21) in 'incr': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var2.i, line 20) in 'incr': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function load +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var2.i, line 29) in 'load': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'load': +Effect at line 31 +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function reset +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var2.i, line 14) in 'reset': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var2.i, line 13) in 'reset': +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/dispatch_var2.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/dispatch_var2.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/dispatch_var2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/dispatch_var2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,499 @@ +# frama-c -wp -wp-model 'Typed (Ref)' -wp-no-let [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/dispatch_var2.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function call_global +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var2.i, line 37) in 'call_global': +Assume { + (* Domain *) + Type: (is_sint32 call_global_0) /\ (is_sint32 load_0) /\ (is_sint32 tmp_0) + /\ (is_sint32 x_0). + (* Block In *) + Have: not ta_tmp_3. + (* tests/wp_hoare/dispatch_var2.i:41: Call 'reset' *) + Have: 0=x_0. + (* tests/wp_hoare/dispatch_var2.i:42: Call 'load' *) + Have: (load_0=tmp_0) /\ (load_0=x_0). + (* tests/wp_hoare/dispatch_var2.i:42: Return *) + Have: call_global_0=tmp_0. +} +Prove: 0=call_global_0. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var2.i, line 36) in 'call_global': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var2.i, line 36) in 'call_global' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var2.i, line 36) in 'call_global' (2/2): +Call Result at line 42 +Assume { + (* Domain *) + Type: (is_sint32 load_0) /\ (is_sint32 tmp_0) /\ (is_sint32 x_0). + (* Control Flow *) + Have: ta_tmp_2=ta_tmp_3. + (* Block In *) + Have: not ta_tmp_3. + (* tests/wp_hoare/dispatch_var2.i:41: Call 'reset' *) + Have: 0=x_0. + (* tests/wp_hoare/dispatch_var2.i:42: Call 'load' *) + Have: load_0=x_0. +} +Prove: not ta_tmp_2. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 12) in 'reset'' in 'call_global' at call 'reset' (file tests/wp_hoare/dispatch_var2.i, line 41) +: +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 27) in 'load'' in 'call_global' at call 'load' (file tests/wp_hoare/dispatch_var2.i, line 42) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_local +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var2.i, line 56) in 'call_local': +Assume { + (* Domain *) + Type: (is_sint32 call_local_0) /\ (is_sint32 load_0) /\ (is_sint32 tmp_0) + /\ (is_sint32 z_0). + (* Block In *) + Have: (not ta_tmp_3) /\ (not ta_z_3). + (* tests/wp_hoare/dispatch_var2.i:61: Call 'reset' *) + Have: 0=z_0. + (* tests/wp_hoare/dispatch_var2.i:62: Call 'load' *) + Have: (load_0=tmp_0) /\ (load_0=z_0). + (* tests/wp_hoare/dispatch_var2.i:62: Return *) + Have: call_local_0=tmp_0. +} +Prove: 0=call_local_0. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_local' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_local' (2/2): +Call Effect at line 61 +Assume { + (* Domain *) + Type: (is_sint32 status_1) /\ (is_sint32 status_2) /\ (is_sint32 z_0). + (* Control Flow *) + Have: ta_z_2=ta_z_3. + (* Block In *) + Have: (not ta_tmp_3) /\ (not ta_z_3). + (* Merge *)Either { + Case: + (* tests/wp_hoare/dispatch_var2.i:61: Call 'reset' *) + Have: 0=z_0. + Case: + } +} +Prove: not ta_z_2. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_local' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_local' (2/3): +Call Effect at line 61 +Assume { + (* Domain *) + Type: (is_sint32 z_0). + (* Control Flow *) + Have: ta_z_2=ta_z_3. + (* Block In *) + Have: (not ta_tmp_3) /\ (not ta_z_3). + (* tests/wp_hoare/dispatch_var2.i:61: Call 'reset' *) + Have: 0=z_0. +} +Prove: not ta_z_2. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_local' (3/3): +Call Result at line 62 +Assume { + (* Domain *) + Type: (is_sint32 load_0) /\ (is_sint32 tmp_0) /\ (is_sint32 z_0). + (* Control Flow *) + Have: ta_tmp_2=ta_tmp_3. + (* Block In *) + Have: (not ta_tmp_3) /\ (not ta_z_3). + (* tests/wp_hoare/dispatch_var2.i:61: Call 'reset' *) + Have: 0=z_0. + (* tests/wp_hoare/dispatch_var2.i:62: Call 'load' *) + Have: load_0=z_0. +} +Prove: not ta_tmp_2. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 12) in 'reset'' in 'call_local' at call 'reset' (file tests/wp_hoare/dispatch_var2.i, line 61) +: +Assume { (* Block In *) Have: ta_z_0 /\ (not ta_tmp_3) /\ (not ta_z_3). } +Prove: ta_z_0. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 27) in 'load'' in 'call_local' at call 'load' (file tests/wp_hoare/dispatch_var2.i, line 62) +: +Assume { + (* Domain *) + Type: (is_sint32 z_0). + (* Block In *) + Have: ta_z_0 /\ (not ta_tmp_3) /\ (not ta_z_3). + (* tests/wp_hoare/dispatch_var2.i:61: Call 'reset' *) + Have: ta_z_0 /\ (0=z_0). +} +Prove: ta_z_0. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_param +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var2.i, line 47) in 'call_param': +Assume { + (* Domain *) + Type: (is_sint32 call_param_0) /\ (is_sint32 load_0) /\ (is_sint32 tmp_0) + /\ (is_sint32 y_0). + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 45) in 'call_param' *) + (* Pre-condition: *) + Have: ta_y_8. + (* Function Frame *) + Have: ta_y_6 /\ (not ta_y_8). + (* Block In *) + Have: not ta_tmp_3. + (* Control Flow *) + Have: ta_y_4=ta_y_6. + (* tests/wp_hoare/dispatch_var2.i:51: Call 'reset' *) + Have: ta_y_6 /\ (0=y_0). + (* Control Flow *) + Have: ta_y_0=ta_y_4. + (* tests/wp_hoare/dispatch_var2.i:52: Call 'load' *) + Have: ta_y_4 /\ (load_0=tmp_0) /\ (load_0=y_0). + (* tests/wp_hoare/dispatch_var2.i:52: Return *) + Have: call_param_0=tmp_0. + (* Function Exit *) + Have: ta_y_0. +} +Prove: 0=call_param_0. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_param' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_param' (2/2): +Call Effect at line 51 +Assume { + (* Domain *) + Type: (is_sint32 status_1) /\ (is_sint32 status_2) /\ (is_sint32 y_0). + (* Control Flow *) + Have: ta_y_7=ta_y_8. + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 45) in 'call_param' *) + (* Pre-condition: *) + Have: ta_y_8. + (* Function Frame *) + Have: ta_y_6 /\ (not ta_y_8). + (* Block In *) + Have: not ta_tmp_3. + (* Merge *)Either { + Case: + (* tests/wp_hoare/dispatch_var2.i:51: Call 'reset' *) + Have: ta_y_6 /\ (0=y_0). + Case: + (* tests/wp_hoare/dispatch_var2.i:51: Exit 'reset' *) + Have: ta_y_6. + } +} +Prove: not ta_y_7. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_param' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_param' (2/3): +Call Effect at line 51 +Assume { + (* Domain *) + Type: (is_sint32 y_0). + (* Control Flow *) + Have: ta_y_7=ta_y_8. + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 45) in 'call_param' *) + (* Pre-condition: *) + Have: ta_y_8. + (* Function Frame *) + Have: ta_y_6 /\ (not ta_y_8). + (* Block In *) + Have: not ta_tmp_3. + (* tests/wp_hoare/dispatch_var2.i:51: Call 'reset' *) + Have: ta_y_6 /\ (0=y_0). +} +Prove: not ta_y_7. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_param' (3/3): +Call Result at line 52 +Assume { + (* Domain *) + Type: (is_sint32 load_0) /\ (is_sint32 tmp_0) /\ (is_sint32 y_0). + (* Control Flow *) + Have: ta_tmp_2=ta_tmp_3. + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 45) in 'call_param' *) + (* Pre-condition: *) + Have: ta_y_8. + (* Function Frame *) + Have: ta_y_6 /\ (not ta_y_8). + (* Block In *) + Have: not ta_tmp_3. + (* Control Flow *) + Have: ta_y_4=ta_y_6. + (* tests/wp_hoare/dispatch_var2.i:51: Call 'reset' *) + Have: ta_y_6 /\ (0=y_0). + (* tests/wp_hoare/dispatch_var2.i:52: Call 'load' *) + Have: ta_y_4 /\ (load_0=y_0). +} +Prove: not ta_tmp_2. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 12) in 'reset'' in 'call_param' at call 'reset' (file tests/wp_hoare/dispatch_var2.i, line 51) +: +Assume { + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 45) in 'call_param' *) + (* Pre-condition: *) + Have: ta_y_8. + (* Function Frame *) + Have: ta_y_6 /\ (not ta_y_8). + (* Block In *) + Have: not ta_tmp_3. +} +Prove: ta_y_6. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 27) in 'load'' in 'call_param' at call 'load' (file tests/wp_hoare/dispatch_var2.i, line 52) +: +Assume { + (* Domain *) + Type: (is_sint32 y_0). + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 45) in 'call_param' *) + (* Pre-condition: *) + Have: ta_y_8. + (* Function Frame *) + Have: ta_y_6 /\ (not ta_y_8). + (* Block In *) + Have: not ta_tmp_3. + (* Control Flow *) + Have: ta_y_4=ta_y_6. + (* tests/wp_hoare/dispatch_var2.i:51: Call 'reset' *) + Have: ta_y_6 /\ (0=y_0). +} +Prove: ta_y_4. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_param_ref +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var2.i, line 68) in 'call_param_ref': +Assume { + (* Domain *) + Type: (is_sint32 call_param_ref_0) /\ (is_sint32 load_0) /\ (is_sint32 q_0) + /\ (is_sint32 tmp_0). + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 66) in 'call_param_ref' *) + (* Pre-condition: *) + Have: ra_q_0. + (* Block In *) + Have: not ta_tmp_3. + (* tests/wp_hoare/dispatch_var2.i:72: Call 'reset' *) + Have: ra_q_0 /\ (0=q_0). + (* tests/wp_hoare/dispatch_var2.i:73: Call 'load' *) + Have: ra_q_0 /\ (load_0=q_0) /\ (load_0=tmp_0). + (* tests/wp_hoare/dispatch_var2.i:73: Return *) + Have: call_param_ref_0=tmp_0. +} +Prove: 0=call_param_ref_0. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var2.i, line 67) in 'call_param_ref': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var2.i, line 67) in 'call_param_ref' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var2.i, line 67) in 'call_param_ref' (2/2): +Call Result at line 73 +Assume { + (* Domain *) + Type: (is_sint32 load_0) /\ (is_sint32 q_0) /\ (is_sint32 tmp_0). + (* Control Flow *) + Have: ta_tmp_2=ta_tmp_3. + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 66) in 'call_param_ref' *) + (* Pre-condition: *) + Have: ra_q_0. + (* Block In *) + Have: not ta_tmp_3. + (* tests/wp_hoare/dispatch_var2.i:72: Call 'reset' *) + Have: ra_q_0 /\ (0=q_0). + (* tests/wp_hoare/dispatch_var2.i:73: Call 'load' *) + Have: ra_q_0 /\ (load_0=q_0). +} +Prove: not ta_tmp_2. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 12) in 'reset'' in 'call_param_ref' at call 'reset' (file tests/wp_hoare/dispatch_var2.i, line 72) +: +Assume { + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 66) in 'call_param_ref' *) + (* Pre-condition: *) + Have: ra_q_0. + (* Block In *) + Have: not ta_tmp_3. +} +Prove: ra_q_0. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 27) in 'load'' in 'call_param_ref' at call 'load' (file tests/wp_hoare/dispatch_var2.i, line 73) +: +Assume { + (* Domain *) + Type: (is_sint32 q_0). + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 66) in 'call_param_ref' *) + (* Pre-condition: *) + Have: ra_q_0. + (* Block In *) + Have: not ta_tmp_3. + (* tests/wp_hoare/dispatch_var2.i:72: Call 'reset' *) + Have: ra_q_0 /\ (0=q_0). +} +Prove: ra_q_0. + +------------------------------------------------------------ +------------------------------------------------------------ + Function incr +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var2.i, line 21) in 'incr': +Assume { + (* Domain *) + Type: (is_sint32 ip_0) /\ (is_sint32 ip_1) /\ (is_sint32 ip_2). + (* Control Flow *) + Have: ip_0=ip_2. + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 19) in 'incr' *) + (* Pre-condition: *) + Have: ra_ip_1. + (* tests/wp_hoare/dispatch_var2.i:23: Assignment *) + Have: ip_1=(1+ip_2). +} +Prove: ip_1=(1+ip_0). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var2.i, line 20) in 'incr': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function load +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var2.i, line 29) in 'load': +Assume { + (* Domain *) + Type: (is_sint32 load_0) /\ (is_sint32 lp_0) /\ (is_sint32 retres_0). + (* Block In *) + Have: not ta_retres_3. + (* tests/wp_hoare/dispatch_var2.i:31: Assignment *) + Have: lp_0=retres_0. + (* tests/wp_hoare/dispatch_var2.i:31: Return *) + Have: load_0=retres_0. +} +Prove: load_0=lp_0. + +------------------------------------------------------------ + +Goal Assigns nothing in 'load': +Effect at line 31 +Assume { + (* Control Flow *) + Have: ta_retres_2=ta_retres_3. + (* Block In *) + Have: not ta_retres_3. +} +Prove: not ta_retres_2. + +------------------------------------------------------------ +------------------------------------------------------------ + Function reset +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var2.i, line 14) in 'reset': +Assume { + (* Domain *) + Type: (is_sint32 rp_0). + (* Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 12) in 'reset' *) + (* Pre-condition: *) + Have: ra_rp_1. + (* tests/wp_hoare/dispatch_var2.i:16: Assignment *) + Have: 0=rp_0. +} +Prove: 0=rp_0. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var2.i, line 13) in 'reset': +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/dispatch_var.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/dispatch_var.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/dispatch_var.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/dispatch_var.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,607 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/dispatch_var.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function array_in_struct_param +------------------------------------------------------------ + +Goal Post-condition 'Pload2' in 'array_in_struct_param': +Let a_0 = (shift_S (global P_sf_184) 0). +Assume { + (* Pre-condition (file tests/wp_hoare/dispatch_var.i, line 203) in 'array_in_struct_param' *) + (* Pre-condition: *) + Have: false. +} +Prove: (Load_S_S a_0 Mint_0).F_S_tab[i_0]= + (Array1_int (shiftfield_F_S_tab a_0) 10 Mint_0)[i_0]. + +------------------------------------------------------------ + +Goal Assigns nothing in 'array_in_struct_param': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_no_ref_bd +------------------------------------------------------------ + +Goal Post-condition 'Mem_n5_nr6' in 'call_no_ref_bd': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 114) in 'call_no_ref_bd' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 114) in 'call_no_ref_bd' (2/3): +Effect at line 121 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 114) in 'call_no_ref_bd' (3/3): +Call Result at line 122 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 114) in 'call_no_ref_bd' (1/5): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 114) in 'call_no_ref_bd' (2/5): +Effect at line 121 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 114) in 'call_no_ref_bd' (3/5): +Call Result at line 122 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 114) in 'call_no_ref_bd' (4/5): +Call Result at line 123 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 114) in 'call_no_ref_bd' (5/5): +Effect at line 122 +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_ref_bd +------------------------------------------------------------ + +Goal Post-condition 'Ref_r2' in 'call_ref_bd': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 51) in 'call_ref_bd': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 51) in 'call_ref_bd' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 51) in 'call_ref_bd' (2/2): +Call Result at line 57 +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_ref_bd2 +------------------------------------------------------------ + +Goal Post-condition 'Mem_n2' in 'call_ref_bd2': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 63) in 'call_ref_bd2' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 63) in 'call_ref_bd2' (2/2): +Effect at line 68 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 63) in 'call_ref_bd2' (1/5): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 63) in 'call_ref_bd2' (2/5): +Effect at line 68 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 63) in 'call_ref_bd2' (3/5): +Call Result at line 70 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 63) in 'call_ref_bd2' (4/5): +Effect at line 70 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 63) in 'call_ref_bd2' (5/5): +Effect at line 71 +Assume { (* tests/wp_hoare/dispatch_var.i:70: Else *) Have: false. } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_ref_ctr +------------------------------------------------------------ + +Goal Post-condition 'Ref_r1' in 'call_ref_ctr': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 17) in 'call_ref_ctr': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 17) in 'call_ref_ctr' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 17) in 'call_ref_ctr' (2/2): +Call Result at line 23 +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_ref_ctr2 +------------------------------------------------------------ + +Goal Post-condition 'Mem_n1' in 'call_ref_ctr2': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 28) in 'call_ref_ctr2' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 28) in 'call_ref_ctr2' (2/2): +Effect at line 33 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 28) in 'call_ref_ctr2' (1/5): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 28) in 'call_ref_ctr2' (2/5): +Effect at line 33 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 28) in 'call_ref_ctr2' (3/5): +Call Result at line 35 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 28) in 'call_ref_ctr2' (4/5): +Effect at line 35 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 28) in 'call_ref_ctr2' (5/5): +Effect at line 36 +Assume { (* tests/wp_hoare/dispatch_var.i:35: Else *) Have: false. } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_ref_ctr_nr +------------------------------------------------------------ + +Goal Post-condition 'R_R_R' in 'call_ref_ctr_nr': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'R_R_R' in 'call_ref_ctr_nr': +Assume { (* Domain *) Type: (is_sint32 r5_0). (* Goal *) When: 0!=r5_0. } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 139) in 'call_ref_ctr_nr' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 139) in 'call_ref_ctr_nr' (2/3): +Effect at line 147 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 139) in 'call_ref_ctr_nr' (3/3): +Effect at line 147 +Assume { + (* Domain *) + Type: (is_sint32 r5_0). + (* tests/wp_hoare/dispatch_var.i:147: Else *) + Have: 0!=r5_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 139) in 'call_ref_ctr_nr' (1/4): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 139) in 'call_ref_ctr_nr' (2/4): +Effect at line 147 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 139) in 'call_ref_ctr_nr' (3/4): +Effect at line 147 +Assume { + (* Domain *) + Type: (is_sint32 r5_0). + (* tests/wp_hoare/dispatch_var.i:147: Else *) + Have: 0!=r5_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 139) in 'call_ref_ctr_nr' (4/4): +Call Result at line 148 +Assume { + (* Domain *) + Type: (is_sint32 r5_0) /\ (is_sint32 ref_ctr_nr_0) + /\ (is_sint32 (ref_ctr_nr_0-2)). + (* tests/wp_hoare/dispatch_var.i:147: Conditional *) + If: 0=r5_0 + Then { + (* tests/wp_hoare/dispatch_var.i:147: Assignment *) + Have: 4=ref_ctr_nr_0. + } + Else { + (* tests/wp_hoare/dispatch_var.i:147: Assignment *) + Have: 4=ref_ctr_nr_0. + } +} +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var.i, line 129) in 'ref_ctr_nr'' in 'call_ref_ctr_nr' at call 'ref_ctr_nr' (file tests/wp_hoare/dispatch_var.i, line 148) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_ref_ctr_nstars +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var.i, line 162) in 'call_ref_ctr_nstars': +Assume { (* Heap *) Have: (linked Malloc_2). } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_ref_ctr_nstars' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_ref_ctr_nstars' (2/3): +Effect at line 167 +Assume { (* Heap *) Have: (linked Malloc_2). } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_ref_ctr_nstars' (3/3): +Effect at line 168 +Assume { (* Heap *) Have: (linked Malloc_2). } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_ref_ctr_nstars' (1/4): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_ref_ctr_nstars' (2/4): +Effect at line 167 +Assume { (* Heap *) Have: (linked Malloc_2). } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_ref_ctr_nstars' (3/4): +Effect at line 168 +Assume { (* Heap *) Have: (linked Malloc_2). } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_ref_ctr_nstars' (4/4): +Call Result at line 169 +Assume { (* Heap *) Have: (linked Malloc_2). } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_ref_valid +------------------------------------------------------------ + +Goal Post-condition 'R7_N4' in 'call_ref_valid': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 87) in 'call_ref_valid' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 87) in 'call_ref_valid' (2/3): +Effect at line 94 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 87) in 'call_ref_valid' (3/3): +Call Result at line 95 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 87) in 'call_ref_valid' (1/5): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 87) in 'call_ref_valid' (2/5): +Effect at line 94 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 87) in 'call_ref_valid' (3/5): +Call Result at line 95 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 87) in 'call_ref_valid' (4/5): +Call Result at line 96 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 87) in 'call_ref_valid' (5/5): +Effect at line 95 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var.i, line 79) in 'ref_valid'' in 'call_ref_valid' at call 'ref_valid' (file tests/wp_hoare/dispatch_var.i, line 95) +: +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var.i, line 79) in 'ref_valid'' in 'call_ref_valid' at call 'ref_valid' (file tests/wp_hoare/dispatch_var.i, line 96) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_two_ref +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var.i, line 177) in 'call_two_ref': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 176) in 'call_two_ref' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 176) in 'call_two_ref' (2/2): +Call Result at line 182 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 176) in 'call_two_ref' (1/4): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 176) in 'call_two_ref' (2/4): +Call Result at line 182 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 176) in 'call_two_ref' (3/4): +Call Result at line 182 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/dispatch_var.i, line 176) in 'call_two_ref' (4/4): +Effect at line 182 +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function g +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var.i, line 192) in 'g': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'g': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'g' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'g' (2/2): +Call Result at line 195 +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function no_ref_bd +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var.i, line 104) in 'no_ref_bd': +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[q1_0]). + (* Heap *) + Have: (region (base q1_0))<=0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'no_ref_bd' (1/2): +Effect at line 108 +Assume { (* Heap *) Have: (region (base q1_1))<=0. } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'no_ref_bd' (2/2): +Effect at line 109 +Assume { (* Heap *) Have: (region (base q1_1))<=0. } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function ref_bd +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/dispatch_var.i, line 42) in 'ref_bd': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'ref_bd': +Effect at line 46 +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/isHoare.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/isHoare.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/isHoare.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/isHoare.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,17 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/isHoare.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function cmp_invalid_addr_as_int +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'cmp_invalid_addr_as_int': +Assume { (* Heap *) Have: (linked Malloc_4). } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/logicarr.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/logicarr.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/logicarr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/logicarr.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,42 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/logicarr.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_hoare/logicarr.i:27:[wp] warning: Cast from (int [10]) to (int []) not implemented yet +[wp] Collecting variable usage +tests/wp_hoare/logicarr.i:26:[wp] warning: Cast from (int [10]) to (int []) not implemented yet +tests/wp_hoare/logicarr.i:26:[wp] warning: Cast from (int [10]) to (int []) not implemented yet +------------------------------------------------------------ + Function job +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,PTR,todo' in 'job': +Assume { (* Domain *) Type: (is_sint32 i_0) /\ (is_sint32 j_0). } +Prove: (P_p_pointer Mint_0 Mint_0 (shift_A10_sint32 (global G_arr_80) 0) i_0 + j_0). + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,ARR,todo' in 'job': +tests/wp_hoare/logicarr.i:26: warning from wp: + - Warning: Hide sub-term definition + Reason: Cast from (int [10]) to (int []) not implemented yet +tests/wp_hoare/logicarr.i:26: warning from wp: + - Warning: Hide sub-term definition + Reason: Cast from (int [10]) to (int []) not implemented yet +Assume { (* Domain *) Type: (is_sint32 i_0) /\ (is_sint32 j_0). } +Prove: (P_p_arrays w_1 i_0 w_2 j_0). + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,DUM,todo' in 'job': +tests/wp_hoare/logicarr.i:27: warning from wp: + - Warning: Hide sub-term definition + Reason: Cast from (int [10]) to (int []) not implemented yet +Assume { (* Domain *) Type: (is_sint32 j_0) /\ (is_sint32 k_0). } +Prove: (P_p_dummy w_0 j_0 k_0). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/logicref.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/logicref.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/logicref.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/logicref.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,85 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/logicref.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function fvrange_n +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/logicref.i, line 11) in 'fvrange_n': +Assume { + (* Domain *) + Type: (is_sint32 i_0) /\ (is_sint32 k_0). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0). + (* Pre-condition (file tests/wp_hoare/logicref.i, line 11) in 'fvrange_n' *) + (* Pre-condition: *) + Have: (i_0 (i_0<=4) + -> (reg_load_0[i_0]=Mint_0[(shift_sint32 a_0 i_0)]). + (* tests/wp_hoare/reference_and_struct.i:94: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_load_0[i_0]=reg_load_1[i_0]). +} +Prove: reg_load_0[i_1]=Mint_0[(shift_sint32 a_0 i_1)]. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_and_struct.i, line 91) in 'call_on_array_in_struct_global': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_and_struct.i, line 91) in 'call_on_array_in_struct_global': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_and_struct.i, line 83) in 'load_5'' in 'call_on_array_in_struct_global' at call 'load_5' (file tests/wp_hoare/reference_and_struct.i, line 94) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_reset +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/reference_and_struct.i, line 20) in 'call_reset': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_and_struct.i, line 19) in 'call_reset': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_and_struct.i, line 19) in 'call_reset' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_and_struct.i, line 19) in 'call_reset' (2/2): +Effect at line 23 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_and_struct.i, line 11) in 'reset'' in 'call_reset' at call 'reset' (file tests/wp_hoare/reference_and_struct.i, line 23) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_reset_1_5 +------------------------------------------------------------ + +Goal Post-condition 'Presset_mat' in 'call_reset_1_5': +Let a_0 = (shift_A5_T (shift_A20_A5_T (global G_smatrix_104) 0) 0). +Assume { + (* Goal *) + When: (0<=i_1) /\ (i_1<=4). + (* tests/wp_hoare/reference_and_struct.i:67: Call 'reset_1_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) + -> (0=Mint_0[(shiftfield_F_T_a (shift_T a_0 i_0))]). + (* tests/wp_hoare/reference_and_struct.i:67: Call Effects *) + Have: (havoc Mint_1 Mint_0 (shift_T a_0 0) 10). +} +Prove: 0=Mint_0[(shiftfield_F_T_a (shift_T a_0 i_1))]. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_and_struct.i, line 63) in 'call_reset_1_5': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_and_struct.i, line 63) in 'call_reset_1_5': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_and_struct.i, line 53) in 'reset_1_5'' in 'call_reset_1_5' at call 'reset_1_5' (file tests/wp_hoare/reference_and_struct.i, line 67) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_reset_5 +------------------------------------------------------------ + +Goal Post-condition 'Preset_5' in 'call_reset_5': +Let a_0 = (shift_A10_T (global G_ts_84) 0). +Assume { + (* Goal *) + When: (0<=i_1) /\ (i_1<=4). + (* tests/wp_hoare/reference_and_struct.i:39: Call 'reset_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) + -> (0=Mint_0[(shiftfield_F_T_a (shift_T a_0 i_0))]). + (* tests/wp_hoare/reference_and_struct.i:39: Call Effects *) + Have: (havoc Mint_1 Mint_0 (shift_T a_0 0) 10). +} +Prove: 0=Mint_0[(shiftfield_F_T_a (shift_T a_0 i_1))]. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_and_struct.i, line 35) in 'call_reset_5': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_and_struct.i, line 35) in 'call_reset_5': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_and_struct.i, line 26) in 'reset_5'' in 'call_reset_5' at call 'reset_5' (file tests/wp_hoare/reference_and_struct.i, line 39) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_reset_5_dim2 +------------------------------------------------------------ + +Goal Post-condition 'Presset_mat' in 'call_reset_5_dim2': +Let a_0 = (shift_A5_T (shift_A20_A5_T (global G_smatrix_104) 0) 1). +Assume { + (* Goal *) + When: (0<=i_1) /\ (i_1<=4). + (* tests/wp_hoare/reference_and_struct.i:75: Call 'reset_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) + -> (0=Mint_0[(shiftfield_F_T_a (shift_T a_0 i_0))]). + (* tests/wp_hoare/reference_and_struct.i:75: Call Effects *) + Have: (havoc Mint_1 Mint_0 (shift_T a_0 0) 10). +} +Prove: 0=Mint_0[(shiftfield_F_T_a (shift_T a_0 i_1))]. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_and_struct.i, line 71) in 'call_reset_5_dim2': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_and_struct.i, line 71) in 'call_reset_5_dim2': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_and_struct.i, line 26) in 'reset_5'' in 'call_reset_5_dim2' at call 'reset_5' (file tests/wp_hoare/reference_and_struct.i, line 75) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_reset_5_tps +------------------------------------------------------------ + +Goal Post-condition 'Preset_5_tps' in 'call_reset_5_tps': +Let a_0 = tps_0[9]. +Let a_1 = (shift_T a_0 0). +Assume { + (* Goal *) + When: (0<=i_1) /\ (i_1<=4). + (* Heap *) + Have: (linked Malloc_0). + (* Pre-condition (file tests/wp_hoare/reference_and_struct.i, line 44) in 'call_reset_5_tps' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_1 10). + (* tests/wp_hoare/reference_and_struct.i:49: Call 'reset_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) + -> (0=Mint_0[(shiftfield_F_T_a (shift_T a_0 i_0))]). + (* tests/wp_hoare/reference_and_struct.i:49: Call Effects *) + Have: (havoc Mint_1 Mint_0 a_1 10). +} +Prove: 0=Mint_0[(shiftfield_F_T_a (shift_T a_0 i_1))]. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_and_struct.i, line 45) in 'call_reset_5_tps': +Call Effect at line 49 +Let a_0 = (shift_T tps_0[9] 0). +Assume { + (* Goal *) + When: (valid_rd Malloc_0 a_0 10). + (* Heap *) + Have: (linked Malloc_0). + (* Pre-condition (file tests/wp_hoare/reference_and_struct.i, line 44) in 'call_reset_5_tps' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_0 10). + (* tests/wp_hoare/reference_and_struct.i:49: Exit Effects *) + Have: (havoc Mint_2 Mint_0 a_0 10). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_and_struct.i, line 45) in 'call_reset_5_tps': +Call Effect at line 49 +Let a_0 = tps_0[9]. +Let a_1 = (shift_T a_0 0). +Assume { + (* Goal *) + When: (valid_rd Malloc_0 a_1 10). + (* Heap *) + Have: (linked Malloc_0). + (* Pre-condition (file tests/wp_hoare/reference_and_struct.i, line 44) in 'call_reset_5_tps' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_1 10). + (* tests/wp_hoare/reference_and_struct.i:49: Call 'reset_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) + -> (0=Mint_0[(shiftfield_F_T_a (shift_T a_0 i_0))]). + (* tests/wp_hoare/reference_and_struct.i:49: Call Effects *) + Have: (havoc Mint_1 Mint_0 a_1 10). +} +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_and_struct.i, line 26) in 'reset_5'' in 'call_reset_5_tps' at call 'reset_5' (file tests/wp_hoare/reference_and_struct.i, line 49) +: +Assume { + (* Heap *) + Have: (linked Malloc_0). + (* Pre-condition (file tests/wp_hoare/reference_and_struct.i, line 44) in 'call_reset_5_tps' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 (shift_T tps_0[9] 0) 10). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function reset +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/reference_and_struct.i, line 13) in 'reset': +Assume { + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base p_0))<=0). + (* Pre-condition (file tests/wp_hoare/reference_and_struct.i, line 11) in 'reset' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 p_0 2). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_and_struct.i, line 12) in 'reset': +Effect at line 15 +Let a_0 = (shiftfield_F_T_a p_0). +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[a_0]). + (* Goal *) + When: (valid_rd Malloc_0 a_0 1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base p_0))<=0). + (* Pre-condition (file tests/wp_hoare/reference_and_struct.i, line 11) in 'reset' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 p_0 2). +} +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/reference_array.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/reference_array.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/reference_array.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/reference_array.1.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,288 @@ +[wp:var_kind] [incr_addr] t +[wp:var_kind] [incr_addr] t +[wp:var_kind] [incr_addr] t +[wp:var_kind] [incr_addr] tt +[wp:var_kind] [incr_addr] tt +[wp:var_kind] [incr_addr] tt +[wp:var_kind] [incr_addr] s +[wp:var_kind] [incr_addr] sp +[wp:var_kind] [incr_addr] sp +[wp:var_kind] [ByARef] first step + (fp,1) +[wp:var_kind] [ByARef] fp not yet +[wp:var_kind] [ByARef] add (fp,1) +[wp:var_kind] [ByARef] first step + (hp,1) +[wp:var_kind] [ByARef] hp not yet +[wp:var_kind] [ByARef] add (hp,1) +[wp:var_kind] [ByARef] first step + (gp,1) +[wp:var_kind] [ByARef] gp not yet +[wp:var_kind] [ByARef] add (gp,1) +[wp:var_kind] [ByARef] first step + (rp,1) +[wp:var_kind] [ByARef] rp not yet +[wp:var_kind] [ByARef] add (rp,1) +[wp:var_kind] [ByARef] first step + (rp,1) +[wp:var_kind] [ByARef] (rp,1) already +[wp:var_kind] [ByARef] first step + (lp,1) +[wp:var_kind] [ByARef] lp not yet +[wp:var_kind] [ByARef] add (lp,1) +[wp:var_kind] [ByARef] first step + (ap,1) +[wp:var_kind] [ByARef] ap not yet +[wp:var_kind] [ByARef] add (ap,1) +[wp:var_kind] [ByPRef] first step + (sp,0) +[wp:var_kind] [ByPRef] sp not yet +[wp:var_kind] [ByPRef] add (sp,0) +[wp:var_kind] [BuiltinCall] fp ByARef +[wp:var_kind] [BuiltinCall] fp + call(Prop,0,not address taken) +[wp:var_kind] [BuiltinCall] hp ByARef +[wp:var_kind] [BuiltinCall] hp + call(Prop,0,not address taken) +[wp:var_kind] [BuiltinCall] gp not yet ByPRef +[wp:var_kind] [BuiltinCall] gp ByARef +[wp:var_kind] [BuiltinCall] gp + call(Prop,1,not address taken) +[wp:var_kind] [BuiltinCall] rp ByARef +[wp:var_kind] [BuiltinCall] rp + call(Prop,0,not address taken) +[wp:var_kind] [BuiltinCall] lp ByARef +[wp:var_kind] [BuiltinCall] lp + call(Prop,0,not address taken) +[wp:var_kind] [BuiltinCall] ap not yet ByPRef +[wp:var_kind] [BuiltinCall] ap ByARef +[wp:var_kind] [BuiltinCall] ap + call(Prop,1,not address taken) +[wp:var_kind] [collect_calls] t not yet in ArgAref +[wp:var_kind] [ArgARef] try + t +[wp:var_kind] [ArgARef] + t +[wp:var_kind] [collect_calls] t + call(hp,0,address taken) +[wp:var_kind] [collect_calls] t ArfARef +[wp:var_kind] [collect_calls] t + call(fp,0,address taken) +[wp:var_kind] [collect_calls] t ArfARef +[wp:var_kind] [collect_calls] t + call(gp,0,address taken) +[wp:var_kind] [collect_calls] tt not yet in ArgAref +[wp:var_kind] [ArgARef] try + tt +[wp:var_kind] [ArgARef] + tt +[wp:var_kind] [collect_calls] tt + call(lp,0,address taken) +[wp:var_kind] [collect_calls] tt ArfARef +[wp:var_kind] [collect_calls] tt + call(rp,0,address taken) +[wp:var_kind] [collect_calls] tt ArfARef +[wp:var_kind] [collect_calls] tt + call(ap,0,address taken) +[wp:var_kind] [collect_calls] s not yet in ArgAref +[wp:var_kind] [ArgARef] try + s +[wp:var_kind] [ArgARef] + s +[wp:var_kind] [collect_calls] s + call(hp,0,address taken) +[wp:var_kind] [collect_calls] sp not yet ByARef +[wp:var_kind] [ByARef] first step + (sp,0) +[wp:var_kind] [ByARef] sp not yet +[wp:var_kind] [ByARef] add (sp,0) +[wp:var_kind] [collect_calls] sp + call(fp,0,address taken) +[wp:var_kind] [BuiltinCall] sp ByPRef +[wp:var_kind] [BuiltinCall] sp + call(Prop,0,address taken) +[wp:var_kind] [by_array_reference] fp ByAref +[wp:var_kind] [decr_addr] sp +[wp:var_kind] [by_array_reference] sp ByAref +[wp:var_kind] [by_array_reference] rp ByAref +[wp:var_kind] [by_array_reference] hp ByAref +[wp:var_kind] [by_array_reference] lp ByAref +[wp:var_kind] [by_array_reference] fp ByAref +[wp:var_kind] [by_array_reference] gp ByAref +[wp:var_kind] [by_array_reference] ap ByAref +[wp:var_kind] [decr_addr] sp +[wp:var_kind] [by_ptr_reference] sp ByPref +[wp:var_kind] [decr_addr] t +[wp:var_kind] [decr_addr] t +[wp:var_kind] [decr_addr] t +[wp:var_kind] [array_reference arg] t ArgAref +[wp:var_kind] [decr_addr] tt +[wp:var_kind] [decr_addr] tt +[wp:var_kind] [decr_addr] tt +[wp:var_kind] [array_reference arg] tt ArgAref +[wp:var_kind] [decr_addr] s +[wp:var_kind] [array_reference arg] s ArgAref +[wp:var_kind] [resolves addr taken] sp: remove addrtaken +[wp:var_kind] [resolves addr taken] t: remove addrtaken +[wp:var_kind] [resolves addr taken] tt: remove addrtaken +[wp:var_kind] [resolves addr taken] s: remove addrtaken +[kernel] warning: No code for function reset_5, default assigns generated for default behavior +[wp] warning: Missing RTE guards +[wp:var_kind] rp is a array ref param of arity 1 +[wp:var_kind] rp is a array ref param of arity 1 +[wp:var_kind] rp is a array ref param of arity 1 +[wp] warning: Assuming contracts of external functions +[wp:var_kind] rp is a array ref param of arity 1 +[wp:var_kind] rp is a array ref param of arity 1 +[wp:var_kind] rp is a array ref param of arity 1 +[wp:var_kind] rp is a array ref param of arity 1 +[wp:var_kind] rp is a array ref param of arity 1 +[wp:var_kind] rp is a array ref param of arity 1 +[wp:var_kind] rp is a array ref param of arity 1 +[wp:var_kind] rp is a array ref param of arity 1 +[wp:var_kind] rp is a array ref param of arity 1 +[wp:var_kind] rp is a array ref param of arity 1 +[wp:var_kind] reg_load is a funvar +[wp:var_kind] lp is a array ref param of arity 1 +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] lp is a array ref param of arity 1 +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] lp is a array ref param of arity 1 +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] lp is a array ref param of arity 1 +[wp:var_kind] reg_load is a funvar +[wp:var_kind] lp is a array ref param of arity 1 +[wp:var_kind] lp is a array ref param of arity 1 +[wp:var_kind] lp is a array ref param of arity 1 +[wp:var_kind] lp is a array ref param of arity 1 +[wp:var_kind] lp is a array ref param of arity 1 +[wp:var_kind] lp is a array ref param of arity 1 +[wp:var_kind] lp is a array ref param of arity 1 +[wp] [WP:simplified] Goal store_load_1_5_exit_assigns : Valid +[wp] [WP:simplified] Goal store_load_1_5_normal_assigns : Valid +[wp:var_kind] reg_add is a funvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp:var_kind] tt is a array refvar +[wp] warning: Use -wp-warnings for details about 'Stronger' and 'Degenerated' goals +[wp] warning: Stronger goal store_calls_on_array_dim_2_post_16_Pload (3 warnings) +[wp] warning: Stronger goal store_calls_on_array_dim_2_post_17_Preset (3 warnings) +[wp] warning: Stronger goal store_calls_on_array_dim_2_post_18_Padd (3 warnings) +[wp] warning: Stronger goal store_calls_on_array_dim_2_exit_assigns (5 warnings) +[wp] warning: Stronger goal store_calls_on_array_dim_2_normal_assigns (3 warnings) +[wp] warning: Stronger goal store_calls_on_array_dim_2_pre12_add_1_5_s17 (3 warnings) +[wp] warning: Stronger goal store_calls_on_array_dim_2_pre10_load_1_5_s15 (1 warning) +[wp] warning: Stronger goal store_calls_on_array_dim_2_pre8_reset_1_5_s16 (2 warnings) +[wp:var_kind] reg_add is a funvar +[wp:var_kind] t is a array refvar +[wp:var_kind] t is a array refvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] t is a array refvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] t is a array refvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] t is a array refvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] t is a array refvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] t is a array refvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] t is a array refvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] t is a array refvar +[wp:var_kind] t is a array refvar +[wp:var_kind] t is a array refvar +[wp:var_kind] t is a array refvar +[wp:var_kind] t is a array refvar +[wp:var_kind] t is a array refvar +[wp:var_kind] t is a array refvar +[wp:var_kind] t is a array refvar +[wp:var_kind] t is a array refvar +[wp:var_kind] t is a array refvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] t is a array refvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] t is a array refvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] t is a array refvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] t is a array refvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] t is a array refvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] t is a array refvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] t is a array refvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] t is a array refvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] s is a array refvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] s is a array refvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] s is a array refvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] s is a array refvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] s is a array refvar +[wp] [WP:simplified] Goal store_call_on_array_in_struct_global_exit_assigns : Valid +[wp] [WP:simplified] Goal store_call_on_array_in_struct_global_normal_assigns : Valid +[wp:var_kind] sp is a ptr ref param of arity 0 +[wp:var_kind] sp is a ptr ref param of arity 0 +[wp:var_kind] sp is a ptr ref param of arity 0 +[wp:var_kind] sp is a ptr ref param of arity 0 +[wp:var_kind] sp is a ptr ref param of arity 0 +[wp:var_kind] sp is a ptr ref param of arity 0 +[wp:var_kind] sp is a ptr ref param of arity 0 +[wp:var_kind] sp is a ptr ref param of arity 0 +[wp:var_kind] sp is a ptr ref param of arity 0 +[wp:var_kind] sp is a ptr ref param of arity 0 +[wp:var_kind] sp is a ptr ref param of arity 0 +[wp:var_kind] sp is a ptr ref param of arity 0 +[wp:var_kind] sp is a ptr ref param of arity 0 +[wp:var_kind] reg_add is a funvar +[wp:var_kind] ap is a array ref param of arity 1 +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] ap is a array ref param of arity 1 +[wp:var_kind] reg_add is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] ap is a array ref param of arity 1 +[wp:var_kind] reg_add is a funvar +[wp:var_kind] reg_load is a funvar +[wp:var_kind] reg_add is a funvar +[wp:var_kind] ap is a array ref param of arity 1 +[wp:var_kind] reg_add is a funvar +[wp:var_kind] ap is a array ref param of arity 1 +[wp:var_kind] ap is a array ref param of arity 1 +[wp:var_kind] ap is a array ref param of arity 1 +[wp:var_kind] ap is a array ref param of arity 1 +[wp:var_kind] ap is a array ref param of arity 1 +[wp:var_kind] ap is a array ref param of arity 1 +[wp:var_kind] ap is a array ref param of arity 1 +[wp] [WP:simplified] Goal store_add_1_5_exit_assigns : Valid +[wp] [WP:simplified] Goal store_add_1_5_normal_assigns : Valid diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/reference_array.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/reference_array.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/reference_array.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/reference_array.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,643 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/reference_array.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function add_1_5 +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/reference_array.i, line 49) in 'add_1_5': +Let a_0 = (shift_A5_sint32 ap_0 0). +Assume { + (* Goal *) + When: (0<=i_1) /\ (i_1<=4). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base ap_0))<=0). + (* Pre-condition (file tests/wp_hoare/reference_array.i, line 47) in 'add_1_5' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 (shift_sint32 a_0 0) 5). + (* tests/wp_hoare/reference_array.i:52: Call 'add_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) + -> (reg_add_0[i_0]=(reg_load_0[i_0]+Mint_0[(shift_sint32 a_0 i_0)])). + (* tests/wp_hoare/reference_array.i:52: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_add_0[i_0]=reg_add_1[i_0]). +} +Prove: reg_add_0[i_1]=(reg_load_0[i_1]+Mint_0[(shift_sint32 a_0 i_1)]). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_array.i, line 48) in 'add_1_5': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_array.i, line 48) in 'add_1_5': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_array.i, line 26) in 'add_5'' in 'add_1_5' at call 'add_5' (file tests/wp_hoare/reference_array.i, line 52) +: +Assume { + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base ap_2))<=0). + (* Pre-condition (file tests/wp_hoare/reference_array.i, line 47) in 'add_1_5' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 (shift_sint32 (shift_A5_sint32 ap_2 0) 0) 5). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function calls_on_array_dim_1 +------------------------------------------------------------ + +Goal Post-condition 'Pload' in 'calls_on_array_dim_1': +Assume { + (* Goal *) + When: (0<=i_3) /\ (i_3<=4). + (* tests/wp_hoare/reference_array.i:65: Call 'load_5' *) + Have: forall i_0:int. (0<=i_0) -> (i_0<=4) -> (reg_load_0[i_0]=t_2[i_0]). + (* tests/wp_hoare/reference_array.i:65: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_load_0[i_0]=reg_load_1[i_0]). + (* tests/wp_hoare/reference_array.i:66: Call 'reset_5' *) + Have: forall i_0:int. (0<=i_0) -> (i_0<=4) -> (0=t_1[i_0]). + (* tests/wp_hoare/reference_array.i:66: Call Effects *) + Have: forall i_0:int. ((i_0<0) \/ (5<=i_0)) -> (t_1[i_0]=t_2[i_0]). + (* tests/wp_hoare/reference_array.i:67: Call 'add_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) -> (reg_add_0[i_0]=(reg_load_0[i_0]+t_1[i_0])). + (* tests/wp_hoare/reference_array.i:67: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_add_0[i_0]=reg_add_1[i_0]). +} +Prove: reg_load_0[i_3]=t_2[i_3]. + +------------------------------------------------------------ + +Goal Post-condition 'Preset' in 'calls_on_array_dim_1': +Assume { + (* Goal *) + When: (0<=i_1) /\ (i_1<=4). + (* tests/wp_hoare/reference_array.i:65: Call 'load_5' *) + Have: forall i_0:int. (0<=i_0) -> (i_0<=4) -> (reg_load_0[i_0]=t_2[i_0]). + (* tests/wp_hoare/reference_array.i:65: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_load_0[i_0]=reg_load_1[i_0]). + (* tests/wp_hoare/reference_array.i:66: Call 'reset_5' *) + Have: forall i_0:int. (0<=i_0) -> (i_0<=4) -> (0=t_1[i_0]). + (* tests/wp_hoare/reference_array.i:66: Call Effects *) + Have: forall i_0:int. ((i_0<0) \/ (5<=i_0)) -> (t_1[i_0]=t_2[i_0]). + (* tests/wp_hoare/reference_array.i:67: Call 'add_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) -> (reg_add_0[i_0]=(reg_load_0[i_0]+t_1[i_0])). + (* tests/wp_hoare/reference_array.i:67: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_add_0[i_0]=reg_add_1[i_0]). +} +Prove: 0=t_1[i_1]. + +------------------------------------------------------------ + +Goal Post-condition 'Padd' in 'calls_on_array_dim_1': +Assume { + (* Goal *) + When: (0<=i_0) /\ (i_0<=4). + (* tests/wp_hoare/reference_array.i:65: Call 'load_5' *) + Have: forall i_1:int. (0<=i_1) -> (i_1<=4) -> (reg_load_0[i_1]=t_2[i_1]). + (* tests/wp_hoare/reference_array.i:65: Call Effects *) + Have: forall i_1:int. + ((i_1<0) \/ (5<=i_1)) -> (reg_load_0[i_1]=reg_load_1[i_1]). + (* tests/wp_hoare/reference_array.i:66: Call 'reset_5' *) + Have: forall i_1:int. (0<=i_1) -> (i_1<=4) -> (0=t_1[i_1]). + (* tests/wp_hoare/reference_array.i:66: Call Effects *) + Have: forall i_1:int. ((i_1<0) \/ (5<=i_1)) -> (t_1[i_1]=t_2[i_1]). + (* tests/wp_hoare/reference_array.i:67: Call 'add_5' *) + Have: forall i_1:int. + (0<=i_1) -> (i_1<=4) -> (reg_add_0[i_1]=(reg_load_0[i_1]+t_1[i_1])). + (* tests/wp_hoare/reference_array.i:67: Call Effects *) + Have: forall i_1:int. + ((i_1<0) \/ (5<=i_1)) -> (reg_add_0[i_1]=reg_add_1[i_1]). +} +Prove: reg_add_0[i_0]=t_2[i_0]. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_array.i, line 58) in 'calls_on_array_dim_1': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_array.i, line 58) in 'calls_on_array_dim_1': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_array.i, line 19) in 'load_5'' in 'calls_on_array_dim_1' at call 'load_5' (file tests/wp_hoare/reference_array.i, line 65) +: +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_array.i, line 9) in 'reset_5'' in 'calls_on_array_dim_1' at call 'reset_5' (file tests/wp_hoare/reference_array.i, line 66) +: +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_array.i, line 26) in 'add_5'' in 'calls_on_array_dim_1' at call 'add_5' (file tests/wp_hoare/reference_array.i, line 67) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function calls_on_array_dim_2 +------------------------------------------------------------ + +Goal Post-condition 'Pload' in 'calls_on_array_dim_2': +Let m_0 = tt_2[0]. +Let m_1 = tt_1[0]. +Assume { + (* Goal *) + When: (0<=i_3) /\ (i_3<=4). + (* tests/wp_hoare/reference_array.i:98: Call 'load_1_5' *) + Have: forall i_0:int. (0<=i_0) -> (i_0<=4) -> (reg_load_0[i_0]=m_0[i_0]). + (* tests/wp_hoare/reference_array.i:98: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_load_0[i_0]=reg_load_1[i_0]). + (* tests/wp_hoare/reference_array.i:99: Call 'reset_1_5' *) + Have: forall i_0:int. (0<=i_0) -> (i_0<=4) -> (0=m_1[i_0]). + (* tests/wp_hoare/reference_array.i:99: Call Effects *) + Have: (forall i_0:int. + (0!=i_0) -> (tt_1[i_0]=tt_2[i_0])) + /\ (forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (m_1[i_0]=m_0[i_0])). + (* tests/wp_hoare/reference_array.i:100: Call 'add_1_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) -> (reg_add_0[i_0]=(reg_load_0[i_0]+m_1[i_0])). + (* tests/wp_hoare/reference_array.i:100: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_add_0[i_0]=reg_add_1[i_0]). +} +Prove: reg_load_0[i_3]=m_0[i_3]. + +------------------------------------------------------------ + +Goal Post-condition 'Preset' in 'calls_on_array_dim_2': +Let m_0 = tt_1[0]. +Let m_1 = tt_2[0]. +Assume { + (* Goal *) + When: (0<=i_1) /\ (i_1<=4). + (* tests/wp_hoare/reference_array.i:98: Call 'load_1_5' *) + Have: forall i_0:int. (0<=i_0) -> (i_0<=4) -> (reg_load_0[i_0]=m_1[i_0]). + (* tests/wp_hoare/reference_array.i:98: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_load_0[i_0]=reg_load_1[i_0]). + (* tests/wp_hoare/reference_array.i:99: Call 'reset_1_5' *) + Have: forall i_0:int. (0<=i_0) -> (i_0<=4) -> (0=m_0[i_0]). + (* tests/wp_hoare/reference_array.i:99: Call Effects *) + Have: (forall i_0:int. + (0!=i_0) -> (tt_1[i_0]=tt_2[i_0])) + /\ (forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (m_0[i_0]=m_1[i_0])). + (* tests/wp_hoare/reference_array.i:100: Call 'add_1_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) -> (reg_add_0[i_0]=(reg_load_0[i_0]+m_0[i_0])). + (* tests/wp_hoare/reference_array.i:100: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_add_0[i_0]=reg_add_1[i_0]). +} +Prove: 0=m_0[i_1]. + +------------------------------------------------------------ + +Goal Post-condition 'Padd' in 'calls_on_array_dim_2': +Let m_0 = tt_2[0]. +Let m_1 = tt_1[0]. +Assume { + (* Goal *) + When: (0<=i_0) /\ (i_0<=4). + (* tests/wp_hoare/reference_array.i:98: Call 'load_1_5' *) + Have: forall i_1:int. (0<=i_1) -> (i_1<=4) -> (reg_load_0[i_1]=m_0[i_1]). + (* tests/wp_hoare/reference_array.i:98: Call Effects *) + Have: forall i_1:int. + ((i_1<0) \/ (5<=i_1)) -> (reg_load_0[i_1]=reg_load_1[i_1]). + (* tests/wp_hoare/reference_array.i:99: Call 'reset_1_5' *) + Have: forall i_1:int. (0<=i_1) -> (i_1<=4) -> (0=m_1[i_1]). + (* tests/wp_hoare/reference_array.i:99: Call Effects *) + Have: (forall i_1:int. + (0!=i_1) -> (tt_1[i_1]=tt_2[i_1])) + /\ (forall i_1:int. + ((i_1<0) \/ (5<=i_1)) -> (m_1[i_1]=m_0[i_1])). + (* tests/wp_hoare/reference_array.i:100: Call 'add_1_5' *) + Have: forall i_1:int. + (0<=i_1) -> (i_1<=4) -> (reg_add_0[i_1]=(reg_load_0[i_1]+m_1[i_1])). + (* tests/wp_hoare/reference_array.i:100: Call Effects *) + Have: forall i_1:int. + ((i_1<0) \/ (5<=i_1)) -> (reg_add_0[i_1]=reg_add_1[i_1]). +} +Prove: reg_add_0[i_0]=m_0[i_0]. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_array.i, line 91) in 'calls_on_array_dim_2': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_array.i, line 91) in 'calls_on_array_dim_2': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_array.i, line 40) in 'load_1_5'' in 'calls_on_array_dim_2' at call 'load_1_5' (file tests/wp_hoare/reference_array.i, line 98) +: +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_array.i, line 33) in 'reset_1_5'' in 'calls_on_array_dim_2' at call 'reset_1_5' (file tests/wp_hoare/reference_array.i, line 99) +: +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_array.i, line 47) in 'add_1_5'' in 'calls_on_array_dim_2' at call 'add_1_5' (file tests/wp_hoare/reference_array.i, line 100) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function calls_on_array_dim_2_to_1 +------------------------------------------------------------ + +Goal Post-condition 'todo,Pload' in 'calls_on_array_dim_2_to_1': +Let a_0 = (shift_A20_A5_sint32 (global G_tt_110) 0). +Let a_1 = (shift_sint32 a_0 0). +Assume { + (* Goal *) + When: (0<=i_3) /\ (i_3<=4). + (* Heap *) + Have: (linked Malloc_0). + (* tests/wp_hoare/reference_array.i:83: Call 'load_5' *) + Have: (valid_rw Malloc_0 a_1 5) + /\ (forall i_0:int. + (0<=i_0) -> (i_0<=4) + -> (reg_load_0[i_0]=Mint_1[(shift_sint32 a_0 i_0)])). + (* tests/wp_hoare/reference_array.i:83: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_load_0[i_0]=reg_load_1[i_0]). + (* tests/wp_hoare/reference_array.i:84: Call 'reset_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) -> (0=Mint_0[(shift_sint32 a_0 i_0)]). + (* tests/wp_hoare/reference_array.i:84: Call Effects *) + Have: (havoc Mint_1 Mint_0 a_1 5). + (* tests/wp_hoare/reference_array.i:85: Call 'add_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) + -> (reg_add_0[i_0]=(reg_load_0[i_0]+Mint_0[(shift_sint32 a_0 i_0)])). + (* tests/wp_hoare/reference_array.i:85: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_add_0[i_0]=reg_add_1[i_0]). +} +Prove: reg_load_0[i_3]=tt_0[0][i_3]. + +------------------------------------------------------------ + +Goal Post-condition 'todo,Preset' in 'calls_on_array_dim_2_to_1': +Let a_0 = (shift_A20_A5_sint32 (global G_tt_110) 0). +Let a_1 = (shift_sint32 a_0 0). +Assume { + (* Goal *) + When: (0<=i_1) /\ (i_1<=4). + (* Heap *) + Have: (linked Malloc_0). + (* tests/wp_hoare/reference_array.i:83: Call 'load_5' *) + Have: (valid_rw Malloc_0 a_1 5) + /\ (forall i_0:int. + (0<=i_0) -> (i_0<=4) + -> (reg_load_0[i_0]=Mint_1[(shift_sint32 a_0 i_0)])). + (* tests/wp_hoare/reference_array.i:83: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_load_0[i_0]=reg_load_1[i_0]). + (* tests/wp_hoare/reference_array.i:84: Call 'reset_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) -> (0=Mint_0[(shift_sint32 a_0 i_0)]). + (* tests/wp_hoare/reference_array.i:84: Call Effects *) + Have: (havoc Mint_1 Mint_0 a_1 5). + (* tests/wp_hoare/reference_array.i:85: Call 'add_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) + -> (reg_add_0[i_0]=(reg_load_0[i_0]+Mint_0[(shift_sint32 a_0 i_0)])). + (* tests/wp_hoare/reference_array.i:85: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_add_0[i_0]=reg_add_1[i_0]). +} +Prove: 0=tt_1[0][i_1]. + +------------------------------------------------------------ + +Goal Post-condition 'todo,Padd' in 'calls_on_array_dim_2_to_1': +Let a_0 = (shift_A20_A5_sint32 (global G_tt_110) 0). +Let a_1 = (shift_sint32 a_0 0). +Assume { + (* Goal *) + When: (0<=i_0) /\ (i_0<=4). + (* Heap *) + Have: (linked Malloc_0). + (* tests/wp_hoare/reference_array.i:83: Call 'load_5' *) + Have: (valid_rw Malloc_0 a_1 5) + /\ (forall i_1:int. + (0<=i_1) -> (i_1<=4) + -> (reg_load_0[i_1]=Mint_1[(shift_sint32 a_0 i_1)])). + (* tests/wp_hoare/reference_array.i:83: Call Effects *) + Have: forall i_1:int. + ((i_1<0) \/ (5<=i_1)) -> (reg_load_0[i_1]=reg_load_1[i_1]). + (* tests/wp_hoare/reference_array.i:84: Call 'reset_5' *) + Have: forall i_1:int. + (0<=i_1) -> (i_1<=4) -> (0=Mint_0[(shift_sint32 a_0 i_1)]). + (* tests/wp_hoare/reference_array.i:84: Call Effects *) + Have: (havoc Mint_1 Mint_0 a_1 5). + (* tests/wp_hoare/reference_array.i:85: Call 'add_5' *) + Have: forall i_1:int. + (0<=i_1) -> (i_1<=4) + -> (reg_add_0[i_1]=(reg_load_0[i_1]+Mint_0[(shift_sint32 a_0 i_1)])). + (* tests/wp_hoare/reference_array.i:85: Call Effects *) + Have: forall i_1:int. + ((i_1<0) \/ (5<=i_1)) -> (reg_add_0[i_1]=reg_add_1[i_1]). +} +Prove: reg_add_0[i_0]=tt_0[0][i_0]. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_array.i, line 73) in 'calls_on_array_dim_2_to_1' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_array.i, line 73) in 'calls_on_array_dim_2_to_1' (2/2): +Call Effect at line 84 +Let a_0 = (shift_A20_A5_sint32 (global G_tt_110) 0). +Let a_1 = (shift_sint32 a_0 0). +Assume { + (* Heap *) + Have: (linked Malloc_1). + (* tests/wp_hoare/reference_array.i:83: Call 'load_5' *) + Have: (valid_rw Malloc_1 a_1 5) + /\ (forall i_0:int. + (0<=i_0) -> (i_0<=4) + -> (reg_load_0[i_0]=Mint_3[(shift_sint32 a_0 i_0)])). + (* tests/wp_hoare/reference_array.i:83: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_load_0[i_0]=reg_load_1[i_0]). + (* Merge *)Either { + Case: + (* Control Flow *) + Have: Mint_1=Mint_3. + (* tests/wp_hoare/reference_array.i:84: Call 'reset_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) + -> (0=Mint_0[(shift_sint32 a_0 i_0)]). + (* tests/wp_hoare/reference_array.i:84: Call Effects *) + Have: (havoc Mint_1 Mint_0 a_1 5). + Case: + (* Control Flow *) + Have: Mint_2=Mint_3. + (* tests/wp_hoare/reference_array.i:84: Exit Effects *) + Have: (havoc Mint_2 Mint_4 a_1 5). + } +} +Prove: not (valid_rd Malloc_1 a_1 5). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_array.i, line 73) in 'calls_on_array_dim_2_to_1' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_array.i, line 73) in 'calls_on_array_dim_2_to_1' (2/2): +Call Effect at line 84 +Let a_0 = (shift_A20_A5_sint32 (global G_tt_110) 0). +Let a_1 = (shift_sint32 a_0 0). +Assume { + (* Heap *) + Have: (linked Malloc_1). + (* tests/wp_hoare/reference_array.i:83: Call 'load_5' *) + Have: (valid_rw Malloc_1 a_1 5) + /\ (forall i_0:int. + (0<=i_0) -> (i_0<=4) + -> (reg_load_0[i_0]=Mint_1[(shift_sint32 a_0 i_0)])). + (* tests/wp_hoare/reference_array.i:83: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_load_0[i_0]=reg_load_1[i_0]). + (* tests/wp_hoare/reference_array.i:84: Call 'reset_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) -> (0=Mint_0[(shift_sint32 a_0 i_0)]). + (* tests/wp_hoare/reference_array.i:84: Call Effects *) + Have: (havoc Mint_1 Mint_0 a_1 5). +} +Prove: not (valid_rd Malloc_1 a_1 5). + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_array.i, line 19) in 'load_5'' in 'calls_on_array_dim_2_to_1' at call 'load_5' (file tests/wp_hoare/reference_array.i, line 83) +: +Assume { (* Heap *) Have: (linked Malloc_0). } +Prove: (valid_rw Malloc_0 + (shift_sint32 (shift_A20_A5_sint32 (global G_tt_110) 0) 0) 5). + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_array.i, line 9) in 'reset_5'' in 'calls_on_array_dim_2_to_1' at call 'reset_5' (file tests/wp_hoare/reference_array.i, line 84) +: +Let a_0 = (shift_A20_A5_sint32 (global G_tt_110) 0). +Assume { + (* Heap *) + Have: (linked Malloc_0). + (* tests/wp_hoare/reference_array.i:83: Call 'load_5' *) + Have: (valid_rw Malloc_0 (shift_sint32 a_0 0) 5) + /\ (forall i_0:int. + (0<=i_0) -> (i_0<=4) + -> (reg_load_0[i_0]=Mint_3[(shift_sint32 a_0 i_0)])). + (* tests/wp_hoare/reference_array.i:83: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_load_0[i_0]=reg_load_1[i_0]). +} +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_array.i, line 26) in 'add_5'' in 'calls_on_array_dim_2_to_1' at call 'add_5' (file tests/wp_hoare/reference_array.i, line 85) +: +Let a_0 = (shift_A20_A5_sint32 (global G_tt_110) 0). +Let a_1 = (shift_sint32 a_0 0). +Assume { + (* Heap *) + Have: (linked Malloc_0). + (* tests/wp_hoare/reference_array.i:83: Call 'load_5' *) + Have: (valid_rw Malloc_0 a_1 5) + /\ (forall i_0:int. + (0<=i_0) -> (i_0<=4) + -> (reg_load_0[i_0]=Mint_1[(shift_sint32 a_0 i_0)])). + (* tests/wp_hoare/reference_array.i:83: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_load_0[i_0]=reg_load_1[i_0]). + (* tests/wp_hoare/reference_array.i:84: Call 'reset_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) -> (0=Mint_0[(shift_sint32 a_0 i_0)]). + (* tests/wp_hoare/reference_array.i:84: Call Effects *) + Have: (havoc Mint_1 Mint_0 a_1 5). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function load_1_5 +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/reference_array.i, line 42) in 'load_1_5': +Let a_0 = (shift_A5_sint32 lp_0 0). +Assume { + (* Goal *) + When: (0<=i_1) /\ (i_1<=4). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base lp_0))<=0). + (* Pre-condition (file tests/wp_hoare/reference_array.i, line 40) in 'load_1_5' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 (shift_sint32 a_0 0) 5). + (* tests/wp_hoare/reference_array.i:45: Call 'load_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) + -> (reg_load_0[i_0]=Mint_0[(shift_sint32 a_0 i_0)]). + (* tests/wp_hoare/reference_array.i:45: Call Effects *) + Have: forall i_0:int. + ((i_0<0) \/ (5<=i_0)) -> (reg_load_0[i_0]=reg_load_1[i_0]). +} +Prove: reg_load_0[i_1]=Mint_0[(shift_sint32 a_0 i_1)]. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_array.i, line 41) in 'load_1_5': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_array.i, line 41) in 'load_1_5': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_array.i, line 19) in 'load_5'' in 'load_1_5' at call 'load_5' (file tests/wp_hoare/reference_array.i, line 45) +: +Assume { + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base lp_2))<=0). + (* Pre-condition (file tests/wp_hoare/reference_array.i, line 40) in 'load_1_5' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 (shift_sint32 (shift_A5_sint32 lp_2 0) 0) 5). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function reset_1_5 +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/reference_array.i, line 36) in 'reset_1_5': +Let a_0 = (shift_A5_sint32 rp_0 0). +Let a_1 = (shift_sint32 a_0 0). +Assume { + (* Goal *) + When: (0<=i_1) /\ (i_1<=4). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base rp_0))<=0). + (* Pre-condition (file tests/wp_hoare/reference_array.i, line 33) in 'reset_1_5' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_1 5). + (* tests/wp_hoare/reference_array.i:38: Call 'reset_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) -> (0=Mint_0[(shift_sint32 a_0 i_0)]). + (* tests/wp_hoare/reference_array.i:38: Call Effects *) + Have: (havoc Mint_1 Mint_0 a_1 5). +} +Prove: 0=Mint_0[(shift_sint32 a_0 i_1)]. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_array.i, line 34) in 'reset_1_5': +Call Effect at line 38 +Let a_0 = (shift_sint32 (shift_A5_sint32 rp_0 0) 0). +Assume { + (* Goal *) + When: (valid_rd Malloc_0 a_0 5). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base rp_0))<=0). + (* Pre-condition (file tests/wp_hoare/reference_array.i, line 33) in 'reset_1_5' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_0 5). + (* tests/wp_hoare/reference_array.i:38: Exit Effects *) + Have: (havoc Mint_2 Mint_0 a_0 5). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference_array.i, line 34) in 'reset_1_5': +Call Effect at line 38 +Let a_0 = (shift_A5_sint32 rp_0 0). +Let a_1 = (shift_sint32 a_0 0). +Assume { + (* Goal *) + When: (valid_rd Malloc_0 a_1 5). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base rp_0))<=0). + (* Pre-condition (file tests/wp_hoare/reference_array.i, line 33) in 'reset_1_5' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_1 5). + (* tests/wp_hoare/reference_array.i:38: Call 'reset_5' *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=4) -> (0=Mint_0[(shift_sint32 a_0 i_0)]). + (* tests/wp_hoare/reference_array.i:38: Call Effects *) + Have: (havoc Mint_1 Mint_0 a_1 5). +} +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference_array.i, line 9) in 'reset_5'' in 'reset_1_5' at call 'reset_5' (file tests/wp_hoare/reference_array.i, line 38) +: +Assume { + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base rp_2))<=0). + (* Pre-condition (file tests/wp_hoare/reference_array.i, line 33) in 'reset_1_5' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 (shift_sint32 (shift_A5_sint32 rp_2 0) 0) 5). +} +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/reference_array_simple.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/reference_array_simple.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/reference_array_simple.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/reference_array_simple.1.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,51 @@ +[wp:var_kind] [incr_addr] tt +[wp:var_kind] [ByARef] first step + (p1,1) +[wp:var_kind] [ByARef] p1 not yet +[wp:var_kind] [ByARef] add (p1,1) +[wp:var_kind] [collect_calls] tt not yet in ArgAref +[wp:var_kind] [ArgARef] try + tt +[wp:var_kind] [ArgARef] + tt +[wp:var_kind] [collect_calls] tt + call(p1,0,address taken) +[wp:var_kind] [by_array_reference] p1 ByAref +[wp:var_kind] [decr_addr] tt +[wp:var_kind] [array_reference arg] tt ArgAref +[wp:var_kind] [resolves addr taken] tt: remove addrtaken +[wp] warning: Missing RTE guards +[wp:var_kind] tmp is a funvar +[wp] warning: Assuming contracts of external functions +[wp:var_kind] tt is a array refvar +[wp:var_kind] tmp is a funvar +[wp:var_kind] tt is a array refvar +------------------------------------------------------------ + Proof Environment Store_env1 +------------------------------------------------------------ + +---------------------------------------- +--- Logic Definitions +---------------------------------------- + +Type constraint for Array sint32[][] +Declaration +predicate IsArray_sint32_d2 (a:int farray farray) = + forall i:int. + forall i_0:int. + is_in_format(sint32_format, a[i][i_0]) + + +------------------------------------------------------------ + Function call_f1 +------------------------------------------------------------ + +Proof Obligation post_2: +Environment: Store_env1 + - Assume calling Function 'f1' is consistent with Store-LogicVar +Goal store_call_f1_post_2: + forall tt_0:int farray farray. + IsArray_sint32_d2(tt_0) -> + (let tt_1 = tt_0[0->tt_0[0][3->5]] in + forall result_0:int. + is_in_format(sint32_format, result_0) -> + (result_0 = tt_1[0][3]) -> + (result_0 = 5)) + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/reference_array_simple.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/reference_array_simple.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/reference_array_simple.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/reference_array_simple.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,44 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/reference_array_simple.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function call_f1 +------------------------------------------------------------ + +Goal Post-condition 'todo' in 'call_f1': +Let x_0 = Mint_0[(shift_sint32 (shift_A10_A5_sint32 (global G_tt_67) 0) 3)]. +Assume { (* Domain *) Type: (is_sint32 x_0). } +Prove: 5=x_0. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_f2 +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/reference_array_simple.i, line 25) in 'call_f2': +Let x_0 = Mint_0[(shift_sint32 f2_0 3)]. +Assume { + (* Domain *) + Type: (is_sint32 x_0). + (* tests/wp_hoare/reference_array_simple.i:29: Call 'f2' *) + Have: 5=x_0. + (* tests/wp_hoare/reference_array_simple.i:29: Assignment *) + Have: 5=x_0. +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_f3 +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/reference_array_simple.i, line 39) in 'call_f3': +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/reference.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/reference.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/reference.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/reference.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,170 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/reference.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function call_f2 +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/reference.i, line 35) in 'call_f2': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_f2' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_f2' (2/3): +Effect at line 39 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_f2' (3/3): +Effect at line 39 +Assume { } +Prove: false. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_f2' (1/4): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_f2' (2/4): +Effect at line 39 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_f2' (3/4): +Effect at line 39 +Assume { } +Prove: false. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_f2' (4/4): +Call Result at line 40 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference.i, line 26) in 'f2'' in 'call_f2' at call 'f2' (file tests/wp_hoare/reference.i, line 40) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function call_global +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/reference.i, line 46) in 'call_global': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_global': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_global' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'call_global' (2/2): +Call Result at line 49 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference.i, line 10) in 'f'' in 'call_global' at call 'f' (file tests/wp_hoare/reference.i, line 49) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function g +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/reference.i, line 18) in 'g': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'g' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'g' (2/2): +Effect at line 21 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'g' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'g' (2/3): +Effect at line 21 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'g' (3/3): +Call Result at line 22 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_hoare/reference.i, line 10) in 'f'' in 'g' at call 'f' (file tests/wp_hoare/reference.i, line 22) +: +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function write +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/reference.i, line 58) in 'write': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_hoare/reference.i, line 57) in 'write': +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/refguards.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/refguards.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle/refguards.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle/refguards.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,85 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/refguards.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/refguards.i, line 9) in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function g +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/refguards.i, line 17) in 'g': +Let a_1 = (shift_sint32 b_0 k_0). +Let x_0 = Mint_1[a_1]. +Let x_1 = Mint_1[(shift_sint32 a_0 k_0)->x_0][a_1]. +Assume { + (* Domain *) + Type: (is_sint32 k_0) /\ (is_sint32 x_0) /\ (is_sint32 x_1). + (* Heap *) + Have: ((region (base a_0))<=0) /\ ((region (base b_0))<=0). +} +Prove: x_0=x_1. + +------------------------------------------------------------ +------------------------------------------------------------ + Function h +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/refguards.i, line 24) in 'h': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function s +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/refguards.i, line 32) in 's': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/refguards.i, line 33) in 's': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/refguards.i, line 34) in 's': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/refguards.i, line 35) in 's': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/refguards.i, line 36) in 's': +Assume { + (* Heap *) + Have: ((region (base c_0))<=0) /\ ((region (base d_0))<=0). +} +Prove: c_0!=d_0. + +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_hoare/refguards.i, line 37) in 's': +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/byref.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/byref.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/byref.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/byref.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/byref.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 1 goal scheduled +[wp] [Alt-Ergo] Goal typed_ref_wrong_call_f_ko_pre_qed_ko : Unknown +[wp] Proved goals: 0 / 1 + Alt-Ergo: 0 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +wrong - - 1 0.0% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/byref.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/byref.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/byref.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/byref.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,31 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/byref.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 11 goals scheduled +[wp] [Qed] Goal typed_ref_correct_post_qed_ok : Valid +[wp] [Qed] Goal typed_ref_correct_call_f_pre_qed_ok : Valid +[wp] [Qed] Goal typed_ref_f_post_qed_ok : Valid +[wp] [Qed] Goal typed_ref_f_assign : Valid +[wp] [Qed] Goal typed_ref_f_ko_post_qed_ok : Valid +[wp] [Qed] Goal typed_ref_f_ko_assign : Valid +[wp] [Qed] Goal typed_ref_formal_post_qed_ok : Valid +[wp] [Qed] Goal typed_ref_formal_call_f_pre_qed_ok : Valid +[wp] [Qed] Goal typed_ref_local_post_qed_ok : Valid +[wp] [Qed] Goal typed_ref_local_call_f_pre_qed_ok : Valid +[wp] [Qed] Goal typed_ref_wrong_post_qed_ok : Valid +[wp] Proved goals: 11 / 11 + Qed: 11 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f 2 - 2 100% +f_ko 2 - 2 100% +wrong 1 - 1 100% +correct 2 - 2 100% +local 2 - 2 100% +formal 2 - 2 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,55 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/dispatch_var2.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 34 goals scheduled +[wp] [Qed] Goal typed_ref_call_global_post : Valid +[wp] [Qed] Goal typed_ref_call_global_assign_exit : Valid +[wp] [Qed] Goal typed_ref_call_global_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_global_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_global_call_reset_pre : Valid +[wp] [Qed] Goal typed_ref_call_global_call_load_pre : Valid +[wp] [Qed] Goal typed_ref_call_local_post : Valid +[wp] [Qed] Goal typed_ref_call_local_assign_exit_part1 : Valid +[wp] [Qed] Goal typed_ref_call_local_assign_exit_part2 : Valid +[wp] [Qed] Goal typed_ref_call_local_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_local_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_local_assign_normal_part3 : Valid +[wp] [Qed] Goal typed_ref_call_local_call_reset_pre : Valid +[wp] [Qed] Goal typed_ref_call_local_call_load_pre : Valid +[wp] [Qed] Goal typed_ref_call_param_post : Valid +[wp] [Qed] Goal typed_ref_call_param_assign_exit_part1 : Valid +[wp] [Qed] Goal typed_ref_call_param_assign_exit_part2 : Valid +[wp] [Qed] Goal typed_ref_call_param_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_param_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_param_assign_normal_part3 : Valid +[wp] [Qed] Goal typed_ref_call_param_call_reset_pre : Valid +[wp] [Qed] Goal typed_ref_call_param_call_load_pre : Valid +[wp] [Qed] Goal typed_ref_call_param_ref_post : Valid +[wp] [Qed] Goal typed_ref_call_param_ref_assign_exit : Valid +[wp] [Qed] Goal typed_ref_call_param_ref_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_param_ref_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_param_ref_call_reset_pre : Valid +[wp] [Qed] Goal typed_ref_call_param_ref_call_load_pre : Valid +[wp] [Qed] Goal typed_ref_incr_post : Valid +[wp] [Qed] Goal typed_ref_incr_assign : Valid +[wp] [Qed] Goal typed_ref_load_post : Valid +[wp] [Qed] Goal typed_ref_load_assign : Valid +[wp] [Qed] Goal typed_ref_reset_post : Valid +[wp] [Qed] Goal typed_ref_reset_assign : Valid +[wp] Proved goals: 34 / 34 + Qed: 34 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +reset 2 - 2 100% +incr 2 - 2 100% +load 2 - 2 100% +call_global 6 - 6 100% +call_param 8 - 8 100% +call_local 8 - 8 100% +call_param_ref 6 - 6 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,56 @@ +# frama-c -wp -wp-model 'Typed (Ref)' -wp-no-let [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/dispatch_var2.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 34 goals scheduled +[wp] [Alt-Ergo] Goal typed_ref_call_global_post : Valid +[wp] [Qed] Goal typed_ref_call_global_assign_exit : Valid +[wp] [Qed] Goal typed_ref_call_global_assign_normal_part1 : Valid +[wp] [Alt-Ergo] Goal typed_ref_call_global_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_global_call_reset_pre : Valid +[wp] [Qed] Goal typed_ref_call_global_call_load_pre : Valid +[wp] [Alt-Ergo] Goal typed_ref_call_local_post : Valid +[wp] [Qed] Goal typed_ref_call_local_assign_exit_part1 : Valid +[wp] [Alt-Ergo] Goal typed_ref_call_local_assign_exit_part2 : Valid +[wp] [Qed] Goal typed_ref_call_local_assign_normal_part1 : Valid +[wp] [Alt-Ergo] Goal typed_ref_call_local_assign_normal_part2 : Valid +[wp] [Alt-Ergo] Goal typed_ref_call_local_assign_normal_part3 : Valid +[wp] [Qed] Goal typed_ref_call_local_call_reset_pre : Valid +[wp] [Qed] Goal typed_ref_call_local_call_load_pre : Valid +[wp] [Qed] Goal typed_ref_call_param_post : Valid +[wp] [Qed] Goal typed_ref_call_param_assign_exit_part1 : Valid +[wp] [Qed] Goal typed_ref_call_param_assign_exit_part2 : Valid +[wp] [Qed] Goal typed_ref_call_param_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_param_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_param_assign_normal_part3 : Valid +[wp] [Qed] Goal typed_ref_call_param_call_reset_pre : Valid +[wp] [Qed] Goal typed_ref_call_param_call_load_pre : Valid +[wp] [Alt-Ergo] Goal typed_ref_call_param_ref_post : Valid +[wp] [Qed] Goal typed_ref_call_param_ref_assign_exit : Valid +[wp] [Qed] Goal typed_ref_call_param_ref_assign_normal_part1 : Valid +[wp] [Alt-Ergo] Goal typed_ref_call_param_ref_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_param_ref_call_reset_pre : Valid +[wp] [Qed] Goal typed_ref_call_param_ref_call_load_pre : Valid +[wp] [Alt-Ergo] Goal typed_ref_incr_post : Valid +[wp] [Qed] Goal typed_ref_incr_assign : Valid +[wp] [Alt-Ergo] Goal typed_ref_load_post : Valid +[wp] [Alt-Ergo] Goal typed_ref_load_assign : Valid +[wp] [Qed] Goal typed_ref_reset_post : Valid +[wp] [Qed] Goal typed_ref_reset_assign : Valid +[wp] Proved goals: 34 / 34 + Qed: 23 + Alt-Ergo: 11 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +reset 2 - 2 100% +incr 1 1 (8) 2 100% +load - 2 (8) 2 100% +call_global 4 2 (11) 6 100% +call_param 8 - 8 100% +call_local 4 4 (12) 8 100% +call_param_ref 4 2 (12) 6 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/dispatch_var.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/dispatch_var.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/dispatch_var.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/dispatch_var.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,107 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/dispatch_var.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 80 goals scheduled +[wp] [Qed] Goal typed_ref_array_in_struct_param_post_Pload2 : Valid +[wp] [Qed] Goal typed_ref_array_in_struct_param_assign : Valid +[wp] [Qed] Goal typed_ref_call_no_ref_bd_post_Mem_n5_nr6 : Valid +[wp] [Qed] Goal typed_ref_call_no_ref_bd_assign_exit_part1 : Valid +[wp] [Qed] Goal typed_ref_call_no_ref_bd_assign_exit_part2 : Valid +[wp] [Qed] Goal typed_ref_call_no_ref_bd_assign_exit_part3 : Valid +[wp] [Qed] Goal typed_ref_call_no_ref_bd_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_no_ref_bd_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_no_ref_bd_assign_normal_part3 : Valid +[wp] [Qed] Goal typed_ref_call_no_ref_bd_assign_normal_part4 : Valid +[wp] [Qed] Goal typed_ref_call_no_ref_bd_assign_normal_part5 : Valid +[wp] [Qed] Goal typed_ref_call_ref_bd_post_Ref_r2 : Valid +[wp] [Qed] Goal typed_ref_call_ref_bd_assign_exit : Valid +[wp] [Qed] Goal typed_ref_call_ref_bd_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_ref_bd_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_ref_bd2_post_Mem_n2 : Valid +[wp] [Qed] Goal typed_ref_call_ref_bd2_assign_exit_part1 : Valid +[wp] [Qed] Goal typed_ref_call_ref_bd2_assign_exit_part2 : Valid +[wp] [Qed] Goal typed_ref_call_ref_bd2_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_ref_bd2_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_ref_bd2_assign_normal_part3 : Valid +[wp] [Qed] Goal typed_ref_call_ref_bd2_assign_normal_part4 : Valid +[wp] [Qed] Goal typed_ref_call_ref_bd2_assign_normal_part5 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_post_Ref_r1 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_assign_exit : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr2_post_Mem_n1 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr2_assign_exit_part1 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr2_assign_exit_part2 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr2_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr2_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr2_assign_normal_part3 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr2_assign_normal_part4 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr2_assign_normal_part5 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nr_post_R_R_R : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nr_post_R_R_R_2 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nr_assign_exit_part1 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nr_assign_exit_part2 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nr_assign_exit_part3 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nr_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nr_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nr_assign_normal_part3 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nr_assign_normal_part4 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nr_call_ref_ctr_nr_pre : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nstars_post : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nstars_assign_exit_part1 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nstars_assign_exit_part2 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nstars_assign_exit_part3 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nstars_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nstars_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nstars_assign_normal_part3 : Valid +[wp] [Qed] Goal typed_ref_call_ref_ctr_nstars_assign_normal_part4 : Valid +[wp] [Qed] Goal typed_ref_call_ref_valid_post_R7_N4 : Valid +[wp] [Qed] Goal typed_ref_call_ref_valid_assign_exit_part1 : Valid +[wp] [Qed] Goal typed_ref_call_ref_valid_assign_exit_part2 : Valid +[wp] [Qed] Goal typed_ref_call_ref_valid_assign_exit_part3 : Valid +[wp] [Qed] Goal typed_ref_call_ref_valid_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_ref_valid_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_ref_valid_assign_normal_part3 : Valid +[wp] [Qed] Goal typed_ref_call_ref_valid_assign_normal_part4 : Valid +[wp] [Qed] Goal typed_ref_call_ref_valid_assign_normal_part5 : Valid +[wp] [Qed] Goal typed_ref_call_ref_valid_call_ref_valid_pre : Valid +[wp] [Qed] Goal typed_ref_call_ref_valid_call_ref_valid_pre_2 : Valid +[wp] [Qed] Goal typed_ref_call_two_ref_post : Valid +[wp] [Qed] Goal typed_ref_call_two_ref_assign_exit_part1 : Valid +[wp] [Qed] Goal typed_ref_call_two_ref_assign_exit_part2 : Valid +[wp] [Qed] Goal typed_ref_call_two_ref_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_two_ref_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_two_ref_assign_normal_part3 : Valid +[wp] [Qed] Goal typed_ref_call_two_ref_assign_normal_part4 : Valid +[wp] [Qed] Goal typed_ref_g_post : Valid +[wp] [Qed] Goal typed_ref_g_assign_exit : Valid +[wp] [Qed] Goal typed_ref_g_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_g_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_no_ref_bd_post : Valid +[wp] [Qed] Goal typed_ref_no_ref_bd_assign_part1 : Valid +[wp] [Qed] Goal typed_ref_no_ref_bd_assign_part2 : Valid +[wp] [Qed] Goal typed_ref_ref_bd_post : Valid +[wp] [Qed] Goal typed_ref_ref_bd_assign : Valid +[wp] Proved goals: 80 / 80 + Qed: 80 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +call_ref_ctr 4 - 4 100% +call_ref_ctr2 8 - 8 100% +ref_bd 2 - 2 100% +call_ref_bd 4 - 4 100% +call_ref_bd2 8 - 8 100% +call_ref_valid 11 - 11 100% +no_ref_bd 3 - 3 100% +call_no_ref_bd 9 - 9 100% +call_ref_ctr_nr 10 - 10 100% +call_ref_ctr_nstars 8 - 8 100% +call_two_ref 7 - 7 100% +g 4 - 4 100% +array_in_struct_param 2 - 2 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/isHoare.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/isHoare.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/isHoare.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/isHoare.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/isHoare.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 1 goal scheduled +[wp] [Qed] Goal typed_ref_cmp_invalid_addr_as_int_post_ok : Valid +[wp] Proved goals: 1 / 1 + Qed: 1 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +cmp_invalid_addr_as_int 1 - 1 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/logicarr.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/logicarr.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/logicarr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/logicarr.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,21 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/logicarr.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_hoare/logicarr.i:27:[wp] warning: Cast from (int [10]) to (int []) not implemented yet +[wp] Collecting variable usage +tests/wp_hoare/logicarr.i:26:[wp] warning: Cast from (int [10]) to (int []) not implemented yet +tests/wp_hoare/logicarr.i:26:[wp] warning: Cast from (int [10]) to (int []) not implemented yet +[wp] 3 goals scheduled +[wp] [Alt-Ergo] Goal typed_ref_job_post_qed_ok_PTR_todo : Unknown +[wp] [Alt-Ergo] Goal typed_ref_job_post_qed_ok_ARR_todo : Unknown (Stronger, 2 warnings) +[wp] [Alt-Ergo] Goal typed_ref_job_post_qed_ok_DUM_todo : Unknown (Stronger) +[wp] Proved goals: 0 / 3 + Alt-Ergo: 0 (unknown: 3) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +job - - 3 0.0% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/logicref.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/logicref.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/logicref.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/logicref.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,22 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/logicref.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 5 goals scheduled +[wp] [Qed] Goal typed_ref_fvrange_n_post : Valid +[wp] [Alt-Ergo] Goal typed_ref_fvrange_n_assert : Valid +[wp] [Qed] Goal typed_ref_fvrange_n_assign : Valid +[wp] [Qed] Goal typed_ref_gcd_post : Valid +[wp] [Qed] Goal typed_ref_gcd_assign : Valid +[wp] Proved goals: 5 / 5 + Qed: 4 + Alt-Ergo: 1 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +fvrange_n 2 1 (83) 3 100% +gcd 2 - 2 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/logicref_simple.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/logicref_simple.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/logicref_simple.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/logicref_simple.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/logicref_simple.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 9 goals scheduled +[wp] [Alt-Ergo] Goal typed_ref_fsimple_post : Unknown +[wp] [Qed] Goal typed_ref_fsimple_assign : Valid +[wp] [Alt-Ergo] Goal typed_ref_fsimple_array_post : Unknown +[wp] [Qed] Goal typed_ref_fsimple_array_assign : Valid +[wp] [Alt-Ergo] Goal typed_ref_ftwo_star_post : Unknown +[wp] [Qed] Goal typed_ref_ftwo_star_assign : Valid +[wp] [Qed] Goal typed_ref_fvpositive_post : Valid +[wp] [Alt-Ergo] Goal typed_ref_fvpositive_assert_todo : Unknown +[wp] [Qed] Goal typed_ref_fvpositive_assign : Valid +[wp] Proved goals: 5 / 9 + Qed: 5 + Alt-Ergo: 0 (unknown: 4) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +fsimple 1 - 2 50.0% +fsimple_array 1 - 2 50.0% +ftwo_star 1 - 2 50.0% +fvpositive 2 - 3 66.7% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/reference_and_struct.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/reference_and_struct.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/reference_and_struct.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/reference_and_struct.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,55 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/reference_and_struct.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 32 goals scheduled +[wp] [Qed] Goal typed_ref_call_array_in_struct_param_post_Pload2 : Valid +[wp] [Qed] Goal typed_ref_call_array_in_struct_param_post_Pload3 : Valid +[wp] [Qed] Goal typed_ref_call_array_in_struct_param_assign_exit : Valid +[wp] [Qed] Goal typed_ref_call_array_in_struct_param_assign_normal : Valid +[wp] [Qed] Goal typed_ref_call_array_in_struct_param_call_load_5_pre : Valid +[wp] [Alt-Ergo] Goal typed_ref_call_on_array_in_struct_global_post_Pload : Valid +[wp] [Qed] Goal typed_ref_call_on_array_in_struct_global_assign_exit : Valid +[wp] [Qed] Goal typed_ref_call_on_array_in_struct_global_assign_normal : Valid +[wp] [Qed] Goal typed_ref_call_on_array_in_struct_global_call_load_5_pre : Valid +[wp] [Qed] Goal typed_ref_call_reset_post : Valid +[wp] [Qed] Goal typed_ref_call_reset_assign_exit : Valid +[wp] [Qed] Goal typed_ref_call_reset_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_reset_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_reset_call_reset_pre : Valid +[wp] [Alt-Ergo] Goal typed_ref_call_reset_1_5_post_Presset_mat : Valid +[wp] [Qed] Goal typed_ref_call_reset_1_5_assign_exit : Valid +[wp] [Qed] Goal typed_ref_call_reset_1_5_assign_normal : Valid +[wp] [Qed] Goal typed_ref_call_reset_1_5_call_reset_1_5_pre : Valid +[wp] [Alt-Ergo] Goal typed_ref_call_reset_5_post_Preset_5 : Valid +[wp] [Qed] Goal typed_ref_call_reset_5_assign_exit : Valid +[wp] [Qed] Goal typed_ref_call_reset_5_assign_normal : Valid +[wp] [Qed] Goal typed_ref_call_reset_5_call_reset_5_pre : Valid +[wp] [Alt-Ergo] Goal typed_ref_call_reset_5_dim2_post_Presset_mat : Valid +[wp] [Qed] Goal typed_ref_call_reset_5_dim2_assign_exit : Valid +[wp] [Qed] Goal typed_ref_call_reset_5_dim2_assign_normal : Valid +[wp] [Qed] Goal typed_ref_call_reset_5_dim2_call_reset_5_pre : Valid +[wp] [Alt-Ergo] Goal typed_ref_call_reset_5_tps_post_Preset_5_tps : Valid +[wp] [Qed] Goal typed_ref_call_reset_5_tps_assign_exit : Valid +[wp] [Qed] Goal typed_ref_call_reset_5_tps_assign_normal : Valid +[wp] [Qed] Goal typed_ref_call_reset_5_tps_call_reset_5_pre : Valid +[wp] [Qed] Goal typed_ref_reset_post : Valid +[wp] [Qed] Goal typed_ref_reset_assign : Valid +[wp] Proved goals: 32 / 32 + Qed: 27 + Alt-Ergo: 5 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +reset 2 - 2 100% +call_reset 5 - 5 100% +call_reset_5 3 1 (21) 4 100% +call_reset_5_tps 3 1 (20) 4 100% +call_reset_1_5 3 1 (21) 4 100% +call_reset_5_dim2 3 1 (21) 4 100% +call_on_array_in_struct_global 3 1 (19) 4 100% +call_array_in_struct_param 5 - 5 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/reference_array.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/reference_array.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/reference_array.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/reference_array.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,59 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/reference_array.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 38 goals scheduled +[wp] [Alt-Ergo] Goal typed_ref_add_1_5_post : Valid +[wp] [Qed] Goal typed_ref_add_1_5_assign_exit : Valid +[wp] [Qed] Goal typed_ref_add_1_5_assign_normal : Valid +[wp] [Qed] Goal typed_ref_add_1_5_call_add_5_pre : Valid +[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_1_post_Pload : Valid +[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_1_post_Preset : Valid +[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_1_post_Padd : Valid +[wp] [Qed] Goal typed_ref_calls_on_array_dim_1_assign_exit : Valid +[wp] [Qed] Goal typed_ref_calls_on_array_dim_1_assign_normal : Valid +[wp] [Qed] Goal typed_ref_calls_on_array_dim_1_call_load_5_pre : Valid +[wp] [Qed] Goal typed_ref_calls_on_array_dim_1_call_reset_5_pre : Valid +[wp] [Qed] Goal typed_ref_calls_on_array_dim_1_call_add_5_pre : Valid +[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_post_Pload : Valid +[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_post_Preset : Valid +[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_post_Padd : Valid +[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_assign_exit : Valid +[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_assign_normal : Valid +[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_call_load_1_5_pre : Valid +[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_call_reset_1_5_pre : Valid +[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_call_add_1_5_pre : Valid +[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_to_1_post_todo_Pload : Unknown +[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_to_1_post_todo_Preset : Unknown +[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_to_1_post_todo_Padd : Unknown +[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_to_1_assign_exit_part1 : Valid +[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_to_1_assign_exit_part2 : Unknown +[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_to_1_assign_normal_part1 : Valid +[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_to_1_assign_normal_part2 : Unknown +[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_to_1_call_load_5_pre : Valid +[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_to_1_call_reset_5_pre : Valid +[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_to_1_call_add_5_pre : Valid +[wp] [Alt-Ergo] Goal typed_ref_load_1_5_post : Valid +[wp] [Qed] Goal typed_ref_load_1_5_assign_exit : Valid +[wp] [Qed] Goal typed_ref_load_1_5_assign_normal : Valid +[wp] [Qed] Goal typed_ref_load_1_5_call_load_5_pre : Valid +[wp] [Alt-Ergo] Goal typed_ref_reset_1_5_post : Valid +[wp] [Qed] Goal typed_ref_reset_1_5_assign_exit : Valid +[wp] [Qed] Goal typed_ref_reset_1_5_assign_normal : Valid +[wp] [Qed] Goal typed_ref_reset_1_5_call_reset_5_pre : Valid +[wp] Proved goals: 33 / 38 + Qed: 23 + Alt-Ergo: 10 (unknown: 5) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +reset_1_5 3 1 (17) 4 100% +load_1_5 3 1 (15) 4 100% +add_1_5 3 1 (15) 4 100% +calls_on_array_dim_1 5 3 (21) 8 100% +calls_on_array_dim_2_to_1 4 1 (31) 10 50.0% +calls_on_array_dim_2 5 3 (19) 8 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/reference_array_simple.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/reference_array_simple.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/reference_array_simple.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/reference_array_simple.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,21 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/reference_array_simple.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 3 goals scheduled +[wp] [Alt-Ergo] Goal typed_ref_call_f1_post_todo : Unknown +[wp] [Qed] Goal typed_ref_call_f2_post : Valid +[wp] [Qed] Goal typed_ref_call_f3_post : Valid +[wp] Proved goals: 2 / 3 + Qed: 2 + Alt-Ergo: 0 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +call_f1 - - 1 0.0% +call_f2 1 - 1 100% +call_f3 1 - 1 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/reference.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/reference.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/reference.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/reference.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,42 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/reference.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 23 goals scheduled +[wp] [Qed] Goal typed_ref_call_f2_post : Valid +[wp] [Qed] Goal typed_ref_call_f2_assign_exit_part1 : Valid +[wp] [Qed] Goal typed_ref_call_f2_assign_exit_part2 : Valid +[wp] [Alt-Ergo] Goal typed_ref_call_f2_assign_exit_part3 : Unknown +[wp] [Qed] Goal typed_ref_call_f2_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_f2_assign_normal_part2 : Valid +[wp] [Alt-Ergo] Goal typed_ref_call_f2_assign_normal_part3 : Unknown +[wp] [Qed] Goal typed_ref_call_f2_assign_normal_part4 : Valid +[wp] [Qed] Goal typed_ref_call_f2_call_f2_pre : Valid +[wp] [Qed] Goal typed_ref_call_global_post : Valid +[wp] [Qed] Goal typed_ref_call_global_assign_exit : Valid +[wp] [Qed] Goal typed_ref_call_global_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_call_global_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_call_global_call_f_pre : Valid +[wp] [Qed] Goal typed_ref_g_post : Valid +[wp] [Qed] Goal typed_ref_g_assign_exit_part1 : Valid +[wp] [Qed] Goal typed_ref_g_assign_exit_part2 : Valid +[wp] [Qed] Goal typed_ref_g_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_g_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_g_assign_normal_part3 : Valid +[wp] [Qed] Goal typed_ref_g_call_f_pre : Valid +[wp] [Qed] Goal typed_ref_write_post : Valid +[wp] [Qed] Goal typed_ref_write_assign : Valid +[wp] Proved goals: 21 / 23 + Qed: 21 + Alt-Ergo: 0 (unknown: 2) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +g 7 - 7 100% +call_f2 7 - 9 77.8% +call_global 5 - 5 100% +write 2 - 2 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/refguards.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/refguards.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/oracle_qualif/refguards.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/oracle_qualif/refguards.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_hoare/refguards.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 9 goals scheduled +[wp] [Qed] Goal typed_ref_f_post : Valid +[wp] [Alt-Ergo] Goal typed_ref_g_post : Valid +[wp] [Qed] Goal typed_ref_h_post : Valid +[wp] [Qed] Goal typed_ref_s_post : Valid +[wp] [Qed] Goal typed_ref_s_post_2 : Valid +[wp] [Qed] Goal typed_ref_s_post_3 : Valid +[wp] [Qed] Goal typed_ref_s_post_4 : Valid +[wp] [Alt-Ergo] Goal typed_ref_s_post_5 : Unknown +[wp] [Qed] Goal typed_ref_s_post_6 : Valid +[wp] Proved goals: 8 / 9 + Qed: 7 + Alt-Ergo: 1 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f 1 - 1 100% +g - 1 (12) 1 100% +h 1 - 1 100% +s 5 - 6 83.3% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/reference_and_struct.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/reference_and_struct.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/reference_and_struct.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/reference_and_struct.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,103 @@ +/* run.config + OPT: -wp-model +ref -wp-log var_kind +*/ + +/* run.config_qualif + OPT: -wp -wp-proof alt-ergo -wp-par 1 -wp-model +ref +*/ + +struct T {int a; int b;}; + +/*@ requires \valid(p); + assigns p->a; + ensures p->a == 0; +*/ +void reset (struct T *p) {p->a = 0;} + +struct T st ; + +/*@ assigns st.a; + ensures \result == 0; + */ +int call_reset (void) +{ reset(&st) ; return (st.a);} + + +/*@ requires \valid(fp+(0..4)); + assigns fp[0..4]; + ensures Reset5: \forall integer i; 0<=i<5 ==> (fp+i)->a == 0; + */ +void reset_5 (struct T *fp); + + +struct T ts[10]; + +/*@ assigns ts[0..4]; + ensures Preset_5: \forall integer i; 0<=i<5 ==> ts[i].a == 0; +*/ +void call_reset_5 (void) +{ reset_5(ts) ; return ;} + + +struct T * tps[10]; + +/*@ requires \valid(tps[9]+(0..4)); + assigns tps[9][0..4]; + ensures Preset_5_tps : \forall integer i; 0<=i<5 ==> tps[9][i].a == 0; + */ +void call_reset_5_tps(void) +{ reset_5(tps[9]); return;} + + + +/*@ requires \valid(rp[0]+(0..4)); + assigns rp[0][0..4]; + ensures + \forall integer i; 0<= i<5 ==> (rp[0]+i)->a == 0; + */ +void reset_1_5 (struct T (*rp) [5]); + +struct T smatrix [20] [5] ; + +/*@ + assigns smatrix[0][0..4]; + ensures Presset_mat : \forall integer i; 0<= i<5 ==> (smatrix[0]+i)->a == 0; + */ +void call_reset_1_5(void) +{reset_1_5(smatrix); return;} + + +/*@ + assigns smatrix[1][0..4]; + ensures Presset_mat : \forall integer i; 0<= i<5 ==> (smatrix[1]+i)->a == 0; + */ +void call_reset_5_dim2(void) +{reset_5(smatrix[1]); return;} + +/*-------------------------------------------------------*/ + +struct S { int tab[10]; int k;}; +struct S s; + +int reg_load[5]; +/*@ requires \valid(hp+(0..4)); + assigns reg_load[0..4]; + ensures \forall integer i; + 0<=i<5 ==> reg_load[i] == hp[i]; + */ +void load_5 (int * hp); + +/*@ + assigns reg_load[0..4]; + ensures Pload : \forall integer i; 0<=i<5 ==> reg_load[i] == \old(s.tab[i]); +*/ +void call_on_array_in_struct_global (void){load_5(s.tab);} + +/*@ + requires \valid(sf.tab+(0..4)); + assigns reg_load[0..4]; + ensures Pload2 : \forall integer j; 0<=j<5 ==> reg_load[j] == sf.tab[j]; + ensures Pload3 : \forall integer j; 0<=j<5 ==> \result.tab[j] == sf.tab[j]; +*/ +struct S call_array_in_struct_param(struct S sf){load_5(sf.tab); return sf;} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/reference_array.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/reference_array.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/reference_array.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/reference_array.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,105 @@ +/* run.config + OPT: -wp-model +ref -wp-log var_kind +*/ + +/* run.config_qualif + OPT: -wp -wp-proof alt-ergo -wp-par 1 -wp-model +ref +*/ + +/*@ requires \valid(fp+(0..4)); + assigns fp[0..4]; + ensures Reset5: + \forall integer i; 0<=i<5 ==> fp[i] == 0; + */ +void reset_5 (int *fp); + +int reg_load[5]; +int reg_add[5]; + +/*@ requires \valid(hp+(0..4)); + assigns reg_load[0..4]; + ensures \forall integer i; + 0<=i<5 ==> reg_load[i] == hp[i]; + */ +void load_5 (int * hp); + +/*@ requires \valid(gp+(0..4)); + assigns reg_add[0..4]; + ensures \forall integer i; + 0<=i<5 ==> reg_add[i] == \old(reg_load[i])+gp[i]; + */ +void add_5(int *gp); + +/*@ requires \valid(rp[0]+(0..4)); + assigns rp[0][0..4]; + ensures + \forall integer i; 0<= i<5 ==> rp[0][i] == 0; + */ +void reset_1_5 (int (*rp) [5]) { reset_5(rp[0]);} + +/*@ requires \valid(lp[0]+(0..4)); + assigns reg_load[0..4]; + ensures \forall integer i; + 0<=i<5 ==> reg_load[i] == lp[0][i]; + */ +void load_1_5 (int (*lp) [5]) {load_5(lp[0]);} + +/*@ requires \valid(ap[0]+(0..4)); + assigns reg_add[0..4]; + ensures \forall integer i; + 0<=i<5 ==> reg_add[i] == reg_load[i]+ ap[0][i]; + */ +void add_1_5 (int (*ap) [5]) {add_5(ap[0]);} + +int t[20]; +int tt[20][5]; + +/*@ + assigns reg_load[0..4], reg_add[0..4],t[0..4]; + ensures Pload : \forall integer i; 0<=i<5 ==> reg_load[i] == \old(t[i]); + ensures Preset: \forall integer j; 0<=j<5 ==> t[j] == 0; + ensures Padd : \forall integer k; 0<=k<5 ==> reg_add[k] == \old(t[k]); + */ +void calls_on_array_dim_1 (void) +{ + load_5(t); + reset_5(t); + add_5(t); +} + + + +/*@ + assigns reg_load[0..4], reg_add[0..4],tt[0][0..4]; + ensures todo: Pload : + \forall integer i; 0<=i<5 ==> reg_load[i] == \old(tt[0][i]); + ensures todo: Preset: + \forall integer j; 0<=j<5 ==> tt[0][j] == 0; + ensures todo: Padd : + \forall integer k; 0<=k<5 ==> reg_add[k] == \old(tt[0][k]); + */ +void calls_on_array_dim_2_to_1 (void) +{ + load_5(&(tt[0])); + reset_5(&(tt[0])); + add_5(&(tt[0])); +} + + + +/*@ + assigns reg_load[0..4], reg_add[0..4],tt[0][0..4]; + ensures Pload : \forall integer i; 0<=i<5 ==> reg_load[i] == \old(tt[0][i]); + ensures Preset: \forall integer j; 0<=j<5 ==> tt[0][j] == 0; + ensures Padd : \forall integer k; 0<=k<5 ==> reg_add[k] == \old(tt[0][k]); + */ +void calls_on_array_dim_2 (void) +{ + load_1_5(tt); + reset_1_5(tt); + add_1_5(tt); +} + + + + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/reference_array_simple.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/reference_array_simple.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/reference_array_simple.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/reference_array_simple.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,42 @@ +/* run.config + OPT: -wp-model +ref -wp-log var_kind +*/ + +/* run.config_qualif + OPT: -wp -wp-proof alt-ergo -wp-par 1 -wp-model +ref +*/ + +int tt[10][5]; + +//@ ensures \result == p1[i]; assigns \nothing; +int f1 (int * p1,int i) ; + +//@ ensures todo: \result ==5; +int call_f1(void) +{ + tt[0][3] = 5; + return f1(tt,3); +} + + +//@ ensures \result[3] == p2[j][3] ; assigns \nothing; +int * f2 (int (*p2)[5], int j); + +//@ ensures \result == 5; +int call_f2(void) +{ + tt[2][3] = 5; + return ((f2(tt,2))[3]); +} + + +//@ ensures \result == p3[k] ; assigns \nothing; +int * f3(int ** p3,int k); + + +int * tp [10]; + +//@ ensures \result == tp[5]; +int * call_f3(void) +{ return (f3(tp,5)); +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/reference.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/reference.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/reference.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/reference.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,61 @@ +/* run.config + OPT: -wp-model +ref -wp-log var_kind +*/ + +/* run.config_qualif + OPT: -wp -wp-proof alt-ergo -wp-par 1 -wp-model +ref +*/ + +/*@ + requires \valid(p); + assigns \nothing ; + ensures \result == *p ; + */ +int f(int * p); + +/*@ + assigns \nothing ; + ensures \result == 4 ; + */ +int g (int x){ + x = 4 ; + return f(&x); +} + + +/*@ requires \valid(p2) && \valid(q) ; + assigns \nothing ; + ensures \result == *p2+*q; +*/ +int f2(int *p2, int * q); + +/*@ + requires \valid(ptr); + assigns \nothing; + ensures \result == 4; + */ +int call_f2(int * ptr, int y) +{ + y = 2 ; *ptr =2; + return f2(ptr,&y); +} + + +int *gl; + +/*@ requires \valid(gl) ; assigns \nothing; ensures \result == *gl; + */ +int call_global (void) +{ return f(gl);} + + +/*--------------------------------------------*/ + + + +/*@ requires \valid(pa); + assigns *pa; + ensures *pa == kb; + */ +void write (int kb,int * pa) +{ *pa = kb;} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/refguards.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/refguards.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_hoare/refguards.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_hoare/refguards.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,43 @@ +/* run.config + OPT: -wp-model +ref +*/ + +/* run.config_qualif + OPT: -wp -wp-proof alt-ergo -wp-par 1 -wp-model +ref +*/ + +//@ ensures \separated(c,d) ; +void f( int *a, int *b ,int *c ,int * d, int k ) +{ + a[k] = b[k] ; + *d = *c ; + *c = k ; +} + +//@ ensures a[k]==b[k] ; +void g( int *a, int *b, int k ) +{ + a[k] = b[k] ; +} + +/* No warning ; ensures checks the added hyps */ +//@ ensures \separated(c,d); +void h( int *c, int *d, int k ) +{ + *d = *c ; + *c = k ; +} + +/* No warning ; ensures checks the added hyps */ +/*@ ensures \separated(c,d); + @ ensures \separated(c,*c); + @ ensures \separated(c,*d); + @ ensures \separated(*c,d); + @ ensures \separated(*c,*d); + @ ensures \separated(d,*d); +*/ +void s( int **c, int **d, int k ) +{ + **d = **c ; + **c = k ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/abs.driver frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/abs.driver --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/abs.driver 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/abs.driver 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,6 @@ +library "abs": +logic integer ABS (integer) = "my_abs" ; + +coq.file := "Abs.v"; +altergo.file := "abs.mlw"; +why3.file := "abs.why"; \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/abs.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/abs.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/abs.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/abs.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,18 @@ +/* run.config + OPT: -wp-driver tests/wp_plugin/abs.driver + */ + +/* run.config_qualif + OPT: -wp -wp-driver tests/wp_plugin/abs.driver -wp-proof alt-ergo + OPT: -wp -wp-driver tests/wp_plugin/abs.driver -wp-proof coq -wp-script tests/wp_plugin/abs.script + OPT: -wp -wp-driver tests/wp_plugin/abs.driver -wp-proof why3:alt-ergo +*/ + +/*@ axiomatic Absolute { logic integer ABS(integer x) ; } */ + +/*@ ensures \result == ABS(x) ; */ +int abs(int x) +{ + if (x < 0) return -x ; + return x ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/abs.mlw frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/abs.mlw --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/abs.mlw 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/abs.mlw 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,3 @@ +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 -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/abs.script frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/abs.script --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/abs.script 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/abs.script 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,13 @@ +(* Generated by Frama-C WP *) + +Goal typed_abs_abs_post. +Hint abs,default,property. +Proof. + intro n. intros. subst. + unfold my_abs. unfold itep in *. + case_lt n 0%Z ; + [ intros ; rewrite Zabs_non_eq | intros ; rewrite Zabs_eq ] ; + auto with zarith. +Qed. + + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/Abs.v frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/Abs.v --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/Abs.v 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/Abs.v 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,4 @@ +Require Import ZArith. + +Definition my_abs := Zabs. + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/abs.why frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/abs.why --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/abs.why 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/abs.why 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,10 @@ + +theory Abs + +use import int.Int + +function 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 + +end \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/call.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/call.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/call.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/call.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,31 @@ +/* run.config_qualif + DONTRUN: (config_qualif) Nothing to improve here +*/ + +/* run.config_qed + DONTRUN: (config_qed) see config_qualif +*/ + +/* The objective here is to check that 'job' preconditions are + only proved under default behavior (not for A nor B). +*/ + +/*@ requires x > 0 ; ensures \result > 0; assigns \nothing ; */ +int job(int x); + + +/*@ ensures \result >= 0 ; + @ assigns \nothing ; + @ behavior A: + @ assumes x < y; + @ ensures \result > 0 ; + @ behavior B: + @ assumes x > y; + @ ensures \result > 0 ; +*/ +int main(int x,int y) +{ + if (xy) return job(x-y); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/combined.c frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/combined.c --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/combined.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/combined.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,48 @@ +/* run.config_qualif + DONTRUN: [PB] temporary removed since a difference has to be validated. +*/ + +/* run.config_qualif + OPT: -wp-par 1 -load-script tests/wp_plugin/combined.ml +*/ + +/* ZD : this should not be here such as it cannot be tested by all frama-c + developer + */ + +/*@ axiomatic A { + @ predicate P(int x); + @ }*/ + +/*@ ensures P(\result); + @ assigns \nothing; */ +int f(int i); + +/*@ assigns \nothing; */ +int g(int j); + +void job(int *t, int A) { + + /*@ assert 50 <= A <= 100; */ + + /*@ loop invariant 0 <= i <= 50; + @ loop invariant \forall integer k; 0 <= k < i ==> P(t[k]); + @ loop assigns i,t[0..49]; + @ */ + for(int i = 0; i < 50; i++) t[i] = f(i); + + /*@ loop invariant A <= j <= 100; + @ loop assigns j,t[A..99]; + @ */ + for(int j = A; j < 100; j++) t[j] = g(j); + + /*@ assert \forall integer k; 0 <= k < 50 ==> P(t[k]); */ + +} + +int T[100]; + +void main(void) { + job(T, 50); + // job(T, 48); +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/combined.ml frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/combined.ml --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/combined.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/combined.ml 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,22 @@ +let main () = + Ast.compute (); + let module OLS = Datatype.List(Datatype.String) in + let module OKF = Datatype.Option(Kernel_function) in + let module OP = Datatype.Option(Property) in + Dynamic.get + ~plugin:"Wp" "wp_compute" + (Datatype.func3 OKF.ty OLS.ty OP.ty Datatype.unit) + (Some + (try Globals.Functions.find_by_name "job" + with Not_found -> assert false)) + [] + None; + let report = + Dynamic.get + ~plugin:"Report" "print" (Datatype.func Datatype.unit Datatype.unit) + in + report (); + !Db.Value.compute (); + report () + +let () = Db.Main.extend main diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/copy.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/copy.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/copy.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/copy.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,20 @@ +// Everything should be discharged. + +/*@ requires n>=0 ; + @ requires \separated( a+ (0..n-1) , b + (0..n-1) ); + @ ensures \forall integer k ; 0 <= k < n ==> a[k] == b[k] ; + @ assigns a[0..n-1] ; + @ */ +void copy( int * a , int * b , int n ) +{ + /*@ loop invariant Range: 0 <= i <= n ; + @ loop invariant Copy: \forall integer k ; 0 <= k < i ==> a[k] == b[k] ; + @ loop assigns i , a[0..n-1] ; + @ */ + for (int i = 0 ; i < n ; i++) { + L: + a[i] = b[i] ; + /*@ assert A: \forall integer k ; 0 <= k < i ==> a[k] == \at(a[k],L); */ + /*@ assert B: \forall integer k ; 0 <= k < i ==> b[k] == \at(b[k],L); */ + } +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/dynamic.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/dynamic.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/dynamic.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/dynamic.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,31 @@ +/* run.config + OPT: -wp-dynamic +*/ + +/* run.config_qualif + OPT: -wp-dynamic -wp +*/ + +/*@ + requires -10<=x<=10; + ensures \result == x+1; + assigns \nothing; +*/ +int f1(int x); + +/*@ ensures \result == x-1; assigns \nothing; */ +int f2(int x); + +typedef struct S { + int param ; + int (*f)(int) ; +} ; + +/*@ + requires (closure->f == &f1 && \abs(closure->param)<=5) || closure->f == &f2 ; + ensures \abs(\result - closure->param) <= 1 ; + */ +int call(struct S * closure) { + /*@ calls f1,f2 ; */ + return (closure -> f)(closure -> param) ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/frame.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/frame.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/frame.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/frame.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,38 @@ +// Everything FRAMED goals should be discharged. Not the KO ones. + +int g ; +void f(void) { return; } + +/*@ + ensures FRAMED: \result == \old(g) ; + ensures KO: \result == g ; +*/ +int local(void) +{ + int x = g ; + f(); + return x; +} + +//@ensures KO: \result == \old(g) ; +int global(void) +{ + f(); + return g; +} + +//@ensures KO: \result == \old(*p) ; +int localref(int *p) +{ + f(); + //@ assert FRAMED: p == \at(p,Pre); + return *p; +} + +//@ensures KO: \result == r ; +int alias(int r) +{ + int p = &r ; + f(); + return r ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/init_const_guard.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/init_const_guard.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/init_const_guard.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/init_const_guard.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,34 @@ +/* run.config + OPT: -wp-init-const +*/ + +/* run.config_qualif + OPT: -wp-init-const +*/ + +int x ; +int * const q = &x ; +const int * p = &x ; + +/*@ + ensures Const: q == &x ; + ensures Pointed_Valid: \valid(q); + ensures Q_ReadOnly: \valid_read(&q); + ensures Q_NotWrite: !\valid(&q); +*/ +int f(void) +{ + return 0; +} + + +/*@ + ensures P_not_Const: \valid(&p); +*/ +void g(void) +{ + p = &x ; + //@ assert Read: \valid_read(p); + //@ assert Guard_against_Const: !\valid(p); + *p = 2 ; // SHOULD BE A RUNTIME ERROR +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/init_const.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/init_const.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/init_const.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/init_const.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,22 @@ +/* run.config + OPT: -wp-init-const +*/ + +/* run.config_qualif + OPT: -wp-init-const +*/ + + int A[4] = { 1,2,3 } ; +const int B[4] = { 1,2,3 } ; + +//@ ensures KO: \result == 6 ; +int fA(void) { return A[0]+A[1]+A[2]+A[3] ; } + +//@ ensures OK: \result == 6 ; +int fB(void) { return B[0]+B[1]+B[2]+B[3] ; } + +//@ ensures KO: \result == \at(A[3],Init) ; +int fC(void) { return A[3]; } + +//@ ensures OK: \result == \at(B[3],Init) ; +int fD(void) { return B[3]; } diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/init_extern.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/init_extern.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/init_extern.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/init_extern.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +/* run.config + OPT: tests/wp_plugin/init_linker.i + */ + +/* run.config_qualif + OPT: tests/wp_plugin/init_linker.i + */ + +// To be linked with init_linker that defines the initial value of 'a' + +extern int a ; +extern int b ; + +/*@ + ensures OK: \at( a , Init ) == 2 ; + ensures KO: \at( a , Init ) == 0 ; + ensures KO: \at( b , Init ) == 0 ; +*/ +void f(void) { return; } diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/init_linker.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/init_linker.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/init_linker.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/init_linker.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,9 @@ +/* run.config + DONTRUN: this is complementary file to init_extern.i +*/ + +/* run.config_qualif + DONTRUN: this is complementary file to init_extern.i +*/ + +int a = 2 ; diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/init_valid.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/init_valid.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/init_valid.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/init_valid.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ + int A[4] = { 1,2,3 } ; +const int B[4] = { 1,2,3 } ; + +void validA(void) +{ + //@ assert OK: \valid_read( &B[1] ); + //@ assert OK: \valid( &A[2] ); + A[2] = B[1] ; +} + +void validB(void) +{ + //@ assert OK: \valid_read( &A[1] ); + //@ assert KO: \valid( &B[2] ); + B[2] = A[1] ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/injector.c frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/injector.c --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/injector.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/injector.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,59 @@ +/* run.config_qualif + OPT: -pp-annot -wp -wp-par 1 -wp-prop="-qed_ko" + OPT: -pp-annot -wp -wp-par 1 -wp-prop qed_ko -wp-timeout 2 +*/ + +#define OK 33 +#define KO 55 + +int k ; +int inp[5] ; +int out[5] ; + +/*@ requires 0 <= k < 5 ; + @ ensures \result == out[\old(k)] ; + @ ensures inp[\old(k)] == u ; + @ ensures k == \old(k)+1 ; + @ assigns k,inp[k] ; + @ */ +int g(int u); + +/*@ requires k == 0 ; + @ behavior FST_FAIL: + @ assumes out[0] != OK ; + @ ensures qed_ok: k == 1 ; + @ ensures qed_ok: inp[0] == a ; + @ ensures qed_ok: \result == KO ; + @ behavior SND_FAIL: + @ assumes out[0] == OK ; + @ assumes out[1] != OK ; + @ ensures qed_ok: k == 2 ; + @ ensures qed_ok: inp[0] == a ; + @ ensures qed_ok: inp[1] == b ; + @ ensures qed_ok: \result == KO ; + @ behavior SUCCESS: + @ assumes out[0] == OK ; + @ assumes out[1] == OK ; + @ ensures qed_ok: k == 2 ; + @ ensures qed_ok: inp[0] == a ; + @ ensures qed_ok: inp[1] == b ; + @ ensures qed_ok: \result == OK ; + @ behavior ko: + @ ensures qed_ko: inp[0] == b ; + @ behavior ko_1: + @ assumes out[0] == OK ; + @ assumes out[1] == OK ; + @ ensures qed_ko: k == 1 ; + @ ensures qed_ko: inp[1] == a ; + @ ensures qed_ko: \result == KO ; + @ */ +int f(int a,int b) +{ + int x ; + int y ; + x = g(a); + if (x != OK) return KO ; + y = g(b); + if (y != OK) return KO ; + return OK ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/loopentry.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/loopentry.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/loopentry.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/loopentry.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,13 @@ + +/*@ requires (n+p) > 0; */ +void f(int n,int p) +{ + int r; + n += p; + r = 0; + /*@ + loop invariant \at(n,LoopEntry) == \at(n+p,Pre); + loop invariant n + r == \at(n,LoopEntry); + */ + while (n--) r++; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/loop.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/loop.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/loop.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/loop.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,17 @@ +/* run.config_qualif + OPT: -wp -wp-par 1 -wp-prop qed_ok +*/ + +/*@ requires \valid(t + (a..b)); + @ requires a <= b ; + @ ensures qed_ok: \forall int i ; a <= i <= b ==> t[i] == e ; + @ assigns qed_ok: t[a..b] ; + @*/ +void init( int * t , int a , int b , int e ) +{ + /*@ loop invariant qed_ok: a <= i <= b+1 ; + @ loop invariant qed_ok: \forall int j ; a <= j < i ==> t[j] == e ; + @ loop assigns qed_ok: i,t[a..i-1] ; */ + for ( int i = a ; i <= b ; i ++ ) + t[i] = e ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/abs.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/abs.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/abs.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/abs.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,24 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/abs.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Loading driver 'tests/wp_plugin/abs.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function abs +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_plugin/abs.i, line 13) in 'abs': +Assume { + (* Domain *) + Type: (is_sint32 abs_0) /\ (is_sint32 x_0). + (* tests/wp_plugin/abs.i:16: Conditional *) + If: x_0<0 + Then { (* Control Flow *) Have: 0=(abs_0+x_0). } + Else { (* Control Flow *) Have: abs_0=x_0. } +} +Prove: abs_0=(ABS x_0). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/call.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/call.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/call.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/call.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,171 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/call.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function main +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_plugin/call.i, line 17) in 'main': +Assume { + (* Domain *) + Type: (is_sint32 main_0) /\ (is_sint32 x_3) /\ (is_sint32 y_3). + (* Residual *) + When: y_3<=x_3. + (* tests/wp_plugin/call.i:29: Conditional *) + If: y_3 (0<=i_0) -> (P_P Mint_1[(shift_sint32 t_0 i_0)]). + (* Invariant (file tests/wp_plugin/combined.c, line 28) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: (0<=i_2) /\ (i_2<=50). + (* tests/wp_plugin/combined.c:32: Then *) + Have: i_2<=49. + (* tests/wp_plugin/combined.c:32: Call 'f' *) + Have: (P_P v_0). +} +Prove: -1<=i_2. + +------------------------------------------------------------ + +Goal Establishment of Invariant (file tests/wp_plugin/combined.c, line 28): +Assume { + (* Domain *) + Type: (is_sint32 A_0). + (* Heap *) + Have: (linked Malloc_1) /\ ((region (base t_7))<=0). + (* Assertion (file tests/wp_plugin/combined.c, line 26) *) + (* tests/wp_plugin/combined.c:26: Assertion: *) + Have: (50<=A_0) /\ (A_0<=100). +} +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant (file tests/wp_plugin/combined.c, line 29): +Assume { + (* Domain *) + Type: (is_sint32 A_0) /\ (is_sint32 i_2) /\ (is_sint32 v_0) + /\ (is_sint32 (1+i_2)). + (* Goal *) + When: (0<=i_1) /\ (i_1<=i_2). + (* Heap *) + Have: (linked Malloc_1) /\ ((region (base t_0))<=0). + (* Assertion (file tests/wp_plugin/combined.c, line 26) *) + (* tests/wp_plugin/combined.c:26: Assertion: *) + Have: (50<=A_0) /\ (A_0<=100). + (* tests/wp_plugin/combined.c:32: Assigns *) + (* tests/wp_plugin/combined.c:32: Loop assigns ...: *) + Have: (havoc Mint_9 Mint_1 (shift_sint32 t_0 0) 50). + (* Invariant (file tests/wp_plugin/combined.c, line 29) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: forall i_0:int. + (i_0 (0<=i_0) -> (P_P Mint_1[(shift_sint32 t_0 i_0)]). + (* Invariant (file tests/wp_plugin/combined.c, line 28) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: (0<=i_2) /\ (i_2<=50). + (* tests/wp_plugin/combined.c:32: Then *) + Have: i_2<=49. + (* tests/wp_plugin/combined.c:32: Call 'f' *) + Have: (P_P v_0). +} +Prove: (P_P Mint_1[(shift_sint32 t_0 i_2)->v_0][(shift_sint32 t_0 i_1)]). + +------------------------------------------------------------ + +Goal Establishment of Invariant (file tests/wp_plugin/combined.c, line 29): +Assume { (* Goal *) When: false. } +Prove: (P_P Mint_9[(shift_sint32 t_7 i_7)]). + +------------------------------------------------------------ + +Goal Preservation of Invariant (file tests/wp_plugin/combined.c, line 34): +Let x_0 = 1+j_1. +Assume { + (* Domain *) + Type: (is_sint32 A_0) /\ (is_sint32 i_2) /\ (is_sint32 j_1) + /\ (is_sint32 x_0). + (* Heap *) + Have: (linked Malloc_1) /\ ((region (base t_2))<=0). + (* Assertion (file tests/wp_plugin/combined.c, line 26) *) + (* tests/wp_plugin/combined.c:26: Assertion: *) + Have: (50<=A_0) /\ (A_0<=100). + (* tests/wp_plugin/combined.c:32: Assigns *) + (* tests/wp_plugin/combined.c:32: Loop assigns ...: *) + Have: (havoc Mint_9 Mint_6 (shift_sint32 t_2 0) 50). + (* Invariant (file tests/wp_plugin/combined.c, line 29) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: forall i_0:int. + (i_0 (0<=i_0) -> (P_P Mint_6[(shift_sint32 t_2 i_0)]). + (* Invariant (file tests/wp_plugin/combined.c, line 28) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: (0<=i_2) /\ (i_2<=50). + (* tests/wp_plugin/combined.c:32: Else *) + Have: 50<=i_2. + (* tests/wp_plugin/combined.c:37: Assigns *) + (* tests/wp_plugin/combined.c:37: Loop assigns ...: *) + Have: (havoc Mint_6 Mint_2 (shift_sint32 t_2 A_0) (100-A_0)). + (* Invariant (file tests/wp_plugin/combined.c, line 34) *) + (* tests/wp_plugin/combined.c:37: Invariant: *) + Have: (A_0<=j_1) /\ (j_1<=100). + (* tests/wp_plugin/combined.c:37: Then *) + Have: j_1<=99. +} +Prove: A_0<=x_0. + +------------------------------------------------------------ + +Goal Establishment of Invariant (file tests/wp_plugin/combined.c, line 34): +Assume { + (* Domain *) + Type: (is_sint32 A_0) /\ (is_sint32 i_2). + (* Heap *) + Have: (linked Malloc_1) /\ ((region (base t_7))<=0). + (* Assertion (file tests/wp_plugin/combined.c, line 26) *) + (* tests/wp_plugin/combined.c:26: Assertion: *) + Have: (50<=A_0) /\ (A_0<=100). + (* tests/wp_plugin/combined.c:32: Assigns *) + (* tests/wp_plugin/combined.c:32: Loop assigns ...: *) + Have: (havoc Mint_9 Mint_8 (shift_sint32 t_7 0) 50). + (* Invariant (file tests/wp_plugin/combined.c, line 29) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: forall i_0:int. + (i_0 (0<=i_0) -> (P_P Mint_8[(shift_sint32 t_7 i_0)]). + (* Invariant (file tests/wp_plugin/combined.c, line 28) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: (0<=i_2) /\ (i_2<=50). + (* tests/wp_plugin/combined.c:32: Else *) + Have: 50<=i_2. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assertion (file tests/wp_plugin/combined.c, line 39): +Assume { + (* Domain *) + Type: (is_sint32 A_0) /\ (is_sint32 i_2) /\ (is_sint32 j_1). + (* Goal *) + When: (0<=i_5) /\ (i_5<=49). + (* Heap *) + Have: (linked Malloc_1) /\ ((region (base t_4))<=0). + (* Assertion (file tests/wp_plugin/combined.c, line 26) *) + (* tests/wp_plugin/combined.c:26: Assertion: *) + Have: (50<=A_0) /\ (A_0<=100). + (* tests/wp_plugin/combined.c:32: Assigns *) + (* tests/wp_plugin/combined.c:32: Loop assigns ...: *) + Have: (havoc Mint_9 Mint_6 (shift_sint32 t_4 0) 50). + (* Invariant (file tests/wp_plugin/combined.c, line 29) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: forall i_0:int. + (i_0 (0<=i_0) -> (P_P Mint_6[(shift_sint32 t_4 i_0)]). + (* Invariant (file tests/wp_plugin/combined.c, line 28) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: (0<=i_2) /\ (i_2<=50). + (* tests/wp_plugin/combined.c:32: Else *) + Have: 50<=i_2. + (* tests/wp_plugin/combined.c:37: Assigns *) + (* tests/wp_plugin/combined.c:37: Loop assigns ...: *) + Have: (havoc Mint_6 Mint_4 (shift_sint32 t_4 A_0) (100-A_0)). + (* Invariant (file tests/wp_plugin/combined.c, line 34) *) + (* tests/wp_plugin/combined.c:37: Invariant: *) + Have: (A_0<=j_1) /\ (j_1<=100). + (* tests/wp_plugin/combined.c:37: Else *) + Have: 100<=j_1. +} +Prove: (P_P Mint_4[(shift_sint32 t_4 i_5)]). + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_plugin/combined.c, line 30) (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_plugin/combined.c, line 30) (2/3): +Effect at line 32 +Let a_0 = (shift_sint32 t_0 0). +Assume { + (* Domain *) + Type: (is_sint32 A_0) /\ (is_sint32 i_2) /\ (is_sint32 v_0). + (* Goal *) + When: (valid_rd Malloc_0 a_0 50). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base t_0))<=0). + (* Assertion (file tests/wp_plugin/combined.c, line 26) *) + (* tests/wp_plugin/combined.c:26: Assertion: *) + Have: (50<=A_0) /\ (A_0<=100). + (* tests/wp_plugin/combined.c:32: Assigns *) + (* tests/wp_plugin/combined.c:32: Loop assigns ...: *) + Have: (havoc Mint_9 Mint_1 a_0 50). + (* Invariant (file tests/wp_plugin/combined.c, line 29) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: forall i_0:int. + (i_0 (0<=i_0) -> (P_P Mint_1[(shift_sint32 t_0 i_0)]). + (* Invariant (file tests/wp_plugin/combined.c, line 28) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: (0<=i_2) /\ (i_2<=50). + (* tests/wp_plugin/combined.c:32: Then *) + Have: i_2<=49. + (* tests/wp_plugin/combined.c:32: Call 'f' *) + Have: (P_P v_0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_plugin/combined.c, line 30) (3/3): +Call Result at line 32 +Assume { + (* Domain *) + Type: (is_sint32 A_0) /\ (is_sint32 i_2) /\ (is_sint32 v_0). + (* Goal *) + When: (valid_rd Malloc_0 (shift_sint32 t_0 i_2) 1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base t_0))<=0). + (* Assertion (file tests/wp_plugin/combined.c, line 26) *) + (* tests/wp_plugin/combined.c:26: Assertion: *) + Have: (50<=A_0) /\ (A_0<=100). + (* tests/wp_plugin/combined.c:32: Assigns *) + (* tests/wp_plugin/combined.c:32: Loop assigns ...: *) + Have: (havoc Mint_9 Mint_1 (shift_sint32 t_0 0) 50). + (* Invariant (file tests/wp_plugin/combined.c, line 29) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: forall i_0:int. + (i_0 (0<=i_0) -> (P_P Mint_1[(shift_sint32 t_0 i_0)]). + (* Invariant (file tests/wp_plugin/combined.c, line 28) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: (0<=i_2) /\ (i_2<=50). + (* tests/wp_plugin/combined.c:32: Then *) + Have: i_2<=49. + (* tests/wp_plugin/combined.c:32: Call 'f' *) + Have: (P_P v_0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_plugin/combined.c, line 35) (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_plugin/combined.c, line 35) (2/3): +Effect at line 37 +Let a_0 = (shift_sint32 t_2 A_0). +Let x_0 = 100-A_0. +Assume { + (* Domain *) + Type: (is_sint32 A_0) /\ (is_sint32 i_2) /\ (is_sint32 j_1). + (* Goal *) + When: (valid_rd Malloc_0 a_0 x_0). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base t_2))<=0). + (* Assertion (file tests/wp_plugin/combined.c, line 26) *) + (* tests/wp_plugin/combined.c:26: Assertion: *) + Have: (50<=A_0) /\ (A_0<=100). + (* tests/wp_plugin/combined.c:32: Assigns *) + (* tests/wp_plugin/combined.c:32: Loop assigns ...: *) + Have: (havoc Mint_9 Mint_6 (shift_sint32 t_2 0) 50). + (* Invariant (file tests/wp_plugin/combined.c, line 29) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: forall i_0:int. + (i_0 (0<=i_0) -> (P_P Mint_6[(shift_sint32 t_2 i_0)]). + (* Invariant (file tests/wp_plugin/combined.c, line 28) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: (0<=i_2) /\ (i_2<=50). + (* tests/wp_plugin/combined.c:32: Else *) + Have: 50<=i_2. + (* tests/wp_plugin/combined.c:37: Assigns *) + (* tests/wp_plugin/combined.c:37: Loop assigns ...: *) + Have: (havoc Mint_6 Mint_2 a_0 x_0). + (* Invariant (file tests/wp_plugin/combined.c, line 34) *) + (* tests/wp_plugin/combined.c:37: Invariant: *) + Have: (A_0<=j_1) /\ (j_1<=100). + (* tests/wp_plugin/combined.c:37: Then *) + Have: j_1<=99. +} +Prove: (included a_0 x_0 a_0 x_0). + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_plugin/combined.c, line 35) (3/3): +Call Result at line 37 +Let a_0 = (shift_sint32 t_2 j_1). +Let a_1 = (shift_sint32 t_2 A_0). +Let x_0 = 100-A_0. +Assume { + (* Domain *) + Type: (is_sint32 A_0) /\ (is_sint32 i_2) /\ (is_sint32 j_1). + (* Goal *) + When: (valid_rd Malloc_0 a_0 1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base t_2))<=0). + (* Assertion (file tests/wp_plugin/combined.c, line 26) *) + (* tests/wp_plugin/combined.c:26: Assertion: *) + Have: (50<=A_0) /\ (A_0<=100). + (* tests/wp_plugin/combined.c:32: Assigns *) + (* tests/wp_plugin/combined.c:32: Loop assigns ...: *) + Have: (havoc Mint_9 Mint_6 (shift_sint32 t_2 0) 50). + (* Invariant (file tests/wp_plugin/combined.c, line 29) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: forall i_0:int. + (i_0 (0<=i_0) -> (P_P Mint_6[(shift_sint32 t_2 i_0)]). + (* Invariant (file tests/wp_plugin/combined.c, line 28) *) + (* tests/wp_plugin/combined.c:32: Invariant: *) + Have: (0<=i_2) /\ (i_2<=50). + (* tests/wp_plugin/combined.c:32: Else *) + Have: 50<=i_2. + (* tests/wp_plugin/combined.c:37: Assigns *) + (* tests/wp_plugin/combined.c:37: Loop assigns ...: *) + Have: (havoc Mint_6 Mint_2 a_1 x_0). + (* Invariant (file tests/wp_plugin/combined.c, line 34) *) + (* tests/wp_plugin/combined.c:37: Invariant: *) + Have: (A_0<=j_1) /\ (j_1<=100). + (* tests/wp_plugin/combined.c:37: Then *) + Have: j_1<=99. +} +Prove: (included a_0 1 a_1 x_0). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/copy.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/copy.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/copy.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/copy.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,374 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/copy.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function copy +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_plugin/copy.i, line 5) in 'copy': +Let a_0 = (shift_sint32 a_3 0). +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 n_0). + (* Goal *) + When: (i_6 (0<=i_0) + -> (Mint_3[(shift_sint32 a_3 i_0)]=Mint_3[(shift_sint32 b_2 i_0)]). + (* Invariant 'Range' (file tests/wp_plugin/copy.i, line 10) *) + (* tests/wp_plugin/copy.i:14: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_plugin/copy.i:14: Else *) + Have: n_0<=i_2. +} +Prove: Mint_3[(shift_sint32 a_3 i_6)]=Mint_3[(shift_sint32 b_2 i_6)]. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Copy' (file tests/wp_plugin/copy.i, line 11): +Let m_0 = Mint_1[(shift_sint32 a_0 i_2)->Mint_1[(shift_sint32 b_0 i_2)]]. +Let a_1 = (shift_sint32 a_0 0). +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 n_0) /\ (is_sint32 (1+i_2)). + (* Goal *) + When: (0<=i_1) /\ (i_1<=i_2). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_plugin/copy.i, line 3) in 'copy' *) + (* Pre-condition: *) + Have: 0<=n_0. + (* Pre-condition (file tests/wp_plugin/copy.i, line 4) in 'copy' *) + (* Pre-condition: *) + Have: (separated a_1 n_0 (shift_sint32 b_0 0) n_0). + (* tests/wp_plugin/copy.i:14: Assigns *) + (* tests/wp_plugin/copy.i:14: Loop assigns ...: *) + Have: (havoc Mint_5 Mint_1 a_1 n_0). + (* Invariant 'Copy' (file tests/wp_plugin/copy.i, line 11) *) + (* tests/wp_plugin/copy.i:14: Invariant 'Copy': *) + Have: forall i_0:int. + (i_0 (0<=i_0) + -> (Mint_1[(shift_sint32 a_0 i_0)]=Mint_1[(shift_sint32 b_0 i_0)]). + (* Invariant 'Range' (file tests/wp_plugin/copy.i, line 10) *) + (* tests/wp_plugin/copy.i:14: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_plugin/copy.i:14: Then *) + Have: i_2 (0<=i_0) -> (Mint_1[a_2]=m_0[a_2]). + (* Assertion 'B' (file tests/wp_plugin/copy.i, line 18) *) + (* tests/wp_plugin/copy.i:18: Assertion 'B': *) + Have: forall i_0:int. + let a_2 = (shift_sint32 b_0 i_0) in + (i_0 (0<=i_0) -> (Mint_1[a_2]=m_0[a_2]). +} +Prove: m_0[(shift_sint32 a_0 i_1)]=m_0[(shift_sint32 b_0 i_1)]. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Copy' (file tests/wp_plugin/copy.i, line 11): +Assume { (* Goal *) When: false. } +Prove: Mint_5[(shift_sint32 a_0 i_8)]=Mint_5[(shift_sint32 b_0 i_8)]. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Range' (file tests/wp_plugin/copy.i, line 10): +Let m_0 = Mint_1[(shift_sint32 a_0 i_2)->Mint_1[(shift_sint32 b_0 i_2)]]. +Let a_1 = (shift_sint32 a_0 0). +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 n_0) /\ (is_sint32 (1+i_2)). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_plugin/copy.i, line 3) in 'copy' *) + (* Pre-condition: *) + Have: 0<=n_0. + (* Pre-condition (file tests/wp_plugin/copy.i, line 4) in 'copy' *) + (* Pre-condition: *) + Have: (separated a_1 n_0 (shift_sint32 b_0 0) n_0). + (* tests/wp_plugin/copy.i:14: Assigns *) + (* tests/wp_plugin/copy.i:14: Loop assigns ...: *) + Have: (havoc Mint_5 Mint_1 a_1 n_0). + (* Invariant 'Copy' (file tests/wp_plugin/copy.i, line 11) *) + (* tests/wp_plugin/copy.i:14: Invariant 'Copy': *) + Have: forall i_0:int. + (i_0 (0<=i_0) + -> (Mint_1[(shift_sint32 a_0 i_0)]=Mint_1[(shift_sint32 b_0 i_0)]). + (* Invariant 'Range' (file tests/wp_plugin/copy.i, line 10) *) + (* tests/wp_plugin/copy.i:14: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_plugin/copy.i:14: Then *) + Have: i_2 (0<=i_0) -> (Mint_1[a_2]=m_0[a_2]). + (* Assertion 'B' (file tests/wp_plugin/copy.i, line 18) *) + (* tests/wp_plugin/copy.i:18: Assertion 'B': *) + Have: forall i_0:int. + let a_2 = (shift_sint32 b_0 i_0) in + (i_0 (0<=i_0) -> (Mint_1[a_2]=m_0[a_2]). +} +Prove: -1<=i_2. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Range' (file tests/wp_plugin/copy.i, line 10): +Assume { + (* Domain *) + Type: (is_sint32 n_0). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_plugin/copy.i, line 3) in 'copy' *) + (* Pre-condition: *) + Have: 0<=n_0. + (* Pre-condition (file tests/wp_plugin/copy.i, line 4) in 'copy' *) + (* Pre-condition: *) + Have: (separated (shift_sint32 a_0 0) n_0 (shift_sint32 b_0 0) n_0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'A' (file tests/wp_plugin/copy.i, line 17): +Let a_1 = (shift_sint32 a_0 i_4). +Let a_2 = (shift_sint32 a_0 0). +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 n_0). + (* Goal *) + When: (i_4 (0<=i_0) + -> (Mint_1[(shift_sint32 a_0 i_0)]=Mint_1[(shift_sint32 b_0 i_0)]). + (* Invariant 'Range' (file tests/wp_plugin/copy.i, line 10) *) + (* tests/wp_plugin/copy.i:14: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_plugin/copy.i:14: Then *) + Have: i_2Mint_1[(shift_sint32 b_0 i_2)]][a_1]. + +------------------------------------------------------------ + +Goal Assertion 'B' (file tests/wp_plugin/copy.i, line 18): +Let a_1 = (shift_sint32 b_0 i_3). +Let m_0 = Mint_1[(shift_sint32 a_0 i_2)->Mint_1[(shift_sint32 b_0 i_2)]]. +Let a_2 = (shift_sint32 a_0 0). +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 n_0). + (* Goal *) + When: (i_3 (0<=i_0) + -> (Mint_1[(shift_sint32 a_0 i_0)]=Mint_1[(shift_sint32 b_0 i_0)]). + (* Invariant 'Range' (file tests/wp_plugin/copy.i, line 10) *) + (* tests/wp_plugin/copy.i:14: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_plugin/copy.i:14: Then *) + Have: i_2 (0<=i_0) -> (Mint_1[a_3]=m_0[a_3]). +} +Prove: Mint_1[a_1]=m_0[a_1]. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_plugin/copy.i, line 12) (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_plugin/copy.i, line 12) (2/3): +Effect at line 14 +Let a_1 = (shift_sint32 a_0 0). +Let m_0 = Mint_1[(shift_sint32 a_0 i_2)->Mint_1[(shift_sint32 b_0 i_2)]]. +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 n_0). + (* Goal *) + When: (valid_rd Malloc_0 a_1 n_0). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_plugin/copy.i, line 3) in 'copy' *) + (* Pre-condition: *) + Have: 0<=n_0. + (* Pre-condition (file tests/wp_plugin/copy.i, line 4) in 'copy' *) + (* Pre-condition: *) + Have: (separated a_1 n_0 (shift_sint32 b_0 0) n_0). + (* tests/wp_plugin/copy.i:14: Assigns *) + (* tests/wp_plugin/copy.i:14: Loop assigns ...: *) + Have: (havoc Mint_5 Mint_1 a_1 n_0). + (* Invariant 'Copy' (file tests/wp_plugin/copy.i, line 11) *) + (* tests/wp_plugin/copy.i:14: Invariant 'Copy': *) + Have: forall i_0:int. + (i_0 (0<=i_0) + -> (Mint_1[(shift_sint32 a_0 i_0)]=Mint_1[(shift_sint32 b_0 i_0)]). + (* Invariant 'Range' (file tests/wp_plugin/copy.i, line 10) *) + (* tests/wp_plugin/copy.i:14: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_plugin/copy.i:14: Then *) + Have: i_2 (0<=i_0) -> (Mint_1[a_2]=m_0[a_2]). + (* Assertion 'B' (file tests/wp_plugin/copy.i, line 18) *) + (* tests/wp_plugin/copy.i:18: Assertion 'B': *) + Have: forall i_0:int. + let a_2 = (shift_sint32 b_0 i_0) in + (i_0 (0<=i_0) -> (Mint_1[a_2]=m_0[a_2]). +} +Prove: (included a_1 n_0 a_1 n_0). + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_plugin/copy.i, line 12) (3/3): +Effect at line 16 +Let a_1 = (shift_sint32 a_0 i_2). +Let a_2 = (shift_sint32 a_0 0). +Let m_0 = Mint_1[a_1->Mint_1[(shift_sint32 b_0 i_2)]]. +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 n_0). + (* Goal *) + When: (valid_rd Malloc_0 a_1 1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_plugin/copy.i, line 3) in 'copy' *) + (* Pre-condition: *) + Have: 0<=n_0. + (* Pre-condition (file tests/wp_plugin/copy.i, line 4) in 'copy' *) + (* Pre-condition: *) + Have: (separated a_2 n_0 (shift_sint32 b_0 0) n_0). + (* tests/wp_plugin/copy.i:14: Assigns *) + (* tests/wp_plugin/copy.i:14: Loop assigns ...: *) + Have: (havoc Mint_5 Mint_1 a_2 n_0). + (* Invariant 'Copy' (file tests/wp_plugin/copy.i, line 11) *) + (* tests/wp_plugin/copy.i:14: Invariant 'Copy': *) + Have: forall i_0:int. + (i_0 (0<=i_0) + -> (Mint_1[(shift_sint32 a_0 i_0)]=Mint_1[(shift_sint32 b_0 i_0)]). + (* Invariant 'Range' (file tests/wp_plugin/copy.i, line 10) *) + (* tests/wp_plugin/copy.i:14: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_plugin/copy.i:14: Then *) + Have: i_2 (0<=i_0) -> (Mint_1[a_3]=m_0[a_3]). + (* Assertion 'B' (file tests/wp_plugin/copy.i, line 18) *) + (* tests/wp_plugin/copy.i:18: Assertion 'B': *) + Have: forall i_0:int. + let a_3 = (shift_sint32 b_0 i_0) in + (i_0 (0<=i_0) -> (Mint_1[a_3]=m_0[a_3]). +} +Prove: (included a_1 1 a_2 n_0). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_plugin/copy.i, line 6) in 'copy' (1/2): +Effect at line 14 +Assume { + (* Domain *) + Type: (is_sint32 n_0). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_plugin/copy.i, line 3) in 'copy' *) + (* Pre-condition: *) + Have: 0<=n_0. + (* Pre-condition (file tests/wp_plugin/copy.i, line 4) in 'copy' *) + (* Pre-condition: *) + Have: (separated (shift_sint32 a_0 0) n_0 (shift_sint32 b_0 0) n_0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_plugin/copy.i, line 6) in 'copy' (2/2): +Effect at line 14 +Let a_1 = (shift_sint32 a_0 0). +Assume { + (* Domain *) + Type: (is_sint32 n_0). + (* Heap *) + Have: (linked Malloc_1) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_plugin/copy.i, line 3) in 'copy' *) + (* Pre-condition: *) + Have: 0<=n_0. + (* Pre-condition (file tests/wp_plugin/copy.i, line 4) in 'copy' *) + (* Pre-condition: *) + Have: (separated a_1 n_0 (shift_sint32 b_0 0) n_0). + (* tests/wp_plugin/copy.i:14: Assigns *) + (* tests/wp_plugin/copy.i:14: Loop assigns ...: *) + Have: (havoc Mint_5 Mint_4 a_1 n_0). +} +Prove: (valid_rd Malloc_1 a_1 n_0) -> (included a_1 n_0 a_1 n_0). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/dynamic.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/dynamic.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/dynamic.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/dynamic.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,102 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/dynamic.i (no preprocessing) +[wp] Running WP plugin... +[wp] Computing dynamic calls. +[wp] Dynamic call(s): 1. +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function call +------------------------------------------------------------ + +Goal calls f1 f2 in 'call' at instruction (file tests/wp_plugin/dynamic.i, line 30): +Let a_0 = Mptr_0[(shiftfield_F_S_f closure_5)]. +Let a_1 = (shift_PTR (global G_f1_69) 0). +Let a_2 = (shift_PTR (global G_f2_75) 0). +Let x_0 = Mint_0[(shiftfield_F_S_param closure_5)]. +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[(shiftfield_F_S_param closure_2)]) + /\ (is_sint32 Mint_0[(shiftfield_F_S_param closure_4)]) + /\ (is_sint32 x_0). + (* Heap *) + Have: (framed Mptr_0) /\ ((region (base closure_5))<=0). + (* Pre-condition (file tests/wp_plugin/dynamic.i, line 25) in 'call' *) + (* Pre-condition: *) + Have: (a_0=a_2) \/ ((a_0=a_1) /\ ((\iabs x_0)<=5)). +} +Prove: (a_0=a_1) \/ (a_0=a_2). + +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_plugin/dynamic.i, line 26) in 'call' (1/2): +Tags: Call f1. +Let x_0 = Mint_0[(shiftfield_F_S_param closure_2)]. +Let a_0 = Mptr_0[(shiftfield_F_S_f closure_2)]. +Let a_1 = (shift_PTR (global G_f1_69) 0). +Assume { + (* Domain *) + Type: (is_sint32 x_0) + /\ (is_sint32 Mint_0[(shiftfield_F_S_param closure_4)]) + /\ (is_sint32 (1+x_0)). + (* Heap *) + Have: (framed Mptr_0) /\ ((region (base closure_2))<=0). + (* Pre-condition (file tests/wp_plugin/dynamic.i, line 25) in 'call' *) + (* Pre-condition: *) + Have: (a_0=(shift_PTR (global G_f2_75) 0)) + \/ ((a_0=a_1) /\ ((\iabs x_0)<=5)). + (* tests/wp_plugin/dynamic.i:30: Instance of 'f1' *) + Have: a_0=a_1. + (* tests/wp_plugin/dynamic.i:30: Call 'f1' *) + Have: (-10<=x_0) /\ (x_0<=10). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_plugin/dynamic.i, line 26) in 'call' (2/2): +Tags: Call f2. +Let a_0 = Mptr_0[(shiftfield_F_S_f closure_4)]. +Let a_1 = (shift_PTR (global G_f2_75) 0). +Let x_0 = Mint_0[(shiftfield_F_S_param closure_4)]. +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[(shiftfield_F_S_param closure_2)]) + /\ (is_sint32 x_0) /\ (is_sint32 (x_0-1)). + (* Heap *) + Have: (framed Mptr_0) /\ ((region (base closure_4))<=0). + (* Pre-condition (file tests/wp_plugin/dynamic.i, line 25) in 'call' *) + (* Pre-condition: *) + Have: (a_0=a_1) + \/ ((a_0=(shift_PTR (global G_f1_69) 0)) /\ ((\iabs x_0)<=5)). + (* tests/wp_plugin/dynamic.i:30: Instance of 'f2' *) + Have: a_0=a_1. +} +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_plugin/dynamic.i, line 10) in 'f1'' in 'call' at instruction (file tests/wp_plugin/dynamic.i, line 30) +: +Tags: Call f1. +Let x_0 = Mint_0[(shiftfield_F_S_param closure_2)]. +Let a_0 = Mptr_0[(shiftfield_F_S_f closure_2)]. +Let a_1 = (shift_PTR (global G_f1_69) 0). +Assume { + (* Domain *) + Type: (is_sint32 x_0) + /\ (is_sint32 Mint_0[(shiftfield_F_S_param closure_4)]). + (* Heap *) + Have: (framed Mptr_0) /\ ((region (base closure_2))<=0). + (* Pre-condition (file tests/wp_plugin/dynamic.i, line 25) in 'call' *) + (* Pre-condition: *) + Have: (a_0=(shift_PTR (global G_f2_75) 0)) + \/ ((a_0=a_1) /\ ((\iabs x_0)<=5)). + (* tests/wp_plugin/dynamic.i:30: Instance of 'f1' *) + Have: a_0=a_1. +} +Prove: (-10<=x_0) /\ (x_0<=10). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/frame.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/frame.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/frame.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/frame.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,75 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/frame.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function alias +------------------------------------------------------------ + +Goal Post-condition 'KO' in 'alias': +Let a_0 = (shift_sint32 (global P_r_86) 0). +Let x_0 = Mint_0[a_0]. +Let x_1 = Mint_1[a_0]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 x_1). + (* Heap *) + Have: (linked Malloc_7). +} +Prove: x_0=x_1. + +------------------------------------------------------------ +------------------------------------------------------------ + Function global +------------------------------------------------------------ + +Goal Post-condition 'KO' in 'global': +Assume { (* Domain *) Type: (is_sint32 g_0) /\ (is_sint32 global_0). } +Prove: g_0=global_0. + +------------------------------------------------------------ +------------------------------------------------------------ + Function local +------------------------------------------------------------ + +Goal Post-condition 'FRAMED' in 'local': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'KO' in 'local': +Assume { (* Domain *) Type: (is_sint32 g_0) /\ (is_sint32 local_0). } +Prove: g_0=local_0. + +------------------------------------------------------------ +------------------------------------------------------------ + Function localref +------------------------------------------------------------ + +Goal Post-condition 'KO' in 'localref': +Let x_0 = Mint_0[p_0]. +Let x_1 = Mint_1[p_0]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 x_1). + (* Heap *) + Have: (region (base p_0))<=0. +} +Prove: x_0=x_1. + +------------------------------------------------------------ + +Goal Assertion 'FRAMED' (file tests/wp_plugin/frame.i, line 28): +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[p_0]). + (* Heap *) + Have: (region (base p_0))<=0. +} +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/init_const_guard.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/init_const_guard.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/init_const_guard.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/init_const_guard.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,82 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/init_const_guard.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Post-condition 'Const' in 'f': +Assume { + (* Initializer *) + Have: (shift_sint32 (global G_x_67) 0)= + Mptr_0[(shift_PTR (global K_q_68) 0)]. + (* Heap *) + Have: (framed Mptr_0) /\ (linked Malloc_0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'Pointed_Valid' in 'f': +Let a_0 = (shift_sint32 (global G_x_67) 0). +Assume { + (* Initializer *) + Have: a_0=Mptr_0[(shift_PTR (global K_q_68) 0)]. + (* Heap *) + Have: (framed Mptr_0) /\ (linked Malloc_0). +} +Prove: (valid_rw Malloc_0 a_0 1). + +------------------------------------------------------------ + +Goal Post-condition 'Q_ReadOnly' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'Q_NotWrite' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function g +------------------------------------------------------------ + +Goal Post-condition 'P_not_Const' in 'g': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'Read' (file tests/wp_plugin/init_const_guard.i, line 31): +Let a_0 = (shift_sint32 (global G_x_67) 0). +Assume { + (* Initializer *) + Have: a_0=Mptr_2[(shift_PTR (global K_q_68) 0)]. + (* Heap *) + Have: (framed Mptr_2) /\ (linked Malloc_0). +} +Prove: (valid_rd Malloc_0 a_0 1). + +------------------------------------------------------------ + +Goal Assertion 'Guard_against_Const' (file tests/wp_plugin/init_const_guard.i, line 32): +Let a_0 = (shift_sint32 (global G_x_67) 0). +Assume { + (* Initializer *) + Have: a_0=Mptr_2[(shift_PTR (global K_q_68) 0)]. + (* Heap *) + Have: (framed Mptr_2) /\ (linked Malloc_0). + (* Assertion 'Read' (file tests/wp_plugin/init_const_guard.i, line 31) *) + (* tests/wp_plugin/init_const_guard.i:31: Assertion 'Read': *) + Have: (valid_rd Malloc_0 a_0 1). +} +Prove: not (valid_rw Malloc_0 a_0 1). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/init_const.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/init_const.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/init_const.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/init_const.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,92 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/init_const.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function fA +------------------------------------------------------------ + +Goal Post-condition 'KO' in 'fA': +Let x_0 = A_0[0]. +Let x_1 = A_0[1]. +Let x_2 = A_0[2]. +Let x_3 = A_0[3]. +Let x_4 = x_0+x_1+x_2+x_3. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 x_1) /\ (is_sint32 x_2) + /\ (is_sint32 x_3) /\ (is_sint32 x_4). +} +Prove: 6=x_4. + +------------------------------------------------------------ +------------------------------------------------------------ + Function fB +------------------------------------------------------------ + +Goal Post-condition 'OK' in 'fB': +Let x_0 = B_0[3]. +Let x_1 = B_0[2]. +Let x_2 = B_0[1]. +Let x_3 = B_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_3) /\ (is_sint32 x_2) /\ (is_sint32 x_1) + /\ (is_sint32 x_0) /\ (is_sint32 (6+x_0)). + (* Initializer *) + Have: 1=x_3. + (* Initializer *) + Have: 2=x_2. + (* Initializer *) + Have: 3=x_1. + (* Initializer *) + Have: forall i_0:int. (3<=i_0) -> (i_0<=3) -> (0=B_0[i_0]). +} +Prove: 0=x_0. + +------------------------------------------------------------ +------------------------------------------------------------ + Function fC +------------------------------------------------------------ + +Goal Post-condition 'KO' in 'fC': +Let x_0 = A_0[3]. +Let x_1 = A_1[3]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 x_1). + (* Initializer *) + Have: 1=A_0[0]. + (* Initializer *) + Have: 2=A_0[1]. + (* Initializer *) + Have: 3=A_0[2]. + (* Initializer *) + Have: forall i_0:int. (3<=i_0) -> (i_0<=3) -> (0=A_0[i_0]). +} +Prove: x_0=x_1. + +------------------------------------------------------------ +------------------------------------------------------------ + Function fD +------------------------------------------------------------ + +Goal Post-condition 'OK' in 'fD': +Assume { + (* Domain *) + Type: (is_sint32 B_0[3]). + (* Initializer *) + Have: 1=B_0[0]. + (* Initializer *) + Have: 2=B_0[1]. + (* Initializer *) + Have: 3=B_0[2]. + (* Initializer *) + Have: forall i_0:int. (3<=i_0) -> (i_0<=3) -> (0=B_0[i_0]). +} +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/init_extern.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/init_extern.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/init_extern.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/init_extern.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/init_extern.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/init_linker.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Post-condition 'OK' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'KO' in 'f': +Assume { } +Prove: false. + +------------------------------------------------------------ + +Goal Post-condition 'KO' in 'f': +Assume { (* Domain *) Type: (is_sint32 b_0). } +Prove: 0=b_0. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/init_valid.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/init_valid.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/init_valid.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/init_valid.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,37 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/init_valid.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function validA +------------------------------------------------------------ + +Goal Assertion 'OK' (file tests/wp_plugin/init_valid.i, line 6): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'OK' (file tests/wp_plugin/init_valid.i, line 7): +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function validB +------------------------------------------------------------ + +Goal Assertion 'OK' (file tests/wp_plugin/init_valid.i, line 13): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'KO' (file tests/wp_plugin/init_valid.i, line 14): +Assume { } +Prove: false. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/injector.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/injector.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/injector.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/injector.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,292 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/injector.c (with preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_plugin/injector.c, line 13) in 'g'' in 'f' at call 'g' (file tests/wp_plugin/injector.c, line 54) +: +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_plugin/injector.c, line 13) in 'g'' in 'f' at call 'g' (file tests/wp_plugin/injector.c, line 56) +: +Let x_0 = out_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 out_0[k_1]). + (* tests/wp_plugin/injector.c:54: Call 'g' *) + Have: 33=x_0. +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function f with behavior FST_FAIL +------------------------------------------------------------ + +Goal Post-condition for 'FST_FAIL' 'qed_ok' in 'f': +Let x_0 = out_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 out_0[k_2]). + (* Pre-condition for 'FST_FAIL' (file tests/wp_plugin/injector.c, line 23) in 'f' *) + (* Pre-condition for 'FST_FAIL': *) + Have: 33!=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition for 'FST_FAIL' 'qed_ok' in 'f': +Let x_0 = out_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 out_0[k_2]). + (* Pre-condition for 'FST_FAIL' (file tests/wp_plugin/injector.c, line 23) in 'f' *) + (* Pre-condition for 'FST_FAIL': *) + Have: 33!=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition for 'FST_FAIL' 'qed_ok' in 'f': +Let x_0 = out_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 out_0[k_2]). + (* Pre-condition for 'FST_FAIL' (file tests/wp_plugin/injector.c, line 23) in 'f' *) + (* Pre-condition for 'FST_FAIL': *) + Have: 33!=x_0. +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function f with behavior SND_FAIL +------------------------------------------------------------ + +Goal Post-condition for 'SND_FAIL' 'qed_ok' in 'f': +Let x_0 = out_0[1]. +Let x_1 = out_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0) /\ (is_sint32 out_0[k_2]). + (* Pre-condition for 'SND_FAIL' (file tests/wp_plugin/injector.c, line 28) in 'f' *) + (* Pre-condition for 'SND_FAIL': *) + Have: 33=x_1. + (* Pre-condition for 'SND_FAIL' (file tests/wp_plugin/injector.c, line 29) in 'f' *) + (* Pre-condition for 'SND_FAIL': *) + Have: 33!=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition for 'SND_FAIL' 'qed_ok' in 'f': +Let x_0 = out_0[1]. +Let x_1 = out_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0). + (* Pre-condition for 'SND_FAIL' (file tests/wp_plugin/injector.c, line 28) in 'f' *) + (* Pre-condition for 'SND_FAIL': *) + Have: 33=x_1. + (* Pre-condition for 'SND_FAIL' (file tests/wp_plugin/injector.c, line 29) in 'f' *) + (* Pre-condition for 'SND_FAIL': *) + Have: 33!=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition for 'SND_FAIL' 'qed_ok' in 'f': +Let x_0 = out_0[1]. +Let x_1 = out_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0). + (* Pre-condition for 'SND_FAIL' (file tests/wp_plugin/injector.c, line 28) in 'f' *) + (* Pre-condition for 'SND_FAIL': *) + Have: 33=x_1. + (* Pre-condition for 'SND_FAIL' (file tests/wp_plugin/injector.c, line 29) in 'f' *) + (* Pre-condition for 'SND_FAIL': *) + Have: 33!=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition for 'SND_FAIL' 'qed_ok' in 'f': +Let x_0 = out_0[1]. +Let x_1 = out_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0) /\ (is_sint32 out_0[k_2]). + (* Pre-condition for 'SND_FAIL' (file tests/wp_plugin/injector.c, line 28) in 'f' *) + (* Pre-condition for 'SND_FAIL': *) + Have: 33=x_1. + (* Pre-condition for 'SND_FAIL' (file tests/wp_plugin/injector.c, line 29) in 'f' *) + (* Pre-condition for 'SND_FAIL': *) + Have: 33!=x_0. +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function f with behavior SUCCESS +------------------------------------------------------------ + +Goal Post-condition for 'SUCCESS' 'qed_ok' in 'f': +Let x_0 = out_0[1]. +Let x_1 = out_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0) /\ (is_sint32 out_0[k_2]). + (* Pre-condition for 'SUCCESS' (file tests/wp_plugin/injector.c, line 35) in 'f' *) + (* Pre-condition for 'SUCCESS': *) + Have: 33=x_1. + (* Pre-condition for 'SUCCESS' (file tests/wp_plugin/injector.c, line 36) in 'f' *) + (* Pre-condition for 'SUCCESS': *) + Have: 33=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition for 'SUCCESS' 'qed_ok' in 'f': +Let x_0 = out_0[1]. +Let x_1 = out_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0). + (* Pre-condition for 'SUCCESS' (file tests/wp_plugin/injector.c, line 35) in 'f' *) + (* Pre-condition for 'SUCCESS': *) + Have: 33=x_1. + (* Pre-condition for 'SUCCESS' (file tests/wp_plugin/injector.c, line 36) in 'f' *) + (* Pre-condition for 'SUCCESS': *) + Have: 33=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition for 'SUCCESS' 'qed_ok' in 'f': +Let x_0 = out_0[1]. +Let x_1 = out_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0). + (* Pre-condition for 'SUCCESS' (file tests/wp_plugin/injector.c, line 35) in 'f' *) + (* Pre-condition for 'SUCCESS': *) + Have: 33=x_1. + (* Pre-condition for 'SUCCESS' (file tests/wp_plugin/injector.c, line 36) in 'f' *) + (* Pre-condition for 'SUCCESS': *) + Have: 33=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition for 'SUCCESS' 'qed_ok' in 'f': +Let x_0 = out_0[1]. +Let x_1 = out_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0) /\ (is_sint32 out_0[k_2]). + (* Pre-condition for 'SUCCESS' (file tests/wp_plugin/injector.c, line 35) in 'f' *) + (* Pre-condition for 'SUCCESS': *) + Have: 33=x_1. + (* Pre-condition for 'SUCCESS' (file tests/wp_plugin/injector.c, line 36) in 'f' *) + (* Pre-condition for 'SUCCESS': *) + Have: 33=x_0. +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function f with behavior ko +------------------------------------------------------------ + +Goal Post-condition for 'ko' 'qed_ko' in 'f': +Let x_0 = inp_0[0]. +Let x_1 = out_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 b_0) /\ (is_sint32 v_2) /\ (is_sint32 x_0) + /\ (is_sint32 inp_0[k_1]) /\ (is_sint32 x_1) + /\ (is_sint32 out_0[k_1]). + (* tests/wp_plugin/injector.c:55: Conditional *) + If: 33!=x_1 + Then { (* Control Flow *) Have: inp_0=inp_10[0->v_2]. } + Else { + (* tests/wp_plugin/injector.c:56: Call Effects *) + Have: inp_0=inp_10[0->v_2][1->b_0]. + } +} +Prove: b_0=x_0. + +------------------------------------------------------------ +------------------------------------------------------------ + Function f with behavior ko_1 +------------------------------------------------------------ + +Goal Post-condition for 'ko_1' 'qed_ko' in 'f': +Let x_0 = out_0[1]. +Let x_1 = out_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0) /\ (is_sint32 out_0[k_2]). + (* Pre-condition for 'ko_1' (file tests/wp_plugin/injector.c, line 44) in 'f' *) + (* Pre-condition for 'ko_1': *) + Have: 33=x_1. + (* Pre-condition for 'ko_1' (file tests/wp_plugin/injector.c, line 45) in 'f' *) + (* Pre-condition for 'ko_1': *) + Have: 33=x_0. +} +Prove: false. + +------------------------------------------------------------ + +Goal Post-condition for 'ko_1' 'qed_ko' in 'f': +Let x_0 = out_0[1]. +Let x_1 = out_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 v_0) /\ (is_sint32 v_2) /\ (is_sint32 x_1) + /\ (is_sint32 x_0). + (* Pre-condition for 'ko_1' (file tests/wp_plugin/injector.c, line 44) in 'f' *) + (* Pre-condition for 'ko_1': *) + Have: 33=x_1. + (* Pre-condition for 'ko_1' (file tests/wp_plugin/injector.c, line 45) in 'f' *) + (* Pre-condition for 'ko_1': *) + Have: 33=x_0. +} +Prove: v_0=v_2. + +------------------------------------------------------------ + +Goal Post-condition for 'ko_1' 'qed_ko' in 'f': +Let x_0 = out_0[1]. +Let x_1 = out_0[0]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0) /\ (is_sint32 out_0[k_2]). + (* Pre-condition for 'ko_1' (file tests/wp_plugin/injector.c, line 44) in 'f' *) + (* Pre-condition for 'ko_1': *) + Have: 33=x_1. + (* Pre-condition for 'ko_1' (file tests/wp_plugin/injector.c, line 45) in 'f' *) + (* Pre-condition for 'ko_1': *) + Have: 33=x_0. +} +Prove: false. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/loopentry.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/loopentry.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/loopentry.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/loopentry.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,69 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/loopentry.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_plugin/loopentry.i:12:[wp] warning: Missing assigns clause (assigns 'everything' instead) +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Preservation of Invariant (file tests/wp_plugin/loopentry.i, line 9): +Let x_0 = n_3+r_1. +Assume { + (* Domain *) + Type: (is_sint32 n_3) /\ (is_sint32 r_1) /\ (is_sint32 x_0) + /\ (is_sint32 (n_3+r_1-p_0)). + (* Pre-condition (file tests/wp_plugin/loopentry.i, line 2) in 'f' *) + (* Pre-condition: *) + Have: 0 (a_0<=i_0) -> (is_sint32 i_0) + -> (e_1=Mint_2[(shift_sint32 t_2 i_0)]). + (* Invariant 'qed_ok' (file tests/wp_plugin/loop.i, line 12) *) + (* tests/wp_plugin/loop.i:15: Invariant 'qed_ok': *) + Have: (a_0<=i_2) /\ (i_2<=(1+b_0)). + (* tests/wp_plugin/loop.i:15: Else *) + Have: b_0 (a_0<=i_0) -> (is_sint32 i_0) + -> (e_0=Mint_3[(shift_sint32 t_0 i_0)]). + (* Invariant 'qed_ok' (file tests/wp_plugin/loop.i, line 12) *) + (* tests/wp_plugin/loop.i:15: Invariant 'qed_ok': *) + Have: (a_0<=i_2) /\ (i_2<=(1+b_0)). + (* tests/wp_plugin/loop.i:15: Then *) + Have: i_2<=b_0. +} +Prove: a_0<=x_0. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'qed_ok' (file tests/wp_plugin/loop.i, line 12): +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_0). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base t_0))<=0). + (* Pre-condition (file tests/wp_plugin/loop.i, line 5) in 'init' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 (shift_sint32 t_0 a_0) (1+b_0-a_0)). + (* Pre-condition (file tests/wp_plugin/loop.i, line 6) in 'init' *) + (* Pre-condition: *) + Have: a_0<=b_0. +} +Prove: a_0<=(1+b_0). + +------------------------------------------------------------ + +Goal Preservation of Invariant 'qed_ok' (file tests/wp_plugin/loop.i, line 13): +Let a_1 = (shift_sint32 t_0 a_0). +Let x_0 = -a_0. +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_0) /\ (is_sint32 i_2) + /\ (is_sint32 (1+i_2)). + (* Goal *) + When: (a_0<=i_1) /\ (i_1<=i_2) /\ (is_sint32 i_1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base t_0))<=0). + (* Pre-condition (file tests/wp_plugin/loop.i, line 5) in 'init' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_1 (1+b_0-a_0)). + (* Pre-condition (file tests/wp_plugin/loop.i, line 6) in 'init' *) + (* Pre-condition: *) + Have: a_0<=b_0. + (* tests/wp_plugin/loop.i:15: Assigns *) + (* tests/wp_plugin/loop.i:15: Loop assigns 'qed_ok': *) + Have: (havoc Mint_4 Mint_1 a_1 (i_2-a_0)). + (* Invariant 'qed_ok' (file tests/wp_plugin/loop.i, line 13) *) + (* tests/wp_plugin/loop.i:15: Invariant 'qed_ok': *) + Have: forall i_0:int. + (i_0 (a_0<=i_0) -> (is_sint32 i_0) + -> (e_0=Mint_1[(shift_sint32 t_0 i_0)]). + (* Invariant 'qed_ok' (file tests/wp_plugin/loop.i, line 12) *) + (* tests/wp_plugin/loop.i:15: Invariant 'qed_ok': *) + Have: (a_0<=i_2) /\ (i_2<=(1+b_0)). + (* tests/wp_plugin/loop.i:15: Then *) + Have: i_2<=b_0. +} +Prove: e_0=Mint_1[(shift_sint32 t_0 i_2)->e_0][(shift_sint32 t_0 i_1)]. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'qed_ok' (file tests/wp_plugin/loop.i, line 13): +Assume { (* Goal *) When: false. } +Prove: e_0=Mint_4[(shift_sint32 t_0 i_8)]. + +------------------------------------------------------------ + +Goal Loop assigns 'qed_ok' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns 'qed_ok' (2/3): +Effect at line 15 +Let a_1 = (shift_sint32 t_0 a_0). +Let x_0 = -a_0. +Let x_1 = i_2-a_0. +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_0) /\ (is_sint32 i_2) + /\ (is_sint32 (1+i_2)). + (* Goal *) + When: (valid_rd Malloc_0 a_1 x_1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base t_0))<=0). + (* Pre-condition (file tests/wp_plugin/loop.i, line 5) in 'init' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_1 (1+b_0-a_0)). + (* Pre-condition (file tests/wp_plugin/loop.i, line 6) in 'init' *) + (* Pre-condition: *) + Have: a_0<=b_0. + (* tests/wp_plugin/loop.i:15: Assigns *) + (* tests/wp_plugin/loop.i:15: Loop assigns 'qed_ok': *) + Have: (havoc Mint_4 Mint_3 a_1 x_1). + (* Invariant 'qed_ok' (file tests/wp_plugin/loop.i, line 13) *) + (* tests/wp_plugin/loop.i:15: Invariant 'qed_ok': *) + Have: forall i_0:int. + (i_0 (a_0<=i_0) -> (is_sint32 i_0) + -> (e_0=Mint_3[(shift_sint32 t_0 i_0)]). + (* Invariant 'qed_ok' (file tests/wp_plugin/loop.i, line 12) *) + (* tests/wp_plugin/loop.i:15: Invariant 'qed_ok': *) + Have: (a_0<=i_2) /\ (i_2<=(1+b_0)). + (* tests/wp_plugin/loop.i:15: Then *) + Have: i_2<=b_0. +} +Prove: (included a_1 x_1 a_1 (1+i_2-a_0)). + +------------------------------------------------------------ + +Goal Loop assigns 'qed_ok' (3/3): +Effect at line 16 +Let a_1 = (shift_sint32 t_0 i_2). +Let a_2 = (shift_sint32 t_0 a_0). +Let x_0 = -a_0. +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_0) /\ (is_sint32 i_2) + /\ (is_sint32 (1+i_2)). + (* Goal *) + When: (valid_rd Malloc_0 a_1 1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base t_0))<=0). + (* Pre-condition (file tests/wp_plugin/loop.i, line 5) in 'init' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_2 (1+b_0-a_0)). + (* Pre-condition (file tests/wp_plugin/loop.i, line 6) in 'init' *) + (* Pre-condition: *) + Have: a_0<=b_0. + (* tests/wp_plugin/loop.i:15: Assigns *) + (* tests/wp_plugin/loop.i:15: Loop assigns 'qed_ok': *) + Have: (havoc Mint_4 Mint_3 a_2 (i_2-a_0)). + (* Invariant 'qed_ok' (file tests/wp_plugin/loop.i, line 13) *) + (* tests/wp_plugin/loop.i:15: Invariant 'qed_ok': *) + Have: forall i_0:int. + (i_0 (a_0<=i_0) -> (is_sint32 i_0) + -> (e_0=Mint_3[(shift_sint32 t_0 i_0)]). + (* Invariant 'qed_ok' (file tests/wp_plugin/loop.i, line 12) *) + (* tests/wp_plugin/loop.i:15: Invariant 'qed_ok': *) + Have: (a_0<=i_2) /\ (i_2<=(1+b_0)). + (* tests/wp_plugin/loop.i:15: Then *) + Have: i_2<=b_0. +} +Prove: (included a_1 1 a_2 (1+i_2-a_0)). + +------------------------------------------------------------ + +Goal Assigns 'qed_ok' in 'init' (1/2): +Effect at line 15 +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_0). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base t_0))<=0). + (* Pre-condition (file tests/wp_plugin/loop.i, line 5) in 'init' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 (shift_sint32 t_0 a_0) (1+b_0-a_0)). + (* Pre-condition (file tests/wp_plugin/loop.i, line 6) in 'init' *) + (* Pre-condition: *) + Have: a_0<=b_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'qed_ok' in 'init' (2/2): +Effect at line 15 +Let a_1 = (shift_sint32 t_0 a_0). +Let x_0 = -a_0. +Let x_1 = i_2-a_0. +Let x_2 = 1+b_1-a_0. +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_1) /\ (is_sint32 i_2). + (* Heap *) + Have: (linked Malloc_1) /\ ((region (base t_0))<=0). + (* Pre-condition (file tests/wp_plugin/loop.i, line 5) in 'init' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_1 a_1 x_2). + (* Pre-condition (file tests/wp_plugin/loop.i, line 6) in 'init' *) + (* Pre-condition: *) + Have: a_0<=b_1. + (* tests/wp_plugin/loop.i:15: Assigns *) + (* tests/wp_plugin/loop.i:15: Loop assigns 'qed_ok': *) + Have: (havoc Mint_4 Mint_3 a_1 x_1). +} +Prove: (valid_rd Malloc_1 a_1 x_1) -> (included a_1 x_1 a_1 x_2). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/params.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/params.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/params.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/params.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,14 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/params.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +------------------------------------------------------------ + Global +------------------------------------------------------------ + +Lemma lem: +Prove: (P_p 1) + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/struct.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/struct.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/struct.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/struct.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,130 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/struct.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,E0' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,E1' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,E2' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,E3' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,E4' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,E5' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,E6' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,E7' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,E8' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,E9' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,E10' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,E11' in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function g +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,P3' in 'g': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,P4' in 'g': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,P5' in 'g': +Let a_0 = p_0.F_T_a. +Let a_1 = p_0.F_T_b. +Assume { + (* Domain *) + Type: (IsS_T p_0) /\ (is_sint32 a_0.F_S_i) /\ (is_sint32 a_0.F_S_j) + /\ (is_sint32 a_1.F_S_i) /\ (is_sint32 a_1.F_S_j). +} +Prove: (EqS_T p_0 p_0). + +------------------------------------------------------------ + +Goal Assigns 'qed_ok' in 'g': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function id +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,P1' in 'id': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,P2' in 'id': +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/trig.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/trig.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/trig.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/trig.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,103 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/trig.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function foo +------------------------------------------------------------ + +Goal Assertion 'qed_ok,S' (file tests/wp_plugin/trig.i, line 39): +Let x_0 = c_0.F_MSG_size. +Let x_1 = a_0.F_MSG_size. +Let x_2 = b_0.F_MSG_size. +Let a_1 = c_0.F_MSG_text. +Assume { + (* Domain *) + Type: (IsS_MSG a_0) /\ (IsS_MSG b_0) /\ (IsS_MSG c_0) /\ (is_sint32 x_1) + /\ (is_sint32 x_2) /\ (is_sint32 x_0) /\ (is_uint8 a_0.F_MSG_text[2]) + /\ (is_uint8 b_0.F_MSG_text[2]) /\ (is_uint8 a_1[2]) + /\ (is_uint8 a_1[7]). + (* Pre-condition (file tests/wp_plugin/trig.i, line 35) in 'foo' *) + (* Pre-condition: *) + Have: (5=x_1) /\ (5=x_2). + (* tests/wp_plugin/trig.i:38: Call 'fconcat' *) + Have: (EqS_MSG c_0 (L_concat a_0 b_0)). +} +Prove: 10=x_0. + +------------------------------------------------------------ + +Goal Assertion 'qed_ok,A' (file tests/wp_plugin/trig.i, line 40): +Let a_1 = a_0.F_MSG_text[2]. +Let a_2 = c_0.F_MSG_text. +Let a_3 = a_2[2]. +Let x_0 = c_0.F_MSG_size. +Let x_1 = a_0.F_MSG_size. +Let x_2 = b_0.F_MSG_size. +Assume { + (* Domain *) + Type: (IsS_MSG a_0) /\ (IsS_MSG b_0) /\ (IsS_MSG c_0) /\ (is_sint32 x_1) + /\ (is_sint32 x_2) /\ (is_sint32 x_0) /\ (is_uint8 a_1) + /\ (is_uint8 b_0.F_MSG_text[2]) /\ (is_uint8 a_3) + /\ (is_uint8 a_2[7]). + (* Pre-condition (file tests/wp_plugin/trig.i, line 35) in 'foo' *) + (* Pre-condition: *) + Have: (5=x_1) /\ (5=x_2). + (* tests/wp_plugin/trig.i:38: Call 'fconcat' *) + Have: (EqS_MSG c_0 (L_concat a_0 b_0)). + (* Assertion 'qed_ok,S' (file tests/wp_plugin/trig.i, line 39) *) + (* tests/wp_plugin/trig.i:39: Assertion 'qed_ok,S': *) + Have: 10=x_0. +} +Prove: a_1=a_3. + +------------------------------------------------------------ + +Goal Assertion 'qed_ok,B' (file tests/wp_plugin/trig.i, line 41): +Let a_1 = b_0.F_MSG_text[2]. +Let a_2 = c_0.F_MSG_text. +Let a_3 = a_2[7]. +Let a_4 = a_0.F_MSG_text[2]. +Let a_5 = a_2[2]. +Let x_0 = c_0.F_MSG_size. +Let x_1 = a_0.F_MSG_size. +Let x_2 = b_0.F_MSG_size. +Assume { + (* Domain *) + Type: (IsS_MSG a_0) /\ (IsS_MSG b_0) /\ (IsS_MSG c_0) /\ (is_sint32 x_1) + /\ (is_sint32 x_2) /\ (is_sint32 x_0) /\ (is_uint8 a_4) + /\ (is_uint8 a_1) /\ (is_uint8 a_5) /\ (is_uint8 a_3). + (* Pre-condition (file tests/wp_plugin/trig.i, line 35) in 'foo' *) + (* Pre-condition: *) + Have: (5=x_1) /\ (5=x_2). + (* tests/wp_plugin/trig.i:38: Call 'fconcat' *) + Have: (EqS_MSG c_0 (L_concat a_0 b_0)). + (* Assertion 'qed_ok,S' (file tests/wp_plugin/trig.i, line 39) *) + (* tests/wp_plugin/trig.i:39: Assertion 'qed_ok,S': *) + Have: 10=x_0. + (* Assertion 'qed_ok,A' (file tests/wp_plugin/trig.i, line 40) *) + (* tests/wp_plugin/trig.i:40: Assertion 'qed_ok,A': *) + Have: a_4=a_5. +} +Prove: a_1=a_3. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition 'qed_ok' in 'fconcat'' in 'foo' at call 'fconcat' (file tests/wp_plugin/trig.i, line 38) +: +Let x_0 = a_0.F_MSG_size. +Let x_1 = b_0.F_MSG_size. +Assume { + (* Domain *) + Type: (IsS_MSG a_0) /\ (IsS_MSG b_0) /\ (is_sint32 x_0) /\ (is_sint32 x_1) + /\ (is_uint8 a_0.F_MSG_text[2]) /\ (is_uint8 b_0.F_MSG_text[2]). + (* Pre-condition (file tests/wp_plugin/trig.i, line 35) in 'foo' *) + (* Pre-condition: *) + Have: (5=x_0) /\ (5=x_1). +} +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/unsupported_init.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/unsupported_init.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle/unsupported_init.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle/unsupported_init.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,51 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/unsupported_init.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_plugin/unsupported_init.i:1:[wp] warning: Allocation, initialization and danglingness not yet implemented + (r1: \initialized(Y+(0 .. 99))) +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Assertion 'a1' (file tests/wp_plugin/unsupported_init.i, line 9): +tests/wp_plugin/unsupported_init.i:1: warning from wp: + - Warning: Ignored hypothesis + Reason: Allocation, initialization and danglingness not yet implemented +(r1: \initialized(Y+(0 .. 99))) +Let a_0 = (shift_sint32 B_0 0). +Let x_0 = Mint_0[(shift_sint32 A_0 0)]. +Let x_1 = Mint_0[a_0]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 x_1). + (* Heap *) + Have: ((region (base A_0))<=0) /\ ((region (base B_0))<=0). + (* tests/wp_plugin/unsupported_init.i:8: Call 'cp' *) + Have: x_0=x_1. + (* tests/wp_plugin/unsupported_init.i:8: Call Effects *) + Have: (havoc Mint_1 Mint_0 a_0 100). +} +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition 'r1' in 'cp'' in 'f' at call 'cp' (file tests/wp_plugin/unsupported_init.i, line 8) +: +tests/wp_plugin/unsupported_init.i:1: warning from wp: + - Warning: Target turned to false, looking for context inconsistency + Reason: Allocation, initialization and danglingness not yet implemented +(r1: \initialized(Y+(0 .. 99))) +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[(shift_sint32 A_0 0)]) + /\ (is_sint32 Mint_0[(shift_sint32 B_0 0)]). + (* Heap *) + Have: ((region (base A_0))<=0) /\ ((region (base B_0))<=0). +} +Prove: false. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/abs.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/abs.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/abs.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/abs.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/abs.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Loading driver 'tests/wp_plugin/abs.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 1 goal scheduled +[wp] [Coq] Compiling 'Abs.v'. +[wp] [Coq] Goal typed_abs_abs_post : Saved script +[wp] [Coq] Goal typed_abs_abs_post : Valid +[wp] Proved goals: 1 / 1 + Qed: 0 + Coq: 1 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +abs - - 1 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/abs.2.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/abs.2.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/abs.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/abs.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,17 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/abs.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Loading driver 'tests/wp_plugin/abs.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 1 goal scheduled +[wp] [alt-ergo] Goal typed_abs_abs_post : Valid +[wp] Proved goals: 1 / 1 + Qed: 0 + alt-ergo: 1 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +abs - - 1 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/abs.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/abs.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/abs.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/abs.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,17 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/abs.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Loading driver 'tests/wp_plugin/abs.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 1 goal scheduled +[wp] [Alt-Ergo] Goal typed_abs_abs_post : Valid +[wp] Proved goals: 1 / 1 + Qed: 0 + Alt-Ergo: 1 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +abs - 1 (9) 1 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/combined.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/combined.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/combined.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/combined.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,164 @@ +[kernel] preprocessing with "gcc -C -E -I. tests/wp_plugin/combined.c" +[kernel] warning: ignoring status of axiomatic `A' +[wp] warning: Missing RTE guards +[wp] warning: Assuming contracts of external functions +[wp] [WP:simplified] Goal store_job_loop_assigns_4 : Valid +[wp] [WP:simplified] Goal store_job_loop_assigns_13 : Valid +[wp] [WP:simplified] Goal store_job_loop_inv_2_established : Valid +[wp] [Alt-Ergo] Goal store_job_assert_7 : Valid +[wp] [Alt-Ergo] Goal store_job_loop_inv_5_established : Valid +[wp] [Alt-Ergo] Goal store_job_loop_inv_5_preserved : Valid +[wp] [Alt-Ergo] Goal store_job_loop_inv_3_established : Valid +[wp] [Alt-Ergo] Goal store_job_loop_inv_3_preserved : Valid +[wp] [Alt-Ergo] Goal store_job_loop_inv_2_preserved : Valid +[wp] [Alt-Ergo] Goal store_job_assert_1 : Unknown +[report] Computing properties status... +------------------------------------------------------------ + Global Properties +------------------------------------------------------------ + +[ Valid ] Loop Invariants (sid:13) +[ Valid ] Loop Invariants (sid:4) + +------------------------------------------------------------ + Properties for Function 'f' +------------------------------------------------------------ + +[ Unverifiable, considered valid ] ensures P(\result) +[ Unverifiable, considered valid ] assigns \nothing; +[ Unknown ] behavior default! of function f + +------------------------------------------------------------ + Properties for Function 'g' +------------------------------------------------------------ + +[ Unverifiable, considered valid ] assigns \nothing; +[ Unknown ] behavior default! of function g + +------------------------------------------------------------ + Properties for Function 'job' +------------------------------------------------------------ + +[ Partial ] assigns i, *(t+(0..49)); +[ Partial ] assigns j, *(t+(A..99)); +[ Unknown ] assert 50 ≤ A ∧ A ≤ 100; +[ Valid ] loop invariant 0 ≤ i ∧ i ≤ 50; +[ Partial ] loop invariant ∀ ℤ k; 0 ≤ k ∧ k < i ⇒ P(*(t+k)); +[ Partial ] loop invariant A ≤ j ∧ j ≤ 100; +[ Partial ] assert ∀ ℤ k; 0 ≤ k ∧ k < 50 ⇒ P(*(t+k)); + +------------------------------------------------------------ + No proofs : 3 + Unverifiable : 3 + Partial proofs : 5 + Complete proofs : 3 + Total : 14 +------------------------------------------------------------ +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..99] ∈ {0} +[value] computing for function job <- main. + Called from tests/wp_plugin/combined.c:42. +tests/wp_plugin/combined.c:22:[value] Assertion got status valid. +tests/wp_plugin/combined.c:28:[value] entering loop for the first time +[value] computing for function f <- job <- main. + Called from tests/wp_plugin/combined.c:28. +tests/wp_plugin/combined.c:13:[value] Function f: postcondition got status unknown +[value] Done for function f +[value] computing for function f <- job <- main. + Called from tests/wp_plugin/combined.c:28. +[value] Done for function f +tests/wp_plugin/combined.c:28:[value] assigning non deterministic value for the first time +[value] computing for function f <- job <- main. + Called from tests/wp_plugin/combined.c:28. +[value] Done for function f +[value] computing for function f <- job <- main. + Called from tests/wp_plugin/combined.c:28. +[value] Done for function f +[value] computing for function f <- job <- main. + Called from tests/wp_plugin/combined.c:28. +[value] Done for function f +[value] computing for function f <- job <- main. + Called from tests/wp_plugin/combined.c:28. +[value] Done for function f +[value] computing for function f <- job <- main. + Called from tests/wp_plugin/combined.c:28. +[value] Done for function f +[value] computing for function f <- job <- main. + Called from tests/wp_plugin/combined.c:28. +[value] Done for function f +[value] computing for function f <- job <- main. + Called from tests/wp_plugin/combined.c:28. +[value] Done for function f +tests/wp_plugin/combined.c:33:[value] entering loop for the first time +[value] computing for function g <- job <- main. + Called from tests/wp_plugin/combined.c:33. +[value] Done for function g +[value] computing for function g <- job <- main. + Called from tests/wp_plugin/combined.c:33. +[value] Done for function g +[value] computing for function g <- job <- main. + Called from tests/wp_plugin/combined.c:33. +[value] Done for function g +[value] computing for function g <- job <- main. + Called from tests/wp_plugin/combined.c:33. +[value] Done for function g +[value] computing for function g <- job <- main. + Called from tests/wp_plugin/combined.c:33. +[value] Done for function g +tests/wp_plugin/combined.c:35:[value] Assertion got status unknown. +[value] Recording results for job +[value] Done for function job +[value] Recording results for main +[value] done for function main +[from] Computing for function f +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[scope] warning: [get_annot_zone] don't know how to compute zone: skip this annotation +[report] Computing properties status... +------------------------------------------------------------ + Global Properties +------------------------------------------------------------ + +[ Unverifiable, considered valid ] Function 'f' is consistent with Store-LogicVar +[ Unverifiable, considered valid ] Function 'g' is consistent with Store-LogicVar +[ Valid ] Loop Invariants (sid:13) +[ Valid ] Loop Invariants (sid:4) + +------------------------------------------------------------ + Properties for Function 'f' +------------------------------------------------------------ + +[ Unverifiable, considered valid ] ensures P(\result) +[ Unverifiable, considered valid ] assigns \nothing; +[ Unknown ] behavior default! of function f + +------------------------------------------------------------ + Properties for Function 'g' +------------------------------------------------------------ + +[ Unverifiable, considered valid ] assigns \nothing; +[ Unknown ] behavior default! of function g + +------------------------------------------------------------ + Properties for Function 'job' +------------------------------------------------------------ + +[ Valid ] assigns i, *(t+(0..49)); +[ Valid ] assigns j, *(t+(A..99)); +[ Valid ] assert 50 ≤ A ∧ A ≤ 100; +[ Valid ] loop invariant 0 ≤ i ∧ i ≤ 50; +[ Valid ] loop invariant ∀ ℤ k; 0 ≤ k ∧ k < i ⇒ P(*(t+k)); +[ Valid ] loop invariant A ≤ j ∧ j ≤ 100; +[ Valid ] assert ∀ ℤ k; 0 ≤ k ∧ k < 50 ⇒ P(*(t+k)); + +------------------------------------------------------------ + No proofs : 2 + Unverifiable : 5 + Partial proofs : 0 + Complete proofs : 9 + Total : 16 +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/copy.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/copy.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/copy.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/copy.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/copy.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 12 goals scheduled +[wp] [Alt-Ergo] Goal typed_copy_post : Valid +[wp] [Alt-Ergo] Goal typed_copy_loop_inv_Copy_preserved : Valid +[wp] [Qed] Goal typed_copy_loop_inv_Copy_established : Valid +[wp] [Alt-Ergo] Goal typed_copy_loop_inv_Range_preserved : Valid +[wp] [Qed] Goal typed_copy_loop_inv_Range_established : Valid +[wp] [Alt-Ergo] Goal typed_copy_assert_A : Valid +[wp] [Alt-Ergo] Goal typed_copy_assert_B : Valid +[wp] [Qed] Goal typed_copy_loop_assign_part1 : Valid +[wp] [Alt-Ergo] Goal typed_copy_loop_assign_part2 : Valid +[wp] [Alt-Ergo] Goal typed_copy_loop_assign_part3 : Valid +[wp] [Qed] Goal typed_copy_assign_part1 : Valid +[wp] [Alt-Ergo] Goal typed_copy_assign_part2 : Valid +[wp] Proved goals: 12 / 12 + Qed: 4 + Alt-Ergo: 8 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +copy 4 8 (506) 12 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/dynamic.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/dynamic.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/dynamic.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/dynamic.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,21 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/dynamic.i (no preprocessing) +[wp] Running WP plugin... +[wp] Computing dynamic calls. +[wp] Dynamic call(s): 1. +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 4 goals scheduled +[wp] [Alt-Ergo] Goal typed_call_stmt_calls_f1_f2 : Valid +[wp] [Qed] Goal typed_call_post_part1 : Valid +[wp] [Qed] Goal typed_call_post_part2 : Valid +[wp] [Alt-Ergo] Goal typed_call_call_f1_pre : Valid +[wp] Proved goals: 4 / 4 + Qed: 2 + Alt-Ergo: 2 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +call 2 2 (79) 4 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/frame.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/frame.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/frame.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/frame.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,24 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/frame.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 6 goals scheduled +[wp] [Alt-Ergo] Goal typed_alias_post_KO : Unknown +[wp] [Alt-Ergo] Goal typed_global_post_KO : Unknown +[wp] [Qed] Goal typed_local_post_FRAMED : Valid +[wp] [Alt-Ergo] Goal typed_local_post_KO : Unknown +[wp] [Alt-Ergo] Goal typed_localref_post_KO : Unknown +[wp] [Qed] Goal typed_localref_assert_FRAMED : Valid +[wp] Proved goals: 2 / 6 + Qed: 2 + Alt-Ergo: 0 (unknown: 4) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +local 1 - 2 50.0% +global - - 1 0.0% +localref 1 - 2 50.0% +alias - - 1 0.0% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/init_const_guard.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/init_const_guard.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/init_const_guard.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/init_const_guard.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/init_const_guard.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 7 goals scheduled +[wp] [Qed] Goal typed_f_post_Const : Valid +[wp] [Alt-Ergo] Goal typed_f_post_Pointed_Valid : Valid +[wp] [Qed] Goal typed_f_post_Q_ReadOnly : Valid +[wp] [Qed] Goal typed_f_post_Q_NotWrite : Valid +[wp] [Qed] Goal typed_g_post_P_not_Const : Valid +[wp] [Alt-Ergo] Goal typed_g_assert_Read : Valid +[wp] [Alt-Ergo] Goal typed_g_assert_Guard_against_Const : Unknown +[wp] Proved goals: 6 / 7 + Qed: 4 + Alt-Ergo: 2 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f 3 1 (83) 4 100% +g 1 1 (68) 3 66.7% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/init_const.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/init_const.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/init_const.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/init_const.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,22 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/init_const.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 4 goals scheduled +[wp] [Alt-Ergo] Goal typed_fA_post_KO : Unknown +[wp] [Alt-Ergo] Goal typed_fB_post_OK : Valid +[wp] [Alt-Ergo] Goal typed_fC_post_KO : Unknown +[wp] [Qed] Goal typed_fD_post_OK : Valid +[wp] Proved goals: 2 / 4 + Qed: 1 + Alt-Ergo: 1 (unknown: 2) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +fA - - 1 0.0% +fB - 1 (21) 1 100% +fC - - 1 0.0% +fD 1 - 1 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/init_extern.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/init_extern.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/init_extern.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/init_extern.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/init_extern.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/init_linker.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 3 goals scheduled +[wp] [Qed] Goal typed_f_post_OK : Valid +[wp] [Alt-Ergo] Goal typed_f_post_KO : Unknown +[wp] [Alt-Ergo] Goal typed_f_post_KO_2 : Unknown +[wp] Proved goals: 1 / 3 + Qed: 1 + Alt-Ergo: 0 (unknown: 2) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f 1 - 3 33.3% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/init_valid.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/init_valid.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/init_valid.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/init_valid.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,20 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/init_valid.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 4 goals scheduled +[wp] [Qed] Goal typed_validA_assert_OK : Valid +[wp] [Qed] Goal typed_validA_assert_OK_2 : Valid +[wp] [Qed] Goal typed_validB_assert_OK : Valid +[wp] [Alt-Ergo] Goal typed_validB_assert_KO : Unknown +[wp] Proved goals: 3 / 4 + Qed: 3 + Alt-Ergo: 0 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +validA 2 - 2 100% +validB 1 - 2 50.0% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/injector.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/injector.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/injector.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/injector.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,18 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/injector.c (with preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 4 goals scheduled +[wp] [Alt-Ergo] Goal typed_f_ko_post_qed_ko : Unknown +[wp] [Alt-Ergo] Goal typed_f_ko_1_post_qed_ko : Unknown +[wp] [Alt-Ergo] Goal typed_f_ko_1_post_qed_ko_2 : Unknown +[wp] [Alt-Ergo] Goal typed_f_ko_1_post_qed_ko_3 : Unknown +[wp] Proved goals: 0 / 4 + Alt-Ergo: 0 (unknown: 4) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f - - 4 0.0% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/injector.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/injector.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/injector.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/injector.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,27 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/injector.c (with preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 13 goals scheduled +[wp] [Qed] Goal typed_f_call_g_pre : Valid +[wp] [Qed] Goal typed_f_call_g_pre_2 : Valid +[wp] [Qed] Goal typed_f_FST_FAIL_post_qed_ok : Valid +[wp] [Qed] Goal typed_f_FST_FAIL_post_qed_ok_2 : Valid +[wp] [Qed] Goal typed_f_FST_FAIL_post_qed_ok_3 : Valid +[wp] [Qed] Goal typed_f_SND_FAIL_post_qed_ok : Valid +[wp] [Qed] Goal typed_f_SND_FAIL_post_qed_ok_2 : Valid +[wp] [Qed] Goal typed_f_SND_FAIL_post_qed_ok_3 : Valid +[wp] [Qed] Goal typed_f_SND_FAIL_post_qed_ok_4 : Valid +[wp] [Qed] Goal typed_f_SUCCESS_post_qed_ok : Valid +[wp] [Qed] Goal typed_f_SUCCESS_post_qed_ok_2 : Valid +[wp] [Qed] Goal typed_f_SUCCESS_post_qed_ok_3 : Valid +[wp] [Qed] Goal typed_f_SUCCESS_post_qed_ok_4 : Valid +[wp] Proved goals: 13 / 13 + Qed: 13 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f 13 - 13 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/loopentry.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/loopentry.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/loopentry.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/loopentry.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/loopentry.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_plugin/loopentry.i:12:[wp] warning: Missing assigns clause (assigns 'everything' instead) +[wp] 4 goals scheduled +[wp] [Qed] Goal typed_f_loop_inv_preserved : Valid +[wp] [Qed] Goal typed_f_loop_inv_established : Valid +[wp] [Qed] Goal typed_f_loop_inv_2_preserved : Valid +[wp] [Qed] Goal typed_f_loop_inv_2_established : Valid +[wp] Proved goals: 4 / 4 + Qed: 4 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f 4 - 4 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/loop.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/loop.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/loop.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/loop.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/loop.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 10 goals scheduled +[wp] [Alt-Ergo] Goal typed_init_post_qed_ok : Valid +[wp] [Alt-Ergo] Goal typed_init_loop_inv_qed_ok_preserved : Valid +[wp] [Alt-Ergo] Goal typed_init_loop_inv_qed_ok_established : Valid +[wp] [Alt-Ergo] Goal typed_init_loop_inv_qed_ok_2_preserved : Valid +[wp] [Qed] Goal typed_init_loop_inv_qed_ok_2_established : Valid +[wp] [Qed] Goal typed_init_loop_assign_part1 : Valid +[wp] [Alt-Ergo] Goal typed_init_loop_assign_part2 : Valid +[wp] [Alt-Ergo] Goal typed_init_loop_assign_part3 : Valid +[wp] [Qed] Goal typed_init_assign_part1 : Valid +[wp] [Alt-Ergo] Goal typed_init_assign_part2 : Unknown +[wp] Proved goals: 9 / 10 + Qed: 3 + Alt-Ergo: 6 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +init 3 6 (90) 10 90.0% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/params.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/params.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/params.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/params.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,15 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/params.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] 1 goal scheduled +[wp] [Alt-Ergo] Goal typed_lemma_lem : Valid +[wp] Proved goals: 1 / 1 + Qed: 0 + Alt-Ergo: 1 +---------------------------------------------------------- +Axiomatics WP Alt-Ergo Total Success +Lemma - 1 (3) 1 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/struct_hack.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/struct_hack.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/struct_hack.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/struct_hack.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,29 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/struct_hack.i (no preprocessing) +tests/wp_plugin/struct_hack.i:46:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_plugin/struct_hack.i:37:[wp] warning: Missing assigns clause (assigns 'everything' instead) +tests/wp_plugin/struct_hack.i:53:[wp] warning: Missing assigns clause (assigns 'everything' instead) +[wp] 10 goals scheduled +[wp] [Alt-Ergo] Goal typed_f0_loop_inv_qed_ok_preserved : Valid +[wp] [Qed] Goal typed_f0_loop_inv_qed_ok_established : Valid +[wp] [Alt-Ergo] Goal typed_f0_assert_qed_ok : Valid +[wp] [Qed] Goal typed_f0_loop_term_decrease : Valid +[wp] [Qed] Goal typed_f0_loop_term_positive : Valid +[wp] [Qed] Goal typed_f1_loop_inv_qed_ok_preserved : Valid +[wp] [Qed] Goal typed_f1_loop_inv_qed_ok_established : Valid +[wp] [Qed] Goal typed_f1_assert_qed_ok : Valid +[wp] [Qed] Goal typed_f1_loop_term_decrease : Valid +[wp] [Qed] Goal typed_f1_loop_term_positive : Valid +[wp] Proved goals: 10 / 10 + Qed: 8 + Alt-Ergo: 2 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f0 3 2 (25) 5 100% +f1 5 - 5 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/struct.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/struct.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/struct.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/struct.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,35 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/struct.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 18 goals scheduled +[wp] [Qed] Goal typed_f_post_qed_ok_E0 : Valid +[wp] [Qed] Goal typed_f_post_qed_ok_E1 : Valid +[wp] [Qed] Goal typed_f_post_qed_ok_E2 : Valid +[wp] [Qed] Goal typed_f_post_qed_ok_E3 : Valid +[wp] [Qed] Goal typed_f_post_qed_ok_E4 : Valid +[wp] [Qed] Goal typed_f_post_qed_ok_E5 : Valid +[wp] [Qed] Goal typed_f_post_qed_ok_E6 : Valid +[wp] [Qed] Goal typed_f_post_qed_ok_E7 : Valid +[wp] [Qed] Goal typed_f_post_qed_ok_E8 : Valid +[wp] [Qed] Goal typed_f_post_qed_ok_E9 : Valid +[wp] [Qed] Goal typed_f_post_qed_ok_E10 : Valid +[wp] [Qed] Goal typed_f_post_qed_ok_E11 : Valid +[wp] [Qed] Goal typed_g_post_qed_ok_P3 : Valid +[wp] [Qed] Goal typed_g_post_qed_ok_P4 : Valid +[wp] [Alt-Ergo] Goal typed_g_post_qed_ok_P5 : Valid +[wp] [Qed] Goal typed_g_assign : Valid +[wp] [Qed] Goal typed_id_post_qed_ok_P1 : Valid +[wp] [Qed] Goal typed_id_post_qed_ok_P2 : Valid +[wp] Proved goals: 18 / 18 + Qed: 17 + Alt-Ergo: 1 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +id 2 - 2 100% +g 3 1 (15) 4 100% +f 12 - 12 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/trig.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/trig.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/trig.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/trig.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,19 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/trig.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 4 goals scheduled +[wp] [Alt-Ergo] Goal typed_foo_assert_qed_ok_S : Valid +[wp] [Alt-Ergo] Goal typed_foo_assert_qed_ok_A : Valid +[wp] [Alt-Ergo] Goal typed_foo_assert_qed_ok_B : Unknown +[wp] [Qed] Goal typed_foo_call_fconcat_pre_qed_ok : Valid +[wp] Proved goals: 3 / 4 + Qed: 1 + Alt-Ergo: 2 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +foo 1 2 (47) 4 75.0% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/tutorial.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/tutorial.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/tutorial.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/tutorial.1.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,6 @@ +# frama-c -wp [...] +[wp] Running WP plugin... +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 1 goal scheduled +[wp] [Alt-Ergo] Goal typed_echange_valeur_false_post_qed_ko : Unknown diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/tutorial.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/tutorial.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/tutorial.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/tutorial.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,15 @@ +[wp] Running WP plugin... +tests/wp_plugin/tutorial.i:202:[wp] warning: Proof obligation for property 'div_mod' not generated. +tests/wp_plugin/tutorial.i:176:[wp] warning: Proof obligation for property 'pgcd_minus' not generated. +tests/wp_plugin/tutorial.i:177:[wp] warning: Proof obligation for property 'pgcd_minus_2' not generated. +tests/wp_plugin/tutorial.i:175:[wp] warning: Proof obligation for property 'pgcd_refl' not generated. +[wp] warning: Missing RTE guards +tests/wp_plugin/tutorial.i:160:[wp] warning: Missing assigns clause (assigns 'everything' instead) +tests/wp_plugin/tutorial.i:143:[wp] warning: Missing assigns clause (assigns 'everything' instead) +[wp] [Alt-Ergo] Goal store_absolue_post_qed_ok : Valid +[wp] [Alt-Ergo] Goal store_comparer_loop_inv_qed_ok_established : Valid +[wp] [Alt-Ergo] Goal store_comparer_loop_inv_qed_ok_preserved : Valid +[wp] [Alt-Ergo] Goal store_echange_valeur_post_qed_ok : Valid +[wp] [Alt-Ergo] Goal store_max_post_qed_ok : Valid +[wp] [Alt-Ergo] Goal store_min_element_loop_inv_qed_ok_established : Valid +[wp] [Alt-Ergo] Goal store_min_element_loop_inv_qed_ok_preserved : Valid diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/unsupported_init.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/unsupported_init.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/oracle_qualif/unsupported_init.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/oracle_qualif/unsupported_init.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_plugin/unsupported_init.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_plugin/unsupported_init.i:1:[wp] warning: Allocation, initialization and danglingness not yet implemented + (r1: \initialized(Y+(0 .. 99))) +[wp] 2 goals scheduled +[wp] [Qed] Goal typed_f_assert_a1 : Valid +[wp] [Alt-Ergo] Goal typed_f_call_cp_pre_r1 : Unknown (Degenerated) +[wp] Proved goals: 1 / 2 + Qed: 1 + Alt-Ergo: 0 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f 1 - 2 50.0% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/params.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/params.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/params.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/params.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,4 @@ + +/*@predicate p(double x, int y) = y;*/ + +/*@lemma lem : p((double) 0, (int) 1);*/ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/struct_hack.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/struct_hack.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/struct_hack.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/struct_hack.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,56 @@ +/* run.config + DONTRUN: test under construction +*/ + +/* run.config_qualif + OPT: -wp -wp-par 1 -wp-prop qed_ok +*/ + +struct S { + int i; + int a[]; +}; + +/*@ requires s.i >= 0 && \valid(s.a+(0..(s.i-1))); + @ */ +void f(struct S s) { + int j; + /*@ loop invariant 0 <= j <= s.i && \forall int k; 0 <= k < j ==> s.a[k] == 0; + @ loop variant s.i - j; + @ */ + for (j = 0; j < s.i; j++) s.a[j] = 0; + /*@ assert \forall int k; 0 <= k < s.i ==> s.a[k] == 0; */ +} + +struct S0 { + int i0; + int *a0; +}; + +/*@ requires s.i0 >= 0 && \valid(s.a0+(0..(s.i0-1))); + @ */ +void f0(struct S0 s) { + int j; + /*@ loop invariant qed_ok: 0 <= j <= s.i0 && \forall int k; 0 <= k < j ==> s.a0[k] == 0; + @ loop variant qed_ok: s.i0 - j; + @ */ + for (j = 0; j < s.i0; j++) s.a0[j] = 0; + /*@ assert qed_ok: \forall int k; 0 <= k < s.i0 ==> s.a0[k] == 0; */ +} + +struct S1 { + int i1; + int a1[1]; +}; + +/*@ requires s.i1 >= 0 && \valid_range(s.a1,0,s.i1-1); + @ */ +void f1(struct S1 s) { + int j; + /*@ loop invariant qed_ok: 0 <= j <= s.i1 && \forall int k; 0 <= k < j ==> s.a1[k] == 0; + @ loop variant qed_ok: s.i1 - j; + @ */ + for (j = 0; j < s.i1; j++) s.a1[j] = 0; + /*@ assert qed_ok: \forall int k; 0 <= k < s.i1 ==> s.a1[k] == 0; */ +} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/struct.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/struct.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/struct.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/struct.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,84 @@ +/* run.config_qualif + OPT: -wp -wp-par 1 +*/ + +/* -------------------------------------------------------------------------- */ +/* --- Testing Performance of repeated access-update --- */ +/* -------------------------------------------------------------------------- */ + +struct S { + int i; + int j; + +}; + +struct T { + struct S a; + struct S b; +} q; + +/*@ ensures qed_ok: P1:\result.a.i == p.a.i && \result.a.j == p.a.j; + @ ensures qed_ok: P2:\result.b.i == p.b.i && \result.b.j == p.b.j; + @ */ +struct T id(struct T p) { + return p; +} + + +/*@ + @ assigns qed_ok: q; + @ ensures qed_ok: P3:q.a.i == p.a.i && q.a.j == p.a.j; + @ ensures qed_ok: P4:q.b.i == p.b.i && q.b.j == p.b.j; + @ ensures qed_ok: P5: q == p ; + @ */ +void g(struct T p) { + q.a.i = p.a.i; + q.b =p.b; + q.a.j = p.a.j; +} + +struct R { + int f0 ; + int f1 ; + int f2 ; + int f3 ; + int f4 ; + int f5 ; + int f6 ; + int f7 ; + int f8 ; + int f9 ; + int f10 ; + int f11 ; +} s; + +/*@ + ensures qed_ok: E0: s.f0 == 0 ; + ensures qed_ok: E1: s.f1 == 1 ; + ensures qed_ok: E2: s.f2 == 2 ; + ensures qed_ok: E3: s.f3 == 3 ; + ensures qed_ok: E4: s.f4 == 4 ; + ensures qed_ok: E5: s.f5 == 5 ; + ensures qed_ok: E6: s.f6 == 6 ; + ensures qed_ok: E7: s.f7 == 7 ; + ensures qed_ok: E8: s.f8 == 8 ; + ensures qed_ok: E9: s.f9 == 9 ; + ensures qed_ok: E10: s.f10 == 10 ; + ensures qed_ok: E11: s.f11 == 11 ; + */ +void f (void) +{ + s.f0 = 0 ; + s.f1 = 1 ; + s.f2 = 2 ; + s.f3 = 3 ; + s.f4 = 4 ; + s.f5 = 5 ; + s.f6 = 6 ; + s.f7 = 7 ; + s.f8 = 8 ; + s.f9 = 9 ; + s.f10 = 10 ; + s.f11 = 11 ; +} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/trig.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/trig.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/trig.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/trig.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,42 @@ +/* run.config_qualif + OPT: -wp -wp-par 1 +*/ + +typedef struct MSG { + int size ; + unsigned char text [65536] ; +} message ; + +/*@ axiomatic Messages { + @ logic message concat( message a , message b ); + @ + @ axiom cats: \forall message a,b ; + @ concat(a,b).size == a.size + b.size ; + @ + @ axiom cat1: \forall message a,b,c ; \forall integer k ; + @ c == concat(a,b) ==> + @ 0 <= k < a.size ==> + @ c.text[k] == a.text[k] ; + @ + @ axiom cat2: \forall message a,b,c ; \forall integer k ; + @ (TRIGGER: c == concat(a,b)) ==> + @ a.size <= k < a.size + b.size ==> + @ (TRIGGER: c.text[k]) == b.text[k - a.size] ; + @ + @ } + @ */ + +/*@ requires qed_ok: a.size >= 0 && b.size >= 0 ; + @ ensures \result == concat(a,b) ; + @ assigns \nothing ; + @*/ +message fconcat(message a,message b); + +/*@ requires a.size == 5 && b.size == 5 ; */ +void foo(message a,message b) +{ + message c = fconcat(a,b); + //@ assert qed_ok: S: c.size == 10 ; + //@ assert qed_ok: A: c.text[2] == a.text[2] ; + //@ assert qed_ok: B: c.text[7] == b.text[2] ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/tutorial.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/tutorial.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_plugin/tutorial.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_plugin/tutorial.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,225 @@ +/* run.config_qualif + DONTRUN: test under construction +*/ + +/* run.config_qualif + OPT: -wp -wp-par 1 -wp-prop="-qed_ko" + OPT: -wp -wp-par 1 -wp-prop qed_ko -wp-timeout 5 +*/ + +/* run.config + DONTRUN: test under construction +*/ + +/*@ ensures qed_ok: \result==((x>y)?x:y); + */ +int max(int x, int y) { + return (x > y) ? x : y; +} + +/*@ ensures qed_ok: \result==((x>0)?x:-x); */ +int absolue(int x) { + return (x >= 0) ? x : -x; +} + +/*@ ensures qed_ok: *x == \old(*y) && *y == \old(*x); */ +void echange_valeur(int * x, int * y) { + int a = *x; + *x = *y; + *y = a; +} + +/*@ ensures qed_ko: x == \old(y) && y == \old(x); + @*/ +void echange_valeur_false(int x, int y) { + int a = x; + x = y; + y = a; +} + +/*@ requires a>=0 ; + ensures \result == a*b; */ +int produit(int a, int b) { + int x = a, y = 0; + /*@ loop invariant x*b+y==a*b && x>=0;*/ + while (x > 0) { + y += b; + --x; + } + return (y); +} + +/*@ requires n>=0; + @ ensures (\result*\result) <= n < (\result+1)*(\result+1); + @*/ +int racine(int n) { + int r = 0; + /*@ loop invariant r*r <= n; + @*/ + while (n >= (r+1)*(r+1)) + r = r + 1; + return(r); +} + +/*@ requires n>=0; + @ ensures (\result*\result) <= n < (\result+1)*(\result+1); + @*/ +int racine_defaut(int n) { + int r = (n/2) + 1; + /*@ loop invariant ONLY_PROVED_BY_CVC3: n<(r+1)*(r+1) ;*/ + while (r*r > n) + --r; + return(r); +} + + + +/*@ inductive is_power(integer x, integer y, integer p) { + @ case zero: + @ \forall integer x; is_power(x, 0, 1); + @ case non_zero: + @ \forall integer x,y,p; is_power(x,y-1,p) ==> is_power(x,y,p*x); + @ } + @*/ + +/*@ requires b>=0 ; + ensures UNSUPPORTED_INDUCTIVE_PREDICATE: is_power(a,b,\result); + */ +int puissance(int a, int b) { + int p = 1, i = 1; + /*@ loop invariant is_power(a,i-1,p) && i<=b+1; */ + while (i <= b) { + p *= a; ++i; + } + return (p); +} + +/*@ inductive is_fibo(integer n,integer f) { + case zero: is_fibo(0,0); + case one: is_fibo(1,1); + case other: + \forall integer n,f1,f2; n>1 ==> is_fibo(n-1,f1) ==> is_fibo(n-2,f2) ==> + is_fibo(n,f1+f2); +} +*/ +/*@ requires n >=0 ; + ensures is_fibo(n,\result) ;*/ +int fibonacci(int n) { + int x = 0; + int y, k, t; + if (n != 0) { + y = x; x = 1; k = 1; + /*@ loop invariant is_fibo(k,x) && is_fibo(k-1,y) && k<=n; */ + while(k0; + behavior same: + assumes \forall integer i; 0<=i a[i] == b[i] ; + ensures \result == 1; + behavior different: + assumes \exists integer i; 0<=i a[k]==b[k] ;*/ + while (i < n) { + if (a[i] != b[i]) + return 0; + ++i; + } + return 1; +} + + +/*@ requires \valid(a+(0..n-1)); + ensures \forall integer i; 0<=i a[\result]<=a[i]; + + */ +int min_element(int * a, int n) { + int i = 0, imin = i; + /*@ loop invariant qed_ok: \forall integer k; 0<=k a[imin]<=a[k]; + */ + while (i < n) { + imin = (a[i] < a[imin] ? i : imin); + ++i; + } + return imin; +} + +/*@ predicate is_divisible(integer p,integer q) = + \exists integer k; p==k*q; + predicate pgcd(integer a,integer b,integer q) = + is_divisible(a,q) && + is_divisible(b,q) && + \forall integer k; + is_divisible(a,k) && is_divisible(b,k) ==> is_divisible(q,k); + + lemma pgcd_refl: \forall integer x; pgcd(x,x,x); // HOW TO PROVE IT???? + lemma pgcd_minus:\forall integer x,y,k; pgcd(x,y,k)<==>pgcd(x,y-x,k);// HOW TO PROVE IT???? + lemma pgcd_minus_2:\forall integer x,y,k; pgcd(x,y,k)<==>pgcd(x-y,y,k);// HOW TO PROVE IT???? +*/ +/*@ + requires a>0 && b>0; + ensures pgcd(a,b,\result); // INVALID GOAL GENERATED IN THE GUI IF THE LOOP INVARIANT IS PROVED FIRST +*/ +int pgcd(int a,int b) { + int x = a, y = b; + /*@ loop invariant \forall integer k; pgcd(x,y,k) ==> pgcd(a,b,k); + loop variant (x-y>=0)?(x-y):(y-x); +*/ + while (x != y) { + if (x > y) + x -= y; + else + y -= x; + } + return (y); +} + + +/*@ predicate is_prime(integer n) = + n!=1 && + \forall integer k; k>=0 ==> is_divisible(n,k) ==> k==1 || k==n; + + lemma div_mod: + \forall integer a,b; is_divisible(a,b) <==> a%b==0; */ + +/*@ requires n>=0; + behavior is_prime: + assumes is_prime(n); + ensures \result==1; + behavior not_prime: + assumes !is_prime(n); + ensures \result==0; +*/ +int premier (int n) { + if (n<2) + return 0; + if (n==2) + return 1; + int i = 2; + /*@ loop invariant \forall integer k; 2<=k !is_divisible(n,k); + loop invariant 2<=i \result == &(G[0]) ; + @ ensures P_addr_shift: qed_ok: i>=j ==> \result == &(G[i]) ; +*/ +int * g (int i,int j) +{ + if (i \result == x; +*/ +int f (int z) +{ if (&z == &y) return x ; return 0; } diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/nonaliasing.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/nonaliasing.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/nonaliasing.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/nonaliasing.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,24 @@ +/* + run.config_qualif + OPT: -wp -wp-model Typed -wp-proof alt-ergo -wp-par 1 -wp-timeout 2 -wp-prop="-qed_ko" + OPT: -wp -wp-model Typed -wp-proof alt-ergo -wp-par 1 -wp-timeout 2 -wp-prop qed_ko -wp-timeout 5 +*/ + +/* -------------------------------------------------------------------------- */ +/* --- GOAL: separation condition and interference with FunVar --- */ +/* -------------------------------------------------------------------------- */ + +/*@ + requires \valid(p); + requires \valid(q); + requires 0<= *p < 200 && 0<= *q < 200; + ensures qed_ok: P: \separated(p,q) ==> *p==\old(*p)+1; + ensures qed_ok: Q: \separated(p,q) ==> *q==\old(*q)+1; + ensures qed_ko: P_oracle_ko: *p==\old(*p)+1; + ensures qed_ko: Q_oracle_ko: *q==\old(*q)+1; + */ +void f(int *p,int *q) +{ + *p+=1; *q+=1; +} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/oracle/array.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/oracle/array.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/oracle/array.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/oracle/array.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,38 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_store/array.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function g +------------------------------------------------------------ + +Goal Post-condition 'P_startof,qed_ok' in 'g': +Assume { + (* Domain *) + Type: (is_sint32 i_0) /\ (is_sint32 j_0). + (* Goal *) + When: i_0x_1]. +Let x_2 = m_0[q_0]. +Let x_3 = 1+x_2. +Let x_4 = m_0[q_0->x_3][p_0]. +Let x_5 = Mint_0[q_0]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 x_5) /\ (is_sint32 x_2) + /\ (is_sint32 x_3) /\ (is_sint32 x_4). + (* Goal *) + When: p_0!=q_0. + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base p_0))<=0) + /\ ((region (base q_0))<=0). + (* Pre-condition (file tests/wp_store/nonaliasing.i, line 12) in 'f' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 p_0 1). + (* Pre-condition (file tests/wp_store/nonaliasing.i, line 13) in 'f' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 q_0 1). + (* Pre-condition (file tests/wp_store/nonaliasing.i, line 14) in 'f' *) + (* Pre-condition: *) + Have: (0<=x_0) /\ (0<=x_5) /\ (x_0<=199) /\ (x_5<=199). +} +Prove: x_1=x_4. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ok,Q' in 'f': +Let x_0 = Mint_0[q_0]. +Let x_1 = Mint_0[p_0]. +Let m_0 = Mint_0[p_0->1+x_1]. +Let x_2 = m_0[q_0]. +Let x_3 = 1+x_2. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0) /\ (is_sint32 x_2) + /\ (is_sint32 x_3) /\ (is_sint32 m_0[q_0->x_3][p_0]). + (* Goal *) + When: p_0!=q_0. + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base p_0))<=0) + /\ ((region (base q_0))<=0). + (* Pre-condition (file tests/wp_store/nonaliasing.i, line 12) in 'f' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 p_0 1). + (* Pre-condition (file tests/wp_store/nonaliasing.i, line 13) in 'f' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 q_0 1). + (* Pre-condition (file tests/wp_store/nonaliasing.i, line 14) in 'f' *) + (* Pre-condition: *) + Have: (0<=x_1) /\ (0<=x_0) /\ (x_1<=199) /\ (x_0<=199). +} +Prove: x_0=x_2. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko,P_oracle_ko' in 'f': +Let x_0 = Mint_0[p_0]. +Let x_1 = 1+x_0. +Let m_0 = Mint_0[p_0->x_1]. +Let x_2 = m_0[q_0]. +Let x_3 = 1+x_2. +Let x_4 = m_0[q_0->x_3][p_0]. +Let x_5 = Mint_0[q_0]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 x_5) /\ (is_sint32 x_2) + /\ (is_sint32 x_3) /\ (is_sint32 x_4). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base p_0))<=0) + /\ ((region (base q_0))<=0). + (* Pre-condition (file tests/wp_store/nonaliasing.i, line 12) in 'f' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 p_0 1). + (* Pre-condition (file tests/wp_store/nonaliasing.i, line 13) in 'f' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 q_0 1). + (* Pre-condition (file tests/wp_store/nonaliasing.i, line 14) in 'f' *) + (* Pre-condition: *) + Have: (0<=x_0) /\ (0<=x_5) /\ (x_0<=199) /\ (x_5<=199). +} +Prove: x_1=x_4. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko,Q_oracle_ko' in 'f': +Let x_0 = Mint_0[q_0]. +Let x_1 = Mint_0[p_0]. +Let m_0 = Mint_0[p_0->1+x_1]. +Let x_2 = m_0[q_0]. +Let x_3 = 1+x_2. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0) /\ (is_sint32 x_2) + /\ (is_sint32 x_3) /\ (is_sint32 m_0[q_0->x_3][p_0]). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base p_0))<=0) + /\ ((region (base q_0))<=0). + (* Pre-condition (file tests/wp_store/nonaliasing.i, line 12) in 'f' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 p_0 1). + (* Pre-condition (file tests/wp_store/nonaliasing.i, line 13) in 'f' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 q_0 1). + (* Pre-condition (file tests/wp_store/nonaliasing.i, line 14) in 'f' *) + (* Pre-condition: *) + Have: (0<=x_1) /\ (0<=x_0) /\ (x_1<=199) /\ (x_0<=199). +} +Prove: x_0=x_2. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/oracle/struct.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/oracle/struct.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/oracle/struct.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/oracle/struct.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,118 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_store/struct.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Assertion 'qed_ok' (file tests/wp_store/struct.i, line 21): +Let a_1 = (shift_sint32 (shiftfield_F_t_tab a_0) 0). +Assume { + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0). + (* Pre-condition (file tests/wp_store/struct.i, line 18) in 'f' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_0 5) /\ (valid_rw Malloc_0 a_1 5). + (* tests/wp_store/struct.i:20: Call 'g' *) + Have: (valid_rw Malloc_0 a_1 1). +} +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_store/struct.i, line 10) in 'g'' in 'f' at call 'g' (file tests/wp_store/struct.i, line 20) +: +Let a_1 = (shift_sint32 (shiftfield_F_t_tab a_0) 0). +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[a_1]). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0). + (* Pre-condition (file tests/wp_store/struct.i, line 18) in 'f' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_0 5) /\ (valid_rw Malloc_0 a_1 5). +} +Prove: (valid_rw Malloc_0 a_1 1). + +------------------------------------------------------------ +------------------------------------------------------------ + Function g +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_store/struct.i, line 11) in 'g': +Assume { + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base i_0))<=0). + (* Pre-condition (file tests/wp_store/struct.i, line 10) in 'g' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 i_0 1). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_store/struct.i, line 12) in 'g': +Effect at line 15 +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[i_0]). + (* Goal *) + When: (valid_rd Malloc_0 i_0 1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base i_0))<=0). + (* Pre-condition (file tests/wp_store/struct.i, line 10) in 'g' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 i_0 1). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function main +------------------------------------------------------------ + +Goal Post-condition 'P,qed_ok' in 'main': +Let a_0 = (shift_St (global G_v_75) 0). +Let a_1 = (Load_S_St a_0 Mint_0). +Assume { + (* Domain *) + Type: (IsS_St w_0) /\ (IsS_St a_1). + (* Initializer *) + Have: 1=w_0.F_St_a. + (* Initializer *) + Have: 2=w_0.F_St_b. + (* Initializer *) + Have: 1=Mint_0[(shiftfield_F_St_a a_0)]. + (* Initializer *) + Have: 2=Mint_0[(shiftfield_F_St_b a_0)]. + (* Heap *) + Have: (region G_v_75)<=0. +} +Prove: (EqS_St a_1 w_0). + +------------------------------------------------------------ + +Goal Post-condition 'Q,qed_ok' in 'main': +Let a_0 = (shift_St (global G_v_75) 0). +Let a_1 = (Load_S_St a_0 Mint_0). +Assume { + (* Domain *) + Type: (IsS_St w_0) /\ (IsS_St a_1). + (* Initializer *) + Have: 1=w_0.F_St_a. + (* Initializer *) + Have: 2=w_0.F_St_b. + (* Initializer *) + Have: 1=Mint_0[(shiftfield_F_St_a a_0)]. + (* Initializer *) + Have: 2=Mint_0[(shiftfield_F_St_b a_0)]. + (* Heap *) + Have: (region G_v_75)<=0. +} +Prove: (EqS_St a_1 w_0). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/oracle_qualif/array.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/oracle_qualif/array.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/oracle_qualif/array.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/oracle_qualif/array.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_store/array.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 2 goals scheduled +[wp] [Qed] Goal typed_g_post_P_startof_qed_ok : Valid +[wp] [Qed] Goal typed_g_post_P_addr_shift_qed_ok : Valid +[wp] Proved goals: 2 / 2 + Qed: 2 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +g 2 - 2 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/oracle_qualif/natural.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/oracle_qualif/natural.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/oracle_qualif/natural.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/oracle_qualif/natural.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,17 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_store/natural.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 3 goals scheduled +[wp] [Qed] Goal typed_f_post_qed_ok : Valid +[wp] [Qed] Goal typed_f_assign_part1 : Valid +[wp] [Qed] Goal typed_f_assign_part2 : Valid +[wp] Proved goals: 3 / 3 + Qed: 3 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f 3 - 3 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/oracle_qualif/nonaliasing.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/oracle_qualif/nonaliasing.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/oracle_qualif/nonaliasing.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/oracle_qualif/nonaliasing.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_store/nonaliasing.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 2 goals scheduled +[wp] [Alt-Ergo] Goal typed_f_post_qed_ko_P_oracle_ko : Unknown +[wp] [Alt-Ergo] Goal typed_f_post_qed_ko_Q_oracle_ko : Unknown +[wp] Proved goals: 0 / 2 + Alt-Ergo: 0 (unknown: 2) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f - - 2 0.0% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/oracle_qualif/nonaliasing.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/oracle_qualif/nonaliasing.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/oracle_qualif/nonaliasing.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/oracle_qualif/nonaliasing.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,17 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_store/nonaliasing.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 2 goals scheduled +[wp] [Alt-Ergo] Goal typed_f_post_qed_ok_P : Valid +[wp] [Alt-Ergo] Goal typed_f_post_qed_ok_Q : Valid +[wp] Proved goals: 2 / 2 + Qed: 0 + Alt-Ergo: 2 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f - 2 (26) 2 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/oracle_qualif/struct.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/oracle_qualif/struct.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/oracle_qualif/struct.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/oracle_qualif/struct.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_store/struct.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 6 goals scheduled +[wp] [Qed] Goal typed_f_assert_qed_ok : Valid +[wp] [Alt-Ergo] Goal typed_f_call_g_pre : Valid +[wp] [Qed] Goal typed_g_post : Valid +[wp] [Qed] Goal typed_g_assign : Valid +[wp] [Alt-Ergo] Goal typed_main_post_P_qed_ok : Valid +[wp] [Alt-Ergo] Goal typed_main_post_Q_qed_ok : Valid +[wp] Proved goals: 6 / 6 + Qed: 3 + Alt-Ergo: 3 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +g 2 - 2 100% +f 1 1 (18) 2 100% +main - 2 (23) 2 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/struct.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/struct.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_store/struct.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_store/struct.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,31 @@ +/* run.config_qualif + OPT: -wp -wp-model Typed -wp-proof alt-ergo -wp-par 1 +*/ + + +struct t { + int tab[5]; +}; + +/*@ requires \valid(i); + @ ensures *i == 1; + @ assigns *i ; + @ */ +void g(int* i) { + *i = 1; +} + +/*@ requires \valid(a) && \valid(a->tab+(0..4)); */ +void f(struct t* a) { + g (&a->tab[0]); + //@ assert qed_ok: a->tab[0] == 1; +} + +struct St {int a; int b;}; +struct St v={1,2}, w={1,2} ; +struct St * p = &v ; + +/*@ ensures P: qed_ok: v == w; + @ ensures Q: qed_ok: *p == w; +*/ +void main(void) { return; } diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/bug_9.c frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/bug_9.c --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/bug_9.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/bug_9.c 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,12 @@ +/* bug gitlab #9 */ + +unsigned int *T1[1]; +unsigned char *T2[1]; + + +int main(void) { + int **p = &T1; + char **q = &T2; + /*@ assert \true; */ + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/bug_9.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/bug_9.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/bug_9.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/bug_9.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,17 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/bug_9.c (with preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function main +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/bug_9.c, line 10): +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/bug_9.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/bug_9.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/bug_9.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/bug_9.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,16 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/bug_9.c (with preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function main +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/bug_9.c, line 10): +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/shift_lemma.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/shift_lemma.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/shift_lemma.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/shift_lemma.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,143 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/shift_lemma.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/shift_lemma.i, line 22): +Let x_0 = Mint_0[(shiftfield_F_s_d p_0)]. +Let a_0 = (shiftfield_F_s_u p_0). +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 Mint_0[(shiftfield_F_s_e p_0)]) + /\ (is_sint32 Mint_0[(shiftfield_F_t_c (shift_t a_0 0))]) + /\ (is_sint32 Mint_0[(shiftfield_F_t_c (shift_t a_0 1))]). + (* Heap *) + Have: (region (base p_0))<=0. + (* Pre-condition (file tests/wp_typed/shift_lemma.i, line 19) in 'f' *) + (* Pre-condition: *) + Have: (P_inv Mint_0 p_0). +} +Prove: 0=x_0. + +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/shift_lemma.i, line 23): +Let a_0 = (shiftfield_F_s_u p_0). +Let x_0 = Mint_0[(shiftfield_F_s_d p_0)]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 Mint_0[(shiftfield_F_s_e p_0)]) + /\ (is_sint32 Mint_0[(shiftfield_F_t_c (shift_t a_0 0))]) + /\ (is_sint32 Mint_0[(shiftfield_F_t_c (shift_t a_0 1))]). + (* Goal *) + When: (0<=i_2) /\ (i_2<=9) /\ (is_sint32 i_2). + (* Heap *) + Have: (region (base p_0))<=0. + (* Pre-condition (file tests/wp_typed/shift_lemma.i, line 19) in 'f' *) + (* Pre-condition: *) + Have: (P_inv Mint_0 p_0). + (* Assertion (file tests/wp_typed/shift_lemma.i, line 22) *) + (* tests/wp_typed/shift_lemma.i:22: Assertion: *) + Have: 0=x_0. +} +Prove: 0=Mint_0[(shiftfield_F_t_c (shift_t a_0 i_2))]. + +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/shift_lemma.i, line 24): +Let a_0 = (shiftfield_F_s_u p_0). +Let x_0 = Mint_0[(shiftfield_F_t_c (shift_t a_0 0))]. +Let x_1 = Mint_0[(shiftfield_F_s_d p_0)]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 Mint_0[(shiftfield_F_s_e p_0)]) + /\ (is_sint32 x_0) + /\ (is_sint32 Mint_0[(shiftfield_F_t_c (shift_t a_0 1))]). + (* Heap *) + Have: (region (base p_0))<=0. + (* Pre-condition (file tests/wp_typed/shift_lemma.i, line 19) in 'f' *) + (* Pre-condition: *) + Have: (P_inv Mint_0 p_0). + (* Assertion (file tests/wp_typed/shift_lemma.i, line 22) *) + (* tests/wp_typed/shift_lemma.i:22: Assertion: *) + Have: 0=x_1. + (* Assertion (file tests/wp_typed/shift_lemma.i, line 23) *) + (* tests/wp_typed/shift_lemma.i:23: Assertion: *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=9) -> (is_sint32 i_0) + -> (0=Mint_0[(shiftfield_F_t_c (shift_t a_0 i_0))]). +} +Prove: 0=x_0. + +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/shift_lemma.i, line 25): +Let a_0 = (shiftfield_F_s_u p_0). +Let x_0 = Mint_0[(shiftfield_F_t_c (shift_t a_0 1))]. +Let x_1 = Mint_0[(shiftfield_F_t_c (shift_t a_0 0))]. +Let x_2 = Mint_0[(shiftfield_F_s_d p_0)]. +Assume { + (* Domain *) + Type: (is_sint32 x_2) /\ (is_sint32 Mint_0[(shiftfield_F_s_e p_0)]) + /\ (is_sint32 x_1) /\ (is_sint32 x_0). + (* Heap *) + Have: (region (base p_0))<=0. + (* Pre-condition (file tests/wp_typed/shift_lemma.i, line 19) in 'f' *) + (* Pre-condition: *) + Have: (P_inv Mint_0 p_0). + (* Assertion (file tests/wp_typed/shift_lemma.i, line 22) *) + (* tests/wp_typed/shift_lemma.i:22: Assertion: *) + Have: 0=x_2. + (* Assertion (file tests/wp_typed/shift_lemma.i, line 23) *) + (* tests/wp_typed/shift_lemma.i:23: Assertion: *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=9) -> (is_sint32 i_0) + -> (0=Mint_0[(shiftfield_F_t_c (shift_t a_0 i_0))]). + (* Assertion (file tests/wp_typed/shift_lemma.i, line 24) *) + (* tests/wp_typed/shift_lemma.i:24: Assertion: *) + Have: 0=x_1. +} +Prove: 0=x_0. + +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/shift_lemma.i, line 26): +Let x_0 = Mint_0[(shiftfield_F_s_e p_0)]. +Let a_0 = (shiftfield_F_s_u p_0). +Let x_1 = Mint_0[(shiftfield_F_t_c (shift_t a_0 1))]. +Let x_2 = Mint_0[(shiftfield_F_t_c (shift_t a_0 0))]. +Let x_3 = Mint_0[(shiftfield_F_s_d p_0)]. +Assume { + (* Domain *) + Type: (is_sint32 x_3) /\ (is_sint32 x_0) /\ (is_sint32 x_2) + /\ (is_sint32 x_1). + (* Heap *) + Have: (region (base p_0))<=0. + (* Pre-condition (file tests/wp_typed/shift_lemma.i, line 19) in 'f' *) + (* Pre-condition: *) + Have: (P_inv Mint_0 p_0). + (* Assertion (file tests/wp_typed/shift_lemma.i, line 22) *) + (* tests/wp_typed/shift_lemma.i:22: Assertion: *) + Have: 0=x_3. + (* Assertion (file tests/wp_typed/shift_lemma.i, line 23) *) + (* tests/wp_typed/shift_lemma.i:23: Assertion: *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=9) -> (is_sint32 i_0) + -> (0=Mint_0[(shiftfield_F_t_c (shift_t a_0 i_0))]). + (* Assertion (file tests/wp_typed/shift_lemma.i, line 24) *) + (* tests/wp_typed/shift_lemma.i:24: Assertion: *) + Have: 0=x_2. + (* Assertion (file tests/wp_typed/shift_lemma.i, line 25) *) + (* tests/wp_typed/shift_lemma.i:25: Assertion: *) + Have: 0=x_1. +} +Prove: 0=x_0. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/shift_lemma.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/shift_lemma.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/shift_lemma.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/shift_lemma.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,142 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/shift_lemma.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/shift_lemma.i, line 22): +Let x_0 = Mint_0[(shiftfield_F_s_d p_0)]. +Let a_0 = (shiftfield_F_s_u p_0). +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 Mint_0[(shiftfield_F_s_e p_0)]) + /\ (is_sint32 Mint_0[(shiftfield_F_t_c (shift_t a_0 0))]) + /\ (is_sint32 Mint_0[(shiftfield_F_t_c (shift_t a_0 1))]). + (* Heap *) + Have: (region (base p_0))<=0. + (* Pre-condition (file tests/wp_typed/shift_lemma.i, line 19) in 'f' *) + (* Pre-condition: *) + Have: (P_inv Mint_0 p_0). +} +Prove: 0=x_0. + +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/shift_lemma.i, line 23): +Let a_0 = (shiftfield_F_s_u p_0). +Let x_0 = Mint_0[(shiftfield_F_s_d p_0)]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 Mint_0[(shiftfield_F_s_e p_0)]) + /\ (is_sint32 Mint_0[(shiftfield_F_t_c (shift_t a_0 0))]) + /\ (is_sint32 Mint_0[(shiftfield_F_t_c (shift_t a_0 1))]). + (* Goal *) + When: (0<=i_2) /\ (i_2<=9) /\ (is_sint32 i_2). + (* Heap *) + Have: (region (base p_0))<=0. + (* Pre-condition (file tests/wp_typed/shift_lemma.i, line 19) in 'f' *) + (* Pre-condition: *) + Have: (P_inv Mint_0 p_0). + (* Assertion (file tests/wp_typed/shift_lemma.i, line 22) *) + (* tests/wp_typed/shift_lemma.i:22: Assertion: *) + Have: 0=x_0. +} +Prove: 0=Mint_0[(shiftfield_F_t_c (shift_t a_0 i_2))]. + +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/shift_lemma.i, line 24): +Let a_0 = (shiftfield_F_s_u p_0). +Let x_0 = Mint_0[(shiftfield_F_t_c (shift_t a_0 0))]. +Let x_1 = Mint_0[(shiftfield_F_s_d p_0)]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 Mint_0[(shiftfield_F_s_e p_0)]) + /\ (is_sint32 x_0) + /\ (is_sint32 Mint_0[(shiftfield_F_t_c (shift_t a_0 1))]). + (* Heap *) + Have: (region (base p_0))<=0. + (* Pre-condition (file tests/wp_typed/shift_lemma.i, line 19) in 'f' *) + (* Pre-condition: *) + Have: (P_inv Mint_0 p_0). + (* Assertion (file tests/wp_typed/shift_lemma.i, line 22) *) + (* tests/wp_typed/shift_lemma.i:22: Assertion: *) + Have: 0=x_1. + (* Assertion (file tests/wp_typed/shift_lemma.i, line 23) *) + (* tests/wp_typed/shift_lemma.i:23: Assertion: *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=9) -> (is_sint32 i_0) + -> (0=Mint_0[(shiftfield_F_t_c (shift_t a_0 i_0))]). +} +Prove: 0=x_0. + +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/shift_lemma.i, line 25): +Let a_0 = (shiftfield_F_s_u p_0). +Let x_0 = Mint_0[(shiftfield_F_t_c (shift_t a_0 1))]. +Let x_1 = Mint_0[(shiftfield_F_t_c (shift_t a_0 0))]. +Let x_2 = Mint_0[(shiftfield_F_s_d p_0)]. +Assume { + (* Domain *) + Type: (is_sint32 x_2) /\ (is_sint32 Mint_0[(shiftfield_F_s_e p_0)]) + /\ (is_sint32 x_1) /\ (is_sint32 x_0). + (* Heap *) + Have: (region (base p_0))<=0. + (* Pre-condition (file tests/wp_typed/shift_lemma.i, line 19) in 'f' *) + (* Pre-condition: *) + Have: (P_inv Mint_0 p_0). + (* Assertion (file tests/wp_typed/shift_lemma.i, line 22) *) + (* tests/wp_typed/shift_lemma.i:22: Assertion: *) + Have: 0=x_2. + (* Assertion (file tests/wp_typed/shift_lemma.i, line 23) *) + (* tests/wp_typed/shift_lemma.i:23: Assertion: *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=9) -> (is_sint32 i_0) + -> (0=Mint_0[(shiftfield_F_t_c (shift_t a_0 i_0))]). + (* Assertion (file tests/wp_typed/shift_lemma.i, line 24) *) + (* tests/wp_typed/shift_lemma.i:24: Assertion: *) + Have: 0=x_1. +} +Prove: 0=x_0. + +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/shift_lemma.i, line 26): +Let x_0 = Mint_0[(shiftfield_F_s_e p_0)]. +Let a_0 = (shiftfield_F_s_u p_0). +Let x_1 = Mint_0[(shiftfield_F_t_c (shift_t a_0 1))]. +Let x_2 = Mint_0[(shiftfield_F_t_c (shift_t a_0 0))]. +Let x_3 = Mint_0[(shiftfield_F_s_d p_0)]. +Assume { + (* Domain *) + Type: (is_sint32 x_3) /\ (is_sint32 x_0) /\ (is_sint32 x_2) + /\ (is_sint32 x_1). + (* Heap *) + Have: (region (base p_0))<=0. + (* Pre-condition (file tests/wp_typed/shift_lemma.i, line 19) in 'f' *) + (* Pre-condition: *) + Have: (P_inv Mint_0 p_0). + (* Assertion (file tests/wp_typed/shift_lemma.i, line 22) *) + (* tests/wp_typed/shift_lemma.i:22: Assertion: *) + Have: 0=x_3. + (* Assertion (file tests/wp_typed/shift_lemma.i, line 23) *) + (* tests/wp_typed/shift_lemma.i:23: Assertion: *) + Have: forall i_0:int. + (0<=i_0) -> (i_0<=9) -> (is_sint32 i_0) + -> (0=Mint_0[(shiftfield_F_t_c (shift_t a_0 i_0))]). + (* Assertion (file tests/wp_typed/shift_lemma.i, line 24) *) + (* tests/wp_typed/shift_lemma.i:24: Assertion: *) + Have: 0=x_2. + (* Assertion (file tests/wp_typed/shift_lemma.i, line 25) *) + (* tests/wp_typed/shift_lemma.i:25: Assertion: *) + Have: 0=x_1. +} +Prove: 0=x_0. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_alloc.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_alloc.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_alloc.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_alloc.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,76 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_alloc.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Assigns nothing in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function g +------------------------------------------------------------ + +Goal Assigns nothing in 'g': +Effect at line 31 +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function h +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_typed/unit_alloc.i, line 33) in 'h': +Assume { (* Heap *) Have: (linked Malloc_2). } +Prove: not (valid_rw Malloc_2[P_x_87->0] (shift_sint32 (global P_x_87) 0) 1). + +------------------------------------------------------------ +------------------------------------------------------------ + Function job +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/unit_alloc.i, line 15): +Assume { (* Heap *) Have: (linked Malloc_2) /\ ((region (base p_1))<=0). } +Prove: true. + +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/unit_alloc.i, line 21): +Assume { (* Heap *) Have: (linked Malloc_2) /\ ((region (base p_1))<=0). } +Prove: (valid_rw Malloc_2[L_y_72->1] (shift_sint32 (global L_y_72) 0) 1). + +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/unit_alloc.i, line 22): +Assume { + (* Heap *) + Have: (linked Malloc_2) /\ ((region (base p_1))<=0). + (* Assertion (file tests/wp_typed/unit_alloc.i, line 21) *) + (* tests/wp_typed/unit_alloc.i:21: Assertion: *) + Have: (valid_rw Malloc_2[L_y_72->1] (shift_sint32 (global L_y_72) 0) 1). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/unit_alloc.i, line 24): +Let a_0 = (shift_sint32 (global L_y_72) 0). +Assume { + (* Heap *) + Have: (linked Malloc_2) /\ ((region (base p_1))<=0). + (* Assertion (file tests/wp_typed/unit_alloc.i, line 21) *) + (* tests/wp_typed/unit_alloc.i:21: Assertion: *) + Have: (valid_rw Malloc_2[L_y_72->1] a_0 1). +} +Prove: not (valid_rw Malloc_2[L_y_72->0] a_0 1). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_alloc.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_alloc.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_alloc.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_alloc.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,78 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_alloc.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Assigns nothing in 'f': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function g +------------------------------------------------------------ + +Goal Assigns nothing in 'g': +Effect at line 31 +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function h +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_typed/unit_alloc.i, line 33) in 'h': +Assume { (* Heap *) Have: (linked Malloc_2). } +Prove: not (valid_rw Malloc_2[P_x_87->0] (shift_sint32 (global P_x_87) 0) 1). + +------------------------------------------------------------ +------------------------------------------------------------ + Function job +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/unit_alloc.i, line 15): +Assume { (* Heap *) Have: (linked Malloc_4) /\ ((region (base p_1))<=0). } +Prove: true. + +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/unit_alloc.i, line 21): +Assume { (* Heap *) Have: (linked Malloc_4) /\ ((region (base p_1))<=0). } +Prove: (valid_rw Malloc_4[P_x_71->1][L_y_72->1][L_z_74->1] + (shift_sint32 (global L_y_72) 0) 1). + +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/unit_alloc.i, line 22): +Assume { + (* Heap *) + Have: (linked Malloc_4) /\ ((region (base p_1))<=0). + (* Assertion (file tests/wp_typed/unit_alloc.i, line 21) *) + (* tests/wp_typed/unit_alloc.i:21: Assertion: *) + Have: (valid_rw Malloc_4[P_x_71->1][L_y_72->1][L_z_74->1] + (shift_sint32 (global L_y_72) 0) 1). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/unit_alloc.i, line 24): +Let m_0 = Malloc_4[P_x_71->1][L_y_72->1][L_z_74->1]. +Let a_0 = (shift_sint32 (global L_y_72) 0). +Assume { + (* Heap *) + Have: (linked Malloc_4) /\ ((region (base p_1))<=0). + (* Assertion (file tests/wp_typed/unit_alloc.i, line 21) *) + (* tests/wp_typed/unit_alloc.i:21: Assertion: *) + Have: (valid_rw m_0 a_0 1). +} +Prove: not (valid_rw m_0[L_y_72->0][L_z_74->0] a_0 1). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_bitwise.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_bitwise.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_bitwise.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_bitwise.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,507 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_bitwise.c (with preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Global +------------------------------------------------------------ + +Lemma band_sint8: +Assume: 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: let x_1 = (land x_0 y_0) in + (is_sint8 x_0) -> (is_sint8 y_0) -> (x_1=(to_sint8 x_1)) + +------------------------------------------------------------ + +Lemma band_uint8: +Assume: 'bor_uint8' 'blsr_sint8' 'band_sint8' 'bor_sint8' 'bxor_sint8' + 'bnot_sint8' +Prove: let x_1 = (land x_0 y_0) in + (is_uint8 x_0) -> (is_uint8 y_0) -> (x_1=(to_uint8 x_1)) + +------------------------------------------------------------ + +Lemma blsr_sint8: +Assume: 'band_sint8' 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: let x_1 = (lsr x_0 y_0) in + (0<=y_0) -> (is_sint8 x_0) -> (is_sint8 y_0) -> (x_1=(to_sint8 x_1)) + +------------------------------------------------------------ + +Lemma blsr_uint8: +Assume: 'band_uint8' 'bor_uint8' 'blsr_sint8' 'band_sint8' 'bor_sint8' + 'bxor_sint8' 'bnot_sint8' +Prove: let x_1 = (lsr x_0 y_0) in + (0<=y_0) -> (is_uint8 x_0) -> (is_uint8 y_0) -> (x_1=(to_uint8 x_1)) + +------------------------------------------------------------ + +Lemma bnot_sint8: +Prove: let x_1 = (lnot x_0) in (is_sint8 x_0) -> (x_1=(to_sint8 x_1)) + +------------------------------------------------------------ + +Lemma bor_sint8: +Assume: 'bxor_sint8' 'bnot_sint8' +Prove: let x_1 = (lor x_0 y_0) in + (is_sint8 x_0) -> (is_sint8 y_0) -> (x_1=(to_sint8 x_1)) + +------------------------------------------------------------ + +Lemma bor_uint8: +Assume: 'blsr_sint8' 'band_sint8' 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: let x_1 = (lor x_0 y_0) in + (is_uint8 x_0) -> (is_uint8 y_0) -> (x_1=(to_uint8 x_1)) + +------------------------------------------------------------ + +Lemma bxor_sint8: +Assume: 'bnot_sint8' +Prove: let x_1 = (lxor x_0 y_0) in + (is_sint8 x_0) -> (is_sint8 y_0) -> (x_1=(to_sint8 x_1)) + +------------------------------------------------------------ + +Lemma land_abs: +Assume: 'land_com' 'land_assoc' 'blsr_uint8' 'band_uint8' 'bor_uint8' + 'blsr_sint8' 'band_sint8' 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma land_assoc: +Assume: 'blsr_uint8' 'band_uint8' 'bor_uint8' 'blsr_sint8' 'band_sint8' + 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma land_com: +Assume: 'land_assoc' 'blsr_uint8' 'band_uint8' 'bor_uint8' 'blsr_sint8' + 'band_sint8' 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma land_stb: +Assume: 'land_abs' 'land_com' 'land_assoc' 'blsr_uint8' 'band_uint8' + 'bor_uint8' 'blsr_sint8' 'band_sint8' 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma lor_assoc: +Assume: 'land_stb' 'land_abs' 'land_com' 'land_assoc' 'blsr_uint8' + 'band_uint8' 'bor_uint8' 'blsr_sint8' 'band_sint8' 'bor_sint8' 'bxor_sint8' + 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma lor_com: +Assume: 'lor_assoc' 'land_stb' 'land_abs' 'land_com' 'land_assoc' + 'blsr_uint8' 'band_uint8' 'bor_uint8' 'blsr_sint8' 'band_sint8' 'bor_sint8' + 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma lor_neu: +Assume: 'lor_com' 'lor_assoc' 'land_stb' 'land_abs' 'land_com' 'land_assoc' + 'blsr_uint8' 'band_uint8' 'bor_uint8' 'blsr_sint8' 'band_sint8' 'bor_sint8' + 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma lor_stb: +Assume: 'lor_neu' 'lor_com' 'lor_assoc' 'land_stb' 'land_abs' 'land_com' + 'land_assoc' 'blsr_uint8' 'band_uint8' 'bor_uint8' 'blsr_sint8' + 'band_sint8' 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma lxor_assoc: +Assume: 'lor_stb' 'lor_neu' 'lor_com' 'lor_assoc' 'land_stb' 'land_abs' + 'land_com' 'land_assoc' 'blsr_uint8' 'band_uint8' 'bor_uint8' 'blsr_sint8' + 'band_sint8' 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma lxor_com: +Assume: 'lxor_assoc' 'lor_stb' 'lor_neu' 'lor_com' 'lor_assoc' 'land_stb' + 'land_abs' 'land_com' 'land_assoc' 'blsr_uint8' 'band_uint8' 'bor_uint8' + 'blsr_sint8' 'band_sint8' 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ +------------------------------------------------------------ + Axiomatic 'bits' +------------------------------------------------------------ + +Lemma btest_band: +Assume: 'btest_bor' 'btest_bxor' 'btest_bnot' +Prove: (0 ((P_c2fc4_btest (land x_0 y_0) n_0) + <-> ((P_c2fc4_btest x_0 n_0) /\ (P_c2fc4_btest y_0 n_0))) + +------------------------------------------------------------ + +Lemma btest_bnot: +Prove: (0 ((not (P_c2fc4_btest x_0 n_0)) <-> (P_c2fc4_btest (lnot x_0) n_0)) + +------------------------------------------------------------ + +Lemma btest_bor: +Assume: 'btest_bxor' 'btest_bnot' +Prove: (0 ((P_c2fc4_btest (lor x_0 y_0) n_0) + <-> ((P_c2fc4_btest x_0 n_0) \/ (P_c2fc4_btest y_0 n_0))) + +------------------------------------------------------------ + +Lemma btest_bxor: +Assume: 'btest_bnot' +Prove: (0 (((P_c2fc4_btest x_0 n_0)!=(P_c2fc4_btest y_0 n_0)) + <-> (P_c2fc4_btest (lxor x_0 y_0) n_0)) + +------------------------------------------------------------ +------------------------------------------------------------ + Function band1_uchar +------------------------------------------------------------ + +Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 113): +Let x_0 = (to_uint8 (land 1 a_0)). +Assume { (* Domain *) Type: (is_uint8 a_0). } +Prove: (0=x_0) \/ (1=x_0). + +------------------------------------------------------------ + +Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 114): +Let x_0 = (to_uint8 (land 1 a_0)). +Assume { + (* Domain *) + Type: (is_uint8 a_0). + (* Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 113) *) + (* tests/wp_typed/unit_bitwise.c:113: Assertion 'ok': *) + Have: (0=x_0) \/ (1=x_0). +} +Prove: x_0<=1. + +------------------------------------------------------------ +------------------------------------------------------------ + Function band1_uint +------------------------------------------------------------ + +Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 48): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 49): +Let x_0 = (land 1 a_0). +Assume { (* Domain *) Type: (is_uint32 a_0) /\ (is_uint32 x_0). } +Prove: (0<=x_0) /\ (x_0<=1). + +------------------------------------------------------------ +------------------------------------------------------------ + Function band1_ulong +------------------------------------------------------------ + +Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 166): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 167): +Let x_0 = (land 1 a_0). +Assume { (* Domain *) Type: (is_uint32 a_0) /\ (is_uint32 x_0). } +Prove: (0<=x_0) /\ (x_0<=1). + +------------------------------------------------------------ +------------------------------------------------------------ + Function band1_ushort +------------------------------------------------------------ + +Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 161): +Let x_0 = (to_uint16 (land 1 a_0)). +Assume { (* Domain *) Type: (is_uint16 a_0). } +Prove: (0=x_0) \/ (1=x_0). + +------------------------------------------------------------ + +Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 162): +Let x_0 = (to_uint16 (land 1 a_0)). +Assume { + (* Domain *) + Type: (is_uint16 a_0). + (* Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 161) *) + (* tests/wp_typed/unit_bitwise.c:161: Assertion 'ok': *) + Have: (0=x_0) \/ (1=x_0). +} +Prove: x_0<=1. + +------------------------------------------------------------ +------------------------------------------------------------ + Function band_char +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'band_char': +Let x_0 = (land a_0 b_0). +Assume { (* Domain *) Type: (is_sint8 a_0) /\ (is_sint8 b_0). } +Prove: x_0=(to_sint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function band_int +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'band_int': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function band_uchar +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'band_uchar': +Let x_0 = (land a_0 b_0). +Assume { (* Domain *) Type: (is_uint8 a_0) /\ (is_uint8 b_0). } +Prove: x_0=(to_uint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function band_uint +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'band_uint': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function bnot_char +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bnot_char': +Let x_0 = (lnot a_0). +Assume { (* Domain *) Type: (is_sint8 a_0). } +Prove: x_0=(to_sint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bnot_int +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bnot_int': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function bnot_uchar +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bnot_uchar': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'ko' in 'bnot_uchar': +Let x_0 = (lnot a_0). +Assume { (* Domain *) Type: (is_uint8 a_0). } +Prove: x_0=(to_uint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bnot_uint +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bnot_uint': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'ko' in 'bnot_uint': +Let x_0 = (lnot a_0). +Assume { (* Domain *) Type: (is_uint32 a_0). } +Prove: x_0=(to_uint32 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bor_char +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bor_char': +Let x_0 = (lor a_0 b_0). +Assume { (* Domain *) Type: (is_sint8 a_0) /\ (is_sint8 b_0). } +Prove: x_0=(to_sint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bor_int +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bor_int': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function bor_uchar +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bor_uchar': +Let x_0 = (lor a_0 b_0). +Assume { (* Domain *) Type: (is_uint8 a_0) /\ (is_uint8 b_0). } +Prove: x_0=(to_uint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bor_uint +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bor_uint': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function bxor_char +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bxor_char': +Let x_0 = (lxor a_0 b_0). +Assume { (* Domain *) Type: (is_sint8 a_0) /\ (is_sint8 b_0). } +Prove: x_0=(to_sint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bxor_int +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bxor_int': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function bxor_uchar +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bxor_uchar': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'ko' in 'bxor_uchar': +Let x_0 = (lxor a_0 b_0). +Assume { (* Domain *) Type: (is_uint8 a_0) /\ (is_uint8 b_0). } +Prove: x_0=(to_uint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bxor_uint +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bxor_uint': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'ko' in 'bxor_uint': +Let x_0 = (lxor a_0 b_0). +Assume { (* Domain *) Type: (is_uint32 a_0) /\ (is_uint32 b_0). } +Prove: x_0=(to_uint32 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function lshift_char +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'lshift_char': +Let x_0 = (lsl a_0 n_0). +Assume { (* Domain *) Type: (is_sint8 a_0) /\ (is_sint8 n_0). } +Prove: (to_sint8 x_0)=(to_sint8 (to_sint32 x_0)). + +------------------------------------------------------------ +------------------------------------------------------------ + Function lshift_int +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'lshift_int': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function lshift_uchar +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'lshift_uchar': +Let x_0 = (lsl a_0 n_0). +Assume { (* Domain *) Type: (is_uint8 a_0) /\ (is_uint8 n_0). } +Prove: (to_uint8 x_0)=(to_uint8 (to_sint32 x_0)). + +------------------------------------------------------------ +------------------------------------------------------------ + Function lshift_uint +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'lshift_uint': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function rshift_char +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'rshift_char': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function rshift_int +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'rshift_int': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function rshift_uchar +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'rshift_uchar': +Let x_0 = (lsr a_0 n_0). +Assume { (* Domain *) Type: (is_uint8 a_0) /\ (is_uint8 n_0). } +Prove: x_0=(to_uint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function rshift_uint +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'rshift_uint': +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_bitwise.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_bitwise.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_bitwise.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_bitwise.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,506 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_bitwise.c (with preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Global +------------------------------------------------------------ + +Lemma band_sint8: +Assume: 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: let x_1 = (land x_0 y_0) in + (is_sint8 x_0) -> (is_sint8 y_0) -> (x_1=(to_sint8 x_1)) + +------------------------------------------------------------ + +Lemma band_uint8: +Assume: 'bor_uint8' 'blsr_sint8' 'band_sint8' 'bor_sint8' 'bxor_sint8' + 'bnot_sint8' +Prove: let x_1 = (land x_0 y_0) in + (is_uint8 x_0) -> (is_uint8 y_0) -> (x_1=(to_uint8 x_1)) + +------------------------------------------------------------ + +Lemma blsr_sint8: +Assume: 'band_sint8' 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: let x_1 = (lsr x_0 y_0) in + (0<=y_0) -> (is_sint8 x_0) -> (is_sint8 y_0) -> (x_1=(to_sint8 x_1)) + +------------------------------------------------------------ + +Lemma blsr_uint8: +Assume: 'band_uint8' 'bor_uint8' 'blsr_sint8' 'band_sint8' 'bor_sint8' + 'bxor_sint8' 'bnot_sint8' +Prove: let x_1 = (lsr x_0 y_0) in + (0<=y_0) -> (is_uint8 x_0) -> (is_uint8 y_0) -> (x_1=(to_uint8 x_1)) + +------------------------------------------------------------ + +Lemma bnot_sint8: +Prove: let x_1 = (lnot x_0) in (is_sint8 x_0) -> (x_1=(to_sint8 x_1)) + +------------------------------------------------------------ + +Lemma bor_sint8: +Assume: 'bxor_sint8' 'bnot_sint8' +Prove: let x_1 = (lor x_0 y_0) in + (is_sint8 x_0) -> (is_sint8 y_0) -> (x_1=(to_sint8 x_1)) + +------------------------------------------------------------ + +Lemma bor_uint8: +Assume: 'blsr_sint8' 'band_sint8' 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: let x_1 = (lor x_0 y_0) in + (is_uint8 x_0) -> (is_uint8 y_0) -> (x_1=(to_uint8 x_1)) + +------------------------------------------------------------ + +Lemma bxor_sint8: +Assume: 'bnot_sint8' +Prove: let x_1 = (lxor x_0 y_0) in + (is_sint8 x_0) -> (is_sint8 y_0) -> (x_1=(to_sint8 x_1)) + +------------------------------------------------------------ + +Lemma land_abs: +Assume: 'land_com' 'land_assoc' 'blsr_uint8' 'band_uint8' 'bor_uint8' + 'blsr_sint8' 'band_sint8' 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma land_assoc: +Assume: 'blsr_uint8' 'band_uint8' 'bor_uint8' 'blsr_sint8' 'band_sint8' + 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma land_com: +Assume: 'land_assoc' 'blsr_uint8' 'band_uint8' 'bor_uint8' 'blsr_sint8' + 'band_sint8' 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma land_stb: +Assume: 'land_abs' 'land_com' 'land_assoc' 'blsr_uint8' 'band_uint8' + 'bor_uint8' 'blsr_sint8' 'band_sint8' 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma lor_assoc: +Assume: 'land_stb' 'land_abs' 'land_com' 'land_assoc' 'blsr_uint8' + 'band_uint8' 'bor_uint8' 'blsr_sint8' 'band_sint8' 'bor_sint8' 'bxor_sint8' + 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma lor_com: +Assume: 'lor_assoc' 'land_stb' 'land_abs' 'land_com' 'land_assoc' + 'blsr_uint8' 'band_uint8' 'bor_uint8' 'blsr_sint8' 'band_sint8' 'bor_sint8' + 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma lor_neu: +Assume: 'lor_com' 'lor_assoc' 'land_stb' 'land_abs' 'land_com' 'land_assoc' + 'blsr_uint8' 'band_uint8' 'bor_uint8' 'blsr_sint8' 'band_sint8' 'bor_sint8' + 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma lor_stb: +Assume: 'lor_neu' 'lor_com' 'lor_assoc' 'land_stb' 'land_abs' 'land_com' + 'land_assoc' 'blsr_uint8' 'band_uint8' 'bor_uint8' 'blsr_sint8' + 'band_sint8' 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma lxor_assoc: +Assume: 'lor_stb' 'lor_neu' 'lor_com' 'lor_assoc' 'land_stb' 'land_abs' + 'land_com' 'land_assoc' 'blsr_uint8' 'band_uint8' 'bor_uint8' 'blsr_sint8' + 'band_sint8' 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ + +Lemma lxor_com: +Assume: 'lxor_assoc' 'lor_stb' 'lor_neu' 'lor_com' 'lor_assoc' 'land_stb' + 'land_abs' 'land_com' 'land_assoc' 'blsr_uint8' 'band_uint8' 'bor_uint8' + 'blsr_sint8' 'band_sint8' 'bor_sint8' 'bxor_sint8' 'bnot_sint8' +Prove: true + +------------------------------------------------------------ +------------------------------------------------------------ + Axiomatic 'bits' +------------------------------------------------------------ + +Lemma btest_band: +Assume: 'btest_bor' 'btest_bxor' 'btest_bnot' +Prove: (0 ((P_c2fc4_btest (land x_0 y_0) n_0) + <-> ((P_c2fc4_btest x_0 n_0) /\ (P_c2fc4_btest y_0 n_0))) + +------------------------------------------------------------ + +Lemma btest_bnot: +Prove: (0 ((not (P_c2fc4_btest x_0 n_0)) <-> (P_c2fc4_btest (lnot x_0) n_0)) + +------------------------------------------------------------ + +Lemma btest_bor: +Assume: 'btest_bxor' 'btest_bnot' +Prove: (0 ((P_c2fc4_btest (lor x_0 y_0) n_0) + <-> ((P_c2fc4_btest x_0 n_0) \/ (P_c2fc4_btest y_0 n_0))) + +------------------------------------------------------------ + +Lemma btest_bxor: +Assume: 'btest_bnot' +Prove: (0 (((P_c2fc4_btest x_0 n_0)!=(P_c2fc4_btest y_0 n_0)) + <-> (P_c2fc4_btest (lxor x_0 y_0) n_0)) + +------------------------------------------------------------ +------------------------------------------------------------ + Function band1_uchar +------------------------------------------------------------ + +Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 113): +Let x_0 = (to_uint8 (land 1 a_0)). +Assume { (* Domain *) Type: (is_uint8 a_0). } +Prove: (0=x_0) \/ (1=x_0). + +------------------------------------------------------------ + +Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 114): +Let x_0 = (to_uint8 (land 1 a_0)). +Assume { + (* Domain *) + Type: (is_uint8 a_0). + (* Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 113) *) + (* tests/wp_typed/unit_bitwise.c:113: Assertion 'ok': *) + Have: (0=x_0) \/ (1=x_0). +} +Prove: x_0<=1. + +------------------------------------------------------------ +------------------------------------------------------------ + Function band1_uint +------------------------------------------------------------ + +Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 48): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 49): +Let x_0 = (land 1 a_0). +Assume { (* Domain *) Type: (is_uint32 a_0) /\ (is_uint32 x_0). } +Prove: (0<=x_0) /\ (x_0<=1). + +------------------------------------------------------------ +------------------------------------------------------------ + Function band1_ulong +------------------------------------------------------------ + +Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 166): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 167): +Let x_0 = (land 1 a_0). +Assume { (* Domain *) Type: (is_uint32 a_0) /\ (is_uint32 x_0). } +Prove: (0<=x_0) /\ (x_0<=1). + +------------------------------------------------------------ +------------------------------------------------------------ + Function band1_ushort +------------------------------------------------------------ + +Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 161): +Let x_0 = (to_uint16 (land 1 a_0)). +Assume { (* Domain *) Type: (is_uint16 a_0). } +Prove: (0=x_0) \/ (1=x_0). + +------------------------------------------------------------ + +Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 162): +Let x_0 = (to_uint16 (land 1 a_0)). +Assume { + (* Domain *) + Type: (is_uint16 a_0). + (* Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 161) *) + (* tests/wp_typed/unit_bitwise.c:161: Assertion 'ok': *) + Have: (0=x_0) \/ (1=x_0). +} +Prove: x_0<=1. + +------------------------------------------------------------ +------------------------------------------------------------ + Function band_char +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'band_char': +Let x_0 = (land a_0 b_0). +Assume { (* Domain *) Type: (is_sint8 a_0) /\ (is_sint8 b_0). } +Prove: x_0=(to_sint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function band_int +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'band_int': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function band_uchar +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'band_uchar': +Let x_0 = (land a_0 b_0). +Assume { (* Domain *) Type: (is_uint8 a_0) /\ (is_uint8 b_0). } +Prove: x_0=(to_uint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function band_uint +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'band_uint': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function bnot_char +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bnot_char': +Let x_0 = (lnot a_0). +Assume { (* Domain *) Type: (is_sint8 a_0). } +Prove: x_0=(to_sint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bnot_int +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bnot_int': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function bnot_uchar +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bnot_uchar': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'ko' in 'bnot_uchar': +Let x_0 = (lnot a_0). +Assume { (* Domain *) Type: (is_uint8 a_0). } +Prove: x_0=(to_uint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bnot_uint +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bnot_uint': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'ko' in 'bnot_uint': +Let x_0 = (lnot a_0). +Assume { (* Domain *) Type: (is_uint32 a_0). } +Prove: x_0=(to_uint32 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bor_char +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bor_char': +Let x_0 = (lor a_0 b_0). +Assume { (* Domain *) Type: (is_sint8 a_0) /\ (is_sint8 b_0). } +Prove: x_0=(to_sint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bor_int +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bor_int': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function bor_uchar +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bor_uchar': +Let x_0 = (lor a_0 b_0). +Assume { (* Domain *) Type: (is_uint8 a_0) /\ (is_uint8 b_0). } +Prove: x_0=(to_uint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bor_uint +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bor_uint': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function bxor_char +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bxor_char': +Let x_0 = (lxor a_0 b_0). +Assume { (* Domain *) Type: (is_sint8 a_0) /\ (is_sint8 b_0). } +Prove: x_0=(to_sint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bxor_int +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bxor_int': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function bxor_uchar +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bxor_uchar': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'ko' in 'bxor_uchar': +Let x_0 = (lxor a_0 b_0). +Assume { (* Domain *) Type: (is_uint8 a_0) /\ (is_uint8 b_0). } +Prove: x_0=(to_uint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function bxor_uint +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'bxor_uint': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'ko' in 'bxor_uint': +Let x_0 = (lxor a_0 b_0). +Assume { (* Domain *) Type: (is_uint32 a_0) /\ (is_uint32 b_0). } +Prove: x_0=(to_uint32 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function lshift_char +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'lshift_char': +Let x_0 = (lsl a_0 n_0). +Assume { (* Domain *) Type: (is_sint8 a_0) /\ (is_sint8 n_0). } +Prove: (to_sint8 x_0)=(to_sint8 (to_sint32 x_0)). + +------------------------------------------------------------ +------------------------------------------------------------ + Function lshift_int +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'lshift_int': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function lshift_uchar +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'lshift_uchar': +Let x_0 = (lsl a_0 n_0). +Assume { (* Domain *) Type: (is_uint8 a_0) /\ (is_uint8 n_0). } +Prove: (to_uint8 x_0)=(to_uint8 (to_sint32 x_0)). + +------------------------------------------------------------ +------------------------------------------------------------ + Function lshift_uint +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'lshift_uint': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function rshift_char +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'rshift_char': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function rshift_int +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'rshift_int': +Assume { } +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function rshift_uchar +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'rshift_uchar': +Let x_0 = (lsr a_0 n_0). +Assume { (* Domain *) Type: (is_uint8 a_0) /\ (is_uint8 n_0). } +Prove: x_0=(to_uint8 x_0). + +------------------------------------------------------------ +------------------------------------------------------------ + Function rshift_uint +------------------------------------------------------------ + +Goal Post-condition 'ok' in 'rshift_uint': +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_call.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_call.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_call.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_call.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_call.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +tests/wp_typed/unit_call.i:7:[kernel] warning: No code nor implicit assigns clause for function f, generating default assigns from the prototype +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function job +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/unit_call.i, line 14): +Assume { + (* Domain *) + Type: (is_sint32 r_0) /\ (is_sint32 r_1). + (* tests/wp_typed/unit_call.i:10: Call 'f' *) + Have: r_1<0. + (* tests/wp_typed/unit_call.i:12: Call 'f' *) + Have: 0Mint_1[(shift_sint32 a_0 pj_0)]] a_0 + pi_0 pj_0). + +------------------------------------------------------------ + +Goal Assertion 'PI' (file tests/wp_typed/unit_labels.i, line 9): +Assume { (* Heap *) Have: (region (base a_2))<=0. } +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'PJ' (file tests/wp_typed/unit_labels.i, line 10): +Assume { (* Heap *) Have: (region (base a_2))<=0. } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_labels.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_labels.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_labels.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_labels.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,84 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_labels.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function duplet +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_typed/unit_labels.i, line 5) in 'duplet': +Let x_0 = Mint_2[pi_0]. +Let a_1 = (shift_sint32 a_0 x_0). +Let x_1 = Mint_2[pj_0]. +Let m_0 = Mint_2[a_1->Mint_2[(shift_sint32 a_0 x_1)]]. +Let x_2 = m_0[pi_0]. +Let x_3 = m_0[pj_0]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 x_1) /\ (is_sint32 x_2) + /\ (is_sint32 x_3). + (* Heap *) + Have: ((region (base a_0))<=0) /\ ((region (base pi_0))<=0) + /\ ((region (base pj_0))<=0). + (* Pre-condition (file tests/wp_typed/unit_labels.i, line 4) in 'duplet' *) + (* Pre-condition: *) + Have: (pi_0!=pj_0) /\ (pi_0!=a_1) /\ (pj_0!=a_1). + (* Assertion 'PI' (file tests/wp_typed/unit_labels.i, line 9) *) + (* tests/wp_typed/unit_labels.i:9: Assertion 'PI': *) + Have: x_0=x_2. + (* Assertion 'PJ' (file tests/wp_typed/unit_labels.i, line 10) *) + (* tests/wp_typed/unit_labels.i:10: Assertion 'PJ': *) + Have: x_1=x_3. +} +Prove: (P_is_duplet m_0 a_0 x_2 x_3). + +------------------------------------------------------------ + +Goal Assertion 'PI' (file tests/wp_typed/unit_labels.i, line 9): +Let x_0 = Mint_2[pi_0]. +Let a_1 = (shift_sint32 a_0 x_0). +Let x_1 = Mint_2[pj_0]. +Let m_0 = Mint_2[a_1->Mint_2[(shift_sint32 a_0 x_1)]]. +Let x_2 = m_0[pi_0]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 x_1) /\ (is_sint32 x_2) + /\ (is_sint32 m_0[pj_0]). + (* Heap *) + Have: ((region (base a_0))<=0) /\ ((region (base pi_0))<=0) + /\ ((region (base pj_0))<=0). + (* Pre-condition (file tests/wp_typed/unit_labels.i, line 4) in 'duplet' *) + (* Pre-condition: *) + Have: (pi_0!=pj_0) /\ (pi_0!=a_1) /\ (pj_0!=a_1). +} +Prove: x_0=x_2. + +------------------------------------------------------------ + +Goal Assertion 'PJ' (file tests/wp_typed/unit_labels.i, line 10): +Let x_0 = Mint_2[pj_0]. +Let x_1 = Mint_2[pi_0]. +Let a_1 = (shift_sint32 a_0 x_1). +Let m_0 = Mint_2[a_1->Mint_2[(shift_sint32 a_0 x_0)]]. +Let x_2 = m_0[pj_0]. +Let x_3 = m_0[pi_0]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0) /\ (is_sint32 x_3) + /\ (is_sint32 x_2). + (* Heap *) + Have: ((region (base a_0))<=0) /\ ((region (base pi_0))<=0) + /\ ((region (base pj_0))<=0). + (* Pre-condition (file tests/wp_typed/unit_labels.i, line 4) in 'duplet' *) + (* Pre-condition: *) + Have: (pi_0!=pj_0) /\ (pi_0!=a_1) /\ (pj_0!=a_1). + (* Assertion 'PI' (file tests/wp_typed/unit_labels.i, line 9) *) + (* tests/wp_typed/unit_labels.i:9: Assertion 'PI': *) + Have: x_1=x_3. +} +Prove: x_0=x_2. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_lemma.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_lemma.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_lemma.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_lemma.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,56 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_lemma.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +------------------------------------------------------------ + Global +------------------------------------------------------------ + +Lemma P23_KO: +Prove: (P_P2 x_0) -> (P_P3 x_0) + +------------------------------------------------------------ + +Lemma P52: +Assume: 'P14' 'P34' 'P13' 'P23_KO' +Prove: (P_P5 x_0) -> (P_P2 x_0) + +------------------------------------------------------------ +------------------------------------------------------------ + Axiomatic 'G1' +------------------------------------------------------------ + +Lemma P13: +Assume: 'P23_KO' +Prove: (P_P1 x_0) -> (P_P3 x_0) + +------------------------------------------------------------ + +Lemma P14: +Assume: 'P34' 'P13' 'P23_KO' +Prove: (P_P1 x_0) -> (P_P4 x_0) + +------------------------------------------------------------ +------------------------------------------------------------ + Axiomatic 'G2' +------------------------------------------------------------ + +Lemma P54: +Assume: 'P52' 'P14' 'P34' 'P13' 'P23_KO' +Prove: (P_P5 x_0) -> (P_P4 x_0) + +------------------------------------------------------------ +------------------------------------------------------------ + Axiomatic 'Poluted' +------------------------------------------------------------ + +Lemma Foo: +Prove: (P_H 0) -> (forall i_0:int. + (0 (P_H i_0)) + -> (forall i_0:int. + (i_0<0) -> (P_H i_0)) -> (forall i_0:int. + (P_H i_0)) + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_lemma.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_lemma.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_lemma.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_lemma.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,56 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_lemma.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +------------------------------------------------------------ + Global +------------------------------------------------------------ + +Lemma P23_KO: +Prove: (P_P2 x_0) -> (P_P3 x_0) + +------------------------------------------------------------ + +Lemma P52: +Assume: 'P14' 'P34' 'P13' 'P23_KO' +Prove: (P_P5 x_0) -> (P_P2 x_0) + +------------------------------------------------------------ +------------------------------------------------------------ + Axiomatic 'G1' +------------------------------------------------------------ + +Lemma P13: +Assume: 'P23_KO' +Prove: (P_P1 x_0) -> (P_P3 x_0) + +------------------------------------------------------------ + +Lemma P14: +Assume: 'P34' 'P13' 'P23_KO' +Prove: (P_P1 x_0) -> (P_P4 x_0) + +------------------------------------------------------------ +------------------------------------------------------------ + Axiomatic 'G2' +------------------------------------------------------------ + +Lemma P54: +Assume: 'P52' 'P14' 'P34' 'P13' 'P23_KO' +Prove: (P_P5 x_0) -> (P_P4 x_0) + +------------------------------------------------------------ +------------------------------------------------------------ + Axiomatic 'Poluted' +------------------------------------------------------------ + +Lemma Foo: +Prove: (P_H 0) -> (forall i_0:int. + (0 (P_H i_0)) + -> (forall i_0:int. + (i_0<0) -> (P_H i_0)) -> (forall i_0:int. + (P_H i_0)) + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_loopscope.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_loopscope.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_loopscope.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_loopscope.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_loopscope.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +tests/wp_typed/unit_loopscope.i:14:[wp] warning: Missing assigns clause (assigns 'everything' instead) +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Preservation of Invariant (file tests/wp_typed/unit_loopscope.i, line 13): +Assume { + (* Invariant (file tests/wp_typed/unit_loopscope.i, line 13) *) + (* tests/wp_typed/unit_loopscope.i:14: Invariant: *) + Have: false. +} +Prove: false. + +------------------------------------------------------------ + +Goal Establishment of Invariant (file tests/wp_typed/unit_loopscope.i, line 13): +Assume { } +Prove: false. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_loopscope.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_loopscope.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_loopscope.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_loopscope.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,33 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_loopscope.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_typed/unit_loopscope.i:14:[wp] warning: Missing assigns clause (assigns 'everything' instead) +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Preservation of Invariant (file tests/wp_typed/unit_loopscope.i, line 13): +Assume { + (* Invariant (file tests/wp_typed/unit_loopscope.i, line 13) *) + (* tests/wp_typed/unit_loopscope.i:14: Invariant: *) + Have: false. +} +Prove: false. + +------------------------------------------------------------ + +Goal Establishment of Invariant (file tests/wp_typed/unit_loopscope.i, line 13): +Assume { + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base written_1))<=0). + (* Pre-condition (file tests/wp_typed/unit_loopscope.i, line 8) in 'f' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 written_1 1). +} +Prove: false. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_matrix.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_matrix.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_matrix.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_matrix.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,43 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_matrix.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function make +------------------------------------------------------------ + +Goal Post-condition 'OK1' in 'make': +Let m_0 = t_2[a_0->t_2[a_0][b_0->1]]. +Let x_0 = m_0[c_0->m_0[c_0][d_0->2]][a_0][b_0]. +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_0) /\ (is_sint32 c_0) + /\ (is_sint32 d_0) /\ (is_sint32 x_0). + (* Goal *) + When: a_0!=c_0. +} +Prove: 1=x_0. + +------------------------------------------------------------ + +Goal Post-condition 'OK2' in 'make': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'KO' in 'make': +Let m_0 = t_2[a_0->t_2[a_0][b_0->1]]. +Let x_0 = m_0[c_0->m_0[c_0][d_0->2]][a_0][b_0]. +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_0) /\ (is_sint32 c_0) + /\ (is_sint32 d_0) /\ (is_sint32 x_0). +} +Prove: 1=x_0. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_matrix.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_matrix.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_matrix.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_matrix.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,42 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_matrix.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function make +------------------------------------------------------------ + +Goal Post-condition 'OK1' in 'make': +Let m_0 = t_2[a_0->t_2[a_0][b_0->1]]. +Let x_0 = m_0[c_0->m_0[c_0][d_0->2]][a_0][b_0]. +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_0) /\ (is_sint32 c_0) + /\ (is_sint32 d_0) /\ (is_sint32 x_0). + (* Goal *) + When: a_0!=c_0. +} +Prove: 1=x_0. + +------------------------------------------------------------ + +Goal Post-condition 'OK2' in 'make': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'KO' in 'make': +Let m_0 = t_2[a_0->t_2[a_0][b_0->1]]. +Let x_0 = m_0[c_0->m_0[c_0][d_0->2]][a_0][b_0]. +Assume { + (* Domain *) + Type: (is_sint32 a_0) /\ (is_sint32 b_0) /\ (is_sint32 c_0) + /\ (is_sint32 d_0) /\ (is_sint32 x_0). +} +Prove: 1=x_0. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_string.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_string.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_string.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_string.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,89 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_string.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Assertion 'AB' (file tests/wp_typed/unit_string.i, line 11): +Assume { (* Heap *) Have: (linked Malloc_0) /\ (sconst Mchar_0). } +Prove: Str_2!=Str_5. + +------------------------------------------------------------ + +Goal Assertion 'B_valid' (file tests/wp_typed/unit_string.i, line 12): +Assume { + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0). + (* Assertion 'AB' (file tests/wp_typed/unit_string.i, line 11) *) + (* tests/wp_typed/unit_string.i:11: Assertion 'AB': *) + Have: Str_2!=Str_5. +} +Prove: (valid_rd Malloc_0 (shift_sint8 (global Str_5) 0) 3). + +------------------------------------------------------------ + +Goal Assertion 'B_out' (file tests/wp_typed/unit_string.i, line 13): +Let a_0 = (global Str_5). +Assume { + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0). + (* Assertion 'AB' (file tests/wp_typed/unit_string.i, line 11) *) + (* tests/wp_typed/unit_string.i:11: Assertion 'AB': *) + Have: Str_2!=Str_5. + (* Assertion 'B_valid' (file tests/wp_typed/unit_string.i, line 12) *) + (* tests/wp_typed/unit_string.i:12: Assertion 'B_valid': *) + Have: (valid_rd Malloc_0 (shift_sint8 a_0 0) 3). +} +Prove: not (valid_rd Malloc_0 (shift_sint8 a_0 3) 1). + +------------------------------------------------------------ + +Goal Assertion 'B_rw' (file tests/wp_typed/unit_string.i, line 14): +Let a_0 = (global Str_5). +Assume { + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0). + (* Assertion 'AB' (file tests/wp_typed/unit_string.i, line 11) *) + (* tests/wp_typed/unit_string.i:11: Assertion 'AB': *) + Have: Str_2!=Str_5. + (* Assertion 'B_valid' (file tests/wp_typed/unit_string.i, line 12) *) + (* tests/wp_typed/unit_string.i:12: Assertion 'B_valid': *) + Have: (valid_rd Malloc_0 (shift_sint8 a_0 0) 3). + (* Assertion 'B_out' (file tests/wp_typed/unit_string.i, line 13) *) + (* tests/wp_typed/unit_string.i:13: Assertion 'B_out': *) + Have: not (valid_rd Malloc_0 (shift_sint8 a_0 3) 1). +} +Prove: not (valid_rw Malloc_0 (shift_sint8 a_0 1) 1). + +------------------------------------------------------------ + +Goal Assertion 'VAL' (file tests/wp_typed/unit_string.i, line 15): +Let a_0 = (global Str_5). +Assume { + (* Goal *) + When: (0<=i_2) /\ (i_2<=2). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0). + (* Assertion 'AB' (file tests/wp_typed/unit_string.i, line 11) *) + (* tests/wp_typed/unit_string.i:11: Assertion 'AB': *) + Have: Str_2!=Str_5. + (* Assertion 'B_valid' (file tests/wp_typed/unit_string.i, line 12) *) + (* tests/wp_typed/unit_string.i:12: Assertion 'B_valid': *) + Have: (valid_rd Malloc_0 (shift_sint8 a_0 0) 3). + (* Assertion 'B_out' (file tests/wp_typed/unit_string.i, line 13) *) + (* tests/wp_typed/unit_string.i:13: Assertion 'B_out': *) + Have: not (valid_rd Malloc_0 (shift_sint8 a_0 3) 1). + (* Assertion 'B_rw' (file tests/wp_typed/unit_string.i, line 14) *) + (* tests/wp_typed/unit_string.i:14: Assertion 'B_rw': *) + Have: not (valid_rw Malloc_0 (shift_sint8 a_0 1) 1). +} +Prove: Mchar_0[(shift_sint8 a_0 i_2)]= + Mchar_0[(shift_sint8 (global Str_11) (3+i_2))]. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_string.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_string.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_string.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_string.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,88 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_string.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function f +------------------------------------------------------------ + +Goal Assertion 'AB' (file tests/wp_typed/unit_string.i, line 11): +Assume { (* Heap *) Have: (linked Malloc_0) /\ (sconst Mchar_0). } +Prove: Str_2!=Str_5. + +------------------------------------------------------------ + +Goal Assertion 'B_valid' (file tests/wp_typed/unit_string.i, line 12): +Assume { + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0). + (* Assertion 'AB' (file tests/wp_typed/unit_string.i, line 11) *) + (* tests/wp_typed/unit_string.i:11: Assertion 'AB': *) + Have: Str_2!=Str_5. +} +Prove: (valid_rd Malloc_0 (shift_sint8 (global Str_5) 0) 3). + +------------------------------------------------------------ + +Goal Assertion 'B_out' (file tests/wp_typed/unit_string.i, line 13): +Let a_0 = (global Str_5). +Assume { + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0). + (* Assertion 'AB' (file tests/wp_typed/unit_string.i, line 11) *) + (* tests/wp_typed/unit_string.i:11: Assertion 'AB': *) + Have: Str_2!=Str_5. + (* Assertion 'B_valid' (file tests/wp_typed/unit_string.i, line 12) *) + (* tests/wp_typed/unit_string.i:12: Assertion 'B_valid': *) + Have: (valid_rd Malloc_0 (shift_sint8 a_0 0) 3). +} +Prove: not (valid_rd Malloc_0 (shift_sint8 a_0 3) 1). + +------------------------------------------------------------ + +Goal Assertion 'B_rw' (file tests/wp_typed/unit_string.i, line 14): +Let a_0 = (global Str_5). +Assume { + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0). + (* Assertion 'AB' (file tests/wp_typed/unit_string.i, line 11) *) + (* tests/wp_typed/unit_string.i:11: Assertion 'AB': *) + Have: Str_2!=Str_5. + (* Assertion 'B_valid' (file tests/wp_typed/unit_string.i, line 12) *) + (* tests/wp_typed/unit_string.i:12: Assertion 'B_valid': *) + Have: (valid_rd Malloc_0 (shift_sint8 a_0 0) 3). + (* Assertion 'B_out' (file tests/wp_typed/unit_string.i, line 13) *) + (* tests/wp_typed/unit_string.i:13: Assertion 'B_out': *) + Have: not (valid_rd Malloc_0 (shift_sint8 a_0 3) 1). +} +Prove: not (valid_rw Malloc_0 (shift_sint8 a_0 1) 1). + +------------------------------------------------------------ + +Goal Assertion 'VAL' (file tests/wp_typed/unit_string.i, line 15): +Let a_0 = (global Str_5). +Assume { + (* Goal *) + When: (0<=i_2) /\ (i_2<=2). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0). + (* Assertion 'AB' (file tests/wp_typed/unit_string.i, line 11) *) + (* tests/wp_typed/unit_string.i:11: Assertion 'AB': *) + Have: Str_2!=Str_5. + (* Assertion 'B_valid' (file tests/wp_typed/unit_string.i, line 12) *) + (* tests/wp_typed/unit_string.i:12: Assertion 'B_valid': *) + Have: (valid_rd Malloc_0 (shift_sint8 a_0 0) 3). + (* Assertion 'B_out' (file tests/wp_typed/unit_string.i, line 13) *) + (* tests/wp_typed/unit_string.i:13: Assertion 'B_out': *) + Have: not (valid_rd Malloc_0 (shift_sint8 a_0 3) 1). + (* Assertion 'B_rw' (file tests/wp_typed/unit_string.i, line 14) *) + (* tests/wp_typed/unit_string.i:14: Assertion 'B_rw': *) + Have: not (valid_rw Malloc_0 (shift_sint8 a_0 1) 1). +} +Prove: Mchar_0[(shift_sint8 a_0 i_2)]= + Mchar_0[(shift_sint8 (global Str_11) (3+i_2))]. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_tset.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_tset.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_tset.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_tset.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,51 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_tset.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function complex +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/unit_tset.i, line 6) in 'job'' in 'complex' at call 'job' (file tests/wp_typed/unit_tset.i, line 20) +: +Let x_0 = Mint_6[(shiftfield_F_S_size (shift_S (global P_s_79) 0))]. +Assume { + (* Domain *) + Type: (is_sint32 x_0). + (* Heap *) + Have: (linked Malloc_5). + (* Pre-condition (file tests/wp_typed/unit_tset.i, line 16) in 'complex' *) + (* Pre-condition: *) + Have: x_0<=49. +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function complex with behavior default_for_stmt_2 +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/unit_tset.i, line 19) at call 'job' (file tests/wp_typed/unit_tset.i, line 20): +Call Effect at line 20 +Let a_0 = (shift_S (global P_s_79) 0). +Let x_0 = Mint_0[(shiftfield_F_S_size a_0)]. +Assume { + (* Domain *) + Type: (is_sint32 x_0). + (* Goal *) + When: (0 (x_0<=49). + (* Heap *) + Have: (linked Malloc_5). + (* Pre-condition (file tests/wp_typed/unit_tset.i, line 16) in 'complex' *) + (* Pre-condition: *) + Have: x_0<=49. + (* tests/wp_typed/unit_tset.i:20: Call Effects *) + Have: (havoc Mint_0 Mint_5 (shift_sint32 (shiftfield_F_S_value a_0) 1) x_0). +} +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_tset.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_tset.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/unit_tset.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/unit_tset.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,50 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_tset.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function complex +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/unit_tset.i, line 6) in 'job'' in 'complex' at call 'job' (file tests/wp_typed/unit_tset.i, line 20) +: +Let x_0 = Mint_6[(shiftfield_F_S_size (shift_S (global P_s_79) 0))]. +Assume { + (* Domain *) + Type: (is_sint32 x_0). + (* Heap *) + Have: (linked Malloc_5). + (* Pre-condition (file tests/wp_typed/unit_tset.i, line 16) in 'complex' *) + (* Pre-condition: *) + Have: x_0<=49. +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function complex with behavior default_for_stmt_2 +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/unit_tset.i, line 19) at call 'job' (file tests/wp_typed/unit_tset.i, line 20): +Call Effect at line 20 +Let a_0 = (shift_S (global P_s_79) 0). +Let x_0 = Mint_0[(shiftfield_F_S_size a_0)]. +Assume { + (* Domain *) + Type: (is_sint32 x_0). + (* Goal *) + When: (0 (x_0<=49). + (* Heap *) + Have: (linked Malloc_5). + (* Pre-condition (file tests/wp_typed/unit_tset.i, line 16) in 'complex' *) + (* Pre-condition: *) + Have: x_0<=49. + (* tests/wp_typed/unit_tset.i:20: Call Effects *) + Have: (havoc Mint_0 Mint_5 (shift_sint32 (shiftfield_F_S_value a_0) 1) x_0). +} +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_collect.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_collect.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_collect.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_collect.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,638 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_collect.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function caller +------------------------------------------------------------ + +Goal Post-condition 'K' in 'caller': +Let x_0 = k_3-1. +Let m_0 = p_6[x_0->v_2]. +Let m_1 = m_0[k_3->v_0]. +Assume { + (* Domain *) + Type: (IsArray1_sint32 p_6) /\ (is_sint32 k_3) /\ (is_sint32 v_0) + /\ (is_sint32 v_2) /\ (is_sint32 x1_0) /\ (is_sint32 x2_0) + /\ (is_sint32 x_0) /\ (is_sint32 (1+k_3)) /\ (IsArray1_sint32 m_0) + /\ (IsArray1_sint32 m_1). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 45) in 'caller' *) + (* Pre-condition: *) + Have: (0x1_0]). + (* tests/wp_typed/user_collect.i:53: Call 'job' *) + Have: (EqArray1_int 10 m_1 m_0[k_3->x2_0]). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'P1' in 'caller': +Let x_0 = k_3-1. +Let m_0 = p_6[x_0->v_2]. +Let m_1 = m_0[k_3->v_0]. +Assume { + (* Domain *) + Type: (IsArray1_sint32 p_6) /\ (is_sint32 k_3) /\ (is_sint32 v_0) + /\ (is_sint32 v_2) /\ (is_sint32 x1_0) /\ (is_sint32 x2_0) + /\ (is_sint32 x_0) /\ (is_sint32 (1+k_3)) /\ (IsArray1_sint32 m_0) + /\ (IsArray1_sint32 m_1). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 45) in 'caller' *) + (* Pre-condition: *) + Have: (0x1_0]). + (* tests/wp_typed/user_collect.i:53: Call 'job' *) + Have: (EqArray1_int 10 m_1 m_0[k_3->x2_0]). +} +Prove: v_2=x1_0. + +------------------------------------------------------------ + +Goal Post-condition 'P2' in 'caller': +Let x_0 = k_3-1. +Let m_0 = p_6[x_0->v_2]. +Let m_1 = m_0[k_3->v_0]. +Assume { + (* Domain *) + Type: (IsArray1_sint32 p_6) /\ (is_sint32 k_3) /\ (is_sint32 v_0) + /\ (is_sint32 v_2) /\ (is_sint32 x1_0) /\ (is_sint32 x2_0) + /\ (is_sint32 x_0) /\ (is_sint32 (1+k_3)) /\ (IsArray1_sint32 m_0) + /\ (IsArray1_sint32 m_1). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 45) in 'caller' *) + (* Pre-condition: *) + Have: (0x1_0]). + (* tests/wp_typed/user_collect.i:53: Call 'job' *) + Have: (EqArray1_int 10 m_1 m_0[k_3->x2_0]). +} +Prove: v_0=x2_0. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_collect.i, line 10) in 'job'' in 'caller' at call 'job' (file tests/wp_typed/user_collect.i, line 52) +: +Assume { + (* Domain *) + Type: (is_sint32 k_9) /\ (is_sint32 p_0[k_9]) /\ (is_sint32 p_0[1+k_9]). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 45) in 'caller' *) + (* Pre-condition: *) + Have: (0<=k_9) /\ (k_9<=8). +} +Prove: k_9<=9. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_collect.i, line 10) in 'job'' in 'caller' at call 'job' (file tests/wp_typed/user_collect.i, line 53) +: +Let m_0 = p_9[k_7->v_2]. +Let x_0 = 1+k_7. +Assume { + (* Domain *) + Type: (IsArray1_sint32 p_9) /\ (is_sint32 k_7) /\ (is_sint32 x1_0) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 p_0[k_7]) /\ (is_sint32 x_0) + /\ (is_sint32 p_0[x_0]). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 45) in 'caller' *) + (* Pre-condition: *) + Have: (0<=k_7) /\ (k_7<=8). + (* tests/wp_typed/user_collect.i:52: Call 'job' *) + Have: (k_7<=9) /\ (EqArray1_int 10 m_0 p_9[k_7->x1_0]). +} +Prove: -1<=k_7. + +------------------------------------------------------------ +------------------------------------------------------------ + Function caller2 +------------------------------------------------------------ + +Goal Post-condition 'K' in 'caller2': +Let a_0 = (shift_A10_S (global G_q_69) 0). +Let a_1 = (shift_S a_0 k_3). +Let m_0 = (Array1_S_S a_0 10 Mint_0). +Let m_1 = (Array1_S_S a_0 10 Mint_2). +Let x_0 = k_3-1. +Let a_2 = (shift_S a_0 x_0). +Let m_2 = (Array1_S_S a_0 10 Mint_7). +Assume { + (* Domain *) + Type: (IsS_S s1_0) /\ (IsS_S s2_0) /\ (is_sint32 k_3) /\ (is_sint32 x_0) + /\ (is_sint32 (1+k_3)) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1) + /\ (IsArray1S_S m_2) /\ (IsS_S (Load_S_S a_1 Mint_0)) + /\ (IsS_S (Load_S_S a_2 Mint_0)). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 57) in 'caller2' *) + (* Pre-condition: *) + Have: (0s1_0]). + (* tests/wp_typed/user_collect.i:65: Call Effects *) + Have: (havoc Mint_7 Mint_2 a_2 2). + (* tests/wp_typed/user_collect.i:66: Call 'job2' *) + Have: (EqArray1_S_S 10 m_0 m_1[k_3->s2_0]). + (* tests/wp_typed/user_collect.i:66: Call Effects *) + Have: (havoc Mint_2 Mint_0 a_1 2). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'Q1' in 'caller2': +Let a_0 = (shift_A10_S (global G_q_69) 0). +Let x_0 = k_3-1. +Let a_1 = (shift_S a_0 x_0). +Let a_2 = (Load_S_S a_1 Mint_0). +Let a_3 = (shift_S a_0 k_3). +Let m_0 = (Array1_S_S a_0 10 Mint_0). +Let m_1 = (Array1_S_S a_0 10 Mint_2). +Let m_2 = (Array1_S_S a_0 10 Mint_7). +Assume { + (* Domain *) + Type: (IsS_S s1_0) /\ (IsS_S s2_0) /\ (is_sint32 k_3) /\ (is_sint32 x_0) + /\ (is_sint32 (1+k_3)) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1) + /\ (IsArray1S_S m_2) /\ (IsS_S (Load_S_S a_3 Mint_0)) /\ (IsS_S a_2). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 57) in 'caller2' *) + (* Pre-condition: *) + Have: (0s1_0]). + (* tests/wp_typed/user_collect.i:65: Call Effects *) + Have: (havoc Mint_7 Mint_2 a_1 2). + (* tests/wp_typed/user_collect.i:66: Call 'job2' *) + Have: (EqArray1_S_S 10 m_0 m_1[k_3->s2_0]). + (* tests/wp_typed/user_collect.i:66: Call Effects *) + Have: (havoc Mint_2 Mint_0 a_3 2). +} +Prove: (EqS_S a_2 s1_0). + +------------------------------------------------------------ + +Goal Post-condition 'Q2' in 'caller2': +Let a_0 = (shift_A10_S (global G_q_69) 0). +Let a_1 = (shift_S a_0 k_3). +Let a_2 = (Load_S_S a_1 Mint_0). +Let m_0 = (Array1_S_S a_0 10 Mint_0). +Let m_1 = (Array1_S_S a_0 10 Mint_2). +Let x_0 = k_3-1. +Let a_3 = (shift_S a_0 x_0). +Let m_2 = (Array1_S_S a_0 10 Mint_7). +Assume { + (* Domain *) + Type: (IsS_S s1_0) /\ (IsS_S s2_0) /\ (is_sint32 k_3) /\ (is_sint32 x_0) + /\ (is_sint32 (1+k_3)) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1) + /\ (IsArray1S_S m_2) /\ (IsS_S a_2) /\ (IsS_S (Load_S_S a_3 Mint_0)). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 57) in 'caller2' *) + (* Pre-condition: *) + Have: (0s1_0]). + (* tests/wp_typed/user_collect.i:65: Call Effects *) + Have: (havoc Mint_7 Mint_2 a_3 2). + (* tests/wp_typed/user_collect.i:66: Call 'job2' *) + Have: (EqArray1_S_S 10 m_0 m_1[k_3->s2_0]). + (* tests/wp_typed/user_collect.i:66: Call Effects *) + Have: (havoc Mint_2 Mint_0 a_1 2). +} +Prove: (EqS_S a_2 s2_0). + +------------------------------------------------------------ + +Goal Post-condition 'R' in 'caller2': +Let a_0 = (shift_A10_S (global G_q_69) 0). +Let m_0 = (Array1_S_S a_0 10 Mint_0). +Let m_1 = (Array1_S_S a_0 10 Mint_7). +Let x_0 = k_3-1. +Let m_2 = m_1[x_0->s1_0]. +Let a_1 = (shift_S a_0 k_3). +Let m_3 = (Array1_S_S a_0 10 Mint_2). +Let a_2 = (shift_S a_0 x_0). +Assume { + (* Domain *) + Type: (IsS_S s1_0) /\ (IsS_S s2_0) /\ (is_sint32 k_3) /\ (is_sint32 x_0) + /\ (is_sint32 (1+k_3)) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_3) + /\ (IsArray1S_S m_1) /\ (IsS_S (Load_S_S a_1 Mint_0)) + /\ (IsS_S (Load_S_S a_2 Mint_0)). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 57) in 'caller2' *) + (* Pre-condition: *) + Have: (0s2_0]). + (* tests/wp_typed/user_collect.i:66: Call Effects *) + Have: (havoc Mint_2 Mint_0 a_1 2). +} +Prove: (EqArray1_S_S 10 m_0 m_2[k_3->s2_0]). + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_collect.i, line 21) in 'job2'' in 'caller2' at call 'job2' (file tests/wp_typed/user_collect.i, line 65) +: +Let a_0 = (shift_A10_S (global G_q_69) 0). +Assume { + (* Domain *) + Type: (is_sint32 k_9) /\ (IsS_S (Load_S_S (shift_S a_0 k_9) Mint_0)) + /\ (IsS_S (Load_S_S (shift_S a_0 (1+k_9)) Mint_0)). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 57) in 'caller2' *) + (* Pre-condition: *) + Have: (0<=k_9) /\ (k_9<=8). +} +Prove: k_9<=9. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_collect.i, line 21) in 'job2'' in 'caller2' at call 'job2' (file tests/wp_typed/user_collect.i, line 66) +: +Let a_0 = (shift_A10_S (global G_q_69) 0). +Let a_1 = (shift_S a_0 k_7). +Let m_0 = (Array1_S_S a_0 10 Mint_4). +Let m_1 = (Array1_S_S a_0 10 Mint_7). +Let x_0 = 1+k_7. +Assume { + (* Domain *) + Type: (IsS_S s1_0) /\ (is_sint32 k_7) /\ (is_sint32 x_0) + /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1) + /\ (IsS_S (Load_S_S a_1 Mint_0)) + /\ (IsS_S (Load_S_S (shift_S a_0 x_0) Mint_0)). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 57) in 'caller2' *) + (* Pre-condition: *) + Have: (0<=k_7) /\ (k_7<=8). + (* tests/wp_typed/user_collect.i:65: Call 'job2' *) + Have: (k_7<=9) /\ (EqArray1_S_S 10 m_0 m_1[k_7->s1_0]). + (* tests/wp_typed/user_collect.i:65: Call Effects *) + Have: (havoc Mint_7 Mint_4 a_1 2). +} +Prove: -1<=k_7. + +------------------------------------------------------------ +------------------------------------------------------------ + Function caller3 +------------------------------------------------------------ + +Goal Post-condition 'K' in 'caller3': +Let a_0 = (shift_A10_S (global G_q_69) 0). +Let a_1 = (shift_S a_0 k_3). +Let m_0 = (Array1_S_S a_0 10 Mint_0). +Let m_1 = (Array1_S_S a_0 10 Mint_2). +Let x_0 = k_3-1. +Let a_2 = (shift_S a_0 x_0). +Let m_2 = (Array1_S_S a_0 10 Mint_7). +Assume { + (* Domain *) + Type: (IsS_S s1_0) /\ (IsS_S s2_0) /\ (is_sint32 k_3) /\ (is_sint32 x_0) + /\ (is_sint32 (1+k_3)) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1) + /\ (IsArray1S_S m_2) /\ (IsS_S (Load_S_S a_1 Mint_0)) + /\ (IsS_S (Load_S_S a_2 Mint_0)). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 70) in 'caller3' *) + (* Pre-condition: *) + Have: (0s1_0]). + (* tests/wp_typed/user_collect.i:78: Call Effects *) + Have: (havoc Mint_7 Mint_2 a_2 2). + (* tests/wp_typed/user_collect.i:79: Call 'job3' *) + Have: (EqArray1_S_S 10 m_0 m_1[k_3->s2_0]). + (* tests/wp_typed/user_collect.i:79: Call Effects *) + Have: (havoc Mint_2 Mint_0 a_1 2). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'Q1' in 'caller3': +Let a_0 = (shift_A10_S (global G_q_69) 0). +Let x_0 = k_3-1. +Let a_1 = (shift_S a_0 x_0). +Let a_2 = (Load_S_S a_1 Mint_0). +Let a_3 = (shift_S a_0 k_3). +Let m_0 = (Array1_S_S a_0 10 Mint_0). +Let m_1 = (Array1_S_S a_0 10 Mint_2). +Let m_2 = (Array1_S_S a_0 10 Mint_7). +Assume { + (* Domain *) + Type: (IsS_S s1_0) /\ (IsS_S s2_0) /\ (is_sint32 k_3) /\ (is_sint32 x_0) + /\ (is_sint32 (1+k_3)) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1) + /\ (IsArray1S_S m_2) /\ (IsS_S (Load_S_S a_3 Mint_0)) /\ (IsS_S a_2). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 70) in 'caller3' *) + (* Pre-condition: *) + Have: (0s1_0]). + (* tests/wp_typed/user_collect.i:78: Call Effects *) + Have: (havoc Mint_7 Mint_2 a_1 2). + (* tests/wp_typed/user_collect.i:79: Call 'job3' *) + Have: (EqArray1_S_S 10 m_0 m_1[k_3->s2_0]). + (* tests/wp_typed/user_collect.i:79: Call Effects *) + Have: (havoc Mint_2 Mint_0 a_3 2). +} +Prove: (EqS_S a_2 s1_0). + +------------------------------------------------------------ + +Goal Post-condition 'Q2' in 'caller3': +Let a_0 = (shift_A10_S (global G_q_69) 0). +Let a_1 = (shift_S a_0 k_3). +Let a_2 = (Load_S_S a_1 Mint_0). +Let m_0 = (Array1_S_S a_0 10 Mint_0). +Let m_1 = (Array1_S_S a_0 10 Mint_2). +Let x_0 = k_3-1. +Let a_3 = (shift_S a_0 x_0). +Let m_2 = (Array1_S_S a_0 10 Mint_7). +Assume { + (* Domain *) + Type: (IsS_S s1_0) /\ (IsS_S s2_0) /\ (is_sint32 k_3) /\ (is_sint32 x_0) + /\ (is_sint32 (1+k_3)) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1) + /\ (IsArray1S_S m_2) /\ (IsS_S a_2) /\ (IsS_S (Load_S_S a_3 Mint_0)). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 70) in 'caller3' *) + (* Pre-condition: *) + Have: (0s1_0]). + (* tests/wp_typed/user_collect.i:78: Call Effects *) + Have: (havoc Mint_7 Mint_2 a_3 2). + (* tests/wp_typed/user_collect.i:79: Call 'job3' *) + Have: (EqArray1_S_S 10 m_0 m_1[k_3->s2_0]). + (* tests/wp_typed/user_collect.i:79: Call Effects *) + Have: (havoc Mint_2 Mint_0 a_1 2). +} +Prove: (EqS_S a_2 s2_0). + +------------------------------------------------------------ + +Goal Post-condition 'R' in 'caller3': +Let a_0 = (shift_A10_S (global G_q_69) 0). +Let m_0 = (Array1_S_S a_0 10 Mint_0). +Let m_1 = (Array1_S_S a_0 10 Mint_7). +Let x_0 = k_3-1. +Let m_2 = m_1[x_0->s1_0]. +Let a_1 = (shift_S a_0 k_3). +Let m_3 = (Array1_S_S a_0 10 Mint_2). +Let a_2 = (shift_S a_0 x_0). +Assume { + (* Domain *) + Type: (IsS_S s1_0) /\ (IsS_S s2_0) /\ (is_sint32 k_3) /\ (is_sint32 x_0) + /\ (is_sint32 (1+k_3)) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_3) + /\ (IsArray1S_S m_1) /\ (IsS_S (Load_S_S a_1 Mint_0)) + /\ (IsS_S (Load_S_S a_2 Mint_0)). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 70) in 'caller3' *) + (* Pre-condition: *) + Have: (0s2_0]). + (* tests/wp_typed/user_collect.i:79: Call Effects *) + Have: (havoc Mint_2 Mint_0 a_1 2). +} +Prove: (EqArray1_S_S 10 m_0 m_2[k_3->s2_0]). + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_collect.i, line 32) in 'job3'' in 'caller3' at call 'job3' (file tests/wp_typed/user_collect.i, line 78) +: +Let a_0 = (shift_A10_S (global G_q_69) 0). +Assume { + (* Domain *) + Type: (is_sint32 k_9) /\ (IsS_S (Load_S_S (shift_S a_0 k_9) Mint_0)) + /\ (IsS_S (Load_S_S (shift_S a_0 (1+k_9)) Mint_0)). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 70) in 'caller3' *) + (* Pre-condition: *) + Have: (0<=k_9) /\ (k_9<=8). +} +Prove: k_9<=9. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_collect.i, line 32) in 'job3'' in 'caller3' at call 'job3' (file tests/wp_typed/user_collect.i, line 79) +: +Let a_0 = (shift_A10_S (global G_q_69) 0). +Let a_1 = (shift_S a_0 k_7). +Let m_0 = (Array1_S_S a_0 10 Mint_4). +Let m_1 = (Array1_S_S a_0 10 Mint_7). +Let x_0 = 1+k_7. +Assume { + (* Domain *) + Type: (IsS_S s1_0) /\ (is_sint32 k_7) /\ (is_sint32 x_0) + /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1) + /\ (IsS_S (Load_S_S a_1 Mint_0)) + /\ (IsS_S (Load_S_S (shift_S a_0 x_0) Mint_0)). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 70) in 'caller3' *) + (* Pre-condition: *) + Have: (0<=k_7) /\ (k_7<=8). + (* tests/wp_typed/user_collect.i:78: Call 'job3' *) + Have: (k_7<=9) /\ (EqArray1_S_S 10 m_0 m_1[k_7->s1_0]). + (* tests/wp_typed/user_collect.i:78: Call Effects *) + Have: (havoc Mint_7 Mint_4 a_1 2). +} +Prove: -1<=k_7. + +------------------------------------------------------------ +------------------------------------------------------------ + Function job +------------------------------------------------------------ + +Goal Post-condition 'K' in 'job': +Assume { + (* Domain *) + Type: (is_sint32 k_0) /\ (is_sint32 (1+k_0)). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 10) in 'job' *) + (* Pre-condition: *) + Have: (0<=k_0) /\ (k_0<=9). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'P' in 'job': +Let m_0 = p_1[k_0->x_0]. +Assume { + (* Domain *) + Type: (IsArray1_sint32 p_1) /\ (is_sint32 k_0) /\ (is_sint32 x_0) + /\ (IsArray1_sint32 m_0). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 10) in 'job' *) + (* Pre-condition: *) + Have: (0<=k_0) /\ (k_0<=9). +} +Prove: (EqArray1_int 10 m_0 m_0). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 13) in 'job' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 13) in 'job' (2/3): +Effect at line 17 +Assume { + (* Domain *) + Type: (is_sint32 k_0). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 10) in 'job' *) + (* Pre-condition: *) + Have: (0<=k_0) /\ (k_0<=9). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 13) in 'job' (3/3): +Effect at line 17 +Assume { + (* Domain *) + Type: (is_sint32 tmp_1). + (* Goal *) + When: (0<=tmp_1) /\ (tmp_1<=9). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function job2 +------------------------------------------------------------ + +Goal Post-condition 'K' in 'job2': +Assume { + (* Domain *) + Type: (is_sint32 k_0) /\ (is_sint32 (1+k_0)). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 21) in 'job2' *) + (* Pre-condition: *) + Have: (0<=k_0) /\ (k_0<=9). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'Q' in 'job2': +Let a_0 = (shift_A10_S (global G_q_69) 0). +Let m_0 = (Array1_S_S a_0 10 Mint_0). +Let m_1 = (Array1_S_S a_0 10 Mint_1). +Let a_1 = (shift_S a_0 k_0). +Let a_2 = (Load_S_S a_1 Mint_0). +Assume { + (* Domain *) + Type: (is_sint32 k_0) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1) + /\ (IsS_S a_2). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 21) in 'job2' *) + (* Pre-condition: *) + Have: (0<=k_0) /\ (k_0<=9). + (* tests/wp_typed/user_collect.i:28: Assignment *) + Have: (havoc Mint_1 Mint_0 a_1 2). +} +Prove: (EqArray1_S_S 10 m_0 m_1[k_0->a_2]). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 24) in 'job2' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 24) in 'job2' (2/3): +Effect at line 28 +Assume { + (* Domain *) + Type: (is_sint32 k_0). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 21) in 'job2' *) + (* Pre-condition: *) + Have: (0<=k_0) /\ (k_0<=9). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 24) in 'job2' (3/3): +Effect at line 28 +Assume { + (* Domain *) + Type: (is_sint32 tmp_1). + (* Goal *) + When: (0<=tmp_1) /\ (tmp_1<=9). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function job3 +------------------------------------------------------------ + +Goal Post-condition 'K' in 'job3': +Assume { + (* Domain *) + Type: (is_sint32 k_0) /\ (is_sint32 (1+k_0)). + (* Heap *) + Have: (linked Malloc_2). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 32) in 'job3' *) + (* Pre-condition: *) + Have: (0<=k_0) /\ (k_0<=9). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'Q' in 'job3': +Let a_0 = (shift_A10_S (global G_q_69) 0). +Let a_1 = (shiftfield_F_S_f (shift_S a_0 k_0)). +Let a_2 = (shift_S (global P_s_82) 0). +Let a_3 = (shiftfield_F_S_f a_2). +Let m_0 = (Array1_S_S a_0 10 + Mint_1[(shift_sint32 a_1 0)->Mint_1[(shift_sint32 a_3 0)]] + [(shift_sint32 a_1 1)->Mint_1[(shift_sint32 a_3 1)]]). +Let m_1 = (Array1_S_S a_0 10 Mint_1). +Let a_4 = (Load_S_S a_2 Mint_1). +Assume { + (* Domain *) + Type: (is_sint32 k_0) /\ (IsS_S a_4) /\ (IsArray1S_S m_1) + /\ (IsArray1S_S m_0). + (* Heap *) + Have: (linked Malloc_2). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 32) in 'job3' *) + (* Pre-condition: *) + Have: (0<=k_0) /\ (k_0<=9). +} +Prove: (EqArray1_S_S 10 m_0 m_1[k_0->a_4]). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 35) in 'job3' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 35) in 'job3' (2/3): +Effect at line 39 +Assume { + (* Domain *) + Type: (is_sint32 k_0). + (* Goal *) + When: (0<=k_0) /\ (k_0<=9). + (* Heap *) + Have: (linked Malloc_2). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 35) in 'job3' (3/3): +Effect at line 40 +Assume { + (* Domain *) + Type: (is_sint32 k_0). + (* Goal *) + When: (0<=k_0) /\ (k_0<=9). + (* Heap *) + Have: (linked Malloc_2). +} +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_collect.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_collect.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_collect.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_collect.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,528 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_collect.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function caller +------------------------------------------------------------ + +Goal Post-condition 'K' in 'caller': +Let x_0 = k_3-1. +Let m_0 = p_6[x_0->v_2]. +Let m_1 = m_0[k_3->v_0]. +Assume { + (* Domain *) + Type: (IsArray1_sint32 p_6) /\ (is_sint32 k_3) /\ (is_sint32 v_0) + /\ (is_sint32 v_2) /\ (is_sint32 x1_0) /\ (is_sint32 x2_0) + /\ (is_sint32 x_0) /\ (is_sint32 (1+k_3)) /\ (IsArray1_sint32 m_0) + /\ (IsArray1_sint32 m_1). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 45) in 'caller' *) + (* Pre-condition: *) + Have: (0x1_0]). + (* tests/wp_typed/user_collect.i:53: Call 'job' *) + Have: (EqArray1_int 10 m_1 m_0[k_3->x2_0]). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'P1' in 'caller': +Let x_0 = k_3-1. +Let m_0 = p_6[x_0->v_2]. +Let m_1 = m_0[k_3->v_0]. +Assume { + (* Domain *) + Type: (IsArray1_sint32 p_6) /\ (is_sint32 k_3) /\ (is_sint32 v_0) + /\ (is_sint32 v_2) /\ (is_sint32 x1_0) /\ (is_sint32 x2_0) + /\ (is_sint32 x_0) /\ (is_sint32 (1+k_3)) /\ (IsArray1_sint32 m_0) + /\ (IsArray1_sint32 m_1). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 45) in 'caller' *) + (* Pre-condition: *) + Have: (0x1_0]). + (* tests/wp_typed/user_collect.i:53: Call 'job' *) + Have: (EqArray1_int 10 m_1 m_0[k_3->x2_0]). +} +Prove: v_2=x1_0. + +------------------------------------------------------------ + +Goal Post-condition 'P2' in 'caller': +Let x_0 = k_3-1. +Let m_0 = p_6[x_0->v_2]. +Let m_1 = m_0[k_3->v_0]. +Assume { + (* Domain *) + Type: (IsArray1_sint32 p_6) /\ (is_sint32 k_3) /\ (is_sint32 v_0) + /\ (is_sint32 v_2) /\ (is_sint32 x1_0) /\ (is_sint32 x2_0) + /\ (is_sint32 x_0) /\ (is_sint32 (1+k_3)) /\ (IsArray1_sint32 m_0) + /\ (IsArray1_sint32 m_1). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 45) in 'caller' *) + (* Pre-condition: *) + Have: (0x1_0]). + (* tests/wp_typed/user_collect.i:53: Call 'job' *) + Have: (EqArray1_int 10 m_1 m_0[k_3->x2_0]). +} +Prove: v_0=x2_0. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_collect.i, line 10) in 'job'' in 'caller' at call 'job' (file tests/wp_typed/user_collect.i, line 52) +: +Assume { + (* Domain *) + Type: (is_sint32 k_9) /\ (is_sint32 p_0[k_9]) /\ (is_sint32 p_0[1+k_9]). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 45) in 'caller' *) + (* Pre-condition: *) + Have: (0<=k_9) /\ (k_9<=8). +} +Prove: k_9<=9. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_collect.i, line 10) in 'job'' in 'caller' at call 'job' (file tests/wp_typed/user_collect.i, line 53) +: +Let m_0 = p_9[k_7->v_2]. +Let x_0 = 1+k_7. +Assume { + (* Domain *) + Type: (IsArray1_sint32 p_9) /\ (is_sint32 k_7) /\ (is_sint32 x1_0) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 p_0[k_7]) /\ (is_sint32 x_0) + /\ (is_sint32 p_0[x_0]). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 45) in 'caller' *) + (* Pre-condition: *) + Have: (0<=k_7) /\ (k_7<=8). + (* tests/wp_typed/user_collect.i:52: Call 'job' *) + Have: (k_7<=9) /\ (EqArray1_int 10 m_0 p_9[k_7->x1_0]). +} +Prove: -1<=k_7. + +------------------------------------------------------------ +------------------------------------------------------------ + Function caller2 +------------------------------------------------------------ + +Goal Post-condition 'K' in 'caller2': +Let x_0 = k_3-1. +Let m_0 = q_7[x_0->v_2]. +Let m_1 = m_0[k_3->v_0]. +Assume { + (* Domain *) + Type: (IsArray1S_S q_7) /\ (IsS_S s1_0) /\ (IsS_S s2_0) /\ (IsS_S v_0) + /\ (IsS_S v_2) /\ (is_sint32 k_3) /\ (is_sint32 x_0) + /\ (is_sint32 (1+k_3)) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 57) in 'caller2' *) + (* Pre-condition: *) + Have: (0s1_0]). + (* tests/wp_typed/user_collect.i:66: Call 'job2' *) + Have: (EqArray1_S_S 10 m_1 m_0[k_3->s2_0]). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'Q1' in 'caller2': +Let x_0 = k_3-1. +Let m_0 = q_7[x_0->v_2]. +Let m_1 = m_0[k_3->v_0]. +Assume { + (* Domain *) + Type: (IsArray1S_S q_7) /\ (IsS_S s1_0) /\ (IsS_S s2_0) /\ (IsS_S v_0) + /\ (IsS_S v_2) /\ (is_sint32 k_3) /\ (is_sint32 x_0) + /\ (is_sint32 (1+k_3)) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 57) in 'caller2' *) + (* Pre-condition: *) + Have: (0s1_0]). + (* tests/wp_typed/user_collect.i:66: Call 'job2' *) + Have: (EqArray1_S_S 10 m_1 m_0[k_3->s2_0]). +} +Prove: (EqS_S v_2 s1_0). + +------------------------------------------------------------ + +Goal Post-condition 'Q2' in 'caller2': +Let x_0 = k_3-1. +Let m_0 = q_7[x_0->v_2]. +Let m_1 = m_0[k_3->v_0]. +Assume { + (* Domain *) + Type: (IsArray1S_S q_7) /\ (IsS_S s1_0) /\ (IsS_S s2_0) /\ (IsS_S v_0) + /\ (IsS_S v_2) /\ (is_sint32 k_3) /\ (is_sint32 x_0) + /\ (is_sint32 (1+k_3)) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 57) in 'caller2' *) + (* Pre-condition: *) + Have: (0s1_0]). + (* tests/wp_typed/user_collect.i:66: Call 'job2' *) + Have: (EqArray1_S_S 10 m_1 m_0[k_3->s2_0]). +} +Prove: (EqS_S v_0 s2_0). + +------------------------------------------------------------ + +Goal Post-condition 'R' in 'caller2': +Let x_0 = k_3-1. +Let m_0 = q_7[x_0->v_2]. +Let m_1 = m_0[k_3->v_0]. +Let m_2 = q_7[x_0->s1_0]. +Assume { + (* Domain *) + Type: (IsArray1S_S q_7) /\ (IsS_S s1_0) /\ (IsS_S s2_0) /\ (IsS_S v_0) + /\ (IsS_S v_2) /\ (is_sint32 k_3) /\ (is_sint32 x_0) + /\ (is_sint32 (1+k_3)) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 57) in 'caller2' *) + (* Pre-condition: *) + Have: (0s2_0]). +} +Prove: (EqArray1_S_S 10 m_1 m_2[k_3->s2_0]). + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_collect.i, line 21) in 'job2'' in 'caller2' at call 'job2' (file tests/wp_typed/user_collect.i, line 65) +: +Assume { + (* Domain *) + Type: (is_sint32 k_9) /\ (IsS_S q_0[k_9]) /\ (IsS_S q_0[1+k_9]). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 57) in 'caller2' *) + (* Pre-condition: *) + Have: (0<=k_9) /\ (k_9<=8). +} +Prove: k_9<=9. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_collect.i, line 21) in 'job2'' in 'caller2' at call 'job2' (file tests/wp_typed/user_collect.i, line 66) +: +Let m_0 = q_10[k_7->v_2]. +Let x_0 = 1+k_7. +Assume { + (* Domain *) + Type: (IsArray1S_S q_10) /\ (IsS_S s1_0) /\ (is_sint32 k_7) + /\ (IsArray1S_S m_0) /\ (IsS_S q_0[k_7]) /\ (is_sint32 x_0) + /\ (IsS_S q_0[x_0]). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 57) in 'caller2' *) + (* Pre-condition: *) + Have: (0<=k_7) /\ (k_7<=8). + (* tests/wp_typed/user_collect.i:65: Call 'job2' *) + Have: (k_7<=9) /\ (EqArray1_S_S 10 m_0 q_10[k_7->s1_0]). +} +Prove: -1<=k_7. + +------------------------------------------------------------ +------------------------------------------------------------ + Function caller3 +------------------------------------------------------------ + +Goal Post-condition 'K' in 'caller3': +Let x_0 = k_3-1. +Let m_0 = q_7[x_0->v_2]. +Let m_1 = m_0[k_3->v_0]. +Assume { + (* Domain *) + Type: (IsArray1S_S q_7) /\ (IsS_S s1_0) /\ (IsS_S s2_0) /\ (IsS_S v_0) + /\ (IsS_S v_2) /\ (is_sint32 k_3) /\ (is_sint32 x_0) + /\ (is_sint32 (1+k_3)) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 70) in 'caller3' *) + (* Pre-condition: *) + Have: (0s1_0]). + (* tests/wp_typed/user_collect.i:79: Call 'job3' *) + Have: (EqArray1_S_S 10 m_1 m_0[k_3->s2_0]). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'Q1' in 'caller3': +Let x_0 = k_3-1. +Let m_0 = q_7[x_0->v_2]. +Let m_1 = m_0[k_3->v_0]. +Assume { + (* Domain *) + Type: (IsArray1S_S q_7) /\ (IsS_S s1_0) /\ (IsS_S s2_0) /\ (IsS_S v_0) + /\ (IsS_S v_2) /\ (is_sint32 k_3) /\ (is_sint32 x_0) + /\ (is_sint32 (1+k_3)) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 70) in 'caller3' *) + (* Pre-condition: *) + Have: (0s1_0]). + (* tests/wp_typed/user_collect.i:79: Call 'job3' *) + Have: (EqArray1_S_S 10 m_1 m_0[k_3->s2_0]). +} +Prove: (EqS_S v_2 s1_0). + +------------------------------------------------------------ + +Goal Post-condition 'Q2' in 'caller3': +Let x_0 = k_3-1. +Let m_0 = q_7[x_0->v_2]. +Let m_1 = m_0[k_3->v_0]. +Assume { + (* Domain *) + Type: (IsArray1S_S q_7) /\ (IsS_S s1_0) /\ (IsS_S s2_0) /\ (IsS_S v_0) + /\ (IsS_S v_2) /\ (is_sint32 k_3) /\ (is_sint32 x_0) + /\ (is_sint32 (1+k_3)) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 70) in 'caller3' *) + (* Pre-condition: *) + Have: (0s1_0]). + (* tests/wp_typed/user_collect.i:79: Call 'job3' *) + Have: (EqArray1_S_S 10 m_1 m_0[k_3->s2_0]). +} +Prove: (EqS_S v_0 s2_0). + +------------------------------------------------------------ + +Goal Post-condition 'R' in 'caller3': +Let x_0 = k_3-1. +Let m_0 = q_7[x_0->v_2]. +Let m_1 = m_0[k_3->v_0]. +Let m_2 = q_7[x_0->s1_0]. +Assume { + (* Domain *) + Type: (IsArray1S_S q_7) /\ (IsS_S s1_0) /\ (IsS_S s2_0) /\ (IsS_S v_0) + /\ (IsS_S v_2) /\ (is_sint32 k_3) /\ (is_sint32 x_0) + /\ (is_sint32 (1+k_3)) /\ (IsArray1S_S m_0) /\ (IsArray1S_S m_1). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 70) in 'caller3' *) + (* Pre-condition: *) + Have: (0s2_0]). +} +Prove: (EqArray1_S_S 10 m_1 m_2[k_3->s2_0]). + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_collect.i, line 32) in 'job3'' in 'caller3' at call 'job3' (file tests/wp_typed/user_collect.i, line 78) +: +Assume { + (* Domain *) + Type: (is_sint32 k_9) /\ (IsS_S q_0[k_9]) /\ (IsS_S q_0[1+k_9]). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 70) in 'caller3' *) + (* Pre-condition: *) + Have: (0<=k_9) /\ (k_9<=8). +} +Prove: k_9<=9. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_collect.i, line 32) in 'job3'' in 'caller3' at call 'job3' (file tests/wp_typed/user_collect.i, line 79) +: +Let m_0 = q_10[k_7->v_2]. +Let x_0 = 1+k_7. +Assume { + (* Domain *) + Type: (IsArray1S_S q_10) /\ (IsS_S s1_0) /\ (is_sint32 k_7) + /\ (IsArray1S_S m_0) /\ (IsS_S q_0[k_7]) /\ (is_sint32 x_0) + /\ (IsS_S q_0[x_0]). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 70) in 'caller3' *) + (* Pre-condition: *) + Have: (0<=k_7) /\ (k_7<=8). + (* tests/wp_typed/user_collect.i:78: Call 'job3' *) + Have: (k_7<=9) /\ (EqArray1_S_S 10 m_0 q_10[k_7->s1_0]). +} +Prove: -1<=k_7. + +------------------------------------------------------------ +------------------------------------------------------------ + Function job +------------------------------------------------------------ + +Goal Post-condition 'K' in 'job': +Assume { + (* Domain *) + Type: (is_sint32 k_0) /\ (is_sint32 (1+k_0)). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 10) in 'job' *) + (* Pre-condition: *) + Have: (0<=k_0) /\ (k_0<=9). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'P' in 'job': +Let m_0 = p_1[k_0->x_0]. +Assume { + (* Domain *) + Type: (IsArray1_sint32 p_1) /\ (is_sint32 k_0) /\ (is_sint32 x_0) + /\ (IsArray1_sint32 m_0). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 10) in 'job' *) + (* Pre-condition: *) + Have: (0<=k_0) /\ (k_0<=9). +} +Prove: (EqArray1_int 10 m_0 m_0). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 13) in 'job' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 13) in 'job' (2/3): +Effect at line 17 +Assume { + (* Domain *) + Type: (is_sint32 k_0). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 10) in 'job' *) + (* Pre-condition: *) + Have: (0<=k_0) /\ (k_0<=9). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 13) in 'job' (3/3): +Effect at line 17 +Assume { + (* Domain *) + Type: (is_sint32 tmp_1). + (* Goal *) + When: (0<=tmp_1) /\ (tmp_1<=9). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function job2 +------------------------------------------------------------ + +Goal Post-condition 'K' in 'job2': +Assume { + (* Domain *) + Type: (is_sint32 k_0) /\ (is_sint32 (1+k_0)). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 21) in 'job2' *) + (* Pre-condition: *) + Have: (0<=k_0) /\ (k_0<=9). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'Q' in 'job2': +Let m_0 = q_1[k_0->s_0]. +Assume { + (* Domain *) + Type: (IsArray1S_S q_1) /\ (IsS_S s_0) /\ (is_sint32 k_0) + /\ (IsArray1S_S m_0). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 21) in 'job2' *) + (* Pre-condition: *) + Have: (0<=k_0) /\ (k_0<=9). +} +Prove: (EqArray1_S_S 10 m_0 m_0). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 24) in 'job2' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 24) in 'job2' (2/3): +Effect at line 28 +Assume { + (* Domain *) + Type: (is_sint32 k_0). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 21) in 'job2' *) + (* Pre-condition: *) + Have: (0<=k_0) /\ (k_0<=9). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 24) in 'job2' (3/3): +Effect at line 28 +Assume { + (* Domain *) + Type: (is_sint32 tmp_1). + (* Goal *) + When: (0<=tmp_1) /\ (tmp_1<=9). +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function job3 +------------------------------------------------------------ + +Goal Post-condition 'K' in 'job3': +Assume { + (* Domain *) + Type: (is_sint32 k_0) /\ (is_sint32 (1+k_0)). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 32) in 'job3' *) + (* Pre-condition: *) + Have: (0<=k_0) /\ (k_0<=9). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'Q' in 'job3': +Let a_0 = s_0.F_S_f. +Let m_0 = q_1[k_0->{ F_S_f = q_1[k_0].F_S_f[0->a_0[0]][1->a_0[1]] }]. +Assume { + (* Domain *) + Type: (IsArray1S_S q_1) /\ (IsS_S s_0) /\ (is_sint32 k_0) + /\ (IsArray1S_S m_0). + (* Pre-condition (file tests/wp_typed/user_collect.i, line 32) in 'job3' *) + (* Pre-condition: *) + Have: (0<=k_0) /\ (k_0<=9). +} +Prove: (EqArray1_S_S 10 m_0 q_1[k_0->s_0]). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 35) in 'job3' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 35) in 'job3' (2/3): +Effect at line 39 +Assume { + (* Domain *) + Type: (is_sint32 k_0). + (* Goal *) + When: (0<=k_0) /\ (k_0<=9). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_collect.i, line 35) in 'job3' (3/3): +Effect at line 40 +Assume { + (* Domain *) + Type: (is_sint32 k_0). + (* Goal *) + When: (0<=k_0) /\ (k_0<=9). +} +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_init.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_init.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_init.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_init.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,246 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_init.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function init +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_typed/user_init.i, line 3) in 'init': +Let a_0 = (shift_sint32 a_2 0). +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 n_0). + (* Goal *) + When: (i_4 (0<=i_0) -> (is_sint32 i_0) + -> (v_1=Mint_2[(shift_sint32 a_2 i_0)]). + (* Invariant 'Range' (file tests/wp_typed/user_init.i, line 8) *) + (* tests/wp_typed/user_init.i:12: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_typed/user_init.i:12: Else *) + Have: n_0<=i_2. +} +Prove: v_1=Mint_2[(shift_sint32 a_2 i_4)]. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Partial' (file tests/wp_typed/user_init.i, line 9): +Let a_1 = (shift_sint32 a_0 0). +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 n_0) /\ (is_sint32 (1+i_2)). + (* Goal *) + When: (0<=i_1) /\ (i_1<=i_2) /\ (is_sint32 i_1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0). + (* Pre-condition (file tests/wp_typed/user_init.i, line 1) in 'init' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_1 n_0). + (* Pre-condition (file tests/wp_typed/user_init.i, line 2) in 'init' *) + (* Pre-condition: *) + Have: 0<=n_0. + (* tests/wp_typed/user_init.i:12: Assigns *) + (* tests/wp_typed/user_init.i:12: Loop assigns ...: *) + Have: (havoc Mint_4 Mint_1 a_1 n_0). + (* Invariant 'Partial' (file tests/wp_typed/user_init.i, line 9) *) + (* tests/wp_typed/user_init.i:12: Invariant 'Partial': *) + Have: forall i_0:int. + (i_0 (0<=i_0) -> (is_sint32 i_0) + -> (v_0=Mint_1[(shift_sint32 a_0 i_0)]). + (* Invariant 'Range' (file tests/wp_typed/user_init.i, line 8) *) + (* tests/wp_typed/user_init.i:12: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_typed/user_init.i:12: Then *) + Have: i_2v_0][(shift_sint32 a_0 i_1)]. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Partial' (file tests/wp_typed/user_init.i, line 9): +Assume { (* Goal *) When: false. } +Prove: v_0=Mint_4[(shift_sint32 a_0 i_6)]. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Range' (file tests/wp_typed/user_init.i, line 8): +Let a_1 = (shift_sint32 a_0 0). +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 n_0) /\ (is_sint32 (1+i_2)). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0). + (* Pre-condition (file tests/wp_typed/user_init.i, line 1) in 'init' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_1 n_0). + (* Pre-condition (file tests/wp_typed/user_init.i, line 2) in 'init' *) + (* Pre-condition: *) + Have: 0<=n_0. + (* tests/wp_typed/user_init.i:12: Assigns *) + (* tests/wp_typed/user_init.i:12: Loop assigns ...: *) + Have: (havoc Mint_4 Mint_3 a_1 n_0). + (* Invariant 'Partial' (file tests/wp_typed/user_init.i, line 9) *) + (* tests/wp_typed/user_init.i:12: Invariant 'Partial': *) + Have: forall i_0:int. + (i_0 (0<=i_0) -> (is_sint32 i_0) + -> (v_0=Mint_3[(shift_sint32 a_0 i_0)]). + (* Invariant 'Range' (file tests/wp_typed/user_init.i, line 8) *) + (* tests/wp_typed/user_init.i:12: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_typed/user_init.i:12: Then *) + Have: i_2 (0<=i_0) -> (is_sint32 i_0) + -> (v_0=Mint_3[(shift_sint32 a_0 i_0)]). + (* Invariant 'Range' (file tests/wp_typed/user_init.i, line 8) *) + (* tests/wp_typed/user_init.i:12: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_typed/user_init.i:12: Then *) + Have: i_2 (0<=i_0) -> (is_sint32 i_0) + -> (v_0=Mint_3[(shift_sint32 a_0 i_0)]). + (* Invariant 'Range' (file tests/wp_typed/user_init.i, line 8) *) + (* tests/wp_typed/user_init.i:12: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_typed/user_init.i:12: Then *) + Have: i_2 (included a_1 n_0 a_1 n_0). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_init.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_init.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_init.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_init.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,245 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_init.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function init +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_typed/user_init.i, line 3) in 'init': +Let a_0 = (shift_sint32 a_2 0). +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 n_0). + (* Goal *) + When: (i_4 (0<=i_0) -> (is_sint32 i_0) + -> (v_1=Mint_2[(shift_sint32 a_2 i_0)]). + (* Invariant 'Range' (file tests/wp_typed/user_init.i, line 8) *) + (* tests/wp_typed/user_init.i:12: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_typed/user_init.i:12: Else *) + Have: n_0<=i_2. +} +Prove: v_1=Mint_2[(shift_sint32 a_2 i_4)]. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Partial' (file tests/wp_typed/user_init.i, line 9): +Let a_1 = (shift_sint32 a_0 0). +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 n_0) /\ (is_sint32 (1+i_2)). + (* Goal *) + When: (0<=i_1) /\ (i_1<=i_2) /\ (is_sint32 i_1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0). + (* Pre-condition (file tests/wp_typed/user_init.i, line 1) in 'init' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_1 n_0). + (* Pre-condition (file tests/wp_typed/user_init.i, line 2) in 'init' *) + (* Pre-condition: *) + Have: 0<=n_0. + (* tests/wp_typed/user_init.i:12: Assigns *) + (* tests/wp_typed/user_init.i:12: Loop assigns ...: *) + Have: (havoc Mint_4 Mint_1 a_1 n_0). + (* Invariant 'Partial' (file tests/wp_typed/user_init.i, line 9) *) + (* tests/wp_typed/user_init.i:12: Invariant 'Partial': *) + Have: forall i_0:int. + (i_0 (0<=i_0) -> (is_sint32 i_0) + -> (v_0=Mint_1[(shift_sint32 a_0 i_0)]). + (* Invariant 'Range' (file tests/wp_typed/user_init.i, line 8) *) + (* tests/wp_typed/user_init.i:12: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_typed/user_init.i:12: Then *) + Have: i_2v_0][(shift_sint32 a_0 i_1)]. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Partial' (file tests/wp_typed/user_init.i, line 9): +Assume { (* Goal *) When: false. } +Prove: v_0=Mint_4[(shift_sint32 a_0 i_6)]. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Range' (file tests/wp_typed/user_init.i, line 8): +Let a_1 = (shift_sint32 a_0 0). +Assume { + (* Domain *) + Type: (is_sint32 i_2) /\ (is_sint32 n_0) /\ (is_sint32 (1+i_2)). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0). + (* Pre-condition (file tests/wp_typed/user_init.i, line 1) in 'init' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_1 n_0). + (* Pre-condition (file tests/wp_typed/user_init.i, line 2) in 'init' *) + (* Pre-condition: *) + Have: 0<=n_0. + (* tests/wp_typed/user_init.i:12: Assigns *) + (* tests/wp_typed/user_init.i:12: Loop assigns ...: *) + Have: (havoc Mint_4 Mint_3 a_1 n_0). + (* Invariant 'Partial' (file tests/wp_typed/user_init.i, line 9) *) + (* tests/wp_typed/user_init.i:12: Invariant 'Partial': *) + Have: forall i_0:int. + (i_0 (0<=i_0) -> (is_sint32 i_0) + -> (v_0=Mint_3[(shift_sint32 a_0 i_0)]). + (* Invariant 'Range' (file tests/wp_typed/user_init.i, line 8) *) + (* tests/wp_typed/user_init.i:12: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_typed/user_init.i:12: Then *) + Have: i_2 (0<=i_0) -> (is_sint32 i_0) + -> (v_0=Mint_3[(shift_sint32 a_0 i_0)]). + (* Invariant 'Range' (file tests/wp_typed/user_init.i, line 8) *) + (* tests/wp_typed/user_init.i:12: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_typed/user_init.i:12: Then *) + Have: i_2 (0<=i_0) -> (is_sint32 i_0) + -> (v_0=Mint_3[(shift_sint32 a_0 i_0)]). + (* Invariant 'Range' (file tests/wp_typed/user_init.i, line 8) *) + (* tests/wp_typed/user_init.i:12: Invariant 'Range': *) + Have: (0<=i_2) /\ (i_2<=n_0). + (* tests/wp_typed/user_init.i:12: Then *) + Have: i_2 (included a_1 n_0 a_1 n_0). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_injector.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_injector.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_injector.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_injector.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,270 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_injector.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +tests/wp_typed/user_injector.i:61:[wp] warning: Validity of unsized array not implemented yet (considered valid). +tests/wp_typed/user_injector.i:60:[wp] warning: Validity of unsized array not implemented yet (considered valid). +------------------------------------------------------------ + Function job +------------------------------------------------------------ + +Goal Post-condition 'SEQ' in 'job': +Let x_0 = service_cpt_4-1. +Let x_1 = service_result_0[x_0]. +Let m_0 = service_id_6[x_0->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 job_0) /\ (is_sint32 service_cpt_4) + /\ (is_sint32 service_result_0[service_cpt_4]) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_0) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* tests/wp_typed/user_injector.i:66: Conditional *) + If: 0!=x_1 + Then { + (* tests/wp_typed/user_injector.i:66: Conditional *) + If: 0!=service_result_0[service_cpt_4] + Then { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 1=job_0. + } + Else { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 0=job_0. + } + } + Else { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 0=job_0. } +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'ID1' in 'job': +Let x_0 = service_result_0[service_cpt_1]. +Let m_0 = service_id_6[service_cpt_1->a_0]. +Let x_1 = 1+service_cpt_1. +Assume { + (* Domain *) + Type: (is_sint32 job_0) /\ (is_sint32 service_cpt_1) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_0) + /\ (is_sint32 (service_cpt_1-1)) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0[x_1->b_0]) + /\ (is_sint32 service_result_0[x_1]). + (* tests/wp_typed/user_injector.i:66: Conditional *) + If: 0!=x_0 + Then { + (* tests/wp_typed/user_injector.i:66: Conditional *) + If: 0!=service_result_0[x_1] + Then { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 1=job_0. + } + Else { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 0=job_0. + } + } + Else { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 0=job_0. } +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'ID2' in 'job': +Let x_0 = service_result_0[service_cpt_1]. +Let m_0 = service_id_6[service_cpt_1->a_0]. +Let x_1 = 1+service_cpt_1. +Assume { + (* Domain *) + Type: (is_sint32 job_0) /\ (is_sint32 service_cpt_1) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_0) + /\ (is_sint32 (service_cpt_1-1)) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0[x_1->b_0]) + /\ (is_sint32 service_result_0[x_1]). + (* tests/wp_typed/user_injector.i:66: Conditional *) + If: 0!=x_0 + Then { + (* tests/wp_typed/user_injector.i:66: Conditional *) + If: 0!=service_result_0[x_1] + Then { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 1=job_0. + } + Else { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 0=job_0. + } + } + Else { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 0=job_0. } +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'R1' in 'job': +Let x_0 = service_result_0[service_cpt_4]. +Let x_1 = service_cpt_4-1. +Let x_2 = service_result_0[x_1]. +Let m_0 = service_id_6[x_1->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 service_cpt_4) /\ (is_sint32 x_0) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_2) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* tests/wp_typed/user_injector.i:66: Conditional *) + Have: 0!=x_2. + (* tests/wp_typed/user_injector.i:66: Conditional *) + Have: 0!=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'R2' in 'job': +Let x_0 = service_result_0[service_cpt_4]. +Let x_1 = service_cpt_4-1. +Let x_2 = service_result_0[x_1]. +Let m_0 = service_id_6[x_1->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 service_cpt_4) /\ (is_sint32 x_0) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_2) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* tests/wp_typed/user_injector.i:66: Conditional *) + Have: 0!=x_2. + (* tests/wp_typed/user_injector.i:66: Conditional *) + Have: 0!=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'R0' in 'job': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'E1' in 'job': +Let x_0 = service_cpt_4-1. +Let x_1 = service_result_0[x_0]. +Let m_0 = service_id_6[x_0->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 service_cpt_4) + /\ (is_sint32 service_result_0[service_cpt_4]) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_0) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* Goal *) + When: 0=x_1. +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'E2' in 'job': +Let x_0 = service_result_0[service_cpt_4]. +Let x_1 = service_cpt_4-1. +Let x_2 = service_result_0[x_1]. +Let m_0 = service_id_6[x_1->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 service_cpt_4) /\ (is_sint32 x_0) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_2) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* Goal *) + When: (0=x_0) /\ (0!=x_2). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (2/2): +Call Result at line 60 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (1/6): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (2/6): +Call Result at line 60 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (3/6): +Call Result at line 61 +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (4/6): +Effect at line 66 +Let x_0 = service_result_0[service_cpt_4]. +Let x_1 = service_cpt_4-1. +Let x_2 = service_result_0[x_1]. +Let m_0 = service_id_6[x_1->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 service_cpt_4) /\ (is_sint32 x_0) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_2) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* tests/wp_typed/user_injector.i:66: Then *) + Have: 0!=x_2. + (* tests/wp_typed/user_injector.i:66: Then *) + Have: 0!=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (5/6): +Effect at line 66 +Let x_0 = service_cpt_4-1. +Let x_1 = service_result_0[x_0]. +Let x_2 = service_result_0[service_cpt_4]. +Let m_0 = service_id_6[x_0->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 service_cpt_4) /\ (is_sint32 x_2) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_0) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* tests/wp_typed/user_injector.i:61: Call 'service' *) + Have: 0=x_2. + (* tests/wp_typed/user_injector.i:66: Then *) + Have: 0!=x_1. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (6/6): +Effect at line 66 +Let x_0 = service_cpt_4-1. +Let x_1 = service_result_0[x_0]. +Let m_0 = service_id_6[x_0->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 service_cpt_4) + /\ (is_sint32 service_result_0[service_cpt_4]) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_0) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* tests/wp_typed/user_injector.i:60: Call 'service' *) + Have: 0=x_1. +} +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_injector.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_injector.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_injector.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_injector.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,368 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_injector.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_typed/user_injector.i:61:[wp] warning: Validity of unsized array not implemented yet (considered valid). +tests/wp_typed/user_injector.i:60:[wp] warning: Validity of unsized array not implemented yet (considered valid). +------------------------------------------------------------ + Function job +------------------------------------------------------------ + +Goal Post-condition 'SEQ' in 'job': +Let x_0 = service_cpt_4-1. +Let x_1 = service_result_0[x_0]. +Let m_0 = service_id_6[x_0->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 job_0) /\ (is_sint32 service_cpt_4) + /\ (is_sint32 service_result_0[service_cpt_4]) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_0) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base error_5))<=0). + (* tests/wp_typed/user_injector.i:66: Conditional *) + If: 0!=x_1 + Then { + (* tests/wp_typed/user_injector.i:66: Conditional *) + If: 0!=service_result_0[service_cpt_4] + Then { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 1=job_0. + } + Else { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 0=job_0. + } + } + Else { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 0=job_0. } +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'ID1' in 'job': +Let x_0 = service_result_0[service_cpt_1]. +Let m_0 = service_id_6[service_cpt_1->a_0]. +Let x_1 = 1+service_cpt_1. +Assume { + (* Domain *) + Type: (is_sint32 job_0) /\ (is_sint32 service_cpt_1) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_0) + /\ (is_sint32 (service_cpt_1-1)) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0[x_1->b_0]) + /\ (is_sint32 service_result_0[x_1]). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base error_5))<=0). + (* tests/wp_typed/user_injector.i:66: Conditional *) + If: 0!=x_0 + Then { + (* tests/wp_typed/user_injector.i:66: Conditional *) + If: 0!=service_result_0[x_1] + Then { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 1=job_0. + } + Else { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 0=job_0. + } + } + Else { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 0=job_0. } +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'ID2' in 'job': +Let x_0 = service_result_0[service_cpt_1]. +Let m_0 = service_id_6[service_cpt_1->a_0]. +Let x_1 = 1+service_cpt_1. +Assume { + (* Domain *) + Type: (is_sint32 job_0) /\ (is_sint32 service_cpt_1) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_0) + /\ (is_sint32 (service_cpt_1-1)) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0[x_1->b_0]) + /\ (is_sint32 service_result_0[x_1]). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base error_5))<=0). + (* tests/wp_typed/user_injector.i:66: Conditional *) + If: 0!=x_0 + Then { + (* tests/wp_typed/user_injector.i:66: Conditional *) + If: 0!=service_result_0[x_1] + Then { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 1=job_0. + } + Else { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 0=job_0. + } + } + Else { (* tests/wp_typed/user_injector.i:66: Assignment *) Have: 0=job_0. } +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'R1' in 'job': +Let x_0 = service_result_0[service_cpt_4]. +Let x_1 = service_cpt_4-1. +Let x_2 = service_result_0[x_1]. +Let m_0 = service_id_6[x_1->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 service_cpt_4) /\ (is_sint32 x_0) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_2) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base error_5))<=0). + (* tests/wp_typed/user_injector.i:66: Conditional *) + Have: 0!=x_2. + (* tests/wp_typed/user_injector.i:66: Conditional *) + Have: 0!=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'R2' in 'job': +Let x_0 = service_result_0[service_cpt_4]. +Let x_1 = service_cpt_4-1. +Let x_2 = service_result_0[x_1]. +Let m_0 = service_id_6[x_1->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 service_cpt_4) /\ (is_sint32 x_0) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_2) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base error_5))<=0). + (* tests/wp_typed/user_injector.i:66: Conditional *) + Have: 0!=x_2. + (* tests/wp_typed/user_injector.i:66: Conditional *) + Have: 0!=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'R0' in 'job': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'E1' in 'job': +Let x_0 = service_cpt_4-1. +Let x_1 = service_result_0[x_0]. +Let m_0 = service_id_6[x_0->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 service_cpt_4) + /\ (is_sint32 service_result_0[service_cpt_4]) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_0) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* Goal *) + When: 0=x_1. + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base error_0))<=0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'E2' in 'job': +Let x_0 = service_result_0[service_cpt_4]. +Let x_1 = service_cpt_4-1. +Let x_2 = service_result_0[x_1]. +Let m_0 = service_id_6[x_1->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 service_cpt_4) /\ (is_sint32 x_0) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_2) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* Goal *) + When: (0=x_0) /\ (0!=x_2). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base error_0))<=0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (1/3): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (2/3): +Effect at line 58 +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[error_0]). + (* Goal *) + When: (valid_rd Malloc_0 error_0 1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base error_0))<=0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (3/3): +Call Result at line 60 +Assume { (* Heap *) Have: (linked Malloc_0) /\ ((region (base error_5))<=0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (1/9): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (2/9): +Effect at line 58 +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[error_0]). + (* Goal *) + When: (valid_rd Malloc_0 error_0 1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base error_0))<=0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (3/9): +Call Result at line 60 +Assume { (* Heap *) Have: (linked Malloc_0) /\ ((region (base error_5))<=0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (4/9): +Call Result at line 61 +Assume { (* Heap *) Have: (linked Malloc_0) /\ ((region (base error_5))<=0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (5/9): +Effect at line 63 +Let x_0 = service_cpt_4-1. +Let x_1 = service_result_0[x_0]. +Let m_0 = service_id_6[x_0->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 service_cpt_4) /\ (is_sint32 Mint_0[error_2]) + /\ (is_sint32 service_result_0[service_cpt_4]) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_0) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* Goal *) + When: (valid_rd Malloc_0 error_2 1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base error_2))<=0). + (* tests/wp_typed/user_injector.i:60: Call 'service' *) + Have: 0=x_1. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (6/9): +Effect at line 64 +Let x_0 = service_cpt_4-1. +Let x_1 = service_result_0[x_0]. +Let x_2 = service_result_0[service_cpt_4]. +Let m_0 = service_id_6[x_0->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 service_cpt_4) /\ (is_sint32 Mint_0[error_4]) + /\ (is_sint32 x_2) /\ (is_sint32 (service_cpt_4-2)) + /\ (is_sint32 x_0) /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* Goal *) + When: (valid_rd Malloc_0 error_4 1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base error_4))<=0). + (* tests/wp_typed/user_injector.i:61: Call 'service' *) + Have: 0=x_2. + (* tests/wp_typed/user_injector.i:63: Else *) + Have: 0!=x_1. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (7/9): +Effect at line 66 +Let x_0 = service_result_0[service_cpt_4]. +Let x_1 = service_cpt_4-1. +Let x_2 = service_result_0[x_1]. +Let m_0 = service_id_6[x_1->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 service_cpt_4) /\ (is_sint32 x_0) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_2) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base error_5))<=0). + (* tests/wp_typed/user_injector.i:66: Then *) + Have: 0!=x_2. + (* tests/wp_typed/user_injector.i:66: Then *) + Have: 0!=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (8/9): +Effect at line 66 +Let x_0 = service_cpt_4-1. +Let x_1 = service_result_0[x_0]. +Let x_2 = service_result_0[service_cpt_4]. +Let m_0 = service_id_6[x_0->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 service_cpt_4) /\ (is_sint32 x_2) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_0) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base error_5))<=0). + (* tests/wp_typed/user_injector.i:61: Call 'service' *) + Have: 0=x_2. + (* tests/wp_typed/user_injector.i:66: Then *) + Have: 0!=x_1. +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'A' in 'job' (9/9): +Effect at line 66 +Let x_0 = service_cpt_4-1. +Let x_1 = service_result_0[x_0]. +Let m_0 = service_id_6[x_0->a_0]. +Assume { + (* Domain *) + Type: (is_sint32 service_cpt_4) + /\ (is_sint32 service_result_0[service_cpt_4]) + /\ (is_sint32 (service_cpt_4-2)) /\ (is_sint32 x_0) + /\ (IsArray1_sint32 m_0) /\ (is_sint32 x_1) + /\ (IsArray1_sint32 m_0[service_cpt_4->b_0]). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base error_5))<=0). + (* tests/wp_typed/user_injector.i:60: Call 'service' *) + Have: 0=x_1. +} +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_rec.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_rec.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_rec.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_rec.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,269 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_rec.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Global +------------------------------------------------------------ + +Lemma fact_ge1: +Prove: 0<(L_fact n_0) + +------------------------------------------------------------ + +Lemma fact_next: +Assume: 'fact_ge1' +Prove: let x_0 = (L_fact m_0) in + (0 (n_0<=m_0) + -> ((n_0*(x_0 div (L_fact n_0)))=(x_0 div (L_fact (n_0-1)))) + +------------------------------------------------------------ +------------------------------------------------------------ + Function F1 +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_typed/user_rec.i, line 6) in 'F1': +Assume { + (* Domain *) + Type: (is_sint32 F1_0) /\ (is_sint32 i_1) /\ (is_sint32 i_2) + /\ (is_sint32 n_0). + (* tests/wp_typed/user_rec.i:9: Conditional *) + If: n_0<=1 + Then { (* tests/wp_typed/user_rec.i:9: Assignment *) Have: 1=F1_0. } + Else { + (* Invariant (file tests/wp_typed/user_rec.i, line 13) *) + (* tests/wp_typed/user_rec.i:16: Invariant: *) + Have: F1_0=(L_fact (i_1-1)). + (* Invariant (file tests/wp_typed/user_rec.i, line 12) *) + (* tests/wp_typed/user_rec.i:16: Invariant: *) + Have: (2<=i_1) /\ (i_1<=(1+n_0)). + (* tests/wp_typed/user_rec.i:16: Else *) + Have: n_0 (n_0<=m_0) + -> ((n_0*(x_0 div (L_fact n_0)))=(x_0 div (L_fact (n_0-1)))) + +------------------------------------------------------------ +------------------------------------------------------------ + Function F1 +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_typed/user_rec.i, line 6) in 'F1': +Assume { + (* Domain *) + Type: (is_sint32 F1_0) /\ (is_sint32 i_1) /\ (is_sint32 i_2) + /\ (is_sint32 n_0). + (* tests/wp_typed/user_rec.i:9: Conditional *) + If: n_0<=1 + Then { (* tests/wp_typed/user_rec.i:9: Assignment *) Have: 1=F1_0. } + Else { + (* Invariant (file tests/wp_typed/user_rec.i, line 13) *) + (* tests/wp_typed/user_rec.i:16: Invariant: *) + Have: F1_0=(L_fact (i_1-1)). + (* Invariant (file tests/wp_typed/user_rec.i, line 12) *) + (* tests/wp_typed/user_rec.i:16: Invariant: *) + Have: (2<=i_1) /\ (i_1<=(1+n_0)). + (* tests/wp_typed/user_rec.i:16: Else *) + Have: n_0 ((i_0+x_1) (0!=Mchar_1[(shift_sint8 s_3 i_0)]). + (* Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29) *) + (* tests/wp_typed/user_string.i:34: Invariant 'RANGE': *) + Have: (addr_le s_3 ss_3) + /\ (addr_le ss_3 (shift_sint8 s_3 (L_Length Mchar_1 s_3))). + (* Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28) *) + (* tests/wp_typed/user_string.i:34: Invariant 'BASE': *) + Have: x_4=(base ss_3). + (* tests/wp_typed/user_string.i:34: Else *) + Have: 0=x_3. + (* Assertion 'END' (file tests/wp_typed/user_string.i, line 37) *) + (* tests/wp_typed/user_string.i:37: Assertion 'END': *) + Have: (P_Length_of_str_is Malloc_0 Mchar_1 s_3 x_2). +} +Prove: exists i_0:int. + (P_Length_of_str_is Malloc_0 Mchar_1 s_3 i_0) /\ (x_0=(i_0+x_1)). + +------------------------------------------------------------ + +Goal Preservation of Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28): +Let x_0 = Mchar_3[ss_2]. +Let x_1 = (base s_0). +Assume { + (* Domain *) + Type: (is_sint8 x_0). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_3) /\ ((region x_1)<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_3 s_0 i_0). + (* Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30) *) + (* tests/wp_typed/user_string.i:34: Invariant 'ZERO': *) + Have: forall i_0:int. + (0<=i_0) -> ((i_0+(offset s_0))<(offset ss_2)) + -> (0!=Mchar_3[(shift_sint8 s_0 i_0)]). + (* Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29) *) + (* tests/wp_typed/user_string.i:34: Invariant 'RANGE': *) + Have: (addr_le s_0 ss_2) + /\ (addr_le ss_2 (shift_sint8 s_0 (L_Length Mchar_3 s_0))). + (* Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28) *) + (* tests/wp_typed/user_string.i:34: Invariant 'BASE': *) + Have: x_1=(base ss_2). + (* tests/wp_typed/user_string.i:34: Then *) + Have: 0!=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28): +Assume { + (* Domain *) + Type: (is_sint8 Mchar_3[ss_4]). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_3) /\ ((region (base s_4))<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_3 s_4 i_0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29): +Let a_0 = (shift_sint8 ss_2 1). +Let a_1 = (shift_sint8 s_0 (L_Length Mchar_0 s_0)). +Let x_0 = Mchar_0[ss_2]. +Let x_1 = (base s_0). +Assume { + (* Domain *) + Type: (is_sint8 x_0). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0) /\ ((region x_1)<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_0 s_0 i_0). + (* Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30) *) + (* tests/wp_typed/user_string.i:34: Invariant 'ZERO': *) + Have: forall i_0:int. + (0<=i_0) -> ((i_0+(offset s_0))<(offset ss_2)) + -> (0!=Mchar_0[(shift_sint8 s_0 i_0)]). + (* Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29) *) + (* tests/wp_typed/user_string.i:34: Invariant 'RANGE': *) + Have: (addr_le s_0 ss_2) /\ (addr_le ss_2 a_1). + (* Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28) *) + (* tests/wp_typed/user_string.i:34: Invariant 'BASE': *) + Have: x_1=(base ss_2). + (* tests/wp_typed/user_string.i:34: Then *) + Have: 0!=x_0. +} +Prove: (addr_le s_0 a_0) /\ (addr_le a_0 a_1). + +------------------------------------------------------------ + +Goal Establishment of Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29): +Assume { + (* Domain *) + Type: (is_sint8 Mchar_3[ss_4]). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_3) /\ ((region (base s_4))<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_3 s_4 i_0). +} +Prove: (addr_le s_4 s_4) + /\ (addr_le s_4 (shift_sint8 s_4 (L_Length Mchar_3 s_4))). + +------------------------------------------------------------ + +Goal Preservation of Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30): +Let x_0 = Mchar_0[ss_2]. +Let x_1 = (base s_0). +Let x_2 = (offset s_0). +Let x_3 = (offset ss_2). +Assume { + (* Domain *) + Type: (is_sint8 x_0). + (* Goal *) + When: (0<=i_1) /\ ((i_1+x_2)<=x_3). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0) /\ ((region x_1)<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_0 s_0 i_0). + (* Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30) *) + (* tests/wp_typed/user_string.i:34: Invariant 'ZERO': *) + Have: forall i_0:int. + (0<=i_0) -> ((i_0+x_2) (0!=Mchar_0[(shift_sint8 s_0 i_0)]). + (* Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29) *) + (* tests/wp_typed/user_string.i:34: Invariant 'RANGE': *) + Have: (addr_le s_0 ss_2) + /\ (addr_le ss_2 (shift_sint8 s_0 (L_Length Mchar_0 s_0))). + (* Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28) *) + (* tests/wp_typed/user_string.i:34: Invariant 'BASE': *) + Have: x_1=(base ss_2). + (* tests/wp_typed/user_string.i:34: Then *) + Have: 0!=x_0. +} +Prove: 0!=Mchar_0[(shift_sint8 s_0 i_1)]. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30): +Assume { (* Goal *) When: false. } +Prove: 0!=Mchar_3[(shift_sint8 s_4 i_5)]. + +------------------------------------------------------------ + +Goal Assertion 'END' (file tests/wp_typed/user_string.i, line 37): +Let x_0 = (offset ss_3). +Let x_1 = (offset s_3). +Let x_2 = Mchar_2[ss_3]. +Let x_3 = (base s_3). +Assume { + (* Domain *) + Type: (is_sint8 x_2). + (* Heap *) + Have: (linked Malloc_1) /\ (sconst Mchar_2) /\ ((region x_3)<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_1 Mchar_2 s_3 i_0). + (* Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30) *) + (* tests/wp_typed/user_string.i:34: Invariant 'ZERO': *) + Have: forall i_0:int. + (0<=i_0) -> ((i_0+x_1) (0!=Mchar_2[(shift_sint8 s_3 i_0)]). + (* Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29) *) + (* tests/wp_typed/user_string.i:34: Invariant 'RANGE': *) + Have: (addr_le s_3 ss_3) + /\ (addr_le ss_3 (shift_sint8 s_3 (L_Length Mchar_2 s_3))). + (* Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28) *) + (* tests/wp_typed/user_string.i:34: Invariant 'BASE': *) + Have: x_3=(base ss_3). + (* tests/wp_typed/user_string.i:34: Else *) + Have: 0=x_2. +} +Prove: (P_Length_of_str_is Malloc_1 Mchar_2 s_3 (x_0-x_1)). + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_string.i, line 31): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'strlen' (1/3): +Effect at line 26 +Assume { + (* Domain *) + Type: (is_sint8 Mchar_3[ss_4]). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_3) /\ ((region (base s_2))<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_3 s_2 i_0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'strlen' (2/3): +Effect at line 34 +Assume { + (* Domain *) + Type: (is_sint8 Mchar_3[ss_4]). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_3) /\ ((region (base s_2))<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_3 s_2 i_0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'strlen' (3/3): +Effect at line 38 +Let x_0 = (offset ss_3). +Let x_1 = (offset s_3). +Let x_2 = Mchar_1[ss_3]. +Let x_3 = (base s_3). +Assume { + (* Domain *) + Type: (is_sint8 x_2). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_1) /\ ((region x_3)<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_1 s_3 i_0). + (* Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30) *) + (* tests/wp_typed/user_string.i:34: Invariant 'ZERO': *) + Have: forall i_0:int. + (0<=i_0) -> ((i_0+x_1) (0!=Mchar_1[(shift_sint8 s_3 i_0)]). + (* Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29) *) + (* tests/wp_typed/user_string.i:34: Invariant 'RANGE': *) + Have: (addr_le s_3 ss_3) + /\ (addr_le ss_3 (shift_sint8 s_3 (L_Length Mchar_1 s_3))). + (* Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28) *) + (* tests/wp_typed/user_string.i:34: Invariant 'BASE': *) + Have: x_3=(base ss_3). + (* tests/wp_typed/user_string.i:34: Else *) + Have: 0=x_2. + (* Assertion 'END' (file tests/wp_typed/user_string.i, line 37) *) + (* tests/wp_typed/user_string.i:37: Assertion 'END': *) + Have: (P_Length_of_str_is Malloc_0 Mchar_1 s_3 (x_0-x_1)). +} +Prove: true. + +------------------------------------------------------------ + +Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_string.i, line 34): +Let x_0 = Mchar_0[ss_2]. +Let x_1 = (base s_0). +Assume { + (* Domain *) + Type: (is_sint8 x_0). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0) /\ ((region x_1)<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_0 s_0 i_0). + (* Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30) *) + (* tests/wp_typed/user_string.i:34: Invariant 'ZERO': *) + Have: forall i_0:int. + (0<=i_0) -> ((i_0+(offset s_0))<(offset ss_2)) + -> (0!=Mchar_0[(shift_sint8 s_0 i_0)]). + (* Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29) *) + (* tests/wp_typed/user_string.i:34: Invariant 'RANGE': *) + Have: (addr_le s_0 ss_2) + /\ (addr_le ss_2 (shift_sint8 s_0 (L_Length Mchar_0 s_0))). + (* Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28) *) + (* tests/wp_typed/user_string.i:34: Invariant 'BASE': *) + Have: x_1=(base ss_2). + (* tests/wp_typed/user_string.i:34: Then *) + Have: 0!=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Positivity of Loop variant at loop (file tests/wp_typed/user_string.i, line 34): +Let x_0 = (offset ss_1). +Let x_1 = (offset s_1). +Let x_2 = (L_Length Mchar_0 s_1). +Let x_3 = Mchar_0[ss_1]. +Let x_4 = (base s_1). +Assume { + (* Domain *) + Type: (is_sint8 x_3). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0) /\ ((region x_4)<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_0 s_1 i_0). + (* Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30) *) + (* tests/wp_typed/user_string.i:34: Invariant 'ZERO': *) + Have: forall i_0:int. + (0<=i_0) -> ((i_0+x_1) (0!=Mchar_0[(shift_sint8 s_1 i_0)]). + (* Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29) *) + (* tests/wp_typed/user_string.i:34: Invariant 'RANGE': *) + Have: (addr_le s_1 ss_1) /\ (addr_le ss_1 (shift_sint8 s_1 x_2)). + (* Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28) *) + (* tests/wp_typed/user_string.i:34: Invariant 'BASE': *) + Have: x_4=(base ss_1). + (* tests/wp_typed/user_string.i:34: Then *) + Have: 0!=x_3. +} +Prove: x_0<=(x_1+x_2). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_string.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_string.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_string.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_string.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,338 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_string.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function strlen +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_typed/user_string.i, line 23) in 'strlen': +Let x_0 = (offset ss_3). +Let x_1 = (offset s_3). +Let x_2 = x_0-x_1. +Let x_3 = Mchar_1[ss_3]. +Let x_4 = (base s_3). +Assume { + (* Domain *) + Type: (is_sint8 x_3) /\ (is_sint32 x_2). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_1) /\ ((region x_4)<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_1 s_3 i_0). + (* Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30) *) + (* tests/wp_typed/user_string.i:34: Invariant 'ZERO': *) + Have: forall i_0:int. + (0<=i_0) -> ((i_0+x_1) (0!=Mchar_1[(shift_sint8 s_3 i_0)]). + (* Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29) *) + (* tests/wp_typed/user_string.i:34: Invariant 'RANGE': *) + Have: (addr_le s_3 ss_3) + /\ (addr_le ss_3 (shift_sint8 s_3 (L_Length Mchar_1 s_3))). + (* Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28) *) + (* tests/wp_typed/user_string.i:34: Invariant 'BASE': *) + Have: x_4=(base ss_3). + (* tests/wp_typed/user_string.i:34: Else *) + Have: 0=x_3. + (* Assertion 'END' (file tests/wp_typed/user_string.i, line 37) *) + (* tests/wp_typed/user_string.i:37: Assertion 'END': *) + Have: (P_Length_of_str_is Malloc_0 Mchar_1 s_3 x_2). +} +Prove: exists i_0:int. + (P_Length_of_str_is Malloc_0 Mchar_1 s_3 i_0) /\ (x_0=(i_0+x_1)). + +------------------------------------------------------------ + +Goal Preservation of Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28): +Let x_0 = Mchar_3[ss_2]. +Let x_1 = (base s_0). +Assume { + (* Domain *) + Type: (is_sint8 x_0). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_3) /\ ((region x_1)<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_3 s_0 i_0). + (* Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30) *) + (* tests/wp_typed/user_string.i:34: Invariant 'ZERO': *) + Have: forall i_0:int. + (0<=i_0) -> ((i_0+(offset s_0))<(offset ss_2)) + -> (0!=Mchar_3[(shift_sint8 s_0 i_0)]). + (* Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29) *) + (* tests/wp_typed/user_string.i:34: Invariant 'RANGE': *) + Have: (addr_le s_0 ss_2) + /\ (addr_le ss_2 (shift_sint8 s_0 (L_Length Mchar_3 s_0))). + (* Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28) *) + (* tests/wp_typed/user_string.i:34: Invariant 'BASE': *) + Have: x_1=(base ss_2). + (* tests/wp_typed/user_string.i:34: Then *) + Have: 0!=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28): +Assume { + (* Domain *) + Type: (is_sint8 Mchar_3[ss_4]). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_3) /\ ((region (base s_4))<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_3 s_4 i_0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29): +Let a_0 = (shift_sint8 ss_2 1). +Let a_1 = (shift_sint8 s_0 (L_Length Mchar_0 s_0)). +Let x_0 = Mchar_0[ss_2]. +Let x_1 = (base s_0). +Assume { + (* Domain *) + Type: (is_sint8 x_0). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0) /\ ((region x_1)<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_0 s_0 i_0). + (* Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30) *) + (* tests/wp_typed/user_string.i:34: Invariant 'ZERO': *) + Have: forall i_0:int. + (0<=i_0) -> ((i_0+(offset s_0))<(offset ss_2)) + -> (0!=Mchar_0[(shift_sint8 s_0 i_0)]). + (* Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29) *) + (* tests/wp_typed/user_string.i:34: Invariant 'RANGE': *) + Have: (addr_le s_0 ss_2) /\ (addr_le ss_2 a_1). + (* Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28) *) + (* tests/wp_typed/user_string.i:34: Invariant 'BASE': *) + Have: x_1=(base ss_2). + (* tests/wp_typed/user_string.i:34: Then *) + Have: 0!=x_0. +} +Prove: (addr_le s_0 a_0) /\ (addr_le a_0 a_1). + +------------------------------------------------------------ + +Goal Establishment of Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29): +Assume { + (* Domain *) + Type: (is_sint8 Mchar_3[ss_4]). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_3) /\ ((region (base s_4))<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_3 s_4 i_0). +} +Prove: (addr_le s_4 s_4) + /\ (addr_le s_4 (shift_sint8 s_4 (L_Length Mchar_3 s_4))). + +------------------------------------------------------------ + +Goal Preservation of Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30): +Let x_0 = Mchar_0[ss_2]. +Let x_1 = (base s_0). +Let x_2 = (offset s_0). +Let x_3 = (offset ss_2). +Assume { + (* Domain *) + Type: (is_sint8 x_0). + (* Goal *) + When: (0<=i_1) /\ ((i_1+x_2)<=x_3). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0) /\ ((region x_1)<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_0 s_0 i_0). + (* Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30) *) + (* tests/wp_typed/user_string.i:34: Invariant 'ZERO': *) + Have: forall i_0:int. + (0<=i_0) -> ((i_0+x_2) (0!=Mchar_0[(shift_sint8 s_0 i_0)]). + (* Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29) *) + (* tests/wp_typed/user_string.i:34: Invariant 'RANGE': *) + Have: (addr_le s_0 ss_2) + /\ (addr_le ss_2 (shift_sint8 s_0 (L_Length Mchar_0 s_0))). + (* Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28) *) + (* tests/wp_typed/user_string.i:34: Invariant 'BASE': *) + Have: x_1=(base ss_2). + (* tests/wp_typed/user_string.i:34: Then *) + Have: 0!=x_0. +} +Prove: 0!=Mchar_0[(shift_sint8 s_0 i_1)]. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30): +Assume { (* Goal *) When: false. } +Prove: 0!=Mchar_3[(shift_sint8 s_4 i_5)]. + +------------------------------------------------------------ + +Goal Assertion 'END' (file tests/wp_typed/user_string.i, line 37): +Let x_0 = (offset ss_3). +Let x_1 = (offset s_3). +Let x_2 = Mchar_2[ss_3]. +Let x_3 = (base s_3). +Assume { + (* Domain *) + Type: (is_sint8 x_2). + (* Heap *) + Have: (linked Malloc_1) /\ (sconst Mchar_2) /\ ((region x_3)<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_1 Mchar_2 s_3 i_0). + (* Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30) *) + (* tests/wp_typed/user_string.i:34: Invariant 'ZERO': *) + Have: forall i_0:int. + (0<=i_0) -> ((i_0+x_1) (0!=Mchar_2[(shift_sint8 s_3 i_0)]). + (* Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29) *) + (* tests/wp_typed/user_string.i:34: Invariant 'RANGE': *) + Have: (addr_le s_3 ss_3) + /\ (addr_le ss_3 (shift_sint8 s_3 (L_Length Mchar_2 s_3))). + (* Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28) *) + (* tests/wp_typed/user_string.i:34: Invariant 'BASE': *) + Have: x_3=(base ss_3). + (* tests/wp_typed/user_string.i:34: Else *) + Have: 0=x_2. +} +Prove: (P_Length_of_str_is Malloc_1 Mchar_2 s_3 (x_0-x_1)). + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_string.i, line 31): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'strlen' (1/3): +Effect at line 26 +Assume { + (* Domain *) + Type: (is_sint8 Mchar_3[ss_4]). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_3) /\ ((region (base s_2))<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_3 s_2 i_0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'strlen' (2/3): +Effect at line 34 +Assume { + (* Domain *) + Type: (is_sint8 Mchar_3[ss_4]). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_3) /\ ((region (base s_2))<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_3 s_2 i_0). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns nothing in 'strlen' (3/3): +Effect at line 38 +Let x_0 = (offset ss_3). +Let x_1 = (offset s_3). +Let x_2 = Mchar_1[ss_3]. +Let x_3 = (base s_3). +Assume { + (* Domain *) + Type: (is_sint8 x_2). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_1) /\ ((region x_3)<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_1 s_3 i_0). + (* Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30) *) + (* tests/wp_typed/user_string.i:34: Invariant 'ZERO': *) + Have: forall i_0:int. + (0<=i_0) -> ((i_0+x_1) (0!=Mchar_1[(shift_sint8 s_3 i_0)]). + (* Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29) *) + (* tests/wp_typed/user_string.i:34: Invariant 'RANGE': *) + Have: (addr_le s_3 ss_3) + /\ (addr_le ss_3 (shift_sint8 s_3 (L_Length Mchar_1 s_3))). + (* Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28) *) + (* tests/wp_typed/user_string.i:34: Invariant 'BASE': *) + Have: x_3=(base ss_3). + (* tests/wp_typed/user_string.i:34: Else *) + Have: 0=x_2. + (* Assertion 'END' (file tests/wp_typed/user_string.i, line 37) *) + (* tests/wp_typed/user_string.i:37: Assertion 'END': *) + Have: (P_Length_of_str_is Malloc_0 Mchar_1 s_3 (x_0-x_1)). +} +Prove: true. + +------------------------------------------------------------ + +Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_string.i, line 34): +Let x_0 = Mchar_0[ss_2]. +Let x_1 = (base s_0). +Assume { + (* Domain *) + Type: (is_sint8 x_0). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0) /\ ((region x_1)<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_0 s_0 i_0). + (* Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30) *) + (* tests/wp_typed/user_string.i:34: Invariant 'ZERO': *) + Have: forall i_0:int. + (0<=i_0) -> ((i_0+(offset s_0))<(offset ss_2)) + -> (0!=Mchar_0[(shift_sint8 s_0 i_0)]). + (* Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29) *) + (* tests/wp_typed/user_string.i:34: Invariant 'RANGE': *) + Have: (addr_le s_0 ss_2) + /\ (addr_le ss_2 (shift_sint8 s_0 (L_Length Mchar_0 s_0))). + (* Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28) *) + (* tests/wp_typed/user_string.i:34: Invariant 'BASE': *) + Have: x_1=(base ss_2). + (* tests/wp_typed/user_string.i:34: Then *) + Have: 0!=x_0. +} +Prove: true. + +------------------------------------------------------------ + +Goal Positivity of Loop variant at loop (file tests/wp_typed/user_string.i, line 34): +Let x_0 = (offset ss_1). +Let x_1 = (offset s_1). +Let x_2 = (L_Length Mchar_0 s_1). +Let x_3 = Mchar_0[ss_1]. +Let x_4 = (base s_1). +Assume { + (* Domain *) + Type: (is_sint8 x_3). + (* Heap *) + Have: (linked Malloc_0) /\ (sconst Mchar_0) /\ ((region x_4)<=0). + (* Pre-condition (file tests/wp_typed/user_string.i, line 21) in 'strlen' *) + (* Pre-condition: *) + Have: exists i_0:int. (P_Length_of_str_is Malloc_0 Mchar_0 s_1 i_0). + (* Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30) *) + (* tests/wp_typed/user_string.i:34: Invariant 'ZERO': *) + Have: forall i_0:int. + (0<=i_0) -> ((i_0+x_1) (0!=Mchar_0[(shift_sint8 s_1 i_0)]). + (* Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29) *) + (* tests/wp_typed/user_string.i:34: Invariant 'RANGE': *) + Have: (addr_le s_1 ss_1) /\ (addr_le ss_1 (shift_sint8 s_1 x_2)). + (* Invariant 'BASE' (file tests/wp_typed/user_string.i, line 28) *) + (* tests/wp_typed/user_string.i:34: Invariant 'BASE': *) + Have: x_4=(base ss_1). + (* tests/wp_typed/user_string.i:34: Then *) + Have: 0!=x_3. +} +Prove: x_0<=(x_1+x_2). + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_swap.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_swap.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_swap.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_swap.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,69 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_swap.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +------------------------------------------------------------ + Function main +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/user_swap.i, line 25): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_swap.i, line 6) in 'swap'' in 'main' at call 'swap' (file tests/wp_typed/user_swap.i, line 24) +: +Assume { + (* Domain *) + Type: (is_sint32 a_5) /\ (is_sint32 b_7). + (* tests/wp_typed/user_swap.i:24: Then *) + Have: b_7<=a_5. +} +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_swap.i, line 7) in 'swap'' in 'main' at call 'swap' (file tests/wp_typed/user_swap.i, line 24) +: +Assume { + (* Domain *) + Type: (is_sint32 a_5) /\ (is_sint32 b_7). + (* tests/wp_typed/user_swap.i:24: Then *) + Have: b_7<=a_5. +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function swap +------------------------------------------------------------ + +Goal Post-condition 'A' in 'swap': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Post-condition 'B' in 'swap': +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'E' in 'swap' (1/2): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'E' in 'swap' (2/2): +Effect at line 15 +Assume { } +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_swap.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_swap.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle/user_swap.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle/user_swap.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,157 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_swap.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +------------------------------------------------------------ + Function main +------------------------------------------------------------ + +Goal Assertion (file tests/wp_typed/user_swap.i, line 25): +Assume { } +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_swap.i, line 6) in 'swap'' in 'main' at call 'swap' (file tests/wp_typed/user_swap.i, line 24) +: +Let x_0 = Mint_7[(shift_sint32 (global P_b_78) 0)]. +Let x_1 = Mint_7[(shift_sint32 (global P_a_77) 0)]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0). + (* Heap *) + Have: (linked Malloc_6). + (* tests/wp_typed/user_swap.i:24: Then *) + Have: x_0<=x_1. +} +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_swap.i, line 7) in 'swap'' in 'main' at call 'swap' (file tests/wp_typed/user_swap.i, line 24) +: +Let x_0 = Mint_7[(shift_sint32 (global P_b_78) 0)]. +Let x_1 = Mint_7[(shift_sint32 (global P_a_77) 0)]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0). + (* Heap *) + Have: (linked Malloc_6). + (* tests/wp_typed/user_swap.i:24: Then *) + Have: x_0<=x_1. +} +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function swap +------------------------------------------------------------ + +Goal Post-condition 'A' in 'swap': +Let x_0 = Mint_0[b_0]. +Let x_1 = Mint_0[a_0]. +Let x_2 = Mint_0[a_0->x_0][b_0->x_1][a_0]. +Assume { + (* Domain *) + Type: (is_sint32 x_1) /\ (is_sint32 x_0) /\ (is_sint32 x_2). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_typed/user_swap.i, line 6) in 'swap' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_0 1). + (* Pre-condition (file tests/wp_typed/user_swap.i, line 7) in 'swap' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 b_0 1). +} +Prove: x_0=x_2. + +------------------------------------------------------------ + +Goal Post-condition 'B' in 'swap': +Let x_0 = Mint_0[a_0]. +Let x_1 = Mint_0[b_0]. +Assume { + (* Domain *) + Type: (is_sint32 x_0) /\ (is_sint32 x_1) + /\ (is_sint32 Mint_0[a_0->x_1][b_0->x_0][a_0]). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_typed/user_swap.i, line 6) in 'swap' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_0 1). + (* Pre-condition (file tests/wp_typed/user_swap.i, line 7) in 'swap' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 b_0 1). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'E' in 'swap' (1/3): +Effect at line 15 +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[a_0]) /\ (is_sint32 Mint_0[b_0]) + /\ (is_sint32 Mint_1[a_0]) /\ (is_sint32 Mint_1[b_0]). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_typed/user_swap.i, line 6) in 'swap' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_0 1). + (* Pre-condition (file tests/wp_typed/user_swap.i, line 7) in 'swap' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 b_0 1). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'E' in 'swap' (2/3): +Effect at line 16 +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[a_0]) /\ (is_sint32 Mint_0[b_0]) + /\ (is_sint32 Mint_1[a_0]) /\ (is_sint32 Mint_1[b_0]). + (* Goal *) + When: (valid_rd Malloc_0 a_0 1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_typed/user_swap.i, line 6) in 'swap' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_0 1). + (* Pre-condition (file tests/wp_typed/user_swap.i, line 7) in 'swap' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 b_0 1). +} +Prove: true. + +------------------------------------------------------------ + +Goal Assigns 'E' in 'swap' (3/3): +Effect at line 17 +Assume { + (* Domain *) + Type: (is_sint32 Mint_0[a_0]) /\ (is_sint32 Mint_0[b_0]) + /\ (is_sint32 Mint_1[a_0]) /\ (is_sint32 Mint_1[b_0]). + (* Goal *) + When: (valid_rd Malloc_0 b_0 1). + (* Heap *) + Have: (linked Malloc_0) /\ ((region (base a_0))<=0) + /\ ((region (base b_0))<=0). + (* Pre-condition (file tests/wp_typed/user_swap.i, line 6) in 'swap' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 a_0 1). + (* Pre-condition (file tests/wp_typed/user_swap.i, line 7) in 'swap' *) + (* Pre-condition: *) + Have: (valid_rw Malloc_0 b_0 1). +} +Prove: true. + +------------------------------------------------------------ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/shift_lemma.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/shift_lemma.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/shift_lemma.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/shift_lemma.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,20 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/shift_lemma.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 5 goals scheduled +[wp] [Alt-Ergo] Goal typed_f_assert : Valid +[wp] [Alt-Ergo] Goal typed_f_assert_2 : Valid +[wp] [Alt-Ergo] Goal typed_f_assert_3 : Valid +[wp] [Alt-Ergo] Goal typed_f_assert_4 : Valid +[wp] [Alt-Ergo] Goal typed_f_assert_5 : Valid +[wp] Proved goals: 5 / 5 + Qed: 0 + Alt-Ergo: 5 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f - 5 (47) 5 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_alloc.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_alloc.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_alloc.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_alloc.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_alloc.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 7 goals scheduled +[wp] [Qed] Goal typed_ref_f_assign : Valid +[wp] [Qed] Goal typed_ref_g_assign : Valid +[wp] [Alt-Ergo] Goal typed_ref_h_post : Valid +[wp] [Qed] Goal typed_ref_job_assert : Valid +[wp] [Alt-Ergo] Goal typed_ref_job_assert_2 : Valid +[wp] [Qed] Goal typed_ref_job_assert_3 : Valid +[wp] [Alt-Ergo] Goal typed_ref_job_assert_4 : Valid +[wp] Proved goals: 7 / 7 + Qed: 4 + Alt-Ergo: 3 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +job 2 2 (28) 4 100% +f 1 - 1 100% +g 1 - 1 100% +h - 1 (17) 1 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_alloc.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_alloc.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_alloc.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_alloc.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,25 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_alloc.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 7 goals scheduled +[wp] [Qed] Goal typed_f_assign : Valid +[wp] [Qed] Goal typed_g_assign : Valid +[wp] [Alt-Ergo] Goal typed_h_post : Valid +[wp] [Qed] Goal typed_job_assert : Valid +[wp] [Alt-Ergo] Goal typed_job_assert_2 : Valid +[wp] [Qed] Goal typed_job_assert_3 : Valid +[wp] [Alt-Ergo] Goal typed_job_assert_4 : Valid +[wp] Proved goals: 7 / 7 + Qed: 4 + Alt-Ergo: 3 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +job 2 2 (38) 4 100% +f 1 - 1 100% +g 1 - 1 100% +h - 1 (21) 1 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_bitwise.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_bitwise.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_bitwise.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_bitwise.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,22 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_bitwise.c (with preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 4 goals scheduled +[wp] [Alt-Ergo] Goal typed_ref_bnot_uchar_post_ko : Unknown +[wp] [Alt-Ergo] Goal typed_ref_bnot_uint_post_ko : Unknown +[wp] [Alt-Ergo] Goal typed_ref_bxor_uchar_post_ko : Unknown +[wp] [Alt-Ergo] Goal typed_ref_bxor_uint_post_ko : Unknown +[wp] Proved goals: 0 / 4 + Alt-Ergo: 0 (unknown: 4) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +bxor_uint - - 1 0.0% +bnot_uint - - 1 0.0% +bxor_uchar - - 1 0.0% +bnot_uchar - - 1 0.0% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_bitwise.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_bitwise.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_bitwise.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_bitwise.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,101 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_bitwise.c (with preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 54 goals scheduled +[wp] [Alt-Ergo] Goal typed_ref_lemma_band_sint8 : Valid +[wp] [Alt-Ergo] Goal typed_ref_lemma_band_uint8 : Valid +[wp] [Alt-Ergo] Goal typed_ref_lemma_blsr_sint8 : Valid +[wp] [Alt-Ergo] Goal typed_ref_lemma_blsr_uint8 : Valid +[wp] [Alt-Ergo] Goal typed_ref_lemma_bnot_sint8 : Valid +[wp] [Alt-Ergo] Goal typed_ref_lemma_bor_sint8 : Valid +[wp] [Alt-Ergo] Goal typed_ref_lemma_bor_uint8 : Valid +[wp] [Alt-Ergo] Goal typed_ref_lemma_bxor_sint8 : Valid +[wp] [Qed] Goal typed_ref_lemma_land_abs : Valid +[wp] [Qed] Goal typed_ref_lemma_land_assoc : Valid +[wp] [Qed] Goal typed_ref_lemma_land_com : Valid +[wp] [Qed] Goal typed_ref_lemma_land_stb : Valid +[wp] [Qed] Goal typed_ref_lemma_lor_assoc : Valid +[wp] [Qed] Goal typed_ref_lemma_lor_com : Valid +[wp] [Qed] Goal typed_ref_lemma_lor_neu : Valid +[wp] [Qed] Goal typed_ref_lemma_lor_stb : Valid +[wp] [Qed] Goal typed_ref_lemma_lxor_assoc : Valid +[wp] [Qed] Goal typed_ref_lemma_lxor_com : Valid +[wp] [Alt-Ergo] Goal typed_ref_lemma_btest_band : Unknown +[wp] [Alt-Ergo] Goal typed_ref_lemma_btest_bnot : Unknown +[wp] [Alt-Ergo] Goal typed_ref_lemma_btest_bor : Unknown +[wp] [Alt-Ergo] Goal typed_ref_lemma_btest_bxor : Unknown +[wp] [Alt-Ergo] Goal typed_ref_band1_uchar_assert_ok : Valid +[wp] [Alt-Ergo] Goal typed_ref_band1_uchar_assert_ok_2 : Valid +[wp] [Qed] Goal typed_ref_band1_uint_assert_ok : Valid +[wp] [Alt-Ergo] Goal typed_ref_band1_uint_assert_ok_2 : Valid +[wp] [Qed] Goal typed_ref_band1_ulong_assert_ok : Valid +[wp] [Alt-Ergo] Goal typed_ref_band1_ulong_assert_ok_2 : Valid +[wp] [Alt-Ergo] Goal typed_ref_band1_ushort_assert_ok : Valid +[wp] [Alt-Ergo] Goal typed_ref_band1_ushort_assert_ok_2 : Valid +[wp] [Alt-Ergo] Goal typed_ref_band_char_post_ok : Valid +[wp] [Qed] Goal typed_ref_band_int_post_ok : Valid +[wp] [Alt-Ergo] Goal typed_ref_band_uchar_post_ok : Valid +[wp] [Qed] Goal typed_ref_band_uint_post_ok : Valid +[wp] [Alt-Ergo] Goal typed_ref_bnot_char_post_ok : Valid +[wp] [Qed] Goal typed_ref_bnot_int_post_ok : Valid +[wp] [Qed] Goal typed_ref_bnot_uchar_post_ok : Valid +[wp] [Qed] Goal typed_ref_bnot_uint_post_ok : Valid +[wp] [Alt-Ergo] Goal typed_ref_bor_char_post_ok : Valid +[wp] [Qed] Goal typed_ref_bor_int_post_ok : Valid +[wp] [Alt-Ergo] Goal typed_ref_bor_uchar_post_ok : Valid +[wp] [Qed] Goal typed_ref_bor_uint_post_ok : Valid +[wp] [Alt-Ergo] Goal typed_ref_bxor_char_post_ok : Valid +[wp] [Qed] Goal typed_ref_bxor_int_post_ok : Valid +[wp] [Qed] Goal typed_ref_bxor_uchar_post_ok : Valid +[wp] [Qed] Goal typed_ref_bxor_uint_post_ok : Valid +[wp] [Alt-Ergo] Goal typed_ref_lshift_char_post_ok : Unknown +[wp] [Qed] Goal typed_ref_lshift_int_post_ok : Valid +[wp] [Alt-Ergo] Goal typed_ref_lshift_uchar_post_ok : Unknown +[wp] [Qed] Goal typed_ref_lshift_uint_post_ok : Valid +[wp] [Qed] Goal typed_ref_rshift_char_post_ok : Valid +[wp] [Qed] Goal typed_ref_rshift_int_post_ok : Valid +[wp] [Alt-Ergo] Goal typed_ref_rshift_uchar_post_ok : Valid +[wp] [Qed] Goal typed_ref_rshift_uint_post_ok : Valid +[wp] Proved goals: 48 / 54 + Qed: 27 + Alt-Ergo: 21 (unknown: 6) +---------------------------------------------------------- +Axiomatics WP Alt-Ergo Total Success +Lemma 10 8 (12) 18 100% +Axiomatic bits - - 4 0.0% +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +band_int 1 - 1 100% +bor_int 1 - 1 100% +bxor_int 1 - 1 100% +bnot_int 1 - 1 100% +lshift_int 1 - 1 100% +rshift_int 1 - 1 100% +band1_uint 1 1 (22) 2 100% +band_uint 1 - 1 100% +bor_uint 1 - 1 100% +bxor_uint 1 - 1 100% +bnot_uint 1 - 1 100% +lshift_uint 1 - 1 100% +rshift_uint 1 - 1 100% +band_char - 1 (12) 1 100% +bor_char - 1 (12) 1 100% +bxor_char - 1 (12) 1 100% +bnot_char - 1 (11) 1 100% +lshift_char - - 1 0.0% +rshift_char 1 - 1 100% +band1_uchar - 2 (21) 2 100% +band_uchar - 1 (12) 1 100% +bor_uchar - 1 (12) 1 100% +bxor_uchar 1 - 1 100% +bnot_uchar 1 - 1 100% +lshift_uchar - - 1 0.0% +rshift_uchar - 1 (16) 1 100% +band1_ushort - 2 (21) 2 100% +band1_ulong 1 1 (22) 2 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_call.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_call.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_call.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_call.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,17 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_call.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +tests/wp_typed/unit_call.i:7:[kernel] warning: No code nor implicit assigns clause for function f, generating default assigns from the prototype +[wp] warning: Missing RTE guards +[wp] 1 goal scheduled +[wp] [Alt-Ergo] Goal typed_job_assert : Valid +[wp] Proved goals: 1 / 1 + Qed: 0 + Alt-Ergo: 1 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +job - 1 (6) 1 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_cast.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_cast.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_cast.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_cast.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,17 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_cast.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_typed/unit_cast.i:8:[wp] warning: Cast with incompatible pointers types (source: sint32*) (target: sint8*) +[wp] 1 goal scheduled +[wp] [Alt-Ergo] Goal typed_f_assert_OUT : Valid +[wp] Proved goals: 1 / 1 + Qed: 0 + Alt-Ergo: 1 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f - 1 (13) 1 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_cst.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_cst.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_cst.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_cst.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_cst.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 2 goals scheduled +[wp] [Qed] Goal typed_f_post_A : Valid +[wp] [Qed] Goal typed_f_post_B : Valid +[wp] Proved goals: 2 / 2 + Qed: 2 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f 2 - 2 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_float.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_float.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_float.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_float.1.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,20 @@ +# frama-c -wp -wp-model 'Typed (Float)' [...] +tests/wp_typed/unit_float.i:23:[kernel] warning: Floating-point constant 0.2 is not represented exactly. Will use 0x1.999999999999ap-3. See documentation for option -warn-decimal-float +[wp] Running WP plugin... +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 6 goals scheduled +[wp] [Alt-Ergo] Goal typed_float_main_post_CST_F : Valid +[wp] [Alt-Ergo] Goal typed_float_main_post_CST_D : Valid +[wp] [Alt-Ergo] Goal typed_float_main_post_CNV_F : Unknown +[wp] [Gappa] Goal typed_float_main_post_CNV_F : Valid +[wp] [Alt-Ergo] Goal typed_float_main_post_CNV_D : Unknown +[wp] [Gappa] Goal typed_float_main_post_CNV_D : Valid +[wp] [Alt-Ergo] Goal typed_float_main_post_VAR_F : Unknown +[wp] [Gappa] Goal typed_float_main_post_VAR_F : Valid +[wp] [Qed] Goal typed_float_main_post_VAR_D : Valid +[wp] [Qed] Goal typed_float_main_post_VAR_D : Valid +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +main 2 2 6 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_float.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_float.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_float.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_float.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,22 @@ +# frama-c -wp -wp-model 'Typed (Float)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_float.i (no preprocessing) +tests/wp_typed/unit_float.i:21:[kernel] warning: Floating-point constant 0.2 is not represented exactly. Will use 0x1.999999999999ap-3. See documentation for option -warn-decimal-float +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 6 goals scheduled +[wp] [Alt-Ergo] Goal typed_float_main_post_CST_F : Valid +[wp] [Alt-Ergo] Goal typed_float_main_post_CST_D : Valid +[wp] [Qed] Goal typed_float_main_post_CNV_F : Valid +[wp] [Qed] Goal typed_float_main_post_CNV_D : Valid +[wp] [Qed] Goal typed_float_main_post_VAR_F : Valid +[wp] [Qed] Goal typed_float_main_post_VAR_D : Valid +[wp] Proved goals: 6 / 6 + Qed: 4 + Alt-Ergo: 2 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +main 4 2 (2) 6 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_hard.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_hard.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_hard.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_hard.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,18 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_hard.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 3 goals scheduled +[wp] [Qed] Goal typed_main_pre_p_is_33FF : Valid +[wp] [Qed] Goal typed_main_pre_q_is_66F0 : Valid +[wp] [Alt-Ergo] Goal typed_main_pre_r_is_q1_ko : Unknown +[wp] Proved goals: 2 / 3 + Qed: 2 + Alt-Ergo: 0 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +main 2 - 3 66.7% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_ite.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_ite.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_ite.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_ite.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,15 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_ite.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 1 goal scheduled +[wp] [Qed] Goal typed_check_post : Valid +[wp] Proved goals: 1 / 1 + Qed: 1 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +check 1 - 1 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_labels.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_labels.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_labels.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_labels.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,18 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_labels.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 3 goals scheduled +[wp] [Alt-Ergo] Goal typed_duplet_post : Valid +[wp] [Alt-Ergo] Goal typed_duplet_assert_PI : Valid +[wp] [Alt-Ergo] Goal typed_duplet_assert_PJ : Valid +[wp] Proved goals: 3 / 3 + Qed: 0 + Alt-Ergo: 3 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +duplet - 3 (23) 3 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_lemma.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_lemma.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_lemma.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_lemma.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_lemma.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] 6 goals scheduled +[wp] [Alt-Ergo] Goal typed_lemma_P23_KO : Unknown +[wp] [Alt-Ergo] Goal typed_lemma_P52 : Valid +[wp] [Alt-Ergo] Goal typed_lemma_P13 : Valid +[wp] [Alt-Ergo] Goal typed_lemma_P14 : Valid +[wp] [Alt-Ergo] Goal typed_lemma_P54 : Valid +[wp] [Alt-Ergo] Goal typed_lemma_Foo : Valid +[wp] Proved goals: 5 / 6 + Qed: 0 + Alt-Ergo: 5 (unknown: 1) +---------------------------------------------------------- +Axiomatics WP Alt-Ergo Total Success +Lemma - 1 (4) 2 50.0% +Axiomatic G1 - 2 (7) 2 100% +Axiomatic G2 - 1 (6) 1 100% +Axiomatic Poluted - 1 (5) 1 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_loopscope.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_loopscope.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_loopscope.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_loopscope.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_loopscope.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +tests/wp_typed/unit_loopscope.i:14:[wp] warning: Missing assigns clause (assigns 'everything' instead) +[wp] 2 goals scheduled +[wp] [Qed] Goal typed_ref_f_loop_inv_preserved : Valid +[wp] [Alt-Ergo] Goal typed_ref_f_loop_inv_established : Unknown +[wp] Proved goals: 1 / 2 + Qed: 1 + Alt-Ergo: 0 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f 1 - 2 50.0% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_loopscope.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_loopscope.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_loopscope.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_loopscope.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,18 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_loopscope.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_typed/unit_loopscope.i:14:[wp] warning: Missing assigns clause (assigns 'everything' instead) +[wp] 2 goals scheduled +[wp] [Qed] Goal typed_f_loop_inv_preserved : Valid +[wp] [Alt-Ergo] Goal typed_f_loop_inv_established : Unknown +[wp] Proved goals: 1 / 2 + Qed: 1 + Alt-Ergo: 0 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f 1 - 2 50.0% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_matrix.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_matrix.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_matrix.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_matrix.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,18 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_matrix.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 3 goals scheduled +[wp] [Alt-Ergo] Goal typed_make_post_OK1 : Valid +[wp] [Qed] Goal typed_make_post_OK2 : Valid +[wp] [Alt-Ergo] Goal typed_make_post_KO : Unknown +[wp] Proved goals: 2 / 3 + Qed: 1 + Alt-Ergo: 1 (unknown: 1) +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +make 1 1 (10) 3 66.7% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_string.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_string.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_string.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_string.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,20 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_string.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 5 goals scheduled +[wp] [Alt-Ergo] Goal typed_f_assert_AB : Valid +[wp] [Alt-Ergo] Goal typed_f_assert_B_valid : Valid +[wp] [Alt-Ergo] Goal typed_f_assert_B_out : Valid +[wp] [Alt-Ergo] Goal typed_f_assert_B_rw : Valid +[wp] [Alt-Ergo] Goal typed_f_assert_VAL : Valid +[wp] Proved goals: 5 / 5 + Qed: 0 + Alt-Ergo: 5 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +f - 5 (54) 5 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_tset.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_tset.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_tset.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/unit_tset.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/unit_tset.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 2 goals scheduled +[wp] [Qed] Goal typed_complex_call_job_pre : Valid +[wp] [Qed] Goal typed_complex_stmt_assign : Valid +[wp] Proved goals: 2 / 2 + Qed: 2 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +complex 2 - 2 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_collect.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_collect.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_collect.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_collect.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,52 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_collect.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 32 goals scheduled +[wp] [Qed] Goal typed_caller_post_K : Valid +[wp] [Alt-Ergo] Goal typed_caller_post_P1 : Valid +[wp] [Alt-Ergo] Goal typed_caller_post_P2 : Valid +[wp] [Alt-Ergo] Goal typed_caller_call_job_pre : Valid +[wp] [Alt-Ergo] Goal typed_caller_call_job_pre_2 : Valid +[wp] [Qed] Goal typed_caller2_post_K : Valid +[wp] [Alt-Ergo] Goal typed_caller2_post_Q1 : Valid +[wp] [Alt-Ergo] Goal typed_caller2_post_Q2 : Valid +[wp] [Alt-Ergo] Goal typed_caller2_post_R : Valid +[wp] [Alt-Ergo] Goal typed_caller2_call_job2_pre : Valid +[wp] [Alt-Ergo] Goal typed_caller2_call_job2_pre_2 : Valid +[wp] [Qed] Goal typed_caller3_post_K : Valid +[wp] [Alt-Ergo] Goal typed_caller3_post_Q1 : Valid +[wp] [Alt-Ergo] Goal typed_caller3_post_Q2 : Valid +[wp] [Alt-Ergo] Goal typed_caller3_post_R : Valid +[wp] [Alt-Ergo] Goal typed_caller3_call_job3_pre : Valid +[wp] [Alt-Ergo] Goal typed_caller3_call_job3_pre_2 : Valid +[wp] [Qed] Goal typed_job_post_K : Valid +[wp] [Alt-Ergo] Goal typed_job_post_P : Valid +[wp] [Qed] Goal typed_job_assign_part1 : Valid +[wp] [Qed] Goal typed_job_assign_part2 : Valid +[wp] [Qed] Goal typed_job_assign_part3 : Valid +[wp] [Qed] Goal typed_job2_post_K : Valid +[wp] [Alt-Ergo] Goal typed_job2_post_Q : Valid +[wp] [Qed] Goal typed_job2_assign_part1 : Valid +[wp] [Qed] Goal typed_job2_assign_part2 : Valid +[wp] [Qed] Goal typed_job2_assign_part3 : Valid +[wp] [Qed] Goal typed_job3_post_K : Valid +[wp] [Alt-Ergo] Goal typed_job3_post_Q : Valid +[wp] [Qed] Goal typed_job3_assign_part1 : Valid +[wp] [Qed] Goal typed_job3_assign_part2 : Valid +[wp] [Qed] Goal typed_job3_assign_part3 : Valid +[wp] Proved goals: 32 / 32 + Qed: 15 + Alt-Ergo: 17 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +job 4 1 (10) 5 100% +job2 4 1 (17) 5 100% +job3 4 1 (17) 5 100% +caller 1 4 (35) 5 100% +caller2 1 5 (35) 6 100% +caller3 1 5 (35) 6 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_init.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_init.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_init.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_init.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_init.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 10 goals scheduled +[wp] [Alt-Ergo] Goal typed_init_post : Valid +[wp] [Alt-Ergo] Goal typed_init_loop_inv_Partial_preserved : Valid +[wp] [Qed] Goal typed_init_loop_inv_Partial_established : Valid +[wp] [Alt-Ergo] Goal typed_init_loop_inv_Range_preserved : Valid +[wp] [Qed] Goal typed_init_loop_inv_Range_established : Valid +[wp] [Qed] Goal typed_init_loop_assign_part1 : Valid +[wp] [Alt-Ergo] Goal typed_init_loop_assign_part2 : Valid +[wp] [Alt-Ergo] Goal typed_init_loop_assign_part3 : Valid +[wp] [Qed] Goal typed_init_assign_part1 : Valid +[wp] [Alt-Ergo] Goal typed_init_assign_part2 : Valid +[wp] Proved goals: 10 / 10 + Qed: 4 + Alt-Ergo: 6 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +init 4 6 (69) 10 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_injector.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_injector.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_injector.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_injector.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_injector.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +tests/wp_typed/user_injector.i:61:[wp] warning: Validity of unsized array not implemented yet (considered valid). +tests/wp_typed/user_injector.i:60:[wp] warning: Validity of unsized array not implemented yet (considered valid). +[wp] 16 goals scheduled +[wp] [Qed] Goal typed_ref_job_post_SEQ : Valid +[wp] [Qed] Goal typed_ref_job_post_ID1 : Valid +[wp] [Qed] Goal typed_ref_job_post_ID2 : Valid +[wp] [Qed] Goal typed_ref_job_post_R1 : Valid +[wp] [Qed] Goal typed_ref_job_post_R2 : Valid +[wp] [Qed] Goal typed_ref_job_post_R0 : Valid +[wp] [Qed] Goal typed_ref_job_post_E1 : Valid +[wp] [Qed] Goal typed_ref_job_post_E2 : Valid +[wp] [Qed] Goal typed_ref_job_assign_exit_part1 : Valid +[wp] [Qed] Goal typed_ref_job_assign_exit_part2 : Valid +[wp] [Qed] Goal typed_ref_job_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_ref_job_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_ref_job_assign_normal_part3 : Valid +[wp] [Qed] Goal typed_ref_job_assign_normal_part4 : Valid +[wp] [Qed] Goal typed_ref_job_assign_normal_part5 : Valid +[wp] [Qed] Goal typed_ref_job_assign_normal_part6 : Valid +[wp] Proved goals: 16 / 16 + Qed: 16 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +job 16 - 16 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_injector.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_injector.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_injector.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_injector.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,36 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_injector.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +tests/wp_typed/user_injector.i:61:[wp] warning: Validity of unsized array not implemented yet (considered valid). +tests/wp_typed/user_injector.i:60:[wp] warning: Validity of unsized array not implemented yet (considered valid). +[wp] 20 goals scheduled +[wp] [Qed] Goal typed_job_post_SEQ : Valid +[wp] [Qed] Goal typed_job_post_ID1 : Valid +[wp] [Qed] Goal typed_job_post_ID2 : Valid +[wp] [Qed] Goal typed_job_post_R1 : Valid +[wp] [Qed] Goal typed_job_post_R2 : Valid +[wp] [Qed] Goal typed_job_post_R0 : Valid +[wp] [Qed] Goal typed_job_post_E1 : Valid +[wp] [Qed] Goal typed_job_post_E2 : Valid +[wp] [Qed] Goal typed_job_assign_exit_part1 : Valid +[wp] [Qed] Goal typed_job_assign_exit_part2 : Valid +[wp] [Qed] Goal typed_job_assign_exit_part3 : Valid +[wp] [Qed] Goal typed_job_assign_normal_part1 : Valid +[wp] [Qed] Goal typed_job_assign_normal_part2 : Valid +[wp] [Qed] Goal typed_job_assign_normal_part3 : Valid +[wp] [Qed] Goal typed_job_assign_normal_part4 : Valid +[wp] [Qed] Goal typed_job_assign_normal_part5 : Valid +[wp] [Qed] Goal typed_job_assign_normal_part6 : Valid +[wp] [Qed] Goal typed_job_assign_normal_part7 : Valid +[wp] [Qed] Goal typed_job_assign_normal_part8 : Valid +[wp] [Qed] Goal typed_job_assign_normal_part9 : Valid +[wp] Proved goals: 20 / 20 + Qed: 20 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +job 20 - 20 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_rec.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_rec.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_rec.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_rec.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,40 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_rec.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 20 goals scheduled +[wp] [Alt-Ergo] Goal typed_lemma_fact_ge1 : Timeout +[wp] [Alt-Ergo] Goal typed_lemma_fact_next : Timeout +[wp] [Alt-Ergo] Goal typed_F1_post : Valid +[wp] [Alt-Ergo] Goal typed_F1_loop_inv_preserved : Valid +[wp] [Qed] Goal typed_F1_loop_inv_established : Valid +[wp] [Alt-Ergo] Goal typed_F1_loop_inv_2_preserved : Valid +[wp] [Alt-Ergo] Goal typed_F1_loop_inv_2_established : Valid +[wp] [Qed] Goal typed_F1_loop_assign : Valid +[wp] [Alt-Ergo] Goal typed_F2_post : Valid +[wp] [Alt-Ergo] Goal typed_F2_loop_inv_PART_preserved : Valid +[wp] [Alt-Ergo] Goal typed_F2_loop_inv_PART_established : Valid +[wp] [Alt-Ergo] Goal typed_F2_loop_inv_RANGE_preserved : Valid +[wp] [Alt-Ergo] Goal typed_F2_loop_inv_RANGE_established : Valid +[wp] [Qed] Goal typed_F2_loop_assign : Valid +[wp] [Alt-Ergo] Goal typed_F4_post : Valid +[wp] [Alt-Ergo] Goal typed_F4_loop_inv_NEVER_preserved : Valid +[wp] [Alt-Ergo] Goal typed_F4_loop_inv_NEVER_established : Valid +[wp] [Alt-Ergo] Goal typed_F4_loop_inv_RANGE_preserved : Valid +[wp] [Alt-Ergo] Goal typed_F4_loop_inv_RANGE_established : Valid +[wp] [Qed] Goal typed_F4_loop_assign : Valid +[wp] Proved goals: 18 / 20 + Qed: 4 + Alt-Ergo: 14 (interrupted: 2) +---------------------------------------------------------- +Axiomatics WP Alt-Ergo Total Success +Lemma - - 2 0.0% +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +F1 2 4 (26) 6 100% +F2 1 5 (29) 6 100% +F4 1 5 (84) 6 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_string.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_string.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_string.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_string.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,29 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_string.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 14 goals scheduled +[wp] [Alt-Ergo] Goal typed_strlen_post : Valid +[wp] [Qed] Goal typed_strlen_loop_inv_BASE_preserved : Valid +[wp] [Qed] Goal typed_strlen_loop_inv_BASE_established : Valid +[wp] [Alt-Ergo] Goal typed_strlen_loop_inv_RANGE_preserved : Valid +[wp] [Alt-Ergo] Goal typed_strlen_loop_inv_RANGE_established : Valid +[wp] [Alt-Ergo] Goal typed_strlen_loop_inv_ZERO_preserved : Valid +[wp] [Qed] Goal typed_strlen_loop_inv_ZERO_established : Valid +[wp] [Alt-Ergo] Goal typed_strlen_assert_END : Valid +[wp] [Qed] Goal typed_strlen_loop_assign : Valid +[wp] [Qed] Goal typed_strlen_assign_part1 : Valid +[wp] [Qed] Goal typed_strlen_assign_part2 : Valid +[wp] [Qed] Goal typed_strlen_assign_part3 : Valid +[wp] [Qed] Goal typed_strlen_loop_term_decrease : Valid +[wp] [Alt-Ergo] Goal typed_strlen_loop_term_positive : Valid +[wp] Proved goals: 14 / 14 + Qed: 8 + Alt-Ergo: 6 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +strlen 8 6 (185) 14 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_swap.1.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_swap.1.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_swap.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_swap.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +# frama-c -wp -wp-model 'Typed (Ref)' [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_swap.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] Collecting variable usage +[wp] 7 goals scheduled +[wp] [Qed] Goal typed_ref_main_assert : Valid +[wp] [Qed] Goal typed_ref_main_call_swap_pre : Valid +[wp] [Qed] Goal typed_ref_main_call_swap_pre_2 : Valid +[wp] [Qed] Goal typed_ref_swap_post_A : Valid +[wp] [Qed] Goal typed_ref_swap_post_B : Valid +[wp] [Qed] Goal typed_ref_swap_assign_part1 : Valid +[wp] [Qed] Goal typed_ref_swap_assign_part2 : Valid +[wp] Proved goals: 7 / 7 + Qed: 7 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +swap 4 - 4 100% +main 3 - 3 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_swap.res.oracle frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_swap.res.oracle --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_swap.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/oracle_qualif/user_swap.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,24 @@ +# frama-c -wp [...] +[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/wp_typed/user_swap.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Collecting axiomatic usage +[wp] warning: Missing RTE guards +[wp] 8 goals scheduled +[wp] [Qed] Goal typed_main_assert : Valid +[wp] [Qed] Goal typed_main_call_swap_pre : Valid +[wp] [Qed] Goal typed_main_call_swap_pre_2 : Valid +[wp] [Alt-Ergo] Goal typed_swap_post_A : Valid +[wp] [Qed] Goal typed_swap_post_B : Valid +[wp] [Qed] Goal typed_swap_assign_part1 : Valid +[wp] [Qed] Goal typed_swap_assign_part2 : Valid +[wp] [Qed] Goal typed_swap_assign_part3 : Valid +[wp] Proved goals: 8 / 8 + Qed: 7 + Alt-Ergo: 1 +---------------------------------------------------------- +Functions WP Alt-Ergo Total Success +swap 4 1 (15) 5 100% +main 3 - 3 100% +---------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/shift_lemma.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/shift_lemma.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/shift_lemma.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/shift_lemma.i 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,27 @@ + +struct t { + int b; + int c; +}; + +struct s { + int d; + struct t u[10]; + int e; +}; + +/*@ + predicate inv{L}(struct s *p) = p->d == 0 && p->e == 0 && + \forall int i; 0 <= i < 10 ==> p->u[i].c == 0; + @*/ + +/*@ + requires inv(p); + @*/ + void f(struct s *p){ + /*@ assert p->d == 0; @*/ + /*@ assert \forall int i; 0 <= i < 10 ==> p->u[i].c == 0; @*/ + /*@ assert p->u[0].c == 0; @*/ + /*@ assert p->u[1].c == 0; @*/ + /*@ assert p->e == 0; @*/ + } diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/test_config frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/test_config --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/test_config 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,2 @@ +OPT: +OPT: -wp-model +ref diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_alloc.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_alloc.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_alloc.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_alloc.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,34 @@ +/* run.config + OPT: + OPT: -wp-model +ref +*/ +/* run.config_qualif + OPT: + OPT: -wp-model +ref +*/ + +int z ; +int *p ; + +void job (int x) +{ + //@ assert \valid(&x) ; + { + int y ; + int z ; + p = &y ; + y = 4 ; + //@ assert \valid(p) ; + //@ assert \valid(&z) ; + } + //@ assert !\valid(p) ; +} + +//@ assigns \nothing ; +int f(int x) { return x; } + +//@ assigns \nothing ; +int g(int x) { x++; return x; } + +//@ ensures !\valid(\result) ; +int * h(int x) { return &x; } diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_bitwise.c frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_bitwise.c --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_bitwise.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_bitwise.c 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,169 @@ +/* run.config + OPT: + OPT: -wp-model +ref +*/ +/* run.config_qualif + OPT: -wp-model +ref -wp-prop="-ko" + OPT: -wp-model +ref -wp-prop="ko" +*/ + + + +#include "unit_bitwise.h" +//=============================================== +//-- int +//=============================================== + +/*@ ensures ok: \result == (a & b); +*/ +int band_int(int a,int b) { return a & b ; } + +/*@ ensures ok: \result == (a | b); + */ +int bor_int(int a,int b) { return a | b ; } + +/*@ ensures ok: \result == (a ^ b); + */ +int bxor_int(int a,int b) { return a ^ b ; } + +/*@ ensures ok: \result == (~a) ; + */ +int bnot_int(int a) { return ~a ; } + +/*@ ensures ok: \result == (int) (a << n) ; + */ +int lshift_int(int a,int n) { return a << n ; } + +/*@ ensures ok: \result == (a >> n) ; + */ +int rshift_int(int a,int n) { return a >> n ; } + +//=============================================== +//-- unsigned int +//=============================================== +typedef unsigned int uint; + +void band1_uint(uint a) { + uint b = a & 1; + //@ assert ok: b == 0 || b == 1; + //@ assert ok: 0 <= b <= 1; +} + +/*@ ensures ok: \result == (a & b); +*/ +uint band_uint(uint a,uint b) { return a & b ; } + +/*@ ensures ok: \result == (a | b); + */ +uint bor_uint(uint a,uint b) { return a | b ; } + +/*@ ensures ok: \result == (uint)(a ^ b); + ensures ko: \result == (a ^ b); + */ +uint bxor_uint(uint a,uint b) { return a ^ b ; } + +/*@ ensures ok: \result == (uint)(~a) ; + ensures ko: \result == (~a) ; + */ +uint bnot_uint(uint a) { return ~a ; } + +/*@ ensures ok: \result == (uint) (a << n) ; + */ +uint lshift_uint(uint a,uint n) { return a << n ; } + +/*@ ensures ok: \result == (a >> n) ; + */ +uint rshift_uint(uint a,uint n) { return a >> n ; } + +//=============================================== +//-- char +//=============================================== + +/*@ ensures ok: \result == (a & b); +*/ +char band_char(char a,char b) { return a & b ; } + +/*@ ensures ok: \result == (a | b); + */ +char bor_char(char a,char b) { return a | b ; } + +/*@ ensures ok: \result == (a ^ b); + */ +char bxor_char(char a,char b) { return a ^ b ; } + +/*@ ensures ok: \result == (~a) ; + */ +char bnot_char(char a) { return ~a ; } + +/*@ ensures ok: \result == (char) (a << n) ; + */ +char lshift_char(char a,char n) { return a << n ; } + +/*@ ensures ok: \result == (char) (a >> n) ; + */ +char rshift_char(char a,char n) { return a >> n ; } + +//=============================================== +//-- unsigned char +//=============================================== +typedef unsigned char uchar; + +void band1_uchar(uchar a) { + uchar b = a & 1; + //@ assert ok: b == 0 || b == 1; + //@ assert ok: 0 <= b <= 1; +} + +/*@ ensures ok: \result == (a & b); +*/ +uchar band_uchar(uchar a,uchar b) { return a & b ; } + +/*@ ensures ok: \result == (a | b); + */ +uchar bor_uchar(uchar a,uchar b) { return a | b ; } + +/*@ ensures ok: \result == (uchar)(a ^ b); + ensures ko: \result == (a ^ b); + */ +uchar bxor_uchar(uchar a,uchar b) { return a ^ b ; } + +/*@ ensures ok: \result == (uchar)(~a) ; + ensures ko: \result == (~a) ; + */ +uchar bnot_uchar(uchar a) { return ~a ; } + +/*@ ensures ok: \result == (uchar) (a << n) ; + */ +uchar lshift_uchar(uchar a,uchar n) { return a << n ; } + +/*@ ensures ok: \result == (a >> n) ; + */ +uchar rshift_uchar(uchar a,uchar n) { return a >> n ; } + +//=============================================== +//-- Logic +//=============================================== +/*@ lemma land_assoc: \forall integer a,b,c; (a & (b & c)) == ((a & b) & c) ; + @ lemma land_com: \forall integer a,b; (a & b) == (b & a) ; + @ lemma land_abs: \forall integer a; (a & 0) == 0 ; + @ lemma land_stb: \forall integer a; (a & a) == a ; + @ lemma lor_assoc: \forall integer a,b,c; (a | (b | c)) == ((a | b) | c) ; + @ lemma lor_com: \forall integer a,b; (a | b) == (b | a) ; + @ lemma lor_neu: \forall integer a; (a | 0) == a ; + @ lemma lor_stb: \forall integer a; (a | a) == a ; + @ lemma lxor_assoc: \forall integer a,b,c; (a ^ (b ^ c)) == ((a ^ b) ^ c) ; + @ lemma lxor_com: \forall integer a,b; (a ^ b) == (b ^ a) ; + */ +//=============================================== + +void band1_ushort(unsigned short a) { + unsigned short b = a & 1; + //@ assert ok: b == 0 || b == 1; + //@ assert ok: 0 <= b <= 1; +} +void band1_ulong(unsigned long a) { + unsigned long b = a & 1; + //@ assert ok: b == 0 || b == 1; + //@ assert ok: 0 <= b <= 1; +} + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_bitwise.h frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_bitwise.h --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_bitwise.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_bitwise.h 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,23 @@ +/*@ + axiomatic bits { + logic integer c2fc4_lbtest (integer x, integer n) ; + predicate c2fc4_btest (integer x, integer n) = c2fc4_lbtest (x, n) != 0; + + lemma btest_bnot: \forall integer x,n ; n>0 ==> ((TRIGGER:c2fc4_btest(~x,n)) <==> !c2fc4_btest(x,n)); + lemma btest_bxor: \forall integer x,y,n ; n>0 ==> ((TRIGGER:c2fc4_btest(x^y,n)) <==> ((c2fc4_btest(x,n) ^^ c2fc4_btest(y,n)))); + lemma btest_bor: \forall integer x,y,n ; n>0 ==> ((TRIGGER:c2fc4_btest(x|y,n)) <==> ((c2fc4_btest(x,n) || c2fc4_btest(y,n)))); + lemma btest_band: \forall integer x,y,n ; n>0 ==> ((TRIGGER:c2fc4_btest(x&y,n)) <==> ((c2fc4_btest(x,n) && c2fc4_btest(y,n)))); +} + + +lemma bnot_sint8: \forall signed char x ; (~x) == (signed char)(~x); +lemma bxor_sint8: \forall signed char x,y ; (x ^ y) == (signed char)(x ^ y); +lemma bor_sint8: \forall signed char x,y ; (x | y) == (signed char)(x | y); +lemma band_sint8: \forall signed char x,y ; (x & y) == (signed char)(x & y); +lemma blsr_sint8: \forall signed char x,y ; y >= 0 ==> (x >> y) == (signed char)(x >> y); + +lemma bor_uint8: \forall unsigned char x,y ; (x | y) == (unsigned char)(x | y); +lemma band_uint8: \forall unsigned char x,y ; (x & y) == (unsigned char)(x & y); +lemma blsr_uint8: \forall unsigned char x,y ; y >= 0 ==> (x >> y) == (unsigned char)(x >> y); + +*/ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_call.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_call.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_call.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_call.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,16 @@ +/*@ + ensures ( x==1 ==> \result < 0) ; + ensures ( x==2 ==> \result > 0) ; +*/ +int f(int x) ; + +void job(void) +{ + int r ; + r = f(1); + L1: + r = f(2); + L2: + //@ assert \at(r,L1) != \at(r,L2); + return ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_cast.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_cast.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_cast.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_cast.i 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,11 @@ +/* run.config_qualif + OPT: +*/ + +// assigns p[-128..127] ; +void f(int *p,int *v) +{ + char k = *((char *) v ) ; + /*@ assert OUT: k < 256 ; */ + p[k] = 1 ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_cst.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_cst.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_cst.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_cst.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,15 @@ + +/*@ + axiomatic C { + logic int K1 = (int) 1 ; + logic int K2 = (int) 2 ; + logic integer A = 1 ; + logic integer B = 2 ; + } +*/ + +/*@ + ensures A: K1 == A ; + ensures B: K2+K1 == B+A ; + */ +void f(void) {} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_float.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_float.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_float.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_float.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,23 @@ +/* run.config + OPT: -wp-model FLOAT +*/ + +/* run.config_qualif + OPT: -wp-model FLOAT +*/ + +float f ; +double d ; + +/*@ + ensures CST_F : 0.5 == 0.5f ; + ensures CST_D : 0.5 == 0.5d ; + ensures CNV_F : (float) 0.2 == 0.2f ; + ensures CNV_D : (double) 0.2 == 0.2d ; + ensures VAR_F : f == 0.2f ; + ensures VAR_D : d == 0.2d ; +*/ +void main() { + f = 0.2; + d = 0.2; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_hard.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_hard.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_hard.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_hard.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,11 @@ + +int * p = (int *) 0x0033FF ; +int * q = (int *) 0x0066F0 ; +int * r = (int *) 0x0066F8 ; + +/*@ + requires p_is_33FF: p == (int *) 0x0033FF ; + requires q_is_66F0: q == (int *) 0x0066F0 ; + requires r_is_q1_ko: (q+1) == (int *) 0x0066F8 ; // DON'T WANT TO PROVE THIS ! +*/ +void main(void) { return; } diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_ite.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_ite.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_ite.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_ite.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,4 @@ + +//@ ensures *p == (x==0 ? 1 : 0) ; +void check(int x , int *p) { *p = (x==0) ; } + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_labels.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_labels.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_labels.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_labels.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,11 @@ +/*@ predicate is_duplet{L}(int *a, integer i, integer j) = a[i] == a[j]; + @*/ + +/*@ requires \separated(a+(*pi),pi,pj); + @ ensures is_duplet(a,*pi,*pj) ; + @*/ +void duplet(int *a, int *pi, int *pj) { + a[*pi] = a[*pj] ; + //@ assert PI: \at(*pi,Pre) == *pi ; + //@ assert PJ: \at(*pj,Pre) == *pj ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_lemma.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_lemma.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_lemma.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_lemma.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,40 @@ +/* run.config_qualif + OPT: +*/ + +/*@ axiomatic D1 { + predicate P1(integer x) ; + predicate P2(integer x) ; + predicate P3(integer x) ; + predicate P4(integer x) ; + axiom P12: \forall integer x ; P1(x) ==> P2(x) ; + } +*/ + +/*@ axiomatic Poluted { + predicate H(integer x) ; + lemma Foo: + H(0) ==> + (\forall integer x ; x<0 ==> H(x)) ==> + (\forall integer x ; x>0 ==> H(x)) ==> + (\forall integer x ; H(x)) ; + } +*/ + +/*@ lemma P23_KO: \forall integer x ; P2(x) ==> P3(x) ; */ + +/*@ axiomatic G1 { + lemma P13: \forall integer x ; P1(x) ==> P3(x) ; + axiom P34: \forall integer x ; P3(x) ==> P4(x) ; + lemma P14: \forall integer x ; P1(x) ==> P4(x) ; + } +*/ + +/*@ predicate P5(integer x) = P1(x) && P2(x) ; */ + +/*@ lemma P52: \forall integer x ; P5(x) ==> P2(x) ; */ + +/*@ axiomatic G2 { + lemma P54: \forall integer x ; P5(x) ==> P4(x) ; + } +*/ diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_loopscope.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_loopscope.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_loopscope.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_loopscope.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,18 @@ +/* run.config_qualif + OPT: + OPT: -wp-model +ref +*/ + + + +/*@ requires \valid(written); */ +void f(unsigned int * written) +{ + int n = 1; + *written = (unsigned int)0; + /*@ loop invariant \false ; */ + while (n < 10) { + n++; + } + return; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_matrix.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_matrix.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_matrix.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_matrix.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,13 @@ + +int t[10][20] ; + +/*@ + ensures OK1: a!=c ==> t[a][b] == 1 ; + ensures OK2: t[c][d] == 2 ; + ensures KO: t[a][b] == 1 ; +*/ +void make(int a,int b,int c,int d) +{ + t[a][b] = 1 ; + t[c][d] = 2 ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_string.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_string.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_string.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_string.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,17 @@ +/* run.config_qualif + OPT: -wp-literals +*/ + +void f(void) +{ + char * a = "abc" ; + char * b = "def" ; + char * c = "def" ; + char * d = "abcdef" ; + //@ assert AB: \separated(a,b); + //@ assert B_valid: \valid_read(b+(0..2)); + //@ assert B_out: !\valid_read(b+3); + //@ assert B_rw: !\valid(b+1); + //@ assert VAL: \forall integer i; 0 <= i <= 2 ==> b[i] == d[3+i] ; + /* The ending '0' is ok ! */ +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_tset.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_tset.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/unit_tset.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/unit_tset.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,21 @@ +/* run.config_qualif + OPT: +*/ + +/*@ + requires \valid( p + (0..n-1) ); + assigns p[0..n-1]; + */ +void job(int *p,int n); + +typedef struct S { + int size ; + int value[50] ; +} ; + +/*@ requires s.size < 50; */ +void complex(struct S s) +{ + /*@ assigns s.value[1..s.size]; */ + job( & s.value[1] , s.size ); +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/user_collect.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/user_collect.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/user_collect.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/user_collect.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,84 @@ + + +int k ; +int p[10] ; + +struct S { int f[2] ; } ; +struct S q[10] ; + +/*@ + requires 0 <= k < 10 ; + ensures K: k == \old(k) + 1 ; + ensures P: p == { \old(p) \with [\old(k)] = x } ; + assigns k,p[k] ; +*/ +void job(int x) +{ + p[k++] = x ; +} + +/*@ + requires 0 <= k < 10 ; + ensures K: k == \old(k) + 1 ; + ensures Q: q == { \old(q) \with [\old(k)] = s } ; + assigns k,q[k] ; +*/ +void job2(struct S s) +{ + q[k++] = s ; +} + +/*@ + requires 0 <= k < 10 ; + ensures K: k == \old(k) + 1 ; + ensures Q: q == { \old(q) \with [\old(k)] = s } ; + assigns k,q[k] ; +*/ +void job3(struct S s) +{ + q[k].f[0] = s.f[0] ; + q[k].f[1] = s.f[1] ; + k++; +} + +/*@ + requires 0 <= k < 9 ; + ensures K: k == \old(k)+2 ; + ensures P1: p[\old(k)+0] == x1 ; + ensures P2: p[\old(k)+1] == x2 ; +*/ +void caller(int x1 , int x2) +{ + job(x1); + job(x2); +} + +/*@ + requires 0 <= k < 9 ; + ensures K: k == \old(k)+2 ; + ensures Q1: q[\old(k)+0] == s1 ; + ensures Q2: q[\old(k)+1] == s2 ; + ensures R: q == {{ \old(q) \with [\old(k)] = s1 } \with [\old(k)+1] = s2 } ; +*/ +void caller2(struct S s1 , struct S s2) +{ + job2(s1); + job2(s2); +} + +/*@ + requires 0 <= k < 9 ; + ensures K: k == \old(k)+2 ; + ensures Q1: q[\old(k)+0] == s1 ; + ensures Q2: q[\old(k)+1] == s2 ; + ensures R: q == {{ \old(q) \with [\old(k)] = s1 } \with [\old(k)+1] = s2 } ; +*/ +void caller3(struct S s1 , struct S s2) +{ + job3(s1); + job3(s2); +} + + + + diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/user_init.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/user_init.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/user_init.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/user_init.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,13 @@ +/*@ requires \valid(a+(0..n-1)) ; + @ requires n >= 0 ; + @ ensures \forall int k ; 0 <= k < n ==> a[k] == v ; + @ assigns a[0..n-1] ; +*/ +void init( int * a , int n , int v ) +{ + /*@ loop invariant Range: 0 <= i <= n ; + @ loop invariant Partial: \forall int k ; 0 <= k < i ==> a[k] == v ; + @ loop assigns i,a[0..n-1] ; + */ + for (int i = 0 ; i < n ; i++) a[i] = v ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/user_injector.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/user_injector.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/user_injector.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/user_injector.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,67 @@ + +/* run.config_qualif + OPT: + OPT: -wp-model +ref + */ + +/* -------------------------------------------------------------------------- */ +/* --- Sequences --- */ +/* -------------------------------------------------------------------------- */ + +/*@ + axiomatic Sequences { + + logic int call( int seq , integer fct ); + logic int concat( int seq1 , int seq2 ); + + } +*/ + +int seq = 0 ; + +/* -------------------------------------------------------------------------- */ +/* --- Injector / Collector --- */ +/* -------------------------------------------------------------------------- */ + +int service_cpt ; +int service_id[] ; +int service_result[] ; + +/*@ + ensures ID: service_id == { \old(service_id) \with [service_cpt] = id } ; + ensures RESULT: \result == service_result[service_cpt] ; + ensures CPT: service_cpt == \old(service_cpt)+1 ; + ensures SEQ: seq == call( \old(seq) , 0xF1 ); + assigns A: seq,service_cpt,service_id[..]; +*/ +int service(int id) ; + + +/* -------------------------------------------------------------------------- */ +/* --- Job --- */ +/* -------------------------------------------------------------------------- */ + +/*@ + ensures SEQ: seq == call( call ( \old(seq) , 0xF1 ) , 0xF1 ) ; + ensures ID1: service_id[ \old(service_cpt)+1 ] == a ; + ensures ID2: service_id[ \old(service_cpt)+2 ] == b ; + ensures R1: \result != 0 ==> service_result[ \old(service_cpt)+1 ] != 0 ; + ensures R2: \result != 0 ==> service_result[ \old(service_cpt)+2 ] != 0 ; + ensures R0: \result != 0 ==> *error == 0 ; + ensures E1: service_result[ \old(service_cpt)+1 ] == 0 ==> *error == a ; + ensures E2: service_result[ \old(service_cpt)+1 ] != 0 ==> + service_result[ \old(service_cpt)+2 ] == 0 ==> *error == b ; + assigns A: seq,service_cpt,service_id[..],*error; +*/ +int job( int a , int b , int * error ) +{ + *error = 0 ; + + int ra = service( a ); + int rb = service( b ); + + if (!ra) *error = a ; + else if (!rb) *error = b ; + + return ra && rb ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/user_rec.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/user_rec.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/user_rec.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/user_rec.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,46 @@ +/*@ logic integer fact(integer n) = n <= 1 ? 1 : n * fact (n-1) ; */ +/*@ lemma fact_ge1: \forall integer n ; fact(n) >= 1 ; */ +/*@ lemma fact_next: \forall integer n,m ; + 0 < n <= m ==> (n*(fact(m)/fact(n))) == (fact(m)/fact(n-1)) ; */ + +/*@ ensures \result == fact(n) ; */ +int F1(int n) +{ + if (n<=1) return 1; + int p=1,i=2 ; + /*@ + loop invariant 2 <= i <= (n+1) ; + loop invariant p == fact(i-1) ; + loop assigns p,i; + */ + while (i <= n) { p *= i ; i++; } + return p; +} + +/*@ ensures \result == fact(n) ; */ +int F2(int n) +{ + int p=1,i=2 ; + /*@ + loop invariant RANGE: n<=1 ? i==2 : 2 <= i <= (n+1) ; + loop invariant PART: n<=1 ? p==1 : p == fact(i-1) ; + loop assigns p,i; + */ + while (i <= n) { p *= i ; i++; } + return p; +} + +/*@ ensures \result == fact(n) ; */ +int F4(int n) +{ + int p=1 ; + /*@ + loop invariant RANGE: \at(n,Pre) <= 1 ? n == \at(n,Pre) : 1 <= n <= \at(n,Pre) ; + loop invariant NEVER: \at(n,Pre) <= 1 ? p == 1 : p == fact(\at(n,Pre)) / fact(n) ; + loop assigns p,n ; + */ + while (n > 1) { + p *= n ; n--; + } + return p; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/user_string.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/user_string.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/user_string.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/user_string.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,39 @@ +/*@ + axiomatic String { + + predicate Length_of_str_is(char * s,integer n) = + \valid( s + (0..n) ) && + s[n] == 0 && 0 <= n && + \forall integer k ; 0 <= k < n ==> s[k] !=0 + ; + + logic integer Length{L}(char *s) reads s[..] ; + + axiom Length_def : + \forall char *s; + \forall integer n; + Length_of_str_is(s,n) ==> Length(s)==n ; + + } +*/ + +/*@ + requires \exists integer i; Length_of_str_is(s,i); + assigns \nothing; + ensures \exists integer i; Length_of_str_is(s,i) && \result == i; + @*/ +int strlen(const char *s) { + const char *ss = s; + /*@ + loop invariant BASE: \base_addr(s) == \base_addr(ss) ; + loop invariant RANGE: s <= ss <= s+Length(s); + loop invariant ZERO: \forall integer i; 0 <= i < (ss-s) ==> s[i] != 0; + loop assigns ss; + loop variant Length(s) - (ss-s) ; + @*/ + while (*ss) + ss++; + + /*@ assert END: Length_of_str_is(s,ss-s); */ + return ss - s; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/user_swap.i frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/user_swap.i --- frama-c-20140301+neon+dfsg/src/wp/tests/wp_typed/user_swap.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/tests/wp_typed/user_swap.i 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,26 @@ +/* run.config_qualif + OPT: + OPT: -wp-model +ref + */ + +/*@ requires \valid(a) ; + @ requires \valid(b) ; + @ ensures A: *a == \old(*b) ; + @ ensures B: *b == \old(*a) ; + @ assigns E: *a,*b ; + @*/ + +void swap(int *a,int *b) +{ + int tmp = *a ; + *a = *b ; + *b = tmp ; + return ; +} + + +void main(int a,int b) +{ + if (a >= b) swap(&a,&b) ; + //@ assert a <= b ; +} diff -Nru frama-c-20140301+neon+dfsg/src/wp/variables_analysis.ml frama-c-20150201+sodium+dfsg/src/wp/variables_analysis.ml --- frama-c-20140301+neon+dfsg/src/wp/variables_analysis.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/variables_analysis.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -38,7 +38,7 @@ let dkey = Wp_parameters.register_category "var_kind" let oracle = Wp_parameters.debug ~dkey - + (* -------------------------------------------------------------------------- *) (* --- Variable Analysis --- *) (* -------------------------------------------------------------------------- *) @@ -49,7 +49,7 @@ variables: 1) [Fvar] functional variable, variable such as its address is never taken, - + 2) [PRarg] by_pointer_reference argument, variable such as its address is only taken in by reference calls (one or more), @@ -65,9 +65,9 @@ variable which is a formal parameter use for a by array reference call and can be invoked in a chain of by array reference call such as their arity are less or equal than n, - + 6) [Cvar] other variable. - + *) type var_kind = @@ -122,27 +122,27 @@ (* [stars_typ typ] accounts the number of * if typ is a pointer type.*) let rec stars_typ typ = match Cil.unrollType typ with - | TPtr (typ,_) -> 1+ stars_typ (Cil.unrollType typ) - | TInt(_,_) | TFloat(_,_) | TFun _ | TEnum (_,_) | TComp (_,_,_) - | TArray (_,_,_,_) | TBuiltin_va_list _ | TVoid _ | TNamed _ -> 0 + | TPtr (typ,_) -> 1+ stars_typ (Cil.unrollType typ) + | TInt(_,_) | TFloat(_,_) | TFun _ | TEnum (_,_) | TComp (_,_,_) + | TArray (_,_,_,_) | TBuiltin_va_list _ | TVoid _ | TNamed _ -> 0 (* [bracket_typ typ] accounts the number of [dim] if typ is an array type. *) let rec brackets_typ typ = match Cil.unrollType typ with - | TArray (typ,_,_,_) -> 1+ brackets_typ (Cil.unrollType typ) - | TInt(_,_) | TFloat(_,_) | TFun _ | TEnum (_,_) | TComp (_,_,_) - | TPtr (_,_) | TBuiltin_va_list _ | TVoid _ | TNamed _ -> 0 + | TArray (typ,_,_,_) -> 1+ brackets_typ (Cil.unrollType typ) + | TInt(_,_) | TFloat(_,_) | TFun _ | TEnum (_,_) | TComp (_,_,_) + | TPtr (_,_) | TBuiltin_va_list _ | TVoid _ | TNamed _ -> 0 (* [bracket_and_stars_typ typ] accounts the number of [dim] and the number of pointer if typ is a pointer on array type. *) let brackets_and_stars_typ typ = let rec stars_and_elt typ = - match Cil.unrollType typ with + match Cil.unrollType typ with | TPtr (typ,_) -> - let (n,t) = stars_and_elt (Cil.unrollType typ) in - (n+1),t + let (n,t) = stars_and_elt (Cil.unrollType typ) in + (n+1),t | TInt(_,_) | TFloat(_,_) | TFun _ | TEnum (_,_) | TComp (_,_,_) | TArray (_,_,_,_) | TBuiltin_va_list _ | TVoid _ | TNamed _ as t-> (0,t) @@ -166,41 +166,41 @@ | Lval (Var x,off ) -> Some(x,Cil.typeOfLval (Var x,off),0) | Lval (Mem e, _) -> (match stars_exp (Cil.stripInfo e).enode with - | None -> None - | Some (x,ty,n) -> Some (x, ty ,n+1)) + | None -> None + | Some (x,ty,n) -> Some (x, ty ,n+1)) | _ -> None - + (* [stars_term t] returns Some (x,ty,n) if t == * x and ty is the type of the entire inner lval else returns none. *) let rec stars_term = function | TLval (TVar lvar,off ) | Tat ({term_node = - TLval (TVar lvar,off )}, _ ) -> + TLval (TVar lvar,off )}, _ ) -> Some(lvar,(Cil.typeOfTermLval(TVar lvar,off ) ),0) | TLval (TMem t,_ ) | Tat ({term_node = - TLval (TMem t,_)}, _ ) -> + TLval (TMem t,_)}, _ ) -> (match stars_term t.term_node with - | None -> None - | Some (x,ty,n) -> Some (x,ty,n+1)) - | _ -> None - + | None -> None + | Some (x,ty,n) -> Some (x,ty,n+1)) + | _ -> None + (* [brackets_off off] returns Some n if off == [] else returns none. *) let rec brackets_off = function - | Index (_,off) -> - (match brackets_off off with - | Some n ->Some (1+n) - | None -> None ) - | NoOffset -> Some 0 - | _ -> None + | Index (_,off) -> + (match brackets_off off with + | Some n ->Some (1+n) + | None -> None ) + | NoOffset -> Some 0 + | _ -> None (* [brackets_toff off] returns Some n if off == [] else returns none. *) let rec brackets_toff = function | TIndex(_,toff) -> (match brackets_toff toff with - | Some n ->Some (1+n) - | None -> None ) + | Some n ->Some (1+n) + | None -> None ) | TNoOffset -> Some 0 | _ -> None @@ -208,59 +208,59 @@ let bracket_exp = function | Lval (Var x,off) -> (match brackets_off off with - | Some n -> Some(x,n) - | None -> None) + | Some n -> Some(x,n) + | None -> None) | _ -> None (* [bracket_term t] returns Some(x,n) if t == x[] else returns none*) let bracket_term = function | TLval (TVar x,off) | Tat ({term_node = - TLval (TVar x,off)}, _ ) -> + TLval (TVar x,off)}, _ ) -> (match brackets_toff off with - | Some n -> Some(x,n) - | None -> None) + | Some n -> Some(x,n) + | None -> None) | _ -> None - + (* [delta_ptr e] returns Some x if e == x+i and x has pointer type returns None *) let delta_ptr = function | BinOp ((PlusPI|MinusPI), - {enode = Lval (Var x,off)},_ , _ ) -> + {enode = Lval (Var x,off)},_ , _ ) -> Some (x, stars_typ (Cil.typeOfLval (Var x,off))) | _ -> None - + (* variante of delta_ptr on term; takes care of labelled term *) let delta_ptr_term = function | TBinOp((PlusPI|MinusPI),{term_node = TLval (TVar lvar,off)},_) | Tat ({term_node = - TBinOp((PlusPI|MinusPI),{term_node = TLval (TVar lvar,off)},_) + TBinOp((PlusPI|MinusPI),{term_node = TLval (TVar lvar,off)},_) },_) | TLval (TMem - {term_node = - Tat - ({term_node = - TBinOp((PlusPI|MinusPI), - {term_node = TLval (TVar lvar,off)},_) - },_)},_) + {term_node = + Tat + ({term_node = + TBinOp((PlusPI|MinusPI), + {term_node = TLval (TVar lvar,off)},_) + },_)},_) | TLval (TMem - {term_node = - TBinOp((PlusPI|MinusPI), - {term_node = Tat({term_node = TLval (TVar lvar,off)},_)},_)},_) + {term_node = + TBinOp((PlusPI|MinusPI), + {term_node = Tat({term_node = TLval (TVar lvar,off)},_)},_)},_) | TLval (TMem - {term_node = - TBinOp((PlusPI|MinusPI), - {term_node = TLval (TVar lvar,off)},_)},_) + {term_node = + TBinOp((PlusPI|MinusPI), + {term_node = TLval (TVar lvar,off)},_)},_) | TBinOp((PlusPI|MinusPI), - {term_node = - TLval (TMem - {term_node = - Tat({term_node = TLval (TVar lvar,off)},_)},_)},_) - + {term_node = + TLval (TMem + {term_node = + Tat({term_node = TLval (TVar lvar,off)},_)},_)},_) + -> Some (lvar, stars_lv_typ (Cil.typeOfTermLval (TVar lvar,off))) | _ -> None - + (* [delta_array e] returns Some x if e == x[i] and x has pointer type else returns None *) let delta_array = function @@ -274,19 +274,19 @@ ({term_node = TBinOp(IndexPI,{term_node = TLval (TVar lvar,off)},_) },_) | TLval (TMem - {term_node = - TBinOp(IndexPI,{term_node = TLval (TVar lvar,off)},_)} - , _) - | TLval (TMem - {term_node = Tat - ({term_node = TBinOp(IndexPI,{term_node = TLval (TVar lvar,off)},_) - },_)},_) - | TBinOp(IndexPI, - {term_node = - Tat({term_node = TLval (TVar lvar,off)},_)},_) - -> Some (lvar, stars_lv_typ (Cil.typeOfTermLval (TVar lvar,off))) - | t -> - debug "[delta_array_term] calls delta_ptr_term"; delta_ptr_term t + {term_node = + TBinOp(IndexPI,{term_node = TLval (TVar lvar,off)},_)} + , _) + | TLval (TMem + {term_node = Tat + ({term_node = TBinOp(IndexPI,{term_node = TLval (TVar lvar,off)},_) + },_)},_) + | TBinOp(IndexPI, + {term_node = + Tat({term_node = TLval (TVar lvar,off)},_)},_) + -> Some (lvar, stars_lv_typ (Cil.typeOfTermLval (TVar lvar,off))) + | t -> + debug "[delta_array_term] calls delta_ptr_term"; delta_ptr_term t (**********************************************************************) (*** A - Identification of by reference formal parameters usage and ***) @@ -304,18 +304,18 @@ State_builder.Hashtbl (Cil_datatype.Logic_var.Hashtbl) (Datatype.Bool) - (struct let name = "WP : logic parameters" - let dependencies = [Ast.self] - let size = 40 - end) + (struct let name = "WP : logic parameters" + let dependencies = [Ast.self] + let size = 40 + end) let logic_param_memory_info x = debug "[LogicParam] %a" Printer.pp_logic_var x; - if LogicParam.mem x then - (debug "[LogicParam] %a in " Printer.pp_logic_var x; - LogicParam.replace x true) - else - (debug "[LogicParam] %a out"Printer.pp_logic_var x;()) + if LogicParam.mem x then + (debug "[LogicParam] %a in " Printer.pp_logic_var x; + LogicParam.replace x true) + else + (debug "[LogicParam] %a out"Printer.pp_logic_var x;()) (* Type of ACSL Variable, C-variable or Logic Variable or Formal parameters of builtin predicates/functions.*) @@ -323,7 +323,7 @@ | Cv of varinfo (*C formal parameter*) | Lv of logic_var (*Logic formal parameter*) | Prop (*Parameter of valid or separated or initialized, - ie builtin predicate*) + ie builtin predicate*) (* tests if a logic variable is a formal parameter.*) let is_lformal = function @@ -364,41 +364,41 @@ | Cv x -> x.vformal | Lv lv -> LogicParam.mem lv | Prop -> false - + module VarType = - (Datatype.Make_with_collections - (struct - include Datatype.Serializable_undefined - let name = "WpVarType" - type t = var_type - let reprs = - let cp_repr = List.hd Cil_datatype.Varinfo.reprs in - let lp_repr = List.hd Cil_datatype.Logic_var.reprs in - [Cv cp_repr ; Lv lp_repr ; Prop] - let equal a b = - match a,b with - | Cv a, Cv b -> Cil_datatype.Varinfo.equal a b - | Lv a, Lv b -> Cil_datatype.Logic_var.equal a b - | Prop, Prop -> true - | _ , _ -> false - - let compare a b = - match a,b with - | Cv a, Cv b -> Cil_datatype.Varinfo.compare a b - | Cv _ , _ -> (-1) - | _ , Cv _ -> (1) - | Lv a, Lv b -> Cil_datatype.Logic_var.compare a b - | Prop , Prop -> 0 - | Lv _ , _ -> (-1) - | _ , Lv _ -> (1) - - let hash = function - | Cv v -> (Cil_datatype.Varinfo.hash v)*121 - | Lv p -> (Cil_datatype.Logic_var.hash p)*147 - | Prop -> 147 - end)) + (Datatype.Make_with_collections + (struct + include Datatype.Serializable_undefined + let name = "WpVarType" + type t = var_type + let reprs = + let cp_repr = List.hd Cil_datatype.Varinfo.reprs in + let lp_repr = List.hd Cil_datatype.Logic_var.reprs in + [Cv cp_repr ; Lv lp_repr ; Prop] + let equal a b = + match a,b with + | Cv a, Cv b -> Cil_datatype.Varinfo.equal a b + | Lv a, Lv b -> Cil_datatype.Logic_var.equal a b + | Prop, Prop -> true + | _ , _ -> false + + let compare a b = + match a,b with + | Cv a, Cv b -> Cil_datatype.Varinfo.compare a b + | Cv _ , _ -> (-1) + | _ , Cv _ -> (1) + | Lv a, Lv b -> Cil_datatype.Logic_var.compare a b + | Prop , Prop -> 0 + | Lv _ , _ -> (-1) + | _ , Lv _ -> (1) + + let hash = function + | Cv v -> (Cil_datatype.Varinfo.hash v)*121 + | Lv p -> (Cil_datatype.Logic_var.hash p)*147 + | Prop -> 147 + end)) (*Table of other kind of variables *) module AnyVar = @@ -406,9 +406,9 @@ (VarType.Hashtbl) (Datatype.Unit) (struct let name = "WP: argument multi pattern" - let dependencies = [Ast.self] - let size = 47 - end) + let dependencies = [Ast.self] + let size = 47 + end) (* only used to records universally and existentially bound variables as value variables. (ie. do not have to be optimized) *) @@ -425,12 +425,12 @@ a by reference pattern. *) module AddrTaken = State_builder.Hashtbl - (VarType.Hashtbl) + (VarType.Hashtbl) (Datatype.Pair (Datatype.Int) (Datatype.Int)) (struct let name = "WP: addr_taken" - let dependencies = [Ast.self] - let size = 47 - end) + let dependencies = [Ast.self] + let size = 47 + end) let string_addr b = if b then "address taken" else "not address taken" @@ -463,43 +463,43 @@ variables which have not to be optimized. *) class logic_parameters_and_addr_taken_collection : Visitor.frama_c_visitor = object - inherit Visitor.frama_c_inplace - - method! vexpr e = - match (Cil.stripInfo e).enode with - | StartOf (Var vinfo,_) - | AddrOf (Var vinfo,_) -> incr_addr_taken (Cv vinfo); DoChildren - | _ -> DoChildren - - method! vterm t = - match t.term_node with - | TAddrOf(TVar lv,_) - | TStartOf(TVar lv,_) -> - incr_addr_taken (var_type_of_lvar lv); DoChildren - | _ -> DoChildren - - method! vpredicate = function - | Pforall (xl,_) | Pexists (xl,_) -> - add_logics_value xl ; DoChildren - | _ -> DoChildren - - - method! vannotation = function - | Dfun_or_pred (linfo,_) -> - List.iter (fun lv -> - oracle "[logicParam] %a" Printer.pp_logic_var lv; - LogicParam.replace lv false) linfo.l_profile; - DoChildren - | _ ->DoChildren + inherit Visitor.frama_c_inplace + + method! vexpr e = + match (Cil.stripInfo e).enode with + | StartOf (Var vinfo,_) + | AddrOf (Var vinfo,_) -> incr_addr_taken (Cv vinfo); DoChildren + | _ -> DoChildren + + method! vterm t = + match t.term_node with + | TAddrOf(TVar lv,_) + | TStartOf(TVar lv,_) -> + incr_addr_taken (var_type_of_lvar lv); DoChildren + | _ -> DoChildren + + method! vpredicate = function + | Pforall (xl,_) | Pexists (xl,_) -> + add_logics_value xl ; DoChildren + | _ -> DoChildren + - end + method! vannotation = function + | Dfun_or_pred (linfo,_) -> + List.iter (fun lv -> + oracle "[logicParam] %a" Printer.pp_logic_var lv; + LogicParam.replace lv false) linfo.l_profile; + DoChildren + | _ ->DoChildren + +end let compute_logic_params () = debug "[LP+AT] logic parameters and address taken computation"; if not (LogicParam.is_computed()) || not (AddrTaken.is_computed()) then - ( Visitor.visitFramacFile - (new logic_parameters_and_addr_taken_collection)(Ast.get()); - LogicParam.mark_as_computed();AddrTaken.mark_as_computed()) + ( Visitor.visitFramacFile + (new logic_parameters_and_addr_taken_collection)(Ast.get()); + LogicParam.mark_as_computed();AddrTaken.mark_as_computed()) @@ -517,9 +517,9 @@ For a vartype [x], a [ChainCalls] the list of all call binding when [x] is (the root of) the effective argument.*) module ChainCalls = - (Datatype.List (Datatype.Pair (Datatype.Int) - (Datatype.Pair (Datatype.Bool)(VarType)))) - + (Datatype.List (Datatype.Pair (Datatype.Int) + (Datatype.Pair (Datatype.Bool)(VarType)))) + let pp_call fmt (n,(b,p)) = Format.fprintf fmt "%a of arity:%d with %s " pp_var_type p n (string_addr b) @@ -532,19 +532,19 @@ (VarType.Hashtbl) (Datatype.Pair (Datatype.Int) (ChainCalls)) (struct let name = "WP: by pointer reference parameters" - let dependencies = [Ast.self] - let size = 47 - end) + let dependencies = [Ast.self] + let size = 47 + end) (* Table of the parameters of by array reference passing call *) module ByAReference = State_builder.Hashtbl (VarType.Hashtbl) - (Datatype.Pair (Datatype.Int) (ChainCalls)) + (Datatype.Pair (Datatype.Int) (ChainCalls)) (struct let name = "WP: by array reference parameters" - let dependencies = [Ast.self] - let size = 47 - end) + let dependencies = [Ast.self] + let size = 47 + end) (* Table of the parameter of by value passing call *) module ByValue = @@ -552,9 +552,9 @@ (VarType.Hashtbl) (Datatype.Unit) (struct let name = "WP: by value parameters" - let dependencies = [Ast.self] - let size = 47 - end) + let dependencies = [Ast.self] + let size = 47 + end) let is_pure_logic = function | Lv lv -> (LogicParam.mem lv) && (lv.lv_origin = None) @@ -578,24 +578,24 @@ oracle "[ByPRef] first step + (%a,%d)" pp_var_type x n; if n = 0 && (is_pure_logic x) then (ByPReference.remove x ; ByValue.replace x ()) - else ( - try - if not (fst(ByPReference.find x) = n) then - (oracle "[ByPRef] remove %a: ko arity -> + ByValue" pp_var_type x; - ByPReference.remove x ; ByValue.replace x ()) - else (oracle "[ByPRef] (%a,%d) already" pp_var_type x n;()) - with Not_found -> - oracle "[ByPRef] %a not yet"pp_var_type x; - if ByValue.mem x then - (oracle "[ByPRef] not add %a : byValue" pp_var_type x; ()) - else - (if ByAReference.mem x then - (oracle "[ByPRef] %a in byARef : remove -> add in ByValue" - pp_var_type x; - ByAReference.remove x;ByValue.replace x()) - else - (oracle "[ByPRef] add (%a,%d)" pp_var_type x n; - ByPReference.replace x (n,[]))) ) + else ( + try + if not (fst(ByPReference.find x) = n) then + (oracle "[ByPRef] remove %a: ko arity -> + ByValue" pp_var_type x; + ByPReference.remove x ; ByValue.replace x ()) + else (oracle "[ByPRef] (%a,%d) already" pp_var_type x n;()) + with Not_found -> + oracle "[ByPRef] %a not yet"pp_var_type x; + if ByValue.mem x then + (oracle "[ByPRef] not add %a : byValue" pp_var_type x; ()) + else + (if ByAReference.mem x then + (oracle "[ByPRef] %a in byARef : remove -> add in ByValue" + pp_var_type x; + ByAReference.remove x;ByValue.replace x()) + else + (oracle "[ByPRef] add (%a,%d)" pp_var_type x n; + ByPReference.replace x (n,[]))) ) (*[remove_ptr_reference_param x] tries to removed [x] from the @@ -608,7 +608,7 @@ ByPReference.remove x) ; oracle "[ByPRef] add in ByValue %a"pp_var_type x; ByValue.replace x () - + (*[add_array_reference_param x n] tries to register [x] with arity [n] in the table of by array reference parameters. @@ -624,7 +624,7 @@ *[x] is not in any table, [x] is registered in the by array reference parameters with arity [n] and the empty chaincall. -NB : As the behavior of a by pointer reference parameter is included + NB : As the behavior of a by pointer reference parameter is included in the behavior of a by array reference parameter; a vartype [x] in ByPReference has to be "promoted" to the ByAReference table in this function. @@ -643,13 +643,13 @@ (oracle "[ByARef] not add %a : byValue" pp_var_type x; ()) else begin - try let (_,calls) = ByPReference.find x in - oracle "[ByARef] %a in byPRef : promote to byAref" - pp_var_type x; - ByAReference.replace x (n,calls); ByPReference.remove x - with Not_found -> - (oracle "[ByARef] add (%a,%d)" pp_var_type x n; - ByAReference.replace x (n,[])) + try let (_,calls) = ByPReference.find x in + oracle "[ByARef] %a in byPRef : promote to byAref" + pp_var_type x; + ByAReference.replace x (n,calls); ByPReference.remove x + with Not_found -> + (oracle "[ByARef] add (%a,%d)" pp_var_type x n; + ByAReference.replace x (n,[])) end let remove_array_reference_param x = @@ -674,129 +674,129 @@ (* [by_pointer_reference_usage e] implemants 1p *) let by_pointer_reference_usage e = match stars_exp e with - | None -> Any - | Some (x,ty,n) -> - if x.vformal then - (if (stars_typ ty = n) then Ok (x,n) else Any) - else Any + | None -> Any + | Some (x,ty,n) -> + if x.vformal then + (if (stars_typ ty = n) then Ok (x,n) else Any) + else Any let by_pointer_reference_usage_term e = match stars_term e with - | None -> Any - | Some (x,ty,n) -> - if (is_lformal x) then - (if (stars_lv_typ ty = n) then Ok (x,n) else Any) - else Any + | None -> Any + | Some (x,ty,n) -> + if (is_lformal x) then + (if (stars_lv_typ ty = n) then Ok (x,n) else Any) + else Any (* [by_array_reference_usage e] implements 1a*) let by_array_reference_usage e = let s = "[by_array_ref_usage]" in debug "%s" s; match delta_array e with - | None -> - (match bracket_exp e with - | None -> - debug "%s not a bracket pattern" s; - Any - | Some (x,n) -> - debug "%s %a[]<%d>" s Printer.pp_varinfo x n; - if x.vformal then - (debug "%s %a is a formal" s Printer.pp_varinfo x; - let arr = brackets_and_stars_typ x.vtype in - if (arr >= n) then - (debug "%s %a has dim %d ok!" s Printer.pp_varinfo x arr; - Ok (x,arr)) else - (debug "%s %a has dim %d when need %d ko!" - s Printer.pp_varinfo x arr n; - Ko(x,arr)) - ) - else - ( debug "%s %a is not a formal" s Printer.pp_varinfo x; - Any) ) - | Some (x,n) -> - debug "%s %a[]" s Printer.pp_varinfo x ; - if x.vformal then Ok (x,n) else Any - + | None -> + (match bracket_exp e with + | None -> + debug "%s not a bracket pattern" s; + Any + | Some (x,n) -> + debug "%s %a[]<%d>" s Printer.pp_varinfo x n; + if x.vformal then + (debug "%s %a is a formal" s Printer.pp_varinfo x; + let arr = brackets_and_stars_typ x.vtype in + if (arr >= n) then + (debug "%s %a has dim %d ok!" s Printer.pp_varinfo x arr; + Ok (x,arr)) else + (debug "%s %a has dim %d when need %d ko!" + s Printer.pp_varinfo x arr n; + Ko(x,arr)) + ) + else + ( debug "%s %a is not a formal" s Printer.pp_varinfo x; + Any) ) + | Some (x,n) -> + debug "%s %a[]" s Printer.pp_varinfo x ; + if x.vformal then Ok (x,n) else Any + let by_array_reference_usage_term e = let s = "[by_array_ref_usage_term]" in - debug "%s" s; + debug "%s" s; match delta_array_term e with - | None -> - (match bracket_term e with - | None -> - debug "%s not a bracket pattern" s; Any - | Some (x,n) -> - begin - debug "%s %a[]<%d>" s Printer.pp_logic_var x n; - if (is_lformal x) then - ( debug "%s %a is a formal" s Printer.pp_logic_var x; - let arr = brackets_and_stars_lv_typ x.lv_type in - if (arr >= n) then - (debug "%s %a has dim %d ok!" s - Printer.pp_logic_var x arr ;Ok (x,arr)) - else - (debug "%s %a has dim %d when need %d ko!" - s Printer.pp_logic_var x arr n - ;Ko (x,arr))) - else - ( debug "%s %a is not a formal" - s Printer.pp_logic_var x;Any) - end) - - |Some (x,n) -> - debug "%s %a[]" s Printer.pp_logic_var x ; - if is_lformal x then Ok (x,n) else Any - + | None -> + (match bracket_term e with + | None -> + debug "%s not a bracket pattern" s; Any + | Some (x,n) -> + begin + debug "%s %a[]<%d>" s Printer.pp_logic_var x n; + if (is_lformal x) then + ( debug "%s %a is a formal" s Printer.pp_logic_var x; + let arr = brackets_and_stars_lv_typ x.lv_type in + if (arr >= n) then + (debug "%s %a has dim %d ok!" s + Printer.pp_logic_var x arr ;Ok (x,arr)) + else + (debug "%s %a has dim %d when need %d ko!" + s Printer.pp_logic_var x arr n + ;Ko (x,arr))) + else + ( debug "%s %a is not a formal" + s Printer.pp_logic_var x;Any) + end) + + |Some (x,n) -> + debug "%s %a[]" s Printer.pp_logic_var x ; + if is_lformal x then Ok (x,n) else Any + (*[reference_parameter_usage e] implements the recognition of the patterns of by reference parameters *) let reference_parameter_usage e = - debug "[reference_parameter_usage]" ; + debug "[reference_parameter_usage]" ; match by_pointer_reference_usage e with - | Ok(x,n) -> - debug " %a used as ptr reference param of arity %d" - Printer.pp_varinfo x n ; - add_ptr_reference_param (Cv x) n; true - | Ko(x,_) -> - debug " %a BADLY used as ptr reference param" - Printer.pp_varinfo x ; - remove_ptr_reference_param (Cv x); true - | Any -> - (match by_array_reference_usage e with - | Ok(x,n) -> - debug " %a used as array reference param of arity %d" - Printer.pp_varinfo x n ; - add_array_reference_param (Cv x) n ; true - | Ko(x,_) -> - debug " %a BADLY used as array reference param" - Printer.pp_varinfo x ; - remove_array_reference_param (Cv x);true - | Any -> (); false) + | Ok(x,n) -> + debug " %a used as ptr reference param of arity %d" + Printer.pp_varinfo x n ; + add_ptr_reference_param (Cv x) n; true + | Ko(x,_) -> + debug " %a BADLY used as ptr reference param" + Printer.pp_varinfo x ; + remove_ptr_reference_param (Cv x); true + | Any -> + (match by_array_reference_usage e with + | Ok(x,n) -> + debug " %a used as array reference param of arity %d" + Printer.pp_varinfo x n ; + add_array_reference_param (Cv x) n ; true + | Ko(x,_) -> + debug " %a BADLY used as array reference param" + Printer.pp_varinfo x ; + remove_array_reference_param (Cv x);true + | Any -> (); false) let reference_parameter_usage_lval lv = reference_parameter_usage (Lval lv) let reference_parameter_usage_term e = debug "[reference_parameter_usage_term]" ; match by_pointer_reference_usage_term e with - | Ok(x,n) -> - debug " %a used as ptr reference param of arity %d" - Printer.pp_logic_var x n ; - add_ptr_reference_param (var_type_of_lvar x) n ; true - | Ko(x,_) -> - debug " %a BADLY used as ptr reference param" - Printer.pp_logic_var x ; - remove_ptr_reference_param (var_type_of_lvar x) ; true - | Any -> - (match by_array_reference_usage_term e with - | Ok(x,n) -> - debug " %a used as array reference param of arity %d" - Printer.pp_logic_var x n ; - add_array_reference_param (var_type_of_lvar x) n ; true - | Ko(x,_) -> - debug " %a BADLY used as array reference param" - Printer.pp_logic_var x ; - remove_array_reference_param (var_type_of_lvar x) ; true - | Any -> (); false) + | Ok(x,n) -> + debug " %a used as ptr reference param of arity %d" + Printer.pp_logic_var x n ; + add_ptr_reference_param (var_type_of_lvar x) n ; true + | Ko(x,_) -> + debug " %a BADLY used as ptr reference param" + Printer.pp_logic_var x ; + remove_ptr_reference_param (var_type_of_lvar x) ; true + | Any -> + (match by_array_reference_usage_term e with + | Ok(x,n) -> + debug " %a used as array reference param of arity %d" + Printer.pp_logic_var x n ; + add_array_reference_param (var_type_of_lvar x) n ; true + | Ko(x,_) -> + debug " %a BADLY used as array reference param" + Printer.pp_logic_var x ; + remove_array_reference_param (var_type_of_lvar x) ; true + | Any -> (); false) (**********************************************************************) @@ -813,21 +813,21 @@ method! vinst = function | Call (_ ,{enode =Lval(Var _,NoOffset)} , _,_) -> SkipChildren | Set (lv,_,_) -> - if reference_parameter_usage_lval lv then SkipChildren else DoChildren + if reference_parameter_usage_lval lv then SkipChildren else DoChildren | _ -> DoChildren method! vexpr e = if reference_parameter_usage (Cil.stripInfo e).enode then SkipChildren else DoChildren - + method! vterm t = match t.term_node with - | Tapp (_,_ , _) -> SkipChildren - | Tblock_length (_,_) - | Toffset (_,_) -> SkipChildren - | t1 -> - if reference_parameter_usage_term t1 then SkipChildren else DoChildren - + | Tapp (_,_ , _) -> SkipChildren + | Tblock_length (_,_) + | Toffset (_,_) -> SkipChildren + | t1 -> + if reference_parameter_usage_term t1 then SkipChildren else DoChildren + method! vpredicate = function | Papp (_, _, _) -> SkipChildren | Pvalid _ @@ -844,13 +844,13 @@ "[Parameters Usage] computing address taken and logic parameters first"; compute_logic_params (); if not (ByValue.is_computed()) || - not (ByPReference.is_computed() || not(ByAReference.is_computed())) + not (ByPReference.is_computed() || not(ByAReference.is_computed())) then ( Visitor.visitFramacFile - (new parameters_call_kind_analysis)(Ast.get()); + (new parameters_call_kind_analysis)(Ast.get()); ByPReference.mark_as_computed();ByAReference.mark_as_computed(); ByValue.mark_as_computed()) - + (*************************************************************************) (*** Usage of effective parameter in by reference call ***) @@ -874,71 +874,71 @@ | Lval (Var x,off) -> let t = (Cil.typeOfLval (Var x,off)) in if Cil.isPointerType t then - Ok (x,false, stars_typ t) + Ok (x,false, stars_typ t) else Any | AddrOf (Var x, off) -> Ok (x,true, stars_typ (Cil.typeOfLval (Var x,off))) | e -> begin - match delta_ptr e with - | None -> - (match stars_exp e with - | None -> Any - | Some (x,ty,n) -> - let stars = stars_typ ty in - if n < stars - then Ok (x,false,n) else - (if stars = n then Any else Ko (x,false,n))) - | Some (x,n) -> Ok (x,false,n) + match delta_ptr e with + | None -> + (match stars_exp e with + | None -> Any + | Some (x,ty,n) -> + let stars = stars_typ ty in + if n < stars + then Ok (x,false,n) else + (if stars = n then Any else Ko (x,false,n))) + | Some (x,n) -> Ok (x,false,n) end - + let by_pointer_reference_pattern_term = function | TLval(TVar lvar, off) | Tat ({term_node = TLval(TVar lvar, off) },_)-> let t = Cil.typeOfTermLval (TVar lvar,off) in if Logic_utils.isLogicPointerType t then - Ok (lvar,false,stars_lv_typ t) + Ok (lvar,false,stars_lv_typ t) else Any | TAddrOf(TVar lvar, off) | Tat ({term_node = TAddrOf(TVar lvar, off) },_)-> Ok (lvar,true, stars_lv_typ (Cil.typeOfTermLval (TVar lvar,off))) | Tat({term_node = t},_) | t -> begin - match delta_ptr_term t with - | None -> - (match stars_term t with - | None -> Any - | Some (x,ty,n) -> - let stars = stars_lv_typ ty in - if n < stars - then Ok (x,false,n) else - (if n = stars then Any else Ko (x,false,n))) - | Some (x,n) -> Ok (x,false,n) + match delta_ptr_term t with + | None -> + (match stars_term t with + | None -> Any + | Some (x,ty,n) -> + let stars = stars_lv_typ ty in + if n < stars + then Ok (x,false,n) else + (if n = stars then Any else Ko (x,false,n))) + | Some (x,n) -> Ok (x,false,n) end (* help called in [by_array_reference_pattern e]*) let help_by_array_reference_pattern e = - match delta_array e with - | None -> - (match bracket_exp e with - | None -> Any - | Some (x,n) -> - if x.vformal then - begin - let dim = brackets_typ x.vtype in - if n < dim - then (Ok (x,false,n)) else - (if n = dim then Any else Ko (x,false,n)) - end - else Ok(x,false,n)) - | Some (x,n) -> Ok (x,false,n) + match delta_array e with + | None -> + (match bracket_exp e with + | None -> Any + | Some (x,n) -> + if x.vformal then + begin + let dim = brackets_typ x.vtype in + if n < dim + then (Ok (x,false,n)) else + (if n = dim then Any else Ko (x,false,n)) + end + else Ok(x,false,n)) + | Some (x,n) -> Ok (x,false,n) (*[by_array_reference_pattern e] returns [Ok (x,b,n)] if [x] appears as a root in [e] with test of address taken (b] and arity [n]. - + A by array reference pattern is one of the following : - x+offset (StarOf) ----> Ok(x,true,arity_of (typ(x))); - x[], k < bracket(typ(x)) ----->Ok(x,false,k); @@ -957,72 +957,72 @@ Ok (x,true,brackets_typ (Cil.typeOfLval (Var x,off))) | AddrOf (Mem e, _) -> (match delta_ptr (Cil.stripInfo e).enode with - | None -> Any - | Some (x,n) -> Ok (x,true,n)) + | None -> Any + | Some (x,n) -> Ok (x,true,n)) | CastE (t,e) -> debug "[by_array_reference_pattern] cast case"; - if Cil.isPointerType t then - ( debug "is a pointer type"; - help_by_array_reference_pattern (Cil.stripInfo e).enode) - else - (debug "is NOT a pointer type " ;Any ) + if Cil.isPointerType t then + ( debug "is a pointer type"; + help_by_array_reference_pattern (Cil.stripInfo e).enode) + else + (debug "is NOT a pointer type " ;Any ) | e -> help_by_array_reference_pattern e let help_array_reference_pattern_term s t = match delta_array_term t with - | None -> - (match bracket_term t with - | None -> Any - | Some (x,n) -> - if is_lformal x then - begin - debug "%s %a[]<%d>" s Printer.pp_logic_var x n; - let dim = brackets_lv_typ x.lv_type in - if n < dim - then - (debug "%s %a has dimension %d ok!" - s Printer.pp_logic_var x n; - Ok (x,false,n)) - else - ( if dim = n then Any else - (debug "%s %a has dimension %d when need %d!" - s Printer.pp_logic_var x dim n; - Ko (x,false,n))) - end - else Ok(x,false,n) - ) - | Some (x,n) -> - debug "%s %a in delta_array term" s Printer.pp_logic_var x; - Ok (x,false,n) - + | None -> + (match bracket_term t with + | None -> Any + | Some (x,n) -> + if is_lformal x then + begin + debug "%s %a[]<%d>" s Printer.pp_logic_var x n; + let dim = brackets_lv_typ x.lv_type in + if n < dim + then + (debug "%s %a has dimension %d ok!" + s Printer.pp_logic_var x n; + Ok (x,false,n)) + else + ( if dim = n then Any else + (debug "%s %a has dimension %d when need %d!" + s Printer.pp_logic_var x dim n; + Ko (x,false,n))) + end + else Ok(x,false,n) + ) + | Some (x,n) -> + debug "%s %a in delta_array term" s Printer.pp_logic_var x; + Ok (x,false,n) + let by_array_reference_pattern_term t = let s = "[by_array_reference_pattern_term]" in match t with | TStartOf (TVar lvar,off) | Tat ({term_node = TStartOf (TVar lvar,off) },_)-> - debug "%s %a " s Printer.pp_logic_var lvar; + debug "%s %a " s Printer.pp_logic_var lvar; Ok(lvar,true,brackets_lv_typ (Cil.typeOfTermLval (TVar lvar,off))) - + |TCastE(ty,{term_node = ( TStartOf (TVar lvar,off) - | Tat ({term_node = TStartOf (TVar lvar,off) },_))}) when + | Tat ({term_node = TStartOf (TVar lvar,off) },_))}) when Cil.isPointerType ty -> - debug "%s %a " s Printer.pp_logic_var lvar; - Ok (lvar,true,brackets_lv_typ(Cil.typeOfTermLval (TVar lvar,off))) + debug "%s %a " s Printer.pp_logic_var lvar; + Ok (lvar,true,brackets_lv_typ(Cil.typeOfTermLval (TVar lvar,off))) | TAddrOf (TMem t, _) | Tat ({term_node = TAddrOf (TMem t, _) },_) -> (match delta_ptr_term t.term_node with - | None -> Any - | Some (x,n) -> - debug "%s %a in delta_ptr term" s Printer.pp_logic_var x; - Ok (x,true,n)) + | None -> Any + | Some (x,n) -> + debug "%s %a in delta_ptr term" s Printer.pp_logic_var x; + Ok (x,true,n)) | Tat({term_node = t},_)-> help_array_reference_pattern_term s t | TCastE(ty,{term_node = t}) when (Cil.isPointerType ty)-> help_array_reference_pattern_term s t | t ->help_array_reference_pattern_term s t - - + + @@ -1060,33 +1060,33 @@ module ArgPReference = State_builder.Hashtbl (VarType.Hashtbl) - (Datatype.Pair (Datatype.Int) (ChainCalls)) + (Datatype.Pair (Datatype.Int) (ChainCalls)) (struct let name = "WP: argument by pointer reference not formal" - let dependencies = [Ast.self] - let size = 47 - end) + let dependencies = [Ast.self] + let size = 47 + end) (*Table of by array reference argument *) module ArgAReference = State_builder.Hashtbl (VarType.Hashtbl) - (Datatype.Pair (Datatype.Int) (ChainCalls)) + (Datatype.Pair (Datatype.Int) (ChainCalls)) (struct let name = "WP: argument by array reference not formal" - let dependencies = [Ast.self] - let size = 47 - end) + let dependencies = [Ast.self] + let size = 47 + end) + - (* [add_ptr_reference_arg x n] tries to adds [x] of arity [n] in the table of by pointer reference argument. - + -If [x] is in AnyVar table, then [x] can't been added to this table. -If [x] is already registered in by pointer reference argument, the already recorded arity has to be [n] else [x] is removed from this table and adds to the AnyVar table. - + - If [x] is not registered in the by pointer reference table: *[x] is in the by array reference argument then [x] is removed from this table and adds to the any var table. @@ -1100,22 +1100,22 @@ else begin try - if not (fst (ArgPReference.find x) = n) then - (oracle "[ArgPRef] remove %a : ko arity ->+AnyVar" - pp_var_type x; - ArgPReference.remove x; AnyVar.replace x ()) - else - (oracle "[ArgPRef] %a already" pp_var_type x;()) + if not (fst (ArgPReference.find x) = n) then + (oracle "[ArgPRef] remove %a : ko arity ->+AnyVar" + pp_var_type x; + ArgPReference.remove x; AnyVar.replace x ()) + else + (oracle "[ArgPRef] %a already" pp_var_type x;()) with Not_found -> - (if ArgAReference.mem x then - (oracle "[ArgPRef] %a ArgARef : remove -> + AnyVar" - pp_var_type x; - ArgAReference.remove x; AnyVar.add x ()) - else - (oracle "[ArgPRef] + %a"pp_var_type x; - ArgPReference.add x (n,[]))) + (if ArgAReference.mem x then + (oracle "[ArgPRef] %a ArgARef : remove -> + AnyVar" + pp_var_type x; + ArgAReference.remove x; AnyVar.add x ()) + else + (oracle "[ArgPRef] + %a"pp_var_type x; + ArgPReference.add x (n,[]))) end - + let remove_ptr_reference_arg x = oracle "[ArgPRef] remove %a" pp_var_type x; if ArgPReference.mem x then @@ -1125,7 +1125,7 @@ AnyVar.replace x () (* [add_array_reference_arg x n] tries to add [x] with arity [n] in the table - of by array reference arguments. + of by array reference arguments. - If [x] is in any var table, [x] can't been added to this table. - If [x] already registered in the by array reference argument; then @@ -1133,7 +1133,7 @@ *[n] is not the correct arity, [x] is removed from this table and adds to the any var table *[n] is the correct arity, nothing has to be done - - If [x] is not yet in the table of by array reference argument: + - If [x] is not yet in the table of by array reference argument: *[x] is in the table of by pointer reference argument. [x] is removed form this table and adds to the any var table *[x] has not yet been registered, [x] is registered with the @@ -1147,22 +1147,22 @@ else begin try - if not (fst (ArgAReference.find x) = n) then - (oracle "[ArgARef] remove %a : ko arity ->+AnyVar" - pp_var_type x; - ArgAReference.remove x; AnyVar.replace x ()) - else - (oracle "[ArgARef] %a already" pp_var_type x;()) + if not (fst (ArgAReference.find x) = n) then + (oracle "[ArgARef] remove %a : ko arity ->+AnyVar" + pp_var_type x; + ArgAReference.remove x; AnyVar.replace x ()) + else + (oracle "[ArgARef] %a already" pp_var_type x;()) with Not_found -> - (if ArgPReference.mem x then - (oracle "[ArgARef] %a ArgPRef : remove -> + AnyVar" - pp_var_type x; - ArgPReference.remove x; AnyVar.add x ()) - else - (oracle "[ArgARef] + %a"pp_var_type x; - ArgAReference.add x (n,[]))) + (if ArgPReference.mem x then + (oracle "[ArgARef] %a ArgPRef : remove -> + AnyVar" + pp_var_type x; + ArgPReference.remove x; AnyVar.add x ()) + else + (oracle "[ArgARef] + %a"pp_var_type x; + ArgAReference.add x (n,[]))) end - + let remove_array_reference_arg x = oracle "[ArgARef] remove %a" pp_var_type x; if ArgAReference.mem x then @@ -1186,7 +1186,7 @@ into the signature [sgn] when [x] is a none formal. Then, the [chain_call] of [x] is updated in the [ArgPReference] table with the call site [(n,p)]. - - [x[]] in [eargs] associates to the parameter [p] + - [x[]] in [eargs] associates to the parameter [p] into the signature [sgn] when [x] is a none formal. Then, the [chain_call] of [x] is updated in the [ByAReference] table with the call site [(n,p)]. @@ -1212,27 +1212,27 @@ a) if [n] is convenient for [arr] then add [x] to the table of by array reference parameter with arity [arr] and the call. b) else nothing has to be done - *) +*) let collect_formal_array_call s x n b p = try let (arr,calls) = ByAReference.find x in oracle "%s %a ByARef" s pp_var_type x; if n <= arr then ( oracle "%s %a + call(%a,%d,%s)" s pp_var_type x - pp_var_type p n (string_addr b); - ByAReference.replace x (arr,((n,(b, p))::calls))) + pp_var_type p n (string_addr b); + ByAReference.replace x (arr,((n,(b, p))::calls))) else ( oracle "%s %a remove %d used %d" s pp_var_type x arr n; - remove_array_reference_param x) + remove_array_reference_param x) with Not_found -> oracle "%s %a not yet ByARef" s pp_var_type x; let arr = brackets_and_stars_var_type_typ x in add_array_reference_param x arr; try let (_,calls) = ByAReference.find x in - ByAReference.replace x (arr,(n,(b,p))::calls) + ByAReference.replace x (arr,(n,(b,p))::calls) with Not_found -> () - + (* as collect_arg_array_call for by pointer reference call of argument.*) let collect_arg_ptr_call s x n b p = if AnyVar.mem x then @@ -1242,21 +1242,21 @@ let (arr,calls) = ArgPReference.find x in oracle "%s %a ArfPRef" s pp_var_type x; if n <= arr then - (oracle "%s %a + call(%a,%d,%s)" s pp_var_type x - pp_var_type p n (string_addr b); - ArgPReference.replace x (arr,((n,(b,p))::calls))) + (oracle "%s %a + call(%a,%d,%s)" s pp_var_type x + pp_var_type p n (string_addr b); + ArgPReference.replace x (arr,((n,(b,p))::calls))) else - (oracle "%s %a remove %d used %d" s pp_var_type x arr n; - remove_ptr_reference_arg x) + (oracle "%s %a remove %d used %d" s pp_var_type x arr n; + remove_ptr_reference_arg x) with Not_found -> oracle "%s %a not yet in ArgPref" s pp_var_type x; let arr = stars_var_type_typ x in add_ptr_reference_arg x arr; if ArgPReference.mem x then - (if n <= arr then - (oracle"%s %a + call(%a,%d,%s)" - s pp_var_type x pp_var_type p n (string_addr b); - ArgPReference.replace x (arr,[n,(b,p)])) - else ()) + (if n <= arr then + (oracle"%s %a + call(%a,%d,%s)" + s pp_var_type x pp_var_type p n (string_addr b); + ArgPReference.replace x (arr,[n,(b,p)])) + else ()) (* [collect_arg_array_call s x n b p] tries to collect, in the bellow function @@ -1279,26 +1279,26 @@ let (arr,calls) = ArgAReference.find x in oracle "%s %a ArfARef" s pp_var_type x; if n <= arr then - (oracle "%s %a + call(%a,%d,%s)" s pp_var_type x - pp_var_type p n (string_addr b); - ArgAReference.replace x (arr,((n,(b,p))::calls))) + (oracle "%s %a + call(%a,%d,%s)" s pp_var_type x + pp_var_type p n (string_addr b); + ArgAReference.replace x (arr,((n,(b,p))::calls))) else - (oracle "%s %a remove %d used %d" s pp_var_type x arr n; - remove_array_reference_arg x) - with Not_found -> - oracle "%s %a not yet in ArgAref" s pp_var_type x; - oracle "%s %a try to collect with %d" - s pp_var_type x n; - if isVarTypePointerType x then collect_arg_ptr_call s x n b p - else - (if n <> 0 then - (oracle"%s %a + call(%a,%d,%s)" - s pp_var_type x pp_var_type p n (string_addr b); - add_array_reference_arg x n; - try let (n,calls) = ArgAReference.find x in - ArgAReference.replace x (n,(n,(b,p))::calls) - with Not_found -> ()) - else ()) + (oracle "%s %a remove %d used %d" s pp_var_type x arr n; + remove_array_reference_arg x) + with Not_found -> + oracle "%s %a not yet in ArgAref" s pp_var_type x; + oracle "%s %a try to collect with %d" + s pp_var_type x n; + if isVarTypePointerType x then collect_arg_ptr_call s x n b p + else + (if n <> 0 then + (oracle"%s %a + call(%a,%d,%s)" + s pp_var_type x pp_var_type p n (string_addr b); + add_array_reference_arg x n; + try let (n,calls) = ArgAReference.find x in + ArgAReference.replace x (n,(n,(b,p))::calls) + with Not_found -> ()) + else ()) (* as collect_formal_array_call for by pointer reference parameters. Note that is [px] not yet in the table of by pointer reference parameters @@ -1313,23 +1313,23 @@ oracle "%s %a ByPRef" s pp_var_type px; if n <= arr then ( oracle "%s %a + call(%a,%d,%s)" s pp_var_type px - pp_var_type p n (string_addr b); - ByPReference.replace px (arr,((n,(b,p))::calls))) + pp_var_type p n (string_addr b); + ByPReference.replace px (arr,((n,(b,p))::calls))) else ( oracle "%s %a remove %d used %d" s pp_var_type px arr n; - remove_ptr_reference_param px) + remove_ptr_reference_param px) with Not_found -> oracle "%s %a not yet ByPRef" s pp_var_type px; if ByAReference.mem px then collect_formal_array_call s px n b p else begin - let arr = stars_var_type_typ px in add_ptr_reference_param px arr; - if ByPReference.mem px then - (if n <= arr then - ( oracle "%s %a + call(%a,%d,%s)" - s pp_var_type px pp_var_type p n (string_addr b); - ByPReference.replace px (arr,[n,(b,p)]))) - else () + let arr = stars_var_type_typ px in add_ptr_reference_param px arr; + if ByPReference.mem px then + (if n <= arr then + ( oracle "%s %a + call(%a,%d,%s)" + s pp_var_type px pp_var_type p n (string_addr b); + ByPReference.replace px (arr,[n,(b,p)]))) + else () end @@ -1340,79 +1340,79 @@ the calls, using preview functions according to the identified argument patterns for each pair of effective argument [e] and formal parameter [p]. - *) +*) let rec collect_calls_rec (eargs,fmls) = let s = "[collect_calls]" in match eargs,fmls with - | [],[] -> () - | [], _ | _, [] -> () (*TODO: check for variadyc functions *) - | e::args, p::fmls -> - debug "%s no empty list" s; - let e1 = (Cil.stripInfo e).enode in - (match by_array_reference_pattern e1 with - | Ok (x,b,n) -> - let sb =string_addr b in - debug "%s array pattern of %a with %s" s - Printer.pp_varinfo x sb; - let x = Cv x and p = Cv p in - if is_formal_var_type x then - collect_formal_array_call s x n b p - else - collect_arg_array_call s x n b p - - | Ko (x,_,_) -> - debug "%s not array pattern" s; - if x.vformal then - remove_array_reference_param (Cv x) - else ArgAReference.remove (Cv x) - | Any -> - ( match by_pointer_reference_pattern e1 with - | Ok (x,b,n) -> - let sb = string_addr b in - debug "%s ptr pattern of %a with %s and %d" - s Printer.pp_varinfo x sb n; - let x = Cv x and p = Cv p in - if is_formal_var_type x then - collect_formal_ptr_call s x n b p - else collect_arg_ptr_call s x n b p - - | Ko (x,_,_) -> - debug "%s not ptr pattern" s; - if x.vformal then remove_ptr_reference_param (Cv x) - else ArgPReference.remove (Cv x) - - | Any ->() - ) - ); collect_calls_rec (args,fmls) + | [],[] -> () + | [], _ | _, [] -> () (*TODO: check for variadyc functions *) + | e::args, p::fmls -> + debug "%s no empty list" s; + let e1 = (Cil.stripInfo e).enode in + (match by_array_reference_pattern e1 with + | Ok (x,b,n) -> + let sb =string_addr b in + debug "%s array pattern of %a with %s" s + Printer.pp_varinfo x sb; + let x = Cv x and p = Cv p in + if is_formal_var_type x then + collect_formal_array_call s x n b p + else + collect_arg_array_call s x n b p + + | Ko (x,_,_) -> + debug "%s not array pattern" s; + if x.vformal then + remove_array_reference_param (Cv x) + else ArgAReference.remove (Cv x) + | Any -> + ( match by_pointer_reference_pattern e1 with + | Ok (x,b,n) -> + let sb = string_addr b in + debug "%s ptr pattern of %a with %s and %d" + s Printer.pp_varinfo x sb n; + let x = Cv x and p = Cv p in + if is_formal_var_type x then + collect_formal_ptr_call s x n b p + else collect_arg_ptr_call s x n b p + + | Ko (x,_,_) -> + debug "%s not ptr pattern" s; + if x.vformal then remove_ptr_reference_param (Cv x) + else ArgPReference.remove (Cv x) + + | Any ->() + ) + ); collect_calls_rec (args,fmls) + - let collect_calls f el = let kf = Globals.Functions.get f in let fmls = Kernel_function.get_formals kf in debug "[collect_calls]"; collect_calls_rec (el,fmls) - - + + let ok_array_term_formal s x n b p = collect_formal_array_call s x n b p - + let ok_array_term_arg s x n b p = collect_arg_array_call s x n b p - + let ok_array_term s x n b p = if is_formal_var_type x then ok_array_term_formal s x n b p else ok_array_term_arg s x n b p - + let ok_ptr_term_formal s x n b p = collect_formal_ptr_call s x n b p - + let ok_ptr_term_arg s x n b p = collect_arg_ptr_call s x n b p - + let ok_pointer_term s x n b p = if is_formal_var_type x then ok_ptr_term_formal s x n b p else ok_ptr_term_arg s x n b p - + (* as collect_calls_rec on logic application*) let rec collect_apps_rec = function | [],[] -> () @@ -1420,34 +1420,34 @@ | t::args, p::fmls -> let s = "collect_app" in (match by_array_reference_pattern_term t.term_node with - | Ok (x,b,n) -> - debug "(%a,%b,%d) by_array in apps_rec" - Printer.pp_logic_var x b n; - ok_array_term s (var_type_of_lvar x) n b (var_type_of_lvar p ) - | Ko (x,_,_) -> - let x = var_type_of_lvar x in - if is_formal_var_type x - then remove_array_reference_param x - else ArgAReference.remove x - - | Any -> - ( match by_pointer_reference_pattern_term t.term_node with - | Ok (x,b,n) -> - let p = var_type_of_lvar p in - let x = var_type_of_lvar x in - ok_pointer_term s x n b p - | Ko (x,_,_) -> - let x = var_type_of_lvar x in - if is_formal_var_type x - then remove_ptr_reference_param x - else ArgPReference.remove x - | Any ->() - ) + | Ok (x,b,n) -> + debug "(%a,%b,%d) by_array in apps_rec" + Printer.pp_logic_var x b n; + ok_array_term s (var_type_of_lvar x) n b (var_type_of_lvar p ) + | Ko (x,_,_) -> + let x = var_type_of_lvar x in + if is_formal_var_type x + then remove_array_reference_param x + else ArgAReference.remove x + + | Any -> + ( match by_pointer_reference_pattern_term t.term_node with + | Ok (x,b,n) -> + let p = var_type_of_lvar p in + let x = var_type_of_lvar x in + ok_pointer_term s x n b p + | Ko (x,_,_) -> + let x = var_type_of_lvar x in + if is_formal_var_type x + then remove_ptr_reference_param x + else ArgPReference.remove x + | Any ->() + ) ); collect_apps_rec (args,fmls) let collect_apps lf tl = collect_apps_rec (tl,lf.l_profile) - + (* as collect_apps_rec on logic builtin application if the argument is a userdef parameter, its information in @@ -1455,41 +1455,41 @@ let rec collect_apps_builtin targs = let s = "[BuiltinCall]" in match targs with - | [] -> () - | t::args -> - (match by_array_reference_pattern_term t.term_node with - | Ok (x,b,n) -> - debug "%s %a in array ref position with %s with dim = %d" - s Printer.pp_logic_var x (string_addr b) n; - logic_param_memory_info x; - ok_array_term s (var_type_of_lvar x) n b Prop - | Ko (x,_,_) -> - debug "%s %a is not in a array ref position" - s Printer.pp_logic_var x ; - let x = var_type_of_lvar x in - if is_formal_var_type x - then remove_array_reference_param x - else ArgAReference.remove x - - | Any -> - ( match by_pointer_reference_pattern_term t.term_node with - | Ok (x,b,n) -> - debug "%s %a in ptr ref position with %s with %d *" - s Printer.pp_logic_var x (string_addr b) n; - logic_param_memory_info x; - ok_pointer_term s (var_type_of_lvar x) n b Prop - | Ko (x,_,_) -> - debug "%s %a is not in a ptr ref position" - s Printer.pp_logic_var x ; - let x = var_type_of_lvar x in - if is_formal_var_type x - then remove_ptr_reference_param x - else ArgPReference.remove x - | Any -> () - ) - ); collect_apps_builtin args + | [] -> () + | t::args -> + (match by_array_reference_pattern_term t.term_node with + | Ok (x,b,n) -> + debug "%s %a in array ref position with %s with dim = %d" + s Printer.pp_logic_var x (string_addr b) n; + logic_param_memory_info x; + ok_array_term s (var_type_of_lvar x) n b Prop + | Ko (x,_,_) -> + debug "%s %a is not in a array ref position" + s Printer.pp_logic_var x ; + let x = var_type_of_lvar x in + if is_formal_var_type x + then remove_array_reference_param x + else ArgAReference.remove x + + | Any -> + ( match by_pointer_reference_pattern_term t.term_node with + | Ok (x,b,n) -> + debug "%s %a in ptr ref position with %s with %d *" + s Printer.pp_logic_var x (string_addr b) n; + logic_param_memory_info x; + ok_pointer_term s (var_type_of_lvar x) n b Prop + | Ko (x,_,_) -> + debug "%s %a is not in a ptr ref position" + s Printer.pp_logic_var x ; + let x = var_type_of_lvar x in + if is_formal_var_type x + then remove_ptr_reference_param x + else ArgPReference.remove x + | Any -> () + ) + ); collect_apps_builtin args + - (**********************************************************************) (*** Chain of calls collections ***) (**********************************************************************) @@ -1504,7 +1504,7 @@ or for a formal when the usage (found in the last visitor) is not compatible with a pttern (found in this visitor). -NB: The resolution of an entire [ChainCall] can't been done here because + NB: The resolution of an entire [ChainCall] can't been done here because all [call] has to been inspected before. *) @@ -1514,33 +1514,33 @@ method! vinst = function | Call (_ ,{enode =Lval(Var f,NoOffset)} , el,_) as e-> - debug "[Calls_collection] call %a" Printer.pp_instr e; - collect_calls f el ; SkipChildren + debug "[Calls_collection] call %a" Printer.pp_instr e; + collect_calls f el ; SkipChildren | _ -> DoChildren - + method! vterm t = match t.term_node with - | Tapp (lf,_ , targs) -> - debug "[Calls_collection] app %a" Printer.pp_term t; - collect_apps lf targs ; SkipChildren - | Tblock_length (_label,ta) -> (* [PB] TODO label added *) - debug "[Calls_collection] block_length %a" Printer.pp_term t; - collect_apps_builtin [ta] ; SkipChildren - | _ -> DoChildren - + | Tapp (lf,_ , targs) -> + debug "[Calls_collection] app %a" Printer.pp_term t; + collect_apps lf targs ; SkipChildren + | Tblock_length (_label,ta) -> (* [PB] TODO label added *) + debug "[Calls_collection] block_length %a" Printer.pp_term t; + collect_apps_builtin [ta] ; SkipChildren + | _ -> DoChildren + method! vpredicate = function | Papp (lf, _, targs) -> collect_apps lf targs ; SkipChildren | Pfresh (_todo_label1,_todo_label2,t,n) -> (* [PB] TODO: labels and size added *) - debug "[Calls_collection] predicate app on %a, %a" - Printer.pp_term t Printer.pp_term n ; - collect_apps_builtin [t;n] ; SkipChildren + debug "[Calls_collection] predicate app on %a, %a" + Printer.pp_term t Printer.pp_term n ; + collect_apps_builtin [t;n] ; SkipChildren | Pallocable (_todo_label,t) (* [PB] TODO: construct added *) | Pfreeable (_todo_label,t) (* [PB] TODO: construct added *) | Pvalid_read (_todo_label,t)(* [PB] TODO: construct added *) | Pvalid (_todo_label,t) (* [PB] TODO: label added *) | Pinitialized (_todo_label,t) -> (* [PB] TODO: label added *) - debug "[Calls_collection] predicate app on %a" Printer.pp_term t; - collect_apps_builtin [t] ; SkipChildren + debug "[Calls_collection] predicate app on %a" Printer.pp_term t; + collect_apps_builtin [t] ; SkipChildren | Pseparated lt -> collect_apps_builtin lt ; SkipChildren | _ -> DoChildren @@ -1555,7 +1555,7 @@ if not !calls_collection_computed then (Visitor.visitFramacFile (new calls_collection)(Ast.get()); calls_collection_computed := true) - + @@ -1587,7 +1587,7 @@ -a builtin application [(k,(b,Prop))], k <= [n] -an application or call [(k,(b,p))], k <= n and [p] is a by pointer reference parameter. - + For each convenient [call], if the test of address taken is true, then the [minus] information of [x] in the address taken table is incremented. @@ -1596,7 +1596,7 @@ [x] stays in by pointer reference parameter with arity [n]. Otherwise, [x] is moved from the by pointer reference parameter table to the by value parameter table. - + NB: For a call [(k,(b,p))], [p] can not yet occur in the by pointer reference paramter table, then [p] has first to be add in this table and its [ChainCalls] has to been resolved before @@ -1607,55 +1607,55 @@ let s = "[by_ptr_reference]" in debug "%s %a of arity %d" s pp_var_type x n; match calls with - | [] -> - debug "%s %a: ok " s pp_var_type x; - oracle "%s %a ByPref" s pp_var_type x; - ByPReference.replace x (n,[]) - | (k,(b,Prop))::m -> - let sb = string_addr b in - debug "%s %a: (builtin,%d,%s)" s pp_var_type x k sb; - if k <= n then - (debug "%s arity of call ok" s; decr_addr_taken_bool x b; - by_ptr_reference x n m) - else - (debug "%s arity of call too big" s; remove_ptr_reference_param x) - | (k,(b,p))::m -> - let bv = ByValue.mem p in let ba = ByAReference.mem p in - let c = k > n in let sb = string_addr b in - if c || bv || ba then - (debug "%s: KO %a ByValue:%b ; Aref : %b; call arity:%b" - s pp_var_type p bv bv c ; remove_ptr_reference_param x) - else - (debug "%s: OK %a ByValue:%b ; Aref : %b; call ari:%b; with %s" - s pp_var_type p bv ba c sb ; - try (match ByPReference.find p with - | (i,[]) -> - debug "%s %a already resolved ; arity :%d" - s pp_var_type p i; - if k <= i then - (debug"%s arity OK" s; decr_addr_taken_bool x b; - by_ptr_reference x n m) - else - (debug "%s arity KO %a with %d and %a with %d used %d" - s pp_var_type x n pp_var_type p i k; - remove_ptr_reference_param x ) - | (i,lp) -> - debug "%s %a has to be resolved; with %d used %d" - s pp_var_type p i k; - if k <= i then - (by_ptr_reference p i lp; - by_ptr_reference x n ((k,(b,p))::m)) - else remove_ptr_reference_param x - ) - with Not_found -> - debug "%s %a NOT in PRef param" s pp_var_type p; - let i = stars_var_type_typ p in - add_ptr_reference_param p i; - if not (ByPReference.mem p) || ByValue.mem p - then remove_ptr_reference_param x - else by_ptr_reference x n ((k,(b,p))::m)) - - + | [] -> + debug "%s %a: ok " s pp_var_type x; + oracle "%s %a ByPref" s pp_var_type x; + ByPReference.replace x (n,[]) + | (k,(b,Prop))::m -> + let sb = string_addr b in + debug "%s %a: (builtin,%d,%s)" s pp_var_type x k sb; + if k <= n then + (debug "%s arity of call ok" s; decr_addr_taken_bool x b; + by_ptr_reference x n m) + else + (debug "%s arity of call too big" s; remove_ptr_reference_param x) + | (k,(b,p))::m -> + let bv = ByValue.mem p in let ba = ByAReference.mem p in + let c = k > n in let sb = string_addr b in + if c || bv || ba then + (debug "%s: KO %a ByValue:%b ; Aref : %b; call arity:%b" + s pp_var_type p bv bv c ; remove_ptr_reference_param x) + else + (debug "%s: OK %a ByValue:%b ; Aref : %b; call ari:%b; with %s" + s pp_var_type p bv ba c sb ; + try (match ByPReference.find p with + | (i,[]) -> + debug "%s %a already resolved ; arity :%d" + s pp_var_type p i; + if k <= i then + (debug"%s arity OK" s; decr_addr_taken_bool x b; + by_ptr_reference x n m) + else + (debug "%s arity KO %a with %d and %a with %d used %d" + s pp_var_type x n pp_var_type p i k; + remove_ptr_reference_param x ) + | (i,lp) -> + debug "%s %a has to be resolved; with %d used %d" + s pp_var_type p i k; + if k <= i then + (by_ptr_reference p i lp; + by_ptr_reference x n ((k,(b,p))::m)) + else remove_ptr_reference_param x + ) + with Not_found -> + debug "%s %a NOT in PRef param" s pp_var_type p; + let i = stars_var_type_typ p in + add_ptr_reference_param p i; + if not (ByPReference.mem p) || ByValue.mem p + then remove_ptr_reference_param x + else by_ptr_reference x n ((k,(b,p))::m)) + + (* Chain of call resolution of the table of by array reference parameters*) let rec by_array_reference x n l = let s = "[by_array_reference]" in @@ -1666,165 +1666,165 @@ ByAReference.replace x (n,[]) | (k,(b,Prop))::m -> if k <= n then - (decr_addr_taken_bool x b; by_array_reference x n m) + (decr_addr_taken_bool x b; by_array_reference x n m) else remove_array_reference_param x | (k,(b,p))::m -> if k < n || ByValue.mem p || ByPReference.mem p then - remove_array_reference_param x + remove_array_reference_param x else - try (match ByAReference.find p with - | (i,[]) -> - if i <= k then - (decr_addr_taken_bool x b; by_array_reference x n m) - else remove_array_reference_param x - | (i,lp) -> - if i <= k then - (by_array_reference p i lp; - by_array_reference x n ((k,(b,p))::m)) - else remove_array_reference_param x - ) - with Not_found -> - debug "%s %a NOT in ARef param" s pp_var_type p; - let i = brackets_and_stars_var_type_typ p in - add_array_reference_param p i; - if not (ByAReference.mem p) || ByValue.mem p - then remove_array_reference_param x - else by_array_reference x n ((k,(b,p))::m) + try (match ByAReference.find p with + | (i,[]) -> + if i <= k then + (decr_addr_taken_bool x b; by_array_reference x n m) + else remove_array_reference_param x + | (i,lp) -> + if i <= k then + (by_array_reference p i lp; + by_array_reference x n ((k,(b,p))::m)) + else remove_array_reference_param x + ) + with Not_found -> + debug "%s %a NOT in ARef param" s pp_var_type p; + let i = brackets_and_stars_var_type_typ p in + add_array_reference_param p i; + if not (ByAReference.mem p) || ByValue.mem p + then remove_array_reference_param x + else by_array_reference x n ((k,(b,p))::m) (* resolution of chain of call of formal parameters.*) let resolved_call_chain_param () = ByAReference.iter_sorted (fun var (n,l) -> debug "[resolve chaincall of param] array -> %a:%a" - pp_var_type var pp_chaincall l; + pp_var_type var pp_chaincall l; by_array_reference var n l) ; ByPReference.iter_sorted (fun var (n,l) -> debug "[resolve chaincall of param] ptr -> %a:%a" - pp_var_type var pp_chaincall l; + pp_var_type var pp_chaincall l; by_ptr_reference var n l) - + (* Chain of call resolution of the table of by pointer reference argument*) let rec ptr_reference x n calls = let s = "[ptr_reference arg]" in match calls with - | [] -> - debug "%s %a: arity %d ok" s pp_var_type x n; - oracle "%s %a ArgPref" s pp_var_type x; - ArgPReference.replace x (n,[]) - | (k,(b,Prop))::m -> - let sb = string_addr b in - debug "%s (%a,%d) used builtin %d and %s" s pp_var_type x n k sb; - if k <= n then - ( debug "%s builtin arity OK" s; decr_addr_taken_bool x b ; - ptr_reference x n m) - else - (debug "%s builtin arity KO" s; remove_ptr_reference_arg x) - | (k,(b,p))::m -> - let sb = string_addr b in - debug "%s (%a %d) ; used as (%a,%d) and %s" - s pp_var_type x n pp_var_type p k sb; - if k > n then - (debug "%s %a:arity KO " s pp_var_type p; - remove_ptr_reference_arg x) - else - try (match ByPReference.find p with - | (i,[]) -> - debug "%s %a is byPref resolved" s pp_var_type p; - if k <= i then - ( debug "%s arity OK" s; decr_addr_taken_bool x b; - ptr_reference x n m) - else (debug "%s arity KO" s; remove_ptr_reference_arg x) - | (i,lp) -> (* can't happen *) - debug "%s %a is byPref NOT resolved"s pp_var_type p; - if k <= i then - ( debug "%s arity OK"s ;by_ptr_reference p i lp; - debug "%s resolution of %a" s pp_var_type p; - ptr_reference x n ((k,(b,p))::m)) - else - (debug "%s arity KO" s; remove_ptr_reference_arg x ) - ) - with Not_found -> (* can't happen *) - debug "%s %a NOT ByPRef" s pp_var_type p; - let i = stars_var_type_typ p in - add_ptr_reference_param p i; - if not (ByPReference.mem p) || ByValue.mem p - then remove_ptr_reference_arg x - else ptr_reference x n ((k,(b,p))::m) - - + | [] -> + debug "%s %a: arity %d ok" s pp_var_type x n; + oracle "%s %a ArgPref" s pp_var_type x; + ArgPReference.replace x (n,[]) + | (k,(b,Prop))::m -> + let sb = string_addr b in + debug "%s (%a,%d) used builtin %d and %s" s pp_var_type x n k sb; + if k <= n then + ( debug "%s builtin arity OK" s; decr_addr_taken_bool x b ; + ptr_reference x n m) + else + (debug "%s builtin arity KO" s; remove_ptr_reference_arg x) + | (k,(b,p))::m -> + let sb = string_addr b in + debug "%s (%a %d) ; used as (%a,%d) and %s" + s pp_var_type x n pp_var_type p k sb; + if k > n then + (debug "%s %a:arity KO " s pp_var_type p; + remove_ptr_reference_arg x) + else + try (match ByPReference.find p with + | (i,[]) -> + debug "%s %a is byPref resolved" s pp_var_type p; + if k <= i then + ( debug "%s arity OK" s; decr_addr_taken_bool x b; + ptr_reference x n m) + else (debug "%s arity KO" s; remove_ptr_reference_arg x) + | (i,lp) -> (* can't happen *) + debug "%s %a is byPref NOT resolved"s pp_var_type p; + if k <= i then + ( debug "%s arity OK"s ;by_ptr_reference p i lp; + debug "%s resolution of %a" s pp_var_type p; + ptr_reference x n ((k,(b,p))::m)) + else + (debug "%s arity KO" s; remove_ptr_reference_arg x ) + ) + with Not_found -> (* can't happen *) + debug "%s %a NOT ByPRef" s pp_var_type p; + let i = stars_var_type_typ p in + add_ptr_reference_param p i; + if not (ByPReference.mem p) || ByValue.mem p + then remove_ptr_reference_arg x + else ptr_reference x n ((k,(b,p))::m) + + (* Chain of call resolution of the table of by array reference argument*) let rec array_reference x n calls = let s = "[array_reference arg]" in match calls with - | [] -> - debug "%s %a: arity %d ok" s pp_var_type x n; - oracle "%s %a ArgAref" s pp_var_type x; - ArgAReference.replace x (n,[]) - | (k,(b,Prop))::m -> - if k <= n then - (decr_addr_taken_bool x b; array_reference x n m) - else remove_array_reference_arg x - | (k,(b,p))::m -> - if k > n then ArgAReference.remove x - else - ( - if ByPReference.mem p then - begin - try (match ByPReference.find p with - | (i,[]) -> - debug "%s %a is byPref resolved" s pp_var_type p; - if k <= i then - ( debug "%s arity OK" s; decr_addr_taken_bool x b; - array_reference x n m) - else - (debug "%s arity KO" s; - remove_array_reference_arg x) - | (i,lp) -> (* can't happen *) - debug "%s %a is byPref NOT resolved"s pp_var_type p; - if k <= i then - ( debug "%s arity OK"s ;by_ptr_reference p i lp; - debug "%s resolution of %a" s pp_var_type p; - array_reference x n ((k,(b,p))::m)) - else - (debug "%s arity KO" s; - remove_ptr_reference_arg x ) - ) - with Not_found -> remove_array_reference_arg x - end - else - begin - try (match ByAReference.find p with - | (_,[]) -> - decr_addr_taken_bool x b; array_reference x n m - | (i,lp) -> (* can't happen *) - by_array_reference p i lp; - array_reference x n ((k,(b,p))::m) - ) - with Not_found -> (* can't happen *) - debug "%s %a NOT ByARef" s pp_var_type p; - let i = brackets_and_stars_var_type_typ p in - add_array_reference_param p i; - if not (ByAReference.mem p) || ByValue.mem p - then remove_array_reference_arg x - else array_reference x n ((k,(b,p))::m) - end - ) - + | [] -> + debug "%s %a: arity %d ok" s pp_var_type x n; + oracle "%s %a ArgAref" s pp_var_type x; + ArgAReference.replace x (n,[]) + | (k,(b,Prop))::m -> + if k <= n then + (decr_addr_taken_bool x b; array_reference x n m) + else remove_array_reference_arg x + | (k,(b,p))::m -> + if k > n then ArgAReference.remove x + else + ( + if ByPReference.mem p then + begin + try (match ByPReference.find p with + | (i,[]) -> + debug "%s %a is byPref resolved" s pp_var_type p; + if k <= i then + ( debug "%s arity OK" s; decr_addr_taken_bool x b; + array_reference x n m) + else + (debug "%s arity KO" s; + remove_array_reference_arg x) + | (i,lp) -> (* can't happen *) + debug "%s %a is byPref NOT resolved"s pp_var_type p; + if k <= i then + ( debug "%s arity OK"s ;by_ptr_reference p i lp; + debug "%s resolution of %a" s pp_var_type p; + array_reference x n ((k,(b,p))::m)) + else + (debug "%s arity KO" s; + remove_ptr_reference_arg x ) + ) + with Not_found -> remove_array_reference_arg x + end + else + begin + try (match ByAReference.find p with + | (_,[]) -> + decr_addr_taken_bool x b; array_reference x n m + | (i,lp) -> (* can't happen *) + by_array_reference p i lp; + array_reference x n ((k,(b,p))::m) + ) + with Not_found -> (* can't happen *) + debug "%s %a NOT ByARef" s pp_var_type p; + let i = brackets_and_stars_var_type_typ p in + add_array_reference_param p i; + if not (ByAReference.mem p) || ByValue.mem p + then remove_array_reference_arg x + else array_reference x n ((k,(b,p))::m) + end + ) + (* resolution of chain of call of arguments.*) let resolved_call_chain_arg () = ArgAReference.iter_sorted (fun var (n,l) -> debug "[resolve chaincall of arg] array -> %a:%a" - pp_var_type var pp_chaincall l; + pp_var_type var pp_chaincall l; array_reference var n l) ; ArgPReference.iter_sorted (fun var (n,l) -> debug "[resolve chaincall of arg] ptr -> %a:%a" - pp_var_type var pp_chaincall l; + pp_var_type var pp_chaincall l; ptr_reference var n l) - + (**********************************************************************) (*** Address Taken Resolution ***) @@ -1839,28 +1839,28 @@ - if [var] address taken occurs more or as much in by reference calls [r] than in other case [m] then [var] is remove from the address taken table.*) - - let resolve_addr_taken () = - let remove_from_refs var = - if is_formal_var_type var then - (remove_ptr_reference_param var; - remove_array_reference_param var) - else + +let resolve_addr_taken () = + let remove_from_refs var = + if is_formal_var_type var then + (remove_ptr_reference_param var; + remove_array_reference_param var) + else (ArgPReference.remove var; ArgAReference.remove var) - in - let s = "[resolves addr taken]" in - AddrTaken.iter_sorted - (fun var (m,r) -> - debug "%s %a +:%d -:%d" s pp_var_type var m r ; - if m > r then - (debug "%s %a: addr taken %d et %d" s pp_var_type var m r; - oracle"%s %a: stays addrtaken"s pp_var_type var; - remove_from_refs var) - else - (debug "%s %a: not addr taken %d et %d" s pp_var_type var m r; - oracle"%s %a: remove addrtaken"s pp_var_type var; - AddrTaken.remove var)) - + in + let s = "[resolves addr taken]" in + AddrTaken.iter_sorted + (fun var (m,r) -> + debug "%s %a +:%d -:%d" s pp_var_type var m r ; + if m > r then + (debug "%s %a: addr taken %d et %d" s pp_var_type var m r; + oracle"%s %a: stays addrtaken"s pp_var_type var; + remove_from_refs var) + else + (debug "%s %a: not addr taken %d et %d" s pp_var_type var m r; + oracle"%s %a: remove addrtaken"s pp_var_type var; + AddrTaken.remove var)) + @@ -1877,106 +1877,106 @@ Concerning other kind of separation hypothesis, we emit a warning.*) - (* Creates the l-value *lv *) - let deref loc (t:term) : term = - let typ = match t.term_type with - | Ctype (TPtr (typ,_)) -> Ctype typ - | _ -> Wp_parameters.fatal "[deref] on a pure logic type" - in - Logic_const.term ~loc (TLval (TMem t,TNoOffset)) typ - - type formal_kind = - | Formal_Value - | Formal_Ref of int - | Formal_Array of int +(* Creates the l-value *lv *) +let deref loc (t:term) : term = + let typ = match t.term_type with + | Ctype (TPtr (typ,_)) -> Ctype typ + | _ -> Wp_parameters.fatal "[deref] on a pure logic type" + in + Logic_const.term ~loc (TLval (TMem t,TNoOffset)) typ - let kind_of_formal x = +type formal_kind = + | Formal_Value + | Formal_Ref of int + | Formal_Array of int + +let kind_of_formal x = + try + let (n,_calls) = ByPReference.find (Cv x) in + if Cil.isPointerType x.vtype then + Formal_Ref n + else + Formal_Value + with Not_found -> try - let (n,_calls) = ByPReference.find (Cv x) in - if Cil.isPointerType x.vtype then - Formal_Ref n - else - Formal_Value + let (n,_calls) = ByAReference.find (Cv x) in + Formal_Array n with Not_found -> - try - let (n,_calls) = ByAReference.find (Cv x) in - Formal_Array n - with Not_found -> - Formal_Value - - let rec collect_sepstars loc n (t:term) (sep_terms:term list) = - let sep_terms = t :: sep_terms in - if n=1 then sep_terms else - let tstar = deref loc t in - collect_sepstars loc (pred n) tstar sep_terms - - - let pp_formals fmt = function - | [] -> () - | x::xs -> - Format.fprintf fmt "'%s'" x.vname (* user info *) ; - List.iter (fun x -> Format.fprintf fmt ",@ '%s'" x.vname) xs - - let rec collect_refparams kf loc arr_vars ref_vars sep_terms = function - | x::xs -> - begin - match kind_of_formal x with - | Formal_Value -> - collect_refparams kf loc arr_vars ref_vars sep_terms xs - | Formal_Array _ -> - collect_refparams kf loc (x::arr_vars) ref_vars sep_terms xs - | Formal_Ref n -> - let t = Logic_const.tvar ~loc (Cil.cvar_to_lvar x) in - let sep_terms = collect_sepstars loc n t sep_terms in - collect_refparams kf loc arr_vars (x::ref_vars) sep_terms xs - end - | [] -> - begin - match List.rev arr_vars , List.rev ref_vars with - | [] , _ -> () - | [_] , [] -> () - | xs , [] -> - Wp_parameters.warning - "For function %s,@ array reference parameters %a@ must be disjoint at call site" - (Kernel_function.get_name kf) pp_formals xs - | xs , ys -> - Wp_parameters.warning - "For function %s, reference parameters@ %a and %a@ must be disjoint at call site" - (Kernel_function.get_name kf) pp_formals xs pp_formals ys - end ; - match sep_terms with - | [] | [_] -> None - | ts -> Some(Logic_const.new_predicate (Logic_const.pseparated ts)) - - let emitter = - Emitter.create - "Wp variable analysis" - [ Emitter.Funspec ] - ~correctness:[] - ~tuning:[] - - let add_requires hyp kf = - (*[LC+JS]: This function does nothing if there is no default bhv (!) *) - let spec = Annotations.funspec kf in - Extlib.may - (fun b -> Annotations.add_requires emitter kf b.b_name [ hyp ]) - (Cil.find_default_behavior spec) - - let kernel_functions_separation_hyps () = - debug "[kf separation hyps]"; - Globals.Functions.iter - (fun kf -> - debug "[kf separation hyps] %s" (Kernel_function.get_name kf); - let formals = Kernel_function.get_formals kf in - let loc = Kernel_function.get_location kf in - match collect_refparams kf loc [] [] [] formals with - | Some hyp -> - debug "[kf separation hyps] case hyp:%a" - Printer.pp_identified_predicate hyp; - add_requires hyp kf; - | None -> - debug "[kf separation hyps] case None") - + Formal_Value + +let rec collect_sepstars loc n (t:term) (sep_terms:term list) = + let sep_terms = t :: sep_terms in + if n=1 then sep_terms else + let tstar = deref loc t in + collect_sepstars loc (pred n) tstar sep_terms + + +let pp_formals fmt = function + | [] -> () + | x::xs -> + Format.fprintf fmt "'%s'" x.vname (* user info *) ; + List.iter (fun x -> Format.fprintf fmt ",@ '%s'" x.vname) xs + +let rec collect_refparams kf loc arr_vars ref_vars sep_terms = function + | x::xs -> + begin + match kind_of_formal x with + | Formal_Value -> + collect_refparams kf loc arr_vars ref_vars sep_terms xs + | Formal_Array _ -> + collect_refparams kf loc (x::arr_vars) ref_vars sep_terms xs + | Formal_Ref n -> + let t = Logic_const.tvar ~loc (Cil.cvar_to_lvar x) in + let sep_terms = collect_sepstars loc n t sep_terms in + collect_refparams kf loc arr_vars (x::ref_vars) sep_terms xs + end + | [] -> + begin + match List.rev arr_vars , List.rev ref_vars with + | [] , _ -> () + | [_] , [] -> () + | xs , [] -> + Wp_parameters.warning + "For function %s,@ array reference parameters %a@ must be disjoint at call site" + (Kernel_function.get_name kf) pp_formals xs + | xs , ys -> + Wp_parameters.warning + "For function %s, reference parameters@ %a and %a@ must be disjoint at call site" + (Kernel_function.get_name kf) pp_formals xs pp_formals ys + end ; + match sep_terms with + | [] | [_] -> None + | ts -> Some(Logic_const.new_predicate (Logic_const.pseparated ts)) + +let emitter = + Emitter.create + "Wp variable analysis" + [ Emitter.Funspec ] + ~correctness:[] + ~tuning:[] + +let add_requires hyp kf = + (*[LC+JS]: This function does nothing if there is no default bhv (!) *) + let spec = Annotations.funspec kf in + Extlib.may + (fun b -> Annotations.add_requires emitter kf b.b_name [ hyp ]) + (Cil.find_default_behavior spec) + +let kernel_functions_separation_hyps () = + debug "[kf separation hyps]"; + Globals.Functions.iter + (fun kf -> + debug "[kf separation hyps] %s" (Kernel_function.get_name kf); + let formals = Kernel_function.get_formals kf in + let loc = Kernel_function.get_location kf in + match collect_refparams kf loc [] [] [] formals with + | Some hyp -> + debug "[kf separation hyps] case hyp:%a" + Printer.pp_identified_predicate hyp; + add_requires hyp kf; + | None -> + debug "[kf separation hyps] case None") + (**********************************************************************) (*** Variable Anaylisis Computation ***) (**********************************************************************) @@ -2016,79 +2016,79 @@ let case_of_optimization ~logicvar ~refvar = if not logicvar then (if refvar then All else Nothing) else (if refvar then All else Half) - + let not_half_computed () = not (AddrTaken.is_computed()) || not (LogicParam.is_computed()) let not_param_computed () = not (ByValue.is_computed()) || - not (ByPReference.is_computed()) || - not (ByAReference.is_computed()) + not (ByPReference.is_computed()) || + not (ByAReference.is_computed()) let not_arg_computed() = not (ArgPReference.is_computed()) || not (ArgAReference.is_computed()) let not_computed () = not_half_computed () && not_param_computed () && not_arg_computed () - + let compute () = match case_of_optimization ~logicvar:true ~refvar:false with - | Nothing -> () - | Half -> - if not_half_computed() then - (debug - "[COMPUTE] DO address taken table computing"; - compute_logic_params ()) - else () - | All -> - if not_computed () then - begin - debug "[COMPUTE] DO all table computation"; - compute_calls_collection (); - debug "[COMPUTE] DONE all table computation"; - debug "[COMPUTE] DO resolution of formals calls"; - resolved_call_chain_param (); - debug - "[COMPUTE] DONE resolution of formals calls"; - debug - "[COMPUTE] DO resolution of arguments chain calls"; - resolved_call_chain_arg (); - debug - "[COMPUTE] DONE resolution of arguments chain calls"; - debug - "[COMPUTE] resolved address taken equation"; - resolve_addr_taken () - end - else () - + | Nothing -> () + | Half -> + if not_half_computed() then + (debug + "[COMPUTE] DO address taken table computing"; + compute_logic_params ()) + else () + | All -> + if not_computed () then + begin + debug "[COMPUTE] DO all table computation"; + compute_calls_collection (); + debug "[COMPUTE] DONE all table computation"; + debug "[COMPUTE] DO resolution of formals calls"; + resolved_call_chain_param (); + debug + "[COMPUTE] DONE resolution of formals calls"; + debug + "[COMPUTE] DO resolution of arguments chain calls"; + resolved_call_chain_arg (); + debug + "[COMPUTE] DONE resolution of arguments chain calls"; + debug + "[COMPUTE] resolved address taken equation"; + resolve_addr_taken () + end + else () + let dispatch_var var = match case_of_optimization ~logicvar:true ~refvar:false with - | Nothing -> Cvar - | Half -> - compute(); - if AddrTaken.mem var then Cvar else Fvar - | All -> - compute(); - if is_formal_var_type var then - begin - if ByValue.mem var then - if AddrTaken.mem var then Cvar else Fvar - else - ( try let (n,_) = ByPReference.find var in PRpar n - with Not_found -> - (try let (n,_) = ByAReference.find var in ARpar n - with Not_found -> (* impossible case *) Cvar )) - end - else - begin - if AddrTaken.mem var then Cvar - else - (if ArgAReference.mem var then ARarg - else (if ArgPReference.mem var - then PRarg else Fvar)) - end - + | Nothing -> Cvar + | Half -> + compute(); + if AddrTaken.mem var then Cvar else Fvar + | All -> + compute(); + if is_formal_var_type var then + begin + if ByValue.mem var then + if AddrTaken.mem var then Cvar else Fvar + else + ( try let (n,_) = ByPReference.find var in PRpar n + with Not_found -> + (try let (n,_) = ByAReference.find var in ARpar n + with Not_found -> (* impossible case *) Cvar )) + end + else + begin + if AddrTaken.mem var then Cvar + else + (if ArgAReference.mem var then ARarg + else (if ArgPReference.mem var + then PRarg else Fvar)) + end + let dispatch_cvar vinfo = dispatch_var (Cv vinfo) let dispatch_lvar lv = dispatch_var (Lv lv) @@ -2097,25 +2097,25 @@ let is_memvar case vinfo = match case with - | Nothing -> true - | Half | All -> compute(); AddrTaken.mem (Cv vinfo) - + | Nothing -> true + | Half | All -> compute(); AddrTaken.mem (Cv vinfo) + let is_ref case vinfo = match case with - | Nothing -> false - | Half -> false - | All -> - compute(); - let cv = Cv vinfo in - if vinfo.vformal then - (try fst (ByPReference.find cv) = 0 with Not_found -> false) - else - (try fst (ArgPReference.find cv) = 0 with Not_found -> false) - + | Nothing -> false + | Half -> false + | All -> + compute(); + let cv = Cv vinfo in + if vinfo.vformal then + (try fst (ByPReference.find cv) = 0 with Not_found -> false) + else + (try fst (ArgPReference.find cv) = 0 with Not_found -> false) + let is_to_scope vinfo = let case = case_of_optimization ~logicvar:true ~refvar:false in is_ref case vinfo || is_memvar case vinfo - + let precondition_compute () = if (* Wp_parameters.RefVar.get () *) false then begin diff -Nru frama-c-20140301+neon+dfsg/src/wp/variables_analysis.mli frama-c-20150201+sodium+dfsg/src/wp/variables_analysis.mli --- frama-c-20140301+neon+dfsg/src/wp/variables_analysis.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/variables_analysis.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -26,14 +26,14 @@ of variables by WP: 1) optimization of the by-reference call and 2) functional variables. -**) + **) (** At the end, the analysis associates an [var_kind] information to each variables: 1) [Fvar] functional variable, variable such as its address is never taken, - + 2) [PRarg] by_pointer_reference argument, variable such as its address is only taken in by reference calls (one or more), @@ -49,10 +49,10 @@ variable which is a formal parameter use for a by array reference call and can be invoked in a chain of by array reference call such as their arity are less or equal than n, - + 6) [Cvar] other variable. - -**) + + **) type var_kind = Fvar | Cvar | PRarg | ARarg | PRpar of int | ARpar of int diff -Nru frama-c-20140301+neon+dfsg/src/wp/VarUsage.ml frama-c-20150201+sodium+dfsg/src/wp/VarUsage.ml --- frama-c-20140301+neon+dfsg/src/wp/VarUsage.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/VarUsage.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -47,111 +47,105 @@ let pp_dim fmt ks = List.iter (fun k -> Format.fprintf fmt "[%d]" k) ks -let size_of_char c = - match Cil.charConstToInt c with - | CInt64(k,_,_) -> k - | _ -> raise NoSize - let size e = - match (Cil.constFold true e).enode with - | Const(CInt64(k,_,_)) -> k - | Const(CChr c) -> size_of_char c - | _ -> raise NoSize + match Cil.constFoldToInt e with + | Some k -> k + | None -> raise NoSize let size_int e = Integer.to_int (size e) let _merge_dim ds1 ds2 = (* Unused *) if ds1=[] then ds2 else - if ds2=[] then ds1 else - try - let rec verify ds1 ds2 rs1 rs2 = - match rs1 , rs2 with - | [] , _ -> ds2 - | _ , [] -> ds1 - | d1::rs1 , d2::rs2 -> - if d1=d2 then verify ds1 ds2 rs1 rs2 - else raise Exit - in verify ds1 ds2 (List.rev ds1) (List.rev ds2) - with Exit -> [] + if ds2=[] then ds1 else + try + let rec verify ds1 ds2 rs1 rs2 = + match rs1 , rs2 with + | [] , _ -> ds2 + | _ , [] -> ds1 + | d1::rs1 , d2::rs2 -> + if d1=d2 then verify ds1 ds2 rs1 rs2 + else raise Exit + in verify ds1 ds2 (List.rev ds1) (List.rev ds2) + with Exit -> [] (* boxes are dimensions in reverse order *) let merge_box box1 box2 = try let rec verify ds1 ds2 rs1 rs2 = match rs1 , rs2 with - | [] , _ -> ds2 - | _ , [] -> ds1 - | d1::rs1 , d2::rs2 -> - if d1=d2 then verify ds1 ds2 rs1 rs2 - else raise Exit + | [] , _ -> ds2 + | _ , [] -> ds1 + | d1::rs1 , d2::rs2 -> + if d1=d2 then verify ds1 ds2 rs1 rs2 + else raise Exit in verify box1 box2 box1 box2 with Exit -> [] let rec leq_box box1 box2 = (* merge box1 box2 = box2 *) match box1 , box2 with - | [] , _ -> true - | _::_ , [] -> false - | d1::rs1 , d2::rs2 -> d1 = d2 && leq_box rs1 rs2 + | [] , _ -> true + | _::_ , [] -> false + | d1::rs1 , d2::rs2 -> d1 = d2 && leq_box rs1 rs2 let rec addbox_of_type box typ = match Cil.unrollType typ with - | TArray(te,Some d,_,_) -> addbox_of_type (size_int d::box) te - | _ -> box + | TArray(te,Some d,_,_) -> addbox_of_type (size_int d::box) te + | _ -> box let box_of_type typ = addbox_of_type [] typ let rec dim_of_type typ = match Cil.unrollType typ with - | TArray(te,Some d,_,_) -> size_int d :: dim_of_type te - | TArray(_,None,_,_) -> raise NoSize - | _ -> [] + | TArray(te,Some d,_,_) -> size_int d :: dim_of_type te + | TArray(_,None,_,_) -> raise NoSize + | _ -> [] let rec cells_in_type typ = match Cil.unrollType typ with - | TArray(te,Some d,_,_) -> Integer.mul (size d) (cells_in_type te) - | TArray(_,None,_,_) -> raise NoSize - | _ -> Integer.one + | TArray(te,Some d,_,_) -> Integer.mul (size d) (cells_in_type te) + | TArray(_,None,_,_) -> raise NoSize + | _ -> Integer.one let rec type_of_cells typ = match Cil.unrollType typ with - | TArray(te,_,_,_) -> type_of_cells te - | te -> te + | TArray(te,_,_,_) -> type_of_cells te + | te -> te let alloc_for_type typ = match Cil.unrollType typ with - | TArray(te,Some d,_,_) -> size_int d :: dim_of_type te - | TArray(te,None,_,_) -> 0 :: dim_of_type te - | _ -> [] + | TArray(te,Some d,_,_) -> size_int d :: dim_of_type te + | TArray(te,None,_,_) -> 0 :: dim_of_type te + | _ -> [] let rec degree_of_type typ = match Cil.unrollType typ with - | TArray(te,_,_,_) -> succ (degree_of_type te) - | _ -> 0 + | TArray(te,_,_,_) -> succ (degree_of_type te) + | _ -> 0 let shape typ = let rec destruct box typ = match Cil.unrollType typ with - | TArray(te,Some d,_,_) -> destruct (size_int d :: box) te - | te -> te , box + | TArray(te,Some d,_,_) -> destruct (size_int d :: box) te + | te -> te , box in match Cil.unrollType typ with - | TArray(te,_,_,_) -> Some (destruct [] te) - | TPtr(te,_) -> Some(destruct [] te) - | _ -> None + | TArray(te,_,_,_) -> Some (destruct [] te) + | TPtr(te,_) -> Some(destruct [] te) + | _ -> None let rec compatible s t = match Ctypes.object_of s , Ctypes.object_of t with - | C_int i1 , C_int i2 -> i1 = i2 - | C_float f1 , C_float f2 -> f1 = f2 - | C_pointer t1 , C_pointer t2 -> compatible t1 t2 - | C_comp s1 , C_comp s2 -> Compinfo.equal s1 s2 - | _ -> false (* arrays are already destructured by shape *) + | C_int i1 , C_int i2 -> i1 = i2 + | C_float f1 , C_float f2 -> f1 = f2 + | C_pointer t1 , C_pointer t2 -> compatible t1 t2 + | C_comp s1 , C_comp s2 -> Compinfo.equal s1 s2 + | _ -> false (* arrays are already destructured by shape *) let reshape ty_src ty_tgt = match shape ty_src , shape ty_tgt with - | None , _ | _ , None -> None - | Some (s,ds) , Some (t,dt) -> - if compatible s t then Some (merge_box ds dt) else None - + | None , _ | _ , None -> None + | Some (s,ds) , Some (t,dt) -> + if compatible s t then Some (merge_box ds dt) else None + (* -------------------------------------------------------------------------- *) (* --- Root Variables --- *) (* -------------------------------------------------------------------------- *) @@ -212,7 +206,7 @@ module Context = struct - + type delta = | Dload | Dfield (* BY: unused constructor: always filtered, never created *) @@ -241,8 +235,8 @@ let shift ty (target,delta) = target , Dshift (box_of_type ty) :: delta let cast ty_src ty_tgt (target,delta) = match reshape ty_src ty_tgt with - | Some ds -> (target,Dshift ds :: delta) - | None -> (target,[]) + | Some ds -> (target,Dshift ds :: delta) + | None -> (target,[]) let function_param kf x = (Fcall(kf,x),[]) let logic_param phi x = (Logic(phi,x),[]) @@ -255,21 +249,21 @@ | Memory -> Format.fprintf fmt "memory" | Validity -> Format.fprintf fmt "valid" | Fcall(kf,x) -> Format.fprintf fmt "call %a:%a" - Kernel_function.pretty kf Varinfo.pretty x + Kernel_function.pretty kf Varinfo.pretty x | Logic(phi,x) -> Format.fprintf fmt "logic %a:%a" - Logic_var.pretty phi.l_var_info Logic_var.pretty x + Logic_var.pretty phi.l_var_info Logic_var.pretty x let pp_access fmt ds = List.iter (function - | Dload -> Format.fprintf fmt "L" - | Dfield -> Format.fprintf fmt "F" - | Dshift box -> Format.fprintf fmt "{%a}" pp_box box + | Dload -> Format.fprintf fmt "L" + | Dfield -> Format.fprintf fmt "F" + | Dshift box -> Format.fprintf fmt "{%a}" pp_box box ) ds (*let pretty fmt (target,access) = Format.fprintf fmt "[%a] %a" pp_target target pp_access access - *) + *) end module Usage = @@ -282,9 +276,9 @@ | RefValue (* always accessed by [load(load(base))] *) | Array of int list (* always accessed by [load(shift(base))] *) | RefArray of int list (* always accessed by [load(shift(load(base)))] *) - (* for arrays : empty list means flatten array *) - (* for arrays : non-empty list may start with [0] for unknown size *) - (* dimensions are given in reverse order (boxes) *) + (* for arrays : empty list means flatten array *) + (* for arrays : non-empty list may start with [0] for unknown size *) + (* dimensions are given in reverse order (boxes) *) (* @@ -334,48 +328,48 @@ let merge u v = match u , v with - | Bot , w | w , Bot -> w - | Top , _ | _ , Top -> Top - (* same levels *) - | Value , Value -> Value - | RefValue , RefValue -> RefValue - | Array a , Array b -> Array(merge_box a b) - | RefArray a , RefArray b -> RefArray(merge_box a b) - (* Array level *) - | (Array _ as w) , _ | _ , (Array _ as w) -> w - (* Value level *) - | Value , _ | _ , Value -> Value - (* RefArray level *) - | (RefArray _ as w) , _ | _ , (RefArray _ as w) -> w - (* RefValue level *) + | Bot , w | w , Bot -> w + | Top , _ | _ , Top -> Top + (* same levels *) + | Value , Value -> Value + | RefValue , RefValue -> RefValue + | Array a , Array b -> Array(merge_box a b) + | RefArray a , RefArray b -> RefArray(merge_box a b) + (* Array level *) + | (Array _ as w) , _ | _ , (Array _ as w) -> w + (* Value level *) + | Value , _ | _ , Value -> Value + (* RefArray level *) + | (RefArray _ as w) , _ | _ , (RefArray _ as w) -> w + (* RefValue level *) let leq u v = (* merge u v = v *) match u,v with - | Bot,_ -> true - | _,Bot -> false - | _,Top -> true - | Top,_ -> false - (* RefValue level and upper *) - | RefValue,_ -> true - | _,RefValue -> false - (* RefArray level and upper *) - | RefArray a,RefArray b -> leq_box a b - | RefArray _,_ -> true - | _,RefArray _ -> false - (* Value level and upper *) - | Value,_ -> true - | _,Value -> false - (* Array level and upper *) - | Array a,Array b -> leq_box a b + | Bot,_ -> true + | _,Bot -> false + | _,Top -> true + | Top,_ -> false + (* RefValue level and upper *) + | RefValue,_ -> true + | _,RefValue -> false + (* RefArray level and upper *) + | RefArray a,RefArray b -> leq_box a b + | RefArray _,_ -> true + | _,RefArray _ -> false + (* Value level and upper *) + | Value,_ -> true + | _,Value -> false + (* Array level and upper *) + | Array a,Array b -> leq_box a b let call formal ds = match formal with - | Bot -> Bot - | Top -> of_context ds - | Value -> of_context ds - | RefValue -> of_context (ds @ [Context.Dload]) - | RefArray box -> of_context (ds @ [Context.Dshift box;Context.Dload]) - | Array _ -> WpMain.fatal "Usage of formal as an array" + | Bot -> Bot + | Top -> of_context ds + | Value -> of_context ds + | RefValue -> of_context (ds @ [Context.Dload]) + | RefArray box -> of_context (ds @ [Context.Dshift box;Context.Dload]) + | Array _ -> WpMain.fatal "Usage of formal as an array" end @@ -404,30 +398,30 @@ open Context open Root - + let update occur inspec target context = match target with - | Memory -> - if inspec then occur.param <- merge_with occur.param context ; - occur.value <- merge_with occur.value context - | Validity -> occur.valid <- true - | Fcall(_,x) -> occur.calls <- (inspec,Cvar x,context)::occur.calls - | Logic(_,x) -> occur.calls <- (inspec,Lvar x,context)::occur.calls + | Memory -> + if inspec then occur.param <- merge_with occur.param context ; + occur.value <- merge_with occur.value context + | Validity -> occur.valid <- true + | Fcall(_,x) -> occur.calls <- (inspec,Cvar x,context)::occur.calls + | Logic(_,x) -> occur.calls <- (inspec,Lvar x,context)::occur.calls let propagate modified occur (phi : Root.t -> Usage.domain) = List.iter (fun (inspec,x,w) -> - let u = Usage.call (phi x) w in - if not (Usage.leq u occur.value) then - begin - occur.value <- Usage.merge occur.value u ; - modified := true ; - end ; - if inspec && not (Usage.leq u occur.param) then - begin - occur.param <- Usage.merge occur.param u ; - modified := true ; - end + let u = Usage.call (phi x) w in + if not (Usage.leq u occur.value) then + begin + occur.value <- Usage.merge occur.value u ; + modified := true ; + end ; + if inspec && not (Usage.leq u occur.param) then + begin + occur.param <- Usage.merge occur.param u ; + modified := true ; + end ) occur.calls end @@ -438,25 +432,25 @@ module Omap = FCMap.Make(Root) module Domain = Datatype.Make - (struct - type t = Occur.t Omap.t - include Datatype.Serializable_undefined - let reprs = [Omap.empty] - let name = "Wp.VarUsage.Domain" - end) + (struct + type t = Occur.t Omap.t + include Datatype.Serializable_undefined + let reprs = [Omap.empty] + let name = "Wp.VarUsage.Domain" + end) module U = State_builder.Ref(Domain) - (struct - let name = "Wp.VarUsage.Analysis" - let dependencies = - [ Ast.self; - (* [JS 2012/02/08] put all annotations state, but unsure that this - state actually depends on all of them. *) - Annotations.code_annot_state; - Annotations.funspec_state; - Annotations.global_state ] - let default () = Omap.empty - end) + (struct + let name = "Wp.VarUsage.Analysis" + let dependencies = + [ Ast.self; + (* [JS 2012/02/08] put all annotations state, but unsure that this + state actually depends on all of them. *) + Annotations.code_annot_state; + Annotations.funspec_state; + Annotations.global_state ] + let default () = Omap.empty + end) let occur r = let omap = U.get () in @@ -469,8 +463,8 @@ try let occ = Omap.find r (U.get()) in match r with - | Root.Cvar _ -> occ.Occur.param - | Root.Lvar _ -> occ.Occur.value + | Root.Cvar _ -> occ.Occur.param + | Root.Lvar _ -> occ.Occur.value with Not_found -> Usage.Bot let occurrence (target,access) root = @@ -499,24 +493,24 @@ let rec expr (context:Context.t) (e:Cil_types.exp) = match e.enode with - | Const _ | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ | AlignOfE _ -> () - | UnOp((Neg|BNot|LNot),e,_) -> expr Context.epsilon e - | BinOp((PlusPI|IndexPI|MinusPI),a,b,_) -> - let ty = Cil.typeOf_pointed (Cil.typeOf a) in - expr (Context.shift ty context) a ; - expr Context.epsilon b - | BinOp( (MinusPP|PlusA|MinusA|Mult|Div|Mod - |Shiftlt|Shiftrt|BAnd|BXor|BOr|LAnd|LOr - |Lt|Gt|Le|Ge|Eq|Ne), a,b,_ ) -> - expr Context.epsilon a ; - expr Context.epsilon b - | CastE(ty_tgt,e) -> - let ty_src = Cil.typeOf e in - expr (Context.cast ty_src ty_tgt context) e - | AddrOf lval -> lvalue context lval - | StartOf lval -> lvalue context lval - | Lval lval -> lvalue (Context.load context) lval - | Info(e,_) -> expr context e + | Const _ | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ | AlignOfE _ -> () + | UnOp((Neg|BNot|LNot),e,_) -> expr Context.epsilon e + | BinOp((PlusPI|IndexPI|MinusPI),a,b,_) -> + let ty = Cil.typeOf_pointed (Cil.typeOf a) in + expr (Context.shift ty context) a ; + expr Context.epsilon b + | BinOp( (MinusPP|PlusA|MinusA|Mult|Div|Mod + |Shiftlt|Shiftrt|BAnd|BXor|BOr|LAnd|LOr + |Lt|Gt|Le|Ge|Eq|Ne), a,b,_ ) -> + expr Context.epsilon a ; + expr Context.epsilon b + | CastE(ty_tgt,e) -> + let ty_src = Cil.typeOf e in + expr (Context.cast ty_src ty_tgt context) e + | AddrOf lval -> lvalue context lval + | StartOf lval -> lvalue context lval + | Lval lval -> lvalue (Context.load context) lval + | Info(e,_) -> expr context e and lvalue context (host,offset) = let ty_host = match host with @@ -542,102 +536,102 @@ let rec funcall_params kf xs es = match xs , es with - | _ , [] | [] , _ -> () - | x::xs , e::es -> - expr (Context.function_param kf x) e ; - funcall_params kf xs es + | _ , [] | [] , _ -> () + | x::xs , e::es -> + expr (Context.function_param kf x) e ; + funcall_params kf xs es let funcall (ef:Cil_types.exp) (es:Cil_types.exp list) = match Kernel_function.get_called ef with - | None -> - expr Context.epsilon ef ; - List.iter (expr Context.epsilon) es - | Some kf -> - funcall_params kf (Kernel_function.get_formals kf) es + | None -> + expr Context.epsilon ef ; + List.iter (expr Context.epsilon) es + | Some kf -> + funcall_params kf (Kernel_function.get_formals kf) es (* -------------------------------------------------------------------------- *) (* --- Term Visitor --- *) (* -------------------------------------------------------------------------- *) - + let rec term (context:Context.t) (t:term) = match t.term_node with - | TConst _ - | TSizeOf _ | TSizeOfE _ | TSizeOfStr _ - | TAlignOf _ | TAlignOfE _ -> () - | TUnOp((Neg|BNot|LNot),t) -> - term Context.epsilon t - | TBinOp((PlusPI|IndexPI|MinusPI),a,b) -> - let ty = Logic_typing.ctype_of_pointed a.term_type in - term (Context.shift ty context) a ; - term Context.epsilon b - | TBinOp( (MinusPP|PlusA|MinusA|Mult|Div|Mod - |Shiftlt|Shiftrt|BAnd|BXor|BOr|LAnd|LOr - |Lt|Gt|Le|Ge|Eq|Ne), a,b ) -> - term Context.epsilon a ; - term Context.epsilon b - | TCastE(ty_tgt,t) -> - begin - match Logic_utils.unroll_type t.term_type with - | Ctype ty_src -> term (Context.cast ty_src ty_tgt context) t - | _ -> term Context.epsilon t - end - | TAddrOf tlv -> term_lval context tlv - | TStartOf tlv -> term_lval context tlv - | TLval tlv -> term_lval (Context.load context) tlv - | Tapp(phi,_,ts) -> logic_call phi phi.l_profile ts - | Tlambda(_,t) -> term Context.epsilon t - | TDataCons(_,ts) -> List.iter (term Context.epsilon) ts - | Tif(e,a,b) -> term Context.epsilon e ; term context a ; term context b - | Tat(t,_) -> term context t - | Tbase_addr (_,t) -> term Context.epsilon t - | Toffset (_,t) -> term Context.epsilon t - | Tblock_length (_,t) -> term Context.validity t - | Tnull -> () - | TCoerce _ | TCoerceE _ -> WpMain.fatal "Jessie Coercions" - | TUpdate(s,offset,t) -> - term Context.epsilon s ; - term Context.epsilon t ; - term_indices offset - | Ttypeof _ | Ttype _ -> () - | Tempty_set -> () - | Tunion ts | Tinter ts -> List.iter (term context) ts - | Tcomprehension( t , _ , None ) -> - term context t - | Tcomprehension( t , _ , Some p ) -> - term context t ; named_predicate p - | Trange( a , b ) -> - term_option Context.epsilon a ; - term_option Context.epsilon b - | Tlet( phi , a ) -> - logic_body phi.l_body ; - term context a - | TLogic_coerce (_,t) -> term context t + | TConst _ + | TSizeOf _ | TSizeOfE _ | TSizeOfStr _ + | TAlignOf _ | TAlignOfE _ -> () + | TUnOp((Neg|BNot|LNot),t) -> + term Context.epsilon t + | TBinOp((PlusPI|IndexPI|MinusPI),a,b) -> + let ty = Logic_typing.ctype_of_pointed a.term_type in + term (Context.shift ty context) a ; + term Context.epsilon b + | TBinOp( (MinusPP|PlusA|MinusA|Mult|Div|Mod + |Shiftlt|Shiftrt|BAnd|BXor|BOr|LAnd|LOr + |Lt|Gt|Le|Ge|Eq|Ne), a,b ) -> + term Context.epsilon a ; + term Context.epsilon b + | TCastE(ty_tgt,t) -> + begin + match Logic_utils.unroll_type t.term_type with + | Ctype ty_src -> term (Context.cast ty_src ty_tgt context) t + | _ -> term Context.epsilon t + end + | TAddrOf tlv -> term_lval context tlv + | TStartOf tlv -> term_lval context tlv + | TLval tlv -> term_lval (Context.load context) tlv + | Tapp(phi,_,ts) -> logic_call phi phi.l_profile ts + | Tlambda(_,t) -> term Context.epsilon t + | TDataCons(_,ts) -> List.iter (term Context.epsilon) ts + | Tif(e,a,b) -> term Context.epsilon e ; term context a ; term context b + | Tat(t,_) -> term context t + | Tbase_addr (_,t) -> term Context.epsilon t + | Toffset (_,t) -> term Context.epsilon t + | Tblock_length (_,t) -> term Context.validity t + | Tnull -> () + | TCoerce _ | TCoerceE _ -> WpMain.fatal "Jessie Coercions" + | TUpdate(s,offset,t) -> + term Context.epsilon s ; + term Context.epsilon t ; + term_indices offset + | Ttypeof _ | Ttype _ -> () + | Tempty_set -> () + | Tunion ts | Tinter ts -> List.iter (term context) ts + | Tcomprehension( t , _ , None ) -> + term context t + | Tcomprehension( t , _ , Some p ) -> + term context t ; named_predicate p + | Trange( a , b ) -> + term_option Context.epsilon a ; + term_option Context.epsilon b + | Tlet( phi , a ) -> + logic_body phi.l_body ; + term context a + | TLogic_coerce (_,t) -> term context t and term_option context = function None -> () | Some e -> term context e and term_lval context (host,offset) = match host with - - (* Logic value + field/array-index offset *) - | TVar ({lv_origin=None} as x) -> - occurrence context (Root.Lvar x) ; term_indices offset - - (* Cases where host has a C-type *) - | TResult typ - | TVar {lv_origin=Some {vtype=typ}} - -> term_host (term_coffset context typ offset) host - - (* Case where host is a pointer *) - | TMem e -> - let te = Logic_typing.ctype_of_pointed e.term_type in - term_host (term_coffset context te offset) host + + (* Logic value + field/array-index offset *) + | TVar ({lv_origin=None} as x) -> + occurrence context (Root.Lvar x) ; term_indices offset + + (* Cases where host has a C-type *) + | TResult typ + | TVar {lv_origin=Some {vtype=typ}} + -> term_host (term_coffset context typ offset) host + + (* Case where host is a pointer *) + | TMem e -> + let te = Logic_typing.ctype_of_pointed e.term_type in + term_host (term_coffset context te offset) host and term_coffset context ty = function | TNoOffset -> context | TField(f,offset) -> term_coffset Context.epsilon f.ftype offset | TModel _ -> - Wp_parameters.not_yet_implemented "Model field" + Wp_parameters.not_yet_implemented "Model field" | TIndex(e,offset) -> term Context.epsilon e ; let telt = Cil.typeOf_array_elem ty in @@ -656,10 +650,10 @@ and logic_call phi xs ts = match xs , ts with - | [] , _ | _ , [] -> () - | x::xs , t::ts -> - term (Context.logic_param phi x) t ; - logic_call phi xs ts + | [] , _ | _ , [] -> () + | x::xs , t::ts -> + term (Context.logic_param phi x) t ; + logic_call phi xs ts and identified_term context t = term context t.it_content @@ -679,7 +673,7 @@ | Pallocable (_,t) | Pfreeable (_,t) -> term Context.validity t - | Pinitialized (_,t) -> + | Pinitialized (_,t) | Pdangling (_,t) -> term Context.validity t | Pfresh (_,_,t,n) -> term Context.validity t ; @@ -720,31 +714,31 @@ (* -------------------------------------------------------------------------- *) class visitor = -object + object - inherit Visitor.frama_c_inplace + inherit Visitor.frama_c_inplace - initializer Context.in_spec := false + initializer Context.in_spec := false - method! vexpr e = expr Context.epsilon e ; SkipChildren - method! vinst = function - | Call( result , e , es , _ ) -> - lval_option Context.assigned result ; - funcall e es ; - SkipChildren - | Set( lv , e , _ ) -> - lvalue Context.assigned lv ; - expr Context.epsilon e ; - SkipChildren - | Code_annot _ -> DoChildren - | Skip _ -> DoChildren - | Asm _ -> DoChildren - - method! vterm t = term Context.epsilon t ; SkipChildren - method! vpredicate p = predicate p ; SkipChildren - method! vspec = Context.on_spec + method! vexpr e = expr Context.epsilon e ; SkipChildren + method! vinst = function + | Call( result , e , es , _ ) -> + lval_option Context.assigned result ; + funcall e es ; + SkipChildren + | Set( lv , e , _ ) -> + lvalue Context.assigned lv ; + expr Context.epsilon e ; + SkipChildren + | Code_annot _ -> DoChildren + | Skip _ -> DoChildren + | Asm _ -> DoChildren + + method! vterm t = term Context.epsilon t ; SkipChildren + method! vpredicate p = predicate p ; SkipChildren + method! vspec = Context.on_spec -end + end let compute () = WpMain.feedback "Collecting variable usage" ; @@ -761,11 +755,11 @@ [U]. *) [ Ast.self; (* [JS 2012/02/08] put all annotations state, but unsure that this - state actually depends on all of them. *) + state actually depends on all of them. *) Annotations.code_annot_state; Annotations.funspec_state; Annotations.global_state -] + ] compute let of_cvar x = (occur (Root.Cvar x)).Occur.value @@ -784,60 +778,60 @@ Format.fprintf fmt "-------------------------------------------------@\n" ; Format.fprintf fmt "--- Roots Usage@\n" ; Format.fprintf fmt "-------------------------------------------------@\n" ; - Globals.Vars.iter - (fun x _ -> - Format.fprintf fmt "Global %a@." - (Usage.pretty ~name:x.vname) (of_cvar x) - ) ; + Globals.Vars.iter_in_file_order + (fun x _ -> + Format.fprintf fmt "Global %a@." + (Usage.pretty ~name:x.vname) (of_cvar x) + ) ; Globals.Functions.iter - (fun kf -> - let xs = Kernel_function.get_formals kf in - let ys = Kernel_function.get_locals kf in - Format.fprintf fmt "Function '%s':@\n" (Kernel_function.get_name kf) ; - List.iter - (fun x -> - let occ = occur (Root.Cvar x) in - let value = occ.Occur.value in - let param = occ.Occur.param in - if Usage.leq value param then - Format.fprintf fmt " - formal %a" - (Usage.pretty ~name:x.vname) value - else - Format.fprintf fmt " - formal %a (called: %a)" - (Usage.pretty ~name:x.vname) value - (Usage.pretty ~name:x.vname) param ; - if occ.Occur.valid then - Format.fprintf fmt " (validated)@\n" - else - Format.fprintf fmt "@\n" - ) xs ; - List.iter - (fun y -> - Format.fprintf fmt " - local %a@\n" - (Usage.pretty ~name:y.vname) (of_cvar y) - ) ys ; - Format.pp_print_flush fmt () - ) ; + (fun kf -> + let xs = Kernel_function.get_formals kf in + let ys = Kernel_function.get_locals kf in + Format.fprintf fmt "Function '%s':@\n" (Kernel_function.get_name kf) ; + List.iter + (fun x -> + let occ = occur (Root.Cvar x) in + let value = occ.Occur.value in + let param = occ.Occur.param in + if Usage.leq value param then + Format.fprintf fmt " - formal %a" + (Usage.pretty ~name:x.vname) value + else + Format.fprintf fmt " - formal %a (called: %a)" + (Usage.pretty ~name:x.vname) value + (Usage.pretty ~name:x.vname) param ; + if occ.Occur.valid then + Format.fprintf fmt " (validated)@\n" + else + Format.fprintf fmt "@\n" + ) xs ; + List.iter + (fun y -> + Format.fprintf fmt " - local %a@\n" + (Usage.pretty ~name:y.vname) (of_cvar y) + ) ys ; + Format.pp_print_flush fmt () + ) ; Annotations.iter_global - (fun _ logic -> - match logic with - | Dfun_or_pred(linfo,_) -> - let name = linfo.l_var_info.lv_name in - let kind = - if linfo.l_type = None then "Predicate" else "Logic" - in - if linfo.l_profile = [] then - Format.fprintf fmt "%s '%s': %a@\n" kind name - dump_lvar linfo.l_var_info - else begin - Format.fprintf fmt "%s '%s':@\n" kind name ; - let xs = linfo.l_profile in - List.iter - (fun x -> - Format.fprintf fmt " - parameter %a@\n" dump_lvar x) - xs - end - | _ -> ()); + (fun _ logic -> + match logic with + | Dfun_or_pred(linfo,_) -> + let name = linfo.l_var_info.lv_name in + let kind = + if linfo.l_type = None then "Predicate" else "Logic" + in + if linfo.l_profile = [] then + Format.fprintf fmt "%s '%s': %a@\n" kind name + dump_lvar linfo.l_var_info + else begin + Format.fprintf fmt "%s '%s':@\n" kind name ; + let xs = linfo.l_profile in + List.iter + (fun x -> + Format.fprintf fmt " - parameter %a@\n" dump_lvar x) + xs + end + | _ -> ()); Format.fprintf fmt "-------------------------------------------------@." ; end diff -Nru frama-c-20140301+neon+dfsg/src/wp/VarUsage.mli frama-c-20150201+sodium+dfsg/src/wp/VarUsage.mli --- frama-c-20140301+neon+dfsg/src/wp/VarUsage.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/VarUsage.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/VCS.ml frama-c-20150201+sodium+dfsg/src/wp/VCS.ml --- frama-c-20140301+neon+dfsg/src/wp/VCS.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/VCS.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -49,10 +49,10 @@ | "why3ide" -> Some Why3ide | s -> match Extlib.string_del_prefix "why3:" s with - | Some "" -> None - | Some "ide" -> Some Why3ide - | Some s' -> Some (Why3 s') - | None -> Some (Why3 s) + | Some "" -> None + | Some "ide" -> Some Why3ide + | Some s' -> Some (Why3 s') + | None -> Some (Why3 s) let name_of_prover = function | Why3ide -> "Why3" @@ -60,7 +60,7 @@ | AltErgo -> "Alt-Ergo" | Coq -> "Coq" | Qed -> "Qed" - + let name_of_mode = function | FixMode -> "Fix" | EditMode -> "Edit" @@ -73,10 +73,10 @@ String.iter (fun c -> let c = if - ('0' <= c && c <= '9') || - ('a' <= c && c <= 'z') || - ('A' <= c && c <= 'Z') - then c else '_' + ('0' <= c && c <= '9') || + ('a' <= c && c <= 'z') || + ('A' <= c && c <= 'Z') + then c else '_' in Buffer.add_char buffer c) s ; Buffer.contents buffer @@ -114,19 +114,19 @@ let cmp_prover p q = match p,q with - | Qed , Qed -> 0 - | Qed , _ -> (-1) - | _ , Qed -> 1 - | AltErgo , AltErgo -> 0 - | AltErgo , _ -> (-1) - | _ , AltErgo -> 1 - | Coq , Coq -> 0 - | Coq , _ -> (-1) - | _ , Coq -> 1 - | Why3 p , Why3 q -> String.compare p q - | Why3 _, _ -> (-1) - | _, Why3 _ -> 1 - | Why3ide, Why3ide -> 0 + | Qed , Qed -> 0 + | Qed , _ -> (-1) + | _ , Qed -> 1 + | AltErgo , AltErgo -> 0 + | AltErgo , _ -> (-1) + | _ , AltErgo -> 1 + | Coq , Coq -> 0 + | Coq , _ -> (-1) + | _ , Coq -> 1 + | Why3 p , Why3 q -> String.compare p q + | Why3 _, _ -> (-1) + | _, Why3 _ -> 1 + | Why3ide, Why3ide -> 0 let pp_prover fmt = function | AltErgo -> Format.pp_print_string fmt "Alt-Ergo" @@ -134,7 +134,7 @@ | Coq -> Format.pp_print_string fmt "Coq" | Why3 smt -> if Wp_parameters.debug_atleast 1 then - Format.pp_print_string fmt ("Why:"^smt) + Format.pp_print_string fmt ("Why:"^smt) else Format.pp_print_string fmt smt | Qed -> Format.fprintf fmt "Qed" @@ -209,11 +209,11 @@ let pp_result fmt r = match r.verdict with - | NoResult -> Format.pp_print_string fmt "-" - | Invalid -> Format.pp_print_string fmt "Invalid" - | Computing _ -> Format.pp_print_string fmt "Computing" - | Valid -> Format.fprintf fmt "Valid%a" pp_perf r - | Unknown -> Format.fprintf fmt "Unknown%a" pp_perf r - | Timeout -> Format.fprintf fmt "Timeout%a" pp_perf r - | Stepout -> Format.fprintf fmt "Step limit%a" pp_perf r - | Failed -> Format.fprintf fmt "Failed@\nError: %s" r.prover_errmsg + | NoResult -> Format.pp_print_string fmt "-" + | Invalid -> Format.pp_print_string fmt "Invalid" + | Computing _ -> Format.pp_print_string fmt "Computing" + | Valid -> Format.fprintf fmt "Valid%a" pp_perf r + | Unknown -> Format.fprintf fmt "Unknown%a" pp_perf r + | Timeout -> Format.fprintf fmt "Timeout%a" pp_perf r + | Stepout -> Format.fprintf fmt "Step limit%a" pp_perf r + | Failed -> Format.fprintf fmt "Failed@\nError: %s" r.prover_errmsg diff -Nru frama-c-20140301+neon+dfsg/src/wp/VCS.mli frama-c-20150201+sodium+dfsg/src/wp/VCS.mli --- frama-c-20140301+neon+dfsg/src/wp/VCS.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/VCS.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Vset.ml frama-c-20150201+sodium+dfsg/src/wp/Vset.ml --- frama-c-20140301+neon+dfsg/src/wp/Vset.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Vset.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -57,12 +57,12 @@ | Range(a,b) -> Vars.union (vars_opt a) (vars_opt b) | Descr(xs,t,p) -> List.fold_left - (fun xs x -> Vars.remove x xs) - (Vars.union (F.vars t) (F.varsp p)) xs + (fun xs x -> Vars.remove x xs) + (Vars.union (F.vars t) (F.varsp p)) xs let vars vset = List.fold_left - (fun xs s -> Vars.union xs (vars_vset s)) - Vars.empty vset + (fun xs s -> Vars.union xs (vars_vset s)) + Vars.empty vset (* -------------------------------------------------------------------------- *) (* --- Pretty --- *) @@ -142,35 +142,35 @@ let sub_range x y a b = match single a b with - | Some z -> p_and (p_equal x z) (p_equal y z) - | None -> test_range x y a b + | Some z -> p_and (p_equal x z) (p_equal y z) + | None -> test_range x y a b let in_size x n = p_and (p_leq e_zero x) (p_lt x (e_int n)) let in_range x a b = match single a b with - | Some y -> p_equal x y - | None -> test_range x x a b + | Some y -> p_equal x y + | None -> test_range x x a b let ordered ~limit ~strict a b = match a , b with - | Some x , Some y -> if strict then p_lt x y else p_leq x y - | _ -> if limit then p_true else p_false + | Some x , Some y -> if strict then p_lt x y else p_leq x y + | _ -> if limit then p_true else p_false let member x xs = p_all - (function - | Set(_,s) -> p_call p_member [x;s] - | Singleton e -> p_equal x e - | Range(a,b) -> in_range x a b - | Descr(xs,t,p) -> p_exists xs (p_and (p_equal x t) p) - ) xs + (function + | Set(_,s) -> p_call p_member [x;s] + | Singleton e -> p_equal x e + | Range(a,b) -> in_range x a b + | Descr(xs,t,p) -> p_exists xs (p_and (p_equal x t) p) + ) xs let empty = [] let singleton x = [Singleton x] let range a b = [Range(a,b)] let union xs ys = (xs @ ys) - + let descr = function | Set(t,s) -> let x = Lang.freshvar t in @@ -202,8 +202,8 @@ | [] -> e_fun f_empty [] | x::xs -> List.fold_left - (fun w x -> e_fun f_union [w;concretize_vset x]) - (concretize_vset x) xs + (fun w x -> e_fun f_union [w;concretize_vset x]) + (concretize_vset x) xs let inter xs ys = e_fun f_inter [xs;ys] @@ -214,31 +214,31 @@ let subrange a b = function | [Range(c,d)] -> p_and - (match c,a with - | None,_ -> p_true - | Some _,None -> p_false - | Some c,Some a -> p_leq c a) - (match b,d with - | _,None -> p_true - | None,Some _ -> p_false - | Some b,Some d -> p_leq b d) + (match c,a with + | None,_ -> p_true + | Some _,None -> p_false + | Some c,Some a -> p_leq c a) + (match b,d with + | _,None -> p_true + | None,Some _ -> p_false + | Some b,Some d -> p_leq b d) | ys -> let x = Lang.freshvar ~basename:"k" Logic.Int in let k = e_var x in p_forall [x] (p_imply (in_range k a b) (member k ys)) - + let subset xs ys = p_all (function - | Set(t,s) -> - let x = Lang.freshvar t in - let e = e_var x in - p_forall [x] (p_imply (p_call p_member [e;s]) (member e ys)) - | Singleton e -> member e ys - | Descr(xs,t,p) -> - p_forall xs (p_imply p (member t ys)) - | Range(a,b) -> - subrange a b ys - ) xs + | Set(t,s) -> + let x = Lang.freshvar t in + let e = e_var x in + p_forall [x] (p_imply (p_call p_member [e;s]) (member e ys)) + | Singleton e -> member e ys + | Descr(xs,t,p) -> + p_forall xs (p_imply p (member t ys)) + | Range(a,b) -> + subrange a b ys + ) xs (* -------------------------------------------------------------------------- *) (* --- Equality --- *) @@ -253,94 +253,94 @@ let empty_range a b = match a,b with - | None,_ | _,None -> p_false - | Some x , Some y -> p_lt y x + | None,_ | _,None -> p_false + | Some x , Some y -> p_lt y x let disjoint_bounds left right = match left , right with - | None,_ | _,None -> p_false - | Some x , Some y -> p_lt x y + | None,_ | _,None -> p_false + | Some x , Some y -> p_lt x y let disjoint_vset x y = match x , y with - - | Singleton x , Singleton y -> - p_neq x y - - | Singleton e , Range(a,b) - | Range(a,b) , Singleton e -> - p_not (in_range e a b) - - | Range(a,b) , Range(c,d) -> - p_disj [ - empty_range a b ; - empty_range c d ; - disjoint_bounds b c ; - disjoint_bounds d a ; - ] - - | Singleton x , Descr(xs,t,p) - | Descr(xs,t,p) , Singleton x -> - p_forall xs (p_imply p (p_neq x t)) - - | Range(a,b) , Descr(xs,t,p) - | Descr(xs,t,p) , Range(a,b) -> - p_forall xs (p_imply p (p_not (in_range t a b))) - - | Descr(xs,ta,pa) , Descr(ys,tb,pb) -> - p_forall xs - (p_forall ys - (p_hyps [pa;pb] (p_neq ta tb))) - - | Singleton e , Set(_,s) - | Set(_,s) , Singleton e -> - p_not (p_call p_member [e;s]) - - | Set _ , Set _ -> - let xs,a,p = descr x in - let ys,b,q = descr y in - p_forall (xs @ ys) (p_hyps [p;q] (p_neq a b)) - - | Set(_,s) , w | w , Set(_,s) -> - let xs,t,p = descr w in - let t_in_s = p_call p_member [t;s] in - p_forall xs (p_not (p_and p t_in_s)) - + + | Singleton x , Singleton y -> + p_neq x y + + | Singleton e , Range(a,b) + | Range(a,b) , Singleton e -> + p_not (in_range e a b) + + | Range(a,b) , Range(c,d) -> + p_disj [ + empty_range a b ; + empty_range c d ; + disjoint_bounds b c ; + disjoint_bounds d a ; + ] + + | Singleton x , Descr(xs,t,p) + | Descr(xs,t,p) , Singleton x -> + p_forall xs (p_imply p (p_neq x t)) + + | Range(a,b) , Descr(xs,t,p) + | Descr(xs,t,p) , Range(a,b) -> + p_forall xs (p_imply p (p_not (in_range t a b))) + + | Descr(xs,ta,pa) , Descr(ys,tb,pb) -> + p_forall xs + (p_forall ys + (p_hyps [pa;pb] (p_neq ta tb))) + + | Singleton e , Set(_,s) + | Set(_,s) , Singleton e -> + p_not (p_call p_member [e;s]) + + | Set _ , Set _ -> + let xs,a,p = descr x in + let ys,b,q = descr y in + p_forall (xs @ ys) (p_hyps [p;q] (p_neq a b)) + + | Set(_,s) , w | w , Set(_,s) -> + let xs,t,p = descr w in + let t_in_s = p_call p_member [t;s] in + p_forall xs (p_not (p_and p t_in_s)) + let disjoint xs ys = let ws = List.fold_left (fun w x -> - List.fold_left - (fun w y -> disjoint_vset x y :: w) w ys + List.fold_left + (fun w y -> disjoint_vset x y :: w) w ys ) [] xs in p_conj ws (* -------------------------------------------------------------------------- *) (* --- Lifting & Maping --- *) (* -------------------------------------------------------------------------- *) - + let cartesian f xs ys = let zs = List.fold_left (fun w x -> - List.fold_left (fun w y -> f x y :: w) w ys + List.fold_left (fun w y -> f x y :: w) w ys ) [] xs in List.rev zs let map_vset f x = let xs,t,p = descr x in Descr(xs,f t,p) let map f xs = List.map - (function Singleton x -> Singleton (f x) | u -> map_vset f u) xs + (function Singleton x -> Singleton (f x) | u -> map_vset f u) xs let map_opt f = function None -> None | Some x -> Some (f x) let map_opp xs = List.map - (function - | Singleton x -> Singleton (e_opp x) - | Range(a,b) -> Range(map_opt e_opp b,map_opt e_opp a) - | Descr(xs,t,p) -> Descr(xs,e_opp t,p) - | (Set _) as w -> let xs,t,p = descr w in Descr(xs,e_opp t,p) - ) xs + (function + | Singleton x -> Singleton (e_opp x) + | Range(a,b) -> Range(map_opt e_opp b,map_opt e_opp a) + | Descr(xs,t,p) -> Descr(xs,e_opp t,p) + | (Set _) as w -> let xs,t,p = descr w in Descr(xs,e_opp t,p) + ) xs let lift_vset f x y = let xs,ta,pa = descr x in @@ -351,8 +351,8 @@ cartesian (fun x y -> match x , y with - | Singleton a , Singleton b -> Singleton (f a b) - | _ -> lift_vset f x y + | Singleton a , Singleton b -> Singleton (f a b) + | _ -> lift_vset f x y ) xs ys let pp_bound fmt = function @@ -361,43 +361,43 @@ let bound_shift a k = match a with - | None -> None - | Some x -> Some (e_add x k) + | None -> None + | Some x -> Some (e_add x k) let bound_add a b = match a,b with - | None,_ | _,None -> None - | Some x , Some y -> Some (e_add x y) + | None,_ | _,None -> None + | Some x , Some y -> Some (e_add x y) let bound_sub a b = match a,b with - | None,_ | _,None -> None - | Some x , Some y -> Some (e_sub x y) + | None,_ | _,None -> None + | Some x , Some y -> Some (e_sub x y) let lift_add xs ys = cartesian (fun x y -> match x , y with - | Singleton a , Singleton b -> Singleton(e_add a b) - | Singleton u , Range(a,b) | Range(a,b) , Singleton u -> - Range(map_opt (e_add u) a, map_opt (e_add u) b) - | Range(a,b) , Range(c,d) -> - Range(bound_add a c,bound_add b d) - | _ -> lift_vset e_add x y + | Singleton a , Singleton b -> Singleton(e_add a b) + | Singleton u , Range(a,b) | Range(a,b) , Singleton u -> + Range(map_opt (e_add u) a, map_opt (e_add u) b) + | Range(a,b) , Range(c,d) -> + Range(bound_add a c,bound_add b d) + | _ -> lift_vset e_add x y ) xs ys let lift_sub xs ys = cartesian (fun x y -> match x , y with - | Singleton a , Singleton b -> Singleton(e_sub a b) - | Singleton u , Range(a,b) -> - Range(bound_sub (Some u) b , bound_sub (Some u) a) - | Range(a,b) , Singleton u -> - Range(bound_sub a (Some u) , bound_sub b (Some u)) - | Range(a,b) , Range(c,d) -> - Range(bound_sub a d , bound_sub b c) - | _ -> lift_vset e_sub x y + | Singleton a , Singleton b -> Singleton(e_sub a b) + | Singleton u , Range(a,b) -> + Range(bound_sub (Some u) b , bound_sub (Some u) a) + | Range(a,b) , Singleton u -> + Range(bound_sub a (Some u) , bound_sub b (Some u)) + | Range(a,b) , Range(c,d) -> + Range(bound_sub a d , bound_sub b c) + | _ -> lift_vset e_sub x y ) xs ys (* -------------------------------------------------------------------------- *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/Vset.mli frama-c-20150201+sodium+dfsg/src/wp/Vset.mli --- frama-c-20140301+neon+dfsg/src/wp/Vset.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Vset.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -47,8 +47,8 @@ val in_range : term -> term option -> term option -> pred val sub_range : term -> term -> term option -> term option -> pred val ordered : limit:bool -> strict:bool -> term option -> term option -> pred - (** - [limit]: result when either parameter is [None] - - [strict]: if [true], comparison is [<] instead of [<=] *) +(** - [limit]: result when either parameter is [None] + - [strict]: if [true], comparison is [<] instead of [<=] *) val equal : set -> set -> pred val subset : set -> set -> pred diff -Nru frama-c-20140301+neon+dfsg/src/wp/Warning.ml frama-c-20150201+sodium+dfsg/src/wp/Warning.ml --- frama-c-20140301+neon+dfsg/src/wp/Warning.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Warning.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -34,22 +34,22 @@ reason : string ; effect : string ; } - + let compare w1 w2 = if w1 == w2 then 0 else let f1 = w1.loc.Lexing.pos_fname in let f2 = w2.loc.Lexing.pos_fname in let fc = String.compare f1 f2 in if fc <> 0 then fc else - let l1 = w1.loc.Lexing.pos_lnum in - let l2 = w2.loc.Lexing.pos_lnum in - let lc = l1 - l2 in - if lc <> 0 then lc else - match w1.severe , w2.severe with - | true , false -> (-1) - | false , true -> 1 - | _ -> Pervasives.compare w1 w2 - + let l1 = w1.loc.Lexing.pos_lnum in + let l2 = w2.loc.Lexing.pos_lnum in + let lc = l1 - l2 in + if lc <> 0 then lc else + match w1.severe , w2.severe with + | true , false -> (-1) + | false , true -> 1 + | _ -> Pervasives.compare w1 w2 + end include SELF @@ -94,9 +94,9 @@ Format.pp_print_flush fmt () ; let text = Buffer.contents buffer in if Context.defined collector then - raise (Error (source,text)) + raise (Error (source,text)) else - Wp_parameters.abort ~current:true "%s" text + Wp_parameters.abort ~current:true "%s" text ) (Format.formatter_of_buffer buffer) text @@ -122,16 +122,16 @@ let buffer = Buffer.create 80 in Format.kfprintf (fun fmt -> - Format.pp_print_flush fmt () ; - let text = Buffer.contents buffer in - let loc = Cil_const.CurrentLoc.get () in - add { - loc = fst loc ; - severe = severe ; - source = source ; - effect = effect ; - reason = text ; - }) + Format.pp_print_flush fmt () ; + let text = Buffer.contents buffer in + let loc = Cil_const.CurrentLoc.get () in + add { + loc = fst loc ; + severe = severe ; + source = source ; + effect = effect ; + reason = text ; + }) (Format.formatter_of_buffer buffer) message @@ -141,10 +141,10 @@ if Context.defined collector then ( emit ~severe ~source ~effect "%s" reason ; handler x ) else - if source <> "wp" then - Wp_parameters.fatal ~current:true "[%s] %s" source reason - else - Wp_parameters.fatal ~current:true "%s" reason + if source <> "wp" then + Wp_parameters.fatal ~current:true "[%s] %s" source reason + else + Wp_parameters.fatal ~current:true "%s" reason type 'a outcome = | Result of Set.t * 'a diff -Nru frama-c-20140301+neon+dfsg/src/wp/Warning.mli frama-c-20150201+sodium+dfsg/src/wp/Warning.mli --- frama-c-20140301+neon+dfsg/src/wp/Warning.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Warning.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -52,21 +52,21 @@ val add : t -> unit val emit : ?severe:bool -> ?source:string -> effect:string -> ('a,Format.formatter,unit) format -> 'a - (** Emit a warning in current context. - Defaults: [severe=true], [source="wp"]. *) +(** Emit a warning in current context. + Defaults: [severe=true], [source="wp"]. *) val handle : ?severe:bool -> effect:string -> handler:('a -> 'b) -> ('a -> 'b) -> 'a -> 'b - (** Handle the error and emit a warning with specified severity and effect - if a context has been set. - Otherwise, a WP-fatal error is raised instead. - Default for [severe] is false. *) +(** Handle the error and emit a warning with specified severity and effect + if a context has been set. + Otherwise, a WP-fatal error is raised instead. + Default for [severe] is false. *) type 'a outcome = | Result of Set.t * 'a | Failed of Set.t val catch : ?source:string -> ?severe:bool -> effect:string -> ('a -> 'b) -> 'a -> 'b outcome - (** Set up a context for the job. If non-handled errors are raised, - then a warning is emitted with specified severity and effect. - Default for [severe] is [true]. *) +(** Set up a context for the job. If non-handled errors are raised, + then a warning is emitted with specified severity and effect. + Default for [severe] is [true]. *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/why3_session.ml frama-c-20150201+sodium+dfsg/src/wp/why3_session.ml --- frama-c-20140301+neon+dfsg/src/wp/why3_session.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/why3_session.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -50,22 +50,22 @@ theory_parent : file; theory_goals : goal Datatype.String.Hashtbl.t; mutable theory_verified : bool; - } + } and file = - { - file_name : string; - file_format : string option; - file_parent : session; - file_theories: theory Datatype.String.Hashtbl.t; - (** Not mutated after the creation *) - mutable file_verified : bool; - } + { + file_name : string; + file_format : string option; + file_parent : session; + file_theories: theory Datatype.String.Hashtbl.t; + (** Not mutated after the creation *) + mutable file_verified : bool; + } and session = - { session_files : file Datatype.String.Hashtbl.t; - session_dir : string; - } + { session_files : file Datatype.String.Hashtbl.t; + session_dir : string; + } (** 2 Create a session *) let db_filename = "why3session.xml" @@ -119,9 +119,9 @@ let bool_attribute field r def = try match List.assoc field r.Xml.attributes with - | "true" -> true - | "false" -> false - | _ -> assert false + | "true" -> true + | "false" -> false + | _ -> assert false with Not_found -> def let int_attribute_def field r def = @@ -162,56 +162,56 @@ let rec load_goal parent g = match g.Xml.name with - | "goal" -> - let gname = load_ident g in - let verified = bool_attribute "proved" g false in - let mg = - raw_add_no_task parent gname - in - mg.goal_verified <- verified - | "label" -> () - | s -> - Wp_parameters.debug - "[Why3ide] Session.load_goal: unexpected element '%s'@." s + | "goal" -> + let gname = load_ident g in + let verified = bool_attribute "proved" g false in + let mg = + raw_add_no_task parent gname + in + mg.goal_verified <- verified + | "label" -> () + | s -> + Wp_parameters.debug + "[Why3ide] Session.load_goal: unexpected element '%s'@." s let load_theory mf th = match th.Xml.name with - | "theory" -> - let thname = load_ident th in - let verified = bool_attribute "verified" th false in - let mth = raw_add_theory mf thname in - List.iter (load_goal mth) th.Xml.elements; - mth.theory_verified <- verified - | s -> - Wp_parameters.debug - "[Why3ide] Session.load_theory: unexpected element '%s'@." s - + | "theory" -> + let thname = load_ident th in + let verified = bool_attribute "verified" th false in + let mth = raw_add_theory mf thname in + List.iter (load_goal mth) th.Xml.elements; + mth.theory_verified <- verified + | s -> + Wp_parameters.debug + "[Why3ide] Session.load_theory: unexpected element '%s'@." s + let load_file session f = match f.Xml.name with - | "file" -> - let fn = string_attribute "name" f in - let fmt = load_option "format" f in - let verified = bool_attribute "verified" f false in - let mf = raw_add_file session fn fmt in - List.iter (load_theory mf) f.Xml.elements; - mf.file_verified <- verified - | "prover" -> () - | s -> - Wp_parameters.debug - "[Why3ide] Session.load_file: unexpected element '%s'@." s - + | "file" -> + let fn = string_attribute "name" f in + let fmt = load_option "format" f in + let verified = bool_attribute "verified" f false in + let mf = raw_add_file session fn fmt in + List.iter (load_theory mf) f.Xml.elements; + mf.file_verified <- verified + | "prover" -> () + | s -> + Wp_parameters.debug + "[Why3ide] Session.load_file: unexpected element '%s'@." s + let load_session session xml = match xml.Xml.name with - | "why3session" -> - (* dprintf debug "[Info] load_session: shape version is %d@\n" - shape_version; *) - (* just to keep the old_provers somewhere *) - List.iter (load_file session) xml.Xml.elements; - (* dprintf debug "[Info] load_session: done@\n" *) - | s -> - Wp_parameters.debug - "[Why3ide] Session.load_session: unexpected element '%s'@." s - + | "why3session" -> + (* dprintf debug "[Info] load_session: shape version is %d@\n" + shape_version; *) + (* just to keep the old_provers somewhere *) + List.iter (load_file session) xml.Xml.elements; + (* dprintf debug "[Info] load_session: done@\n" *) + | s -> + Wp_parameters.debug + "[Why3ide] Session.load_session: unexpected element '%s'@." s + type notask = unit let read_session dir = if not (Sys.file_exists dir && Sys.is_directory dir) then @@ -230,17 +230,17 @@ load_session session xml.Xml.content; with Sys_error msg -> failwith ("Open session: sys error " ^ msg) - with + with | Sys_error _msg -> - (* xml does not exist yet *) + (* xml does not exist yet *) Wp_parameters.failure "[Why3ide] Can't open %s" xml_filename | Xml.Parse_error s -> Wp_parameters.failure "[Why3ide] XML database corrupted, ignored (%s)@." s; - (* failwith - ("Open session: XML database corrupted (%s)@." ^ s) *) + (* failwith + ("Open session: XML database corrupted (%s)@." ^ s) *) raise LoadError end; session - + diff -Nru frama-c-20140301+neon+dfsg/src/wp/why3_session.mli frama-c-20150201+sodium+dfsg/src/wp/why3_session.mli --- frama-c-20140301+neon+dfsg/src/wp/why3_session.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/why3_session.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -53,22 +53,22 @@ theory_parent : file; theory_goals : goal Datatype.String.Hashtbl.t; mutable theory_verified : bool; - } + } and file = private - { - file_name : string; - file_format : string option; - file_parent : session; - file_theories: theory Datatype.String.Hashtbl.t; - (** Not mutated after the creation *) - mutable file_verified : bool; - } + { + file_name : string; + file_format : string option; + file_parent : session; + file_theories: theory Datatype.String.Hashtbl.t; + (** Not mutated after the creation *) + mutable file_verified : bool; + } and session = private - { session_files : file Datatype.String.Hashtbl.t; - session_dir : string; - } + { session_files : file Datatype.String.Hashtbl.t; + session_dir : string; + } (** {2 Read/Write} *) exception LoadError diff -Nru frama-c-20140301+neon+dfsg/src/wp/why3_xml.ml frama-c-20150201+sodium+dfsg/src/wp/why3_xml.ml --- frama-c-20140301+neon+dfsg/src/wp/why3_xml.ml 2014-03-12 15:07:54.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/why3_xml.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,964 +0,0 @@ -# 34 "src/wp/why3_xml.mll" - - type element = - { name : string; - attributes : (string * string) list; - elements : element list; - } - - type t = - { version : string; - encoding : string; - doctype : string; - dtd : string; - content : element; - } - - let buf = Buffer.create 17 - - let rec pop_all group_stack element_stack = - match group_stack with - | [] -> element_stack - | (elem,att,elems)::g -> - let e = { - name = elem; - attributes = att; - elements = List.rev element_stack; - } - in pop_all g (e::elems) - - exception Parse_error of string - - let parse_error s = raise (Parse_error s) - -# 35 "src/wp/why3_xml.ml" -let __ocaml_lex_tables = { - Lexing.lex_base = - "\000\000\251\255\000\000\002\000\000\000\000\000\000\000\007\000\ - \002\000\003\000\009\000\004\000\005\000\006\000\008\000\011\000\ - \013\000\012\000\014\000\016\000\015\000\032\000\018\000\027\000\ - \074\000\019\000\023\000\254\255\025\000\028\000\026\000\029\000\ - \030\000\033\000\036\000\052\000\031\000\041\000\037\000\065\000\ - \055\000\067\000\122\000\132\000\040\000\253\255\252\255\134\000\ - \253\255\000\000\014\000\030\000\024\000\045\000\030\000\028\000\ - \053\000\069\000\139\000\087\001\201\001\146\000\254\255\084\000\ - \178\000\250\255\251\255\021\002\148\000\096\002\171\002\029\003\ - \253\255\160\000\143\003\250\255\251\255\000\000\253\255\001\004\ - \173\000\254\255\180\000\115\004\252\255\215\000\252\255\253\255\ - \254\255\187\000\017\000\248\255\249\255\071\000\255\255\041\000\ - \034\000\044\000\046\000\104\000\254\255\106\000\253\255\056\000\ - \056\000\117\000\252\255\065\000\070\000\083\000\140\000\251\255\ - \142\000\250\255"; - Lexing.lex_backtrk = - "\255\255\255\255\004\000\000\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\002\000\000\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\003\000\000\000\255\255\001\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\004\000\255\255\004\000\ - \000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\000\000\255\255\255\255\255\255\006\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255"; - Lexing.lex_default = - "\001\000\000\000\255\255\255\255\255\255\255\255\255\255\009\000\ - \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ - \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ - \009\000\009\000\009\000\000\000\009\000\009\000\009\000\009\000\ - \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ - \009\000\009\000\009\000\009\000\009\000\000\000\000\000\048\000\ - \000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\063\000\000\000\063\000\ - \065\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\ - \000\000\255\255\076\000\000\000\000\000\255\255\000\000\255\255\ - \255\255\000\000\255\255\255\255\000\000\087\000\000\000\000\000\ - \000\000\255\255\092\000\000\000\000\000\255\255\000\000\255\255\ - \255\255\255\255\255\255\255\255\000\000\255\255\000\000\255\255\ - \255\255\255\255\000\000\255\255\255\255\255\255\255\255\000\000\ - \255\255\000\000"; - Lexing.lex_trans = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\003\000\003\000\003\000\003\000\003\000\000\000\003\000\ - \010\000\010\000\010\000\010\000\010\000\000\000\010\000\050\000\ - \050\000\000\000\000\000\050\000\000\000\000\000\000\000\000\000\ - \003\000\051\000\003\000\000\000\024\000\024\000\000\000\010\000\ - \024\000\010\000\000\000\000\000\000\000\000\000\050\000\000\000\ - \019\000\000\000\000\000\094\000\023\000\000\000\000\000\093\000\ - \000\000\000\000\000\000\024\000\002\000\021\000\084\000\004\000\ - \046\000\020\000\008\000\008\000\008\000\008\000\008\000\008\000\ - \008\000\018\000\008\000\008\000\008\000\008\000\008\000\008\000\ - \022\000\008\000\008\000\024\000\024\000\027\000\036\000\024\000\ - \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ - \008\000\035\000\052\000\008\000\008\000\042\000\045\000\053\000\ - \008\000\012\000\024\000\039\000\007\000\006\000\040\000\041\000\ - \054\000\015\000\055\000\008\000\037\000\056\000\008\000\013\000\ - \005\000\014\000\016\000\017\000\029\000\038\000\031\000\011\000\ - \008\000\028\000\008\000\043\000\043\000\057\000\032\000\043\000\ - \034\000\026\000\058\000\030\000\033\000\043\000\043\000\050\000\ - \050\000\043\000\062\000\050\000\059\000\059\000\107\000\103\000\ - \059\000\108\000\043\000\061\000\061\000\068\000\068\000\061\000\ - \101\000\068\000\099\000\100\000\043\000\102\000\050\000\104\000\ - \095\000\073\000\073\000\059\000\105\000\073\000\097\000\025\000\ - \106\000\112\000\061\000\098\000\068\000\109\000\080\000\080\000\ - \096\000\008\000\080\000\068\000\068\000\082\000\082\000\068\000\ - \073\000\082\000\049\000\044\000\089\000\089\000\110\000\111\000\ - \089\000\113\000\000\000\000\000\000\000\080\000\000\000\000\000\ - \062\000\000\000\068\000\000\000\082\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\089\000\000\000\000\000\072\000\000\000\ - \089\000\089\000\000\000\000\000\089\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\067\000\000\000\ - \000\000\081\000\000\000\000\000\000\000\000\000\000\000\089\000\ - \000\000\088\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \255\255\000\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\000\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\091\000\255\255\255\255\000\000\000\000\000\000\255\255\ - \000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\000\000\000\000\255\255\255\255\000\000\000\000\ - \255\255\255\255\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\255\255\000\000\000\000\255\255\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\255\255\000\000\255\255\000\000\000\000\000\000\000\000\ - \000\000\000\000\255\255\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\255\255\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \059\000\059\000\000\000\000\000\059\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\059\000\ - \000\000\000\000\255\255\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\255\255\000\000\255\255\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\000\000\255\255\000\000\000\000\000\000\000\000\000\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\066\000\000\000\000\000\000\000\060\000\000\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\061\000\061\000\000\000\000\000\061\000\086\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\061\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\000\000\000\000\000\000\000\000\ - \060\000\000\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\069\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \000\000\000\000\000\000\000\000\070\000\000\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\000\000\000\000\000\000\000\000\071\000\ - \000\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\000\000\000\000\ - \000\000\000\000\070\000\000\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\073\000\073\000\ - \000\000\000\000\073\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\073\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\000\000\ - \000\000\000\000\000\000\072\000\000\000\000\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \000\000\000\000\000\000\000\000\071\000\000\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \080\000\080\000\000\000\000\000\080\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\080\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\077\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\000\000\000\000\000\000\000\000\078\000\000\000\000\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\000\000\000\000\000\000\000\000\079\000\000\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\082\000\082\000\000\000\000\000\082\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\082\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\000\000\000\000\000\000\081\000\000\000\ - \000\000\000\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\000\000\000\000\000\000\000\000\ - \083\000\000\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\082\000\082\000\000\000\000\000\ - \082\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\075\000\ - \000\000\000\000\000\000\082\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\000\000\000\000\000\000\ - \081\000\000\000\000\000\000\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\000\000\000\000\ - \000\000\000\000\083\000\000\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000"; - Lexing.lex_check = - "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\000\000\000\000\003\000\003\000\000\000\255\255\003\000\ - \007\000\007\000\010\000\010\000\007\000\255\255\010\000\050\000\ - \050\000\255\255\255\255\050\000\255\255\255\255\255\255\255\255\ - \000\000\049\000\003\000\255\255\023\000\023\000\255\255\007\000\ - \023\000\010\000\255\255\255\255\255\255\255\255\050\000\255\255\ - \018\000\255\255\255\255\090\000\022\000\255\255\255\255\090\000\ - \255\255\255\255\255\255\023\000\000\000\020\000\077\000\002\000\ - \008\000\019\000\009\000\011\000\012\000\013\000\007\000\014\000\ - \010\000\017\000\015\000\017\000\016\000\018\000\020\000\019\000\ - \021\000\022\000\025\000\024\000\024\000\026\000\035\000\024\000\ - \028\000\030\000\023\000\029\000\031\000\032\000\036\000\021\000\ - \033\000\034\000\051\000\034\000\038\000\041\000\044\000\052\000\ - \037\000\011\000\024\000\038\000\006\000\005\000\039\000\040\000\ - \053\000\014\000\054\000\035\000\036\000\055\000\040\000\012\000\ - \004\000\013\000\015\000\016\000\028\000\037\000\030\000\010\000\ - \039\000\025\000\041\000\042\000\042\000\056\000\031\000\042\000\ - \033\000\024\000\057\000\029\000\032\000\043\000\043\000\047\000\ - \047\000\043\000\063\000\047\000\058\000\058\000\095\000\096\000\ - \058\000\095\000\042\000\061\000\061\000\068\000\068\000\061\000\ - \097\000\068\000\098\000\099\000\043\000\101\000\047\000\103\000\ - \093\000\073\000\073\000\058\000\104\000\073\000\093\000\024\000\ - \105\000\107\000\061\000\093\000\068\000\108\000\080\000\080\000\ - \093\000\042\000\080\000\064\000\064\000\082\000\082\000\064\000\ - \073\000\082\000\047\000\043\000\089\000\089\000\109\000\110\000\ - \089\000\112\000\255\255\255\255\255\255\080\000\255\255\255\255\ - \061\000\255\255\064\000\255\255\082\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\089\000\255\255\255\255\073\000\255\255\ - \085\000\085\000\255\255\255\255\085\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\064\000\255\255\ - \255\255\082\000\255\255\255\255\255\255\255\255\255\255\085\000\ - \255\255\085\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \000\000\255\255\008\000\009\000\011\000\012\000\013\000\007\000\ - \014\000\010\000\255\255\015\000\017\000\016\000\018\000\020\000\ - \019\000\090\000\022\000\025\000\255\255\255\255\255\255\026\000\ - \255\255\028\000\030\000\023\000\029\000\031\000\032\000\036\000\ - \021\000\033\000\255\255\255\255\034\000\038\000\255\255\255\255\ - \044\000\037\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\035\000\255\255\255\255\040\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\039\000\255\255\041\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\024\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\063\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \059\000\059\000\255\255\255\255\059\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\059\000\ - \255\255\255\255\042\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\043\000\255\255\047\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\255\255\061\000\255\255\255\255\255\255\255\255\255\255\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\064\000\255\255\255\255\255\255\059\000\255\255\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\060\000\060\000\255\255\255\255\060\000\085\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\060\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\255\255\255\255\255\255\255\255\ - \060\000\255\255\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \255\255\255\255\255\255\255\255\067\000\255\255\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\255\255\255\255\255\255\255\255\069\000\ - \255\255\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\255\255\255\255\ - \255\255\255\255\070\000\255\255\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ - \070\000\070\000\070\000\070\000\070\000\070\000\071\000\071\000\ - \255\255\255\255\071\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\071\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\255\255\ - \255\255\255\255\255\255\071\000\255\255\255\255\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \255\255\255\255\255\255\255\255\071\000\255\255\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \074\000\074\000\255\255\255\255\074\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\074\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\255\255\255\255\255\255\255\255\074\000\255\255\255\255\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\255\255\255\255\255\255\255\255\074\000\255\255\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\079\000\079\000\255\255\255\255\079\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\079\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\255\255\255\255\255\255\079\000\255\255\ - \255\255\255\255\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\255\255\255\255\255\255\255\255\ - \079\000\255\255\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\083\000\083\000\255\255\255\255\ - \083\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\074\000\ - \255\255\255\255\255\255\083\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\255\255\255\255\255\255\ - \083\000\255\255\255\255\255\255\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\255\255\255\255\ - \255\255\255\255\083\000\255\255\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255"; - Lexing.lex_base_code = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\002\000\077\000\000\000\007\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\152\000\000\000\227\000\ - \015\000\000\000\046\001\000\000\000\000\000\000\000\000\121\001\ - \000\000\015\000\000\000\196\001\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000"; - Lexing.lex_backtrk_code = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000"; - Lexing.lex_default_code = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000"; - Lexing.lex_trans_code = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\001\000\001\000\001\000\001\000\001\000\000\000\001\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \001\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\ - \000\000\004\000\000\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \000\000\000\000\000\000\000\000\004\000\000\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\000\000\000\000\000\000\000\000\012\000\ - \000\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\000\000\000\000\ - \000\000\000\000\012\000\000\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\000\000\000\000\000\000\000\000\012\000\000\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\000\000\000\000\000\000\000\000\ - \012\000\000\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\000\000\ - \000\000\000\000\000\000\012\000\000\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000"; - Lexing.lex_check_code = - "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\058\000\058\000\059\000\059\000\058\000\255\255\059\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \058\000\255\255\059\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\255\255\255\255\255\255\ - \255\255\059\000\255\255\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\059\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \255\255\255\255\255\255\255\255\060\000\255\255\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\255\255\255\255\255\255\255\255\069\000\ - \255\255\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ - \069\000\069\000\069\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\255\255\255\255\ - \255\255\255\255\071\000\255\255\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ - \071\000\071\000\071\000\071\000\071\000\071\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\255\255\255\255\255\255\255\255\074\000\255\255\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\ - \074\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\255\255\255\255\255\255\255\255\ - \079\000\255\255\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\ - \079\000\079\000\079\000\079\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\255\255\ - \255\255\255\255\255\255\083\000\255\255\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\ - \083\000\083\000\083\000\083\000\083\000\083\000\083\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255"; - Lexing.lex_code = - "\255\002\255\255\003\255\255\000\002\001\003\255\001\255\255\000\ - \001\255"; -} - -let rec xml_prolog lexbuf = - __ocaml_lex_xml_prolog_rec lexbuf 0 -and __ocaml_lex_xml_prolog_rec lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 79 "src/wp/why3_xml.mll" - ( xml_prolog lexbuf ) -# 677 "src/wp/why3_xml.ml" - - | 1 -> -# 81 "src/wp/why3_xml.mll" - ( xml_doctype "1.0" "" lexbuf ) -# 682 "src/wp/why3_xml.ml" - - | 2 -> -# 83 "src/wp/why3_xml.mll" - ( xml_doctype "1.0" "" lexbuf ) -# 687 "src/wp/why3_xml.ml" - - | 3 -> -# 85 "src/wp/why3_xml.mll" - ( (* dprintf debug "[Xml warning] prolog ignored@."; *) - xml_doctype "1.0" "" lexbuf ) -# 693 "src/wp/why3_xml.ml" - - | 4 -> -# 88 "src/wp/why3_xml.mll" - ( parse_error "wrong prolog" ) -# 698 "src/wp/why3_xml.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_xml_prolog_rec lexbuf __ocaml_lex_state - -and xml_doctype version encoding lexbuf = - lexbuf.Lexing.lex_mem <- Array.create 4 (-1) ; __ocaml_lex_xml_doctype_rec version encoding lexbuf 47 -and __ocaml_lex_xml_doctype_rec version encoding lexbuf __ocaml_lex_state = - match Lexing.new_engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 92 "src/wp/why3_xml.mll" - ( xml_doctype version encoding lexbuf ) -# 709 "src/wp/why3_xml.ml" - - | 1 -> -let -# 93 "src/wp/why3_xml.mll" - doctype -# 715 "src/wp/why3_xml.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(0) lexbuf.Lexing.lex_mem.(1) in -# 94 "src/wp/why3_xml.mll" - ( match elements [] [] lexbuf with - | [x] -> - { version = version; - encoding = encoding; - doctype = doctype; - dtd = ""; - content = x; - } - | _ -> parse_error "there should be exactly one root element" - ) -# 728 "src/wp/why3_xml.ml" - - | 2 -> -# 105 "src/wp/why3_xml.mll" - ( parse_error "wrong DOCTYPE" ) -# 733 "src/wp/why3_xml.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_xml_doctype_rec version encoding lexbuf __ocaml_lex_state - -and elements group_stack element_stack lexbuf = - lexbuf.Lexing.lex_mem <- Array.create 2 (-1) ; __ocaml_lex_elements_rec group_stack element_stack lexbuf 64 -and __ocaml_lex_elements_rec group_stack element_stack lexbuf __ocaml_lex_state = - match Lexing.new_engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 109 "src/wp/why3_xml.mll" - ( elements group_stack element_stack lexbuf ) -# 744 "src/wp/why3_xml.ml" - - | 1 -> -let -# 110 "src/wp/why3_xml.mll" - elem -# 750 "src/wp/why3_xml.ml" -= Lexing.sub_lexeme lexbuf (lexbuf.Lexing.lex_start_pos + 1) lexbuf.Lexing.lex_curr_pos in -# 111 "src/wp/why3_xml.mll" - ( attributes group_stack element_stack elem [] lexbuf ) -# 754 "src/wp/why3_xml.ml" - - | 2 -> -let -# 112 "src/wp/why3_xml.mll" - _celem -# 760 "src/wp/why3_xml.ml" -= Lexing.sub_lexeme lexbuf (lexbuf.Lexing.lex_start_pos + 2) lexbuf.Lexing.lex_mem.(0) in -# 113 "src/wp/why3_xml.mll" - ( match group_stack with - | [] -> - (* dprintf debug *) - (* "[Xml warning] unexpected closing Xml element `%s'@." *) - (* celem; *) - elements group_stack element_stack lexbuf - | (elem,att,stack)::g -> - (* if celem <> elem then *) - (* dprintf debug *) - (* "[Xml warning] Xml element `%s' closed by `%s'@." *) - (* elem celem; *) - let e = { - name = elem; - attributes = att; - elements = List.rev element_stack; - } - in elements g (e::stack) lexbuf - ) -# 781 "src/wp/why3_xml.ml" - - | 3 -> -# 132 "src/wp/why3_xml.mll" - ( (* dprintf debug "[Xml warning] unexpected '<'@."; *) - elements group_stack element_stack lexbuf ) -# 787 "src/wp/why3_xml.ml" - - | 4 -> -# 135 "src/wp/why3_xml.mll" - ( match group_stack with - | [] -> element_stack - | (_elem,_,_)::_ -> - (* dprintf debug "[Xml warning] unclosed Xml element `%s'@." - elem; *) - pop_all group_stack element_stack - ) -# 798 "src/wp/why3_xml.ml" - - | 5 -> -let -# 142 "src/wp/why3_xml.mll" - c -# 804 "src/wp/why3_xml.ml" -= Lexing.sub_lexeme_char lexbuf lexbuf.Lexing.lex_start_pos in -# 143 "src/wp/why3_xml.mll" - ( parse_error ("invalid element starting with " ^ String.make 1 c) ) -# 808 "src/wp/why3_xml.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_elements_rec group_stack element_stack lexbuf __ocaml_lex_state - -and attributes groupe_stack element_stack elem acc lexbuf = - lexbuf.Lexing.lex_mem <- Array.create 2 (-1) ; __ocaml_lex_attributes_rec groupe_stack element_stack elem acc lexbuf 74 -and __ocaml_lex_attributes_rec groupe_stack element_stack elem acc lexbuf __ocaml_lex_state = - match Lexing.new_engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 147 "src/wp/why3_xml.mll" - ( attributes groupe_stack element_stack elem acc lexbuf ) -# 819 "src/wp/why3_xml.ml" - - | 1 -> -let -# 148 "src/wp/why3_xml.mll" - key -# 825 "src/wp/why3_xml.ml" -= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_mem.(0) in -# 149 "src/wp/why3_xml.mll" - ( let v = value lexbuf in - attributes groupe_stack element_stack elem ((key,v)::acc) lexbuf ) -# 830 "src/wp/why3_xml.ml" - - | 2 -> -# 152 "src/wp/why3_xml.mll" - ( elements ((elem,acc,element_stack)::groupe_stack) [] lexbuf ) -# 835 "src/wp/why3_xml.ml" - - | 3 -> -# 154 "src/wp/why3_xml.mll" - ( let e = { name = elem ; - attributes = acc; - elements = [] } - in - elements groupe_stack (e::element_stack) lexbuf ) -# 844 "src/wp/why3_xml.ml" - - | 4 -> -let -# 159 "src/wp/why3_xml.mll" - c -# 850 "src/wp/why3_xml.ml" -= Lexing.sub_lexeme_char lexbuf lexbuf.Lexing.lex_start_pos in -# 160 "src/wp/why3_xml.mll" - ( parse_error ("'>' expected, got " ^ String.make 1 c) ) -# 854 "src/wp/why3_xml.ml" - - | 5 -> -# 162 "src/wp/why3_xml.mll" - ( parse_error "unclosed element, `>' expected" ) -# 859 "src/wp/why3_xml.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_attributes_rec groupe_stack element_stack elem acc lexbuf __ocaml_lex_state - -and value lexbuf = - __ocaml_lex_value_rec lexbuf 85 -and __ocaml_lex_value_rec lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 166 "src/wp/why3_xml.mll" - ( value lexbuf ) -# 870 "src/wp/why3_xml.ml" - - | 1 -> -# 168 "src/wp/why3_xml.mll" - ( Buffer.clear buf; - string_val lexbuf ) -# 876 "src/wp/why3_xml.ml" - - | 2 -> -let -# 170 "src/wp/why3_xml.mll" - c -# 882 "src/wp/why3_xml.ml" -= Lexing.sub_lexeme_char lexbuf lexbuf.Lexing.lex_start_pos in -# 171 "src/wp/why3_xml.mll" - ( parse_error ("invalid value starting with " ^ String.make 1 c) ) -# 886 "src/wp/why3_xml.ml" - - | 3 -> -# 173 "src/wp/why3_xml.mll" - ( parse_error "unterminated keyval pair" ) -# 891 "src/wp/why3_xml.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_value_rec lexbuf __ocaml_lex_state - -and string_val lexbuf = - __ocaml_lex_string_val_rec lexbuf 90 -and __ocaml_lex_string_val_rec lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with - | 0 -> -# 177 "src/wp/why3_xml.mll" - ( Buffer.contents buf ) -# 902 "src/wp/why3_xml.ml" - - | 1 -> -# 179 "src/wp/why3_xml.mll" - ( Buffer.add_char buf '<'; - string_val lexbuf ) -# 908 "src/wp/why3_xml.ml" - - | 2 -> -# 182 "src/wp/why3_xml.mll" - ( Buffer.add_char buf '>'; - string_val lexbuf ) -# 914 "src/wp/why3_xml.ml" - - | 3 -> -# 185 "src/wp/why3_xml.mll" - ( Buffer.add_char buf '"'; - string_val lexbuf ) -# 920 "src/wp/why3_xml.ml" - - | 4 -> -# 188 "src/wp/why3_xml.mll" - ( Buffer.add_char buf '\''; - string_val lexbuf ) -# 926 "src/wp/why3_xml.ml" - - | 5 -> -# 191 "src/wp/why3_xml.mll" - ( Buffer.add_char buf '&'; - string_val lexbuf ) -# 932 "src/wp/why3_xml.ml" - - | 6 -> -let -# 193 "src/wp/why3_xml.mll" - c -# 938 "src/wp/why3_xml.ml" -= Lexing.sub_lexeme_char lexbuf lexbuf.Lexing.lex_start_pos in -# 194 "src/wp/why3_xml.mll" - ( Buffer.add_char buf c; - string_val lexbuf ) -# 943 "src/wp/why3_xml.ml" - - | 7 -> -# 197 "src/wp/why3_xml.mll" - ( parse_error "unterminated string" ) -# 948 "src/wp/why3_xml.ml" - - | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_string_val_rec lexbuf __ocaml_lex_state - -;; - -# 199 "src/wp/why3_xml.mll" - - - let from_file f = - let c = open_in f in - let lb = Lexing.from_channel c in - let t = xml_prolog lb in - close_in c; - t - - -# 965 "src/wp/why3_xml.ml" diff -Nru frama-c-20140301+neon+dfsg/src/wp/why3_xml.mli frama-c-20150201+sodium+dfsg/src/wp/why3_xml.mli --- frama-c-20140301+neon+dfsg/src/wp/why3_xml.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/why3_xml.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -37,24 +37,24 @@ type element = - { name : string; - attributes : (string * string) list; - elements : element list; - } + { name : string; + attributes : (string * string) list; + elements : element list; + } type t = - { version : string; - encoding : string; - doctype : string; - dtd : string; - content : element; - } + { version : string; + encoding : string; + doctype : string; + dtd : string; + content : element; + } exception Parse_error of string val from_file : string -> t - (** returns the list of XML elements from the given file. - raise [Sys_error] if the file cannot be opened. - raise [Parse_error] if the file does not follow XML syntax - *) +(** returns the list of XML elements from the given file. + raise [Sys_error] if the file cannot be opened. + raise [Parse_error] if the file does not follow XML syntax +*) diff -Nru frama-c-20140301+neon+dfsg/src/wp/why3_xml.mll frama-c-20150201+sodium+dfsg/src/wp/why3_xml.mll --- frama-c-20140301+neon+dfsg/src/wp/why3_xml.mll 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/why3_xml.mll 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/wpAnnot.ml frama-c-20150201+sodium+dfsg/src/wp/wpAnnot.ml --- frama-c-20140301+neon+dfsg/src/wp/wpAnnot.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/wpAnnot.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -84,12 +84,12 @@ List.fold_left (fun properties bhv -> List.fold_left - (fun properties postcond -> - if tkind = fst postcond then - let pid_spec = Property.ip_of_ensures kf Kglobal bhv postcond in - pid_spec :: properties - else properties) - properties bhv.b_post_cond) + (fun properties postcond -> + if tkind = fst postcond then + let pid_spec = Property.ip_of_ensures kf Kglobal bhv postcond in + pid_spec :: properties + else properties) + properties bhv.b_post_cond) [] bhvs @@ -102,13 +102,13 @@ List.fold_left (fun properties bhv -> if Cil.is_default_behavior bhv then - match Property.ip_assigns_of_behavior kf Kglobal bhv with - | None -> properties - | Some ip -> ip :: properties + match Property.ip_assigns_of_behavior kf Kglobal bhv with + | None -> properties + | Some ip -> ip :: properties else properties) [] bhvs - + (* -------------------------------------------------------------------------- *) (* --- Status of Unreachable Annotations --- *) (* -------------------------------------------------------------------------- *) @@ -127,13 +127,13 @@ Property_status.emit wp_unreachable ~hyps:[] p Property_status.True in let pids = match WpPropId.property_of_id pid with | Property.IPBehavior(kf, kinstr, bhv) -> - (Property.ip_post_cond_of_behavior kf kinstr bhv) @ - (Property.ip_requires_of_behavior kf kinstr bhv) + (Property.ip_post_cond_of_behavior kf kinstr bhv) @ + (Property.ip_requires_of_behavior kf kinstr bhv) | p -> - Wp_parameters.result "[WP:unreachability] Goal %a : Valid" WpPropId.pp_propid pid ; - [p] + Wp_parameters.result "[WP:unreachability] Goal %a : Valid" WpPropId.pp_propid pid ; + [p] in - List.iter emit pids + List.iter emit pids (*----------------------------------------------------------------------------*) (* Proofs *) @@ -170,19 +170,19 @@ ) hs ; let k = WpPropId.subproof_idx p in match WpPropId.parts_of_id p with - | None -> pf.proved.(k) <- Complete - | Some(p,n) -> - match pf.proved.(k) with - | Complete -> () - | Noproof -> - let bv = Bitvector.create n in - Bitvector.set_range bv 0 (p-1) ; - Bitvector.set_range bv (p+1) (n-1) ; - pf.proved.(k) <- Parts bv - | Parts bv -> - Bitvector.clear bv p ; - if Bitvector.is_empty bv - then pf.proved.(k) <- Complete + | None -> pf.proved.(k) <- Complete + | Some(p,n) -> + match pf.proved.(k) with + | Complete -> () + | Noproof -> + let bv = Bitvector.create n in + Bitvector.set_range bv 0 (p-1) ; + Bitvector.set_range bv (p+1) (n-1) ; + pf.proved.(k) <- Parts bv + | Parts bv -> + Bitvector.clear bv p ; + if Bitvector.is_empty bv + then pf.proved.(k) <- Complete end let is_composed pf = @@ -248,8 +248,8 @@ (* This is to code which behavior the computed strategy refers to. *) type asked_bhv = | FunBhv of funbehavior option (* None means default behavior - when the function has no spec. This is useful to process internal - properties even if the function has no default behavior *) + when the function has no spec. This is useful to process internal + properties even if the function has no default behavior *) | StmtBhv of Cil2cfg.node * stmt * funbehavior let name_of_asked_bhv = function @@ -272,7 +272,7 @@ * default behavior. The [int] information is only useful to build the table : * when an edge is included in 2 different [StmtBhv] we only keep the one that * has the fewer internal edges because it is necessarily included in the other. - *) +*) module HdefAnnotBhv = Cil2cfg.HE (struct type t = (stmt * int) end) (* Finally, a configuration is associated to a strategy computation to @@ -295,20 +295,20 @@ let pp_assigns_mode fmt config = let str = match config.assigns_filter with - | NoAssigns -> "without assigns" - | OnlyAssigns -> "only with assigns" - | WithAssigns -> "both assigns or not" + | NoAssigns -> "without assigns" + | OnlyAssigns -> "only with assigns" + | WithAssigns -> "both assigns or not" in Format.fprintf fmt "%s" str let pp_asked_prop fmt config = match config.asked_prop with | AllProps -> Format.fprintf fmt "all properties" | NamedProp names -> Format.fprintf fmt "properties %a" - (Pretty_utils.pp_list ~sep:"," Format.pp_print_string) names + (Pretty_utils.pp_list ~sep:"," Format.pp_print_string) names | IdProp p -> Format.fprintf fmt "property %s" (Property.Names.get_prop_name_id p) | CallPre (s, Some p) -> Format.fprintf fmt "pre %s at stmt %a" (Property.Names.get_prop_name_id p) Stmt.pretty_sid s | CallPre (s, None) -> Format.fprintf fmt "all call preconditions at stmt %a" - Stmt.pretty_sid s + Stmt.pretty_sid s let pp_strategy_info fmt config = Format.fprintf fmt "'%a', " Kernel_function.pretty config.kf; @@ -318,7 +318,7 @@ | StmtBhv (_, s, bhv) -> Format.fprintf fmt "behavior '%s' of statement %d" bhv.b_name s.sid in Format.fprintf fmt ", %a, %a" - pp_asked_prop config pp_assigns_mode config + pp_asked_prop config pp_assigns_mode config let cur_fct_default_bhv config = match config.cur_bhv with | FunBhv None -> true @@ -327,42 +327,42 @@ let filter_assign config pid = match config.assigns_filter, WpPropId.property_of_id pid with - | NoAssigns, Property.IPAssigns _ -> false - | (OnlyAssigns | WithAssigns), Property.IPAssigns _ -> true - | OnlyAssigns, _ -> false - | (NoAssigns | WithAssigns), _ -> true + | NoAssigns, Property.IPAssigns _ -> false + | (OnlyAssigns | WithAssigns), Property.IPAssigns _ -> true + | OnlyAssigns, _ -> false + | (NoAssigns | WithAssigns), _ -> true let filter_speconly config pid = if Cil2cfg.cfg_spec_only config.cfg then match WpPropId.property_of_id pid with - | Property.IPPredicate( Property.PKRequires _ , _ , Kglobal , _ ) -> true - | _ -> false + | Property.IPPredicate( Property.PKRequires _ , _ , Kglobal , _ ) -> true + | _ -> false else true let filter_status pid = Wp_parameters.StatusAll.get () || - begin - let module C = Property_status.Consolidation in - match C.get (WpPropId.property_of_id pid) with - | C.Never_tried -> true - | C.Considered_valid | C.Inconsistent _ -> false - | C.Valid _ | C.Valid_under_hyp _ - | C.Invalid_but_dead _ | C.Valid_but_dead _ | C.Unknown_but_dead _ -> - Wp_parameters.StatusTrue.get () - | C.Unknown _ -> Wp_parameters.StatusMaybe.get () - | C.Invalid _ | C.Invalid_under_hyp _ -> Wp_parameters.StatusFalse.get () - end + begin + let module C = Property_status.Consolidation in + match C.get (WpPropId.property_of_id pid) with + | C.Never_tried -> true + | C.Considered_valid | C.Inconsistent _ -> false + | C.Valid _ | C.Valid_under_hyp _ + | C.Invalid_but_dead _ | C.Valid_but_dead _ | C.Unknown_but_dead _ -> + Wp_parameters.StatusTrue.get () + | C.Unknown _ -> Wp_parameters.StatusMaybe.get () + | C.Invalid _ | C.Invalid_under_hyp _ -> Wp_parameters.StatusFalse.get () + end let filter_configstatus config pid = (match config.asked_prop with IdProp _ -> true | _ -> false) || - (filter_status pid) + (filter_status pid) let filter_asked config pid = match config.asked_prop with - | AllProps -> true - | IdProp idp -> Property.equal (WpPropId.property_of_id pid) idp - | CallPre (s_call, asked_pre) -> WpPropId.select_call_pre s_call asked_pre pid - | NamedProp names -> WpPropId.select_by_name names pid + | AllProps -> true + | IdProp idp -> Property.equal (WpPropId.property_of_id pid) idp + | CallPre (s_call, asked_pre) -> WpPropId.select_call_pre s_call asked_pre pid + | NamedProp names -> WpPropId.select_by_name names pid let rec filter config pid = function | [] -> None @@ -378,46 +378,46 @@ filter_speconly , "no code and not main precondition" ; ] in match result with - | None -> - Wp_parameters.debug ~dkey "Goal '%a' selected" WpPropId.pp_propid pid ; - true - | Some f -> - Wp_parameters.debug ~dkey "Goal '%a' skipped (%s)" WpPropId.pp_propid pid f ; - false - + | None -> + Wp_parameters.debug ~dkey "Goal '%a' selected" WpPropId.pp_propid pid ; + true + | Some f -> + Wp_parameters.debug ~dkey "Goal '%a' skipped (%s)" WpPropId.pp_propid pid f ; + false + (*----------------------------------------------------------------------------*) (* Add properties *) (* TODO: still have to remove these fonctions... *) let kind_to_select config kind id = match kind with - | WpStrategy.Agoal -> - if goal_to_select config id then Some WpStrategy.Agoal else None - | WpStrategy.Aboth goal -> - let goal = goal && goal_to_select config id in - Some (WpStrategy.Aboth goal) - | WpStrategy.AcutB goal -> - let goal = goal && goal_to_select config id in - Some (WpStrategy.AcutB goal) - | WpStrategy.AcallPre(goal,fct) -> - let goal = goal && goal_to_select config id in - Some (WpStrategy.AcallPre(goal,fct)) - | WpStrategy.Ahyp | WpStrategy.AcallHyp _ -> Some kind + | WpStrategy.Agoal -> + if goal_to_select config id then Some WpStrategy.Agoal else None + | WpStrategy.Aboth goal -> + let goal = goal && goal_to_select config id in + Some (WpStrategy.Aboth goal) + | WpStrategy.AcutB goal -> + let goal = goal && goal_to_select config id in + Some (WpStrategy.AcutB goal) + | WpStrategy.AcallPre(goal,fct) -> + let goal = goal && goal_to_select config id in + Some (WpStrategy.AcallPre(goal,fct)) + | WpStrategy.Ahyp | WpStrategy.AcallHyp _ -> Some kind let add_prop_inv_establish config acc kind s ca p = let id = WpPropId.mk_establish_id config.kf s ca in match kind_to_select config kind id with None -> acc - | Some kind -> WpStrategy.add_prop_loop_inv acc kind s id p + | Some kind -> WpStrategy.add_prop_loop_inv acc kind s id p let add_prop_inv_preserve config acc kind s ca p = let id = WpPropId.mk_preserve_id config.kf s ca in match kind_to_select config kind id with None -> acc - | Some kind -> WpStrategy.add_prop_loop_inv acc kind s id p + | Some kind -> WpStrategy.add_prop_loop_inv acc kind s id p let add_prop_inv_fixpoint config acc kind s ca p = let id = WpPropId.mk_inv_hyp_id config.kf s ca in match kind_to_select config kind id with None -> acc - | Some kind -> WpStrategy.add_prop_loop_inv acc kind s id p + | Some kind -> WpStrategy.add_prop_loop_inv acc kind s id p (*----------------------------------------------------------------------------*) (* Add Assigns *) @@ -425,8 +425,8 @@ let add_loop_assigns_goal config s (ca, assigns) acc = let id = WpPropId.mk_loop_assigns_id config.kf s ca assigns in match id with - None -> acc - | Some id -> + None -> acc + | Some id -> if goal_to_select config id then let labels = NormAtLabels.labels_loop_assigns s in let assigns' = NormAtLabels.preproc_assigns labels assigns in @@ -439,8 +439,8 @@ | Writes assigns -> let id = WpPropId.mk_stmt_assigns_id config.kf s b assigns in match id with - | None -> acc - | Some id -> + | None -> acc + | Some id -> if goal_to_select config id then let labels = NormAtLabels.labels_stmt_assigns s l_post in let assigns = NormAtLabels.preproc_assigns labels assigns in @@ -453,8 +453,8 @@ | Writes assigns -> let id = WpPropId.mk_fct_assigns_id config.kf b tkind assigns in match id with - | None -> acc - | Some id -> + | None -> acc + | Some id -> if goal_to_select config id then let labels = NormAtLabels.labels_fct_assigns in let assigns' = NormAtLabels.preproc_assigns labels assigns in @@ -505,8 +505,8 @@ | [] -> None | e::_ -> Cil2cfg.get_edge_next_stmt config.cfg e in match s_post with - | Some s_post when s_post.sid = s_annot.sid -> TBRno - | _ -> TBRhyp + | Some s_post when s_post.sid = s_annot.sid -> TBRno + | _ -> TBRhyp in let res = match bhv_name_list with | [] -> (* no spec 'for' in the property *) @@ -516,47 +516,47 @@ | _ -> Wp_parameters.fatal "annot with no edge ?" in match config.cur_bhv with - | FunBhv _ when cur_fct_default_bhv config -> - begin - try - let _ = HdefAnnotBhv.find config.def_annots_info e in - TBRhyp - with Not_found -> TBRok - end - | StmtBhv (n, sb, b) when b.b_name = Cil.default_behavior_name -> - begin - try - let s,_ = HdefAnnotBhv.find config.def_annots_info e in - if s.sid = sb.sid then TBRok - else raise Not_found - with Not_found -> hyp_but_not_at_post n - end - | FunBhv _ -> TBRhyp - | StmtBhv (n,_,_) -> hyp_but_not_at_post n + | FunBhv _ when cur_fct_default_bhv config -> + begin + try + let _ = HdefAnnotBhv.find config.def_annots_info e in + TBRhyp + with Not_found -> TBRok + end + | StmtBhv (n, sb, b) when b.b_name = Cil.default_behavior_name -> + begin + try + let s,_ = HdefAnnotBhv.find config.def_annots_info e in + if s.sid = sb.sid then TBRok + else raise Not_found + with Not_found -> hyp_but_not_at_post n + end + | FunBhv _ -> TBRhyp + | StmtBhv (n,_,_) -> hyp_but_not_at_post n end | bhvs -> (* TODOopt : there is surely a better way to do this : *) - let asked_bhv = name_of_asked_bhv config.cur_bhv in - let goal = List.exists (fun bl -> bl = asked_bhv) bhvs in - if goal then - let full = (* TODO *) true - (* List.for_all (fun bl -> is_in bl config.asked_bhvs) bhvs *) - in (if full then TBRok else TBRpart) - else TBRno + let asked_bhv = name_of_asked_bhv config.cur_bhv in + let goal = List.exists (fun bl -> bl = asked_bhv) bhvs in + if goal then + let full = (* TODO *) true + (* List.for_all (fun bl -> is_in bl config.asked_bhvs) bhvs *) + in (if full then TBRok else TBRpart) + else TBRno in debug "[is_annot_for_config] -> %s@." (match res with TBRok -> "ok" | TBRhyp -> "hyp" | TBRno -> "no" | TBRpart -> "part"); - res + res let add_fct_pre config acc spec = let kf = config.kf in let add_bhv_pre_hyp b acc = let impl_assumes = false in let kind = WpStrategy.Ahyp in - WpStrategy.add_prop_fct_bhv_pre acc kind kf b ~impl_assumes + WpStrategy.add_prop_fct_bhv_pre acc kind kf b ~impl_assumes in let add_def_pre_hyp acc = match Cil.find_default_behavior spec with None -> acc - | Some bdef -> add_bhv_pre_hyp bdef acc + | Some bdef -> add_bhv_pre_hyp bdef acc in let acc = match get_behav config Kglobal spec.spec_behavior with | None -> add_def_pre_hyp acc @@ -570,7 +570,7 @@ let id = WpPropId.mk_pre_id kf Kglobal b p in let goal = goal_to_select config id in let kind = WpStrategy.Aboth goal in - WpStrategy.add_prop_fct_pre acc kind kf b ~assumes:None p + WpStrategy.add_prop_fct_pre acc kind kf b ~assumes:None p in let acc = List.fold_left add_both acc b.b_requires in let add_hyp acc p = @@ -584,65 +584,65 @@ let add_variant acc spec = (* TODO *) let _ = match spec.spec_variant with None -> () - | Some v -> - Wp_parameters.warning ~once:true "Ignored 'decrease' specification:@, %a@." - Printer.pp_decreases v + | Some v -> + Wp_parameters.warning ~once:true "Ignored 'decrease' specification:@, %a@." + Printer.pp_decreases v in acc let add_terminates acc spec = (* TODO *) let _ = match spec.spec_terminates with None -> () - | Some p -> - Wp_parameters.warning ~once:true "Ignored 'terminates' specification:@, %a@." - Printer.pp_predicate_named - (Logic_const.pred_of_id_pred p) + | Some p -> + Wp_parameters.warning ~once:true "Ignored 'terminates' specification:@, %a@." + Printer.pp_predicate_named + (Logic_const.pred_of_id_pred p) in acc let add_disjoint_behaviors_props config ki spec acc = match spec.spec_disjoint_behaviors with [] -> acc - | l -> - let add_disj acc bhv_names = - let id = WpPropId.mk_disj_bhv_id (config.kf, ki, bhv_names) in - if goal_to_select config id then - begin - let prop = Ast_info.disjoint_behaviors spec bhv_names in - let labels = match ki with - | Kglobal -> NormAtLabels.labels_fct_pre - | Kstmt s -> NormAtLabels.labels_stmt_pre s - in WpStrategy.add_prop acc WpStrategy.Agoal labels id prop - end - else acc - in List.fold_left add_disj acc l + | l -> + let add_disj acc bhv_names = + let id = WpPropId.mk_disj_bhv_id (config.kf, ki, bhv_names) in + if goal_to_select config id then + begin + let prop = Ast_info.disjoint_behaviors spec bhv_names in + let labels = match ki with + | Kglobal -> NormAtLabels.labels_fct_pre + | Kstmt s -> NormAtLabels.labels_stmt_pre s + in WpStrategy.add_prop acc WpStrategy.Agoal labels id prop + end + else acc + in List.fold_left add_disj acc l let add_complete_behaviors_props config ki spec acc = match spec.spec_complete_behaviors with [] -> acc - | l -> - let mk_prop acc bhv_names = - let id = WpPropId.mk_compl_bhv_id (config.kf, ki, bhv_names) in - if goal_to_select config id then - let prop = Ast_info.complete_behaviors spec bhv_names in - let labels = match ki with - | Kglobal -> NormAtLabels.labels_fct_pre - | Kstmt s -> NormAtLabels.labels_stmt_pre s - in WpStrategy.add_prop acc WpStrategy.Agoal labels id prop - else acc - in List.fold_left mk_prop acc l + | l -> + let mk_prop acc bhv_names = + let id = WpPropId.mk_compl_bhv_id (config.kf, ki, bhv_names) in + if goal_to_select config id then + let prop = Ast_info.complete_behaviors spec bhv_names in + let labels = match ki with + | Kglobal -> NormAtLabels.labels_fct_pre + | Kstmt s -> NormAtLabels.labels_stmt_pre s + in WpStrategy.add_prop acc WpStrategy.Agoal labels id prop + else acc + in List.fold_left mk_prop acc l let add_behaviors_props config ki spec acc = let add = match config.cur_bhv, ki with | FunBhv _, Kglobal when cur_fct_default_bhv config -> true | StmtBhv (_, cur_s, b), Kstmt s - when (s.sid = cur_s.sid && b.b_name = Cil.default_behavior_name) -> true + when (s.sid = cur_s.sid && b.b_name = Cil.default_behavior_name) -> true | _ -> false in - if add then - let acc = add_complete_behaviors_props config ki spec acc in - let acc = add_disjoint_behaviors_props config ki spec acc in - acc - else acc + if add then + let acc = add_complete_behaviors_props config ki spec acc in + let acc = add_disjoint_behaviors_props config ki spec acc in + acc + else acc (** Add the post condition of the whole spec as hypothesis. -* Add [old(assumes) => ensures] for all the behaviors, -* and also add an upper approximation of the merged assigns information. *) + * Add [old(assumes) => ensures] for all the behaviors, + * and also add an upper approximation of the merged assigns information. *) let add_stmt_spec_post_as_hyp config v s spec acc = let l_post = Cil2cfg.get_post_logic_label config.cfg v in let add_bhv_post acc b = @@ -655,15 +655,15 @@ WpStrategy.fold_bhv_post_cond ~warn:false (add Normal) (add Exits) acc b in let p_acc = WpStrategy.add_stmt_spec_assigns_hyp p_acc config.kf s l_post spec in - (* let e_acc = TODO, but crach at the moment... why ? - * add_spec_assigns_hyp config ki l_post e_acc spec in *) - p_acc, e_acc + (* let e_acc = TODO, but crach at the moment... why ? + * add_spec_assigns_hyp config ki l_post e_acc spec in *) + p_acc, e_acc in List.fold_left add_bhv_post acc spec.spec_behavior (** we want to prove this behavior: -* - add the requires as preconditions to both prove and use as hyp, -* - add the assumes as hypotheses, -* - add the postconditions as goals. + * - add the requires as preconditions to both prove and use as hyp, + * - add the assumes as hypotheses, + * - add the postconditions as goals. *) let add_stmt_bhv_as_goal config v s b (b_acc, (p_acc, e_acc)) = let l_post = Cil2cfg.get_post_logic_label config.cfg v in @@ -675,25 +675,25 @@ let id = WpPropId.mk_pre_id config.kf (Kstmt s) b p in let goal = goal_to_select config id in let kind = WpStrategy.Aboth goal in - WpStrategy.add_prop_stmt_pre acc kind config.kf s b ~assumes p + WpStrategy.add_prop_stmt_pre acc kind config.kf s b ~assumes p in let add_post tk acc p = let id = WpPropId.mk_stmt_post_id config.kf s b (tk, p) in let goal = goal_to_select config id in let kind = WpStrategy.Aboth goal in - WpStrategy.add_prop_stmt_post acc kind config.kf s b tk l_post ~assumes p + WpStrategy.add_prop_stmt_post acc kind config.kf s b tk l_post ~assumes p in let b_acc = List.fold_left add_pre_goal b_acc b.b_requires in let b_acc = List.fold_left add_pre_hyp b_acc b.b_assumes in let p_acc, e_acc = WpStrategy.fold_bhv_post_cond ~warn:true - (add_post Normal) (add_post Exits) (p_acc, e_acc) b + (add_post Normal) (add_post Exits) (p_acc, e_acc) b in let p_acc = add_stmt_assigns_goal config s p_acc b l_post in - (*let e_acc = TODO, but crach at the moment... why ? - add_stmt_assigns config s e_acc b l_post in *) - b_acc, (p_acc, e_acc) + (*let e_acc = TODO, but crach at the moment... why ? + add_stmt_assigns config s e_acc b l_post in *) + b_acc, (p_acc, e_acc) let is_empty_behavior bhv = bhv.b_requires = [] && @@ -713,25 +713,25 @@ let acc = add_variant acc spec in let acc = add_terminates acc spec in match config.cur_bhv with - | StmtBhv (_n, cur_s, b) when s.sid = cur_s.sid -> + | StmtBhv (_n, cur_s, b) when s.sid = cur_s.sid -> (* begin match get_behav config (Kstmt s) spec.spec_behavior with | None -> (* in some cases, it seems that we can have several spec for the same statement -> not an error *) acc | Some b -> *) - let b_acc, a_acc = add_stmt_bhv_as_goal config v s b acc in - let b_acc = add_behaviors_props config (Kstmt s) spec b_acc in - b_acc, a_acc - | _ -> (* in all other cases, use the specification as hypothesis *) - let kind = WpStrategy.Aboth false in - let b_acc = - WpStrategy.add_prop_stmt_spec_pre b_acc kind config.kf s spec - in - let p_acc, e_acc = - add_stmt_spec_post_as_hyp config v s spec (p_acc, e_acc) - in b_acc, (p_acc, e_acc) - + let b_acc, a_acc = add_stmt_bhv_as_goal config v s b acc in + let b_acc = add_behaviors_props config (Kstmt s) spec b_acc in + b_acc, a_acc + | _ -> (* in all other cases, use the specification as hypothesis *) + let kind = WpStrategy.Aboth false in + let b_acc = + WpStrategy.add_prop_stmt_spec_pre b_acc kind config.kf s spec + in + let p_acc, e_acc = + add_stmt_spec_post_as_hyp config v s spec (p_acc, e_acc) + in b_acc, (p_acc, e_acc) + (*----------------------------------------------------------------------------*) (* Call annotations *) (*----------------------------------------------------------------------------*) @@ -767,34 +767,34 @@ if precond then add_called_pre config kf s spec before else before in let posts = add_called_post kf Normal posts in let posts = WpStrategy.add_call_assigns_hyp posts config.kf s - ~called_kf:kf l_post (Some spec) in + ~called_kf:kf l_post (Some spec) in let exits = add_called_post kf Exits exits in before , ( posts , exits ) - + let get_call_annots config v s fct = let l_post = Cil2cfg.get_post_logic_label config.cfg v in let empty = let e = WpStrategy.empty_acc in e,(e,e) in match fct with - | Cil2cfg.Static kf -> - let precond = not (rte_precond_status config.kf) in - add_call_annots config s kf l_post precond empty - - | Cil2cfg.Dynamic _ -> - let calls = Dyncall.get ~bhv:(name_of_asked_bhv config.cur_bhv) s in - if calls=[] then - begin - Wp_parameters.warning ~once:true ~source:(fst (Stmt.loc s)) - "Ignored function pointer (see -wp-dynamic)" ; - let annots = WpStrategy.add_call_assigns_any WpStrategy.empty_acc s in - WpStrategy.empty_acc, (annots , annots) - end - else - begin - List.fold_left - (fun acc kf -> add_call_annots config s kf l_post true acc) - empty calls - end + | Cil2cfg.Static kf -> + let precond = not (rte_precond_status config.kf) in + add_call_annots config s kf l_post precond empty + + | Cil2cfg.Dynamic _ -> + let calls = Dyncall.get ~bhv:(name_of_asked_bhv config.cur_bhv) s in + if calls=[] then + begin + Wp_parameters.warning ~once:true ~source:(fst (Stmt.loc s)) + "Ignored function pointer (see -wp-dynamic)" ; + let annots = WpStrategy.add_call_assigns_any WpStrategy.empty_acc s in + WpStrategy.empty_acc, (annots , annots) + end + else + begin + List.fold_left + (fun acc kf -> add_call_annots config s kf l_post true acc) + empty calls + end (*----------------------------------------------------------------------------*) let add_variant_annot config s ca var_exp loop_entry loop_back = @@ -806,7 +806,7 @@ in let add_hyp acc = let acc = add acc WpStrategy.Ahyp vdecr_id vdecr in - add acc WpStrategy.Ahyp vpos_id vpos + add acc WpStrategy.Ahyp vpos_id vpos in let add_goal acc = let acc = @@ -819,42 +819,42 @@ in let loop_back = if cur_fct_default_bhv config then add_goal loop_back else add_hyp loop_back - (*TODO: what about variant establishment ??? It seems that [0 - if Wp_parameters.Invariants.get() then begin - let loop_core = add_prop_inv_fixpoint config loop_core - (WpStrategy.AcutB true) s ca inv - in assigns, loop_entry , loop_back , loop_core - end - else begin - let loop_entry = add_prop_inv_establish config loop_entry - WpStrategy.Agoal s ca inv in - let loop_back = add_prop_inv_preserve config loop_back - WpStrategy.Agoal s ca inv in - let loop_core = add_prop_inv_fixpoint config loop_core - WpStrategy.Ahyp s ca inv in - assigns, loop_entry , loop_back , loop_core - end - | TBRhyp -> (* TODO : add more inv hyp ? *) - let kind = - if Wp_parameters.Invariants.get() - then (WpStrategy.AcutB false) else WpStrategy.Ahyp - in - let loop_core = - add_prop_inv_fixpoint config loop_core kind s ca inv - in assigns, loop_entry , loop_back , loop_core - | TBRno -> acc + (* we have to prove that inv is true for each edge that goes + * in the loop, so we can assume that inv is true for each edge + * starting from this point. *) + match is_annot_for_config config vloop s b_list with + | TBRok + | TBRpart (* TODO: PKPartial *) + -> + if Wp_parameters.Invariants.get() then begin + let loop_core = add_prop_inv_fixpoint config loop_core + (WpStrategy.AcutB true) s ca inv + in assigns, loop_entry , loop_back , loop_core + end + else begin + let loop_entry = add_prop_inv_establish config loop_entry + WpStrategy.Agoal s ca inv in + let loop_back = add_prop_inv_preserve config loop_back + WpStrategy.Agoal s ca inv in + let loop_core = add_prop_inv_fixpoint config loop_core + WpStrategy.Ahyp s ca inv in + assigns, loop_entry , loop_back , loop_core + end + | TBRhyp -> (* TODO : add more inv hyp ? *) + let kind = + if Wp_parameters.Invariants.get() + then (WpStrategy.AcutB false) else WpStrategy.Ahyp + in + let loop_core = + add_prop_inv_fixpoint config loop_core kind s ca inv + in assigns, loop_entry , loop_back , loop_core + | TBRno -> acc let add_stmt_invariant_annot config v s ca b_list inv ((b_acc, a_acc) as acc) = let add_to_acc k = @@ -863,49 +863,49 @@ in let acc = match is_annot_for_config config v s b_list with - | TBRok | TBRpart -> add_to_acc (WpStrategy.AcutB true) - | TBRhyp -> add_to_acc (WpStrategy.AcutB false) - | TBRno -> acc + | TBRok | TBRpart -> add_to_acc (WpStrategy.AcutB true) + | TBRhyp -> add_to_acc (WpStrategy.AcutB false) + | TBRno -> acc in acc - + (** Returns the annotations for the three edges of the loop node: * - loop_entry : goals for the edge entering in the loop * - loop_back : goals for the edge looping to the entry point * - loop_core : fix-point hypothesis for the edge starting the loop core - *) +*) let get_loop_annots config vloop s = let do_annot _ a (assigns, loop_entry, loop_back , loop_core as acc) = match a.annot_content with - | AInvariant (b_list, true, inv) -> - add_loop_invariant_annot config vloop s a b_list inv acc - | AVariant (var_exp, None) -> - let loop_entry, loop_back = - add_variant_annot config s a var_exp loop_entry loop_back - in assigns, loop_entry , loop_back , loop_core - | AVariant (_v, _rel) -> - Wp_parameters.warning ~once:true "Ignored 'loop variant' specification with measure : %a" - Printer.pp_code_annotation a; - acc - | AAssigns (_,WritesAny) -> assert false - | AAssigns (b_list, Writes w) -> (* loop assigns *) - let h_assigns, g_assigns = assigns in - let check_assigns old cur = - match old with - None -> Some cur - | Some _ -> - Wp_parameters.fatal - "At most one loop assigns can be associated to a behavior" - in - let assigns = - match is_annot_for_config config vloop s b_list with - | TBRok | TBRpart -> + | AInvariant (b_list, true, inv) -> + add_loop_invariant_annot config vloop s a b_list inv acc + | AVariant (var_exp, None) -> + let loop_entry, loop_back = + add_variant_annot config s a var_exp loop_entry loop_back + in assigns, loop_entry , loop_back , loop_core + | AVariant (_v, _rel) -> + Wp_parameters.warning ~once:true "Ignored 'loop variant' specification with measure : %a" + Printer.pp_code_annotation a; + acc + | AAssigns (_,WritesAny) -> assert false + | AAssigns (b_list, Writes w) -> (* loop assigns *) + let h_assigns, g_assigns = assigns in + let check_assigns old cur = + match old with + None -> Some cur + | Some _ -> + Wp_parameters.fatal + "At most one loop assigns can be associated to a behavior" + in + let assigns = + match is_annot_for_config config vloop s b_list with + | TBRok | TBRpart -> check_assigns h_assigns (a,w), check_assigns g_assigns (a,w) - | TBRhyp -> + | TBRhyp -> check_assigns h_assigns (a,w), g_assigns - | TBRno -> assigns - in (assigns, loop_entry , loop_back , loop_core) - | _ -> acc (* see get_stmt_annots *) + | TBRno -> assigns + in (assigns, loop_entry , loop_back , loop_core) + | _ -> acc (* see get_stmt_annots *) in let acc = ((None,None), @@ -925,46 +925,46 @@ let get_stmt_annots config v s = let do_annot _ a ((b_acc, (a_acc, e_acc)) as acc) = match a.annot_content with - | AInvariant (b_list, loop_inv, inv) -> - if loop_inv then (* see get_loop_annots *) acc - else if Wp_parameters.Invariants.get() then - add_stmt_invariant_annot config v s a b_list inv acc - else begin - Wp_parameters.warning ~once:true - "Ignored 'invariant' specification (use -wp-invariants option):@, %a" - Printer.pp_code_annotation a; - acc - end - | AAssert (b_list,p) -> - let kf = config.kf in - let acc = match is_annot_for_config config v s b_list with - | TBRno -> acc - | TBRhyp -> - let b_acc = - WpStrategy.add_prop_assert b_acc WpStrategy.Ahyp kf s a p - in (b_acc, (a_acc, e_acc)) - | TBRok | TBRpart -> - let id = WpPropId.mk_assert_id config.kf s a in - let kind = WpStrategy.Aboth (goal_to_select config id) in - let b_acc = WpStrategy.add_prop_assert b_acc kind kf s a p in - (b_acc, (a_acc, e_acc)) - in acc - | AAllocation (_b_list, _frees_allocates) -> - (* [PB] TODO *) acc - | AAssigns (_b_list, _assigns) -> - (* loop assigns: see get_loop_annots *) acc - | AVariant (_v, _rel) -> (* see get_loop_annots *) acc - | APragma _ -> - Wp_parameters.warning ~once:true "Ignored 'pragma' specification:@, %a" + | AInvariant (b_list, loop_inv, inv) -> + if loop_inv then (* see get_loop_annots *) acc + else if Wp_parameters.Invariants.get() then + add_stmt_invariant_annot config v s a b_list inv acc + else begin + Wp_parameters.warning ~once:true + "Ignored 'invariant' specification (use -wp-invariants option):@, %a" Printer.pp_code_annotation a; acc - | AStmtSpec (b_list, spec) -> - if b_list <> [] then (* TODO ! *) - Wp_parameters.warning ~once:true - "Ignored specification 'for %a' (generalize to all behavior)" - (Pretty_utils.pp_list ~sep:", " Format.pp_print_string) - b_list; - add_stmt_spec_annots config v s spec acc + end + | AAssert (b_list,p) -> + let kf = config.kf in + let acc = match is_annot_for_config config v s b_list with + | TBRno -> acc + | TBRhyp -> + let b_acc = + WpStrategy.add_prop_assert b_acc WpStrategy.Ahyp kf s a p + in (b_acc, (a_acc, e_acc)) + | TBRok | TBRpart -> + let id = WpPropId.mk_assert_id config.kf s a in + let kind = WpStrategy.Aboth (goal_to_select config id) in + let b_acc = WpStrategy.add_prop_assert b_acc kind kf s a p in + (b_acc, (a_acc, e_acc)) + in acc + | AAllocation (_b_list, _frees_allocates) -> + (* [PB] TODO *) acc + | AAssigns (_b_list, _assigns) -> + (* loop assigns: see get_loop_annots *) acc + | AVariant (_v, _rel) -> (* see get_loop_annots *) acc + | APragma _ -> + Wp_parameters.warning ~once:true "Ignored 'pragma' specification:@, %a" + Printer.pp_code_annotation a; + acc + | AStmtSpec (b_list, spec) -> + if b_list <> [] then (* TODO ! *) + Wp_parameters.warning ~once:true + "Ignored specification 'for %a' (generalize to all behavior)" + (Pretty_utils.pp_list ~sep:", " Format.pp_print_string) + b_list; + add_stmt_spec_annots config v s spec acc in let before_acc = WpStrategy.empty_acc in let after_acc = WpStrategy.empty_acc in @@ -978,37 +978,37 @@ let acc = add_behaviors_props config Kglobal spec acc in let acc = add_variant acc spec in let acc = add_terminates acc spec in - acc + acc let get_fct_post_annots config tkind spec = let acc = WpStrategy.empty_acc in match get_behav config Kglobal spec.spec_behavior with - | None -> acc - | Some b -> - (* add the postconditions *) - let f_nothing () _ = () in - let add tk acc p = - let id = WpPropId.mk_fct_post_id config.kf b (tk, p) in - if goal_to_select config id then - WpStrategy.add_prop_fct_post acc WpStrategy.Agoal config.kf b tk p - else acc - in - let acc = match tkind with - | Normal -> - let acc, _ = - WpStrategy.fold_bhv_post_cond ~warn:true (add Normal) f_nothing (acc, ()) b - in acc - | Exits -> - let _, acc = - WpStrategy.fold_bhv_post_cond ~warn:false f_nothing (add Exits) ((), acc) b - in acc - | _ -> assert false - in (* also add the [assigns] *) - let acc = - if Kernel_function.is_definition config.kf - then add_fct_assigns_goal config acc tkind b - else WpStrategy.add_fct_bhv_assigns_hyp acc config.kf tkind b - in acc + | None -> acc + | Some b -> + (* add the postconditions *) + let f_nothing () _ = () in + let add tk acc p = + let id = WpPropId.mk_fct_post_id config.kf b (tk, p) in + if goal_to_select config id then + WpStrategy.add_prop_fct_post acc WpStrategy.Agoal config.kf b tk p + else acc + in + let acc = match tkind with + | Normal -> + let acc, _ = + WpStrategy.fold_bhv_post_cond ~warn:true (add Normal) f_nothing (acc, ()) b + in acc + | Exits -> + let _, acc = + WpStrategy.fold_bhv_post_cond ~warn:false f_nothing (add Exits) ((), acc) b + in acc + | _ -> assert false + in (* also add the [assigns] *) + let acc = + if Kernel_function.is_definition config.kf + then add_fct_assigns_goal config acc tkind b + else WpStrategy.add_fct_bhv_assigns_hyp acc config.kf tkind b + in acc (*----------------------------------------------------------------------------*) (* Build graph annotation for the strategy *) @@ -1020,7 +1020,7 @@ * default behavior. This is useful when the function doesn't have any * specification. * @param asked_prop = Some id -> select only this goal (use all hyps). - *) +*) let get_behavior_annots config = debug "build strategy for %a@." pp_strategy_info config; let cfg = config.cfg in @@ -1034,22 +1034,22 @@ | Cil2cfg.VfctIn -> let pre = get_fct_pre_annots config spec in - WpStrategy.add_on_edges annots pre (Cil2cfg.succ_e cfg v) + WpStrategy.add_on_edges annots pre (Cil2cfg.succ_e cfg v) | Cil2cfg.VfctOut -> let post = get_fct_post_annots config Normal spec in - WpStrategy.add_on_edges annots post (Cil2cfg.succ_e cfg v) + WpStrategy.add_on_edges annots post (Cil2cfg.succ_e cfg v) | Cil2cfg.Vexit -> let post = get_fct_post_annots config Exits spec in - WpStrategy.add_on_edges annots post (Cil2cfg.succ_e cfg v) + WpStrategy.add_on_edges annots post (Cil2cfg.succ_e cfg v) | Cil2cfg.VblkIn (Cil2cfg.Bstmt s, _) | Cil2cfg.Vstmt s | Cil2cfg.Vswitch (s,_) | Cil2cfg.Vtest (true, s, _) -> let stmt_annots = get_stmt_annots config v s in - WpStrategy.add_node_annots annots cfg v stmt_annots + WpStrategy.add_node_annots annots cfg v stmt_annots | Cil2cfg.Vcall (s,_,fct,_) -> let stmt_annots = get_stmt_annots config v s in @@ -1060,20 +1060,20 @@ | Cil2cfg.Vloop (_, s) -> let stmt_annots = get_stmt_annots config v s in let before, _after = stmt_annots in - (* TODO: what about after ? *) - WpStrategy.add_loop_annots annots cfg v ~entry:before - ~back:WpStrategy.empty_acc ~core:WpStrategy.empty_acc; - debug "add_loop_annots stmt ok"; + (* TODO: what about after ? *) + WpStrategy.add_loop_annots annots cfg v ~entry:before + ~back:WpStrategy.empty_acc ~core:WpStrategy.empty_acc; + debug "add_loop_annots stmt ok"; let (entry , back , core) = get_loop_annots config v s in - debug "get_loop_annots ok"; - WpStrategy.add_loop_annots annots cfg v ~entry ~back ~core + debug "get_loop_annots ok"; + WpStrategy.add_loop_annots annots cfg v ~entry ~back ~core | Cil2cfg.Vloop2 _ -> (* nothing to do *) () | Cil2cfg.VblkIn (_, _) | Cil2cfg.VblkOut (_, _) -> (* nothing *) () | Cil2cfg.Vtest (false, _s, _) -> (* done in Cil2cfg.Vtest (true) *) () in - Cil2cfg.iter_nodes get_node_annot cfg; - annots + Cil2cfg.iter_nodes get_node_annot cfg; + annots (* ------------------------------------------------------------------------ *) (* --- Global Properties --- *) @@ -1127,47 +1127,47 @@ let behavior_name_of_config config = match config.cur_bhv with - | FunBhv None -> None - | FunBhv (Some b) when b.b_name = Cil.default_behavior_name -> None - | FunBhv (Some b) -> Some b.b_name - | StmtBhv (_, s, b) when b.b_name = Cil.default_behavior_name -> - Some ("default_for_stmt_"^(string_of_int s.sid))(*TODO better name ?*) - | StmtBhv (_, s, b) -> Some (b.b_name^"_stmt_"^(string_of_int s.sid)) + | FunBhv None -> None + | FunBhv (Some b) when b.b_name = Cil.default_behavior_name -> None + | FunBhv (Some b) -> Some b.b_name + | StmtBhv (_, s, b) when b.b_name = Cil.default_behavior_name -> + Some ("default_for_stmt_"^(string_of_int s.sid))(*TODO better name ?*) + | StmtBhv (_, s, b) -> Some (b.b_name^"_stmt_"^(string_of_int s.sid)) let build_bhv_strategy config = let annots = get_behavior_annots config in let annots = add_global_annotations annots in let desc = Pretty_utils.sfprintf "%a" pp_strategy_info config in let new_loops = Wp_parameters.Invariants.get() in - WpStrategy.mk_strategy desc config.cfg (behavior_name_of_config config) - new_loops WpStrategy.SKannots annots + WpStrategy.mk_strategy desc config.cfg (behavior_name_of_config config) + new_loops WpStrategy.SKannots annots (* Visit the CFG to find all the internal statement specifications. * (see [HdefAnnotBhv] documentation for infomation about this table). - *) +*) let internal_function_behaviors cfg = let def_annot_bhv = HdefAnnotBhv.create 42 in let get_stmt_bhv node stmt acc = let add_bhv_info acc b = if is_empty_behavior b then acc else - begin - if b.b_name = Cil.default_behavior_name then + begin + if b.b_name = Cil.default_behavior_name then begin let _, int_edges = Cil2cfg.get_internal_edges cfg node in let n = Cil2cfg.Eset.cardinal int_edges in let reg e = - try - let (_old_s, old_n) = HdefAnnotBhv.find def_annot_bhv e in + try + let (_old_s, old_n) = HdefAnnotBhv.find def_annot_bhv e in if n < old_n then (* new spec is included in the old one : override. *) raise Not_found - with Not_found -> - HdefAnnotBhv.replace def_annot_bhv e (stmt, n) + with Not_found -> + HdefAnnotBhv.replace def_annot_bhv e (stmt, n) in Cil2cfg.Eset.iter reg int_edges end; - (node, stmt, b)::acc - end + (node, stmt, b)::acc + end in let spec_bhv_names acc annot = match annot with | {annot_content = AStmtSpec (_,spec)} -> @@ -1179,15 +1179,15 @@ in let get_bhv n ((seen_stmts, bhvs) as l) = match Cil2cfg.start_stmt_of_node n with None -> l - | Some s -> - if List.mem s.sid seen_stmts then l - else - let seen_stmts = s.sid::seen_stmts in - let bhvs = get_stmt_bhv n s bhvs in - (seen_stmts, bhvs) + | Some s -> + if List.mem s.sid seen_stmts then l + else + let seen_stmts = s.sid::seen_stmts in + let bhvs = get_stmt_bhv n s bhvs in + (seen_stmts, bhvs) in let _, bhvs = Cil2cfg.fold_nodes get_bhv cfg ([], []) in - bhvs, def_annot_bhv + bhvs, def_annot_bhv (** empty [bhv_names] means all (whatever [ki] is) *) @@ -1198,7 +1198,7 @@ let add_fct_bhv (def, acc) b = let add () = let def = if Cil.is_default_behavior b then true else def in - def, (FunBhv (Some b))::acc + def, (FunBhv (Some b))::acc in if bhv_names = [] then add() else match ki with @@ -1218,7 +1218,7 @@ in acc else acc in - + let f_bhvs = List.rev f_bhvs in (* for compatibility with previous version *) let def, bhvs = List.fold_left add_fct_bhv (false, []) f_bhvs in let bhvs = List.fold_left add_stmt_bhv bhvs s_bhvs in @@ -1254,9 +1254,9 @@ List.fold_left add_id acc (WpPropId.mk_code_annot_ids kf s a) in let do_node acc n = - debug - "process annotations of unreachable node %a@." - Cil2cfg.pp_node_type n; + debug + "process annotations of unreachable node %a@." + Cil2cfg.pp_node_type n; match n with | Cil2cfg.Vstart -> Wp_parameters.fatal "Start must be reachable" | Cil2cfg.VfctIn -> Wp_parameters.fatal "FctIn must be reachable" @@ -1264,17 +1264,17 @@ | Cil2cfg.Vexit -> List.fold_left (do_bhv Exits) acc spec.spec_behavior | Cil2cfg.Vcall (s, _, call, _) -> Annotations.fold_code_annot (do_annot s) s acc @ - preconditions_at_call s call + preconditions_at_call s call | Cil2cfg.Vstmt s | Cil2cfg.VblkIn (Cil2cfg.Bstmt s, _) | Cil2cfg.Vtest (true, s, _) | Cil2cfg.Vloop (_, s) | Cil2cfg.Vswitch (s,_) - -> Annotations.fold_code_annot (do_annot s) s acc + -> Annotations.fold_code_annot (do_annot s) s acc | Cil2cfg.Vtest (false, _, _) | Cil2cfg.Vloop2 _ | Cil2cfg.VblkIn _ | Cil2cfg.VblkOut _ | Cil2cfg.Vend -> acc in let annots = List.fold_left do_node [] unreached in - debug - "found %d unreachable annotations@." (List.length annots) ; + debug + "found %d unreachable annotations@." (List.length annots) ; List.iter (fun pid -> set_unreachable pid) annots (*----------------------------------------------------------------------------*) @@ -1304,12 +1304,12 @@ let def_annot_bhv, bhvs = find_behaviors kf cfg ki behaviors in if bhvs <> [] then debug "[get_strategies] %d behaviors" (List.length bhvs); let mk_bhv_config bhv = { kf = kf; - cfg = cfg; - cur_bhv = bhv; - asked_prop = property; - asked_bhvs = bhvs; - assigns_filter = assigns; - def_annots_info = def_annot_bhv } + cfg = cfg; + cur_bhv = bhv; + asked_prop = property; + asked_bhvs = bhvs; + assigns_filter = assigns; + def_annots_info = def_annot_bhv } in List.map mk_bhv_config bhvs let get_strategies assigns kf behaviors ki property = @@ -1327,77 +1327,77 @@ debug "[get_precond_strategies] %s@." (Property.Names.get_prop_name_id p); match p with - | Property.IPPredicate (Property.PKRequires b, kf, Kglobal, _) -> - let strategies = - if WpStrategy.is_main_init kf then - get_strategies NoAssigns kf [b.b_name] None (IdProp p) - else [] - in - let call_sites = Kernel_function.find_syntactic_callsites kf in - let add_call_pre_stategy acc (kf_caller, stmt) = - let asked = CallPre (stmt, Some p) in - let strategies = get_strategies NoAssigns kf_caller [] None asked in - strategies @ acc - in - if call_sites = [] then - (Wp_parameters.warning ~once:true - "No direct call sites for function '%a': cannot check pre-conditions" - Kernel_function.pretty kf; - strategies) - else List.fold_left add_call_pre_stategy strategies call_sites - | _ -> + | Property.IPPredicate (Property.PKRequires b, kf, Kglobal, _) -> + let strategies = + if WpStrategy.is_main_init kf then + get_strategies NoAssigns kf [b.b_name] None (IdProp p) + else [] + in + let call_sites = Kernel_function.find_syntactic_callsites kf in + let add_call_pre_stategy acc (kf_caller, stmt) = + let asked = CallPre (stmt, Some p) in + let strategies = get_strategies NoAssigns kf_caller [] None asked in + strategies @ acc + in + if call_sites = [] then + (Wp_parameters.warning ~once:true + "No direct call sites for function '%a': cannot check pre-conditions" + Kernel_function.pretty kf; + strategies) + else List.fold_left add_call_pre_stategy strategies call_sites + | _ -> invalid_arg "[get_precond_strategies] not a function precondition" let get_call_pre_strategies stmt = debug "[get_call_pre_strategies] on statement %a@." Stmt.pretty_sid stmt; match stmt.skind with - | Instr(Call(_,f,_,_)) -> - let strategies = match Kernel_function.get_called f with - | None -> - Wp_parameters.warning - "Call through function pointer not implemented yet: \ - cannot check pre-conditions for statement %a" - Stmt.pretty_sid stmt; - [] - | Some _kf_called -> - let kf_caller = Kernel_function.find_englobing_kf stmt in - let asked = CallPre (stmt, None) in - get_strategies NoAssigns kf_caller [] None asked - in strategies - | _ -> Wp_parameters.warning - "[get_call_pre_strategies] this is not a call statement"; [] + | Instr(Call(_,f,_,_)) -> + let strategies = match Kernel_function.get_called f with + | None -> + Wp_parameters.warning + "Call through function pointer not implemented yet: \ + cannot check pre-conditions for statement %a" + Stmt.pretty_sid stmt; + [] + | Some _kf_called -> + let kf_caller = Kernel_function.find_englobing_kf stmt in + let asked = CallPre (stmt, None) in + get_strategies NoAssigns kf_caller [] None asked + in strategies + | _ -> Wp_parameters.warning + "[get_call_pre_strategies] this is not a call statement"; [] let get_id_prop_strategies ?(assigns=WithAssigns) p = debug "[get_id_prop_strategies] %s@." (Property.Names.get_prop_name_id p); - match p with - | Property.IPCodeAnnot (kf,_,ca) -> - let bhvs = match ca.annot_content with - | AAssert (l, _) | AInvariant (l, _, _) | AAssigns (l, _) -> l - | _ -> [] - in get_strategies assigns kf bhvs None (IdProp p) - | Property.IPAssigns (kf, _, Property.Id_code_annot _, _) - (*loop assigns: belongs to the default behavior *) - | Property.IPDecrease (kf,_,_,_) -> + match p with + | Property.IPCodeAnnot (kf,_,ca) -> + let bhvs = match ca.annot_content with + | AAssert (l, _) | AInvariant (l, _, _) | AAssigns (l, _) -> l + | _ -> [] + in get_strategies assigns kf bhvs None (IdProp p) + | Property.IPAssigns (kf, _, Property.Id_code_annot _, _) + (*loop assigns: belongs to the default behavior *) + | Property.IPDecrease (kf,_,_,_) -> (* any variant property is attached to the default behavior of * the function, NOT to a statement behavior *) - let bhvs = [ Cil.default_behavior_name ] in - get_strategies assigns kf bhvs None (IdProp p) - | Property.IPPredicate (Property.PKRequires _, _kf, Kglobal, _p) -> - get_precond_strategies p - | _ -> - let strategies = match Property.get_kf p with - | None -> Wp_parameters.warning - "WP of property outside functions: ignore %s" - (Property.Names.get_prop_name_id p); [] - | Some kf -> - let ki = Some (Property.get_kinstr p) in - let bhv = match Property.get_behavior p with - | None -> Cil.default_behavior_name - | Some fb -> fb.b_name - in get_strategies assigns kf [bhv] ki (IdProp p) - in strategies + let bhvs = [ Cil.default_behavior_name ] in + get_strategies assigns kf bhvs None (IdProp p) + | Property.IPPredicate (Property.PKRequires _, _kf, Kglobal, _p) -> + get_precond_strategies p + | _ -> + let strategies = match Property.get_kf p with + | None -> Wp_parameters.warning + "WP of property outside functions: ignore %s" + (Property.Names.get_prop_name_id p); [] + | Some kf -> + let ki = Some (Property.get_kinstr p) in + let bhv = match Property.get_behavior p with + | None -> Cil.default_behavior_name + | Some fb -> fb.b_name + in get_strategies assigns kf [bhv] ki (IdProp p) + in strategies let get_function_strategies ?(assigns=WithAssigns) ?(bhv=[]) ?(prop=[]) kf = let prop = match prop with [] -> AllProps | _ -> NamedProp prop in diff -Nru frama-c-20140301+neon+dfsg/src/wp/wpAnnot.mli frama-c-20150201+sodium+dfsg/src/wp/wpAnnot.mli --- frama-c-20140301+neon+dfsg/src/wp/wpAnnot.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/wpAnnot.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -36,16 +36,16 @@ type proof val create_proof : WpPropId.prop_id -> proof - (** to be used only once for one of the related prop_id *) +(** to be used only once for one of the related prop_id *) val add_proof : proof -> WpPropId.prop_id -> Property.t list -> unit - (** accumulate in the proof the partial proof for this prop_id *) +(** accumulate in the proof the partial proof for this prop_id *) val is_composed : proof -> bool - (** whether a proof needs several lemma to be complete *) +(** whether a proof needs several lemma to be complete *) val is_proved : proof -> bool - (** wether all partial proofs have been accumulated or not *) +(** wether all partial proofs have been accumulated or not *) val target : proof -> Property.t val dependencies : proof -> Property.t list diff -Nru frama-c-20140301+neon+dfsg/src/wp/wp_error.ml frama-c-20150201+sodium+dfsg/src/wp/wp_error.ml --- frama-c-20140301+neon+dfsg/src/wp/wp_error.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/wp_error.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -65,8 +65,8 @@ let pp_string_list ?(sep=format_of_string "@ ") ~empty fmt l = match l with [] -> Format.fprintf fmt "%s" empty - | _ -> Format.fprintf fmt "%a" - (Pretty_utils.pp_list ~sep Format.pp_print_string) l + | _ -> Format.fprintf fmt "%a" + (Pretty_utils.pp_list ~sep Format.pp_print_string) l type 'a cc = @@ -84,13 +84,13 @@ let protect exn = match protected exn with - | Some(plugin,reason) -> plugin , reason - | None -> raise exn + | Some(plugin,reason) -> plugin , reason + | None -> raise exn let protect_warning exn = match protected exn with - | Some(src,reason) -> Warning(src,reason) - | None -> raise exn + | Some(src,reason) -> Warning(src,reason) + | None -> raise exn let protect_function f x = try Result (f x) @@ -116,11 +116,11 @@ | [] -> Result [] | x::xs -> match f x with - | Result y -> - ( match protect_map f xs with - | Result ys -> Result (y :: ys) - | Warning _ as w -> w ) - | Warning(m,p) -> Warning(m,p) + | Result y -> + ( match protect_map f xs with + | Result ys -> Result (y :: ys) + | Warning _ as w -> w ) + | Warning(m,p) -> Warning(m,p) let name = function | [] -> "" @@ -130,6 +130,6 @@ Buffer.add_string buffer x ; List.iter (fun y -> if y <> "" then - ( Buffer.add_char buffer '-' ; - Buffer.add_string buffer y )) xs ; + ( Buffer.add_char buffer '-' ; + Buffer.add_string buffer y )) xs ; Buffer.contents buffer diff -Nru frama-c-20140301+neon+dfsg/src/wp/wp_error.mli frama-c-20150201+sodium+dfsg/src/wp/wp_error.mli --- frama-c-20140301+neon+dfsg/src/wp/wp_error.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/wp_error.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -29,8 +29,8 @@ open Cil_types exception Error of string * string - (** To be raised a feature of C/ACSL cannot be supported by a memory model - or is not implemented, or ... *) +(** To be raised a feature of C/ACSL cannot be supported by a memory model + or is not implemented, or ... *) val set_model : string -> unit diff -Nru frama-c-20140301+neon+dfsg/src/wp/Wp.mli frama-c-20150201+sodium+dfsg/src/wp/Wp.mli --- frama-c-20140301+neon+dfsg/src/wp/Wp.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/Wp.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/wpo.ml frama-c-20150201+sodium+dfsg/src/wp/wpo.ml --- frama-c-20140301+neon+dfsg/src/wp/wpo.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/wpo.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -249,7 +249,8 @@ vc.depends ; Format.fprintf fmt "@]@." ; end ; - Format.fprintf fmt "@{Prove@}: @[%a@]@." F.pp_pred vc.lemma.l_lemma ; + let env = F.env (List.fold_right F.Vars.add vc.lemma.l_forall F.Vars.empty) in + Format.fprintf fmt "@{Prove@}: @[%a@]@." (F.pp_epred env) vc.lemma.l_lemma ; List.iter (fun (prover,result) -> if result.verdict <> NoResult then @@ -406,7 +407,7 @@ (struct type t = po include Datatype.Undefined - let hash a = Hashtbl.hash a.po_gid + let hash a = FCHashtbl.hash a.po_gid let equal a b = (a.po_gid = b.po_gid) let compare a b = let c = Index.compare a.po_idx b.po_idx in @@ -431,6 +432,8 @@ po_formula = GoalAnnot VC_Annot.repr ; }] end) +(* to get a "reasonable" API doc: *) +let () = Type.set_ml_name PODatatype.ty (Some "Wpo.po") module ProverType = Datatype.Make @@ -440,6 +443,8 @@ let name = "Wpo.prover" let reprs = [ AltErgo; Coq; Qed; Why3 "z3" ] end) +(* to get a "reasonable" API doc: *) +let () = Type.set_ml_name ProverType.ty (Some "Wpo.prover") module ResultType = Datatype.Make @@ -451,6 +456,8 @@ List.map VCS.result [ Valid ; Invalid ; Unknown ; Timeout ; Failed ] end) +(* to get a "reasonable" API doc *) +let () = Type.set_ml_name ResultType.ty (Some "Wpo.result") (* -------------------------------------------------------------------------- *) (* --- Getters --- *) @@ -485,26 +492,62 @@ module Results = struct - type t = (prover * result) list ref - let create () = ref [] - let rec cancel = function - | (_,{verdict = VCS.Computing _})::rs -> cancel rs - | u::rs -> u :: cancel rs - | [] -> [] - let rec filter p = function - | (q,_)::rs when p=q -> filter p rs - | u::rs -> u :: filter p rs - | [] -> [] - let replace (rs:t) p r = - if p = Qed then - rs := (p,r) :: cancel !rs - else - rs := (p,r) :: filter p !rs - let get (rs:t) p = try List.assoc p !rs with Not_found -> VCS.no_result - let list (rs:t) = - List.sort - (fun (p,_) (q,_) -> VCS.cmp_prover p q) - (List.filter (fun (_,r) -> is_verdict r) !rs) + + module Pmap = Map.Make + (struct + type t = VCS.prover + let compare = VCS.cmp_prover + end) + + module Cmap = Map.Make(String) + + type t = { + mutable dps : result Pmap.t ; + mutable cps : result Cmap.t ; + (* result per class of Why3 provers *) + } + + let not_computing _ r = + match r.verdict with VCS.Computing _ -> false | _ -> true + + let class_of_prover = function + | Qed | AltErgo | Coq | Why3ide -> None + | Why3 dp -> + let cp = + try String.sub dp 0 (String.index dp ':') + with Not_found -> dp + in Some (String.uppercase cp) + + let create () = { dps = Pmap.empty ; cps = Cmap.empty } + + let get w p = + try Pmap.find p w.dps + with Not_found -> + match class_of_prover p with + | None -> VCS.no_result + | Some cp -> + try Cmap.find cp w.cps + with Not_found -> VCS.no_result + + let replace w p r = + begin + if p = Qed then + begin + w.dps <- Pmap.filter not_computing w.dps ; + w.cps <- Cmap.filter not_computing w.cps ; + end ; + w.dps <- Pmap.add p r w.dps ; + match class_of_prover p with + | None -> () + | Some c -> w.cps <- Cmap.add c r w.cps + end + + let list w = + Pmap.fold + (fun p r w -> + if is_verdict r then (p,r)::w else w + ) w.dps [] + end (* -------------------------------------------------------------------------- *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/wpo.mli frama-c-20150201+sodium+dfsg/src/wp/wpo.mli --- frama-c-20140301+neon+dfsg/src/wp/wpo.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/wpo.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -64,7 +64,7 @@ module VC_Lemma : sig - type t = { + type t = { lemma : Definitions.dlemma ; depends : logic_lemma list ; (* list of axioms and lemma on which the proof depends on *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/wp_parameters.ml frama-c-20150201+sodium+dfsg/src/wp/wp_parameters.ml --- frama-c-20140301+neon+dfsg/src/wp/wp_parameters.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/wp_parameters.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -24,12 +24,12 @@ module STRING = String let () = Plugin.is_share_visible () include Plugin.Register - (struct - let name = "WP" - let shortname = "wp" - let help = "Weakest Preconditions Calculus\n\ -WP 0.8 for " ^ Config.version - end) + (struct + let name = "WP" + let shortname = "wp" + let help = "Weakest Preconditions Calculus\n\ + WP 0.9 for " ^ Config.version + end) (* localize all warnings inside WP *) @@ -42,16 +42,16 @@ let reset () = List.iter (fun f -> f ()) !resetdemon module Log = - StringSet + String_set (struct let option_name = "-wp-log" let arg_name = "..." let help = "Log Specific informations" - end) + end) let has_dkey k = Datatype.String.Set.mem k (Log.get()) || - Datatype.String.Set.mem k (Debug_category.get()) + Datatype.String.Set.mem k (Debug_category.get()) (* ------------------------------------------------------------------------ *) (* --- WP Generation --- *) @@ -63,56 +63,57 @@ let () = Parameter_customize.do_not_save () module WP = Action(struct - let option_name = "-wp" - let help = "Generates proof obligations for all (selected) properties." - end) + let option_name = "-wp" + let help = "Generates proof obligations for all (selected) properties." + end) let () = on_reset WP.clear let () = Parameter_customize.set_group wp_generation let () = Parameter_customize.do_not_save () module Functions = - StringList + String_list (struct let option_name = "-wp-fct" let arg_name = "f,..." let help = "selects properties of given functions (defaults to all functions)" - end) + end) let () = on_reset Functions.clear let () = Parameter_customize.set_group wp_generation let () = Parameter_customize.do_not_save () module SkipFunctions = - StringList + String_list (struct let option_name = "-wp-skip-fct" let arg_name = "f,..." let help = "skip the specified functions (defaults to none)" - end) + end) let () = on_reset SkipFunctions.clear let () = Parameter_customize.set_group wp_generation let () = Parameter_customize.do_not_save () module Behaviors = - StringList + String_list (struct let option_name = "-wp-bhv" let arg_name = "b,..." let help = "selects properties of the given behaviors (defaults to all behaviors) of the selected functions." - end) + end) let () = on_reset Behaviors.clear let () = Parameter_customize.set_group wp_generation let () = Parameter_customize.do_not_save () +let () = Parameter_customize.no_category () module Properties = - StringList + String_list (struct let option_name = "-wp-prop" let arg_name = "p,..." let help = "selects properties having the one of the given tagnames (defaults to all properties).\n\ -You may also replace the tagname by '@category' for the selection of all properties of the given category.\n\ -Accepted categories are: lemmas, requires, assigns, ensures, exits, complete_behaviors, disjoint_behaviors assert, invariant, variant, breaks, continues, returns.\n\ -Starts by a minus character to remove properties from the selection." - end) + You may also replace the tagname by '@category' for the selection of all properties of the given category.\n\ + Accepted categories are: lemmas, requires, assigns, ensures, exits, complete_behaviors, disjoint_behaviors assert, invariant, variant, breaks, continues, returns.\n\ + Starts by a minus character to remove properties from the selection." + end) let () = on_reset Properties.clear type job = @@ -128,39 +129,39 @@ let fct = Functions.get () in let skp = SkipFunctions.get () in match fct , skp with - | [] , [] -> WP_All - | _ , [] -> WP_Fct fct - | [] , _ -> WP_SkipFct skp - | _ , _ -> WP_Fct (List.filter (fun f -> not (List.mem f skp)) fct) + | [] , [] -> WP_All + | _ , [] -> WP_Fct fct + | [] , _ -> WP_SkipFct skp + | _ , _ -> WP_Fct (List.filter (fun f -> not (List.mem f skp)) fct) else WP_None let () = Parameter_customize.set_group wp_generation module StatusAll = False(struct - let option_name = "-wp-status-all" - let help = "Select properties with any status (default: no)" - end) + let option_name = "-wp-status-all" + let help = "Select properties with any status (default: no)" + end) let () = Parameter_customize.set_group wp_generation module StatusTrue = False(struct - let option_name = "-wp-status-valid" - let help = "Select properties with status 'Valid' (default: no)" - end) + let option_name = "-wp-status-valid" + let help = "Select properties with status 'Valid' (default: no)" + end) let () = Parameter_customize.set_group wp_generation module StatusFalse = False(struct - let option_name = "-wp-status-invalid" - let help = "Select properties with status 'Invalid' (default: no)" - end) + let option_name = "-wp-status-invalid" + let help = "Select properties with status 'Invalid' (default: no)" + end) let () = Parameter_customize.set_group wp_generation module StatusMaybe = True(struct - let option_name = "-wp-status-maybe" - let help = "Select properties with status 'Maybe' (default: yes)" - end) + let option_name = "-wp-status-maybe" + let help = "Select properties with status 'Maybe' (default: yes)" + end) (* ------------------------------------------------------------------------ *) (* --- Memory Models --- *) @@ -170,41 +171,41 @@ let () = Parameter_customize.set_group wp_model module Model = - StringList + String_list (struct - let option_name = "-wp-model" - let arg_name = "model+..." - let help = "Memory model selection. Available selectors:\n \ - * 'Hoare' logic variables only\n \ - * 'Typed' typed pointers only\n \ - * '+nocast' no pointer cast\n \ - * '+cast' unsafe pointer casts\n \ - * '+raw' no logic variable\n \ - * '+ref' by-reference-style pointers detection\n \ - * '+nat/+cint' natural or machine integers arithmetics\n \ - * '+real/+float' real or IEEE floatting point arithmetics" - end) - + let option_name = "-wp-model" + let arg_name = "model+..." + let help = "Memory model selection. Available selectors:\n \ + * 'Hoare' logic variables only\n \ + * 'Typed' typed pointers only\n \ + * '+nocast' no pointer cast\n \ + * '+cast' unsafe pointer casts\n \ + * '+raw' no logic variable\n \ + * '+ref' by-reference-style pointers detection\n \ + * '+nat/+cint' natural or machine integers arithmetics\n \ + * '+real/+float' real or IEEE floatting point arithmetics" + end) + let () = Parameter_customize.set_group wp_model module ExternArrays = False(struct - let option_name = "-wp-extern-arrays" - let help = "Put some default size for extern arrays" - end) + let option_name = "-wp-extern-arrays" + let help = "Put some default size for extern arrays" + end) let () = Parameter_customize.set_group wp_model module ExtEqual = False(struct - let option_name = "-wp-extensional" - let help = "Use extensional equality on compounds (hypotheses only)" - end) + let option_name = "-wp-extensional" + let help = "Use extensional equality on compounds (hypotheses only)" + end) let () = Parameter_customize.set_group wp_model module Literals = False(struct - let option_name = "-wp-literals" - let help = "Export content of string literals (not by default)" - end) + let option_name = "-wp-literals" + let help = "Export content of string literals (not by default)" + end) (* ------------------------------------------------------------------------ *) (* --- WP Strategy --- *) @@ -213,74 +214,81 @@ let wp_strategy = add_group "Computation Strategies" let () = Parameter_customize.set_group wp_strategy +module Init = + False(struct + let option_name = "-wp-init-const" + let help = "Use initializers for global const variables" + end) + +let () = Parameter_customize.set_group wp_strategy module RTE = False(struct - let option_name = "-wp-rte" - let help = "Generates RTE guards before WP" - end) + let option_name = "-wp-rte" + let help = "Generates RTE guards before WP" + end) let () = Parameter_customize.set_group wp_strategy module Simpl = True(struct - let option_name = "-wp-simpl" - let help = "Simplify constant terms and predicates." - end) + let option_name = "-wp-simpl" + let help = "Simplify constant terms and predicates." + end) let () = Parameter_customize.set_group wp_strategy module Let = True(struct - let option_name = "-wp-let" - let help = "Use variable elimination (by default)." - end) + let option_name = "-wp-let" + let help = "Use variable elimination (by default)." + end) let () = Parameter_customize.set_group wp_strategy module Prune = True(struct - let option_name = "-wp-pruning" - let help = "Prune trivial branches (by default)." - end) + let option_name = "-wp-pruning" + let help = "Prune trivial branches (by default)." + end) let () = Parameter_customize.set_group wp_strategy module Clean = True(struct - let option_name = "-wp-clean" - let help = "Use variable filtering (by default)." - end) + let option_name = "-wp-clean" + let help = "Use variable filtering (by default)." + end) let () = Parameter_customize.set_group wp_strategy module Bits = True(struct - let option_name = "-wp-bits" - let help = "Use bit-test simplifications (by default)." - end) + let option_name = "-wp-bits" + let help = "Use bit-test simplifications (by default)." + end) let () = Parameter_customize.set_group wp_strategy module QedChecks = False(struct - let option_name = "-wp-qed-checks" - let help = "Cheks internal simplifications." - end) + let option_name = "-wp-qed-checks" + let help = "Cheks internal simplifications." + end) let () = Parameter_customize.set_group wp_strategy module Split = False(struct - let option_name = "-wp-split" - let help = "Split conjunctions into sub-goals." - end) + let option_name = "-wp-split" + let help = "Split conjunctions into sub-goals." + end) let () = Parameter_customize.set_group wp_strategy module Invariants = False(struct - let option_name = "-wp-invariants" - let help = "Handle generalized invariants inside loops." - end) + let option_name = "-wp-invariants" + let help = "Handle generalized invariants inside loops." + end) let () = Parameter_customize.set_group wp_strategy module DynCall = False(struct - let option_name = "-wp-dynamic" - let help = "Handle dynamic calls with specific annotations." - end) + let option_name = "-wp-dynamic" + let help = "Handle dynamic calls with specific annotations." + end) (* ------------------------------------------------------------------------ *) (* --- Prover Interface --- *) @@ -289,106 +297,106 @@ let wp_prover = add_group "Prover Interface" let () = Parameter_customize.set_group wp_prover -module Provers = StringList - (struct - let option_name = "-wp-prover" - let arg_name = "dp,..." - let help = - "Submit proof obligations to external prover(s):\n\ +module Provers = String_list + (struct + let option_name = "-wp-prover" + let arg_name = "dp,..." + let help = + "Submit proof obligations to external prover(s):\n\ - 'none' to skip provers\n\ - Directly supported provers:\n\ + Directly supported provers:\n\ - 'alt-ergo' (default)\n\ - 'altgr-ergo' (gui)\n\ - 'coq', 'coqide' (see also -wp-script)\n\ - 'why3:' or '' (why3 prover, see -wp-detect)\n\ - 'why3ide' (why3 gui)" - end) + end) let () = Provers.add_aliases [ "-wp-proof" ] (* Deprecated *) let () = Parameter_customize.set_group wp_prover module Generate = False - (struct - let option_name = "-wp-gen" - let help = "Only generate prover files (default: no)." - end) + (struct + let option_name = "-wp-gen" + let help = "Only generate prover files (default: no)." + end) let () = on_reset Generate.clear let () = Parameter_customize.set_group wp_prover module Detect = Action - (struct - let option_name = "-wp-detect" - let help = "List installed provers." - end) + (struct + let option_name = "-wp-detect" + let help = "List installed provers." + end) let () = on_reset Detect.clear let () = Parameter_customize.set_group wp_prover module Drivers = - StringList + String_list (struct - let option_name = "-wp-driver" - let arg_name = "file,..." - let help = "Load drivers for linking to external libraries" - end) + let option_name = "-wp-driver" + let arg_name = "file,..." + let help = "Load drivers for linking to external libraries" + end) let () = Parameter_customize.set_group wp_prover module Depth = Int(struct - let option_name = "-wp-depth" - let default = 0 - let arg_name = "p" - let help = "Set depth of exploration for provers." - end) + let option_name = "-wp-depth" + let default = 0 + let arg_name = "p" + let help = "Set depth of exploration for provers." + end) let () = Parameter_customize.set_group wp_prover module Steps = Int(struct - let option_name = "-wp-steps" - let default = 0 - let arg_name = "n" - let help = "Set number of steps for provers." - end) + let option_name = "-wp-steps" + let default = 0 + let arg_name = "n" + let help = "Set number of steps for provers." + end) let () = Parameter_customize.set_group wp_prover module Timeout = Int(struct - let option_name = "-wp-timeout" - let default = 10 - let arg_name = "n" - let help = - Printf.sprintf - "Set the timeout (in seconds) for provers (default: %d)." default - end) + let option_name = "-wp-timeout" + let default = 10 + let arg_name = "n" + let help = + Printf.sprintf + "Set the timeout (in seconds) for provers (default: %d)." default + end) let () = Parameter_customize.set_group wp_prover 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 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 module Procs = Int(struct - let option_name = "-wp-par" - let arg_name = "p" - let default = 4 - let help = - Printf.sprintf - "Number of parallel proof process (default: %d)" default - end) + let option_name = "-wp-par" + let arg_name = "p" + let default = 4 + let help = + Printf.sprintf + "Number of parallel proof process (default: %d)" default + end) let () = Parameter_customize.set_group wp_prover module ProofTrace = False (struct - let option_name = "-wp-proof-trace" - let help = "Keeps output of provers for valid POs (default: no)" - end) + let option_name = "-wp-proof-trace" + let help = "Keeps output of provers for valid POs (default: no)" + end) (* ------------------------------------------------------------------------ *) (* --- Prover Libraries --- *) @@ -399,100 +407,102 @@ let () = Parameter_customize.set_group wp_proverlibs module Script = String(struct - let option_name = "-wp-script" - let arg_name = "f.script" - let default = "" - let help = "Set user's file for Coq proofs." - end) + let option_name = "-wp-script" + let arg_name = "f.script" + let default = "" + let help = "Set user's file for Coq proofs." + end) let () = Parameter_customize.set_group wp_proverlibs module UpdateScript = True(struct - let option_name = "-wp-update-script" - let help = "If turned off, do not save or modify user's proofs." - end) + let option_name = "-wp-update-script" + let help = "If turned off, do not save or modify user's proofs." + end) let () = Parameter_customize.set_group wp_proverlibs module CoqTactic = String (struct - let option_name = "-wp-tactic" - let arg_name = "proof" - let default = "auto with zarith" - let help = "Default tactic for Coq" - end) + let option_name = "-wp-tactic" + let arg_name = "proof" + let default = "auto with zarith" + let help = "Default tactic for Coq" + end) let () = Parameter_customize.set_group wp_proverlibs module TryHints = False (struct - let option_name = "-wp-tryhints" - let help = "Try scripts from other goals (see also -wp-hints)" - end) + let option_name = "-wp-tryhints" + let help = "Try scripts from other goals (see also -wp-hints)" + end) let () = Parameter_customize.set_group wp_proverlibs module Hints = Int (struct - let option_name = "-wp-hints" - let arg_name = "n" - let default = 3 - let help = "Maximum number of proposed Coq scripts (default 3)" - end) + let option_name = "-wp-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_proverlibs module Includes = - StringList + String_list (struct - let option_name = "-wp-include" - let arg_name = "dir,...,+sharedir" - let help = "Directory where to find libraries and drivers for provers" - end) + let option_name = "-wp-include" + let arg_name = "dir,...,++sharedir" + let help = "Directory where to find libraries and drivers for provers" + end) let () = Parameter_customize.set_group wp_proverlibs module CoqLibs = - StringList + String_list (struct - let option_name = "-wp-coq-lib" - let arg_name = "*.v,*.vo" - let help = "Additional libraries for Coq" - end) + let option_name = "-wp-coq-lib" + let arg_name = "*.v,*.vo" + let help = "Additional libraries for Coq" + end) let () = Parameter_customize.set_group wp_proverlibs module WhyLibs = - StringList + String_list (struct - let option_name = "-wp-why-lib" - let arg_name = "*.why" - let help = "Additional libraries for Why" - end) + let option_name = "-wp-why-lib" + let arg_name = "*.why" + let help = "Additional libraries for Why" + end) let () = Parameter_customize.set_group wp_proverlibs +let () = Parameter_customize.no_category () module WhyFlags = - StringList + String_list (struct - let option_name = "-wp-why-opt" - let arg_name = "option,..." - let help = "Additional options for Why3" - end) + let option_name = "-wp-why-opt" + let arg_name = "option,..." + let help = "Additional options for Why3" + end) let () = Parameter_customize.set_group wp_proverlibs module AltErgoLibs = - StringList + String_list (struct - let option_name = "-wp-alt-ergo-lib" - let arg_name = "*.mlw" - let help = "Additional library file for Alt-Ergo" - end) + 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_proverlibs +let () = Parameter_customize.no_category () module AltErgoFlags = - StringList + String_list (struct - let option_name = "-wp-alt-ergo-opt" - let arg_name = "option,..." - let help = "Additional options for Alt-Ergo" - end) + let option_name = "-wp-alt-ergo-opt" + let arg_name = "option,..." + let help = "Additional options for Alt-Ergo" + end) let () = Parameter_customize.set_group wp_proverlibs @@ -503,53 +513,64 @@ let wp_po = add_group "Proof Obligations" let () = Parameter_customize.set_group wp_po +module TruncPropIdFileName = + Int(struct + let option_name = "-wp-filename-truncation" + let default = 60 + let arg_name = "n" + let help = "Truncates basename of proof obligation files after characters. Since numbers can be added as suffixes to make theses names unique, filename lengths can be highter to . No truncation is performed when the value equals to zero (defaut: 60)." + end) + + +let () = Parameter_customize.set_group wp_po let () = Parameter_customize.do_not_save () module Print = Action(struct - let option_name = "-wp-print" - let help = "Pretty-prints proof obligations on standard output." - end) + let option_name = "-wp-print" + let help = "Pretty-prints proof obligations on standard output." + end) let () = on_reset Print.clear let () = Parameter_customize.set_group wp_po let () = Parameter_customize.do_not_save () module Report = - StringList(struct - let option_name = "-wp-report" - let arg_name = "report,..." - let help = "Report specification file(s)" - end) + String_list + (struct + let option_name = "-wp-report" + let arg_name = "report,..." + let help = "Report specification file(s)" + end) let () = Parameter_customize.set_group wp_po let () = Parameter_customize.do_not_save () module ReportName = String(struct - let option_name = "-wp-report-basename" - let arg_name = "file" - let default = "wp-report" - let help = Printf.sprintf "Basename of generated reports (default %S)" default - end) + let option_name = "-wp-report-basename" + let arg_name = "file" + let default = "wp-report" + let help = Printf.sprintf "Basename of generated reports (default %S)" default + end) let () = Parameter_customize.set_group wp_po module OutputDir = String(struct - let option_name = "-wp-out" - let arg_name = "dir" - let default = "" - let help = "Set working directory for generated files.\n\ - Defaults to some temporary directory." - end) + let option_name = "-wp-out" + let arg_name = "dir" + let default = "" + let help = "Set working directory for generated files.\n\ + Defaults to some temporary directory." + end) let () = Parameter_customize.set_group wp_po let () = Parameter_customize.do_not_save () module Check = Action(struct - let option_name = "-wp-check" - let help = - "Checks the syntax and type of the produced file, instead of proving.\n\ - When the environnement variable WPCHECK is set to 'YES',\n\ - provers Alt-Ergo, Why-3 and Coq are run in this mode on all generated goals." - end) + let option_name = "-wp-check" + let help = + "Checks the syntax and type of the produced file, instead of proving.\n\ + When the environnement variable WPCHECK is set to 'YES',\n\ + provers Alt-Ergo, Why-3 and Coq are run in this mode on all generated goals." + end) let () = on_reset Print.clear let wpcheck_provers () = @@ -563,8 +584,8 @@ | "why3" -> `Why3::acc | "altergo" -> `Altergo::acc | _ -> - abort "$WPCHECK can contain only coq, why3 or altergo separated by \ - single space.") [] l + abort "$WPCHECK can contain only coq, why3 or altergo separated by \ + single space.") [] l with Not_found -> [] (* -------------------------------------------------------------------------- *) @@ -580,11 +601,11 @@ with Not_found -> debug ~dkey "ENV %s not set." var ; match default with - | Some varval -> - debug ~dkey "ENV %s default(%S)" var varval ; varval - | None -> - debug ~dkey "ENV %s undefined." var ; - raise Not_found + | Some varval -> + debug ~dkey "ENV %s default(%S)" var varval ; varval + | None -> + debug ~dkey "ENV %s undefined." var ; + raise Not_found let dkey = register_category "out" @@ -605,18 +626,18 @@ debug ~dkey "System error '%s'" (Printexc.to_string e) ; abort "Can not create output directory '%s'" dir end - + (*[LC] Do not projectify this reference : it is common to all projects *) let unique_tmp = ref None let make_tmp_dir () = match !unique_tmp with - | None -> - let tmp = - try Extlib.temp_dir_cleanup_at_exit "wp" - with Extlib.Temp_file_error s -> - abort "cannot create temporary file: %s" s - in unique_tmp := Some tmp ; tmp - | Some tmp -> tmp + | None -> + let tmp = + try Extlib.temp_dir_cleanup_at_exit "wp" + with Extlib.Temp_file_error s -> + abort "cannot create temporary file: %s" s + in unique_tmp := Some tmp ; tmp + | Some tmp -> tmp let make_gui_dir () = try @@ -636,15 +657,15 @@ let base_output () = match !base_output with | None -> let output = - match OutputDir.get () with - | "" -> - if !Fc_config.is_gui - then make_gui_dir () - else make_tmp_dir () - | dir -> - make_output_dir dir ; dir in - base_output := Some output; - output + match OutputDir.get () with + | "" -> + if !Fc_config.is_gui + then make_gui_dir () + else make_tmp_dir () + | dir -> + make_output_dir dir ; dir in + base_output := Some output; + output | Some output -> output let get_output () = @@ -655,7 +676,7 @@ else let dir = base ^ "/" ^ name in make_output_dir dir ; dir - + let get_output_dir d = let base = get_output () in let path = Printf.sprintf "%s/%s" base d in @@ -665,12 +686,24 @@ List.map (fun d -> if STRING.get d 0 = '+' then - Printf.sprintf "%s/%s" - (Kernel.Share.dir ()) - (STRING.sub d 1 (STRING.length d - 1)) + Printf.sprintf "%s/%s" + (Kernel.Share.dir ()) + (STRING.sub d 1 (STRING.length d - 1)) else d) (Includes.get ()) +let cat_print_generated = register_category "print-generated" + +let print_generated file = + debug2 ~dkey:cat_print_generated + "%a@." + (fun fmt file -> + Command.read_lines file (fun s -> + Format.pp_print_string fmt s; + Format.pp_print_newline fmt ())) + file; + + (* Local Variables: compile-command: "make -C ../.." diff -Nru frama-c-20140301+neon+dfsg/src/wp/wp_parameters.mli frama-c-20150201+sodium+dfsg/src/wp/wp_parameters.mli --- frama-c-20140301+neon+dfsg/src/wp/wp_parameters.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/wp_parameters.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -53,6 +53,7 @@ (** {2 Computation Strategies} *) +module Init: Parameter_sig.Bool module RTE: Parameter_sig.Bool module Simpl: Parameter_sig.Bool module Let: Parameter_sig.Bool @@ -89,6 +90,7 @@ (** {2 Proof Obligations} *) +module TruncPropIdFileName: Parameter_sig.Int module Print: Parameter_sig.Bool module Report: Parameter_sig.String_list module ReportName: Parameter_sig.String @@ -104,6 +106,12 @@ val get_includes: unit -> string list val make_output_dir: string -> unit +(** {2 Debugging Categories} *) +val print_generated: string -> unit +(** print the given file if the debugging category + "print-generated" is set *) + + (* Local Variables: compile-command: "make -C ../.." diff -Nru frama-c-20140301+neon+dfsg/src/wp/wpPropId.ml frama-c-20150201+sodium+dfsg/src/wp/wpPropId.ml --- frama-c-20140301+neon+dfsg/src/wp/wpPropId.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/wpPropId.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -31,7 +31,7 @@ * depending on which part of the computation is involved. * For instance, properties on loops are split in 2 parts : establishment and * preservation. - *) +*) type prop_kind = | PKCheck (** internal check *) @@ -44,9 +44,9 @@ | PKAFctOut (** computation related to the function assigns on normal termination *) | PKAFctExit (** computation related to the function assigns on exit termination *) | 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 hiden in a IPBlob property ! *) + 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 hiden in a IPBlob property ! *) type prop_id = { p_kind : prop_kind ; @@ -58,22 +58,22 @@ let mk_part pid (k, n) = { pid with p_part = Some (k,n) } let property_of_id p = p.p_prop let source_of_id p = fst (Property.location p.p_prop) - + exception Found of int let num_of_bhv_from bhv (out, _) = - match bhv.b_assigns with - WritesAny -> Wp_parameters.fatal "no \\from in this behavior ???" - | Writes l -> - let add n (o, f) = match f with FromAny -> n - | From _ -> - if Logic_utils.is_same_identified_term out o then - raise (Found n) - else n+1 - in - try - let _ = List.fold_left add 1 l in - Wp_parameters.fatal "didn't found this \\from" - with Found n -> n + match bhv.b_assigns with + WritesAny -> Wp_parameters.fatal "no \\from in this behavior ???" + | Writes l -> + let add n (o, f) = match f with FromAny -> n + | From _ -> + if Logic_utils.is_same_identified_term out o then + raise (Found n) + else n+1 + in + try + let _ = List.fold_left add 1 l in + Wp_parameters.fatal "didn't found this \\from" + with Found n -> n (*----------------------------------------------------------------------------*) (* Constructors *) @@ -99,11 +99,11 @@ let mk_loop_from_id kf s ca from = let id = Property.ip_of_from kf (Kstmt s) (Property.Id_code_annot ca) from in - mk_prop PKPropLoop id + mk_prop PKPropLoop id let mk_bhv_from_id kf ki bhv from = let id = Property.ip_of_from kf ki (Property.Id_behavior bhv) from in - mk_prop PKProp id + mk_prop PKProp id let get_kind_for_tk kf tkind = match tkind with | Normal -> @@ -114,7 +114,7 @@ let mk_fct_from_id kf bhv tkind from = let id = Property.ip_of_from kf Kglobal (Property.Id_behavior bhv) from in let kind = get_kind_for_tk kf tkind in - mk_prop kind id + mk_prop kind id let mk_disj_bhv_id (kf,ki,disj) = mk_prop PKProp (Property.ip_of_disjoint kf ki disj) @@ -152,7 +152,7 @@ let mk_call_pre_id called_kf s_call called_pre called_pre_p = let kind = PKPre (called_kf, s_call, called_pre) in - mk_prop kind called_pre_p + mk_prop kind called_pre_p (*----------------------------------------------------------------------------*) @@ -176,7 +176,7 @@ let cmp = Stmt.compare ki1 ki2 in if cmp <> 0 then cmp else - Property.compare p1 p2 + Property.compare p1 p2 | _,_ -> Pervasives.compare (kind_order k1) (kind_order k2) let compare_prop_id pid1 pid2 = @@ -193,108 +193,115 @@ module PropId = Datatype.Make_with_collections( - struct - type t = prop_id - include Datatype.Undefined - let name = "WpAnnot.prop_id" - let reprs = - List.map - (fun x -> { p_kind = PKProp; p_prop = x; p_part = None }) - Property.reprs - let hash pid = Property.hash pid.p_prop - let compare = compare_prop_id - let equal pid1 pid2 = compare_prop_id pid1 pid2 = 0 - - let copy = Datatype.undefined - let rehash = Datatype.identity - let internal_pretty_code = Datatype.undefined - let pretty = Datatype.undefined - let mem_project = Datatype.never_any_project - let varname = Datatype.undefined - end) - -module Names = struct + struct + type t = prop_id + include Datatype.Undefined + let name = "WpAnnot.prop_id" + let reprs = + List.map + (fun x -> { p_kind = PKProp; p_prop = x; p_part = None }) + Property.reprs + let hash pid = Property.hash pid.p_prop + let compare = compare_prop_id + let equal pid1 pid2 = compare_prop_id pid1 pid2 = 0 + + let copy = Datatype.undefined + let rehash = Datatype.identity + let internal_pretty_code = Datatype.undefined + let pretty = Datatype.undefined + let mem_project = Datatype.never_any_project + let varname = Datatype.undefined + end) + +module Names: +sig + val get_prop_id_name: prop_id -> string +end = struct module NamesTbl = State_builder.Hashtbl(Datatype.String.Hashtbl)(Datatype.Int) (struct - let name = "WpPropertyNames" - let dependencies = [ ] - let size = 97 - end) + let name = "WpPropertyNames" + let dependencies = [ ] + let size = 97 + end) module IndexTbl = State_builder.Hashtbl(PropId.Hashtbl)(Datatype.String) (struct - let name = "WpPropertyIndex" - let dependencies = - [ Ast.self; - NamesTbl.self; - Globals.Functions.self; - Annotations.code_annot_state; - Annotations.funspec_state; - Annotations.global_state ] - let size = 97 - end) + let name = "WpPropertyIndex" + let dependencies = + [ Ast.self; + NamesTbl.self; + Globals.Functions.self; + Annotations.code_annot_state; + Annotations.funspec_state; + Annotations.global_state ] + let size = 97 + end) let base_id_prop_txt = Property.Names.get_prop_name_id - + let basename_of_prop_id p = - match p.p_kind , p.p_prop with - | PKCheck , p -> base_id_prop_txt p - | PKProp , p -> base_id_prop_txt p - | PKPropLoop , 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) - + match p.p_kind , p.p_prop with + | PKCheck , p -> base_id_prop_txt p + | PKProp , p -> base_id_prop_txt p + | PKPropLoop , 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 normanize basename *) let normalize_basename s = - let max_len = 60 in (* truncating basename in order to limit length of file name *) - if String.length s > max_len then (String.sub s 0 (max_len - 3)) ^ "___" else 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 name that should be returned by the function [get_prop_name_id] - if the given property has [name] as basename. That name is reserved so that - [get_prop_name_id prop] can never return an identical name. *) - let reserve_name_id basename = - let basename = normalize_basename basename in - try - let speed_up_start = NamesTbl.find basename in - (* this basename is already reserved *) - let n,unique_name = Extlib.make_unique_name NamesTbl.mem ~sep:"_" ~start:speed_up_start basename - in NamesTbl.replace basename (succ n) ; (* to speed up Extlib.make_unique_name for next time *) - unique_name - with Not_found -> (* first time that basename is reserved *) - NamesTbl.add basename 2 ; - basename - - (** returns the basename of the property. *) + (** returns the normalized basename of the property. *) let get_prop_id_basename p = - let basename = normalize_basename (basename_of_prop_id p) - in match p.p_part with + 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) - + 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 + + (** returns the name that should be returned by the function [get_prop_name_id] + if the given property has [name] as basename. That name is reserved so that + [get_prop_name_id prop] can never return an identical name. *) + let reserve_name_id pid = + let basename = get_prop_id_basename pid in + try + let speed_up_start = NamesTbl.find basename in + (* this basename is already reserved *) + let n,unique_name = Extlib.make_unique_name NamesTbl.mem ~sep:"_" ~start:speed_up_start basename + in NamesTbl.replace basename (succ n) ; (* to speed up Extlib.make_unique_name for next time *) + unique_name + with Not_found -> (* first time that basename is reserved *) + NamesTbl.add basename 2 ; + basename + (** returns a unique name identifying the property. This name is built from the basename of the property. *) let get_prop_id_name pid = try IndexTbl.find pid with Not_found -> (* first time we are asking for a name for that [ip] *) - let basename = get_prop_id_basename pid in - let unique_name = reserve_name_id basename in - IndexTbl.add pid unique_name ; - unique_name - + let unique_name = reserve_name_id pid in + IndexTbl.add pid unique_name ; + unique_name + end let get_propid = Names.get_prop_id_name @@ -303,12 +310,12 @@ let pp_propid fmt pid = Format.fprintf fmt "%s" (get_propid pid) let pp_names fmt l = match l with [] -> () - | _ -> - Format.fprintf fmt "_%a" (Wp_error.pp_string_list ~empty:"" ~sep:"_") l + | _ -> + Format.fprintf fmt "_%a" (Wp_error.pp_string_list ~empty:"" ~sep:"_") l let ident_names names = List.filter (function "" -> true - | _ as n -> '\"' <> (String.get n 0) ) names + | _ as n -> '\"' <> (String.get n 0) ) names let code_annot_names ca = match ca.annot_content with | AAssert (_, named_pred) -> "@assert"::(ident_names named_pred.name) @@ -319,45 +326,48 @@ (** This is used to give the name of the property that the user can give * to select it from the command line (-wp-prop option) *) let user_prop_names p = match p with - | Property.IPPredicate (kind,_,_,idp) -> - let kind_name = - Pretty_utils.sfprintf "%c%a" '@' Property.pretty_predicate_kind kind - in kind_name::idp.ip_name - | Property.IPCodeAnnot (_,_, ca) -> code_annot_names ca - | Property.IPComplete (_, _, lb) -> - let kind_name = "@complete_behaviors" in - let name = - Pretty_utils.sfprintf "complete_behaviors%a" pp_names lb - in kind_name::[name] - | Property.IPDisjoint (_, _, lb) -> - let kind_name = "@disjoint_behaviors" in - let name = Pretty_utils.sfprintf "disjoint_behaviors%a" pp_names lb - in kind_name::[name] - | Property.IPAssigns (_, _, _, l) -> - let kind_name = "@assigns" in - List.fold_left - (fun acc (t,_) -> (ident_names t.it_content.term_name) @ acc) [kind_name] l - | Property.IPDecrease (_,_, Some ca,_) -> - let kind_name = "@decreases" - in kind_name::code_annot_names ca - | Property.IPDecrease _ -> - let kind_name = "@decreases" - in kind_name::[] (*TODO: add more names ? *) - | Property.IPLemma (a,_,_,l,_) -> - let names = "@lemma"::a::(ident_names l.name) - in begin - match LogicUsage.section_of_lemma a with - | LogicUsage.Toplevel _ -> names - | LogicUsage.Axiomatic ax -> ax.LogicUsage.ax_name::names - end - (* TODO *) - | Property.IPFrom _ - | Property.IPAllocation _ - | Property.IPAxiomatic _ - | Property.IPAxiom _ - | Property.IPBehavior _ - | Property.IPReachable _ - | Property.IPOther _ -> [] + | Property.IPPredicate (kind,_,_,idp) -> + let kind_name = + Pretty_utils.sfprintf "%c%a" '@' Property.pretty_predicate_kind kind + in kind_name::idp.ip_name + | Property.IPCodeAnnot (_,_, ca) -> code_annot_names ca + | Property.IPComplete (_, _, lb) -> + let kind_name = "@complete_behaviors" in + let name = + Pretty_utils.sfprintf "complete_behaviors%a" pp_names lb + in kind_name::[name] + | Property.IPDisjoint (_, _, lb) -> + let kind_name = "@disjoint_behaviors" in + let name = Pretty_utils.sfprintf "disjoint_behaviors%a" pp_names lb + in kind_name::[name] + | Property.IPAssigns (_, _, _, l) -> + let kind_name = "@assigns" in + List.fold_left + (fun acc (t,_) -> (ident_names t.it_content.term_name) @ acc) [kind_name] l + | Property.IPDecrease (_,_, Some ca,_) -> + let kind_name = "@decreases" + in kind_name::code_annot_names ca + | Property.IPDecrease _ -> + let kind_name = "@decreases" + in kind_name::[] (*TODO: add more names ? *) + | Property.IPLemma (a,_,_,l,_) -> + let names = "@lemma"::a::(ident_names l.name) + in begin + match LogicUsage.section_of_lemma a with + | LogicUsage.Toplevel _ -> names + | LogicUsage.Axiomatic ax -> ax.LogicUsage.ax_name::names + end + (* TODO *) + | Property.IPFrom _ + | Property.IPAllocation _ + | Property.IPAxiomatic _ + | Property.IPAxiom _ + | Property.IPBehavior _ + | Property.IPReachable _ + | Property.IPPropertyInstance _ + | Property.IPTypeInvariant _ + | Property.IPGlobalInvariant _ + | Property.IPOther _ -> [] let string_of_termination_kind = function Normal -> "post" @@ -381,9 +391,9 @@ let label_of_prop_id p = match p.p_part with - | None -> label_of_kind p.p_kind - | Some(k,n) -> - Printf.sprintf "%s (%d/%d)" (label_of_kind p.p_kind) (succ k) n + | None -> label_of_kind p.p_kind + | Some(k,n) -> + Printf.sprintf "%s (%d/%d)" (label_of_kind p.p_kind) (succ k) n module Pretty = struct @@ -430,11 +440,11 @@ List.iter (fun label -> match label with - | Label(a,_,src) -> if src then add_hint hs a - | Default _ -> add_hint hs "default" - | Case(e,_) -> match Ctypes.get_int e with - | Some k -> add_hint hs ("case-" ^ Int64.to_string k) - | None -> () + | Label(a,_,src) -> if src then add_hint hs a + | Default _ -> add_hint hs "default" + | Case(e,_) -> match Ctypes.get_int e with + | Some k -> add_hint hs ("case-" ^ Int64.to_string k) + | None -> () ) s.labels let kinstr_hints hs = function @@ -443,30 +453,30 @@ let propid_hints hs p = match p.p_kind , p.p_prop with - | PKCheck , _ -> () - | PKProp , Property.IPAssigns (_ , Kstmt _, _, _) -> add_required hs "stmt-assigns" - | PKProp , Property.IPAssigns (_ , Kglobal, _, _) -> add_required hs "fct-assigns" - | PKPropLoop , Property.IPAssigns _ -> add_required hs "loop-assigns" - | PKPropLoop , _ -> add_required hs "invariant" - | PKProp , _ -> add_required hs "property" - | PKEstablished , _ -> add_required hs "established" - | PKPreserved , _ -> add_required hs "preserved" - | PKVarDecr , _ -> add_required hs "decrease" - | PKVarPos , _ -> add_required hs "positive" - | PKAFctOut , _ -> add_required hs "return" - | PKAFctExit , _ -> add_required hs "exit" - | PKPre(kf,st,_) , _ -> - add_required hs ("precond-" ^ Kernel_function.get_name kf) ; - stmt_hints hs st - + | PKCheck , _ -> () + | PKProp , Property.IPAssigns (_ , Kstmt _, _, _) -> add_required hs "stmt-assigns" + | PKProp , Property.IPAssigns (_ , Kglobal, _, _) -> add_required hs "fct-assigns" + | PKPropLoop , Property.IPAssigns _ -> add_required hs "loop-assigns" + | PKPropLoop , _ -> add_required hs "invariant" + | PKProp , _ -> add_required hs "property" + | PKEstablished , _ -> add_required hs "established" + | PKPreserved , _ -> add_required hs "preserved" + | PKVarDecr , _ -> add_required hs "decrease" + | PKVarPos , _ -> add_required hs "positive" + | PKAFctOut , _ -> add_required hs "return" + | PKAFctExit , _ -> add_required hs "exit" + | PKPre(kf,st,_) , _ -> + add_required hs ("precond-" ^ Kernel_function.get_name kf) ; + stmt_hints hs st + let rec term_hints hs t = match t.term_node with - | 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 - | Tlet(_,t) -> 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 + | Tlet(_,t) -> term_hints hs t + | _ -> () and lval_hints hs = function | TVar { lv_origin=Some { vorig_name=x } } @@ -497,8 +507,9 @@ | Property.IPCodeAnnot(_,_,ca) -> annot_hints hs ca.annot_content | Property.IPAssigns(_,_,_,froms) -> assigns_hints hs froms | Property.IPAllocation _ (* TODO *) - | Property.IPFrom _ | Property.IPDecrease _ - | Property.IPReachable _ | Property.IPAxiomatic _ | Property.IPOther _ -> () + | Property.IPFrom _ | Property.IPDecrease _ | Property.IPPropertyInstance _ + | Property.IPReachable _ | Property.IPAxiomatic _ | Property.IPOther _ + | Property.IPTypeInvariant _ | Property.IPGlobalInvariant _ -> () let prop_id_keys p = begin @@ -509,16 +520,16 @@ opt add_required Kernel_function.get_name (Property.get_kf p.p_prop) ; opt add_required (fun b -> - if Cil.is_default_behavior b - then "default" - else b.b_name) + if Cil.is_default_behavior b + then "default" + else b.b_name) (Property.get_behavior p.p_prop) ; opt add_hint (fun (k,_) -> Printf.sprintf "part-%d" k) p.p_part ; kinstr_hints hs (Property.get_kinstr p.p_prop) ; List.sort String.compare hs.required , List.sort String.compare hs.hints end - + (*----------------------------------------------------------------------------*) (* Pretty-Print *) (*----------------------------------------------------------------------------*) @@ -561,8 +572,8 @@ let is_assigns p = match property_of_id p with - | Property.IPAssigns _ -> true - | _ -> false + | Property.IPAssigns _ -> true + | _ -> false let is_requires = function | Property.IPPredicate (Property.PKRequires _,_,_,_) -> true @@ -570,13 +581,13 @@ let is_loop_preservation p = match p.p_kind with - | PKPreserved -> - begin - match Property.get_kinstr p.p_prop with - | Kglobal -> Wp_parameters.fatal "Loop Preservation ? (%a)" Property.pretty p.p_prop - | Kstmt st -> Some st - end - | _ -> None + | PKPreserved -> + begin + match Property.get_kinstr p.p_prop with + | Kglobal -> Wp_parameters.fatal "Loop Preservation ? (%a)" Property.pretty p.p_prop + | Kstmt st -> Some st + end + | _ -> None let select_by_name asked_names pid = let p_prop = match pid.p_kind with @@ -595,28 +606,28 @@ let asked = if is_minus || (is_plus asked) then remove_first asked else asked in List.mem asked names in Some (if is_minus - then a && (not (eval ())) - else a || (eval ())) + then a && (not (eval ())) + else a || (eval ())) in match List.fold_left eval None asked_names with - | Some false -> false - | _ -> true + | Some false -> false + | _ -> true let select_call_pre s_call asked_pre pid = match pid.p_kind with - | PKPre (_, p_stmt, p_prop) -> - Stmt.equal s_call p_stmt && - (match asked_pre with - | None -> true - | Some asked_pre -> Property.equal p_prop asked_pre) - | _ -> false + | PKPre (_, p_stmt, p_prop) -> + Stmt.equal s_call p_stmt && + (match asked_pre with + | None -> true + | Some asked_pre -> Property.equal p_prop asked_pre) + | _ -> false (*----------------------------------------------------------------------------*) (* About assigns identification *) (*----------------------------------------------------------------------------*) type a_kind = LoopAssigns | StmtAssigns - + type effect_source = FromCode | FromCall | FromReturn type assigns_desc = { @@ -640,6 +651,13 @@ a_assigns = Writes assigns ; } +let mk_init_assigns = { + a_label = Logic_const.init_label ; + a_stmt = None ; + a_kind = StmtAssigns ; + a_assigns = WritesAny ; +} + (* (** kf assigns for normal path when there is an exit path *) let mk_fout_assigns_desc assigns = { @@ -678,7 +696,7 @@ * - Assigns properties are composed of the assigns list from Cil, * and a label to know where to stop. * - Predicates are just the predicate type from Cil. - *) +*) (*----------------------------------------------------------------------------*) type pred_info = prop_id * Cil_types.predicate named @@ -735,11 +753,11 @@ | AssignsAny a -> let pkind = match a.a_kind with - | StmtAssigns -> "" - | LoopAssigns -> "loop" + | StmtAssigns -> "" + | LoopAssigns -> "loop" in - Format.fprintf fmt "%s(@@%a): %s assigns everything@." - k Wp_error.pp_logic_label a.a_label pkind + Format.fprintf fmt "%s(@@%a): %s assigns everything@." + k Wp_error.pp_logic_label a.a_label pkind | AssignsLocations (_,a) -> Format.fprintf fmt "%s(@@%a): %a@." k Wp_error.pp_logic_label a.a_label pp_assigns_desc a @@ -748,7 +766,7 @@ | NoAssignsInfo, a | a, NoAssignsInfo -> a | (AssignsLocations _ | AssignsAny _), (AssignsLocations _ | AssignsAny _) -> - Wp_parameters.fatal "Several assigns ?" + Wp_parameters.fatal "Several assigns ?" type axiom_info = prop_id * LogicUsage.logic_lemma @@ -800,7 +818,7 @@ (** find the outer loop in which the stmt is. *) let get_loop_stmt kf stmt = (* because we don't have the cfg here, we can only use Cil information, - * and then we can only recognize syntactic loops... TODO: use the cfg ? *) + * and then we can only recognize syntactic loops... TODO: use the cfg ? *) let rec is_in_blk b = List.exists is_in_stmt b.bstmts and is_in_stmt s = if s.sid = stmt.sid then true else match s.skind with @@ -808,7 +826,7 @@ | Switch (_, b, _, _) | Block b -> is_in_blk b | UnspecifiedSequence seq -> let b = Cil.block_from_unspecified_sequence seq in - is_in_blk b + is_in_blk b | Loop (_, b, _, _, _) -> is_in_blk b | _ -> false and find_loop_in_blk blk = find_loop_in_stmts blk.bstmts @@ -816,22 +834,22 @@ | [] -> None | s::tl -> (match find_loop_in_stmt s with Some l -> Some l - | None -> find_loop_in_stmts tl) + | None -> find_loop_in_stmts tl) and find_loop_in_stmt s = match s.skind with | (Loop _) -> if is_in_stmt s then Some s else None | If (_, b1, b2,_) -> (match find_loop_in_blk b1 with Some l -> Some l - | None -> find_loop_in_blk b2) + | None -> find_loop_in_blk b2) | Switch (_, b, _, _) | Block b -> find_loop_in_blk b | UnspecifiedSequence seq -> let b = Cil.block_from_unspecified_sequence seq in - find_loop_in_blk b + find_loop_in_blk b | _ -> None in let f = Kernel_function.get_definition kf in - find_loop_in_blk f.sbody + find_loop_in_blk f.sbody (** Quite don't understand what is going on here... what is it supposed to do ? -* [2011-07-07-Anne] *) + * [2011-07-07-Anne] *) let get_induction p = let get_stmt = function | Property.IPDecrease(kf,Kstmt stmt,_,_) -> Some (kf, stmt) @@ -839,23 +857,23 @@ | Property.IPAssigns(kf,Kstmt stmt,_,_) -> Some (kf, stmt) | _ -> None in match p.p_kind with - | PKCheck | PKAFctOut|PKAFctExit|PKPre _ -> None - | PKProp -> - let loop_stmt_opt = match get_stmt (property_of_id p) with - | None -> None - | Some (kf, s) -> get_loop_stmt kf s - in loop_stmt_opt - | PKPropLoop -> - let loop_stmt_opt = match property_of_id p with - | Property.IPCodeAnnot(kf,stmt, - {annot_content = AInvariant(_, loop, _)}) - -> - if loop then (*loop invariant *) Some stmt - else (* invariant inside loop *) get_loop_stmt kf stmt - | Property.IPAssigns (_, Kstmt stmt, Property.Id_code_annot _, _) -> - (* loop assigns *) Some stmt - | _ -> None (* assert false ??? *) - in loop_stmt_opt - | PKEstablished|PKVarDecr|PKVarPos|PKPreserved -> - (match get_stmt (property_of_id p) with - | None -> None | Some (_, s) -> Some s) + | PKCheck | PKAFctOut|PKAFctExit|PKPre _ -> None + | PKProp -> + let loop_stmt_opt = match get_stmt (property_of_id p) with + | None -> None + | Some (kf, s) -> get_loop_stmt kf s + in loop_stmt_opt + | PKPropLoop -> + let loop_stmt_opt = match property_of_id p with + | Property.IPCodeAnnot(kf,stmt, + {annot_content = AInvariant(_, loop, _)}) + -> + if loop then (*loop invariant *) Some stmt + else (* invariant inside loop *) get_loop_stmt kf stmt + | Property.IPAssigns (_, Kstmt stmt, Property.Id_code_annot _, _) -> + (* loop assigns *) Some stmt + | _ -> None (* assert false ??? *) + in loop_stmt_opt + | PKEstablished|PKVarDecr|PKVarPos|PKPreserved -> + (match get_stmt (property_of_id p) with + | None -> None | Some (_, s) -> Some s) diff -Nru frama-c-20140301+neon+dfsg/src/wp/wpPropId.mli frama-c-20150201+sodium+dfsg/src/wp/wpPropId.mli --- frama-c-20140301+neon+dfsg/src/wp/wpPropId.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/wpPropId.mli 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -27,14 +27,14 @@ * depending on which part of the computation is involved. * For instance, properties on loops are split in 2 parts : establishment and * preservation. - *) +*) (** Property.t information and kind of PO (establishment, preservation, etc) *) type prop_id (** returns the annotation which lead to the given PO. Dynamically exported. - *) +*) val property_of_id : prop_id -> Property.t val source_of_id : prop_id -> Lexing.position @@ -53,12 +53,12 @@ val is_loop_preservation : prop_id -> stmt option (** test if the prop_id has to be selected for the asked name. -* Also returns a debug message to explain then answer. *) + * Also returns a debug message to explain then answer. *) val select_by_name : string list -> prop_id -> bool (** test if the prop_id has to be selected when we want to select the call -* precondition the the [stmt] call (None means all the call preconditions). -* Also returns a debug message to explain then answer. *) + * precondition the the [stmt] call (None means all the call preconditions). + * Also returns a debug message to explain then answer. *) val select_call_pre : stmt -> Property.t option -> prop_id -> bool (*----------------------------------------------------------------------------*) @@ -143,7 +143,7 @@ (** [mk_call_pre_id called_kf s_call called_pre] *) val mk_call_pre_id : kernel_function -> stmt -> - Property.t -> Property.t -> prop_id + Property.t -> Property.t -> prop_id val mk_property : Property.t -> prop_id @@ -159,7 +159,7 @@ a_assigns : Cil_types.identified_term Cil_types.assigns ; } val pp_assigns_desc : Format.formatter -> assigns_desc -> unit - + type effect_source = FromCode | FromCall | FromReturn type assigns_info = prop_id * assigns_desc val assigns_info_id : assigns_info -> prop_id @@ -185,6 +185,8 @@ val mk_kf_assigns_desc : identified_term from list -> assigns_desc +val mk_init_assigns : assigns_desc + val is_call_assigns : assigns_desc -> bool (*----------------------------------------------------------------------------*) diff -Nru frama-c-20140301+neon+dfsg/src/wp/wpReport.ml frama-c-20150201+sodium+dfsg/src/wp/wpReport.ml --- frama-c-20140301+neon+dfsg/src/wp/wpReport.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/wpReport.ml 2015-05-29 15:31:43.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -25,10 +25,10 @@ (* -------------------------------------------------------------------------- *) let ladder = [| 1.0 ; 2.0 ; 3.0 ; 5.0 ; 10.0 ; 15.0 ; - 20.0 ; 30.0 ; 40.0 ; - 60.0 ; 90.0 ; 120.0 ; 180.0 ; (* 1', 1'30, 2', 3' *) - 300.0 ; 600.0 ; 900.0 ; 1800.0 ; (* 5', 10', 15', 30' *) - 3600.0 |] (* 1h *) + 20.0 ; 30.0 ; 40.0 ; + 60.0 ; 90.0 ; 120.0 ; 180.0 ; (* 1', 1'30, 2', 3' *) + 300.0 ; 600.0 ; 900.0 ; 1800.0 ; (* 5', 10', 15', 30' *) + 3600.0 |] (* 1h *) (* -------------------------------------------------------------------------- *) (* --- Statistics --- *) @@ -41,7 +41,7 @@ | VCS.Failed -> INCONCLUSIVE | VCS.Invalid | VCS.Unknown | VCS.Timeout | VCS.Stepout -> UNSUCCESS | VCS.Valid -> VALID - + let best_result a b = match a,b with | NORESULT,c | c,NORESULT -> c | VALID,_ | _,VALID -> VALID @@ -63,12 +63,12 @@ begin s.total <- succ s.total ; match r with - | VALID -> - if tm > s.time then s.time <- tm ; - if st > s.steps then s.steps <- st ; - s.valid <- succ s.valid - | NORESULT | UNSUCCESS -> s.unsuccess <- succ s.unsuccess - | INCONCLUSIVE -> s.inconclusive <- succ s.inconclusive + | VALID -> + if tm > s.time then s.time <- tm ; + if st > s.steps then s.steps <- st ; + s.valid <- succ s.valid + | NORESULT | UNSUCCESS -> s.unsuccess <- succ s.unsuccess + | INCONCLUSIVE -> s.inconclusive <- succ s.inconclusive end let add_qedstat (ts:float) (s:stats) = @@ -105,15 +105,15 @@ let tc = Wpo.get_time r in let ts = r.VCS.solver_time in if re <> NORESULT then - begin - List.iter - (fun fs -> add_stat re st tc (get_prover fs p)) - plist ; - if p <> VCS.Qed && ts > 0.0 then - List.iter - (fun fs -> add_qedstat ts (get_prover fs VCS.Qed)) - plist ; - end ; + begin + List.iter + (fun fs -> add_stat re st tc (get_prover fs p)) + plist ; + if p <> VCS.Qed && ts > 0.0 then + List.iter + (fun fs -> add_qedstat ts (get_prover fs VCS.Qed)) + plist ; + end ; ok := best_result !ok re ; if tc > !tm then tm := tc ; if st > !sm then sm := st ; @@ -164,18 +164,18 @@ | Fun _ -> "function" module Smap = FCMap.Make - (struct - type t = entry - let compare s1 s2 = - match s1 , s2 with - | Global a, Global b -> String.compare a b - | Global _, _ -> (-1) - | _ , Global _ -> 1 - | Axiom a , Axiom b -> String.compare a b - | Axiom _ , Fun _ -> (-1) - | Fun _ , Axiom _ -> 1 - | Fun f , Fun g -> Kernel_function.compare f g - end) + (struct + type t = entry + let compare s1 s2 = + match s1 , s2 with + | Global a, Global b -> String.compare a b + | Global _, _ -> (-1) + | _ , Global _ -> 1 + | Axiom a , Axiom b -> String.compare a b + | Axiom _ , Fun _ -> (-1) + | Fun _ , Axiom _ -> 1 + | Fun f , Fun g -> Kernel_function.compare f g + end) type fcstat = { global : pstats ; @@ -238,9 +238,9 @@ let decode_chapter e = let code = decode_chapter e in let is_new_code = (code <> !chapter) in - if is_new_code then - chapter := code; - is_new_code + if is_new_code then + chapter := code; + is_new_code in let close_chapter (na,ca,ga) = if ca = [] then !chapter,[],ga @@ -249,26 +249,26 @@ let (_,_,ga) = let acc = Smap.fold - (fun entry ds acc -> - let is_new_chapter = decode_chapter entry in - let (na,ca,ga) = if is_new_chapter - then close_chapter acc - else acc in - na,((entry,ds)::ca),ga - ) fcstat.dsmap ("",[],[]) + (fun entry ds acc -> + let is_new_chapter = decode_chapter entry in + let (na,ca,ga) = if is_new_chapter + then close_chapter acc + else acc in + na,((entry,ds)::ca),ga + ) fcstat.dsmap ("",[],[]) in if !chapter <> "" then close_chapter acc - else acc + else acc in if ga = [] then None - else Some { fcstat = fcstat; - chapters = List.rev ga; - } + else Some { fcstat = fcstat; + chapters = List.rev ga; + } (** next chapters stats *) let next_stat4chap istat = match istat.chapters with - | ([] | _::[]) -> None - | _::l -> Some { istat with chapters = l } - + | ([] | _::[]) -> None + | _::l -> Some { istat with chapters = l } + type cistat = { cfcstat: fcstat; chapter : string; @@ -280,16 +280,16 @@ match istat.chapters with | [] -> None | (c,s)::_ -> Some { cfcstat = istat.fcstat; - chapter = c; - sections = s; - } - + chapter = c; + sections = s; + } + (** next section stats *) let next_stat4sect cistat = match cistat.sections with | ([] | _::[]) -> None | _::l -> Some { cistat with sections = l } - + type sistat = { sfcstat: fcstat; schapter : string ; @@ -303,46 +303,46 @@ | [] -> None | ((_,ds) as s)::_ -> Some { sfcstat = cistat.cfcstat; - schapter = cistat.chapter; - section = s; - properties = List.rev (Property.Map.fold + schapter = cistat.chapter; + section = s; + properties = List.rev (Property.Map.fold (fun p ps acc -> (p,ps)::acc) ds.dmap []); - } + } (** next property stats *) let next_stat4prop sistat = match sistat.properties with | ([] | _::[]) -> None | _::l -> Some { sfcstat = sistat.sfcstat; - schapter = sistat.schapter; - section = sistat.section; - properties = l; - } + schapter = sistat.schapter; + section = sistat.section; + properties = l; + } (** generic iterator *) let iter_stat ?first ?sep ?last ~from start next= if first<>None || sep<>None || last <> None then let items = ref (start from) in if !items <> None then - begin - let apply v = function - | None -> () - | Some app -> app v - in - let next app = - let item = (Extlib.the !items) in - apply item app; - items := next item - in - next first; - if sep<>None || last <> None then begin - while !items <> None do - next sep; - done; - apply () last; - end - end + let apply v = function + | None -> () + | Some app -> app v + in + let next app = + let item = (Extlib.the !items) in + apply item app; + items := next item + in + next first; + if sep<>None || last <> None then + begin + while !items <> None do + next sep; + done; + apply () last; + end + end (* -------------------------------------------------------------------------- *) (* --- Rendering Numbers --- *) @@ -376,19 +376,19 @@ if total <= 0 || number < 0 then pp_zero ~config fmt else - if number >= total then - Format.pp_print_string fmt (if config.console then " 100" else "100") - else - let ratio = float_of_int number /. float_of_int total in - Format.fprintf fmt "%4.1f" (100.0 *. ratio) - + if number >= total then + Format.pp_print_string fmt (if config.console then " 100" else "100") + else + let ratio = float_of_int number /. float_of_int total in + Format.fprintf fmt "%4.1f" (100.0 *. ratio) + let number ~config fmt k = if k = 0 then pp_zero ~config fmt else - if config.console - then Format.fprintf fmt "%4d" k - else Format.pp_print_int fmt k + if config.console + then Format.fprintf fmt "%4d" k + else Format.pp_print_int fmt k let properties ~config fmt (s:coverage) = function | "" -> percent config fmt (Property.Set.cardinal s.proved) (Property.Set.cardinal s.covered) @@ -404,41 +404,42 @@ | "failed" -> number config fmt (s.unsuccess + s.inconclusive) | "status" -> let msg = - if s.inconclusive > 0 then config.status_inconclusive else - if s.unsuccess > 0 then config.status_failed else - if s.valid >= s.total then config.status_passed else - config.status_untried + if s.inconclusive > 0 then config.status_inconclusive else + if s.unsuccess > 0 then config.status_failed else + if s.valid >= s.total then config.status_passed else + config.status_untried in Format.pp_print_string fmt msg | "inconclusive" -> number config fmt s.inconclusive | "unsuccess" -> number config fmt s.unsuccess | "time" -> if s.time > 0.0 then - Rformat.pp_time_range ladder fmt s.time + Rformat.pp_time_range ladder fmt s.time | "perf" -> if s.time > Rformat.epsilon then - Format.fprintf fmt "(%a)" Rformat.pp_time s.time + Format.fprintf fmt "(%a)" Rformat.pp_time s.time | "steps" -> if s.steps > 0 then Format.fprintf fmt "(%d)" s.steps | _ -> raise Exit let pstats ~config fmt s cmd arg = match cmd with - | "wp" | "qed" -> stat ~config fmt (get_prover s VCS.Qed) arg - | "alt-ergo" | "ergo" -> stat ~config fmt (get_prover s VCS.AltErgo) arg - | "coq" -> stat ~config fmt (get_prover s VCS.Coq) arg - | "z3" -> stat ~config fmt (get_prover s (VCS.Why3 "z3")) arg - | "gappa" -> stat ~config fmt (get_prover s (VCS.Why3 "gappa")) arg - | "simplify" -> stat ~config fmt (get_prover s (VCS.Why3 "simplify")) arg - | "vampire" -> stat ~config fmt (get_prover s (VCS.Why3 "vampire")) arg - | "zenon" -> stat ~config fmt (get_prover s (VCS.Why3 "zenon")) arg - | "cvc3" -> stat ~config fmt (get_prover s (VCS.Why3 "cvc3")) arg - | "yices" -> stat ~config fmt (get_prover s (VCS.Why3 "yices")) arg - | _ -> stat ~config fmt s.main cmd + | "wp" | "qed" -> stat ~config fmt (get_prover s VCS.Qed) arg + | "alt-ergo" | "ergo" -> stat ~config fmt (get_prover s VCS.AltErgo) arg + | "coq" -> stat ~config fmt (get_prover s VCS.Coq) arg + | "z3" -> stat ~config fmt (get_prover s (VCS.Why3 "z3")) arg + | "gappa" -> stat ~config fmt (get_prover s (VCS.Why3 "gappa")) arg + | "simplify" -> stat ~config fmt (get_prover s (VCS.Why3 "simplify")) arg + | "vampire" -> stat ~config fmt (get_prover s (VCS.Why3 "vampire")) arg + | "zenon" -> stat ~config fmt (get_prover s (VCS.Why3 "zenon")) arg + | "cvc3" -> stat ~config fmt (get_prover s (VCS.Why3 "cvc3")) arg + | "cvc4" -> stat ~config fmt (get_prover s (VCS.Why3 "cvc4")) arg + | "yices" -> stat ~config fmt (get_prover s (VCS.Why3 "yices")) arg + | _ -> stat ~config fmt s.main cmd let pcstats ~config fmt (s,c) cmd arg = match cmd with - | "prop" -> properties ~config fmt c arg - | _ -> pstats ~config fmt s cmd arg + | "prop" -> properties ~config fmt c arg + | _ -> pstats ~config fmt s cmd arg (* -------------------------------------------------------------------------- *) (* --- Rformat Environments --- *) @@ -455,37 +456,37 @@ let env_chapter chapter_name fmt cmd arg = try match cmd with - | "chapter" | "name" -> - Format.pp_print_string fmt chapter_name - | _ -> raise Exit + | "chapter" | "name" -> + Format.pp_print_string fmt chapter_name + | _ -> raise Exit with Exit -> if arg="" then Wp_parameters.error ~once:true "Unknown chapter-format '%%%s'" cmd else Wp_parameters.error ~once:true "Unknown chapter-format '%%%s:%s'" cmd arg - + let env_section ~config ~name sstat fmt cmd arg = try let entry,ds = match sstat.sections with | section_item::_others -> section_item | _ -> raise Exit in match cmd with - | "chapter" -> - let chapter = match entry with - | Global _ -> config.global_section - | Axiom _ -> config.axiomatic_section - | Fun _ -> config.function_section - in Format.pp_print_string fmt chapter - | "name" | "section" | "global" | "axiomatic" | "function" -> - if cmd <> "name" && cmd <> "section" && name <> cmd then - Wp_parameters.error "Invalid section-format '%%%s' inside a section %s" cmd name; - let prefix,name = match entry with - | Global a-> config.global_prefix, a - | Axiom "" -> config.lemma_prefix,"" - | Axiom a -> config.axiomatic_prefix,a - | Fun kf -> config.function_prefix, ( Kernel_function.get_name kf) - in Format.fprintf fmt "%s%s" prefix name - | _ -> - pcstats config fmt (ds.dstats, ds.dcoverage) cmd arg + | "chapter" -> + let chapter = match entry with + | Global _ -> config.global_section + | Axiom _ -> config.axiomatic_section + | Fun _ -> config.function_section + in Format.pp_print_string fmt chapter + | "name" | "section" | "global" | "axiomatic" | "function" -> + if cmd <> "name" && cmd <> "section" && name <> cmd then + Wp_parameters.error "Invalid section-format '%%%s' inside a section %s" cmd name; + let prefix,name = match entry with + | Global a-> config.global_prefix, a + | Axiom "" -> config.lemma_prefix,"" + | Axiom a -> config.axiomatic_prefix,a + | Fun kf -> config.function_prefix, ( Kernel_function.get_name kf) + in Format.fprintf fmt "%s%s" prefix name + | _ -> + pcstats config fmt (ds.dstats, ds.dcoverage) cmd arg with Exit -> if arg="" then Wp_parameters.error ~once:true "Unknown section-format '%%%s'" cmd @@ -498,28 +499,28 @@ | property_item::_others -> property_item | _ -> raise Exit in match cmd with - | "chapter" -> - let chapter = match entry with - | Global _ -> config.global_section - | Axiom _ -> config.axiomatic_section - | Fun _ -> config.function_section - in Format.pp_print_string fmt chapter - | "section" | "global" | "axiomatic" | "function" -> - if cmd <> "section" && name <> cmd then - Wp_parameters.error "Invalid property-format '%%%s' inside a section %s" cmd name; - let prefix,name = match entry with - | Global a-> config.global_prefix, a - | Axiom "" -> config.lemma_prefix,"" - | Axiom a -> config.axiomatic_prefix,a - | Fun kf -> config.function_prefix, ( Kernel_function.get_name kf) - in Format.fprintf fmt "%s%s" prefix name - | "name" -> - Format.fprintf fmt "%s%s" config.property_prefix - (Property.Names.get_prop_name_id p) - | "property" -> - Description.pp_local fmt p - | _ -> - pstats config fmt stat cmd arg + | "chapter" -> + let chapter = match entry with + | Global _ -> config.global_section + | Axiom _ -> config.axiomatic_section + | Fun _ -> config.function_section + in Format.pp_print_string fmt chapter + | "section" | "global" | "axiomatic" | "function" -> + if cmd <> "section" && name <> cmd then + Wp_parameters.error "Invalid property-format '%%%s' inside a section %s" cmd name; + let prefix,name = match entry with + | Global a-> config.global_prefix, a + | Axiom "" -> config.lemma_prefix,"" + | Axiom a -> config.axiomatic_prefix,a + | Fun kf -> config.function_prefix, ( Kernel_function.get_name kf) + in Format.fprintf fmt "%s%s" prefix name + | "name" -> + Format.fprintf fmt "%s%s" config.property_prefix + (Property.Names.get_prop_name_id p) + | "property" -> + Description.pp_local fmt p + | _ -> + pstats config fmt stat cmd arg with Exit -> if arg="" then Wp_parameters.error ~once:true "Unknown property-format '%%%s'" cmd @@ -564,16 +565,16 @@ if chap <> "" || sect <> "" || glob <> "" || axio <> "" || func <> "" || prop <> "" then let print_chapter cstat = print_chapter cstat ~config ~chap ~sect ~glob ~axio ~func ~prop fmt in iter_stat ~first:print_chapter ~sep:print_chapter ~from:gstat start_stat4chap next_stat4chap ; - if tail <> "" then - Rformat.pretty (env_toplevel ~config gstat) fmt tail ; + if tail <> "" then + Rformat.pretty (env_toplevel ~config gstat) fmt tail ; end - + (* -------------------------------------------------------------------------- *) (* --- Report Printing --- *) (* -------------------------------------------------------------------------- *) type section = END | HEAD | TAIL - | CHAPTER + | CHAPTER | SECTION | GLOB_SECTION | AXIO_SECTION | FUNC_SECTION | PROPERTY @@ -581,7 +582,7 @@ let config = { console = false ; zero = "-" ; - + status_passed = " Ok " ; status_failed = "Failed" ; status_inconclusive = "*Bug**" ; @@ -596,7 +597,7 @@ global_section = "Globals" ; axiomatic_section = "Axiomatics" ; function_section = "Functions" ; - + } in let head = Buffer.create 64 in let tail = Buffer.create 64 in @@ -612,94 +613,94 @@ let cin = open_in specfile in try while true do - let line = input_line cin in - match Rformat.command line with - | Rformat.ARG("AXIOMATIC_PREFIX",f) -> config.axiomatic_prefix <- f - | Rformat.ARG("FUNCTION_PREFIX",f) -> config.function_prefix <- f - | Rformat.ARG("PROPERTY_PREFIX",f) -> config.property_prefix <- f - | Rformat.ARG("LEMMA_PREFIX",f) -> config.lemma_prefix <- f - - | Rformat.ARG("GLOBAL_SECTION",f) -> config.global_section <- f - | Rformat.ARG("AXIOMATIC_SECTION",f) -> config.axiomatic_section <- f - | Rformat.ARG("FUNCTION_SECTION",f) -> config.function_section <- f - - | Rformat.ARG("PASSED",s) -> config.status_passed <- s - | Rformat.ARG("FAILED",s) -> config.status_failed <- s - | Rformat.ARG("INCONCLUSIVE",s) -> config.status_inconclusive <- s - | Rformat.ARG("UNTRIED",s) -> config.status_untried <- s - - | Rformat.ARG("ZERO",z) -> config.zero <- z - | Rformat.ARG("FILE",f) -> file := Some f - | Rformat.ARG("SUFFIX",e) -> - let basename = Wp_parameters.ReportName.get () in - let filename = basename ^ e in - file := Some filename - | Rformat.CMD "CONSOLE" -> config.console <- true - - | Rformat.CMD "END" -> section := END - | Rformat.CMD "HEAD" -> section := HEAD - | Rformat.CMD "TAIL" -> section := TAIL - - | Rformat.CMD "CHAPTER" -> section := CHAPTER - - | Rformat.CMD "SECTION" -> section := SECTION - | Rformat.CMD "GLOBAL" -> section := GLOB_SECTION - | Rformat.CMD "AXIOMATIC" -> section := AXIO_SECTION - | Rformat.CMD "FUNCTION" -> section := FUNC_SECTION - - | Rformat.CMD "PROPERTY" -> section := PROPERTY - - | Rformat.CMD a | Rformat.ARG(a,_) -> - Wp_parameters.error "Report '%s': unknown command '%s'" specfile a - | Rformat.TEXT -> - if !section <> END then - let text = match !section with - | HEAD -> head - | CHAPTER -> chap - | SECTION -> sect - | GLOB_SECTION -> glob - | AXIO_SECTION -> axio - | FUNC_SECTION -> func - | PROPERTY -> sect_prop - | TAIL|END -> tail - in - Buffer.add_string text line ; - Buffer.add_char text '\n' ; + let line = input_line cin in + match Rformat.command line with + | Rformat.ARG("AXIOMATIC_PREFIX",f) -> config.axiomatic_prefix <- f + | Rformat.ARG("FUNCTION_PREFIX",f) -> config.function_prefix <- f + | Rformat.ARG("PROPERTY_PREFIX",f) -> config.property_prefix <- f + | Rformat.ARG("LEMMA_PREFIX",f) -> config.lemma_prefix <- f + + | Rformat.ARG("GLOBAL_SECTION",f) -> config.global_section <- f + | Rformat.ARG("AXIOMATIC_SECTION",f) -> config.axiomatic_section <- f + | Rformat.ARG("FUNCTION_SECTION",f) -> config.function_section <- f + + | Rformat.ARG("PASSED",s) -> config.status_passed <- s + | Rformat.ARG("FAILED",s) -> config.status_failed <- s + | Rformat.ARG("INCONCLUSIVE",s) -> config.status_inconclusive <- s + | Rformat.ARG("UNTRIED",s) -> config.status_untried <- s + + | Rformat.ARG("ZERO",z) -> config.zero <- z + | Rformat.ARG("FILE",f) -> file := Some f + | Rformat.ARG("SUFFIX",e) -> + let basename = Wp_parameters.ReportName.get () in + let filename = basename ^ e in + file := Some filename + | Rformat.CMD "CONSOLE" -> config.console <- true + + | Rformat.CMD "END" -> section := END + | Rformat.CMD "HEAD" -> section := HEAD + | Rformat.CMD "TAIL" -> section := TAIL + + | Rformat.CMD "CHAPTER" -> section := CHAPTER + + | Rformat.CMD "SECTION" -> section := SECTION + | Rformat.CMD "GLOBAL" -> section := GLOB_SECTION + | Rformat.CMD "AXIOMATIC" -> section := AXIO_SECTION + | Rformat.CMD "FUNCTION" -> section := FUNC_SECTION + + | Rformat.CMD "PROPERTY" -> section := PROPERTY + + | Rformat.CMD a | Rformat.ARG(a,_) -> + Wp_parameters.error "Report '%s': unknown command '%s'" specfile a + | Rformat.TEXT -> + if !section <> END then + let text = match !section with + | HEAD -> head + | CHAPTER -> chap + | SECTION -> sect + | GLOB_SECTION -> glob + | AXIO_SECTION -> axio + | FUNC_SECTION -> func + | PROPERTY -> sect_prop + | TAIL|END -> tail + in + Buffer.add_string text line ; + Buffer.add_char text '\n' ; done with - | End_of_file -> close_in cin - | err -> close_in cin ; raise err + | End_of_file -> close_in cin + | err -> close_in cin ; raise err end ; match !file with - | None -> - Log.print_on_output - (print gstat ~config - ~head:(Buffer.contents head) ~tail:(Buffer.contents tail) - ~chap:(Buffer.contents chap) - ~sect:(Buffer.contents sect) - ~glob:(Buffer.contents glob) - ~axio:(Buffer.contents axio) - ~func:(Buffer.contents func) - ~prop:(Buffer.contents sect_prop)) - | Some report -> - Wp_parameters.feedback "Report '%s'" report ; - let cout = open_out report in - let fout = Format.formatter_of_out_channel cout in - try - print gstat ~config - ~head:(Buffer.contents head) ~tail:(Buffer.contents tail) - ~chap:(Buffer.contents chap) - ~sect:(Buffer.contents sect) - ~glob:(Buffer.contents glob) - ~axio:(Buffer.contents axio) - ~func:(Buffer.contents func) - ~prop:(Buffer.contents sect_prop) - fout ; - Format.pp_print_flush fout () ; - close_out cout ; - with err -> - Format.pp_print_flush fout () ; - close_out cout ; - raise err + | None -> + Log.print_on_output + (print gstat ~config + ~head:(Buffer.contents head) ~tail:(Buffer.contents tail) + ~chap:(Buffer.contents chap) + ~sect:(Buffer.contents sect) + ~glob:(Buffer.contents glob) + ~axio:(Buffer.contents axio) + ~func:(Buffer.contents func) + ~prop:(Buffer.contents sect_prop)) + | Some report -> + Wp_parameters.feedback "Report '%s'" report ; + let cout = open_out report in + let fout = Format.formatter_of_out_channel cout in + try + print gstat ~config + ~head:(Buffer.contents head) ~tail:(Buffer.contents tail) + ~chap:(Buffer.contents chap) + ~sect:(Buffer.contents sect) + ~glob:(Buffer.contents glob) + ~axio:(Buffer.contents axio) + ~func:(Buffer.contents func) + ~prop:(Buffer.contents sect_prop) + fout ; + Format.pp_print_flush fout () ; + close_out cout ; + with err -> + Format.pp_print_flush fout () ; + close_out cout ; + raise err (* -------------------------------------------------------------------------- *) diff -Nru frama-c-20140301+neon+dfsg/src/wp/wpReport.mli frama-c-20150201+sodium+dfsg/src/wp/wpReport.mli --- frama-c-20140301+neon+dfsg/src/wp/wpReport.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/wpReport.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -27,27 +27,27 @@ val export : fcstat -> string -> unit - (** Export Statistics. +(** Export Statistics. + + Patterns for formatting: + - ["%{cmd:arg}"] or "%cmd:arg" + - ["%{cmd}"] or ["%cmd"] + + Patterns in [fct]: + - ["%kf"] or ["%kf:name"] the name of the function. + - ["%kf:"] the stats in format [] for the function. + - ["%

:"] the stats in format [] for prover [

]. + + Patterns in [main]: + - "%" the global statistics with format []. + + Prover strings are ["wp"], ["ergo"], ["coq"] , ["z3"] and ["simplify"]. + Format strings are "100" (percents of valid upon total, default), + ["total"], ["valid"] and ["failed"] + for respective number of verification conditions. + Zero is printed as [zero]. Percentages are printed in decimal ["dd.d"]. + +*) - Patterns for formatting: - - ["%{cmd:arg}"] or "%cmd:arg" - - ["%{cmd}"] or ["%cmd"] - - Patterns in [fct]: - - ["%kf"] or ["%kf:name"] the name of the function. - - ["%kf:"] the stats in format [] for the function. - - ["%

:"] the stats in format [] for prover [

]. - - Patterns in [main]: - - "%" the global statistics with format []. - - Prover strings are ["wp"], ["ergo"], ["coq"] , ["z3"] and ["simplify"]. - Format strings are "100" (percents of valid upon total, default), - ["total"], ["valid"] and ["failed"] - for respective number of verification conditions. - Zero is printed as [zero]. Percentages are printed in decimal ["dd.d"]. - *) - - diff -Nru frama-c-20140301+neon+dfsg/src/wp/wprop.ml frama-c-20150201+sodium+dfsg/src/wp/wprop.ml --- frama-c-20140301+neon+dfsg/src/wp/wprop.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/wprop.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -25,12 +25,12 @@ (* -------------------------------------------------------------------------- *) module WP = State_builder.Ref - (Datatype.Unit) - (struct - let name = "WP" - let dependencies = [Ast.self] - let default () = () - end) + (Datatype.Unit) + (struct + let name = "WP" + let dependencies = [Ast.self] + let default () = () + end) (* -------------------------------------------------------------------------- *) (* --- Indexed Interface --- *) @@ -69,8 +69,8 @@ (* -------------------------------------------------------------------------- *) module Indexed - (Key:Datatype.S_with_collections) - (Info:Info with type key = Key.t) = + (Key:Datatype.S_with_collections) + (Info:Info with type key = Key.t) = struct type key = Key.t @@ -86,10 +86,10 @@ try H.find key with Not_found -> let ip = - match Info.property key with - | Later ip -> ip - | Proxy(ip,emitter,ips) -> - Property_status.logical_consequence emitter ip ips ; ip + match Info.property key with + | Later ip -> ip + | Proxy(ip,emitter,ips) -> + Property_status.logical_consequence emitter ip ips ; ip in List.iter (fun f -> f key ip) !hooks ; H.add key ip ; ip @@ -101,15 +101,15 @@ (* -------------------------------------------------------------------------- *) module Indexed2 - (Key1:Datatype.S_with_collections) - (Key2:Datatype.S_with_collections) - (Info:Info with type key = Key1.t * Key2.t) = + (Key1:Datatype.S_with_collections) + (Key2:Datatype.S_with_collections) + (Info:Info with type key = Key1.t * Key2.t) = struct module P = Datatype.Pair_with_collections(Key1)(Key2) - (struct - let module_name = Info.name - end) + (struct + let module_name = Info.name + end) module I = Indexed(P)(Info) type key1 = Key1.t diff -Nru frama-c-20140301+neon+dfsg/src/wp/wprop.mli frama-c-20150201+sodium+dfsg/src/wp/wprop.mli --- frama-c-20140301+neon+dfsg/src/wp/wprop.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/wprop.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -41,7 +41,7 @@ val mem : key -> bool val property : key -> Property.t val add_hook : (key -> Property.t -> unit) -> unit - (** Hooks are executed once at property creation *) + (** Hooks are executed once at property creation *) end module type Indexed2 = @@ -51,7 +51,7 @@ val mem : key1 -> key2 -> bool val property : key1 -> key2 -> Property.t val add_hook : (key1 -> key2 -> Property.t -> unit) -> unit - (** Hooks are executed once at property creation *) + (** Hooks are executed once at property creation *) end (* ------------------------------------------------------------------------ *) @@ -59,12 +59,12 @@ (* ------------------------------------------------------------------------ *) module Indexed - (Key:Datatype.S_with_collections) - (Info:Info with type key = Key.t) : + (Key:Datatype.S_with_collections) + (Info:Info with type key = Key.t) : Indexed with type key = Key.t module Indexed2 - (Key1:Datatype.S_with_collections) - (Key2:Datatype.S_with_collections) - (Info:Info with type key = Key1.t * Key2.t) : + (Key1:Datatype.S_with_collections) + (Key2:Datatype.S_with_collections) + (Info:Info with type key = Key1.t * Key2.t) : Indexed2 with type key1 = Key1.t and type key2 = Key2.t diff -Nru frama-c-20140301+neon+dfsg/src/wp/wpStrategy.ml frama-c-20150201+sodium+dfsg/src/wp/wpStrategy.ml --- frama-c-20140301+neon+dfsg/src/wp/wpStrategy.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/wpStrategy.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -34,20 +34,20 @@ | Agoal (* annotation is a goal, but not an hypothesis (see Aboth): A /\ ...*) | Aboth of bool - (* annotation can be used as both hypothesis and goal : - - with true : considerer as both : A /\ A=>.. - - with false : we just want to use it as hyp right now. *) + (* annotation can be used as both hypothesis and goal : + - with true : considerer as both : A /\ A=>.. + - with false : we just want to use it as hyp right now. *) | AcutB of bool - (* annotation is use as a cut : - - with true (A is also a goal) -> A (+ proof obligation A => ...) - - with false (A is an hyp only) -> True (+ proof obligation A => ...) *) + (* annotation is use as a cut : + - with true (A is also a goal) -> A (+ proof obligation A => ...) + - with false (A is an hyp only) -> True (+ proof obligation A => ...) *) | AcallHyp of kernel_function - (* annotation is a called function property to consider as an Hyp. - * The pre are not here but in AcallPre since they can also - * be considered as goals. *) + (* annotation is a called function property to consider as an Hyp. + * The pre are not here but in AcallPre since they can also + * be considered as goals. *) | AcallPre of bool * kernel_function - (* annotation is a called function precondition : - to be considered as hyp, and goal if bool=true *) + (* annotation is a called function precondition : + to be considered as hyp, and goal if bool=true *) (* -------------------------------------------------------------------------- *) (* --- Annotations for one program point. --- *) @@ -58,7 +58,7 @@ (** Some elements can be used as both Hyp and Goal : because of the selection * mecanism, we need to add a boolean [as_goal] to tell if the element is to be * considered as a goal. If [false], the element can still be used as hypthesis. - *) +*) type annots = { p_hyp : WpPropId.pred_info list; p_goal : WpPropId.pred_info list; @@ -94,24 +94,24 @@ let p = NormAtLabels.preproc_annot labels p in let _ = debug "take as %s (@[%a:@ %a@])@." debug_txt - WpPropId.pretty id Printer.pp_predicate_named p + WpPropId.pretty id Printer.pp_predicate_named p in Some (WpPropId.mk_pred_info id p) with e -> NormAtLabels.catch_label_error e - (WpPropId.get_propid id) "annotation"; None + (WpPropId.get_propid id) "annotation"; None in let add_hyp l = match get_p "hyp" with None -> l | Some p -> p::l in let add_goal l = (* if goal_to_select config id - then *) match get_p "goal" with None -> l - | Some p -> ( (* has_prop_goal := true; *) p::l ) - (* else l *) + then *) match get_p "goal" with None -> l + | Some p -> ( (* has_prop_goal := true; *) p::l ) + (* else l *) in let add_both goal l = match get_p ("both goal=" ^ if goal then "true" else "false") with - | None -> l - | Some p -> - (* if goal then has_prop_goal := true;*) - (goal, p)::l + | None -> l + | Some p -> + (* if goal then has_prop_goal := true;*) + (goal, p)::l in let add_hyp_call fct calls = let l = try ForCall.find fct calls with Not_found -> [] in @@ -121,20 +121,20 @@ ForCall.add fct (add_both goal l) calls in let info = acc.info in let goal, info = match kind with - | Ahyp -> - false, { info with p_hyp = add_hyp info.p_hyp } - | Agoal -> - true, { info with p_goal = add_goal info.p_goal } - | Aboth goal -> - goal, { info with p_both = add_both goal info.p_both } - | AcutB goal -> - goal, { info with p_cut = add_both goal info.p_cut } - | AcallHyp fct -> - false, { info with call_hyp = add_hyp_call fct info.call_hyp } - | AcallPre (goal,fct) -> - goal, { info with call_pre = add_both_call fct goal info.call_pre } + | Ahyp -> + false, { info with p_hyp = add_hyp info.p_hyp } + | Agoal -> + true, { info with p_goal = add_goal info.p_goal } + | Aboth goal -> + goal, { info with p_both = add_both goal info.p_both } + | AcutB goal -> + goal, { info with p_cut = add_both goal info.p_cut } + | AcallHyp fct -> + false, { info with call_hyp = add_hyp_call fct info.call_hyp } + | AcallPre (goal,fct) -> + goal, { info with call_pre = add_both_call fct goal info.call_pre } in let acc = { acc with info = info } in - if goal then { acc with has_prop_goal = true} else acc + if goal then { acc with has_prop_goal = true} else acc (* -------------------------------------------------------------------------- *) (* adding some specific properties. *) @@ -144,17 +144,17 @@ let labels = NormAtLabels.labels_fct_pre in let p = Logic_const.pred_of_id_pred pre in let p = match assumes with None -> p - | Some assumes -> Logic_const.pimplies (assumes, p) + | Some assumes -> Logic_const.pimplies (assumes, p) in let p = Logic_const.pat (p, Logic_const.pre_label) in - (* TODO: why this at ??? [2011-07-08-Anne] *) - add_prop acc kind labels id p + (* TODO: why this at ??? [2011-07-08-Anne] *) + add_prop acc kind labels id p let add_prop_fct_post acc kind kf bhv tkind post = let id = WpPropId.mk_fct_post_id kf bhv (tkind, post) in let labels = NormAtLabels.labels_fct_post in let p = Logic_const.pred_of_id_pred post in - add_prop acc kind labels id p + add_prop acc kind labels id p let add_prop_fct_bhv_pre acc kind kf bhv ~impl_assumes = let assumes = @@ -162,23 +162,23 @@ in let add acc p = add_prop_fct_pre acc kind kf bhv ~assumes p in let acc = List.fold_left add acc bhv.b_requires in - if impl_assumes then acc - else List.fold_left add acc bhv.b_assumes + if impl_assumes then acc + else List.fold_left add acc bhv.b_assumes let add_prop_stmt_pre acc kind kf s bhv ~assumes pre = let id = WpPropId.mk_pre_id kf (Kstmt s) bhv pre in let labels = NormAtLabels.labels_stmt_pre s in let p = Logic_const.pred_of_id_pred pre in let p = match assumes with None -> p - | Some assumes -> Logic_const.pimplies (assumes, p) + | Some assumes -> Logic_const.pimplies (assumes, p) in add_prop acc kind labels id p let add_prop_stmt_bhv_requires acc kind kf s bhv ~with_assumes = let assumes = if with_assumes then Some (Ast_info.behavior_assumes bhv) else None in let add acc pre = - add_prop_stmt_pre acc kind kf s bhv ~assumes pre - in List.fold_left add acc bhv.b_requires + add_prop_stmt_pre acc kind kf s bhv ~assumes pre + in List.fold_left add acc bhv.b_requires (** Process the stmt spec precondition as an hypothesis for external properties. * Add [assumes => requires] for all the behaviors. *) @@ -192,19 +192,19 @@ let labels = NormAtLabels.labels_stmt_post s l_post in let p = Logic_const.pred_of_id_pred post in let p = match assumes with None -> p - | Some assumes -> - let assumes = Logic_const.pold assumes in - (* can use old because label normalisation will be called *) - Logic_const.pimplies (assumes, p) + | Some assumes -> + let assumes = Logic_const.pold assumes in + (* can use old because label normalisation will be called *) + Logic_const.pimplies (assumes, p) in add_prop acc kind labels id p let add_prop_call_pre acc kind id ~assumes pre = (* TODO: we don't build the id here yet because of strange things in wpAnnot. - * Find out how to deal with it. [2011-07-13-Anne] *) + * Find out how to deal with it. [2011-07-13-Anne] *) let labels = NormAtLabels.labels_fct_pre in let p = Logic_const.pred_of_id_pred pre in let p = Logic_const.pimplies (assumes, p) in - add_prop acc kind labels id p + add_prop acc kind labels id p let add_prop_call_post acc kind called_kf bhv tkind ~assumes post = let id = WpPropId.mk_fct_post_id called_kf bhv (tkind, post) in @@ -212,32 +212,32 @@ let p = Logic_const.pred_of_id_pred post in let assumes = Logic_const.pold assumes in let p = Logic_const.pimplies (assumes, p) in - add_prop acc kind labels id p + add_prop acc kind labels id p let add_prop_assert acc kind kf s ca p = let id = WpPropId.mk_assert_id kf s ca in let labels = NormAtLabels.labels_assert_before s in - add_prop acc kind labels id p + add_prop acc kind labels id p let add_prop_loop_inv acc kind s id p = let labels = NormAtLabels.labels_loop_inv s in - add_prop acc kind labels id p + add_prop acc kind labels id p (** apply [f_normal] on the [Normal] postconditions, -* [f_exits] on the [Exits] postconditions, and warn on the others. *) + * [f_exits] on the [Exits] postconditions, and warn on the others. *) let fold_bhv_post_cond ~warn f_normal f_exits acc b = let add (p_acc, e_acc) ((termination_kind, pe) as e) = match termination_kind with - | Normal -> f_normal p_acc pe, e_acc - | Exits -> p_acc, f_exits e_acc pe - | (Breaks|Continues|Returns) -> (* TODO *) - begin - if warn then - Wp_parameters.warning - "Abrupt statement termination property ignored:@, %a" - Printer.pp_post_cond e; - p_acc, e_acc - end + | Normal -> f_normal p_acc pe, e_acc + | Exits -> p_acc, f_exits e_acc pe + | (Breaks|Continues|Returns) -> (* TODO *) + begin + if warn then + Wp_parameters.warning + "Abrupt statement termination property ignored:@, %a" + Printer.pp_post_cond e; + p_acc, e_acc + end in List.fold_left add acc b.b_post_cond (* -------------------------------------------------------------------------- *) @@ -258,41 +258,41 @@ | Agoal -> true, {info with a_goal = take_assigns ()} | _ -> Wp_parameters.fatal "Assigns prop can only be Hyp or Goal" in let acc = { acc with info = info } in - if goal then { acc with has_asgn_goal = true} else acc + if goal then { acc with has_asgn_goal = true} else acc let add_assigns_any acc kind asgn = let take_call fct asgn info = { info with call_asgn = ForCall.add fct asgn info.call_asgn } in match kind with - | Ahyp -> {acc with info = { acc.info with a_hyp = asgn}} - | AcallHyp fct -> {acc with info = take_call fct asgn acc.info} - | _ -> Wp_parameters.fatal "Assigns Any prop can only be Hyp" - + | Ahyp -> {acc with info = { acc.info with a_hyp = asgn}} + | AcallHyp fct -> {acc with info = take_call fct asgn acc.info} + | _ -> Wp_parameters.fatal "Assigns Any prop can only be Hyp" + let assigns_upper_bound spec = let bhvs = spec.spec_behavior in let upper a b = match a, b.b_assigns with - | None, Writes a when Cil.is_default_behavior b -> - Some (b,a) (* default behavior always applies. *) - | None, _ -> None (* WritesAny U X -> WritesAny *) - | Some (b,_), _ when Cil.is_default_behavior b -> - a (* default behavior prevails over other behaviors. *) - | Some _, WritesAny -> - None (* No default behavior and one behavior assigns everything. *) - | Some(b,a1), Writes a2 -> Some (b,a1 @ a2) - (* take the whole list of assigns. *) + | None, Writes a when Cil.is_default_behavior b -> + Some (b,a) (* default behavior always applies. *) + | None, _ -> None (* WritesAny U X -> WritesAny *) + | Some (b,_), _ when Cil.is_default_behavior b -> + a (* default behavior prevails over other behaviors. *) + | Some _, WritesAny -> + None (* No default behavior and one behavior assigns everything. *) + | Some(b,a1), Writes a2 -> Some (b,a1 @ a2) + (* take the whole list of assigns. *) in match bhvs with - | [] -> None - | bhv::bhvs -> + | [] -> None + | bhv::bhvs -> (* [VP 2011-02-04] Note that if there is no default and each behavior has a proper assigns clause we put dependencies only to the assigns of a more or less randomly selected behavior, but the datatypes above can't handle anything better. *) let acc = match bhv.b_assigns with - WritesAny -> None - | Writes a -> Some(bhv,a) + WritesAny -> None + | Writes a -> Some(bhv,a) in List.fold_left upper acc bhvs @@ -304,49 +304,49 @@ [AP 2011-03-11] I think that the merge of all assigns properties is intended because we are using it as an hypothesis to skip the statement or the function call. - *) +*) let add_stmt_spec_assigns_hyp acc kf s l_post spec = match assigns_upper_bound spec with - | None -> - add_assigns_any acc Ahyp - (WpPropId.mk_stmt_any_assigns_info s) - | Some(bhv, assigns) -> - let id = WpPropId.mk_stmt_assigns_id kf s bhv assigns in - match id with - | None -> add_assigns_any acc Ahyp - (WpPropId.mk_stmt_any_assigns_info s) - | Some id -> - let labels = NormAtLabels.labels_stmt_assigns s l_post in - let assigns = NormAtLabels.preproc_assigns labels assigns in - let a_desc = WpPropId.mk_stmt_assigns_desc s assigns in - add_assigns acc Ahyp id a_desc - + | None -> + add_assigns_any acc Ahyp + (WpPropId.mk_stmt_any_assigns_info s) + | Some(bhv, assigns) -> + let id = WpPropId.mk_stmt_assigns_id kf s bhv assigns in + match id with + | None -> add_assigns_any acc Ahyp + (WpPropId.mk_stmt_any_assigns_info s) + | Some id -> + let labels = NormAtLabels.labels_stmt_assigns s l_post in + let assigns = NormAtLabels.preproc_assigns labels assigns in + let a_desc = WpPropId.mk_stmt_assigns_desc s assigns in + add_assigns acc Ahyp id a_desc + let add_call_assigns_any acc s = let asgn = WpPropId.mk_stmt_any_assigns_info s in {acc with info = { acc.info with a_call = asgn }} let add_call_assigns_hyp acc kf_caller s ~called_kf l_post spec_opt = match spec_opt with - | None -> - let pid = WpPropId.mk_stmt_any_assigns_info s in - add_assigns_any acc (AcallHyp called_kf) pid - | Some spec -> - match assigns_upper_bound spec with + | None -> + let pid = WpPropId.mk_stmt_any_assigns_info s in + add_assigns_any acc (AcallHyp called_kf) pid + | Some spec -> + match assigns_upper_bound spec with + | None -> + let asgn = WpPropId.mk_stmt_any_assigns_info s in + add_assigns_any acc (AcallHyp called_kf) asgn + | Some(bhv, assigns) -> + let id = WpPropId.mk_stmt_assigns_id kf_caller s bhv assigns in + match id with | None -> let asgn = WpPropId.mk_stmt_any_assigns_info s in add_assigns_any acc (AcallHyp called_kf) asgn - | Some(bhv, assigns) -> - let id = WpPropId.mk_stmt_assigns_id kf_caller s bhv assigns in - match id with - | None -> - let asgn = WpPropId.mk_stmt_any_assigns_info s in - add_assigns_any acc (AcallHyp called_kf) asgn - | Some pid -> - let labels = NormAtLabels.labels_stmt_assigns s l_post in - let assigns = NormAtLabels.preproc_assigns labels assigns in - let a_desc = WpPropId.mk_stmt_assigns_desc s assigns in - add_assigns acc (AcallHyp called_kf) pid a_desc - + | Some pid -> + let labels = NormAtLabels.labels_stmt_assigns s l_post in + let assigns = NormAtLabels.preproc_assigns labels assigns in + let a_desc = WpPropId.mk_stmt_assigns_desc s assigns in + add_assigns acc (AcallHyp called_kf) pid a_desc + (* [VP 2011-01-28] following old behavior, not sure it is correct: why should we give to add_assigns the assigns with unnormalized labels? [AP 2011-03-11] to answer VP question, the source assigns are only used to @@ -356,18 +356,18 @@ let add_loop_assigns_hyp acc kf s asgn_opt = match asgn_opt with | None -> let asgn = WpPropId.mk_loop_any_assigns_info s in - add_assigns_any acc Ahyp asgn + add_assigns_any acc Ahyp asgn | Some (ca, assigns) -> let id = WpPropId.mk_loop_assigns_id kf s ca assigns in match id with - | None -> - let asgn = WpPropId.mk_loop_any_assigns_info s in - add_assigns_any acc Ahyp asgn - | Some id -> - let labels = NormAtLabels.labels_loop_assigns s in - let assigns' = NormAtLabels.preproc_assigns labels assigns in - let a_desc = WpPropId.mk_loop_assigns_desc s assigns' in - add_assigns acc Ahyp id a_desc + | None -> + let asgn = WpPropId.mk_loop_any_assigns_info s in + add_assigns_any acc Ahyp asgn + | Some id -> + let labels = NormAtLabels.labels_loop_assigns s in + let assigns' = NormAtLabels.preproc_assigns labels assigns in + let a_desc = WpPropId.mk_loop_assigns_desc s assigns' in + add_assigns acc Ahyp id a_desc let add_fct_bhv_assigns_hyp acc kf tkind b = match b.b_assigns with | WritesAny -> @@ -376,14 +376,14 @@ | Writes assigns -> let id = WpPropId.mk_fct_assigns_id kf b tkind assigns in match id with - | None -> - let id = WpPropId.mk_kf_any_assigns_info () in - add_assigns_any acc Ahyp id - | Some id -> - let labels = NormAtLabels.labels_fct_assigns in - let assigns' = NormAtLabels.preproc_assigns labels assigns in - let a_desc = WpPropId.mk_kf_assigns_desc assigns' in - add_assigns acc Ahyp id a_desc + | None -> + let id = WpPropId.mk_kf_any_assigns_info () in + add_assigns_any acc Ahyp id + | Some id -> + let labels = NormAtLabels.labels_fct_assigns in + let assigns' = NormAtLabels.preproc_assigns labels assigns in + let a_desc = WpPropId.mk_kf_assigns_desc assigns' in + add_assigns acc Ahyp id a_desc (* --- Get annotations --- *) @@ -429,28 +429,28 @@ let pp_pred_list k l = List.iter (fun p -> pp_pred k true p) l in let pp_pred_b_list k l = List.iter (fun (b, p) -> pp_pred k b p) l in begin - pp_pred_list "H" acc.p_hyp; - pp_pred_list "G" acc.p_goal; - pp_pred_b_list "H+G" acc.p_both; - pp_pred_b_list "C" acc.p_cut; - ForCall.iter - (fun kf hs -> - let name = "CallHyp:" ^ (Kernel_function.get_name kf) in - pp_pred_list name hs) - acc.call_hyp; - ForCall.iter - (fun kf bhs -> - let name = "CallPre:" ^ (Kernel_function.get_name kf) in - pp_pred_b_list name bhs) - acc.call_pre; - ForCall.iter - (fun kf asgn -> - let name = "CallAsgn:" ^ (Kernel_function.get_name kf) in - WpPropId.pp_assign_info name fmt asgn) - acc.call_asgn; - WpPropId.pp_assign_info "DC" fmt acc.a_call; - WpPropId.pp_assign_info "HA" fmt acc.a_hyp; - WpPropId.pp_assign_info "GA" fmt acc.a_goal; + pp_pred_list "H" acc.p_hyp; + pp_pred_list "G" acc.p_goal; + pp_pred_b_list "H+G" acc.p_both; + pp_pred_b_list "C" acc.p_cut; + ForCall.iter + (fun kf hs -> + let name = "CallHyp:" ^ (Kernel_function.get_name kf) in + pp_pred_list name hs) + acc.call_hyp; + ForCall.iter + (fun kf bhs -> + let name = "CallPre:" ^ (Kernel_function.get_name kf) in + pp_pred_b_list name bhs) + acc.call_pre; + ForCall.iter + (fun kf asgn -> + let name = "CallAsgn:" ^ (Kernel_function.get_name kf) in + WpPropId.pp_assign_info name fmt asgn) + acc.call_asgn; + WpPropId.pp_assign_info "DC" fmt acc.a_call; + WpPropId.pp_assign_info "HA" fmt acc.a_hyp; + WpPropId.pp_assign_info "GA" fmt acc.a_goal; end let merge_calls f call1 call2 = @@ -462,26 +462,26 @@ (* TODO: it should be possible to do without this, but needs a big refactoring*) let merge_acc acc1 acc2 = -{ - p_hyp = acc1.p_hyp @ acc2.p_hyp; - p_goal = acc1.p_goal @ acc2.p_goal; - p_both = acc1.p_both @ acc2.p_both; - p_cut = acc1.p_cut @ acc2.p_cut; - call_hyp = merge_calls (@) acc1.call_hyp acc2.call_hyp; - call_pre = merge_calls (@) acc1.call_pre acc2.call_pre; - call_asgn = merge_calls WpPropId.merge_assign_info acc1.call_asgn acc2.call_asgn; - a_goal = WpPropId.merge_assign_info acc1.a_goal acc2.a_goal; - a_hyp = WpPropId.merge_assign_info acc1.a_hyp acc2.a_hyp; - a_call = WpPropId.merge_assign_info acc1.a_call acc2.a_call; -} + { + p_hyp = acc1.p_hyp @ acc2.p_hyp; + p_goal = acc1.p_goal @ acc2.p_goal; + p_both = acc1.p_both @ acc2.p_both; + p_cut = acc1.p_cut @ acc2.p_cut; + call_hyp = merge_calls (@) acc1.call_hyp acc2.call_hyp; + call_pre = merge_calls (@) acc1.call_pre acc2.call_pre; + call_asgn = merge_calls WpPropId.merge_assign_info acc1.call_asgn acc2.call_asgn; + a_goal = WpPropId.merge_assign_info acc1.a_goal acc2.a_goal; + a_hyp = WpPropId.merge_assign_info acc1.a_hyp acc2.a_hyp; + a_call = WpPropId.merge_assign_info acc1.a_call acc2.a_call; + } (* -------------------------------------------------------------------------- *) (* --- Annotation table --- *) (* -------------------------------------------------------------------------- *) - + (** This is an Hashtbl where some predicates are stored on CFG edges. * On each edge, we store hypotheses and goals. - *) +*) module Hannots = Cil2cfg.HE (struct type t = annots end) type annots_tbl = { @@ -505,7 +505,7 @@ let acc = try let acc = Hannots.find tbl.tbl_annots e in - merge_acc new_acc.info acc + merge_acc new_acc.info acc with Not_found -> new_acc.info in Hannots.replace tbl.tbl_annots e acc; in List.iter add_on_edge edges @@ -516,35 +516,35 @@ if post <> empty_acc then begin let edges_after = Cil2cfg.get_post_edges cfg v in - if edges_after = [] - then Wp_parameters.warning ~once:true - "Ignoring annotation rooted after statement with no succ" - else add_on_edges tbl post edges_after + if edges_after = [] + then Wp_parameters.warning ~once:true + "Ignoring annotation rooted after statement with no succ" + else add_on_edges tbl post edges_after end; if exits <> empty_acc then begin let edges_exits = Cil2cfg.get_exit_edges cfg v in - if edges_exits = [] - then (* unreachable (see [process_unreached_annots]) *) () - else add_on_edges tbl exits edges_exits + if edges_exits = [] + then (* unreachable (see [process_unreached_annots]) *) () + else add_on_edges tbl exits edges_exits end let add_loop_annots tbl cfg vloop ~entry ~back ~core = debug "[add_loop_annots] on %a@."Cil2cfg.pp_node vloop; let edges_to_head = Cil2cfg.succ_e cfg vloop in - debug "[add_loop_annots] %d edges_to_head" (List.length edges_to_head); + debug "[add_loop_annots] %d edges_to_head" (List.length edges_to_head); let edges_to_loop = Cil2cfg.pred_e cfg vloop in - debug "[add_loop_annots] %d edges_to_loop" (List.length edges_to_loop); + debug "[add_loop_annots] %d edges_to_loop" (List.length edges_to_loop); let back_edges, entry_edges = List.partition Cil2cfg.is_back_edge edges_to_loop in - debug "[add_loop_annots] %d back_edges + %d entry_edges" - (List.length back_edges) (List.length entry_edges); - add_on_edges tbl entry entry_edges; + debug "[add_loop_annots] %d back_edges + %d entry_edges" + (List.length back_edges) (List.length entry_edges); + add_on_edges tbl entry entry_edges; debug "[add_loop_annots on entry_edges ok]@."; - add_on_edges tbl back back_edges; + add_on_edges tbl back back_edges; debug "[add_loop_annots on back_edges ok]@."; - add_on_edges tbl core edges_to_head; + add_on_edges tbl core edges_to_head; debug "[add_loop_annots on edges_to_head ok]@." let add_axiom tbl lemma = @@ -558,15 +558,15 @@ let add_all_axioms tbl = let rec do_g g = - match g with - | Daxiomatic (_ax_name, globs,_) -> do_globs globs - | Dlemma (name,_,_,_,_,_) -> - let lem = LogicUsage.logic_lemma name in - add_axiom tbl lem - | _ -> () + match g with + | Daxiomatic (_ax_name, globs,_) -> do_globs globs + | Dlemma (name,_,_,_,_,_) -> + let lem = LogicUsage.logic_lemma name in + add_axiom tbl lem + | _ -> () and do_globs globs = List.iter do_g globs in Annotations.iter_global (fun _ -> do_g) - + let get_annots tbl e = try (* TODO clean : this is not very nice ! *) let info = Hannots.find tbl.tbl_annots e in { empty_acc with info = info} @@ -640,6 +640,11 @@ Kernel_function.pretty kf (if is_main then "" else "NOT "); is_main +let isInitConst () = Kernel.ConstReadonly.get () && Wp_parameters.Init.get () + +let isGlobalInitConst var = + var.vglob && var.vstorage <> Extern && Cil.typeHasQualifier "const" var.vtype + let mk_variant_properties kf s ca v = let vpos_id = WpPropId.mk_var_pos_id kf s ca in let vdecr_id = WpPropId.mk_var_decr_id kf s ca in diff -Nru frama-c-20140301+neon+dfsg/src/wp/wpStrategy.mli frama-c-20150201+sodium+dfsg/src/wp/wpStrategy.mli --- frama-c-20140301+neon+dfsg/src/wp/wpStrategy.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/wpStrategy.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -30,7 +30,7 @@ (* -------------------------------------------------------------------------- *) (** {2 Annotations} *) (* -------------------------------------------------------------------------- *) - + (** a set of annotations to be added to a program point. *) type t_annots @@ -41,41 +41,41 @@ (** An annotation can be used for different purpose. *) type annot_kind = | Ahyp (** annotation is an hypothesis, - but not a goal (see Aboth) : A => ...*) + but not a goal (see Aboth) : A => ...*) | Agoal (** annotation is a goal, - but not an hypothesis (see Aboth): A /\ ...*) + but not an hypothesis (see Aboth): A /\ ...*) | Aboth of bool (** annotation can be used as both hypothesis and goal : - - with true : considerer as both : A /\ A=>.. - - with false : we just want to use it as hyp right now. *) + - with true : considerer as both : A /\ A=>.. + - with false : we just want to use it as hyp right now. *) | AcutB of bool (** annotation is use as a cut : - - with true (A is also a goal) -> A (+ proof obligation A => ...) - - with false (A is an hyp only) -> True (+ proof obligation A => ...) *) + - with true (A is also a goal) -> A (+ proof obligation A => ...) + - with false (A is an hyp only) -> True (+ proof obligation A => ...) *) | AcallHyp of kernel_function - (** annotation is a called function property to consider as an Hyp. - * The pre are not here but in AcallPre since they can also - * be considered as goals. *) + (** annotation is a called function property to consider as an Hyp. + * The pre are not here but in AcallPre since they can also + * be considered as goals. *) | AcallPre of bool * kernel_function - (** annotation is a called function precondition : - to be considered as hyp, and goal if bool=true *) + (** annotation is a called function precondition : + to be considered as hyp, and goal if bool=true *) (** {3 Adding properties (predicates)} *) (** generic function to add a predicate property after normalisation. -* All the [add_prop_xxx] functions below use this one. *) + * All the [add_prop_xxx] functions below use this one. *) val add_prop : t_annots -> annot_kind -> - NormAtLabels.label_mapping -> WpPropId.prop_id -> - predicate named -> - t_annots + NormAtLabels.label_mapping -> WpPropId.prop_id -> + predicate named -> + t_annots (** Add the predicate as a function precondition. -* Add [assumes => pre] if [assumes] is given. *) + * Add [assumes => pre] if [assumes] is given. *) val add_prop_fct_pre : t_annots -> annot_kind -> kernel_function -> funbehavior -> assumes: predicate named option -> identified_predicate -> t_annots (** Add the preconditions of the behavior : -* if [impl_assumes], add [b_assumes => b_requires] -* else add both the [b_requires] and the [b_assumes] *) + * if [impl_assumes], add [b_assumes => b_requires] + * else add both the [b_requires] and the [b_assumes] *) val add_prop_fct_bhv_pre : t_annots -> annot_kind -> kernel_function -> funbehavior -> impl_assumes:bool -> t_annots @@ -84,13 +84,13 @@ -> t_annots (** Add the predicate as a stmt precondition. -* Add [assumes => pre] if [assumes] is given. *) + * Add [assumes => pre] if [assumes] is given. *) val add_prop_stmt_pre : t_annots -> annot_kind -> kernel_function -> stmt -> funbehavior -> assumes: predicate named option -> identified_predicate -> t_annots (** Add the predicate as a stmt precondition. -* Add [\old (assumes) => post] if [assumes] is given. *) + * Add [\old (assumes) => post] if [assumes] is given. *) val add_prop_stmt_post :t_annots -> annot_kind -> kernel_function -> stmt -> funbehavior -> termination_kind -> logic_label option -> assumes:predicate named option -> identified_predicate @@ -109,7 +109,7 @@ assumes:predicate named -> identified_predicate -> t_annots (** Add a postcondition of a called function. Beware that [kf] and [bhv] -* are the called one. *) + * are the called one. *) val add_prop_call_post : t_annots -> annot_kind -> kernel_function -> funbehavior -> termination_kind -> assumes:predicate named -> identified_predicate -> t_annots @@ -144,13 +144,13 @@ (** shortcut to add a loop assigns property as an hypothesis. *) val add_loop_assigns_hyp : t_annots -> kernel_function -> stmt -> - (code_annotation * identified_term from list) option -> t_annots + (code_annotation * identified_term from list) option -> t_annots val add_fct_bhv_assigns_hyp : t_annots -> kernel_function -> termination_kind -> funbehavior -> t_annots val assigns_upper_bound : - funspec -> (funbehavior * identified_term from list) option + funspec -> (funbehavior * identified_term from list) option (** {3 Getting information from annotations} *) @@ -160,7 +160,7 @@ WpPropId.pred_info list * WpPropId.pred_info list (** the [bool] in [get_cut] results says if the property has to be -* considered as a both goal and hyp ([goal=true], or hyp only ([goal=false]) *) + * considered as a both goal and hyp ([goal=true], or hyp only ([goal=false]) *) val get_cut : t_annots -> (bool * WpPropId.pred_info) list (** To be used as hypotheses arround a call, (the pre are in @@ -168,7 +168,7 @@ val get_call_hyp : t_annots -> kernel_function -> WpPropId.pred_info list (** Preconditions of a called function to be considered as hyp and goal -* (similar to [get_both_hyp_goals]). *) + * (similar to [get_both_hyp_goals]). *) val get_call_pre : t_annots -> kernel_function -> WpPropId.pred_info list * WpPropId.pred_info list val get_call_asgn : t_annots -> kernel_function option -> WpPropId.assigns_full_info @@ -184,7 +184,7 @@ (* -------------------------------------------------------------------------- *) (** {2 Annotation table} *) (* -------------------------------------------------------------------------- *) - + type annots_tbl val create_tbl : unit -> annots_tbl @@ -192,10 +192,10 @@ val add_on_edges : annots_tbl -> t_annots -> Cil2cfg.edge list -> unit (** [add_node_annots cfg annots v (before, (after, exits))] -* add the annotations for the node : -* @param before preconditions -* @param after postconditions -* @param exits \exits properties + * add the annotations for the node : + * @param before preconditions + * @param after postconditions + * @param exits \exits properties *) val add_node_annots : annots_tbl -> Cil2cfg.t -> Cil2cfg.node -> (t_annots * (t_annots * t_annots)) -> unit @@ -210,7 +210,7 @@ (* -------------------------------------------------------------------------- *) (** {2 Strategy} *) (* -------------------------------------------------------------------------- *) - + type strategy type strategy_for_froms = { @@ -223,7 +223,7 @@ | SKfroms of strategy_for_froms val mk_strategy : string -> Cil2cfg.t -> string option -> bool -> - strategy_kind -> annots_tbl -> strategy + strategy_kind -> annots_tbl -> strategy val get_annots : strategy -> Cil2cfg.edge -> t_annots val new_loop_computation : strategy -> bool @@ -248,8 +248,22 @@ (** The function is the main entry point AND it is not a lib entry *) val is_main_init : Cil_types.kernel_function -> bool + +(** True if both options [-const-readonly] and [-wp-init] are positionned, + and the variable is global, not extern, with a ["const"] type + (see [hasConstAttribute]). + @since Sodium-20150201 +*) +val isInitConst : unit -> bool + +(** True if the variable is global, not extern, with a ["const"] qualifier type. + {b Should} only apply when [isInitConst] is true. + @since Sodium-20150201 +*) +val isGlobalInitConst : varinfo -> bool + (** apply [f_normal] on the [Normal] postconditions, -* [f_exits] on the [Exits] postconditions, and warn on the others. *) + * [f_exits] on the [Exits] postconditions, and warn on the others. *) val fold_bhv_post_cond : warn:bool -> ('n_acc -> Cil_types.identified_predicate -> 'n_acc) -> ('e_acc -> Cil_types.identified_predicate -> 'e_acc) -> diff -Nru frama-c-20140301+neon+dfsg/src/wp/WTO.ml frama-c-20150201+sodium+dfsg/src/wp/WTO.ml --- frama-c-20140301+neon+dfsg/src/wp/WTO.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/WTO.ml 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -48,10 +48,10 @@ | Node(k,Nil) -> Format.fprintf fmt "%d" k | Node(k,e) -> Format.fprintf fmt "%d@ " k ; pretty fmt e | Component(a,Nil) -> - Format.fprintf fmt "@[(%a)@]" pretty a + Format.fprintf fmt "@[(%a)@]" pretty a | Component(a,b) -> - Format.fprintf fmt "@[(%a)@]@ " pretty a ; - pretty fmt b + Format.fprintf fmt "@[(%a)@]@ " pretty a ; + pretty fmt b let rec visit scc vertex acc = begin @@ -62,29 +62,29 @@ let w = { loop = false ; head = n } in scc.succ (fun succ -> - let min = - let d = scc.dfn.(succ) in - if d = 0 then visit scc succ acc else d - in - if min <= w.head then - ( w.head <- min ; w.loop <- true ) + let min = + let d = scc.dfn.(succ) in + if d = 0 then visit scc succ acc else d + in + if min <= w.head then + ( w.head <- min ; w.loop <- true ) ) vertex ; if w.head = scc.dfn.(vertex) then begin - scc.dfn.(vertex) <- max_int ; - let e = Stack.pop scc.stack in - if w.loop then - begin - let rec unstack scc e vertex = - if e <> vertex then - ( scc.dfn.(e) <- 0 ; - let e = Stack.pop scc.stack in - unstack scc e vertex ) - in unstack scc e vertex ; - acc := Component(component scc vertex, !acc) - end - else - acc := Node(vertex,!acc) ; + scc.dfn.(vertex) <- max_int ; + let e = Stack.pop scc.stack in + if w.loop then + begin + let rec unstack scc e vertex = + if e <> vertex then + ( scc.dfn.(e) <- 0 ; + let e = Stack.pop scc.stack in + unstack scc e vertex ) + in unstack scc e vertex ; + acc := Component(component scc vertex, !acc) + end + else + acc := Node(vertex,!acc) ; end ; w.head end @@ -94,8 +94,8 @@ let p = ref Nil in scc.succ (fun succ -> - if scc.dfn.(succ) = 0 then - ignore (visit scc succ p) + if scc.dfn.(succ) = 0 then + ignore (visit scc succ p) ) vertex ; Node(vertex,!p) end @@ -112,7 +112,7 @@ | Nil -> true | Node(e,_) -> widen ~level e | Component(a,_) -> fix widen level a - + let rec fixpoint widen update = function | Nil -> () | Node(e,w) -> update e ; fixpoint widen update w diff -Nru frama-c-20140301+neon+dfsg/src/wp/WTO.mli frama-c-20150201+sodium+dfsg/src/wp/WTO.mli --- frama-c-20140301+neon+dfsg/src/wp/WTO.mli 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/src/wp/WTO.mli 2015-05-28 08:53:24.000000000 +0000 @@ -2,7 +2,7 @@ (* *) (* This file is part of WP plug-in of Frama-C. *) (* *) -(* Copyright (C) 2007-2014 *) +(* Copyright (C) 2007-2015 *) (* CEA (Commissariat a l'energie atomique et aux energies *) (* alternatives) *) (* *) @@ -33,7 +33,7 @@ val partition : size:int -> succ:succ -> root:int -> partition (** Returns a weak partial order with Bourdoncle's algorithm. *) - + val fixpoint : (level:int -> int -> bool) -> (int -> unit) -> partition -> unit (** Iterate over a weak partial order. The first function is suppose to update the given node and return [true] when diff -Nru frama-c-20140301+neon+dfsg/tests/bugs/Makefile.evoting frama-c-20150201+sodium+dfsg/tests/bugs/Makefile.evoting --- frama-c-20140301+neon+dfsg/tests/bugs/Makefile.evoting 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/bugs/Makefile.evoting 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,21 @@ +JESSIE=frama-c -jessie "-cpp-extra-args=-I/usr/local/share/frama-c/jessie" + +default: evoting + +evoting: evoting.c check_specs.h + gcc -DNO_FRAMA_C -Wall -o $@ $< + +clean: + -rm evoting + +test: evoting candidates.txt + ./evoting candidates.txt + +check: evoting.c check_specs.h + $(JESSIE) $< + +gen-only: evoting.c check_specs.h + $(JESSIE) -jessie-gen-only $< + +gui: evoting.c check_specs.h + $(JESSIE) -jessie-gui $< diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/annot.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/annot.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/annot.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/annot.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,17 @@ +[kernel] preprocessing with "gcc -C -E -I. tests/cil/annot.c" +/* Generated by Frama-C */ +int fact(int n) +{ + int r; + r = 1; + while (n > 0) { + int tmp; + /*@ assert n > 0; */ ; + before: + { /*undefined sequence*/ tmp = n; n --; r *= tmp; } + /*@ assert r ≡ \at(r*n,before); */ ; + } + return (r); +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/branch.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/branch.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/branch.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/branch.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,22 @@ +[kernel] preprocessing with "gcc -C -E -I. tests/cil/branch.c" +/* Generated by Frama-C */ +int f(int a, int b) +{ + int __retres; + if (a < b) { + int tmp; + { /*undefined sequence*/ tmp = a; a ++; } + __retres = tmp; + goto return_label; + } + else { + int tmp_0; + { /*undefined sequence*/ tmp_0 = b; b --; } + __retres = tmp_0; + goto return_label; + } + return_label: /* internal */ + return (__retres); +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/bts297.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/bts297.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/bts297.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/bts297.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,14 @@ +[kernel] preprocessing with "gcc -C -E -I. tests/cil/bts297.c" +tests/cil/bts297.c:4:[kernel] warning: Body of function abrupt falls-through. Adding a return statement +/* Generated by Frama-C */ +int abrupt(int x) +{ + int __retres; + while (x > 0) { /*@ requires \true; + ensures x ≡ 3; */ + if (x) { x ++; } } + __retres = 0; + return (__retres); +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/bts342.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/bts342.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/bts342.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/bts342.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,4 @@ +[kernel] preprocessing with "gcc -C -E -I. tests/cil/bts342.c" +[kernel] failure: x[i] is neither a pointer nor a C array +[kernel] user error: skipping file "tests/cil/bts342.c" that has errors. +[kernel] Frama-C aborted because of an invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/bts882.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/bts882.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/bts882.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/bts882.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,10 @@ +/* Generated by Frama-C */ +extern int ( /* missing proto */ f)(); +void main(void) +{ + int r; + switch (1) { case 2: r = f(1); break; default: ; break; } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/bts892.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/bts892.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/bts892.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/bts892.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,3 @@ +tests/cil/bts892.i:11:[kernel] user error: Forbidden access to local variable i in static initializer +[kernel] user error: Target code cannot be parsed; aborting analysis. +[kernel] Frama-C aborted because of invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/comments.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/comments.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/comments.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/comments.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,22 @@ +[kernel] preprocessing with "gcc -C -E -I. tests/cil/comments.c" +/* Generated by Frama-C */ +/* run.config + OPT: -print -keep-comments + */ +/* ABC */ +void f(void) +{ + return; +} + +/* ABD/*FOO*/ */ +/* ABC */ +/* ABC + */ +/*@ requires \true; */ +void g(void) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/cpu_a.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/cpu_a.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/cpu_a.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/cpu_a.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,20 @@ +[kernel] preprocessing with "gcc -C -E -I. tests/cil/cpu_a.c" +[kernel] preprocessing with "gcc -C -E -I. tests/cil/cpu_b.c" +/* Generated by Frama-C */ +typedef unsigned int DWORD; +DWORD f(void); +DWORD g(void) +{ + DWORD tmp; + tmp = f(); + return (tmp); +} + +DWORD f(void) +{ + DWORD __retres; + __retres = (unsigned short)0; + return (__retres); +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/cpu_b.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/cpu_b.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/cpu_b.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/cpu_b.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,19 @@ +[kernel] preprocessing with "gcc -C -E -I. tests/cil/cpu_b.c" +[kernel] preprocessing with "gcc -C -E -I. tests/cil/cpu_a.c" +/* Generated by Frama-C */ +typedef unsigned short DWORD; +DWORD f(void) +{ + DWORD __retres; + __retres = (unsigned short)0; + return (__retres); +} + +DWORD g(void) +{ + DWORD tmp; + tmp = f(); + return (tmp); +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/duplicate-labels.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/duplicate-labels.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/duplicate-labels.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/duplicate-labels.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] preprocessing with "gcc -C -E -I. tests/cil/duplicate-labels.c" +/* Generated by Frama-C */ +int foo18(int a) +{ + int x; + int y; + x = 0; + y = 1; + goto l; + l: ; + x = 3; + goto l; + return (x); +} + +void foo(int z) +{ + int i; + i = 0; + while (i < 10) { + __Cont: z ++; + if (z < 5) { goto __Cont_0; } + else { goto __Cont; } + __Cont_0: /* internal */ i ++; + } + return; +} + +void f(void) +{ + int i; + i = 0; + while_1_break: + while (i < 10) { i ++; } + goto while_1_break; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/empty_cond.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/empty_cond.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/empty_cond.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/empty_cond.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,11 @@ +[kernel] preprocessing with "gcc -C -E -I. tests/cil/empty_cond.c" +/* Generated by Frama-C */ +int y; +int z; +void main(int x) +{ + z ++; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/issues.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/issues.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/issues.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/issues.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,788 @@ +[kernel] preprocessing with "gcc -C -E -I. tests/cil/issues.c" +/* Generated by Frama-C */ +typedef unsigned long size_t; +struct l { + struct l **next ; +}; +struct record { + int references ; + char buffer[1] ; +}; +enum __anonenum_MFT_RECORD_FLAGS_7 { + MFT_RECORD_IN_USE = 1, + MFT_RECORD_IS_DIRECTORY = 2, + MFT_REC_SPACE_FILLER = 65535 +} __attribute__((__packed__)) ; +typedef enum __anonenum_MFT_RECORD_FLAGS_7 MFT_RECORD_FLAGS; +struct __anonstruct_s_8 { + int x1 ; + short x2 ; + short x3 ; +} __attribute__((__packed__)) ; +typedef struct __anonstruct_s_8 s; +struct __anonstruct_tpsn_node_t_9 { + int free : 1 ; + int counter : 3 ; +} __attribute__((__packed__)) ; +typedef struct __anonstruct_tpsn_node_t_9 tpsn_node_t; +struct __anonstruct_app_state_t_10 { + tpsn_node_t tpsn_node[7] ; +} __attribute__((__packed__)) ; +typedef struct __anonstruct_app_state_t_10 app_state_t; +struct swsusp_info { + unsigned long num_physpages ; + int cpus ; + unsigned long image_pages ; + unsigned long pages ; + unsigned long size ; +} __attribute__((__aligned__((1)<< (12) ))) ; +struct bars { + int x ; +}; +struct foos { + struct bars b ; + int y ; +}; +struct tTestStructX { + int x ; +}; +typedef struct tTestStructX tTestStructX; +struct tTestStruct { + tTestStructX x ; + int a ; + int b ; + struct tTestStruct *ptr ; + char c ; + short x16 ; + int x32 ; +}; +typedef struct tTestStruct tTestStruct; +struct foo10 { + int x ; +}; +enum __anonenum_26 { + HUGE_BYTES = 0xffffffffffffffffULL == (unsigned long long )(127 * 2 + 1) +} ; +typedef int volatile mytype_t; +struct ATTR { + int len ; +}; +typedef struct ATTR attr; +typedef attr *pattr; +struct TUPLEDESC { + pattr *attrs ; +}; +typedef struct TUPLEDESC *t; +extern int printf(char const * __restrict __format , ...) ; +int main(void) +{ + struct l s[4] ; + struct l *a ; + struct l *p[4] ; + struct l *old ; + int __retres ; + p[0] = s; + (p[0])->next = p; + old = *((p[0])->next); + { /*undefined sequence*/ (*((p[0])->next)) ++; a = *((p[0])->next); } + if (old + 1 != a) { printf((char const *)"bug!\n"); } + __retres = 0; + return (__retres); +} + +int foo(int i ) +{ + int __retres ; + switch (i) { case 0: case 1: ; } + __retres = 0; + return (__retres); +} + +int base_files[sizeof(lang_dir_names) / sizeof(lang_dir_names[0])] ; +char const * const lang_dir_names[1] = {"c"}; +int bar(int flags ) +{ + unsigned int tmp ; + int __retres ; + if (flags & 4) { tmp = (unsigned int )(& ((struct record *)0)->buffer[0]); + } + else { tmp = (unsigned int )(& ((struct record *)0)->references); } + __retres = (int )tmp; + return (__retres); +} + +static void foo$bar(void) +{ + return; +} + +int pimInit(void) ; +int pimInit(void) +{ + int __retres ; + __retres = 1; + return (__retres); +} + +MFT_RECORD_FLAGS foo1 ; +s foo2 ; +void foo3(int z ) +{ + int i ; + i = 0; + while (i < 10) { + z ++; + if (! (z < 5)) { break; } + __Cont: /* internal */ ; + i ++; + } + return; +} + +void foo4(void) +{ + printf((char const *)"hello!"); + return; +} + +int foo5(void) +{ + app_state_t s_0 ; + int __retres ; + (s_0.tpsn_node[0].counter) --; + __retres = 0; + return (__retres); +} + +struct swsusp_info foo6 ; +int tcf_exts_dump(void) +{ + int __retres ; + goto rtattr_failure; + __retres = 0; + goto return_label; + rtattr_failure: __retres = -1; + return_label: /* internal */ + return (__retres); +} + +int strnvis(char * , char const *_0 , size_t _1 , int _2 ) +{ + int __retres ; + __retres = 1; + return (__retres); +} + +extern __attribute__((__nothrow__)) int rand(void) ; +void foo7(void) +{ + int t ; + struct foos f ; + int tmp_0 ; + t = rand(); + if (t) { tmp_0 = 2; } + else { tmp_0 = 3; } + f.b.x = tmp_0; + f.y = 42; + return; +} + +extern __attribute__((__nothrow__)) void *malloc(size_t __size ) __attribute__(( +__malloc__)) ; +int foo8(void) +{ + char *p ; + int i ; + int *tmp ; + int *tmp_0 ; + int __retres ; + p = (char *)malloc((unsigned long )(2U * sizeof(int ))); + *((int *)p) = 1; + *((int *)p + 1) = 2; + tmp = (int *)p; + p = (char *)((int *)p + 1); + i = *tmp; + printf((char const *)"%d\n",i); + tmp_0 = (int *)p; + p = (char *)((int *)p + 1); + i = *tmp_0; + printf((char const *)"%d\n",i); + __retres = 0; + return (__retres); +} + +extern int ( /* missing proto */ modMalloc)() ; +void testaccess2(void) +{ + tTestStruct *p ; + tTestStruct t2 ; + tTestStruct *p2 ; + p = (tTestStruct *)((void *)0); + p2 = & t2; + p = (tTestStruct *)modMalloc(sizeof(tTestStruct ),0); + p->ptr = (struct tTestStruct *)((void *)0); + p2->ptr = (struct tTestStruct *)((tTestStructX *)p); + return; +} + +struct foo10 foof(int y ) +{ + struct foo10 __constr_expr_0 ; + __constr_expr_0.x = y; + return (__constr_expr_0); +} + +int goo(int z ) +{ + struct foo10 a ; + int __retres ; + a = foof(3); + if (a.x == z) { __retres = 1; goto return_label; } + __retres = 0; + return_label: /* internal */ + return (__retres); +} + +extern __attribute__((__noreturn__)) int ____ilog2_NaN(void) __attribute__(( +__const__)) ; +void foo11(int n ) +{ + int x ; + int tmp_1 ; + int tmp_2 ; + int tmp_3 ; + int tmp_4 ; + int tmp_5 ; + int tmp_6 ; + int tmp_7 ; + int tmp_8 ; + int tmp_9 ; + int tmp_10 ; + int tmp_11 ; + int tmp_12 ; + int tmp_13 ; + int tmp_14 ; + int tmp_15 ; + int tmp_16 ; + int tmp_17 ; + int tmp_18 ; + int tmp_19 ; + int tmp_20 ; + int tmp_21 ; + int tmp_22 ; + int tmp_23 ; + int tmp_24 ; + int tmp_25 ; + int tmp_26 ; + int tmp_27 ; + int tmp_28 ; + int tmp_29 ; + int tmp_30 ; + int tmp_31 ; + int tmp_32 ; + int tmp_33 ; + int tmp_34 ; + int tmp_35 ; + int tmp_36 ; + int tmp_37 ; + int tmp_38 ; + int tmp_39 ; + int tmp_40 ; + int tmp_41 ; + int tmp_42 ; + int tmp_43 ; + int tmp_44 ; + int tmp_45 ; + int tmp_46 ; + int tmp_47 ; + int tmp_48 ; + int tmp_49 ; + int tmp_50 ; + int tmp_51 ; + int tmp_52 ; + int tmp_53 ; + int tmp_54 ; + int tmp_55 ; + int tmp_56 ; + int tmp_57 ; + int tmp_58 ; + int tmp_59 ; + int tmp_60 ; + int tmp_61 ; + int tmp_62 ; + int tmp_63 ; + int tmp_64 ; + int tmp_65 ; + if (20 < 1) { tmp_65 = ____ilog2_NaN(); } + else { + if (20ULL & (1ULL << 63)) { tmp_64 = 63; } + else { + if (20ULL & (1ULL << 62)) { tmp_63 = 62; } + else { + if (20ULL & (1ULL << 61)) { tmp_62 = 61; } + else { + if (20ULL & (1ULL << 60)) { tmp_61 = 60; } + else { + if (20ULL & (1ULL << 59)) { tmp_60 = 59; } + else { + if (20ULL & (1ULL << 58)) { tmp_59 = 58; } + else { + if (20ULL & (1ULL << 57)) { tmp_58 = 57; } + else { + if (20ULL & (1ULL << 56)) { tmp_57 = 56; } + else { + if (20ULL & (1ULL << 55)) { tmp_56 = 55; } + else { + if (20ULL & (1ULL << 54)) { tmp_55 = 54; } + else { + if (20ULL & (1ULL << 53)) { tmp_54 = 53; } + else { + if (20ULL & (1ULL << 52)) { tmp_53 = 52; } + else { + if (20ULL & (1ULL << 51)) { tmp_52 = 51; } + else { + if (20ULL & (1ULL << 50)) { tmp_51 = 50; } + else { + if (20ULL & (1ULL << 49)) { tmp_50 = 49; } + else { + if (20ULL & (1ULL << 48)) { tmp_49 = 48; } + else { + if (20ULL & (1ULL << 47)) { tmp_48 = 47; + } + else { + if (20ULL & (1ULL << 46)) { + tmp_47 = 46; + } + else { + if (20ULL & (1ULL << 45)) { + tmp_46 = 45; + } + else { + if (20ULL & (1ULL << 44)) { + tmp_45 = 44; + } + else { + if (20ULL & (1ULL << 43)) { + tmp_44 = 43; + } + else { + if (20ULL & (1ULL << 42)) { + tmp_43 = 42; + } + else { + if (20ULL & (1ULL << 41)) { + tmp_42 = 41; + } + else { + if (20ULL & (1ULL << 40)) { + tmp_41 = 40; + } + else { + if (20ULL & (1ULL << 39)) { + tmp_40 = 39; + } + else { + if (20ULL & (1ULL << 38)) { + tmp_39 = 38; + } + else { + if (20ULL & ( + 1ULL << 37)) { + tmp_38 = 37; + } + else { + if (20ULL & ( + 1ULL << 36)) { + tmp_37 = 36; + } + else { + if (20ULL & ( + 1ULL << 35)) { + tmp_36 = 35; + } + else { + if (20ULL & ( + 1ULL << 34)) { + tmp_35 = 34; + } + else { + if (20ULL & ( + 1ULL << 33)) { + tmp_34 = 33; + } + else { + if ( + 20ULL & ( + 1ULL << 32)) { + tmp_33 = 32; + } + else { + if ( + 20ULL & ( + 1ULL << 31)) { + tmp_32 = 31; + } + else { + if ( + 20ULL & ( + 1ULL << 30)) { + tmp_31 = 30; + } + else { + if ( + 20ULL & ( + 1ULL << 29)) { + tmp_30 = 29; + } + else { + if ( + 20ULL & ( + 1ULL << 28)) { + tmp_29 = 28; + } + else { + if ( + 20ULL & ( + 1ULL << 27)) { + tmp_28 = 27; + } + else { + if ( + 20ULL & ( + 1ULL << 26)) { + tmp_27 = 26; + } + else { + if ( + 20ULL & ( + 1ULL << 25)) { + tmp_26 = 25; + } + else { + if ( + 20ULL & ( + 1ULL << 24)) { + tmp_25 = 24; + } + else { + if ( + 20ULL & ( + 1ULL << 23)) { + tmp_24 = 23; + } + else { + if ( + 20ULL & ( + 1ULL << 22)) { + tmp_23 = 22; + } + else { + if ( + 20ULL & ( + 1ULL << 21)) { + tmp_22 = 21; + } + else { + if ( + 20ULL & ( + 1ULL << 20)) { + tmp_21 = 20; + } + else { + if ( + 20ULL & ( + 1ULL << 19)) { + tmp_20 = 19; + } + else { + if ( + 20ULL & ( + 1ULL << 18)) { + tmp_19 = 18; + } + else { + if ( + 20ULL & ( + 1ULL << 17)) { + tmp_18 = 17; + } + else { + if ( + 20ULL & ( + 1ULL << 16)) { + tmp_17 = 16; + } + else { + if ( + 20ULL & ( + 1ULL << 15)) { + tmp_16 = 15; + } + else { + if ( + 20ULL & ( + 1ULL << 14)) { + tmp_15 = 14; + } + else { + if ( + 20ULL & ( + 1ULL << 13)) { + tmp_14 = 13; + } + else { + if ( + 20ULL & ( + 1ULL << 12)) { + tmp_13 = 12; + } + else { + if ( + 20ULL & ( + 1ULL << 11)) { + tmp_12 = 11; + } + else { + if ( + 20ULL & ( + 1ULL << 10)) { + tmp_11 = 10; + } + else { + if ( + 20ULL & ( + 1ULL << 9)) { + tmp_10 = 9; + } + else { + if ( + 20ULL & ( + 1ULL << 8)) { + tmp_9 = 8; + } + else { + if ( + 20ULL & ( + 1ULL << 7)) { + tmp_8 = 7; + } + else { + if ( + 20ULL & ( + 1ULL << 6)) { + tmp_7 = 6; + } + else { + if ( + 20ULL & ( + 1ULL << 5)) { + tmp_6 = 5; + } + else { + if ( + 20ULL & ( + 1ULL << 4)) { + tmp_5 = 4; + } + else { + if ( + 20ULL & ( + 1ULL << 3)) { + tmp_4 = 3; + } + else { + if ( + 20ULL & ( + 1ULL << 2)) { + tmp_3 = 2; + } + else { + if ( + 20ULL & ( + 1ULL << 1)) { + tmp_2 = 1; + } + else { + if ( + 20ULL & ( + 1ULL << 0)) { + tmp_1 = 0; + } + else { + tmp_1 = ____ilog2_NaN(); + } + tmp_2 = tmp_1; + } + tmp_3 = tmp_2; + } + tmp_4 = tmp_3; + } + tmp_5 = tmp_4; + } + tmp_6 = tmp_5; + } + tmp_7 = tmp_6; + } + tmp_8 = tmp_7; + } + tmp_9 = tmp_8; + } + tmp_10 = tmp_9; + } + tmp_11 = tmp_10; + } + tmp_12 = tmp_11; + } + tmp_13 = tmp_12; + } + tmp_14 = tmp_13; + } + tmp_15 = tmp_14; + } + tmp_16 = tmp_15; + } + tmp_17 = tmp_16; + } + tmp_18 = tmp_17; + } + tmp_19 = tmp_18; + } + tmp_20 = tmp_19; + } + tmp_21 = tmp_20; + } + tmp_22 = tmp_21; + } + tmp_23 = tmp_22; + } + tmp_24 = tmp_23; + } + tmp_25 = tmp_24; + } + tmp_26 = tmp_25; + } + tmp_27 = tmp_26; + } + tmp_28 = tmp_27; + } + tmp_29 = tmp_28; + } + tmp_30 = tmp_29; + } + tmp_31 = tmp_30; + } + tmp_32 = tmp_31; + } + tmp_33 = tmp_32; + } + tmp_34 = tmp_33; + } + tmp_35 = tmp_34; + } + tmp_36 = tmp_35; + } + tmp_37 = tmp_36; + } + tmp_38 = tmp_37; + } + tmp_39 = tmp_38; + } + tmp_40 = tmp_39; + } + tmp_41 = tmp_40; + } + tmp_42 = tmp_41; + } + tmp_43 = tmp_42; + } + tmp_44 = tmp_43; + } + tmp_45 = tmp_44; + } + tmp_46 = tmp_45; + } + tmp_47 = tmp_46; + } + tmp_48 = tmp_47; + } + tmp_49 = tmp_48; + } + tmp_50 = tmp_49; + } + tmp_51 = tmp_50; + } + tmp_52 = tmp_51; + } + tmp_53 = tmp_52; + } + tmp_54 = tmp_53; + } + tmp_55 = tmp_54; + } + tmp_56 = tmp_55; + } + tmp_57 = tmp_56; + } + tmp_58 = tmp_57; + } + tmp_59 = tmp_58; + } + tmp_60 = tmp_59; + } + tmp_61 = tmp_60; + } + tmp_62 = tmp_61; + } + tmp_63 = tmp_62; + } + tmp_64 = tmp_63; + } + tmp_65 = tmp_64; + } + x = tmp_65; + return; +} + +void foo13(void) +{ + int x ; + x = (int )HUGE_BYTES; + return; +} + +mytype_t my ; +int foo14(t desc ) +{ + pattr *att ; + int __retres ; + att = desc->attrs; + __retres = (*(att + 0))->len; + return (__retres); +} + +extern void foo15(unsigned long long f ) ; +int foo16(int argc , char **argv ) +{ + int __retres ; + foo15(0xffffffffffffffffULL); + __retres = 0; + return (__retres); +} + +void foo17(unsigned long long f ) +{ + return; +} + +int foo18(int a ) +{ + int x ; + int y ; + x = 0; + y = 1; + if (a) { goto l; l: ; x = 3; } + else { goto l; l: ; y = 3; } + return (x); +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/merge2.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/merge2.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/merge2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/merge2.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,6 @@ +[kernel] preprocessing with "gcc -C -E -I. tests/cil/merge2.c" +[kernel] preprocessing with "gcc -C -E -I. tests/cil/merge.c" +/* Generated by Frama-C */ +int x; +int x = 2; + diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/merge.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/merge.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/merge.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/merge.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,5 @@ +[kernel] preprocessing with "gcc -C -E -I. tests/cil/merge.c" +[kernel] preprocessing with "gcc -C -E -I. tests/cil/merge2.c" +/* Generated by Frama-C */ +int x = 2; + diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/ocaml32bits3_11_0.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/ocaml32bits3_11_0.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/ocaml32bits3_11_0.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/ocaml32bits3_11_0.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,7 @@ +/* Generated by Frama-C */ +enum __anonenum_v_1 { + OK = 0x1111EEEEu, + KO = 0x99996666u +}; +enum __anonenum_v_1 v; + diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/overlap.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/overlap.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/overlap.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/overlap.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,46 @@ +[kernel] preprocessing with "gcc -C -E -I. tests/cil/overlap.c" +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int n; + int z[8]; + n = 8; + { int i; i = 0; + while (i < n) { + int tmp; + int tmp_0; + int tmp_1; + int tmp_2; + int tmp_3; + int tmp_4; + first: + { /*undefined sequence*/ + tmp = i; + i ++; + tmp_0 = i; + i ++; + tmp_1 = i; + i --; + z[tmp] = z[tmp_0] + tmp_1; + } + last: + { /*undefined sequence*/ + tmp_2 = i; + i ++; + tmp_3 = i; + i ++; + tmp_4 = i; + i --; + z[tmp_2] = z[tmp_3] + tmp_4; + } + /*@ assert \at(0 ≤ i ∧ i < n,first); */ ; + /*@ assert \at(0 ≤ i ∧ i < n,last); */ ; + } + } + + __retres = z[n - 1]; + return (__retres); +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/cil/oracle/union_to_union.res.oracle frama-c-20150201+sodium+dfsg/tests/cil/oracle/union_to_union.res.oracle --- frama-c-20140301+neon+dfsg/tests/cil/oracle/union_to_union.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/oracle/union_to_union.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,19 @@ +tests/cil/union_to_union.i:8:[kernel] warning: Body of function main falls-through. Adding a return statement +/* Generated by Frama-C */ +union X { + int a ; + short b ; +}; +int main(void) +{ + int __retres; + union X u; + union X v; + union X __constr_expr_0; + __constr_expr_0.b = u.b; + v = __constr_expr_0; + __retres = 0; + return (__retres); +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/cil/test_config frama-c-20150201+sodium+dfsg/tests/cil/test_config --- frama-c-20140301+neon+dfsg/tests/cil/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/cil/test_config 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1 @@ +OPT:-print diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/array_pointers.i frama-c-20150201+sodium+dfsg/tests/constant_propagation/array_pointers.i --- frama-c-20140301+neon+dfsg/tests/constant_propagation/array_pointers.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/array_pointers.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,11 @@ +/* run.config + OPT: -val -semantic-const-folding -journal-disable +*/ + +void *p; + +void main() { + void **q = &p+1; + void **r = q+1; + void *s = p + 1; +} diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/bts-1787-bis.i frama-c-20150201+sodium+dfsg/tests/constant_propagation/bts-1787-bis.i --- frama-c-20140301+neon+dfsg/tests/constant_propagation/bts-1787-bis.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/bts-1787-bis.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,56 @@ +/* run.config +OPT: -journal-disable -print +OPT: -journal-disable -scf +OPT: -journal-disable -scf -scf-allow-cast +*/ + +typedef struct { + int s; +} S1_t; + +typedef struct { + const S1_t* p1; + S1_t* p2; + S1_t* p3; +} S2_t; + +struct { + S1_t c12; + S1_t c3; +} G1; + +static S2_t const G2 = { + &G1.c12, + &G1.c12, + &G1.c3 +}; + +void h1(S2_t const* q) { + S1_t *s1 = q->p1; + // gcc warning: initialization discards ‘const’ qualifier from pointer target type [enabled by default] +} +void h2(S2_t const* q) { + S1_t *s2 = (S1_t *)(q->p1); // same AST than h1 (cast explicited by the kernel) for the right-value +} +void h3(S2_t const* q) { + S1_t *s3 = (S1_t *)G2.p1; +} +void h4(S2_t const* q) { + S1_t *s5 = (S1_t const *)(& G1.c12); + // gcc warning: initialization discards ‘const’ qualifier from pointer target type [enabled by default] +} +void h5(S2_t const* q) { + S1_t *s6 = & G1.c12; // same AST than h4 (cast removed by the kernel) for the right-value +} +// The result for h1 to h5 can be &G1.c12 for both value of the option -scf-allow-cast + +int main(int c) { + int s = c ? 1 : 2; + G1.c12.s = s; + h1(&G2); + h2(&G2); + h3(&G2); + h4(&G2); + h5(&G2); + return G1.c3.s; +} diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/bts-1787.i frama-c-20150201+sodium+dfsg/tests/constant_propagation/bts-1787.i --- frama-c-20140301+neon+dfsg/tests/constant_propagation/bts-1787.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/bts-1787.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,43 @@ +/* run.config +OPT: -journal-disable -scf -scf-allow-cast +OPT: -journal-disable -scf +*/ + +typedef struct { + int s; +} S1_t; + +typedef struct { + const S1_t* p1; + S1_t* p2; + S1_t* p3; +} S2_t; + +struct { + S1_t c12; + S1_t c3; +} G1; + +static S2_t const G2 = { + &G1.c12, + &G1.c12, + &G1.c3 +}; + +void g(S2_t const* q) { + S1_t *s1 = (S1_t *)(q->p1); /* incorrect to inline because of const qualifier */ + (*(q->p3)).s = (*(q->p1)).s + (*(q->p2)).s ; + // (*(q->p1)).s += (*(q->p1)).s; /* statement to be rejected by the C typechecker */ + + s1->s = 3; +} + + +int main(int c) { + int s = c ? 1 : 2; + G1.c12.s = s; + g(&G2); + return G1.c3.s; +} +int a = 0; +int b = a; diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/const_propagate.c frama-c-20150201+sodium+dfsg/tests/constant_propagation/const_propagate.c --- frama-c-20140301+neon+dfsg/tests/constant_propagation/const_propagate.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/const_propagate.c 2015-05-28 08:53:24.000000000 +0000 @@ -63,11 +63,23 @@ ull = ull - 1L; } +float f0, f1, f2, f3; +double d0, d1, d2, d3; +void test_float_double (void) { + d1 = d0; + d2 = d1 + d0; + d3 = d2 + 1.0; + f1 = f0; + f2 = f1 + f0; + f3 = f2 + 1.0; +} + void main(int a) { test_ull (); test_struct () ; test_struct_ptr () ; test_tab (13) ; + test_float_double (); int b = init(5); // TODO: init(5); b = 0; z = add3 (a, 0, 0); diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/declaration.c frama-c-20150201+sodium+dfsg/tests/constant_propagation/declaration.c --- frama-c-20140301+neon+dfsg/tests/constant_propagation/declaration.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/declaration.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,13 +1,30 @@ /* run.config - DONTRUN: bugfix in progress - OPT: -val -semantic-const-folding -journal-disable + OPT: -val -scf -journal-disable -then-on propagated -check -scf */ -void f(int *x) { (*x)++; } +void f(int *x, int *y, void (*p)(int *x, int *y)) { + (*x)++; + (*y)++; + p(x, y); +} + +void g(int *x, int *y, void (*p)(int *x, int *y)) { + (*x)++; + (*y)++; + p(x, y); +} -int Y = 42; +extern int X; + +int Y = -42; + +void h(int *x, int *y) { + *x += 2; + *y += 5; +} int main () { - f(&Y); + f(&X, &Y, h); + g(&X, &Y, h); return Y; } diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/fct_ptr.i frama-c-20150201+sodium+dfsg/tests/constant_propagation/fct_ptr.i --- frama-c-20140301+neon+dfsg/tests/constant_propagation/fct_ptr.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/fct_ptr.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,5 +1,5 @@ /* run.config -OPT: -scf -check +OPT: -scf -check -then-on propagated -check */ void (*pf)(void); diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/introduction_of_non_explicit_cast.ml frama-c-20150201+sodium+dfsg/tests/constant_propagation/introduction_of_non_explicit_cast.ml --- frama-c-20140301+neon+dfsg/tests/constant_propagation/introduction_of_non_explicit_cast.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/introduction_of_non_explicit_cast.ml 2015-05-28 08:53:24.000000000 +0000 @@ -1,6 +1,6 @@ let main _ = - let all = Datatype.String.Set.empty in + let all = Cil_datatype.Fundec.Set.empty in let new_proj = !Db.Constant_Propagation.get all true in Project.set_current new_proj; Kernel.CodeOutput.output (fun fmt -> Format.fprintf fmt "After Constant propagation :@.") ; diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/array_pointers.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/array_pointers.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/array_pointers.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/array_pointers.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/array_pointers.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + p ∈ {0} +tests/constant_propagation/array_pointers.i:10:[kernel] warning: using size of 'void' +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + q ∈ {{ &p + {4} }} + r ∈ {{ &p + {8} }} + s ∈ {1} +[scf] beginning constant propagation +tests/constant_propagation/array_pointers.i:10:[kernel] warning: using size of 'void' +/* Generated by Frama-C */ +void *p; +void main(void) +{ + void **q; + void **r; + void *s; + q = & p + 1; + r = & p + 2; + s = p + 1; + return; +} + + +[scf] constant propagation done diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/bts117.1.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/bts117.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/bts117.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/bts117.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,47 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/bts117.c (with preprocessing) +[scf] beginning constant propagation +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function main1 <- main. + Called from tests/constant_propagation/bts117.c:19. +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/constant_propagation/bts117.c:20. +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +/* Generated by Frama-C */ +int main1(void) +{ + int r; + r = 0; + return r; +} + +int main2(void) +{ + int r; + r = 1; + if (1) r = 0; else r = 2; + return r; +} + +int main(void) +{ + int __retres; + int x1; + int x2; + x1 = main1(); + x2 = main2(); + __retres = 0; + return __retres; +} + + +[scf] constant propagation done diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/bts117.2.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/bts117.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/bts117.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/bts117.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,65 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/bts117.c (with preprocessing) +[sparecode] remove unused code... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function main1 <- main. + Called from tests/constant_propagation/bts117.c:19. +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/constant_propagation/bts117.c:20. +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main2 +[from] Done for function main2 +[pdg] done for function main +[pdg] computing for function main2 +[pdg] done for function main2 +[pdg] computing for function main1 +[pdg] done for function main1 +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +int main1(void) +{ + int r; + r = 0; + return r; +} + +int main2(void) +{ + int r; + r = 0; + return r; +} + +int main(void) +{ + int __retres; + int x1; + int x2; + x1 = main1(); + x2 = main2(); + __retres = x1 + x2; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/bts117.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/bts117.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/bts117.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/bts117.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,30 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/bts117.c (with preprocessing) +/* Generated by Frama-C */ +int main1(void) +{ + int r; + r = 0; + return r; +} + +int main2(void) +{ + int r; + r = 1; + if (r) r = 0; else r = 2; + return r; +} + +int main(void) +{ + int __retres; + int x1; + int x2; + x1 = main1(); + x2 = main2(); + __retres = x1 + x2; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/bts-1787.1.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/bts-1787.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/bts-1787.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/bts-1787.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,62 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/bts-1787.i (no preprocessing) +[scf] beginning constant propagation +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G1 ∈ {0} + a ∈ {0} + b ∈ {0} + G2{.p1; .p2} ∈ {{ (? *)&G1 }} + .p3 ∈ {{ &G1.c3 }} +[value] computing for function g <- main. + Called from tests/constant_propagation/bts-1787.i:39. +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +/* Generated by Frama-C */ +struct __anonstruct_S1_t_1 { + int s ; +}; +typedef struct __anonstruct_S1_t_1 S1_t; +struct __anonstruct_S2_t_2 { + S1_t const *p1 ; + S1_t *p2 ; + S1_t *p3 ; +}; +typedef struct __anonstruct_S2_t_2 S2_t; +struct __anonstruct_G1_3 { + S1_t c12 ; + S1_t c3 ; +}; +struct __anonstruct_G1_3 G1; +static S2_t const G2 = {.p1 = (S1_t const *)(& G1.c12), .p2 = & G1.c12, + .p3 = & G1.c3}; +void g(S2_t const *q) +{ + S1_t *s1; + s1 = & G1.c12; + G1.c3.s = G1.c12.s + G1.c12.s; + G1.c12.s = 3; + return; +} + +int main(int c) +{ + int __retres; + int s; + int tmp; + if (c) tmp = 1; else tmp = 2; + s = tmp; + G1.c12.s = s; + g(& G2); + __retres = G1.c3.s; + return __retres; +} + +int a = 0; +int b = a; + +[scf] constant propagation done diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/bts-1787-bis.1.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/bts-1787-bis.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/bts-1787-bis.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/bts-1787-bis.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,104 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/bts-1787-bis.i (no preprocessing) +[scf] beginning constant propagation +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G1 ∈ {0} + G2{.p1; .p2} ∈ {{ (? *)&G1 }} + .p3 ∈ {{ &G1.c3 }} +[value] computing for function h1 <- main. + Called from tests/constant_propagation/bts-1787-bis.i:50. +[value] Recording results for h1 +[value] Done for function h1 +[value] computing for function h2 <- main. + Called from tests/constant_propagation/bts-1787-bis.i:51. +[value] Recording results for h2 +[value] Done for function h2 +[value] computing for function h3 <- main. + Called from tests/constant_propagation/bts-1787-bis.i:52. +[value] Recording results for h3 +[value] Done for function h3 +[value] computing for function h4 <- main. + Called from tests/constant_propagation/bts-1787-bis.i:53. +[value] Recording results for h4 +[value] Done for function h4 +[value] computing for function h5 <- main. + Called from tests/constant_propagation/bts-1787-bis.i:54. +[value] Recording results for h5 +[value] Done for function h5 +[value] Recording results for main +[value] done for function main +/* Generated by Frama-C */ +struct __anonstruct_S1_t_1 { + int s ; +}; +typedef struct __anonstruct_S1_t_1 S1_t; +struct __anonstruct_S2_t_2 { + S1_t const *p1 ; + S1_t *p2 ; + S1_t *p3 ; +}; +typedef struct __anonstruct_S2_t_2 S2_t; +struct __anonstruct_G1_3 { + S1_t c12 ; + S1_t c3 ; +}; +struct __anonstruct_G1_3 G1; +static S2_t const G2 = {.p1 = (S1_t const *)(& G1.c12), .p2 = & G1.c12, + .p3 = & G1.c3}; +void h1(S2_t const *q) +{ + S1_t *s1; + s1 = & G1.c12; + return; +} + +void h2(S2_t const *q) +{ + S1_t *s2; + s2 = & G1.c12; + return; +} + +void h3(S2_t const *q) +{ + S1_t *s3; + s3 = & G1.c12; + return; +} + +void h4(S2_t const *q) +{ + S1_t *s5; + s5 = & G1.c12; + return; +} + +void h5(S2_t const *q) +{ + S1_t *s6; + s6 = & G1.c12; + return; +} + +int main(int c) +{ + int __retres; + int s; + int tmp; + if (c) tmp = 1; else tmp = 2; + s = tmp; + G1.c12.s = s; + h1(& G2); + h2(& G2); + h3(& G2); + h4(& G2); + h5(& G2); + __retres = 0; + return __retres; +} + + +[scf] constant propagation done diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/bts-1787-bis.2.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/bts-1787-bis.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/bts-1787-bis.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/bts-1787-bis.2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,104 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/bts-1787-bis.i (no preprocessing) +[scf] beginning constant propagation +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G1 ∈ {0} + G2{.p1; .p2} ∈ {{ (? *)&G1 }} + .p3 ∈ {{ &G1.c3 }} +[value] computing for function h1 <- main. + Called from tests/constant_propagation/bts-1787-bis.i:50. +[value] Recording results for h1 +[value] Done for function h1 +[value] computing for function h2 <- main. + Called from tests/constant_propagation/bts-1787-bis.i:51. +[value] Recording results for h2 +[value] Done for function h2 +[value] computing for function h3 <- main. + Called from tests/constant_propagation/bts-1787-bis.i:52. +[value] Recording results for h3 +[value] Done for function h3 +[value] computing for function h4 <- main. + Called from tests/constant_propagation/bts-1787-bis.i:53. +[value] Recording results for h4 +[value] Done for function h4 +[value] computing for function h5 <- main. + Called from tests/constant_propagation/bts-1787-bis.i:54. +[value] Recording results for h5 +[value] Done for function h5 +[value] Recording results for main +[value] done for function main +/* Generated by Frama-C */ +struct __anonstruct_S1_t_1 { + int s ; +}; +typedef struct __anonstruct_S1_t_1 S1_t; +struct __anonstruct_S2_t_2 { + S1_t const *p1 ; + S1_t *p2 ; + S1_t *p3 ; +}; +typedef struct __anonstruct_S2_t_2 S2_t; +struct __anonstruct_G1_3 { + S1_t c12 ; + S1_t c3 ; +}; +struct __anonstruct_G1_3 G1; +static S2_t const G2 = {.p1 = (S1_t const *)(& G1.c12), .p2 = & G1.c12, + .p3 = & G1.c3}; +void h1(S2_t const *q) +{ + S1_t *s1; + s1 = & G1.c12; + return; +} + +void h2(S2_t const *q) +{ + S1_t *s2; + s2 = & G1.c12; + return; +} + +void h3(S2_t const *q) +{ + S1_t *s3; + s3 = & G1.c12; + return; +} + +void h4(S2_t const *q) +{ + S1_t *s5; + s5 = & G1.c12; + return; +} + +void h5(S2_t const *q) +{ + S1_t *s6; + s6 = & G1.c12; + return; +} + +int main(int c) +{ + int __retres; + int s; + int tmp; + if (c) tmp = 1; else tmp = 2; + s = tmp; + G1.c12.s = s; + h1(& G2); + h2(& G2); + h3(& G2); + h4(& G2); + h5(& G2); + __retres = 0; + return __retres; +} + + +[scf] constant propagation done diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/bts-1787-bis.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/bts-1787-bis.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/bts-1787-bis.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/bts-1787-bis.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,73 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/bts-1787-bis.i (no preprocessing) +/* Generated by Frama-C */ +struct __anonstruct_S1_t_1 { + int s ; +}; +typedef struct __anonstruct_S1_t_1 S1_t; +struct __anonstruct_S2_t_2 { + S1_t const *p1 ; + S1_t *p2 ; + S1_t *p3 ; +}; +typedef struct __anonstruct_S2_t_2 S2_t; +struct __anonstruct_G1_3 { + S1_t c12 ; + S1_t c3 ; +}; +struct __anonstruct_G1_3 G1; +static S2_t const G2 = {.p1 = (S1_t const *)(& G1.c12), .p2 = & G1.c12, + .p3 = & G1.c3}; +void h1(S2_t const *q) +{ + S1_t *s1; + s1 = (S1_t *)q->p1; + return; +} + +void h2(S2_t const *q) +{ + S1_t *s2; + s2 = (S1_t *)q->p1; + return; +} + +void h3(S2_t const *q) +{ + S1_t *s3; + s3 = (S1_t *)G2.p1; + return; +} + +void h4(S2_t const *q) +{ + S1_t *s5; + s5 = & G1.c12; + return; +} + +void h5(S2_t const *q) +{ + S1_t *s6; + s6 = & G1.c12; + return; +} + +int main(int c) +{ + int __retres; + int s; + int tmp; + if (c) tmp = 1; else tmp = 2; + s = tmp; + G1.c12.s = s; + h1(& G2); + h2(& G2); + h3(& G2); + h4(& G2); + h5(& G2); + __retres = G1.c3.s; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/bts-1787.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/bts-1787.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/bts-1787.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/bts-1787.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,62 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/bts-1787.i (no preprocessing) +[scf] beginning constant propagation +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G1 ∈ {0} + a ∈ {0} + b ∈ {0} + G2{.p1; .p2} ∈ {{ (? *)&G1 }} + .p3 ∈ {{ &G1.c3 }} +[value] computing for function g <- main. + Called from tests/constant_propagation/bts-1787.i:39. +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +/* Generated by Frama-C */ +struct __anonstruct_S1_t_1 { + int s ; +}; +typedef struct __anonstruct_S1_t_1 S1_t; +struct __anonstruct_S2_t_2 { + S1_t const *p1 ; + S1_t *p2 ; + S1_t *p3 ; +}; +typedef struct __anonstruct_S2_t_2 S2_t; +struct __anonstruct_G1_3 { + S1_t c12 ; + S1_t c3 ; +}; +struct __anonstruct_G1_3 G1; +static S2_t const G2 = {.p1 = (S1_t const *)(& G1.c12), .p2 = & G1.c12, + .p3 = & G1.c3}; +void g(S2_t const *q) +{ + S1_t *s1; + s1 = & G1.c12; + G1.c3.s = G1.c12.s + G1.c12.s; + G1.c12.s = 3; + return; +} + +int main(int c) +{ + int __retres; + int s; + int tmp; + if (c) tmp = 1; else tmp = 2; + s = tmp; + G1.c12.s = s; + g(& G2); + __retres = G1.c3.s; + return __retres; +} + +int a = 0; +int b = a; + +[scf] constant propagation done diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/const_field_return_struct.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/const_field_return_struct.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/const_field_return_struct.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/const_field_return_struct.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,34 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/const_field_return_struct.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T ∈ {0} + U ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + __retres ∈ {0} +[scf] beginning constant propagation +/* Generated by Frama-C */ +struct S { + int f0 ; + int f1 ; +}; +struct S T; +struct S U; +struct S main(int c) +{ + struct S __retres; + if (c) { + __retres = T; + goto return_label; + } + __retres = U; + return_label: return __retres; +} + + +[scf] constant propagation done diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/const_propagate.1.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/const_propagate.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/const_propagate.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/const_propagate.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,177 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/const_propagate.c (with preprocessing) +[scf] beginning constant propagation +[value] Analyzing a complete application starting at init +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + z ∈ {0} + TAB[0..9] ∈ {0} + s1 ∈ {0} + s2 ∈ {0} + ull ∈ {0} + f0 ∈ {0} + f1 ∈ {0} + f2 ∈ {0} + f3 ∈ {0} + d0 ∈ {0} + d1 ∈ {0} + d2 ∈ {0} + d3 ∈ {0} +[value] computing for function add3 <- init. + Called from tests/constant_propagation/const_propagate.c:56. +tests/constant_propagation/const_propagate.c:48:[kernel] warning: signed overflow. assert v1+v2 ≤ 2147483647; +[value] Recording results for add3 +[value] Done for function add3 +[value] Recording results for init +[value] done for function init +/* Generated by Frama-C */ +struct st { + int a ; + int b ; +}; +typedef struct st ST; +int x; +int y; +int z; +int TAB[10]; +struct st s1; +struct st s2; +void test_struct(void) +{ + ST s; + s.a = 0; + s.b = 1; + s1 = s; + (s1.a) ++; + s2.a = s1.a; + (s.a) ++; + s2 = s; + (s.b) --; + return; +} + +void test_tab(int v) +{ + int *r; + char *q; + int decal; + { + /*sequence*/ + (s2.b) ++; + TAB[s1.b] = TAB[s2.b]; + } + r = & TAB[4]; + *r = v; + *(r + 1) = v; + q = (char *)r; + *q = (char)v; + *(q + 1) = (char)v; + decal = (int)sizeof(int); + *(q + decal) = (char)v; + return; +} + +int *test_ptr(int v) +{ + int *__retres; + int *p; + char *s; + int decal; + p = & x; + s = (char *)p; + *s = (char)v; + decal = 1; + *(s + decal) = (char)v; + s = (char *)p + decal; + *s = (char)v; + *p = v; + __retres = & x; + return __retres; +} + +int *test_struct_ptr(void) +{ + int *__retres; + int *q; + q = & s1.b; + __retres = & s1.a; + return __retres; +} + +int add3(int v1, int v2, int v3) +{ + int __retres; + /*@ assert Value: signed_overflow: v1+v2 ≤ 2147483647; */ + __retres = (v1 + 7) + 0; + return __retres; +} + +int init(int v) +{ + int zero; + int sept; + int z1; + zero = 0; + sept = 7; + x = v; + y = sept; + z = add3(x,y,zero); + z1 = z; + return zero; +} + +unsigned long long ull; +void test_ull(void) +{ + ull -= (unsigned long long)1L; + return; +} + +float f0; +float f1; +float f2; +float f3; +double d0; +double d1; +double d2; +double d3; +void test_float_double(void) +{ + d1 = d0; + d2 = d1 + d0; + d3 = d2 + 1.0; + f1 = f0; + f2 = f1 + f0; + f3 = (float)((double)f2 + 1.0); + return; +} + +void main(int a) +{ + int b; + int *p; + int *q; + int *tmp_1; + int yy; + test_ull(); + test_struct(); + test_struct_ptr(); + test_tab(13); + test_float_double(); + b = init(5); + z = add3(a,0,0); + p = test_ptr(y); + /*@ assert *p ≡ 7; */ ; + if (a) tmp_1 = p; else tmp_1 = & y; + q = tmp_1; + yy = *q; + /*@ assert a ≡ 0 ⇒ q ≡ &y; */ ; + /*@ assert *q ≡ 7; */ ; + return; +} + + +[scf] constant propagation done diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/const_propagate.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/const_propagate.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/const_propagate.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/const_propagate.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,380 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/const_propagate.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + z ∈ {0} + TAB[0..9] ∈ {0} + s1 ∈ {0} + s2 ∈ {0} + ull ∈ {0} + f0 ∈ {0} + f1 ∈ {0} + f2 ∈ {0} + f3 ∈ {0} + d0 ∈ {0} + d1 ∈ {0} + d2 ∈ {0} + d3 ∈ {0} +[value] computing for function test_ull <- main. + Called from tests/constant_propagation/const_propagate.c:78. +[value] Recording results for test_ull +[value] Done for function test_ull +[value] computing for function test_struct <- main. + Called from tests/constant_propagation/const_propagate.c:79. +[value] Recording results for test_struct +[value] Done for function test_struct +[value] computing for function test_struct_ptr <- main. + Called from tests/constant_propagation/const_propagate.c:80. +[value] Recording results for test_struct_ptr +[value] Done for function test_struct_ptr +[value] computing for function test_tab <- main. + Called from tests/constant_propagation/const_propagate.c:81. +[value] Recording results for test_tab +[value] Done for function test_tab +[value] computing for function test_float_double <- main. + Called from tests/constant_propagation/const_propagate.c:82. +[value] Recording results for test_float_double +[value] Done for function test_float_double +[value] computing for function init <- main. + Called from tests/constant_propagation/const_propagate.c:84. +[value] computing for function add3 <- init <- main. + Called from tests/constant_propagation/const_propagate.c:56. +[value] Recording results for add3 +[value] Done for function add3 +[value] Recording results for init +[value] Done for function init +[value] computing for function add3 <- main. + Called from tests/constant_propagation/const_propagate.c:85. +[value] Recording results for add3 +[value] Done for function add3 +[value] computing for function test_ptr <- main. + Called from tests/constant_propagation/const_propagate.c:87. +[value] Recording results for test_ptr +[value] Done for function test_ptr +tests/constant_propagation/const_propagate.c:88:[value] Assertion got status valid. +tests/constant_propagation/const_propagate.c:91:[value] Assertion got status unknown. +tests/constant_propagation/const_propagate.c:92:[value] Assertion got status valid. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function add3: + __retres ∈ [--..--] +[value] Values at end of function init: + x ∈ {5} + y ∈ {7} + z ∈ {12} + zero ∈ {0} + sept ∈ {7} + z1 ∈ {12} +[value] Values at end of function test_float_double: + f1 ∈ {0} + f2 ∈ {0} + f3 ∈ {1.} + d1 ∈ {0} + d2 ∈ {0} + d3 ∈ {1.} +[value] Values at end of function test_ptr: + x ∈ {7} + p ∈ {{ &x }} + s ∈ {{ &x + {1} }} + decal ∈ {1} + __retres ∈ {{ &x }} +[value] Values at end of function test_struct: + s1{.a; .b} ∈ {1} + s2{.a; .b} ∈ {1} + s.a ∈ {1} + .b ∈ {0} +[value] Values at end of function test_struct_ptr: + q ∈ {{ &s1.b }} + __retres ∈ {{ &s1.a }} +[value] Values at end of function test_tab: + TAB[0..3] ∈ {0} + [4][bits 0 to 15]# ∈ {13} repeated %8 + [4][bits 16 to 31]# ∈ {13}%32, bits 16 to 31 + [5][bits 0 to 7] ∈ {13} + [5][bits 8 to 31]# ∈ {13}%32, bits 8 to 31 + [6..9] ∈ {0} + s2.a ∈ {1} + .b ∈ {2} + r ∈ {{ &TAB[4] }} + q ∈ {{ (char *)&TAB[4] }} + decal ∈ {4} +[value] Values at end of function test_ull: + ull ∈ {18446744073709551615} +[value] Values at end of function main: + x ∈ {7} + y ∈ {7} + z ∈ [--..--] + TAB[0..3] ∈ {0} + [4][bits 0 to 15]# ∈ {13} repeated %8 + [4][bits 16 to 31]# ∈ {13}%32, bits 16 to 31 + [5][bits 0 to 7] ∈ {13} + [5][bits 8 to 31]# ∈ {13}%32, bits 8 to 31 + [6..9] ∈ {0} + s1{.a; .b} ∈ {1} + s2.a ∈ {1} + .b ∈ {2} + ull ∈ {18446744073709551615} + f1 ∈ {0} + f2 ∈ {0} + f3 ∈ {1.} + d1 ∈ {0} + d2 ∈ {0} + d3 ∈ {1.} + b ∈ {0} + p ∈ {{ &x }} + q ∈ {{ &x ; &y }} + yy ∈ {7} +[from] Computing for function add3 +[from] Done for function add3 +[from] Computing for function init +[from] Done for function init +[from] Computing for function test_float_double +[from] Done for function test_float_double +[from] Computing for function test_ptr +[from] Done for function test_ptr +[from] Computing for function test_struct +[from] Done for function test_struct +[from] Computing for function test_struct_ptr +[from] Done for function test_struct_ptr +[from] Computing for function test_tab +[from] Done for function test_tab +[from] Computing for function test_ull +[from] Done for function test_ull +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function add3: + \result FROM v1; v2; v3 +[from] Function init: + x FROM v + y FROM \nothing + z FROM v + \result FROM \nothing +[from] Function test_float_double: + f1 FROM f0 + f2 FROM f0 + f3 FROM f0 + d1 FROM d0 + d2 FROM d0 + d3 FROM d0 +[from] Function test_ptr: + x FROM v + \result FROM \nothing +[from] Function test_struct: + s1 FROM \nothing + s2 FROM \nothing +[from] Function test_struct_ptr: + \result FROM \nothing +[from] Function test_tab: + TAB[1] FROM TAB[2]; s1.b; s2.b + [4..5] FROM v + s2.b FROM s2.b +[from] Function test_ull: + ull FROM ull +[from] Function main: + x FROM \nothing + y FROM \nothing + z FROM a + TAB[1] FROM TAB[2] + [4..5] FROM \nothing + s1 FROM \nothing + s2 FROM \nothing + ull FROM ull + f1 FROM f0 + f2 FROM f0 + f3 FROM f0 + d1 FROM d0 + d2 FROM d0 + d3 FROM d0 +[from] ====== END OF DEPENDENCIES ====== +[scf] beginning constant propagation +/* Generated by Frama-C */ +struct st { + int a ; + int b ; +}; +typedef struct st ST; +int x; +int y; +int z; +int TAB[10]; +struct st s1; +struct st s2; +void test_struct(void) +{ + ST s; + s.a = 0; + s.b = 1; + s1 = s; + s1.a = 1; + s2.a = 1; + s.a = 1; + s2 = s; + s.b = 0; + return; +} + +void test_tab(int v) +{ + int *r; + char *q; + int decal; + { + /*sequence*/ + s2.b = 2; + TAB[1] = 0; + } + r = & TAB[4]; + TAB[4] = 13; + TAB[5] = 13; + q = (char *)(& TAB[4]); + *q = (char)13; + *(q + 1) = (char)13; + decal = 4; + *(q + 4) = (char)13; + return; +} + +int *test_ptr(int v) +{ + int *__retres; + int *p; + char *s; + int decal; + p = & x; + s = (char *)(& x); + *s = (char)7; + decal = 1; + *(s + 1) = (char)7; + s = (char *)(& x) + 1; + *s = (char)7; + x = 7; + __retres = & x; + return __retres; +} + +int *test_struct_ptr(void) +{ + int *__retres; + int *q; + q = & s1.b; + __retres = & s1.a; + return __retres; +} + +int add3(int v1, int v2, int v3) +{ + int __retres; + __retres = (v1 + v2) + 0; + return __retres; +} + +int init(int v) +{ + int zero; + int sept; + int z1; + zero = 0; + sept = 7; + x = 5; + y = 7; + z = add3(5,7,0); + z1 = 12; + return zero; +} + +unsigned long long ull; +void test_ull(void) +{ + ull = 18446744073709551615ULL; + return; +} + +float f0; +float f1; +float f2; +float f3; +double d0; +double d1; +double d2; +double d3; +void test_float_double(void) +{ + d1 = 0.; + d2 = 0.; + d3 = 1.; + f1 = 0.f; + f2 = 0.f; + f3 = 1.f; + return; +} + +void main(int a) +{ + int b; + int *p; + int *q; + int *tmp_1; + int yy; + test_ull(); + test_struct(); + test_struct_ptr(); + test_tab(13); + test_float_double(); + b = init(5); + z = add3(a,0,0); + p = test_ptr(7); + /*@ assert *p ≡ 7; */ ; + if (a) tmp_1 = & x; else tmp_1 = & y; + q = tmp_1; + yy = 7; + /*@ assert a ≡ 0 ⇒ q ≡ &y; */ ; + /*@ assert *q ≡ 7; */ ; + return; +} + + +[scf] constant propagation done +[inout] Out (internal) for function add3: + __retres +[inout] Inputs for function add3: + \nothing +[inout] Out (internal) for function init: + x; y; z; zero; sept; z1 +[inout] Inputs for function init: + x; y; z +[inout] Out (internal) for function test_float_double: + f1; f2; f3; d1; d2; d3 +[inout] Inputs for function test_float_double: + f0; f1; f2; d0; d1; d2 +[inout] Out (internal) for function test_ptr: + x; p; s; decal; __retres +[inout] Inputs for function test_ptr: + \nothing +[inout] Out (internal) for function test_struct: + s1; s2; s +[inout] Inputs for function test_struct: + s1.a +[inout] Out (internal) for function test_struct_ptr: + q; __retres +[inout] Inputs for function test_struct_ptr: + \nothing +[inout] Out (internal) for function test_tab: + TAB{[1]; [4..5]}; s2.b; r; q; decal +[inout] Inputs for function test_tab: + TAB[2]; s1.b; s2.b +[inout] Out (internal) for function test_ull: + ull +[inout] Inputs for function test_ull: + ull +[inout] Out (internal) for function main: + x; y; z; TAB{[1]; [4..5]}; s1; s2; ull; f1; f2; f3; d1; d2; d3; b; + p; q; tmp_1; yy +[inout] Inputs for function main: + x; y; z; TAB[2]; s1; s2.b; ull; f0; f1; f2; d0; d1; d2 diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/declaration2.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/declaration2.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/declaration2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/declaration2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,36 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/declaration2.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/constant_propagation/declaration2.c:9. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + Y ∈ {43} +[value] Values at end of function main: + Y ∈ {43} +[scf] beginning constant propagation +/* Generated by Frama-C */ +void f(int *x) +{ + *x = 43; + return; +} + +int main(void) +{ + int Y; + Y = 42; + f(& Y); + return Y; +} + + +[scf] constant propagation done diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/declaration.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/declaration.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/declaration.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/declaration.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,160 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/declaration.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ [--..--] + Y ∈ {-42} +[value] computing for function f <- main. + Called from tests/constant_propagation/declaration.c:27. +tests/constant_propagation/declaration.c:6:[kernel] warning: signed overflow. assert *x+1 ≤ 2147483647; +[value] computing for function h <- f <- main. + Called from tests/constant_propagation/declaration.c:8. +tests/constant_propagation/declaration.c:22:[kernel] warning: signed overflow. assert *x+2 ≤ 2147483647; +[value] Recording results for h +[value] Done for function h +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/constant_propagation/declaration.c:28. +tests/constant_propagation/declaration.c:12:[kernel] warning: signed overflow. assert *x+1 ≤ 2147483647; +[value] computing for function h <- g <- main. + Called from tests/constant_propagation/declaration.c:14. +[value] Recording results for h +[value] Done for function h +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function h: + X ∈ [-2147483645..2147483647] + Y ∈ {-36; -30} +[value] Values at end of function f: + X ∈ [-2147483645..2147483647] + Y ∈ {-36} +[value] Values at end of function g: + X ∈ [-2147483642..2147483647] + Y ∈ {-30} +[value] Values at end of function main: + X ∈ [-2147483642..2147483647] + Y ∈ {-30} +[scf] beginning constant propagation +/* Generated by Frama-C */ +void h(int *x, int *y); + +int Y; + +extern int X; + +void f(int *x, int *y, void (*p)(int *x, int *y)) +{ + /*@ assert Value: signed_overflow: *x+1 ≤ 2147483647; */ + X ++; + Y = -41; + h(& X,& Y); + return; +} + +void g(int *x, int *y, void (*p)(int *x, int *y)) +{ + /*@ assert Value: signed_overflow: *x+1 ≤ 2147483647; */ + X ++; + Y = -35; + h(& X,& Y); + return; +} + +int Y = -42; +void h(int *x, int *y) +{ + /*@ assert Value: signed_overflow: *x+2 ≤ 2147483647; */ + X += 2; + Y += 5; + return; +} + +int main(void) +{ + f(& X,& Y,& h); + g(& X,& Y,& h); + return Y; +} + + +[scf] constant propagation done +[scf] beginning constant propagation +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ [--..--] + Y ∈ {-42} +[value] computing for function f <- main. + Called from tests/constant_propagation/declaration.c:27. +tests/constant_propagation/declaration.c:6:[kernel] warning: signed overflow. assert X+1 ≤ 2147483647; +[value] computing for function h <- f <- main. + Called from tests/constant_propagation/declaration.c:8. +tests/constant_propagation/declaration.c:22:[kernel] warning: signed overflow. assert X+2 ≤ 2147483647; +[value] Recording results for h +[value] Done for function h +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/constant_propagation/declaration.c:28. +tests/constant_propagation/declaration.c:12:[kernel] warning: signed overflow. assert X+1 ≤ 2147483647; +[value] computing for function h <- g <- main. + Called from tests/constant_propagation/declaration.c:14. +[value] Recording results for h +[value] Done for function h +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +/* Generated by Frama-C */ +void h(int *x, int *y); + +int Y; + +extern int X; + +void f(int *x, int *y, void (*p)(int *x, int *y)) +{ + /*@ assert Value: signed_overflow: *x+1 ≤ 2147483647; */ + /*@ assert Value: signed_overflow: X+1 ≤ 2147483647; */ + X ++; + Y = -41; + h(& X,& Y); + return; +} + +void g(int *x, int *y, void (*p)(int *x, int *y)) +{ + /*@ assert Value: signed_overflow: *x+1 ≤ 2147483647; */ + /*@ assert Value: signed_overflow: X+1 ≤ 2147483647; */ + X ++; + Y = -35; + h(& X,& Y); + return; +} + +int Y = -42; +void h(int *x, int *y) +{ + /*@ assert Value: signed_overflow: *x+2 ≤ 2147483647; */ + /*@ assert Value: signed_overflow: X+2 ≤ 2147483647; */ + X += 2; + Y += 5; + return; +} + +int main(void) +{ + f(& X,& Y,& h); + g(& X,& Y,& h); + return Y; +} + + +[scf] constant propagation done, result is in project `propagated 2` diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/fct_ptr.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/fct_ptr.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/fct_ptr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/fct_ptr.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/fct_ptr.i (no preprocessing) +[scf] beginning constant propagation +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + pf ∈ {0} +[value] computing for function g <- main. + Called from tests/constant_propagation/fct_ptr.i:15. +[value] computing for function f <- g <- main. + Called from tests/constant_propagation/fct_ptr.i:8. +tests/constant_propagation/fct_ptr.i:8:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] using specification for function f +[value] Done for function f +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +/* Generated by Frama-C */ +void (*pf)(void); +/*@ assigns \nothing; */ +extern void f(void); + +void g(void) +{ + f(); + return; +} + +int main(void) +{ + int __retres; + pf = & f; + g(); + __retres = 0; + return __retres; +} + + +[scf] constant propagation done diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/introduction_of_non_explicit_cast.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/introduction_of_non_explicit_cast.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/introduction_of_non_explicit_cast.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/introduction_of_non_explicit_cast.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,226 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/introduction_of_non_explicit_cast.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + z ∈ {0} + TAB[0..9] ∈ {0} + s1 ∈ {0} + s2 ∈ {0} + ull ∈ {0} +[value] computing for function test_ull <- main. + Called from tests/constant_propagation/introduction_of_non_explicit_cast.c:68. +[value] Recording results for test_ull +[value] Done for function test_ull +[value] computing for function test_struct <- main. + Called from tests/constant_propagation/introduction_of_non_explicit_cast.c:69. +[value] Recording results for test_struct +[value] Done for function test_struct +[value] computing for function test_struct_ptr <- main. + Called from tests/constant_propagation/introduction_of_non_explicit_cast.c:70. +[value] Recording results for test_struct_ptr +[value] Done for function test_struct_ptr +[value] computing for function test_tab <- main. + Called from tests/constant_propagation/introduction_of_non_explicit_cast.c:71. +[value] Recording results for test_tab +[value] Done for function test_tab +[value] computing for function init <- main. + Called from tests/constant_propagation/introduction_of_non_explicit_cast.c:73. +[value] computing for function add3 <- init <- main. + Called from tests/constant_propagation/introduction_of_non_explicit_cast.c:57. +[value] Recording results for add3 +[value] Done for function add3 +[value] Recording results for init +[value] Done for function init +[value] computing for function add3 <- main. + Called from tests/constant_propagation/introduction_of_non_explicit_cast.c:74. +[value] Recording results for add3 +[value] Done for function add3 +[value] computing for function test_ptr <- main. + Called from tests/constant_propagation/introduction_of_non_explicit_cast.c:76. +[value] Recording results for test_ptr +[value] Done for function test_ptr +tests/constant_propagation/introduction_of_non_explicit_cast.c:77:[value] Assertion got status valid. +tests/constant_propagation/introduction_of_non_explicit_cast.c:80:[value] Assertion got status unknown. +tests/constant_propagation/introduction_of_non_explicit_cast.c:81:[value] Assertion got status valid. +[value] Recording results for main +[value] done for function main +[from] Computing for function add3 +[from] Done for function add3 +[from] Computing for function init +[from] Done for function init +[from] Computing for function test_ptr +[from] Done for function test_ptr +[from] Computing for function test_struct +[from] Done for function test_struct +[from] Computing for function test_struct_ptr +[from] Done for function test_struct_ptr +[from] Computing for function test_tab +[from] Done for function test_tab +[from] Computing for function test_ull +[from] Done for function test_ull +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function add3: + \result FROM v1; v2; v3 +[from] Function init: + x FROM v + y FROM \nothing + z FROM v + \result FROM \nothing +[from] Function test_ptr: + x FROM v + \result FROM \nothing +[from] Function test_struct: + s1 FROM \nothing + s2 FROM \nothing +[from] Function test_struct_ptr: + \result FROM \nothing +[from] Function test_tab: + TAB[1] FROM TAB[2]; s1.b; s2.b + [4..5] FROM v + s2.b FROM s2.b +[from] Function test_ull: + ull FROM ull +[from] Function main: + x FROM \nothing + y FROM \nothing + z FROM a + TAB[1] FROM TAB[2] + [4..5] FROM \nothing + s1 FROM \nothing + s2 FROM \nothing + ull FROM ull +[from] ====== END OF DEPENDENCIES ====== +After Constant propagation : +/* Generated by Frama-C */ +struct st { + int a ; + int b ; +}; +typedef struct st ST; +int x; +int y; +int z; +int TAB[10]; +struct st s1; +struct st s2; +void test_struct(void) +{ + ST s; + s.a = 0; + s.b = 1; + s1 = s; + s1.a = 1; + s2.a = 1; + s.a = 1; + s2 = s; + s.b = 0; + return; +} + +void test_tab(int v) +{ + int *r; + char *q; + int decal; + { + /*sequence*/ + s2.b = 2; + TAB[1] = 0; + } + r = & TAB[4]; + TAB[4] = 13; + TAB[5] = 13; + q = (char *)(& TAB[4]); + *((char *)(& TAB[4])) = (char)13; + *((char *)(& TAB[4]) + 1) = (char)13; + decal = 4; + *((char *)(& TAB[5])) = (char)13; + return; +} + +int *test_ptr(int v) +{ + int *__retres; + int *p; + char *s; + int decal; + p = & x; + s = (char *)(& x); + *((char *)(& x)) = (char)7; + decal = 1; + *((char *)(& x) + 1) = (char)7; + s = (char *)(& x) + 1; + *((char *)(& x) + 1) = (char)7; + x = 7; + __retres = & x; + return __retres; +} + +int *test_struct_ptr(void) +{ + int *__retres; + int *q; + q = & s1.b; + __retres = & s1.a; + return __retres; +} + +int add3(int v1, int v2, int v3) +{ + int __retres; + __retres = (v1 + v2) + 0; + return __retres; +} + +int init(int v) +{ + int zero; + int sept; + int z1; + zero = 0; + sept = 7; + x = 5; + y = 7; + z = add3(5,7,0); + z1 = 12; + return zero; +} + +unsigned long long ull; +void test_ull(void) +{ + ull = 18446744073709551615ULL; + return; +} + +void main(int a) +{ + int b; + int *p; + int *q; + int *tmp_1; + int yy; + test_ull(); + test_struct(); + test_struct_ptr(); + test_tab(13); + b = init(5); + z = add3(a,0,0); + p = test_ptr(7); + /*@ assert *p ≡ 7; */ ; + if (a) tmp_1 = & x; else tmp_1 = & y; + q = tmp_1; + yy = 7; + /*@ assert a ≡ 0 ⇒ q ≡ &y; */ ; + /*@ assert *q ≡ 7; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/struct_field.res.oracle frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/struct_field.res.oracle --- frama-c-20140301+neon+dfsg/tests/constant_propagation/oracle/struct_field.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/oracle/struct_field.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,69 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/constant_propagation/struct_field.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ {0} + v ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + p1 ∈ {{ &S.f0 }} + p2 ∈ {{ &S.f1[0] }} + p6 ∈ {{ &S.f1[4] }} + pp ∈ {{ &p6 }} + p11 ∈ {{ &S.f2[0].u1 }} + p14 ∈ {{ &S.f2[1].u2.b }} + p ∈ {{ &v.f2.c4 }} +[scf] beginning constant propagation +/* Generated by Frama-C */ +struct st { + int a ; + int b ; +}; +union u { + int u1 ; + struct st u2 ; +}; +struct __anonstruct_S_1 { + int f0 ; + int f1[9] ; + union u f2[3] ; +}; +struct s1 { + char c1 ; + int c2 ; +}; +struct s2 { + int c3 ; + char c4 ; +}; +union v { + struct s1 f1 ; + struct s2 f2 ; +}; +struct __anonstruct_S_1 S; +union v v; +void main(void) +{ + int *p1; + int *p2; + int *p6; + int **pp; + int *p11; + int *p14; + char *p; + p1 = & S.f0; + p2 = & S.f1[0]; + p6 = & S.f1[4]; + pp = & p6; + p11 = & S.f2[0].u1; + p14 = & S.f2[1].u2.b; + p = & v.f2.c4; + return; +} + + +[scf] constant propagation done diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/struct_field.i frama-c-20150201+sodium+dfsg/tests/constant_propagation/struct_field.i --- frama-c-20140301+neon+dfsg/tests/constant_propagation/struct_field.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/struct_field.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,46 @@ +/* run.config + OPT: -val -semantic-const-folding -journal-disable +*/ + +struct st { + int a, b; +} ; + +union u { + int u1; + struct st u2; +} ; + +struct { + int f0; + int f1[9]; + union u f2[3]; +} S; + +/* specific test for union */ +struct s1 { + char c1; + int c2; +}; + +struct s2 { + int c3; + char c4; +}; + +union v { + struct s1 f1; + struct s2 f2; +}; + +union v v; + +void main() { + int *p1 = &S; + int *p2 = p1 + 1; + int *p6 = p2 + 4; + int **pp = &p6; + int *p11 = *pp+5; + int *p14 = p11+3; + char *p = (char *) &v + 4; +} diff -Nru frama-c-20140301+neon+dfsg/tests/constant_propagation/test_config frama-c-20150201+sodium+dfsg/tests/constant_propagation/test_config --- frama-c-20140301+neon+dfsg/tests/constant_propagation/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/constant_propagation/test_config 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1 @@ +CMD: FRAMAC_PLUGIN=tests/.empty @frama-c@ \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/tests/demo_cpt/demo_cpt.txt frama-c-20150201+sodium+dfsg/tests/demo_cpt/demo_cpt.txt --- frama-c-20140301+neon+dfsg/tests/demo_cpt/demo_cpt.txt 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/demo_cpt/demo_cpt.txt 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,5 @@ +- slicing sur c->balance la fin + -> garde increase_size uniquement si on teste sa valeur de retour. + (dans add_operation_to_account) +- sparecode s'il manque l'utilisation de ok +- diff -Nru frama-c-20140301+neon+dfsg/tests/dynamic/directory_path/README frama-c-20150201+sodium+dfsg/tests/dynamic/directory_path/README --- frama-c-20140301+neon+dfsg/tests/dynamic/directory_path/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/dynamic/directory_path/README 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1 @@ +DO NOT DELETE THIS DIRECTORY: use for testing dynamic loading. diff -Nru frama-c-20140301+neon+dfsg/tests/dynamic/oracle/dynamic.res.oracle frama-c-20150201+sodium+dfsg/tests/dynamic/oracle/dynamic.res.oracle --- frama-c-20140301+neon+dfsg/tests/dynamic/oracle/dynamic.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/dynamic/oracle/dynamic.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] warning: cannot search dynamic plugins inside directory `tests/dynamic/file_path' (Not a directory). +[kernel] warning: cannot search dynamic plugins inside directory `tests/dynamic/none' (No such file or directory). +Use f_test 3 4 +Use g_test 3 +[kernel] warning: cannot load plug-in `A' (plug-in not found). +succ=5 +1.050000 +n=1 +v1=2 +params = 1 1.050000 +b1=true +params = 2 1.050000 +b2=false +print: +ppu 3.000000 +A.ho has type (int -> int) -> A.t -> A.u but is used with type (A.t -> int) -> A.t -> A.u +ppu 1.050000 +ppu 1.000000 +ppu 1.000000 +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/dynamic/dynamic.i (no preprocessing) +Use g_test 41 +Use f_test 40 41 +Use g_test 40 +Use f_test 39 40 +Use g_test 39 +[apply] Register_mod2.g_test has type int -> int but is used with type int -> char list -> string * float -> unit +[apply] value "Register_mod2.unknown" not registered +[kernel] warning: cannot load plug-in `AA' (plug-in not found). diff -Nru frama-c-20140301+neon+dfsg/tests/dynamic/README frama-c-20150201+sodium+dfsg/tests/dynamic/README --- frama-c-20140301+neon+dfsg/tests/dynamic/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/dynamic/README 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,30 @@ +This file is an empty file in order to test dynamic plugin engine. +For this purpose, we test four part in this engine: +I. Test path loading engine +II. Test file loading engine +III. Test registering engine +IV. Test dynamic command line engine + +I. Test path loading engine + In the dynamic plugin engine, we can add a path to load modules, but this + path must be a directory path.So we tempt to add a file path and a unknown + path in order to raise errors. We tempt to add a directory path to check if + the engine runs. + +II. Test file loading engine + If the path loading engine pass tests, we will make sure that only file with + extension .cmo and .cmi are loaded by the engine. So we tempt to load files + ".cm[oi]" and ".cm[oi]". I propose to test with empty + file to prevent Dynlink error. + Warning: with toplevel, loaded files are only .cm[oi] without _gui.cm[oi] + files + +III. Test registering engine + In this part, we try to register some functions with dynamic engine and + to apply them. For this purpose, we test with a mutual recursive function + separated in two files. This test is also an example of how to write a good + dynamic plugin. + +IV. Test dynamic command line engine + Similar to the previous part but in this case we test command line + registering engine. diff -Nru frama-c-20140301+neon+dfsg/tests/dynamic/test_config frama-c-20150201+sodium+dfsg/tests/dynamic/test_config --- frama-c-20140301+neon+dfsg/tests/dynamic/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/dynamic/test_config 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,3 @@ +COMMENT: Prepare all tests and set command +EXECNOW: make -s tests/dynamic/all +CMD: FRAMAC_PLUGIN=tests/dynamic bin/toplevel.byte diff -Nru frama-c-20140301+neon+dfsg/tests/float/builtins.c frama-c-20150201+sodium+dfsg/tests/float/builtins.c --- frama-c-20140301+neon+dfsg/tests/float/builtins.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/builtins.c 2015-05-29 15:31:43.000000000 +0000 @@ -1,10 +1,114 @@ -#include +/* run.config + OPT: -val -then -main main_log_exp -then -all-rounding-modes +*/ -float f; -double d; +#include -int main(int c, char **v) +void main(int c, char **v) { + float f; + double d; f = Frama_C_float_interval(-1.0, 1.0); d = Frama_C_double_interval(-1.0, 1.0); } + +/*@ assigns \result \from d; */ +double Frama_C_log(double d); +/*@ assigns \result \from d; */ +double Frama_C_log10(double d); +/*@ assigns \result \from d; */ +double Frama_C_exp(double d); + +/*@ requires \is_finite(d); + requires d > 0.; + ensures \is_finite(d); */ +double log(double d) { + return Frama_C_log(d); +} + +/*@ requires \is_finite(d); + requires d > 0.; + ensures \is_finite(d); */ +double log10(double d) { + return Frama_C_log10(d); +} + +/*@ requires \is_finite(d); + requires d <= 0x1.62e42fefa39efp9; // log(DBL_MAX) + ensures \is_finite(d); +*/ +double exp(double d) { + return Frama_C_exp(d); +} + +volatile v; + +void main_log_exp(double d) { + double l1, l2, l3, l4, l5, l6, l7, l8; + double m1, m2, m3, m4, m5, m6; + double e1, e2, e3, e4, e5, e6; + if (v) { + l1 = log(1); + m1 = log10(1.); + } + if (v) { + l2 = log(2.72); + m2 = log10(10.); + } + if (v) { + l3 = log(3.); + m3 = log10(20.); + } + if (v) { + //@ assert 10 <= d <= 100; + l4 = log(d); + } + if (v) { + //@ assert 10 <= d <= 101; + m4 = log10(d); + } + if (v) { // Spurious warning in -all-rounding-modes, because the reduction + // to >0. is transformed in >=0. + l5 = log(d); + } + if (v) { + m5 = log10(d); // Same + } + if (v) { + l6 = log(-1); + } + if (v) { + m6 = log10(-1); + } + + if (v) { + e1 = exp(0.); + } + if (v) { + e2 = exp(-0x1.fffffffffffffp+1023); + } + if (v) { + e3 = exp(100); + } + if (v) { + //@ assert 100 <= d <= 1000; + e4 = exp(d); + } + if (v) { + e5 = exp(1000); + } + if (v) { + double max1 = 0x1.62e42fefa39efp9; + double max2 = log(0x1.fffffffffffffp+1023); + //@ assert max1 == max2; + e6 = Frama_C_exp(0x1.62e42fefa39efp9); + } + if (v) { + l7 = log((double)(int)&d); + } + if (v) { + int x; + l8 = log(x); // indeterminate caught by Value before call, AND verified by + // builtin + } +} diff -Nru frama-c-20140301+neon+dfsg/tests/float/cond.c frama-c-20150201+sodium+dfsg/tests/float/cond.c --- frama-c-20140301+neon+dfsg/tests/float/cond.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/cond.c 2015-05-29 15:31:43.000000000 +0000 @@ -1,5 +1,5 @@ /* run.config - OPT: -val -cpp-command "gcc -C -E -I. " share/builtin.c -journal-disable -float-hex + OPT: -val share/builtin.c -journal-disable -float-hex */ #include "share/builtin.h" diff -Nru frama-c-20140301+neon+dfsg/tests/float/conv.i frama-c-20150201+sodium+dfsg/tests/float/conv.i --- frama-c-20140301+neon+dfsg/tests/float/conv.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/conv.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,107 @@ +/* run.config + STDOPT: +"-big-ints-hex 65536" +*/ + +float f; +double d; + +volatile v; + +// Conversion from binary integer representation to float +void main1() { + int i; + + i = 0; + Frama_C_show_each(*(float *)&i+0); + + i = 1; + Frama_C_show_each(*(float *)&i+0); + + i = v ? 100 : 10000000000; + f = *(float *)&i+0; + Frama_C_show_each(f); + i = *(int *)&f; + //@ assert *(int *)&f == i; + + i = 0x7F7FFFFF; + f = *(float *)&i+0; + Frama_C_show_each(f); + //@ assert *(int *)&f == i; + + i += 1; + f = *(float *)&i+0; // fails + Frama_C_show_each(f); + + i = 0xff7fffff; + f = *(float *)&i+0; + Frama_C_show_each(f); + //@ assert *(int *)&f == i; + + i ++ ; + f = *(float *)&i+0; // fails + Frama_C_show_each(f); + + i = v ? 1 : (-0x7FFFFFFF-1); // ok + Frama_C_show_each(*(float *)&i+0); + + i = v; + //@ assert -10 <= i <= -1; // fails + Frama_C_show_each(*(float *)&i+0); + + i = v ? 0 : 0x7FFFFFFF; // problem with 0x7FFFFFFF + Frama_C_show_each(*(float *)&i+0); + + unsigned int ui = 0xFFFFFFFF; + Frama_C_show_each(*(float *)&ui+0); +} + +// Conversion from binary integer representation to double +void main2() { + long long i; + + i = 0; + Frama_C_show_each(*(double *)&i+0); + + i = 1; + Frama_C_show_each(*(double *)&i+0); + + i = v ? 100 : 7000000000000000000LL; + Frama_C_show_each(*(double *)&i+0); + + i = 0x7fefffffffffffff; + d = *(double *)&i+0; + Frama_C_show_each(d); + //@ assert *(long long*)&d == i; + + i ++; + Frama_C_show_each(*(double *)&i+0); // fails + + i = -1; + Frama_C_show_each(*(double *)&i+0); // fails + + i = 0xffefffffffffffff; + d = *(double *)&i+0; + Frama_C_show_each(d); + //@ assert *(long long*)&d == i; + + i ++; + Frama_C_show_each(*(double *)&i+0); // fails + + i = v ? 1 : (-0xffffffffffffffff-1); + Frama_C_show_each(*(double *)&i+0); + + i = v; + //@ assert -10 <= i <= -1; + Frama_C_show_each(*(double *)&i+0); // fails + + i = v ? 0 : -1; // problem with -1 + Frama_C_show_each(*(double *)&i+0); + + unsigned long long ui = 0xFFFFFFFFFFFFFFFF; + Frama_C_show_each(*(double *)&ui+0); +} + +void main() { + main1(); + main2(); +} diff -Nru frama-c-20140301+neon+dfsg/tests/float/nonlin.c frama-c-20150201+sodium+dfsg/tests/float/nonlin.c --- frama-c-20140301+neon+dfsg/tests/float/nonlin.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/nonlin.c 2015-05-29 15:31:43.000000000 +0000 @@ -1,8 +1,8 @@ /* run.config - OPT: -slevel 30 -val -cpp-command "gcc -C -E -DFLOAT=double -I. " share/builtin.c -float-hex -journal-disable -subdivide-float-var 0 - OPT: -slevel 30 -val -cpp-command "gcc -C -E -DFLOAT=double -I. " share/builtin.c -float-hex -journal-disable -subdivide-float-var 10 - OPT: -slevel 30 -val -cpp-command "gcc -C -E -DFLOAT=float -I. " share/builtin.c -float-hex -journal-disable -subdivide-float-var 0 - OPT: -slevel 30 -val -cpp-command "gcc -C -E -DFLOAT=float -I. " share/builtin.c -float-hex -journal-disable -subdivide-float-var 10 + OPT: -slevel 30 -val -cpp-extra-args="-DFLOAT=double" share/builtin.c -float-hex -journal-disable -subdivide-float-var 0 + OPT: -slevel 30 -val -cpp-extra-args="-DFLOAT=double" share/builtin.c -float-hex -journal-disable -subdivide-float-var 10 + OPT: -slevel 30 -val -cpp-extra-args="-DFLOAT=float" share/builtin.c -float-hex -journal-disable -subdivide-float-var 0 + OPT: -slevel 30 -val -cpp-extra-args="-DFLOAT=float" share/builtin.c -float-hex -journal-disable -subdivide-float-var 10 */ #include "share/builtin.h" diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/absorb.1.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/absorb.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/absorb.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/absorb.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,77 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/absorb.c (with preprocessing) +tests/float/absorb.c:15:[kernel] warning: Floating-point constant 1e-286 is not represented exactly. Will use 0x1.e74404f3daadbp-951. See documentation for option -warn-decimal-float +[kernel] Parsing share/builtin.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ {0} + x ∈ {0x1.0000000000000p0} + y ∈ {0} + z ∈ {0} + t ∈ {0} + min_f ∈ {0} + min_fl ∈ {0} + den ∈ {0} +[value] computing for function Frama_C_interval <- main. + Called from tests/float/absorb.c:13. +share/builtin.h:46:[value] Function Frama_C_interval: precondition got status valid. +[value] computing for function Frama_C_update_entropy <- Frama_C_interval <- main. + Called from share/builtin.c:44. +[value] using specification for function Frama_C_update_entropy +[value] Done for function Frama_C_update_entropy +share/builtin.h:47:[value] Function Frama_C_interval: postcondition got status valid. +[value] Recording results for Frama_C_interval +[value] Done for function Frama_C_interval +tests/float/absorb.c:16:[value] entering loop for the first time +tests/float/absorb.c:18:[kernel] warning: non-finite float value ([0x1.0000000000000p0 .. 0x1.fffffe0000001p127]): + assert \is_finite((float)((double)((double)x+1E-286))); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function Frama_C_interval: + Frama_C_entropy_source ∈ [--..--] + r ∈ [-2000000001..2000000001] + aux ∈ [--..--] +[value] Values at end of function main: + Frama_C_entropy_source ∈ [--..--] + x ∈ [0x1.0000000000000p0 .. 0x1.fffffe0000000p127] + y ∈ [0x1.0000000000000p0 .. 0x1.fffffe0000000p127] + z ∈ [0x0.0000000000000p-1022 .. 0x1.0000000000000p-149] + t ∈ [-0x1.bc16d80000000p61 .. 0x1.bc16d80000000p61] + min_f ∈ [0x1.0000000000000p-126 .. 0x1.0000020000000p-126] + min_fl ∈ [-0x1.0000000000000p-126 .. -0x1.fffffc0000000p-127] + den ∈ [0x1.0000000000000p-133 .. 0x1.0001000000000p-133] + b ∈ [-4000000004000000001..4000000004000000001] +[from] Computing for function Frama_C_interval +[from] Computing for function Frama_C_update_entropy <-Frama_C_interval +[from] Done for function Frama_C_update_entropy +[from] Done for function Frama_C_interval +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function Frama_C_update_entropy: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) +[from] Function Frama_C_interval: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) + \result FROM Frama_C_entropy_source; min; max +[from] Function main: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) + x FROM x; y (and SELF) + y FROM x; y (and SELF) + z FROM y + t FROM Frama_C_entropy_source + min_f FROM \nothing + min_fl FROM \nothing + den FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function Frama_C_interval: + Frama_C_entropy_source; r; aux +[inout] Inputs for function Frama_C_interval: + Frama_C_entropy_source +[inout] Out (internal) for function main: + Frama_C_entropy_source; x; y; z; t; min_f; min_fl; den; b +[inout] Inputs for function main: + Frama_C_entropy_source; x; y; min_f diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/absorb.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/absorb.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/absorb.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/absorb.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] warning: ignoring source files specified on the command line while loading a global initial context. +[from] Computing for function Frama_C_interval +[from] Computing for function Frama_C_update_entropy <-Frama_C_interval +[from] Done for function Frama_C_update_entropy +[from] Done for function Frama_C_interval +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function Frama_C_update_entropy: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) +[from] Function Frama_C_interval: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) + \result FROM Frama_C_entropy_source; min; max +[from] Function main: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) + x FROM x; y (and SELF) + y FROM x; y (and SELF) + z FROM y + t FROM Frama_C_entropy_source + min_f FROM \nothing + min_fl FROM \nothing + den FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function Frama_C_interval: + Frama_C_entropy_source; r; aux +[inout] Inputs for function Frama_C_interval: + Frama_C_entropy_source +[inout] Out (internal) for function main: + Frama_C_entropy_source; x; y; z; t; min_f; min_fl; den; b +[inout] Inputs for function main: + Frama_C_entropy_source; x; y; min_f diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/absorb_sav2.res frama-c-20150201+sodium+dfsg/tests/float/oracle/absorb_sav2.res --- frama-c-20140301+neon+dfsg/tests/float/oracle/absorb_sav2.res 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/absorb_sav2.res 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,40 @@ +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ {0} + x ∈ {0x1.0000000000000p0} + y ∈ {0} + z ∈ {0} + t ∈ {0} + min_f ∈ {0} + min_fl ∈ {0} + den ∈ {0} +[value] computing for function Frama_C_interval <- main. + Called from tests/float/absorb.c:13. +share/builtin.h:46:[value] Function Frama_C_interval: precondition got status valid. +[value] computing for function Frama_C_update_entropy <- Frama_C_interval <- main. + Called from share/builtin.c:44. +[value] using specification for function Frama_C_update_entropy +[value] Done for function Frama_C_update_entropy +share/builtin.h:47:[value] Function Frama_C_interval: postcondition got status valid. +[value] Recording results for Frama_C_interval +[value] Done for function Frama_C_interval +tests/float/absorb.c:16:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function Frama_C_interval: + Frama_C_entropy_source ∈ [--..--] + r ∈ [-2000000001..2000000001] + aux ∈ [--..--] +[value] Values at end of function main: + Frama_C_entropy_source ∈ [--..--] + x ∈ {0x1.0000000000000p0} + y ∈ {0x1.0000000000000p0} + z ∈ {0} + t ∈ [-0x1.bc16d60000000p61 .. 0x1.bc16d60000000p61] + min_f ∈ {0x1.0000000000000p-126} + min_fl ∈ {-0x1.0000000000000p-126} + den ∈ {0x1.0000000000000p-133} + b ∈ [-4000000004000000001..4000000004000000001] diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/absorb_sav.res frama-c-20150201+sodium+dfsg/tests/float/oracle/absorb_sav.res --- frama-c-20140301+neon+dfsg/tests/float/oracle/absorb_sav.res 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/absorb_sav.res 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,4 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing share/builtin.c (with preprocessing) +[kernel] Parsing tests/float/absorb.c (with preprocessing) +tests/float/absorb.c:15:[kernel] warning: Floating-point constant 1e-286 is not represented exactly. Will use 0x1.e74404f3daadbp-951. See documentation for option -warn-decimal-float diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/alarms.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/alarms.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/alarms.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/alarms.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,91 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/alarms.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + u1 ∈ {0} + u2 ∈ {0} + f ∈ {0} + d ∈ {0} + big ∈ {0} + ull ∈ {0} +tests/float/alarms.i:9:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(u1.f); +tests/float/alarms.i:11:[kernel] warning: non-finite double value ([--..--]): assert \is_finite(u2.d); +[value] DUMPING STATE of file tests/float/alarms.i line 12 + u1{.l[bits 0 to 31]; .f; .d[bits 0 to 31]} ∈ + [-3.40282346639e+38 .. 3.40282346639e+38] + {.l[bits 32 to 63]; .f[bits 32 to 63]; .d[bits 32 to 63]} ∈ [--..--] + u2{.l; .f[bits 0 to 63]; .d} ∈ [-1.79769313486e+308 .. 1.79769313486e+308] + f ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + d ∈ [-1.79769313486e+308 .. 1.79769313486e+308] + big ∈ {0} + ull ∈ {0} + l ∈ [--..--] + =END OF DUMP== +[value] computing for function fd <- main. + Called from tests/float/alarms.i:14. +tests/float/alarms.i:14:[kernel] warning: Neither code nor specification for function fd, generating default assigns from the prototype +[value] using specification for function fd +[value] Done for function fd +tests/float/alarms.i:14:[kernel] warning: non-finite double value ([--..--]): assert \is_finite(tmp); + (tmp from fd()) +tests/float/alarms.i:14:[kernel] warning: non-finite float value ([-1.79769313486e+308 .. 1.79769313486e+308]): + assert \is_finite((float)tmp); + (tmp from fd()) +[value] computing for function fd <- main. + Called from tests/float/alarms.i:15. +[value] Done for function fd +tests/float/alarms.i:16:[kernel] warning: non-finite double value ([--..--]): assert \is_finite(vd); +tests/float/alarms.i:16:[kernel] warning: overflow in conversion of vd ([-1.79769313486e+308 .. 1.79769313486e+308]) + from floating-point to integer. + assert -9223372036854775809 < vd < 9223372036854775808; +tests/float/alarms.i:17:[kernel] warning: overflow in conversion of vf ([-3.40282346639e+38 .. 3.40282346639e+38]) from + floating-point to integer. + assert -9223372036854775809 < vf < 9223372036854775808; +[value] computing for function fd <- main. + Called from tests/float/alarms.i:18. +[value] Done for function fd +tests/float/alarms.i:19:[kernel] warning: non-finite double value ([--..--]): assert \is_finite(vd); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + u1{.l[bits 0 to 31]; .f; .d[bits 0 to 31]} ∈ + [-3.40282346639e+38 .. 3.40282346639e+38] + {.l[bits 32 to 63]; .f[bits 32 to 63]; .d[bits 32 to 63]} ∈ [--..--] + u2{.l; .f[bits 0 to 63]; .d} ∈ + [-1.79769313486e+308 .. 1.79769313486e+308] + f ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + d ∈ [-1.79769313486e+308 .. 1.79769313486e+308] + big ∈ {1.38350580553e+19} + ull ∈ {13835058055282163712} + vf ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + vd ∈ [-1.79769313486e+308 .. 1.79769313486e+308] + i ∈ [--..--] + j ∈ [--..--] + mvd ∈ [-4.49423283716e+307 .. 4.49423283716e+307] + __retres ∈ {0} +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Computing for function fd <-main +[from] Done for function fd +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function fd: + \result FROM \nothing +[from] Function main: + u1 FROM l + u2 FROM l + f FROM l + d FROM l + big FROM \nothing + ull FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + u1; u2; f; d; big; ull; vf; tmp; vd; i; j; mvd; __retres +[inout] Inputs for function main: + u1{.l[bits 0 to 31]; .f; .d[bits 0 to 31]}; u2; big diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/builtins.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/builtins.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/builtins.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/builtins.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,298 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/builtins.c (with preprocessing) +tests/float/builtins.c:55:[kernel] warning: Floating-point constant 2.72 is not represented exactly. Will use 0x1.5c28f5c28f5c3p1. See documentation for option -warn-decimal-float +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ [--..--] + v ∈ [--..--] +[value] computing for function Frama_C_float_interval <- main. + Called from tests/float/builtins.c:11. +[value] using specification for function Frama_C_float_interval +[value] Done for function Frama_C_float_interval +[value] computing for function Frama_C_double_interval <- main. + Called from tests/float/builtins.c:12. +[value] using specification for function Frama_C_double_interval +[value] Done for function Frama_C_double_interval +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + Frama_C_entropy_source ∈ [--..--] + f ∈ [-1. .. 1.] + d ∈ [-1. .. 1.] +[value] Analyzing a complete application starting at main_log_exp +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ [--..--] + v ∈ [--..--] +[value] computing for function log <- main_log_exp. + Called from tests/float/builtins.c:51. +tests/float/builtins.c:22:[value] Function log: precondition got status valid. +tests/float/builtins.c:23:[value] Function log: precondition got status valid. +tests/float/builtins.c:24:[value] Function log: postcondition got status valid. +[value] Recording results for log +[value] Done for function log +[value] computing for function log10 <- main_log_exp. + Called from tests/float/builtins.c:52. +tests/float/builtins.c:29:[value] Function log10: precondition got status valid. +tests/float/builtins.c:30:[value] Function log10: precondition got status valid. +tests/float/builtins.c:31:[value] Function log10: postcondition got status valid. +[value] Recording results for log10 +[value] Done for function log10 +[value] computing for function log <- main_log_exp. + Called from tests/float/builtins.c:55. +[value] Recording results for log +[value] Done for function log +[value] computing for function log10 <- main_log_exp. + Called from tests/float/builtins.c:56. +[value] Recording results for log10 +[value] Done for function log10 +[value] computing for function log <- main_log_exp. + Called from tests/float/builtins.c:59. +[value] Recording results for log +[value] Done for function log +[value] computing for function log10 <- main_log_exp. + Called from tests/float/builtins.c:60. +[value] Recording results for log10 +[value] Done for function log10 +tests/float/builtins.c:63:[value] Assertion got status unknown. +[value] computing for function log <- main_log_exp. + Called from tests/float/builtins.c:64. +[value] Recording results for log +[value] Done for function log +tests/float/builtins.c:67:[value] Assertion got status unknown. +[value] computing for function log10 <- main_log_exp. + Called from tests/float/builtins.c:68. +[value] Recording results for log10 +[value] Done for function log10 +[value] computing for function log <- main_log_exp. + Called from tests/float/builtins.c:72. +tests/float/builtins.c:23:[value] Function log: precondition got status unknown. +[value] Recording results for log +[value] Done for function log +[value] computing for function log10 <- main_log_exp. + Called from tests/float/builtins.c:75. +tests/float/builtins.c:30:[value] Function log10: precondition got status unknown. +[value] Recording results for log10 +[value] Done for function log10 +[value] computing for function log <- main_log_exp. + Called from tests/float/builtins.c:78. +tests/float/builtins.c:23:[value] Function log: precondition got status invalid. +tests/float/builtins.c:24:[value] Function log: no state left in which to evaluate postcondition, status not computed. +[value] Recording results for log +[value] Done for function log +[value] computing for function log10 <- main_log_exp. + Called from tests/float/builtins.c:81. +tests/float/builtins.c:30:[value] Function log10: precondition got status invalid. +tests/float/builtins.c:31:[value] Function log10: no state left in which to evaluate postcondition, status not computed. +[value] Recording results for log10 +[value] Done for function log10 +[value] computing for function exp <- main_log_exp. + Called from tests/float/builtins.c:85. +tests/float/builtins.c:36:[value] Function exp: precondition got status valid. +tests/float/builtins.c:37:[value] Function exp: precondition got status valid. +tests/float/builtins.c:38:[value] Function exp: postcondition got status valid. +[value] Recording results for exp +[value] Done for function exp +[value] computing for function exp <- main_log_exp. + Called from tests/float/builtins.c:88. +[value] Recording results for exp +[value] Done for function exp +[value] computing for function exp <- main_log_exp. + Called from tests/float/builtins.c:91. +[value] Recording results for exp +[value] Done for function exp +tests/float/builtins.c:94:[value] Assertion got status unknown. +[value] computing for function exp <- main_log_exp. + Called from tests/float/builtins.c:95. +tests/float/builtins.c:37:[value] Function exp: precondition got status unknown. +[value] Recording results for exp +[value] Done for function exp +[value] computing for function exp <- main_log_exp. + Called from tests/float/builtins.c:98. +tests/float/builtins.c:37:[value] Function exp: precondition got status invalid. +tests/float/builtins.c:38:[value] Function exp: no state left in which to evaluate postcondition, status not computed. +[value] Recording results for exp +[value] Done for function exp +[value] computing for function log <- main_log_exp. + Called from tests/float/builtins.c:102. +[value] Recording results for log +[value] Done for function log +tests/float/builtins.c:103:[value] Assertion got status valid. +tests/float/builtins.c:107:[kernel] warning: non-finite double value ({{ &d }}): assert \is_finite((double)((int)(&d))); +[value] computing for function log <- main_log_exp. + Called from tests/float/builtins.c:107. +tests/float/builtins.c:22:[value] Function log: precondition got status unknown. +tests/float/builtins.c:26:[value] Reading left-value d. + It contains a garbled mix of {d} because of Arithmetic + {tests/float/builtins.c:107}. +tests/float/builtins.c:26:[kernel] warning: non-finite double value ({{ garbled mix of &{d} + (origin: Arithmetic {tests/float/builtins.c:107}) }}): assert \is_finite(d); +tests/float/builtins.c:26:[value] warning: out-of-range argument {{ garbled mix of &{d} + (origin: Arithmetic {tests/float/builtins.c:26; tests/float/builtins.c:107}) }} for function Frama_C_log +tests/float/builtins.c:26:[value] function Frama_C_log applied to address +tests/float/builtins.c:24:[value] Function log: postcondition got status unknown. +[value] Recording results for log +[value] Done for function log +tests/float/builtins.c:111:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x); +tests/float/builtins.c:111:[kernel] warning: completely indeterminate value in x. +tests/float/builtins.c:111:[value] completely invalid value in evaluation of + argument (double)x +[value] Recording results for main_log_exp +[value] done for function main_log_exp +tests/float/builtins.c:111:[value] Assertion 'Value,initialisation' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function exp: + +[value] Values at end of function log: + +[value] Values at end of function log10: + +[value] Values at end of function main_log_exp: + l1 ∈ {0} or UNINITIALIZED + l2 ∈ {1.00063188031} or UNINITIALIZED + l3 ∈ {1.09861228867} or UNINITIALIZED + l4 ∈ [2.30258509299 .. 4.60517018599] or UNINITIALIZED + l5 ∈ [-744.440071921 .. 709.782712893] or UNINITIALIZED + l6 ∈ UNINITIALIZED + l7 ∈ + {{ garbled mix of &{d} + (origin: Arithmetic {tests/float/builtins.c:26; + tests/float/builtins.c:107}) }} or UNINITIALIZED + l8 ∈ UNINITIALIZED + m1 ∈ {0} or UNINITIALIZED + m2 ∈ {1.} or UNINITIALIZED + m3 ∈ {1.30102999566} or UNINITIALIZED + m4 ∈ [1. .. 2.00432137378] or UNINITIALIZED + m5 ∈ [-323.306215343 .. 308.25471556] or UNINITIALIZED + m6 ∈ UNINITIALIZED + e1 ∈ {1.} or UNINITIALIZED + e2 ∈ {0} or UNINITIALIZED + e3 ∈ {2.68811714182e+43} or UNINITIALIZED + e4 ∈ [2.68811714182e+43 .. 1.79769313486e+308] or UNINITIALIZED + e5 ∈ UNINITIALIZED + e6 ∈ {1.79769313486e+308} or UNINITIALIZED +[value] Analyzing a complete application starting at main_log_exp +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ [--..--] + v ∈ [--..--] +[value] computing for function log <- main_log_exp. + Called from tests/float/builtins.c:51. +[value] warning: option -all-rounding-modes is not supported for builtin Frama_C_log +[value] Recording results for log +[value] Done for function log +[value] computing for function log10 <- main_log_exp. + Called from tests/float/builtins.c:52. +[value] warning: option -all-rounding-modes is not supported for builtin Frama_C_log10 +[value] Recording results for log10 +[value] Done for function log10 +[value] computing for function log <- main_log_exp. + Called from tests/float/builtins.c:55. +[value] Recording results for log +[value] Done for function log +[value] computing for function log10 <- main_log_exp. + Called from tests/float/builtins.c:56. +[value] Recording results for log10 +[value] Done for function log10 +[value] computing for function log <- main_log_exp. + Called from tests/float/builtins.c:59. +[value] Recording results for log +[value] Done for function log +[value] computing for function log10 <- main_log_exp. + Called from tests/float/builtins.c:60. +[value] Recording results for log10 +[value] Done for function log10 +[value] computing for function log <- main_log_exp. + Called from tests/float/builtins.c:64. +[value] Recording results for log +[value] Done for function log +[value] computing for function log10 <- main_log_exp. + Called from tests/float/builtins.c:68. +[value] Recording results for log10 +[value] Done for function log10 +[value] computing for function log <- main_log_exp. + Called from tests/float/builtins.c:72. +tests/float/builtins.c:26:[value] warning: out-of-range argument [-0. .. 1.79769313486e+308] for function Frama_C_log +[value] Recording results for log +[value] Done for function log +[value] computing for function log10 <- main_log_exp. + Called from tests/float/builtins.c:75. +tests/float/builtins.c:33:[value] warning: out-of-range argument [-0. .. 1.79769313486e+308] for function Frama_C_log10 +[value] Recording results for log10 +[value] Done for function log10 +[value] computing for function log <- main_log_exp. + Called from tests/float/builtins.c:78. +[value] Recording results for log +[value] Done for function log +[value] computing for function log10 <- main_log_exp. + Called from tests/float/builtins.c:81. +[value] Recording results for log10 +[value] Done for function log10 +[value] computing for function exp <- main_log_exp. + Called from tests/float/builtins.c:85. +[value] warning: option -all-rounding-modes is not supported for builtin Frama_C_exp +[value] Recording results for exp +[value] Done for function exp +[value] computing for function exp <- main_log_exp. + Called from tests/float/builtins.c:88. +[value] Recording results for exp +[value] Done for function exp +[value] computing for function exp <- main_log_exp. + Called from tests/float/builtins.c:91. +[value] Recording results for exp +[value] Done for function exp +[value] computing for function exp <- main_log_exp. + Called from tests/float/builtins.c:95. +[value] Recording results for exp +[value] Done for function exp +[value] computing for function exp <- main_log_exp. + Called from tests/float/builtins.c:98. +[value] Recording results for exp +[value] Done for function exp +[value] computing for function log <- main_log_exp. + Called from tests/float/builtins.c:102. +[value] Recording results for log +[value] Done for function log +[value] computing for function log <- main_log_exp. + Called from tests/float/builtins.c:107. +[value] Recording results for log +[value] Done for function log +tests/float/builtins.c:111:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x); +[value] Recording results for main_log_exp +[value] done for function main_log_exp +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function exp: + +[value] Values at end of function log: + +[value] Values at end of function log10: + +[value] Values at end of function main_log_exp: + l1 ∈ {0} or UNINITIALIZED + l2 ∈ {1.00063188031} or UNINITIALIZED + l3 ∈ {1.09861228867} or UNINITIALIZED + l4 ∈ [2.30258509299 .. 4.60517018599] or UNINITIALIZED + l5 ∈ [-744.440071921 .. 709.782712893] or UNINITIALIZED + l6 ∈ UNINITIALIZED + l7 ∈ + {{ garbled mix of &{d} + (origin: Arithmetic {tests/float/builtins.c:26; + tests/float/builtins.c:107}) }} or UNINITIALIZED + l8 ∈ UNINITIALIZED + m1 ∈ {0} or UNINITIALIZED + m2 ∈ {1.} or UNINITIALIZED + m3 ∈ {1.30102999566} or UNINITIALIZED + m4 ∈ [1. .. 2.00432137378] or UNINITIALIZED + m5 ∈ [-323.306215343 .. 308.25471556] or UNINITIALIZED + m6 ∈ UNINITIALIZED + e1 ∈ {1.} or UNINITIALIZED + e2 ∈ {0} or UNINITIALIZED + e3 ∈ {2.68811714182e+43} or UNINITIALIZED + e4 ∈ [2.68811714182e+43 .. 1.79769313486e+308] or UNINITIALIZED + e5 ∈ UNINITIALIZED + e6 ∈ {1.79769313486e+308} or UNINITIALIZED diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/cond.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/cond.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/cond.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/cond.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,57 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/cond.c (with preprocessing) +[kernel] Parsing share/builtin.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} + dx ∈ {0} + dy ∈ {0} + dz ∈ {0} + dt ∈ {0} + c1 ∈ {0} + c2 ∈ {0} +[value] computing for function Frama_C_float_interval <- main. + Called from tests/float/cond.c:12. +share/builtin.h:54:[value] Function Frama_C_float_interval: precondition got status valid. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + main. + Called from share/builtin.c:55. +[value] using specification for function Frama_C_update_entropy +[value] Done for function Frama_C_update_entropy +share/builtin.h:55:[value] Function Frama_C_float_interval: postcondition got status valid. +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +[value] computing for function Frama_C_float_interval <- main. + Called from tests/float/cond.c:15. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + main. + Called from share/builtin.c:55. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +tests/float/cond.c:18:[value] Assertion got status unknown. +[value] computing for function Frama_C_float_interval <- main. + Called from tests/float/cond.c:20. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + main. + Called from share/builtin.c:55. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function Frama_C_float_interval: + Frama_C_entropy_source ∈ [--..--] +[value] Values at end of function main: + Frama_C_entropy_source ∈ [--..--] + x ∈ [-0x0.0000000000000p-1022 .. 0x1.4000000000000p3] + dx ∈ [0x1.0000000000001p0 .. 0x1.4000000000000p3] + dz ∈ [0x1.0000000000001p0 .. 0x1.4000000000000p3] + dt ∈ [-0x1.4000000000000p3 .. 0x1.fffffffffffffp-1] + c1 ∈ {1} diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/const1.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/const1.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/const1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/const1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/const1.i (no preprocessing) +tests/float/const1.i:1:[kernel] warning: Floating-point constant 1e40f is not represented exactly. Will use inf. See documentation for option -warn-decimal-float +[value] Analyzing a complete application starting at main +[value] Computing initial state +tests/float/const1.i:1:[kernel] warning: non-finite float value (INFINITY): assert \is_finite(1e40f); +tests/float/const1.i:1:[value] Floating-point literal (or constant expression) is not finite. This path is assumed to be dead. +tests/float/const1.i:1:[kernel] warning: overflow in conversion of 1e40f ({{ }}) from floating-point to integer. + assert -1 < 1e40f < 18446744073709551616; +tests/float/const1.i:1:[value] Evaluation of initializer '(unsigned long long)1e40f' failed +[value] Initial state computed +[value] Values of globals at initialization + NOT ACCESSIBLE +[value] Value analysis not started because globals initialization is not computable. +[value] ====== VALUES COMPUTED ====== +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/const2.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/const2.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/const2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/const2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/const2.i (no preprocessing) +tests/float/const2.i:1:[kernel] warning: Floating-point constant 1e-40f is not represented exactly. Will use 0x1.16c2000000000p-133. See documentation for option -warn-decimal-float +[value] Analyzing a complete application starting at main +[value] Computing initial state +tests/float/const2.i:2:[kernel] warning: non-finite float value (INFINITY): assert \is_finite(1e40f); +tests/float/const2.i:2:[value] Floating-point literal (or constant expression) is not finite. This path is assumed to be dead. +tests/float/const2.i:2:[value] Evaluation of initializer '1e40f' failed +[value] Initial state computed +[value] Values of globals at initialization + NOT ACCESSIBLE +[value] Value analysis not started because globals initialization is not computable. +[value] ====== VALUES COMPUTED ====== +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/const3.1.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/const3.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/const3.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/const3.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/const3.i (no preprocessing) +tests/float/const3.i:6:[kernel] warning: Floating-point constant 1e-40f is not represented exactly. Will use 0x1.16c2000000000p-133 +tests/float/const3.i:7:[kernel] warning: Floating-point constant 1e-40 is not represented exactly. Will use 0x1.16c262777579cp-133 +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + f1 ∈ [0x1.16c2000000000p-133 .. 0x1.16c3000000000p-133] + d0 ∈ [0x1.16c262777579cp-133 .. 0x1.16c262777579dp-133] +[value] DUMPING STATE of file tests/float/const3.i line 11 + f1 ∈ [0x1.16c2000000000p-133 .. 0x1.16c3000000000p-133] + d0 ∈ [0x1.16c262777579cp-133 .. 0x1.16c262777579dp-133] + =END OF DUMP== +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + d1 ∈ [0x1.16c2000000000p-133 .. 0x1.16c3000000000p-133] + __retres ∈ {0} +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + d1; __retres +[inout] Inputs for function main: + f1 diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/const3.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/const3.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/const3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/const3.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/const3.i (no preprocessing) +tests/float/const3.i:6:[kernel] warning: Floating-point constant 1e-40f is not represented exactly. Will use 0x1.16c2000000000p-133 +tests/float/const3.i:7:[kernel] warning: Floating-point constant 1e-40 is not represented exactly. Will use 0x1.16c262777579cp-133 +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + f1 ∈ {9.99994610111e-41} + d0 ∈ {1e-40} +[value] DUMPING STATE of file tests/float/const3.i line 11 + f1 ∈ {9.99994610111e-41} + d0 ∈ {1e-40} + =END OF DUMP== +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + d1 ∈ {9.99994610111e-41} + __retres ∈ {0} +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + d1; __retres +[inout] Inputs for function main: + f1 diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/const4.1.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/const4.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/const4.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/const4.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,35 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/const4.i (no preprocessing) +tests/float/const4.i:6:[kernel] warning: Floating-point constant 3.4e38f is not represented exactly. Will use 0x1.ff933c0000000p127 +tests/float/const4.i:7:[kernel] warning: Floating-point constant 3.405e38f is not represented exactly. Will use inf +[value] Analyzing a complete application starting at main +[value] Computing initial state +tests/float/const4.i:7:[kernel] warning: non-finite float value ([3.40282346639e+38 .. 1.79769313486e+308]): + assert \is_finite(3.405e38f); +[value] Initial state computed +[value] Values of globals at initialization + f1 ∈ [3.39999995214e+38 .. 3.40000015497e+38] + f2 ∈ {3.40282346639e+38} +[value] DUMPING STATE of file tests/float/const4.i line 11 + f1 ∈ [3.39999995214e+38 .. 3.40000015497e+38] + f2 ∈ {3.40282346639e+38} + =END OF DUMP== +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + d2 ∈ {3.40282346639e+38} + __retres ∈ {0} +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + d2; __retres +[inout] Inputs for function main: + f2 diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/const4.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/const4.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/const4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/const4.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/const4.i (no preprocessing) +tests/float/const4.i:6:[kernel] warning: Floating-point constant 3.4e38f is not represented exactly. Will use 0x1.ff933c0000000p127 +tests/float/const4.i:7:[kernel] warning: Floating-point constant 3.405e38f is not represented exactly. Will use inf +[value] Analyzing a complete application starting at main +[value] Computing initial state +tests/float/const4.i:7:[kernel] warning: non-finite float value (INFINITY): assert \is_finite(3.405e38f); +tests/float/const4.i:7:[value] Floating-point literal (or constant expression) is not finite. This path is assumed to be dead. +tests/float/const4.i:7:[value] Evaluation of initializer '(double)3.405e38f' failed +[value] Initial state computed +[value] Values of globals at initialization + NOT ACCESSIBLE +[value] Value analysis not started because globals initialization is not computable. +[value] ====== VALUES COMPUTED ====== +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/const.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/const.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/const.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/const.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,299 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/const.i (no preprocessing) +tests/float/const.i:21:[kernel] warning: Floating-point constant 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024703282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772285886546332835517796989819938739800539093906315035659515570226392290858392449105184435931802849936536152500319370457678249219365623669863658480757001585769269903706311928279558551332927834338409351978015531246597263579574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324673600968951340535537458516661134223766678604162159680461914467291840300530057530849048765391711386591646239524912623653881879636239373280423891018672348497668235089863388587925628302755995657524455507255189313690836254779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328125 is not represented exactly. Will use 0x0.0000000000000p-1022 +tests/float/const.i:22:[kernel] warning: Floating-point constant 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002470328229206232720882843964341106861825299013071623822127928412503377536351043759326499181808179961898982823477228588654633283551779698981993873980053909390631503565951557022639229085839244910518443593180284993653615250031937045767824921936562366986365848075700158576926990370631192827955855133292783433840935197801553124659726357957462276646527282722005637400648549997709659947045402082816622623785739345073633900796776193057750674017632467360096895134053553745851666113422376667860416215968046191446729184030053005753084904876539171138659164623952491262365388187963623937328042389101867234849766823508986338858792562830275599565752445550725518931369083625477918694866799496832404970582102851318545139621383772282614543769341253209859132766723632812501 is not represented exactly. Will use 0x0.0000000000001p-1022 +tests/float/const.i:23:[kernel] warning: Floating-point constant 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002470328229206232720882843964341106861825299013071623822127928412503377536351043759326499181808179961898982823477228588654633283551779698981993873980053909390631503565951557022639229085839244910518443593180284993653615250031937045767824921936562366986365848075700158576926990370631192827955855133292783433840935197801553124659726357957462276646527282722005637400648549997709659947045402082816622623785739345073633900796776193057750674017632467360096895134053553745851666113422376667860416215968046191446729184030053005753084904876539171138659164623952491262365388187963623937328042389101867234849766823508986338858792562830275599565752445550725518931369083625477918694866799496832404970582102851318545139621383772282614543769341253209859132766723632812499 is not represented exactly. Will use 0x0.0000000000000p-1022 +tests/float/const.i:26:[kernel] warning: Floating-point constant 0.0000000000000000000000000000000000000000000014012984643248170709237295832899161312802619418765157717570682838897910826858606014866381883621215820312499 is not represented exactly. Will use 0x1.0000000000000p-149 +tests/float/const.i:27:[kernel] warning: Floating-point constant 0.0000000000000000000000000000000000000000000014012984643248170709237295832899161312802619418765157717570682838897910826858606014866381883621215820312501 is not represented exactly. Will use 0x1.0000000000000p-149 +tests/float/const.i:29:[kernel] warning: Floating-point constant 0.0000000000000000000000000000000000000000000014012984643248170709237295832899161312802619418765157717570682838897910826858606014866381883621215820312499f is not represented exactly. Will use 0x1.0000000000000p-149 +tests/float/const.i:30:[kernel] warning: Floating-point constant 0.0000000000000000000000000000000000000000000014012984643248170709237295832899161312802619418765157717570682838897910826858606014866381883621215820312501f is not represented exactly. Will use 0x1.0000000000000p-149 +tests/float/const.i:33:[kernel] warning: Floating-point constant 0.00000000000000000000000000000000000000000000070064923216240853546186479164495806564013097093825788587853414194489554134293030074331909418106079101562499 is not represented exactly. Will use 0x1.0000000000000p-150 +tests/float/const.i:34:[kernel] warning: Floating-point constant 0.00000000000000000000000000000000000000000000070064923216240853546186479164495806564013097093825788587853414194489554134293030074331909418106079101562501 is not represented exactly. Will use 0x1.0000000000000p-150 +tests/float/const.i:35:[kernel] warning: Floating-point constant 0.000000000000000000000000000000000000000000000700649232162408535461864791644958065640130970938257885878534141944895541342930300743319094181060791015625f is not represented exactly. Will use 0x0.0000000000000p-1022 +tests/float/const.i:36:[kernel] warning: Floating-point constant 0.00000000000000000000000000000000000000000000070064923216240853546186479164495806564013097093825788587853414194489554134293030074331909418106079101562499f is not represented exactly. Will use 0x0.0000000000000p-1022 +tests/float/const.i:37:[kernel] warning: Floating-point constant 0.00000000000000000000000000000000000000000000070064923216240853546186479164495806564013097093825788587853414194489554134293030074331909418106079101562501f is not represented exactly. Will use 0x1.0000000000000p-149 +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + f0 ∈ {0} + f_ ∈ {0} + f00 ∈ {0} + f1 ∈ {0x1.8000000000000p1} + f2 ∈ {0} + f3 ∈ {0} + f_0 ∈ {0} + f13 ∈ {0} + f26 ∈ {0} + fic0 ∈ {0} + fic1 ∈ {0} + fic2 ∈ {0} + fic4 ∈ {0} + fec0 ∈ {0} + fec2 ∈ {0} + fec4 ∈ {0} + m0 ∈ {0} + m_ ∈ {0} + m00 ∈ {0} + m1 ∈ {0x1.8000000000000p1} + m2 ∈ {0} + m3 ∈ {0} + m_0 ∈ {0} + m13 ∈ {0} + m26 ∈ {0} + d0 ∈ {0} + d1 ∈ {0x1.8000000000000p1} + d2 ∈ {0} + d3 ∈ {0} + d4 ∈ {0} + d5 ∈ {0} + d6 ∈ {0} + d7 ∈ {0} + A ∈ {0} + B ∈ {0} + C ∈ {0} + D ∈ {0} + E ∈ {0} + F ∈ {0} + G ∈ {0} + H ∈ {0} + I ∈ {0} + J ∈ {0} + K ∈ {0} + L ∈ {0} + P ∈ {0} + Q ∈ {0} + R ∈ {0} + Am ∈ {0} + Bm ∈ {0} + Cm ∈ {0} + Dm ∈ {0} + Em ∈ {0} + Fm ∈ {0} + Gm ∈ {0} + Hm ∈ {0} + Im ∈ {0} + Jm ∈ {0} + Km ∈ {0} + Lm ∈ {0} + t1 ∈ {0} + t2 ∈ {0} + t3 ∈ {0} + t4 ∈ {0} + t5 ∈ {0} + t6 ∈ {0} + t7 ∈ {0} + t8 ∈ {0} + t9 ∈ {0} + C0 ∈ {0} + C2 ∈ {2} + s1 ∈ {0} + s2 ∈ {0} + s3 ∈ {0} + s4 ∈ {0} + s5 ∈ {0} + s6 ∈ {0} + s7 ∈ {0} + s8 ∈ {0} + s9 ∈ {0} + if1 ∈ {0} + if2 ∈ {0} + if3 ∈ {0} + ite1 ∈ {0} + ite2 ∈ {0} + ite3 ∈ {0} + ca1 ∈ {0} + ca2 ∈ {0} + ca3 ∈ {0} + ca4 ∈ {0} + corner_case_small0 ∈ {0} + corner_case_small1 ∈ {0x0.0000000000001p-1022} + corner_case_small2 ∈ {0} + smallest_pos0 ∈ {0x1.0000000000000p-149} + smallest_pos1 ∈ {0x1.0000000000000p-149} + smallest_pos2 ∈ {0x1.0000000000000p-149} + smallest_pos3 ∈ {0x1.0000000000000p-149} + smallest_pos4 ∈ {0x1.0000000000000p-149} + smallest_pos5 ∈ {0x1.0000000000000p-149} + half_smallest_pos0 ∈ {0} + half_smallest_pos1 ∈ {0} + half_smallest_pos2 ∈ {0} + half_smallest_pos3 ∈ {0} + half_smallest_pos4 ∈ {0} + half_smallest_pos5 ∈ {0x1.0000000000000p-149} +tests/float/const.i:48:[value] Assertion got status valid. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + f_ ∈ {-0x0.0000000000000p-1022} + f00 ∈ {0} + f2 ∈ {0x1.8000000000000p1} + f3 ∈ {0x1.8000000000000p1} + f_0 ∈ [-0x0.0000000000000p-1022 .. 0x0.0000000000000p-1022] + f13 ∈ [0x1.0000000000000p0 .. 0x1.8000000000000p1] + f26 ∈ [0x1.0000000000000p1 .. 0x1.8000000000000p2] + fic0 ∈ {0} + fic1 ∈ {0x1.0000000000000p0} + fic2 ∈ {0x1.0000000000000p1} + fic4 ∈ {0x1.0000000000000p2} + fec0 ∈ {0} + fec2 ∈ {0x1.0000000000000p1} + fec4 ∈ {0x1.0000000000000p2} + m_ ∈ {-0x0.0000000000000p-1022} + m00 ∈ {0} + m2 ∈ {0x1.8000000000000p1} + m_0 ∈ [-0x0.0000000000000p-1022 .. 0x0.0000000000000p-1022] + m13 ∈ [0x1.0000000000000p0 .. 0x1.8000000000000p1] + m26 ∈ [0x1.0000000000000p1 .. 0x1.8000000000000p2] + d2 ∈ {0x1.8000000000000p1} + d3 ∈ {0x1.4000000000000p2} + d4 ∈ {0x1.4000000000000p2} + d5 ∈ [-0x1.8000000000000p1 .. 0x1.2000000000000p3] + d6 ∈ {0x1.8000000000000p1} + d7 ∈ [-0x1.2000000000000p3 .. 0x1.8000000000000p1] + A ∈ {1} + B ∈ {0} + C ∈ {1} + D ∈ {0} + E ∈ {1} + F ∈ {1} + G ∈ {1} + H ∈ {0; 1} + I ∈ {0; 1} + J ∈ {0} + K ∈ {0} + L ∈ {0; 1} + P ∈ {0; 1} + Q ∈ {0} + R ∈ {1} + Am ∈ {1} + Bm ∈ {0} + Cm ∈ {1} + Dm ∈ {0} + Em ∈ {1} + Fm ∈ {1} + Gm ∈ {1} + Hm ∈ {0; 1} + Im ∈ {0; 1} + Jm ∈ {0} + Km ∈ {0} + Lm ∈ {0; 1} + t1 ∈ {1} + t2 ∈ {1} + t3 ∈ {1} + t4 ∈ {0; 1} + t5 ∈ {0; 1} + t6 ∈ {1} + t7 ∈ {0} + t8 ∈ {1} + s1 ∈ {0} + s2 ∈ {0} + s3 ∈ {1} + s4 ∈ {0; 1} + s5 ∈ {0; 1} + s6 ∈ {1} + s7 ∈ {0} + s8 ∈ {0} + if1 ∈ {0; 1} + if2 ∈ {0; 1} + if3 ∈ {0; 1} + ite1 ∈ {1; 2} + ite2 ∈ {1; 2} + ite3 ∈ {1; 2} + ca1 ∈ {0} + ca2 ∈ {1; 2; 3} + ca3 ∈ {0} + ca4 ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + f_ FROM f0 + f00 FROM f0 + f2 FROM f1 + f3 FROM f0; f1 + f_0 FROM f0; c1 + f13 FROM c1 + f26 FROM c1 + fic0 FROM C0 + fic1 FROM \nothing + fic2 FROM C2 + fic4 FROM C2 + fec0 FROM C0 + fec2 FROM C2 + fec4 FROM C2 + m_ FROM m0 + m00 FROM m0 + m2 FROM m1 + m_0 FROM m0; c1 + m13 FROM c1 + m26 FROM c1 + d2 FROM f1; d1 + d3 FROM d1 + d4 FROM d1 + d5 FROM c1; c2 + d6 FROM f0; f1; d1 + d7 FROM c1; c2 + A FROM f0 + B FROM f0; f1 + C FROM f0 + D FROM f0; f1 + E FROM f0 + F FROM f0; c1 + G FROM f0; c1 + H FROM f0; c1 + I FROM f0; c1 + J FROM f0; c1 + K FROM f0; c1 + L FROM c1; c2 + P FROM c1; c2 + Q FROM f0 + R FROM f0; f1 + Am FROM m0 + Bm FROM m0; m1 + Cm FROM m0 + Dm FROM m0; m1 + Em FROM m0 + Fm FROM m0; c1 + Gm FROM m0; c1 + Hm FROM m0; c1 + Im FROM m0; c1 + Jm FROM m0; c1 + Km FROM m0; c1 + Lm FROM c1; c2 + t1 FROM f0; c1 + t2 FROM f0; c1 + t3 FROM f0; c1 + t4 FROM c1 + t5 FROM c1 + t6 FROM c1 + t7 FROM c1 + t8 FROM f1 + s1 FROM f0; c1 + s2 FROM f0; c1 + s3 FROM f0; c1 + s4 FROM c1 + s5 FROM c1 + s6 FROM c1 + s7 FROM c1 + s8 FROM f1 + if1 FROM \nothing (and SELF) + if2 FROM \nothing (and SELF) + if3 FROM \nothing (and SELF) + ite1 FROM \nothing + ite2 FROM \nothing + ite3 FROM \nothing + ca1 FROM f0; c1 + ca2 FROM c1 + ca3 FROM f0 + ca4 FROM f0 +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + f_; f00; f2; f3; f_0; f13; f26; fic0; fic1; fic2; fic4; fec0; fec2; + fec4; m_; m00; m2; m_0; m13; m26; d2; d3; d4; d5; d6; d7; A; B; C; + D; E; F; G; H; I; J; K; L; P; Q; R; Am; Bm; Cm; Dm; Em; Fm; Gm; Hm; + Im; Jm; Km; Lm; t1; t2; t3; t4; t5; t6; t7; t8; s1; s2; s3; s4; s5; + s6; s7; s8; if1; if2; if3; ite1; ite2; ite3; ca1; ca2; ca3; ca4; tmp; + tmp_0; tmp_1; tmp_2; tmp_3; tmp_4; tmp_5; tmp_6; tmp_7 diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/conv.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/conv.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/conv.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/conv.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,104 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/conv.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + f ∈ {0} + d ∈ {0} + v ∈ [--..--] +[value] computing for function main1 <- main. + Called from tests/float/conv.i:105. +[value] Called Frama_C_show_each({0}) +[value] Called Frama_C_show_each({1.40129846432e-45}) +[value] Called Frama_C_show_each([1.40129846432e-43 .. 2.40330263757e+12]) +tests/float/conv.i:24:[value] Assertion got status unknown. +[value] Called Frama_C_show_each({3.40282346639e+38}) +tests/float/conv.i:29:[value] Assertion got status valid. +tests/float/conv.i:32:[kernel] warning: non-finite float value ({0x7F800000}): assert \is_finite(*((float *)(&i))); +[value] Called Frama_C_show_each([-3.40282346639e+38 .. 3.40282346639e+38]) +[value] Called Frama_C_show_each({-3.40282346639e+38}) +tests/float/conv.i:38:[value] Assertion got status valid. +tests/float/conv.i:41:[kernel] warning: non-finite float value ({-0x800000}): assert \is_finite(*((float *)(&i))); +[value] Called Frama_C_show_each([-3.40282346639e+38 .. 3.40282346639e+38]) +[value] Called Frama_C_show_each([0. .. 1.40129846432e-45]) +tests/float/conv.i:48:[value] Assertion got status unknown. +tests/float/conv.i:49:[kernel] warning: non-finite float value ([-10..-1]): assert \is_finite(*((float *)(&i))); +[value] Called Frama_C_show_each([-3.40282346639e+38 .. 3.40282346639e+38]) +tests/float/conv.i:52:[kernel] warning: non-finite float value ({0; 0x7FFFFFFF}): + assert \is_finite(*((float *)(&i))); +[value] Called Frama_C_show_each([-3.40282346639e+38 .. 3.40282346639e+38]) +tests/float/conv.i:55:[kernel] warning: non-finite float value ({0xFFFFFFFF}): assert \is_finite(*((float *)(&ui))); +[value] Called Frama_C_show_each([-3.40282346639e+38 .. 3.40282346639e+38]) +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/float/conv.i:106. +[value] Called Frama_C_show_each({0}) +[value] Called Frama_C_show_each({4.94065645841e-324}) +[value] Called Frama_C_show_each([4.94065645841e-322 .. 9.22442153475e+159]) +[value] Called Frama_C_show_each({1.79769313486e+308}) +tests/float/conv.i:74:[value] Assertion got status valid. +tests/float/conv.i:77:[kernel] warning: non-finite double value ({0x7FF0000000000000}): + assert \is_finite(*((double *)(&i))); +[value] Called Frama_C_show_each([-1.79769313486e+308 .. 1.79769313486e+308]) +tests/float/conv.i:80:[kernel] warning: non-finite double value ({-1}): assert \is_finite(*((double *)(&i))); +[value] Called Frama_C_show_each([-1.79769313486e+308 .. 1.79769313486e+308]) +[value] Called Frama_C_show_each({-1.79769313486e+308}) +tests/float/conv.i:85:[value] Assertion got status valid. +tests/float/conv.i:88:[kernel] warning: non-finite double value ({-0x10000000000000}): + assert \is_finite(*((double *)(&i))); +[value] Called Frama_C_show_each([-1.79769313486e+308 .. 1.79769313486e+308]) +[value] Called Frama_C_show_each([0. .. 4.94065645841e-324]) +tests/float/conv.i:94:[value] Assertion got status unknown. +tests/float/conv.i:95:[kernel] warning: non-finite double value ([-10..-1]): assert \is_finite(*((double *)(&i))); +[value] Called Frama_C_show_each([-1.79769313486e+308 .. 1.79769313486e+308]) +tests/float/conv.i:98:[kernel] warning: non-finite double value ({-1; 0}): assert \is_finite(*((double *)(&i))); +[value] Called Frama_C_show_each([-1.79769313486e+308 .. 1.79769313486e+308]) +tests/float/conv.i:101:[kernel] warning: non-finite double value ({0xFFFFFFFFFFFFFFFF}): + assert \is_finite(*((double *)(&ui))); +[value] Called Frama_C_show_each([-1.79769313486e+308 .. 1.79769313486e+308]) +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main1: + f ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + i ∈ {0; 0x7FFFFFFF} + ui ∈ {0xFFFFFFFF} +[value] Values at end of function main2: + d ∈ {-1.79769313486e+308} + i ∈ {-1; 0} + ui ∈ {0xFFFFFFFFFFFFFFFF} +[value] Values at end of function main: + f ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + d ∈ {-1.79769313486e+308} +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main1: + f FROM \nothing +[from] Function main2: + d FROM \nothing +[from] Function main: + f FROM \nothing + d FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main1: + f; i; ui +[inout] Inputs for function main1: + f; v +[inout] Out (internal) for function main2: + d; i; ui +[inout] Inputs for function main2: + d; v +[inout] Out (internal) for function main: + f; d +[inout] Inputs for function main: + f; d; v diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/cte_overflow.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/cte_overflow.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/cte_overflow.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/cte_overflow.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/cte_overflow.i (no preprocessing) +tests/float/cte_overflow.i:12:[kernel] warning: Floating-point constant 1e500 is not represented exactly. Will use inf +tests/float/cte_overflow.i:12:[kernel] warning: Floating-point constant 1e500 is not represented exactly. Will use inf +tests/float/cte_overflow.i:17:[kernel] warning: Floating-point constant 1e80f is not represented exactly. Will use inf +tests/float/cte_overflow.i:17:[kernel] warning: Floating-point constant 1e500f is not represented exactly. Will use inf +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] +tests/float/cte_overflow.i:12:[kernel] warning: non-finite double value (INFINITY): assert \is_finite(1e500); +tests/float/cte_overflow.i:12:[value] Floating-point literal (or constant expression) is not finite. This path is assumed to be dead. +tests/float/cte_overflow.i:17:[kernel] warning: non-finite float value (INFINITY): assert \is_finite(1e80f); +tests/float/cte_overflow.i:17:[value] Floating-point literal (or constant expression) is not finite. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + t ∈ {0} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + t; __retres +[inout] Inputs for function main: + v diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/dr.1.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/dr.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/dr.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/dr.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,53 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/dr.i (no preprocessing) +tests/float/dr.i:6:[kernel] warning: Floating-point constant 100e30f is not represented exactly. Will use 0x1.3b8b5c0000000p106. See documentation for option -warn-decimal-float +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + big ∈ {0x1.3b8b5c0000000p106} + big2 ∈ {0x1.3bf1240000000p106} + ne1 ∈ {-0x1.99999a0000000p-4} + ne2 ∈ {-0x1.0000000000000p-1} + nodigits ∈ {0x1.4000000000000p3} + smaller ∈ {0} + he ∈ {0x1.8000000000000p1} + g1 ∈ {0x1.99999a0000000p-4} + f1 ∈ {0x1.99999a0000000p-4} + f9 ∈ {0x1.0000000000000p0} + ep ∈ {0x1.74876e0000000p33} + g2 ∈ {0x1.02f8f40000000p0} + f2 ∈ {0x1.02f8f60000000p0} + d2 ∈ {0x1.02f8f50000000p0} + e1 ∈ {0} + e2 ∈ {0} +[value] computing for function printf <- main. + Called from tests/float/dr.i:27. +tests/float/dr.i:27:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + e1 ∈ {1} + e2 ∈ {0} + __retres ∈ {0} +[from] Computing for function main +[from] Computing for function printf <-main +[from] Done for function printf +tests/float/dr.i:27:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function printf: + \result FROM "%d %d\n"[bits 0 to 55] +[from] Function main: + e1 FROM g1; f1 + e2 FROM g2; f2 + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + e1; e2; __retres +[inout] Inputs for function main: + g1; f1; g2; f2; e1; e2; "%d %d\n"[bits 0 to 55] diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/dr_infinity.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/dr_infinity.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/dr_infinity.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/dr_infinity.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/dr_infinity.i (no preprocessing) +tests/float/dr_infinity.i:8:[kernel] warning: Floating-point constant 3.4028235677973366e+38f is not represented exactly. Will use 0x1.fffffe0000000p127 +tests/float/dr_infinity.i:10:[kernel] warning: Floating-point constant 3.402823567797366e+38 is not represented exactly. Will use 0x1.ffffff000004ep127 +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Called Frama_C_show_each({0x1.fffffe0000000p127}) +tests/float/dr_infinity.i:10:[kernel] warning: non-finite float value ({0x1.ffffff000004ep127}): + assert \is_finite((float)3.402823567797366e+38); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + x; y +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/dr.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/dr.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/dr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/dr.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,53 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/dr.i (no preprocessing) +tests/float/dr.i:6:[kernel] warning: Floating-point constant 100e30f is not represented exactly. Will use 0x1.3b8b5c0000000p106. See documentation for option -warn-decimal-float +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + big ∈ {1.00000003318e+32} + big2 ∈ {1.00126002403e+32} + ne1 ∈ {-0.10000000149} + ne2 ∈ {-0.5} + nodigits ∈ {10.} + smaller ∈ {0} + he ∈ {3.} + g1 ∈ {0.10000000149} + f1 ∈ {0.10000000149} + f9 ∈ {1.} + ep ∈ {12499999744.} + g2 ∈ {1.01161122322} + f2 ∈ {1.01161134243} + d2 ∈ {1.01161128283} + e1 ∈ {0} + e2 ∈ {0} +[value] computing for function printf <- main. + Called from tests/float/dr.i:27. +tests/float/dr.i:27:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + e1 ∈ {1} + e2 ∈ {0} + __retres ∈ {0} +[from] Computing for function main +[from] Computing for function printf <-main +[from] Done for function printf +tests/float/dr.i:27:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function printf: + \result FROM "%d %d\n"[bits 0 to 55] +[from] Function main: + e1 FROM g1; f1 + e2 FROM g2; f2 + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + e1; e2; __retres +[inout] Inputs for function main: + g1; f1; g2; f2; e1; e2; "%d %d\n"[bits 0 to 55] diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/extract_bits.1.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/extract_bits.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/extract_bits.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/extract_bits.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,31 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/extract_bits.i (no preprocessing) +tests/float/extract_bits.i:6:[kernel] warning: Floating-point constant 3.14 is not represented exactly. Will use 0x1.91eb851eb851fp1 +tests/float/extract_bits.i:7:[kernel] warning: Floating-point constant 2.71 is not represented exactly. Will use 0x1.5ae147ae147aep1 +tests/float/extract_bits.i:9:[kernel] warning: Floating-point constant 1.8254370818746402660437411213933955878019332885742187 is not represented exactly. Will use 0x1.d34fd8378ea83p0 +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + f ∈ {3.1400001049041748} + d ∈ {2.7099999999999999} + stdtod_bug ∈ {1.8254370818746401} + fr[0..0x3] ∈ {0} + dr[0..0x7] ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + fr[0] ∈ {0xC3} + [0x1] ∈ {0xF5} + [0x2] ∈ {0x48} + [0x3] ∈ {0x40} + dr[0] ∈ {0xAE} + [0x1] ∈ {0x47} + [0x2] ∈ {0xE1} + [0x3] ∈ {0x7A} + [0x4] ∈ {0x14} + [0x5] ∈ {0xAE} + [0x6] ∈ {0x5} + [0x7] ∈ {0x40} + i ∈ {0x8} diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/extract_bits.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/extract_bits.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/extract_bits.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/extract_bits.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,31 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/extract_bits.i (no preprocessing) +tests/float/extract_bits.i:6:[kernel] warning: Floating-point constant 3.14 is not represented exactly. Will use 0x1.91eb851eb851fp1 +tests/float/extract_bits.i:7:[kernel] warning: Floating-point constant 2.71 is not represented exactly. Will use 0x1.5ae147ae147aep1 +tests/float/extract_bits.i:9:[kernel] warning: Floating-point constant 1.8254370818746402660437411213933955878019332885742187 is not represented exactly. Will use 0x1.d34fd8378ea83p0 +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + f ∈ {3.1400001049041748} + d ∈ {2.7099999999999999} + stdtod_bug ∈ {1.8254370818746401} + fr[0..0x3] ∈ {0} + dr[0..0x7] ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + fr[0] ∈ {0x40} + [0x1] ∈ {0x48} + [0x2] ∈ {0xF5} + [0x3] ∈ {0xC3} + dr[0] ∈ {0x40} + [0x1] ∈ {0x5} + [0x2] ∈ {0xAE} + [0x3] ∈ {0x14} + [0x4] ∈ {0x7A} + [0x5] ∈ {0xE1} + [0x6] ∈ {0x47} + [0x7] ∈ {0xAE} + i ∈ {0x8} diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/float_cast_implicite.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/float_cast_implicite.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/float_cast_implicite.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/float_cast_implicite.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,56 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/float_cast_implicite.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + C0 ∈ {0} + C2 ∈ {2} + CBP ∈ {2000000000} + fic0 ∈ {0} + fic1 ∈ {0} + fic2 ∈ {0} + fic4 ∈ {0} + fec0 ∈ {0} + fec2 ∈ {0} + fec4 ∈ {0} + ficbp ∈ {0} + ficbn ∈ {0} + fecbp ∈ {0} + fecbn ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + fic0 ∈ {0} + fic1 ∈ {1.} + fic2 ∈ {2.} + fic4 ∈ {4.} + fec0 ∈ {0} + fec2 ∈ {2.} + fec4 ∈ {4.} + ficbp ∈ {2000000000.} + ficbn ∈ {-2000000000.} + fecbp ∈ {2000000000.} + fecbn ∈ {-2000000000.} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + fic0 FROM C0 + fic1 FROM \nothing + fic2 FROM C2 + fic4 FROM C2 + fec0 FROM C0 + fec2 FROM C2 + fec4 FROM C2 + ficbp FROM CBP + ficbn FROM CBP + fecbp FROM CBP + fecbn FROM CBP +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + fic0; fic1; fic2; fic4; fec0; fec2; fec4; ficbp; ficbn; fecbp; fecbn +[inout] Inputs for function main: + C0; C2; CBP diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/init_float.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/init_float.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/init_float.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/init_float.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/init_float.i (no preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + s.y ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + r ∈ [-1.9999999999999998*2^1023 .. 1.9999999999999998*2^1023] + cv ∈ [-1.9999999999999998*2^1023 .. 1.9999999999999998*2^1023] + un ∈ [-1.9999999999999998*2^1023 .. 1.9999999999999998*2^1023] + zp ∈ [-1.9999999999999998*2^1023 .. 1.9999999999999998*2^1023] + zm ∈ [-1.9999999999999998*2^1023 .. 1.9999999999999998*2^1023] + zs ∈ [-1.9999999999999998*2^1023 .. 1.9999999999999998*2^1023] + l ∈ [--..--] + Ha[0..4] ∈ [-1.9999999999999998*2^1023 .. 1.9999999999999998*2^1023] + THa[0..4] ∈ [-1.9999999999999998*2^1023 .. 1.9999999999999998*2^1023] +tests/float/init_float.i:16:[value] Function main: precondition got status unknown. +tests/float/init_float.i:17:[value] Function main: precondition got status unknown. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + s.y ∈ [-0.0000000000000000*2^-1022 .. 0.0000000000000000*2^-1022] + r ∈ [-1000.0000000000000000 .. 1000.0000000000000000] + cv ∈ [1.0000000715686179 .. 1.6096441013214644*2^20] + un ∈ {1.0000000000000000} + zp ∈ {0} + zm ∈ {-0.0000000000000000*2^-1022} + zs ∈ {0} + l ∈ [4500000000000000001..4700000000000000000] + Ha[0] ∈ {1.9999999999999982*2^-2} + [1] ∈ {1.9999999999999991*2^-2} + [2] ∈ {1.0000000000000000*2^-1} + [3] ∈ {1.0000000000000004*2^-1} + [4] ∈ {1.0000000000000008*2^-1} + THa[0] ∈ {1.4999999999999996} + [1] ∈ {1.4999999999999998} + [2] ∈ {1.5000000000000000} + [3] ∈ {1.5000000000000002} + [4] ∈ {1.5000000000000004} + __retres ∈ {1} diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/leaf_ensures.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/leaf_ensures.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/leaf_ensures.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/leaf_ensures.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,73 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/leaf_ensures.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + d1 ∈ {0} + d2 ∈ {0} + d3 ∈ {0} + d4 ∈ {0} + f1 ∈ {0} + f2 ∈ {0} + f3 ∈ {0} + f4 ∈ {0} + y ∈ {0} +[value] computing for function d <- main. + Called from tests/float/leaf_ensures.i:24. +[value] using specification for function d +tests/float/leaf_ensures.i:4:[value] warning: no \from part for clause 'assigns d1, d2, d3;' of function d +tests/float/leaf_ensures.i:10:[value] warning: no 'assigns \result \from ...' clause specified for function d +[value] Done for function d +[value] computing for function f <- main. + Called from tests/float/leaf_ensures.i:25. +[value] using specification for function f +tests/float/leaf_ensures.i:14:[value] warning: no \from part for clause 'assigns f1, f2, f3;' of function f +tests/float/leaf_ensures.i:20:[value] warning: no 'assigns \result \from ...' clause specified for function f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + d1 ∈ [-1.79769313486e+308 .. 1.79769313486e+308] + d2 ∈ [-1. .. 1.] + d3 ∈ [--..--] + d4 ∈ [-1.79769313486e+308 .. 1.79769313486e+308] + f1 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + f2 ∈ [-0.999999940395 .. 0.999999940395] + f3 ∈ [--..--] + f4 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + __retres ∈ {0} +[from] Computing for function main +[from] Computing for function d <-main +[from] Done for function d +[from] Computing for function f <-main +[from] Done for function f +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function d: + d1 FROM ANYTHING(origin:Unknown) (and SELF) + d2 FROM ANYTHING(origin:Unknown) (and SELF) + d3 FROM ANYTHING(origin:Unknown) (and SELF) + \result FROM ANYTHING(origin:Unknown) +[from] Function f: + f1 FROM ANYTHING(origin:Unknown) (and SELF) + f2 FROM ANYTHING(origin:Unknown) (and SELF) + f3 FROM ANYTHING(origin:Unknown) (and SELF) + \result FROM ANYTHING(origin:Unknown) +[from] Function main: + d1 FROM ANYTHING(origin:Unknown) (and SELF) + d2 FROM ANYTHING(origin:Unknown) (and SELF) + d3 FROM ANYTHING(origin:Unknown) (and SELF) + d4 FROM ANYTHING(origin:Unknown) + f1 FROM ANYTHING(origin:Unknown) (and SELF) + f2 FROM ANYTHING(origin:Unknown) (and SELF) + f3 FROM ANYTHING(origin:Unknown) (and SELF) + f4 FROM ANYTHING(origin:Unknown) + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + d1; d2; d3; d4; f1; f2; f3; f4; __retres +[inout] Inputs for function main: + ANYTHING(origin:Unknown) diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/logic.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/logic.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/logic.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/logic.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,99 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/logic.i (no preprocessing) +tests/float/logic.i:11:[kernel] warning: Floating-point constant 0.1 is not represented exactly. Will use 0x1.999999999999ap-4 +tests/float/logic.i:16:[kernel] warning: Floating-point constant 0.1 is not represented exactly. Will use 0x1.999999999999ap-4 +tests/float/logic.i:21:[kernel] warning: Floating-point constant 0.1 is not represented exactly. Will use 0x1.999999999999ap-4 +tests/float/logic.i:70:[kernel] warning: Floating-point constant 3.3 is not represented exactly. Will use 0x1.a666666666666p1 +tests/float/logic.i:71:[kernel] warning: Floating-point constant 3.3 is not represented exactly. Will use 0x1.a666666666666p1 +tests/float/logic.i:74:[kernel] warning: Floating-point constant 3.3 is not represented exactly. Will use 0x1.a666666666666p1 +tests/float/logic.i:77:[kernel] warning: Floating-point constant 3.3 is not represented exactly. Will use 0x1.a666666666666p1 +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] + undet ∈ [--..--] + top_int ∈ [--..--] +tests/float/logic.i:12:[value] Assertion got status unknown. +tests/float/logic.i:17:[value] Assertion got status invalid (stopping propagation). +tests/float/logic.i:22:[value] Assertion got status valid. +[value] computing for function test_is_finite <- main. + Called from tests/float/logic.i:27. +tests/float/logic.i:50:[value] Assertion got status valid. +tests/float/logic.i:51:[value] Assertion got status unknown. +tests/float/logic.i:59:[value] Assertion got status unknown. +tests/float/logic.i:67:[value] Assertion got status unknown. +[value] computing for function my_fabs <- test_is_finite <- main. + Called from tests/float/logic.i:70. +[value] using specification for function my_fabs +[value] Done for function my_fabs +[value] computing for function my_fabs <- test_is_finite <- main. + Called from tests/float/logic.i:71. +[value] Done for function my_fabs +[value] computing for function my_ratio <- test_is_finite <- main. + Called from tests/float/logic.i:74. +[value] using specification for function my_ratio +tests/float/logic.i:46:[value] warning: no 'assigns \result \from ...' clause specified for function my_ratio +[value] Done for function my_ratio +[value] computing for function my_ratio_body <- test_is_finite <- main. + Called from tests/float/logic.i:77. +[value] computing for function my_fabs <- my_ratio_body <- test_is_finite <- main. + Called from tests/float/logic.i:41. +[value] Done for function my_fabs +tests/float/logic.i:39:[value] Function my_ratio_body: postcondition got status valid. +tests/float/logic.i:40:[value] Function my_ratio_body: postcondition got status valid. +[value] Recording results for my_ratio_body +[value] Done for function my_ratio_body +[value] Recording results for test_is_finite +[value] Done for function test_is_finite +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function my_ratio_body: + __retres ∈ {-0x1.bca1b00000000p-1} +[value] Values at end of function test_is_finite: + f1 ∈ [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + f2 ∈ [--..--] + f3 ∈ [--..--] + p ∈ {{ &f2 ; &f3 }} + g1 ∈ {0x1.a666660000000p1} + g2 ∈ {0x1.a666660000000p1} + g3 ∈ [-0x1.fffffe0000000p-1 .. 0x1.fffffe0000000p-1] + g4 ∈ {-0x1.bca1b00000000p-1} +[value] Values at end of function main: + __retres ∈ {0} +[from] Computing for function my_ratio_body +[from] Computing for function my_fabs <-my_ratio_body +[from] Done for function my_fabs +[from] Done for function my_ratio_body +[from] Computing for function test_is_finite +[from] Computing for function my_ratio <-test_is_finite +[from] Done for function my_ratio +[from] Done for function test_is_finite +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function my_fabs: + \result FROM f +[from] Function my_ratio: + \result FROM ANYTHING(origin:Unknown) +[from] Function my_ratio_body: + \result FROM f +[from] Function test_is_finite: + NO EFFECTS +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function my_ratio_body: + tmp; __retres +[inout] Inputs for function my_ratio_body: + \nothing +[inout] Out (internal) for function test_is_finite: + f1; f2; f3; p; g1; g2; g3; g4 +[inout] Inputs for function test_is_finite: + undet; top_int +[inout] Out (internal) for function main: + d; d_0; f; __retres +[inout] Inputs for function main: + v; undet; top_int diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/nonlin.1.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/nonlin.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/nonlin.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/nonlin.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,181 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/nonlin.c (with preprocessing) +[kernel] Parsing share/builtin.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ {0} + a ∈ {0} + b ∈ {0} + c ∈ {0} + r1 ∈ {0} + r2 ∈ {0} + d ∈ {0} + i ∈ {0} + s ∈ {0} + zf ∈ {0} + s2 ∈ {0} + sq ∈ {0} + h ∈ {0} + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + [5] ∈ {6} + [6] ∈ {7} + [7] ∈ {8} + [8] ∈ {9} + [9] ∈ {10} + r ∈ {0} + z ∈ {0} + rbits1 ∈ {0} + rbits2 ∈ {0} +[value] computing for function nonlin_f <- main. + Called from tests/float/nonlin.c:59. +[value] computing for function Frama_C_float_interval <- nonlin_f <- main. + Called from tests/float/nonlin.c:16. +share/builtin.h:54:[value] Function Frama_C_float_interval: precondition got status valid. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + nonlin_f <- main. + Called from share/builtin.c:55. +[value] using specification for function Frama_C_update_entropy +[value] Done for function Frama_C_update_entropy +share/builtin.h:55:[value] Function Frama_C_float_interval: postcondition got status valid. +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +[value] computing for function Frama_C_float_interval <- nonlin_f <- main. + Called from tests/float/nonlin.c:17. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + nonlin_f <- main. + Called from share/builtin.c:55. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +tests/float/nonlin.c:20:[value] Assertion got status valid. +tests/float/nonlin.c:24:[value] Assertion got status valid. +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.4000000000000p2 .. 0x1.4800000000000p2], + {{ "r2" }}, + [0x1.4000000000000p2 .. 0x1.c0fffffffffffp2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.4800000000000p2 .. 0x1.5000000000000p2], + {{ "r2" }}, + [0x1.4800000000000p2 .. 0x1.c0fffffffffffp2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.5000000000000p2 .. 0x1.5800000000000p2], + {{ "r2" }}, + [0x1.5000000000000p2 .. 0x1.c0fffffffffffp2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.5800000000000p2 .. 0x1.6000000000000p2], + {{ "r2" }}, + [0x1.5800000000000p2 .. 0x1.c0fffffffffffp2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.6000000000000p2 .. 0x1.6800000000000p2], + {{ "r2" }}, + [0x1.6000000000000p2 .. 0x1.c0fffffffffffp2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.6800000000000p2 .. 0x1.7000000000000p2], + {{ "r2" }}, + [0x1.6800000000000p2 .. 0x1.c0fffffffffffp2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.7000000000000p2 .. 0x1.7800000000000p2], + {{ "r2" }}, + [0x1.7000000000000p2 .. 0x1.c0fffffffffffp2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.7800000000000p2 .. 0x1.8000000000000p2], + {{ "r2" }}, + [0x1.7800000000000p2 .. 0x1.c0fffffffffffp2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.8000000000000p2 .. 0x1.8800000000000p2], + {{ "r2" }}, + [0x1.8000000000000p2 .. 0x1.c0fffffffffffp2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.8800000000000p2 .. 0x1.9000000000000p2], + {{ "r2" }}, + [0x1.8800000000000p2 .. 0x1.c0fffffffffffp2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.9000000000000p2 .. 0x1.9800000000000p2], + {{ "r2" }}, + [0x1.9000000000000p2 .. 0x1.c0fffffffffffp2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.9800000000000p2 .. 0x1.a000000000000p2], + {{ "r2" }}, + [0x1.9800000000000p2 .. 0x1.c0fffffffffffp2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.a000000000000p2 .. 0x1.a800000000000p2], + {{ "r2" }}, + [0x1.a000000000000p2 .. 0x1.c0fffffffffffp2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.a800000000000p2 .. 0x1.b000000000000p2], + {{ "r2" }}, + [0x1.a800000000000p2 .. 0x1.c0fffffffffffp2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.b000000000000p2 .. 0x1.b800000000000p2], + {{ "r2" }}, + [0x1.b000000000000p2 .. 0x1.c0fffffffffffp2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.b800000000000p2 .. 0x1.c000000000000p2], + {{ "r2" }}, + [0x1.b800000000000p2 .. 0x1.c0fffffffffffp2]) +[value] Recording results for nonlin_f +[value] Done for function nonlin_f +[value] computing for function Frama_C_float_interval <- main. + Called from tests/float/nonlin.c:61. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + main. + Called from share/builtin.c:55. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +[value] computing for function Frama_C_float_interval <- main. + Called from tests/float/nonlin.c:62. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + main. + Called from share/builtin.c:55. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +tests/float/nonlin.c:63:[kernel] warning: accessing out of bounds index [-18884..20166]. + assert 0 ≤ (int)((double)((double)(i*i)+2.0)) < 10; +[value] computing for function access_bits <- main. + Called from tests/float/nonlin.c:69. +[value] Recording results for access_bits +[value] Done for function access_bits +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function Frama_C_float_interval: + Frama_C_entropy_source ∈ [--..--] +[value] Values at end of function access_bits: + rbits1 ∈ {0; 1; 2} + x0 ∈ [--..--] + __retres ∈ {0; 1} +[value] Values at end of function nonlin_f: + Frama_C_entropy_source ∈ [--..--] + a ∈ [0x1.4000000000000p2 .. 0x1.c000000000000p2] + b ∈ [0x0.0000000000000p-1022 .. 0x1.0000000000000p0] + c ∈ {0x1.c000000000000p2} + r1 ∈ [0x1.4000000000000p2 .. 0x1.cffffffffffffp2] + r2 ∈ [0x1.4000000000000p2 .. 0x1.c0fffffffffffp2] + d ∈ [0x1.4000000000000p2 .. 0x1.c000000000000p2] +[value] Values at end of function main: + Frama_C_entropy_source ∈ [--..--] + a ∈ [0x1.4000000000000p2 .. 0x1.c000000000000p2] + b ∈ [0x0.0000000000000p-1022 .. 0x1.0000000000000p0] + c ∈ {0x1.c000000000000p2} + r1 ∈ [0x1.4000000000000p2 .. 0x1.cffffffffffffp2] + r2 ∈ [0x1.4000000000000p2 .. 0x1.c0fffffffffffp2] + d ∈ [0x1.4000000000000p2 .. 0x1.c000000000000p2] + i ∈ [-0x1.05ffffffffffbp2 .. 0x1.6a10080000004p1] + s ∈ [-0x1.0a00000000000p7 .. 0x1.1c00000000000p7] + zf ∈ [-0x1.12ffffffffffep4 .. 0x1.12ffffffffffep4] + s2 ∈ [-0x1.0a00000000000p8 .. 0x1.1c00000000000p8] + sq ∈ [-0x1.b37ffffffff34p-7 .. 0x1.3b10000000000p14] + h ∈ [-0x1.38d8000000000p14 .. 0x1.3250000000034p-1] + r ∈ [3..11] + z ∈ [-171874..171874] + rbits1 ∈ {0; 1; 2} + rbits2 ∈ {0; 1} + __retres ∈ {0} diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/nonlin.2.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/nonlin.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/nonlin.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/nonlin.2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,181 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/nonlin.c (with preprocessing) +[kernel] Parsing share/builtin.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ {0} + a ∈ {0} + b ∈ {0} + c ∈ {0} + r1 ∈ {0} + r2 ∈ {0} + d ∈ {0} + i ∈ {0} + s ∈ {0} + zf ∈ {0} + s2 ∈ {0} + sq ∈ {0} + h ∈ {0} + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + [5] ∈ {6} + [6] ∈ {7} + [7] ∈ {8} + [8] ∈ {9} + [9] ∈ {10} + r ∈ {0} + z ∈ {0} + rbits1 ∈ {0} + rbits2 ∈ {0} +[value] computing for function nonlin_f <- main. + Called from tests/float/nonlin.c:59. +[value] computing for function Frama_C_float_interval <- nonlin_f <- main. + Called from tests/float/nonlin.c:16. +share/builtin.h:54:[value] Function Frama_C_float_interval: precondition got status valid. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + nonlin_f <- main. + Called from share/builtin.c:55. +[value] using specification for function Frama_C_update_entropy +[value] Done for function Frama_C_update_entropy +share/builtin.h:55:[value] Function Frama_C_float_interval: postcondition got status valid. +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +[value] computing for function Frama_C_float_interval <- nonlin_f <- main. + Called from tests/float/nonlin.c:17. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + nonlin_f <- main. + Called from share/builtin.c:55. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +tests/float/nonlin.c:20:[value] Assertion got status valid. +tests/float/nonlin.c:24:[value] Assertion got status valid. +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.4000000000000p2 .. 0x1.4800000000000p2], + {{ "r2" }}, + [0x1.4000000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.4800000000000p2 .. 0x1.5000000000000p2], + {{ "r2" }}, + [0x1.4800000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.5000000000000p2 .. 0x1.5800000000000p2], + {{ "r2" }}, + [0x1.5000000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.5800000000000p2 .. 0x1.6000000000000p2], + {{ "r2" }}, + [0x1.5800000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.6000000000000p2 .. 0x1.6800000000000p2], + {{ "r2" }}, + [0x1.6000000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.6800000000000p2 .. 0x1.7000000000000p2], + {{ "r2" }}, + [0x1.6800000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.7000000000000p2 .. 0x1.7800000000000p2], + {{ "r2" }}, + [0x1.7000000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.7800000000000p2 .. 0x1.8000000000000p2], + {{ "r2" }}, + [0x1.7800000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.8000000000000p2 .. 0x1.8800000000000p2], + {{ "r2" }}, + [0x1.8000000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.8800000000000p2 .. 0x1.9000000000000p2], + {{ "r2" }}, + [0x1.8800000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.9000000000000p2 .. 0x1.9800000000000p2], + {{ "r2" }}, + [0x1.9000000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.9800000000000p2 .. 0x1.a000000000000p2], + {{ "r2" }}, + [0x1.9800000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.a000000000000p2 .. 0x1.a800000000000p2], + {{ "r2" }}, + [0x1.a000000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.a800000000000p2 .. 0x1.b000000000000p2], + {{ "r2" }}, + [0x1.a800000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.b000000000000p2 .. 0x1.b800000000000p2], + {{ "r2" }}, + [0x1.b000000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.b800000000000p2 .. 0x1.c000000000000p2], + {{ "r2" }}, + [0x1.b800000000000p2 .. 0x1.c800000000000p2]) +[value] Recording results for nonlin_f +[value] Done for function nonlin_f +[value] computing for function Frama_C_float_interval <- main. + Called from tests/float/nonlin.c:61. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + main. + Called from share/builtin.c:55. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +[value] computing for function Frama_C_float_interval <- main. + Called from tests/float/nonlin.c:62. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + main. + Called from share/builtin.c:55. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +tests/float/nonlin.c:63:[kernel] warning: accessing out of bounds index [-18884..20166]. + assert 0 ≤ (int)((double)((double)((float)(i*i))+2.0)) < 10; +[value] computing for function access_bits <- main. + Called from tests/float/nonlin.c:69. +[value] Recording results for access_bits +[value] Done for function access_bits +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function Frama_C_float_interval: + Frama_C_entropy_source ∈ [--..--] +[value] Values at end of function access_bits: + rbits1 ∈ {0; 1; 2} + x0 ∈ [0..3271884800] + __retres ∈ {0; 1} +[value] Values at end of function nonlin_f: + Frama_C_entropy_source ∈ [--..--] + a ∈ [0x1.4000000000000p2 .. 0x1.c000000000000p2] + b ∈ [0x0.0000000000000p-1022 .. 0x1.0000000000000p0] + c ∈ {0x1.c000000000000p2} + r1 ∈ [0x1.4000000000000p2 .. 0x1.2000000000000p3] + r2 ∈ [0x1.4000000000000p2 .. 0x1.c800000000000p2] + d ∈ [0x1.4000000000000p2 .. 0x1.c000000000000p2] +[value] Values at end of function main: + Frama_C_entropy_source ∈ [--..--] + a ∈ [0x1.4000000000000p2 .. 0x1.c000000000000p2] + b ∈ [0x0.0000000000000p-1022 .. 0x1.0000000000000p0] + c ∈ {0x1.c000000000000p2} + r1 ∈ [0x1.4000000000000p2 .. 0x1.2000000000000p3] + r2 ∈ [0x1.4000000000000p2 .. 0x1.c800000000000p2] + d ∈ [0x1.4000000000000p2 .. 0x1.c000000000000p2] + i ∈ [-0x1.0a00000000000p7 .. 0x1.1c00000000000p7] + s ∈ [-0x1.0a00000000000p7 .. 0x1.1c00000000000p7] + zf ∈ [-0x1.1300000000000p8 .. 0x1.1300000000000p8] + s2 ∈ [-0x1.0a00000000000p8 .. 0x1.1c00000000000p8] + sq ∈ [-0x1.2718000000000p14 .. 0x1.3b10000000000p14] + h ∈ [-0x1.38d8000000000p14 .. 0x1.2950000000000p14] + r ∈ [2..11] + z ∈ [-2750000..2750000] + rbits1 ∈ {0; 1; 2} + rbits2 ∈ {0; 1} + __retres ∈ {0} diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/nonlin.3.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/nonlin.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/nonlin.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/nonlin.3.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,181 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/nonlin.c (with preprocessing) +[kernel] Parsing share/builtin.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ {0} + a ∈ {0} + b ∈ {0} + c ∈ {0} + r1 ∈ {0} + r2 ∈ {0} + d ∈ {0} + i ∈ {0} + s ∈ {0} + zf ∈ {0} + s2 ∈ {0} + sq ∈ {0} + h ∈ {0} + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + [5] ∈ {6} + [6] ∈ {7} + [7] ∈ {8} + [8] ∈ {9} + [9] ∈ {10} + r ∈ {0} + z ∈ {0} + rbits1 ∈ {0} + rbits2 ∈ {0} +[value] computing for function nonlin_f <- main. + Called from tests/float/nonlin.c:59. +[value] computing for function Frama_C_float_interval <- nonlin_f <- main. + Called from tests/float/nonlin.c:16. +share/builtin.h:54:[value] Function Frama_C_float_interval: precondition got status valid. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + nonlin_f <- main. + Called from share/builtin.c:55. +[value] using specification for function Frama_C_update_entropy +[value] Done for function Frama_C_update_entropy +share/builtin.h:55:[value] Function Frama_C_float_interval: postcondition got status valid. +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +[value] computing for function Frama_C_float_interval <- nonlin_f <- main. + Called from tests/float/nonlin.c:17. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + nonlin_f <- main. + Called from share/builtin.c:55. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +tests/float/nonlin.c:20:[value] Assertion got status valid. +tests/float/nonlin.c:24:[value] Assertion got status valid. +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.4000000000000p2 .. 0x1.4800000000000p2], + {{ "r2" }}, + [0x1.4000000000000p2 .. 0x1.c0fffe0000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.4800000000000p2 .. 0x1.5000000000000p2], + {{ "r2" }}, + [0x1.4800000000000p2 .. 0x1.c0fffe0000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.5000000000000p2 .. 0x1.5800000000000p2], + {{ "r2" }}, + [0x1.5000000000000p2 .. 0x1.c0fffe0000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.5800000000000p2 .. 0x1.6000000000000p2], + {{ "r2" }}, + [0x1.5800000000000p2 .. 0x1.c0fffe0000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.6000000000000p2 .. 0x1.6800000000000p2], + {{ "r2" }}, + [0x1.6000000000000p2 .. 0x1.c0fffe0000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.6800000000000p2 .. 0x1.7000000000000p2], + {{ "r2" }}, + [0x1.6800000000000p2 .. 0x1.c0fffe0000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.7000000000000p2 .. 0x1.7800000000000p2], + {{ "r2" }}, + [0x1.7000000000000p2 .. 0x1.c0fffe0000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.7800000000000p2 .. 0x1.8000000000000p2], + {{ "r2" }}, + [0x1.7800000000000p2 .. 0x1.c0fffe0000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.8000000000000p2 .. 0x1.8800000000000p2], + {{ "r2" }}, + [0x1.8000000000000p2 .. 0x1.c0fffe0000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.8800000000000p2 .. 0x1.9000000000000p2], + {{ "r2" }}, + [0x1.8800000000000p2 .. 0x1.c0fffe0000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.9000000000000p2 .. 0x1.9800000000000p2], + {{ "r2" }}, + [0x1.9000000000000p2 .. 0x1.c0fffe0000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.9800000000000p2 .. 0x1.a000000000000p2], + {{ "r2" }}, + [0x1.9800000000000p2 .. 0x1.c0fffe0000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.a000000000000p2 .. 0x1.a800000000000p2], + {{ "r2" }}, + [0x1.a000000000000p2 .. 0x1.c0fffe0000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.a800000000000p2 .. 0x1.b000000000000p2], + {{ "r2" }}, + [0x1.a800000000000p2 .. 0x1.c0fffe0000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.b000000000000p2 .. 0x1.b800000000000p2], + {{ "r2" }}, + [0x1.b000000000000p2 .. 0x1.c0fffe0000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.b800000000000p2 .. 0x1.c000000000000p2], + {{ "r2" }}, + [0x1.b800000000000p2 .. 0x1.c0fffe0000000p2]) +[value] Recording results for nonlin_f +[value] Done for function nonlin_f +[value] computing for function Frama_C_float_interval <- main. + Called from tests/float/nonlin.c:61. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + main. + Called from share/builtin.c:55. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +[value] computing for function Frama_C_float_interval <- main. + Called from tests/float/nonlin.c:62. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + main. + Called from share/builtin.c:55. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +tests/float/nonlin.c:63:[kernel] warning: accessing out of bounds index [-18884..20166]. + assert 0 ≤ (int)((double)((double)((float)(i*i))+2.0)) < 10; +[value] computing for function access_bits <- main. + Called from tests/float/nonlin.c:69. +[value] Recording results for access_bits +[value] Done for function access_bits +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function Frama_C_float_interval: + Frama_C_entropy_source ∈ [--..--] +[value] Values at end of function access_bits: + rbits1 ∈ {0; 1; 2} + x0 ∈ [0..3229810683] + __retres ∈ {0; 1} +[value] Values at end of function nonlin_f: + Frama_C_entropy_source ∈ [--..--] + a ∈ [0x1.4000000000000p2 .. 0x1.c000000000000p2] + b ∈ [0x0.0000000000000p-1022 .. 0x1.0000000000000p0] + c ∈ {0x1.c000000000000p2} + r1 ∈ [0x1.4000000000000p2 .. 0x1.cffffe0000000p2] + r2 ∈ [0x1.4000000000000p2 .. 0x1.c0fffe0000000p2] + d ∈ [0x1.4000000000000p2 .. 0x1.c000000000000p2] +[value] Values at end of function main: + Frama_C_entropy_source ∈ [--..--] + a ∈ [0x1.4000000000000p2 .. 0x1.c000000000000p2] + b ∈ [0x0.0000000000000p-1022 .. 0x1.0000000000000p0] + c ∈ {0x1.c000000000000p2} + r1 ∈ [0x1.4000000000000p2 .. 0x1.cffffe0000000p2] + r2 ∈ [0x1.4000000000000p2 .. 0x1.c0fffe0000000p2] + d ∈ [0x1.4000000000000p2 .. 0x1.c000000000000p2] + i ∈ [-0x1.05fff60000000p2 .. 0x1.6a100c0000000p1] + s ∈ [-0x1.0a00000000000p7 .. 0x1.1c00000000000p7] + zf ∈ [-0x1.12fffc0000000p4 .. 0x1.12fffc0000000p4] + s2 ∈ [-0x1.0a00000000000p8 .. 0x1.1c00000000000p8] + sq ∈ [-0x1.b37e680000000p-7 .. 0x1.3b10000000000p14] + h ∈ [-0x1.38d8000000000p14 .. 0x1.3250680000000p-1] + r ∈ [3..11] + z ∈ [-171874..171874] + rbits1 ∈ {0; 1; 2} + rbits2 ∈ {0; 1} + __retres ∈ {0} diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/nonlin.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/nonlin.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/nonlin.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/nonlin.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,181 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/nonlin.c (with preprocessing) +[kernel] Parsing share/builtin.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ {0} + a ∈ {0} + b ∈ {0} + c ∈ {0} + r1 ∈ {0} + r2 ∈ {0} + d ∈ {0} + i ∈ {0} + s ∈ {0} + zf ∈ {0} + s2 ∈ {0} + sq ∈ {0} + h ∈ {0} + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + [5] ∈ {6} + [6] ∈ {7} + [7] ∈ {8} + [8] ∈ {9} + [9] ∈ {10} + r ∈ {0} + z ∈ {0} + rbits1 ∈ {0} + rbits2 ∈ {0} +[value] computing for function nonlin_f <- main. + Called from tests/float/nonlin.c:59. +[value] computing for function Frama_C_float_interval <- nonlin_f <- main. + Called from tests/float/nonlin.c:16. +share/builtin.h:54:[value] Function Frama_C_float_interval: precondition got status valid. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + nonlin_f <- main. + Called from share/builtin.c:55. +[value] using specification for function Frama_C_update_entropy +[value] Done for function Frama_C_update_entropy +share/builtin.h:55:[value] Function Frama_C_float_interval: postcondition got status valid. +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +[value] computing for function Frama_C_float_interval <- nonlin_f <- main. + Called from tests/float/nonlin.c:17. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + nonlin_f <- main. + Called from share/builtin.c:55. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +tests/float/nonlin.c:20:[value] Assertion got status valid. +tests/float/nonlin.c:24:[value] Assertion got status valid. +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.4000000000000p2 .. 0x1.4800000000000p2], + {{ "r2" }}, + [0x1.4000000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.4800000000000p2 .. 0x1.5000000000000p2], + {{ "r2" }}, + [0x1.4800000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.5000000000000p2 .. 0x1.5800000000000p2], + {{ "r2" }}, + [0x1.5000000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.5800000000000p2 .. 0x1.6000000000000p2], + {{ "r2" }}, + [0x1.5800000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.6000000000000p2 .. 0x1.6800000000000p2], + {{ "r2" }}, + [0x1.6000000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.6800000000000p2 .. 0x1.7000000000000p2], + {{ "r2" }}, + [0x1.6800000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.7000000000000p2 .. 0x1.7800000000000p2], + {{ "r2" }}, + [0x1.7000000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.7800000000000p2 .. 0x1.8000000000000p2], + {{ "r2" }}, + [0x1.7800000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.8000000000000p2 .. 0x1.8800000000000p2], + {{ "r2" }}, + [0x1.8000000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.8800000000000p2 .. 0x1.9000000000000p2], + {{ "r2" }}, + [0x1.8800000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.9000000000000p2 .. 0x1.9800000000000p2], + {{ "r2" }}, + [0x1.9000000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.9800000000000p2 .. 0x1.a000000000000p2], + {{ "r2" }}, + [0x1.9800000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.a000000000000p2 .. 0x1.a800000000000p2], + {{ "r2" }}, + [0x1.a000000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.a800000000000p2 .. 0x1.b000000000000p2], + {{ "r2" }}, + [0x1.a800000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.b000000000000p2 .. 0x1.b800000000000p2], + {{ "r2" }}, + [0x1.b000000000000p2 .. 0x1.c800000000000p2]) +[value] Called Frama_C_show_each_a_r2({{ "a" }}, + [0x1.b800000000000p2 .. 0x1.c000000000000p2], + {{ "r2" }}, + [0x1.b800000000000p2 .. 0x1.c800000000000p2]) +[value] Recording results for nonlin_f +[value] Done for function nonlin_f +[value] computing for function Frama_C_float_interval <- main. + Called from tests/float/nonlin.c:61. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + main. + Called from share/builtin.c:55. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +[value] computing for function Frama_C_float_interval <- main. + Called from tests/float/nonlin.c:62. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + main. + Called from share/builtin.c:55. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +tests/float/nonlin.c:63:[kernel] warning: accessing out of bounds index [-18884..20166]. + assert 0 ≤ (int)((double)((double)(i*i)+2.0)) < 10; +[value] computing for function access_bits <- main. + Called from tests/float/nonlin.c:69. +[value] Recording results for access_bits +[value] Done for function access_bits +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function Frama_C_float_interval: + Frama_C_entropy_source ∈ [--..--] +[value] Values at end of function access_bits: + rbits1 ∈ {0; 1; 2} + x0 ∈ [--..--] + __retres ∈ {0; 1} +[value] Values at end of function nonlin_f: + Frama_C_entropy_source ∈ [--..--] + a ∈ [0x1.4000000000000p2 .. 0x1.c000000000000p2] + b ∈ [0x0.0000000000000p-1022 .. 0x1.0000000000000p0] + c ∈ {0x1.c000000000000p2} + r1 ∈ [0x1.4000000000000p2 .. 0x1.2000000000000p3] + r2 ∈ [0x1.4000000000000p2 .. 0x1.c800000000000p2] + d ∈ [0x1.4000000000000p2 .. 0x1.c000000000000p2] +[value] Values at end of function main: + Frama_C_entropy_source ∈ [--..--] + a ∈ [0x1.4000000000000p2 .. 0x1.c000000000000p2] + b ∈ [0x0.0000000000000p-1022 .. 0x1.0000000000000p0] + c ∈ {0x1.c000000000000p2} + r1 ∈ [0x1.4000000000000p2 .. 0x1.2000000000000p3] + r2 ∈ [0x1.4000000000000p2 .. 0x1.c800000000000p2] + d ∈ [0x1.4000000000000p2 .. 0x1.c000000000000p2] + i ∈ [-0x1.0a00000000000p7 .. 0x1.1c00000000000p7] + s ∈ [-0x1.0a00000000000p7 .. 0x1.1c00000000000p7] + zf ∈ [-0x1.1300000000000p8 .. 0x1.1300000000000p8] + s2 ∈ [-0x1.0a00000000000p8 .. 0x1.1c00000000000p8] + sq ∈ [-0x1.2718000000000p14 .. 0x1.3b10000000000p14] + h ∈ [-0x1.38d8000000000p14 .. 0x1.2950000000000p14] + r ∈ [2..11] + z ∈ [-2750000..2750000] + rbits1 ∈ {0; 1; 2} + rbits2 ∈ {0; 1} + __retres ∈ {0} diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/parse.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/parse.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/parse.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/parse.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/parse.i (no preprocessing) +tests/float/parse.i:25:[kernel] warning: Floating-point constant 0.00000000000000000000000000000000000000001e310 is not represented exactly. Will use 0x1.83a99c3ec7eb0p893 +tests/float/parse.i:30:[kernel] warning: Floating-point constant 0.0000001E9999999999999999999 is not represented exactly. Will use inf +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] +[value] Called Frama_C_show_each({0}, {{ "reached" }}) +[value] Called Frama_C_show_each({0}, {{ "reached" }}) +[value] Called Frama_C_show_each({0}, {0}, {{ "reached" }}) +[value] Called Frama_C_show_each({0x1.83a99c3ec7eb0p893}, {{ "reached" }}) +tests/float/parse.i:30:[kernel] warning: non-finite double value (INFINITY): + assert \is_finite(0.0000001E9999999999999999999); +tests/float/parse.i:30:[value] Floating-point literal (or constant expression) is not finite. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + d; d_0; d1; d2; d_1; d_2; __retres +[inout] Inputs for function main: + v diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/precise_cos_sin.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/precise_cos_sin.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/precise_cos_sin.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/precise_cos_sin.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,72 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/precise_cos_sin.i (no preprocessing) +[kernel] Parsing share/builtin.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ {0} +[value] computing for function Frama_C_float_interval <- main. + Called from tests/float/precise_cos_sin.i:10. +[value] computing for function Frama_C_update_entropy <- Frama_C_float_interval <- + main. + Called from share/builtin.c:55. +[value] using specification for function Frama_C_update_entropy +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_float_interval +[value] Done for function Frama_C_float_interval +[value] Called Frama_C_show_each_s([-1.6214298009872436*2^-3 .. 1.4685190916061401*2^-5]) +[value] Called Frama_C_show_each_c([-1.0000000000000000 .. -1.9584906101226807*2^-1]) +[value] Called Frama_C_show_each_s([-1.7545883655548095*2^-2 .. -1.6214298009872436*2^-3]) +[value] Called Frama_C_show_each_c([-1.9584906101226807*2^-1 .. -1.7973188161849975*2^-1]) +[value] Called Frama_C_show_each_s([-1.2946850061416626*2^-1 .. -1.7545883655548095*2^-2]) +[value] Called Frama_C_show_each_c([-1.7973188161849975*2^-1 .. -1.5243984460830688*2^-1]) +[value] Called Frama_C_show_each_s([-1.6315786838531494*2^-1 .. -1.2946850061416626*2^-1]) +[value] Called Frama_C_show_each_c([-1.5243984460830688*2^-1 .. -1.1566983461380005*2^-1]) +[value] Called Frama_C_show_each_s([-1.8670285940170288*2^-1 .. -1.6315786838531494*2^-1]) +[value] Called Frama_C_show_each_c([-1.1566983461380005*2^-1 .. -1.4341608285903930*2^-2]) +[value] Called Frama_C_show_each_s([-1.9863957166671753*2^-1 .. -1.8670285940170288*2^-1]) +[value] Called Frama_C_show_each_c([-1.4341608285903930*2^-2 .. -1.8630230426788330*2^-4]) +[value] Called Frama_C_show_each_s([-1.0000000000000000 .. -1.9822584390640259*2^-1]) +[value] Called Frama_C_show_each_c([-1.8630230426788330*2^-4 .. 1.0632156133651733*2^-3]) +[value] Called Frama_C_show_each_s([-1.9822584390640259*2^-1 .. -1.8548737764358520*2^-1]) +[value] Called Frama_C_show_each_c([1.0632156133651733*2^-3 .. 1.4959185123443604*2^-2]) +[value] Called Frama_C_show_each_s([-1.8548737764358520*2^-1 .. -1.6121622323989868*2^-1]) +[value] Called Frama_C_show_each_c([1.4959185123443604*2^-2 .. 1.1836102008819580*2^-1]) +[value] Called Frama_C_show_each_s([-1.6121622323989868*2^-1 .. -1.2692141532897949*2^-1]) +[value] Called Frama_C_show_each_c([1.1836102008819580*2^-1 .. 1.5456699132919311*2^-1]) +[value] Called Frama_C_show_each_s([-1.2692141532897949*2^-1 .. -1.6947050094604492*2^-2]) +[value] Called Frama_C_show_each_c([1.5456699132919311*2^-1 .. 1.8116273880004883*2^-1]) +[value] Called Frama_C_show_each_s([-1.6947050094604492*2^-2 .. -1.4912263154983521*2^-3]) +[value] Called Frama_C_show_each_c([1.8116273880004883*2^-1 .. 1.9649466276168823*2^-1]) +[value] Called Frama_C_show_each_s([-1.4912263154983521*2^-3 .. 1.9986981153488159*2^-5]) +[value] Called Frama_C_show_each_c([1.9649466276168823*2^-1 .. 1.0000000000000000]) +[value] Called Frama_C_show_each_s([1.9986981153488159*2^-5 .. 1.2297540903091430*2^-2]) +[value] Called Frama_C_show_each_c([1.9031358957290649*2^-1 .. 1.9960950613021851*2^-1]) +[value] Called Frama_C_show_each_s([1.2297540903091430*2^-2 .. 1.0666053295135498*2^-1]) +[value] Called Frama_C_show_each_c([1.6918489933013916*2^-1 .. 1.9031358957290649*2^-1]) +[value] Called Frama_C_show_each_s([1.0666053295135498*2^-1 .. 1.4520173072814941*2^-1]) +[value] Called Frama_C_show_each_c([1.3753710985183716*2^-1 .. 1.6918489933013916*2^-1]) +[value] Called Frama_C_show_each_s([1.4520173072814941*2^-1 .. 1.7471498250961303*2^-1]) +[value] Called Frama_C_show_each_c([1.9467586278915405*2^-2 .. 1.3753710985183716*2^-1]) +[value] Called Frama_C_show_each_s([1.7471498250961303*2^-1 .. 1.9336531162261963*2^-1]) +[value] Called Frama_C_show_each_c([1.0217350721359252*2^-2 .. 1.9467586278915405*2^-2]) +[value] Called Frama_C_show_each_s([1.9336531162261963*2^-1 .. 1.9999312162399292*2^-1]) +[value] Called Frama_C_show_each_c([1.0619176626205444*2^-7 .. 1.0217350721359252*2^-2]) +[value] Called Frama_C_show_each_s([1.9418631792068481*2^-1 .. 1.0000000000000000]) +[value] Called Frama_C_show_each_c([-1.9148570299148559*2^-3 .. 1.0619176626205444*2^-7]) +[value] Called Frama_C_show_each_s([1.7630596160888672*2^-1 .. 1.9418631792068481*2^-1]) +[value] Called Frama_C_show_each_c([-1.8885136842727661*2^-2 .. -1.9148570299148559*2^-3]) +[value] Called Frama_C_show_each_s([1.4746373891830444*2^-1 .. 1.7630596160888672*2^-1]) +[value] Called Frama_C_show_each_c([-1.3510900735855102*2^-1 .. -1.8885136842727661*2^-2]) +[value] Called Frama_C_show_each_s([1.0945295095443725*2^-1 .. 1.4746373891830444*2^-1]) +[value] Called Frama_C_show_each_c([-1.6739190816879272*2^-1 .. -1.3510900735855102*2^-1]) +[value] Called Frama_C_show_each_s([1.2927380800247192*2^-2 .. 1.0945295095443725*2^-1]) +[value] Called Frama_C_show_each_c([-1.8926719427108764*2^-1 .. -1.6739190816879272*2^-1]) +[value] Called Frama_C_show_each_s([1.2641634941101074*2^-4 .. 1.2927380800247192*2^-2]) +[value] Called Frama_C_show_each_c([-1.9937475919723511*2^-1 .. -1.8926719427108764*2^-1]) +[value] Called Frama_C_show_each_s([-1.4685190916061401*2^-5 .. 1.2641634941101074*2^-4]) +[value] Called Frama_C_show_each_c([-1.0000000000000000 .. -1.9937475919723511*2^-1]) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/round10d.1.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/round10d.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/round10d.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/round10d.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,24 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/round10d.i (no preprocessing) +tests/float/round10d.i:9:[kernel] warning: Floating-point constant 0.1 is not represented exactly. Will use 0x1.999999999999ap-4. See documentation for option -warn-decimal-float +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Called Frama_C_show_each_dixieme({1.6000000000000000*2^-4}) +[value] Called Frama_C_show_each_t({1.6000000000000000*2^-4}) +[value] Called Frama_C_show_each_t({1.6000000000000000*2^-3}) +[value] Called Frama_C_show_each_t([1.1999999999999999*2^-2 .. 1.2000000000000001*2^-2]) +[value] Called Frama_C_show_each_t([1.5999999999999998*2^-2 .. 1.6000000000000003*2^-2]) +[value] Called Frama_C_show_each_t([1.9999999999999998*2^-2 .. 1.0000000000000002*2^-1]) +[value] Called Frama_C_show_each_t([1.1999999999999997*2^-1 .. 1.2000000000000004*2^-1]) +[value] Called Frama_C_show_each_t([1.3999999999999997*2^-1 .. 1.4000000000000006*2^-1]) +[value] Called Frama_C_show_each_t([1.5999999999999996*2^-1 .. 1.6000000000000007*2^-1]) +[value] Called Frama_C_show_each_t([1.7999999999999996*2^-1 .. 1.8000000000000009*2^-1]) +[value] Called Frama_C_show_each_t([1.9999999999999996*2^-1 .. 1.0000000000000006]) +tests/float/round10d.i:11:[value] entering loop for the first time +tests/float/round10d.i:16:[value] Assertion got status unknown. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/round10d.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/round10d.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/round10d.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/round10d.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,24 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/round10d.i (no preprocessing) +tests/float/round10d.i:9:[kernel] warning: Floating-point constant 0.1 is not represented exactly. Will use 0x1.999999999999ap-4. See documentation for option -warn-decimal-float +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Called Frama_C_show_each_dixieme({1.6000000000000000*2^-4}) +[value] Called Frama_C_show_each_t({1.6000000000000000*2^-4}) +[value] Called Frama_C_show_each_t({1.6000000000000000*2^-3}) +[value] Called Frama_C_show_each_t({1.2000000000000001*2^-2}) +[value] Called Frama_C_show_each_t({1.6000000000000000*2^-2}) +[value] Called Frama_C_show_each_t({1.0000000000000000*2^-1}) +[value] Called Frama_C_show_each_t({1.1999999999999999*2^-1}) +[value] Called Frama_C_show_each_t({1.3999999999999999*2^-1}) +[value] Called Frama_C_show_each_t({1.5999999999999998*2^-1}) +[value] Called Frama_C_show_each_t({1.7999999999999998*2^-1}) +[value] Called Frama_C_show_each_t({1.9999999999999998*2^-1}) +tests/float/round10d.i:11:[value] entering loop for the first time +tests/float/round10d.i:16:[value] Assertion got status invalid (stopping propagation). +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/s.1.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/s.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/s.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/s.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,340 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/s.i (no preprocessing) +tests/float/s.i:18:[kernel] warning: Floating-point constant 1.882f is not represented exactly. Will use 0x1.e1cac00000000p0. See documentation for option -warn-decimal-float +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G3 ∈ {42} + G5[0..63] ∈ {0} + G6 ∈ {42} + G7 ∈ {0} + G8 ∈ {0} + G9[0] ∈ {0x1.0000000000000p1} + [1] ∈ {0x1.e1cac00000000p0} + [2] ∈ {0x1.c72b020000000p0} + [3] ∈ {0x1.af1aa00000000p0} + [4] ∈ {0x1.99999a0000000p0} + [5] ∈ {0x1.85e3540000000p0} + [6] ∈ {0x1.747ae20000000p0} + [7] ∈ {0x1.6418940000000p0} + [8] ∈ {0x1.553f7c0000000p0} + [9] ∈ {0x1.47ae140000000p0} + [10] ∈ {0x1.3b22d00000000p0} + [11] ∈ {0x1.2f5c280000000p0} + [12] ∈ {0x1.249ba60000000p0} + [13] ∈ {0x1.1020c40000000p0} + [14] ∈ {0x1.0000000000000p0} + [15] ∈ {0x1.e353f80000000p-1} + [16] ∈ {0x1.ca3d700000000p-1} + [17] ∈ {0x1.b333340000000p-1} + [18] ∈ {0x1.9eb8520000000p-1} + [19] ∈ {0x1.8bc6a80000000p-1} + [20] ∈ {0x1.7a5e360000000p-1} + [21] ∈ {0x1.6a7efa0000000p-1} + [22] ∈ {0x1.5c28f60000000p-1} + [23] ∈ {0x1.4ed9160000000p-1} + [24] ∈ {0x1.428f5c0000000p-1} + [25] ∈ {0x1.36c8b40000000p-1} + [26] ∈ {0x1.2c08320000000p-1} + [27] ∈ {0x1.224dd20000000p-1} + [28] ∈ {0x1.1893740000000p-1} + [29] ∈ {0x1.0000000000000p-1} + [30] ∈ {0x1.e24dd20000000p-2} + [31] ∈ {0x1.c6a7f00000000p-2} + [32] ∈ {0x1.af1aa00000000p-2} + [33] ∈ {0x1.99999a0000000p-2} + [34] ∈ {0x1.8624de0000000p-2} + [35] ∈ {0x1.74bc6a0000000p-2} + [36] ∈ {0x1.645a1c0000000p-2} + [37] ∈ {0x1.54fdf40000000p-2} + [38] ∈ {0x1.47ae140000000p-2} + [39] ∈ {0x1.3b645a0000000p-2} + [40] ∈ {0x1.2f1aa00000000p-2} + [41] ∈ {0x1.24dd300000000p-2} + [42] ∈ {0x1.1a9fbe0000000p-2} + [43] ∈ {0x1.1168720000000p-2} + [44] ∈ {0x1.0831260000000p-2} + [45] ∈ {0x1.0000000000000p-2} + [46] ∈ {0x1.e353f80000000p-3} + [47] ∈ {0x1.c6a7f00000000p-3} + [48] ∈ {0x1.b020c40000000p-3} + [49] ∈ {0x1.99999a0000000p-3} + [50] ∈ {0x1.851eb80000000p-3} + [51] ∈ {0x1.74bc6a0000000p-3} + [52] ∈ {0x1.645a1c0000000p-3} + [53] ∈ {0x1.5604180000000p-3} + [54] ∈ {0x1.47ae140000000p-3} + [55] ∈ {0x1.3b645a0000000p-3} + [56] ∈ {0x1.2f1aa00000000p-3} + [57] ∈ {0x1.24dd300000000p-3} + [58] ∈ {0x1.1a9fbe0000000p-3} + [59] ∈ {0x1.10624e0000000p-3} + [60] ∈ {0x1.0831260000000p-3} + [61] ∈ {0x1.0000000000000p-3} + [62] ∈ {0x1.e353f80000000p-4} + [63] ∈ {0x1.c6a7f00000000p-4} + G10[0] ∈ {0x1.a1e8c60000000p-5} + [1] ∈ {0x1.af8fa40000000p-5} + [2] ∈ {0x1.c09e7a0000000p-5} + [3] ∈ {0x1.ce42800000000p-5} + [4] ∈ {0x1.df4da60000000p-5} + [5] ∈ {0x1.f056a60000000p-5} + [6] ∈ {0x1.0262740000000p-4} + [7] ∈ {0x1.0c97e80000000p-4} + [8] ∈ {0x1.16cba00000000p-4} + [9] ∈ {0x1.2463180000000p-4} + [10] ∈ {0x1.3044e20000000p-4} + [11] ∈ {0x1.3f87cc0000000p-4} + [12] ∈ {0x1.4ec6100000000p-4} + [13] ∈ {0x1.6160dc0000000p-4} + [14] ∈ {0x1.73f3fa0000000p-4} + [15] ∈ {0x1.89dd340000000p-4} + [16] ∈ {0x1.a3167c0000000p-4} + [17] ∈ {0x1.b083800000000p-4} + [18] ∈ {0x1.bdeb8c0000000p-4} + [19] ∈ {0x1.ccfa780000000p-4} + [20] ∈ {0x1.ddadd40000000p-4} + [21] ∈ {0x1.f002ce0000000p-4} + [22] ∈ {0x1.0126800000000p-3} + [23] ∈ {0x1.0b1a0a0000000p-3} + [24] ∈ {0x1.15da100000000p-3} + [25] ∈ {0x1.2236fa0000000p-3} + [26] ∈ {0x1.2f59f00000000p-3} + [27] ∈ {0x1.3d3fca0000000p-3} + [28] ∈ {0x1.4cb4ae0000000p-3} + [29] ∈ {0x1.5db0f00000000p-3} + [30] ∈ {0x1.702b7a0000000p-3} + [31] ∈ {0x1.85aff00000000p-3} + [32] ∈ {0x1.9c93820000000p-3} + [33] ∈ {0x1.a9e1aa0000000p-3} + [34] ∈ {0x1.b719b40000000p-3} + [35] ∈ {0x1.c5c4dc0000000p-3} + [36] ∈ {0x1.d515d80000000p-3} + [37] ∈ {0x1.e5c7f00000000p-3} + [38] ∈ {0x1.f64fcc0000000p-3} + [39] ∈ {0x1.0471d00000000p-2} + [40] ∈ {0x1.0e59140000000p-2} + [41] ∈ {0x1.1930760000000p-2} + [42] ∈ {0x1.24e8cc0000000p-2} + [43] ∈ {0x1.3170760000000p-2} + [44] ∈ {0x1.3eb3140000000p-2} + [45] ∈ {0x1.4d402c0000000p-2} + [46] ∈ {0x1.5cebf20000000p-2} + [47] ∈ {0x1.6dcf5c0000000p-2} + [48] ∈ {0x1.7fea3e0000000p-2} + [49] ∈ {0x1.89682c0000000p-2} + [50] ∈ {0x1.935f9c0000000p-2} + [51] ∈ {0x1.9d75840000000p-2} + [52] ∈ {0x1.a8112c0000000p-2} + [53] ∈ {0x1.b2943c0000000p-2} + [54] ∈ {0x1.bd88ba0000000p-2} + [55] ∈ {0x1.c87cb20000000p-2} + [56] ∈ {0x1.d335de0000000p-2} + [57] ∈ {0x1.ddc3220000000p-2} + [58] ∈ {0x1.e7dc420000000p-2} + [59] ∈ {0x1.f0dc4a0000000p-2} + [60] ∈ {0x1.f88a800000000p-2} + [61] ∈ {0x1.fde7e00000000p-2} + [62] ∈ {0x1.fffff40000000p-2} + [63] ∈ {0x1.fd48c00000000p-2} + G11[0] ∈ {0x1.fd53fe0000000p0} + [1] ∈ {0x1.fd26740000000p0} + [2] ∈ {0x1.fceb760000000p0} + [3] ∈ {0x1.fcbaa00000000p0} + [4] ∈ {0x1.fc7b840000000p0} + [5] ∈ {0x1.fc3a220000000p0} + [6] ∈ {0x1.fbe8a60000000p0} + [7] ∈ {0x1.fb93e20000000p0} + [8] ∈ {0x1.fb3bd60000000p0} + [9] ∈ {0x1.fac1560000000p0} + [10] ∈ {0x1.fa51600000000p0} + [11] ∈ {0x1.f9bade0000000p0} + [12] ∈ {0x1.f91cfe0000000p0} + [13] ∈ {0x1.f852100000000p0} + [14] ∈ {0x1.f77c2c0000000p0} + [15] ∈ {0x1.f671460000000p0} + [16] ∈ {0x1.f52a5c0000000p0} + [17] ∈ {0x1.f473b80000000p0} + [18] ∈ {0x1.f3b7540000000p0} + [19] ∈ {0x1.f2dc840000000p0} + [20] ∈ {0x1.f1e0e00000000p0} + [21] ∈ {0x1.f0c1be0000000p0} + [22] ∈ {0x1.ef97ce0000000p0} + [23] ∈ {0x1.ee46800000000p0} + [24] ∈ {0x1.eccaa80000000p0} + [25] ∈ {0x1.eb01ca0000000p0} + [26] ∈ {0x1.e904940000000p0} + [27] ∈ {0x1.e6cee80000000p0} + [28] ∈ {0x1.e438c60000000p0} + [29] ∈ {0x1.e138680000000p0} + [30] ∈ {0x1.ddc3220000000p0} + [31] ∈ {0x1.d979fa0000000p0} + [32] ∈ {0x1.d49a7e0000000p0} + [33] ∈ {0x1.d19e3e0000000p0} + [34] ∈ {0x1.ce89d00000000p0} + [35] ∈ {0x1.cafc360000000p0} + [36] ∈ {0x1.c71e960000000p0} + [37] ∈ {0x1.c2b83a0000000p0} + [38] ∈ {0x1.be2aae0000000p0} + [39] ∈ {0x1.b8cf1e0000000p0} + [40] ∈ {0x1.b2ce400000000p0} + [41] ∈ {0x1.abdfde0000000p0} + [42] ∈ {0x1.a3f02e0000000p0} + [43] ∈ {0x1.9aea260000000p0} + [44] ∈ {0x1.90b7b60000000p0} + [45] ∈ {0x1.84b34c0000000p0} + [46] ∈ {0x1.76b2600000000p0} + [47] ∈ {0x1.663a460000000p0} + [48] ∈ {0x1.52c0a60000000p0} + [49] ∈ {0x1.47ae660000000p0} + [50] ∈ {0x1.3b54d20000000p0} + [51] ∈ {0x1.2dfc740000000p0} + [52] ∈ {0x1.1ee6300000000p0} + [53] ∈ {0x1.0eb64e0000000p0} + [54] ∈ {0x1.f88d840000000p-1} + [55] ∈ {0x1.cfbd460000000p-1} + [56] ∈ {0x1.a2d91c0000000p-1} + [57] ∈ {0x1.702b7a0000000p-1} + [58] ∈ {0x1.36b7840000000p-1} + [59] ∈ {0x1.ee589c0000000p-2} + [60] ∈ {0x1.5c4eaa0000000p-2} + [61] ∈ {0x1.7217880000000p-3} + [62] ∈ {-0x1.b739f80000000p-10} + [63] ∈ {-0x1.a5529a0000000p-3} + G12[0] ∈ {0x1.5555560000000p-1} + [1] ∈ {0x1.2f684c0000000p-1} + [2] ∈ {0x1.1111120000000p-1} + [3] ∈ {0x1.f07c200000000p-2} + [4] ∈ {0x1.c71c720000000p-2} + [5] ∈ {0x1.a41a420000000p-2} + [6] ∈ {0x1.8618620000000p-2} + [7] ∈ {0x1.6c16c20000000p-2} + [8] ∈ {0x1.5555560000000p-2} + [9] ∈ {0x1.2f684c0000000p-2} + [10] ∈ {0x1.1111120000000p-2} + [11] ∈ {0x1.f07c200000000p-3} + [12] ∈ {0x1.c71c720000000p-3} + [13] ∈ {0x1.a41a420000000p-3} + [14] ∈ {0x1.8618620000000p-3} + [15] ∈ {0x1.6c16c20000000p-3} + [16] ∈ {0x1.5555560000000p-3} + [17] ∈ {0x1.2f684c0000000p-3} + [18] ∈ {0x1.1111120000000p-3} + [19] ∈ {0x1.f07c200000000p-4} + [20] ∈ {0x1.c71c720000000p-4} + [21] ∈ {0x1.a41a420000000p-4} + [22] ∈ {0x1.8618620000000p-4} + [23] ∈ {0x1.6c16c20000000p-4} + [24] ∈ {0x1.5555560000000p-4} + [25] ∈ {0x1.2f684c0000000p-4} + [26] ∈ {0x1.1111120000000p-4} + [27] ∈ {0x1.f07c200000000p-5} + [28] ∈ {0x1.c71c720000000p-5} + [29] ∈ {0x1.a41a420000000p-5} + [30] ∈ {0x1.8618620000000p-5} + [31] ∈ {0x1.6c16c20000000p-5} + G13 ∈ {0} + G14 ∈ {0} + G15 ∈ {0} + G16 ∈ {0} + G17 ∈ {0} + G18 ∈ {0} + G19 ∈ {0} +[value] computing for function F4 <- main. + Called from tests/float/s.i:260. +[value] computing for function F1 <- F4 <- main. + Called from tests/float/s.i:230. +tests/float/s.i:230:[kernel] warning: Neither code nor specification for function F1, generating default assigns from the prototype +[value] using specification for function F1 +[value] Done for function F1 +tests/float/s.i:231:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ V4 < 64; +[value] computing for function F2 <- F4 <- main. + Called from tests/float/s.i:233. +tests/float/s.i:233:[kernel] warning: Neither code nor specification for function F2, generating default assigns from the prototype +[value] using specification for function F2 +[value] Done for function F2 +tests/float/s.i:238:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ V5 < 64; +[value] computing for function F2 <- F4 <- main. + Called from tests/float/s.i:241. +[value] Done for function F2 +tests/float/s.i:242:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ V6 < 64; +[value] computing for function F3 <- F4 <- main. + Called from tests/float/s.i:244. +tests/float/s.i:244:[kernel] warning: Neither code nor specification for function F3, generating default assigns from the prototype +[value] using specification for function F3 +[value] Done for function F3 +tests/float/s.i:245:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ V7 < 32; +[value] Recording results for F4 +[value] Done for function F4 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function F4: + V1 ∈ {0} + V2 ∈ [-0x1.a4cfc20000000p-3 .. 0x1.fcb5d00000000p0] + V3 ∈ [-0x1.fec1fc0000000p-1 .. -0x1.f3f3f40000000p-1] + V4 ∈ [0..63] + V5 ∈ [0..63] + V6 ∈ [0..63] + V7 ∈ [0..31] + G14 ∈ [0x1.3e68360000000p-10 .. 0x1.8618580000000p-7] + G15 ∈ [-0x1.a5529a0000000p-3 .. 0x1.fd53fe0000000p0] + G16 ∈ [0x1.c6a7f00000000p-4 .. 0x1.0000000000000p1] + G17 ∈ [0x1.6c16c20000000p-5 .. 0x1.5555560000000p-1] + G18 ∈ [0x1.f9f9fa0000000p-1 .. 0x1.ff60fe0000000p-1] + G19 ∈ [0x1.176b480000000p-13 .. 0x1.859f320000000p-6] +[value] Values at end of function main: + V8 ∈ {0} + G14 ∈ [0x1.3e68360000000p-10 .. 0x1.8618580000000p-7] + G15 ∈ [-0x1.a5529a0000000p-3 .. 0x1.fd53fe0000000p0] + G16 ∈ [0x1.c6a7f00000000p-4 .. 0x1.0000000000000p1] + G17 ∈ [0x1.6c16c20000000p-5 .. 0x1.5555560000000p-1] + G18 ∈ [0x1.f9f9fa0000000p-1 .. 0x1.ff60fe0000000p-1] + G19 ∈ [0x1.176b480000000p-13 .. 0x1.859f320000000p-6] +[from] Computing for function F4 +[from] Computing for function F1 <-F4 +[from] Done for function F1 +[from] Computing for function F2 <-F4 +[from] Done for function F2 +[from] Computing for function F3 <-F4 +[from] Done for function F3 +[from] Done for function F4 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function F1: + \result FROM G1 +[from] Function F2: + \result FROM G2 +[from] Function F3: + \result FROM G4 +[from] Function F4: + G14 FROM G3; G10[0..63]; G13 + G15 FROM G11[0..63]; G13 + G16 FROM G9[0..63]; G13 + G17 FROM G12[0..31]; G13 + G18 FROM G3; G10[0..63]; G13 + G19 FROM G3; G9[0..63]; G10[0..63]; G13 +[from] Function main: + G14 FROM G3; G10[0..63]; G13 + G15 FROM G11[0..63]; G13 + G16 FROM G9[0..63]; G13 + G17 FROM G12[0..31]; G13 + G18 FROM G3; G10[0..63]; G13 + G19 FROM G3; G9[0..63]; G10[0..63]; G13 + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function F4: + V1; V2; V3; V4; V5; V6; V7; G14; G15; G16; G17; G18; G19 +[inout] Inputs for function F4: + G3; G9[0..63]; G10[0..63]; G11[0..63]; G12[0..31]; G13; G14; G15; G16; G18 +[inout] Out (internal) for function main: + V8; G14; G15; G16; G17; G18; G19 +[inout] Inputs for function main: + G3; G9[0..63]; G10[0..63]; G11[0..63]; G12[0..31]; G13; G14; G15; G16; G18 diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/some.1.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/some.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/some.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/some.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/some.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0] ∈ {1.0000000000000000} + [1..25] ∈ {0} + y ∈ {1.0000000000000000*2^-1} +[value] DUMPING STATE of file tests/float/some.c line 16 + t[0] ∈ {1.0000000000000000} + [1] ∈ {1.5000000000000000} + [2] ∈ {1.7500000000000000} + [3] ∈ {1.8750000000000000} + [4] ∈ {1.9375000000000000} + [5] ∈ {1.9687500000000000} + [6] ∈ {1.9843750000000000} + [7] ∈ {1.9921875000000000} + [8] ∈ {1.9960937500000000} + [9] ∈ {1.9980468750000000} + [10] ∈ {1.9990234375000000} + [11] ∈ {1.9995117187500000} + [12] ∈ {1.9997558593750000} + [13] ∈ {1.9998779296875000} + [14] ∈ {1.9999389648437500} + [15] ∈ {1.9999694824218750} + [16] ∈ {1.9999847412109375} + [17] ∈ {1.9999923706054688} + [18] ∈ {1.9999961853027344} + [19] ∈ {1.9999980926513672} + [20] ∈ {1.9999990463256836} + [21] ∈ {1.9999995231628418} + [22] ∈ {1.9999997615814209} + [23] ∈ {1.9999998807907104} + [24..25] ∈ {2.0000000000000000} + y ∈ {1.0000000000000000*2^-26} + i ∈ {26} + =END OF DUMP== +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/some.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/some.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/some.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/some.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,75 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/some.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0] ∈ {1.0000000000000000} + [1..54] ∈ {0} + y ∈ {1.0000000000000000*2^-1} +[value] Semantic level unrolling superposing up to 10 states +[value] Semantic level unrolling superposing up to 20 states +[value] Semantic level unrolling superposing up to 30 states +[value] Semantic level unrolling superposing up to 40 states +[value] Semantic level unrolling superposing up to 50 states +[value] DUMPING STATE of file tests/float/some.c line 16 + t[0] ∈ {1.0000000000000000} + [1] ∈ {1.5000000000000000} + [2] ∈ {1.7500000000000000} + [3] ∈ {1.8750000000000000} + [4] ∈ {1.9375000000000000} + [5] ∈ {1.9687500000000000} + [6] ∈ {1.9843750000000000} + [7] ∈ {1.9921875000000000} + [8] ∈ {1.9960937500000000} + [9] ∈ {1.9980468750000000} + [10] ∈ {1.9990234375000000} + [11] ∈ {1.9995117187500000} + [12] ∈ {1.9997558593750000} + [13] ∈ {1.9998779296875000} + [14] ∈ {1.9999389648437500} + [15] ∈ {1.9999694824218750} + [16] ∈ {1.9999847412109375} + [17] ∈ {1.9999923706054688} + [18] ∈ {1.9999961853027344} + [19] ∈ {1.9999980926513672} + [20] ∈ {1.9999990463256836} + [21] ∈ {1.9999995231628418} + [22] ∈ {1.9999997615814209} + [23] ∈ {1.9999998807907104} + [24] ∈ {1.9999999403953552} + [25] ∈ {1.9999999701976776} + [26] ∈ {1.9999999850988388} + [27] ∈ {1.9999999925494194} + [28] ∈ {1.9999999962747097} + [29] ∈ {1.9999999981373549} + [30] ∈ {1.9999999990686774} + [31] ∈ {1.9999999995343387} + [32] ∈ {1.9999999997671694} + [33] ∈ {1.9999999998835847} + [34] ∈ {1.9999999999417923} + [35] ∈ {1.9999999999708962} + [36] ∈ {1.9999999999854481} + [37] ∈ {1.9999999999927240} + [38] ∈ {1.9999999999963620} + [39] ∈ {1.9999999999981810} + [40] ∈ {1.9999999999990905} + [41] ∈ {1.9999999999995453} + [42] ∈ {1.9999999999997726} + [43] ∈ {1.9999999999998863} + [44] ∈ {1.9999999999999432} + [45] ∈ {1.9999999999999716} + [46] ∈ {1.9999999999999858} + [47] ∈ {1.9999999999999929} + [48] ∈ {1.9999999999999964} + [49] ∈ {1.9999999999999982} + [50] ∈ {1.9999999999999991} + [51] ∈ {1.9999999999999996} + [52] ∈ {1.9999999999999998} + [53..54] ∈ {2.0000000000000000} + y ∈ {1.0000000000000000*2^-55} + i ∈ {55} + =END OF DUMP== +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/sqrt.1.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/sqrt.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/sqrt.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/sqrt.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/sqrt.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/float/sqrt.i:12:[value] Assertion got status valid. +tests/float/sqrt.i:14:[value] Assertion got status valid. +[value] DUMPING STATE of file tests/float/sqrt.i line 19 + i ∈ {-0.} + j ∈ {-0.} + p ∈ {{ (unsigned long long *)&j }} + =END OF DUMP== +[value] DUMPING STATE of file tests/float/sqrt.i line 23 + i ∈ {-0.} + j ∈ {-0.} + r ∈ {-0x8000000000000000} + p ∈ {{ (unsigned long long *)&j }} + =END OF DUMP== +[value] Called Frama_C_show_each_long_long({-0x8000000000000000}) +[value] Called Frama_C_show_each_double({-0.}) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +tests/float/sqrt.i:11:[kernel] warning: Neither code nor specification for function Frama_C_sqrt, generating default assigns from the prototype +[value] Values at end of function main: + k ∈ {8} + i ∈ {-0.} + j ∈ {-0.} + r ∈ {-0x8000000000000000} + p ∈ {{ (unsigned long long *)&j }} + c[0] ∈ {128} + [1..7] ∈ {0} +[from] Computing for function main +[from] Computing for function Frama_C_sqrt <-main +[from] Done for function Frama_C_sqrt +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + k; i; j; r; p; c[0..7] +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/sqrt.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/sqrt.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/sqrt.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/sqrt.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/sqrt.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/float/sqrt.i:12:[value] Assertion got status valid. +tests/float/sqrt.i:14:[value] Assertion got status valid. +[value] DUMPING STATE of file tests/float/sqrt.i line 19 + i ∈ {-0.} + j ∈ {-0.} + p ∈ {{ (unsigned long long *)&j }} + =END OF DUMP== +[value] DUMPING STATE of file tests/float/sqrt.i line 23 + i ∈ {-0.} + j ∈ {-0.} + r ∈ {-0x8000000000000000} + p ∈ {{ (unsigned long long *)&j }} + =END OF DUMP== +[value] Called Frama_C_show_each_long_long({-0x8000000000000000}) +[value] Called Frama_C_show_each_double({-0.}) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +tests/float/sqrt.i:11:[kernel] warning: Neither code nor specification for function Frama_C_sqrt, generating default assigns from the prototype +[value] Values at end of function main: + k ∈ {8} + i ∈ {-0.} + j ∈ {-0.} + r ∈ {-0x8000000000000000} + p ∈ {{ (unsigned long long *)&j }} + c[0..6] ∈ {0} + [7] ∈ {128} +[from] Computing for function main +[from] Computing for function Frama_C_sqrt <-main +[from] Done for function Frama_C_sqrt +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + k; i; j; r; p; c[0..7] +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/s.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/s.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/s.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/s.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,340 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/s.i (no preprocessing) +tests/float/s.i:18:[kernel] warning: Floating-point constant 1.882f is not represented exactly. Will use 0x1.e1cac00000000p0. See documentation for option -warn-decimal-float +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G3 ∈ {42} + G5[0..63] ∈ {0} + G6 ∈ {42} + G7 ∈ {0} + G8 ∈ {0} + G9[0] ∈ {0x1.0000000000000p1} + [1] ∈ {0x1.e1cac00000000p0} + [2] ∈ {0x1.c72b020000000p0} + [3] ∈ {0x1.af1aa00000000p0} + [4] ∈ {0x1.99999a0000000p0} + [5] ∈ {0x1.85e3540000000p0} + [6] ∈ {0x1.747ae20000000p0} + [7] ∈ {0x1.6418940000000p0} + [8] ∈ {0x1.553f7c0000000p0} + [9] ∈ {0x1.47ae140000000p0} + [10] ∈ {0x1.3b22d00000000p0} + [11] ∈ {0x1.2f5c280000000p0} + [12] ∈ {0x1.249ba60000000p0} + [13] ∈ {0x1.1020c40000000p0} + [14] ∈ {0x1.0000000000000p0} + [15] ∈ {0x1.e353f80000000p-1} + [16] ∈ {0x1.ca3d700000000p-1} + [17] ∈ {0x1.b333340000000p-1} + [18] ∈ {0x1.9eb8520000000p-1} + [19] ∈ {0x1.8bc6a80000000p-1} + [20] ∈ {0x1.7a5e360000000p-1} + [21] ∈ {0x1.6a7efa0000000p-1} + [22] ∈ {0x1.5c28f60000000p-1} + [23] ∈ {0x1.4ed9160000000p-1} + [24] ∈ {0x1.428f5c0000000p-1} + [25] ∈ {0x1.36c8b40000000p-1} + [26] ∈ {0x1.2c08320000000p-1} + [27] ∈ {0x1.224dd20000000p-1} + [28] ∈ {0x1.1893740000000p-1} + [29] ∈ {0x1.0000000000000p-1} + [30] ∈ {0x1.e24dd20000000p-2} + [31] ∈ {0x1.c6a7f00000000p-2} + [32] ∈ {0x1.af1aa00000000p-2} + [33] ∈ {0x1.99999a0000000p-2} + [34] ∈ {0x1.8624de0000000p-2} + [35] ∈ {0x1.74bc6a0000000p-2} + [36] ∈ {0x1.645a1c0000000p-2} + [37] ∈ {0x1.54fdf40000000p-2} + [38] ∈ {0x1.47ae140000000p-2} + [39] ∈ {0x1.3b645a0000000p-2} + [40] ∈ {0x1.2f1aa00000000p-2} + [41] ∈ {0x1.24dd300000000p-2} + [42] ∈ {0x1.1a9fbe0000000p-2} + [43] ∈ {0x1.1168720000000p-2} + [44] ∈ {0x1.0831260000000p-2} + [45] ∈ {0x1.0000000000000p-2} + [46] ∈ {0x1.e353f80000000p-3} + [47] ∈ {0x1.c6a7f00000000p-3} + [48] ∈ {0x1.b020c40000000p-3} + [49] ∈ {0x1.99999a0000000p-3} + [50] ∈ {0x1.851eb80000000p-3} + [51] ∈ {0x1.74bc6a0000000p-3} + [52] ∈ {0x1.645a1c0000000p-3} + [53] ∈ {0x1.5604180000000p-3} + [54] ∈ {0x1.47ae140000000p-3} + [55] ∈ {0x1.3b645a0000000p-3} + [56] ∈ {0x1.2f1aa00000000p-3} + [57] ∈ {0x1.24dd300000000p-3} + [58] ∈ {0x1.1a9fbe0000000p-3} + [59] ∈ {0x1.10624e0000000p-3} + [60] ∈ {0x1.0831260000000p-3} + [61] ∈ {0x1.0000000000000p-3} + [62] ∈ {0x1.e353f80000000p-4} + [63] ∈ {0x1.c6a7f00000000p-4} + G10[0] ∈ {0x1.a1e8c60000000p-5} + [1] ∈ {0x1.af8fa40000000p-5} + [2] ∈ {0x1.c09e7a0000000p-5} + [3] ∈ {0x1.ce42800000000p-5} + [4] ∈ {0x1.df4da60000000p-5} + [5] ∈ {0x1.f056a60000000p-5} + [6] ∈ {0x1.0262740000000p-4} + [7] ∈ {0x1.0c97e80000000p-4} + [8] ∈ {0x1.16cba00000000p-4} + [9] ∈ {0x1.2463180000000p-4} + [10] ∈ {0x1.3044e20000000p-4} + [11] ∈ {0x1.3f87cc0000000p-4} + [12] ∈ {0x1.4ec6100000000p-4} + [13] ∈ {0x1.6160dc0000000p-4} + [14] ∈ {0x1.73f3fa0000000p-4} + [15] ∈ {0x1.89dd340000000p-4} + [16] ∈ {0x1.a3167c0000000p-4} + [17] ∈ {0x1.b083800000000p-4} + [18] ∈ {0x1.bdeb8c0000000p-4} + [19] ∈ {0x1.ccfa780000000p-4} + [20] ∈ {0x1.ddadd40000000p-4} + [21] ∈ {0x1.f002ce0000000p-4} + [22] ∈ {0x1.0126800000000p-3} + [23] ∈ {0x1.0b1a0a0000000p-3} + [24] ∈ {0x1.15da100000000p-3} + [25] ∈ {0x1.2236fa0000000p-3} + [26] ∈ {0x1.2f59f00000000p-3} + [27] ∈ {0x1.3d3fca0000000p-3} + [28] ∈ {0x1.4cb4ae0000000p-3} + [29] ∈ {0x1.5db0f00000000p-3} + [30] ∈ {0x1.702b7a0000000p-3} + [31] ∈ {0x1.85aff00000000p-3} + [32] ∈ {0x1.9c93820000000p-3} + [33] ∈ {0x1.a9e1aa0000000p-3} + [34] ∈ {0x1.b719b40000000p-3} + [35] ∈ {0x1.c5c4dc0000000p-3} + [36] ∈ {0x1.d515d80000000p-3} + [37] ∈ {0x1.e5c7f00000000p-3} + [38] ∈ {0x1.f64fcc0000000p-3} + [39] ∈ {0x1.0471d00000000p-2} + [40] ∈ {0x1.0e59140000000p-2} + [41] ∈ {0x1.1930760000000p-2} + [42] ∈ {0x1.24e8cc0000000p-2} + [43] ∈ {0x1.3170760000000p-2} + [44] ∈ {0x1.3eb3140000000p-2} + [45] ∈ {0x1.4d402c0000000p-2} + [46] ∈ {0x1.5cebf20000000p-2} + [47] ∈ {0x1.6dcf5c0000000p-2} + [48] ∈ {0x1.7fea3e0000000p-2} + [49] ∈ {0x1.89682c0000000p-2} + [50] ∈ {0x1.935f9c0000000p-2} + [51] ∈ {0x1.9d75840000000p-2} + [52] ∈ {0x1.a8112c0000000p-2} + [53] ∈ {0x1.b2943c0000000p-2} + [54] ∈ {0x1.bd88ba0000000p-2} + [55] ∈ {0x1.c87cb20000000p-2} + [56] ∈ {0x1.d335de0000000p-2} + [57] ∈ {0x1.ddc3220000000p-2} + [58] ∈ {0x1.e7dc420000000p-2} + [59] ∈ {0x1.f0dc4a0000000p-2} + [60] ∈ {0x1.f88a800000000p-2} + [61] ∈ {0x1.fde7e00000000p-2} + [62] ∈ {0x1.fffff40000000p-2} + [63] ∈ {0x1.fd48c00000000p-2} + G11[0] ∈ {0x1.fd53fe0000000p0} + [1] ∈ {0x1.fd26740000000p0} + [2] ∈ {0x1.fceb760000000p0} + [3] ∈ {0x1.fcbaa00000000p0} + [4] ∈ {0x1.fc7b840000000p0} + [5] ∈ {0x1.fc3a220000000p0} + [6] ∈ {0x1.fbe8a60000000p0} + [7] ∈ {0x1.fb93e20000000p0} + [8] ∈ {0x1.fb3bd60000000p0} + [9] ∈ {0x1.fac1560000000p0} + [10] ∈ {0x1.fa51600000000p0} + [11] ∈ {0x1.f9bade0000000p0} + [12] ∈ {0x1.f91cfe0000000p0} + [13] ∈ {0x1.f852100000000p0} + [14] ∈ {0x1.f77c2c0000000p0} + [15] ∈ {0x1.f671460000000p0} + [16] ∈ {0x1.f52a5c0000000p0} + [17] ∈ {0x1.f473b80000000p0} + [18] ∈ {0x1.f3b7540000000p0} + [19] ∈ {0x1.f2dc840000000p0} + [20] ∈ {0x1.f1e0e00000000p0} + [21] ∈ {0x1.f0c1be0000000p0} + [22] ∈ {0x1.ef97ce0000000p0} + [23] ∈ {0x1.ee46800000000p0} + [24] ∈ {0x1.eccaa80000000p0} + [25] ∈ {0x1.eb01ca0000000p0} + [26] ∈ {0x1.e904940000000p0} + [27] ∈ {0x1.e6cee80000000p0} + [28] ∈ {0x1.e438c60000000p0} + [29] ∈ {0x1.e138680000000p0} + [30] ∈ {0x1.ddc3220000000p0} + [31] ∈ {0x1.d979fa0000000p0} + [32] ∈ {0x1.d49a7e0000000p0} + [33] ∈ {0x1.d19e3e0000000p0} + [34] ∈ {0x1.ce89d00000000p0} + [35] ∈ {0x1.cafc360000000p0} + [36] ∈ {0x1.c71e960000000p0} + [37] ∈ {0x1.c2b83a0000000p0} + [38] ∈ {0x1.be2aae0000000p0} + [39] ∈ {0x1.b8cf1e0000000p0} + [40] ∈ {0x1.b2ce400000000p0} + [41] ∈ {0x1.abdfde0000000p0} + [42] ∈ {0x1.a3f02e0000000p0} + [43] ∈ {0x1.9aea260000000p0} + [44] ∈ {0x1.90b7b60000000p0} + [45] ∈ {0x1.84b34c0000000p0} + [46] ∈ {0x1.76b2600000000p0} + [47] ∈ {0x1.663a460000000p0} + [48] ∈ {0x1.52c0a60000000p0} + [49] ∈ {0x1.47ae660000000p0} + [50] ∈ {0x1.3b54d20000000p0} + [51] ∈ {0x1.2dfc740000000p0} + [52] ∈ {0x1.1ee6300000000p0} + [53] ∈ {0x1.0eb64e0000000p0} + [54] ∈ {0x1.f88d840000000p-1} + [55] ∈ {0x1.cfbd460000000p-1} + [56] ∈ {0x1.a2d91c0000000p-1} + [57] ∈ {0x1.702b7a0000000p-1} + [58] ∈ {0x1.36b7840000000p-1} + [59] ∈ {0x1.ee589c0000000p-2} + [60] ∈ {0x1.5c4eaa0000000p-2} + [61] ∈ {0x1.7217880000000p-3} + [62] ∈ {-0x1.b739f80000000p-10} + [63] ∈ {-0x1.a5529a0000000p-3} + G12[0] ∈ {0x1.5555560000000p-1} + [1] ∈ {0x1.2f684c0000000p-1} + [2] ∈ {0x1.1111120000000p-1} + [3] ∈ {0x1.f07c200000000p-2} + [4] ∈ {0x1.c71c720000000p-2} + [5] ∈ {0x1.a41a420000000p-2} + [6] ∈ {0x1.8618620000000p-2} + [7] ∈ {0x1.6c16c20000000p-2} + [8] ∈ {0x1.5555560000000p-2} + [9] ∈ {0x1.2f684c0000000p-2} + [10] ∈ {0x1.1111120000000p-2} + [11] ∈ {0x1.f07c200000000p-3} + [12] ∈ {0x1.c71c720000000p-3} + [13] ∈ {0x1.a41a420000000p-3} + [14] ∈ {0x1.8618620000000p-3} + [15] ∈ {0x1.6c16c20000000p-3} + [16] ∈ {0x1.5555560000000p-3} + [17] ∈ {0x1.2f684c0000000p-3} + [18] ∈ {0x1.1111120000000p-3} + [19] ∈ {0x1.f07c200000000p-4} + [20] ∈ {0x1.c71c720000000p-4} + [21] ∈ {0x1.a41a420000000p-4} + [22] ∈ {0x1.8618620000000p-4} + [23] ∈ {0x1.6c16c20000000p-4} + [24] ∈ {0x1.5555560000000p-4} + [25] ∈ {0x1.2f684c0000000p-4} + [26] ∈ {0x1.1111120000000p-4} + [27] ∈ {0x1.f07c200000000p-5} + [28] ∈ {0x1.c71c720000000p-5} + [29] ∈ {0x1.a41a420000000p-5} + [30] ∈ {0x1.8618620000000p-5} + [31] ∈ {0x1.6c16c20000000p-5} + G13 ∈ {0} + G14 ∈ {0} + G15 ∈ {0} + G16 ∈ {0} + G17 ∈ {0} + G18 ∈ {0} + G19 ∈ {0} +[value] computing for function F4 <- main. + Called from tests/float/s.i:260. +[value] computing for function F1 <- F4 <- main. + Called from tests/float/s.i:230. +tests/float/s.i:230:[kernel] warning: Neither code nor specification for function F1, generating default assigns from the prototype +[value] using specification for function F1 +[value] Done for function F1 +tests/float/s.i:231:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ V4 < 64; +[value] computing for function F2 <- F4 <- main. + Called from tests/float/s.i:233. +tests/float/s.i:233:[kernel] warning: Neither code nor specification for function F2, generating default assigns from the prototype +[value] using specification for function F2 +[value] Done for function F2 +tests/float/s.i:238:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ V5 < 64; +[value] computing for function F2 <- F4 <- main. + Called from tests/float/s.i:241. +[value] Done for function F2 +tests/float/s.i:242:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ V6 < 64; +[value] computing for function F3 <- F4 <- main. + Called from tests/float/s.i:244. +tests/float/s.i:244:[kernel] warning: Neither code nor specification for function F3, generating default assigns from the prototype +[value] using specification for function F3 +[value] Done for function F3 +tests/float/s.i:245:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ V7 < 32; +[value] Recording results for F4 +[value] Done for function F4 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function F4: + V1 ∈ {0} + V2 ∈ [-0x1.a4cfc20000000p-3 .. 0x1.fcb5d20000000p0] + V3 ∈ [-0x1.fec1fc0000000p-1 .. -0x1.f3f3f40000000p-1] + V4 ∈ [0..63] + V5 ∈ [0..63] + V6 ∈ [0..63] + V7 ∈ [0..31] + G14 ∈ [0x1.3e68340000000p-10 .. 0x1.86185a0000000p-7] + G15 ∈ [-0x1.a5529a0000000p-3 .. 0x1.fd53fe0000000p0] + G16 ∈ [0x1.c6a7f00000000p-4 .. 0x1.0000000000000p1] + G17 ∈ [0x1.6c16c20000000p-5 .. 0x1.5555560000000p-1] + G18 ∈ [0x1.f9f9fa0000000p-1 .. 0x1.ff60fe0000000p-1] + G19 ∈ [0x1.176b440000000p-13 .. 0x1.859f340000000p-6] +[value] Values at end of function main: + V8 ∈ {0} + G14 ∈ [0x1.3e68340000000p-10 .. 0x1.86185a0000000p-7] + G15 ∈ [-0x1.a5529a0000000p-3 .. 0x1.fd53fe0000000p0] + G16 ∈ [0x1.c6a7f00000000p-4 .. 0x1.0000000000000p1] + G17 ∈ [0x1.6c16c20000000p-5 .. 0x1.5555560000000p-1] + G18 ∈ [0x1.f9f9fa0000000p-1 .. 0x1.ff60fe0000000p-1] + G19 ∈ [0x1.176b440000000p-13 .. 0x1.859f340000000p-6] +[from] Computing for function F4 +[from] Computing for function F1 <-F4 +[from] Done for function F1 +[from] Computing for function F2 <-F4 +[from] Done for function F2 +[from] Computing for function F3 <-F4 +[from] Done for function F3 +[from] Done for function F4 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function F1: + \result FROM G1 +[from] Function F2: + \result FROM G2 +[from] Function F3: + \result FROM G4 +[from] Function F4: + G14 FROM G3; G10[0..63]; G13 + G15 FROM G11[0..63]; G13 + G16 FROM G9[0..63]; G13 + G17 FROM G12[0..31]; G13 + G18 FROM G3; G10[0..63]; G13 + G19 FROM G3; G9[0..63]; G10[0..63]; G13 +[from] Function main: + G14 FROM G3; G10[0..63]; G13 + G15 FROM G11[0..63]; G13 + G16 FROM G9[0..63]; G13 + G17 FROM G12[0..31]; G13 + G18 FROM G3; G10[0..63]; G13 + G19 FROM G3; G9[0..63]; G10[0..63]; G13 + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function F4: + V1; V2; V3; V4; V5; V6; V7; G14; G15; G16; G17; G18; G19 +[inout] Inputs for function F4: + G3; G9[0..63]; G10[0..63]; G11[0..63]; G12[0..31]; G13; G14; G15; G16; G18 +[inout] Out (internal) for function main: + V8; G14; G15; G16; G17; G18; G19 +[inout] Inputs for function main: + G3; G9[0..63]; G10[0..63]; G11[0..63]; G12[0..31]; G13; G14; G15; G16; G18 diff -Nru frama-c-20140301+neon+dfsg/tests/float/oracle/uninit.res.oracle frama-c-20150201+sodium+dfsg/tests/float/oracle/uninit.res.oracle --- frama-c-20140301+neon+dfsg/tests/float/oracle/uninit.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/oracle/uninit.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/float/uninit.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/float/uninit.i:5:[kernel] warning: accessing uninitialized left-value: assert \initialized(&f); +tests/float/uninit.i:5:[kernel] warning: completely indeterminate value in f. +[value] Recording results for main +[value] done for function main +tests/float/uninit.i:5:[value] Assertion 'Value,initialisation' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + f ∈ UNINITIALIZED + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + f; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/float/some.c frama-c-20150201+sodium+dfsg/tests/float/some.c --- frama-c-20140301+neon+dfsg/tests/float/some.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/some.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,6 +1,6 @@ /* run.config - OPT: -val-show-slevel 10 -slevel 100 -val -cpp-command "gcc -C -E -DFLOAT=double -DN=55 -I. " -float-normal -journal-disable -no-results - OPT: -slevel 100 -val -cpp-command "gcc -C -E -DFLOAT=float -DN=26 -I. " -float-normal -journal-disable -no-results + OPT: -val-show-slevel 10 -slevel 100 -val -cpp-extra-args="-DFLOAT=double -DN=55" -float-normal -journal-disable -no-results + OPT: -slevel 100 -val -cpp-extra-args="-DFLOAT=float -DN=26" -float-normal -journal-disable -no-results */ FLOAT t[N] = { 1. } ; diff -Nru frama-c-20140301+neon+dfsg/tests/float/test_config frama-c-20150201+sodium+dfsg/tests/float/test_config --- frama-c-20140301+neon+dfsg/tests/float/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/float/test_config 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1 @@ +CMD: FRAMAC_PLUGIN=tests/.empty @frama-c@ \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/callgraph.svg frama-c-20150201+sodium+dfsg/tests/ICPC/callgraph.svg --- frama-c-20140301+neon+dfsg/tests/ICPC/callgraph.svg 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/callgraph.svg 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,276 @@ + + + + + + +G + +cluster_8 + +S 8 + +cluster_1 + +S 1 + +cluster_19 + +S 19 + +cluster_9 + +S 9 + +cluster_2 + +S 2 + +cluster_3 + +S 3 + +cluster_4 + +S 4 + +cluster_20 + +S 20 + +cluster_5 + +S 5 + +cluster_6 + +S 6 + +cluster_7 + +S 7 + +cluster_0 + +S 0 + + +UV main (0) + +main + + +UV Time (1) + +Time + + +UV main (0)->UV Time (1) + + + + +UV RoCo_init (2) + +RoCo_init + + +UV main (0)->UV RoCo_init (2) + + + + +UV Sim_init (3) + +Sim_init + + +UV main (0)->UV Sim_init (3) + + + + +UV Frama_C_show_each (4) + +Frama_C_show_each + + +UV main (0)->UV Frama_C_show_each (4) + + + + +UV RoCo_process (5) + +RoCo_process + + +UV main (0)->UV RoCo_process (5) + + + + +UV Sim_process (6) + +Sim_process + + +UV main (0)->UV Sim_process (6) + + + + +UV Sleep (7) + +Sleep + + +UV main (0)->UV Sleep (7) + + + + +UV PT1_Filter (8) + +PT1_Filter + + +UV RoCo_process (5)->UV PT1_Filter (8) + + + + +UV Limiter_out (9) + +Limiter_out + + +UV RoCo_process (5)->UV Limiter_out (9) + + + + +UV Turn_on_delay (10) + +Turn_on_delay + + +UV RoCo_process (5)->UV Turn_on_delay (10) + + + + +UV Interpolate_from_curve (11) + +Interpolate_from_curve + + +UV RoCo_process (5)->UV Interpolate_from_curve (11) + + + + +UV Timer_start (12) + +Timer_start + + +UV RoCo_process (5)->UV Timer_start (12) + + + + +UV Timer_elapsedTime (13) + +Timer_elapsedTime + + +UV RoCo_process (5)->UV Timer_elapsedTime (13) + + + + +UV fabs (14) + +fabs + + +UV RoCo_process (5)->UV fabs (14) + + + + +UV Ramp_out (15) + +Ramp_out + + +UV RoCo_process (5)->UV Ramp_out (15) + + + + +UV Ramp_getDir (16) + +Ramp_getDir + + +UV RoCo_process (5)->UV Ramp_getDir (16) + + + + +UV Timer_tick (17) + +Timer_tick + + +UV RoCo_process (5)->UV Timer_tick (17) + + + + +UV Sim_process (6)->UV PT1_Filter (8) + + + + +UV Sim_process (6)->UV Limiter_out (9) + + + + +UV exp (18) + +exp + + +UV PT1_Filter (8)->UV exp (18) + + + + +UV Frama_C_exp (21) + +Frama_C_exp + + +UV exp (18)->UV Frama_C_exp (21) + + + + +UV Ramp_getValue (19) + +Ramp_getValue + + +UV Ramp_targetReached (20) + +Ramp_targetReached + + + diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/eval.py frama-c-20150201+sodium+dfsg/tests/ICPC/eval.py --- frama-c-20140301+neon+dfsg/tests/ICPC/eval.py 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/eval.py 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,90 @@ +import sys +import math + +testcase = [ [ [ 50000, "moveto", 15 ], + [ 70000, "moveto", -55 ], + [ 100000, "moveto", 30 ], + [ 160000, "shutoff", 0 ] ], + [ [ 30000, "moveto", 25 ], + [ 50000, "moveby", -70 ], + [ 160000, "moveto", -20 ], + [ 180000, "shutoff", 0 ] ], + [ [ 60000, "moveto", -30 ], + [ 100000, "moveto", 30 ], + [ 140000, "moveto", -10 ], + [ 180000, "shutoff", 0 ] ], + [ [ 60000, "moveto", 20 ], + [ 100000, "moveto", -20 ], + [ 110000, "moveto", 20 ] ] ] + +def checkSpeed(time, angleDiff, timeDiff): + if timeDiff != 0: + speed = float(angleDiff) / (timeDiff / 1000.0) + if math.fabs(angleDiff) > 6.0 and math.fabs(speed) < 1.0: + print "%d: TOO SLOW / TARGET NOT REACHED!" % time + return False + return True + +if __name__ == '__main__': + if len (sys.argv) != 2: + print >>sys.stderr, "usage: python " + sys.argv[0] + " \n" + + tc = int(sys.argv[1]) + pos = 0 + header = None + cmd = None + lastVoltage = 0.0 + lastAngle = 0.0 + lastTime = 0.0 + startAngle = 0.0 + voltageStableCounter = 0 + targetReached = False# + errorCount = 0 + index = {} + for line in sys.stdin.readlines(): + line = line.strip("\n") + if header == None: + header = line.split() + for i in range(0, len(header)): + index[header[i]] = i + else: + data = line.split() + time = int(data[index["time(ms)"]]) + voltage = float(data[index["engineVoltage"]]) + angle = float(data[index["legAngle"]]) + angleValid = int(data[index["legAngleValid"]]) == 1 + isActive = int(data[index["isActive"]]) == 1 + if pos < len(testcase[tc]) and time >= testcase[tc][pos][0]: + if not targetReached and cmd != None: + if not checkSpeed(time, cmd[2]-startAngle, time-cmd[0]): + errorCount += 1 + cmd = testcase[tc][pos] + if cmd[1] == "moveby": + cmd[1] = "moveto" + cmd[2] = testcase[tc][pos-1][2] + cmd[2] + pos += 1 + targetReached = False + startAngle = angle + moves = math.fabs(angle - lastAngle) > 0.1 + voltageZero = math.fabs(voltage - lastVoltage) < 0.1 + if voltageZero: + voltageStableCounter += 1 + else: + voltageStableCounter = 0 + voltageDiff = math.fabs(voltage - lastVoltage) + if cmd != None and math.fabs(voltageDiff) > 2.0: + print "%d: VOLTAGE JUMP!" % time + errorCount += 1 + if cmd != None and voltageStableCounter >= 5 and not moves and not targetReached: + if math.fabs(angle - cmd[2]) < 0.5: + targetReached = True + if not checkSpeed(time, cmd[2] - startAngle, time - cmd[0]): + errorCount += 1 + lastAngle = angle + lastVoltage = voltage + lastTime = time + if not targetReached and cmd != None: + if not checkSpeed(time, time-cmd[0], cmd[2]-startAngle): + errorCount += 1 + + print "found %d error(s)" % (errorCount) diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/log0.csv frama-c-20150201+sodium+dfsg/tests/ICPC/log0.csv --- frama-c-20140301+neon+dfsg/tests/ICPC/log0.csv 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/log0.csv 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,1801 @@ +time(ms) engineVoltage legAngle legAngleValid isActive +0 0.000000 0.000000 0 0 +100 0.302562 0.000000 0 1 +200 1.045989 0.002367 0 1 +300 1.951601 0.025075 0 1 +400 2.916877 0.092575 0 1 +500 3.904103 0.223388 0 1 +600 4.899404 0.429223 0 1 +700 5.897675 0.716896 0 1 +800 6.897039 1.090207 0 1 +900 7.896805 1.551214 0 1 +1000 8.896719 2.101015 0 1 +1100 9.594126 2.740188 0 1 +1200 9.850687 3.466669 0 1 +1300 9.945071 4.262640 0 1 +1400 9.979793 5.103732 0 1 +1500 9.992566 5.971467 0 1 +1600 9.997265 6.854157 0 1 +1700 9.998994 7.744996 0 1 +1800 9.999630 8.640192 0 1 +1900 9.999864 9.537688 0 1 +2000 9.999950 10.436389 0 1 +2100 9.999982 11.335718 0 1 +2200 9.999993 12.235371 0 1 +2300 9.999998 13.135192 0 1 +2400 9.999999 14.035100 0 1 +2500 10.000000 14.935053 0 1 +2600 10.000000 15.835028 0 1 +2700 10.000000 16.735016 0 1 +2800 10.000000 17.635009 0 1 +2900 10.000000 18.535006 0 1 +3000 10.000000 19.435004 0 1 +3100 10.000000 20.335004 0 1 +3200 10.000000 21.235003 0 1 +3300 10.000000 22.135003 0 1 +3400 10.000000 23.035003 0 1 +3500 10.000000 23.935003 0 1 +3600 10.000000 24.835003 0 1 +3700 10.000000 25.735003 0 1 +3800 10.000000 26.635003 0 1 +3900 10.000000 27.535003 0 1 +4000 10.000000 28.435003 0 1 +4100 10.000000 29.335003 0 1 +4200 10.000000 30.235003 0 1 +4300 10.000000 31.135003 0 1 +4400 10.000000 32.035003 0 1 +4500 10.000000 32.935003 0 1 +4600 10.000000 33.835003 0 1 +4700 10.000000 34.735003 0 1 +4800 10.000000 35.635003 0 1 +4900 10.000000 36.535003 0 1 +5000 10.000000 37.435003 0 1 +5100 10.000000 38.335003 0 1 +5200 10.000000 39.235003 0 1 +5300 10.000000 40.135003 0 1 +5400 10.000000 41.035003 0 1 +5500 10.000000 41.935003 0 1 +5600 10.000000 42.835003 0 1 +5700 10.000000 43.735003 0 1 +5800 10.000000 44.635003 0 1 +5900 10.000000 45.535003 0 1 +6000 10.000000 46.435003 0 1 +6100 10.000000 47.335003 0 1 +6200 10.000000 48.235003 0 1 +6300 10.000000 49.135003 0 1 +6400 10.000000 50.035003 0 1 +6500 10.000000 50.935003 0 1 +6600 10.000000 51.835003 0 1 +6700 10.000000 52.735003 0 1 +6800 10.000000 53.635003 0 1 +6900 10.000000 54.535003 0 1 +7000 10.000000 55.435003 0 1 +7100 10.000000 56.335003 0 1 +7200 10.000000 57.235003 0 1 +7300 10.000000 58.135003 0 1 +7400 10.000000 59.035003 0 1 +7500 10.000000 59.935003 0 1 +7600 10.000000 60.835003 0 1 +7700 10.000000 61.735003 0 1 +7800 10.000000 62.635003 0 1 +7900 10.000000 63.535003 0 1 +8000 10.000000 64.435003 0 1 +8100 10.000000 65.335003 0 1 +8200 10.000000 66.235003 0 1 +8300 10.000000 67.135003 0 1 +8400 10.000000 68.035003 0 1 +8500 10.000000 68.935003 0 1 +8600 10.000000 69.835003 0 1 +8700 10.000000 70.735003 0 1 +8800 10.000000 71.635003 0 1 +8900 10.000000 72.535003 0 1 +9000 10.000000 73.435003 0 1 +9100 10.000000 74.335003 0 1 +9200 10.000000 75.235003 0 1 +9300 10.000000 76.135003 0 1 +9400 10.000000 77.035003 0 1 +9500 10.000000 77.935003 0 1 +9600 10.000000 78.835003 0 1 +9700 10.000000 79.735003 0 1 +9800 10.000000 80.635003 0 1 +9900 10.000000 81.535003 0 1 +10000 10.000000 82.435003 0 1 +10100 10.000000 83.335003 0 1 +10200 10.000000 84.235003 0 1 +10300 10.000000 85.135003 0 1 +10400 10.000000 86.035003 0 1 +10500 10.000000 86.935003 0 1 +10600 10.000000 87.835003 0 1 +10700 10.000000 88.735003 0 1 +10800 10.000000 89.635003 0 1 +10900 10.000000 90.535003 0 1 +11000 10.000000 91.435003 0 1 +11100 10.000000 92.335003 0 1 +11200 10.000000 93.235003 0 1 +11300 10.000000 94.135003 0 1 +11400 10.000000 95.035003 0 1 +11500 10.000000 95.935003 0 1 +11600 10.000000 96.835003 0 1 +11700 10.000000 97.735003 0 1 +11800 10.000000 98.635003 0 1 +11900 10.000000 99.535003 0 1 +12000 10.000000 100.435003 0 1 +12100 10.000000 101.000000 0 1 +12200 10.000000 101.000000 0 1 +12300 10.000000 101.000000 0 1 +12400 10.000000 101.000000 0 1 +12500 10.000000 101.000000 0 1 +12600 10.000000 101.000000 0 1 +12700 10.000000 101.000000 0 1 +12800 10.000000 101.000000 0 1 +12900 10.000000 101.000000 0 1 +13000 10.000000 101.000000 0 1 +13100 10.000000 101.000000 0 1 +13200 10.000000 101.000000 0 1 +13300 10.000000 101.000000 0 1 +13400 10.000000 101.000000 0 1 +13500 10.000000 101.000000 0 1 +13600 10.000000 101.000000 0 1 +13700 10.000000 101.000000 0 1 +13800 10.000000 101.000000 0 1 +13900 10.000000 101.000000 0 1 +14000 10.000000 101.000000 0 1 +14100 9.963746 101.000000 0 1 +14200 9.431253 101.000000 0 1 +14300 8.603239 101.000000 0 1 +14400 7.666509 101.000000 0 1 +14500 6.689785 101.000000 0 1 +14600 5.698348 101.000000 0 1 +14700 4.701498 101.000000 0 1 +14800 3.702657 101.000000 0 1 +14900 2.703083 101.000000 0 1 +15000 1.703240 101.000000 0 1 +15100 0.703298 101.000000 0 1 +15200 -0.296681 101.000000 0 1 +15300 -1.296673 101.000000 0 1 +15400 -2.296671 101.000000 0 1 +15500 -3.296670 100.955429 0 1 +15600 -4.296669 100.820893 0 1 +15700 -5.296669 100.596374 0 1 +15800 -6.296669 100.281864 0 1 +15900 -7.296669 99.877359 0 1 +16000 -8.296669 99.382856 0 1 +16100 -9.260415 98.798354 0 1 +16200 -9.727922 98.123935 0 1 +16300 -9.899908 97.366920 0 1 +16400 -9.963178 96.550346 0 1 +16500 -9.986454 95.696864 0 1 +16600 -9.995017 94.822102 0 1 +16700 -9.998167 93.935559 0 1 +16800 -9.999326 93.042651 0 1 +16900 -9.999752 92.146360 0 1 +17000 -9.999909 91.248289 0 1 +17100 -9.999966 90.349288 0 1 +17200 -9.999988 89.449805 0 1 +17300 -9.999995 88.550071 0 1 +17400 -9.999998 87.650209 0 1 +17500 -9.999999 86.750279 0 1 +17600 -10.000000 85.850315 0 1 +17700 -10.000000 84.950334 0 1 +17800 -10.000000 84.050344 0 1 +17900 -10.000000 83.150349 0 1 +18000 -10.000000 82.250351 0 1 +18100 -10.000000 81.350353 0 1 +18200 -10.000000 80.450353 0 1 +18300 -10.000000 79.550354 0 1 +18400 -10.000000 78.650354 0 1 +18500 -10.000000 77.750354 0 1 +18600 -10.000000 76.850354 0 1 +18700 -10.000000 75.950354 0 1 +18800 -10.000000 75.050354 0 1 +18900 -10.000000 74.150354 0 1 +19000 -10.000000 73.250354 0 1 +19100 -10.000000 72.350354 0 1 +19200 -10.000000 71.450354 0 1 +19300 -10.000000 70.550354 0 1 +19400 -10.000000 69.650354 0 1 +19500 -10.000000 68.750354 0 1 +19600 -10.000000 67.850354 0 1 +19700 -10.000000 66.950354 0 1 +19800 -10.000000 66.050354 0 1 +19900 -10.000000 65.150354 0 1 +20000 -10.000000 64.250354 0 1 +20100 -10.000000 63.350354 0 1 +20200 -10.000000 62.450354 0 1 +20300 -10.000000 61.550354 0 1 +20400 -10.000000 60.650354 0 1 +20500 -10.000000 59.750354 0 1 +20600 -10.000000 58.850354 0 1 +20700 -10.000000 57.950354 0 1 +20800 -10.000000 57.050354 0 1 +20900 -10.000000 56.150354 0 1 +21000 -10.000000 55.250354 0 1 +21100 -10.000000 54.350354 0 1 +21200 -10.000000 53.450354 0 1 +21300 -10.000000 52.550354 0 1 +21400 -10.000000 51.650354 0 1 +21500 -10.000000 50.750354 0 1 +21600 -10.000000 49.850354 0 1 +21700 -10.000000 48.950354 0 1 +21800 -10.000000 48.050354 0 1 +21900 -10.000000 47.150354 0 1 +22000 -10.000000 46.250354 0 1 +22100 -10.000000 45.350354 0 1 +22200 -10.000000 44.450354 0 1 +22300 -10.000000 43.550354 0 1 +22400 -10.000000 42.650354 0 1 +22500 -10.000000 41.750354 0 1 +22600 -10.000000 40.850354 0 1 +22700 -10.000000 39.950354 0 1 +22800 -10.000000 39.050354 0 1 +22900 -10.000000 38.150354 0 1 +23000 -10.000000 37.250354 0 1 +23100 -10.000000 36.350354 0 1 +23200 -10.000000 35.450354 0 1 +23300 -10.000000 34.550354 0 1 +23400 -10.000000 33.650354 0 1 +23500 -10.000000 32.750354 0 1 +23600 -10.000000 31.850354 0 1 +23700 -10.000000 30.950354 0 1 +23800 -10.000000 30.050354 0 1 +23900 -10.000000 29.150354 0 1 +24000 -10.000000 28.250354 0 1 +24100 -10.000000 27.350354 0 1 +24200 -10.000000 26.450354 0 1 +24300 -10.000000 25.550354 0 1 +24400 -10.000000 24.650354 0 1 +24500 -10.000000 23.750354 0 1 +24600 -10.000000 22.850354 0 1 +24700 -10.000000 21.950354 0 1 +24800 -10.000000 21.050354 0 1 +24900 -10.000000 20.150354 0 1 +25000 -10.000000 19.250354 0 1 +25100 -10.000000 18.350354 0 1 +25200 -10.000000 17.450354 0 1 +25300 -10.000000 16.550354 0 1 +25400 -10.000000 15.650354 0 1 +25500 -10.000000 14.750354 0 1 +25600 -10.000000 13.850354 0 1 +25700 -10.000000 12.950354 0 1 +25800 -10.000000 12.050354 0 1 +25900 -10.000000 11.150354 0 1 +26000 -10.000000 10.250354 0 1 +26100 -10.000000 9.350354 0 1 +26200 -10.000000 8.450354 0 1 +26300 -10.000000 7.550354 0 1 +26400 -10.000000 6.650354 0 1 +26500 -10.000000 5.750354 0 1 +26600 -10.000000 4.850354 0 1 +26700 -10.000000 3.950354 0 1 +26800 -10.000000 3.050354 0 1 +26900 -10.000000 2.150354 0 1 +27000 -10.000000 1.250354 0 1 +27100 -10.000000 0.350354 0 1 +27200 -10.000000 -0.549646 0 1 +27300 -5.546428 18.640000 1 1 +27400 -2.285343 17.774458 1 1 +27500 -1.277209 17.123179 1 1 +27600 -1.097889 16.699841 1 1 +27700 -1.223473 16.428529 1 1 +27800 -1.461224 16.239756 1 1 +27900 -1.740239 16.086623 1 1 +28000 -2.093698 15.940919 1 1 +28100 -2.502605 15.786028 1 1 +28200 -2.931910 15.610286 1 1 +28300 -3.368719 15.405707 1 1 +28400 -3.808289 15.167438 1 1 +28500 -4.248874 14.892713 1 1 +28600 -4.701304 14.580011 1 1 +28700 -5.310881 14.228485 1 1 +28800 -6.014011 13.835386 1 1 +28900 -6.751557 13.393195 1 1 +29000 -7.501765 12.894629 1 1 +29100 -8.256630 12.334679 1 1 +29200 -9.013208 11.710310 1 1 +29300 -9.624639 11.019789 1 1 +29400 -9.861912 10.262983 1 1 +29500 -9.949200 9.450320 1 1 +29600 -9.981312 8.600243 1 1 +29700 -9.993125 7.727745 1 1 +29800 -9.997471 6.842553 1 1 +29900 -9.999070 5.950408 1 1 +30000 -9.999658 5.054535 1 1 +30100 -9.674885 4.156688 1 1 +30200 -9.076528 3.261183 1 1 +30300 -8.377526 2.384362 1 1 +30400 -7.465032 1.544448 1 1 +30500 -6.205562 0.755730 1 1 +30600 -4.812640 0.037835 1 1 +30700 -3.419980 -0.587071 1 1 +30800 -2.369789 -1.102858 1 1 +30900 -1.504566 -1.505798 1 1 +31000 -0.634881 -1.806873 1 1 +31100 0.019289 -2.018348 1 1 +31200 0.259944 -2.146756 1 1 +31300 0.348476 -2.209181 1 1 +31400 0.381045 -2.228870 1 1 +31500 0.393027 -2.223359 1 1 +31600 0.397435 -2.203710 1 1 +31700 0.399056 -2.176362 1 1 +31800 0.399653 -2.144898 1 1 +31900 0.399872 -2.111262 1 1 +32000 0.399953 -2.076488 1 1 +32100 0.399983 -2.041122 1 1 +32200 0.399994 -2.005450 1 1 +32300 0.399998 -1.969619 1 1 +32400 0.399999 -1.933705 1 1 +32500 0.400000 -1.897750 1 1 +32600 0.400000 -1.861773 1 1 +32700 0.400000 -1.825785 1 1 +32800 0.400000 -1.789791 1 1 +32900 0.400000 -1.753794 1 1 +33000 0.400000 -1.717796 1 1 +33100 0.400000 -1.681796 1 1 +33200 0.400000 -1.645797 1 1 +33300 0.400000 -1.609797 1 1 +33400 0.400000 -1.573797 1 1 +33500 0.400000 -1.537797 1 1 +33600 0.400000 -1.501797 1 1 +33700 0.400000 -1.465797 1 1 +33800 0.400000 -1.429797 1 1 +33900 0.400000 -1.393797 1 1 +34000 0.400000 -1.357797 1 1 +34100 0.400000 -1.321797 1 1 +34200 0.400000 -1.285797 1 1 +34300 0.400000 -1.249797 1 1 +34400 0.400000 -1.213797 1 1 +34500 0.400000 -1.177797 1 1 +34600 0.400000 -1.141797 1 1 +34700 0.400000 -1.105797 1 1 +34800 0.400000 -1.069797 1 1 +34900 0.400000 -1.033797 1 1 +35000 0.400000 -0.997797 1 1 +35100 0.400000 -0.961797 1 1 +35200 0.400000 -0.925797 1 1 +35300 0.400000 -0.889797 1 1 +35400 0.400000 -0.853797 1 1 +35500 0.400000 -0.817797 1 1 +35600 0.400000 -0.781797 1 1 +35700 0.400000 -0.745797 1 1 +35800 0.400000 -0.709797 1 1 +35900 0.400000 -0.673797 1 1 +36000 0.400000 -0.637797 1 1 +36100 0.400000 -0.601797 1 1 +36200 0.400000 -0.565797 1 1 +36300 0.400000 -0.529797 1 1 +36400 0.327492 -0.493797 1 1 +36500 0.120478 -0.457960 1 1 +36600 0.044321 -0.428014 1 1 +36700 0.016305 -0.408204 1 1 +36800 0.005998 -0.396402 1 1 +36900 0.002207 -0.389742 1 1 +37000 0.000812 -0.386102 1 1 +37100 0.000299 -0.384152 1 1 +37200 0.000110 -0.383121 1 1 +37300 0.000040 -0.382581 1 1 +37400 0.000015 -0.382299 1 1 +37500 0.000005 -0.382153 1 1 +37600 0.000002 -0.382078 1 1 +37700 0.000001 -0.382039 1 1 +37800 0.000000 -0.382019 1 1 +37900 0.000000 -0.382008 1 1 +38000 0.000000 -0.382003 1 1 +38100 0.000000 -0.382000 1 1 +38200 0.000000 -0.381999 1 1 +38300 0.000000 -0.381998 1 1 +38400 0.000000 -0.381998 1 1 +38500 0.000000 -0.381998 1 1 +38600 0.000000 -0.381998 1 1 +38700 0.000000 -0.381997 1 1 +38800 0.000000 -0.381997 1 1 +38900 0.000000 -0.381997 1 1 +39000 0.000000 -0.381997 1 1 +39100 0.000000 -0.381997 1 1 +39200 0.000000 -0.381997 1 1 +39300 0.000000 -0.381997 1 1 +39400 0.000000 -0.381997 1 1 +39500 0.000000 -0.381997 1 1 +39600 0.000000 -0.381997 1 1 +39700 0.000000 -0.381997 1 1 +39800 0.000000 -0.381997 1 1 +39900 0.000000 -0.381997 1 1 +40000 0.000000 -0.381997 1 1 +40100 0.000000 -0.381997 1 1 +40200 0.000000 -0.381997 1 1 +40300 0.000000 -0.381997 1 1 +40400 0.000000 -0.381997 1 1 +40500 0.000000 -0.381997 1 1 +40600 0.000000 -0.381997 1 1 +40700 0.000000 -0.381997 1 1 +40800 0.000000 -0.381997 1 1 +40900 0.000000 -0.381997 1 1 +41000 0.000000 -0.381997 1 1 +41100 0.000000 -0.381997 1 1 +41200 0.000000 -0.381997 1 1 +41300 0.000000 -0.381997 1 1 +41400 0.000000 -0.381997 1 1 +41500 0.000000 -0.381997 1 1 +41600 0.000000 -0.381997 1 1 +41700 0.000000 -0.381997 1 1 +41800 0.000000 -0.381997 1 1 +41900 0.000000 -0.381997 1 1 +42000 0.000000 -0.381997 1 1 +42100 0.000000 -0.381997 1 1 +42200 0.000000 -0.381997 1 1 +42300 0.000000 -0.381997 1 1 +42400 0.000000 -0.381997 1 1 +42500 0.000000 -0.381997 1 1 +42600 0.000000 -0.381997 1 1 +42700 0.000000 -0.381997 1 1 +42800 0.000000 -0.381997 1 1 +42900 0.000000 -0.381997 1 1 +43000 0.000000 -0.381997 1 1 +43100 0.000000 -0.381997 1 1 +43200 0.000000 -0.381997 1 1 +43300 0.000000 -0.381997 1 1 +43400 0.000000 -0.381997 1 1 +43500 0.000000 -0.381997 1 1 +43600 0.000000 -0.381997 1 1 +43700 0.000000 -0.381997 1 1 +43800 0.000000 -0.381997 1 1 +43900 0.000000 -0.381997 1 1 +44000 0.000000 -0.381997 1 1 +44100 0.000000 -0.381997 1 1 +44200 0.000000 -0.381997 1 1 +44300 0.000000 -0.381997 1 1 +44400 0.000000 -0.381997 1 1 +44500 0.000000 -0.381997 1 1 +44600 0.000000 -0.381997 1 1 +44700 0.000000 -0.381997 1 1 +44800 0.000000 -0.381997 1 1 +44900 0.000000 -0.381997 1 1 +45000 0.000000 -0.381997 1 1 +45100 0.000000 -0.381997 1 1 +45200 0.000000 -0.381997 1 1 +45300 0.000000 -0.381997 1 1 +45400 0.000000 -0.381997 1 1 +45500 0.000000 -0.381997 1 1 +45600 0.000000 -0.381997 1 1 +45700 0.000000 -0.381997 1 1 +45800 0.000000 -0.381997 1 1 +45900 0.000000 -0.381997 1 1 +46000 0.000000 -0.381997 1 1 +46100 0.000000 -0.381997 1 1 +46200 0.000000 -0.381997 1 1 +46300 0.000000 -0.381997 1 1 +46400 0.000000 -0.381997 1 1 +46500 0.000000 -0.381997 1 1 +46600 0.000000 -0.381997 1 1 +46700 0.000000 -0.381997 1 1 +46800 0.000000 -0.381997 1 1 +46900 0.000000 -0.381997 1 1 +47000 0.000000 -0.381997 1 1 +47100 0.000000 -0.381997 1 1 +47200 0.000000 -0.381997 1 1 +47300 0.000000 -0.381997 1 1 +47400 0.000000 -0.381997 1 1 +47500 0.000000 -0.381997 1 1 +47600 0.000000 -0.381997 1 1 +47700 0.000000 -0.381997 1 1 +47800 0.000000 -0.381997 1 1 +47900 0.000000 -0.381997 1 1 +48000 0.000000 -0.381997 1 1 +48100 0.000000 -0.381997 1 1 +48200 0.000000 -0.381997 1 1 +48300 0.000000 -0.381997 1 1 +48400 0.000000 -0.381997 1 1 +48500 0.000000 -0.381997 1 1 +48600 0.000000 -0.381997 1 1 +48700 0.000000 -0.381997 1 1 +48800 0.000000 -0.381997 1 1 +48900 0.000000 -0.381997 1 1 +49000 0.000000 -0.381997 1 1 +49100 0.000000 -0.381997 1 1 +49200 0.000000 -0.381997 1 1 +49300 0.000000 -0.381997 1 1 +49400 0.000000 -0.381997 1 1 +49500 0.000000 -0.381997 1 1 +49600 0.000000 -0.381997 1 1 +49700 0.000000 -0.381997 1 1 +49800 0.000000 -0.381997 1 1 +49900 0.000000 -0.381997 1 1 +50000 0.010986 -0.381997 1 1 +50100 0.172348 -0.381973 1 1 +50200 0.423261 -0.379704 1 1 +50300 0.707118 -0.368211 1 1 +50400 1.003095 -0.340630 1 1 +50500 1.303531 -0.292224 1 1 +50600 1.605607 -0.220116 1 1 +50700 1.934869 -0.122664 1 1 +50800 2.332624 0.001185 1 1 +50900 2.757827 0.153910 1 1 +51000 3.193127 0.339184 1 1 +51100 3.632141 0.559900 1 1 +51200 4.072523 0.817918 1 1 +51300 4.513407 1.114326 1 1 +51400 5.050206 1.449737 1 1 +51500 5.726562 1.825230 1 1 +51600 6.454259 2.246669 1 1 +51700 7.200843 2.721885 1 1 +51800 7.954375 3.256787 1 1 +51900 8.710463 3.855104 1 1 +52000 9.440027 4.519006 1 1 +52100 9.793997 5.249641 1 1 +52200 9.924216 6.042116 1 1 +52300 9.972121 6.879327 1 1 +52400 9.989744 7.744300 1 1 +52500 9.850449 8.625291 1 1 +52600 9.332666 9.514337 1 1 +52700 8.663306 10.396420 1 1 +52800 7.888826 11.250580 1 1 +52900 6.733303 12.060309 1 1 +53000 5.378621 12.808720 1 1 +53100 3.950672 13.472826 1 1 +53200 2.756571 14.033515 1 1 +53300 1.838407 14.480710 1 1 +53400 1.021754 14.820860 1 1 +53500 0.388223 15.066963 1 1 +53600 0.142819 15.230248 1 1 +53700 0.052540 15.328373 1 1 +53800 0.019328 15.384009 1 1 +53900 0.007111 15.414508 1 1 +54000 0.002616 15.430879 1 1 +54100 0.000962 15.439545 1 1 +54200 0.000354 15.444091 1 1 +54300 0.000130 15.446460 1 1 +54400 0.000048 15.447690 1 1 +54500 0.000018 15.448326 1 1 +54600 0.000006 15.448654 1 1 +54700 0.000002 15.448823 1 1 +54800 0.000001 15.448910 1 1 +54900 0.000000 15.448955 1 1 +55000 0.000000 15.448978 1 1 +55100 0.000000 15.448990 1 1 +55200 0.000000 15.448996 1 1 +55300 0.000000 15.448999 1 1 +55400 0.000000 15.449001 1 1 +55500 0.000000 15.449002 1 1 +55600 0.000000 15.449002 1 1 +55700 0.000000 15.449002 1 1 +55800 0.000000 15.449002 1 1 +55900 0.000000 15.449003 1 1 +56000 0.000000 15.449003 1 1 +56100 0.000000 15.449003 1 1 +56200 0.000000 15.449003 1 1 +56300 0.000000 15.449003 1 1 +56400 0.000000 15.449003 1 1 +56500 0.000000 15.449003 1 1 +56600 0.000000 15.449003 1 1 +56700 0.000000 15.449003 1 1 +56800 0.000000 15.449003 1 1 +56900 0.000000 15.449003 1 1 +57000 0.000000 15.449003 1 1 +57100 0.000000 15.449003 1 1 +57200 0.000000 15.449003 1 1 +57300 0.000000 15.449003 1 1 +57400 0.000000 15.449003 1 1 +57500 0.000000 15.449003 1 1 +57600 0.000000 15.449003 1 1 +57700 0.000000 15.449003 1 1 +57800 0.000000 15.449003 1 1 +57900 0.000000 15.449003 1 1 +58000 0.000000 15.449003 1 1 +58100 0.000000 15.449003 1 1 +58200 0.000000 15.449003 1 1 +58300 0.000000 15.449003 1 1 +58400 0.000000 15.449003 1 1 +58500 0.000000 15.449003 1 1 +58600 0.000000 15.449003 1 1 +58700 0.000000 15.449003 1 1 +58800 0.000000 15.449003 1 1 +58900 0.000000 15.449003 1 1 +59000 0.000000 15.449003 1 1 +59100 0.000000 15.449003 1 1 +59200 0.000000 15.449003 1 1 +59300 0.000000 15.449003 1 1 +59400 0.000000 15.449003 1 1 +59500 0.000000 15.449003 1 1 +59600 0.000000 15.449003 1 1 +59700 0.000000 15.449003 1 1 +59800 0.000000 15.449003 1 1 +59900 0.000000 15.449003 1 1 +60000 0.000000 15.449003 1 1 +60100 0.000000 15.449003 1 1 +60200 0.000000 15.449003 1 1 +60300 0.000000 15.449003 1 1 +60400 0.000000 15.449003 1 1 +60500 0.000000 15.449003 1 1 +60600 0.000000 15.449003 1 1 +60700 0.000000 15.449003 1 1 +60800 0.000000 15.449003 1 1 +60900 0.000000 15.449003 1 1 +61000 0.000000 15.449003 1 1 +61100 0.000000 15.449003 1 1 +61200 0.000000 15.449003 1 1 +61300 0.000000 15.449003 1 1 +61400 0.000000 15.449003 1 1 +61500 0.000000 15.449003 1 1 +61600 0.000000 15.449003 1 1 +61700 0.000000 15.449003 1 1 +61800 0.000000 15.449003 1 1 +61900 0.000000 15.449003 1 1 +62000 0.000000 15.449003 1 1 +62100 0.000000 15.449003 1 1 +62200 0.000000 15.449003 1 1 +62300 0.000000 15.449003 1 1 +62400 0.000000 15.449003 1 1 +62500 0.000000 15.449003 1 1 +62600 0.000000 15.449003 1 1 +62700 0.000000 15.449003 1 1 +62800 0.000000 15.449003 1 1 +62900 0.000000 15.449003 1 1 +63000 0.000000 15.449003 1 1 +63100 0.000000 15.449003 1 1 +63200 0.000000 15.449003 1 1 +63300 0.000000 15.449003 1 1 +63400 0.000000 15.449003 1 1 +63500 0.000000 15.449003 1 1 +63600 0.000000 15.449003 1 1 +63700 0.000000 15.449003 1 1 +63800 0.000000 15.449003 1 1 +63900 0.000000 15.449003 1 1 +64000 0.000000 15.449003 1 1 +64100 0.000000 15.449003 1 1 +64200 0.000000 15.449003 1 1 +64300 0.000000 15.449003 1 1 +64400 0.000000 15.449003 1 1 +64500 0.000000 15.449003 1 1 +64600 0.000000 15.449003 1 1 +64700 0.000000 15.449003 1 1 +64800 0.000000 15.449003 1 1 +64900 0.000000 15.449003 1 1 +65000 0.000000 15.449003 1 1 +65100 0.000000 15.449003 1 1 +65200 0.000000 15.449003 1 1 +65300 0.000000 15.449003 1 1 +65400 0.000000 15.449003 1 1 +65500 0.000000 15.449003 1 1 +65600 0.000000 15.449003 1 1 +65700 0.000000 15.449003 1 1 +65800 0.000000 15.449003 1 1 +65900 0.000000 15.449003 1 1 +66000 0.000000 15.449003 1 1 +66100 0.000000 15.449003 1 1 +66200 0.000000 15.449003 1 1 +66300 0.000000 15.449003 1 1 +66400 0.000000 15.449003 1 1 +66500 0.000000 15.449003 1 1 +66600 0.000000 15.449003 1 1 +66700 0.000000 15.449003 1 1 +66800 0.000000 15.449003 1 1 +66900 0.000000 15.449003 1 1 +67000 0.000000 15.449003 1 1 +67100 0.000000 15.449003 1 1 +67200 0.000000 15.449003 1 1 +67300 0.000000 15.449003 1 1 +67400 0.000000 15.449003 1 1 +67500 0.000000 15.449003 1 1 +67600 0.000000 15.449003 1 1 +67700 0.000000 15.449003 1 1 +67800 0.000000 15.449003 1 1 +67900 0.000000 15.449003 1 1 +68000 0.000000 15.449003 1 1 +68100 0.000000 15.449003 1 1 +68200 0.000000 15.449003 1 1 +68300 0.000000 15.449003 1 1 +68400 0.000000 15.449003 1 1 +68500 0.000000 15.449003 1 1 +68600 0.000000 15.449003 1 1 +68700 0.000000 15.449003 1 1 +68800 0.000000 15.449003 1 1 +68900 0.000000 15.449003 1 1 +69000 0.000000 15.449003 1 1 +69100 0.000000 15.449003 1 1 +69200 0.000000 15.449003 1 1 +69300 0.000000 15.449003 1 1 +69400 0.000000 15.449003 1 1 +69500 0.000000 15.449003 1 1 +69600 0.000000 15.449003 1 1 +69700 0.000000 15.449003 1 1 +69800 0.000000 15.449003 1 1 +69900 0.000000 15.449003 1 1 +70000 -0.010986 15.449003 1 1 +70100 -0.172348 15.448978 1 1 +70200 -0.423261 15.446710 1 1 +70300 -0.707118 15.435216 1 1 +70400 -1.003095 15.407635 1 1 +70500 -1.303531 15.359230 1 1 +70600 -1.605607 15.287122 1 1 +70700 -1.934869 15.189669 1 1 +70800 -2.332624 15.065821 1 1 +70900 -2.757827 14.913095 1 1 +71000 -3.193127 14.727821 1 1 +71100 -3.632141 14.507105 1 1 +71200 -4.072523 14.249088 1 1 +71300 -4.513407 13.952679 1 1 +71400 -5.050206 13.617268 1 1 +71500 -5.726562 13.241776 1 1 +71600 -6.454259 12.820336 1 1 +71700 -7.200843 12.345120 1 1 +71800 -7.954375 11.810218 1 1 +71900 -8.710463 11.211902 1 1 +72000 -9.440027 10.547999 1 1 +72100 -9.793997 9.817364 1 1 +72200 -9.924216 9.024889 1 1 +72300 -9.972121 8.187678 1 1 +72400 -9.989744 7.322705 1 1 +72500 -9.996227 6.441715 1 1 +72600 -9.998612 5.551852 1 1 +72700 -9.999489 4.657196 1 1 +72800 -9.999812 3.759990 1 1 +72900 -9.999931 2.861444 1 1 +73000 -9.999975 1.962197 1 1 +73100 -9.999991 1.062586 1 1 +73200 -9.999997 0.162787 1 1 +73300 -9.999999 -0.737110 1 1 +73400 -10.000000 -1.637056 1 1 +73500 -10.000000 -2.537029 1 1 +73600 -10.000000 -3.437015 1 1 +73700 -10.000000 -4.337008 1 1 +73800 -10.000000 -5.237004 1 1 +73900 -10.000000 -6.137002 1 1 +74000 -10.000000 -7.037001 1 1 +74100 -10.000000 -7.937001 1 1 +74200 -10.000000 -8.837000 1 1 +74300 -10.000000 -9.737000 1 1 +74400 -10.000000 -10.637000 1 1 +74500 -10.000000 -11.537000 1 1 +74600 -10.000000 -12.437000 1 1 +74700 -10.000000 -13.337000 1 1 +74800 -10.000000 -14.237000 1 1 +74900 -10.000000 -15.137000 1 1 +75000 -10.000000 -16.037000 1 1 +75100 -10.000000 -16.937000 1 1 +75200 -10.000000 -17.837000 1 1 +75300 -10.000000 -18.737000 1 1 +75400 -10.000000 -19.637000 1 1 +75500 -10.000000 -20.537000 1 1 +75600 -10.000000 -21.437000 1 1 +75700 -10.000000 -22.337000 1 1 +75800 -10.000000 -23.237000 1 1 +75900 -10.000000 -24.137000 1 1 +76000 -10.000000 -25.037000 1 1 +76100 -10.000000 -25.937000 1 1 +76200 -10.000000 -26.837000 1 1 +76300 -10.000000 -27.737000 1 1 +76400 -10.000000 -28.637000 1 1 +76500 -10.000000 -29.537000 1 1 +76600 -10.000000 -30.437000 1 1 +76700 -10.000000 -31.337000 1 1 +76800 -10.000000 -32.237000 1 1 +76900 -10.000000 -33.137000 1 1 +77000 -10.000000 -34.037000 1 1 +77100 -10.000000 -34.937000 1 1 +77200 -10.000000 -35.837000 1 1 +77300 -10.000000 -36.737000 1 1 +77400 -10.000000 -37.637000 1 1 +77500 -10.000000 -38.537000 1 1 +77600 -10.000000 -39.437000 1 1 +77700 -10.000000 -40.337000 1 1 +77800 -10.000000 -41.237000 1 1 +77900 -10.000000 -42.137000 1 1 +78000 -10.000000 -43.037000 1 1 +78100 -10.000000 -43.937000 1 1 +78200 -10.000000 -44.837000 1 1 +78300 -10.000000 -45.737000 1 1 +78400 -10.000000 -46.637000 1 1 +78500 -10.000000 -47.537000 1 1 +78600 -9.922583 -48.437000 1 1 +78700 -9.454979 -49.336710 1 1 +78800 -8.804078 -50.227982 1 1 +78900 -8.072821 -51.092419 1 1 +79000 -6.986909 -51.913802 1 1 +79100 -5.657835 -52.677133 1 1 +79200 -4.239307 -53.360289 1 1 +79300 -2.964337 -53.943089 1 1 +79400 -2.010615 -54.413109 1 1 +79500 -1.180882 -54.773684 1 1 +79600 -0.474177 -55.037672 1 1 +79700 -0.174440 -55.216527 1 1 +79800 -0.064173 -55.325810 1 1 +79900 -0.023608 -55.388339 1 1 +80000 -0.008685 -55.422805 1 1 +80100 -0.003195 -55.441370 1 1 +80200 -0.001175 -55.451221 1 1 +80300 -0.000432 -55.456396 1 1 +80400 -0.000159 -55.459096 1 1 +80500 -0.000059 -55.460499 1 1 +80600 -0.000022 -55.461225 1 1 +80700 -0.000008 -55.461599 1 1 +80800 -0.000003 -55.461793 1 1 +80900 -0.000001 -55.461892 1 1 +81000 -0.000000 -55.461943 1 1 +81100 -0.000000 -55.461970 1 1 +81200 -0.000000 -55.461983 1 1 +81300 -0.000000 -55.461990 1 1 +81400 -0.000000 -55.461994 1 1 +81500 -0.000000 -55.461995 1 1 +81600 -0.000000 -55.461996 1 1 +81700 -0.000000 -55.461997 1 1 +81800 -0.000000 -55.461997 1 1 +81900 -0.000000 -55.461997 1 1 +82000 -0.000000 -55.461997 1 1 +82100 -0.000000 -55.461997 1 1 +82200 -0.000000 -55.461997 1 1 +82300 -0.000000 -55.461997 1 1 +82400 -0.000000 -55.461997 1 1 +82500 -0.000000 -55.461997 1 1 +82600 -0.000000 -55.461997 1 1 +82700 -0.000000 -55.461997 1 1 +82800 -0.000000 -55.461997 1 1 +82900 -0.000000 -55.461997 1 1 +83000 -0.000000 -55.461997 1 1 +83100 -0.000000 -55.461997 1 1 +83200 -0.000000 -55.461997 1 1 +83300 -0.000000 -55.461997 1 1 +83400 -0.000000 -55.461997 1 1 +83500 -0.000000 -55.461997 1 1 +83600 -0.000000 -55.461997 1 1 +83700 -0.000000 -55.461997 1 1 +83800 -0.000000 -55.461997 1 1 +83900 -0.000000 -55.461997 1 1 +84000 -0.000000 -55.461997 1 1 +84100 -0.000000 -55.461997 1 1 +84200 -0.000000 -55.461997 1 1 +84300 -0.000000 -55.461997 1 1 +84400 -0.000000 -55.461997 1 1 +84500 -0.000000 -55.461997 1 1 +84600 -0.000000 -55.461997 1 1 +84700 -0.000000 -55.461997 1 1 +84800 -0.000000 -55.461997 1 1 +84900 -0.000000 -55.461997 1 1 +85000 -0.000000 -55.461997 1 1 +85100 -0.000000 -55.461997 1 1 +85200 -0.000000 -55.461997 1 1 +85300 -0.000000 -55.461997 1 1 +85400 -0.000000 -55.461997 1 1 +85500 -0.000000 -55.461997 1 1 +85600 -0.000000 -55.461997 1 1 +85700 -0.000000 -55.461997 1 1 +85800 -0.000000 -55.461997 1 1 +85900 -0.000000 -55.461997 1 1 +86000 -0.000000 -55.461997 1 1 +86100 -0.000000 -55.461997 1 1 +86200 -0.000000 -55.461997 1 1 +86300 -0.000000 -55.461997 1 1 +86400 -0.000000 -55.461997 1 1 +86500 -0.000000 -55.461997 1 1 +86600 -0.000000 -55.461997 1 1 +86700 -0.000000 -55.461997 1 1 +86800 -0.000000 -55.461997 1 1 +86900 -0.000000 -55.461997 1 1 +87000 -0.000000 -55.461997 1 1 +87100 -0.000000 -55.461997 1 1 +87200 -0.000000 -55.461997 1 1 +87300 -0.000000 -55.461997 1 1 +87400 -0.000000 -55.461997 1 1 +87500 -0.000000 -55.461997 1 1 +87600 -0.000000 -55.461997 1 1 +87700 -0.000000 -55.461997 1 1 +87800 -0.000000 -55.461997 1 1 +87900 -0.000000 -55.461997 1 1 +88000 -0.000000 -55.461997 1 1 +88100 -0.000000 -55.461997 1 1 +88200 -0.000000 -55.461997 1 1 +88300 -0.000000 -55.461997 1 1 +88400 -0.000000 -55.461997 1 1 +88500 -0.000000 -55.461997 1 1 +88600 -0.000000 -55.461997 1 1 +88700 -0.000000 -55.461997 1 1 +88800 -0.000000 -55.461997 1 1 +88900 -0.000000 -55.461997 1 1 +89000 -0.000000 -55.461997 1 1 +89100 -0.000000 -55.461997 1 1 +89200 -0.000000 -55.461997 1 1 +89300 -0.000000 -55.461997 1 1 +89400 -0.000000 -55.461997 1 1 +89500 -0.000000 -55.461997 1 1 +89600 -0.000000 -55.461997 1 1 +89700 -0.000000 -55.461997 1 1 +89800 -0.000000 -55.461997 1 1 +89900 -0.000000 -55.461997 1 1 +90000 -0.000000 -55.461997 1 1 +90100 -0.000000 -55.461997 1 1 +90200 -0.000000 -55.461997 1 1 +90300 -0.000000 -55.461997 1 1 +90400 -0.000000 -55.461997 1 1 +90500 -0.000000 -55.461997 1 1 +90600 -0.000000 -55.461997 1 1 +90700 -0.000000 -55.461997 1 1 +90800 -0.000000 -55.461997 1 1 +90900 -0.000000 -55.461997 1 1 +91000 -0.000000 -55.461997 1 1 +91100 -0.000000 -55.461997 1 1 +91200 -0.000000 -55.461997 1 1 +91300 -0.000000 -55.461997 1 1 +91400 -0.000000 -55.461997 1 1 +91500 -0.000000 -55.461997 1 1 +91600 -0.000000 -55.461997 1 1 +91700 -0.000000 -55.461997 1 1 +91800 -0.000000 -55.461997 1 1 +91900 -0.000000 -55.461997 1 1 +92000 -0.000000 -55.461997 1 1 +92100 -0.000000 -55.461997 1 1 +92200 -0.000000 -55.461997 1 1 +92300 -0.000000 -55.461997 1 1 +92400 -0.000000 -55.461997 1 1 +92500 -0.000000 -55.461997 1 1 +92600 -0.000000 -55.461997 1 1 +92700 -0.000000 -55.461997 1 1 +92800 -0.000000 -55.461997 1 1 +92900 -0.000000 -55.461997 1 1 +93000 -0.000000 -55.461997 1 1 +93100 -0.000000 -55.461997 1 1 +93200 -0.000000 -55.461997 1 1 +93300 -0.000000 -55.461997 1 1 +93400 -0.000000 -55.461997 1 1 +93500 -0.000000 -55.461997 1 1 +93600 -0.000000 -55.461997 1 1 +93700 -0.000000 -55.461997 1 1 +93800 -0.000000 -55.461997 1 1 +93900 -0.000000 -55.461997 1 1 +94000 -0.000000 -55.461997 1 1 +94100 -0.000000 -55.461997 1 1 +94200 -0.000000 -55.461997 1 1 +94300 -0.000000 -55.461997 1 1 +94400 -0.000000 -55.461997 1 1 +94500 -0.000000 -55.461997 1 1 +94600 -0.000000 -55.461997 1 1 +94700 -0.000000 -55.461997 1 1 +94800 -0.000000 -55.461997 1 1 +94900 -0.000000 -55.461997 1 1 +95000 -0.000000 -55.461997 1 1 +95100 -0.000000 -55.461997 1 1 +95200 -0.000000 -55.461997 1 1 +95300 -0.000000 -55.461997 1 1 +95400 -0.000000 -55.461997 1 1 +95500 -0.000000 -55.461997 1 1 +95600 -0.000000 -55.461997 1 1 +95700 -0.000000 -55.461997 1 1 +95800 -0.000000 -55.461997 1 1 +95900 -0.000000 -55.461997 1 1 +96000 -0.000000 -55.461997 1 1 +96100 -0.000000 -55.461997 1 1 +96200 -0.000000 -55.461997 1 1 +96300 -0.000000 -55.461997 1 1 +96400 -0.000000 -55.461997 1 1 +96500 -0.000000 -55.461997 1 1 +96600 -0.000000 -55.461997 1 1 +96700 -0.000000 -55.461997 1 1 +96800 -0.000000 -55.461997 1 1 +96900 -0.000000 -55.461997 1 1 +97000 -0.000000 -55.461997 1 1 +97100 -0.000000 -55.461997 1 1 +97200 -0.000000 -55.461997 1 1 +97300 -0.000000 -55.461997 1 1 +97400 -0.000000 -55.461997 1 1 +97500 -0.000000 -55.461997 1 1 +97600 -0.000000 -55.461997 1 1 +97700 -0.000000 -55.461997 1 1 +97800 -0.000000 -55.461997 1 1 +97900 -0.000000 -55.461997 1 1 +98000 -0.000000 -55.461997 1 1 +98100 -0.000000 -55.461997 1 1 +98200 -0.000000 -55.461997 1 1 +98300 -0.000000 -55.461997 1 1 +98400 -0.000000 -55.461997 1 1 +98500 -0.000000 -55.461997 1 1 +98600 -0.000000 -55.461997 1 1 +98700 -0.000000 -55.461997 1 1 +98800 -0.000000 -55.461997 1 1 +98900 -0.000000 -55.461997 1 1 +99000 -0.000000 -55.461997 1 1 +99100 -0.000000 -55.461997 1 1 +99200 -0.000000 -55.461997 1 1 +99300 -0.000000 -55.461997 1 1 +99400 -0.000000 -55.461997 1 1 +99500 -0.000000 -55.461997 1 1 +99600 -0.000000 -55.461997 1 1 +99700 -0.000000 -55.461997 1 1 +99800 -0.000000 -55.461997 1 1 +99900 -0.000000 -55.461997 1 1 +100000 0.010986 -55.461997 1 1 +100100 0.172348 -55.461973 1 1 +100200 0.423261 -55.459704 1 1 +100300 0.707118 -55.448211 1 1 +100400 1.003095 -55.420630 1 1 +100500 1.303531 -55.372224 1 1 +100600 1.605607 -55.300116 1 1 +100700 1.934869 -55.202664 1 1 +100800 2.332624 -55.078815 1 1 +100900 2.757827 -54.926090 1 1 +101000 3.193127 -54.740816 1 1 +101100 3.632141 -54.520100 1 1 +101200 4.072523 -54.262082 1 1 +101300 4.513407 -53.965674 1 1 +101400 5.050206 -53.630263 1 1 +101500 5.726562 -53.254770 1 1 +101600 6.454259 -52.833331 1 1 +101700 7.200843 -52.358115 1 1 +101800 7.954375 -51.823213 1 1 +101900 8.710463 -51.224896 1 1 +102000 9.440027 -50.560994 1 1 +102100 9.793997 -49.830359 1 1 +102200 9.924216 -49.037884 1 1 +102300 9.972121 -48.200673 1 1 +102400 9.989744 -47.335700 1 1 +102500 9.996227 -46.454709 1 1 +102600 9.998612 -45.564847 1 1 +102700 9.999489 -44.670190 1 1 +102800 9.999812 -43.772985 1 1 +102900 9.999931 -42.874439 1 1 +103000 9.999975 -41.975192 1 1 +103100 9.999991 -41.075581 1 1 +103200 9.999997 -40.175782 1 1 +103300 9.999999 -39.275885 1 1 +103400 10.000000 -38.375939 1 1 +103500 10.000000 -37.475966 1 1 +103600 10.000000 -36.575980 1 1 +103700 10.000000 -35.675987 1 1 +103800 10.000000 -34.775991 1 1 +103900 10.000000 -33.875993 1 1 +104000 10.000000 -32.975994 1 1 +104100 10.000000 -32.075994 1 1 +104200 10.000000 -31.175995 1 1 +104300 10.000000 -30.275995 1 1 +104400 10.000000 -29.375995 1 1 +104500 10.000000 -28.475995 1 1 +104600 10.000000 -27.575995 1 1 +104700 10.000000 -26.675995 1 1 +104800 10.000000 -25.775995 1 1 +104900 10.000000 -24.875995 1 1 +105000 10.000000 -23.975995 1 1 +105100 10.000000 -23.075995 1 1 +105200 10.000000 -22.175995 1 1 +105300 10.000000 -21.275995 1 1 +105400 10.000000 -20.375995 1 1 +105500 10.000000 -19.475995 1 1 +105600 10.000000 -18.575995 1 1 +105700 10.000000 -17.675995 1 1 +105800 10.000000 -16.775995 1 1 +105900 10.000000 -15.875995 1 1 +106000 10.000000 -14.975995 1 1 +106100 10.000000 -14.075995 1 1 +106200 10.000000 -13.175995 1 1 +106300 10.000000 -12.275995 1 1 +106400 10.000000 -11.375995 1 1 +106500 10.000000 -10.475995 1 1 +106600 10.000000 -9.575995 1 1 +106700 10.000000 -8.675995 1 1 +106800 10.000000 -7.775995 1 1 +106900 10.000000 -6.875995 1 1 +107000 10.000000 -5.975995 1 1 +107100 10.000000 -5.075995 1 1 +107200 10.000000 -4.175995 1 1 +107300 10.000000 -3.275995 1 1 +107400 10.000000 -2.375995 1 1 +107500 10.000000 -1.475995 1 1 +107600 10.000000 -0.575995 1 1 +107700 10.000000 0.324005 1 1 +107800 10.000000 1.224005 1 1 +107900 10.000000 2.124005 1 1 +108000 10.000000 3.024005 1 1 +108100 10.000000 3.924005 1 1 +108200 10.000000 4.824005 1 1 +108300 10.000000 5.724005 1 1 +108400 10.000000 6.624005 1 1 +108500 10.000000 7.524005 1 1 +108600 10.000000 8.424005 1 1 +108700 10.000000 9.324005 1 1 +108800 10.000000 10.224005 1 1 +108900 10.000000 11.124005 1 1 +109000 10.000000 12.024005 1 1 +109100 10.000000 12.924005 1 1 +109200 10.000000 13.824005 1 1 +109300 10.000000 14.724005 1 1 +109400 10.000000 15.624005 1 1 +109500 10.000000 16.524005 1 1 +109600 10.000000 17.424005 1 1 +109700 10.000000 18.324005 1 1 +109800 10.000000 19.000000 1 1 +109900 10.000000 19.900000 1 1 +110000 10.000000 20.800000 1 1 +110100 10.000000 21.700000 1 1 +110200 10.000000 22.600000 1 1 +110300 9.922583 23.500000 1 1 +110400 9.454979 24.399710 1 1 +110500 8.804078 25.290982 1 1 +110600 8.072821 26.155419 1 1 +110700 6.986909 26.976802 1 1 +110800 5.657835 27.740133 1 1 +110900 4.239307 28.423289 1 1 +111000 2.964337 29.006089 1 1 +111100 2.010615 29.476109 1 1 +111200 1.180882 29.836684 1 1 +111300 0.474177 30.100672 1 1 +111400 0.174440 30.279527 1 1 +111500 0.064173 30.388810 1 1 +111600 0.023608 30.451339 1 1 +111700 0.008685 30.485805 1 1 +111800 -0.128677 30.504370 1 1 +111900 -0.300186 30.513619 1 1 +112000 -0.363280 30.510722 1 1 +112100 -0.254620 30.495392 1 1 +112200 -0.093669 30.471958 1 1 +112300 -0.034459 30.450670 1 1 +112400 -0.012677 30.436292 1 1 +112500 -0.004664 30.427642 1 1 +112600 -0.001716 30.422734 1 1 +112700 -0.000631 30.420043 1 1 +112800 -0.000232 30.418598 1 1 +112900 -0.000085 30.417833 1 1 +113000 -0.000031 30.417431 1 1 +113100 -0.000012 30.417222 1 1 +113200 -0.000004 30.417113 1 1 +113300 -0.000002 30.417057 1 1 +113400 -0.000001 30.417028 1 1 +113500 -0.000000 30.417013 1 1 +113600 -0.000000 30.417006 1 1 +113700 -0.000000 30.417002 1 1 +113800 -0.000000 30.417000 1 1 +113900 -0.000000 30.416999 1 1 +114000 -0.000000 30.416998 1 1 +114100 -0.000000 30.416998 1 1 +114200 -0.000000 30.416998 1 1 +114300 -0.000000 30.416997 1 1 +114400 -0.000000 30.416997 1 1 +114500 -0.000000 30.416997 1 1 +114600 -0.000000 30.416997 1 1 +114700 -0.000000 30.416997 1 1 +114800 -0.000000 30.416997 1 1 +114900 -0.000000 30.416997 1 1 +115000 -0.000000 30.416997 1 1 +115100 -0.000000 30.416997 1 1 +115200 -0.000000 30.416997 1 1 +115300 -0.000000 30.416997 1 1 +115400 -0.000000 30.416997 1 1 +115500 -0.000000 30.416997 1 1 +115600 -0.000000 30.416997 1 1 +115700 -0.000000 30.416997 1 1 +115800 -0.000000 30.416997 1 1 +115900 -0.000000 30.416997 1 1 +116000 -0.000000 30.416997 1 1 +116100 -0.000000 30.416997 1 1 +116200 -0.000000 30.416997 1 1 +116300 -0.000000 30.416997 1 1 +116400 -0.000000 30.416997 1 1 +116500 -0.000000 30.416997 1 1 +116600 -0.000000 30.416997 1 1 +116700 -0.000000 30.416997 1 1 +116800 -0.000000 30.416997 1 1 +116900 -0.000000 30.416997 1 1 +117000 -0.000000 30.416997 1 1 +117100 -0.000000 30.416997 1 1 +117200 -0.000000 30.416997 1 1 +117300 -0.000000 30.416997 1 1 +117400 -0.000000 30.416997 1 1 +117500 -0.000000 30.416997 1 1 +117600 -0.000000 30.416997 1 1 +117700 -0.000000 30.416997 1 1 +117800 -0.000000 30.416997 1 1 +117900 -0.000000 30.416997 1 1 +118000 -0.000000 30.416997 1 1 +118100 -0.000000 30.416997 1 1 +118200 -0.000000 30.416997 1 1 +118300 -0.000000 30.416997 1 1 +118400 -0.000000 30.416997 1 1 +118500 -0.000000 30.416997 1 1 +118600 -0.000000 30.416997 1 1 +118700 -0.000000 30.416997 1 1 +118800 -0.000000 30.416997 1 1 +118900 -0.000000 30.416997 1 1 +119000 -0.000000 30.416997 1 1 +119100 -0.000000 30.416997 1 1 +119200 -0.000000 30.416997 1 1 +119300 -0.000000 30.416997 1 1 +119400 -0.000000 30.416997 1 1 +119500 -0.000000 30.416997 1 1 +119600 -0.000000 30.416997 1 1 +119700 -0.000000 30.416997 1 1 +119800 -0.000000 30.416997 1 1 +119900 -0.000000 30.416997 1 1 +120000 -0.000000 30.416997 1 1 +120100 -0.000000 30.416997 1 1 +120200 -0.000000 30.416997 1 1 +120300 -0.000000 30.416997 1 1 +120400 -0.000000 30.416997 1 1 +120500 -0.000000 30.416997 1 1 +120600 -0.000000 30.416997 1 1 +120700 -0.000000 30.416997 1 1 +120800 -0.000000 30.416997 1 1 +120900 -0.000000 30.416997 1 1 +121000 -0.000000 30.416997 1 1 +121100 -0.000000 30.416997 1 1 +121200 -0.000000 30.416997 1 1 +121300 -0.000000 30.416997 1 1 +121400 -0.000000 30.416997 1 1 +121500 -0.000000 30.416997 1 1 +121600 -0.000000 30.416997 1 1 +121700 -0.000000 30.416997 1 1 +121800 -0.000000 30.416997 1 1 +121900 -0.000000 30.416997 1 1 +122000 -0.000000 30.416997 1 1 +122100 -0.000000 30.416997 1 1 +122200 -0.000000 30.416997 1 1 +122300 -0.000000 30.416997 1 1 +122400 -0.000000 30.416997 1 1 +122500 -0.000000 30.416997 1 1 +122600 -0.000000 30.416997 1 1 +122700 -0.000000 30.416997 1 1 +122800 -0.000000 30.416997 1 1 +122900 -0.000000 30.416997 1 1 +123000 -0.000000 30.416997 1 1 +123100 -0.000000 30.416997 1 1 +123200 -0.000000 30.416997 1 1 +123300 -0.000000 30.416997 1 1 +123400 -0.000000 30.416997 1 1 +123500 -0.000000 30.416997 1 1 +123600 -0.000000 30.416997 1 1 +123700 -0.000000 30.416997 1 1 +123800 -0.000000 30.416997 1 1 +123900 -0.000000 30.416997 1 1 +124000 -0.000000 30.416997 1 1 +124100 -0.000000 30.416997 1 1 +124200 -0.000000 30.416997 1 1 +124300 -0.000000 30.416997 1 1 +124400 -0.000000 30.416997 1 1 +124500 -0.000000 30.416997 1 1 +124600 -0.000000 30.416997 1 1 +124700 -0.000000 30.416997 1 1 +124800 -0.000000 30.416997 1 1 +124900 -0.000000 30.416997 1 1 +125000 -0.000000 30.416997 1 1 +125100 -0.000000 30.416997 1 1 +125200 -0.000000 30.416997 1 1 +125300 -0.000000 30.416997 1 1 +125400 -0.000000 30.416997 1 1 +125500 -0.000000 30.416997 1 1 +125600 -0.000000 30.416997 1 1 +125700 -0.000000 30.416997 1 1 +125800 -0.000000 30.416997 1 1 +125900 -0.000000 30.416997 1 1 +126000 -0.000000 30.416997 1 1 +126100 -0.000000 30.416997 1 1 +126200 -0.000000 30.416997 1 1 +126300 -0.000000 30.416997 1 1 +126400 -0.000000 30.416997 1 1 +126500 -0.000000 30.416997 1 1 +126600 -0.000000 30.416997 1 1 +126700 -0.000000 30.416997 1 1 +126800 -0.000000 30.416997 1 1 +126900 -0.000000 30.416997 1 1 +127000 -0.000000 30.416997 1 1 +127100 -0.000000 30.416997 1 1 +127200 -0.000000 30.416997 1 1 +127300 -0.000000 30.416997 1 1 +127400 -0.000000 30.416997 1 1 +127500 -0.000000 30.416997 1 1 +127600 -0.000000 30.416997 1 1 +127700 -0.000000 30.416997 1 1 +127800 -0.000000 30.416997 1 1 +127900 -0.000000 30.416997 1 1 +128000 -0.000000 30.416997 1 1 +128100 -0.000000 30.416997 1 1 +128200 -0.000000 30.416997 1 1 +128300 -0.000000 30.416997 1 1 +128400 -0.000000 30.416997 1 1 +128500 -0.000000 30.416997 1 1 +128600 -0.000000 30.416997 1 1 +128700 -0.000000 30.416997 1 1 +128800 -0.000000 30.416997 1 1 +128900 -0.000000 30.416997 1 1 +129000 -0.000000 30.416997 1 1 +129100 -0.000000 30.416997 1 1 +129200 -0.000000 30.416997 1 1 +129300 -0.000000 30.416997 1 1 +129400 -0.000000 30.416997 1 1 +129500 -0.000000 30.416997 1 1 +129600 -0.000000 30.416997 1 1 +129700 -0.000000 30.416997 1 1 +129800 -0.000000 30.416997 1 1 +129900 -0.000000 30.416997 1 1 +130000 -0.000000 30.416997 1 1 +130100 -0.000000 30.416997 1 1 +130200 -0.000000 30.416997 1 1 +130300 -0.000000 30.416997 1 1 +130400 -0.000000 30.416997 1 1 +130500 -0.000000 30.416997 1 1 +130600 -0.000000 30.416997 1 1 +130700 -0.000000 30.416997 1 1 +130800 -0.000000 30.416997 1 1 +130900 -0.000000 30.416997 1 1 +131000 -0.000000 30.416997 1 1 +131100 -0.000000 30.416997 1 1 +131200 -0.000000 30.416997 1 1 +131300 -0.000000 30.416997 1 1 +131400 -0.000000 30.416997 1 1 +131500 -0.000000 30.416997 1 1 +131600 -0.000000 30.416997 1 1 +131700 -0.000000 30.416997 1 1 +131800 -0.000000 30.416997 1 1 +131900 -0.000000 30.416997 1 1 +132000 -0.000000 30.416997 1 1 +132100 -0.000000 30.416997 1 1 +132200 -0.000000 30.416997 1 1 +132300 -0.000000 30.416997 1 1 +132400 -0.000000 30.416997 1 1 +132500 -0.000000 30.416997 1 1 +132600 -0.000000 30.416997 1 1 +132700 -0.000000 30.416997 1 1 +132800 -0.000000 30.416997 1 1 +132900 -0.000000 30.416997 1 1 +133000 -0.000000 30.416997 1 1 +133100 -0.000000 30.416997 1 1 +133200 -0.000000 30.416997 1 1 +133300 -0.000000 30.416997 1 1 +133400 -0.000000 30.416997 1 1 +133500 -0.000000 30.416997 1 1 +133600 -0.000000 30.416997 1 1 +133700 -0.000000 30.416997 1 1 +133800 -0.000000 30.416997 1 1 +133900 -0.000000 30.416997 1 1 +134000 -0.000000 30.416997 1 1 +134100 -0.000000 30.416997 1 1 +134200 -0.000000 30.416997 1 1 +134300 -0.000000 30.416997 1 1 +134400 -0.000000 30.416997 1 1 +134500 -0.000000 30.416997 1 1 +134600 -0.000000 30.416997 1 1 +134700 -0.000000 30.416997 1 1 +134800 -0.000000 30.416997 1 1 +134900 -0.000000 30.416997 1 1 +135000 -0.000000 30.416997 1 1 +135100 -0.000000 30.416997 1 1 +135200 -0.000000 30.416997 1 1 +135300 -0.000000 30.416997 1 1 +135400 -0.000000 30.416997 1 1 +135500 -0.000000 30.416997 1 1 +135600 -0.000000 30.416997 1 1 +135700 -0.000000 30.416997 1 1 +135800 -0.000000 30.416997 1 1 +135900 -0.000000 30.416997 1 1 +136000 -0.000000 30.416997 1 1 +136100 -0.000000 30.416997 1 1 +136200 -0.000000 30.416997 1 1 +136300 -0.000000 30.416997 1 1 +136400 -0.000000 30.416997 1 1 +136500 -0.000000 30.416997 1 1 +136600 -0.000000 30.416997 1 1 +136700 -0.000000 30.416997 1 1 +136800 -0.000000 30.416997 1 1 +136900 -0.000000 30.416997 1 1 +137000 -0.000000 30.416997 1 1 +137100 -0.000000 30.416997 1 1 +137200 -0.000000 30.416997 1 1 +137300 -0.000000 30.416997 1 1 +137400 -0.000000 30.416997 1 1 +137500 -0.000000 30.416997 1 1 +137600 -0.000000 30.416997 1 1 +137700 -0.000000 30.416997 1 1 +137800 -0.000000 30.416997 1 1 +137900 -0.000000 30.416997 1 1 +138000 -0.000000 30.416997 1 1 +138100 -0.000000 30.416997 1 1 +138200 -0.000000 30.416997 1 1 +138300 -0.000000 30.416997 1 1 +138400 -0.000000 30.416997 1 1 +138500 -0.000000 30.416997 1 1 +138600 -0.000000 30.416997 1 1 +138700 -0.000000 30.416997 1 1 +138800 -0.000000 30.416997 1 1 +138900 -0.000000 30.416997 1 1 +139000 -0.000000 30.416997 1 1 +139100 -0.000000 30.416997 1 1 +139200 -0.000000 30.416997 1 1 +139300 -0.000000 30.416997 1 1 +139400 -0.000000 30.416997 1 1 +139500 -0.000000 30.416997 1 1 +139600 -0.000000 30.416997 1 1 +139700 -0.000000 30.416997 1 1 +139800 -0.000000 30.416997 1 1 +139900 -0.000000 30.416997 1 1 +140000 -0.010986 30.416997 1 1 +140100 -0.172348 30.416973 1 1 +140200 -0.423261 30.414704 1 1 +140300 -0.707118 30.403211 1 1 +140400 -1.003095 30.375630 1 1 +140500 -1.303531 30.327224 1 1 +140600 -1.605607 30.255116 1 1 +140700 -1.934869 30.157664 1 1 +140800 -2.332624 30.033815 1 1 +140900 -2.757827 29.881090 1 1 +141000 -3.193127 29.695816 1 1 +141100 -3.632141 29.475100 1 1 +141200 -4.072523 29.217082 1 1 +141300 -4.513407 28.920674 1 1 +141400 -5.050206 28.585263 1 1 +141500 -5.726562 28.209770 1 1 +141600 -6.454259 27.788331 1 1 +141700 -7.200843 27.313115 1 1 +141800 -7.954375 26.778213 1 1 +141900 -8.710463 26.179896 1 1 +142000 -9.440027 25.515994 1 1 +142100 -9.793997 24.785359 1 1 +142200 -9.924216 23.992884 1 1 +142300 -9.972121 23.155673 1 1 +142400 -9.989744 22.290700 1 1 +142500 -9.996227 21.409709 1 1 +142600 -9.998612 20.519847 1 1 +142700 -9.999489 19.625190 1 1 +142800 -9.999812 19.000000 1 1 +142900 -9.999931 18.101454 1 1 +143000 -9.999975 17.202207 1 1 +143100 -9.999991 16.302596 1 1 +143200 -9.999997 15.402797 1 1 +143300 -9.999999 14.502900 1 1 +143400 -10.000000 13.602954 1 1 +143500 -10.000000 12.702981 1 1 +143600 -10.000000 11.802995 1 1 +143700 -10.000000 10.903002 1 1 +143800 -10.000000 10.003006 1 1 +143900 -10.000000 9.103008 1 1 +144000 -10.000000 8.203009 1 1 +144100 -10.000000 7.303009 1 1 +144200 -10.000000 6.403010 1 1 +144300 -10.000000 5.503010 1 1 +144400 -10.000000 4.603010 1 1 +144500 -10.000000 3.703010 1 1 +144600 -10.000000 2.803010 1 1 +144700 -10.000000 1.903010 1 1 +144800 -9.675011 1.003010 1 1 +144900 -9.076575 0.106387 1 1 +145000 -8.377543 -0.771012 1 1 +145100 -7.465038 -1.611225 1 1 +145200 -6.205564 -2.400097 1 1 +145300 -4.812641 -3.118072 1 1 +145400 -3.419980 -3.743018 1 1 +145500 -2.369789 -4.258826 1 1 +145600 -1.504566 -4.661777 1 1 +145700 -0.707389 -4.962858 1 1 +145800 -0.260234 -5.174498 1 1 +145900 -0.095735 -5.308962 1 1 +146000 -0.035219 -5.387578 1 1 +146100 -0.012956 -5.431465 1 1 +146200 -0.004766 -5.455294 1 1 +146300 -0.001753 -5.468005 1 1 +146400 -0.000645 -5.474707 1 1 +146500 -0.000237 -5.478212 1 1 +146600 -0.000087 -5.480035 1 1 +146700 -0.000032 -5.480980 1 1 +146800 -0.000012 -5.481468 1 1 +146900 -0.000004 -5.481720 1 1 +147000 -0.000002 -5.481850 1 1 +147100 -0.000001 -5.481917 1 1 +147200 -0.000000 -5.481951 1 1 +147300 -0.000000 -5.481969 1 1 +147400 -0.000000 -5.481978 1 1 +147500 -0.000000 -5.481983 1 1 +147600 -0.000000 -5.481985 1 1 +147700 -0.000000 -5.481986 1 1 +147800 -0.000000 -5.481987 1 1 +147900 -0.000000 -5.481987 1 1 +148000 -0.000000 -5.481987 1 1 +148100 -0.000000 -5.481987 1 1 +148200 -0.000000 -5.481988 1 1 +148300 -0.000000 -5.481988 1 1 +148400 -0.000000 -5.481988 1 1 +148500 -0.000000 -5.481988 1 1 +148600 -0.000000 -5.481988 1 1 +148700 -0.000000 -5.481988 1 1 +148800 -0.000000 -5.481988 1 1 +148900 -0.000000 -5.481988 1 1 +149000 -0.000000 -5.481988 1 1 +149100 -0.000000 -5.481988 1 1 +149200 -0.000000 -5.481988 1 1 +149300 -0.000000 -5.481988 1 1 +149400 -0.000000 -5.481988 1 1 +149500 -0.000000 -5.481988 1 1 +149600 -0.000000 -5.481988 1 1 +149700 -0.000000 -5.481988 1 1 +149800 -0.000000 -5.481988 1 1 +149900 -0.000000 -5.481988 1 1 +150000 -0.000000 -5.481988 1 1 +150100 -0.000000 -5.481988 1 1 +150200 -0.000000 -5.481988 1 1 +150300 -0.000000 -5.481988 1 1 +150400 -0.000000 -5.481988 1 1 +150500 -0.000000 -5.481988 1 1 +150600 -0.000000 -5.481988 1 1 +150700 -0.000000 -5.481988 1 1 +150800 -0.000000 -5.481988 1 1 +150900 -0.000000 -5.481988 1 1 +151000 -0.000000 -5.481988 1 1 +151100 -0.000000 -5.481988 1 1 +151200 -0.000000 -5.481988 1 1 +151300 -0.000000 -5.481988 1 1 +151400 -0.000000 -5.481988 1 1 +151500 -0.000000 -5.481988 1 1 +151600 -0.000000 -5.481988 1 1 +151700 -0.000000 -5.481988 1 1 +151800 -0.000000 -5.481988 1 1 +151900 -0.000000 -5.481988 1 1 +152000 -0.000000 -5.481988 1 1 +152100 -0.000000 -5.481988 1 1 +152200 -0.000000 -5.481988 1 1 +152300 -0.000000 -5.481988 1 1 +152400 -0.000000 -5.481988 1 1 +152500 -0.000000 -5.481988 1 1 +152600 -0.000000 -5.481988 1 1 +152700 -0.000000 -5.481988 1 1 +152800 -0.000000 -5.481988 1 1 +152900 -0.000000 -5.481988 1 1 +153000 -0.000000 -5.481988 1 1 +153100 -0.000000 -5.481988 1 1 +153200 -0.000000 -5.481988 1 1 +153300 -0.000000 -5.481988 1 1 +153400 -0.000000 -5.481988 1 1 +153500 -0.000000 -5.481988 1 1 +153600 -0.000000 -5.481988 1 1 +153700 -0.000000 -5.481988 1 1 +153800 -0.000000 -5.481988 1 1 +153900 -0.000000 -5.481988 1 1 +154000 -0.000000 -5.481988 1 1 +154100 -0.000000 -5.481988 1 1 +154200 -0.000000 -5.481988 1 1 +154300 -0.000000 -5.481988 1 1 +154400 -0.000000 -5.481988 1 1 +154500 -0.000000 -5.481988 1 1 +154600 -0.000000 -5.481988 1 1 +154700 -0.000000 -5.481988 1 1 +154800 -0.000000 -5.481988 1 1 +154900 -0.000000 -5.481988 1 1 +155000 -0.000000 -5.481988 1 1 +155100 -0.000000 -5.481988 1 1 +155200 -0.000000 -5.481988 1 1 +155300 -0.000000 -5.481988 1 1 +155400 -0.000000 -5.481988 1 1 +155500 -0.000000 -5.481988 1 1 +155600 -0.000000 -5.481988 1 1 +155700 -0.000000 -5.481988 1 1 +155800 -0.000000 -5.481988 1 1 +155900 -0.000000 -5.481988 1 1 +156000 -0.000000 -5.481988 1 1 +156100 -0.000000 -5.481988 1 1 +156200 -0.000000 -5.481988 1 1 +156300 -0.000000 -5.481988 1 1 +156400 -0.000000 -5.481988 1 1 +156500 -0.000000 -5.481988 1 1 +156600 -0.000000 -5.481988 1 1 +156700 -0.000000 -5.481988 1 1 +156800 -0.000000 -5.481988 1 1 +156900 -0.000000 -5.481988 1 1 +157000 -0.000000 -5.481988 1 1 +157100 -0.000000 -5.481988 1 1 +157200 -0.000000 -5.481988 1 1 +157300 -0.000000 -5.481988 1 1 +157400 -0.000000 -5.481988 1 1 +157500 -0.000000 -5.481988 1 1 +157600 -0.000000 -5.481988 1 1 +157700 -0.000000 -5.481988 1 1 +157800 -0.000000 -5.481988 1 1 +157900 -0.000000 -5.481988 1 1 +158000 -0.000000 -5.481988 1 1 +158100 -0.000000 -5.481988 1 1 +158200 -0.000000 -5.481988 1 1 +158300 -0.000000 -5.481988 1 1 +158400 -0.000000 -5.481988 1 1 +158500 -0.000000 -5.481988 1 1 +158600 -0.000000 -5.481988 1 1 +158700 -0.000000 -5.481988 1 1 +158800 -0.000000 -5.481988 1 1 +158900 -0.000000 -5.481988 1 1 +159000 -0.000000 -5.481988 1 1 +159100 -0.000000 -5.481988 1 1 +159200 -0.000000 -5.481988 1 1 +159300 -0.000000 -5.481988 1 1 +159400 -0.000000 -5.481988 1 1 +159500 -0.000000 -5.481988 1 1 +159600 -0.000000 -5.481988 1 1 +159700 -0.000000 -5.481988 1 1 +159800 -0.000000 -5.481988 1 1 +159900 -0.000000 -5.481988 1 1 +160000 0.072508 -5.481988 1 1 +160100 0.279522 -5.481825 1 1 +160200 0.355679 -5.475771 1 1 +160300 0.383695 -5.459580 1 1 +160400 0.394002 -5.435383 1 1 +160500 0.397793 -5.406043 1 1 +160600 0.399188 -5.373683 1 1 +160700 0.399701 -5.339633 1 1 +160800 0.399890 -5.304664 1 1 +160900 0.399960 -5.269204 1 1 +161000 0.399985 -5.233486 1 1 +161100 0.399995 -5.197632 1 1 +161200 0.399998 -5.161707 1 1 +161300 0.399999 -5.125746 1 1 +161400 0.400000 -5.089766 1 1 +161500 0.400000 -5.053777 1 1 +161600 0.400000 -5.017782 1 1 +161700 0.400000 -4.981785 1 1 +161800 0.400000 -4.945786 1 1 +161900 0.400000 -4.909787 1 1 +162000 0.400000 -4.873787 1 1 +162100 0.400000 -4.837787 1 1 +162200 0.400000 -4.801787 1 1 +162300 0.400000 -4.765787 1 1 +162400 0.400000 -4.729787 1 1 +162500 0.400000 -4.693787 1 1 +162600 0.400000 -4.657787 1 1 +162700 0.400000 -4.621787 1 1 +162800 0.400000 -4.585787 1 1 +162900 0.400000 -4.549787 1 1 +163000 0.400000 -4.513787 1 1 +163100 0.400000 -4.477787 1 1 +163200 0.400000 -4.441787 1 1 +163300 0.400000 -4.405787 1 1 +163400 0.400000 -4.369787 1 1 +163500 0.400000 -4.333787 1 1 +163600 0.400000 -4.297787 1 1 +163700 0.400000 -4.261787 1 1 +163800 0.400000 -4.225787 1 1 +163900 0.400000 -4.189787 1 1 +164000 0.400000 -4.153787 1 1 +164100 0.400000 -4.117787 1 1 +164200 0.400000 -4.081787 1 1 +164300 0.400000 -4.045787 1 1 +164400 0.400000 -4.009787 1 1 +164500 0.400000 -3.973787 1 1 +164600 0.400000 -3.937787 1 1 +164700 0.400000 -3.901787 1 1 +164800 0.400000 -3.865787 1 1 +164900 0.400000 -3.829787 1 1 +165000 0.400000 -3.793787 1 1 +165100 0.400000 -3.757787 1 1 +165200 0.400000 -3.721787 1 1 +165300 0.400000 -3.685787 1 1 +165400 0.400000 -3.649787 1 1 +165500 0.400000 -3.613787 1 1 +165600 0.400000 -3.577787 1 1 +165700 0.400000 -3.541787 1 1 +165800 0.400000 -3.505787 1 1 +165900 0.400000 -3.469787 1 1 +166000 0.400000 -3.433787 1 1 +166100 0.400000 -3.397787 1 1 +166200 0.400000 -3.361787 1 1 +166300 0.400000 -3.325787 1 1 +166400 0.400000 -3.289787 1 1 +166500 0.400000 -3.253787 1 1 +166600 0.400000 -3.217787 1 1 +166700 0.400000 -3.181787 1 1 +166800 0.400000 -3.145787 1 1 +166900 0.400000 -3.109787 1 1 +167000 0.400000 -3.073787 1 1 +167100 0.400000 -3.037787 1 1 +167200 0.400000 -3.001787 1 1 +167300 0.400000 -2.965787 1 1 +167400 0.400000 -2.929787 1 1 +167500 0.400000 -2.893787 1 1 +167600 0.400000 -2.857787 1 1 +167700 0.400000 -2.821787 1 1 +167800 0.400000 -2.785787 1 1 +167900 0.400000 -2.749787 1 1 +168000 0.400000 -2.713787 1 1 +168100 0.400000 -2.677787 1 1 +168200 0.400000 -2.641787 1 1 +168300 0.400000 -2.605787 1 1 +168400 0.400000 -2.569787 1 1 +168500 0.400000 -2.533787 1 1 +168600 0.400000 -2.497787 1 1 +168700 0.400000 -2.461787 1 1 +168800 0.400000 -2.425787 1 1 +168900 0.400000 -2.389787 1 1 +169000 0.400000 -2.353787 1 1 +169100 0.400000 -2.317787 1 1 +169200 0.400000 -2.281787 1 1 +169300 0.400000 -2.245787 1 1 +169400 0.400000 -2.209787 1 1 +169500 0.400000 -2.173787 1 1 +169600 0.400000 -2.137787 1 1 +169700 0.400000 -2.101787 1 1 +169800 0.400000 -2.065787 1 1 +169900 0.400000 -2.029787 1 1 +170000 0.400000 -1.993787 1 1 +170100 0.400000 -1.957787 1 1 +170200 0.400000 -1.921787 1 1 +170300 0.400000 -1.885787 1 1 +170400 0.400000 -1.849787 1 1 +170500 0.400000 -1.813787 1 1 +170600 0.400000 -1.777787 1 1 +170700 0.400000 -1.741787 1 1 +170800 0.400000 -1.705787 1 1 +170900 0.400000 -1.669787 1 1 +171000 0.400000 -1.633787 1 1 +171100 0.400000 -1.597787 1 1 +171200 0.400000 -1.561787 1 1 +171300 0.400000 -1.525787 1 1 +171400 0.400000 -1.489787 1 1 +171500 0.400000 -1.453787 1 1 +171600 0.400000 -1.417787 1 1 +171700 0.400000 -1.381787 1 1 +171800 0.400000 -1.345787 1 1 +171900 0.400000 -1.309787 1 1 +172000 0.400000 -1.273787 1 1 +172100 0.400000 -1.237787 1 1 +172200 0.400000 -1.201787 1 1 +172300 0.400000 -1.165787 1 1 +172400 0.400000 -1.129787 1 1 +172500 0.400000 -1.093787 1 1 +172600 0.400000 -1.057787 1 1 +172700 0.400000 -1.021787 1 1 +172800 0.400000 -0.985787 1 1 +172900 0.400000 -0.949787 1 1 +173000 0.400000 -0.913787 1 1 +173100 0.400000 -0.877787 1 1 +173200 0.400000 -0.841787 1 1 +173300 0.400000 -0.805787 1 1 +173400 0.400000 -0.769787 1 1 +173500 0.400000 -0.733787 1 1 +173600 0.400000 -0.697787 1 1 +173700 0.400000 -0.661787 1 1 +173800 0.400000 -0.625787 1 1 +173900 0.400000 -0.589787 1 1 +174000 0.400000 -0.553787 1 1 +174100 0.400000 -0.517787 1 1 +174200 0.000000 -0.496187 0 0 +174300 0.000000 -0.496187 0 0 +174400 0.000000 -0.496187 0 0 +174500 0.000000 -0.496187 0 0 +174600 0.000000 -0.496187 0 0 +174700 0.000000 -0.496187 0 0 +174800 0.000000 -0.496187 0 0 +174900 0.000000 -0.496187 0 0 +175000 0.000000 -0.496187 0 0 +175100 0.000000 -0.496187 0 0 +175200 0.000000 -0.496187 0 0 +175300 0.000000 -0.496187 0 0 +175400 0.000000 -0.496187 0 0 +175500 0.000000 -0.496187 0 0 +175600 0.000000 -0.496187 0 0 +175700 0.000000 -0.496187 0 0 +175800 0.000000 -0.496187 0 0 +175900 0.000000 -0.496187 0 0 +176000 0.000000 -0.496187 0 0 +176100 0.000000 -0.496187 0 0 +176200 0.000000 -0.496187 0 0 +176300 0.000000 -0.496187 0 0 +176400 0.000000 -0.496187 0 0 +176500 0.000000 -0.496187 0 0 +176600 0.000000 -0.496187 0 0 +176700 0.000000 -0.496187 0 0 +176800 0.000000 -0.496187 0 0 +176900 0.000000 -0.496187 0 0 +177000 0.000000 -0.496187 0 0 +177100 0.000000 -0.496187 0 0 +177200 0.000000 -0.496187 0 0 +177300 0.000000 -0.496187 0 0 +177400 0.000000 -0.496187 0 0 +177500 0.000000 -0.496187 0 0 +177600 0.000000 -0.496187 0 0 +177700 0.000000 -0.496187 0 0 +177800 0.000000 -0.496187 0 0 +177900 0.000000 -0.496187 0 0 +178000 0.000000 -0.496187 0 0 +178100 0.000000 -0.496187 0 0 +178200 0.000000 -0.496187 0 0 +178300 0.000000 -0.496187 0 0 +178400 0.000000 -0.496187 0 0 +178500 0.000000 -0.496187 0 0 +178600 0.000000 -0.496187 0 0 +178700 0.000000 -0.496187 0 0 +178800 0.000000 -0.496187 0 0 +178900 0.000000 -0.496187 0 0 +179000 0.000000 -0.496187 0 0 +179100 0.000000 -0.496187 0 0 +179200 0.000000 -0.496187 0 0 +179300 0.000000 -0.496187 0 0 +179400 0.000000 -0.496187 0 0 +179500 0.000000 -0.496187 0 0 +179600 0.000000 -0.496187 0 0 +179700 0.000000 -0.496187 0 0 +179800 0.000000 -0.496187 0 0 +179900 0.000000 -0.496187 0 0 diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/log1.csv frama-c-20150201+sodium+dfsg/tests/ICPC/log1.csv --- frama-c-20140301+neon+dfsg/tests/ICPC/log1.csv 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/log1.csv 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,2001 @@ +time(ms) engineVoltage legAngle legAngleValid isActive +0 0.000000 0.000000 0 1 +100 -0.254162 23.333333 0 1 +200 -0.773920 23.330335 0 1 +300 -1.430039 23.309146 0 1 +400 -2.156168 23.250274 0 1 +500 -2.918241 23.137616 0 1 +600 -3.698769 22.959774 0 1 +700 -4.488771 22.709287 0 1 +800 -5.283639 22.381502 0 1 +900 -6.081003 21.973604 0 1 +1000 -6.879650 21.483931 0 1 +1100 -7.678956 20.911519 0 1 +1200 -8.478599 20.255815 0 1 +1300 -9.024254 19.516504 0 1 +1400 -9.304402 18.696411 0 1 +1500 -9.448235 17.810629 0 1 +1600 -9.522081 16.878595 0 1 +1700 -9.559995 15.916383 0 1 +1800 -9.579461 14.935376 0 1 +1900 -9.589455 13.943023 0 1 +2000 -9.594586 12.943975 0 1 +2100 -9.597220 11.941042 0 1 +2200 -9.598573 10.935886 0 1 +2300 -9.599267 9.929471 0 1 +2400 -9.599624 8.922348 0 1 +2500 -9.599807 7.914831 0 1 +2600 -9.599901 6.907096 0 1 +2700 -9.599949 5.899241 0 1 +2800 -9.599974 4.891319 0 1 +2900 -9.599987 3.883362 0 1 +3000 -9.599993 2.875385 0 1 +3100 -9.599996 1.867398 0 1 +3200 -9.599998 0.859404 0 1 +3300 -9.599999 -0.148592 0 1 +3400 -9.600000 -1.156590 0 1 +3500 -9.600000 -2.164589 0 1 +3600 -9.600000 -3.172589 0 1 +3700 -9.600000 -4.180588 0 1 +3800 -9.600000 -5.188588 0 1 +3900 -7.165655 -5.201600 1 1 +4000 -3.453034 -6.196837 1 1 +4100 -1.602068 -7.021707 1 1 +4200 -0.489556 -7.597605 1 1 +4300 0.243821 -7.960613 1 1 +4400 0.782543 -8.162449 1 1 +4500 1.221327 -8.246618 1 1 +4600 1.608800 -8.244161 1 1 +4700 1.969930 -8.175484 1 1 +4800 2.317535 -8.053357 1 1 +4900 2.658195 -7.885514 1 1 +5000 2.995290 -7.676531 1 1 +5100 3.330555 -7.429069 1 1 +5200 3.676843 -7.144652 1 1 +5300 4.090254 -6.824093 1 1 +5400 4.545797 -6.466332 1 1 +5500 5.022973 -6.067797 1 1 +5600 2.968146 -5.624770 1 1 +5700 1.913164 -5.179845 1 1 +5800 1.371517 -5.000000 1 1 +5900 1.093427 -4.721314 1 1 +6000 0.950650 -4.511804 1 1 +6100 0.877346 -4.350245 1 1 +6200 0.839711 -4.219689 1 1 +6300 0.820388 -4.108328 1 1 +6400 0.810468 -4.008504 1 1 +6500 0.805374 -3.915469 1 1 +6600 0.802759 -3.826362 1 1 +6700 0.801417 -3.739499 1 1 +6800 0.800727 -3.653906 1 1 +6900 0.800373 -3.569025 1 1 +7000 0.800192 -3.484540 1 1 +7100 0.800098 -3.400275 1 1 +7200 0.800051 -3.316130 1 1 +7300 0.800026 -3.232051 1 1 +7400 0.800013 -3.148008 1 1 +7500 0.800007 -3.063985 1 1 +7600 0.800004 -2.979972 1 1 +7700 0.800002 -2.895966 1 1 +7800 0.800001 -2.811962 1 1 +7900 0.800000 -2.727960 1 1 +8000 0.800000 -2.643959 1 1 +8100 0.800000 -2.559959 1 1 +8200 0.800000 -2.475958 1 1 +8300 0.800000 -2.391958 1 1 +8400 0.800000 -2.307958 1 1 +8500 0.800000 -2.223958 1 1 +8600 0.800000 -2.139958 1 1 +8700 0.800000 -2.055958 1 1 +8800 0.800000 -1.971958 1 1 +8900 0.800000 -1.887958 1 1 +9000 0.800000 -1.803958 1 1 +9100 0.800000 -1.719958 1 1 +9200 0.800000 -1.635958 1 1 +9300 0.800000 -1.551958 1 1 +9400 0.800000 -1.467958 1 1 +9500 0.800000 -1.383958 1 1 +9600 0.800000 -1.299958 1 1 +9700 0.800000 -1.215958 1 1 +9800 0.800000 -1.131958 1 1 +9900 0.800000 -1.047958 1 1 +10000 0.800000 -0.963958 1 1 +10100 0.800000 -0.879958 1 1 +10200 0.800000 -0.795958 1 1 +10300 0.800000 -0.711958 1 1 +10400 0.800000 -0.627958 1 1 +10500 0.800000 -0.543958 1 1 +10600 0.800000 -0.459958 1 1 +10700 0.612743 -0.375958 1 1 +10800 0.314593 -0.292940 1 1 +10900 0.161517 -0.223094 1 1 +11000 0.082926 -0.173168 1 1 +11100 0.042575 -0.140313 1 1 +11200 0.021859 -0.119736 1 1 +11300 0.011223 -0.107268 1 1 +11400 0.005762 -0.099890 1 1 +11500 0.002958 -0.095600 1 1 +11600 0.001519 -0.093139 1 1 +11700 0.000780 -0.091744 1 1 +11800 0.000400 -0.090960 1 1 +11900 0.000206 -0.090522 1 1 +12000 0.000106 -0.090280 1 1 +12100 0.000054 -0.090146 1 1 +12200 0.000028 -0.090072 1 1 +12300 0.000014 -0.090032 1 1 +12400 0.000007 -0.090010 1 1 +12500 0.000004 -0.089999 1 1 +12600 0.000002 -0.089992 1 1 +12700 0.000001 -0.089989 1 1 +12800 0.000001 -0.089987 1 1 +12900 0.000000 -0.089986 1 1 +13000 0.000000 -0.089985 1 1 +13100 0.000000 -0.089985 1 1 +13200 0.000000 -0.089985 1 1 +13300 0.000000 -0.089985 1 1 +13400 0.000000 -0.089985 1 1 +13500 0.000000 -0.089985 1 1 +13600 0.000000 -0.089985 1 1 +13700 0.000000 -0.089985 1 1 +13800 0.000000 -0.089985 1 1 +13900 0.000000 -0.089985 1 1 +14000 0.000000 -0.089985 1 1 +14100 0.000000 -0.089985 1 1 +14200 0.000000 -0.089985 1 1 +14300 0.000000 -0.089985 1 1 +14400 0.000000 -0.089985 1 1 +14500 0.000000 -0.089985 1 1 +14600 0.000000 -0.089985 1 1 +14700 0.000000 -0.089985 1 1 +14800 0.000000 -0.089985 1 1 +14900 0.000000 -0.089985 1 1 +15000 0.000000 -0.089985 1 1 +15100 0.000000 -0.089985 1 1 +15200 0.000000 -0.089985 1 1 +15300 0.000000 -0.089985 1 1 +15400 0.000000 -0.089985 1 1 +15500 0.000000 -0.089985 1 1 +15600 0.000000 -0.089985 1 1 +15700 0.000000 -0.089985 1 1 +15800 0.000000 -0.089985 1 1 +15900 0.000000 -0.089985 1 1 +16000 0.000000 -0.089985 1 1 +16100 0.000000 -0.089985 1 1 +16200 0.000000 -0.089985 1 1 +16300 0.000000 -0.089985 1 1 +16400 0.000000 -0.089985 1 1 +16500 0.000000 -0.089985 1 1 +16600 0.000000 -0.089985 1 1 +16700 0.000000 -0.089985 1 1 +16800 0.000000 -0.089985 1 1 +16900 0.000000 -0.089985 1 1 +17000 0.000000 -0.089985 1 1 +17100 0.000000 -0.089985 1 1 +17200 0.000000 -0.089985 1 1 +17300 0.000000 -0.089985 1 1 +17400 0.000000 -0.089985 1 1 +17500 0.000000 -0.089985 1 1 +17600 0.000000 -0.089985 1 1 +17700 0.000000 -0.089985 1 1 +17800 0.000000 -0.089985 1 1 +17900 0.000000 -0.089985 1 1 +18000 0.000000 -0.089985 1 1 +18100 0.000000 -0.089985 1 1 +18200 0.000000 -0.089985 1 1 +18300 0.000000 -0.089985 1 1 +18400 0.000000 -0.089985 1 1 +18500 0.000000 -0.089985 1 1 +18600 0.000000 -0.089985 1 1 +18700 0.000000 -0.089985 1 1 +18800 0.000000 -0.089985 1 1 +18900 0.000000 -0.089985 1 1 +19000 0.000000 -0.089985 1 1 +19100 0.000000 -0.089985 1 1 +19200 0.000000 -0.089985 1 1 +19300 0.000000 -0.089985 1 1 +19400 0.000000 -0.089985 1 1 +19500 0.000000 -0.089985 1 1 +19600 0.000000 -0.089985 1 1 +19700 0.000000 -0.089985 1 1 +19800 0.000000 -0.089985 1 1 +19900 0.000000 -0.089985 1 1 +20000 0.000000 -0.089985 1 1 +20100 0.000000 -0.089985 1 1 +20200 0.000000 -0.089985 1 1 +20300 0.000000 -0.089985 1 1 +20400 0.000000 -0.089985 1 1 +20500 0.000000 -0.089985 1 1 +20600 0.000000 -0.089985 1 1 +20700 0.000000 -0.089985 1 1 +20800 0.000000 -0.089985 1 1 +20900 0.000000 -0.089985 1 1 +21000 0.000000 -0.089985 1 1 +21100 0.000000 -0.089985 1 1 +21200 0.000000 -0.089985 1 1 +21300 0.000000 -0.089985 1 1 +21400 0.000000 -0.089985 1 1 +21500 0.000000 -0.089985 1 1 +21600 0.000000 -0.089985 1 1 +21700 0.000000 -0.089985 1 1 +21800 0.000000 -0.089985 1 1 +21900 0.000000 -0.089985 1 1 +22000 0.000000 -0.089985 1 1 +22100 0.000000 -0.089985 1 1 +22200 0.000000 -0.089985 1 1 +22300 0.000000 -0.089985 1 1 +22400 0.000000 -0.089985 1 1 +22500 0.000000 -0.089985 1 1 +22600 0.000000 -0.089985 1 1 +22700 0.000000 -0.089985 1 1 +22800 0.000000 -0.089985 1 1 +22900 0.000000 -0.089985 1 1 +23000 0.000000 -0.089985 1 1 +23100 0.000000 -0.089985 1 1 +23200 0.000000 -0.089985 1 1 +23300 0.000000 -0.089985 1 1 +23400 0.000000 -0.089985 1 1 +23500 0.000000 -0.089985 1 1 +23600 0.000000 -0.089985 1 1 +23700 0.000000 -0.089985 1 1 +23800 0.000000 -0.089985 1 1 +23900 0.000000 -0.089985 1 1 +24000 0.000000 -0.089985 1 1 +24100 0.000000 -0.089985 1 1 +24200 0.000000 -0.089985 1 1 +24300 0.000000 -0.089985 1 1 +24400 0.000000 -0.089985 1 1 +24500 0.000000 -0.089985 1 1 +24600 0.000000 -0.089985 1 1 +24700 0.000000 -0.089985 1 1 +24800 0.000000 -0.089985 1 1 +24900 0.000000 -0.089985 1 1 +25000 0.000000 -0.089985 1 1 +25100 0.000000 -0.089985 1 1 +25200 0.000000 -0.089985 1 1 +25300 0.000000 -0.089985 1 1 +25400 0.000000 -0.089985 1 1 +25500 0.000000 -0.089985 1 1 +25600 0.000000 -0.089985 1 1 +25700 0.000000 -0.089985 1 1 +25800 0.000000 -0.089985 1 1 +25900 0.000000 -0.089985 1 1 +26000 0.000000 -0.089985 1 1 +26100 0.000000 -0.089985 1 1 +26200 0.000000 -0.089985 1 1 +26300 0.000000 -0.089985 1 1 +26400 0.000000 -0.089985 1 1 +26500 0.000000 -0.089985 1 1 +26600 0.000000 -0.089985 1 1 +26700 0.000000 -0.089985 1 1 +26800 0.000000 -0.089985 1 1 +26900 0.000000 -0.089985 1 1 +27000 0.000000 -0.089985 1 1 +27100 0.000000 -0.089985 1 1 +27200 0.000000 -0.089985 1 1 +27300 0.000000 -0.089985 1 1 +27400 0.000000 -0.089985 1 1 +27500 0.000000 -0.089985 1 1 +27600 0.000000 -0.089985 1 1 +27700 0.000000 -0.089985 1 1 +27800 0.000000 -0.089985 1 1 +27900 0.000000 -0.089985 1 1 +28000 0.000000 -0.089985 1 1 +28100 0.000000 -0.089985 1 1 +28200 0.000000 -0.089985 1 1 +28300 0.000000 -0.089985 1 1 +28400 0.000000 -0.089985 1 1 +28500 0.000000 -0.089985 1 1 +28600 0.000000 -0.089985 1 1 +28700 0.000000 -0.089985 1 1 +28800 0.000000 -0.089985 1 1 +28900 0.000000 -0.089985 1 1 +29000 0.000000 -0.089985 1 1 +29100 0.000000 -0.089985 1 1 +29200 0.000000 -0.089985 1 1 +29300 0.000000 -0.089985 1 1 +29400 0.000000 -0.089985 1 1 +29500 0.000000 -0.089985 1 1 +29600 0.000000 -0.089985 1 1 +29700 0.000000 -0.089985 1 1 +29800 0.000000 -0.089985 1 1 +29900 0.000000 -0.089985 1 1 +30000 0.008322 -0.089985 1 1 +30100 0.142612 -0.089963 1 1 +30200 0.373754 -0.087843 1 1 +30300 0.654620 -0.076500 1 1 +30400 0.961016 -0.047961 1 1 +30500 1.280519 0.004091 1 1 +30600 1.606752 0.084041 1 1 +30700 1.936439 0.194727 1 1 +30800 2.267901 0.337905 1 1 +30900 2.600273 0.514633 1 1 +31000 2.933113 0.725533 1 1 +31100 3.266193 0.970965 1 1 +31200 3.603558 1.251134 1 1 +31300 4.003969 1.566168 1 1 +31400 4.452839 1.917171 1 1 +31500 4.926588 2.307740 1 1 +31600 5.413110 2.741883 1 1 +31700 5.906191 3.222769 1 1 +31800 6.402638 3.752597 1 1 +31900 6.900814 4.332789 1 1 +32000 7.387395 4.964225 1 1 +32100 7.685478 5.647402 1 1 +32200 7.838519 6.379517 1 1 +32300 7.917093 7.150063 1 1 +32400 7.957434 7.947184 1 1 +32500 7.978146 8.761462 1 1 +32600 7.988780 9.586353 1 1 +32700 7.994239 10.417618 1 1 +32800 7.997042 11.252632 1 1 +32900 7.998482 12.089815 1 1 +33000 7.999220 12.928236 1 1 +33100 7.999600 13.767357 1 1 +33200 7.999794 14.606871 1 1 +33300 7.999894 15.446604 1 1 +33400 7.999946 16.286457 1 1 +33500 7.999972 17.126378 1 1 +33600 7.999986 17.966334 1 1 +33700 7.999993 18.806311 1 1 +33800 7.823687 19.646298 1 1 +33900 7.343903 20.484716 1 1 +34000 6.708307 21.308755 1 1 +34100 5.992714 22.098857 1 1 +34200 5.236051 22.838013 1 1 +34300 4.458301 23.513913 1 1 +34400 3.669724 24.118401 1 1 +34500 2.875589 24.646348 1 1 +34600 2.078600 25.094634 1 1 +34700 1.280146 25.461411 1 1 +34800 0.267983 25.745601 1 1 +34900 -0.251679 25.941043 1 1 +35000 -0.518483 26.048267 1 1 +35100 -0.655464 26.086961 1 1 +35200 -0.725793 26.078543 1 1 +35300 -0.761901 26.039810 1 1 +35400 -0.780439 25.982369 1 1 +35500 -0.789957 25.913709 1 1 +35600 -0.794844 25.838459 1 1 +35700 -0.797353 25.759401 1 1 +35800 -0.798641 25.678168 1 1 +35900 -0.799302 25.595708 1 1 +36000 -0.799642 25.512559 1 1 +36100 -0.799816 25.429027 1 1 +36200 -0.469223 25.345283 1 1 +36300 -0.240907 25.265750 1 1 +36400 -0.123686 25.203935 1 1 +36500 -0.063502 25.161427 1 1 +36600 -0.032603 25.134072 1 1 +36700 -0.016739 25.117188 1 1 +36800 -0.008594 25.107061 1 1 +36900 -0.004412 25.101114 1 1 +37000 -0.002265 25.097676 1 1 +37100 -0.001163 25.095714 1 1 +37200 -0.000597 25.094605 1 1 +37300 -0.000307 25.093984 1 1 +37400 -0.000157 25.093638 1 1 +37500 -0.000081 25.093447 1 1 +37600 -0.000041 25.093341 1 1 +37700 -0.000021 25.093284 1 1 +37800 -0.000011 25.093252 1 1 +37900 -0.000006 25.093235 1 1 +38000 -0.000003 25.093226 1 1 +38100 -0.000001 25.093221 1 1 +38200 -0.000001 25.093218 1 1 +38300 -0.000000 25.093217 1 1 +38400 -0.000000 25.093216 1 1 +38500 -0.000000 25.093216 1 1 +38600 -0.000000 25.093215 1 1 +38700 -0.000000 25.093215 1 1 +38800 -0.000000 25.093215 1 1 +38900 -0.000000 25.093215 1 1 +39000 -0.000000 25.093215 1 1 +39100 -0.000000 25.093215 1 1 +39200 -0.000000 25.093215 1 1 +39300 -0.000000 25.093215 1 1 +39400 -0.000000 25.093215 1 1 +39500 -0.000000 25.093215 1 1 +39600 -0.000000 25.093215 1 1 +39700 -0.000000 25.093215 1 1 +39800 -0.000000 25.093215 1 1 +39900 -0.000000 25.093215 1 1 +40000 -0.000000 25.093215 1 1 +40100 -0.000000 25.093215 1 1 +40200 -0.000000 25.093215 1 1 +40300 -0.000000 25.093215 1 1 +40400 -0.000000 25.093215 1 1 +40500 -0.000000 25.093215 1 1 +40600 -0.000000 25.093215 1 1 +40700 -0.000000 25.093215 1 1 +40800 -0.000000 25.093215 1 1 +40900 -0.000000 25.093215 1 1 +41000 -0.000000 25.093215 1 1 +41100 -0.000000 25.093215 1 1 +41200 -0.000000 25.093215 1 1 +41300 -0.000000 25.093215 1 1 +41400 -0.000000 25.093215 1 1 +41500 -0.000000 25.093215 1 1 +41600 -0.000000 25.093215 1 1 +41700 -0.000000 25.093215 1 1 +41800 -0.000000 25.093215 1 1 +41900 -0.000000 25.093215 1 1 +42000 -0.000000 25.093215 1 1 +42100 -0.000000 25.093215 1 1 +42200 -0.000000 25.093215 1 1 +42300 -0.000000 25.093215 1 1 +42400 -0.000000 25.093215 1 1 +42500 -0.000000 25.093215 1 1 +42600 -0.000000 25.093215 1 1 +42700 -0.000000 25.093215 1 1 +42800 -0.000000 25.093215 1 1 +42900 -0.000000 25.093215 1 1 +43000 -0.000000 25.093215 1 1 +43100 -0.000000 25.093215 1 1 +43200 -0.000000 25.093215 1 1 +43300 -0.000000 25.093215 1 1 +43400 -0.000000 25.093215 1 1 +43500 -0.000000 25.093215 1 1 +43600 -0.000000 25.093215 1 1 +43700 -0.000000 25.093215 1 1 +43800 -0.000000 25.093215 1 1 +43900 -0.000000 25.093215 1 1 +44000 -0.000000 25.093215 1 1 +44100 -0.000000 25.093215 1 1 +44200 -0.000000 25.093215 1 1 +44300 -0.000000 25.093215 1 1 +44400 -0.000000 25.093215 1 1 +44500 -0.000000 25.093215 1 1 +44600 -0.000000 25.093215 1 1 +44700 -0.000000 25.093215 1 1 +44800 -0.000000 25.093215 1 1 +44900 -0.000000 25.093215 1 1 +45000 -0.000000 25.093215 1 1 +45100 -0.000000 25.093215 1 1 +45200 -0.000000 25.093215 1 1 +45300 -0.000000 25.093215 1 1 +45400 -0.000000 25.093215 1 1 +45500 -0.000000 25.093215 1 1 +45600 -0.000000 25.093215 1 1 +45700 -0.000000 25.093215 1 1 +45800 -0.000000 25.093215 1 1 +45900 -0.000000 25.093215 1 1 +46000 -0.000000 25.093215 1 1 +46100 -0.000000 25.093215 1 1 +46200 -0.000000 25.093215 1 1 +46300 -0.000000 25.093215 1 1 +46400 -0.000000 25.093215 1 1 +46500 -0.000000 25.093215 1 1 +46600 -0.000000 25.093215 1 1 +46700 -0.000000 25.093215 1 1 +46800 -0.000000 25.093215 1 1 +46900 -0.000000 25.093215 1 1 +47000 -0.000000 25.093215 1 1 +47100 -0.000000 25.093215 1 1 +47200 -0.000000 25.093215 1 1 +47300 -0.000000 25.093215 1 1 +47400 -0.000000 25.093215 1 1 +47500 -0.000000 25.093215 1 1 +47600 -0.000000 25.093215 1 1 +47700 -0.000000 25.093215 1 1 +47800 -0.000000 25.093215 1 1 +47900 -0.000000 25.093215 1 1 +48000 -0.000000 25.093215 1 1 +48100 -0.000000 25.093215 1 1 +48200 -0.000000 25.093215 1 1 +48300 -0.000000 25.093215 1 1 +48400 -0.000000 25.093215 1 1 +48500 -0.000000 25.093215 1 1 +48600 -0.000000 25.093215 1 1 +48700 -0.000000 25.093215 1 1 +48800 -0.000000 25.093215 1 1 +48900 -0.000000 25.093215 1 1 +49000 -0.000000 25.093215 1 1 +49100 -0.000000 25.093215 1 1 +49200 -0.000000 25.093215 1 1 +49300 -0.000000 25.093215 1 1 +49400 -0.000000 25.093215 1 1 +49500 -0.000000 25.093215 1 1 +49600 -0.000000 25.093215 1 1 +49700 -0.000000 25.093215 1 1 +49800 -0.000000 25.093215 1 1 +49900 -0.000000 25.093215 1 1 +50000 -0.099861 25.093215 1 1 +50100 -0.440537 25.092953 1 1 +50200 -0.615445 25.082500 1 1 +50300 -0.705247 25.052333 1 1 +50400 -0.751352 25.004224 1 1 +50500 -0.775023 24.942887 1 1 +50600 -0.787177 24.872699 1 1 +50700 -0.793416 24.796906 1 1 +50800 -0.796620 24.717694 1 1 +50900 -0.798265 24.636446 1 1 +51000 -0.799109 24.554010 1 1 +51100 -0.799543 24.470891 1 1 +51200 -0.799765 24.387383 1 1 +51300 -0.799879 24.303656 1 1 +51400 -0.799938 24.219807 1 1 +51500 -0.799968 24.135889 1 1 +51600 -0.799984 24.051935 1 1 +51700 -0.799992 23.967959 1 1 +51800 -0.799996 23.883973 1 1 +51900 -0.799998 23.799980 1 1 +52000 -0.799999 23.715984 1 1 +52100 -0.799999 23.631986 1 1 +52200 -0.800000 23.547987 1 1 +52300 -0.800000 23.463988 1 1 +52400 -0.800000 23.379988 1 1 +52500 -0.800000 23.295988 1 1 +52600 -0.800000 23.211988 1 1 +52700 -0.800000 23.127988 1 1 +52800 -0.800000 23.043988 1 1 +52900 -0.800000 22.959988 1 1 +53000 -0.800000 22.875988 1 1 +53100 -0.800000 22.791988 1 1 +53200 -0.800000 22.707988 1 1 +53300 -0.800000 22.623988 1 1 +53400 -0.800000 22.539988 1 1 +53500 -0.800000 22.455988 1 1 +53600 -0.800000 22.371988 1 1 +53700 -0.800000 22.287988 1 1 +53800 -0.800000 22.203988 1 1 +53900 -0.800000 22.119988 1 1 +54000 -0.800000 22.035988 1 1 +54100 -0.800000 21.951988 1 1 +54200 -0.800000 21.867988 1 1 +54300 -0.800000 21.783988 1 1 +54400 -0.800000 21.699988 1 1 +54500 -0.800000 21.615988 1 1 +54600 -0.800000 21.531988 1 1 +54700 -0.800000 21.447988 1 1 +54800 -0.800000 21.363988 1 1 +54900 -0.800000 21.279988 1 1 +55000 -0.800000 21.195988 1 1 +55100 -0.800000 21.111988 1 1 +55200 -0.800000 21.027988 1 1 +55300 -0.800000 20.943988 1 1 +55400 -0.800000 20.859988 1 1 +55500 -0.800000 20.775988 1 1 +55600 -0.800000 20.691988 1 1 +55700 -0.800000 20.607988 1 1 +55800 -0.800000 20.523988 1 1 +55900 -0.800000 20.439988 1 1 +56000 -0.800000 20.355988 1 1 +56100 -0.800000 20.271988 1 1 +56200 -0.800000 20.187988 1 1 +56300 -0.800000 20.103988 1 1 +56400 -0.800000 20.019988 1 1 +56500 -0.800000 19.935988 1 1 +56600 -0.800000 19.851988 1 1 +56700 -0.800000 19.767988 1 1 +56800 -0.800000 19.683988 1 1 +56900 -0.800000 19.599988 1 1 +57000 -0.800000 19.515988 1 1 +57100 -0.800000 19.431988 1 1 +57200 -0.800000 19.347988 1 1 +57300 -0.800000 19.263988 1 1 +57400 -0.800000 19.179988 1 1 +57500 -0.800000 19.095988 1 1 +57600 -0.800000 19.011988 1 1 +57700 -0.800000 18.927988 1 1 +57800 -0.800000 18.843988 1 1 +57900 -0.800000 18.759988 1 1 +58000 -0.800000 18.675988 1 1 +58100 -0.800000 18.591988 1 1 +58200 -0.800000 18.507988 1 1 +58300 -0.800000 18.423988 1 1 +58400 -0.800000 18.339988 1 1 +58500 -0.800000 18.255988 1 1 +58600 -0.800000 18.171988 1 1 +58700 -0.800000 18.087988 1 1 +58800 -0.800000 18.003988 1 1 +58900 -0.800000 17.919988 1 1 +59000 -0.800000 17.835988 1 1 +59100 -0.800000 17.751988 1 1 +59200 -0.800000 17.667988 1 1 +59300 -0.800000 17.583988 1 1 +59400 -0.800000 17.499988 1 1 +59500 -0.800000 17.415988 1 1 +59600 -0.800000 17.331988 1 1 +59700 -0.800000 17.247988 1 1 +59800 -0.800000 17.163988 1 1 +59900 -0.800000 17.079988 1 1 +60000 -0.800000 16.995988 1 1 +60100 -0.800000 16.911988 1 1 +60200 -0.800000 16.827988 1 1 +60300 -0.800000 16.743988 1 1 +60400 -0.800000 16.659988 1 1 +60500 -0.800000 16.575988 1 1 +60600 -0.800000 16.491988 1 1 +60700 -0.800000 16.407988 1 1 +60800 -0.800000 16.323988 1 1 +60900 -0.800000 16.239988 1 1 +61000 -0.800000 16.155988 1 1 +61100 -0.800000 16.071988 1 1 +61200 -0.800000 15.987988 1 1 +61300 -0.800000 15.903988 1 1 +61400 -0.800000 15.819988 1 1 +61500 -0.800000 15.735988 1 1 +61600 -0.800000 15.651988 1 1 +61700 -0.800000 15.567988 1 1 +61800 -0.800000 15.483988 1 1 +61900 -0.800000 15.399988 1 1 +62000 -0.800000 15.315988 1 1 +62100 -0.800000 15.231988 1 1 +62200 -0.800000 15.147988 1 1 +62300 -0.800000 15.063988 1 1 +62400 -0.800000 14.979988 1 1 +62500 -0.800000 14.895988 1 1 +62600 -0.800000 14.811988 1 1 +62700 -0.800000 14.727988 1 1 +62800 -0.800000 14.643988 1 1 +62900 -0.800000 14.559988 1 1 +63000 -0.800000 14.475988 1 1 +63100 -0.800000 14.391988 1 1 +63200 -0.800000 14.307988 1 1 +63300 -0.800000 14.223988 1 1 +63400 -0.800000 14.139988 1 1 +63500 -0.800000 14.055988 1 1 +63600 -0.800000 13.971988 1 1 +63700 -0.800000 13.887988 1 1 +63800 -0.800000 13.803988 1 1 +63900 -0.800000 13.719988 1 1 +64000 -0.800000 13.635988 1 1 +64100 -0.800000 13.551988 1 1 +64200 -0.800000 13.467988 1 1 +64300 -0.800000 13.383988 1 1 +64400 -0.800000 13.299988 1 1 +64500 -0.800000 13.215988 1 1 +64600 -0.800000 13.131988 1 1 +64700 -0.800000 13.047988 1 1 +64800 -0.800000 12.963988 1 1 +64900 -0.800000 12.879988 1 1 +65000 -0.800000 12.795988 1 1 +65100 -0.800000 12.711988 1 1 +65200 -0.800000 12.627988 1 1 +65300 -0.800000 12.543988 1 1 +65400 -0.800000 12.459988 1 1 +65500 -0.800000 12.375988 1 1 +65600 -0.800000 12.291988 1 1 +65700 -0.800000 12.207988 1 1 +65800 -0.800000 12.123988 1 1 +65900 -0.800000 12.039988 1 1 +66000 -0.800000 11.955988 1 1 +66100 -0.800000 11.871988 1 1 +66200 -0.800000 11.787988 1 1 +66300 -0.800000 11.703988 1 1 +66400 -0.800000 11.619988 1 1 +66500 -0.800000 11.535988 1 1 +66600 -0.800000 11.451988 1 1 +66700 -0.800000 11.367988 1 1 +66800 -0.800000 11.283988 1 1 +66900 -0.800000 11.199988 1 1 +67000 -0.800000 11.115988 1 1 +67100 -0.800000 11.031988 1 1 +67200 -0.800000 10.947988 1 1 +67300 -0.800000 10.863988 1 1 +67400 -0.800000 10.779988 1 1 +67500 -0.800000 10.695988 1 1 +67600 -0.800000 10.611988 1 1 +67700 -0.800000 10.527988 1 1 +67800 -0.800000 10.443988 1 1 +67900 -0.800000 10.359988 1 1 +68000 -0.800000 10.275988 1 1 +68100 -0.800000 10.191988 1 1 +68200 -0.800000 10.107988 1 1 +68300 -0.800000 10.023988 1 1 +68400 -0.800000 9.939988 1 1 +68500 -0.800000 9.855988 1 1 +68600 -0.800000 9.771988 1 1 +68700 -0.800000 9.687988 1 1 +68800 -0.800000 9.603988 1 1 +68900 -0.800000 9.519988 1 1 +69000 -0.800000 9.435988 1 1 +69100 -0.800000 9.351988 1 1 +69200 -0.800000 9.267988 1 1 +69300 -0.800000 9.183988 1 1 +69400 -0.800000 9.099988 1 1 +69500 -0.800000 9.015988 1 1 +69600 -0.800000 8.931988 1 1 +69700 -0.800000 8.847988 1 1 +69800 -0.800000 8.763988 1 1 +69900 -0.800000 8.679988 1 1 +70000 -0.800000 8.595988 1 1 +70100 -0.800000 8.511988 1 1 +70200 -0.800000 8.427988 1 1 +70300 -0.800000 8.343988 1 1 +70400 -0.800000 8.259988 1 1 +70500 -0.800000 8.175988 1 1 +70600 -0.800000 8.091988 1 1 +70700 -0.800000 8.007988 1 1 +70800 -0.800000 7.923988 1 1 +70900 -0.800000 7.839988 1 1 +71000 -0.800000 7.755988 1 1 +71100 -0.800000 7.671988 1 1 +71200 -0.800000 7.587988 1 1 +71300 -0.800000 7.503988 1 1 +71400 -0.800000 7.419988 1 1 +71500 -0.800000 7.335988 1 1 +71600 -0.800000 7.251988 1 1 +71700 -0.800000 7.167988 1 1 +71800 -0.800000 7.083988 1 1 +71900 -0.800000 6.999988 1 1 +72000 -0.800000 6.915988 1 1 +72100 -0.800000 6.831988 1 1 +72200 -0.800000 6.747988 1 1 +72300 -0.800000 6.663988 1 1 +72400 -0.800000 6.579988 1 1 +72500 -0.800000 6.495988 1 1 +72600 -0.800000 6.411988 1 1 +72700 -0.800000 6.327988 1 1 +72800 -0.800000 6.243988 1 1 +72900 -0.800000 6.159988 1 1 +73000 -0.800000 6.075988 1 1 +73100 -0.800000 5.991988 1 1 +73200 -0.800000 5.907988 1 1 +73300 -0.800000 5.823988 1 1 +73400 -0.800000 5.739988 1 1 +73500 -0.800000 5.655988 1 1 +73600 -0.800000 5.571988 1 1 +73700 -0.800000 5.487988 1 1 +73800 -0.800000 5.403988 1 1 +73900 -0.800000 5.319988 1 1 +74000 -0.800000 5.235988 1 1 +74100 -0.800000 5.151988 1 1 +74200 -0.800000 5.067988 1 1 +74300 -0.800000 4.983988 1 1 +74400 -0.800000 4.899988 1 1 +74500 -0.800000 4.815988 1 1 +74600 -0.800000 4.731988 1 1 +74700 -0.800000 4.647988 1 1 +74800 -0.800000 4.563988 1 1 +74900 -0.800000 4.479988 1 1 +75000 -0.800000 4.395988 1 1 +75100 -0.800000 4.311988 1 1 +75200 -0.800000 4.227988 1 1 +75300 -0.800000 4.143988 1 1 +75400 -0.800000 4.059988 1 1 +75500 -0.800000 3.975988 1 1 +75600 -0.800000 3.891988 1 1 +75700 -0.800000 3.807988 1 1 +75800 -0.800000 3.723988 1 1 +75900 -0.800000 3.639988 1 1 +76000 -0.800000 3.555988 1 1 +76100 -0.800000 3.471988 1 1 +76200 -0.800000 3.387988 1 1 +76300 -0.800000 3.303988 1 1 +76400 -0.800000 3.219988 1 1 +76500 -0.800000 3.135988 1 1 +76600 -0.800000 3.051988 1 1 +76700 -0.800000 2.967988 1 1 +76800 -0.800000 2.883988 1 1 +76900 -0.800000 2.799988 1 1 +77000 -0.800000 2.715988 1 1 +77100 -0.800000 2.631988 1 1 +77200 -0.800000 2.547988 1 1 +77300 -0.800000 2.463988 1 1 +77400 -0.800000 2.379988 1 1 +77500 -0.800000 2.295988 1 1 +77600 -0.800000 2.211988 1 1 +77700 -0.800000 2.127988 1 1 +77800 -0.800000 2.043988 1 1 +77900 -0.800000 1.959988 1 1 +78000 -0.800000 1.875988 1 1 +78100 -0.800000 1.791988 1 1 +78200 -0.800000 1.707988 1 1 +78300 -0.800000 1.623988 1 1 +78400 -0.800000 1.539988 1 1 +78500 -0.800000 1.455988 1 1 +78600 -0.800000 1.371988 1 1 +78700 -0.800000 1.287988 1 1 +78800 -0.800000 1.203988 1 1 +78900 -0.800000 1.119988 1 1 +79000 -0.800000 1.035988 1 1 +79100 -0.800000 0.951988 1 1 +79200 -0.800000 0.867988 1 1 +79300 -0.800000 0.783988 1 1 +79400 -0.800000 0.699988 1 1 +79500 -0.800000 0.615988 1 1 +79600 -0.800000 0.531988 1 1 +79700 -0.800000 0.447988 1 1 +79800 -0.800000 0.363988 1 1 +79900 -0.800000 0.279988 1 1 +80000 -0.800000 0.195988 1 1 +80100 -0.800000 0.111988 1 1 +80200 -0.800000 0.027988 1 1 +80300 -0.800000 -0.056012 1 1 +80400 -0.800000 -0.140012 1 1 +80500 -0.800000 -0.224012 1 1 +80600 -0.800000 -0.308012 1 1 +80700 -0.800000 -0.392012 1 1 +80800 -0.800000 -0.476012 1 1 +80900 -0.800000 -0.560012 1 1 +81000 -0.800000 -0.644012 1 1 +81100 -0.800000 -0.728012 1 1 +81200 -0.800000 -0.812012 1 1 +81300 -0.800000 -0.896012 1 1 +81400 -0.800000 -0.980012 1 1 +81500 -0.800000 -1.064012 1 1 +81600 -0.800000 -1.148012 1 1 +81700 -0.800000 -1.232012 1 1 +81800 -0.800000 -1.316012 1 1 +81900 -0.800000 -1.400012 1 1 +82000 -0.800000 -1.484012 1 1 +82100 -0.800000 -1.568012 1 1 +82200 -0.800000 -1.652012 1 1 +82300 -0.800000 -1.736012 1 1 +82400 -0.800000 -1.820012 1 1 +82500 -0.800000 -1.904012 1 1 +82600 -0.800000 -1.988012 1 1 +82700 -0.800000 -2.072012 1 1 +82800 -0.800000 -2.156012 1 1 +82900 -0.800000 -2.240012 1 1 +83000 -0.800000 -2.324012 1 1 +83100 -0.800000 -2.408012 1 1 +83200 -0.800000 -2.492012 1 1 +83300 -0.800000 -2.576012 1 1 +83400 -0.800000 -2.660012 1 1 +83500 -0.800000 -2.744012 1 1 +83600 -0.800000 -2.828012 1 1 +83700 -0.800000 -2.912012 1 1 +83800 -0.800000 -2.996012 1 1 +83900 -0.800000 -3.080012 1 1 +84000 -0.800000 -3.164012 1 1 +84100 -0.800000 -3.248012 1 1 +84200 -0.800000 -3.332012 1 1 +84300 -0.800000 -3.416012 1 1 +84400 -0.800000 -3.500012 1 1 +84500 -0.800000 -3.584012 1 1 +84600 -0.800000 -3.668012 1 1 +84700 -0.800000 -3.752012 1 1 +84800 -0.800000 -3.836012 1 1 +84900 -0.800000 -3.920012 1 1 +85000 -0.800000 -4.004012 1 1 +85100 -0.800000 -4.088012 1 1 +85200 -0.800000 -4.172012 1 1 +85300 -0.800000 -4.256012 1 1 +85400 -0.800000 -4.340012 1 1 +85500 -0.800000 -4.424012 1 1 +85600 -0.800000 -4.508012 1 1 +85700 -0.800000 -4.592012 1 1 +85800 -0.800000 -4.676012 1 1 +85900 -0.800000 -4.760012 1 1 +86000 -0.800000 -4.844012 1 1 +86100 -0.800000 -4.928012 1 1 +86200 -0.800000 -5.012012 1 1 +86300 -0.800000 -5.067200 1 1 +86400 -0.800000 -5.151200 1 1 +86500 -0.800000 -5.235200 1 1 +86600 -0.800000 -5.319200 1 1 +86700 -0.800000 -5.403200 1 1 +86800 -0.800000 -5.487200 1 1 +86900 -0.800000 -5.571200 1 1 +87000 -0.800000 -5.655200 1 1 +87100 -0.800000 -5.739200 1 1 +87200 -0.800000 -5.823200 1 1 +87300 -0.800000 -5.907200 1 1 +87400 -0.800000 -5.991200 1 1 +87500 -0.800000 -6.075200 1 1 +87600 -0.800000 -6.159200 1 1 +87700 -0.800000 -6.243200 1 1 +87800 -0.800000 -6.327200 1 1 +87900 -0.800000 -6.411200 1 1 +88000 -0.800000 -6.495200 1 1 +88100 -0.800000 -6.579200 1 1 +88200 -0.800000 -6.663200 1 1 +88300 -0.800000 -6.747200 1 1 +88400 -0.800000 -6.831200 1 1 +88500 -0.800000 -6.915200 1 1 +88600 -0.800000 -6.999200 1 1 +88700 -0.800000 -7.083200 1 1 +88800 -0.800000 -7.167200 1 1 +88900 -0.800000 -7.251200 1 1 +89000 -0.800000 -7.335200 1 1 +89100 -0.800000 -7.419200 1 1 +89200 -0.800000 -7.503200 1 1 +89300 -0.800000 -7.587200 1 1 +89400 -0.800000 -7.671200 1 1 +89500 -0.800000 -7.755200 1 1 +89600 -0.800000 -7.839200 1 1 +89700 -0.800000 -7.923200 1 1 +89800 -0.800000 -8.007200 1 1 +89900 -0.800000 -8.091200 1 1 +90000 -0.800000 -8.175200 1 1 +90100 -0.800000 -8.259200 1 1 +90200 -0.800000 -8.343200 1 1 +90300 -0.800000 -8.427200 1 1 +90400 -0.800000 -8.511200 1 1 +90500 -0.800000 -8.595200 1 1 +90600 -0.800000 -8.679200 1 1 +90700 -0.800000 -8.763200 1 1 +90800 -0.800000 -8.847200 1 1 +90900 -0.800000 -8.931200 1 1 +91000 -0.800000 -9.015200 1 1 +91100 -0.800000 -9.099200 1 1 +91200 -0.800000 -9.183200 1 1 +91300 -0.800000 -9.267200 1 1 +91400 -0.800000 -9.351200 1 1 +91500 -0.800000 -9.435200 1 1 +91600 -0.800000 -9.519200 1 1 +91700 -0.800000 -9.603200 1 1 +91800 -0.800000 -9.687200 1 1 +91900 -0.800000 -9.771200 1 1 +92000 -0.800000 -9.855200 1 1 +92100 -0.800000 -9.939200 1 1 +92200 -0.800000 -10.023200 1 1 +92300 -0.800000 -10.107200 1 1 +92400 -0.800000 -10.191200 1 1 +92500 -0.800000 -10.275200 1 1 +92600 -0.800000 -10.359200 1 1 +92700 -0.800000 -10.443200 1 1 +92800 -0.800000 -10.527200 1 1 +92900 -0.800000 -10.611200 1 1 +93000 -0.800000 -10.695200 1 1 +93100 -0.800000 -10.779200 1 1 +93200 -0.800000 -10.863200 1 1 +93300 -0.800000 -10.947200 1 1 +93400 -0.800000 -11.031200 1 1 +93500 -0.800000 -11.115200 1 1 +93600 -0.800000 -11.199200 1 1 +93700 -0.800000 -11.283200 1 1 +93800 -0.800000 -11.367200 1 1 +93900 -0.800000 -11.451200 1 1 +94000 -0.800000 -11.535200 1 1 +94100 -0.800000 -11.619200 1 1 +94200 -0.800000 -11.703200 1 1 +94300 -0.800000 -11.787200 1 1 +94400 -0.800000 -11.871200 1 1 +94500 -0.800000 -11.955200 1 1 +94600 -0.800000 -12.039200 1 1 +94700 -0.800000 -12.123200 1 1 +94800 -0.800000 -12.207200 1 1 +94900 -0.800000 -12.291200 1 1 +95000 -0.800000 -12.375200 1 1 +95100 -0.800000 -12.459200 1 1 +95200 -0.800000 -12.543200 1 1 +95300 -0.800000 -12.627200 1 1 +95400 -0.800000 -12.711200 1 1 +95500 -0.800000 -12.795200 1 1 +95600 -0.800000 -12.879200 1 1 +95700 -0.800000 -12.963200 1 1 +95800 -0.800000 -13.047200 1 1 +95900 -0.800000 -13.131200 1 1 +96000 -0.800000 -13.215200 1 1 +96100 -0.800000 -13.299200 1 1 +96200 -0.800000 -13.383200 1 1 +96300 -0.800000 -13.467200 1 1 +96400 -0.800000 -13.551200 1 1 +96500 -0.800000 -13.635200 1 1 +96600 -0.800000 -13.719200 1 1 +96700 -0.800000 -13.803200 1 1 +96800 -0.800000 -13.887200 1 1 +96900 -0.800000 -13.971200 1 1 +97000 -0.800000 -14.055200 1 1 +97100 -0.800000 -14.139200 1 1 +97200 -0.800000 -14.223200 1 1 +97300 -0.800000 -14.307200 1 1 +97400 -0.800000 -14.391200 1 1 +97500 -0.800000 -14.475200 1 1 +97600 -0.800000 -14.559200 1 1 +97700 -0.800000 -14.643200 1 1 +97800 -0.800000 -14.727200 1 1 +97900 -0.800000 -14.811200 1 1 +98000 -0.800000 -14.895200 1 1 +98100 -0.800000 -14.979200 1 1 +98200 -0.800000 -15.063200 1 1 +98300 -0.800000 -15.147200 1 1 +98400 -0.800000 -15.231200 1 1 +98500 -0.800000 -15.315200 1 1 +98600 -0.800000 -15.399200 1 1 +98700 -0.800000 -15.483200 1 1 +98800 -0.800000 -15.567200 1 1 +98900 -0.800000 -15.651200 1 1 +99000 -0.800000 -15.735200 1 1 +99100 -0.800000 -15.819200 1 1 +99200 -0.800000 -15.903200 1 1 +99300 -0.800000 -15.987200 1 1 +99400 -0.800000 -16.071200 1 1 +99500 -0.800000 -16.155200 1 1 +99600 -0.800000 -16.239200 1 1 +99700 -0.800000 -16.323200 1 1 +99800 -0.800000 -16.407200 1 1 +99900 -0.800000 -16.491200 1 1 +100000 -0.800000 -16.575200 1 1 +100100 -0.800000 -16.659200 1 1 +100200 -0.800000 -16.743200 1 1 +100300 -0.800000 -16.827200 1 1 +100400 -0.800000 -16.911200 1 1 +100500 -0.800000 -16.995200 1 1 +100600 -0.800000 -17.079200 1 1 +100700 -0.800000 -17.163200 1 1 +100800 -0.800000 -17.247200 1 1 +100900 -0.800000 -17.331200 1 1 +101000 -0.800000 -17.415200 1 1 +101100 -0.800000 -17.499200 1 1 +101200 -0.800000 -17.583200 1 1 +101300 -0.800000 -17.667200 1 1 +101400 -0.800000 -17.751200 1 1 +101500 -0.800000 -17.835200 1 1 +101600 -0.800000 -17.919200 1 1 +101700 -0.800000 -18.003200 1 1 +101800 -0.800000 -18.087200 1 1 +101900 -0.800000 -18.171200 1 1 +102000 -0.800000 -18.255200 1 1 +102100 -0.800000 -18.339200 1 1 +102200 -0.800000 -18.423200 1 1 +102300 -0.800000 -18.507200 1 1 +102400 -0.800000 -18.591200 1 1 +102500 -0.800000 -18.675200 1 1 +102600 -0.800000 -18.759200 1 1 +102700 -0.800000 -18.843200 1 1 +102800 -0.800000 -18.927200 1 1 +102900 -0.800000 -19.011200 1 1 +103000 -0.800000 -19.095200 1 1 +103100 -0.800000 -19.179200 1 1 +103200 -0.800000 -19.263200 1 1 +103300 -0.800000 -19.347200 1 1 +103400 -0.800000 -19.431200 1 1 +103500 -0.800000 -19.515200 1 1 +103600 -0.800000 -19.599200 1 1 +103700 -0.800000 -19.683200 1 1 +103800 -0.800000 -19.767200 1 1 +103900 -0.800000 -19.851200 1 1 +104000 -0.800000 -19.935200 1 1 +104100 -0.800000 -20.019200 1 1 +104200 -0.800000 -20.103200 1 1 +104300 -0.800000 -20.187200 1 1 +104400 -0.800000 -20.271200 1 1 +104500 -0.800000 -20.355200 1 1 +104600 -0.800000 -20.439200 1 1 +104700 -0.800000 -20.523200 1 1 +104800 -0.800000 -20.607200 1 1 +104900 -0.800000 -20.691200 1 1 +105000 -0.800000 -20.775200 1 1 +105100 -0.800000 -20.859200 1 1 +105200 -0.800000 -20.943200 1 1 +105300 -0.800000 -21.027200 1 1 +105400 -0.800000 -21.111200 1 1 +105500 -0.800000 -21.195200 1 1 +105600 -0.800000 -21.279200 1 1 +105700 -0.800000 -21.363200 1 1 +105800 -0.800000 -21.447200 1 1 +105900 -0.800000 -21.531200 1 1 +106000 -0.800000 -21.615200 1 1 +106100 -0.800000 -21.699200 1 1 +106200 -0.800000 -21.783200 1 1 +106300 -0.800000 -21.867200 1 1 +106400 -0.800000 -21.951200 1 1 +106500 -0.800000 -22.035200 1 1 +106600 -0.800000 -22.119200 1 1 +106700 -0.800000 -22.203200 1 1 +106800 -0.800000 -22.287200 1 1 +106900 -0.800000 -22.371200 1 1 +107000 -0.800000 -22.455200 1 1 +107100 -0.800000 -22.539200 1 1 +107200 -0.800000 -22.623200 1 1 +107300 -0.800000 -22.707200 1 1 +107400 -0.800000 -22.791200 1 1 +107500 -0.800000 -22.875200 1 1 +107600 -0.800000 -22.959200 1 1 +107700 -0.800000 -23.043200 1 1 +107800 -0.800000 -23.127200 1 1 +107900 -0.800000 -23.211200 1 1 +108000 -0.800000 -23.295200 1 1 +108100 -0.800000 -23.379200 1 1 +108200 -0.800000 -23.463200 1 1 +108300 -0.800000 -23.547200 1 1 +108400 -0.800000 -23.631200 1 1 +108500 -0.800000 -23.715200 1 1 +108600 -0.800000 -23.799200 1 1 +108700 -0.800000 -23.883200 1 1 +108800 -0.800000 -23.967200 1 1 +108900 -0.800000 -24.051200 1 1 +109000 -0.800000 -24.135200 1 1 +109100 -0.800000 -24.219200 1 1 +109200 -0.800000 -24.303200 1 1 +109300 -0.800000 -24.387200 1 1 +109400 -0.800000 -24.471200 1 1 +109500 -0.800000 -24.555200 1 1 +109600 -0.800000 -24.639200 1 1 +109700 -0.800000 -24.723200 1 1 +109800 -0.800000 -24.807200 1 1 +109900 -0.800000 -24.891200 1 1 +110000 -0.800000 -24.975200 1 1 +110100 -0.800000 -25.059200 1 1 +110200 -0.800000 -25.143200 1 1 +110300 -0.800000 -25.227200 1 1 +110400 -0.800000 -25.311200 1 1 +110500 -0.800000 -25.395200 1 1 +110600 -0.800000 -25.479200 1 1 +110700 -0.800000 -25.563200 1 1 +110800 -0.800000 -25.647200 1 1 +110900 -0.800000 -25.731200 1 1 +111000 -0.800000 -25.815200 1 1 +111100 -0.800000 -25.899200 1 1 +111200 -0.800000 -25.983200 1 1 +111300 -0.800000 -26.067200 1 1 +111400 -0.800000 -26.151200 1 1 +111500 -0.800000 -26.235200 1 1 +111600 -0.800000 -26.319200 1 1 +111700 -0.800000 -26.403200 1 1 +111800 -0.800000 -26.487200 1 1 +111900 -0.800000 -26.571200 1 1 +112000 -0.800000 -26.655200 1 1 +112100 -0.800000 -26.739200 1 1 +112200 -0.800000 -26.823200 1 1 +112300 -0.800000 -26.907200 1 1 +112400 -0.800000 -26.991200 1 1 +112500 -0.800000 -27.075200 1 1 +112600 -0.800000 -27.159200 1 1 +112700 -0.800000 -27.243200 1 1 +112800 -0.800000 -27.327200 1 1 +112900 -0.800000 -27.411200 1 1 +113000 -0.800000 -27.495200 1 1 +113100 -0.800000 -27.579200 1 1 +113200 -0.800000 -27.663200 1 1 +113300 -0.800000 -27.747200 1 1 +113400 -0.800000 -27.831200 1 1 +113500 -0.800000 -27.915200 1 1 +113600 -0.800000 -27.999200 1 1 +113700 -0.800000 -28.083200 1 1 +113800 -0.800000 -28.167200 1 1 +113900 -0.800000 -28.251200 1 1 +114000 -0.800000 -28.335200 1 1 +114100 -0.800000 -28.419200 1 1 +114200 -0.800000 -28.503200 1 1 +114300 -0.800000 -28.587200 1 1 +114400 -0.800000 -28.671200 1 1 +114500 -0.800000 -28.755200 1 1 +114600 -0.800000 -28.839200 1 1 +114700 -0.800000 -28.923200 1 1 +114800 -0.800000 -29.007200 1 1 +114900 -0.800000 -29.091200 1 1 +115000 -0.800000 -29.175200 1 1 +115100 -0.800000 -29.259200 1 1 +115200 -0.800000 -29.343200 1 1 +115300 -0.800000 -29.427200 1 1 +115400 -0.800000 -29.511200 1 1 +115500 -0.800000 -29.595200 1 1 +115600 -0.800000 -29.679200 1 1 +115700 -0.800000 -29.763200 1 1 +115800 -0.800000 -29.847200 1 1 +115900 -0.800000 -29.931200 1 1 +116000 -0.800000 -30.015200 1 1 +116100 -0.800000 -30.099200 1 1 +116200 -0.800000 -30.183200 1 1 +116300 -0.800000 -30.267200 1 1 +116400 -0.800000 -30.351200 1 1 +116500 -0.800000 -30.435200 1 1 +116600 -0.800000 -30.519200 1 1 +116700 -0.800000 -30.603200 1 1 +116800 -0.800000 -30.687200 1 1 +116900 -0.800000 -30.771200 1 1 +117000 -0.800000 -30.855200 1 1 +117100 -0.800000 -30.939200 1 1 +117200 -0.800000 -31.023200 1 1 +117300 -0.800000 -31.107200 1 1 +117400 -0.800000 -31.191200 1 1 +117500 -0.800000 -31.275200 1 1 +117600 -0.800000 -31.359200 1 1 +117700 -0.800000 -31.443200 1 1 +117800 -0.800000 -31.527200 1 1 +117900 -0.800000 -31.611200 1 1 +118000 -0.800000 -31.695200 1 1 +118100 -0.800000 -31.779200 1 1 +118200 -0.800000 -31.863200 1 1 +118300 -0.800000 -31.947200 1 1 +118400 -0.800000 -32.031200 1 1 +118500 -0.800000 -32.115200 1 1 +118600 -0.800000 -32.199200 1 1 +118700 -0.800000 -32.283200 1 1 +118800 -0.800000 -32.367200 1 1 +118900 -0.800000 -32.451200 1 1 +119000 -0.800000 -32.535200 1 1 +119100 -0.800000 -32.619200 1 1 +119200 -0.800000 -32.703200 1 1 +119300 -0.800000 -32.787200 1 1 +119400 -0.800000 -32.871200 1 1 +119500 -0.800000 -32.955200 1 1 +119600 -0.800000 -33.039200 1 1 +119700 -0.800000 -33.123200 1 1 +119800 -0.800000 -33.207200 1 1 +119900 -0.800000 -33.291200 1 1 +120000 -0.800000 -33.375200 1 1 +120100 -0.800000 -33.459200 1 1 +120200 -0.800000 -33.543200 1 1 +120300 -0.800000 -33.627200 1 1 +120400 -0.800000 -33.711200 1 1 +120500 -0.800000 -33.795200 1 1 +120600 -0.800000 -33.879200 1 1 +120700 -0.800000 -33.963200 1 1 +120800 -0.800000 -34.047200 1 1 +120900 -0.800000 -34.131200 1 1 +121000 -0.800000 -34.215200 1 1 +121100 -0.800000 -34.299200 1 1 +121200 -0.800000 -34.383200 1 1 +121300 -0.800000 -34.467200 1 1 +121400 -0.800000 -34.551200 1 1 +121500 -0.800000 -34.635200 1 1 +121600 -0.800000 -34.719200 1 1 +121700 -0.800000 -34.803200 1 1 +121800 -0.800000 -34.887200 1 1 +121900 -0.800000 -34.971200 1 1 +122000 -0.800000 -35.055200 1 1 +122100 -0.800000 -35.139200 1 1 +122200 -0.800000 -35.223200 1 1 +122300 -0.800000 -35.307200 1 1 +122400 -0.800000 -35.391200 1 1 +122500 -0.800000 -35.475200 1 1 +122600 -0.800000 -35.559200 1 1 +122700 -0.800000 -35.643200 1 1 +122800 -0.800000 -35.727200 1 1 +122900 -0.800000 -35.811200 1 1 +123000 -0.800000 -35.895200 1 1 +123100 -0.800000 -35.979200 1 1 +123200 -0.800000 -36.063200 1 1 +123300 -0.800000 -36.147200 1 1 +123400 -0.800000 -36.231200 1 1 +123500 -0.800000 -36.315200 1 1 +123600 -0.800000 -36.399200 1 1 +123700 -0.800000 -36.483200 1 1 +123800 -0.800000 -36.567200 1 1 +123900 -0.800000 -36.651200 1 1 +124000 -0.800000 -36.735200 1 1 +124100 -0.800000 -36.819200 1 1 +124200 -0.800000 -36.903200 1 1 +124300 -0.800000 -36.987200 1 1 +124400 -0.800000 -37.071200 1 1 +124500 -0.800000 -37.155200 1 1 +124600 -0.800000 -37.239200 1 1 +124700 -0.800000 -37.323200 1 1 +124800 -0.800000 -37.407200 1 1 +124900 -0.800000 -37.491200 1 1 +125000 -0.800000 -37.575200 1 1 +125100 -0.800000 -37.659200 1 1 +125200 -0.800000 -37.743200 1 1 +125300 -0.800000 -37.827200 1 1 +125400 -0.800000 -37.911200 1 1 +125500 -0.800000 -37.995200 1 1 +125600 -0.800000 -38.079200 1 1 +125700 -0.800000 -38.163200 1 1 +125800 -0.800000 -38.247200 1 1 +125900 -0.800000 -38.331200 1 1 +126000 -0.800000 -38.415200 1 1 +126100 -0.800000 -38.499200 1 1 +126200 -0.800000 -38.583200 1 1 +126300 -0.800000 -38.667200 1 1 +126400 -0.800000 -38.751200 1 1 +126500 -0.800000 -38.835200 1 1 +126600 -0.800000 -38.919200 1 1 +126700 -0.800000 -39.003200 1 1 +126800 -0.800000 -39.087200 1 1 +126900 -0.800000 -39.171200 1 1 +127000 -0.800000 -39.255200 1 1 +127100 -0.800000 -39.339200 1 1 +127200 -0.800000 -39.423200 1 1 +127300 -0.800000 -39.507200 1 1 +127400 -0.800000 -39.591200 1 1 +127500 -0.800000 -39.675200 1 1 +127600 -0.800000 -39.759200 1 1 +127700 -0.800000 -39.843200 1 1 +127800 -0.800000 -39.927200 1 1 +127900 -0.800000 -40.011200 1 1 +128000 -0.800000 -40.095200 1 1 +128100 -0.800000 -40.179200 1 1 +128200 -0.800000 -40.263200 1 1 +128300 -0.800000 -40.347200 1 1 +128400 -0.800000 -40.431200 1 1 +128500 -0.800000 -40.515200 1 1 +128600 -0.800000 -40.599200 1 1 +128700 -0.800000 -40.683200 1 1 +128800 -0.800000 -40.767200 1 1 +128900 -0.800000 -40.851200 1 1 +129000 -0.800000 -40.935200 1 1 +129100 -0.800000 -41.019200 1 1 +129200 -0.800000 -41.103200 1 1 +129300 -0.800000 -41.187200 1 1 +129400 -0.800000 -41.271200 1 1 +129500 -0.800000 -41.355200 1 1 +129600 -0.800000 -41.439200 1 1 +129700 -0.800000 -41.523200 1 1 +129800 -0.800000 -41.607200 1 1 +129900 -0.800000 -41.691200 1 1 +130000 -0.800000 -41.775200 1 1 +130100 -0.800000 -41.859200 1 1 +130200 -0.800000 -41.943200 1 1 +130300 -0.800000 -42.027200 1 1 +130400 -0.800000 -42.111200 1 1 +130500 -0.800000 -42.195200 1 1 +130600 -0.800000 -42.279200 1 1 +130700 -0.800000 -42.363200 1 1 +130800 -0.800000 -42.447200 1 1 +130900 -0.800000 -42.531200 1 1 +131000 -0.800000 -42.615200 1 1 +131100 -0.800000 -42.699200 1 1 +131200 -0.800000 -42.783200 1 1 +131300 -0.800000 -42.867200 1 1 +131400 -0.800000 -42.951200 1 1 +131500 -0.800000 -43.035200 1 1 +131600 -0.800000 -43.119200 1 1 +131700 -0.800000 -43.203200 1 1 +131800 -0.800000 -43.287200 1 1 +131900 -0.800000 -43.371200 1 1 +132000 -0.800000 -43.455200 1 1 +132100 -0.800000 -43.539200 1 1 +132200 -0.800000 -43.623200 1 1 +132300 -0.800000 -43.707200 1 1 +132400 -0.800000 -43.791200 1 1 +132500 -0.800000 -43.875200 1 1 +132600 -0.800000 -43.959200 1 1 +132700 -0.800000 -44.043200 1 1 +132800 -0.800000 -44.127200 1 1 +132900 -0.800000 -44.211200 1 1 +133000 -0.800000 -44.295200 1 1 +133100 -0.800000 -44.379200 1 1 +133200 -0.800000 -44.463200 1 1 +133300 -0.536256 -44.547200 1 1 +133400 -0.275323 -44.628897 1 1 +133500 -0.141356 -44.694819 1 1 +133600 -0.072574 -44.740976 1 1 +133700 -0.037261 -44.770994 1 1 +133800 -0.019130 -44.789651 1 1 +133900 -0.009822 -44.800895 1 1 +134000 -0.005043 -44.807524 1 1 +134100 -0.002589 -44.811367 1 1 +134200 -0.001329 -44.813565 1 1 +134300 -0.000682 -44.814809 1 1 +134400 -0.000350 -44.815508 1 1 +134500 -0.000180 -44.815897 1 1 +134600 -0.000092 -44.816112 1 1 +134700 -0.000047 -44.816231 1 1 +134800 -0.000024 -44.816296 1 1 +134900 -0.000012 -44.816331 1 1 +135000 -0.000006 -44.816350 1 1 +135100 -0.000003 -44.816361 1 1 +135200 -0.000002 -44.816367 1 1 +135300 -0.000001 -44.816370 1 1 +135400 -0.000000 -44.816371 1 1 +135500 -0.000000 -44.816372 1 1 +135600 -0.000000 -44.816373 1 1 +135700 -0.000000 -44.816373 1 1 +135800 -0.000000 -44.816373 1 1 +135900 -0.000000 -44.816373 1 1 +136000 -0.000000 -44.816373 1 1 +136100 -0.000000 -44.816373 1 1 +136200 -0.000000 -44.816373 1 1 +136300 -0.000000 -44.816373 1 1 +136400 -0.000000 -44.816373 1 1 +136500 -0.000000 -44.816373 1 1 +136600 -0.000000 -44.816373 1 1 +136700 -0.000000 -44.816373 1 1 +136800 -0.000000 -44.816373 1 1 +136900 -0.000000 -44.816373 1 1 +137000 -0.000000 -44.816373 1 1 +137100 -0.000000 -44.816373 1 1 +137200 -0.000000 -44.816373 1 1 +137300 -0.000000 -44.816373 1 1 +137400 -0.000000 -44.816373 1 1 +137500 -0.000000 -44.816373 1 1 +137600 -0.000000 -44.816373 1 1 +137700 -0.000000 -44.816373 1 1 +137800 -0.000000 -44.816373 1 1 +137900 -0.000000 -44.816373 1 1 +138000 -0.000000 -44.816373 1 1 +138100 -0.000000 -44.816373 1 1 +138200 -0.000000 -44.816373 1 1 +138300 -0.000000 -44.816373 1 1 +138400 -0.000000 -44.816373 1 1 +138500 -0.000000 -44.816373 1 1 +138600 -0.000000 -44.816373 1 1 +138700 -0.000000 -44.816373 1 1 +138800 -0.000000 -44.816373 1 1 +138900 -0.000000 -44.816373 1 1 +139000 -0.000000 -44.816373 1 1 +139100 -0.000000 -44.816373 1 1 +139200 -0.000000 -44.816373 1 1 +139300 -0.000000 -44.816373 1 1 +139400 -0.000000 -44.816373 1 1 +139500 -0.000000 -44.816373 1 1 +139600 -0.000000 -44.816373 1 1 +139700 -0.000000 -44.816373 1 1 +139800 -0.000000 -44.816373 1 1 +139900 -0.000000 -44.816373 1 1 +140000 -0.000000 -44.816373 1 1 +140100 -0.000000 -44.816373 1 1 +140200 -0.000000 -44.816373 1 1 +140300 -0.000000 -44.816373 1 1 +140400 -0.000000 -44.816373 1 1 +140500 -0.000000 -44.816373 1 1 +140600 -0.000000 -44.816373 1 1 +140700 -0.000000 -44.816373 1 1 +140800 -0.000000 -44.816373 1 1 +140900 -0.000000 -44.816373 1 1 +141000 -0.000000 -44.816373 1 1 +141100 -0.000000 -44.816373 1 1 +141200 -0.000000 -44.816373 1 1 +141300 -0.000000 -44.816373 1 1 +141400 -0.000000 -44.816373 1 1 +141500 -0.000000 -44.816373 1 1 +141600 -0.000000 -44.816373 1 1 +141700 -0.000000 -44.816373 1 1 +141800 -0.000000 -44.816373 1 1 +141900 -0.000000 -44.816373 1 1 +142000 -0.000000 -44.816373 1 1 +142100 -0.000000 -44.816373 1 1 +142200 -0.000000 -44.816373 1 1 +142300 -0.000000 -44.816373 1 1 +142400 -0.000000 -44.816373 1 1 +142500 -0.000000 -44.816373 1 1 +142600 -0.000000 -44.816373 1 1 +142700 -0.000000 -44.816373 1 1 +142800 -0.000000 -44.816373 1 1 +142900 -0.000000 -44.816373 1 1 +143000 -0.000000 -44.816373 1 1 +143100 -0.000000 -44.816373 1 1 +143200 -0.000000 -44.816373 1 1 +143300 -0.000000 -44.816373 1 1 +143400 -0.000000 -44.816373 1 1 +143500 -0.000000 -44.816373 1 1 +143600 -0.000000 -44.816373 1 1 +143700 -0.000000 -44.816373 1 1 +143800 -0.000000 -44.816373 1 1 +143900 -0.000000 -44.816373 1 1 +144000 -0.000000 -44.816373 1 1 +144100 -0.000000 -44.816373 1 1 +144200 -0.000000 -44.816373 1 1 +144300 -0.000000 -44.816373 1 1 +144400 -0.000000 -44.816373 1 1 +144500 -0.000000 -44.816373 1 1 +144600 -0.000000 -44.816373 1 1 +144700 -0.000000 -44.816373 1 1 +144800 -0.000000 -44.816373 1 1 +144900 -0.000000 -44.816373 1 1 +145000 -0.000000 -44.816373 1 1 +145100 -0.000000 -44.816373 1 1 +145200 -0.000000 -44.816373 1 1 +145300 -0.000000 -44.816373 1 1 +145400 -0.000000 -44.816373 1 1 +145500 -0.000000 -44.816373 1 1 +145600 -0.000000 -44.816373 1 1 +145700 -0.000000 -44.816373 1 1 +145800 -0.000000 -44.816373 1 1 +145900 -0.000000 -44.816373 1 1 +146000 -0.000000 -44.816373 1 1 +146100 -0.000000 -44.816373 1 1 +146200 -0.000000 -44.816373 1 1 +146300 -0.000000 -44.816373 1 1 +146400 -0.000000 -44.816373 1 1 +146500 -0.000000 -44.816373 1 1 +146600 -0.000000 -44.816373 1 1 +146700 -0.000000 -44.816373 1 1 +146800 -0.000000 -44.816373 1 1 +146900 -0.000000 -44.816373 1 1 +147000 -0.000000 -44.816373 1 1 +147100 -0.000000 -44.816373 1 1 +147200 -0.000000 -44.816373 1 1 +147300 -0.000000 -44.816373 1 1 +147400 -0.000000 -44.816373 1 1 +147500 -0.000000 -44.816373 1 1 +147600 -0.000000 -44.816373 1 1 +147700 -0.000000 -44.816373 1 1 +147800 -0.000000 -44.816373 1 1 +147900 -0.000000 -44.816373 1 1 +148000 -0.000000 -44.816373 1 1 +148100 -0.000000 -44.816373 1 1 +148200 -0.000000 -44.816373 1 1 +148300 -0.000000 -44.816373 1 1 +148400 -0.000000 -44.816373 1 1 +148500 -0.000000 -44.816373 1 1 +148600 -0.000000 -44.816373 1 1 +148700 -0.000000 -44.816373 1 1 +148800 -0.000000 -44.816373 1 1 +148900 -0.000000 -44.816373 1 1 +149000 -0.000000 -44.816373 1 1 +149100 -0.000000 -44.816373 1 1 +149200 -0.000000 -44.816373 1 1 +149300 -0.000000 -44.816373 1 1 +149400 -0.000000 -44.816373 1 1 +149500 -0.000000 -44.816373 1 1 +149600 -0.000000 -44.816373 1 1 +149700 -0.000000 -44.816373 1 1 +149800 -0.000000 -44.816373 1 1 +149900 -0.000000 -44.816373 1 1 +150000 -0.000000 -44.816373 1 1 +150100 -0.000000 -44.816373 1 1 +150200 -0.000000 -44.816373 1 1 +150300 -0.000000 -44.816373 1 1 +150400 -0.000000 -44.816373 1 1 +150500 -0.000000 -44.816373 1 1 +150600 -0.000000 -44.816373 1 1 +150700 -0.000000 -44.816373 1 1 +150800 -0.000000 -44.816373 1 1 +150900 -0.000000 -44.816373 1 1 +151000 -0.000000 -44.816373 1 1 +151100 -0.000000 -44.816373 1 1 +151200 -0.000000 -44.816373 1 1 +151300 -0.000000 -44.816373 1 1 +151400 -0.000000 -44.816373 1 1 +151500 -0.000000 -44.816373 1 1 +151600 -0.000000 -44.816373 1 1 +151700 -0.000000 -44.816373 1 1 +151800 -0.000000 -44.816373 1 1 +151900 -0.000000 -44.816373 1 1 +152000 -0.000000 -44.816373 1 1 +152100 -0.000000 -44.816373 1 1 +152200 -0.000000 -44.816373 1 1 +152300 -0.000000 -44.816373 1 1 +152400 -0.000000 -44.816373 1 1 +152500 -0.000000 -44.816373 1 1 +152600 -0.000000 -44.816373 1 1 +152700 -0.000000 -44.816373 1 1 +152800 -0.000000 -44.816373 1 1 +152900 -0.000000 -44.816373 1 1 +153000 -0.000000 -44.816373 1 1 +153100 -0.000000 -44.816373 1 1 +153200 -0.000000 -44.816373 1 1 +153300 -0.000000 -44.816373 1 1 +153400 -0.000000 -44.816373 1 1 +153500 -0.000000 -44.816373 1 1 +153600 -0.000000 -44.816373 1 1 +153700 -0.000000 -44.816373 1 1 +153800 -0.000000 -44.816373 1 1 +153900 -0.000000 -44.816373 1 1 +154000 -0.000000 -44.816373 1 1 +154100 -0.000000 -44.816373 1 1 +154200 -0.000000 -44.816373 1 1 +154300 -0.000000 -44.816373 1 1 +154400 -0.000000 -44.816373 1 1 +154500 -0.000000 -44.816373 1 1 +154600 -0.000000 -44.816373 1 1 +154700 -0.000000 -44.816373 1 1 +154800 -0.000000 -44.816373 1 1 +154900 -0.000000 -44.816373 1 1 +155000 -0.000000 -44.816373 1 1 +155100 -0.000000 -44.816373 1 1 +155200 -0.000000 -44.816373 1 1 +155300 -0.000000 -44.816373 1 1 +155400 -0.000000 -44.816373 1 1 +155500 -0.000000 -44.816373 1 1 +155600 -0.000000 -44.816373 1 1 +155700 -0.000000 -44.816373 1 1 +155800 -0.000000 -44.816373 1 1 +155900 -0.000000 -44.816373 1 1 +156000 -0.000000 -44.816373 1 1 +156100 -0.000000 -44.816373 1 1 +156200 -0.000000 -44.816373 1 1 +156300 -0.000000 -44.816373 1 1 +156400 -0.000000 -44.816373 1 1 +156500 -0.000000 -44.816373 1 1 +156600 -0.000000 -44.816373 1 1 +156700 -0.000000 -44.816373 1 1 +156800 -0.000000 -44.816373 1 1 +156900 -0.000000 -44.816373 1 1 +157000 -0.000000 -44.816373 1 1 +157100 -0.000000 -44.816373 1 1 +157200 -0.000000 -44.816373 1 1 +157300 -0.000000 -44.816373 1 1 +157400 -0.000000 -44.816373 1 1 +157500 -0.000000 -44.816373 1 1 +157600 -0.000000 -44.816373 1 1 +157700 -0.000000 -44.816373 1 1 +157800 -0.000000 -44.816373 1 1 +157900 -0.000000 -44.816373 1 1 +158000 -0.000000 -44.816373 1 1 +158100 -0.000000 -44.816373 1 1 +158200 -0.000000 -44.816373 1 1 +158300 -0.000000 -44.816373 1 1 +158400 -0.000000 -44.816373 1 1 +158500 -0.000000 -44.816373 1 1 +158600 -0.000000 -44.816373 1 1 +158700 -0.000000 -44.816373 1 1 +158800 -0.000000 -44.816373 1 1 +158900 -0.000000 -44.816373 1 1 +159000 -0.000000 -44.816373 1 1 +159100 -0.000000 -44.816373 1 1 +159200 -0.000000 -44.816373 1 1 +159300 -0.000000 -44.816373 1 1 +159400 -0.000000 -44.816373 1 1 +159500 -0.000000 -44.816373 1 1 +159600 -0.000000 -44.816373 1 1 +159700 -0.000000 -44.816373 1 1 +159800 -0.000000 -44.816373 1 1 +159900 -0.000000 -44.816373 1 1 +160000 0.008322 -44.816373 1 1 +160100 0.142612 -44.816351 1 1 +160200 0.373754 -44.814231 1 1 +160300 0.654620 -44.802888 1 1 +160400 0.961016 -44.774349 1 1 +160500 1.280519 -44.722297 1 1 +160600 1.606752 -44.642347 1 1 +160700 1.936439 -44.531662 1 1 +160800 2.267901 -44.388483 1 1 +160900 2.600273 -44.211755 1 1 +161000 2.933113 -44.000855 1 1 +161100 3.266193 -43.755424 1 1 +161200 3.603558 -43.475254 1 1 +161300 4.003969 -43.160220 1 1 +161400 4.452839 -42.809218 1 1 +161500 4.926588 -42.418648 1 1 +161600 5.413110 -41.984505 1 1 +161700 5.906191 -41.503619 1 1 +161800 6.402638 -40.973791 1 1 +161900 6.900814 -40.393599 1 1 +162000 7.387395 -39.762163 1 1 +162100 7.685478 -39.078986 1 1 +162200 7.838519 -38.346872 1 1 +162300 7.917093 -37.576325 1 1 +162400 7.957434 -36.779204 1 1 +162500 7.978146 -35.964926 1 1 +162600 7.988780 -35.140036 1 1 +162700 7.994239 -34.308770 1 1 +162800 7.997042 -33.473756 1 1 +162900 7.998482 -32.636574 1 1 +163000 7.999220 -31.798153 1 1 +163100 7.999600 -30.959031 1 1 +163200 7.999794 -30.119517 1 1 +163300 7.999894 -29.279785 1 1 +163400 7.999946 -28.439931 1 1 +163500 7.999972 -27.600011 1 1 +163600 7.999986 -26.760054 1 1 +163700 7.823684 -25.920078 1 1 +163800 7.343901 -25.081665 1 1 +163900 6.708306 -24.257629 1 1 +164000 5.992714 -23.467530 1 1 +164100 5.236051 -22.728375 1 1 +164200 4.458300 -22.052475 1 1 +164300 3.669724 -21.447987 1 1 +164400 2.875589 -20.920040 1 1 +164500 2.078600 -20.471754 1 1 +164600 1.280146 -20.104977 1 1 +164700 0.657249 -19.820787 1 1 +164800 0.337443 -19.618228 1 1 +164900 -0.216017 -19.484842 1 1 +165000 -0.500173 -19.408389 1 1 +165100 -0.646064 -19.383898 1 1 +165200 -0.720967 -19.398790 1 1 +165300 -0.759423 -19.440426 1 1 +165400 -0.779167 -19.499142 1 1 +165500 -0.789304 -19.568346 1 1 +165600 -0.530765 -19.643818 1 1 +165700 -0.272504 -19.720658 1 1 +165800 -0.139908 -19.783842 1 1 +165900 -0.071831 -19.828466 1 1 +166000 -0.036879 -19.857633 1 1 +166100 -0.018934 -19.875819 1 1 +166200 -0.009721 -19.886805 1 1 +166300 -0.004991 -19.893292 1 1 +166400 -0.002563 -19.897058 1 1 +166500 -0.001316 -19.899214 1 1 +166600 -0.000675 -19.900436 1 1 +166700 -0.000347 -19.901122 1 1 +166800 -0.000178 -19.901504 1 1 +166900 -0.000091 -19.901716 1 1 +167000 -0.000047 -19.901833 1 1 +167100 -0.000024 -19.901897 1 1 +167200 -0.000012 -19.901932 1 1 +167300 -0.000006 -19.901951 1 1 +167400 -0.000003 -19.901961 1 1 +167500 -0.000002 -19.901967 1 1 +167600 -0.000001 -19.901970 1 1 +167700 -0.000000 -19.901971 1 1 +167800 -0.000000 -19.901972 1 1 +167900 -0.000000 -19.901973 1 1 +168000 -0.000000 -19.901973 1 1 +168100 -0.000000 -19.901973 1 1 +168200 -0.000000 -19.901973 1 1 +168300 -0.000000 -19.901973 1 1 +168400 -0.000000 -19.901973 1 1 +168500 -0.000000 -19.901973 1 1 +168600 -0.000000 -19.901973 1 1 +168700 -0.000000 -19.901973 1 1 +168800 -0.000000 -19.901973 1 1 +168900 -0.000000 -19.901973 1 1 +169000 -0.000000 -19.901973 1 1 +169100 -0.000000 -19.901973 1 1 +169200 -0.000000 -19.901973 1 1 +169300 -0.000000 -19.901973 1 1 +169400 -0.000000 -19.901973 1 1 +169500 -0.000000 -19.901973 1 1 +169600 -0.000000 -19.901973 1 1 +169700 -0.000000 -19.901973 1 1 +169800 -0.000000 -19.901973 1 1 +169900 -0.000000 -19.901973 1 1 +170000 -0.000000 -19.901973 1 1 +170100 -0.000000 -19.901973 1 1 +170200 -0.000000 -19.901973 1 1 +170300 -0.000000 -19.901973 1 1 +170400 -0.000000 -19.901973 1 1 +170500 -0.000000 -19.901973 1 1 +170600 -0.000000 -19.901973 1 1 +170700 -0.000000 -19.901973 1 1 +170800 -0.000000 -19.901973 1 1 +170900 -0.000000 -19.901973 1 1 +171000 -0.000000 -19.901973 1 1 +171100 -0.000000 -19.901973 1 1 +171200 -0.000000 -19.901973 1 1 +171300 -0.000000 -19.901973 1 1 +171400 -0.000000 -19.901973 1 1 +171500 -0.000000 -19.901973 1 1 +171600 -0.000000 -19.901973 1 1 +171700 -0.000000 -19.901973 1 1 +171800 -0.000000 -19.901973 1 1 +171900 -0.000000 -19.901973 1 1 +172000 -0.000000 -19.901973 1 1 +172100 -0.000000 -19.901973 1 1 +172200 -0.000000 -19.901973 1 1 +172300 -0.000000 -19.901973 1 1 +172400 -0.000000 -19.901973 1 1 +172500 -0.000000 -19.901973 1 1 +172600 -0.000000 -19.901973 1 1 +172700 -0.000000 -19.901973 1 1 +172800 -0.000000 -19.901973 1 1 +172900 -0.000000 -19.901973 1 1 +173000 -0.000000 -19.901973 1 1 +173100 -0.000000 -19.901973 1 1 +173200 -0.000000 -19.901973 1 1 +173300 -0.000000 -19.901973 1 1 +173400 -0.000000 -19.901973 1 1 +173500 -0.000000 -19.901973 1 1 +173600 -0.000000 -19.901973 1 1 +173700 -0.000000 -19.901973 1 1 +173800 -0.000000 -19.901973 1 1 +173900 -0.000000 -19.901973 1 1 +174000 -0.000000 -19.901973 1 1 +174100 -0.000000 -19.901973 1 1 +174200 -0.000000 -19.901973 1 1 +174300 -0.000000 -19.901973 1 1 +174400 -0.000000 -19.901973 1 1 +174500 -0.000000 -19.901973 1 1 +174600 -0.000000 -19.901973 1 1 +174700 -0.000000 -19.901973 1 1 +174800 -0.000000 -19.901973 1 1 +174900 -0.000000 -19.901973 1 1 +175000 -0.000000 -19.901973 1 1 +175100 -0.000000 -19.901973 1 1 +175200 -0.000000 -19.901973 1 1 +175300 -0.000000 -19.901973 1 1 +175400 -0.000000 -19.901973 1 1 +175500 -0.000000 -19.901973 1 1 +175600 -0.000000 -19.901973 1 1 +175700 -0.000000 -19.901973 1 1 +175800 -0.000000 -19.901973 1 1 +175900 -0.000000 -19.901973 1 1 +176000 -0.000000 -19.901973 1 1 +176100 -0.000000 -19.901973 1 1 +176200 -0.000000 -19.901973 1 1 +176300 -0.000000 -19.901973 1 1 +176400 -0.000000 -19.901973 1 1 +176500 -0.000000 -19.901973 1 1 +176600 -0.000000 -19.901973 1 1 +176700 -0.000000 -19.901973 1 1 +176800 -0.000000 -19.901973 1 1 +176900 -0.000000 -19.901973 1 1 +177000 -0.000000 -19.901973 1 1 +177100 -0.000000 -19.901973 1 1 +177200 -0.000000 -19.901973 1 1 +177300 -0.000000 -19.901973 1 1 +177400 -0.000000 -19.901973 1 1 +177500 -0.000000 -19.901973 1 1 +177600 -0.000000 -19.901973 1 1 +177700 -0.000000 -19.901973 1 1 +177800 -0.000000 -19.901973 1 1 +177900 -0.000000 -19.901973 1 1 +178000 -0.000000 -19.901973 1 1 +178100 -0.000000 -19.901973 1 1 +178200 -0.000000 -19.901973 1 1 +178300 -0.000000 -19.901973 1 1 +178400 -0.000000 -19.901973 1 1 +178500 -0.000000 -19.901973 1 1 +178600 -0.000000 -19.901973 1 1 +178700 -0.000000 -19.901973 1 1 +178800 -0.000000 -19.901973 1 1 +178900 -0.000000 -19.901973 1 1 +179000 -0.000000 -19.901973 1 1 +179100 -0.000000 -19.901973 1 1 +179200 -0.000000 -19.901973 1 1 +179300 -0.000000 -19.901973 1 1 +179400 -0.000000 -19.901973 1 1 +179500 -0.000000 -19.901973 1 1 +179600 -0.000000 -19.901973 1 1 +179700 -0.000000 -19.901973 1 1 +179800 -0.000000 -19.901973 1 1 +179900 -0.000000 -19.901973 1 1 +180000 0.008322 -19.901973 1 1 +180100 0.142612 -19.901951 1 1 +180200 0.373754 -19.899831 1 1 +180300 0.654620 -19.888488 1 1 +180400 0.961016 -19.859949 1 1 +180500 1.280519 -19.807897 1 1 +180600 1.606752 -19.727947 1 1 +180700 1.936439 -19.617262 1 1 +180800 2.267901 -19.474083 1 1 +180900 2.600273 -19.297355 1 1 +181000 2.933113 -19.086455 1 1 +181100 3.266193 -18.841024 1 1 +181200 3.603558 -18.560854 1 1 +181300 4.003969 -18.245820 1 1 +181400 4.452839 -17.894818 1 1 +181500 4.926588 -17.504248 1 1 +181600 5.413110 -17.070105 1 1 +181700 5.906191 -16.589219 1 1 +181800 6.402638 -16.059391 1 1 +181900 6.900814 -15.479199 1 1 +182000 7.387395 -14.847763 1 1 +182100 7.685478 -14.164586 1 1 +182200 7.838519 -13.432472 1 1 +182300 7.917093 -12.661925 1 1 +182400 7.957434 -11.864804 1 1 +182500 7.978146 -11.050526 1 1 +182600 7.988780 -10.225636 1 1 +182700 7.994239 -9.394370 1 1 +182800 7.997042 -8.559356 1 1 +182900 7.998482 -7.722174 1 1 +183000 7.999220 -6.883753 1 1 +183100 7.889427 -6.044631 1 1 +183200 7.455508 -5.205827 1 1 +183300 6.843460 -4.505387 1 1 +183400 6.139958 -3.707140 1 1 +183500 5.389501 -2.956739 1 1 +183600 4.614938 -2.267461 1 1 +183700 3.827997 -1.648222 1 1 +183800 3.034702 -1.104678 1 1 +183900 2.238145 -0.640286 1 1 +184000 1.439912 -0.257106 0 0 +184100 0.000000 -0.257106 0 0 +184200 0.000000 -0.257106 0 0 +184300 0.000000 -0.257106 0 0 +184400 0.000000 -0.257106 0 0 +184500 0.000000 -0.257106 0 0 +184600 0.000000 -0.257106 0 0 +184700 0.000000 -0.257106 0 0 +184800 0.000000 -0.257106 0 0 +184900 0.000000 -0.257106 0 0 +185000 0.000000 -0.257106 0 0 +185100 0.000000 -0.257106 0 0 +185200 0.000000 -0.257106 0 0 +185300 0.000000 -0.257106 0 0 +185400 0.000000 -0.257106 0 0 +185500 0.000000 -0.257106 0 0 +185600 0.000000 -0.257106 0 0 +185700 0.000000 -0.257106 0 0 +185800 0.000000 -0.257106 0 0 +185900 0.000000 -0.257106 0 0 +186000 0.000000 -0.257106 0 0 +186100 0.000000 -0.257106 0 0 +186200 0.000000 -0.257106 0 0 +186300 0.000000 -0.257106 0 0 +186400 0.000000 -0.257106 0 0 +186500 0.000000 -0.257106 0 0 +186600 0.000000 -0.257106 0 0 +186700 0.000000 -0.257106 0 0 +186800 0.000000 -0.257106 0 0 +186900 0.000000 -0.257106 0 0 +187000 0.000000 -0.257106 0 0 +187100 0.000000 -0.257106 0 0 +187200 0.000000 -0.257106 0 0 +187300 0.000000 -0.257106 0 0 +187400 0.000000 -0.257106 0 0 +187500 0.000000 -0.257106 0 0 +187600 0.000000 -0.257106 0 0 +187700 0.000000 -0.257106 0 0 +187800 0.000000 -0.257106 0 0 +187900 0.000000 -0.257106 0 0 +188000 0.000000 -0.257106 0 0 +188100 0.000000 -0.257106 0 0 +188200 0.000000 -0.257106 0 0 +188300 0.000000 -0.257106 0 0 +188400 0.000000 -0.257106 0 0 +188500 0.000000 -0.257106 0 0 +188600 0.000000 -0.257106 0 0 +188700 0.000000 -0.257106 0 0 +188800 0.000000 -0.257106 0 0 +188900 0.000000 -0.257106 0 0 +189000 0.000000 -0.257106 0 0 +189100 0.000000 -0.257106 0 0 +189200 0.000000 -0.257106 0 0 +189300 0.000000 -0.257106 0 0 +189400 0.000000 -0.257106 0 0 +189500 0.000000 -0.257106 0 0 +189600 0.000000 -0.257106 0 0 +189700 0.000000 -0.257106 0 0 +189800 0.000000 -0.257106 0 0 +189900 0.000000 -0.257106 0 0 +190000 0.000000 -0.257106 0 0 +190100 0.000000 -0.257106 0 0 +190200 0.000000 -0.257106 0 0 +190300 0.000000 -0.257106 0 0 +190400 0.000000 -0.257106 0 0 +190500 0.000000 -0.257106 0 0 +190600 0.000000 -0.257106 0 0 +190700 0.000000 -0.257106 0 0 +190800 0.000000 -0.257106 0 0 +190900 0.000000 -0.257106 0 0 +191000 0.000000 -0.257106 0 0 +191100 0.000000 -0.257106 0 0 +191200 0.000000 -0.257106 0 0 +191300 0.000000 -0.257106 0 0 +191400 0.000000 -0.257106 0 0 +191500 0.000000 -0.257106 0 0 +191600 0.000000 -0.257106 0 0 +191700 0.000000 -0.257106 0 0 +191800 0.000000 -0.257106 0 0 +191900 0.000000 -0.257106 0 0 +192000 0.000000 -0.257106 0 0 +192100 0.000000 -0.257106 0 0 +192200 0.000000 -0.257106 0 0 +192300 0.000000 -0.257106 0 0 +192400 0.000000 -0.257106 0 0 +192500 0.000000 -0.257106 0 0 +192600 0.000000 -0.257106 0 0 +192700 0.000000 -0.257106 0 0 +192800 0.000000 -0.257106 0 0 +192900 0.000000 -0.257106 0 0 +193000 0.000000 -0.257106 0 0 +193100 0.000000 -0.257106 0 0 +193200 0.000000 -0.257106 0 0 +193300 0.000000 -0.257106 0 0 +193400 0.000000 -0.257106 0 0 +193500 0.000000 -0.257106 0 0 +193600 0.000000 -0.257106 0 0 +193700 0.000000 -0.257106 0 0 +193800 0.000000 -0.257106 0 0 +193900 0.000000 -0.257106 0 0 +194000 0.000000 -0.257106 0 0 +194100 0.000000 -0.257106 0 0 +194200 0.000000 -0.257106 0 0 +194300 0.000000 -0.257106 0 0 +194400 0.000000 -0.257106 0 0 +194500 0.000000 -0.257106 0 0 +194600 0.000000 -0.257106 0 0 +194700 0.000000 -0.257106 0 0 +194800 0.000000 -0.257106 0 0 +194900 0.000000 -0.257106 0 0 +195000 0.000000 -0.257106 0 0 +195100 0.000000 -0.257106 0 0 +195200 0.000000 -0.257106 0 0 +195300 0.000000 -0.257106 0 0 +195400 0.000000 -0.257106 0 0 +195500 0.000000 -0.257106 0 0 +195600 0.000000 -0.257106 0 0 +195700 0.000000 -0.257106 0 0 +195800 0.000000 -0.257106 0 0 +195900 0.000000 -0.257106 0 0 +196000 0.000000 -0.257106 0 0 +196100 0.000000 -0.257106 0 0 +196200 0.000000 -0.257106 0 0 +196300 0.000000 -0.257106 0 0 +196400 0.000000 -0.257106 0 0 +196500 0.000000 -0.257106 0 0 +196600 0.000000 -0.257106 0 0 +196700 0.000000 -0.257106 0 0 +196800 0.000000 -0.257106 0 0 +196900 0.000000 -0.257106 0 0 +197000 0.000000 -0.257106 0 0 +197100 0.000000 -0.257106 0 0 +197200 0.000000 -0.257106 0 0 +197300 0.000000 -0.257106 0 0 +197400 0.000000 -0.257106 0 0 +197500 0.000000 -0.257106 0 0 +197600 0.000000 -0.257106 0 0 +197700 0.000000 -0.257106 0 0 +197800 0.000000 -0.257106 0 0 +197900 0.000000 -0.257106 0 0 +198000 0.000000 -0.257106 0 0 +198100 0.000000 -0.257106 0 0 +198200 0.000000 -0.257106 0 0 +198300 0.000000 -0.257106 0 0 +198400 0.000000 -0.257106 0 0 +198500 0.000000 -0.257106 0 0 +198600 0.000000 -0.257106 0 0 +198700 0.000000 -0.257106 0 0 +198800 0.000000 -0.257106 0 0 +198900 0.000000 -0.257106 0 0 +199000 0.000000 -0.257106 0 0 +199100 0.000000 -0.257106 0 0 +199200 0.000000 -0.257106 0 0 +199300 0.000000 -0.257106 0 0 +199400 0.000000 -0.257106 0 0 +199500 0.000000 -0.257106 0 0 +199600 0.000000 -0.257106 0 0 +199700 0.000000 -0.257106 0 0 +199800 0.000000 -0.257106 0 0 +199900 0.000000 -0.257106 0 0 diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/log2.csv frama-c-20150201+sodium+dfsg/tests/ICPC/log2.csv --- frama-c-20140301+neon+dfsg/tests/ICPC/log2.csv 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/log2.csv 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,1801 @@ +time(ms) engineVoltage legAngle legAngleValid isActive +0 0.000000 0.000000 0 0 +100 0.411826 20.000000 0 1 +200 1.170165 20.004280 0 1 +300 2.055977 20.032919 0 1 +400 2.988685 20.108681 0 1 +500 3.938645 20.247947 0 1 +600 4.894952 20.460853 0 1 +700 5.853593 20.753238 0 1 +800 6.813093 21.128333 0 1 +900 7.552936 21.587885 0 1 +1000 7.835534 22.131372 0 1 +1100 7.939496 22.744290 0 1 +1200 7.977742 23.403258 0 1 +1300 7.991812 24.089695 0 1 +1400 7.996988 24.791644 0 1 +1500 3.432157 25.427003 1 1 +1600 0.764123 26.089170 1 1 +1700 -0.554523 26.549963 1 1 +1800 -1.396928 26.805427 1 1 +1900 -2.086103 26.903047 1 1 +2000 -2.718909 26.884362 1 1 +2100 -3.330978 26.776405 1 1 +2200 -4.157296 26.595131 1 1 +2300 -5.304109 26.347760 1 1 +2400 -6.568825 26.025989 1 1 +2500 -7.473500 25.614495 1 1 +2600 -7.806312 25.104228 1 1 +2700 -7.928746 24.635923 1 1 +2800 -7.973787 23.988289 1 1 +2900 -7.990357 23.308066 1 1 +3000 -7.996452 22.609454 1 1 +3100 -7.998695 21.900789 1 1 +3200 -7.999520 21.186740 1 1 +3300 -7.999823 20.469843 1 1 +3400 -7.999935 19.751454 1 1 +3500 -7.999976 19.032287 1 1 +3600 -7.999991 18.312717 1 1 +3700 -7.999997 17.592939 1 1 +3800 -7.999999 16.873054 1 1 +3900 -8.000000 16.153112 1 1 +4000 -8.000000 15.433142 1 1 +4100 -8.000000 14.713158 1 1 +4200 -8.000000 13.993166 1 1 +4300 -8.000000 13.273170 1 1 +4400 -8.000000 12.553172 1 1 +4500 -8.000000 11.833173 1 1 +4600 -8.000000 11.113174 1 1 +4700 -8.000000 10.393174 1 1 +4800 -8.000000 9.673174 1 1 +4900 -8.000000 8.953174 1 1 +5000 -8.000000 8.233174 1 1 +5100 -8.000000 7.513174 1 1 +5200 -8.000000 6.793174 1 1 +5300 -8.000000 6.073174 1 1 +5400 -8.000000 5.353174 1 1 +5500 -8.000000 4.633174 1 1 +5600 -8.000000 3.913174 1 1 +5700 -8.000000 3.193174 1 1 +5800 -8.000000 2.473174 1 1 +5900 -7.863747 1.753174 1 1 +6000 -7.040763 1.033684 1 1 +6100 -5.895177 0.329046 1 1 +6200 -4.705851 -0.328364 1 1 +6300 -3.850568 -0.910328 1 1 +6400 -3.156654 -1.405735 1 1 +6500 -2.522105 -1.821029 1 1 +6600 -1.916208 -2.165458 1 1 +6700 -1.352682 -2.445982 1 1 +6800 -0.808241 -2.667683 1 1 +6900 0.396579 -2.834716 1 1 +7000 1.157286 -2.944553 1 1 +7100 1.437135 -2.975180 1 1 +7200 1.540085 -2.937133 1 1 +7300 1.577959 -2.853527 1 1 +7400 1.591891 -2.742740 1 1 +7500 1.597017 -2.616604 1 1 +7600 1.598903 -2.482074 1 1 +7700 1.599596 -2.343046 1 1 +7800 1.599851 -2.201639 1 1 +7900 1.599945 -2.058985 1 1 +8000 1.599980 -1.915682 1 1 +8100 1.599993 -1.772041 1 1 +8200 1.599997 -1.628227 1 1 +8300 1.599999 -1.484322 1 1 +8400 1.600000 -1.340371 1 1 +8500 1.600000 -1.196396 1 1 +8600 1.600000 -1.052409 1 1 +8700 1.600000 -0.908416 1 1 +8800 1.600000 -0.764419 1 1 +8900 1.600000 -0.620421 1 1 +9000 1.600000 -0.476422 1 1 +9100 1.600000 -0.332423 1 1 +9200 1.600000 -0.188423 1 1 +9300 1.072512 -0.044423 1 1 +9400 0.394555 0.097170 1 1 +9500 -0.866244 0.208881 1 1 +9600 -1.330066 0.264027 1 1 +9700 -1.500697 0.249284 1 1 +9800 -1.563468 0.181583 1 1 +9900 -1.296530 0.080413 1 1 +10000 -0.476967 -0.039602 1 1 +10100 0.546435 -0.146910 1 1 +10200 1.212415 -0.213998 1 1 +10300 1.457415 -0.217158 1 1 +10400 1.547546 -0.162981 1 1 +10500 1.053215 -0.070347 1 1 +10600 0.387456 0.042943 1 1 +10700 -0.579364 0.139413 1 1 +10800 -1.224529 0.197640 1 1 +10900 -1.461872 0.195040 1 1 +11000 -1.549186 0.137459 1 1 +11100 -0.859405 0.042913 1 1 +11200 -0.316157 -0.068260 1 1 +11300 0.764766 -0.156976 1 1 +11400 1.292735 -0.203853 1 1 +11500 1.486963 -0.188600 1 1 +11600 1.558416 -0.122013 1 1 +11700 0.703628 -0.021919 1 1 +11800 0.258850 0.087699 1 1 +11900 -0.916167 0.169881 1 1 +12000 -1.348432 0.204870 1 1 +12100 -1.507453 0.177941 1 1 +12200 -1.565954 0.103307 1 1 +12300 -0.576082 -0.001672 1 1 +12400 0.078102 -0.107651 1 1 +12500 1.040125 -0.182618 1 1 +12600 1.394033 -0.205027 1 1 +12700 1.524229 -0.167075 1 1 +12800 1.282095 -0.085104 1 1 +12900 0.471656 0.023608 1 1 +13000 -0.353975 0.124582 1 1 +13100 -1.141613 0.191380 1 1 +13200 -1.431369 0.201011 1 1 +13300 -1.537964 0.152762 1 1 +13400 -1.049690 0.064130 1 1 +13500 -0.386159 -0.046752 1 1 +13600 0.579841 -0.141857 1 1 +13700 1.224705 -0.199335 1 1 +13800 1.461937 -0.196332 1 1 +13900 1.549209 -0.138538 1 1 +14000 0.859414 -0.043881 1 1 +14100 0.316161 0.067351 1 1 +14200 -0.764765 0.156096 1 1 +14300 -1.292734 0.202989 1 1 +14400 -1.486963 0.187745 1 1 +14500 -1.558416 0.121161 1 1 +14600 -0.703628 0.021069 1 1 +14700 -0.258850 -0.088547 1 1 +14800 0.916167 -0.170729 1 1 +14900 1.348432 -0.205718 1 1 +15000 1.507453 -0.178788 1 1 +15100 1.565954 -0.104154 1 1 +15200 0.576082 0.000825 1 1 +15300 -0.078102 0.106804 1 1 +15400 -1.040125 0.181771 1 1 +15500 -1.394033 0.204180 1 1 +15600 -1.524229 0.166228 1 1 +15700 -1.282095 0.084257 1 1 +15800 -0.471656 -0.024455 1 1 +15900 0.353975 -0.125429 1 1 +16000 1.141613 -0.192227 1 1 +16100 1.431369 -0.201858 1 1 +16200 1.537964 -0.153609 1 1 +16300 1.049690 -0.064977 1 1 +16400 0.386159 0.045905 1 1 +16500 -0.579841 0.141010 1 1 +16600 -1.224705 0.198488 1 1 +16700 -1.461937 0.195485 1 1 +16800 -1.549209 0.137691 1 1 +16900 -0.859414 0.043034 1 1 +17000 -0.316161 -0.068198 1 1 +17100 0.764765 -0.156944 1 1 +17200 1.292734 -0.203836 1 1 +17300 1.486963 -0.188592 1 1 +17400 1.558416 -0.122008 1 1 +17500 0.703628 -0.021916 1 1 +17600 0.258850 0.087700 1 1 +17700 -0.916167 0.169882 1 1 +17800 -1.348432 0.204871 1 1 +17900 -1.507453 0.177941 1 1 +18000 -1.565954 0.103307 1 1 +18100 -0.576082 -0.001672 1 1 +18200 0.078102 -0.107651 1 1 +18300 1.040125 -0.182618 1 1 +18400 1.394033 -0.205027 1 1 +18500 1.524229 -0.167075 1 1 +18600 1.282095 -0.085104 1 1 +18700 0.471656 0.023608 1 1 +18800 -0.353975 0.124582 1 1 +18900 -1.141613 0.191380 1 1 +19000 -1.431369 0.201011 1 1 +19100 -1.537964 0.152762 1 1 +19200 -1.049690 0.064130 1 1 +19300 -0.386159 -0.046752 1 1 +19400 0.579841 -0.141857 1 1 +19500 1.224705 -0.199335 1 1 +19600 1.461937 -0.196332 1 1 +19700 1.549209 -0.138538 1 1 +19800 0.859414 -0.043881 1 1 +19900 0.316161 0.067351 1 1 +20000 -0.764765 0.156096 1 1 +20100 -1.292734 0.202989 1 1 +20200 -1.486963 0.187745 1 1 +20300 -1.558416 0.121161 1 1 +20400 -0.703628 0.021069 1 1 +20500 -0.258850 -0.088547 1 1 +20600 0.916167 -0.170729 1 1 +20700 1.348432 -0.205718 1 1 +20800 1.507453 -0.178788 1 1 +20900 1.565954 -0.104154 1 1 +21000 0.576082 0.000825 1 1 +21100 -0.078102 0.106804 1 1 +21200 -1.040125 0.181771 1 1 +21300 -1.394033 0.204180 1 1 +21400 -1.524229 0.166228 1 1 +21500 -1.282095 0.084257 1 1 +21600 -0.471656 -0.024455 1 1 +21700 0.353975 -0.125429 1 1 +21800 1.141613 -0.192227 1 1 +21900 1.431369 -0.201858 1 1 +22000 1.537964 -0.153609 1 1 +22100 1.049690 -0.064977 1 1 +22200 0.386159 0.045905 1 1 +22300 -0.579841 0.141010 1 1 +22400 -1.224705 0.198488 1 1 +22500 -1.461937 0.195485 1 1 +22600 -1.549209 0.137691 1 1 +22700 -0.859414 0.043034 1 1 +22800 -0.316161 -0.068198 1 1 +22900 0.764765 -0.156944 1 1 +23000 1.292734 -0.203836 1 1 +23100 1.486963 -0.188592 1 1 +23200 1.558416 -0.122008 1 1 +23300 0.703628 -0.021916 1 1 +23400 0.258850 0.087700 1 1 +23500 -0.916167 0.169882 1 1 +23600 -1.348432 0.204871 1 1 +23700 -1.507453 0.177941 1 1 +23800 -1.565954 0.103307 1 1 +23900 -0.576082 -0.001672 1 1 +24000 0.078102 -0.107651 1 1 +24100 1.040125 -0.182618 1 1 +24200 1.394033 -0.205027 1 1 +24300 1.524229 -0.167075 1 1 +24400 1.282095 -0.085104 1 1 +24500 0.471656 0.023608 1 1 +24600 -0.353975 0.124582 1 1 +24700 -1.141613 0.191380 1 1 +24800 -1.431369 0.201011 1 1 +24900 -1.537964 0.152762 1 1 +25000 -1.049690 0.064130 1 1 +25100 -0.386159 -0.046752 1 1 +25200 0.579841 -0.141857 1 1 +25300 1.224705 -0.199335 1 1 +25400 1.461937 -0.196332 1 1 +25500 1.549209 -0.138538 1 1 +25600 0.859414 -0.043881 1 1 +25700 0.316161 0.067351 1 1 +25800 -0.764765 0.156096 1 1 +25900 -1.292734 0.202989 1 1 +26000 -1.486963 0.187745 1 1 +26100 -1.558416 0.121161 1 1 +26200 -0.703628 0.021069 1 1 +26300 -0.258850 -0.088547 1 1 +26400 0.916167 -0.170729 1 1 +26500 1.348432 -0.205718 1 1 +26600 1.507453 -0.178788 1 1 +26700 1.565954 -0.104154 1 1 +26800 0.576082 0.000825 1 1 +26900 -0.078102 0.106804 1 1 +27000 -1.040125 0.181771 1 1 +27100 -1.394033 0.204180 1 1 +27200 -1.524229 0.166228 1 1 +27300 -1.282095 0.084257 1 1 +27400 -0.471656 -0.024455 1 1 +27500 0.353975 -0.125429 1 1 +27600 1.141613 -0.192227 1 1 +27700 1.431369 -0.201858 1 1 +27800 1.537964 -0.153609 1 1 +27900 1.049690 -0.064977 1 1 +28000 0.386159 0.045905 1 1 +28100 -0.579841 0.141010 1 1 +28200 -1.224705 0.198488 1 1 +28300 -1.461937 0.195485 1 1 +28400 -1.549209 0.137691 1 1 +28500 -0.859414 0.043034 1 1 +28600 -0.316161 -0.068198 1 1 +28700 0.764765 -0.156944 1 1 +28800 1.292734 -0.203836 1 1 +28900 1.486963 -0.188592 1 1 +29000 1.558416 -0.122008 1 1 +29100 0.703628 -0.021916 1 1 +29200 0.258850 0.087700 1 1 +29300 -0.916167 0.169882 1 1 +29400 -1.348432 0.204871 1 1 +29500 -1.507453 0.177941 1 1 +29600 -1.565954 0.103307 1 1 +29700 -0.576082 -0.001672 1 1 +29800 0.078102 -0.107651 1 1 +29900 1.040125 -0.182618 1 1 +30000 1.394033 -0.205027 1 1 +30100 1.524229 -0.167075 1 1 +30200 1.282095 -0.085104 1 1 +30300 0.471656 0.023608 1 1 +30400 -0.353975 0.124582 1 1 +30500 -1.141613 0.191380 1 1 +30600 -1.431369 0.201011 1 1 +30700 -1.537964 0.152762 1 1 +30800 -1.049690 0.064130 1 1 +30900 -0.386159 -0.046752 1 1 +31000 0.579841 -0.141857 1 1 +31100 1.224705 -0.199335 1 1 +31200 1.461937 -0.196332 1 1 +31300 1.549209 -0.138538 1 1 +31400 0.859414 -0.043881 1 1 +31500 0.316161 0.067351 1 1 +31600 -0.764765 0.156096 1 1 +31700 -1.292734 0.202989 1 1 +31800 -1.486963 0.187745 1 1 +31900 -1.558416 0.121161 1 1 +32000 -0.703628 0.021069 1 1 +32100 -0.258850 -0.088547 1 1 +32200 0.916167 -0.170729 1 1 +32300 1.348432 -0.205718 1 1 +32400 1.507453 -0.178788 1 1 +32500 1.565954 -0.104154 1 1 +32600 0.576082 0.000825 1 1 +32700 -0.078102 0.106804 1 1 +32800 -1.040125 0.181771 1 1 +32900 -1.394033 0.204180 1 1 +33000 -1.524229 0.166228 1 1 +33100 -1.282095 0.084257 1 1 +33200 -0.471656 -0.024455 1 1 +33300 0.353975 -0.125429 1 1 +33400 1.141613 -0.192227 1 1 +33500 1.431369 -0.201858 1 1 +33600 1.537964 -0.153609 1 1 +33700 1.049690 -0.064977 1 1 +33800 0.386159 0.045905 1 1 +33900 -0.579841 0.141010 1 1 +34000 -1.224705 0.198488 1 1 +34100 -1.461937 0.195485 1 1 +34200 -1.549209 0.137691 1 1 +34300 -0.859414 0.043034 1 1 +34400 -0.316161 -0.068198 1 1 +34500 0.764765 -0.156944 1 1 +34600 1.292734 -0.203836 1 1 +34700 1.486963 -0.188592 1 1 +34800 1.558416 -0.122008 1 1 +34900 0.703628 -0.021916 1 1 +35000 0.258850 0.087700 1 1 +35100 -0.916167 0.169882 1 1 +35200 -1.348432 0.204871 1 1 +35300 -1.507453 0.177941 1 1 +35400 -1.565954 0.103307 1 1 +35500 -0.576082 -0.001672 1 1 +35600 0.078102 -0.107651 1 1 +35700 1.040125 -0.182618 1 1 +35800 1.394033 -0.205027 1 1 +35900 1.524229 -0.167075 1 1 +36000 1.282095 -0.085104 1 1 +36100 0.471656 0.023608 1 1 +36200 -0.353975 0.124582 1 1 +36300 -1.141613 0.191380 1 1 +36400 -1.431369 0.201011 1 1 +36500 -1.537964 0.152762 1 1 +36600 -1.049690 0.064130 1 1 +36700 -0.386159 -0.046752 1 1 +36800 0.579841 -0.141857 1 1 +36900 1.224705 -0.199335 1 1 +37000 1.461937 -0.196332 1 1 +37100 1.549209 -0.138538 1 1 +37200 0.859414 -0.043881 1 1 +37300 0.316161 0.067351 1 1 +37400 -0.764765 0.156096 1 1 +37500 -1.292734 0.202989 1 1 +37600 -1.486963 0.187745 1 1 +37700 -1.558416 0.121161 1 1 +37800 -0.703628 0.021069 1 1 +37900 -0.258850 -0.088547 1 1 +38000 0.916167 -0.170729 1 1 +38100 1.348432 -0.205718 1 1 +38200 1.507453 -0.178788 1 1 +38300 1.565954 -0.104154 1 1 +38400 0.576082 0.000825 1 1 +38500 -0.078102 0.106804 1 1 +38600 -1.040125 0.181771 1 1 +38700 -1.394033 0.204180 1 1 +38800 -1.524229 0.166228 1 1 +38900 -1.282095 0.084257 1 1 +39000 -0.471656 -0.024455 1 1 +39100 0.353975 -0.125429 1 1 +39200 1.141613 -0.192227 1 1 +39300 1.431369 -0.201858 1 1 +39400 1.537964 -0.153609 1 1 +39500 1.049690 -0.064977 1 1 +39600 0.386159 0.045905 1 1 +39700 -0.579841 0.141010 1 1 +39800 -1.224705 0.198488 1 1 +39900 -1.461937 0.195485 1 1 +40000 -1.549209 0.137691 1 1 +40100 -0.859414 0.043034 1 1 +40200 -0.316161 -0.068198 1 1 +40300 0.764765 -0.156944 1 1 +40400 1.292734 -0.203836 1 1 +40500 1.486963 -0.188592 1 1 +40600 1.558416 -0.122008 1 1 +40700 0.703628 -0.021916 1 1 +40800 0.258850 0.087700 1 1 +40900 -0.916167 0.169882 1 1 +41000 -1.348432 0.204871 1 1 +41100 -1.507453 0.177941 1 1 +41200 -1.565954 0.103307 1 1 +41300 -0.576082 -0.001672 1 1 +41400 0.078102 -0.107651 1 1 +41500 1.040125 -0.182618 1 1 +41600 1.394033 -0.205027 1 1 +41700 1.524229 -0.167075 1 1 +41800 1.282095 -0.085104 1 1 +41900 0.471656 0.023608 1 1 +42000 -0.353975 0.124582 1 1 +42100 -1.141613 0.191380 1 1 +42200 -1.431369 0.201011 1 1 +42300 -1.537964 0.152762 1 1 +42400 -1.049690 0.064130 1 1 +42500 -0.386159 -0.046752 1 1 +42600 0.579841 -0.141857 1 1 +42700 1.224705 -0.199335 1 1 +42800 1.461937 -0.196332 1 1 +42900 1.549209 -0.138538 1 1 +43000 0.859414 -0.043881 1 1 +43100 0.316161 0.067351 1 1 +43200 -0.764765 0.156096 1 1 +43300 -1.292734 0.202989 1 1 +43400 -1.486963 0.187745 1 1 +43500 -1.558416 0.121161 1 1 +43600 -0.703628 0.021069 1 1 +43700 -0.258850 -0.088547 1 1 +43800 0.916167 -0.170729 1 1 +43900 1.348432 -0.205718 1 1 +44000 1.507453 -0.178788 1 1 +44100 1.565954 -0.104154 1 1 +44200 0.576082 0.000825 1 1 +44300 -0.078102 0.106804 1 1 +44400 -1.040125 0.181771 1 1 +44500 -1.394033 0.204180 1 1 +44600 -1.524229 0.166228 1 1 +44700 -1.282095 0.084257 1 1 +44800 -0.471656 -0.024455 1 1 +44900 0.353975 -0.125429 1 1 +45000 1.141613 -0.192227 1 1 +45100 1.431369 -0.201858 1 1 +45200 1.537964 -0.153609 1 1 +45300 1.049690 -0.064977 1 1 +45400 0.386159 0.045905 1 1 +45500 -0.579841 0.141010 1 1 +45600 -1.224705 0.198488 1 1 +45700 -1.461937 0.195485 1 1 +45800 -1.549209 0.137691 1 1 +45900 -0.859414 0.043034 1 1 +46000 -0.316161 -0.068198 1 1 +46100 0.764765 -0.156944 1 1 +46200 1.292734 -0.203836 1 1 +46300 1.486963 -0.188592 1 1 +46400 1.558416 -0.122008 1 1 +46500 0.703628 -0.021916 1 1 +46600 0.258850 0.087700 1 1 +46700 -0.916167 0.169882 1 1 +46800 -1.348432 0.204871 1 1 +46900 -1.507453 0.177941 1 1 +47000 -1.565954 0.103307 1 1 +47100 -0.576082 -0.001672 1 1 +47200 0.078102 -0.107651 1 1 +47300 1.040125 -0.182618 1 1 +47400 1.394033 -0.205027 1 1 +47500 1.524229 -0.167075 1 1 +47600 1.282095 -0.085104 1 1 +47700 0.471656 0.023608 1 1 +47800 -0.353975 0.124582 1 1 +47900 -1.141613 0.191380 1 1 +48000 -1.431369 0.201011 1 1 +48100 -1.537964 0.152762 1 1 +48200 -1.049690 0.064130 1 1 +48300 -0.386159 -0.046752 1 1 +48400 0.579841 -0.141857 1 1 +48500 1.224705 -0.199335 1 1 +48600 1.461937 -0.196332 1 1 +48700 1.549209 -0.138538 1 1 +48800 0.859414 -0.043881 1 1 +48900 0.316161 0.067351 1 1 +49000 -0.764765 0.156096 1 1 +49100 -1.292734 0.202989 1 1 +49200 -1.486963 0.187745 1 1 +49300 -1.558416 0.121161 1 1 +49400 -0.703628 0.021069 1 1 +49500 -0.258850 -0.088547 1 1 +49600 0.916167 -0.170729 1 1 +49700 1.348432 -0.205718 1 1 +49800 1.507453 -0.178788 1 1 +49900 1.565954 -0.104154 1 1 +50000 0.576082 0.000825 1 1 +50100 -0.078102 0.106804 1 1 +50200 -1.040125 0.181771 1 1 +50300 -1.394033 0.204180 1 1 +50400 -1.524229 0.166228 1 1 +50500 -1.282095 0.084257 1 1 +50600 -0.471656 -0.024455 1 1 +50700 0.353975 -0.125429 1 1 +50800 1.141613 -0.192227 1 1 +50900 1.431369 -0.201858 1 1 +51000 1.537964 -0.153609 1 1 +51100 1.049690 -0.064977 1 1 +51200 0.386159 0.045905 1 1 +51300 -0.579841 0.141010 1 1 +51400 -1.224705 0.198488 1 1 +51500 -1.461937 0.195485 1 1 +51600 -1.549209 0.137691 1 1 +51700 -0.859414 0.043034 1 1 +51800 -0.316161 -0.068198 1 1 +51900 0.764765 -0.156944 1 1 +52000 1.292734 -0.203836 1 1 +52100 1.486963 -0.188592 1 1 +52200 1.558416 -0.122008 1 1 +52300 0.703628 -0.021916 1 1 +52400 0.258850 0.087700 1 1 +52500 -0.916167 0.169882 1 1 +52600 -1.348432 0.204871 1 1 +52700 -1.507453 0.177941 1 1 +52800 -1.565954 0.103307 1 1 +52900 -0.576082 -0.001672 1 1 +53000 0.078102 -0.107651 1 1 +53100 1.040125 -0.182618 1 1 +53200 1.394033 -0.205027 1 1 +53300 1.524229 -0.167075 1 1 +53400 1.282095 -0.085104 1 1 +53500 0.471656 0.023608 1 1 +53600 -0.353975 0.124582 1 1 +53700 -1.141613 0.191380 1 1 +53800 -1.431369 0.201011 1 1 +53900 -1.537964 0.152762 1 1 +54000 -1.049690 0.064130 1 1 +54100 -0.386159 -0.046752 1 1 +54200 0.579841 -0.141857 1 1 +54300 1.224705 -0.199335 1 1 +54400 1.461937 -0.196332 1 1 +54500 1.549209 -0.138538 1 1 +54600 0.859414 -0.043881 1 1 +54700 0.316161 0.067351 1 1 +54800 -0.764765 0.156096 1 1 +54900 -1.292734 0.202989 1 1 +55000 -1.486963 0.187745 1 1 +55100 -1.558416 0.121161 1 1 +55200 -0.703628 0.021069 1 1 +55300 -0.258850 -0.088547 1 1 +55400 0.916167 -0.170729 1 1 +55500 1.348432 -0.205718 1 1 +55600 1.507453 -0.178788 1 1 +55700 1.565954 -0.104154 1 1 +55800 0.576082 0.000825 1 1 +55900 -0.078102 0.106804 1 1 +56000 -1.040125 0.181771 1 1 +56100 -1.394033 0.204180 1 1 +56200 -1.524229 0.166228 1 1 +56300 -1.282095 0.084257 1 1 +56400 -0.471656 -0.024455 1 1 +56500 0.353975 -0.125429 1 1 +56600 1.141613 -0.192227 1 1 +56700 1.431369 -0.201858 1 1 +56800 1.537964 -0.153609 1 1 +56900 1.049690 -0.064977 1 1 +57000 0.386159 0.045905 1 1 +57100 -0.579841 0.141010 1 1 +57200 -1.224705 0.198488 1 1 +57300 -1.461937 0.195485 1 1 +57400 -1.549209 0.137691 1 1 +57500 -0.859414 0.043034 1 1 +57600 -0.316161 -0.068198 1 1 +57700 0.764765 -0.156944 1 1 +57800 1.292734 -0.203836 1 1 +57900 1.486963 -0.188592 1 1 +58000 1.558416 -0.122008 1 1 +58100 0.703628 -0.021916 1 1 +58200 0.258850 0.087700 1 1 +58300 -0.916167 0.169882 1 1 +58400 -1.348432 0.204871 1 1 +58500 -1.507453 0.177941 1 1 +58600 -1.565954 0.103307 1 1 +58700 -0.576082 -0.001672 1 1 +58800 0.078102 -0.107651 1 1 +58900 1.040125 -0.182618 1 1 +59000 1.394033 -0.205027 1 1 +59100 1.524229 -0.167075 1 1 +59200 1.282095 -0.085104 1 1 +59300 0.471656 0.023608 1 1 +59400 -0.353975 0.124582 1 1 +59500 -1.141613 0.191380 1 1 +59600 -1.431369 0.201011 1 1 +59700 -1.537964 0.152762 1 1 +59800 -1.049690 0.064130 1 1 +59900 -0.386159 -0.046752 1 1 +60000 0.270475 -0.141857 1 1 +60100 -0.196716 -0.200030 1 1 +60200 -0.705718 -0.225236 1 1 +60300 -1.232516 -0.252431 1 1 +60400 -1.798056 -0.303112 1 1 +60500 -2.385379 -0.389369 1 1 +60600 -2.980715 -0.518902 1 1 +60700 -3.605586 -0.696462 1 1 +60800 -4.595450 -0.924844 1 1 +60900 -5.802428 -1.210930 1 1 +61000 -7.040939 -1.572430 1 1 +61100 -7.647181 -2.026280 1 1 +61200 -7.870205 -2.574406 1 1 +61300 -7.952251 -3.193174 1 1 +61400 -7.982434 -3.856422 1 1 +61500 -7.993538 -4.545527 1 1 +61600 -7.997623 -5.249018 1 1 +61700 -7.999125 -5.960304 1 1 +61800 -7.999678 -6.675743 1 1 +61900 -7.999882 -7.393369 1 1 +62000 -7.999956 -8.112138 1 1 +62100 -7.999984 -8.831502 1 1 +62200 -7.999994 -9.551174 1 1 +62300 -7.999998 -10.271005 1 1 +62400 -7.999999 -10.990918 1 1 +62500 -8.000000 -11.710873 1 1 +62600 -8.000000 -12.430850 1 1 +62700 -8.000000 -13.150838 1 1 +62800 -8.000000 -13.870832 1 1 +62900 -8.000000 -14.590829 1 1 +63000 -8.000000 -15.310827 1 1 +63100 -8.000000 -16.030826 1 1 +63200 -8.000000 -16.750826 1 1 +63300 -8.000000 -17.470826 1 1 +63400 -8.000000 -18.190826 1 1 +63500 -8.000000 -18.910826 1 1 +63600 -8.000000 -19.630826 1 1 +63700 -8.000000 -20.350826 1 1 +63800 -8.000000 -21.070826 1 1 +63900 -8.000000 -21.790826 1 1 +64000 -8.000000 -22.510826 1 1 +64100 -8.000000 -23.230826 1 1 +64200 -8.000000 -23.950826 1 1 +64300 -8.000000 -24.670826 1 1 +64400 -7.863747 -25.390826 1 1 +64500 -7.040763 -26.110316 1 1 +64600 -5.895177 -26.814954 1 1 +64700 -4.705851 -27.472364 1 1 +64800 -3.850568 -28.054328 1 1 +64900 -3.156654 -28.549735 1 1 +65000 -2.522105 -28.965029 1 1 +65100 -1.916208 -29.309458 1 1 +65200 -1.352682 -29.589982 1 1 +65300 -0.808241 -29.811683 1 1 +65400 -0.325323 -29.978716 1 1 +65500 -0.119679 -30.094119 1 1 +65600 0.967365 -30.165345 1 1 +65700 1.367267 -30.189586 1 1 +65800 1.514382 -30.155253 1 1 +65900 1.041015 -30.076126 1 1 +66000 0.382968 -29.970991 1 1 +66100 -0.386602 -29.879158 1 1 +66200 -1.153616 -29.820318 1 1 +66300 -1.435784 -29.815974 1 1 +66400 -1.539588 -29.867380 1 1 +66500 -0.855874 -29.957794 1 1 +66600 -0.314859 -30.066494 1 1 +66700 0.765244 -30.153809 1 1 +66800 1.292910 -30.199919 1 1 +66900 1.487028 -30.184255 1 1 +67000 1.558440 -30.117450 1 1 +67100 0.573318 -30.017242 1 1 +67200 0.210912 -29.913989 1 1 +67300 -0.933803 -29.839872 1 1 +67400 -1.354920 -29.810788 1 1 +67500 -1.509840 -29.841399 1 1 +67600 -1.276801 -29.918161 1 1 +67700 -0.469709 -30.023669 1 1 +67800 0.354692 -30.122804 1 1 +67900 1.141877 -30.188586 1 1 +68000 1.431466 -30.197668 1 1 +68100 1.538000 -30.149128 1 1 +68200 0.855290 -30.060343 1 1 +68300 0.314644 -29.952539 1 1 +68400 -0.606150 -29.865705 1 1 +68500 -1.234383 -29.815105 1 1 +68600 -1.465497 -29.822608 1 1 +68700 -1.550519 -29.883069 1 1 +68800 -0.700723 -29.979227 1 1 +68900 -0.257782 -30.086533 1 1 +69000 0.916560 -30.167421 1 1 +69100 1.348577 -30.201707 1 1 +69200 1.507506 -30.174401 1 1 +69300 1.275943 -30.099570 1 1 +69400 0.469393 -29.995139 1 1 +69500 -0.117351 -29.896589 1 1 +69600 -1.054564 -29.829363 1 1 +69700 -1.399345 -29.812373 1 1 +69800 -1.526183 -29.853639 1 1 +69900 -1.045356 -29.937507 1 1 +70000 -0.384565 -30.045510 1 1 +70100 0.580428 -30.138976 1 1 +70200 1.224920 -30.195554 1 1 +70300 1.462016 -30.192068 1 1 +70400 1.549238 -30.134018 1 1 +70500 0.700252 -30.039226 1 1 +70600 0.257608 -29.932668 1 1 +70700 -0.786305 -29.852181 1 1 +70800 -1.300658 -29.811684 1 1 +70900 -1.489878 -29.831005 1 1 +71000 -1.559489 -29.899974 1 1 +71100 -0.573704 -30.001397 1 1 +71200 0.078977 -30.105313 1 1 +71300 1.040447 -30.179133 1 1 +71400 1.394152 -30.200921 1 1 +71500 1.524273 -30.162638 1 1 +71600 1.044654 -30.080493 1 1 +71700 0.384307 -29.973446 1 1 +71800 -0.386109 -29.880496 1 1 +71900 -1.153435 -29.821033 1 1 +72000 -1.435718 -29.816352 1 1 +72100 -1.539564 -29.867577 1 1 +72200 -0.855865 -29.957898 1 1 +72300 -0.314855 -30.066547 1 1 +72400 0.765245 -30.153836 1 1 +72500 1.292911 -30.199934 1 1 +72600 1.487028 -30.184263 1 1 +72700 1.558440 -30.117454 1 1 +72800 0.573318 -30.017244 1 1 +72900 0.210912 -29.913990 1 1 +73000 -0.933803 -29.839872 1 1 +73100 -1.354920 -29.810788 1 1 +73200 -1.509840 -29.841399 1 1 +73300 -1.276801 -29.918161 1 1 +73400 -0.469709 -30.023669 1 1 +73500 0.354692 -30.122804 1 1 +73600 1.141877 -30.188586 1 1 +73700 1.431466 -30.197668 1 1 +73800 1.538000 -30.149128 1 1 +73900 0.855290 -30.060343 1 1 +74000 0.314644 -29.952539 1 1 +74100 -0.606150 -29.865705 1 1 +74200 -1.234383 -29.815105 1 1 +74300 -1.465497 -29.822608 1 1 +74400 -1.550519 -29.883069 1 1 +74500 -0.700723 -29.979227 1 1 +74600 -0.257782 -30.086533 1 1 +74700 0.916560 -30.167421 1 1 +74800 1.348577 -30.201707 1 1 +74900 1.507506 -30.174401 1 1 +75000 1.275943 -30.099570 1 1 +75100 0.469393 -29.995139 1 1 +75200 -0.117351 -29.896589 1 1 +75300 -1.054564 -29.829363 1 1 +75400 -1.399345 -29.812373 1 1 +75500 -1.526183 -29.853639 1 1 +75600 -1.045356 -29.937507 1 1 +75700 -0.384565 -30.045510 1 1 +75800 0.580428 -30.138976 1 1 +75900 1.224920 -30.195554 1 1 +76000 1.462016 -30.192068 1 1 +76100 1.549238 -30.134018 1 1 +76200 0.700252 -30.039226 1 1 +76300 0.257608 -29.932668 1 1 +76400 -0.786305 -29.852181 1 1 +76500 -1.300658 -29.811684 1 1 +76600 -1.489878 -29.831005 1 1 +76700 -1.559489 -29.899974 1 1 +76800 -0.573704 -30.001397 1 1 +76900 0.078977 -30.105313 1 1 +77000 1.040447 -30.179133 1 1 +77100 1.394152 -30.200921 1 1 +77200 1.524273 -30.162638 1 1 +77300 1.044654 -30.080493 1 1 +77400 0.384307 -29.973446 1 1 +77500 -0.386109 -29.880496 1 1 +77600 -1.153435 -29.821033 1 1 +77700 -1.435718 -29.816352 1 1 +77800 -1.539564 -29.867577 1 1 +77900 -0.855865 -29.957898 1 1 +78000 -0.314855 -30.066547 1 1 +78100 0.765245 -30.153836 1 1 +78200 1.292911 -30.199934 1 1 +78300 1.487028 -30.184263 1 1 +78400 1.558440 -30.117454 1 1 +78500 0.573318 -30.017244 1 1 +78600 0.210912 -29.913990 1 1 +78700 -0.933803 -29.839872 1 1 +78800 -1.354920 -29.810788 1 1 +78900 -1.509840 -29.841399 1 1 +79000 -1.276801 -29.918161 1 1 +79100 -0.469709 -30.023669 1 1 +79200 0.354692 -30.122804 1 1 +79300 1.141877 -30.188586 1 1 +79400 1.431466 -30.197668 1 1 +79500 1.538000 -30.149128 1 1 +79600 0.855290 -30.060343 1 1 +79700 0.314644 -29.952539 1 1 +79800 -0.606150 -29.865705 1 1 +79900 -1.234383 -29.815105 1 1 +80000 -1.465497 -29.822608 1 1 +80100 -1.550519 -29.883069 1 1 +80200 -0.700723 -29.979227 1 1 +80300 -0.257782 -30.086533 1 1 +80400 0.916560 -30.167421 1 1 +80500 1.348577 -30.201707 1 1 +80600 1.507506 -30.174401 1 1 +80700 1.275943 -30.099570 1 1 +80800 0.469393 -29.995139 1 1 +80900 -0.117351 -29.896589 1 1 +81000 -1.054564 -29.829363 1 1 +81100 -1.399345 -29.812373 1 1 +81200 -1.526183 -29.853639 1 1 +81300 -1.045356 -29.937507 1 1 +81400 -0.384565 -30.045510 1 1 +81500 0.580428 -30.138976 1 1 +81600 1.224920 -30.195554 1 1 +81700 1.462016 -30.192068 1 1 +81800 1.549238 -30.134018 1 1 +81900 0.700252 -30.039226 1 1 +82000 0.257608 -29.932668 1 1 +82100 -0.786305 -29.852181 1 1 +82200 -1.300658 -29.811684 1 1 +82300 -1.489878 -29.831005 1 1 +82400 -1.559489 -29.899974 1 1 +82500 -0.573704 -30.001397 1 1 +82600 0.078977 -30.105313 1 1 +82700 1.040447 -30.179133 1 1 +82800 1.394152 -30.200921 1 1 +82900 1.524273 -30.162638 1 1 +83000 1.044654 -30.080493 1 1 +83100 0.384307 -29.973446 1 1 +83200 -0.386109 -29.880496 1 1 +83300 -1.153435 -29.821033 1 1 +83400 -1.435718 -29.816352 1 1 +83500 -1.539564 -29.867577 1 1 +83600 -0.855865 -29.957898 1 1 +83700 -0.314855 -30.066547 1 1 +83800 0.765245 -30.153836 1 1 +83900 1.292911 -30.199934 1 1 +84000 1.487028 -30.184263 1 1 +84100 1.558440 -30.117454 1 1 +84200 0.573318 -30.017244 1 1 +84300 0.210912 -29.913990 1 1 +84400 -0.933803 -29.839872 1 1 +84500 -1.354920 -29.810788 1 1 +84600 -1.509840 -29.841399 1 1 +84700 -1.276801 -29.918161 1 1 +84800 -0.469709 -30.023669 1 1 +84900 0.354692 -30.122804 1 1 +85000 1.141877 -30.188586 1 1 +85100 1.431466 -30.197668 1 1 +85200 1.538000 -30.149128 1 1 +85300 0.855290 -30.060343 1 1 +85400 0.314644 -29.952539 1 1 +85500 -0.606150 -29.865705 1 1 +85600 -1.234383 -29.815105 1 1 +85700 -1.465497 -29.822608 1 1 +85800 -1.550519 -29.883069 1 1 +85900 -0.700723 -29.979227 1 1 +86000 -0.257782 -30.086533 1 1 +86100 0.916560 -30.167421 1 1 +86200 1.348577 -30.201707 1 1 +86300 1.507506 -30.174401 1 1 +86400 1.275943 -30.099570 1 1 +86500 0.469393 -29.995139 1 1 +86600 -0.117351 -29.896589 1 1 +86700 -1.054564 -29.829363 1 1 +86800 -1.399345 -29.812373 1 1 +86900 -1.526183 -29.853639 1 1 +87000 -1.045356 -29.937507 1 1 +87100 -0.384565 -30.045510 1 1 +87200 0.580428 -30.138976 1 1 +87300 1.224920 -30.195554 1 1 +87400 1.462016 -30.192068 1 1 +87500 1.549238 -30.134018 1 1 +87600 0.700252 -30.039226 1 1 +87700 0.257608 -29.932668 1 1 +87800 -0.786305 -29.852181 1 1 +87900 -1.300658 -29.811684 1 1 +88000 -1.489878 -29.831005 1 1 +88100 -1.559489 -29.899974 1 1 +88200 -0.573704 -30.001397 1 1 +88300 0.078977 -30.105313 1 1 +88400 1.040447 -30.179133 1 1 +88500 1.394152 -30.200921 1 1 +88600 1.524273 -30.162638 1 1 +88700 1.044654 -30.080493 1 1 +88800 0.384307 -29.973446 1 1 +88900 -0.386109 -29.880496 1 1 +89000 -1.153435 -29.821033 1 1 +89100 -1.435718 -29.816352 1 1 +89200 -1.539564 -29.867577 1 1 +89300 -0.855865 -29.957898 1 1 +89400 -0.314855 -30.066547 1 1 +89500 0.765245 -30.153836 1 1 +89600 1.292911 -30.199934 1 1 +89700 1.487028 -30.184263 1 1 +89800 1.558440 -30.117454 1 1 +89900 0.573318 -30.017244 1 1 +90000 0.210912 -29.913990 1 1 +90100 -0.933803 -29.839872 1 1 +90200 -1.354920 -29.810788 1 1 +90300 -1.509840 -29.841399 1 1 +90400 -1.276801 -29.918161 1 1 +90500 -0.469709 -30.023669 1 1 +90600 0.354692 -30.122804 1 1 +90700 1.141877 -30.188586 1 1 +90800 1.431466 -30.197668 1 1 +90900 1.538000 -30.149128 1 1 +91000 0.855290 -30.060343 1 1 +91100 0.314644 -29.952539 1 1 +91200 -0.606150 -29.865705 1 1 +91300 -1.234383 -29.815105 1 1 +91400 -1.465497 -29.822608 1 1 +91500 -1.550519 -29.883069 1 1 +91600 -0.700723 -29.979227 1 1 +91700 -0.257782 -30.086533 1 1 +91800 0.916560 -30.167421 1 1 +91900 1.348577 -30.201707 1 1 +92000 1.507506 -30.174401 1 1 +92100 1.275943 -30.099570 1 1 +92200 0.469393 -29.995139 1 1 +92300 -0.117351 -29.896589 1 1 +92400 -1.054564 -29.829363 1 1 +92500 -1.399345 -29.812373 1 1 +92600 -1.526183 -29.853639 1 1 +92700 -1.045356 -29.937507 1 1 +92800 -0.384565 -30.045510 1 1 +92900 0.580428 -30.138976 1 1 +93000 1.224920 -30.195554 1 1 +93100 1.462016 -30.192068 1 1 +93200 1.549238 -30.134018 1 1 +93300 0.700252 -30.039226 1 1 +93400 0.257608 -29.932668 1 1 +93500 -0.786305 -29.852181 1 1 +93600 -1.300658 -29.811684 1 1 +93700 -1.489878 -29.831005 1 1 +93800 -1.559489 -29.899974 1 1 +93900 -0.573704 -30.001397 1 1 +94000 0.078977 -30.105313 1 1 +94100 1.040447 -30.179133 1 1 +94200 1.394152 -30.200921 1 1 +94300 1.524273 -30.162638 1 1 +94400 1.044654 -30.080493 1 1 +94500 0.384307 -29.973446 1 1 +94600 -0.386109 -29.880496 1 1 +94700 -1.153435 -29.821033 1 1 +94800 -1.435718 -29.816352 1 1 +94900 -1.539564 -29.867577 1 1 +95000 -0.855865 -29.957898 1 1 +95100 -0.314855 -30.066547 1 1 +95200 0.765245 -30.153836 1 1 +95300 1.292911 -30.199934 1 1 +95400 1.487028 -30.184263 1 1 +95500 1.558440 -30.117454 1 1 +95600 0.573318 -30.017244 1 1 +95700 0.210912 -29.913990 1 1 +95800 -0.933803 -29.839872 1 1 +95900 -1.354920 -29.810788 1 1 +96000 -1.509840 -29.841399 1 1 +96100 -1.276801 -29.918161 1 1 +96200 -0.469709 -30.023669 1 1 +96300 0.354692 -30.122804 1 1 +96400 1.141877 -30.188586 1 1 +96500 1.431466 -30.197668 1 1 +96600 1.538000 -30.149128 1 1 +96700 0.855290 -30.060343 1 1 +96800 0.314644 -29.952539 1 1 +96900 -0.606150 -29.865705 1 1 +97000 -1.234383 -29.815105 1 1 +97100 -1.465497 -29.822608 1 1 +97200 -1.550519 -29.883069 1 1 +97300 -0.700723 -29.979227 1 1 +97400 -0.257782 -30.086533 1 1 +97500 0.916560 -30.167421 1 1 +97600 1.348577 -30.201707 1 1 +97700 1.507506 -30.174401 1 1 +97800 1.275943 -30.099570 1 1 +97900 0.469393 -29.995139 1 1 +98000 -0.117351 -29.896589 1 1 +98100 -1.054564 -29.829363 1 1 +98200 -1.399345 -29.812373 1 1 +98300 -1.526183 -29.853639 1 1 +98400 -1.045356 -29.937507 1 1 +98500 -0.384565 -30.045510 1 1 +98600 0.580428 -30.138976 1 1 +98700 1.224920 -30.195554 1 1 +98800 1.462016 -30.192068 1 1 +98900 1.549238 -30.134018 1 1 +99000 0.700252 -30.039226 1 1 +99100 0.257608 -29.932668 1 1 +99200 -0.786305 -29.852181 1 1 +99300 -1.300658 -29.811684 1 1 +99400 -1.489878 -29.831005 1 1 +99500 -1.559489 -29.899974 1 1 +99600 -0.573704 -30.001397 1 1 +99700 0.078977 -30.105313 1 1 +99800 1.040447 -30.179133 1 1 +99900 1.394152 -30.200921 1 1 +100000 1.253577 -30.162638 1 1 +100100 0.757384 -30.081102 1 1 +100200 0.911976 -29.991871 1 1 +100300 1.308395 -29.911165 1 1 +100400 1.825970 -29.825417 1 1 +100500 2.395648 -29.718363 1 1 +100600 2.984493 -29.577125 1 1 +100700 3.606976 -29.393177 1 1 +100800 4.595961 -29.161377 1 1 +100900 5.802616 -28.873485 1 1 +101000 7.041008 -28.511038 1 1 +101100 7.647207 -28.056695 1 1 +101200 7.870215 -27.508314 1 1 +101300 7.952255 -26.889413 1 1 +101400 7.982435 -26.226097 1 1 +101500 7.993538 -25.536957 1 1 +101600 7.997623 -24.833448 1 1 +101700 7.999126 -24.122152 1 1 +101800 7.999678 -23.406709 1 1 +101900 7.999882 -22.689081 1 1 +102000 7.999956 -21.970310 1 1 +102100 7.999984 -21.250946 1 1 +102200 7.999994 -20.531274 1 1 +102300 7.999998 -19.811442 1 1 +102400 7.999999 -19.091529 1 1 +102500 8.000000 -18.371574 1 1 +102600 8.000000 -17.651597 1 1 +102700 8.000000 -16.931609 1 1 +102800 8.000000 -16.211615 1 1 +102900 8.000000 -15.491618 1 1 +103000 8.000000 -14.771620 1 1 +103100 8.000000 -14.051621 1 1 +103200 8.000000 -13.331621 1 1 +103300 8.000000 -12.611621 1 1 +103400 8.000000 -11.891621 1 1 +103500 8.000000 -11.171621 1 1 +103600 8.000000 -10.451621 1 1 +103700 8.000000 -9.731621 1 1 +103800 8.000000 -9.011621 1 1 +103900 8.000000 -8.291621 1 1 +104000 8.000000 -7.571621 1 1 +104100 8.000000 -6.851621 1 1 +104200 8.000000 -6.131621 1 1 +104300 8.000000 -5.411621 1 1 +104400 8.000000 -4.691621 1 1 +104500 8.000000 -3.971621 1 1 +104600 8.000000 -3.251621 1 1 +104700 8.000000 -2.531621 1 1 +104800 8.000000 -1.811621 1 1 +104900 8.000000 -1.091621 1 1 +105000 8.000000 -0.371621 1 1 +105100 8.000000 0.348379 1 1 +105200 8.000000 1.068379 1 1 +105300 8.000000 1.788379 1 1 +105400 8.000000 2.508379 1 1 +105500 8.000000 3.228379 1 1 +105600 8.000000 3.948379 1 1 +105700 8.000000 4.668379 1 1 +105800 8.000000 5.388379 1 1 +105900 8.000000 6.108379 1 1 +106000 8.000000 6.828379 1 1 +106100 8.000000 7.548379 1 1 +106200 8.000000 8.268379 1 1 +106300 8.000000 8.988379 1 1 +106400 8.000000 9.708379 1 1 +106500 8.000000 10.428379 1 1 +106600 8.000000 11.148379 1 1 +106700 8.000000 11.868379 1 1 +106800 8.000000 12.588379 1 1 +106900 8.000000 13.308379 1 1 +107000 8.000000 14.028379 1 1 +107100 8.000000 14.748379 1 1 +107200 8.000000 15.468379 1 1 +107300 8.000000 16.188379 1 1 +107400 8.000000 16.908379 1 1 +107500 8.000000 17.628379 1 1 +107600 8.000000 18.348379 1 1 +107700 8.000000 19.068379 1 1 +107800 8.000000 19.788379 1 1 +107900 8.000000 20.508379 1 1 +108000 8.000000 21.228379 1 1 +108100 8.000000 21.948379 1 1 +108200 8.000000 22.668379 1 1 +108300 8.000000 23.388379 1 1 +108400 8.000000 24.108379 1 1 +108500 8.000000 24.828379 1 1 +108600 7.863747 25.432000 1 1 +108700 7.040763 26.151490 1 1 +108800 5.895177 26.856128 1 1 +108900 4.705851 27.513538 1 1 +109000 3.850568 28.095503 1 1 +109100 3.156654 28.590910 1 1 +109200 2.522105 29.006203 1 1 +109300 1.916208 29.350632 1 1 +109400 1.352682 29.631157 1 1 +109500 0.808241 29.852858 1 1 +109600 0.325323 30.019890 1 1 +109700 -0.407808 30.135293 1 1 +109800 -1.161417 30.204112 1 1 +109900 -1.438654 30.212799 1 1 +110000 -1.540644 30.163336 1 1 +110100 -1.050676 30.073813 1 1 +110200 -0.386522 29.962374 1 1 +110300 0.385294 29.866948 1 1 +110400 1.153135 29.806133 1 1 +110500 1.435607 29.800727 1 1 +110600 1.539523 29.851569 1 1 +110700 0.855851 29.941689 1 1 +110800 0.314850 30.050233 1 1 +110900 -0.606075 30.137469 1 1 +111000 -1.234355 30.188282 1 1 +111100 -1.465487 30.180891 1 1 +111200 -1.550515 30.120490 1 1 +111300 -0.700722 30.024362 1 1 +111400 -0.257781 29.917072 1 1 +111500 0.916560 29.836192 1 1 +111600 1.348577 29.801910 1 1 +111700 1.507507 29.829218 1 1 +111800 1.275943 29.904050 1 1 +111900 0.469393 30.008482 1 1 +112000 -0.117351 30.107033 1 1 +112100 -1.054564 30.174258 1 1 +112200 -1.399345 30.191248 1 1 +112300 -1.526183 30.149982 1 1 +112400 -1.045356 30.066114 1 1 +112500 -0.384565 29.958112 1 1 +112600 0.580428 29.864646 1 1 +112700 1.224920 29.808067 1 1 +112800 1.462016 29.811553 1 1 +112900 1.549238 29.869603 1 1 +113000 0.700252 29.964395 1 1 +113100 0.257608 30.070953 1 1 +113200 -0.786305 30.151440 1 1 +113300 -1.300658 30.191937 1 1 +113400 -1.489878 30.172616 1 1 +113500 -1.559489 30.103648 1 1 +113600 -0.573704 30.002224 1 1 +113700 0.078977 29.898309 1 1 +113800 1.040447 29.824489 1 1 +113900 1.394152 29.802700 1 1 +114000 1.524273 29.840983 1 1 +114100 1.044654 29.923128 1 1 +114200 0.384307 30.030176 1 1 +114300 -0.386109 30.123126 1 1 +114400 -1.153435 30.182588 1 1 +114500 -1.435718 30.187269 1 1 +114600 -1.539564 30.136044 1 1 +114700 -0.855865 30.045724 1 1 +114800 -0.314855 29.937074 1 1 +114900 0.765245 29.849785 1 1 +115000 1.292911 29.803688 1 1 +115100 1.487028 29.819359 1 1 +115200 1.558440 29.886168 1 1 +115300 0.573318 29.986378 1 1 +115400 0.210912 30.089631 1 1 +115500 -0.933803 30.163749 1 1 +115600 -1.354920 30.192833 1 1 +115700 -1.509840 30.162222 1 1 +115800 -1.276801 30.085461 1 1 +115900 -0.469709 29.979952 1 1 +116000 0.354692 29.880818 1 1 +116100 1.141877 29.815036 1 1 +116200 1.431466 29.805954 1 1 +116300 1.538000 29.854494 1 1 +116400 0.855290 29.943279 1 1 +116500 0.314644 30.051083 1 1 +116600 -0.606150 30.137917 1 1 +116700 -1.234383 30.188516 1 1 +116800 -1.465497 30.181013 1 1 +116900 -1.550519 30.120553 1 1 +117000 -0.700723 30.024395 1 1 +117100 -0.257782 29.917089 1 1 +117200 0.916560 29.836200 1 1 +117300 1.348577 29.801915 1 1 +117400 1.507506 29.829220 1 1 +117500 1.275943 29.904052 1 1 +117600 0.469393 30.008483 1 1 +117700 -0.117351 30.107033 1 1 +117800 -1.054564 30.174258 1 1 +117900 -1.399345 30.191248 1 1 +118000 -1.526183 30.149982 1 1 +118100 -1.045356 30.066114 1 1 +118200 -0.384565 29.958112 1 1 +118300 0.580428 29.864646 1 1 +118400 1.224920 29.808067 1 1 +118500 1.462016 29.811553 1 1 +118600 1.549238 29.869603 1 1 +118700 0.700252 29.964395 1 1 +118800 0.257608 30.070953 1 1 +118900 -0.786305 30.151440 1 1 +119000 -1.300658 30.191937 1 1 +119100 -1.489878 30.172616 1 1 +119200 -1.559489 30.103648 1 1 +119300 -0.573704 30.002224 1 1 +119400 0.078977 29.898309 1 1 +119500 1.040447 29.824489 1 1 +119600 1.394152 29.802700 1 1 +119700 1.524273 29.840983 1 1 +119800 1.044654 29.923128 1 1 +119900 0.384307 30.030176 1 1 +120000 -0.386109 30.123126 1 1 +120100 -1.153435 30.182588 1 1 +120200 -1.435718 30.187269 1 1 +120300 -1.539564 30.136044 1 1 +120400 -0.855865 30.045724 1 1 +120500 -0.314855 29.937074 1 1 +120600 0.765245 29.849785 1 1 +120700 1.292911 29.803688 1 1 +120800 1.487028 29.819359 1 1 +120900 1.558440 29.886168 1 1 +121000 0.573318 29.986378 1 1 +121100 0.210912 30.089631 1 1 +121200 -0.933803 30.163749 1 1 +121300 -1.354920 30.192833 1 1 +121400 -1.509840 30.162222 1 1 +121500 -1.276801 30.085461 1 1 +121600 -0.469709 29.979952 1 1 +121700 0.354692 29.880818 1 1 +121800 1.141877 29.815036 1 1 +121900 1.431466 29.805954 1 1 +122000 1.538000 29.854494 1 1 +122100 0.855290 29.943279 1 1 +122200 0.314644 30.051083 1 1 +122300 -0.606150 30.137917 1 1 +122400 -1.234383 30.188516 1 1 +122500 -1.465497 30.181013 1 1 +122600 -1.550519 30.120553 1 1 +122700 -0.700723 30.024395 1 1 +122800 -0.257782 29.917089 1 1 +122900 0.916560 29.836200 1 1 +123000 1.348577 29.801915 1 1 +123100 1.507506 29.829220 1 1 +123200 1.275943 29.904052 1 1 +123300 0.469393 30.008483 1 1 +123400 -0.117351 30.107033 1 1 +123500 -1.054564 30.174258 1 1 +123600 -1.399345 30.191248 1 1 +123700 -1.526183 30.149982 1 1 +123800 -1.045356 30.066114 1 1 +123900 -0.384565 29.958112 1 1 +124000 0.580428 29.864646 1 1 +124100 1.224920 29.808067 1 1 +124200 1.462016 29.811553 1 1 +124300 1.549238 29.869603 1 1 +124400 0.700252 29.964395 1 1 +124500 0.257608 30.070953 1 1 +124600 -0.786305 30.151440 1 1 +124700 -1.300658 30.191937 1 1 +124800 -1.489878 30.172616 1 1 +124900 -1.559489 30.103648 1 1 +125000 -0.573704 30.002224 1 1 +125100 0.078977 29.898309 1 1 +125200 1.040447 29.824489 1 1 +125300 1.394152 29.802700 1 1 +125400 1.524273 29.840983 1 1 +125500 1.044654 29.923128 1 1 +125600 0.384307 30.030176 1 1 +125700 -0.386109 30.123126 1 1 +125800 -1.153435 30.182588 1 1 +125900 -1.435718 30.187269 1 1 +126000 -1.539564 30.136044 1 1 +126100 -0.855865 30.045724 1 1 +126200 -0.314855 29.937074 1 1 +126300 0.765245 29.849785 1 1 +126400 1.292911 29.803688 1 1 +126500 1.487028 29.819359 1 1 +126600 1.558440 29.886168 1 1 +126700 0.573318 29.986378 1 1 +126800 0.210912 30.089631 1 1 +126900 -0.933803 30.163749 1 1 +127000 -1.354920 30.192833 1 1 +127100 -1.509840 30.162222 1 1 +127200 -1.276801 30.085461 1 1 +127300 -0.469709 29.979952 1 1 +127400 0.354692 29.880818 1 1 +127500 1.141877 29.815036 1 1 +127600 1.431466 29.805954 1 1 +127700 1.538000 29.854494 1 1 +127800 0.855290 29.943279 1 1 +127900 0.314644 30.051083 1 1 +128000 -0.606150 30.137917 1 1 +128100 -1.234383 30.188516 1 1 +128200 -1.465497 30.181013 1 1 +128300 -1.550519 30.120553 1 1 +128400 -0.700723 30.024395 1 1 +128500 -0.257782 29.917089 1 1 +128600 0.916560 29.836200 1 1 +128700 1.348577 29.801915 1 1 +128800 1.507506 29.829220 1 1 +128900 1.275943 29.904052 1 1 +129000 0.469393 30.008483 1 1 +129100 -0.117351 30.107033 1 1 +129200 -1.054564 30.174258 1 1 +129300 -1.399345 30.191248 1 1 +129400 -1.526183 30.149982 1 1 +129500 -1.045356 30.066114 1 1 +129600 -0.384565 29.958112 1 1 +129700 0.580428 29.864646 1 1 +129800 1.224920 29.808067 1 1 +129900 1.462016 29.811553 1 1 +130000 1.549238 29.869603 1 1 +130100 0.700252 29.964395 1 1 +130200 0.257608 30.070953 1 1 +130300 -0.786305 30.151440 1 1 +130400 -1.300658 30.191937 1 1 +130500 -1.489878 30.172616 1 1 +130600 -1.559489 30.103648 1 1 +130700 -0.573704 30.002224 1 1 +130800 0.078977 29.898309 1 1 +130900 1.040447 29.824489 1 1 +131000 1.394152 29.802700 1 1 +131100 1.524273 29.840983 1 1 +131200 1.044654 29.923128 1 1 +131300 0.384307 30.030176 1 1 +131400 -0.386109 30.123126 1 1 +131500 -1.153435 30.182588 1 1 +131600 -1.435718 30.187269 1 1 +131700 -1.539564 30.136044 1 1 +131800 -0.855865 30.045724 1 1 +131900 -0.314855 29.937074 1 1 +132000 0.765245 29.849785 1 1 +132100 1.292911 29.803688 1 1 +132200 1.487028 29.819359 1 1 +132300 1.558440 29.886168 1 1 +132400 0.573318 29.986378 1 1 +132500 0.210912 30.089631 1 1 +132600 -0.933803 30.163749 1 1 +132700 -1.354920 30.192833 1 1 +132800 -1.509840 30.162222 1 1 +132900 -1.276801 30.085461 1 1 +133000 -0.469709 29.979952 1 1 +133100 0.354692 29.880818 1 1 +133200 1.141877 29.815036 1 1 +133300 1.431466 29.805954 1 1 +133400 1.538000 29.854494 1 1 +133500 0.855290 29.943279 1 1 +133600 0.314644 30.051083 1 1 +133700 -0.606150 30.137917 1 1 +133800 -1.234383 30.188516 1 1 +133900 -1.465497 30.181013 1 1 +134000 -1.550519 30.120553 1 1 +134100 -0.700723 30.024395 1 1 +134200 -0.257782 29.917089 1 1 +134300 0.916560 29.836200 1 1 +134400 1.348577 29.801915 1 1 +134500 1.507506 29.829220 1 1 +134600 1.275943 29.904052 1 1 +134700 0.469393 30.008483 1 1 +134800 -0.117351 30.107033 1 1 +134900 -1.054564 30.174258 1 1 +135000 -1.399345 30.191248 1 1 +135100 -1.526183 30.149982 1 1 +135200 -1.045356 30.066114 1 1 +135300 -0.384565 29.958112 1 1 +135400 0.580428 29.864646 1 1 +135500 1.224920 29.808067 1 1 +135600 1.462016 29.811553 1 1 +135700 1.549238 29.869603 1 1 +135800 0.700252 29.964395 1 1 +135900 0.257608 30.070953 1 1 +136000 -0.786305 30.151440 1 1 +136100 -1.300658 30.191937 1 1 +136200 -1.489878 30.172616 1 1 +136300 -1.559489 30.103648 1 1 +136400 -0.573704 30.002224 1 1 +136500 0.078977 29.898309 1 1 +136600 1.040447 29.824489 1 1 +136700 1.394152 29.802700 1 1 +136800 1.524273 29.840983 1 1 +136900 1.044654 29.923128 1 1 +137000 0.384307 30.030176 1 1 +137100 -0.386109 30.123126 1 1 +137200 -1.153435 30.182588 1 1 +137300 -1.435718 30.187269 1 1 +137400 -1.539564 30.136044 1 1 +137500 -0.855865 30.045724 1 1 +137600 -0.314855 29.937074 1 1 +137700 0.765245 29.849785 1 1 +137800 1.292911 29.803688 1 1 +137900 1.487028 29.819359 1 1 +138000 1.558440 29.886168 1 1 +138100 0.573318 29.986378 1 1 +138200 0.210912 30.089631 1 1 +138300 -0.933803 30.163749 1 1 +138400 -1.354920 30.192833 1 1 +138500 -1.509840 30.162222 1 1 +138600 -1.276801 30.085461 1 1 +138700 -0.469709 29.979952 1 1 +138800 0.354692 29.880818 1 1 +138900 1.141877 29.815036 1 1 +139000 1.431466 29.805954 1 1 +139100 1.538000 29.854494 1 1 +139200 0.855290 29.943279 1 1 +139300 0.314644 30.051083 1 1 +139400 -0.606150 30.137917 1 1 +139500 -1.234383 30.188516 1 1 +139600 -1.465497 30.181013 1 1 +139700 -1.550519 30.120553 1 1 +139800 -0.700723 30.024395 1 1 +139900 -0.257782 29.917089 1 1 +140000 0.607194 29.836200 1 1 +140100 -0.072844 29.801219 1 1 +140200 -0.660148 29.800316 1 1 +140300 -1.215752 29.790160 1 1 +140400 -1.791889 29.749903 1 1 +140500 -2.383110 29.669616 1 1 +140600 -2.979881 29.543375 1 1 +140700 -3.605279 29.367588 1 1 +140800 -4.595337 29.140148 1 1 +140900 -5.802386 28.854556 1 1 +141000 -7.040924 28.493314 1 1 +141100 -7.647176 28.039598 1 1 +141200 -7.870203 27.491542 1 1 +141300 -7.952250 26.872809 1 1 +141400 -7.982434 26.209580 1 1 +141500 -7.993538 25.520484 1 1 +141600 -7.997623 25.000000 1 1 +141700 -7.999125 24.288716 1 1 +141800 -7.999678 23.573279 1 1 +141900 -7.999882 22.855654 1 1 +142000 -7.999956 22.136885 1 1 +142100 -7.999984 21.417521 1 1 +142200 -7.999994 20.697849 1 1 +142300 -7.999998 19.978019 1 1 +142400 -7.999999 19.258106 1 1 +142500 -8.000000 18.538150 1 1 +142600 -8.000000 17.818174 1 1 +142700 -8.000000 17.098185 1 1 +142800 -8.000000 16.378191 1 1 +142900 -8.000000 15.658195 1 1 +143000 -8.000000 14.938196 1 1 +143100 -8.000000 14.218197 1 1 +143200 -8.000000 13.498197 1 1 +143300 -8.000000 12.778198 1 1 +143400 -8.000000 12.058198 1 1 +143500 -8.000000 11.338198 1 1 +143600 -8.000000 10.618198 1 1 +143700 -8.000000 9.898198 1 1 +143800 -8.000000 9.178198 1 1 +143900 -8.000000 8.458198 1 1 +144000 -8.000000 7.738198 1 1 +144100 -8.000000 7.018198 1 1 +144200 -8.000000 6.298198 1 1 +144300 -8.000000 5.578198 1 1 +144400 -8.000000 4.858198 1 1 +144500 -8.000000 4.138198 1 1 +144600 -8.000000 3.418198 1 1 +144700 -8.000000 2.698198 1 1 +144800 -8.000000 1.978198 1 1 +144900 -8.000000 1.258198 1 1 +145000 -8.000000 0.538198 1 1 +145100 -8.000000 -0.181802 1 1 +145200 -8.000000 -0.901802 1 1 +145300 -8.000000 -1.621802 1 1 +145400 -8.000000 -2.341802 1 1 +145500 -8.000000 -3.061802 1 1 +145600 -8.000000 -3.781802 1 1 +145700 -8.000000 -4.501802 1 1 +145800 -8.000000 -5.221802 1 1 +145900 -7.428019 -5.941802 1 1 +146000 -6.374771 -6.655858 1 1 +146100 -5.144476 -7.336081 1 1 +146200 -4.163638 -7.950856 1 1 +146300 -3.423535 -8.480701 1 1 +146400 -2.771994 -8.926875 1 1 +146500 -2.153033 -9.298659 1 1 +146600 -1.574657 -9.604077 1 1 +146700 -1.024753 -9.848744 1 1 +146800 -0.485324 -10.037229 1 1 +146900 0.543361 -10.172902 1 1 +147000 1.211284 -10.254692 1 1 +147100 1.456999 -10.265515 1 1 +147200 1.547393 -10.215313 1 1 +147300 1.580647 -10.124735 1 1 +147400 0.711807 -10.010100 1 1 +147500 -0.028172 -9.892198 1 1 +147600 -1.021757 -9.806113 1 1 +147700 -1.387276 -9.776157 1 1 +147800 -1.521743 -9.809559 1 1 +147900 -1.571211 -9.888944 1 1 +148000 -0.578016 -9.996889 1 1 +148100 0.077391 -10.104585 1 1 +148200 1.039863 -10.180504 1 1 +148300 1.393937 -10.203429 1 1 +148400 1.524194 -10.165751 1 1 +148500 1.282082 -10.083925 1 1 +148600 0.471651 -9.975288 1 1 +148700 -0.353977 -9.874352 1 1 +148800 -1.141614 -9.807574 1 1 +148900 -1.431369 -9.797955 1 1 +149000 -1.537964 -9.846209 1 1 +149100 -1.049690 -9.934844 1 1 +149200 -0.386160 -10.045727 1 1 +149300 0.579841 -10.140832 1 1 +149400 1.224705 -10.198311 1 1 +149500 1.461937 -10.195309 1 1 +149600 1.549209 -10.137515 1 1 +149700 0.859414 -10.042857 1 1 +149800 0.316161 -9.931626 1 1 +149900 -0.764765 -9.842880 1 1 +150000 -1.292734 -9.795987 1 1 +150100 -1.486963 -9.811232 1 1 +150200 -1.558416 -9.877815 1 1 +150300 -0.703628 -9.977907 1 1 +150400 -0.258850 -10.087524 1 1 +150500 0.916167 -10.169705 1 1 +150600 1.348432 -10.204694 1 1 +150700 1.507453 -10.177764 1 1 +150800 1.565954 -10.103131 1 1 +150900 0.576082 -9.998152 1 1 +151000 -0.078102 -9.892173 1 1 +151100 -1.040125 -9.817206 1 1 +151200 -1.394033 -9.794796 1 1 +151300 -1.524229 -9.832748 1 1 +151400 -1.282095 -9.914719 1 1 +151500 -0.471656 -10.023431 1 1 +151600 0.353975 -10.124406 1 1 +151700 1.141613 -10.191204 1 1 +151800 1.431369 -10.200834 1 1 +151900 1.537964 -10.152585 1 1 +152000 1.049690 -10.063953 1 1 +152100 0.386159 -9.953071 1 1 +152200 -0.579841 -9.857967 1 1 +152300 -1.224705 -9.800489 1 1 +152400 -1.461937 -9.803491 1 1 +152500 -1.549209 -9.861285 1 1 +152600 -0.859414 -9.955943 1 1 +152700 -0.316161 -10.067174 1 1 +152800 0.764765 -10.155920 1 1 +152900 1.292734 -10.202813 1 1 +153000 1.486963 -10.187568 1 1 +153100 1.558416 -10.120985 1 1 +153200 0.703628 -10.020893 1 1 +153300 0.258850 -9.911276 1 1 +153400 -0.916167 -9.829095 1 1 +153500 -1.348432 -9.794106 1 1 +153600 -1.507453 -9.821036 1 1 +153700 -1.565954 -9.895669 1 1 +153800 -0.576082 -10.000648 1 1 +153900 0.078102 -10.106627 1 1 +154000 1.040125 -10.181594 1 1 +154100 1.394033 -10.204004 1 1 +154200 1.524229 -10.166052 1 1 +154300 1.282095 -10.084081 1 1 +154400 0.471656 -9.975369 1 1 +154500 -0.353975 -9.874394 1 1 +154600 -1.141613 -9.807596 1 1 +154700 -1.431369 -9.797966 1 1 +154800 -1.537964 -9.846215 1 1 +154900 -1.049690 -9.934847 1 1 +155000 -0.386159 -10.045729 1 1 +155100 0.579841 -10.140833 1 1 +155200 1.224705 -10.198311 1 1 +155300 1.461937 -10.195309 1 1 +155400 1.549209 -10.137515 1 1 +155500 0.859414 -10.042857 1 1 +155600 0.316161 -9.931626 1 1 +155700 -0.764765 -9.842880 1 1 +155800 -1.292734 -9.795987 1 1 +155900 -1.486963 -9.811232 1 1 +156000 -1.558416 -9.877815 1 1 +156100 -0.703628 -9.977907 1 1 +156200 -0.258850 -10.087524 1 1 +156300 0.916167 -10.169705 1 1 +156400 1.348432 -10.204694 1 1 +156500 1.507453 -10.177764 1 1 +156600 1.565954 -10.103131 1 1 +156700 0.576082 -9.998152 1 1 +156800 -0.078102 -9.892173 1 1 +156900 -1.040125 -9.817206 1 1 +157000 -1.394033 -9.794796 1 1 +157100 -1.524229 -9.832748 1 1 +157200 -1.282095 -9.914719 1 1 +157300 -0.471656 -10.023431 1 1 +157400 0.353975 -10.124406 1 1 +157500 1.141613 -10.191204 1 1 +157600 1.431369 -10.200834 1 1 +157700 1.537964 -10.152585 1 1 +157800 1.049690 -10.063953 1 1 +157900 0.386159 -9.953071 1 1 +158000 -0.579841 -9.857967 1 1 +158100 -1.224705 -9.800489 1 1 +158200 -1.461937 -9.803491 1 1 +158300 -1.549209 -9.861285 1 1 +158400 -0.859414 -9.955943 1 1 +158500 -0.316161 -10.067174 1 1 +158600 0.764765 -10.155920 1 1 +158700 1.292734 -10.202813 1 1 +158800 1.486963 -10.187568 1 1 +158900 1.558416 -10.120985 1 1 +159000 0.703628 -10.020893 1 1 +159100 0.258850 -9.911276 1 1 +159200 -0.916167 -9.829095 1 1 +159300 -1.348432 -9.794106 1 1 +159400 -1.507453 -9.821036 1 1 +159500 -1.565954 -9.895669 1 1 +159600 -0.576082 -10.000648 1 1 +159700 0.078102 -10.106627 1 1 +159800 1.040125 -10.181594 1 1 +159900 1.394033 -10.204004 1 1 +160000 1.524229 -10.166052 1 1 +160100 1.282095 -10.084081 1 1 +160200 0.471656 -9.975369 1 1 +160300 -0.353975 -9.874394 1 1 +160400 -1.141613 -9.807596 1 1 +160500 -1.431369 -9.797966 1 1 +160600 -1.537964 -9.846215 1 1 +160700 -1.049690 -9.934847 1 1 +160800 -0.386159 -10.045729 1 1 +160900 0.579841 -10.140833 1 1 +161000 1.224705 -10.198311 1 1 +161100 1.461937 -10.195309 1 1 +161200 1.549209 -10.137515 1 1 +161300 0.859414 -10.042857 1 1 +161400 0.316161 -9.931626 1 1 +161500 -0.764765 -9.842880 1 1 +161600 -1.292734 -9.795987 1 1 +161700 -1.486963 -9.811232 1 1 +161800 -1.558416 -9.877815 1 1 +161900 -0.703628 -9.977907 1 1 +162000 -0.258850 -10.087524 1 1 +162100 0.916167 -10.169705 1 1 +162200 1.348432 -10.204694 1 1 +162300 1.507453 -10.177764 1 1 +162400 1.565954 -10.103131 1 1 +162500 0.576082 -9.998152 1 1 +162600 -0.078102 -9.892173 1 1 +162700 -1.040125 -9.817206 1 1 +162800 -1.394033 -9.794796 1 1 +162900 -1.524229 -9.832748 1 1 +163000 -1.282095 -9.914719 1 1 +163100 -0.471656 -10.023431 1 1 +163200 0.353975 -10.124406 1 1 +163300 1.141613 -10.191204 1 1 +163400 1.431369 -10.200834 1 1 +163500 1.537964 -10.152585 1 1 +163600 1.049690 -10.063953 1 1 +163700 0.386159 -9.953071 1 1 +163800 -0.579841 -9.857967 1 1 +163900 -1.224705 -9.800489 1 1 +164000 -1.461937 -9.803491 1 1 +164100 -1.549209 -9.861285 1 1 +164200 -0.859414 -9.955943 1 1 +164300 -0.316161 -10.067174 1 1 +164400 0.764765 -10.155920 1 1 +164500 1.292734 -10.202813 1 1 +164600 1.486963 -10.187568 1 1 +164700 1.558416 -10.120985 1 1 +164800 0.703628 -10.020893 1 1 +164900 0.258850 -9.911276 1 1 +165000 -0.916167 -9.829095 1 1 +165100 -1.348432 -9.794106 1 1 +165200 -1.507453 -9.821036 1 1 +165300 -1.565954 -9.895669 1 1 +165400 -0.576082 -10.000648 1 1 +165500 0.078102 -10.106627 1 1 +165600 1.040125 -10.181594 1 1 +165700 1.394033 -10.204004 1 1 +165800 1.524229 -10.166052 1 1 +165900 1.282095 -10.084081 1 1 +166000 0.471656 -9.975369 1 1 +166100 -0.353975 -9.874394 1 1 +166200 -1.141613 -9.807596 1 1 +166300 -1.431369 -9.797966 1 1 +166400 -1.537964 -9.846215 1 1 +166500 -1.049690 -9.934847 1 1 +166600 -0.386159 -10.045729 1 1 +166700 0.579841 -10.140833 1 1 +166800 1.224705 -10.198311 1 1 +166900 1.461937 -10.195309 1 1 +167000 1.549209 -10.137515 1 1 +167100 0.859414 -10.042857 1 1 +167200 0.316161 -9.931626 1 1 +167300 -0.764765 -9.842880 1 1 +167400 -1.292734 -9.795987 1 1 +167500 -1.486963 -9.811232 1 1 +167600 -1.558416 -9.877815 1 1 +167700 -0.703628 -9.977907 1 1 +167800 -0.258850 -10.087524 1 1 +167900 0.916167 -10.169705 1 1 +168000 1.348432 -10.204694 1 1 +168100 1.507453 -10.177764 1 1 +168200 1.565954 -10.103131 1 1 +168300 0.576082 -9.998152 1 1 +168400 -0.078102 -9.892173 1 1 +168500 -1.040125 -9.817206 1 1 +168600 -1.394033 -9.794796 1 1 +168700 -1.524229 -9.832748 1 1 +168800 -1.282095 -9.914719 1 1 +168900 -0.471656 -10.023431 1 1 +169000 0.353975 -10.124406 1 1 +169100 1.141613 -10.191204 1 1 +169200 1.431369 -10.200834 1 1 +169300 1.537964 -10.152585 1 1 +169400 1.049690 -10.063953 1 1 +169500 0.386159 -9.953071 1 1 +169600 -0.579841 -9.857967 1 1 +169700 -1.224705 -9.800489 1 1 +169800 -1.461937 -9.803491 1 1 +169900 -1.549209 -9.861285 1 1 +170000 -0.859414 -9.955943 1 1 +170100 -0.316161 -10.067174 1 1 +170200 0.764765 -10.155920 1 1 +170300 1.292734 -10.202813 1 1 +170400 1.486963 -10.187568 1 1 +170500 1.558416 -10.120985 1 1 +170600 0.703628 -10.020893 1 1 +170700 0.258850 -9.911276 1 1 +170800 -0.916167 -9.829095 1 1 +170900 -1.348432 -9.794106 1 1 +171000 -1.507453 -9.821036 1 1 +171100 -1.565954 -9.895669 1 1 +171200 -0.576082 -10.000648 1 1 +171300 0.078102 -10.106627 1 1 +171400 1.040125 -10.181594 1 1 +171500 1.394033 -10.204004 1 1 +171600 1.524229 -10.166052 1 1 +171700 1.282095 -10.084081 1 1 +171800 0.471656 -9.975369 1 1 +171900 -0.353975 -9.874394 1 1 +172000 -1.141613 -9.807596 1 1 +172100 -1.431369 -9.797966 1 1 +172200 -1.537964 -9.846215 1 1 +172300 -1.049690 -9.934847 1 1 +172400 -0.386159 -10.045729 1 1 +172500 0.579841 -10.140833 1 1 +172600 1.224705 -10.198311 1 1 +172700 1.461937 -10.195309 1 1 +172800 1.549209 -10.137515 1 1 +172900 0.859414 -10.042857 1 1 +173000 0.316161 -9.931626 1 1 +173100 -0.764765 -9.842880 1 1 +173200 -1.292734 -9.795987 1 1 +173300 -1.486963 -9.811232 1 1 +173400 -1.558416 -9.877815 1 1 +173500 -0.703628 -9.977907 1 1 +173600 -0.258850 -10.087524 1 1 +173700 0.916167 -10.169705 1 1 +173800 1.348432 -10.204694 1 1 +173900 1.507453 -10.177764 1 1 +174000 1.565954 -10.103131 1 1 +174100 0.576082 -9.998152 1 1 +174200 -0.078102 -9.892173 1 1 +174300 -1.040125 -9.817206 1 1 +174400 -1.394033 -9.794796 1 1 +174500 -1.524229 -9.832748 1 1 +174600 -1.282095 -9.914719 1 1 +174700 -0.471656 -10.023431 1 1 +174800 0.353975 -10.124406 1 1 +174900 1.141613 -10.191204 1 1 +175000 1.431369 -10.200834 1 1 +175100 1.537964 -10.152585 1 1 +175200 1.049690 -10.063953 1 1 +175300 0.386159 -9.953071 1 1 +175400 -0.579841 -9.857967 1 1 +175500 -1.224705 -9.800489 1 1 +175600 -1.461937 -9.803491 1 1 +175700 -1.549209 -9.861285 1 1 +175800 -0.859414 -9.955943 1 1 +175900 -0.316161 -10.067174 1 1 +176000 0.764765 -10.155920 1 1 +176100 1.292734 -10.202813 1 1 +176200 1.486963 -10.187568 1 1 +176300 1.558416 -10.120985 1 1 +176400 0.703628 -10.020893 1 1 +176500 0.258850 -9.911276 1 1 +176600 -0.916167 -9.829095 1 1 +176700 -1.348432 -9.794106 1 1 +176800 -1.507453 -9.821036 1 1 +176900 -1.565954 -9.895669 1 1 +177000 -0.576082 -10.000648 1 1 +177100 0.078102 -10.106627 1 1 +177200 1.040125 -10.181594 1 1 +177300 1.394033 -10.204004 1 1 +177400 1.524229 -10.166052 1 1 +177500 1.282095 -10.084081 1 1 +177600 0.471656 -9.975369 1 1 +177700 -0.353975 -9.874394 1 1 +177800 -1.141613 -9.807596 1 1 +177900 -1.431369 -9.797966 1 1 +178000 -1.537964 -9.846215 1 1 +178100 -1.049690 -9.934847 1 1 +178200 -0.386159 -10.045729 1 1 +178300 0.579841 -10.140833 1 1 +178400 1.224705 -10.198311 1 1 +178500 1.461937 -10.195309 1 1 +178600 1.549209 -10.137515 1 1 +178700 0.859414 -10.042857 1 1 +178800 0.316161 -9.931626 1 1 +178900 -0.764765 -9.842880 1 1 +179000 -1.292734 -9.795987 1 1 +179100 -1.486963 -9.811232 1 1 +179200 -1.558416 -9.877815 1 1 +179300 -0.703628 -9.977907 1 1 +179400 -0.258850 -10.087524 1 1 +179500 0.916167 -10.169705 1 1 +179600 1.348432 -10.204694 1 1 +179700 1.507453 -10.177764 1 1 +179800 1.565954 -10.103131 1 1 +179900 0.576082 -9.998152 1 1 diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/log3.csv frama-c-20150201+sodium+dfsg/tests/ICPC/log3.csv --- frama-c-20140301+neon+dfsg/tests/ICPC/log3.csv 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/log3.csv 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,1601 @@ +time(ms) engineVoltage legAngle legAngleValid isActive +0 0.000000 0.000000 0 1 +100 -0.036071 11.500000 1 1 +200 -0.102492 11.499625 1 1 +300 -0.180078 11.497117 1 1 +400 -0.261772 11.490481 1 1 +500 -0.344976 11.478283 1 1 +600 -0.428737 11.459635 1 1 +700 -0.512702 11.434026 1 1 +800 -0.596742 11.401172 1 1 +900 -0.680810 11.360921 1 1 +1000 -0.764889 11.313191 1 1 +1100 -0.848970 11.257941 1 1 +1200 -0.933054 11.195146 1 1 +1300 -1.017137 11.124797 1 1 +1400 -1.101221 11.046886 1 1 +1500 -1.185306 10.961411 1 1 +1600 -1.269390 10.868370 1 1 +1700 -1.353474 10.767763 1 1 +1800 -1.437558 10.659588 1 1 +1900 -1.521642 10.543846 1 1 +2000 -1.605726 10.420537 1 1 +2100 -1.689810 10.289660 1 1 +2200 -1.773894 10.151215 1 1 +2300 -1.857978 10.005203 1 1 +2400 -1.942062 9.851623 1 1 +2500 -2.026146 9.690476 1 1 +2600 -2.110230 9.521762 1 1 +2700 -2.194315 9.345479 1 1 +2800 -2.278399 9.161629 1 1 +2900 -2.362483 8.970212 1 1 +3000 -2.446567 8.771227 1 1 +3100 -2.530651 8.564674 1 1 +3200 -2.614735 8.350554 1 1 +3300 -2.698819 8.128866 1 1 +3400 -2.777654 7.899611 1 1 +3500 -2.846572 7.662825 1 1 +3600 -2.303707 7.418851 1 1 +3700 -1.555462 7.170981 1 1 +3800 -1.280197 6.951629 1 1 +3900 -1.178933 6.773932 1 1 +4000 -1.141680 6.627754 1 1 +4100 -1.127976 6.501487 1 1 +4200 -1.122934 6.386814 1 1 +4300 -1.121079 6.278597 1 1 +4400 -1.120397 6.173881 1 1 +4500 -1.120146 6.071031 1 1 +4600 -1.120054 5.969164 1 1 +4700 -1.120020 5.867811 1 1 +4800 -1.120007 5.766725 1 1 +4900 -1.120003 5.665777 1 1 +5000 -1.120001 5.564901 1 1 +5100 -1.120000 5.464062 1 1 +5200 -1.120000 5.363242 1 1 +5300 -1.120000 5.262431 1 1 +5400 -1.120000 5.161626 1 1 +5500 -1.120000 5.060823 1 1 +5600 -1.120000 4.960022 1 1 +5700 -1.120000 4.859221 1 1 +5800 -1.120000 4.758421 1 1 +5900 -1.120000 4.657621 1 1 +6000 -1.120000 4.556821 1 1 +6100 -1.120000 4.456021 1 1 +6200 -1.120000 4.355221 1 1 +6300 -1.120000 4.254421 1 1 +6400 -1.120000 4.153621 1 1 +6500 -1.120000 4.052821 1 1 +6600 -1.120000 3.952021 1 1 +6700 -1.120000 3.851221 1 1 +6800 -1.120000 3.750421 1 1 +6900 -1.120000 3.649621 1 1 +7000 -1.120000 3.548821 1 1 +7100 -1.120000 3.448021 1 1 +7200 -1.120000 3.347221 1 1 +7300 -1.120000 3.246421 1 1 +7400 -1.120000 3.145621 1 1 +7500 -1.120000 3.044821 1 1 +7600 -0.630849 11.459680 1 1 +7700 -0.300038 11.362685 1 1 +7800 -0.231491 11.288910 1 1 +7900 -0.259425 11.238647 1 1 +8000 -0.322853 11.202392 1 1 +8100 -0.399338 11.171714 1 1 +8200 -0.480626 11.140977 1 1 +8300 -0.563682 11.106808 1 1 +8400 -0.647388 11.067297 1 1 +8500 -0.731332 11.021400 1 1 +8600 -0.815365 10.968555 1 1 +8700 -0.899431 10.908465 1 1 +8800 -0.983508 10.840976 1 1 +8900 -1.067589 10.766007 1 1 +9000 -1.151672 10.683515 1 1 +9100 -1.235756 10.593478 1 1 +9200 -1.319840 10.495886 1 1 +9300 -1.403924 10.390732 1 1 +9400 -1.488008 10.278014 1 1 +9500 -1.572092 10.157730 1 1 +9600 -1.656176 10.029880 1 1 +9700 -1.740260 9.894462 1 1 +9800 -1.824345 9.751476 1 1 +9900 -1.908429 9.600924 1 1 +10000 -1.992513 9.442804 1 1 +10100 -2.076597 9.277116 1 1 +10200 -2.160681 9.103861 1 1 +10300 -2.244765 8.923038 1 1 +10400 -2.328849 8.734647 1 1 +10500 -2.412933 8.538689 1 1 +10600 -2.497017 8.335164 1 1 +10700 -2.581101 8.124071 1 1 +10800 -2.665185 7.905410 1 1 +10900 -2.747801 7.679182 1 1 +11000 -2.240750 7.445391 1 1 +11100 -1.532301 7.206866 1 1 +11200 -1.271677 6.994604 1 1 +11300 -1.175799 6.821400 1 1 +11400 -1.140527 6.677842 1 1 +11500 -1.127552 6.553036 1 1 +11600 -1.122778 6.439155 1 1 +11700 -1.121022 6.331361 1 1 +11800 -1.120376 6.226868 1 1 +11900 -1.120138 6.124134 1 1 +12000 -1.120051 6.022327 1 1 +12100 -1.120019 5.921005 1 1 +12200 -1.120007 5.819935 1 1 +12300 -1.120003 5.718996 1 1 +12400 -1.120001 5.618124 1 1 +12500 -1.120000 5.517288 1 1 +12600 -1.120000 5.416469 1 1 +12700 -1.120000 5.315659 1 1 +12800 -1.120000 5.214854 1 1 +12900 -1.120000 5.114051 1 1 +13000 -1.120000 5.013250 1 1 +13100 -1.120000 4.912449 1 1 +13200 -1.120000 4.811649 1 1 +13300 -1.120000 4.710849 1 1 +13400 -1.120000 4.610049 1 1 +13500 -1.120000 4.509249 1 1 +13600 -1.120000 4.408449 1 1 +13700 -1.120000 4.307649 1 1 +13800 -1.120000 4.206849 1 1 +13900 -1.120000 4.106048 1 1 +14000 -1.120000 4.005248 1 1 +14100 -1.120000 3.904448 1 1 +14200 -1.120000 3.803648 1 1 +14300 -1.120000 3.702848 1 1 +14400 -1.120000 3.602048 1 1 +14500 -1.120000 3.501248 1 1 +14600 -1.120000 3.400448 1 1 +14700 -1.120000 3.299648 1 1 +14800 -1.120000 3.198848 1 1 +14900 -1.120000 3.098048 1 1 +15000 -1.120000 2.997248 1 1 +15100 -1.120000 2.896448 1 1 +15200 -1.120000 2.795648 1 1 +15300 -1.120000 2.694848 1 1 +15400 -1.120000 2.594048 1 1 +15500 -1.120000 2.493248 1 1 +15600 -1.120000 2.392448 1 1 +15700 -1.120000 2.291648 1 1 +15800 -1.120000 2.190848 1 1 +15900 -1.120000 2.090048 1 1 +16000 -1.120000 1.989248 1 1 +16100 -1.120000 1.888448 1 1 +16200 -1.120000 1.787648 1 1 +16300 -1.120000 1.686848 1 1 +16400 -1.120000 1.586048 1 1 +16500 -1.120000 1.485248 1 1 +16600 -1.120000 1.384448 1 1 +16700 -1.120000 1.283648 1 1 +16800 -1.120000 1.182848 1 1 +16900 -1.120000 1.082048 1 1 +17000 -1.120000 0.981248 1 1 +17100 -1.120000 0.880448 1 1 +17200 -1.120000 0.779648 1 1 +17300 -1.120000 0.678848 1 1 +17400 -1.120000 0.578048 1 1 +17500 -0.750758 0.477248 1 1 +17600 -0.276189 0.378134 1 1 +17700 -0.101604 0.299935 1 1 +17800 -0.037378 0.249620 1 1 +17900 -0.013751 0.220047 1 1 +18000 -0.005059 0.203487 1 1 +18100 -0.001861 0.194479 1 1 +18200 -0.000685 0.189668 1 1 +18300 -0.000252 0.187129 1 1 +18400 -0.000093 0.185801 1 1 +18500 -0.000034 0.185109 1 1 +18600 -0.000013 0.184751 1 1 +18700 -0.000005 0.184566 1 1 +18800 -0.000002 0.184470 1 1 +18900 -0.000001 0.184421 1 1 +19000 -0.000000 0.184396 1 1 +19100 -0.000000 0.184383 1 1 +19200 -0.000000 0.184376 1 1 +19300 -0.000000 0.184372 1 1 +19400 -0.000000 0.184371 1 1 +19500 -0.000000 0.184370 1 1 +19600 -0.000000 0.184369 1 1 +19700 -0.000000 0.184369 1 1 +19800 -0.000000 0.184369 1 1 +19900 -0.000000 0.184369 1 1 +20000 -0.000000 0.184369 1 1 +20100 -0.000000 0.184369 1 1 +20200 -0.000000 0.184369 1 1 +20300 -0.000000 0.184369 1 1 +20400 -0.000000 0.184369 1 1 +20500 -0.000000 0.184369 1 1 +20600 -0.000000 0.184369 1 1 +20700 -0.000000 0.184369 1 1 +20800 -0.000000 0.184369 1 1 +20900 -0.000000 0.184369 1 1 +21000 -0.000000 0.184369 1 1 +21100 -0.000000 0.184369 1 1 +21200 -0.000000 0.184369 1 1 +21300 -0.000000 0.184369 1 1 +21400 -0.000000 0.184369 1 1 +21500 -0.000000 0.184369 1 1 +21600 -0.000000 0.184369 1 1 +21700 -0.000000 0.184369 1 1 +21800 -0.000000 0.184369 1 1 +21900 -0.000000 0.184369 1 1 +22000 -0.000000 0.184369 1 1 +22100 -0.000000 0.184369 1 1 +22200 -0.000000 0.184369 1 1 +22300 -0.000000 0.184369 1 1 +22400 -0.000000 0.184369 1 1 +22500 -0.000000 0.184369 1 1 +22600 -0.000000 0.184369 1 1 +22700 -0.000000 0.184369 1 1 +22800 -0.000000 0.184369 1 1 +22900 -0.000000 0.184369 1 1 +23000 -0.000000 0.184369 1 1 +23100 -0.000000 0.184369 1 1 +23200 -0.000000 0.184369 1 1 +23300 -0.000000 0.184369 1 1 +23400 -0.000000 0.184369 1 1 +23500 -0.000000 0.184369 1 1 +23600 -0.000000 0.184369 1 1 +23700 -0.000000 0.184369 1 1 +23800 -0.000000 0.184369 1 1 +23900 -0.000000 0.184369 1 1 +24000 -0.000000 0.184369 1 1 +24100 -0.000000 0.184369 1 1 +24200 -0.000000 0.184369 1 1 +24300 -0.000000 0.184369 1 1 +24400 -0.000000 0.184369 1 1 +24500 -0.000000 0.184369 1 1 +24600 -0.000000 0.184369 1 1 +24700 -0.000000 0.184369 1 1 +24800 -0.000000 0.184369 1 1 +24900 -0.000000 0.184369 1 1 +25000 -0.000000 0.184369 1 1 +25100 -0.000000 0.184369 1 1 +25200 -0.000000 0.184369 1 1 +25300 -0.000000 0.184369 1 1 +25400 -0.000000 0.184369 1 1 +25500 -0.000000 0.184369 1 1 +25600 -0.000000 0.184369 1 1 +25700 -0.000000 0.184369 1 1 +25800 -0.000000 0.184369 1 1 +25900 -0.000000 0.184369 1 1 +26000 -0.000000 0.184369 1 1 +26100 -0.000000 0.184369 1 1 +26200 -0.000000 0.184369 1 1 +26300 -0.000000 0.184369 1 1 +26400 -0.000000 0.184369 1 1 +26500 -0.000000 0.184369 1 1 +26600 -0.000000 0.184369 1 1 +26700 -0.000000 0.184369 1 1 +26800 -0.000000 0.184369 1 1 +26900 -0.000000 0.184369 1 1 +27000 -0.000000 0.184369 1 1 +27100 -0.000000 0.184369 1 1 +27200 -0.000000 0.184369 1 1 +27300 -0.000000 0.184369 1 1 +27400 -0.000000 0.184369 1 1 +27500 -0.000000 0.184369 1 1 +27600 -0.000000 0.184369 1 1 +27700 -0.000000 0.184369 1 1 +27800 -0.000000 0.184369 1 1 +27900 -0.000000 0.184369 1 1 +28000 -0.000000 0.184369 1 1 +28100 -0.000000 0.184369 1 1 +28200 -0.000000 0.184369 1 1 +28300 -0.000000 0.184369 1 1 +28400 -0.000000 0.184369 1 1 +28500 -0.000000 0.184369 1 1 +28600 -0.000000 0.184369 1 1 +28700 -0.000000 0.184369 1 1 +28800 -0.000000 0.184369 1 1 +28900 -0.000000 0.184369 1 1 +29000 -0.000000 0.184369 1 1 +29100 -0.000000 0.184369 1 1 +29200 -0.000000 0.184369 1 1 +29300 -0.000000 0.184369 1 1 +29400 -0.000000 0.184369 1 1 +29500 -0.000000 0.184369 1 1 +29600 -0.000000 0.184369 1 1 +29700 -0.000000 0.184369 1 1 +29800 -0.000000 0.184369 1 1 +29900 -0.000000 0.184369 1 1 +30000 -0.000000 0.184369 1 1 +30100 -0.000000 0.184369 1 1 +30200 -0.000000 0.184369 1 1 +30300 -0.000000 0.184369 1 1 +30400 -0.000000 0.184369 1 1 +30500 -0.000000 0.184369 1 1 +30600 -0.000000 0.184369 1 1 +30700 -0.000000 0.184369 1 1 +30800 -0.000000 0.184369 1 1 +30900 -0.000000 0.184369 1 1 +31000 -0.000000 0.184369 1 1 +31100 -0.000000 0.184369 1 1 +31200 -0.000000 0.184369 1 1 +31300 -0.000000 0.184369 1 1 +31400 -0.000000 0.184369 1 1 +31500 -0.000000 0.184369 1 1 +31600 -0.000000 0.184369 1 1 +31700 -0.000000 0.184369 1 1 +31800 -0.000000 0.184369 1 1 +31900 -0.000000 0.184369 1 1 +32000 -0.000000 0.184369 1 1 +32100 -0.000000 0.184369 1 1 +32200 -0.000000 0.184369 1 1 +32300 -0.000000 0.184369 1 1 +32400 -0.000000 0.184369 1 1 +32500 -0.000000 0.184369 1 1 +32600 -0.000000 0.184369 1 1 +32700 -0.000000 0.184369 1 1 +32800 -0.000000 0.184369 1 1 +32900 -0.000000 0.184369 1 1 +33000 -0.000000 0.184369 1 1 +33100 -0.000000 0.184369 1 1 +33200 -0.000000 0.184369 1 1 +33300 -0.000000 0.184369 1 1 +33400 -0.000000 0.184369 1 1 +33500 -0.000000 0.184369 1 1 +33600 -0.000000 0.184369 1 1 +33700 -0.000000 0.184369 1 1 +33800 -0.000000 0.184369 1 1 +33900 -0.000000 0.184369 1 1 +34000 -0.000000 0.184369 1 1 +34100 -0.000000 0.184369 1 1 +34200 -0.000000 0.184369 1 1 +34300 -0.000000 0.184369 1 1 +34400 -0.000000 0.184369 1 1 +34500 -0.000000 0.184369 1 1 +34600 -0.000000 0.184369 1 1 +34700 -0.000000 0.184369 1 1 +34800 -0.000000 0.184369 1 1 +34900 -0.000000 0.184369 1 1 +35000 -0.000000 0.184369 1 1 +35100 -0.000000 0.184369 1 1 +35200 -0.000000 0.184369 1 1 +35300 -0.000000 0.184369 1 1 +35400 -0.000000 0.184369 1 1 +35500 -0.000000 0.184369 1 1 +35600 -0.000000 0.184369 1 1 +35700 -0.000000 0.184369 1 1 +35800 -0.000000 0.184369 1 1 +35900 -0.000000 0.184369 1 1 +36000 -0.000000 0.184369 1 1 +36100 -0.000000 0.184369 1 1 +36200 -0.000000 0.184369 1 1 +36300 -0.000000 0.184369 1 1 +36400 -0.000000 0.184369 1 1 +36500 -0.000000 0.184369 1 1 +36600 -0.000000 0.184369 1 1 +36700 -0.000000 0.184369 1 1 +36800 -0.000000 0.184369 1 1 +36900 -0.000000 0.184369 1 1 +37000 -0.000000 0.184369 1 1 +37100 -0.000000 0.184369 1 1 +37200 -0.000000 0.184369 1 1 +37300 -0.000000 0.184369 1 1 +37400 -0.000000 0.184369 1 1 +37500 -0.000000 0.184369 1 1 +37600 -0.000000 0.184369 1 1 +37700 -0.000000 0.184369 1 1 +37800 -0.000000 0.184369 1 1 +37900 -0.000000 0.184369 1 1 +38000 -0.000000 0.184369 1 1 +38100 -0.000000 0.184369 1 1 +38200 -0.000000 0.184369 1 1 +38300 -0.000000 0.184369 1 1 +38400 -0.000000 0.184369 1 1 +38500 -0.000000 0.184369 1 1 +38600 -0.000000 0.184369 1 1 +38700 -0.000000 0.184369 1 1 +38800 -0.000000 0.184369 1 1 +38900 -0.000000 0.184369 1 1 +39000 -0.000000 0.184369 1 1 +39100 -0.000000 0.184369 1 1 +39200 -0.000000 0.184369 1 1 +39300 -0.000000 0.184369 1 1 +39400 -0.000000 0.184369 1 1 +39500 -0.000000 0.184369 1 1 +39600 -0.000000 0.184369 1 1 +39700 -0.000000 0.184369 1 1 +39800 -0.000000 0.184369 1 1 +39900 -0.000000 0.184369 1 1 +40000 -0.000000 0.184369 1 1 +40100 -0.000000 0.184369 1 1 +40200 -0.000000 0.184369 1 1 +40300 -0.000000 0.184369 1 1 +40400 -0.000000 0.184369 1 1 +40500 -0.000000 0.184369 1 1 +40600 -0.000000 0.184369 1 1 +40700 -0.000000 0.184369 1 1 +40800 -0.000000 0.184369 1 1 +40900 -0.000000 0.184369 1 1 +41000 -0.000000 0.184369 1 1 +41100 -0.000000 0.184369 1 1 +41200 -0.000000 0.184369 1 1 +41300 -0.000000 0.184369 1 1 +41400 -0.000000 0.184369 1 1 +41500 -0.000000 0.184369 1 1 +41600 -0.000000 0.184369 1 1 +41700 -0.000000 0.184369 1 1 +41800 -0.000000 0.184369 1 1 +41900 -0.000000 0.184369 1 1 +42000 -0.000000 0.184369 1 1 +42100 -0.000000 0.184369 1 1 +42200 -0.000000 0.184369 1 1 +42300 -0.000000 0.184369 1 1 +42400 -0.000000 0.184369 1 1 +42500 -0.000000 0.184369 1 1 +42600 -0.000000 0.184369 1 1 +42700 -0.000000 0.184369 1 1 +42800 -0.000000 0.184369 1 1 +42900 -0.000000 0.184369 1 1 +43000 -0.000000 0.184369 1 1 +43100 -0.000000 0.184369 1 1 +43200 -0.000000 0.184369 1 1 +43300 -0.000000 0.184369 1 1 +43400 -0.000000 0.184369 1 1 +43500 -0.000000 0.184369 1 1 +43600 -0.000000 0.184369 1 1 +43700 -0.000000 0.184369 1 1 +43800 -0.000000 0.184369 1 1 +43900 -0.000000 0.184369 1 1 +44000 -0.000000 0.184369 1 1 +44100 -0.000000 0.184369 1 1 +44200 -0.000000 0.184369 1 1 +44300 -0.000000 0.184369 1 1 +44400 -0.000000 0.184369 1 1 +44500 -0.000000 0.184369 1 1 +44600 -0.000000 0.184369 1 1 +44700 -0.000000 0.184369 1 1 +44800 -0.000000 0.184369 1 1 +44900 -0.000000 0.184369 1 1 +45000 -0.000000 0.184369 1 1 +45100 -0.000000 0.184369 1 1 +45200 -0.000000 0.184369 1 1 +45300 -0.000000 0.184369 1 1 +45400 -0.000000 0.184369 1 1 +45500 -0.000000 0.184369 1 1 +45600 -0.000000 0.184369 1 1 +45700 -0.000000 0.184369 1 1 +45800 -0.000000 0.184369 1 1 +45900 -0.000000 0.184369 1 1 +46000 -0.000000 0.184369 1 1 +46100 -0.000000 0.184369 1 1 +46200 -0.000000 0.184369 1 1 +46300 -0.000000 0.184369 1 1 +46400 -0.000000 0.184369 1 1 +46500 -0.000000 0.184369 1 1 +46600 -0.000000 0.184369 1 1 +46700 -0.000000 0.184369 1 1 +46800 -0.000000 0.184369 1 1 +46900 -0.000000 0.184369 1 1 +47000 -0.000000 0.184369 1 1 +47100 -0.000000 0.184369 1 1 +47200 -0.000000 0.184369 1 1 +47300 -0.000000 0.184369 1 1 +47400 -0.000000 0.184369 1 1 +47500 -0.000000 0.184369 1 1 +47600 -0.000000 0.184369 1 1 +47700 -0.000000 0.184369 1 1 +47800 -0.000000 0.184369 1 1 +47900 -0.000000 0.184369 1 1 +48000 -0.000000 0.184369 1 1 +48100 -0.000000 0.184369 1 1 +48200 -0.000000 0.184369 1 1 +48300 -0.000000 0.184369 1 1 +48400 -0.000000 0.184369 1 1 +48500 -0.000000 0.184369 1 1 +48600 -0.000000 0.184369 1 1 +48700 -0.000000 0.184369 1 1 +48800 -0.000000 0.184369 1 1 +48900 -0.000000 0.184369 1 1 +49000 -0.000000 0.184369 1 1 +49100 -0.000000 0.184369 1 1 +49200 -0.000000 0.184369 1 1 +49300 -0.000000 0.184369 1 1 +49400 -0.000000 0.184369 1 1 +49500 -0.000000 0.184369 1 1 +49600 -0.000000 0.184369 1 1 +49700 -0.000000 0.184369 1 1 +49800 -0.000000 0.184369 1 1 +49900 -0.000000 0.184369 1 1 +50000 -0.000000 0.184369 1 1 +50100 -0.000000 0.184369 1 1 +50200 -0.000000 0.184369 1 1 +50300 -0.000000 0.184369 1 1 +50400 -0.000000 0.184369 1 1 +50500 -0.000000 0.184369 1 1 +50600 -0.000000 0.184369 1 1 +50700 -0.000000 0.184369 1 1 +50800 -0.000000 0.184369 1 1 +50900 -0.000000 0.184369 1 1 +51000 -0.000000 0.184369 1 1 +51100 -0.000000 0.184369 1 1 +51200 -0.000000 0.184369 1 1 +51300 -0.000000 0.184369 1 1 +51400 -0.000000 0.184369 1 1 +51500 -0.000000 0.184369 1 1 +51600 -0.000000 0.184369 1 1 +51700 -0.000000 0.184369 1 1 +51800 -0.000000 0.184369 1 1 +51900 -0.000000 0.184369 1 1 +52000 -0.000000 0.184369 1 1 +52100 -0.000000 0.184369 1 1 +52200 -0.000000 0.184369 1 1 +52300 -0.000000 0.184369 1 1 +52400 -0.000000 0.184369 1 1 +52500 -0.000000 0.184369 1 1 +52600 -0.000000 0.184369 1 1 +52700 -0.000000 0.184369 1 1 +52800 -0.000000 0.184369 1 1 +52900 -0.000000 0.184369 1 1 +53000 -0.000000 0.184369 1 1 +53100 -0.000000 0.184369 1 1 +53200 -0.000000 0.184369 1 1 +53300 -0.000000 0.184369 1 1 +53400 -0.000000 0.184369 1 1 +53500 -0.000000 0.184369 1 1 +53600 -0.000000 0.184369 1 1 +53700 -0.000000 0.184369 1 1 +53800 -0.000000 0.184369 1 1 +53900 -0.000000 0.184369 1 1 +54000 -0.000000 0.184369 1 1 +54100 -0.000000 0.184369 1 1 +54200 -0.000000 0.184369 1 1 +54300 -0.000000 0.184369 1 1 +54400 -0.000000 0.184369 1 1 +54500 -0.000000 0.184369 1 1 +54600 -0.000000 0.184369 1 1 +54700 -0.000000 0.184369 1 1 +54800 -0.000000 0.184369 1 1 +54900 -0.000000 0.184369 1 1 +55000 -0.000000 0.184369 1 1 +55100 -0.000000 0.184369 1 1 +55200 -0.000000 0.184369 1 1 +55300 -0.000000 0.184369 1 1 +55400 -0.000000 0.184369 1 1 +55500 -0.000000 0.184369 1 1 +55600 -0.000000 0.184369 1 1 +55700 -0.000000 0.184369 1 1 +55800 -0.000000 0.184369 1 1 +55900 -0.000000 0.184369 1 1 +56000 -0.000000 0.184369 1 1 +56100 -0.000000 0.184369 1 1 +56200 -0.000000 0.184369 1 1 +56300 -0.000000 0.184369 1 1 +56400 -0.000000 0.184369 1 1 +56500 -0.000000 0.184369 1 1 +56600 -0.000000 0.184369 1 1 +56700 -0.000000 0.184369 1 1 +56800 -0.000000 0.184369 1 1 +56900 -0.000000 0.184369 1 1 +57000 -0.000000 0.184369 1 1 +57100 -0.000000 0.184369 1 1 +57200 -0.000000 0.184369 1 1 +57300 -0.000000 0.184369 1 1 +57400 -0.000000 0.184369 1 1 +57500 -0.000000 0.184369 1 1 +57600 -0.000000 0.184369 1 1 +57700 -0.000000 0.184369 1 1 +57800 -0.000000 0.184369 1 1 +57900 -0.000000 0.184369 1 1 +58000 -0.000000 0.184369 1 1 +58100 -0.000000 0.184369 1 1 +58200 -0.000000 0.184369 1 1 +58300 -0.000000 0.184369 1 1 +58400 -0.000000 0.184369 1 1 +58500 -0.000000 0.184369 1 1 +58600 -0.000000 0.184369 1 1 +58700 -0.000000 0.184369 1 1 +58800 -0.000000 0.184369 1 1 +58900 -0.000000 0.184369 1 1 +59000 -0.000000 0.184369 1 1 +59100 -0.000000 0.184369 1 1 +59200 -0.000000 0.184369 1 1 +59300 -0.000000 0.184369 1 1 +59400 -0.000000 0.184369 1 1 +59500 -0.000000 0.184369 1 1 +59600 -0.000000 0.184369 1 1 +59700 -0.000000 0.184369 1 1 +59800 -0.000000 0.184369 1 1 +59900 -0.000000 0.184369 1 1 +60000 0.003048 0.184369 1 1 +60100 0.047823 0.184376 1 1 +60200 0.117445 0.185005 1 1 +60300 0.196209 0.188194 1 1 +60400 0.278336 0.195847 1 1 +60500 0.361700 0.209279 1 1 +60600 0.445520 0.229287 1 1 +60700 0.529506 0.256328 1 1 +60800 0.613555 0.290652 1 1 +60900 0.697625 0.332394 1 1 +61000 0.781705 0.381625 1 1 +61100 0.865787 0.438383 1 1 +61200 0.949870 0.502688 1 1 +61300 1.033954 0.574549 1 1 +61400 1.118038 0.653973 1 1 +61500 1.202122 0.740961 1 1 +61600 1.286206 0.835515 1 1 +61700 1.370290 0.937636 1 1 +61800 1.454375 1.047324 1 1 +61900 1.538459 1.164579 1 1 +62000 1.622543 1.289402 1 1 +62100 1.706627 1.421793 1 1 +62200 1.790711 1.561751 1 1 +62300 1.874795 1.709276 1 1 +62400 1.958879 1.864369 1 1 +62500 2.042963 2.027030 1 1 +62600 2.127047 2.197258 1 1 +62700 2.211131 2.375054 1 1 +62800 2.295215 2.560418 1 1 +62900 2.379299 2.753348 1 1 +63000 2.463384 2.953847 1 1 +63100 2.547468 3.161913 1 1 +63200 2.631552 3.377547 1 1 +63300 2.715636 3.600748 1 1 +63400 2.791962 3.831517 1 1 +63500 2.859785 4.069781 1 1 +63600 2.924480 4.315127 1 1 +63700 2.988024 4.567046 1 1 +63800 3.051144 4.825160 1 1 +63900 3.114109 5.089231 1 1 +64000 3.177017 5.359125 1 1 +64100 3.239903 5.634764 1 1 +64200 3.302782 5.916108 1 1 +64300 3.365658 6.203135 1 1 +64400 3.428533 6.495832 1 1 +64500 3.491407 6.794195 1 1 +64600 3.554282 7.098220 1 1 +64700 3.617156 7.407905 1 1 +64800 3.680030 7.723250 1 1 +64900 3.742904 8.044254 1 1 +65000 3.805779 8.370917 1 1 +65100 3.868653 8.703239 1 1 +65200 3.931527 9.041219 1 1 +65300 3.994401 9.384859 1 1 +65400 4.057276 9.734156 1 1 +65500 4.120150 10.089113 1 1 +65600 4.183024 10.449728 1 1 +65700 4.245898 10.816002 1 1 +65800 4.308773 11.187935 1 1 +65900 4.371647 11.500000 1 1 +66000 4.434521 11.883250 1 1 +66100 4.497395 12.272159 1 1 +66200 2.987356 12.666726 1 1 +66300 1.806962 13.054851 1 1 +66400 1.372719 13.371912 1 1 +66500 1.212970 13.609033 1 1 +66600 1.154202 13.789125 1 1 +66700 1.132582 13.934058 1 1 +66800 1.124629 14.058776 1 1 +66900 1.121703 14.172319 1 1 +67000 1.120626 14.279832 1 1 +67100 1.120230 14.384141 1 1 +67200 1.120085 14.486766 1 1 +67300 1.120031 14.588511 1 1 +67400 1.120011 14.689799 1 1 +67500 1.120004 14.790851 1 1 +67600 1.120002 14.891781 1 1 +67700 1.120001 14.992648 1 1 +67800 1.120000 15.093482 1 1 +67900 1.120000 15.194300 1 1 +68000 1.120000 15.295109 1 1 +68100 1.120000 15.395914 1 1 +68200 1.120000 15.496716 1 1 +68300 1.120000 15.597517 1 1 +68400 1.120000 15.698318 1 1 +68500 1.120000 15.799118 1 1 +68600 1.120000 15.899918 1 1 +68700 1.120000 16.000718 1 1 +68800 1.120000 16.101518 1 1 +68900 1.120000 16.202318 1 1 +69000 1.120000 16.303118 1 1 +69100 1.120000 16.403918 1 1 +69200 1.120000 16.504718 1 1 +69300 1.120000 16.605518 1 1 +69400 1.120000 16.706318 1 1 +69500 1.120000 16.807118 1 1 +69600 1.120000 16.907918 1 1 +69700 1.120000 17.008718 1 1 +69800 1.120000 17.109518 1 1 +69900 1.120000 17.210318 1 1 +70000 1.120000 17.311118 1 1 +70100 1.120000 17.411918 1 1 +70200 1.120000 17.512718 1 1 +70300 1.120000 17.613518 1 1 +70400 1.120000 17.714318 1 1 +70500 1.120000 17.815118 1 1 +70600 1.120000 17.915918 1 1 +70700 1.120000 18.016718 1 1 +70800 1.120000 18.117518 1 1 +70900 1.120000 18.218318 1 1 +71000 1.120000 18.319118 1 1 +71100 1.120000 18.419918 1 1 +71200 1.120000 18.520718 1 1 +71300 1.120000 18.621518 1 1 +71400 1.120000 18.722318 1 1 +71500 1.120000 18.823118 1 1 +71600 1.120000 18.923918 1 1 +71700 1.120000 19.024718 1 1 +71800 1.120000 19.125518 1 1 +71900 1.120000 19.226318 1 1 +72000 1.120000 19.327118 1 1 +72100 1.120000 19.427918 1 1 +72200 0.750758 19.528718 1 1 +72300 0.276189 19.627833 1 1 +72400 0.101604 19.706032 1 1 +72500 0.037378 19.756347 1 1 +72600 0.013751 19.785920 1 1 +72700 0.005059 19.802480 1 1 +72800 0.001861 19.811488 1 1 +72900 0.000685 19.816299 1 1 +73000 0.000252 19.818838 1 1 +73100 0.000093 19.820166 1 1 +73200 0.000034 19.820858 1 1 +73300 0.000013 19.821216 1 1 +73400 0.000005 19.821401 1 1 +73500 0.000002 19.821497 1 1 +73600 0.000001 19.821546 1 1 +73700 0.000000 19.821571 1 1 +73800 0.000000 19.821584 1 1 +73900 0.000000 19.821591 1 1 +74000 0.000000 19.821595 1 1 +74100 0.000000 19.821596 1 1 +74200 0.000000 19.821597 1 1 +74300 0.000000 19.821598 1 1 +74400 0.000000 19.821598 1 1 +74500 0.000000 19.821598 1 1 +74600 0.000000 19.821598 1 1 +74700 0.000000 19.821598 1 1 +74800 0.000000 19.821598 1 1 +74900 0.000000 19.821598 1 1 +75000 0.000000 19.821598 1 1 +75100 0.000000 19.821598 1 1 +75200 0.000000 19.821598 1 1 +75300 0.000000 19.821598 1 1 +75400 0.000000 19.821598 1 1 +75500 0.000000 19.821598 1 1 +75600 0.000000 19.821598 1 1 +75700 0.000000 19.821598 1 1 +75800 0.000000 19.821598 1 1 +75900 0.000000 19.821598 1 1 +76000 0.000000 19.821598 1 1 +76100 0.000000 19.821598 1 1 +76200 0.000000 19.821598 1 1 +76300 0.000000 19.821598 1 1 +76400 0.000000 19.821598 1 1 +76500 0.000000 19.821598 1 1 +76600 0.000000 19.821598 1 1 +76700 0.000000 19.821598 1 1 +76800 0.000000 19.821598 1 1 +76900 0.000000 19.821598 1 1 +77000 0.000000 19.821598 1 1 +77100 0.000000 19.821598 1 1 +77200 0.000000 19.821598 1 1 +77300 0.000000 19.821598 1 1 +77400 0.000000 19.821598 1 1 +77500 0.000000 19.821598 1 1 +77600 0.000000 19.821598 1 1 +77700 0.000000 19.821598 1 1 +77800 0.000000 19.821598 1 1 +77900 0.000000 19.821598 1 1 +78000 0.000000 19.821598 1 1 +78100 0.000000 19.821598 1 1 +78200 0.000000 19.821598 1 1 +78300 0.000000 19.821598 1 1 +78400 0.000000 19.821598 1 1 +78500 0.000000 19.821598 1 1 +78600 0.000000 19.821598 1 1 +78700 0.000000 19.821598 1 1 +78800 0.000000 19.821598 1 1 +78900 0.000000 19.821598 1 1 +79000 0.000000 19.821598 1 1 +79100 0.000000 19.821598 1 1 +79200 0.000000 19.821598 1 1 +79300 0.000000 19.821598 1 1 +79400 0.000000 19.821598 1 1 +79500 0.000000 19.821598 1 1 +79600 0.000000 19.821598 1 1 +79700 0.000000 19.821598 1 1 +79800 0.000000 19.821598 1 1 +79900 0.000000 19.821598 1 1 +80000 0.000000 19.821598 1 1 +80100 0.000000 19.821598 1 1 +80200 0.000000 19.821598 1 1 +80300 0.000000 19.821598 1 1 +80400 0.000000 19.821598 1 1 +80500 0.000000 19.821598 1 1 +80600 0.000000 19.821598 1 1 +80700 0.000000 19.821598 1 1 +80800 0.000000 19.821598 1 1 +80900 0.000000 19.821598 1 1 +81000 0.000000 19.821598 1 1 +81100 0.000000 19.821598 1 1 +81200 0.000000 19.821598 1 1 +81300 0.000000 19.821598 1 1 +81400 0.000000 19.821598 1 1 +81500 0.000000 19.821598 1 1 +81600 0.000000 19.821598 1 1 +81700 0.000000 19.821598 1 1 +81800 0.000000 19.821598 1 1 +81900 0.000000 19.821598 1 1 +82000 0.000000 19.821598 1 1 +82100 0.000000 19.821598 1 1 +82200 0.000000 19.821598 1 1 +82300 0.000000 19.821598 1 1 +82400 0.000000 19.821598 1 1 +82500 0.000000 19.821598 1 1 +82600 0.000000 19.821598 1 1 +82700 0.000000 19.821598 1 1 +82800 0.000000 19.821598 1 1 +82900 0.000000 19.821598 1 1 +83000 0.000000 19.821598 1 1 +83100 0.000000 19.821598 1 1 +83200 0.000000 19.821598 1 1 +83300 0.000000 19.821598 1 1 +83400 0.000000 19.821598 1 1 +83500 0.000000 19.821598 1 1 +83600 0.000000 19.821598 1 1 +83700 0.000000 19.821598 1 1 +83800 0.000000 19.821598 1 1 +83900 0.000000 19.821598 1 1 +84000 0.000000 19.821598 1 1 +84100 0.000000 19.821598 1 1 +84200 0.000000 19.821598 1 1 +84300 0.000000 19.821598 1 1 +84400 0.000000 19.821598 1 1 +84500 0.000000 19.821598 1 1 +84600 0.000000 19.821598 1 1 +84700 0.000000 19.821598 1 1 +84800 0.000000 19.821598 1 1 +84900 0.000000 19.821598 1 1 +85000 0.000000 19.821598 1 1 +85100 0.000000 19.821598 1 1 +85200 0.000000 19.821598 1 1 +85300 0.000000 19.821598 1 1 +85400 0.000000 19.821598 1 1 +85500 0.000000 19.821598 1 1 +85600 0.000000 19.821598 1 1 +85700 0.000000 19.821598 1 1 +85800 0.000000 19.821598 1 1 +85900 0.000000 19.821598 1 1 +86000 0.000000 19.821598 1 1 +86100 0.000000 19.821598 1 1 +86200 0.000000 19.821598 1 1 +86300 0.000000 19.821598 1 1 +86400 0.000000 19.821598 1 1 +86500 0.000000 19.821598 1 1 +86600 0.000000 19.821598 1 1 +86700 0.000000 19.821598 1 1 +86800 0.000000 19.821598 1 1 +86900 0.000000 19.821598 1 1 +87000 0.000000 19.821598 1 1 +87100 0.000000 19.821598 1 1 +87200 0.000000 19.821598 1 1 +87300 0.000000 19.821598 1 1 +87400 0.000000 19.821598 1 1 +87500 0.000000 19.821598 1 1 +87600 0.000000 19.821598 1 1 +87700 0.000000 19.821598 1 1 +87800 0.000000 19.821598 1 1 +87900 0.000000 19.821598 1 1 +88000 0.000000 19.821598 1 1 +88100 0.000000 19.821598 1 1 +88200 0.000000 19.821598 1 1 +88300 0.000000 19.821598 1 1 +88400 0.000000 19.821598 1 1 +88500 0.000000 19.821598 1 1 +88600 0.000000 19.821598 1 1 +88700 0.000000 19.821598 1 1 +88800 0.000000 19.821598 1 1 +88900 0.000000 19.821598 1 1 +89000 0.000000 19.821598 1 1 +89100 0.000000 19.821598 1 1 +89200 0.000000 19.821598 1 1 +89300 0.000000 19.821598 1 1 +89400 0.000000 19.821598 1 1 +89500 0.000000 19.821598 1 1 +89600 0.000000 19.821598 1 1 +89700 0.000000 19.821598 1 1 +89800 0.000000 19.821598 1 1 +89900 0.000000 19.821598 1 1 +90000 0.000000 19.821598 1 1 +90100 0.000000 19.821598 1 1 +90200 0.000000 19.821598 1 1 +90300 0.000000 19.821598 1 1 +90400 0.000000 19.821598 1 1 +90500 0.000000 19.821598 1 1 +90600 0.000000 19.821598 1 1 +90700 0.000000 19.821598 1 1 +90800 0.000000 19.821598 1 1 +90900 0.000000 19.821598 1 1 +91000 0.000000 19.821598 1 1 +91100 0.000000 19.821598 1 1 +91200 0.000000 19.821598 1 1 +91300 0.000000 19.821598 1 1 +91400 0.000000 19.821598 1 1 +91500 0.000000 19.821598 1 1 +91600 0.000000 19.821598 1 1 +91700 0.000000 19.821598 1 1 +91800 0.000000 19.821598 1 1 +91900 0.000000 19.821598 1 1 +92000 0.000000 19.821598 1 1 +92100 0.000000 19.821598 1 1 +92200 0.000000 19.821598 1 1 +92300 0.000000 19.821598 1 1 +92400 0.000000 19.821598 1 1 +92500 0.000000 19.821598 1 1 +92600 0.000000 19.821598 1 1 +92700 0.000000 19.821598 1 1 +92800 0.000000 19.821598 1 1 +92900 0.000000 19.821598 1 1 +93000 0.000000 19.821598 1 1 +93100 0.000000 19.821598 1 1 +93200 0.000000 19.821598 1 1 +93300 0.000000 19.821598 1 1 +93400 0.000000 19.821598 1 1 +93500 0.000000 19.821598 1 1 +93600 0.000000 19.821598 1 1 +93700 0.000000 19.821598 1 1 +93800 0.000000 19.821598 1 1 +93900 0.000000 19.821598 1 1 +94000 0.000000 19.821598 1 1 +94100 0.000000 19.821598 1 1 +94200 0.000000 19.821598 1 1 +94300 0.000000 19.821598 1 1 +94400 0.000000 19.821598 1 1 +94500 0.000000 19.821598 1 1 +94600 0.000000 19.821598 1 1 +94700 0.000000 19.821598 1 1 +94800 0.000000 19.821598 1 1 +94900 0.000000 19.821598 1 1 +95000 0.000000 19.821598 1 1 +95100 0.000000 19.821598 1 1 +95200 0.000000 19.821598 1 1 +95300 0.000000 19.821598 1 1 +95400 0.000000 19.821598 1 1 +95500 0.000000 19.821598 1 1 +95600 0.000000 19.821598 1 1 +95700 0.000000 19.821598 1 1 +95800 0.000000 19.821598 1 1 +95900 0.000000 19.821598 1 1 +96000 0.000000 19.821598 1 1 +96100 0.000000 19.821598 1 1 +96200 0.000000 19.821598 1 1 +96300 0.000000 19.821598 1 1 +96400 0.000000 19.821598 1 1 +96500 0.000000 19.821598 1 1 +96600 0.000000 19.821598 1 1 +96700 0.000000 19.821598 1 1 +96800 0.000000 19.821598 1 1 +96900 0.000000 19.821598 1 1 +97000 0.000000 19.821598 1 1 +97100 0.000000 19.821598 1 1 +97200 0.000000 19.821598 1 1 +97300 0.000000 19.821598 1 1 +97400 0.000000 19.821598 1 1 +97500 0.000000 19.821598 1 1 +97600 0.000000 19.821598 1 1 +97700 0.000000 19.821598 1 1 +97800 0.000000 19.821598 1 1 +97900 0.000000 19.821598 1 1 +98000 0.000000 19.821598 1 1 +98100 0.000000 19.821598 1 1 +98200 0.000000 19.821598 1 1 +98300 0.000000 19.821598 1 1 +98400 0.000000 19.821598 1 1 +98500 0.000000 19.821598 1 1 +98600 0.000000 19.821598 1 1 +98700 0.000000 19.821598 1 1 +98800 0.000000 19.821598 1 1 +98900 0.000000 19.821598 1 1 +99000 0.000000 19.821598 1 1 +99100 0.000000 19.821598 1 1 +99200 0.000000 19.821598 1 1 +99300 0.000000 19.821598 1 1 +99400 0.000000 19.821598 1 1 +99500 0.000000 19.821598 1 1 +99600 0.000000 19.821598 1 1 +99700 0.000000 19.821598 1 1 +99800 0.000000 19.821598 1 1 +99900 0.000000 19.821598 1 1 +100000 -0.003048 19.821598 1 1 +100100 -0.047823 19.821591 1 1 +100200 -0.117445 19.820962 1 1 +100300 -0.196209 19.817773 1 1 +100400 -0.278336 19.810120 1 1 +100500 -0.361700 19.796688 1 1 +100600 -0.445520 19.776680 1 1 +100700 -0.529506 19.749639 1 1 +100800 -0.613555 19.715315 1 1 +100900 -0.697625 19.673573 1 1 +101000 -0.781705 19.624342 1 1 +101100 -0.865787 19.567584 1 1 +101200 -0.949870 19.503279 1 1 +101300 -1.033954 19.431418 1 1 +101400 -1.118038 19.351994 1 1 +101500 -1.202122 19.265006 1 1 +101600 -1.286206 19.170452 1 1 +101700 -1.370290 19.068331 1 1 +101800 -1.454375 18.958643 1 1 +101900 -1.538459 18.841388 1 1 +102000 -1.622543 18.716565 1 1 +102100 -1.706627 18.584174 1 1 +102200 -1.790711 18.444216 1 1 +102300 -1.874795 18.296691 1 1 +102400 -1.958879 18.141598 1 1 +102500 -2.042963 17.978937 1 1 +102600 -2.127047 17.808709 1 1 +102700 -2.211131 17.630913 1 1 +102800 -2.295215 17.445549 1 1 +102900 -2.379299 17.252618 1 1 +103000 -2.463384 17.052120 1 1 +103100 -2.547468 16.844054 1 1 +103200 -2.631552 16.628420 1 1 +103300 -2.715636 16.405219 1 1 +103400 -2.791962 16.174450 1 1 +103500 -2.859785 15.936186 1 1 +103600 -2.924480 15.690839 1 1 +103700 -2.988024 15.438921 1 1 +103800 -3.051144 15.180807 1 1 +103900 -3.114109 14.916736 1 1 +104000 -3.177017 14.646842 1 1 +104100 -3.239903 14.371203 1 1 +104200 -3.302782 14.089859 1 1 +104300 -3.365658 13.802832 1 1 +104400 -3.428533 13.510135 1 1 +104500 -3.491407 13.211772 1 1 +104600 -3.554282 12.907747 1 1 +104700 -3.617156 12.598062 1 1 +104800 -3.680030 12.282717 1 1 +104900 -3.742904 11.961713 1 1 +105000 -3.805779 11.635050 1 1 +105100 -3.868653 11.366392 1 1 +105200 -3.931527 11.028412 1 1 +105300 -3.994401 10.684773 1 1 +105400 -4.057276 10.335475 1 1 +105500 -4.120150 9.980518 1 1 +105600 -4.183024 9.619903 1 1 +105700 -4.245898 9.253629 1 1 +105800 -4.308773 8.881696 1 1 +105900 -4.371647 8.504105 1 1 +106000 -4.434521 8.120855 1 1 +106100 -4.497395 7.731946 1 1 +106200 -4.560270 7.337379 1 1 +106300 -4.623144 6.937153 1 1 +106400 -4.686018 6.531268 1 1 +106500 -4.748892 6.119724 1 1 +106600 -4.811767 5.702522 1 1 +106700 -4.874669 5.279662 1 1 +106800 -4.937666 4.851142 1 1 +106900 -5.000705 4.416961 1 1 +107000 -5.063759 3.977115 1 1 +107100 -5.126819 3.531598 1 1 +107200 -5.189881 3.080409 1 1 +107300 -5.252943 2.623547 1 1 +107400 -5.316006 2.161010 1 1 +107500 -5.379069 1.692798 1 1 +107600 -5.442132 1.218910 1 1 +107700 -5.505195 0.739347 1 1 +107800 -5.568258 0.254108 1 1 +107900 -5.631321 -0.236807 1 1 +108000 -5.694385 -0.733397 1 1 +108100 -5.757448 -1.235663 1 1 +108200 -5.820511 -1.743604 1 1 +108300 -5.883574 -2.257221 1 1 +108400 -5.946637 -2.776514 1 1 +108500 -6.009700 -3.301483 1 1 +108600 -6.072763 -3.832127 1 1 +108700 -6.135826 -4.368447 1 1 +108800 -6.198889 -4.910442 1 1 +108900 -6.261952 -5.458113 1 1 +109000 -6.325015 -6.011460 1 1 +109100 -6.388078 -6.570483 1 1 +109200 -6.451141 -7.135181 1 1 +109300 -6.514204 -7.705555 1 1 +109400 -6.577267 -8.281604 1 1 +109500 -6.640330 -8.863330 1 1 +109600 -6.703394 -9.450730 1 1 +109700 -6.766457 -10.043807 1 1 +109800 -6.829520 -10.642559 1 1 +109900 -6.892583 -11.246987 1 1 +110000 -4.415590 -11.857091 1 1 +110100 2.800439 -12.467163 1 1 +110200 5.455068 -12.876253 1 1 +110300 6.431651 -12.934338 1 1 +110400 6.790916 -12.714486 1 1 +110500 6.923082 -12.315985 1 1 +110600 6.971704 -11.812538 1 1 +110700 6.989590 -11.250344 1 1 +110800 6.996170 -10.656199 1 1 +110900 6.998591 -10.044990 1 1 +111000 6.999482 -9.424779 1 1 +111100 6.999809 -8.799857 1 1 +111200 6.999930 -8.172483 1 1 +111300 6.999974 -7.543838 1 1 +111400 6.999991 -6.914536 1 1 +111500 6.999997 -6.284896 1 1 +111600 6.999999 -5.655081 1 1 +111700 7.000000 -5.025176 1 1 +111800 7.000000 -4.395225 1 1 +111900 7.000000 -3.765250 1 1 +112000 7.000000 -3.135263 1 1 +112100 7.000000 -2.505269 1 1 +112200 7.000000 -1.875273 1 1 +112300 7.000000 -1.245275 1 1 +112400 7.000000 -0.615275 1 1 +112500 7.000000 0.014724 1 1 +112600 7.000000 0.644724 1 1 +112700 7.000000 1.274724 1 1 +112800 7.000000 1.904724 1 1 +112900 7.000000 2.534724 1 1 +113000 7.000000 3.164724 1 1 +113100 7.000000 3.794724 1 1 +113200 7.000000 4.424724 1 1 +113300 7.000000 5.054724 1 1 +113400 7.000000 5.684724 1 1 +113500 7.000000 6.314724 1 1 +113600 7.000000 6.944724 1 1 +113700 7.000000 7.574724 1 1 +113800 7.000000 8.204724 1 1 +113900 7.000000 8.834724 1 1 +114000 7.000000 9.464724 1 1 +114100 7.000000 10.094724 1 1 +114200 7.000000 10.724724 1 1 +114300 7.000000 11.354724 1 1 +114400 7.000000 11.878000 1 1 +114500 6.996924 12.508000 1 1 +114600 6.951743 13.137993 1 1 +114700 6.881487 13.767358 1 1 +114800 6.802007 14.394140 1 1 +114900 6.719133 15.016417 1 1 +115000 6.635011 15.632864 1 1 +115100 6.550430 16.242673 1 1 +115200 6.465680 16.845387 1 1 +115300 6.380868 17.440751 1 1 +115400 6.296032 18.028629 1 1 +115500 6.211189 18.608951 1 1 +115600 6.126342 19.181677 1 1 +115700 6.041494 19.746787 1 1 +115800 5.956646 20.304273 1 1 +115900 5.871798 20.854127 1 1 +116000 5.786949 21.396348 1 1 +116100 5.702101 21.930935 1 1 +116200 5.617252 22.457885 1 1 +116300 5.532404 22.977200 1 1 +116400 5.447555 23.488879 1 1 +116500 5.362707 23.992921 1 1 +116600 5.277858 24.489327 1 1 +116700 5.193010 24.978096 1 1 +116800 5.108161 25.459230 1 1 +116900 5.023313 25.932727 1 1 +117000 4.938464 26.398587 1 1 +117100 4.853616 26.856811 1 1 +117200 4.768767 27.307399 1 1 +117300 4.683919 27.750351 1 1 +117400 4.599071 28.185666 1 1 +117500 4.514222 28.613345 1 1 +117600 4.429374 29.033387 1 1 +117700 4.344525 29.445793 1 1 +117800 4.260513 29.850563 1 1 +117900 4.187957 30.247698 1 1 +118000 4.122222 30.637368 1 1 +118100 4.058997 31.020104 1 1 +118200 3.996695 31.396429 1 1 +118300 3.934733 31.766704 1 1 +118400 3.872895 32.131149 1 1 +118500 3.811104 32.489887 1 1 +118600 3.749329 32.842989 1 1 +118700 3.687561 33.190491 1 1 +118800 3.625795 33.532413 1 1 +118900 3.564030 33.868764 1 1 +119000 3.502265 34.199551 1 1 +119100 3.440500 34.524777 1 1 +119200 3.378735 34.844441 1 1 +119300 3.316970 35.158547 1 1 +119400 3.255206 35.467093 1 1 +119500 3.193441 35.770080 1 1 +119600 3.131676 36.067508 1 1 +119700 3.069912 36.359377 1 1 +119800 3.008147 36.645687 1 1 +119900 2.946382 36.926439 1 1 +120000 2.884618 37.201631 1 1 +120100 2.822853 37.471265 1 1 +120200 2.761088 37.735340 1 1 +120300 2.699323 37.993856 1 1 +120400 2.637559 38.246813 1 1 +120500 2.575794 38.494212 1 1 +120600 2.514029 38.736052 1 1 +120700 2.452265 38.972333 1 1 +120800 2.390500 39.203055 1 1 +120900 2.328735 39.428218 1 1 +121000 2.266970 39.647822 1 1 +121100 2.205206 39.861868 1 1 +121200 2.143373 40.070355 1 1 +121300 2.080612 40.273282 1 1 +121400 2.017297 40.470637 1 1 +121500 1.953779 40.662377 1 1 +121600 1.890187 40.848458 1 1 +121700 1.826566 41.028851 1 1 +121800 1.762936 41.203540 1 1 +121900 1.699302 41.372513 1 1 +122000 1.635666 41.535765 1 1 +122100 1.572030 41.693293 1 1 +122200 1.508394 41.845096 1 1 +122300 1.444757 41.991172 1 1 +122400 1.381121 42.131522 1 1 +122500 1.317485 42.266144 1 1 +122600 1.253848 42.395039 1 1 +122700 1.190212 42.518208 1 1 +122800 1.126576 42.635648 1 1 +122900 1.062939 42.747362 1 1 +123000 0.999303 42.853348 1 1 +123100 0.935667 42.953607 1 1 +123200 0.872030 43.048139 1 1 +123300 0.808394 43.136944 1 1 +123400 0.744757 43.220021 1 1 +123500 0.681121 43.297371 1 1 +123600 0.617485 43.368994 1 1 +123700 0.553848 43.434889 1 1 +123800 0.490212 43.495057 1 1 +123900 0.426576 43.549498 1 1 +124000 0.362939 43.598212 1 1 +124100 0.299303 43.641198 1 1 +124200 0.235667 43.678457 1 1 +124300 0.172030 43.709989 1 1 +124400 0.108394 43.735794 1 1 +124500 -0.322177 43.755871 1 1 +124600 -0.826497 43.768541 1 1 +124700 -1.012026 43.755038 1 1 +124800 -1.080279 43.709863 1 1 +124900 -1.105387 43.641596 1 1 +125000 -1.114624 43.558962 1 1 +125100 -1.118022 43.468026 1 1 +125200 -1.119272 43.372489 1 1 +125300 -1.119732 43.274463 1 1 +125400 -1.119902 43.175114 1 1 +125500 -1.119964 43.075069 1 1 +125600 -1.119987 42.974661 1 1 +125700 -1.119995 42.874063 1 1 +125800 -1.119998 42.773367 1 1 +125900 -1.119999 42.672621 1 1 +126000 -1.120000 42.571849 1 1 +126100 -1.120000 42.471063 1 1 +126200 -1.120000 42.370270 1 1 +126300 -1.120000 42.269474 1 1 +126400 -1.120000 42.168676 1 1 +126500 -1.120000 42.067877 1 1 +126600 -1.120000 41.967077 1 1 +126700 -1.120000 41.866278 1 1 +126800 -1.120000 41.765478 1 1 +126900 -1.120000 41.664678 1 1 +127000 -1.120000 41.563878 1 1 +127100 -1.120000 41.463078 1 1 +127200 -1.120000 41.362278 1 1 +127300 -1.120000 41.261478 1 1 +127400 -1.120000 41.160678 1 1 +127500 -1.120000 41.059878 1 1 +127600 -1.120000 40.959078 1 1 +127700 -1.120000 40.858278 1 1 +127800 -1.120000 40.757478 1 1 +127900 -1.120000 40.656678 1 1 +128000 -1.120000 40.555878 1 1 +128100 -1.120000 40.455078 1 1 +128200 -1.120000 40.354278 1 1 +128300 -1.120000 40.253478 1 1 +128400 -1.120000 40.152678 1 1 +128500 -1.120000 40.051878 1 1 +128600 -1.120000 39.951078 1 1 +128700 -1.120000 39.850278 1 1 +128800 -1.120000 39.749478 1 1 +128900 -1.120000 39.648678 1 1 +129000 -1.120000 39.547878 1 1 +129100 -1.120000 39.447078 1 1 +129200 -1.120000 39.346278 1 1 +129300 -1.120000 39.245478 1 1 +129400 -1.120000 39.144678 1 1 +129500 -1.120000 39.043878 1 1 +129600 -1.120000 38.943078 1 1 +129700 -1.120000 38.842278 1 1 +129800 -1.120000 38.741478 1 1 +129900 -1.120000 38.640678 1 1 +130000 -1.120000 38.539878 1 1 +130100 -1.120000 38.439078 1 1 +130200 -1.120000 38.338278 1 1 +130300 -1.120000 38.237478 1 1 +130400 -1.120000 38.136678 1 1 +130500 -1.120000 38.035878 1 1 +130600 -1.120000 37.935078 1 1 +130700 -1.120000 37.834278 1 1 +130800 -1.120000 37.733478 1 1 +130900 -1.120000 37.632678 1 1 +131000 -1.120000 37.531878 1 1 +131100 -1.120000 37.431078 1 1 +131200 -1.120000 37.330278 1 1 +131300 -1.120000 37.229478 1 1 +131400 -1.120000 37.128678 1 1 +131500 -1.120000 37.027878 1 1 +131600 -1.120000 36.927078 1 1 +131700 -1.120000 36.826278 1 1 +131800 -1.120000 36.725478 1 1 +131900 -1.120000 36.624678 1 1 +132000 -1.120000 36.523878 1 1 +132100 -1.120000 36.423078 1 1 +132200 -1.120000 36.322278 1 1 +132300 -1.120000 36.221478 1 1 +132400 -1.120000 36.120678 1 1 +132500 -1.120000 36.019878 1 1 +132600 -1.120000 35.919078 1 1 +132700 -1.120000 35.818278 1 1 +132800 -1.120000 35.717478 1 1 +132900 -1.120000 35.616678 1 1 +133000 -1.120000 35.515878 1 1 +133100 -1.120000 35.415078 1 1 +133200 -1.120000 35.314278 1 1 +133300 -1.120000 35.213478 1 1 +133400 -1.120000 35.112678 1 1 +133500 -1.120000 35.011878 1 1 +133600 -1.120000 34.911078 1 1 +133700 -1.120000 34.810278 1 1 +133800 -1.120000 34.709478 1 1 +133900 -1.120000 34.608678 1 1 +134000 -1.120000 34.507878 1 1 +134100 -1.120000 34.407078 1 1 +134200 -1.120000 34.306278 1 1 +134300 -1.120000 34.205478 1 1 +134400 -1.120000 34.104678 1 1 +134500 -1.120000 34.003878 1 1 +134600 -1.120000 33.903078 1 1 +134700 -1.120000 33.802278 1 1 +134800 -1.120000 33.701478 1 1 +134900 -1.120000 33.600678 1 1 +135000 -1.120000 33.499878 1 1 +135100 -1.120000 33.399078 1 1 +135200 -1.120000 33.298278 1 1 +135300 -1.120000 33.197478 1 1 +135400 -1.120000 33.096678 1 1 +135500 -1.120000 32.995878 1 1 +135600 -1.120000 32.895078 1 1 +135700 -1.120000 32.794278 1 1 +135800 -1.120000 32.693478 1 1 +135900 -1.120000 32.592678 1 1 +136000 -1.120000 32.491878 1 1 +136100 -1.120000 32.391078 1 1 +136200 -1.120000 32.290278 1 1 +136300 -1.120000 32.189478 1 1 +136400 -1.120000 32.088678 1 1 +136500 -1.120000 31.987878 1 1 +136600 -1.120000 31.887078 1 1 +136700 -1.120000 31.786278 1 1 +136800 -1.120000 31.685478 1 1 +136900 -1.120000 31.584678 1 1 +137000 -1.120000 31.483878 1 1 +137100 -1.120000 31.383078 1 1 +137200 -1.120000 31.282278 1 1 +137300 -1.120000 31.181478 1 1 +137400 -1.120000 31.080678 1 1 +137500 -1.120000 30.979878 1 1 +137600 -1.120000 30.879078 1 1 +137700 -1.120000 30.778278 1 1 +137800 -1.120000 30.677478 1 1 +137900 -1.120000 30.576678 1 1 +138000 -1.120000 30.475878 1 1 +138100 -1.120000 30.375078 1 1 +138200 -1.120000 30.274278 1 1 +138300 -1.120000 30.173478 1 1 +138400 -1.120000 30.072678 1 1 +138500 -1.120000 29.971878 1 1 +138600 -1.120000 29.871078 1 1 +138700 -1.120000 29.770278 1 1 +138800 -1.120000 29.669478 1 1 +138900 -1.120000 29.568678 1 1 +139000 -1.120000 29.467878 1 1 +139100 -1.120000 29.367078 1 1 +139200 -1.120000 29.266278 1 1 +139300 -1.120000 29.165478 1 1 +139400 -1.120000 29.064678 1 1 +139500 -1.120000 28.963878 1 1 +139600 -1.120000 28.863078 1 1 +139700 -1.120000 28.762278 1 1 +139800 -1.120000 28.661478 1 1 +139900 -1.120000 28.560678 1 1 +140000 -1.120000 28.459878 1 1 +140100 -1.120000 28.359078 1 1 +140200 -1.120000 28.258278 1 1 +140300 -1.120000 28.157478 1 1 +140400 -1.120000 28.056678 1 1 +140500 -1.120000 27.955878 1 1 +140600 -1.120000 27.855078 1 1 +140700 -1.120000 27.754278 1 1 +140800 -1.120000 27.653478 1 1 +140900 -1.120000 27.552678 1 1 +141000 -1.120000 27.451878 1 1 +141100 -1.120000 27.351078 1 1 +141200 -1.120000 27.250278 1 1 +141300 -1.120000 27.149478 1 1 +141400 -1.120000 27.048678 1 1 +141500 -1.120000 26.947878 1 1 +141600 -1.120000 26.847078 1 1 +141700 -1.120000 26.746278 1 1 +141800 -1.120000 26.645478 1 1 +141900 -1.120000 26.544678 1 1 +142000 -1.120000 26.443878 1 1 +142100 -1.120000 26.343078 1 1 +142200 -1.120000 26.242278 1 1 +142300 -1.120000 26.141478 1 1 +142400 -1.120000 26.040678 1 1 +142500 -1.120000 25.939878 1 1 +142600 -1.120000 25.839078 1 1 +142700 -1.120000 25.738278 1 1 +142800 -1.120000 25.637478 1 1 +142900 -1.120000 25.536678 1 1 +143000 -1.120000 25.435878 1 1 +143100 -1.120000 25.335078 1 1 +143200 -1.120000 25.234278 1 1 +143300 -1.120000 25.133478 1 1 +143400 -1.120000 25.032678 1 1 +143500 -1.120000 24.931878 1 1 +143600 -1.120000 24.831078 1 1 +143700 -1.120000 24.730278 1 1 +143800 -1.120000 24.629478 1 1 +143900 -1.120000 24.528678 1 1 +144000 -1.120000 24.427878 1 1 +144100 -1.120000 24.327078 1 1 +144200 -1.120000 24.226278 1 1 +144300 -1.120000 24.125478 1 1 +144400 -1.120000 24.024678 1 1 +144500 -1.120000 23.923878 1 1 +144600 -1.120000 23.823078 1 1 +144700 -1.120000 23.722278 1 1 +144800 -1.120000 23.621478 1 1 +144900 -1.120000 23.520678 1 1 +145000 -1.120000 23.419878 1 1 +145100 -1.120000 23.319078 1 1 +145200 -1.120000 23.218278 1 1 +145300 -1.120000 23.117478 1 1 +145400 -1.120000 23.016678 1 1 +145500 -1.120000 22.915878 1 1 +145600 -1.120000 22.815078 1 1 +145700 -1.120000 22.714278 1 1 +145800 -1.120000 22.613478 1 1 +145900 -1.120000 22.512678 1 1 +146000 -1.120000 22.411878 1 1 +146100 -1.120000 22.311078 1 1 +146200 -1.120000 22.210278 1 1 +146300 -1.120000 22.109478 1 1 +146400 -1.120000 22.008678 1 1 +146500 -1.120000 21.907878 1 1 +146600 -1.120000 21.807078 1 1 +146700 -1.120000 21.706278 1 1 +146800 -1.120000 21.605478 1 1 +146900 -1.120000 21.504678 1 1 +147000 -1.120000 21.403878 1 1 +147100 -1.120000 21.303078 1 1 +147200 -1.120000 21.202278 1 1 +147300 -1.120000 21.101478 1 1 +147400 -1.120000 21.000678 1 1 +147500 -1.120000 20.899878 1 1 +147600 -1.120000 20.799078 1 1 +147700 -1.120000 20.698278 1 1 +147800 -1.120000 20.597478 1 1 +147900 -0.916978 20.496678 1 1 +148000 -0.337338 20.396334 1 1 +148100 -0.124100 20.312486 1 1 +148200 -0.045654 20.257018 1 1 +148300 -0.016795 20.223971 1 1 +148400 -0.006179 20.205324 1 1 +148500 -0.002273 20.195132 1 1 +148600 -0.000836 20.189672 1 1 +148700 -0.000308 20.186785 1 1 +148800 -0.000113 20.185271 1 1 +148900 -0.000042 20.184483 1 1 +149000 -0.000015 20.184075 1 1 +149100 -0.000006 20.183863 1 1 +149200 -0.000002 20.183754 1 1 +149300 -0.000001 20.183698 1 1 +149400 -0.000000 20.183669 1 1 +149500 -0.000000 20.183654 1 1 +149600 -0.000000 20.183646 1 1 +149700 -0.000000 20.183642 1 1 +149800 -0.000000 20.183640 1 1 +149900 -0.000000 20.183639 1 1 +150000 -0.000000 20.183639 1 1 +150100 -0.000000 20.183638 1 1 +150200 -0.000000 20.183638 1 1 +150300 -0.000000 20.183638 1 1 +150400 -0.000000 20.183638 1 1 +150500 -0.000000 20.183638 1 1 +150600 -0.000000 20.183638 1 1 +150700 -0.000000 20.183638 1 1 +150800 -0.000000 20.183638 1 1 +150900 -0.000000 20.183638 1 1 +151000 -0.000000 20.183638 1 1 +151100 -0.000000 20.183638 1 1 +151200 -0.000000 20.183638 1 1 +151300 -0.000000 20.183638 1 1 +151400 -0.000000 20.183638 1 1 +151500 -0.000000 20.183638 1 1 +151600 -0.000000 20.183638 1 1 +151700 -0.000000 20.183638 1 1 +151800 -0.000000 20.183638 1 1 +151900 -0.000000 20.183638 1 1 +152000 -0.000000 20.183638 1 1 +152100 -0.000000 20.183638 1 1 +152200 -0.000000 20.183638 1 1 +152300 -0.000000 20.183638 1 1 +152400 -0.000000 20.183638 1 1 +152500 -0.000000 20.183638 1 1 +152600 -0.000000 20.183638 1 1 +152700 -0.000000 20.183638 1 1 +152800 -0.000000 20.183638 1 1 +152900 -0.000000 20.183638 1 1 +153000 -0.000000 20.183638 1 1 +153100 -0.000000 20.183638 1 1 +153200 -0.000000 20.183638 1 1 +153300 -0.000000 20.183638 1 1 +153400 -0.000000 20.183638 1 1 +153500 -0.000000 20.183638 1 1 +153600 -0.000000 20.183638 1 1 +153700 -0.000000 20.183638 1 1 +153800 -0.000000 20.183638 1 1 +153900 -0.000000 20.183638 1 1 +154000 -0.000000 20.183638 1 1 +154100 -0.000000 20.183638 1 1 +154200 -0.000000 20.183638 1 1 +154300 -0.000000 20.183638 1 1 +154400 -0.000000 20.183638 1 1 +154500 -0.000000 20.183638 1 1 +154600 -0.000000 20.183638 1 1 +154700 -0.000000 20.183638 1 1 +154800 -0.000000 20.183638 1 1 +154900 -0.000000 20.183638 1 1 +155000 -0.000000 20.183638 1 1 +155100 -0.000000 20.183638 1 1 +155200 -0.000000 20.183638 1 1 +155300 -0.000000 20.183638 1 1 +155400 -0.000000 20.183638 1 1 +155500 -0.000000 20.183638 1 1 +155600 -0.000000 20.183638 1 1 +155700 -0.000000 20.183638 1 1 +155800 -0.000000 20.183638 1 1 +155900 -0.000000 20.183638 1 1 +156000 -0.000000 20.183638 1 1 +156100 -0.000000 20.183638 1 1 +156200 -0.000000 20.183638 1 1 +156300 -0.000000 20.183638 1 1 +156400 -0.000000 20.183638 1 1 +156500 -0.000000 20.183638 1 1 +156600 -0.000000 20.183638 1 1 +156700 -0.000000 20.183638 1 1 +156800 -0.000000 20.183638 1 1 +156900 -0.000000 20.183638 1 1 +157000 -0.000000 20.183638 1 1 +157100 -0.000000 20.183638 1 1 +157200 -0.000000 20.183638 1 1 +157300 -0.000000 20.183638 1 1 +157400 -0.000000 20.183638 1 1 +157500 -0.000000 20.183638 1 1 +157600 -0.000000 20.183638 1 1 +157700 -0.000000 20.183638 1 1 +157800 -0.000000 20.183638 1 1 +157900 -0.000000 20.183638 1 1 +158000 -0.000000 20.183638 1 1 +158100 -0.000000 20.183638 1 1 +158200 -0.000000 20.183638 1 1 +158300 -0.000000 20.183638 1 1 +158400 -0.000000 20.183638 1 1 +158500 -0.000000 20.183638 1 1 +158600 -0.000000 20.183638 1 1 +158700 -0.000000 20.183638 1 1 +158800 -0.000000 20.183638 1 1 +158900 -0.000000 20.183638 1 1 +159000 -0.000000 20.183638 1 1 +159100 -0.000000 20.183638 1 1 +159200 -0.000000 20.183638 1 1 +159300 -0.000000 20.183638 1 1 +159400 -0.000000 20.183638 1 1 +159500 -0.000000 20.183638 1 1 +159600 -0.000000 20.183638 1 1 +159700 -0.000000 20.183638 1 1 +159800 -0.000000 20.183638 1 1 +159900 -0.000000 20.183638 1 1 Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/tests/ICPC/Logs.xls and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/tests/ICPC/Logs.xls differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/tests/ICPC/Manual.pdf and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/tests/ICPC/Manual.pdf differ diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/ReadMe.txt frama-c-20150201+sodium+dfsg/tests/ICPC/ReadMe.txt --- frama-c-20140301+neon+dfsg/tests/ICPC/ReadMe.txt 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/ReadMe.txt 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,112 @@ +======================================================================== + Robot Controller ICPC2011-Challenge Project Overview +======================================================================== + +This section contains a summary of what you will find in each of the files +that make up your ICPC2011-Challenge application. All challenge source code +is written in C. + +Source code in directory "src": + + main.c + This is the main application source file. You wrote this when you + started your job to try out the controller with different inputs. + main_testcase_1.c + This is the first testcase of a bad execution. It loads + roco_config_testcase_1.h and changes the commands at the end of main(). + main_testcase_2.c + This is the second testcase. It loads roco_config_testcase_2.h and + changes the commands at the end of main(). + main_testcase_3.c + This is the third testcase. It loads roco_config_testcase_3.h and + changes the commands at the end of main(). + roco.h, roco.c + Code for the robot controller. + roco_config.h, roco_config_testcase_1.h, roco_config_testcase_2.h, + roco_config_testcase_3.h + One default and three customer-supplied configurations that are used in + robot leg applications. + sim.h, sim.c + Robot Controller simulator code. Makes the controller think there's a + robot leg attached to it. + external.h + Typedefs to insulate us from the changing whims of the C language + committee, and declarations for many controller variables and functions. + impls.c + Standard library functions that realize some common control system + functions. + resource.h, stdafx.cpp + Boilerplate code for Visual Studio 2010 C++ project. + stdafx.h + The main include file for the Visual Studio 2010 project. Every .c (and + .cpp) file includes this. + +----------------------------------------------------------------------------- + +This section describes how to compile and build the code. + +Visual Studio 2010-specific directions: + 1. First unzip the VS2010.zip file to create a VS2010 directory with a + pre-configured C++ solution (ICPC2011-Challenge.sln) for this + challenge. Be sure to put the VS2010 directory in the same parent + directory that the src/ directory is in (or you'll have to edit a lot + of file paths in ICPC2011-Challenge.vcxproj). + 2. To define a preprocessor directive for the entire project, right-click + on the ICPC2011-Challenge project in the Solution Explorer tool pane + and choose Properties. Open up the C/C++ node in the treeview and + click on Preprocessor. Add your desired directive to the semi-colon + separated list of preprocessor directives. + +Other operating systems: + 1. Use "make" with your favorite C compiler (we use gcc) to compile the + four different variants of the test code. + +----------------------------------------------------------------------------- + +This section describes the bugs that have been reported by the +RobotControllers.com customers. + +For each reported erroneous test case, see the attached customer +configuration and log file. +All times are given in milliseconds in the log files and in seconds in the +following (t=time). + +Test Case 1: (To reproduce, define a preprocessor directive TESTCASE=1) + Error description: From time t=50, it takes around 85 seconds to move by + 70 degrees! With the given configuration + (roco_config_testcase_1.h), it should only take about + 10 seconds. + Movement in the other direction, e.g. at t=30 or t=160, + is OK. + Issued commands: t=30: moveto 25, t=50: moveby -70, t=160: moveto -20 + +Test Case 2: (To reproduce, define a preprocessor directive TESTCASE=2) + Error description: The robot leg does not stop jiggling when it hits the + target angle. + Issued commands: t=60: moveto -30, t=100: moveto 30, t=140: moveto -10, + t=180: shutoff + +Test Case 3: (To reproduce, define a preprocessor directive TESTCASE=3) + Error description: This test case destroyed the robot! + After destroying 3 or 4 robots in our debugging + process, they believe the cause is due to the voltage + being inverted too quickly at time t=90. + They also noticed that at time t=50, the voltage drops + much too quickly. + Issued commands: t=60: moveto 20, t=100: moveto -20, t=110: moveto 20 + +To run with a default (non-erroneous) configuration and command sequence, +remove any preprocessor definition for TESTCASE. + +----------------------------------------------------------------------------- + +This section describes how to use the acceptance test script we have provided. + +eval.py is a Python (2.6) script that you should use to validate your fixes. +Redirect the test driver's output into this script, and give the test case +number as an argument. The test case commands are coded into the script, so +take care that you don't modify the test commands sequence and timing (or if +you must, be sure to adjust/extend the script accordingly). When the script +outputs "found 0 error(s)", then your solution is very likely correct. + +Example usage: python eval.py 2 < log2.csv diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/external.h frama-c-20150201+sodium+dfsg/tests/ICPC/src/external.h --- frama-c-20140301+neon+dfsg/tests/ICPC/src/external.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/external.h 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,156 @@ +/* + * Global definitions and library functions. + */ + +#ifndef extern_H_ +#define extern_H_ + +/* BASIC TYPES */ +typedef unsigned long uint64; +typedef unsigned int uint32; +typedef int sint32; +typedef short sint16; +typedef unsigned char uint8; +typedef unsigned short uint16; +typedef char boolean; +typedef double real64; + +/* BASIC MACROS */ +#define FALSE 0 +#define TRUE 1 + + +extern real64 Engine_maxVoltage_PARAM; +extern real64 Engine_minVoltage_PARAM; + + +/* -- external messages -- */ +extern real64 Battery_voltage; +extern real64 dT; +extern real64 Engine_realVoltage; +extern real64 Env_humidity; +extern real64 Env_temperature; +extern boolean Global_emergencyMode; +extern boolean LegSensor_atMark; +extern real64 LegSensor_signal; + + +/* ---------------------------- FILTERS ------------------ */ + +typedef real64 PT1_t; + +/* Proportional element with 1st order time delay (Kp=1). + + x Input value for the PT1 element + state Internal state of the PT1 element + t1Rec Time factor as reciprocal value. + dt Sample time. + + Returns the PT1 filtered response to the input signal. +*/ +real64 PT1_Filter(PT1_t *state, real64 x, real64 t1, real64 Dt); + +/* set the state of the filter */ +#define PT1_SetState(STATE, VAL) ( (*(STATE)) = (VAL) ) + + +/* ------------------------- INTERPOLATION ------------------------ */ + +#define MAX_CURVE_POINTS 10 + +typedef struct { + uint16 numPoints; + real64 x[MAX_CURVE_POINTS]; + real64 y[MAX_CURVE_POINTS]; +} Curve_t; + +/* Interpolates the curve at position X by calculating: + + (y1-y0) * (X-x0) + result = y0 + ------------------ + (x1-x0) + where: + x0 = position before X + x1 = position after X + y0 = value at x0 + y1 = value at x1 +*/ +real64 Interpolate_from_curve(Curve_t *curve, real64 x); + +/* --------------------------------- DELAY ------------------------- */ + +typedef real64 Delay_t; + +/* When signal turns from FALSE to TRUE, this is delayed by the function + by timeLimit seconds. + + signal = incoming signal + timeLimit = delay time + dT = time since last call (time raster) + + Return value is the delayed logical value. + */ +boolean Turn_on_delay(Delay_t *delay, boolean signal, real64 timeLimit, real64 dT); + +/* --------------------------------- TIMER ------------------------- */ + +typedef real64 Timer_t; + +/* Start the timer at zero. */ +void Timer_start(Timer_t *timer); + +/* Get the time that has elapsed since the timer has been started. */ +real64 Timer_elapsedTime(Timer_t *timer); + +/* Advance the timer by the specified time dT. */ +void Timer_tick(Timer_t *timer, real64 dT); + +/* ------------------------------- RAMP ----------------------------- */ + +typedef struct { + sint16 dir; + real64 state; + real64 target; +} Ramp_t; + +/* A ramp performs a linear transition from the current (internal) value to the + target value. The slope of the ramp can be specified as a parameter. + This function calculates the new ramp value and returns it. + + target = target value of the ramp + slopePos = positive slope (i.e. when ramp is rising) + slopeNeg = negative slope (i.e. when ramp is falling) + dT = time since last call, i.e. time raster + + Returns the current ramp value. + */ +real64 Ramp_out(Ramp_t *data, real64 target, real64 slopePos, real64 slopeNeg, + real64 dT); + +/* Returns the current direction of the ramp: + -1 = falling, 0 = constant (target reached), 1 = rising + */ +sint16 Ramp_getDir(Ramp_t *data); + +/* Returns the current value of the ramp (without calculation). */ +real64 Ramp_getValue(Ramp_t *data); + +/* Returns TRUE when the target value has been reached. */ +boolean Ramp_targetReached(Ramp_t *data); + +/* ------------------------------------------ LIMITER ------------------------- */ + +/* Limits a value by an interval (min, max). + The returned value is guaranteed to lie within the given interval. + */ +real64 Limiter_out (real64 min, real64 input, real64 max); + +/* ---------------------------------- INTERNAL TIMER --------------------------- */ + +/* stops processing for delayMs milliseconds */ +void Sleep(sint32 delayMs); + +/* gets the current system time */ +sint32 Time(); + +#endif /* extern_H_ */ diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/fc.sh frama-c-20150201+sodium+dfsg/tests/ICPC/src/fc.sh --- frama-c-20140301+neon+dfsg/tests/ICPC/src/fc.sh 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/fc.sh 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,7 @@ +#!/bin/bash + +export CPP="gcc -Dfprintf=Frama_C_show_each -DTESTCASE=$1 -C -E -nostdinc -I. -I../../../share/libc" +FILES="../../../share/libc/math.c impls.c main.c roco.c sim.c" +TESTCASE="main_testcase_$1.c" + +exec ../../../bin/toplevel.opt ${FILES} ${TESTCASE} -val -val-signed-overflow-alarms -calldeps -save state$1 diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/impls.c frama-c-20150201+sodium+dfsg/tests/ICPC/src/impls.c --- frama-c-20140301+neon+dfsg/tests/ICPC/src/impls.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/impls.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,162 @@ +/* + * Standard implementations of some general-purpose library functions. + * See external.h for interface documentation. + */ + +#include "stdafx.h" /* Must be first line of code in the file */ + +/* -- external messages -- */ +real64 Battery_voltage; +real64 dT; +real64 Engine_realVoltage; +real64 Env_humidity; +real64 Env_temperature; +boolean Global_emergencyMode; +boolean LegSensor_atMark; +real64 LegSensor_signal; + + +/* ------------------------ INTERPOLATION AND FILTERS ------------------------- */ + +real64 PT1_Filter(PT1_t *state, real64 x, real64 t1, real64 dt) { + if (t1 == 0.0) { + *state = x; + } + else { + real64 c = exp(-dt/t1); + *state = (1.0 - c) * x + c * (*state); + } + return *state; +} + + +real64 Interpolate_from_curve(Curve_t *curve, real64 x) { + real64 result = 0.0; + sint16 i; + + if( x <= curve->x[0]) { + result = curve->y[0]; + } + else + { + if (x >= curve->x[curve->numPoints-1]) { + result = curve->y[curve->numPoints-1]; + } + else { + for (i=curve->numPoints-2; i>=0; i--) { + if (x >= curve->x[i]) { + result = curve->y[i] + + (x - curve->x[i]) / (curve->x[i+1] - curve->x[i]) * + (curve->y[i+1] - curve->y[i]); + break; + } + } + } + } + return result; +} + +/* ------------------------------- TIMERS AND DELAY -------------------------- */ + +boolean Turn_on_delay(Delay_t *delay, boolean signal, real64 timeLimit, real64 dt) { + boolean result; + if (signal) { + if (*delay < timeLimit) { + *delay += dt; + result = FALSE; + } + else { + result = TRUE; + } + } + else { + *delay = 0.0; + result = FALSE; + } + return result; +} + + +void Timer_start(Timer_t *timer) { + *timer = 0.0; +} + +real64 Timer_elapsedTime(Timer_t *timer) { + return *timer; +} + +void Timer_tick(Timer_t *timer, real64 dt) { + *timer += dt; +} + +static sint32 _t; + +void Sleep(sint32 delayMs) { + /* system-specific implementation */ + _t += delayMs; +} + +sint32 Time() { + /* system-specific implementation */ + return _t; +} + +/* ----------------------------------- RAMP ------------------------------------ */ + +real64 Ramp_out(Ramp_t *data, real64 target, real64 slopePos, real64 slopeNeg, + real64 dt) { + data->target = target; + if ((data->state < target) && (slopePos != 0.0)) { + if (data->dir == -1) { + data->state = target; + } + else { + data->state += slopePos * dt; + if (data->state > target) { + data->state = target; + } + data->dir = 1; + } + } + else if ((data->state > target) && (slopeNeg != 0.0)) { + if (data->dir == 1) { + data->state = target; + } + else { + data->state -= slopeNeg * dt; + if (data->state < target) { + data->state = target; + } + data->dir = -1; + } + } + if (data->state == target) { + data->dir = 0; + } + return data->state; +} + +sint16 Ramp_getDir(Ramp_t *data) { + return data->dir; +} + +real64 Ramp_getValue(Ramp_t *data) { + return data->state; +} + +boolean Ramp_targetReached(Ramp_t *data) { + return data->state == data->target; +} + +/* -------------------------------- LIMITER ------------------------------- */ + +real64 Limiter_out (real64 min, real64 input, real64 max) { + real64 result = input; + if (result < min) { + result = min; + } + if (result > max) { + result = max; + } + return result; +} diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/main.c frama-c-20150201+sodium+dfsg/tests/ICPC/src/main.c --- frama-c-20140301+neon+dfsg/tests/ICPC/src/main.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/main.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,70 @@ +/* + * Test driver to demonstrate the RoCo module in collaboration + * with the robot arm simulator. + */ + +#include "stdafx.h" + +#include "roco.h" +#include "sim.h" + +#ifndef TESTCASE + +char *output_header = "time(ms)\tengineVoltage\tlegAngle\tlegAngleValid\tisActive\n"; +char *output_row_fmt_string = "%d\t%f\t%f\t%d\t%d\n"; + +int main() + +{ + sint32 lastTime = Time(); + dT = 0.02; + RoCo_init(); + Sim_init(); + + Battery_voltage = 21.3; + Env_humidity = 0.5; + Env_temperature = 20.0; + Global_emergencyMode = FALSE; + + RoCo_activeDesired = TRUE; + RoCo_moveFast = FALSE; + int cnt = 0; + + fprintf(stderr, output_header); + + while (cnt < 9000) { + dT = (Time() - lastTime) / 1000.0; + lastTime = Time(); + RoCo_process(); + Sim_process(); + if (cnt % 5 == 0) { + fprintf(stderr, output_row_fmt_string, lastTime, RoCo_engineVoltage, + RoCo_legAngle, RoCo_legAngleValid, RoCo_isActive); + } + Sleep(20); /* milliseconds */ + cnt ++; + + if (cnt==2500) { + RoCo_commandMoveToAngle = TRUE; + RoCo_desiredTargetAngle = 15.0; + } + else if (cnt==3500) { + RoCo_commandMoveToAngle = TRUE; + RoCo_desiredTargetAngle = -55.0; + } + else if (cnt==5000) { + RoCo_commandMoveToAngle = TRUE; + RoCo_desiredTargetAngle = 30.0; + } + else if (cnt==7000) { + RoCo_commandMoveToAngle = TRUE; + RoCo_desiredTargetAngle = -5.0; + } + else if (cnt==8000) { + RoCo_commandShutOff = TRUE; + } + } + return 0; +} + +#endif /* TESTCASE */ diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/main_testcase_1.c frama-c-20150201+sodium+dfsg/tests/ICPC/src/main_testcase_1.c --- frama-c-20140301+neon+dfsg/tests/ICPC/src/main_testcase_1.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/main_testcase_1.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,67 @@ +/* + * Test driver to demonstrate the RoCo module in collaboration + * with the robot arm simulator. + */ + +#include "stdafx.h" /* Must be first line of code in the file */ + +#include "roco.h" +#include "sim.h" + +#if TESTCASE == 1 + +char *output_header = "time(ms)\tengineVoltage\tlegAngle\tlegAngleValid\tisActive\n"; +char *output_row_fmt_string = "%d\t%f\t%f\t%d\t%d\n"; + +int main() +{ + sint32 lastTime = Time(); + dT = 0.02; + RoCo_init(); + Sim_init(); + + Battery_voltage = 21.3; + Env_humidity = 0.5; + Env_temperature = 20.0; + Global_emergencyMode = FALSE; + + RoCo_activeDesired = TRUE; + RoCo_moveFast = FALSE; + int cnt = 0; + + fprintf(stderr, output_header); + + while (cnt < 10000) { + dT = (Time() - lastTime) / 1000.0; + lastTime = Time(); + RoCo_process(); + Sim_process(); + if (cnt % 5 == 0) { + fprintf(stderr, output_row_fmt_string, lastTime, RoCo_engineVoltage, + RoCo_legAngle, RoCo_legAngleValid, RoCo_isActive); + /* BM: the bug is detected at time 13400 by the script*/ + // @ assert lastTime != 13400 ; + } + Sleep(20); /* milliseconds */ + cnt ++; + + if (cnt==1500) { + RoCo_commandMoveToAngle = TRUE; + RoCo_desiredTargetAngle = 25.0; + } + else if (cnt==2500) { + RoCo_commandMoveByAngle = TRUE; + RoCo_desiredDeltaAngle = -70.0; + } + else if (cnt==8000) { + RoCo_commandMoveToAngle = TRUE; + RoCo_desiredTargetAngle = -20.0; + } + else if (cnt==9000) { + RoCo_commandShutOff = TRUE; + } + } + return 0; +} + +#endif diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/main_testcase_2.c frama-c-20150201+sodium+dfsg/tests/ICPC/src/main_testcase_2.c --- frama-c-20140301+neon+dfsg/tests/ICPC/src/main_testcase_2.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/main_testcase_2.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,65 @@ +/* + * Test driver to demonstrate the RoCo module in collaboration + * with the robot arm simulator. + */ + +#include "stdafx.h" /* Must be first line of code in the file */ + +#include "roco.h" +#include "sim.h" + +#if TESTCASE == 2 + +char *output_header = "time(ms)\tengineVoltage\tlegAngle\tlegAngleValid\tisActive\n"; +char *output_row_fmt_string = "%d\t%f\t%f\t%d\t%d\n"; + +int main() +{ + sint32 lastTime = Time(); + dT = 0.02; + RoCo_init(); + Sim_init(); + + Battery_voltage = 21.3; + Env_humidity = 0.5; + Env_temperature = 20.0; + Global_emergencyMode = FALSE; + + RoCo_activeDesired = TRUE; + RoCo_moveFast = FALSE; + int cnt = 0; + + fprintf(stderr, output_header); + + while (cnt < 9000) { + dT = (Time() - lastTime) / 1000.0; + lastTime = Time(); + RoCo_process(); + Sim_process(); + if (cnt % 5 == 0) { + fprintf(stderr, output_row_fmt_string, lastTime, RoCo_engineVoltage, + RoCo_legAngle, RoCo_legAngleValid, RoCo_isActive); + } + Sleep(20); /* milliseconds */ + cnt ++; + + if (cnt==3000) { + RoCo_commandMoveToAngle = TRUE; + RoCo_desiredTargetAngle = -30.0; + } + else if (cnt==5000) { + RoCo_commandMoveToAngle = TRUE; + RoCo_desiredTargetAngle = +30.0; + } + else if (cnt==7000) { + RoCo_commandMoveToAngle = TRUE; + RoCo_desiredTargetAngle = -10.0; + } + else if (cnt==9000) { + RoCo_commandShutOff = TRUE; + } + } + return 0; +} + +#endif /* TESTCASE */ diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/main_testcase_3.c frama-c-20150201+sodium+dfsg/tests/ICPC/src/main_testcase_3.c --- frama-c-20140301+neon+dfsg/tests/ICPC/src/main_testcase_3.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/main_testcase_3.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,62 @@ +/* + * Test driver to demonstrate the RoCo module in collaboration + * with the robot arm simulator. + */ + +#include "stdafx.h" /* Must be first line of code in the file */ + +#include "roco.h" +#include "sim.h" + +#if TESTCASE == 3 + +char *output_header = "time(ms)\tengineVoltage\tlegAngle\tlegAngleValid\tisActive\n"; +char *output_row_fmt_string = "%d\t%f\t%f\t%d\t%d\n"; + +int main() +{ + sint32 lastTime = Time(); + dT = 0.02; + RoCo_init(); + Sim_init(); + + Battery_voltage = 21.3; + Env_humidity = 0.5; + Env_temperature = 20.0; + Global_emergencyMode = FALSE; + + RoCo_activeDesired = TRUE; + RoCo_moveFast = FALSE; + int cnt = 0; + + fprintf(stderr, output_header); + + while (cnt < 8000) { + dT = (Time() - lastTime) / 1000.0; + lastTime = Time(); + RoCo_process(); + Sim_process(); + if (cnt % 5 == 0) { + fprintf(stderr, output_row_fmt_string, lastTime, RoCo_engineVoltage, + RoCo_legAngle, RoCo_legAngleValid, RoCo_isActive); + } + Sleep(20); /* milliseconds */ + cnt ++; + + if (cnt==3000) { + RoCo_commandMoveToAngle = TRUE; + RoCo_desiredTargetAngle = 20.0; + } + else if (cnt==5000) { + RoCo_commandMoveToAngle = TRUE; + RoCo_desiredTargetAngle = -20.0; + } + else if (cnt==5500) { + RoCo_commandMoveToAngle = TRUE; + RoCo_desiredTargetAngle = 20.0; + } + } + return 0; +} + +#endif /* TESTCASE */ diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/Makefile frama-c-20150201+sodium+dfsg/tests/ICPC/src/Makefile --- frama-c-20140301+neon+dfsg/tests/ICPC/src/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/Makefile 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,20 @@ +CC = gcc +CFLAGS = -lm +#-DFIX -DXXX -g + +SRC = roco.c impls.c sim.c main.c main_testcase_1.c main_testcase_2.c main_testcase_3.c +HEADERS = roco.h external.h sim.h stdafx.h roco_config.h roco_config_testcase_1.h roco_config_testcase_2.h roco_config_testcase_3.h + +all: roco_0.exe roco_1.exe roco_2.exe roco_3.exe + +roco_0.exe: $(SRC) $(HEADERS) roco_config.h + $(CC) $(CFLAGS) $(SRC) -o $@ +roco_1.exe: $(SRC) $(HEADERS) + $(CC) $(CFLAGS) -DTESTCASE=1 $(SRC) -o $@ +roco_2.exe: $(SRC) $(HEADERS) + $(CC) $(CFLAGS) -DTESTCASE=2 $(SRC) -o $@ +roco_3.exe: $(SRC) $(HEADERS) + $(CC) $(CFLAGS) -DTESTCASE=3 $(SRC) -o $@ + +clean: + rm -f roco_*.exe diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/metrics.html frama-c-20150201+sodium+dfsg/tests/ICPC/src/metrics.html --- frama-c-20140301+neon+dfsg/tests/ICPC/src/metrics.html 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/metrics.html 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,311 @@ + + + + + +

+

Metrics

+

Synthetic results

+
+Defined function (18):
+ +  Timer_start (3 calls); main (0 call); Timer_elapsedTime (2 calls); + Timer_tick (2 calls); Limiter_out (3 calls); Ramp_out (2 calls); + Ramp_getDir (1 call); Sleep (1 call); PT1_Filter (3 calls); + Time (3 calls); Ramp_getValue (0 call); + Ramp_targetReached (0 call); RoCo_init (1 call); + RoCo_process (1 call); Sim_process (1 call); + Interpolate_from_curve (3 calls); Sim_init (1 call); + Turn_on_delay (3 calls); +
+
+Undefined functions (3):
+ +  fabs (9 calls); fprintf (2 calls); exp (1 call); +
+
+Potential entry points (3):
+ +  main; Ramp_getValue; Ramp_targetReached; +
+
+SLOC: (420)
+Number of if statements: (100)
+Number of assignments: (207)
+Number of loops: (2)
+Number of calls: (42)
+Number of gotos: (13)
+Number of pointer access: (50)
+
+

Detailed results

+
+

sim.c

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function#If stmts
+
#Assignments
+
#Loops
+
#Calls
+
#Gotos
+
#Pointer accesses
+
#Exits
+
Cyclomatic value
+
Sim_process 4 22 0 2 1 0 1 5
Sim_init 0 11 0 0 0 0 1 1
+

roco.c

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function#If stmts
+
#Assignments
+
#Loops
+
#Calls
+
#Gotos
+
#Pointer accesses
+
#Exits
+
Cyclomatic value
+
RoCo_init 0 34 0 0 0 0 1 1
RoCo_process 71 85 0 29 11 0 1 72
+

main.c

+
+ + + + + + + + + + + + + + + + + + +
Function#If stmts
+
#Assignments
+
#Loops
+
#Calls
+
#Gotos
+
#Pointer accesses
+
#Exits
+
Cyclomatic value
+
main 7 20 1 10 0 0 1 9
+

impls.c

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function#If stmts
+
#Assignments
+
#Loops
+
#Calls
+
#Gotos
+
#Pointer accesses
+
#Exits
+
Cyclomatic value
+
PT1_Filter 1 3 0 1 0 4 1 2
Interpolate_from_curve 4 6 1 0 0 14 1 6
Turn_on_delay 2 5 0 0 0 4 1 3
Timer_start 0 1 0 0 0 1 1 1
Timer_elapsedTime 0 1 0 0 0 1 1 1
Timer_tick 0 1 0 0 0 2 1 1
Sleep 0 1 0 0 0 0 1 1
Time 0 0 0 0 0 0 1 1
Ramp_out 9 11 0 0 1 20 1 10
Ramp_getDir 0 1 0 0 0 1 1 1
Ramp_getValue 0 1 0 0 0 1 1 1
Ramp_targetReached 0 1 0 0 0 2 1 1
Limiter_out 2 3 0 0 0 0 1 3
diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/roco.c frama-c-20150201+sodium+dfsg/tests/ICPC/src/roco.c --- frama-c-20140301+neon+dfsg/tests/ICPC/src/roco.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/roco.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,307 @@ +#include "stdafx.h" + +#include "roco.h" + +#ifndef TESTCASE +#include "roco_config.h" +#elif TESTCASE == 1 +#include "roco_config_testcase_1.h" +#elif TESTCASE == 2 +#include "roco_config_testcase_2.h" +#elif TESTCASE == 3 +#include "roco_config_testcase_3.h" +#endif + +/* --- control messages --- */ + +boolean RoCo_activeDesired; +boolean RoCo_commandMoveByAngle; +boolean RoCo_commandMoveToAngle; +boolean RoCo_commandShutOff; +real64 RoCo_desiredDeltaAngle; +real64 RoCo_desiredTargetAngle; +boolean RoCo_moveFast; + +/* --- result messages --- */ + +boolean RoCo_error; +boolean RoCo_isActive; +real64 RoCo_legAngle; +boolean RoCo_legAngleValid; +real64 RoCo_engineVoltage; +boolean RoCo_isAdapted; + +/* -- external messages -- */ +extern real64 Battery_voltage; +extern real64 Engine_realVoltage; +extern real64 Env_humidity; +extern real64 Env_temperature; +extern boolean Global_emergencyMode; +extern boolean LegSensor_atMark; +extern real64 LegSensor_signal; +extern real64 dT; + +/* --- private variables --- */ + +static real64 angleDiffRequest; +static real64 desiredEngineVoltage; +static boolean initBackwards; +static boolean limitationActive; +static real64 prevAngleSignal; +static real64 rampValue; +static boolean wasActive; +static boolean wasInit; +static boolean enabled; +static real64 rampTarget; +static real64 filteredEnvTemp; +static sint32 direction; +static real64 targetAngle; +static boolean init; +static boolean final; +static boolean deltaSearchPhase; + +static Ramp_t initRamp = { 0, 0.0, 0.0 }; +static Timer_t initTimer; +static Ramp_t moveTimeRamp = { 0, 0.0, 0.0 };; +static PT1_t envTempFilter; +static Timer_t shutdownTimer; +static real64 voltageFilter; +static Delay_t batteryLowDelay; +static Delay_t standstillDelay; +static real64 adaptation[2] = {0.0, 0.0}; +static boolean rampHighReached = FALSE; +static boolean wasRampEnded; + + +void RoCo_init() +{ + enabled = FALSE; + angleDiffRequest = 0.0; + desiredEngineVoltage = 0.0; + initBackwards = FALSE; + initTimer = 0.0; + limitationActive = FALSE; + prevAngleSignal = 0.0; + PT1_SetState (&envTempFilter, Env_temperature); + rampValue = 0.0; + filteredEnvTemp = 0.0; + direction = 0; + targetAngle = 0.0; + batteryLowDelay = 0.0; + shutdownTimer = 0.0; + rampTarget = 0.0; + voltageFilter = 0.0; + wasActive = FALSE; + wasInit = FALSE; + deltaSearchPhase = FALSE; + init = FALSE; + final = FALSE; + + RoCo_activeDesired = FALSE; + RoCo_commandMoveByAngle = FALSE; + RoCo_commandMoveToAngle = FALSE; + RoCo_commandShutOff = FALSE; + RoCo_desiredDeltaAngle = 0.0; + RoCo_desiredTargetAngle = 0.0; + RoCo_moveFast = FALSE; + + RoCo_isActive = FALSE; + RoCo_legAngle = 0.0; + RoCo_legAngleValid = FALSE; + RoCo_error = FALSE; + RoCo_engineVoltage = 0.0; + RoCo_isAdapted = FALSE; +} + + +void RoCo_process(void) +{ + real64 t1 = Battery_voltage; + real64 t2 = Env_humidity; + real64 t3 = Env_temperature; + boolean t4 = LegSensor_atMark; + real64 t5 = LegSensor_signal; + real64 t9; + real64 t10; + real64 t11; + Curve_t *t12; + real64 t13; + boolean t14; + real64 t15; + + filteredEnvTemp = PT1_Filter (&envTempFilter, t3 , RoCo_TempFltT_PARAM, dT); + enabled = ((((filteredEnvTemp > RoCo_envTempLowerLimit_PARAM) && + (filteredEnvTemp < RoCo_envTempUpperLimit_PARAM)) ? + ((t2 < RoCo_humidityLimit_PARAM) || (!RoCo_checkHumidity_PARAM)) : + FALSE) && + ((!Turn_on_delay (&batteryLowDelay, + t1 < RoCo_batteryLowLimit_PARAM, + RoCo_batteryLowDelay_PARAM, dT)) || + (!RoCo_checkBatteryVoltage_PARAM)) && + (!RoCo_error)); + if (!enabled) { + wasActive = wasActive && RoCo_activeDesired; + RoCo_isActive = FALSE; + RoCo_engineVoltage = 0.0; + } + else if (RoCo_activeDesired || RoCo_isActive) { + t13 = RoCo_voltageFilter_PARAM; + t15 = Interpolate_from_curve (&LegSensorSignalToAngle_CURVE, t5); + RoCo_legAngle = RoCo_legAngle + t15; + if (t4) { + RoCo_legAngle = RoCo_angleAtMark_PARAM; + RoCo_legAngleValid = TRUE; + } + if ((RoCo_activeDesired) && (!wasActive)) { + if (!RoCo_legAngleValid) { + init = TRUE; + } + RoCo_isActive = TRUE; + } + if (!RoCo_activeDesired && wasActive && !init && !final) { + RoCo_commandShutOff = TRUE; + } + if (init) { + t14 = (RoCo_angleAtMark_PARAM > RoCo_idlePosition_PARAM); + if (!wasActive) { + Timer_start (&initTimer); + } + if ((Timer_elapsedTime (&initTimer) > RoCo_initTimeout_PARAM) || + (Turn_on_delay(&standstillDelay, fabs(t15) < 0.001, + RoCo_initStandstillTimeout_PARAM, dT))) { + if (!initBackwards) { + initBackwards = TRUE; + Timer_start (&initTimer); + Turn_on_delay(&standstillDelay, FALSE, + RoCo_initStandstillTimeout_PARAM, dT); + } + else { + RoCo_error = TRUE; + RoCo_isActive = FALSE; + init = FALSE; + } + } + rampTarget = initBackwards ^ t14 ? + RoCo_initMoveSpeed_PARAM : -RoCo_initMoveSpeed_PARAM; + angleDiffRequest = Ramp_out (&initRamp, rampTarget, + RoCo_initRampSlopePos_PARAM, + RoCo_initRampSlopeNeg_PARAM, dT); + if (RoCo_legAngleValid) { + init = FALSE; + initBackwards = FALSE; + } + } + + if (!init) { + if (RoCo_commandShutOff) { + final = TRUE; + RoCo_commandShutOff = FALSE; + targetAngle = RoCo_idlePosition_PARAM; + Timer_start (&shutdownTimer); + RoCo_activeDesired = FALSE; + } + if (!final && RoCo_commandMoveToAngle) { + targetAngle = RoCo_desiredTargetAngle; + RoCo_commandMoveToAngle = FALSE; + direction = 0; + } + else if (!final && RoCo_commandMoveByAngle) { + targetAngle = RoCo_legAngle + RoCo_desiredDeltaAngle; + if (RoCo_desiredDeltaAngle == 0.0) { + direction = 0; + } + else { + direction = (RoCo_desiredDeltaAngle > 0.0) ? -1 : 1; + } + RoCo_commandMoveByAngle = FALSE; + } + if (RoCo_hasMinMaxAngles_PARAM) { + targetAngle = Limiter_out(RoCo_minAngle_PARAM, targetAngle, + RoCo_maxAngle_PARAM); + } + t9 = RoCo_legAngle - targetAngle; + t11 = RoCo_moveFast ? RoCo_angleReachedThreshold1Fast_PARAM : + RoCo_angleReachedThreshold1_PARAM; + if (RoCo_adaptationActive) { + t11 += adaptation[RoCo_moveFast]; + } + if ((fabs(t9) > t11) && (direction == 0)) { + direction = ((((!RoCo_hasMinMaxAngles_PARAM) || + (fabs(t9) >= 180.0)) + ? t9 : -t9) > 0.0) ? 1 : -1; + } + rampTarget = 0.0; + if ((RoCo_legAngleValid) && + (fabs(t9) > t11) && + (((t9 > 0.0) && (0 > direction)) || + ((t9 < 0.0) && (0 < direction)))) { + rampTarget = 1.0; + } + rampValue = Ramp_out (&moveTimeRamp, rampTarget, + RoCo_TimeSlopePos_PARAM, RoCo_TimeSlopeNeg_PARAM, dT); + if (-1 == Ramp_getDir (&moveTimeRamp)) { + if (RoCo_moveFast) { + t12 = &RoCo_decelerationFast_CURVE; + } + else { + t12 = &RoCo_deceleration_CURVE; + } + } + else { + if (RoCo_moveFast) { + t12 = &RoCo_accelerationFast_CURVE; + } + else { + t12 = &RoCo_acceleration_CURVE; + } + } + angleDiffRequest = Interpolate_from_curve (t12, rampValue); + angleDiffRequest *= (real64)direction; + t10 = RoCo_legAngle - targetAngle; + if (fabs(rampValue) == 1.0) { + rampHighReached = TRUE; + } + if (rampValue == 0.0) { + if (RoCo_adaptationActive && !wasRampEnded && rampHighReached) { + if ((direction > 0 && t10 > 0.0) || + (direction < 0 && t10 < 0.0)) { + adaptation[RoCo_moveFast] += fabs(t10); + RoCo_isAdapted = TRUE; + } + } + if (fabs(t10) > RoCo_angleReachedThreshold2_PARAM) { + angleDiffRequest += ((t10 > 0.0) ? -1.0 : 1.0) * + RoCo_stepSpeed_PARAM * dT; + } + rampHighReached = FALSE; + } + wasRampEnded = (rampValue == 0.0); + } + if (final && + (((RoCo_legAngleValid) && + (fabs(RoCo_legAngle - RoCo_idlePosition_PARAM) < + RoCo_angleReachedThreshold2_PARAM) && + (fabs(angleDiffRequest) < 0.05)) || + (Timer_elapsedTime (&shutdownTimer) > RoCo_shutdownTimeout_PARAM))) { + final = FALSE; + RoCo_isActive = FALSE; + RoCo_legAngleValid = FALSE; + } + desiredEngineVoltage = Interpolate_from_curve + (&EngineSpeedToVoltage_CURVE, angleDiffRequest); + desiredEngineVoltage = Limiter_out (Engine_minVoltage_PARAM, + desiredEngineVoltage, Engine_maxVoltage_PARAM); + limitationActive = (Engine_maxVoltage_PARAM == desiredEngineVoltage) || + (Engine_minVoltage_PARAM == desiredEngineVoltage); + RoCo_engineVoltage = PT1_Filter (&voltageFilter, desiredEngineVoltage, + t13, dT); + wasInit = init; + wasActive = RoCo_isActive; + Timer_tick (&shutdownTimer, dT); + Timer_tick (&initTimer, dT); + } + else { + RoCo_engineVoltage = 0.0; + } + Frama_C_dump_each(); +} diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/roco_config.h frama-c-20150201+sodium+dfsg/tests/ICPC/src/roco_config.h --- frama-c-20140301+neon+dfsg/tests/ICPC/src/roco_config.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/roco_config.h 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,49 @@ +/* + * Configuration parameters and concrete configuration. + * Adjust these values to meet individual needs. + */ + +Curve_t RoCo_acceleration_CURVE = + { 4, {0.0, 0.33, 0.67, 1.0}, {0.0, 0.2, 0.5, 1.0} }; +Curve_t RoCo_accelerationFast_CURVE = + { 4, {0.0, 0.33, 0.67, 1.0}, {0.0, 2.0, 4.0, 5.0} }; +boolean RoCo_adaptationActive = TRUE; +real64 RoCo_angleAtMark_PARAM = 19.0; +real64 RoCo_angleReachedThreshold1_PARAM = 5.0; +real64 RoCo_angleReachedThreshold1Fast_PARAM = 10.0; +real64 RoCo_angleReachedThreshold2_PARAM = 0.5; +real64 RoCo_batteryLowLimit_PARAM = 19.5; +real64 RoCo_batteryLowDelay_PARAM = 60.0; +boolean RoCo_checkBatteryVoltage_PARAM = TRUE; +boolean RoCo_checkHumidity_PARAM = FALSE; +Curve_t RoCo_deceleration_CURVE = + { 4, {0.0, 0.33, 0.67, 1.0}, {0.0, 0.25, 0.75, 1.0} }; +Curve_t RoCo_decelerationFast_CURVE = + {4, {0.0, 0.33, 0.67, 1.0}, {0.0, 2.0, 4.0, 5.0} }; +real64 RoCo_envTempLowerLimit_PARAM = 5.0; +real64 RoCo_envTempUpperLimit_PARAM = 30.0; +boolean RoCo_hasMinMaxAngles_PARAM = TRUE; +real64 RoCo_humidityLimit_PARAM = 0.8; +real64 RoCo_idlePosition_PARAM = 0.0; +real64 RoCo_initMoveSpeed_PARAM = 1.0; +real64 RoCo_initRampSlopeNeg_PARAM = 1.0; +real64 RoCo_initRampSlopePos_PARAM = 1.0; +real64 RoCo_initStandstillTimeout_PARAM = 2.0; +real64 RoCo_initTimeout_PARAM = 20.0; +real64 RoCo_initialDeltaSearchRange_PARAM = 2.0; +real64 RoCo_initialDeltaSearchTimeout_PARAM = 2.0; +real64 RoCo_maxAngle_PARAM = 120.0; +real64 RoCo_minAngle_PARAM = -120.0; +real64 RoCo_shutdownTimeout_PARAM = 30.0; +real64 RoCo_stepSpeed_PARAM = 2.0; +real64 RoCo_TempFltT_PARAM = 0.1; +real64 RoCo_TimeSlopeNeg_PARAM = 1.0; +real64 RoCo_TimeSlopePos_PARAM = 0.5; +real64 RoCo_voltageFilter_PARAM = 0.1; + +real64 Engine_maxVoltage_PARAM = 24.0; +real64 Engine_minVoltage_PARAM = -24.0; +Curve_t EngineSpeedToVoltage_CURVE = + { 5, {-3.0, -1.5, 0.0, 1.5, 3.0}, {-24.0, -15.0, 0.0, 15.0, 24.0} };; +Curve_t LegSensorSignalToAngle_CURVE = + { 4, {-24.0, -12.0, 12.0, 24.0}, {-60.0, -30.0, 30.0, 60.0} }; diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/roco_config_testcase_1.h frama-c-20150201+sodium+dfsg/tests/ICPC/src/roco_config_testcase_1.h --- frama-c-20140301+neon+dfsg/tests/ICPC/src/roco_config_testcase_1.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/roco_config_testcase_1.h 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,49 @@ +/* + * Configuration parameters and concrete configuration. + * Adjust these values to meet individual needs. + */ + +Curve_t RoCo_acceleration_CURVE = + { 4, {0.0, 0.3, 0.6, 1.0}, {0.0, 0.25, 0.5, 1.0} }; +Curve_t RoCo_accelerationFast_CURVE = + { 4, {0.0, 0.4, 0.75, 1.0}, {0.0, 2.5, 4.5, 6.0} }; +boolean RoCo_adaptationActive = TRUE; +real64 RoCo_angleAtMark_PARAM = -5.0; +real64 RoCo_angleReachedThreshold1_PARAM = 6.0; +real64 RoCo_angleReachedThreshold1Fast_PARAM = 12.0; +real64 RoCo_angleReachedThreshold2_PARAM = 0.4; +real64 RoCo_batteryLowLimit_PARAM = 12.0; +real64 RoCo_batteryLowDelay_PARAM = 300.0; +boolean RoCo_checkBatteryVoltage_PARAM = TRUE; +boolean RoCo_checkHumidity_PARAM = FALSE; +Curve_t RoCo_deceleration_CURVE = + { 4, {0.0, 0.33, 0.67, 1.0}, {0.0, 0.33, 0.67, 1.0} }; +Curve_t RoCo_decelerationFast_CURVE = + {4, {0.0, 0.33, 0.67, 1.0}, {0.0, 2.0, 4.0, 6.0} }; +real64 RoCo_envTempLowerLimit_PARAM = -10.0; +real64 RoCo_envTempUpperLimit_PARAM = 50.0; +boolean RoCo_hasMinMaxAngles_PARAM = TRUE; +real64 RoCo_humidityLimit_PARAM = 0.95; +real64 RoCo_idlePosition_PARAM = 0.0; +real64 RoCo_initMoveSpeed_PARAM = 1.2; +real64 RoCo_initRampSlopeNeg_PARAM = 1.0; +real64 RoCo_initRampSlopePos_PARAM = 1.0; +real64 RoCo_initStandstillTimeout_PARAM = 5.0; +real64 RoCo_initTimeout_PARAM = 20.0; +real64 RoCo_initialDeltaSearchRange_PARAM = 5.0; +real64 RoCo_initialDeltaSearchTimeout_PARAM = 5.0; +real64 RoCo_maxAngle_PARAM = 180.0; +real64 RoCo_minAngle_PARAM = -90.0; +real64 RoCo_shutdownTimeout_PARAM = 30.0; +real64 RoCo_stepSpeed_PARAM = 5.0; +real64 RoCo_TempFltT_PARAM = 0.1; +real64 RoCo_TimeSlopeNeg_PARAM = 1.0; +real64 RoCo_TimeSlopePos_PARAM = 0.5; +real64 RoCo_voltageFilter_PARAM = 0.15; + +real64 Engine_maxVoltage_PARAM = 18.0; +real64 Engine_minVoltage_PARAM = -18.0; +Curve_t EngineSpeedToVoltage_CURVE = + { 5, {-3.0, -1.5, 0.0, 1.5, 3.0}, {-18.0, -12.0, 0.0, 12.0, 18.0} };; +Curve_t LegSensorSignalToAngle_CURVE = + { 4, {-24.0, -12.0, 12.0, 24.0}, {-60.0, -35.0, 35.0, 60.0} }; diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/roco_config_testcase_2.h frama-c-20150201+sodium+dfsg/tests/ICPC/src/roco_config_testcase_2.h --- frama-c-20140301+neon+dfsg/tests/ICPC/src/roco_config_testcase_2.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/roco_config_testcase_2.h 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,49 @@ +/* + * Configuration parameters and concrete configuration. + * Adjust these values to meet individual needs. + */ + +Curve_t RoCo_acceleration_CURVE = + { 4, {0.0, 0.3, 0.7, 1.0}, {0.0, 0.2, 0.5, 1.0} }; +Curve_t RoCo_accelerationFast_CURVE = + { 4, {0.0, 0.4, 0.7, 1.0}, {0.0, 2.5, 4.0, 5.0} }; +boolean RoCo_adaptationActive = TRUE; +real64 RoCo_angleAtMark_PARAM = 25.0; +real64 RoCo_angleReachedThreshold1_PARAM = 2.0; +real64 RoCo_angleReachedThreshold1Fast_PARAM = 4.0; +real64 RoCo_angleReachedThreshold2_PARAM = 0.1; +real64 RoCo_batteryLowLimit_PARAM = 15.0; +real64 RoCo_batteryLowDelay_PARAM = 60.0; +boolean RoCo_checkBatteryVoltage_PARAM = TRUE; +boolean RoCo_checkHumidity_PARAM = FALSE; +Curve_t RoCo_deceleration_CURVE = + { 4, {0.0, 0.3, 0.7, 1.0}, {0.0, 0.2, 0.5, 1.0} }; +Curve_t RoCo_decelerationFast_CURVE = + {4, {0.0, 0.4, 0.7, 1.0}, {0.0, 2.5, 4.0, 5.0} }; +real64 RoCo_envTempLowerLimit_PARAM = 0.0; +real64 RoCo_envTempUpperLimit_PARAM = 35.0; +boolean RoCo_hasMinMaxAngles_PARAM = TRUE; +real64 RoCo_humidityLimit_PARAM = 0.0; +real64 RoCo_idlePosition_PARAM = 0.0; +real64 RoCo_initMoveSpeed_PARAM = 1.0; +real64 RoCo_initRampSlopeNeg_PARAM = 1.2; +real64 RoCo_initRampSlopePos_PARAM = 1.2; +real64 RoCo_initStandstillTimeout_PARAM = 5.0; +real64 RoCo_initTimeout_PARAM = 20.0; +real64 RoCo_initialDeltaSearchRange_PARAM = 2.0; +real64 RoCo_initialDeltaSearchTimeout_PARAM = 3.0; +real64 RoCo_maxAngle_PARAM = 90.0; +real64 RoCo_minAngle_PARAM = -90.0; +real64 RoCo_shutdownTimeout_PARAM = 12.0; +real64 RoCo_stepSpeed_PARAM = 10.0; +real64 RoCo_TempFltT_PARAM = 0.1; +real64 RoCo_TimeSlopeNeg_PARAM = 1.0; +real64 RoCo_TimeSlopePos_PARAM = 1.0; +real64 RoCo_voltageFilter_PARAM = 0.1; + +real64 Engine_maxVoltage_PARAM = 18.0; +real64 Engine_minVoltage_PARAM = -18.0; +Curve_t EngineSpeedToVoltage_CURVE = + { 5, {-3.0, -1.5, 0.0, 1.5, 3.0}, {-18.0, -12.0, 0.0, 12.0, 18.0} };; +Curve_t LegSensorSignalToAngle_CURVE = + { 4, {-24.0, -12.0, 12.0, 24.0}, {-60.0, -30.0, 30.0, 60.0} }; diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/roco_config_testcase_3_sol3.h frama-c-20150201+sodium+dfsg/tests/ICPC/src/roco_config_testcase_3_sol3.h --- frama-c-20140301+neon+dfsg/tests/ICPC/src/roco_config_testcase_3_sol3.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/roco_config_testcase_3_sol3.h 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,49 @@ +/* + * Configuration parameters and concrete configuration. + * Adjust these values to meet individual needs. + */ + +Curve_t RoCo_acceleration_CURVE = + { 4, {0.0, 0.333, 0.667, 1.0}, {0.0, 0.4, 0.7, 1.0} }; +Curve_t RoCo_accelerationFast_CURVE = + { 5, {0.0, 0.333, 0.5, 0.667, 1.0}, {0.0, 4.0, 6.0, 8.0, 10.0} }; +boolean RoCo_adaptationActive = TRUE; +real64 RoCo_angleAtMark_PARAM = 11.5; +real64 RoCo_angleReachedThreshold1_PARAM = 7.5; +real64 RoCo_angleReachedThreshold1Fast_PARAM = 15.0; +real64 RoCo_angleReachedThreshold2_PARAM = 0.5; +real64 RoCo_batteryLowLimit_PARAM = 11.5; +real64 RoCo_batteryLowDelay_PARAM = 120.0; +boolean RoCo_checkBatteryVoltage_PARAM = TRUE; +boolean RoCo_checkHumidity_PARAM = TRUE; +Curve_t RoCo_deceleration_CURVE = + { 4, {0.0, 0.33, 0.67, 1.0}, {0.0, 0.3, 0.6, 1.0} }; +Curve_t RoCo_decelerationFast_CURVE = + {5, {0.0, 0.33, 0.5, 0.67, 1.0}, {0.0, 4.0, 6.0, 8.0, 10.0} }; +real64 RoCo_envTempLowerLimit_PARAM = -10.0; +real64 RoCo_envTempUpperLimit_PARAM = 40.0; +boolean RoCo_hasMinMaxAngles_PARAM = TRUE; +real64 RoCo_humidityLimit_PARAM = 0.9; +real64 RoCo_idlePosition_PARAM = 0.0; +real64 RoCo_initMoveSpeed_PARAM = 5.0; +real64 RoCo_initRampSlopeNeg_PARAM = 1.0; +real64 RoCo_initRampSlopePos_PARAM = 1.0; +real64 RoCo_initStandstillTimeout_PARAM = 5.0; +real64 RoCo_initTimeout_PARAM = 30.0; +real64 RoCo_initialDeltaSearchRange_PARAM = 3.0; +real64 RoCo_initialDeltaSearchTimeout_PARAM = 3.0; +real64 RoCo_maxAngle_PARAM = 90.0; +real64 RoCo_minAngle_PARAM = -90.0; +real64 RoCo_shutdownTimeout_PARAM = 12.0; +real64 RoCo_stepSpeed_PARAM = 8.0; +real64 RoCo_TempFltT_PARAM = 0.15; +real64 RoCo_TimeSlopeNeg_PARAM = 0.5; +real64 RoCo_TimeSlopePos_PARAM = 0.5; +real64 RoCo_voltageFilter_PARAM = 0.1; + +real64 Engine_maxVoltage_PARAM = 15.0; +real64 Engine_minVoltage_PARAM = -15.0; +Curve_t EngineSpeedToVoltage_CURVE = + { 5, {-3.0, -1.0, 0.0, 1.0, 3.0}, {-15.0, -7.0, 0.0, 7.0, 15.0} };; +Curve_t LegSensorSignalToAngle_CURVE = + { 4, {-24.0, -12.0, 12.0, 24.0}, {-60.0, -30.0, 30.0, 60.0} }; diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/roco.h frama-c-20150201+sodium+dfsg/tests/ICPC/src/roco.h --- frama-c-20140301+neon+dfsg/tests/ICPC/src/roco.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/roco.h 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,118 @@ +/* + * Public interface of the RoCo module. + */ + +#ifndef ROCO_H_ +#define ROCO_H_ + +/* --- functions --- */ + +/* Initialization, to be called once at start. */ +void RoCo_init(void); + +/* Cyclic function, to be called within the desired time raster. */ +void RoCo_process(void); + + +/* --- configuration parameters --- */ + +/* specification of how engine voltage is to be increased or decreased */ +extern Curve_t RoCo_acceleration_CURVE; +extern Curve_t RoCo_accelerationFast_CURVE; +extern Curve_t RoCo_deceleration_CURVE; +extern Curve_t RoCo_decelerationFast_CURVE; + +/* angle at which the robot leg is when the sensor is passed */ +extern real64 RoCo_angleAtMark_PARAM; + +/* curve for transformation of differential leg sensor signal to an angle */ +extern Curve_t LegSensorSignalToAngle_CURVE; + +/* specification of when a target angle is considered to be reached */ +extern real64 RoCo_angleReachedThreshold1_PARAM; +extern real64 RoCo_angleReachedThreshold2_PARAM; + +/* parameters for battery voltage checks */ +extern real64 RoCo_batteryLowLimit_PARAM; +extern real64 RoCo_batteryLowDelay_PARAM; +extern boolean RoCo_checkBatteryVoltage_PARAM; + +/* parameters for humidity checks */ +extern real64 RoCo_humidityLimit_PARAM; +extern boolean RoCo_checkHumidity_PARAM; + +/* parameters for environment temperature checks */ +extern real64 RoCo_envTempLowerLimit_PARAM; +extern real64 RoCo_envTempUpperLimit_PARAM; +extern real64 RoCo_TempFltT_PARAM; + +/* does the robot leg have min/max angles, or can it turn around 360 degrees? */ +extern boolean RoCo_hasMinMaxAngles_PARAM; +/* for systems with min/max angles: the min/max angle values */ +extern real64 RoCo_maxAngle_PARAM; +extern real64 RoCo_minAngle_PARAM; + +/* robot leg movement speed and ramps up/down during initialization */ +extern real64 RoCo_initMoveSpeed_PARAM; +extern real64 RoCo_initRampSlopeNeg_PARAM; +extern real64 RoCo_initRampSlopePos_PARAM; + +/* position at which the robot leg should be parked when inactive */ +extern real64 RoCo_idlePosition_PARAM; + +/* maximum time for finding the sensor position during initialization */ +extern real64 RoCo_initTimeout_PARAM; + +/* timeout for shutdown sequence */ +extern real64 RoCo_shutdownTimeout_PARAM; + +/* engine voltage during stepping */ +extern real64 RoCo_stepSpeed_PARAM; + +/* engine ramp slopes */ +extern real64 RoCo_TimeSlopeNeg_PARAM; +extern real64 RoCo_TimeSlopePos_PARAM; + +/* curve for conversion of speed request to engine voltage output */ +extern Curve_t EngineSpeedToVoltage_CURVE; + +/* min/max voltage that may be applied to the engine */ +extern real64 Engine_maxVoltage_PARAM; +extern real64 Engine_minVoltage_PARAM; +extern real64 RoCo_voltageFilter_PARAM; + +/* --- control messages --- */ + +/* activate robot leg controller */ +extern boolean RoCo_activeDesired; + +/* move robot leg by a certain angle */ +extern boolean RoCo_commandMoveByAngle; +extern real64 RoCo_desiredDeltaAngle; + +/* move robot leg to a certain position */ +extern boolean RoCo_commandMoveToAngle; +extern real64 RoCo_desiredTargetAngle; + +/* for movement requests: is fast movement requested? */ +extern boolean RoCo_moveFast; + +/* shut down robot leg controller */ +extern boolean RoCo_commandShutOff; + +/* --- result messages --- */ + +/* if TRUE, a fatal error has occurred and the controller has stopped working */ +extern boolean RoCo_error; + +/* if TRUE, the controller is actively controlling the leg */ +extern boolean RoCo_isActive; + +/* the current position of the robot leg; only valid if legAngleValid is TRUE. */ +extern real64 RoCo_legAngle; +extern boolean RoCo_legAngleValid; + +/* the voltage that should be applied to the engine (main output value) */ +extern real64 RoCo_engineVoltage; + +#endif /* ROCO_H_ */ diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/roco_sol1.c frama-c-20150201+sodium+dfsg/tests/ICPC/src/roco_sol1.c --- frama-c-20140301+neon+dfsg/tests/ICPC/src/roco_sol1.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/roco_sol1.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,306 @@ +#include "stdafx.h" + +#include "roco.h" + +#ifndef TESTCASE +#include "roco_config.h" +#elif TESTCASE == 1 +#include "roco_config_testcase_1.h" +#elif TESTCASE == 2 +#include "roco_config_testcase_2.h" +#elif TESTCASE == 3 +#include "roco_config_testcase_3.h" +#endif + +/* --- control messages --- */ + +boolean RoCo_activeDesired; +boolean RoCo_commandMoveByAngle; +boolean RoCo_commandMoveToAngle; +boolean RoCo_commandShutOff; +real64 RoCo_desiredDeltaAngle; +real64 RoCo_desiredTargetAngle; +boolean RoCo_moveFast; + +/* --- result messages --- */ + +boolean RoCo_error; +boolean RoCo_isActive; +real64 RoCo_legAngle; +boolean RoCo_legAngleValid; +real64 RoCo_engineVoltage; +boolean RoCo_isAdapted; + +/* -- external messages -- */ +extern real64 Battery_voltage; +extern real64 Engine_realVoltage; +extern real64 Env_humidity; +extern real64 Env_temperature; +extern boolean Global_emergencyMode; +extern boolean LegSensor_atMark; +extern real64 LegSensor_signal; +extern real64 dT; + +/* --- private variables --- */ + +static real64 angleDiffRequest; +static real64 desiredEngineVoltage; +static boolean initBackwards; +static boolean limitationActive; +static real64 prevAngleSignal; +static real64 rampValue; +static boolean wasActive; +static boolean wasInit; +static boolean enabled; +static real64 rampTarget; +static real64 filteredEnvTemp; +static sint32 direction; +static real64 targetAngle; +static boolean init; +static boolean final; +static boolean deltaSearchPhase; + +static Ramp_t initRamp = { 0, 0.0, 0.0 }; +static Timer_t initTimer; +static Ramp_t moveTimeRamp = { 0, 0.0, 0.0 };; +static PT1_t envTempFilter; +static Timer_t shutdownTimer; +static real64 voltageFilter; +static Delay_t batteryLowDelay; +static Delay_t standstillDelay; +static real64 adaptation[2] = {0.0, 0.0}; +static boolean rampHighReached = FALSE; +static boolean wasRampEnded; + + +void RoCo_init() +{ + enabled = FALSE; + angleDiffRequest = 0.0; + desiredEngineVoltage = 0.0; + initBackwards = FALSE; + initTimer = 0.0; + limitationActive = FALSE; + prevAngleSignal = 0.0; + PT1_SetState (&envTempFilter, Env_temperature); + rampValue = 0.0; + filteredEnvTemp = 0.0; + direction = 0; + targetAngle = 0.0; + batteryLowDelay = 0.0; + shutdownTimer = 0.0; + rampTarget = 0.0; + voltageFilter = 0.0; + wasActive = FALSE; + wasInit = FALSE; + deltaSearchPhase = FALSE; + init = FALSE; + final = FALSE; + + RoCo_activeDesired = FALSE; + RoCo_commandMoveByAngle = FALSE; + RoCo_commandMoveToAngle = FALSE; + RoCo_commandShutOff = FALSE; + RoCo_desiredDeltaAngle = 0.0; + RoCo_desiredTargetAngle = 0.0; + RoCo_moveFast = FALSE; + + RoCo_isActive = FALSE; + RoCo_legAngle = 0.0; + RoCo_legAngleValid = FALSE; + RoCo_error = FALSE; + RoCo_engineVoltage = 0.0; + RoCo_isAdapted = FALSE; +} + + +void RoCo_process(void) +{ + real64 t1 = Battery_voltage; + real64 t2 = Env_humidity; + real64 t3 = Env_temperature; + boolean t4 = LegSensor_atMark; + real64 t5 = LegSensor_signal; + real64 t9; + real64 t10; + real64 t11; + Curve_t *t12; + real64 t13; + boolean t14; + real64 t15; + + filteredEnvTemp = PT1_Filter (&envTempFilter, t3 , RoCo_TempFltT_PARAM, dT); + enabled = ((((filteredEnvTemp > RoCo_envTempLowerLimit_PARAM) && + (filteredEnvTemp < RoCo_envTempUpperLimit_PARAM)) ? + ((t2 < RoCo_humidityLimit_PARAM) || (!RoCo_checkHumidity_PARAM)) : + FALSE) && + ((!Turn_on_delay (&batteryLowDelay, + t1 < RoCo_batteryLowLimit_PARAM, + RoCo_batteryLowDelay_PARAM, dT)) || + (!RoCo_checkBatteryVoltage_PARAM)) && + (!RoCo_error)); + if (!enabled) { + wasActive = wasActive && RoCo_activeDesired; + RoCo_isActive = FALSE; + RoCo_engineVoltage = 0.0; + } + else if (RoCo_activeDesired || RoCo_isActive) { + t13 = RoCo_voltageFilter_PARAM; + t15 = Interpolate_from_curve (&LegSensorSignalToAngle_CURVE, t5); + RoCo_legAngle = RoCo_legAngle + t15; + if (t4) { + RoCo_legAngle = RoCo_angleAtMark_PARAM; + RoCo_legAngleValid = TRUE; + } + if ((RoCo_activeDesired) && (!wasActive)) { + if (!RoCo_legAngleValid) { + init = TRUE; + } + RoCo_isActive = TRUE; + } + if (!RoCo_activeDesired && wasActive && !init && !final) { + RoCo_commandShutOff = TRUE; + } + if (init) { + t14 = (RoCo_angleAtMark_PARAM > RoCo_idlePosition_PARAM); + if (!wasActive) { + Timer_start (&initTimer); + } + if ((Timer_elapsedTime (&initTimer) > RoCo_initTimeout_PARAM) || + (Turn_on_delay(&standstillDelay, fabs(t15) < 0.001, + RoCo_initStandstillTimeout_PARAM, dT))) { + if (!initBackwards) { + initBackwards = TRUE; + Timer_start (&initTimer); + Turn_on_delay(&standstillDelay, FALSE, + RoCo_initStandstillTimeout_PARAM, dT); + } + else { + RoCo_error = TRUE; + RoCo_isActive = FALSE; + init = FALSE; + } + } + rampTarget = initBackwards ^ t14 ? + RoCo_initMoveSpeed_PARAM : -RoCo_initMoveSpeed_PARAM; + angleDiffRequest = Ramp_out (&initRamp, rampTarget, + RoCo_initRampSlopePos_PARAM, + RoCo_initRampSlopeNeg_PARAM, dT); + if (RoCo_legAngleValid) { + init = FALSE; + initBackwards = FALSE; + } + } + + if (!init) { + if (RoCo_commandShutOff) { + final = TRUE; + RoCo_commandShutOff = FALSE; + targetAngle = RoCo_idlePosition_PARAM; + Timer_start (&shutdownTimer); + RoCo_activeDesired = FALSE; + } + if (!final && RoCo_commandMoveToAngle) { + targetAngle = RoCo_desiredTargetAngle; + RoCo_commandMoveToAngle = FALSE; + direction = 0; + } + else if (!final && RoCo_commandMoveByAngle) { + targetAngle = RoCo_legAngle + RoCo_desiredDeltaAngle; + if (RoCo_desiredDeltaAngle == 0.0) { + direction = 0; + } + else { + direction = (RoCo_desiredDeltaAngle > 0.0) ? 1 : -1; + } + RoCo_commandMoveByAngle = FALSE; + } + if (RoCo_hasMinMaxAngles_PARAM) { + targetAngle = Limiter_out(RoCo_minAngle_PARAM, targetAngle, + RoCo_maxAngle_PARAM); + } + t9 = RoCo_legAngle - targetAngle; + t11 = RoCo_moveFast ? RoCo_angleReachedThreshold1Fast_PARAM : + RoCo_angleReachedThreshold1_PARAM; + if (RoCo_adaptationActive) { + t11 += adaptation[RoCo_moveFast]; + } + if ((fabs(t9) > t11) && (direction == 0)) { + direction = ((((!RoCo_hasMinMaxAngles_PARAM) || + (fabs(t9) >= 180.0)) + ? t9 : -t9) > 0.0) ? 1 : -1; + } + rampTarget = 0.0; + if ((RoCo_legAngleValid) && + (fabs(t9) > t11) && + (((t9 > 0.0) && (0 > direction)) || + ((t9 < 0.0) && (0 < direction)))) { + rampTarget = 1.0; + } + rampValue = Ramp_out (&moveTimeRamp, rampTarget, + RoCo_TimeSlopePos_PARAM, RoCo_TimeSlopeNeg_PARAM, dT); + if (-1 == Ramp_getDir (&moveTimeRamp)) { + if (RoCo_moveFast) { + t12 = &RoCo_decelerationFast_CURVE; + } + else { + t12 = &RoCo_deceleration_CURVE; + } + } + else { + if (RoCo_moveFast) { + t12 = &RoCo_accelerationFast_CURVE; + } + else { + t12 = &RoCo_acceleration_CURVE; + } + } + angleDiffRequest = Interpolate_from_curve (t12, rampValue); + angleDiffRequest *= (real64)direction; + t10 = RoCo_legAngle - targetAngle; + if (fabs(rampValue) == 1.0) { + rampHighReached = TRUE; + } + if (rampValue == 0.0) { + if (RoCo_adaptationActive && !wasRampEnded && rampHighReached) { + if ((direction > 0 && t10 > 0.0) || + (direction < 0 && t10 < 0.0)) { + adaptation[RoCo_moveFast] += fabs(t10); + RoCo_isAdapted = TRUE; + } + } + if (fabs(t10) > RoCo_angleReachedThreshold2_PARAM) { + angleDiffRequest += ((t10 > 0.0) ? -1.0 : 1.0) * + RoCo_stepSpeed_PARAM * dT; + } + rampHighReached = FALSE; + } + wasRampEnded = (rampValue == 0.0); + } + if (final && + (((RoCo_legAngleValid) && + (fabs(RoCo_legAngle - RoCo_idlePosition_PARAM) < + RoCo_angleReachedThreshold2_PARAM) && + (fabs(angleDiffRequest) < 0.05)) || + (Timer_elapsedTime (&shutdownTimer) > RoCo_shutdownTimeout_PARAM))) { + final = FALSE; + RoCo_isActive = FALSE; + RoCo_legAngleValid = FALSE; + } + desiredEngineVoltage = Interpolate_from_curve + (&EngineSpeedToVoltage_CURVE, angleDiffRequest); + desiredEngineVoltage = Limiter_out (Engine_minVoltage_PARAM, + desiredEngineVoltage, Engine_maxVoltage_PARAM); + limitationActive = (Engine_maxVoltage_PARAM == desiredEngineVoltage) || + (Engine_minVoltage_PARAM == desiredEngineVoltage); + RoCo_engineVoltage = PT1_Filter (&voltageFilter, desiredEngineVoltage, + t13, dT); + wasInit = init; + wasActive = RoCo_isActive; + Timer_tick (&shutdownTimer, dT); + Timer_tick (&initTimer, dT); + } + else { + RoCo_engineVoltage = 0.0; + } +} diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/roco_sol3.c frama-c-20150201+sodium+dfsg/tests/ICPC/src/roco_sol3.c --- frama-c-20140301+neon+dfsg/tests/ICPC/src/roco_sol3.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/roco_sol3.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,315 @@ +#include "stdafx.h" + +#include "roco.h" + +#ifndef TESTCASE +#include "roco_config.h" +#elif TESTCASE == 1 +#include "roco_config_testcase_1.h" +#elif TESTCASE == 2 +#include "roco_config_testcase_2.h" +#elif TESTCASE == 3 +#include "roco_config_testcase_3.h" +#endif + +/* --- control messages --- */ + +boolean RoCo_activeDesired; +boolean RoCo_commandMoveByAngle; +boolean RoCo_commandMoveToAngle; +boolean RoCo_commandShutOff; +real64 RoCo_desiredDeltaAngle; +real64 RoCo_desiredTargetAngle; +boolean RoCo_moveFast; + +/* --- result messages --- */ + +boolean RoCo_error; +boolean RoCo_isActive; +real64 RoCo_legAngle; +boolean RoCo_legAngleValid; +real64 RoCo_engineVoltage; +boolean RoCo_isAdapted; + +/* -- external messages -- */ +extern real64 Battery_voltage; +extern real64 Engine_realVoltage; +extern real64 Env_humidity; +extern real64 Env_temperature; +extern boolean Global_emergencyMode; +extern boolean LegSensor_atMark; +extern real64 LegSensor_signal; +extern real64 dT; + +/* --- private variables --- */ + +static real64 angleDiffRequest; +static real64 desiredEngineVoltage; +static boolean initBackwards; +static boolean limitationActive; +static real64 prevAngleSignal; +static real64 rampValue; +static boolean wasActive; +static boolean wasInit; +static boolean enabled; +static real64 rampTarget; +static real64 filteredEnvTemp; +static sint32 direction; +static real64 targetAngle; +static boolean init; +static boolean final; +static boolean deltaSearchPhase; + +static Ramp_t initRamp = { 0, 0.0, 0.0 }; +static Timer_t initTimer; +static Ramp_t moveTimeRamp = { 0, 0.0, 0.0 };; +static PT1_t envTempFilter; +static Timer_t shutdownTimer; +static real64 voltageFilter; +static Delay_t batteryLowDelay; +static Delay_t standstillDelay; +static real64 adaptation[2] = {0.0, 0.0}; +static boolean rampHighReached = FALSE; +static boolean wasRampEnded; + + +void RoCo_init() +{ + enabled = FALSE; + angleDiffRequest = 0.0; + desiredEngineVoltage = 0.0; + initBackwards = FALSE; + initTimer = 0.0; + limitationActive = FALSE; + prevAngleSignal = 0.0; + PT1_SetState (&envTempFilter, Env_temperature); + rampValue = 0.0; + filteredEnvTemp = 0.0; + direction = 0; + targetAngle = 0.0; + batteryLowDelay = 0.0; + shutdownTimer = 0.0; + rampTarget = 0.0; + voltageFilter = 0.0; + wasActive = FALSE; + wasInit = FALSE; + deltaSearchPhase = FALSE; + init = FALSE; + final = FALSE; + + RoCo_activeDesired = FALSE; + RoCo_commandMoveByAngle = FALSE; + RoCo_commandMoveToAngle = FALSE; + RoCo_commandShutOff = FALSE; + RoCo_desiredDeltaAngle = 0.0; + RoCo_desiredTargetAngle = 0.0; + RoCo_moveFast = FALSE; + + RoCo_isActive = FALSE; + RoCo_legAngle = 0.0; + RoCo_legAngleValid = FALSE; + RoCo_error = FALSE; + RoCo_engineVoltage = 0.0; + RoCo_isAdapted = FALSE; +} + + +void RoCo_process(void) +{ + real64 t1 = Battery_voltage; + real64 t2 = Env_humidity; + real64 t3 = Env_temperature; + boolean t4 = LegSensor_atMark; + real64 t5 = LegSensor_signal; + real64 t9; + real64 t10; + real64 t11; + Curve_t *t12; + real64 t13; + boolean t14; + real64 t15; + + filteredEnvTemp = PT1_Filter (&envTempFilter, t3 , RoCo_TempFltT_PARAM, dT); + enabled = ((((filteredEnvTemp > RoCo_envTempLowerLimit_PARAM) && + (filteredEnvTemp < RoCo_envTempUpperLimit_PARAM)) ? + ((t2 < RoCo_humidityLimit_PARAM) || (!RoCo_checkHumidity_PARAM)) : + FALSE) && + ((!Turn_on_delay (&batteryLowDelay, + t1 < RoCo_batteryLowLimit_PARAM, + RoCo_batteryLowDelay_PARAM, dT)) || + (!RoCo_checkBatteryVoltage_PARAM)) && + (!RoCo_error)); + if (!enabled) { + wasActive = wasActive && RoCo_activeDesired; + RoCo_isActive = FALSE; + RoCo_engineVoltage = 0.0; + } + else if (RoCo_activeDesired || RoCo_isActive) { + t13 = RoCo_voltageFilter_PARAM; + t15 = Interpolate_from_curve (&LegSensorSignalToAngle_CURVE, t5); + RoCo_legAngle = RoCo_legAngle + t15; + if (t4) { + RoCo_legAngle = RoCo_angleAtMark_PARAM; + RoCo_legAngleValid = TRUE; + } + if ((RoCo_activeDesired) && (!wasActive)) { + if (!RoCo_legAngleValid) { + init = TRUE; + } + RoCo_isActive = TRUE; + } + if (!RoCo_activeDesired && wasActive && !init && !final) { + RoCo_commandShutOff = TRUE; + } + if (init) { + t14 = (RoCo_angleAtMark_PARAM > RoCo_idlePosition_PARAM); + if (!wasActive) { + Timer_start (&initTimer); + } + if ((Timer_elapsedTime (&initTimer) > RoCo_initTimeout_PARAM) || + (Turn_on_delay(&standstillDelay, fabs(t15) < 0.001, + RoCo_initStandstillTimeout_PARAM, dT))) { + if (!initBackwards) { + initBackwards = TRUE; + Timer_start (&initTimer); + Turn_on_delay(&standstillDelay, FALSE, + RoCo_initStandstillTimeout_PARAM, dT); + } + else { + RoCo_error = TRUE; + RoCo_isActive = FALSE; + init = FALSE; + } + } + rampTarget = initBackwards ^ t14 ? + RoCo_initMoveSpeed_PARAM : -RoCo_initMoveSpeed_PARAM; + angleDiffRequest = Ramp_out (&initRamp, rampTarget, + RoCo_initRampSlopePos_PARAM, + RoCo_initRampSlopeNeg_PARAM, dT); + if (RoCo_legAngleValid) { + init = FALSE; + initBackwards = FALSE; + } + } + + if (!init) { + if (RoCo_commandShutOff) { + final = TRUE; + RoCo_commandShutOff = FALSE; + targetAngle = RoCo_idlePosition_PARAM; + Timer_start (&shutdownTimer); + RoCo_activeDesired = FALSE; + } + if (!final && RoCo_commandMoveToAngle) { + targetAngle = RoCo_desiredTargetAngle; + RoCo_commandMoveToAngle = FALSE; + direction = 0; + } + else if (!final && RoCo_commandMoveByAngle) { + targetAngle = RoCo_legAngle + RoCo_desiredDeltaAngle; + if (RoCo_desiredDeltaAngle == 0.0) { + direction = 0; + } + else { + direction = (RoCo_desiredDeltaAngle > 0.0) ? -1 : 1; + } + RoCo_commandMoveByAngle = FALSE; + } + if (RoCo_hasMinMaxAngles_PARAM) { + targetAngle = Limiter_out(RoCo_minAngle_PARAM, targetAngle, + RoCo_maxAngle_PARAM); + } + t9 = RoCo_legAngle - targetAngle; + t11 = RoCo_moveFast ? RoCo_angleReachedThreshold1Fast_PARAM : + RoCo_angleReachedThreshold1_PARAM; + if (RoCo_adaptationActive) { + t11 += adaptation[RoCo_moveFast]; + } + if ((fabs(t9) > t11) && (direction == 0)) { + direction = ((((!RoCo_hasMinMaxAngles_PARAM) || + (fabs(t9) >= 180.0)) + ? t9 : -t9) > 0.0) ? 1 : -1; + } + rampTarget = 0.0; + if ((RoCo_legAngleValid) && + (fabs(t9) > t11) && + (((t9 > 0.0) && (0 > direction)) || + ((t9 < 0.0) && (0 < direction)))) { + rampTarget = 1.0; + } + rampValue = Ramp_out (&moveTimeRamp, rampTarget, + RoCo_TimeSlopePos_PARAM, RoCo_TimeSlopeNeg_PARAM, dT); + if (-1 == Ramp_getDir (&moveTimeRamp)) { + if (RoCo_moveFast) { + t12 = &RoCo_decelerationFast_CURVE; + } + else { + t12 = &RoCo_deceleration_CURVE; + } + } + else { + if (RoCo_moveFast) { + t12 = &RoCo_accelerationFast_CURVE; + } + else { + t12 = &RoCo_acceleration_CURVE; + } + } + angleDiffRequest = Interpolate_from_curve (t12, rampValue); + angleDiffRequest *= (real64)direction; + t10 = RoCo_legAngle - targetAngle; + if (fabs(rampValue) == 1.0) { + rampHighReached = TRUE; + } + if (rampValue == 0.0) { + if (RoCo_adaptationActive && !wasRampEnded && rampHighReached) { + if ((direction > 0 && t10 > 0.0) || + (direction < 0 && t10 < 0.0)) { + adaptation[RoCo_moveFast] += fabs(t10); + RoCo_isAdapted = TRUE; + } + } + if (fabs(t10) > RoCo_angleReachedThreshold2_PARAM) { + angleDiffRequest += ((t10 > 0.0) ? -1.0 : 1.0) * + RoCo_stepSpeed_PARAM * dT; + } + rampHighReached = FALSE; + } + wasRampEnded = (rampValue == 0.0); + } + if (final && + (((RoCo_legAngleValid) && + (fabs(RoCo_legAngle - RoCo_idlePosition_PARAM) < + RoCo_angleReachedThreshold2_PARAM) && + (fabs(angleDiffRequest) < 0.05)) || + (Timer_elapsedTime (&shutdownTimer) > RoCo_shutdownTimeout_PARAM))) { + final = FALSE; + RoCo_isActive = FALSE; + RoCo_legAngleValid = FALSE; + } + desiredEngineVoltage = Interpolate_from_curve + (&EngineSpeedToVoltage_CURVE, angleDiffRequest); + desiredEngineVoltage = Limiter_out (Engine_minVoltage_PARAM, + desiredEngineVoltage, Engine_maxVoltage_PARAM); + limitationActive = (Engine_maxVoltage_PARAM == desiredEngineVoltage) || + (Engine_minVoltage_PARAM == desiredEngineVoltage); + + { real64 tentativeV = PT1_Filter (&voltageFilter, desiredEngineVoltage, + t13, dT); + if (tentativeV - RoCo_engineVoltage > 0.390625) + RoCo_engineVoltage += 0.390625; + else if (tentativeV - RoCo_engineVoltage < -0.390625) + RoCo_engineVoltage -= 0.390625; + else + RoCo_engineVoltage = tentativeV; + } + + wasInit = init; + wasActive = RoCo_isActive; + Timer_tick (&shutdownTimer, dT); + Timer_tick (&initTimer, dT); + } + else { + RoCo_engineVoltage = 0.0; + } +} Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/tests/ICPC/src/s1.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/tests/ICPC/src/s1.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/tests/ICPC/src/s2.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/tests/ICPC/src/s2.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/tests/ICPC/src/s3.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/tests/ICPC/src/s3.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/tests/ICPC/src/s4.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/tests/ICPC/src/s4.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/tests/ICPC/src/s5.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/tests/ICPC/src/s5.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/tests/ICPC/src/s6.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/tests/ICPC/src/s6.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/tests/ICPC/src/s7.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/tests/ICPC/src/s7.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/tests/ICPC/src/s8.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/tests/ICPC/src/s8.png differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/tests/ICPC/src/s9.png and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/tests/ICPC/src/s9.png differ diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/sim.c frama-c-20150201+sodium+dfsg/tests/ICPC/src/sim.c --- frama-c-20140301+neon+dfsg/tests/ICPC/src/sim.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/sim.c 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,62 @@ +#include "stdafx.h" + +#include "roco.h" +#include "sim.h" + +real64 buf1; +real64 buf2; +real64 buf3; +real64 buf4; +real64 buf5; +real64 internalPosition = 22.5; +real64 oldInternalPosition; +real64 Sim_maxPos_PARAM = 100.0; +real64 Sim_minPos_PARAM = -100.0; +PT1_t Srv_PT1; + +extern real64 RoCo_angleAtMark_PARAM; +extern real64 RoCo_minAngle_PARAM; +extern real64 RoCo_maxAngle_PARAM; + +void Sim_process() +{ + real64 t1 = RoCo_engineVoltage; + real64 t2 = Engine_realVoltage; + uint32 t3 = LegSensor_atMark; + real64 t4 = LegSensor_signal; + buf5 = buf4; + buf4 = buf3; + buf3 = buf2; + buf2 = buf1; + buf1 = t1; + Sim_maxPos_PARAM = RoCo_maxAngle_PARAM + 1.0; + Sim_minPos_PARAM = RoCo_minAngle_PARAM - 1.0; + internalPosition = Limiter_out (internalPosition + + (PT1_Filter (&Srv_PT1, buf5 * 0.9, 0.15, dT) * dT), + Sim_minPos_PARAM, Sim_maxPos_PARAM); + t4 = internalPosition - oldInternalPosition; + t3 = (uint8)(((oldInternalPosition < RoCo_angleAtMark_PARAM) && + (RoCo_angleAtMark_PARAM <= internalPosition)) || + ((oldInternalPosition > RoCo_angleAtMark_PARAM) && + (RoCo_angleAtMark_PARAM >= internalPosition))); + t2 = buf5 * 0.9; + oldInternalPosition = internalPosition; + Engine_realVoltage = t2; + LegSensor_atMark = t3; + LegSensor_signal = t4 / 2.5; +} + +void Sim_init() +{ + Engine_realVoltage = 0.0; + LegSensor_atMark = FALSE; + LegSensor_signal = 0.0; + buf1 = 0.0; + buf2 = 0.0; + buf3 = 0.0; + buf4 = 0.0; + buf5 = 0.0; + internalPosition = 20.0; + oldInternalPosition = 0.0; + Srv_PT1 = 0.0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/sim.h frama-c-20150201+sodium+dfsg/tests/ICPC/src/sim.h --- frama-c-20140301+neon+dfsg/tests/ICPC/src/sim.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/sim.h 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,11 @@ +/* + * Simple simulator of a robot leg. + */ + +#ifndef SIM_H_ +#define SIM_H_ + +void Sim_process(); +void Sim_init(); + +#endif /* SIM_H_ */ diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/stdafx.h frama-c-20150201+sodium+dfsg/tests/ICPC/src/stdafx.h --- frama-c-20140301+neon+dfsg/tests/ICPC/src/stdafx.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/stdafx.h 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,29 @@ +/* + * stdafx.h : include file for standard system include files, + * or project specific include files that are used frequently, but + * are changed infrequently + */ + +#pragma once + +#include +#include + +#include "external.h" + +#if _MSC_VER >= 1400 +extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); + +#define fprintf(file, format_string, ...) \ + { \ + if (IsDebuggerPresent()) {\ + char output_string[2048];\ + sprintf_s(output_string, 2048, format_string, ##__VA_ARGS__); \ + System::Diagnostics::Trace::Write(gcnew System::String(output_string)); \ + fprintf_s(file, format_string, ##__VA_ARGS__); \ + } else {\ + fprintf_s(file, format_string, ##__VA_ARGS__); \ + }\ + } +#endif + diff -Nru frama-c-20140301+neon+dfsg/tests/ICPC/src/w frama-c-20150201+sodium+dfsg/tests/ICPC/src/w --- frama-c-20140301+neon+dfsg/tests/ICPC/src/w 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/ICPC/src/w 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,249 @@ +The following study was made with the April development version of Frama-C, which +differs from the last released version in a number of bugfixes ([list of reported issues|http://bts.frama-c.com/|en]) and minor new +features. Specifically, we used the value analysis and dependencies +computations (documented in [this manual|http://frama-c.com/download/frama-c-value-analysis.pdf|en]) and +[code navigation features|http://frama-c.com/scope.html|en]. The latter reuse +building blocks that were implemented for [slicing|http://frama-c.com/slicing.html|en]. + +%%% + +The first step, as documented in the tutorial (also part of the [manual|http://frama-c.com/download/frama-c-value-analysis.pdf|en]), is to +identify library functions the program depends on: + +/// +frama-c impls.c main.c roco.c sim.c main_testcase_1.c -metrics -cpp-command "gcc -DTESTCASE=1 -C -E" + +... +Undefined functions (10): + __builtin_inf (15 calls); __builtin_inff (15 calls); fprintf (2 calls); + __swbuf (10 calls); __builtin_fabsf (15 calls); exp (1 call); + __builtin_infl (15 calls); __builtin_fabsl (15 calls); + __builtin_fabs (15 calls); fabs (9 calls); +... +/// + +The host computer's standard headers have been used, hence the +confusing @@__builtin_@@ prefixes. Better not rely on them: the robot's +operating system probably bears little resemblance to the host's. +Placeholder headers provided with Frama-C can be used instead: + +/// +frama-c impls.c main.c roco.c sim.c main_testcase_1.c -metrics -cpp-command "gcc -DTESTCASE=1 -C -E -nostdinc -I. -I/usr/local/share/frama-c/libc" + +... +Undefined functions (3): + exp (1 call); fabs (9 calls); fprintf (2 calls); +... +/// + +Standard functions @@exp@@ and @@fabs@@ are missing form the Carbon release, but +have been added to the development version. With the latter, one +simply needs to list @@/usr/local/share/frama-c/libc/math.c@@ as a file of +the analysis project. Calls to @@fprintf()@@, that do not have any +repercussions on the continuing execution, can be replaced with +calls to the @@Frama_C_show_each()@@ built-in. + +We are now ready to launch the value analysis. +Since we anticipate testcases 2 and 3 to be very similar, we write a short +script: + +/// +#!/bin/bash + +export CPP="gcc -Dfprintf=Frama_C_show_each -DTESTCASE=$1 -C -E -nostdinc -I. -I/usr/local/share/frama-c/libc" +FILES="/usr/local/share/frama-c/libc/math.c impls.c main.c roco.c sim.c" +TESTCASE="main_testcase_$1.c" + +exec frama-c ${FILES} ${TESTCASE} -val -slevel 50000 -val-signed-overflow-alarms -calldeps -save state$1 +/// + +About ten minutes after running @@script.sh 1 > log1@@, +we obtain a log (long:\~70MiB) and a state (\~1MiB). +The log is long because it contains progression messages that are only intended to help identify +analysis issues, and can be ignored most of the time. The state contains all the information +that has been computed about the program, including values of variables, +in a very compact format. + +%%% + +The analysis is completely unrolled (because of option @@-slevel 50000@@) +and precise until the end. This means that the value analysis has in +effect simulated the execution of the program with the inputs +provided in @@main_testcase_1.c@@. + +The log, despite its size, __does not warn about any of the undefined or unspecified behaviors__ that the +value analysis is guaranteed to +identify (uninitialized access, use of a dangling pointer, +overflows in signed integer arithmetics, invalid memory access, invalid +comparison of pointers, division by zero, +undefined logical shift, overflows in conversions from +floating-point to integer, infinite or NaN resulting from a +floating-point operation, undefined side-effects in expressions). +This is very important. It means that we can rest assured +that the strange behavior in the execution we are going to investigate +is not caused by the misuse of one of C's dangerous +constructs. Nothing would be more frustating than to track the value +of a variable which, according to the source code, is not supposed to +change, but is modified through a buffer overflow. The value analysis +guarantees we won't have to do that for this execution. + +%%% + +The values computed and stored in @@state1@@ can be observed in +Frama-C's GUI, but the GUI can also be used to identify the definition +site(s) of a variable. Here, it is the value of variable @@RoCo_engineVoltage@@ +as displayed by the call to @@fprintf()@@ (that we transformed into a call +to @@Frama_C_show_each()@@) that is wrong, so we request the definition site(s) +of that value: + +[((/public/ICPC11/.s1_m.jpg|s1.png|C|s1.png, avr. 2011))|/public/ICPC11/s1.png||s1.png] + +The GUI has pointed us to a call to function @@RoCo_Process()@@ (using the yellow mark), +so we now request the definition +sites of @@RoCo_engineVoltage@@ by the @@return;@@ statement of that function. +We obtain the two sites identified below: + +[((/public/ICPC11/.s2_m.jpg|s2.png|C|s2.png, avr. 2011))|/public/ICPC11/s2.png||s2.png] + +The condition that decides which branch is executing is the one shown in the screenshot +below. + +[((/public/ICPC11/.s3_m.jpg|s3.png|C|s3.png, avr. 2011))|/public/ICPC11/s3.png||s3.png] + +The value analysis tell us the value of @@RoCo_isActive@@ can be either @@0@@ or @@1@@ +at this point during execution, but this variable is one of the variable whose value is printed in +the log, and its value was @@1@@ at the instant we are interested in. We therefore focus +on the definition site where the value assigned to @@RoCo_engineVoltage@@ is computed +in a call to @@PT1_Filter()@@. + +The dependencies of the particular call to @@PT1_Filter()@@ we are +interested in were computed by option -calldeps and can be found in the log. +The call we are interested in is at statement 433. The log contains: + +/// +call PT1_Filter at statement 433: + voltageFilter FROM state; x; t1; dt; voltageFilter + \result FROM state; x; t1; dt; voltageFilter +/// + +Apart from reading its arguments @@state@@, @@x@@, @@t1@@, and @@dt@@, the call accesses +a static variable @@voltageFilter@@. The address of @@voltageFilter@@ is taken, +so we have to be careful: this variable could be modified erroneously +through a pointer (although the address-taking appears to be only to +pass it to @@PT1_Filter()@@, which is innocent enough). + +In fact, at this point, we have no idea which of the variables involved +in the computation of the result of this call to @@PT1_Filter()@@ is wrong. +Clicking on a variable in the GUI provides the set of values for this +variable at this program point, but this is still too imprecise here, +since it mixes all 10000 or so passages through the statement. + +Let us take advantage of the "blackboard" structure of the analyzed +program and dump the entire program state at this statement, +by inserting a call to @@Frama_C_dump_each()@@. +See [this previous post|/index.php?post/2011/04/21/Frama_C_dump_each] for +a list of advantages of this built-in function over using @@printf()@@ or a +debugger. + +/// +--- roco.c (revision 12956) ++++ roco.c (working copy) +@@ -293,6 +293,7 @@ + desiredEngineVoltage, Engine_maxVoltage_PARAM); + limitationActive = (Engine_maxVoltage_PARAM == desiredEngineVoltage) || + (Engine_minVoltage_PARAM == desiredEngineVoltage); ++ Frama_C_dump_each(); + RoCo_engineVoltage = PT1_Filter (&voltageFilter, desiredEngineVoltage, + t13, dT); + wasInit = init; +/// + +We need to launch the analysis again and find something to do for 10 minutes. +This is a good time to start looking at bugs 2 and 3. + +The log now contains state dumps for each passage through the statement +where @@RoCo_engineVoltage@@ is computed. The dump at which lastTime contains 50000 +and the next few ones show that of @@RoCo_engineVoltage@@'s dependencies, +variable @@desiredEngineVoltage@@ is the one with the erroneous value: it is only +@@-0.8@@. We are therefore left with the sub-problem of identifying why +this variable has this value at this program point. We use the same tools we have already +used for @@RoCo_engineVoltage@@, this time applied to variable @@desiredEngineVoltage@@ +and this program point. The screenshot below shows the definitions sites for that value. + +[((/public/ICPC11/.s4_m.jpg|s4.png|C|s4.png, avr. 2011))|/public/ICPC11/s4.png||s4.png] + +The value of variable @@desiredEngineVoltage@@ is defined by the call to function @@Limiter_Out()@@, +whose argument is in turn defined by the call to @@Interpolate_from_curve()@@ above. + +Option -calldeps computed the implicit inputs of this call, which can be found in the log: +/// +call Interpolate_from_curve at statement 423: + \result FROM curve; x; + EngineSpeedToVoltage_CURVE{.numPoints; .x[0..4]; .y[1..3]; } +/// + +The state dump in which @@lastTime==50000@@ shows that a low value for +@@angleDiffRequest@@ is the cause for the low value of @@desiredEngineVoltage@@. + +The "show defs" action in the GUI finds three possible definition sites for +this value of @@angleDiffRequest@@, shown in the screenshots below. + +[((/public/ICPC11/.s5_m.jpg|s5.png|C|s5.png, avr. 2011))|/public/ICPC11/s5.png||s5.png] + +[((/public/ICPC11/.s6_m.jpg|s6.png|C|s6.png, avr. 2011))|/public/ICPC11/s6.png||s6.png] + +[((/public/ICPC11/.s7_m.jpg|s7.png|C|s7.png, avr. 2011))|/public/ICPC11/s7.png||s7.png] + +We find in the log that variable @@rampValue@@ remains at @@0@@ in the cycles +that follow instant @@50000@@. The value we observe for @@angleDiffRequest@@ +is compatible with the algorithm and values of variables at lines +264-277 of file roco.c. So it looks like the cause of the issue +is the value of variable @@rampValue@@. Action "show defs" in the GUI +indicates that this value is computed by the call to @@Ramp_out()@@ at line 240. +The value of @@rampTarget@@ is computed as @@0.0@@ or @@1.0@@ from a number of +variables, and of these variables, @@RoCo_legAngleValid@@ was always 1, +and @@direction@@ was always @@0@@ or @@1@@. The latter is suspicious, since +in this execution, orders are given to move in both directions: + +[((/public/ICPC11/.s8_m.jpg|s8.png|C|s8.png, avr. 2011))|/public/ICPC11/s8.png||s8.png] + +The command "show defs" applied to variable @@direction@@ shows that indeed, +the variable may have been set to @@0@@ or @@1@@ in three different sites. + +[((/public/ICPC11/.s9_m.jpg|s9.png|C|s9.png, avr. 2011))|/public/ICPC11/s9.png||s9.png] + +The site that corresponds to the MoveByAngle command, the middle one in the screenshot above, +is suspicious: in the file main_testcase_1.c, the angle passed to this command is negative. +This is not just a strange convention, because the computation below for the third +definition site determined the direction for the other commands, that are all in +the opposite direction, and variable @@direction@@ was assigned @@1@@ again there. + +This suggests the fix below. +/// +--- roco.c (revision 13019) ++++ roco.c (working copy) +@@ -211,7 +211,7 @@ + direction = 0; + } + else { +- direction = (RoCo_desiredDeltaAngle > 0.0) ? -1 : 1; ++ direction = (RoCo_desiredDeltaAngle > 0.0) ? 1 : -1; + } + RoCo_commandMoveByAngle = FALSE; + } +/// + +%%% + +Looking at the source code for related issues, one may notice that the value given to @@direction@@ +is also affected by the piece of code below. It would be worth the time testing different values of +@@t9@@ and @@RoCo_hasMinMaxAngles_PARAM@@, although that complex computation is +only active when using commands other than MoveByAngle. + +/// + if ((fabs(t9) > t11) && (direction == 0)) { + direction = ((((!RoCo_hasMinMaxAngles_PARAM) || + (fabs(t9) >= 180.0)) + ? t9 : -t9) > 0.0) ? 1 : -1; + } +/// Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/tests/ICPC/VS2010.zip and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/tests/ICPC/VS2010.zip differ diff -Nru frama-c-20140301+neon+dfsg/tests/idct/ieee_1180_1990.c frama-c-20150201+sodium+dfsg/tests/idct/ieee_1180_1990.c --- frama-c-20140301+neon+dfsg/tests/idct/ieee_1180_1990.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/idct/ieee_1180_1990.c 2015-05-29 15:31:43.000000000 +0000 @@ -1,6 +1,6 @@ /* run.config GCC: - OPT: -float-normal -no-warn-signed-overflow -val -deps -out -input tests/idct/idct.c share/libc/stdio.c share/math.c -journal-disable -remove-redundant-alarms -memexec-all -then -report -report-print-properties + OPT: -float-normal -no-warn-signed-overflow -val -deps -out -input tests/idct/idct.c share/math.c -journal-disable -remove-redundant-alarms -memexec-all -val-builtin sqrt:Frama_C_sqrt,cos:Frama_C_cos_precise -then -report -report-print-properties */ /* IEEE_1180_1990: a testbed for IDCT accuracy * Copyright (C) 2001 Renaud Pacalet diff -Nru frama-c-20140301+neon+dfsg/tests/idct/oracle/ieee_1180_1990.res.oracle frama-c-20150201+sodium+dfsg/tests/idct/oracle/ieee_1180_1990.res.oracle --- frama-c-20140301+neon+dfsg/tests/idct/oracle/ieee_1180_1990.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/idct/oracle/ieee_1180_1990.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,1944 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/idct/ieee_1180_1990.c (with preprocessing) +tests/idct/ieee_1180_1990.c:101:[kernel] warning: Floating-point constant 3.14159265358979323846 is not represented exactly. Will use 0x1.921fb54442d18p1. See documentation for option -warn-decimal-float +[kernel] Parsing tests/idct/idct.c (with preprocessing) +[kernel] Parsing share/math.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + __FC_errno ∈ [--..--] + __fc_stdin ∈ {{ NULL ; &S___fc_stdin[0] }} + __fc_stdout ∈ {{ NULL ; &S___fc_stdout[0] }} + __fc_fopen[0..511] ∈ {0} + _p__fc_fopen ∈ {{ &__fc_fopen[0] }} + M1[0..7][0..7] ∈ {0} + randx ∈ {1} + z ∈ {1.9999999990686774*2^30} + mcos[0..7][0..7] ∈ {0} + init ∈ {1} + mcos_0[0..7][0..7] ∈ {0} + init_0 ∈ {1} + init_1 ∈ {1} + mc1[0..7][0..7] ∈ {0} + mc2[0..7][0..7] ∈ {0} + S___fc_stdin[0]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof} ∈ + [--..--] + [0].[bits 80 to 95] ∈ UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ {{ NULL ; &S___fc_inode_0_S___fc_stdin[0] }} + [0].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_0_S___fc_stdin[0] }} + {[0].__fc_real_data_max_size; [1]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof}} ∈ + [--..--] + [1].[bits 80 to 95] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ {{ NULL ; &S___fc_inode_1_S___fc_stdin[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdin[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + S___fc_inode_0_S___fc_stdin[0..1] ∈ [--..--] + S___fc_real_data_0_S___fc_stdin[0..1] ∈ [--..--] + S___fc_inode_1_S___fc_stdin[0..1] ∈ [--..--] + S___fc_real_data_1_S___fc_stdin[0..1] ∈ [--..--] + S___fc_stdout[0]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof} ∈ + [--..--] + [0].[bits 80 to 95] ∈ UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL ; &S___fc_inode_0_S___fc_stdout[0] }} + [0].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_0_S___fc_stdout[0] }} + {[0].__fc_real_data_max_size; [1]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof}} ∈ + [--..--] + [1].[bits 80 to 95] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stdout[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdout[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + S___fc_inode_0_S___fc_stdout[0..1] ∈ [--..--] + S___fc_real_data_0_S___fc_stdout[0..1] ∈ [--..--] + S___fc_inode_1_S___fc_stdout[0..1] ∈ [--..--] + S___fc_real_data_1_S___fc_stdout[0..1] ∈ [--..--] +tests/idct/ieee_1180_1990.c:178:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:179:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:184:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:185:[value] entering loop for the first time +[value] computing for function idct <- main. + Called from tests/idct/ieee_1180_1990.c:187. +tests/idct/idct.c:87:[value] entering loop for the first time +tests/idct/idct.c:88:[value] entering loop for the first time +tests/idct/idct.c:125:[value] entering loop for the first time +tests/idct/idct.c:126:[value] entering loop for the first time +tests/idct/idct.c:128:[value] entering loop for the first time +tests/idct/idct.c:129:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp1[i][j]); +tests/idct/idct.c:131:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp1[i][j]); +tests/idct/idct.c:141:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp1[i][j]); +tests/idct/idct.c:143:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp1[i][j]); +tests/idct/idct.c:145:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp1[i][j]); +tests/idct/idct.c:147:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp1[i][j]); +tests/idct/idct.c:141:[value] warning: 2's complement assumed for overflow +tests/idct/idct.c:159:[value] entering loop for the first time +tests/idct/idct.c:160:[value] entering loop for the first time +tests/idct/idct.c:162:[value] entering loop for the first time +tests/idct/idct.c:163:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp2[k][j]); +tests/idct/idct.c:163:[value] warning: 2's complement assumed for overflow +tests/idct/idct.c:163:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp1[i][j]); +tests/idct/idct.c:166:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp1[i][j]); +tests/idct/idct.c:176:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp1[i][j]); +tests/idct/idct.c:176:[value] warning: 2's complement assumed for overflow +tests/idct/idct.c:178:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp1[i][j]); +tests/idct/idct.c:180:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp1[i][j]); +tests/idct/idct.c:182:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp1[i][j]); +[value] Recording results for idct +[value] Done for function idct +tests/idct/ieee_1180_1990.c:189:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:190:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:191:[kernel] warning: accessing uninitialized left-value: assert \initialized(&m2[i][j]); +[value] computing for function printf <- main. + Called from tests/idct/ieee_1180_1990.c:195. +[value] using specification for function printf +[value] Done for function printf +[value] computing for function printf <- main. + Called from tests/idct/ieee_1180_1990.c:196. +[value] Done for function printf +tests/idct/ieee_1180_1990.c:202:[value] entering loop for the first time +[value] computing for function IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:211. +tests/idct/ieee_1180_1990.c:83:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:84:[value] entering loop for the first time +[value] computing for function IEEE_1180_1990_rand <- IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:85. +[value] Recording results for IEEE_1180_1990_rand +[value] Done for function IEEE_1180_1990_rand +[value] computing for function IEEE_1180_1990_rand <- IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:85. +tests/idct/ieee_1180_1990.c:69:[value] warning: 2's complement assumed for overflow +[value] Recording results for IEEE_1180_1990_rand +[value] Done for function IEEE_1180_1990_rand +[value] computing for function IEEE_1180_1990_rand <- IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:85. +[value] Recording results for IEEE_1180_1990_rand +[value] Done for function IEEE_1180_1990_rand +[value] computing for function IEEE_1180_1990_rand <- IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:85. +[value] Recording results for IEEE_1180_1990_rand +[value] Done for function IEEE_1180_1990_rand +[value] computing for function IEEE_1180_1990_rand <- IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:85. +[value] Recording results for IEEE_1180_1990_rand +[value] Done for function IEEE_1180_1990_rand +[value] computing for function IEEE_1180_1990_rand <- IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:85. +[value] Recording results for IEEE_1180_1990_rand +[value] Done for function IEEE_1180_1990_rand +[value] computing for function IEEE_1180_1990_rand <- IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:85. +[value] Recording results for IEEE_1180_1990_rand +[value] Done for function IEEE_1180_1990_rand +[value] computing for function IEEE_1180_1990_rand <- IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:85. +[value] Recording results for IEEE_1180_1990_rand +[value] Done for function IEEE_1180_1990_rand +[value] computing for function IEEE_1180_1990_rand <- IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:85. +[value] Recording results for IEEE_1180_1990_rand +[value] Done for function IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +[value] Recording results for IEEE_1180_1990_mkbk +[value] Done for function IEEE_1180_1990_mkbk +[value] computing for function IEEE_1180_1990_dctf <- main. + Called from tests/idct/ieee_1180_1990.c:212. +tests/idct/ieee_1180_1990.c:98:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:99:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:104:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:105:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:108:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:109:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp1[i][j]); +tests/idct/ieee_1180_1990.c:111:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:112:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:115:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:116:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp1[i][k]); +tests/idct/ieee_1180_1990.c:116:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp2[i][j]); +tests/idct/ieee_1180_1990.c:117:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp2[i][j]); +tests/idct/ieee_1180_1990.c:119:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp2[i][j]); +tests/idct/ieee_1180_1990.c:121:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp2[i][j]); +tests/idct/ieee_1180_1990.c:122:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp2[i][j]); +tests/idct/ieee_1180_1990.c:122:[kernel] warning: overflow in conversion + of tmp2[i][j] + 0.5 ([-1.9999999999999998*2^1023 .. 1.6867516709168837*2^265]) + from floating-point to integer. + assert -2147483649 < tmp2[i][j]+0.5 < 2147483648; +tests/idct/ieee_1180_1990.c:124:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp2[i][j]); +tests/idct/ieee_1180_1990.c:124:[kernel] warning: overflow in conversion + of tmp2[i][j] - 0.5 ([-1.9999999999999998*2^1023 .. 1.6867516709168837*2^265]) + from floating-point to integer. + assert -2147483649 < tmp2[i][j]-0.5 < 2147483648; +[value] Recording results for IEEE_1180_1990_dctf +[value] Done for function IEEE_1180_1990_dctf +[value] computing for function IEEE_1180_1990_idctf <- main. + Called from tests/idct/ieee_1180_1990.c:213. +tests/idct/ieee_1180_1990.c:138:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:139:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:145:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:146:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:149:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:150:[kernel] warning: accessing uninitialized left-value: assert \initialized(&(*(m1+k))[j]); +tests/idct/ieee_1180_1990.c:150:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp1[i][j]); +tests/idct/ieee_1180_1990.c:152:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:153:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:156:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:157:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp1[i][k]); +tests/idct/ieee_1180_1990.c:157:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp2[i][j]); +tests/idct/ieee_1180_1990.c:158:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp2[i][j]); +tests/idct/ieee_1180_1990.c:160:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp2[i][j]); +tests/idct/ieee_1180_1990.c:162:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp2[i][j]); +tests/idct/ieee_1180_1990.c:163:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp2[i][j]); +tests/idct/ieee_1180_1990.c:163:[kernel] warning: overflow in conversion + of tmp2[i][j] + 0.5 ([-1.9999999999999998*2^1023 .. 1.6867516709168837*2^265]) + from floating-point to integer. + assert -2147483649 < tmp2[i][j]+0.5 < 2147483648; +tests/idct/ieee_1180_1990.c:165:[kernel] warning: accessing uninitialized left-value: assert \initialized(&tmp2[i][j]); +tests/idct/ieee_1180_1990.c:165:[kernel] warning: overflow in conversion + of tmp2[i][j] - 0.5 ([-1.9999999999999998*2^1023 .. 1.6867516709168837*2^265]) + from floating-point to integer. + assert -2147483649 < tmp2[i][j]-0.5 < 2147483648; +[value] Recording results for IEEE_1180_1990_idctf +[value] Done for function IEEE_1180_1990_idctf +[value] computing for function idct <- main. + Called from tests/idct/ieee_1180_1990.c:214. +tests/idct/idct.c:129:[kernel] warning: accessing uninitialized left-value: assert \initialized(&(*(m1+k))[j]); +tests/idct/idct.c:129:[value] warning: 2's complement assumed for overflow +[value] Recording results for idct +[value] Done for function idct +tests/idct/ieee_1180_1990.c:215:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:216:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:218:[kernel] warning: accessing uninitialized left-value: assert \initialized(&m4[j][k]); +tests/idct/ieee_1180_1990.c:218:[kernel] warning: accessing uninitialized left-value: assert \initialized(&m3[j][k]); +tests/idct/ieee_1180_1990.c:218:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:219:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[0].pme[j][k]); +tests/idct/ieee_1180_1990.c:220:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:230:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:231:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[0].pmse[j][k]); +tests/idct/ieee_1180_1990.c:219:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:231:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:233:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:234:[value] entering loop for the first time +[value] computing for function IEEE_1180_1990_dctf <- main. + Called from tests/idct/ieee_1180_1990.c:236. +[value] Recording results for IEEE_1180_1990_dctf +[value] Done for function IEEE_1180_1990_dctf +[value] computing for function IEEE_1180_1990_idctf <- main. + Called from tests/idct/ieee_1180_1990.c:237. +[value] Recording results for IEEE_1180_1990_idctf +[value] Done for function IEEE_1180_1990_idctf +[value] computing for function idct <- main. + Called from tests/idct/ieee_1180_1990.c:238. +[value] Recording results for idct +[value] Done for function idct +tests/idct/ieee_1180_1990.c:239:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:240:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:242:[kernel] warning: accessing uninitialized left-value: assert \initialized(&m4[j][k]); +tests/idct/ieee_1180_1990.c:242:[kernel] warning: accessing uninitialized left-value: assert \initialized(&m3[j][k]); +tests/idct/ieee_1180_1990.c:242:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:243:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[3].pme[j][k]); +tests/idct/ieee_1180_1990.c:244:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:254:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:255:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[3].pmse[j][k]); +[value] computing for function IEEE_1180_1990_dctf <- main. + Called from tests/idct/ieee_1180_1990.c:236. +[value] Recording results for IEEE_1180_1990_dctf +[value] Done for function IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:237:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:238:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:243:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:255:[value] warning: 2's complement assumed for overflow +[value] computing for function IEEE_1180_1990_dctf <- main. + Called from tests/idct/ieee_1180_1990.c:236. +[value] Recording results for IEEE_1180_1990_dctf +[value] Done for function IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:237:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:238:[value] Reusing old results for call to idct +[value] computing for function IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:257. +[value] computing for function IEEE_1180_1990_rand <- IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:85. +[value] Recording results for IEEE_1180_1990_rand +[value] Done for function IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +[value] Recording results for IEEE_1180_1990_mkbk +[value] Done for function IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:258:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:259:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:260:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:261:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:262:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:264:[kernel] warning: accessing uninitialized left-value: assert \initialized(&m4[j][k]); +tests/idct/ieee_1180_1990.c:264:[kernel] warning: accessing uninitialized left-value: assert \initialized(&m3[j][k]); +tests/idct/ieee_1180_1990.c:264:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:265:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[1].pme[j][k]); +tests/idct/ieee_1180_1990.c:266:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:276:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:277:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[1].pmse[j][k]); +tests/idct/ieee_1180_1990.c:257:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:258:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:259:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:260:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:265:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:277:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:279:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:280:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:282:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:283:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:284:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:285:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:286:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:288:[kernel] warning: accessing uninitialized left-value: assert \initialized(&m4[j][k]); +tests/idct/ieee_1180_1990.c:288:[kernel] warning: accessing uninitialized left-value: assert \initialized(&m3[j][k]); +tests/idct/ieee_1180_1990.c:288:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:289:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[4].pme[j][k]); +tests/idct/ieee_1180_1990.c:290:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:300:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:301:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[4].pmse[j][k]); +tests/idct/ieee_1180_1990.c:289:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:301:[value] warning: 2's complement assumed for overflow +[value] computing for function IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:303. +[value] computing for function IEEE_1180_1990_rand <- IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:85. +[value] Recording results for IEEE_1180_1990_rand +[value] Done for function IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +[value] Recording results for IEEE_1180_1990_mkbk +[value] Done for function IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:304:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:305:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:306:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:307:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:308:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:310:[kernel] warning: accessing uninitialized left-value: assert \initialized(&m4[j][k]); +tests/idct/ieee_1180_1990.c:310:[kernel] warning: accessing uninitialized left-value: assert \initialized(&m3[j][k]); +tests/idct/ieee_1180_1990.c:310:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:311:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[2].pme[j][k]); +tests/idct/ieee_1180_1990.c:312:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:322:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:323:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[2].pmse[j][k]); +tests/idct/ieee_1180_1990.c:303:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:304:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:305:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:306:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:311:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:323:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:325:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:326:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:328:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:329:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:330:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:331:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:332:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:334:[kernel] warning: accessing uninitialized left-value: assert \initialized(&m4[j][k]); +tests/idct/ieee_1180_1990.c:334:[kernel] warning: accessing uninitialized left-value: assert \initialized(&m3[j][k]); +tests/idct/ieee_1180_1990.c:334:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:335:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[5].pme[j][k]); +tests/idct/ieee_1180_1990.c:336:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:346:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:347:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[5].pmse[j][k]); +tests/idct/ieee_1180_1990.c:335:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:347:[value] warning: 2's complement assumed for overflow +[value] computing for function IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:211. +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +[value] Recording results for IEEE_1180_1990_mkbk +[value] Done for function IEEE_1180_1990_mkbk +[value] computing for function IEEE_1180_1990_dctf <- main. + Called from tests/idct/ieee_1180_1990.c:212. +[value] Recording results for IEEE_1180_1990_dctf +[value] Done for function IEEE_1180_1990_dctf +[value] computing for function IEEE_1180_1990_idctf <- main. + Called from tests/idct/ieee_1180_1990.c:213. +[value] Recording results for IEEE_1180_1990_idctf +[value] Done for function IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:214:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:236:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:237:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:238:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:257:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:258:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:259:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:260:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:282:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:283:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:284:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:303:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:304:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:305:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:306:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:328:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:329:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:330:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:211:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:212:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:213:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:214:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:235:[value] warning: 2's complement assumed for overflow +[value] computing for function IEEE_1180_1990_dctf <- main. + Called from tests/idct/ieee_1180_1990.c:236. +[value] Recording results for IEEE_1180_1990_dctf +[value] Done for function IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:237:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:238:[value] Reusing old results for call to idct +[value] computing for function IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:257. +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +[value] Recording results for IEEE_1180_1990_mkbk +[value] Done for function IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:258:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:259:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:260:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:281:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:282:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:283:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:284:[value] Reusing old results for call to idct +[value] computing for function IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:303. +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +[value] Recording results for IEEE_1180_1990_mkbk +[value] Done for function IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:304:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:305:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:306:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:327:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:328:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:329:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:330:[value] Reusing old results for call to idct +[value] computing for function IEEE_1180_1990_mkbk <- main. + Called from tests/idct/ieee_1180_1990.c:211. +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +tests/idct/ieee_1180_1990.c:85:[value] Reusing old results for call to IEEE_1180_1990_rand +[value] Recording results for IEEE_1180_1990_mkbk +[value] Done for function IEEE_1180_1990_mkbk +[value] computing for function IEEE_1180_1990_dctf <- main. + Called from tests/idct/ieee_1180_1990.c:212. +[value] Recording results for IEEE_1180_1990_dctf +[value] Done for function IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:213:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:214:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:236:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:237:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:238:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:257:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:258:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:259:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:260:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:282:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:283:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:284:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:303:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:304:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:305:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:306:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:328:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:329:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:330:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:211:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:212:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:213:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:214:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:236:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:237:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:238:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:257:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:258:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:259:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:260:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:282:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:283:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:284:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:303:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:304:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:305:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:306:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:328:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:329:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:330:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:211:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:212:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:213:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:214:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:236:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:237:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:238:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:257:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:258:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:259:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:260:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:282:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:283:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:284:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:303:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:304:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:305:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:306:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:328:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:329:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:330:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:211:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:212:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:213:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:214:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:236:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:237:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:238:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:257:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:258:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:259:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:260:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:282:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:283:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:284:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:303:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:304:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:305:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:306:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:328:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:329:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:330:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:211:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:212:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:213:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:214:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:236:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:237:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:238:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:257:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:258:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:259:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:260:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:282:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:283:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:284:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:303:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:304:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:305:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:306:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:328:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:329:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:330:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:211:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:212:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:213:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:214:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:236:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:237:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:238:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:257:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:258:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:259:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:260:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:282:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:283:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:284:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:303:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:304:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:305:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:306:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:328:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:329:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:330:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:211:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:212:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:213:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:214:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:236:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:237:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:238:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:257:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:258:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:259:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:260:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:282:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:283:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:284:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:303:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:304:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:305:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:306:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:328:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:329:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:330:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:211:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:212:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:213:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:214:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:236:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:237:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:238:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:257:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:258:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:259:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:260:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:282:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:283:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:284:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:303:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:304:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:305:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:306:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:328:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:329:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:330:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:211:[value] Reusing old results for call to IEEE_1180_1990_mkbk +tests/idct/ieee_1180_1990.c:212:[value] Reusing old results for call to IEEE_1180_1990_dctf +tests/idct/ieee_1180_1990.c:213:[value] Reusing old results for call to IEEE_1180_1990_idctf +tests/idct/ieee_1180_1990.c:214:[value] Reusing old results for call to idct +tests/idct/ieee_1180_1990.c:350:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:354:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:355:[value] entering loop for the first time +tests/idct/ieee_1180_1990.c:357:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[i].pmse[j][k]); +tests/idct/ieee_1180_1990.c:368:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[i].pme[j][k]); +tests/idct/ieee_1180_1990.c:369:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:357:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:358:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[i].pmse[j][k]); +tests/idct/ieee_1180_1990.c:368:[value] warning: 2's complement assumed for overflow +tests/idct/ieee_1180_1990.c:369:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[i].pme[j][k]); +tests/idct/ieee_1180_1990.c:369:[kernel] warning: accessing uninitialized left-value: assert \initialized(&res[i].pme[j][k]); +tests/idct/ieee_1180_1990.c:369:[kernel] warning: accessing uninitialized left-value: + assert \initialized(&tmp_5); + (tmp_5 from (((res[i]).pme)[j])[k] < + 0?- res[i].pme[j][k]:res[i].pme[j][k]) +tests/idct/ieee_1180_1990.c:389:[value] warning: 2's complement assumed for overflow +[value] computing for function exit <- main. + Called from tests/idct/ieee_1180_1990.c:406. +[value] using specification for function exit +[value] Done for function exit +[value] computing for function exit <- main. + Called from tests/idct/ieee_1180_1990.c:414. +[value] Done for function exit +[value] Recording results for main +[value] done for function main +[scope:rm_asserts] removing 13 assertion(s) +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function IEEE_1180_1990_rand: + i ∈ [0..2147483646] + j ∈ [0..600] + x ∈ [0.0000000000000000*2^-1022 .. 600.9999997201375663] + randx ∈ [--..--] + __retres ∈ [-300..300] +[value] Values at end of function IEEE_1180_1990_mkbk: + i ∈ {8} + j ∈ {8} or UNINITIALIZED + M1[0..7][0..7] ∈ [--..--] + randx ∈ [--..--] +[value] Values at end of function IEEE_1180_1990_dctf: + i ∈ {8} + j ∈ {8} or UNINITIALIZED + k ∈ {8} or UNINITIALIZED + tmp1[0..7][0..7] ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] or UNINITIALIZED + tmp2[0..7][0..7] ∈ + [-1.9999999999999998*2^1023 .. 1.6867516709168837*2^265] or UNINITIALIZED + m2[0..7][0..7] ∈ [--..--] or UNINITIALIZED + mcos[0..7][0..7] ∈ [-1.0000000000000000*2^-1 .. 1.0000000000000000*2^-1] + init ∈ {0} +[value] Values at end of function IEEE_1180_1990_idctf: + i ∈ {8} + j ∈ {8} or UNINITIALIZED + k ∈ {8} or UNINITIALIZED + tmp1[0..7][0..7] ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] or UNINITIALIZED + tmp2[0..7][0..7] ∈ + [-1.9999999999999998*2^1023 .. 1.6867516709168837*2^265] or UNINITIALIZED + m3[0..7][0..7] ∈ [--..--] or UNINITIALIZED + mcos_0[0..7][0..7] ∈ + [-1.0000000000000000*2^-1 .. 1.0000000000000000*2^-1] + init_0 ∈ {0} +[value] Values at end of function idct: + m2[0..7][0..7] ∈ [--..--] or UNINITIALIZED + m4[0..7][0..7] ∈ [--..--] or UNINITIALIZED + i ∈ {8} + j ∈ {8} or UNINITIALIZED + k ∈ {8} or UNINITIALIZED + tmp1[0..7][0..7] ∈ [--..--] or UNINITIALIZED + tmp2[0..7][0..7] ∈ [--..--] or UNINITIALIZED + ftmp1 ∈ + [-1.0000610351562500*2^13 .. 1.0000610351562500*2^13] or UNINITIALIZED + ftmp2 ∈ + [-1.0000610351562500*2^13 .. 1.0000610351562500*2^13] or UNINITIALIZED + init_1 ∈ {0} + mc1[0..7][0..7] ∈ [-8192..8192] + mc2[0..7][0..7] ∈ [-8192..8192] +[value] Values at end of function main: + res[0..5] ∈ [--..--] or UNINITIALIZED + i ∈ {6} + j ∈ {8} + k ∈ {8} or UNINITIALIZED + m2[0..7][0..7] ∈ [--..--] or UNINITIALIZED + m3[0..7][0..7] ∈ [--..--] or UNINITIALIZED + m4[0..7][0..7] ∈ [--..--] or UNINITIALIZED + succ ∈ {0; 1} + omse ∈ [--..--] or UNINITIALIZED + ome ∈ [--..--] or UNINITIALIZED + err ∈ [--..--] or UNINITIALIZED + M1[0..7][0..7] ∈ [--..--] + randx ∈ [--..--] + mcos[0..7][0..7] ∈ [-1.0000000000000000*2^-1 .. 1.0000000000000000*2^-1] + init ∈ {0; 1} + mcos_0[0..7][0..7] ∈ + [-1.0000000000000000*2^-1 .. 1.0000000000000000*2^-1] + init_0 ∈ {0; 1} + init_1 ∈ {0} + mc1[0..7][0..7] ∈ [-8192..8192] + mc2[0..7][0..7] ∈ [-8192..8192] + S___fc_stdout[0]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof} ∈ + [--..--] + [0].[bits 80 to 95] ∈ [--..--] or UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL + [--..--] ; &S___fc_inode_0_S___fc_stdout[0] }} + [0].__fc_real_data ∈ + {{ NULL + [--..--] ; &S___fc_real_data_0_S___fc_stdout[0] }} + {[0].__fc_real_data_max_size; [1]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof}} ∈ + [--..--] + [1].[bits 80 to 95] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stdout[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdout[0] }} + [1].__fc_real_data_max_size ∈ [--..--] +[from] Computing for function IEEE_1180_1990_rand +[from] Done for function IEEE_1180_1990_rand +[from] Computing for function IEEE_1180_1990_mkbk +[from] Done for function IEEE_1180_1990_mkbk +[from] Computing for function cos +[from] Done for function cos +[from] Computing for function sqrt +[from] Done for function sqrt +[from] Computing for function IEEE_1180_1990_dctf +[from] Done for function IEEE_1180_1990_dctf +[from] Computing for function IEEE_1180_1990_idctf +[from] Done for function IEEE_1180_1990_idctf +[from] Computing for function idct +[from] Done for function idct +[from] Computing for function main +[from] Computing for function printf <-main +[from] Done for function printf +[from] Computing for function exit <-main +[from] Done for function exit +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function IEEE_1180_1990_rand: + randx FROM randx + \result FROM L; H; randx; z +[from] Function IEEE_1180_1990_mkbk: + M1[0..7][0..7] FROM min; max; randx; z (and SELF) + randx FROM randx (and SELF) +[from] Function cos: + \result FROM x +[from] Function exit: + NO EFFECTS +[from] Function printf: + S___fc_stdout[0] + FROM "For all-zero input, the proposed IDCT shall generate all-zero "[bits 0 to 503]; + "output.\n"[bits 0 to 71] (and SELF) + \result FROM ANYTHING(origin:Unknown) +[from] Function sqrt: + \result FROM x +[from] Function IEEE_1180_1990_dctf: + m2[0..7][0..7] FROM m1; m2; M1[0..7][0..7]; mcos[0..7][0..7]; + init (and SELF) + mcos[0..7][0..7] FROM init (and SELF) + init FROM init (and SELF) +[from] Function IEEE_1180_1990_idctf: + m3[0..7][0..7] FROM m1; m2; m2[0..7][0..7]; mcos_0[0..7][0..7]; + init_0 (and SELF) + mcos_0[0..7][0..7] FROM init_0 (and SELF) + init_0 FROM init_0 (and SELF) +[from] Function idct: + m2[0..7][0..7] FROM m2[0..7][0..7]; m1; m2; M1[0..7][0..7]; init_1; + mc1[0..7][0..7]; mc2[0..7][0..7] (and SELF) + m4[0..7][0..7] FROM m2[0..7][0..7]; m1; m2; M1[0..7][0..7]; init_1; + mc1[0..7][0..7]; mc2[0..7][0..7] (and SELF) + init_1 FROM init_1 (and SELF) + mc1[0..7][0..7] FROM init_1 (and SELF) + mc2[0..7][0..7] FROM init_1 (and SELF) +[from] Function main: + M1[0..7][0..7] FROM M1[0..7][0..7]; randx; z (and SELF) + randx FROM randx (and SELF) + mcos[0..7][0..7] FROM init (and SELF) + init FROM init (and SELF) + mcos_0[0..7][0..7] FROM init_0 (and SELF) + init_0 FROM init_0 (and SELF) + init_1 FROM init_1 (and SELF) + mc1[0..7][0..7] FROM init_1 (and SELF) + mc2[0..7][0..7] FROM init_1 (and SELF) + S___fc_stdout[0] + FROM M1[0..7][0..7]; init_1; mc1[0..7][0..7]; mc2[0..7][0..7]; + "For all-zero input, the proposed IDCT shall generate all-zero "[bits 0 to 503]; + "output.\n"[bits 0 to 71] (and SELF) + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function IEEE_1180_1990_rand: + i; j; x; randx; __retres +[inout] Inputs for function IEEE_1180_1990_rand: + randx; z +[inout] Out (internal) for function IEEE_1180_1990_mkbk: + i; j; M1[0..7][0..7]; randx +[inout] Inputs for function IEEE_1180_1990_mkbk: + randx; z +[inout] Out (internal) for function cos: + \nothing +[inout] Inputs for function cos: + \nothing +[inout] Out (internal) for function sqrt: + \nothing +[inout] Inputs for function sqrt: + \nothing +[inout] Out (internal) for function IEEE_1180_1990_dctf: + i; j; k; tmp1[0..7][0..7]; tmp2[0..7][0..7]; tmp; tmp_0; tmp_1; + m2[0..7][0..7]; mcos[0..7][0..7]; init +[inout] Inputs for function IEEE_1180_1990_dctf: + M1[0..7][0..7]; mcos[0..7][0..7]; init +[inout] Out (internal) for function IEEE_1180_1990_idctf: + i; j; k; tmp1[0..7][0..7]; tmp2[0..7][0..7]; tmp; tmp_0; tmp_1; + m3[0..7][0..7]; mcos_0[0..7][0..7]; init_0 +[inout] Inputs for function IEEE_1180_1990_idctf: + m2[0..7][0..7]; mcos_0[0..7][0..7]; init_0 +[inout] Out (internal) for function idct: + m2[0..7][0..7]; m4[0..7][0..7]; i; j; k; tmp1[0..7][0..7]; + tmp2[0..7][0..7]; ftmp1; ftmp2; tmp; tmp_0; tmp_1; init_1; mc1[0..7][0..7]; + mc2[0..7][0..7] +[inout] Inputs for function idct: + m2[0..7][0..7]; M1[0..7][0..7]; init_1; mc1[0..7][0..7]; mc2[0..7][0..7] +[inout] Out (internal) for function main: + res[0..5]; i; j; k; m2[0..7][0..7]; m3[0..7][0..7]; m4[0..7][0..7]; + succ; omse; ome; err; tmp; tmp_0; tmp_1; tmp_2; tmp_3; tmp_4; tmp_5; + tmp_6; M1[0..7][0..7]; randx; mcos[0..7][0..7]; init; mcos_0[0..7][0..7]; + init_0; init_1; mc1[0..7][0..7]; mc2[0..7][0..7]; S___fc_stdout[0] +[inout] Inputs for function main: + M1[0..7][0..7]; randx; z; mcos[0..7][0..7]; init; mcos_0[0..7][0..7]; + init_0; init_1; mc1[0..7][0..7]; mc2[0..7][0..7]; + "For all-zero input, the proposed IDCT shall generate all-zero "[bits 0 to 503]; + "output.\n"[bits 0 to 71] +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'remove' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + assigns \nothing; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'rename' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + assigns \nothing; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'tmpfile' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file share/libc/stdio.h, line 66) + ensures + \result ≡ \null ∨ + (\valid(\result) ∧ \fresh{Old, Here}(\result,sizeof(FILE))) + Unverifiable but considered Valid. +[ Extern ] Assigns nothing + assigns \nothing; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'tmpnam' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 70) + assigns \result, *(s+(..)); + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 70) + assigns \result \from *(s+(..)); + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 71) + assigns *(s+(..)) \from \nothing; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fclose' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file share/libc/stdio.h, line 77) + ensures \result ≡ 0 ∨ \result ≡ -1 + Unverifiable but considered Valid. +[ Extern ] Assigns (file share/libc/stdio.h, line 76) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 76) + assigns *stream \from \nothing; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fflush' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file share/libc/stdio.h, line 83) + ensures \result ≡ 0 ∨ \result ≡ -1 + Unverifiable but considered Valid. +[ Extern ] Assigns (file share/libc/stdio.h, line 82) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 82) + assigns *stream \from \nothing; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fopen' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file share/libc/stdio.h, line 94) + ensures + \result ≡ \null ∨ + (\valid(\result) ∧ \subset(\result, &__fc_fopen[0 ..])) + Unverifiable but considered Valid. +[ Extern ] Assigns nothing + assigns \nothing; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 92) + assigns \result + \from *(filename+(..)), *(mode+(..)), _p__fc_fopen; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fdopen' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file share/libc/stdio.h, line 101) + ensures + \result ≡ \null ∨ + (\valid(\result) ∧ \fresh{Old, Here}(\result,sizeof(FILE))) + Unverifiable but considered Valid. +[ Extern ] Assigns nothing + assigns \nothing; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 100) + assigns \result \from fildes, *(mode+(..)); + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'freopen' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file share/libc/stdio.h, line 107) + ensures \result ≡ \null ∨ \result ≡ \old(stream) + Unverifiable but considered Valid. +[ Extern ] Assigns (file share/libc/stdio.h, line 106) + assigns *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'setbuf' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 112) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 112) + assigns *stream \from buf; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'setvbuf' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 116) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 116) + assigns *stream \from buf, mode, size; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fprintf' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 121) + assigns *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fscanf' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 125) + assigns *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'printf' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 132) + assigns *__fc_stdout; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 132) + assigns *__fc_stdout \from *(format+(..)); + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'scanf' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 135) + assigns *__fc_stdin; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'snprintf' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 140) + assigns *(s+(0 .. n-1)); + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'sprintf' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 146) + assigns *(s+(0 ..)); + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'vfprintf' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 155) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 155) + assigns *stream \from *(format+(..)), arg; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'vfscanf' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 160) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 160) + assigns *stream \from *(format+(..)), *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'vprintf' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 166) + assigns *__fc_stdout; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 166) + assigns *__fc_stdout \from arg; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'vscanf' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 170) + assigns *__fc_stdin; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 170) + assigns *__fc_stdin \from *(format+(..)); + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'vsnprintf' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 175) + assigns *(s+(0 .. n-1)); + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 175) + assigns *(s+(0 .. n-1)) \from *(format+(..)), arg; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'vsprintf' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 181) + assigns *(s+(0 ..)); + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 181) + assigns *(s+(0 ..)) \from *(format+(..)), arg; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fgetc' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 192) + assigns *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fgets' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file share/libc/stdio.h, line 198) + ensures \result ≡ \null ∨ \result ≡ \old(s) + Unverifiable but considered Valid. +[ Extern ] Assigns (file share/libc/stdio.h, line 196) + assigns *(s+(0 .. n-1)), *stream, \result; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 196) + assigns *(s+(0 .. n-1)) \from *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 196) + assigns *stream \from *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 197) + assigns \result \from s, n, *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fputc' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 203) + assigns *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fputs' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 206) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 206) + assigns *stream \from *(s+(..)); + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'getc' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 210) + assigns \result, *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 210) + assigns \result \from *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 210) + assigns *stream \from *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'getchar' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + assigns \nothing; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 213) + assigns \result \from *__fc_stdin; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'gets' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file share/libc/stdio.h, line 218) + ensures \result ≡ \old(s) ∨ \result ≡ \null + Unverifiable but considered Valid. +[ Extern ] Assigns (file share/libc/stdio.h, line 216) + assigns *(s+(..)), \result; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 216) + assigns *(s+(..)) \from *__fc_stdin; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 217) + assigns \result \from s, __fc_stdin; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'putc' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 222) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 222) + assigns *stream \from c; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'putchar' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 225) + assigns *__fc_stdout; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 225) + assigns *__fc_stdout \from c; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'puts' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 228) + assigns *__fc_stdout; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 228) + assigns *__fc_stdout \from *(s+(..)); + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'ungetc' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 231) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 231) + assigns *stream \from c; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fread' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 234) + assigns *((char *)ptr+(0 .. nmemb*size-1)); + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 234) + assigns *((char *)ptr+(0 .. nmemb*size-1)) \from *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fwrite' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 239) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 239) + assigns *stream \from *((char *)ptr+(0 .. nmemb*size-1)); + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fgetpos' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 244) + assigns *pos; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 244) + assigns *pos \from *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fseek' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 248) + assigns *stream, __FC_errno; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 248) + assigns *stream \from offset, whence; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fsetpos' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 252) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 252) + assigns *stream \from *pos; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'ftell' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 255) + assigns \result, __FC_errno; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 255) + assigns \result \from *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 255) + assigns __FC_errno \from *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'rewind' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 258) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 258) + assigns *stream \from \nothing; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'clearerr' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 261) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 261) + assigns *stream \from \nothing; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'feof' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + assigns \nothing; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 264) + assigns \result \from *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fileno' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + assigns \nothing; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 267) + assigns \result \from *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'flockfile' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 270) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 270) + assigns *stream \from \nothing; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'funlockfile' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 273) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 273) + assigns *stream \from \nothing; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'ftrylockfile' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 276) + assigns \result, *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 276) + assigns \result \from \nothing; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 276) + assigns *stream \from \nothing; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'ferror' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + assigns \nothing; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 279) + assigns \result \from *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'perror' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 282) + assigns __fc_stdout; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 282) + assigns __fc_stdout \from __FC_errno, *(s+(..)); + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'getc_unlocked' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 285) + assigns \result, *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 285) + assigns \result \from *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 285) + assigns *stream \from *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'getchar_unlocked' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + assigns \nothing; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 287) + assigns \result \from *__fc_stdin; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'putc_unlocked' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 289) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 289) + assigns *stream \from c; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'putchar_unlocked' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 291) + assigns *__fc_stdout; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 291) + assigns *__fc_stdout \from c; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'clearerr_unlocked' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns (file share/libc/stdio.h, line 294) + assigns *stream; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 294) + assigns *stream \from \nothing; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'feof_unlocked' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + assigns \nothing; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 296) + assigns \result \from *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'ferror_unlocked' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + assigns \nothing; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 298) + assigns \result \from *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'fileno_unlocked' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + assigns \nothing; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/stdio.h, line 300) + assigns \result \from *stream; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'exit' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + assigns \nothing; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'idct' +-------------------------------------------------------------------------------- + +[ - ] Assertion 'Value,initialisation' (file tests/idct/idct.c, line 129) + assert Value: initialisation: \initialized(&tmp1[i][j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/idct.c, line 131) + assert Value: initialisation: \initialized(&tmp1[i][j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/idct.c, line 141) + assert Value: initialisation: \initialized(&tmp1[i][j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/idct.c, line 143) + assert Value: initialisation: \initialized(&tmp1[i][j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/idct.c, line 145) + assert Value: initialisation: \initialized(&tmp1[i][j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/idct.c, line 163) + assert Value: initialisation: \initialized(&tmp2[k][j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/idct.c, line 163) + assert Value: initialisation: \initialized(&tmp1[i][j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/idct.c, line 166) + assert Value: initialisation: \initialized(&tmp1[i][j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/idct.c, line 176) + assert Value: initialisation: \initialized(&tmp1[i][j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/idct.c, line 178) + assert Value: initialisation: \initialized(&tmp1[i][j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/idct.c, line 180) + assert Value: initialisation: \initialized(&tmp1[i][j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/idct.c, line 129) + assert Value: initialisation: \initialized(&(*(m1+k))[j]); + tried with Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'IEEE_1180_1990_dctf' +-------------------------------------------------------------------------------- + +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 109) + assert Value: initialisation: \initialized(&tmp1[i][j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 116) + assert Value: initialisation: \initialized(&tmp1[i][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 116) + assert Value: initialisation: \initialized(&tmp2[i][j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 117) + assert Value: initialisation: \initialized(&tmp2[i][j]); + tried with Value. +[ - ] Assertion 'Value,float_to_int' (file tests/idct/ieee_1180_1990.c, line 122) + assert Value: float_to_int: tmp2[i][j]+0.5 < 2147483648; + tried with Value. +[ - ] Assertion 'Value,float_to_int' (file tests/idct/ieee_1180_1990.c, line 122) + assert Value: float_to_int: -2147483649 < tmp2[i][j]+0.5; + tried with Value. +[ - ] Assertion 'Value,float_to_int' (file tests/idct/ieee_1180_1990.c, line 124) + assert Value: float_to_int: tmp2[i][j]-0.5 < 2147483648; + tried with Value. +[ - ] Assertion 'Value,float_to_int' (file tests/idct/ieee_1180_1990.c, line 124) + assert Value: float_to_int: -2147483649 < tmp2[i][j]-0.5; + tried with Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'IEEE_1180_1990_idctf' +-------------------------------------------------------------------------------- + +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 150) + assert Value: initialisation: \initialized(&(*(m1+k))[j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 150) + assert Value: initialisation: \initialized(&tmp1[i][j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 157) + assert Value: initialisation: \initialized(&tmp1[i][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 157) + assert Value: initialisation: \initialized(&tmp2[i][j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 158) + assert Value: initialisation: \initialized(&tmp2[i][j]); + tried with Value. +[ - ] Assertion 'Value,float_to_int' (file tests/idct/ieee_1180_1990.c, line 163) + assert Value: float_to_int: tmp2[i][j]+0.5 < 2147483648; + tried with Value. +[ - ] Assertion 'Value,float_to_int' (file tests/idct/ieee_1180_1990.c, line 163) + assert Value: float_to_int: -2147483649 < tmp2[i][j]+0.5; + tried with Value. +[ - ] Assertion 'Value,float_to_int' (file tests/idct/ieee_1180_1990.c, line 165) + assert Value: float_to_int: tmp2[i][j]-0.5 < 2147483648; + tried with Value. +[ - ] Assertion 'Value,float_to_int' (file tests/idct/ieee_1180_1990.c, line 165) + assert Value: float_to_int: -2147483649 < tmp2[i][j]-0.5; + tried with Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 191) + assert Value: initialisation: \initialized(&m2[i][j]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 218) + assert Value: initialisation: \initialized(&m4[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 218) + assert Value: initialisation: \initialized(&m3[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 219) + assert Value: initialisation: \initialized(&res[0].pme[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 231) + assert Value: initialisation: \initialized(&res[0].pmse[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 242) + assert Value: initialisation: \initialized(&m4[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 242) + assert Value: initialisation: \initialized(&m3[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 243) + assert Value: initialisation: \initialized(&res[3].pme[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 255) + assert Value: initialisation: \initialized(&res[3].pmse[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 264) + assert Value: initialisation: \initialized(&m4[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 264) + assert Value: initialisation: \initialized(&m3[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 265) + assert Value: initialisation: \initialized(&res[1].pme[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 277) + assert Value: initialisation: \initialized(&res[1].pmse[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 288) + assert Value: initialisation: \initialized(&m4[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 288) + assert Value: initialisation: \initialized(&m3[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 289) + assert Value: initialisation: \initialized(&res[4].pme[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 301) + assert Value: initialisation: \initialized(&res[4].pmse[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 310) + assert Value: initialisation: \initialized(&m4[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 310) + assert Value: initialisation: \initialized(&m3[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 311) + assert Value: initialisation: \initialized(&res[2].pme[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 323) + assert Value: initialisation: \initialized(&res[2].pmse[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 334) + assert Value: initialisation: \initialized(&m4[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 334) + assert Value: initialisation: \initialized(&m3[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 335) + assert Value: initialisation: \initialized(&res[5].pme[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 347) + assert Value: initialisation: \initialized(&res[5].pmse[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 357) + assert Value: initialisation: \initialized(&res[i].pmse[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 368) + assert Value: initialisation: \initialized(&res[i].pme[j][k]); + tried with Value. +[ - ] Assertion 'Value,initialisation' (file tests/idct/ieee_1180_1990.c, line 369) + assert Value: initialisation: \initialized(&tmp_5); + tried with Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'Frama_C_cos' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + assigns \nothing; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/math.c, line 23) + assigns \result \from x; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'Frama_C_sqrt' +-------------------------------------------------------------------------------- + +[ Extern ] Assigns nothing + assigns \nothing; + Unverifiable but considered Valid. +[ Extern ] Froms (file share/math.c, line 26) + assigns \result \from x; + Unverifiable but considered Valid. +[ Valid ] Default behavior + default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 60 Completely validated + 124 Considered valid + 57 To be validated + 241 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/impact/initial.i frama-c-20150201+sodium+dfsg/tests/impact/initial.i --- frama-c-20140301+neon+dfsg/tests/impact/initial.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/initial.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,5 +1,6 @@ /* run.config - STDOPT: +"-pdg-verbose 0" +"-main main1 -impact-pragma g1" +"-then -main main2 -impact-pragma g2" +"-then -main main3 -impact-pragma g3" + COMMENT: also tests the parsing of cmdline options of type string_set + STDOPT: +"-pdg-verbose 0" +"-main main1 -impact-pragma g1" +"-then -main main2 -impact-pragma='-@all,+g2'" +"-then -main main3 -impact-pragma='-g2,+g3'" */ int x1, x2, y2, z2, x3; diff -Nru frama-c-20140301+neon+dfsg/tests/impact/loop2.i frama-c-20150201+sodium+dfsg/tests/impact/loop2.i --- frama-c-20140301+neon+dfsg/tests/impact/loop2.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/loop2.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,5 +1,5 @@ /* run.config - STDOPT: +"-impact-pragma main" +"-lib-entry" +"-calldeps" +"-inout-callwise" +"-then" +"-ulevel 10" + STDOPT: +"-kernel-msg-key offsetmap:caches -impact-pragma main -lib-entry -calldeps -inout-callwise -then -ulevel 10" */ diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/alias.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/alias.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/alias.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/alias.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/alias.i (no preprocessing) +[impact] beginning analysis +[value] Analyzing an incomplete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + P ∈ [--..--] + c ∈ [--..--] +tests/impact/alias.i:7:[value] Function f: precondition got status unknown. +tests/impact/alias.i:11:[kernel] warning: out of bounds write. assert \valid(y); +tests/impact/alias.i:12:[kernel] warning: out of bounds read. assert \valid_read(x+1); +tests/impact/alias.i:13:[kernel] warning: out of bounds write. assert \valid(y); +tests/impact/alias.i:15:[kernel] warning: out of bounds read. assert \valid_read(x+1); +tests/impact/alias.i:18:[kernel] warning: out of bounds read. assert \valid_read(y); +[value] Recording results for f +[value] done for function f +tests/impact/alias.i:18:[value] Assertion 'Value,mem_access' got final status invalid. +[scope:rm_asserts] removing 2 assertion(s) +[pdg] computing for function f +[pdg] done for function f +[impact] impacted statements of stmt(s) 2 are: + tests/impact/alias.i:10 (sid 4): y = x + 1; + tests/impact/alias.i:11 (sid 5): *y = 4; + tests/impact/alias.i:12 (sid 7): a = *(x + 1) + 2; + tests/impact/alias.i:13 (sid 8): *y = 2; + tests/impact/alias.i:15 (sid 12): __retres = *(x + 1); + tests/impact/alias.i:14 (sid 19): return_label: return __retres; +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/call.1.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/call.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/call.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/call.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,53 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/call.i (no preprocessing) +[impact] beginning analysis +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + X ∈ {0} +[value] computing for function call_test <- main2. + Called from tests/impact/call.i:36. +[value] computing for function test <- call_test <- main2. + Called from tests/impact/call.i:30. +[value] computing for function p1 <- test <- call_test <- main2. + Called from tests/impact/call.i:16. +[value] using specification for function p1 +[value] Done for function p1 +[value] computing for function p2 <- test <- call_test <- main2. + Called from tests/impact/call.i:16. +tests/impact/call.i:16:[kernel] warning: Neither code nor specification for function p2, generating default assigns from the prototype +[value] using specification for function p2 +[value] Done for function p2 +[value] Recording results for test +[value] Done for function test +[value] Recording results for call_test +[value] Done for function call_test +[value] Recording results for main2 +[value] done for function main2 +[pdg] computing for function main2 +[from] Computing for function call_test +[from] Computing for function test <-call_test +[from] Computing for function p1 <-test <-call_test +[from] Done for function p1 +[from] Computing for function p2 <-test <-call_test +[from] Done for function p2 +[from] Done for function test +[from] Done for function call_test +[pdg] done for function main2 +[pdg] computing for function call_test +[pdg] done for function call_test +[pdg] computing for function test +[pdg] done for function test +[pdg] computing for function p1 +[pdg] done for function p1 +[pdg] computing for function p2 +[pdg] done for function p2 +[impact] impacted statements of stmt(s) 16 are: + tests/impact/call.i:16 (sid 2): if(X) <..> + tests/impact/call.i:16 (sid 3): p1(1); + tests/impact/call.i:16 (sid 4): p2(0); + tests/impact/call.i:30 (sid 12): test(); + tests/impact/call.i:36 (sid 17): call_test(); +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/call.2.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/call.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/call.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/call.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,50 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/call.i (no preprocessing) +[impact] beginning analysis +[value] Analyzing a complete application starting at main3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + X ∈ {0} +[value] computing for function call_test3 <- main3. + Called from tests/impact/call.i:55. +[value] computing for function test3 <- call_test3 <- main3. + Called from tests/impact/call.i:49. +[value] computing for function p3 <- test3 <- call_test3 <- main3. + Called from tests/impact/call.i:45. +[value] using specification for function p3 +tests/impact/call.i:41:[value] warning: no \from part for clause 'assigns G;' of function p3 +[value] Done for function p3 +[value] computing for function p2 <- test3 <- call_test3 <- main3. + Called from tests/impact/call.i:45. +tests/impact/call.i:45:[kernel] warning: Neither code nor specification for function p2, generating default assigns from the prototype +[value] using specification for function p2 +[value] Done for function p2 +[value] Recording results for test3 +[value] Done for function test3 +[value] Recording results for call_test3 +[value] Done for function call_test3 +[value] Recording results for main3 +[value] done for function main3 +[pdg] computing for function main3 +[from] Computing for function call_test3 +[from] Computing for function test3 <-call_test3 +[from] Computing for function p3 <-test3 <-call_test3 +[from] Done for function p3 +[from] Computing for function p2 <-test3 <-call_test3 +[from] Done for function p2 +[from] Done for function test3 +[from] Done for function call_test3 +[pdg] done for function main3 +[pdg] computing for function call_test3 +[pdg] done for function call_test3 +[pdg] computing for function test3 +[pdg] done for function test3 +[pdg] computing for function p3 +[pdg] done for function p3 +[impact] impacted statements of stmt(s) 30 are: + tests/impact/call.i:45 (sid 22): p3(1); + tests/impact/call.i:49 (sid 26): test3(); + tests/impact/call.i:55 (sid 31): call_test3(); +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/called.1.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/called.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/called.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/called.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/called.i (no preprocessing) +[impact] beginning analysis +[value] Analyzing an incomplete application starting at h +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ [--..--] +[value] computing for function f <- h. + Called from tests/impact/called.i:25. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- h. + Called from tests/impact/called.i:27. +[value] Recording results for f +[value] Done for function f +[value] Recording results for h +[value] done for function h +[pdg] computing for function h +[from] Computing for function f +[from] Done for function f +[pdg] done for function h +[pdg] computing for function f +[pdg] done for function f +[impact] impacted statements of stmt(s) 14 are: + tests/impact/called.i:8 (sid 3): return y; + tests/impact/called.i:25 (sid 16): c = f(a,b); +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/called.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/called.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/called.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/called.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,31 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/called.i (no preprocessing) +[impact] beginning analysis +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ [--..--] +[value] computing for function f <- g. + Called from tests/impact/called.i:15. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- g. + Called from tests/impact/called.i:17. +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[pdg] computing for function g +[from] Computing for function f +[from] Done for function f +[pdg] done for function g +[pdg] computing for function f +[pdg] done for function f +[impact] impacted statements of stmt(s) 7 are: + tests/impact/called.i:8 (sid 1): X = x; + tests/impact/called.i:8 (sid 3): return y; + tests/impact/called.i:15 (sid 8): c = f(a,b); + tests/impact/called.i:16 (sid 9): d = X; + tests/impact/called.i:17 (sid 10): c = f(a,d); +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/call.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/call.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/call.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/call.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/call.i (no preprocessing) +[impact] beginning analysis +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + X ∈ {0} +[value] computing for function test <- main. + Called from tests/impact/call.i:24. +[value] computing for function p1 <- test <- main. + Called from tests/impact/call.i:16. +[value] using specification for function p1 +[value] Done for function p1 +[value] computing for function p2 <- test <- main. + Called from tests/impact/call.i:16. +tests/impact/call.i:16:[kernel] warning: Neither code nor specification for function p2, generating default assigns from the prototype +[value] using specification for function p2 +[value] Done for function p2 +[value] Recording results for test +[value] Done for function test +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function test +[from] Computing for function p1 <-test +[from] Done for function p1 +[from] Computing for function p2 <-test +[from] Done for function p2 +[from] Done for function test +[pdg] done for function main +[pdg] computing for function test +[pdg] done for function test +[pdg] computing for function p1 +[pdg] done for function p1 +[pdg] computing for function p2 +[pdg] done for function p2 +[impact] impacted statements of stmt(s) 8 are: + tests/impact/call.i:16 (sid 2): if(X) <..> + tests/impact/call.i:16 (sid 3): p1(1); + tests/impact/call.i:16 (sid 4): p2(0); + tests/impact/call.i:24 (sid 9): test(); +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/depend1.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/depend1.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/depend1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/depend1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,38 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/depend1.i (no preprocessing) +[impact] beginning analysis +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function find <- main. + Called from tests/impact/depend1.i:10. +[value] Recording results for find +[value] Done for function find +[value] computing for function find <- main. + Called from tests/impact/depend1.i:12. +[value] Recording results for find +[value] Done for function find +[value] computing for function find <- main. + Called from tests/impact/depend1.i:13. +[value] Recording results for find +[value] Done for function find +[value] computing for function find <- main. + Called from tests/impact/depend1.i:14. +[value] Recording results for find +[value] Done for function find +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function find +[from] Done for function find +[pdg] done for function main +[pdg] computing for function find +[pdg] done for function find +[impact] impacted statements of stmt(s) 6 are: + tests/impact/depend1.i:6 (sid 2): return x; + tests/impact/depend1.i:12 (sid 7): b = find(2); + tests/impact/depend1.i:13 (sid 8): c = find(b); + tests/impact/depend1.i:15 (sid 11): return c; +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/depend2.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/depend2.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/depend2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/depend2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,45 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/depend2.i (no preprocessing) +[impact] beginning analysis +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function apply <- main. + Called from tests/impact/depend2.i:11. +[value] computing for function find <- apply <- main. + Called from tests/impact/depend2.i:7. +[value] Recording results for find +[value] Done for function find +[value] Recording results for apply +[value] Done for function apply +[value] computing for function apply <- main. + Called from tests/impact/depend2.i:13. +[value] computing for function find <- apply <- main. + Called from tests/impact/depend2.i:7. +[value] Recording results for find +[value] Done for function find +[value] Recording results for apply +[value] Done for function apply +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function apply +[from] Computing for function find <-apply +[from] Done for function find +[from] Done for function apply +[pdg] done for function main +[pdg] computing for function apply +[pdg] done for function apply +[pdg] computing for function find +[pdg] done for function find +[impact] impacted statements of stmt(s) 11 are: + tests/impact/depend2.i:5 (sid 2): return x; + tests/impact/depend2.i:7 (sid 5): tmp = find(x); + tests/impact/depend2.i:7 (sid 7): __retres = tmp + y; + tests/impact/depend2.i:13 (sid 12): b = apply(2,200); + tests/impact/depend2.i:14 (sid 14): __retres = a + b; + tests/impact/depend2.i:7 (sid 17): return __retres; + tests/impact/depend2.i:14 (sid 19): return __retres; +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/depend3.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/depend3.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/depend3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/depend3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,47 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/depend3.c (with preprocessing) +[impact] beginning analysis +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + ring[0..31] ∈ [--..--] +[value] computing for function apply <- main. + Called from tests/impact/depend3.c:22. +[value] computing for function find <- apply <- main. + Called from tests/impact/depend3.c:18. +tests/impact/depend3.c:10:[value] entering loop for the first time +[value] Recording results for find +[value] Done for function find +[value] Recording results for apply +[value] Done for function apply +[value] computing for function apply <- main. + Called from tests/impact/depend3.c:24. +[value] computing for function find <- apply <- main. + Called from tests/impact/depend3.c:18. +[value] Recording results for find +[value] Done for function find +[value] Recording results for apply +[value] Done for function apply +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function apply +[from] Computing for function find <-apply +[from] Done for function find +[from] Done for function apply +[pdg] done for function main +[pdg] computing for function apply +[pdg] done for function apply +[pdg] computing for function find +[pdg] done for function find +[impact] impacted statements of stmt(s) 34 are: + tests/impact/depend3.c:10 (sid 7): tmp = x; + tests/impact/depend3.c:10 (sid 8): ring[k] = tmp; + tests/impact/depend3.c:10 (sid 9): if(tmp) <..> + tests/impact/depend3.c:18 (sid 29): tmp = find(x); + tests/impact/depend3.c:18 (sid 30): return tmp; + tests/impact/depend3.c:24 (sid 35): b = apply(2,200); + tests/impact/depend3.c:25 (sid 37): __retres = a + b; + tests/impact/depend3.c:25 (sid 44): return __retres; +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/depend4.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/depend4.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/depend4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/depend4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,74 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/depend4.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + r1 ∈ {0} + r2 ∈ {0} +[value] computing for function g1 <- main. + Called from tests/impact/depend4.i:27. +[value] computing for function aux <- g1 <- main. + Called from tests/impact/depend4.i:19. +[value] Recording results for aux +[from] Computing for function aux +[from] Done for function aux +[value] Done for function aux +[value] Recording results for g1 +[from] Computing for function g1 +[from] Done for function g1 +[value] Done for function g1 +[value] computing for function f <- main. + Called from tests/impact/depend4.i:29. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function g2 <- main. + Called from tests/impact/depend4.i:30. +[value] computing for function aux <- g2 <- main. + Called from tests/impact/depend4.i:23. +[value] Recording results for aux +[from] Computing for function aux +[from] Done for function aux +[value] Done for function aux +[value] Recording results for g2 +[from] Computing for function g2 +[from] Done for function g2 +[value] Done for function g2 +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to aux at tests/impact/depend4.i:19 (by g1): + r2 FROM a; p; cond +[from] call to aux at tests/impact/depend4.i:23 (by g2): + r1 FROM a; p; cond +[from] call to g1 at tests/impact/depend4.i:27 (by main): + r2 FROM a +[from] call to f at tests/impact/depend4.i:29 (by main): + a FROM \nothing +[from] call to g2 at tests/impact/depend4.i:30 (by main): + r1 FROM a +[from] entry point: + a FROM \nothing + r1 FROM \nothing + r2 FROM a +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[impact] beginning analysis +[pdg] computing for function main +[pdg] done for function main +[pdg] computing for function f +[pdg] done for function f +[pdg] computing for function g2 +[pdg] done for function g2 +[pdg] computing for function aux +[pdg] done for function aux +[impact] impacted statements of stmt(s) 18 are: + tests/impact/depend4.i:13 (sid 6): r1 = *p; + tests/impact/depend4.i:15 (sid 7): r2 = *p; + tests/impact/depend4.i:23 (sid 13): aux(& a,1); + tests/impact/depend4.i:30 (sid 19): g2(); +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/depend5.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/depend5.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/depend5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/depend5.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,123 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/depend5.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} + c ∈ {0} + d ∈ {0} + e ∈ {0} +[value] computing for function f <- main. + Called from tests/impact/depend5.i:23. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/impact/depend5.i:25. +[value] computing for function f <- g <- main. + Called from tests/impact/depend5.i:18. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for g +[from] Computing for function g +[from] Done for function g +[value] Done for function g +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f at tests/impact/depend5.i:18 (by g): + b FROM a; e +[from] call to f at tests/impact/depend5.i:23 (by main): + c FROM a; d +[from] call to g at tests/impact/depend5.i:25 (by main): + b FROM a + d FROM \nothing + e FROM \nothing +[from] entry point: + a FROM \nothing + b FROM \nothing + c FROM d + d FROM \nothing + e FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[impact] beginning analysis +[pdg] computing for function g +[pdg] done for function g +[pdg] computing for function main +[pdg] done for function main +[pdg] computing for function f +[pdg] done for function f +[impact] impacted statements of stmt(s) 8 are: + tests/impact/depend5.i:9 (sid 3): c = d; + tests/impact/depend5.i:11 (sid 4): b = e; + tests/impact/depend5.i:17 (sid 9): e = d; + tests/impact/depend5.i:18 (sid 10): f(); + tests/impact/depend5.i:25 (sid 16): g(); +[impact] analysis done +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} + c ∈ {0} + d ∈ {0} + e ∈ {0} +[value] computing for function f <- main. + Called from tests/impact/depend5.i:23. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/impact/depend5.i:25. +[value] computing for function f <- g <- main. + Called from tests/impact/depend5.i:18. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for g +[from] Computing for function g +[from] Done for function g +[value] Done for function g +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f at tests/impact/depend5.i:18 (by g): + b FROM a; e +[from] call to f at tests/impact/depend5.i:23 (by main): + c FROM a; d +[from] call to g at tests/impact/depend5.i:25 (by main): + b FROM a + d FROM \nothing + e FROM \nothing +[from] entry point: + a FROM \nothing + b FROM \nothing + c FROM d + d FROM \nothing + e FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[impact] beginning analysis +[pdg] computing for function g +[pdg] done for function g +[pdg] computing for function main +[pdg] done for function main +[pdg] computing for function f +[pdg] done for function f +[impact] impacted statements of stmt(s) 8 are: + tests/impact/depend5.i:11 (sid 4): b = e; + tests/impact/depend5.i:17 (sid 9): e = d; + tests/impact/depend5.i:18 (sid 10): f(); + tests/impact/depend5.i:25 (sid 16): g(); +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/first.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/first.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/first.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/first.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/first.i (no preprocessing) +[impact] beginning analysis +[value] Analyzing an incomplete application starting at impact +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ [--..--] + b ∈ [--..--] + c ∈ [--..--] + e ∈ [--..--] + x ∈ [--..--] + y ∈ [--..--] + z ∈ [--..--] + f ∈ [--..--] + w ∈ [--..--] +tests/impact/first.i:12:[kernel] warning: signed overflow. assert -2147483648 ≤ b+c ≤ 2147483647; +tests/impact/first.i:13:[kernel] warning: signed overflow. assert -2147483648 ≤ x+e ≤ 2147483647; +tests/impact/first.i:17:[kernel] warning: signed overflow. assert -2147483648 ≤ y+f ≤ 2147483647; +[value] Recording results for impact +[value] done for function impact +[pdg] computing for function impact +[pdg] done for function impact +[impact] impacted statements of stmt(s) 2 are: + tests/impact/first.i:12 (sid 5): x = b + c; + tests/impact/first.i:13 (sid 6): y = x + e; + tests/impact/first.i:17 (sid 9): z = y + f; + tests/impact/first.i:18 (sid 10): w = b; +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/initial.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/initial.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/initial.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/initial.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,126 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/initial.i (no preprocessing) +[impact] beginning analysis +[value] Analyzing a complete application starting at main1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x1 ∈ {0} + x2 ∈ {0} + y2 ∈ {0} + z2 ∈ {0} + x3 ∈ {0} + c ∈ [--..--] +tests/impact/initial.i:24:[value] entering loop for the first time +[value] computing for function g1 <- main1. + Called from tests/impact/initial.i:25. +[value] computing for function f1 <- g1 <- main1. + Called from tests/impact/initial.i:19. +[value] Recording results for f1 +[value] Done for function f1 +[value] Recording results for g1 +[value] Done for function g1 +[value] computing for function g1 <- main1. + Called from tests/impact/initial.i:25. +[value] computing for function f1 <- g1 <- main1. + Called from tests/impact/initial.i:19. +[value] Recording results for f1 +[value] Done for function f1 +[value] Recording results for g1 +[value] Done for function g1 +[value] Recording results for main1 +[value] done for function main1 +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function g1 +[from] Done for function g1 +tests/impact/initial.i:24:[pdg] warning: no final state. Probably unreachable... +[impact] impacted statements of stmt(s) 7 are: +[impact] analysis done +[impact] beginning analysis +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x1 ∈ {0} + x2 ∈ {0} + y2 ∈ {0} + z2 ∈ {0} + x3 ∈ {0} + c ∈ [--..--] +tests/impact/initial.i:57:[value] entering loop for the first time +[value] computing for function h2 <- main2. + Called from tests/impact/initial.i:58. +[value] computing for function g2 <- h2 <- main2. + Called from tests/impact/initial.i:52. +[value] computing for function f2 <- g2 <- h2 <- main2. + Called from tests/impact/initial.i:46. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function aux2 <- g2 <- h2 <- main2. + Called from tests/impact/initial.i:47. +[value] Recording results for aux2 +[value] Done for function aux2 +[value] Recording results for g2 +[value] Done for function g2 +[value] Recording results for h2 +[value] Done for function h2 +[value] Recording results for main2 +[value] done for function main2 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function aux2 +[from] Done for function aux2 +[from] Computing for function g2 +[from] Done for function g2 +[from] Computing for function h2 +[from] Done for function h2 +tests/impact/initial.i:57:[pdg] warning: no final state. Probably unreachable... +[impact] impacted statements of stmt(s) 24 are: + tests/impact/initial.i:35 (sid 15): x2 = y2; + tests/impact/initial.i:40 (sid 18): y2 = z2; + tests/impact/initial.i:46 (sid 24): f2(); + tests/impact/initial.i:47 (sid 27): aux2(); + tests/impact/initial.i:52 (sid 32): g2(); + tests/impact/initial.i:53 (sid 33): z2 = x2; + tests/impact/initial.i:58 (sid 38): h2(); +[impact] analysis done +[impact] beginning analysis +[value] Analyzing a complete application starting at main3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x1 ∈ {0} + x2 ∈ {0} + y2 ∈ {0} + z2 ∈ {0} + x3 ∈ {0} + c ∈ [--..--] +tests/impact/initial.i:80:[value] entering loop for the first time +[value] computing for function g3 <- main3. + Called from tests/impact/initial.i:81. +[value] computing for function f3 <- g3 <- main3. + Called from tests/impact/initial.i:69. +[value] Recording results for f3 +[value] Done for function f3 +[value] Recording results for g3 +[value] Done for function g3 +[value] computing for function g3 <- main3. + Called from tests/impact/initial.i:81. +[value] computing for function f3 <- g3 <- main3. + Called from tests/impact/initial.i:69. +[value] Recording results for f3 +[value] Done for function f3 +[value] Recording results for g3 +[value] Done for function g3 +[value] Recording results for main3 +[value] done for function main3 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function g3 +[from] Done for function g3 +tests/impact/initial.i:80:[pdg] warning: no final state. Probably unreachable... +[impact] impacted statements of stmt(s) 44 are: + tests/impact/initial.i:71 (sid 47): x3 = x3; + tests/impact/initial.i:81 (sid 53): g3(); +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/loop2.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/loop2.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/loop2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/loop2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,243 @@ +[kernel:offsetmap:caches] Clearing interval caches +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/loop2.i (no preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] + t[0..9] ∈ [--..--] + u[0..9] ∈ [--..--] + w[0..9] ∈ [--..--] +[value] computing for function init <- main. + Called from tests/impact/loop2.i:24. +tests/impact/loop2.i:11:[value] entering loop for the first time +[value] Recording results for init +[from] Computing for function init +[from] Done for function init +[value] Done for function init +tests/impact/loop2.i:25:[value] entering loop for the first time +[value] computing for function f <- main. + Called from tests/impact/loop2.i:27. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/impact/loop2.i:27. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/impact/loop2.i:27. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/impact/loop2.i:27. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/impact/loop2.i:27. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/impact/loop2.i:27. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to init at tests/impact/loop2.i:24 (by main): + u[0..9] FROM v (and SELF) +[from] call to f at tests/impact/loop2.i:27 (by main): + t[0..9] FROM u[0..9]; i (and SELF) + w[0..9] FROM i (and SELF) +[from] entry point: + t[0..9] FROM v; t[0..9]; u[0..9] (and SELF) + u[0..9] FROM v (and SELF) + w[0..9] FROM v; t[0..9]; u[0..9] (and SELF) +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[impact] beginning analysis +[pdg] computing for function main +[pdg] done for function main +[pdg] computing for function init +[pdg] done for function init +[pdg] computing for function f +[pdg] done for function f +[impact] impacted statements of stmt(s) 18 are: + tests/impact/loop2.i:17 (sid 12): v_0 = t[i]; + tests/impact/loop2.i:18 (sid 13): w[i] = i; + tests/impact/loop2.i:19 (sid 14): t[i] = u[i]; + tests/impact/loop2.i:26 (sid 27): if(t[i]) <..> + tests/impact/loop2.i:27 (sid 28): f(i); +[impact] analysis done +[kernel:offsetmap:caches] Clearing interval caches +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/loop2.i (no preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] + t[0..9] ∈ [--..--] + u[0..9] ∈ [--..--] + w[0..9] ∈ [--..--] +[value] computing for function init <- main. + Called from tests/impact/loop2.i:24. +tests/impact/loop2.i:11:[value] entering loop for the first time +[value] Recording results for init +[from] Computing for function init +[from] Done for function init +[value] Done for function init +[value] computing for function f <- main. + Called from tests/impact/loop2.i:27. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/impact/loop2.i:27. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/impact/loop2.i:27. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/impact/loop2.i:27. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/impact/loop2.i:27. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/impact/loop2.i:27. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/impact/loop2.i:27. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/impact/loop2.i:27. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/impact/loop2.i:27. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/impact/loop2.i:27. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +tests/impact/loop2.i:25:[value] entering loop for the first time +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to init at tests/impact/loop2.i:24 (by main): + u[0..9] FROM v +[from] call to f at tests/impact/loop2.i:27 (by main): + t[9] FROM u[9]; i + w[9] FROM i +[from] call to f at tests/impact/loop2.i:27 (by main): + t[8] FROM u[8]; i + w[8] FROM i +[from] call to f at tests/impact/loop2.i:27 (by main): + t[7] FROM u[7]; i + w[7] FROM i +[from] call to f at tests/impact/loop2.i:27 (by main): + t[6] FROM u[6]; i + w[6] FROM i +[from] call to f at tests/impact/loop2.i:27 (by main): + t[5] FROM u[5]; i + w[5] FROM i +[from] call to f at tests/impact/loop2.i:27 (by main): + t[4] FROM u[4]; i + w[4] FROM i +[from] call to f at tests/impact/loop2.i:27 (by main): + t[3] FROM u[3]; i + w[3] FROM i +[from] call to f at tests/impact/loop2.i:27 (by main): + t[2] FROM u[2]; i + w[2] FROM i +[from] call to f at tests/impact/loop2.i:27 (by main): + t[1] FROM u[1]; i + w[1] FROM i +[from] call to f at tests/impact/loop2.i:27 (by main): + t[0] FROM u[0]; i + w[0] FROM i +[from] entry point: + t[0] FROM v; t[0] (and SELF) + [1] FROM v; t[1] (and SELF) + [2] FROM v; t[2] (and SELF) + [3] FROM v; t[3] (and SELF) + [4] FROM v; t[4] (and SELF) + [5] FROM v; t[5] (and SELF) + [6] FROM v; t[6] (and SELF) + [7] FROM v; t[7] (and SELF) + [8] FROM v; t[8] (and SELF) + [9] FROM v; t[9] (and SELF) + u[0..9] FROM v + w[0] FROM t[0] (and SELF) + [1] FROM t[1] (and SELF) + [2] FROM t[2] (and SELF) + [3] FROM t[3] (and SELF) + [4] FROM t[4] (and SELF) + [5] FROM t[5] (and SELF) + [6] FROM t[6] (and SELF) + [7] FROM t[7] (and SELF) + [8] FROM t[8] (and SELF) + [9] FROM t[9] (and SELF) +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[impact] beginning analysis +[pdg] computing for function main +[pdg] done for function main +[pdg] computing for function init +[pdg] done for function init +[pdg] computing for function f +[pdg] done for function f +[impact] impacted statements of stmt(s) 59 are: + tests/impact/loop2.i:19 (sid 55): t[i] = u[i]; + tests/impact/loop2.i:27 (sid 151): f(i); + tests/impact/loop2.i:27 (sid 158): f(i); + tests/impact/loop2.i:27 (sid 165): f(i); + tests/impact/loop2.i:27 (sid 172): f(i); + tests/impact/loop2.i:27 (sid 179): f(i); + tests/impact/loop2.i:27 (sid 186): f(i); + tests/impact/loop2.i:27 (sid 193): f(i); + tests/impact/loop2.i:27 (sid 200): f(i); + tests/impact/loop2.i:27 (sid 207): f(i); + tests/impact/loop2.i:27 (sid 214): f(i); +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/loop.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/loop.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/loop.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/loop.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/loop.i (no preprocessing) +[impact] beginning analysis +[value] Analyzing an incomplete application starting at loop +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + c ∈ [--..--] + x ∈ [--..--] + y ∈ [--..--] + z ∈ [--..--] + w ∈ [--..--] +tests/impact/loop.i:9:[value] entering loop for the first time +tests/impact/loop.i:10:[kernel] warning: signed overflow. assert w+1 ≤ 2147483647; +tests/impact/loop.i:11:[kernel] warning: signed overflow. assert y+1 ≤ 2147483647; +tests/impact/loop.i:13:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +tests/impact/loop.i:14:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for loop +[value] done for function loop +[pdg] computing for function loop +[pdg] done for function loop +[impact] impacted statements of stmt(s) 9 are: + tests/impact/loop.i:11 (sid 7): z = y + 1; + tests/impact/loop.i:13 (sid 9): x ++; + tests/impact/loop.i:14 (sid 10): y = x + 1; + tests/impact/loop.i:16 (sid 11): w = z; +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/slicing.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/slicing.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/slicing.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/slicing.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,65 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/slicing.i (no preprocessing) +[impact] beginning analysis +[value] Analyzing an incomplete application starting at impact +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ [--..--] + b ∈ [--..--] + c ∈ [--..--] + e ∈ [--..--] + x ∈ [--..--] + y ∈ [--..--] + z ∈ [--..--] + f ∈ [--..--] + w ∈ [--..--] +tests/impact/slicing.i:13:[kernel] warning: signed overflow. assert -2147483648 ≤ b+c ≤ 2147483647; +tests/impact/slicing.i:14:[kernel] warning: signed overflow. assert -2147483648 ≤ x+e ≤ 2147483647; +tests/impact/slicing.i:18:[kernel] warning: signed overflow. assert -2147483648 ≤ y+f ≤ 2147483647; +[value] Recording results for impact +[value] done for function impact +[pdg] computing for function impact +[pdg] done for function impact +[impact] impacted statements of stmt(s) 6 are: + tests/impact/slicing.i:13 (sid 9): x = b + c; + tests/impact/slicing.i:14 (sid 10): y = x + e; + tests/impact/slicing.i:18 (sid 13): z = y + f; + tests/impact/slicing.i:19 (sid 14): w = b; +[slicing] making slicing project 'impact slicing'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'impact slicing'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'impact slicing tmp' +[sparecode] removed unused global declarations in new project 'impact slicing' +[impact] analysis done +/* Generated by Frama-C */ +int a; +int b; +int c; +int e; +int x; +int y; +int z; +int f; +int w; +void impact(void) +{ + if (c) a = 18; + /*@ impact pragma stmt; */ + b = a; + if (c) { + x = b + c; + y = x + e; + } + z = y + f; + w = b; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/topbot.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/topbot.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/topbot.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/topbot.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,62 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/topbot.c (with preprocessing) +[impact] beginning analysis +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/impact/topbot.c:15. +tests/impact/topbot.c:5:[value] Function f: precondition got status invalid. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function f +[from] Non-terminating function f (no dependencies) +[from] Done for function f +[pdg] done for function main +[impact] impacted statements of stmt(s) 4 are: + tests/impact/topbot.c:14 (sid 7): y = x; + tests/impact/topbot.c:18 (sid 11): z = x; +[impact] analysis done +[pdg] computing for function f +[pdg] warning: unreachable entry point (sid:14, function f) +[pdg] Bottom for function f +[pdg] ====== PDG GRAPH COMPUTED ====== +[pdg] PDG for f + Bottom PDG +[pdg] PDG for main + {n1}: InCtrl + {n2}: VarDecl : c + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : x + {n5}: VarDecl : y + {n6}: VarDecl : z + {n7}: x = 1; + -[-c-]-> 1 + -[a--]-> 4 + {n8}: c + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + {n9}: y = x; + -[-c-]-> 1 + -[--d]-> 4 + -[a--]-> 5 + -[--d]-> 7 + -[-c-]-> 8 + {n10}: Call8-InCtrl : f(); + -[-c-]-> 1 + -[-c-]-> 8 + {n11}: z = x; + -[-c-]-> 1 + -[--d]-> 4 + -[a--]-> 6 + -[--d]-> 7 + {n12}: return; + -[-c-]-> 1 diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/undef_function.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/undef_function.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/undef_function.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/undef_function.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/undef_function.i (no preprocessing) +[impact] beginning analysis +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + y ∈ {0} +[value] computing for function g <- main. + Called from tests/impact/undef_function.i:10. +tests/impact/undef_function.i:10:[kernel] warning: Neither code nor specification for function g, generating default assigns from the prototype +[value] using specification for function g +[value] Done for function g +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function g +[from] Done for function g +[pdg] done for function main +[pdg] computing for function g +[pdg] done for function g +[impact] impacted statements of stmt(s) 2 are: + tests/impact/undef_function.i:10 (sid 3): g(y); + tests/impact/undef_function.i:11 (sid 5): return y; +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/oracle/variadic.res.oracle frama-c-20150201+sodium+dfsg/tests/impact/oracle/variadic.res.oracle --- frama-c-20140301+neon+dfsg/tests/impact/oracle/variadic.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/oracle/variadic.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,168 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/impact/variadic.i (no preprocessing) +[impact] beginning analysis +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + y ∈ {0} + z ∈ {0} +[value] computing for function f <- main. + Called from tests/impact/variadic.i:12. +tests/impact/variadic.i:12:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] using specification for function f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[pdg] done for function main +[pdg] computing for function f +[pdg] warning: not implemented by pdg yet: variadic function +[pdg] Top for function f +[impact] warning: no precise pdg for function f. + Ignoring this function in the analysis (potentially incorrect results). +[impact] impacted statements of stmt(s) 3 are: + tests/impact/variadic.i:12 (sid 4): f(i); +[impact] analysis done +[impact] beginning analysis +[value] Analyzing a complete application starting at main1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + y ∈ {0} + z ∈ {0} +[value] computing for function g1 <- main1. + Called from tests/impact/variadic.i:29. +[value] Recording results for g1 +[value] Done for function g1 +[value] computing for function g1 <- main1. + Called from tests/impact/variadic.i:30. +[value] Recording results for g1 +[value] Done for function g1 +[value] Recording results for main1 +[value] done for function main1 +[pdg] computing for function main1 +[from] Computing for function g1 +[from] Done for function g1 +[pdg] done for function main1 +[pdg] computing for function g1 +[pdg] warning: not implemented by pdg yet: variadic function +[pdg] Top for function g1 +tests/impact/variadic.i:29:[impact] warning: skipping impact within imprecisely analyzed function g1 +tests/impact/variadic.i:30:[impact] warning: skipping impact within imprecisely analyzed function g1 +[impact] impacted statements of stmt(s) 12 are: + tests/impact/variadic.i:30 (sid 13): g1(1,2); + tests/impact/variadic.i:31 (sid 15): return y; +[impact] analysis done +[impact] beginning analysis +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + y ∈ {0} + z ∈ {0} +[value] computing for function g2 <- main2. + Called from tests/impact/variadic.i:37. +[value] using specification for function g2 +[value] Done for function g2 +[value] computing for function g2 <- main2. + Called from tests/impact/variadic.i:38. +[value] Done for function g2 +[value] Recording results for main2 +[value] done for function main2 +[pdg] computing for function main2 +[from] Computing for function g2 +[from] Done for function g2 +[pdg] done for function main2 +[pdg] computing for function g2 +[pdg] warning: not implemented by pdg yet: variadic function +[pdg] Top for function g2 +tests/impact/variadic.i:37:[impact] warning: skipping impact within imprecisely analyzed function g2 +[impact] impacted statements of stmt(s) 19 are: +[impact] analysis done +[impact] beginning analysis +[value] Analyzing a complete application starting at main3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + y ∈ {0} + z ∈ {0} +[value] computing for function aux3 <- main3. + Called from tests/impact/variadic.i:57. +[value] computing for function g1 <- aux3 <- main3. + Called from tests/impact/variadic.i:51. +[value] Recording results for g1 +[value] Done for function g1 +[value] computing for function g1 <- aux3 <- main3. + Called from tests/impact/variadic.i:52. +[value] Recording results for g1 +[value] Done for function g1 +[value] Recording results for aux3 +[value] Done for function aux3 +[value] computing for function aux3 <- main3. + Called from tests/impact/variadic.i:58. +[value] computing for function g1 <- aux3 <- main3. + Called from tests/impact/variadic.i:51. +[value] Recording results for g1 +[value] Done for function g1 +[value] computing for function g1 <- aux3 <- main3. + Called from tests/impact/variadic.i:52. +[value] Recording results for g1 +[value] Done for function g1 +[value] Recording results for aux3 +[value] Done for function aux3 +[value] Recording results for main3 +[value] done for function main3 +[pdg] computing for function aux3 +[pdg] warning: not implemented by pdg yet: variadic function +[pdg] Top for function aux3 +[impact] warning: analysis of aux3 is too imprecise, impact cannot be computed +[pdg] computing for function main3 +[from] Computing for function aux3 +[from] Computing for function g1 <-aux3 +[from] Done for function g1 +[from] Done for function aux3 +[pdg] done for function main3 +[impact] impacted statements of stmt(s) 26 are: +[impact] analysis done +[impact] beginning analysis +[value] Analyzing a complete application starting at main4 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + y ∈ {0} + z ∈ {0} +[value] computing for function aux4bis <- main4. + Called from tests/impact/variadic.i:73. +[value] computing for function aux4 <- aux4bis <- main4. + Called from tests/impact/variadic.i:68. +[value] Recording results for aux4 +[value] Done for function aux4 +[value] Recording results for aux4bis +[value] Done for function aux4bis +[value] computing for function aux4bis <- main4. + Called from tests/impact/variadic.i:74. +[value] computing for function aux4 <- aux4bis <- main4. + Called from tests/impact/variadic.i:68. +[value] Recording results for aux4 +[value] Done for function aux4 +[value] Recording results for aux4bis +[value] Done for function aux4bis +[value] Recording results for main4 +[value] done for function main4 +[pdg] computing for function aux4 +[pdg] done for function aux4 +[pdg] computing for function aux4bis +[pdg] warning: not implemented by pdg yet: variadic function +[pdg] Top for function aux4bis +[pdg] computing for function main4 +[from] Computing for function aux4bis +[from] Computing for function aux4 <-aux4bis +[from] Done for function aux4 +[from] Done for function aux4bis +[pdg] done for function main4 +tests/impact/variadic.i:68:[impact] warning: cannot propagate impact into imprecisely analyzed caller function aux4bis +[impact] impacted statements of stmt(s) 37 are: +[impact] analysis done diff -Nru frama-c-20140301+neon+dfsg/tests/impact/test_config frama-c-20150201+sodium+dfsg/tests/impact/test_config --- frama-c-20140301+neon+dfsg/tests/impact/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/test_config 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,2 @@ +CMD: FRAMAC_PLUGIN=tests/.empty @frama-c@ -load-module lib/plugins/Impact +STDOPT: -"-val" -"-out" -"-input" -"-deps" +"-impact-print" diff -Nru frama-c-20140301+neon+dfsg/tests/impact/variadic.i frama-c-20150201+sodium+dfsg/tests/impact/variadic.i --- frama-c-20140301+neon+dfsg/tests/impact/variadic.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/impact/variadic.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,5 +1,6 @@ /* run.config - STDOPT: +"-impact-pragma main" +"-then -main main1 -impact-pragma main1" +"-then -main main2 -impact-pragma main2" +"-then -main main3 -impact-pragma aux3" +"-then -main main4 -impact-pragma aux4" + COMMENT: also tests the parsing of cmdline options of type string_set + STDOPT: +"-impact-pragma main" +"-then -main main1 -impact-pragma='-main,+main1'" +"-then -main main2 -impact-pragma='-@all,+main2'" +"-then -main main3 -impact-pragma='+aux3,-main2'" +"-then -main main4 -impact-pragma='-aux3,+aux4'" */ int f(int, ...); diff -Nru frama-c-20140301+neon+dfsg/tests/journal/oracle/control.1.res.oracle frama-c-20150201+sodium+dfsg/tests/journal/oracle/control.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/journal/oracle/control.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/journal/oracle/control.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/journal/control.i (no preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + c ∈ {0} + d ∈ {0} +tests/journal/control.i:18:[value] entering loop for the first time +tests/journal/control.i:21:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for f +[value] done for function f +[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. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + x ∈ [0..2147483647] + i ∈ {4} +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + x FROM x (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + c ∈ {0} + d ∈ {0} +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] done for function f +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] entry point: + x FROM x (and SELF) +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[inout] Out (internal) for function f: + x; i diff -Nru frama-c-20140301+neon+dfsg/tests/journal/oracle/control.2.res.oracle frama-c-20150201+sodium+dfsg/tests/journal/oracle/control.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/journal/oracle/control.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/journal/oracle/control.2.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,7 @@ +1 +2 +3 +[kernel] warning: ignoring source files specified on the command line while loading a global initial context. +1 +2 +3 diff -Nru frama-c-20140301+neon+dfsg/tests/journal/oracle/control2.res.oracle frama-c-20150201+sodium+dfsg/tests/journal/oracle/control2.res.oracle --- frama-c-20140301+neon+dfsg/tests/journal/oracle/control2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/journal/oracle/control2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,45 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/journal/control2.c (with preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + c ∈ {0} + d ∈ {0} +tests/journal/control2.c:12:[value] entering loop for the first time +tests/journal/control2.c:15:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for f +[value] done for function f +[from] Computing for function f +[from] Done for function f +[value] Analyzing an incomplete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ [--..--] + y ∈ [--..--] + c ∈ [--..--] + d ∈ [--..--] +tests/journal/control2.c:13:[kernel] warning: signed overflow. assert y+1 ≤ 2147483647; +tests/journal/control2.c:13:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +tests/journal/control2.c:15:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for f +[value] done for function f +[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. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + x ∈ [--..--] + y ∈ [--..--] + i ∈ {4} +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + x FROM x; c; d (and SELF) + y FROM y; c; d (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + x; y; i diff -Nru frama-c-20140301+neon+dfsg/tests/journal/oracle/control2_sav.res frama-c-20150201+sodium+dfsg/tests/journal/oracle/control2_sav.res --- frama-c-20140301+neon+dfsg/tests/journal/oracle/control2_sav.res 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/journal/oracle/control2_sav.res 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,46 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/journal/control2.c (with preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + c ∈ {0} + d ∈ {0} +tests/journal/control2.c:12:[value] entering loop for the first time +tests/journal/control2.c:15:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for f +[value] done for function f +[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. +[value] Analyzing an incomplete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ [--..--] + y ∈ [--..--] + c ∈ [--..--] + d ∈ [--..--] +tests/journal/control2.c:13:[kernel] warning: signed overflow. assert y+1 ≤ 2147483647; +tests/journal/control2.c:13:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +tests/journal/control2.c:15:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + x ∈ [--..--] + y ∈ [--..--] + i ∈ {4} +[from] Computing for function f +[from] Done for function f +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + x FROM x; c; d (and SELF) + y FROM y; c; d (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + x; y; i +[kernel] writing journal in file `tests/journal/result/control_journal_next2.ml'. diff -Nru frama-c-20140301+neon+dfsg/tests/journal/oracle/control.res.oracle frama-c-20150201+sodium+dfsg/tests/journal/oracle/control.res.oracle --- frama-c-20140301+neon+dfsg/tests/journal/oracle/control.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/journal/oracle/control.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/journal/control.i (no preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + c ∈ {0} + d ∈ {0} +tests/journal/control.i:18:[value] entering loop for the first time +tests/journal/control.i:21:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for f +[value] done for function f +[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. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + x ∈ [0..2147483647] + i ∈ {4} +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + x FROM x (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + x; i diff -Nru frama-c-20140301+neon+dfsg/tests/journal/oracle/intra.res.oracle frama-c-20150201+sodium+dfsg/tests/journal/oracle/intra.res.oracle --- frama-c-20140301+neon+dfsg/tests/journal/oracle/intra.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/journal/oracle/intra.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,110 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/journal/intra.i (no preprocessing) +[sparecode] remove unused code... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + X10 ∈ {0} + Y10 ∈ {0} +[value] computing for function param <- main. + Called from tests/journal/intra.i:81. +[value] Recording results for param +[value] Done for function param +[value] computing for function tmp <- main. + Called from tests/journal/intra.i:82. +tests/journal/intra.i:20:[value] Assertion got status valid. +tests/journal/intra.i:22:[value] Assertion got status valid. +[value] Recording results for tmp +[value] Done for function tmp +[value] computing for function spare_called_fct <- main. + Called from tests/journal/intra.i:83. +[value] Recording results for spare_called_fct +[value] Done for function spare_called_fct +[value] computing for function call_two_outputs <- main. + Called from tests/journal/intra.i:84. +[value] computing for function two_outputs <- call_two_outputs <- main. + Called from tests/journal/intra.i:48. +[value] Recording results for two_outputs +[value] Done for function two_outputs +[value] computing for function two_outputs <- call_two_outputs <- main. + Called from tests/journal/intra.i:52. +[value] Recording results for two_outputs +[value] Done for function two_outputs +[value] Recording results for call_two_outputs +[value] Done for function call_two_outputs +[value] computing for function loop <- main. + Called from tests/journal/intra.i:85. +tests/journal/intra.i:63:[value] Assertion got status valid. +tests/journal/intra.i:64:[value] Loop invariant got status valid. +tests/journal/intra.i:66:[value] entering loop for the first time +[value] Recording results for loop +[value] Done for function loop +[value] computing for function assign <- main. + Called from tests/journal/intra.i:86. +[value] Recording results for assign +[value] Done for function assign +[value] computing for function assign <- main. + Called from tests/journal/intra.i:87. +[value] Recording results for assign +[value] Done for function assign +[value] computing for function stop <- main. + Called from tests/journal/intra.i:90. +tests/journal/intra.i:90:[kernel] warning: Neither code nor specification for function stop, generating default assigns from the prototype +[value] using specification for function stop +[value] Done for function stop +tests/journal/intra.i:92:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function param +[from] Done for function param +[from] Computing for function tmp +[from] Done for function tmp +[from] Computing for function spare_called_fct +[from] Done for function spare_called_fct +[from] Computing for function call_two_outputs +[from] Computing for function two_outputs <-call_two_outputs +[from] Done for function two_outputs +[from] Done for function call_two_outputs +[from] Computing for function loop +[from] Done for function loop +[from] Computing for function assign +[from] Done for function assign +[from] Computing for function stop +[from] Done for function stop +[pdg] done for function main +[pdg] computing for function call_two_outputs +[pdg] done for function call_two_outputs +[pdg] computing for function assign +[pdg] done for function assign +[pdg] computing for function loop +[pdg] done for function loop +[pdg] computing for function tmp +[pdg] done for function tmp +[pdg] computing for function param +[pdg] done for function param +[pdg] computing for function two_outputs +[pdg] done for function two_outputs +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[pdg] computing for function f10 +[pdg] warning: unreachable entry point (sid:83, function f10) +[pdg] Bottom for function f10 +[pdg] computing for function main2 +[pdg] warning: unreachable entry point (sid:92, function main2) +[pdg] Bottom for function main2 +[pdg] computing for function spare_called_fct +[pdg] done for function spare_called_fct +[pdg] computing for function stop +[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 -Nru frama-c-20140301+neon+dfsg/tests/libc/compile_and_run.sh frama-c-20150201+sodium+dfsg/tests/libc/compile_and_run.sh --- frama-c-20140301+neon+dfsg/tests/libc/compile_and_run.sh 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/libc/compile_and_run.sh 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,8 @@ +#!/bin/sh + +if command -v valgrind +then VALGRIND=`command -v valgrind`" -q" +else VALGRIND="" +fi + +gcc -Wall $1 -o $1.exe && $VALGRIND ./$1.exe && rm ./$1.exe diff -Nru frama-c-20140301+neon+dfsg/tests/libc/oracle/socket.1.res.oracle frama-c-20150201+sodium+dfsg/tests/libc/oracle/socket.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/libc/oracle/socket.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/libc/oracle/socket.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,433 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/libc/socket.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + __fc_socket_counter ∈ [--..--] + __FC_errno ∈ [--..--] + __fc_stderr ∈ {{ NULL ; &S___fc_stderr[0] }} + __fc_stdin ∈ {{ NULL ; &S___fc_stdin[0] }} + __fc_stdout ∈ {{ NULL ; &S___fc_stdout[0] }} + __fc_fopen[0..511] ∈ {0} + _p__fc_fopen ∈ {{ &__fc_fopen[0] }} + __fc_random_counter ∈ {0} + __fc_rand_max ∈ {32767} + __fc_heap_status ∈ [--..--] + __fc_time_model ∈ {0} + __fc_time_tm ∈ {0} + __fc_time_tm_ptr ∈ {{ &__fc_time_tm }} + optarg ∈ {{ NULL ; &S_optarg[0] }} + optind ∈ [--..--] + opterr ∈ [--..--] + optopt ∈ [--..--] + sent_msg ∈ {{ "World" }} + rcv_buffer[0..9] ∈ {0} + socket_fd[0..1] ∈ {0} + S___fc_stderr[0].__fc_stdio_id ∈ [--..--] + [0].[bits 32 to 63] ∈ UNINITIALIZED + [0]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [0].[bits 144 to 159] ∈ UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL ; &S___fc_inode_0_S___fc_stderr[0] }} + [0].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_0_S___fc_stderr[0] }} + [0].__fc_real_data_max_size ∈ [--..--] + [0].[bits 352 to 383] ∈ UNINITIALIZED + [1].__fc_stdio_id ∈ [--..--] + [1].[bits 32 to 63] ∈ UNINITIALIZED + [1]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [1].[bits 144 to 159] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stderr[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stderr[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + [1].[bits 352 to 383] ∈ UNINITIALIZED + S___fc_inode_0_S___fc_stderr[0]{.st_dev; .st_ino; .st_mode; .st_nlink; .st_uid; .st_gid; .st_rdev} ∈ + [--..--] + [0].[bits 224 to 255] ∈ UNINITIALIZED + {[0]{.st_size; .st_atime; .st_mtime; .st_ctime; .st_blksize; .st_blocks}; [1]{.st_dev; .st_ino; .st_mode; .st_nlink; .st_uid; .st_gid; .st_rdev}} ∈ + [--..--] + [1].[bits 224 to 255] ∈ UNINITIALIZED + [1]{.st_size; .st_atime; .st_mtime; .st_ctime; .st_blksize; .st_blocks} ∈ + [--..--] + S___fc_real_data_0_S___fc_stderr[0..1] ∈ [--..--] + S___fc_inode_1_S___fc_stderr[0]{.st_dev; .st_ino; .st_mode; .st_nlink; .st_uid; .st_gid; .st_rdev} ∈ + [--..--] + [0].[bits 224 to 255] ∈ UNINITIALIZED + {[0]{.st_size; .st_atime; .st_mtime; .st_ctime; .st_blksize; .st_blocks}; [1]{.st_dev; .st_ino; .st_mode; .st_nlink; .st_uid; .st_gid; .st_rdev}} ∈ + [--..--] + [1].[bits 224 to 255] ∈ UNINITIALIZED + [1]{.st_size; .st_atime; .st_mtime; .st_ctime; .st_blksize; .st_blocks} ∈ + [--..--] + S___fc_real_data_1_S___fc_stderr[0..1] ∈ [--..--] + S___fc_stdin[0].__fc_stdio_id ∈ [--..--] + [0].[bits 32 to 63] ∈ UNINITIALIZED + [0]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [0].[bits 144 to 159] ∈ UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ {{ NULL ; &S___fc_inode_0_S___fc_stdin[0] }} + [0].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_0_S___fc_stdin[0] }} + [0].__fc_real_data_max_size ∈ [--..--] + [0].[bits 352 to 383] ∈ UNINITIALIZED + [1].__fc_stdio_id ∈ [--..--] + [1].[bits 32 to 63] ∈ UNINITIALIZED + [1]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [1].[bits 144 to 159] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ {{ NULL ; &S___fc_inode_1_S___fc_stdin[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdin[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + [1].[bits 352 to 383] ∈ UNINITIALIZED + S___fc_inode_0_S___fc_stdin[0]{.st_dev; .st_ino; .st_mode; .st_nlink; .st_uid; .st_gid; .st_rdev} ∈ + [--..--] + [0].[bits 224 to 255] ∈ UNINITIALIZED + {[0]{.st_size; .st_atime; .st_mtime; .st_ctime; .st_blksize; .st_blocks}; [1]{.st_dev; .st_ino; .st_mode; .st_nlink; .st_uid; .st_gid; .st_rdev}} ∈ + [--..--] + [1].[bits 224 to 255] ∈ UNINITIALIZED + [1]{.st_size; .st_atime; .st_mtime; .st_ctime; .st_blksize; .st_blocks} ∈ + [--..--] + S___fc_real_data_0_S___fc_stdin[0..1] ∈ [--..--] + S___fc_inode_1_S___fc_stdin[0]{.st_dev; .st_ino; .st_mode; .st_nlink; .st_uid; .st_gid; .st_rdev} ∈ + [--..--] + [0].[bits 224 to 255] ∈ UNINITIALIZED + {[0]{.st_size; .st_atime; .st_mtime; .st_ctime; .st_blksize; .st_blocks}; [1]{.st_dev; .st_ino; .st_mode; .st_nlink; .st_uid; .st_gid; .st_rdev}} ∈ + [--..--] + [1].[bits 224 to 255] ∈ UNINITIALIZED + [1]{.st_size; .st_atime; .st_mtime; .st_ctime; .st_blksize; .st_blocks} ∈ + [--..--] + S___fc_real_data_1_S___fc_stdin[0..1] ∈ [--..--] + S___fc_stdout[0].__fc_stdio_id ∈ [--..--] + [0].[bits 32 to 63] ∈ UNINITIALIZED + [0]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [0].[bits 144 to 159] ∈ UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL ; &S___fc_inode_0_S___fc_stdout[0] }} + [0].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_0_S___fc_stdout[0] }} + [0].__fc_real_data_max_size ∈ [--..--] + [0].[bits 352 to 383] ∈ UNINITIALIZED + [1].__fc_stdio_id ∈ [--..--] + [1].[bits 32 to 63] ∈ UNINITIALIZED + [1]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [1].[bits 144 to 159] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stdout[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdout[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + [1].[bits 352 to 383] ∈ UNINITIALIZED + S___fc_inode_0_S___fc_stdout[0]{.st_dev; .st_ino; .st_mode; .st_nlink; .st_uid; .st_gid; .st_rdev} ∈ + [--..--] + [0].[bits 224 to 255] ∈ UNINITIALIZED + {[0]{.st_size; .st_atime; .st_mtime; .st_ctime; .st_blksize; .st_blocks}; [1]{.st_dev; .st_ino; .st_mode; .st_nlink; .st_uid; .st_gid; .st_rdev}} ∈ + [--..--] + [1].[bits 224 to 255] ∈ UNINITIALIZED + [1]{.st_size; .st_atime; .st_mtime; .st_ctime; .st_blksize; .st_blocks} ∈ + [--..--] + S___fc_real_data_0_S___fc_stdout[0..1] ∈ [--..--] + S___fc_inode_1_S___fc_stdout[0]{.st_dev; .st_ino; .st_mode; .st_nlink; .st_uid; .st_gid; .st_rdev} ∈ + [--..--] + [0].[bits 224 to 255] ∈ UNINITIALIZED + {[0]{.st_size; .st_atime; .st_mtime; .st_ctime; .st_blksize; .st_blocks}; [1]{.st_dev; .st_ino; .st_mode; .st_nlink; .st_uid; .st_gid; .st_rdev}} ∈ + [--..--] + [1].[bits 224 to 255] ∈ UNINITIALIZED + [1]{.st_size; .st_atime; .st_mtime; .st_ctime; .st_blksize; .st_blocks} ∈ + [--..--] + S___fc_real_data_1_S___fc_stdout[0..1] ∈ [--..--] + S_optarg[0..1] ∈ [--..--] +[value] computing for function init_sockets <- main. + Called from tests/libc/socket.c:100. +[value] computing for function socketpair <- init_sockets <- main. + Called from tests/libc/socket.c:49. +[value] using specification for function socketpair +share/libc/sys/socket.h:183:[value] Function socketpair: precondition got status valid. +share/libc/sys/socket.h:187:[value] warning: no 'assigns \result \from ...' clause specified for function socketpair +[value] Done for function socketpair +[value] computing for function fprintf <- init_sockets <- main. + Called from tests/libc/socket.c:51. +[value] using specification for function fprintf +share/libc/stdio.h:121:[value] warning: no \from part for clause 'assigns *stream;' of function fprintf +[value] Done for function fprintf +[value] computing for function exit <- init_sockets <- main. + Called from tests/libc/socket.c:52. +[value] using specification for function exit +[value] Done for function exit +tests/libc/socket.c:54:[value] Assertion got status valid. +[value] Recording results for init_sockets +[value] Done for function init_sockets +[value] computing for function test_read <- main. + Called from tests/libc/socket.c:101. +[value] computing for function init_reception <- test_read <- main. + Called from tests/libc/socket.c:59. +[value] Call to builtin bzero(({{ (void *)&rcv_buffer }},{10})) +[value] computing for function write <- init_reception <- test_read <- main. + Called from tests/libc/socket.c:43. +tests/libc/socket.c:43:[kernel] warning: Neither code nor specification for function write, generating default assigns from the prototype +[value] using specification for function write +[value] Done for function write +[value] Recording results for init_reception +[value] Done for function init_reception +[value] computing for function read <- test_read <- main. + Called from tests/libc/socket.c:60. +tests/libc/socket.c:60:[kernel] warning: Neither code nor specification for function read, generating default assigns from the prototype +[value] using specification for function read +[value] Done for function read +[value] computing for function printf <- test_read <- main. + Called from tests/libc/socket.c:61. +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for test_read +[value] Done for function test_read +[value] computing for function test_readv <- main. + Called from tests/libc/socket.c:102. +[value] computing for function init_reception <- test_readv <- main. + Called from tests/libc/socket.c:67. +[value] Call to builtin bzero(({{ (void *)&rcv_buffer }},{10})) +[value] computing for function write <- init_reception <- test_readv <- main. + Called from tests/libc/socket.c:43. +[value] Done for function write +[value] Recording results for init_reception +[value] Done for function init_reception +[value] computing for function readv <- test_readv <- main. + Called from tests/libc/socket.c:68. +[value] using specification for function readv +share/libc/sys/uio.h:30:[value] Function readv: precondition got status valid. +share/libc/sys/uio.h:33:[value] warning: no \from part + for clause 'assigns *((char *)(iov+(0 .. iovcnt-1))->iov_base+(0 ..));' of + function readv +[value] Done for function readv +tests/libc/socket.c:71:[kernel] warning: accessing uninitialized left-value: + assert \initialized((char *)rcv_buffer_scattered1); +[value] computing for function printf <- test_readv <- main. + Called from tests/libc/socket.c:74. +[value] Done for function printf +[value] Recording results for test_readv +[value] Done for function test_readv +[value] computing for function test_recvmsg <- main. + Called from tests/libc/socket.c:103. +[value] computing for function init_reception <- test_recvmsg <- main. + Called from tests/libc/socket.c:81. +[value] Call to builtin bzero(({{ (void *)&rcv_buffer }},{10})) +[value] computing for function write <- init_reception <- test_recvmsg <- main. + Called from tests/libc/socket.c:43. +[value] Done for function write +[value] Recording results for init_reception +[value] Done for function init_reception +[value] computing for function recvmsg <- test_recvmsg <- main. + Called from tests/libc/socket.c:89. +[value] using specification for function recvmsg +share/libc/sys/socket.h:158:[value] Function recvmsg: precondition got status valid. +share/libc/sys/socket.h:159:[value] Function recvmsg: precondition got status valid. +share/libc/sys/socket.h:160:[value] Function recvmsg: precondition got status valid. +share/libc/sys/socket.h:162:[value] warning: no \from part + for clause 'assigns *((char *)hdr->msg_name+(0 .. hdr->msg_namelen-1)), + hdr->msg_namelen, + *((char *)(hdr->msg_iov+(0 .. hdr->msg_iovlen-1))->iov_base+ + (0 ..)), + *((char *)hdr->msg_control+(0 ..)), hdr->msg_controllen, + hdr->msg_flags;' of + function recvmsg +tests/libc/socket.c:89:[value] warning: Completely invalid destination for assigns + clause *((char *)hdr->msg_control+(0 ..)). Ignoring. +[value] Done for function recvmsg +tests/libc/socket.c:91:[kernel] warning: accessing uninitialized left-value: + assert \initialized((char *)rcv_buffer_scattered1); +[value] computing for function printf <- test_recvmsg <- main. + Called from tests/libc/socket.c:94. +[value] Done for function printf +[value] Recording results for test_recvmsg +[value] Done for function test_recvmsg +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function init_sockets: + __fc_socket_counter ∈ [--..--] + socket_fd[0..1] ∈ [--..--] + S___fc_stderr[0].__fc_stdio_id ∈ [--..--] + [0].[bits 32 to 63] ∈ UNINITIALIZED + [0]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [0].[bits 144 to 159] ∈ UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL ; &S___fc_inode_0_S___fc_stderr[0] }} + [0].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_0_S___fc_stderr[0] }} + [0].__fc_real_data_max_size ∈ [--..--] + [0].[bits 352 to 383] ∈ UNINITIALIZED + [1].__fc_stdio_id ∈ [--..--] + [1].[bits 32 to 63] ∈ UNINITIALIZED + [1]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [1].[bits 144 to 159] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stderr[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stderr[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + [1].[bits 352 to 383] ∈ UNINITIALIZED +[value] Values at end of function init_reception: + rcv_buffer[0..9] ∈ {0} +[value] Values at end of function test_read: + rcv_buffer[0..9] ∈ {0} + S___fc_stdout[0].__fc_stdio_id ∈ [--..--] + [0].[bits 32 to 63] ∈ [--..--] or UNINITIALIZED + [0]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [0].[bits 144 to 159] ∈ [--..--] or UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL + [--..--] ; &S___fc_inode_0_S___fc_stdout[0] }} + [0].__fc_real_data ∈ + {{ NULL + [--..--] ; &S___fc_real_data_0_S___fc_stdout[0] }} + [0].__fc_real_data_max_size ∈ [--..--] + [0].[bits 352 to 383] ∈ [--..--] or UNINITIALIZED + [1].__fc_stdio_id ∈ [--..--] + [1].[bits 32 to 63] ∈ UNINITIALIZED + [1]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [1].[bits 144 to 159] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stdout[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdout[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + [1].[bits 352 to 383] ∈ UNINITIALIZED +[value] Values at end of function test_readv: + rcv_buffer[0..9] ∈ {0} + rcv_buffer_scattered1[0] ∈ [--..--] + [1] ∈ [--..--] or UNINITIALIZED + rcv_buffer_scattered2[0..4] ∈ [--..--] or UNINITIALIZED + rcv_buffer_scattered3[0..2] ∈ [--..--] or UNINITIALIZED + rcv_buffer_scattered_iovec[0].iov_base ∈ + {{ (void *)&rcv_buffer_scattered1 }} + [0].iov_len ∈ {2} + [1].iov_base ∈ + {{ (void *)&rcv_buffer_scattered2 }} + [1].iov_len ∈ {5} + [2].iov_base ∈ + {{ (void *)&rcv_buffer_scattered3 }} + [2].iov_len ∈ {3} + S___fc_stdout[0].__fc_stdio_id ∈ [--..--] + [0].[bits 32 to 63] ∈ [--..--] or UNINITIALIZED + [0]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [0].[bits 144 to 159] ∈ [--..--] or UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL + [--..--] ; &S___fc_inode_0_S___fc_stdout[0] }} + [0].__fc_real_data ∈ + {{ NULL + [--..--] ; &S___fc_real_data_0_S___fc_stdout[0] }} + [0].__fc_real_data_max_size ∈ [--..--] + [0].[bits 352 to 383] ∈ [--..--] or UNINITIALIZED + [1].__fc_stdio_id ∈ [--..--] + [1].[bits 32 to 63] ∈ UNINITIALIZED + [1]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [1].[bits 144 to 159] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stdout[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdout[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + [1].[bits 352 to 383] ∈ UNINITIALIZED +[value] Values at end of function test_recvmsg: + rcv_buffer[0..9] ∈ {0} + rcv_buffer_scattered1[0] ∈ [--..--] + [1] ∈ [--..--] or UNINITIALIZED + rcv_buffer_scattered2[0..4] ∈ [--..--] or UNINITIALIZED + rcv_buffer_scattered3[0..2] ∈ [--..--] or UNINITIALIZED + rcv_buffer_scattered_iovec[0].iov_base ∈ + {{ (void *)&rcv_buffer_scattered1 }} + [0].iov_len ∈ {2} + [1].iov_base ∈ + {{ (void *)&rcv_buffer_scattered2 }} + [1].iov_len ∈ {5} + [2].iov_base ∈ + {{ (void *)&rcv_buffer_scattered3 }} + [2].iov_len ∈ {3} + hdr.msg_name ∈ {0} + .msg_namelen ∈ [--..--] + .[bits 96 to 127] ∈ UNINITIALIZED + .msg_iov ∈ {{ &rcv_buffer_scattered_iovec[0] }} + .msg_iovlen ∈ {3} + .[bits 224 to 255] ∈ UNINITIALIZED + .msg_control ∈ {0} + .msg_controllen ∈ [--..--] + .msg_flags ∈ [--..--] or UNINITIALIZED + S___fc_stdout[0].__fc_stdio_id ∈ [--..--] + [0].[bits 32 to 63] ∈ [--..--] or UNINITIALIZED + [0]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [0].[bits 144 to 159] ∈ [--..--] or UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL + [--..--] ; &S___fc_inode_0_S___fc_stdout[0] }} + [0].__fc_real_data ∈ + {{ NULL + [--..--] ; &S___fc_real_data_0_S___fc_stdout[0] }} + [0].__fc_real_data_max_size ∈ [--..--] + [0].[bits 352 to 383] ∈ [--..--] or UNINITIALIZED + [1].__fc_stdio_id ∈ [--..--] + [1].[bits 32 to 63] ∈ UNINITIALIZED + [1]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [1].[bits 144 to 159] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stdout[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdout[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + [1].[bits 352 to 383] ∈ UNINITIALIZED +[value] Values at end of function main: + __fc_socket_counter ∈ [--..--] + rcv_buffer[0..9] ∈ {0} + socket_fd[0..1] ∈ [--..--] + __retres ∈ {0} + S___fc_stderr[0].__fc_stdio_id ∈ [--..--] + [0].[bits 32 to 63] ∈ UNINITIALIZED + [0]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [0].[bits 144 to 159] ∈ UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL ; &S___fc_inode_0_S___fc_stderr[0] }} + [0].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_0_S___fc_stderr[0] }} + [0].__fc_real_data_max_size ∈ [--..--] + [0].[bits 352 to 383] ∈ UNINITIALIZED + [1].__fc_stdio_id ∈ [--..--] + [1].[bits 32 to 63] ∈ UNINITIALIZED + [1]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [1].[bits 144 to 159] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stderr[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stderr[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + [1].[bits 352 to 383] ∈ UNINITIALIZED + S___fc_stdout[0].__fc_stdio_id ∈ [--..--] + [0].[bits 32 to 63] ∈ [--..--] or UNINITIALIZED + [0]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [0].[bits 144 to 159] ∈ [--..--] or UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL + [--..--] ; &S___fc_inode_0_S___fc_stdout[0] }} + [0].__fc_real_data ∈ + {{ NULL + [--..--] ; &S___fc_real_data_0_S___fc_stdout[0] }} + [0].__fc_real_data_max_size ∈ [--..--] + [0].[bits 352 to 383] ∈ [--..--] or UNINITIALIZED + [1].__fc_stdio_id ∈ [--..--] + [1].[bits 32 to 63] ∈ UNINITIALIZED + [1]{.__fc_position; .__fc_error; .__fc_eof} ∈ [--..--] + [1].[bits 144 to 159] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stdout[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdout[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + [1].[bits 352 to 383] ∈ UNINITIALIZED diff -Nru frama-c-20140301+neon+dfsg/tests/libc/oracle/socket.res.oracle frama-c-20150201+sodium+dfsg/tests/libc/oracle/socket.res.oracle --- frama-c-20140301+neon+dfsg/tests/libc/oracle/socket.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/libc/oracle/socket.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,344 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/libc/socket.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + __fc_socket_counter ∈ [--..--] + __FC_errno ∈ [--..--] + __fc_stderr ∈ {{ NULL ; &S___fc_stderr[0] }} + __fc_stdin ∈ {{ NULL ; &S___fc_stdin[0] }} + __fc_stdout ∈ {{ NULL ; &S___fc_stdout[0] }} + __fc_fopen[0..511] ∈ {0} + _p__fc_fopen ∈ {{ &__fc_fopen[0] }} + __fc_random_counter ∈ {0} + __fc_rand_max ∈ {32767} + __fc_heap_status ∈ [--..--] + __fc_time_model ∈ {0} + __fc_time_tm ∈ {0} + __fc_time_tm_ptr ∈ {{ &__fc_time_tm }} + optarg ∈ {{ NULL ; &S_optarg[0] }} + optind ∈ [--..--] + opterr ∈ [--..--] + optopt ∈ [--..--] + sent_msg ∈ {{ "World" }} + rcv_buffer[0..9] ∈ {0} + socket_fd[0..1] ∈ {0} + S___fc_stderr[0]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof} ∈ + [--..--] + [0].[bits 80 to 95] ∈ UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL ; &S___fc_inode_0_S___fc_stderr[0] }} + [0].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_0_S___fc_stderr[0] }} + {[0].__fc_real_data_max_size; [1]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof}} ∈ + [--..--] + [1].[bits 80 to 95] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stderr[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stderr[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + S___fc_inode_0_S___fc_stderr[0..1] ∈ [--..--] + S___fc_real_data_0_S___fc_stderr[0..1] ∈ [--..--] + S___fc_inode_1_S___fc_stderr[0..1] ∈ [--..--] + S___fc_real_data_1_S___fc_stderr[0..1] ∈ [--..--] + S___fc_stdin[0]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof} ∈ + [--..--] + [0].[bits 80 to 95] ∈ UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ {{ NULL ; &S___fc_inode_0_S___fc_stdin[0] }} + [0].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_0_S___fc_stdin[0] }} + {[0].__fc_real_data_max_size; [1]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof}} ∈ + [--..--] + [1].[bits 80 to 95] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ {{ NULL ; &S___fc_inode_1_S___fc_stdin[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdin[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + S___fc_inode_0_S___fc_stdin[0..1] ∈ [--..--] + S___fc_real_data_0_S___fc_stdin[0..1] ∈ [--..--] + S___fc_inode_1_S___fc_stdin[0..1] ∈ [--..--] + S___fc_real_data_1_S___fc_stdin[0..1] ∈ [--..--] + S___fc_stdout[0]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof} ∈ + [--..--] + [0].[bits 80 to 95] ∈ UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL ; &S___fc_inode_0_S___fc_stdout[0] }} + [0].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_0_S___fc_stdout[0] }} + {[0].__fc_real_data_max_size; [1]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof}} ∈ + [--..--] + [1].[bits 80 to 95] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stdout[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdout[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + S___fc_inode_0_S___fc_stdout[0..1] ∈ [--..--] + S___fc_real_data_0_S___fc_stdout[0..1] ∈ [--..--] + S___fc_inode_1_S___fc_stdout[0..1] ∈ [--..--] + S___fc_real_data_1_S___fc_stdout[0..1] ∈ [--..--] + S_optarg[0..1] ∈ [--..--] +[value] computing for function init_sockets <- main. + Called from tests/libc/socket.c:100. +[value] computing for function socketpair <- init_sockets <- main. + Called from tests/libc/socket.c:49. +[value] using specification for function socketpair +share/libc/sys/socket.h:183:[value] Function socketpair: precondition got status valid. +share/libc/sys/socket.h:187:[value] warning: no 'assigns \result \from ...' clause specified for function socketpair +[value] Done for function socketpair +[value] computing for function fprintf <- init_sockets <- main. + Called from tests/libc/socket.c:51. +[value] using specification for function fprintf +share/libc/stdio.h:121:[value] warning: no \from part for clause 'assigns *stream;' of function fprintf +[value] Done for function fprintf +[value] computing for function exit <- init_sockets <- main. + Called from tests/libc/socket.c:52. +[value] using specification for function exit +[value] Done for function exit +tests/libc/socket.c:54:[value] Assertion got status valid. +[value] Recording results for init_sockets +[value] Done for function init_sockets +[value] computing for function test_read <- main. + Called from tests/libc/socket.c:101. +[value] computing for function init_reception <- test_read <- main. + Called from tests/libc/socket.c:59. +[value] Call to builtin bzero(({{ (void *)&rcv_buffer }},{10})) +[value] computing for function write <- init_reception <- test_read <- main. + Called from tests/libc/socket.c:43. +tests/libc/socket.c:43:[kernel] warning: Neither code nor specification for function write, generating default assigns from the prototype +[value] using specification for function write +[value] Done for function write +[value] Recording results for init_reception +[value] Done for function init_reception +[value] computing for function read <- test_read <- main. + Called from tests/libc/socket.c:60. +tests/libc/socket.c:60:[kernel] warning: Neither code nor specification for function read, generating default assigns from the prototype +[value] using specification for function read +[value] Done for function read +[value] computing for function printf <- test_read <- main. + Called from tests/libc/socket.c:61. +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for test_read +[value] Done for function test_read +[value] computing for function test_readv <- main. + Called from tests/libc/socket.c:102. +[value] computing for function init_reception <- test_readv <- main. + Called from tests/libc/socket.c:67. +[value] Call to builtin bzero(({{ (void *)&rcv_buffer }},{10})) +[value] computing for function write <- init_reception <- test_readv <- main. + Called from tests/libc/socket.c:43. +[value] Done for function write +[value] Recording results for init_reception +[value] Done for function init_reception +[value] computing for function readv <- test_readv <- main. + Called from tests/libc/socket.c:68. +[value] using specification for function readv +share/libc/sys/uio.h:30:[value] Function readv: precondition got status valid. +share/libc/sys/uio.h:33:[value] warning: no \from part + for clause 'assigns *((char *)(iov+(0 .. iovcnt-1))->iov_base+(0 ..));' of + function readv +[value] Done for function readv +tests/libc/socket.c:71:[kernel] warning: accessing uninitialized left-value: + assert \initialized((char *)rcv_buffer_scattered1); +[value] computing for function printf <- test_readv <- main. + Called from tests/libc/socket.c:74. +[value] Done for function printf +[value] Recording results for test_readv +[value] Done for function test_readv +[value] computing for function test_recvmsg <- main. + Called from tests/libc/socket.c:103. +[value] computing for function init_reception <- test_recvmsg <- main. + Called from tests/libc/socket.c:81. +[value] Call to builtin bzero(({{ (void *)&rcv_buffer }},{10})) +[value] computing for function write <- init_reception <- test_recvmsg <- main. + Called from tests/libc/socket.c:43. +[value] Done for function write +[value] Recording results for init_reception +[value] Done for function init_reception +[value] computing for function recvmsg <- test_recvmsg <- main. + Called from tests/libc/socket.c:89. +[value] using specification for function recvmsg +share/libc/sys/socket.h:158:[value] Function recvmsg: precondition got status valid. +share/libc/sys/socket.h:159:[value] Function recvmsg: precondition got status valid. +share/libc/sys/socket.h:160:[value] Function recvmsg: precondition got status valid. +share/libc/sys/socket.h:162:[value] warning: no \from part + for clause 'assigns *((char *)hdr->msg_name+(0 .. hdr->msg_namelen-1)), + hdr->msg_namelen, + *((char *)(hdr->msg_iov+(0 .. hdr->msg_iovlen-1))->iov_base+ + (0 ..)), + *((char *)hdr->msg_control+(0 ..)), hdr->msg_controllen, + hdr->msg_flags;' of + function recvmsg +tests/libc/socket.c:89:[value] warning: Completely invalid destination for assigns + clause *((char *)hdr->msg_control+(0 ..)). Ignoring. +[value] Done for function recvmsg +tests/libc/socket.c:91:[kernel] warning: accessing uninitialized left-value: + assert \initialized((char *)rcv_buffer_scattered1); +[value] computing for function printf <- test_recvmsg <- main. + Called from tests/libc/socket.c:94. +[value] Done for function printf +[value] Recording results for test_recvmsg +[value] Done for function test_recvmsg +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function init_sockets: + __fc_socket_counter ∈ [--..--] + socket_fd[0..1] ∈ [--..--] + S___fc_stderr[0]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof} ∈ + [--..--] + [0].[bits 80 to 95] ∈ UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL ; &S___fc_inode_0_S___fc_stderr[0] }} + [0].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_0_S___fc_stderr[0] }} + {[0].__fc_real_data_max_size; [1]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof}} ∈ + [--..--] + [1].[bits 80 to 95] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stderr[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stderr[0] }} + [1].__fc_real_data_max_size ∈ [--..--] +[value] Values at end of function init_reception: + rcv_buffer[0..9] ∈ {0} +[value] Values at end of function test_read: + rcv_buffer[0..9] ∈ {0} + S___fc_stdout[0]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof} ∈ + [--..--] + [0].[bits 80 to 95] ∈ [--..--] or UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL + [--..--] ; &S___fc_inode_0_S___fc_stdout[0] }} + [0].__fc_real_data ∈ + {{ NULL + [--..--] ; &S___fc_real_data_0_S___fc_stdout[0] }} + {[0].__fc_real_data_max_size; [1]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof}} ∈ + [--..--] + [1].[bits 80 to 95] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stdout[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdout[0] }} + [1].__fc_real_data_max_size ∈ [--..--] +[value] Values at end of function test_readv: + rcv_buffer[0..9] ∈ {0} + rcv_buffer_scattered1[0] ∈ [--..--] + [1] ∈ [--..--] or UNINITIALIZED + rcv_buffer_scattered2[0..4] ∈ [--..--] or UNINITIALIZED + rcv_buffer_scattered3[0..2] ∈ [--..--] or UNINITIALIZED + rcv_buffer_scattered_iovec[0].iov_base ∈ + {{ (void *)&rcv_buffer_scattered1 }} + [0].iov_len ∈ {2} + [1].iov_base ∈ + {{ (void *)&rcv_buffer_scattered2 }} + [1].iov_len ∈ {5} + [2].iov_base ∈ + {{ (void *)&rcv_buffer_scattered3 }} + [2].iov_len ∈ {3} + S___fc_stdout[0]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof} ∈ + [--..--] + [0].[bits 80 to 95] ∈ [--..--] or UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL + [--..--] ; &S___fc_inode_0_S___fc_stdout[0] }} + [0].__fc_real_data ∈ + {{ NULL + [--..--] ; &S___fc_real_data_0_S___fc_stdout[0] }} + {[0].__fc_real_data_max_size; [1]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof}} ∈ + [--..--] + [1].[bits 80 to 95] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stdout[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdout[0] }} + [1].__fc_real_data_max_size ∈ [--..--] +[value] Values at end of function test_recvmsg: + rcv_buffer[0..9] ∈ {0} + rcv_buffer_scattered1[0] ∈ [--..--] + [1] ∈ [--..--] or UNINITIALIZED + rcv_buffer_scattered2[0..4] ∈ [--..--] or UNINITIALIZED + rcv_buffer_scattered3[0..2] ∈ [--..--] or UNINITIALIZED + rcv_buffer_scattered_iovec[0].iov_base ∈ + {{ (void *)&rcv_buffer_scattered1 }} + [0].iov_len ∈ {2} + [1].iov_base ∈ + {{ (void *)&rcv_buffer_scattered2 }} + [1].iov_len ∈ {5} + [2].iov_base ∈ + {{ (void *)&rcv_buffer_scattered3 }} + [2].iov_len ∈ {3} + hdr.msg_name ∈ {0} + .msg_namelen ∈ [--..--] + .msg_iov ∈ {{ &rcv_buffer_scattered_iovec[0] }} + .msg_iovlen ∈ {3} + .msg_control ∈ {0} + .msg_controllen ∈ [--..--] + .msg_flags ∈ [--..--] or UNINITIALIZED + S___fc_stdout[0]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof} ∈ + [--..--] + [0].[bits 80 to 95] ∈ [--..--] or UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL + [--..--] ; &S___fc_inode_0_S___fc_stdout[0] }} + [0].__fc_real_data ∈ + {{ NULL + [--..--] ; &S___fc_real_data_0_S___fc_stdout[0] }} + {[0].__fc_real_data_max_size; [1]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof}} ∈ + [--..--] + [1].[bits 80 to 95] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stdout[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdout[0] }} + [1].__fc_real_data_max_size ∈ [--..--] +[value] Values at end of function main: + __fc_socket_counter ∈ [--..--] + rcv_buffer[0..9] ∈ {0} + socket_fd[0..1] ∈ [--..--] + __retres ∈ {0} + S___fc_stderr[0]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof} ∈ + [--..--] + [0].[bits 80 to 95] ∈ UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL ; &S___fc_inode_0_S___fc_stderr[0] }} + [0].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_0_S___fc_stderr[0] }} + {[0].__fc_real_data_max_size; [1]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof}} ∈ + [--..--] + [1].[bits 80 to 95] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stderr[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stderr[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + S___fc_stdout[0]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof} ∈ + [--..--] + [0].[bits 80 to 95] ∈ [--..--] or UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL + [--..--] ; &S___fc_inode_0_S___fc_stdout[0] }} + [0].__fc_real_data ∈ + {{ NULL + [--..--] ; &S___fc_real_data_0_S___fc_stdout[0] }} + {[0].__fc_real_data_max_size; [1]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof}} ∈ + [--..--] + [1].[bits 80 to 95] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stdout[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdout[0] }} + [1].__fc_real_data_max_size ∈ [--..--] diff -Nru frama-c-20140301+neon+dfsg/tests/libc/oracle/string.res.oracle frama-c-20150201+sodium+dfsg/tests/libc/oracle/string.res.oracle --- frama-c-20140301+neon+dfsg/tests/libc/oracle/string.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/libc/oracle/string.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,55 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/libc/string.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function test_strcmp <- main. + Called from tests/libc/string.c:20. +[value] computing for function strcmp <- test_strcmp <- main. + Called from tests/libc/string.c:5. +[value] using specification for function strcmp +share/libc/string.h:98:[value] Function strcmp: precondition 'valid_string_s1' got status unknown. +share/libc/string.h:99:[value] Function strcmp: precondition 'valid_string_s2' got status unknown. +tests/libc/string.c:5:[value] cannot evaluate ACSL term, unsupported ACSL construct: logic functions or predicates +[value] Done for function strcmp +tests/libc/string.c:6:[value] Assertion got status unknown. +[value] Recording results for test_strcmp +[value] Done for function test_strcmp +[value] computing for function test_strcat <- main. + Called from tests/libc/string.c:21. +[value] computing for function strcat <- test_strcat <- main. + Called from tests/libc/string.c:13. +[value] using specification for function strcat +share/libc/string.h:229:[value] Function strcat: precondition 'valid_string_src' got status unknown. +share/libc/string.h:230:[value] Function strcat: precondition 'valid_string_dst' got status unknown. +tests/libc/string.c:13:[value] Cannot evaluate range bound strlen(dest)+strlen(src) + (unsupported ACSL construct: logic functions or predicates). Approximating +share/libc/string.h:231:[value] Function strcat: precondition 'room_string' got status unknown. +share/libc/string.h:236:[value] Cannot evaluate range bound strlen{Old}(src) + (unsupported ACSL construct: logic functions or predicates). Approximating +share/libc/string.h:236:[value] Cannot evaluate range bound strlen{Old}(dest) + (unsupported ACSL construct: logic functions or predicates). Approximating +share/libc/string.h:236:[value] Cannot evaluate range bound strlen{Old}(dest)+strlen{Old}(src) + (unsupported ACSL construct: logic functions or predicates). Approximating +share/libc/string.h:236:[value] cannot evaluate ACSL term, unsupported ACSL construct: logic functions or predicates +[value] Done for function strcat +[value] Recording results for test_strcat +[value] Done for function test_strcat +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +tests/libc/string.c:13:[value] Cannot evaluate range bound strlen{Old}(dest) + (unsupported ACSL construct: logic functions or predicates). Approximating +tests/libc/string.c:13:[value] Cannot evaluate range bound strlen{Old}(dest)+strlen{Old}(src) + (unsupported ACSL construct: logic functions or predicates). Approximating +tests/libc/string.c:13:[value] Cannot evaluate range bound strlen{Old}(src) + (unsupported ACSL construct: logic functions or predicates). Approximating +[value] Values at end of function test_strcat: + string[0] ∈ [--..--] + [1..9] ∈ [--..--] or UNINITIALIZED +[value] Values at end of function test_strcmp: + res ∈ {0} +[value] Values at end of function main: + __retres ∈ {0} diff -Nru frama-c-20140301+neon+dfsg/tests/libc/oracle/time.res.oracle frama-c-20150201+sodium+dfsg/tests/libc/oracle/time.res.oracle --- frama-c-20140301+neon+dfsg/tests/libc/oracle/time.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/libc/oracle/time.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/libc/time.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + __fc_time ∈ [--..--] + __fc_tz ∈ [--..--] +[value] computing for function test_gettimeofday <- main. + Called from tests/libc/time.c:13. +[value] computing for function gettimeofday <- test_gettimeofday <- main. + Called from tests/libc/time.c:6. +tests/libc/time.c:6:[kernel] warning: No code nor explicit assigns clause for function gettimeofday, generating default assigns from the specification +[value] using specification for function gettimeofday +tests/libc/time.c:6:[value] warning: Completely invalid destination for assigns clause *tz. Ignoring. +share/libc/sys/time.h:60:[value] Function gettimeofday, behavior tz_not_null: assumes got status invalid; postcondition not evaluated. +share/libc/sys/time.h:67:[value] Function gettimeofday, behavior tv_and_tz_not_null: assumes got status invalid; postcondition not evaluated. +[value] Done for function gettimeofday +tests/libc/time.c:7:[value] Assertion got status valid. +tests/libc/time.c:8:[value] Assertion got status valid. +[value] Recording results for test_gettimeofday +[value] Done for function test_gettimeofday +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function test_gettimeofday: + tv ∈ [--..--] +[value] Values at end of function main: + __retres ∈ {0} diff -Nru frama-c-20140301+neon+dfsg/tests/libc/oracle_gcc/string.res.oracle frama-c-20150201+sodium+dfsg/tests/libc/oracle_gcc/string.res.oracle --- frama-c-20140301+neon+dfsg/tests/libc/oracle_gcc/string.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/libc/oracle_gcc/string.res.oracle 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,70 @@ +[kernel] preprocessing with "gcc -C -E -I. tests/libc/string.c" +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization +[value] computing for function test_strcmp <- main. + Called from tests/libc/string.c:20. +[value] computing for function strcmp <- test_strcmp <- main. + Called from tests/libc/string.c:5. +[kernel] warning: Neither code nor specification for function strcmp, generating default assigns from the prototype +[value] using specification for function strcmp +[value] Done for function strcmp +tests/libc/string.c:6:[value] Assertion got status unknown. +[value] Recording results for test_strcmp +[value] Done for function test_strcmp +[value] computing for function test_strcat <- main. + Called from tests/libc/string.c:21. +[value] computing for function strcat <- test_strcat <- main. + Called from tests/libc/string.c:13. +[kernel] warning: Neither code nor specification for function strcat, generating default assigns from the prototype +[value] using specification for function strcat +[value] Done for function strcat +[value] Recording results for test_strcat +[value] Done for function test_strcat +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function test_strcat: + string[0] ∈ [--..--] + [1..9] ∈ UNINITIALIZED +[value] Values at end of function test_strcmp: + res ∈ {0} +[value] Values at end of function main: + __retres ∈ {0} +[from] Computing for function test_strcat +[from] Computing for function strcat <-test_strcat +[from] Done for function strcat +[from] Done for function test_strcat +[from] Computing for function test_strcmp +[from] Computing for function strcmp <-test_strcmp +[from] Done for function strcmp +[from] Done for function test_strcmp +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function strcat: + string[0] FROM string[0]; "hello"[bits 0 to 7] + \result FROM string[0]; "hello"[bits 0 to 7] +[from] Function strcmp: + \result FROM "hello"[bits 0 to 7]; "world"[bits 0 to 7] +[from] Function test_strcat: + NO EFFECTS +[from] Function test_strcmp: + NO EFFECTS +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function test_strcat: + string[0] +[inout] Inputs for function test_strcat: + "hello"[bits 0 to 7] +[inout] Out (internal) for function test_strcmp: + res +[inout] Inputs for function test_strcmp: + "hello"[bits 0 to 7]; "world"[bits 0 to 7] +[inout] Out (internal) for function main: + __retres +[inout] Inputs for function main: + "hello"[bits 0 to 7]; "world"[bits 0 to 7]; "hello"[bits 0 to 7] diff -Nru frama-c-20140301+neon+dfsg/tests/libc/socket.c frama-c-20150201+sodium+dfsg/tests/libc/socket.c --- frama-c-20140301+neon+dfsg/tests/libc/socket.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/libc/socket.c 2015-05-29 15:31:43.000000000 +0000 @@ -1,6 +1,6 @@ /* run.config - STDOPT: +"-val-builtin memset:Frama_C_memset" - STDOPT: +"-val-builtin memset:Frama_C_memset -cpp-extra-args='-D__FRAMA_C_MACHDEP_X86_64'" + STDOPT: +"-val-builtin bzero:Frama_C_bzero" + STDOPT: +"-val-builtin bzero:Frama_C_bzero -machdep x86_64" */ #include #include @@ -9,6 +9,7 @@ #include #include #include +#include const char* sent_msg = "World"; #define SIZEOF_SENT_MSG 6 @@ -38,7 +39,7 @@ /* Clears rcv_buffers and writes data to send_socket. */ void init_reception(void) { - memset( rcv_buffer, 0, SIZEOF_RCV_BUFFER); + bzero( rcv_buffer, SIZEOF_RCV_BUFFER); write( send_socket, sent_msg, SIZEOF_SENT_MSG); } @@ -103,10 +104,3 @@ return 0; } - - -/* -Local Variables: -compile-command: "cd ../.. && ptests.byte -show -config gcc tests/libc/socket.c" -End: -*/ diff -Nru frama-c-20140301+neon+dfsg/tests/libc/test_config frama-c-20150201+sodium+dfsg/tests/libc/test_config --- frama-c-20140301+neon+dfsg/tests/libc/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/libc/test_config 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1 @@ +OPT: -val -cpp-extra-args='-nostdinc -Ishare/libc' \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/tests/libc/test_config_gcc frama-c-20150201+sodium+dfsg/tests/libc/test_config_gcc --- frama-c-20140301+neon+dfsg/tests/libc/test_config_gcc 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/libc/test_config_gcc 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,4 @@ +COMMENT: This test config is not run by default. It allows a simple test to the tests, +COMMENT: by compiling the file and running it. +CMD: ./tests/libc/compile_and_run.sh +OPT: diff -Nru frama-c-20140301+neon+dfsg/tests/make_run_script/make_run_script.mll frama-c-20150201+sodium+dfsg/tests/make_run_script/make_run_script.mll --- frama-c-20140301+neon+dfsg/tests/make_run_script/make_run_script.mll 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/make_run_script/make_run_script.mll 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,215 @@ +{ + let debug = true + + let string_if_not_zero nbr = if nbr = 0 then "" else "."^string_of_int nbr + + type state = CMD_STATE | ARG_STATE | SRC_STATE | OPT_STATE | PPC_STATE | GCC_STATE + type token = TOP_TOKEN | CFG_TOKEN | CMD_TOKEN + + let head = + "#!/bin/sh\n" ^ + "if [ $# -lt 5 ] ; then\n" ^ + " echo `basename $0`\": a subshell build by make_run_script.\"\n" ^ + " exit 1\n" ^ + "fi\n" ^ + "#comparaison\n" ^ + "Compare() {\n" ^ + " if [ -e $1$2 ]; then\n" ^ + " File=`basename $1$2 .log`.oracle\n" ^ + " Dir=`dirname $1`\n" ^ + " Dir=`dirname $Dir`\n" ^ + " File=\"$Dir/oracle/$File\"\n" ^ + " if [ -e ${File} ]; then\n" ^ + " if ! diff -b -B --brief $1$2 ${File} >/dev/null\n" ^ + " then\n" ^ + " echo \". KO: diff -b -B $1$2 ${File}\"\n" ^ + " fi\n" ^ + " else\n" ^ + " echo \". NO oracle ${File}\"\n" ^ + " fi\n" ^ + " fi\n" ^ + "}\n" ^ + "# input file\n" ^ + "Src=$1\n" ^ + "shift\n" ^ + "# prefix for the out files\n" ^ + "PreFix=$1\n" ^ + "shift\n" ^ + "# extension for out files issued from stdout\n" ^ + "PostFix1=$1\n" ^ + "shift\n" ^ + "# extension for out files issued from stderr\n" ^ + "PostFix2=$1\n" ^ + "shift\n" ^ + "# command running the test\n" ^ + "Cmd=$1\n" ^ + "shift\n" ^ + "#\n" ^ + "Result=0\n" + + let line_nbr, lex_token, cmd_state, cmd_head, cmd_nbr, cmd_str = + ref 1, ref TOP_TOKEN, ref CMD_STATE, ref false, ref 0, ref "" + + (* GCC: check the compilation of the source file*) + let flush_gcc_line cmd nbr = +(* Printf.printf"# check the compilation of the source file.\n"; + Printf.printf"#\n#echo \"- Test %d: compilation checking...\"\n" nbr; + Printf.printf"echo \"gcc %s -c ${Src} -o ${PreFix}.o\"\n" cmd; + Printf.printf"gcc %s -c ${Src} -o ${PreFix}.o 2> /dev/null\n" cmd; + Printf.printf"Res=$?\n"; + Printf.printf"rm -f ${PreFix}.o\n"; + Printf.printf"if [ \"${Res}\" != 0 ] ; then\n"; + Printf.printf" echo \"# compilation problem with: gcc %s -c ${Src} -o ${PreFix}.o\"\n" cmd; + Printf.printf"fi\n" +*) + () + let flush_redirection nbr_ = + let nbr = string_if_not_zero nbr_ in + Printf.printf" > ${PreFix}%s${PostFix1} 2> ${PreFix}%s${PostFix2}\n" + nbr nbr; + Printf.printf"Res=$?\n"; + Printf.printf"if [ \"${Res}\" != 0 ] ; then\n"; + Printf.printf" Result=${Res}\n"; + Printf.printf" echo \"# abort(${Res}) on test No %d\"\n" nbr_; + Printf.printf"else\n"; + Printf.printf" Compare ${PreFix}%s${PostFix1}\n" nbr; + Printf.printf" Compare ${PreFix}%s${PostFix2}\n" nbr; + Printf.printf"fi\n" + + (* default binary, options and source file are still into the command. *) + (* SRC: * * *) + (* cmd= SRC *) + (* cmd= * * *) + let flush_src_line cmd nbr = + Printf.printf"#\n#echo \"- Test %d: running...\"\n" nbr; + Printf.printf"echo \"${Cmd} %s ${Src}\"\n" cmd; + Printf.printf"${Cmd} $* %s ${Src}" cmd; + flush_redirection nbr + + (* default binary and source file are still into the command. *) + (* OPT: * * *) + (* cmd= OPT *) + (* cmd= * * *) + let flush_opt_line cmd nbr = + Printf.printf"#\n#echo \"- Test %d: running...\"\n" nbr; + Printf.printf"echo \"${Cmd} %s ${Src}\"\n" cmd; + Printf.printf"${Cmd} %s ${Src}" cmd; + flush_redirection nbr + + (* default binary is still into the command. *) + (* ARG: * * *) + (* cmd= ARG *) + (* cmd= * * *) + let flush_arg_line cmd nbr = + Printf.printf"#\n#echo \"- Test %d: running...\"\n" nbr; + Printf.printf"echo \"${Cmd} %s\"\n" cmd; + Printf.printf"${Cmd} %s" cmd; + flush_redirection nbr + + (* CMD: * * *) + (* cmd= CMD *) + (* cmd= * *) + let flush_cmd_line cmd nbr = + Printf.printf"#\n#echo \"- Test %d: running...\"\n" nbr; + Printf.printf"echo \"%s\"\n" cmd; + Printf.printf"%s" cmd; + flush_redirection nbr + + let flush_cmd state = + + if not !cmd_head + then Printf.printf"%s" head; + (match state with + | PPC_STATE -> flush_gcc_line "" !cmd_nbr; Printf.printf"${Cmd} $* ${Src}" + | GCC_STATE -> flush_gcc_line !cmd_str !cmd_nbr + | OPT_STATE -> + flush_opt_line !cmd_str !cmd_nbr; + incr cmd_nbr + | ARG_STATE -> flush_arg_line !cmd_str !cmd_nbr; + incr cmd_nbr + | SRC_STATE -> flush_src_line !cmd_str !cmd_nbr; + incr cmd_nbr + | CMD_STATE -> flush_cmd_line !cmd_str !cmd_nbr; + incr cmd_nbr); + cmd_head := true; + cmd_str := "" + + let debug_cmd txt = + if debug + then + Printf.printf"#%s\n" txt + else + () + + let state_cmd token info = + lex_token := token; + debug_cmd info + + let start_cmd state token info= + cmd_state := state; + state_cmd token info + + let start_cfg state token info = + if state = !cmd_state + then flush_cmd !cmd_state; + start_cmd state token info + + let build_cmd s = + cmd_str := !cmd_str ^ s + + exception Eof + exception ConfigNotFound +} +rule token_top = parse + '\n' { if (5 > !line_nbr) + then line_nbr := 1 + !line_nbr + else raise ConfigNotFound } + | [^ '\n'] { } + | eof { debug_cmd "end of file"; raise Eof } + | "/*" ([' ' '\t']*) "run.config" ([' ' '\t' '\n']) { line_nbr := 1; start_cmd PPC_STATE CFG_TOKEN "parsing config"; } + +and token_cfg = parse + | '\n' { } + | [^ '*' '\n' ' ' '\t' ]+ { } + | ['*' ' ' '\t'] { } + | eof { debug_cmd "end of file"; raise Eof } + | ('\n' | ['*' ' ' '\t'])* "GCC:" { start_cmd GCC_STATE CMD_TOKEN "* GCC:" } + | ('\n' | ['*' ' ' '\t'])* "CMD:" { start_cmd CMD_STATE CMD_TOKEN "* CMD:"} + | ('\n' | ['*' ' ' '\t'])* "OPT:" { start_cmd OPT_STATE CMD_TOKEN "* OPT:" } + | ('\n' | ['*' ' ' '\t'])* "ARG:" { start_cmd ARG_STATE CMD_TOKEN "* ARG:"} + | ('\n' | ['*' ' ' '\t'])* "SRC:" { start_cmd SRC_STATE CMD_TOKEN "* SRC:"} + | "*/" { start_cfg PPC_STATE TOP_TOKEN "end of config" } + +and token_cmd = parse + '\\' '\n' [' ' '\t']* { } + | '\n' { flush_cmd !cmd_state; state_cmd CFG_TOKEN "* end of line"} + | ('\\' as c) { build_cmd (String.make 1 c) } + | ([^ '\n' '\\']+ as s) { build_cmd s } + | eof { flush_cmd !cmd_state; raise Eof } + | "*/" { flush_cmd !cmd_state; state_cmd TOP_TOKEN "end of parsing"} + +{ + let _ = ( try + let std_channel = + if Array.length Sys.argv = 1 then stdin + else open_in Sys.argv.(1) + in + let lexbuffer = Lexing.from_channel std_channel + in while true do + let lexfun = (match !lex_token with + | TOP_TOKEN -> token_top + | CFG_TOKEN -> token_cfg + | CMD_TOKEN -> token_cmd) + in lexfun lexbuffer + done + with Eof -> debug_cmd "#end of file" + | ConfigNotFound -> () + | Failure(s) -> Printf.printf"#ERROR\n"); + print_newline(); + if not !cmd_head + then exit 1; + Printf.printf"#return last abort value.\n"; + Printf.printf"exit ${Result}\n"; + flush stdout; +} + diff -Nru frama-c-20140301+neon+dfsg/tests/metrics/fc_libc.c frama-c-20150201+sodium+dfsg/tests/metrics/fc_libc.c --- frama-c-20140301+neon+dfsg/tests/metrics/fc_libc.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/metrics/fc_libc.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,77 +0,0 @@ -/* run.config - STDOPT: +"-check" +"-cpp-extra-args='-nostdinc -Ishare/libc'" -**/ - -#include "share/libc/assert.c" -#include "share/libc/complex.c" -#include "share/libc/ctype.c" -#include "share/libc/errno.c" -#include "share/libc/__fc_builtin.c" -#include "share/libc/fenv.c" -#include "share/libc/float.c" -#include "share/libc/inttypes.c" -#include "share/libc/iso646.c" -#include "share/libc/limits.c" -#include "share/libc/locale.c" -#include "share/libc/math.c" -#include "share/libc/setjmp.c" -#include "share/libc/signal.c" -#include "share/libc/stdarg.c" -#include "share/libc/stdbool.c" -#include "share/libc/stddef.c" -#include "share/libc/stdio.c" -#include "share/libc/stdlib.c" -#include "share/libc/string.c" -#include "share/libc/test.c" -#include "share/libc/tgmath.c" -#include "share/libc/time.c" -#include "share/libc/wchar.c" -#include "share/libc/wctype.c" -#include "share/libc/assert.h" -#include "share/libc/ctype.h" -#include "share/libc/dirent.h" -#include "share/libc/errno.h" -#include "share/libc/__fc_builtin.h" -#include "share/libc/__fc_define_blkcnt_t.h" -#include "share/libc/__fc_define_blksize_t.h" -#include "share/libc/__fc_define_dev_t.h" -#include "share/libc/__fc_define_ino_t.h" -#include "share/libc/__fc_define_intptr_t.h" -#include "share/libc/__fc_define_iovec.h" -#include "share/libc/__fc_define_mode_t.h" -#include "share/libc/__fc_define_nlink_t.h" -#include "share/libc/__fc_define_null.h" -#include "share/libc/__fc_define_off_t.h" -#include "share/libc/__fc_define_pid_t.h" -#include "share/libc/__fc_define_restrict.h" -#include "share/libc/__fc_define_size_t.h" -#include "share/libc/__fc_define_ssize_t.h" -#include "share/libc/__fc_define_suseconds_t.h" -#include "share/libc/__fc_define_time_t.h" -#include "share/libc/__fc_define_uid_and_gid.h" -#include "share/libc/__fc_define_useconds_t.h" -#include "share/libc/__fc_define_wchar_t.h" -#include "share/libc/__fc_machdep.h" -#include "share/libc/fcntl.h" -#include "share/libc/__fc_string_axiomatic.h" -#include "share/libc/float.h" -#include "share/libc/inttypes.h" -#include "share/libc/iso646.h" -#include "share/libc/limits.h" -#include "share/libc/locale.h" -#include "share/libc/math.h" -#include "share/libc/pwd.h" -#include "share/libc/setjmp.h" -#include "share/libc/signal.h" -#include "share/libc/stdarg.h" -#include "share/libc/stdbool.h" -#include "share/libc/stddef.h" -#include "share/libc/stdint.h" -#include "share/libc/stdio.h" -#include "share/libc/stdlib.h" -#include "share/libc/string.h" -#include "share/libc/syslog.h" -#include "share/libc/termios.h" -#include "share/libc/time.h" -#include "share/libc/unistd.h" - diff -Nru frama-c-20140301+neon+dfsg/tests/metrics/oracle/cyclo_comp5.res.oracle frama-c-20150201+sodium+dfsg/tests/metrics/oracle/cyclo_comp5.res.oracle --- frama-c-20140301+neon+dfsg/tests/metrics/oracle/cyclo_comp5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/metrics/oracle/cyclo_comp5.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/metrics/cyclo_comp5.c (with preprocessing) +[metrics] Defined functions (2) + ===================== + complexity5 (1 call); main (0 call); + + Undefined functions (1) + ======================= + printf (4 calls); + + Potential entry points (1) + ========================== + main; + + Global metrics + ============== + Sloc = 14 + Decision point = 4 + Global variables = 0 + If = 1 + Loop = 0 + Goto = 0 + Assignment = 0 + Exit point = 2 + Function = 3 + Function call = 5 + Pointer dereferencing = 0 + Cyclomatic complexity = 4 diff -Nru frama-c-20140301+neon+dfsg/tests/metrics/oracle/func_ptr.1.res.oracle frama-c-20150201+sodium+dfsg/tests/metrics/oracle/func_ptr.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/metrics/oracle/func_ptr.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/metrics/oracle/func_ptr.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,57 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/metrics/func_ptr.c (with preprocessing) +[metrics] Defined functions (4) + ===================== + baz (address taken) (0 call); foobar (0 call); foo (address taken) (0 call); + main (0 call); + + Undefined functions (0) + ======================= + + + Potential entry points (2) + ========================== + foobar; main; + + Global metrics + ============== + Sloc = 16 + Decision point = 1 + Global variables = 1 + If = 1 + Loop = 0 + Goto = 2 + Assignment = 7 + Exit point = 4 + Function = 4 + Function call = 2 + Pointer dereferencing = 2 + Cyclomatic complexity = -1 +[metrics] Functions syntactically reachable from foobar: 2 + ------------------------------------------------ + : baz; foobar; + + Functions syntactically unreachable from foobar: 2 + -------------------------------------------------- + : foo; main; +[value] Analyzing a complete application starting at foobar +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + bar ∈ {0} +[value] computing for function baz <- foobar. + Called from tests/metrics/func_ptr.c:12. +[value] Recording results for baz +[value] Done for function baz +[value] Recording results for foobar +[value] done for function foobar +[metrics] Value coverage statistics + ========================= + Syntactically reachable functions = 2 (out of 4) + Semantically reached functions = 2 + Coverage estimation = 100.0% +[metrics] Statements analyzed by Value + ---------------------------- + 5 stmts in analyzed functions, 5 stmts analyzed (100.0%) + foobar: 4 stmts out of 4 (100.0%) + baz: 1 stmts out of 1 (100.0%) diff -Nru frama-c-20140301+neon+dfsg/tests/metrics/oracle/func_ptr.res.oracle frama-c-20150201+sodium+dfsg/tests/metrics/oracle/func_ptr.res.oracle --- frama-c-20140301+neon+dfsg/tests/metrics/oracle/func_ptr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/metrics/oracle/func_ptr.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,58 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/metrics/func_ptr.c (with preprocessing) +[metrics] Defined functions (4) + ===================== + baz (address taken) (0 call); foobar (0 call); foo (address taken) (0 call); + main (0 call); + + Undefined functions (0) + ======================= + + + Potential entry points (2) + ========================== + foobar; main; + + Global metrics + ============== + Sloc = 16 + Decision point = 1 + Global variables = 1 + If = 1 + Loop = 0 + Goto = 2 + Assignment = 7 + Exit point = 4 + Function = 4 + Function call = 2 + Pointer dereferencing = 2 + Cyclomatic complexity = -1 +[metrics] Functions syntactically reachable from main: 2 + ---------------------------------------------- + : foo; main; + + Functions syntactically unreachable from main: 2 + ------------------------------------------------ + : baz; foobar; +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + bar ∈ {0} +[value] Recording results for main +[value] done for function main +[metrics] Value coverage statistics + ========================= + Syntactically reachable functions = 2 (out of 4) + Semantically reached functions = 1 + Coverage estimation = 50.0% + + Unseen functions (1) = + : foo; +[metrics] References to non-analyzed functions + ------------------------------------ + Function main references foo (at tests/metrics/func_ptr.c:28) +[metrics] Statements analyzed by Value + ---------------------------- + 9 stmts in analyzed functions, 5 stmts analyzed (55.6%) + main: 5 stmts out of 9 (55.6%) diff -Nru frama-c-20140301+neon+dfsg/tests/metrics/oracle/reach.res.oracle frama-c-20150201+sodium+dfsg/tests/metrics/oracle/reach.res.oracle --- frama-c-20140301+neon+dfsg/tests/metrics/oracle/reach.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/metrics/oracle/reach.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,99 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/metrics/reach.c (with preprocessing) +[metrics] Cil AST + + Stats for function + ============================================== + Sloc = 1 + 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 + + Stats for function + ============================================== + Sloc = 2 + Decision point = 0 + Global variables = 0 + If = 0 + Loop = 0 + Goto = 0 + Assignment = 1 + Exit point = 1 + Function = 1 + Function call = 0 + Pointer dereferencing = 0 + Cyclomatic complexity = 1 + + Stats for function + =============================================== + Sloc = 10 + Decision point = 1 + Global variables = 0 + If = 1 + Loop = 0 + Goto = 2 + Assignment = 5 + Exit point = 1 + Function = 1 + Function call = 1 + Pointer dereferencing = 1 + Cyclomatic complexity = 2 +[metrics] Defined functions (3) + ===================== + baz (address taken) (0 call); foo (address taken) (0 call); main (0 call); + + Undefined functions (0) + ======================= + + + Potential entry points (1) + ========================== + main; + + Global metrics + ============== + Sloc = 13 + Decision point = 1 + Global variables = 2 + If = 1 + Loop = 0 + Goto = 2 + Assignment = 6 + Exit point = 3 + Function = 3 + Function call = 1 + Pointer dereferencing = 1 + Cyclomatic complexity = 0 +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + bar ∈ {0} + t[0] ∈ {{ &baz }} + [1] ∈ {0} +[value] Recording results for main +[value] done for function main +[metrics] Value coverage statistics + ========================= + Syntactically reachable functions = 3 (out of 3) + Semantically reached functions = 1 + Coverage estimation = 33.3% + + Unseen functions (2) = + : baz; foo; +[metrics] References to non-analyzed functions + ------------------------------------ + Function main references foo (at tests/metrics/reach.c:26) + Initializer of t references baz (at tests/metrics/reach.c:10) +[metrics] Statements analyzed by Value + ---------------------------- + 10 stmts in analyzed functions, 6 stmts analyzed (60.0%) + main: 6 stmts out of 10 (60.0%) diff -Nru frama-c-20140301+neon+dfsg/tests/metrics/oracle/unreachable.res.oracle frama-c-20150201+sodium+dfsg/tests/metrics/oracle/unreachable.res.oracle --- frama-c-20140301+neon+dfsg/tests/metrics/oracle/unreachable.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/metrics/oracle/unreachable.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,66 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/metrics/unreachable.c (with preprocessing) +[metrics] Defined functions (2) + ===================== + foo (1 call); main (0 call); + + Undefined functions (0) + ======================= + + + Potential entry points (1) + ========================== + main; + + Global metrics + ============== + Sloc = 10 + Decision point = 1 + Global variables = 0 + If = 1 + Loop = 0 + Goto = 2 + Assignment = 4 + Exit point = 2 + Function = 2 + Function call = 1 + Pointer dereferencing = 0 + Cyclomatic complexity = 1 +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[metrics] Value coverage statistics + ========================= + Syntactically reachable functions = 2 (out of 2) + Semantically reached functions = 1 + Coverage estimation = 50.0% + + Unseen functions (1) = + : foo; +[metrics] References to non-analyzed functions + ------------------------------------ + Function main calls foo (at tests/metrics/unreachable.c:16) +[metrics] Statements analyzed by Value + ---------------------------- + 8 stmts in analyzed functions, 5 stmts analyzed (62.5%) + main: 5 stmts out of 8 (62.5%) +[value] Analyzing a complete application starting at foo +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for foo +[value] done for function foo +[metrics] Value coverage statistics + ========================= + Syntactically reachable functions = 1 (out of 2) + Semantically reached functions = 1 + Coverage estimation = 100.0% +[metrics] Statements analyzed by Value + ---------------------------- + 2 stmts in analyzed functions, 2 stmts analyzed (100.0%) + foo: 2 stmts out of 2 (100.0%) diff -Nru frama-c-20140301+neon+dfsg/tests/metrics/test_config frama-c-20150201+sodium+dfsg/tests/metrics/test_config --- frama-c-20140301+neon+dfsg/tests/metrics/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/metrics/test_config 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1 @@ +OPT: -metrics Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/tests/minix/clock_task-dep.jpeg and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/tests/minix/clock_task-dep.jpeg differ diff -Nru frama-c-20140301+neon+dfsg/tests/misc/abstract_struct_1.c frama-c-20150201+sodium+dfsg/tests/misc/abstract_struct_1.c --- frama-c-20140301+neon+dfsg/tests/misc/abstract_struct_1.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/abstract_struct_1.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,5 +1,5 @@ /* run.config - STDOPT: +"tests/misc/abstract_struct_2.c" +"-lib-entry" + STDOPT: +"tests/misc/abstract_struct_2.c -lib-entry -value-msg-key initial_state" */ #include "share/libc/stdlib.h" diff -Nru frama-c-20140301+neon+dfsg/tests/misc/align_char_array.c frama-c-20150201+sodium+dfsg/tests/misc/align_char_array.c --- frama-c-20140301+neon+dfsg/tests/misc/align_char_array.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/align_char_array.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,8 +1,8 @@ /* run.config - OPT: -val -cpp-command "gcc -C -E -DPTEST" -journal-disable + OPT: -val -cpp-extra-args="-DPTEST" -journal-disable */ -// removed : OPT: -machdep ppc_32_diab -val -cpp-command "gcc -C -E -DPTEST" -journal-disable + #ifndef PTEST #include diff -Nru frama-c-20140301+neon+dfsg/tests/misc/alloc.c frama-c-20150201+sodium+dfsg/tests/misc/alloc.c --- frama-c-20140301+neon+dfsg/tests/misc/alloc.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/alloc.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -/* run.config - GCC: - OPT: -val -deps -out -input -journal-disable - OPT: -val -deps -out -input -absolute-valid-range 0x100-0x200 -main main_abs -journal-disable -*/ - -#define FRAMA_C_MALLOC_INDIVIDUAL -#include "share/libc/stdlib.c" - -int *p,*q,*r,a,b; -char *t,*u,*v; -char ch = 44; - -void main(int c, int d, int e) -{ - p = malloc(4); - t = malloc (10); - if (!c++) p[-1] = 0; - if (!c++) p[1] = 0; - if (!c++) t[-1] = 0; - if (!c++) t[10] = 0; - t[0] = t[9] = 'o'; - *p = 'k'; - - q = malloc(4);*q=0; - r = - (int) q; - *r = *(r+1); - - (*q)++; - a = *q; /* it is incorrect to find 1 here */ - - u = malloc(!d); - v = malloc(1 + !d); - *u = ch; - *u=33; - if (e & 1) u[1] = ch; - if (e & 2) u[1] = 34; - *v = ch; - *v=35; - v[1] = ch; - v[1]=36; - if (e & 4) v[2] = ch; - if (e & 8) v[2] = 37; -} - - -void main_abs(int c) -{ - - q = malloc(4);*q=0; - r = - (int) q; - - *(int*)0x104=0; - *r = r; - - (*q)++; - a = *q; /* it is incorrect to find 1 here */ -} - -void bug(int c) -{ - int a; - p = &a; - if (!c++) p[-1] = 0; - if (!c++) p[-1] = 0; - if (!c++) p[-1] = 0; - if (!c++) p[-1] = 0; -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/array_bounds.i frama-c-20150201+sodium+dfsg/tests/misc/array_bounds.i --- frama-c-20140301+neon+dfsg/tests/misc/array_bounds.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/array_bounds.i 2015-05-28 08:53:24.000000000 +0000 @@ -3,11 +3,23 @@ OPT: -unsafe-arrays -val -deps -out -input -journal-disable */ -struct { int a; int T[5]; int b; } s = {1,0,1,2,3,4,5}; +volatile int c; -void main(int c) { +struct { int a; int T[12]; int b; } s = {1,0,1,2,3,4,5,6,7,8,9,10,11,20}; +struct { int a; int T[12]; int b; } u = {1,0,1,2,3,4,5,6,7,8,9,10,11,20}; + +void main() { s.a = 9; s.b = 9; - for(int i=0; i+5<=10; i++) {s.T[i] = c;} + for(int i=0; i+5<17; i++) { + Frama_C_show_each(i); + u.T[i] = c; + } + if (c) { + for(int j=0; j+5<=17; j++) { + s.T[j] = c; // Invalid + } + u.a = -1; + } } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/array_initializer.i frama-c-20150201+sodium+dfsg/tests/misc/array_initializer.i --- frama-c-20140301+neon+dfsg/tests/misc/array_initializer.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/array_initializer.i 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,10 @@ +int t[5] = { [2] = 3 }; + +struct { char a; int t[5]; } s = { 'a' , { [2] = 3 } }; + +int u[6] = { [4] = 4, [2] = 2 }; + +void main(void) +{ + Frama_C_dump_each(); +} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/assigns_from.i frama-c-20150201+sodium+dfsg/tests/misc/assigns_from.i --- frama-c-20140301+neon+dfsg/tests/misc/assigns_from.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/assigns_from.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,234 @@ +/* run.config + STDOPT: +"-from-verify-assigns" +*/ +int u; +int v; +int k; + +void f(void) { + k = u; +} + +/*@ assigns u,k; + behavior true: + assumes u <= 3; + assigns u \from v; + assigns k \from \nothing; + behavior ok_too_large: + assumes u <= 3; + assigns u \from v,k; + assigns k \from u; + behavior wrong: + assumes \true; + assigns k \from \nothing; + assigns u \from u; + + +*/ +void main1(void) +{ + f(); + u = v; + k = 3; +} + +int a[10]; + +/*@ assigns a[3], a[4], a[5] \from \nothing; */ +void main15(void){ + a[3] = 2; + a[4] = 3; + a[5] = 4; +} + + +/*@ assigns a[3..5] \from \nothing; + behavior true: + assumes \true; + assigns a[2..5] \from a[..]; + + behavior wrongassigns: + assumes \true; + assigns a[3..4] \from \nothing; + + behavior true2: + assumes \true; + assigns a[..] \from a[..]; + + behavior wrongfrom: + assumes \true; + assigns a[1..] \from \nothing; */ +void main2(void){ + a[3] = 2; + a[4] = 3; + a[5] = 4; +} + +/*@ assigns a[i] \from i,a[..]; */ +void main3(int i){ + a[i] = 3; +} + + +int constante = 2; + +/*@ + + behavior true: + assigns a[constante] \from \nothing; + + behavior wrong: + assumes \true; + assigns a[..] \from a[i]; +*/ +/* This is correct: actually, only a[2] is assigned from \nothing. */ +void main4(int i){ + a[2] = 3; +} + +/*@ + behavior wrong: + assumes \true; + assigns a[..] \from a[i]; + + behavior true: + assigns a[2] \from a[sizeof(int)]; + +*/ +void main5(int i){ + a[2] = a[4]; +} + +/*@ assigns a[i..j]; */ +void main6_wrong(int i, int j){ + a[2] = 0; + a[3] = 0; + a[4] = 0; + a[5] = 0; + a[6] = 0; +} + +/*@ assigns a[i..j]; */ +void main6_right(int i, int j){ + a[3] = 0; + a[4] = 0; + a[5] = 0; +} + +/*@ behavior right: + assigns a[\union(2,7,8)]; + + behavior wrong: + assigns a[\union(2,7)]; */ +void main7(void){ + a[2] = 0; + a[7] = 0; + a[8] = 0; +} + + +/*@ assigns *p \from p; */ +void main8(int *p){ + *p = 4; +} + +/*@ assigns *(char *)\null; + assigns \empty; + assigns a[\union(1,\empty)]; + assigns a[1+2]; + assigns a[(int)1+2]; + */ +void main9(void) {} + +/*@ assigns \result \from a,b; + ensures a <= \result <= b; */ +extern int Frama_C_interval(int a,int b); + + +void main10(void){ + int t10[50]; + extern int c(void); + int i; + for( i = 0; i < 50; i++) { if(c()) t10[i] = 3; } + + /*@ assert \initialized( &t10[11..25] + (3..12)); */ +} + +/*@ assigns a[i == 4? 1 : 2] \from \nothing; */ +void main11(int i){ + a[2] = 3; +} + + +int t[100]; int* p_t = t; + +/*@ + behavior ok: + assigns \result \from \nothing; + */ +int * main12 (void) { return t; } + + +/*@ + behavior ok: + assigns \result \from p_t; + + behavior bad: + assigns \result \from \nothing; + */ +int * main13 (void) { return p_t; } + +/*@ assigns t[\union((2 .. 17) , (18 .. 38))] \from \nothing; */ +void main14(void){ + for(int i = 2; i <= 38; i++) {t[i] = i; } +} + +/*@ assigns t[\union((2..17),\union(1,19,18))] \from \nothing; */ +void main16(void){ + for(int i = 1; i <= 19; i++) {t[i] = i; } +} + +int t17[10]; + +//@ assigns *(char*)(&p[0..i-1]) \from p, i; +void main17(int *p, int i) { + for (int j = 0; j +unsigned int S; +unsigned int A,B; +#define SIZE 4 +#define TESTa(c, s, a) S=s, A=a +#define TESTb(c, s, a, b) S=s,A=a,B=b + +//-------------------------------------------------------------------- +struct c { + char ca; +}; + +static void ct(void) { + TESTa("c", sizeof(struct c), offsetof(struct c, ca)); + // : size : 01 + // gcc : 1 : |a| +} + +//-------------------------------------------------------------------- +struct d { + char da; +} __attribute__((__aligned__(SIZE))); + +static void dt(void) { + TESTa("d", sizeof(struct d), offsetof(struct d, da)); + // : size : 01234 + // gcc : 4 : |a---| +} + +//-------------------------------------------------------------------- +struct p { + char pa __attribute__((__aligned__(SIZE))); +}; + +static void pt(void) { + TESTa("p", sizeof(struct p), offsetof(struct p, pa)); + // : size : 01234 + // gcc : 4 : |a---| +} + +//-------------------------------------------------------------------- +struct q { + char qa __attribute__((__aligned__(SIZE))); + char qb; +}; + +static void qt(void) { + TESTb("q", sizeof(struct q), offsetof(struct q, qa), offsetof(struct q, qb)); + // : size : 01234 + // gcc : 4 : |ab--| +} + +//-------------------------------------------------------------------- +struct r { + char ra; + char rb __attribute__((__aligned__(SIZE))); +}; + +static void rt(void) { + TESTb("r", sizeof(struct r), offsetof(struct r, ra), offsetof(struct r, rb)); + // : size : 012345678 + // gcc : 8 : |a---b---| +} + +//-------------------------------------------------------------------- +struct s { + char sa __attribute__((__aligned__(SIZE))); + char sb __attribute__((__aligned__(SIZE))); +}; + +static void st(void) { + TESTb("s", sizeof(struct s), offsetof(struct s, sa), offsetof(struct s, sb)); + // : size : 012345678 + // gcc : 8 : |a---b---| +} + +//-------------------------------------------------------------------- +struct t { + char ta; + char tb[0] __attribute__((__aligned__(SIZE))); +}; + +static void tt(void) { + TESTb("t", sizeof(struct t), offsetof(struct t, ta), offsetof(struct t, tb)); + // : size : 012345678 : comment + // gcc : 4 : |a---| : b at offset 4, outside the struct + // frama-c : 8 : |a---b---| : b of size 1 instead of 0 +} + +//-------------------------------------------------------------------- + +int main(void) +{ + ct(); + dt(); + pt(); + qt(); + rt(); + st(); + tt(); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/bigarray.c frama-c-20150201+sodium+dfsg/tests/misc/bigarray.c --- frama-c-20140301+neon+dfsg/tests/misc/bigarray.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/bigarray.c 2015-05-28 08:53:24.000000000 +0000 @@ -5,14 +5,8 @@ int main(int c) { int i; if (c) *(char*)S = 'E'; - for(i=0; i < SIZE/4; i++) + if (c) for(i=0; i < SIZE/4; i++) *(int*)&T[i] = 1; - for(i=0; i< SIZE/8; i++) - *(int*)&T[i] = 1; - for(i=0; i< SIZE/16; i++) - *(int*)&T[i] = 1; - for(i=0; i< SIZE/32; i++) - *(int*)&T[i] = 1; return 0; } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/bitfield_longlong.c frama-c-20150201+sodium+dfsg/tests/misc/bitfield_longlong.c --- frama-c-20140301+neon+dfsg/tests/misc/bitfield_longlong.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/bitfield_longlong.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,5 +1,5 @@ /* run.config - OPT: -val -cpp-command "gcc -C -E -Dprintf=Frama_C_show_each" -journal-disable + OPT: -val -cpp-extra-args="-Dprintf=Frama_C_show_each" -journal-disable */ struct X50 { long long int z:50; diff -Nru frama-c-20140301+neon+dfsg/tests/misc/bitwise_or.c frama-c-20150201+sodium+dfsg/tests/misc/bitwise_or.c --- frama-c-20140301+neon+dfsg/tests/misc/bitwise_or.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/bitwise_or.c 2015-05-29 15:31:43.000000000 +0000 @@ -30,6 +30,10 @@ unsigned i2 = s * 4; unsigned v1 = i1 & i2; unsigned v2 = i1 | i2; + + unsigned mask07 = (16 * s + 13) & 0x7; + unsigned mask0f = (16 * s + 13) & 0xF; + unsigned mask1f = (16 * s + 13) & 0x1F; return 0; } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/cabscond.c frama-c-20150201+sodium+dfsg/tests/misc/cabscond.c --- frama-c-20140301+neon+dfsg/tests/misc/cabscond.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/cabscond.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -/* run.config - DONTRUN: not robust enough + require native dynlink - OPT: -load-script tests/misc/cabscond_script.ml -print -*/ -/* run.config_cabscond - OPT: -load-script tests/misc/cabscond_script.ml -print -*/ - -// Tests with: -// ptests tests/misc/cabscond.c -config cabscond - -int f(int); -int test(int a,int b,int c) -{ - - if ( (f(a) && !f(b)) || f(c) ) - { return 0; } - else - { return 1; } - - if ( (f(a) && !f(a)) || f(a) ) - { return 0; } - else - { return 1; } - - while ( (f(a) && !f(a)) || f(c) ) - { return 0; } - - for ( a=0 ; (f(a) && !f(b)) || f(c) ; a+=c ) - { return 0; } - -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/cabscond_script.ml frama-c-20150201+sodium+dfsg/tests/misc/cabscond_script.ml --- frama-c-20140301+neon+dfsg/tests/misc/cabscond_script.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/cabscond_script.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - -let () = Cabscond.active := true -let () = Db.Main.extend Cabsbranches.compute diff -Nru frama-c-20140301+neon+dfsg/tests/misc/call.i frama-c-20150201+sodium+dfsg/tests/misc/call.i --- frama-c-20140301+neon+dfsg/tests/misc/call.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/call.i 2015-05-28 08:53:24.000000000 +0000 @@ -16,8 +16,8 @@ @*/ void main(int c, char **v) { - if (c&1) leaf_fun_int(v[2]); - if (c&2) leaf_fun_charp(v[2]); + if (c&1) leaf_fun_int(v[1]); + if (c&2) leaf_fun_charp(v[1]); int lcount= 0; res= 1111; for (lcount=0; lcount<=6; lcount++) diff -Nru frama-c-20140301+neon+dfsg/tests/misc/cast_return.c frama-c-20150201+sodium+dfsg/tests/misc/cast_return.c --- frama-c-20140301+neon+dfsg/tests/misc/cast_return.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/cast_return.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,6 +1,6 @@ /* run.config - STDOPT: - STDOPT: +"-no-collapse-call-cast" + STDOPT: +"-print -then -val-warn-copy-indeterminate @all -no-print" + STDOPT: +"-print -no-collapse-call-cast" */ extern int i; @@ -21,7 +21,7 @@ return 1; } -void main () { +void main1 () { if(c) {float f_ = f();} if(c) {long long v = g();} @@ -32,3 +32,26 @@ } } +float fl1 () { + float v; + *(char*)&v = 1; + return v; +} + +float fl2 () { + float v; + if (c) v = 1; + return v; +} + +void main2() { + double d1; + double d2; + if (c) { d1 = fl1(); } + d2 = fl2(); +} + +void main() { + main1(); + main2(); +} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/cfg.i frama-c-20150201+sodium+dfsg/tests/misc/cfg.i --- frama-c-20140301+neon+dfsg/tests/misc/cfg.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/cfg.i 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -/* run.config - DONTRUN: cannot find entry point: main -*/ - -struct bar { - int x; -}; -struct foo { - struct bar b; - int y; -}; - -int rand(void); - -void f(void) { - int t = rand(); - struct foo f = { - .b = { - .x = (t?2:3), - }, - .y = 42 - }; - return; -} - diff -Nru frama-c-20140301+neon+dfsg/tests/misc/cmp_ptr_follow_all_branches.i frama-c-20150201+sodium+dfsg/tests/misc/cmp_ptr_follow_all_branches.i --- frama-c-20140301+neon+dfsg/tests/misc/cmp_ptr_follow_all_branches.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/cmp_ptr_follow_all_branches.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +/* run.config + OPT: -val -deps -out -input -journal-disable + OPT: -val -deps -out -input -journal-disable -undefined-pointer-comparison-propagate-all +*/ + +int a; + +char *p = &a; +int *q = &a; + +typedef unsigned int size_t; + +int main() { + if ( (p + (size_t) -5) < p ) Frama_C_show_each_1(); else Frama_C_show_each_2(); + if ( (q + (size_t) -5) < q ) Frama_C_show_each_3(); else Frama_C_show_each_4(); +} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/cond_integer_cast_of_float.i frama-c-20150201+sodium+dfsg/tests/misc/cond_integer_cast_of_float.i --- frama-c-20140301+neon+dfsg/tests/misc/cond_integer_cast_of_float.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/cond_integer_cast_of_float.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,10 +1,12 @@ /* run.config OPT: -val -no-results -then -float-hex -main mainbis */ +typedef double D; +typedef float F; int b; -extern float f1, f2, f3, f4; -extern double d1, d2, d3; +extern F f1, f2, f3, f4; +extern D d1, d2, d3; extern int i; volatile unsigned int c; @@ -72,14 +74,19 @@ } void main2() { - if ((double)f1 > 1.17) { - Frama_C_show_each_float_(f1); + if ((double)f1 > 1.17) { // f1 should be a float afterwards + Frama_C_dump_each(); // dump_each because show_each cast to float itself... + if (! ((double)f1 > 1.17)) Frama_C_show_each_not_ok_f1(f1); + } else { + Frama_C_dump_each(); } if (d1 > (float)1.17) { Frama_C_show_each_double(d1); + if (! ((double)d1 > (float)1.17)) Frama_C_show_each_not_ok_d1(f1); } if (d2 > 1.17) { Frama_C_show_each_double(d2); + if (! ((double)d2 > 1.17)) Frama_C_show_each_not_ok_d2(f1); } } @@ -116,6 +123,8 @@ main2 (); break; case 3: main3 (); break; + case 4: + main3 (); break; } } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/const.i frama-c-20150201+sodium+dfsg/tests/misc/const.i --- frama-c-20140301+neon+dfsg/tests/misc/const.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/const.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,57 +1,94 @@ /* run.config - GCC: - OPT: -val -deps -out -input -journal-disable - OPT: -val -deps -out -input -main semantique_const_1 -journal-disable - OPT: -val -deps -out -input -main semantique_const_2 -journal-disable - OPT: -val -deps -out -input -lib-entry -main semantique_const_1 -journal-disable - OPT: -val -deps -out -input -lib-entry -main semantique_const_2 -journal-disable + OPT: -const-writable -val -deps -out -input -journal-disable -then -const-readonly */ extern const int G; -extern int H; -extern int F; extern const int I=2; +int J = 8; -int G; -int H; - +volatile v; int X; -int main () { - H++; - I++; - return G+F; +const struct { + int i1; + int i2; +} s = { 3, 4}; + +const int t[10] = {1, 2, 3, 4, 5, 6}; + +void const_formal(int const i) +{ + Frama_C_show_each(i); + if (v) i = 0; +} + +void pointer_to_const(const int *p) { + Frama_C_show_each(*p); + *p = 0; // Invalid access through the formal itself + Frama_C_show_each_dead(); +} + +void const_destination(int *p) { + Frama_C_show_each(*p); + *p = 0; // Invalid access through the variable pointed + Frama_C_show_each(p); } -/** Comportement des analyses au sujet des variables "const" et "non const" : - * - * Les valeurs des variables "const" peuvent voluer au cours de l'excution - * du code, comme pour toutes autres variables. - * - * Lors d'une analyse de type -lib-entry -main, les variables "const" ont pour - * valeurs initiales, la valeur correspondant leur expression d'initialisation. - * - * Les valeurs initiales des autres variables sont d'une valeur indertermine, mais - * dpendant de leur type. - */ -int cste const = 10 ; -int var = 3 ; +void modify_I (){ + Frama_C_show_each(I); + if (v) I++; + if (v) pointer_to_const(&I); + if (v) const_destination(&I); +} -int input_value_of_cste, output_value_of_cste ; +void modify_J (){ + Frama_C_show_each(J); + if (v) J++; + if (v) pointer_to_const(&J); + if (v) const_destination(&J); +} -void semantique_const_1 (void) { - input_value_of_cste = cste ; +void modify_s (){ + Frama_C_show_each(s.i1); + if (v) s.i1 ++; + if (v) pointer_to_const(&s.i2); + if (v) const_destination(&s.i2); +} - cste = var ; +void modify_t(){ + Frama_C_show_each(t[5]); + if (v) t[5] ++; + if (v) pointer_to_const(&t[3]); + if (v) const_destination(&t[2]); - output_value_of_cste = cste ; +} +// we can reduce G, even though it is constant +void constrain_G () { + int r; + if (G == 1) { + r = G + 2; + } else { + //@ assert G == 4; + r = G + 1; + } + Frama_C_show_each(G); } -void semantique_const_2 (void) { - const int cste = 10 ; - input_value_of_cste = cste ; +// Validity in the logic must correspond to the C part: check that the l-value +// is not const +void pointer_to_const_logic(const int *p) { + if (v) *p = 12; +} - cste = var ; +void main () { + const_formal(G); + const_formal(42); + + modify_I(); + modify_J(); + modify_s(); + modify_t(); + constrain_G (); - output_value_of_cste = cste ; + pointer_to_const_logic (&J); } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/context_free.i frama-c-20150201+sodium+dfsg/tests/misc/context_free.i --- frama-c-20140301+neon+dfsg/tests/misc/context_free.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/context_free.i 2015-05-29 15:31:43.000000000 +0000 @@ -1,6 +1,6 @@ /* run.config GCC: - OPT: -val -lib-entry -main f -absolute-valid-range 0x200-0x199 -journal-disable + OPT: -val -lib-entry -main f -absolute-valid-range 0x200-0x199 -value-msg-key initial_state -journal-disable */ @@ -26,7 +26,7 @@ union uni_arith { int u1 ; struct str_arith u2 ; float u3 ; } uuu ; -const int c_int = 34; +int c_int = 34; extern struct { int f1; diff -Nru frama-c-20140301+neon+dfsg/tests/misc/copy_machdep.i frama-c-20150201+sodium+dfsg/tests/misc/copy_machdep.i --- frama-c-20140301+neon+dfsg/tests/misc/copy_machdep.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/copy_machdep.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,5 +1,5 @@ /* run.config -EXECNOW: make -s @PTEST_DIR@/Copy_machdep.cmxs +EXECNOW: make -s @PTEST_DIR@/@PTEST_NAME@.cmxs OPT: -load-module @PTEST_DIR@/@PTEST_NAME@ -machdep x86_64 -enums int -no-unicode */ diff -Nru frama-c-20140301+neon+dfsg/tests/misc/copy_machdep.ml frama-c-20150201+sodium+dfsg/tests/misc/copy_machdep.ml --- frama-c-20140301+neon+dfsg/tests/misc/copy_machdep.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/copy_machdep.ml 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,17 @@ +let run () = + let proj = + File.create_project_from_visitor "machdep" + (fun prj -> new Visitor.frama_c_copy prj) + in + Kernel.feedback "Machdep is %spreserved" + (if Kernel.Machdep.get () = Project.on proj Kernel.Machdep.get () then + "" else "not "); + Kernel.feedback "Enums is %spreserved" + (if Kernel.Enums.get () = Project.on proj Kernel.Enums.get () then + "" else "not "); + Kernel.feedback "Unicode is %spreserved" + (if Kernel.Unicode.get () = Project.on proj Kernel.Unicode.get () then + "" else "not ") + +let () = Db.Main.extend run + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/Copy_machdep.ml frama-c-20150201+sodium+dfsg/tests/misc/Copy_machdep.ml --- frama-c-20140301+neon+dfsg/tests/misc/Copy_machdep.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/Copy_machdep.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -let run () = - let proj = - File.create_project_from_visitor "machdep" - (fun prj -> new Visitor.frama_c_copy prj) - in - Kernel.feedback "Machdep is %spreserved" - (if Kernel.Machdep.get () = Project.on proj Kernel.Machdep.get () then - "" else "not "); - Kernel.feedback "Enums is %spreserved" - (if Kernel.Enums.get () = Project.on proj Kernel.Enums.get () then - "" else "not "); - Kernel.feedback "Unicode is %spreserved" - (if Kernel.Unicode.get () = Project.on proj Kernel.Unicode.get () then - "" else "not ") - -let () = Db.Main.extend run - diff -Nru frama-c-20140301+neon+dfsg/tests/misc/copy_paste.i frama-c-20150201+sodium+dfsg/tests/misc/copy_paste.i --- frama-c-20140301+neon+dfsg/tests/misc/copy_paste.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/copy_paste.i 2015-05-28 08:53:24.000000000 +0000 @@ -6,6 +6,6 @@ int j=c?(-3):4; t[i] = i; t[j] = j; - l = *(int*)l; + if (l) l = *(int*)l; G=l; } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/dangling.i frama-c-20150201+sodium+dfsg/tests/misc/dangling.i --- frama-c-20140301+neon+dfsg/tests/misc/dangling.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/dangling.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +volatile int v; + +void main() { + int* x, y; + y = 1; + + if (v) { + int v; + x = &v; + } else { + x = &y; + } + + if (v) { + //@ assert !\dangling(&x); + //@ assert !\dangling(&x); + } + if (v) { + int i = *x + 1; + int j = *x + 2; + } + if (v) { + //@ assert \dangling(&x); + int j = *x + 1; + } +} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/debug_category.i frama-c-20150201+sodium+dfsg/tests/misc/debug_category.i --- frama-c-20140301+neon+dfsg/tests/misc/debug_category.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/debug_category.i 2015-05-28 08:53:24.000000000 +0000 @@ -2,8 +2,8 @@ EXECNOW: make -s tests/misc/Debug_category.cmxs OPT: -load-module tests/misc/Debug_category.cmxs -test-msg-key help OPT: -load-module tests/misc/Debug_category.cmxs -test-msg-key a -OPT: -load-module tests/misc/Debug_category.cmxs -test-msg-key a -test-msg-key-unset a:b -OPT: -load-module tests/misc/Debug_category.cmxs -test-msg-key a -test-msg-key-unset a:b -test-msg-key a:b:c +OPT: -load-module tests/misc/Debug_category.cmxs -test-msg-key a -test-msg-key="-a:b" +OPT: -load-module tests/misc/Debug_category.cmxs -test-msg-key a -test-msg-key="-a:b" -test-msg-key a:b:c OPT: -load-module tests/misc/Debug_category.cmxs -test-msg-key "a:b:c,d" OPT: -load-module tests/misc/Debug_category.cmxs -test-msg-key "*" */ diff -Nru frama-c-20140301+neon+dfsg/tests/misc/Debug_category.ml frama-c-20150201+sodium+dfsg/tests/misc/Debug_category.ml --- frama-c-20140301+neon+dfsg/tests/misc/Debug_category.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/Debug_category.ml 2015-05-28 08:53:24.000000000 +0000 @@ -26,4 +26,3 @@ feedback ~dkey "D is enabled" let () = Db.Main.extend run - diff -Nru frama-c-20140301+neon+dfsg/tests/misc/degeneration2.i frama-c-20150201+sodium+dfsg/tests/misc/degeneration2.i --- frama-c-20140301+neon+dfsg/tests/misc/degeneration2.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/degeneration2.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,3 +1,8 @@ +/* The name of this file is probably historical, as Value no longer degenerates + on anything in it */ + +volatile v; + void main (int c,int d) { void *A,*B,*C,*D, *E; @@ -16,6 +21,7 @@ char T[10][10]; int x = (d<=10)?((d>=0)?d:0):0; - int vv = T[x][offset_uninit]; - + if (v) { + int vv = T[x][offset_uninit]; + } } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/degeneration.i frama-c-20150201+sodium+dfsg/tests/misc/degeneration.i --- frama-c-20140301+neon+dfsg/tests/misc/degeneration.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/degeneration.i 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - -void main(char c) { - int **p; - int * pp = *p; - int ppp = **p; - int pppp = ppp; - int *qq = (c?&ppp:&pppp); - int qqq = *qq; - - int q = **p+1; - **p=1; -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/deps_unitialized_locals.i frama-c-20150201+sodium+dfsg/tests/misc/deps_unitialized_locals.i --- frama-c-20140301+neon+dfsg/tests/misc/deps_unitialized_locals.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/deps_unitialized_locals.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,40 @@ +/* run.config + STDOPT: +"-calldeps" +*/ +volatile maybe; + +typedef struct { + short ts; + int ti; +} typ; + +typ v1, v2; +int v; + +void f() { + typ ty = {1, 2}; + v1 = ty; // Dependency for the padding between ts and ti +} + +void g() { + int i; + if (maybe) + i = 1; + v = i; +} + +void h(int i) { + if (maybe) + i = 1; + v = i; +} + +void main() { + f(); + v2 = v1; // Dependency must not leak there + + g(); + + int x = 1; + h(x); +} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/div.i frama-c-20150201+sodium+dfsg/tests/misc/div.i --- frama-c-20140301+neon+dfsg/tests/misc/div.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/div.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,6 +1,6 @@ /* run.config STDOPT: +"-remove-redundant-alarms" - OPT: -rte-all -rte -then -val -remove-redundant-alarms + OPT: -rte-all -rte -then -val */ int X,Y,Z1,Z2,T,U1,U2,V,W1,W2; int a,b,d1,d2,d0,e; diff -Nru frama-c-20140301+neon+dfsg/tests/misc/empty_struct.c frama-c-20150201+sodium+dfsg/tests/misc/empty_struct.c --- frama-c-20140301+neon+dfsg/tests/misc/empty_struct.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/empty_struct.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,60 @@ +/* run.config + STDOPT: +" -cpp-extra-args=-DP1 -val -then -lib-entry" + STDOPT: +" -cpp-extra-args=-DP2 -lib-entry" + STDOPT: +" -cpp-extra-args=-DP3 -lib-entry" +*/ + +// BTS 1416 and 1874 + +struct s {}; +struct s2 { int i1; struct s s; int i2; }; + +#define S struct s s; +#define S2 struct s2 s2; +#define T struct s t[10]; + +// Reorder the variables so that we get an error for each one +#ifdef P1 +S // direct empty struct +S2 +T +#endif + +#ifdef P2 +S2 // empty struct inside a struct +S +T +#endif + +#ifdef P3 +T // array of empty struct +S2 +S +#endif + +void main() { + void *p = &s; + s2.s = s; + t[0] = t[1]; +} + +#ifdef P4 // Original example of bts 1874. Not explicitly tested, as the core functionality is checked by the tests above +struct lock_class_key {}; /* pas de struct-declaration-list */ + +struct dentry { + struct super_block *d_sb; +}; + +void task_pgrp_nr_ns(struct dentry x); + +extern struct dentry a; + +struct super_block { + struct lock_class_key s_writers_key[4]; +} task_pgrp_nr(void) { + task_pgrp_nr_ns(a); + /* pas de return */ +} + +void main(); +#endif diff -Nru frama-c-20140301+neon+dfsg/tests/misc/enum2.c frama-c-20150201+sodium+dfsg/tests/misc/enum2.c --- frama-c-20140301+neon+dfsg/tests/misc/enum2.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/enum2.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,6 +1,6 @@ /* run.config GCC: - OPT: -check -cpp-command "gcc -C -E -I. %1 -o %2" -val -deps -out -input -journal-disable + OPT: -check -cpp-gnu-like -cpp-command "gcc -C -E -I. %1 -o %2" -val -deps -out -input -journal-disable */ /* This test of enums doubles with a test of the % syntax in -cpp-command */ diff -Nru frama-c-20140301+neon+dfsg/tests/misc/exception.i frama-c-20150201+sodium+dfsg/tests/misc/exception.i --- frama-c-20140301+neon+dfsg/tests/misc/exception.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/exception.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,39 @@ +/* run.config + EXECNOW: make -s @PTEST_DIR@/@PTEST_NAME@.cmxs + OPT: -load-module @PTEST_DIR@/@PTEST_NAME@ -print + OPT: -load-module @PTEST_DIR@/@PTEST_NAME@ -remove-exn -print + */ +struct my_exn { int e; }; + +struct my_exn2 { char c; }; + +struct my_exn foo; + +struct my_exn2 bar; + +int x = 42; + +int f1 (int c) { + return c; +} + +/*@ ensures \result == c+1; */ +int f2 (int c) { + return c+1; +} + +int f3 (int c) { + return c+2; +} + +int f4 (int c) { + return c+3; +} + +/*@ ensures \result != 42; */ +int h(int c) { + if (c-1<=0) return f1(c); + else if (c-100<=0) /*@ returns \result == c+1; */ return f2(c); + else if (c>360) return f3(c); + else return f4(c); +} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/exception.ml frama-c-20150201+sodium+dfsg/tests/misc/exception.ml --- frama-c-20140301+neon+dfsg/tests/misc/exception.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/exception.ml 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,128 @@ +open Cil_types + +let rec init_exn exn init acc = + match init with + | SingleInit init -> + Cil.mkStmtOneInstr (Set(exn,init,Cil_datatype.Location.unknown)) + :: acc + | CompoundInit (ct,initl) -> + Cil.foldLeftCompound + ~implicit:false + ~doinit:(fun off' i' _ acc -> + init_exn (Cil.addOffsetLval off' exn) i' acc) + ~ct ~initl ~acc + +let add_throw_test f exn_type test init = + let throw_block = Cil.mkBlock [] in + let exn = Cil.makeLocalVar f ~scope:throw_block "exn" exn_type in + let valid_sid = true in + let set_exn_stmts = init_exn (Var exn, NoOffset) init [] in + let loc = Cil_datatype.Location.unknown in + let throw_stmt = + Cil.mkStmt + ~valid_sid + (Throw (Some (Cil.evar ~loc exn, exn_type), loc)) + in + throw_block.bstmts <- List.rev (throw_stmt :: set_exn_stmts); + let new_body = Cil.mkStmt ~valid_sid (If(test, throw_block, f.sbody,loc)) in + f.sbody <- Cil.mkBlock [ new_body ] + +let add_my_exn my_exn f = + let c = Cil.evar (List.hd f.sformals) in + let exn_type = TComp(my_exn,{ scache = Not_Computed},[]) in + let loc = Cil_datatype.Location.unknown in + let init = + CompoundInit( + exn_type, + [Field(List.hd my_exn.cfields, NoOffset), SingleInit (Cil.zero ~loc)]) + in + add_throw_test f exn_type c init + +let add_int_exn f = + let c = Cil.evar (List.hd f.sformals) in + let loc = Cil_datatype.Location.unknown in + let test = + Cil.new_exp ~loc (BinOp (Lt,c,Cil.kinteger ~loc IInt 50,Cil.intType)) + in + add_throw_test f Cil.intType test (SingleInit (Cil.zero ~loc)) + +let add_int_ptr_exn glob f = + let c = Cil.evar (List.hd f.sformals) in + let loc = Cil_datatype.Location.unknown in + let test = + Cil.new_exp ~loc (BinOp (Gt,c,Cil.kinteger ~loc IInt 150, Cil.intType)) + in + let init = + SingleInit (Cil.new_exp ~loc (AddrOf(Var glob,NoOffset))) + in + add_throw_test f Cil.intPtrType test init + +let add_catch my_exn my_exn2 f = + let exn_type = TComp(my_exn, { scache = Not_Computed }, []) in + let exn_type2 = TComp(my_exn2, {scache = Not_Computed }, []) in + let exn_field = Field (List.hd my_exn.cfields, NoOffset) in + let exn2_field = Field (List.hd my_exn2.cfields, NoOffset) in + let loc = Cil_datatype.Location.unknown in + let v1 = Cil.makeLocalVar f "exn" exn_type in + let v2 = Cil.makeLocalVar f "y" Cil.intType in + let v3 = Cil.makeLocalVar f "exn_aux" exn_type in + let v4 = Cil.makeLocalVar f "exn2" exn_type2 in + let id_block = + Cil.mkBlock [Cil.mkStmtOneInstr (Set (Cil.var v1, Cil.evar ~loc v3, loc))] + in + let convert_exn_block = + Cil.mkBlock + [ Cil.mkStmtOneInstr + (Set ((Var v1, exn_field), + Cil.new_exp ~loc (Lval (Var v4, exn2_field)), + loc))] + in + let catch_stmt = + Cil.mkStmt + (TryCatch( + f.sbody, + [ Catch_exn (v1,[(v3,id_block); (v4, convert_exn_block)]), + Cil.mkBlock + [ Cil.mkStmt + (Return + (Some (Cil.new_exp ~loc (Lval (Var v1, exn_field))), + loc))]; + Catch_exn (v2,[]), + Cil.mkBlock + [ Cil.mkStmt (Return (Some (Cil.evar ~loc v2),loc))]], + loc)) + in + f.sbody <- Cil.mkBlock [ catch_stmt ] + +let change_body my_exn my_exn2 glob f = + match f.svar.vname with + | "f1" -> add_my_exn my_exn f + | "f2" -> add_int_exn f + | "f3" -> add_int_ptr_exn glob f + | "f4" -> add_my_exn my_exn2 f + | "h" -> add_catch my_exn my_exn2 f + | _ -> () + +let add_exn ast = + let my_exn = ref None in + let my_exn2 = ref None in + let glob = ref None in + let treat_glob = + function + | GCompTag(ci,_) -> + (match !my_exn with + | None -> my_exn := Some ci + | Some _ -> my_exn2 := Some ci) + | GVar(v,_,_) when v.vname = "x" -> glob := Some v + | GFun(f,_) -> + change_body + (Extlib.the !my_exn) (Extlib.the !my_exn2) (Extlib.the !glob) f + | _ -> () + in + List.iter treat_glob ast.globals + +let add_exn_cat = File.register_code_transformation_category "add_exn" + +let () = File.add_code_transformation_before_cleanup add_exn_cat add_exn + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/extern.i frama-c-20150201+sodium+dfsg/tests/misc/extern.i --- frama-c-20140301+neon+dfsg/tests/misc/extern.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/extern.i 2015-05-28 08:53:24.000000000 +0000 @@ -7,6 +7,12 @@ extern int T5[3]; extern const int T6[3]; volatile int c; + +extern struct fma { + char nb; + int t[]; +} s; + void main () { // T1++; // T2++; @@ -14,5 +20,5 @@ if (c) T2= T4[3]; T1= T5[1]; T2= T6[1]; - + s.nb = 1; } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/for_loops.c frama-c-20150201+sodium+dfsg/tests/misc/for_loops.c --- frama-c-20140301+neon+dfsg/tests/misc/for_loops.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/for_loops.c 2015-05-29 15:31:43.000000000 +0000 @@ -3,7 +3,7 @@ STDOPT: +"-main main_2" STDOPT: +"-main g" */ -#include "share/libc/__fc_builtin.c" +#include "share/libc/__fc_builtin.h" int x; int f(); diff -Nru frama-c-20140301+neon+dfsg/tests/misc/from_result.c frama-c-20150201+sodium+dfsg/tests/misc/from_result.c --- frama-c-20140301+neon+dfsg/tests/misc/from_result.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/from_result.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -/* run.config - OPT: -deps -journal-disable -*/ -#define FRAMA_C_MALLOC_INFINITE -#include "../../share/libc/stdlib.c" - -struct T { int a; int b; }; - -/*@ assigns \result.b \from x; - @ assigns \result.a \from y; */ -struct T create_t(int x, int y); - -/*@ assigns \result.a \from x; - @ assigns \result.b \from y; */ -struct T create_t1(int x, int y); - -int* bar (int x) { - int* ax = (int *)malloc(sizeof(int)); - *ax = x; - return ax; -} - -void change_t(struct T* t0, int x, int y) { - t0->a = x; - t0->b = y; -} - -int main() { - int* t = bar(0); - int* t1 = bar(1); - struct T v = create_t(*t,*t1); - struct T v1 = create_t1(*t,*t1); - change_t(&v,0,0); - return 0; -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/global_bug.i frama-c-20150201+sodium+dfsg/tests/misc/global_bug.i --- frama-c-20140301+neon+dfsg/tests/misc/global_bug.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/global_bug.i 2015-05-29 15:31:43.000000000 +0000 @@ -1,3 +1,7 @@ +/* run.config + STDOPT: +"-load-module lib/plugins/Report -then -report" +*/ + int i = 1; int G[2] = {99<<63, 1}; diff -Nru frama-c-20140301+neon+dfsg/tests/misc/imprecise.c frama-c-20150201+sodium+dfsg/tests/misc/imprecise.c --- frama-c-20140301+neon+dfsg/tests/misc/imprecise.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/imprecise.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,98 +0,0 @@ -/* run.config - STDOPT: +" -absolute-valid-range 100-200 -then -lib-entry" - */ -struct s; - -//@ assigns *p \from \nothing; -void f(struct s *p); - -void invalid_assigns_imprecise() { - struct s *p = 0; - f(p); // p is invalid, but could be considered valid since sizeof(*p) = Top -} - -void write_garbled() { // Write through a garbled mix - int i = 1; - int j = 2; - int k[5] = { 2, 3}; - - int *p = &j + (int) &k; - *p = 1; - Frama_C_dump_each(); - *p = p; -} - -volatile int v; - -struct s v1, v2; -struct u v3, v5; -struct s t[10]; -// struct ss { struct s f1; int f2; }; Does not parse -struct sc { - struct sct t[2]; - int sci; -} v6; -struct sc tsc[5]; -//@ assigns p[0..size-1] \from c; -void Frama_C_memset(unsigned char*p, int c, unsigned long size); - -void abstract_structs() { - char *p = &v1; - if (v) { - char w1 = *p+1; - } - if (v) { - char w = *p; - } - if (v) { - struct s v4 = v1; - } - *p = 1; - char q = *p; - if (v) { - v1 = v2; - } - v2 = v1; - Frama_C_memset(&v3, -5, sizeof(v3)); - int *p2 = ((int*)&v2)+1; - *p2 = &v; - t[5] = v2; - char *p4 = ((char*)&v5) + (short)v; - *p4 = 18; - char *p5 = ((char*)&v5) + (signed int)v; - *p5 = 19; - char *p6 = ((char*)&v5) + (unsigned int)v; - *p6 = 20; - v6.sci = 1; - v6.sci = &v; - tsc[2].sci = 1; -} - -void cast_address() { - int x; - int *p = &x; - char c1 = p; - char c2 = *((char*)&p); - char c3 = *((char*)&p)+0; -} - -int **p_gm_null; -void * gm_f1 (); - -void garbled_mix_null () { - p_gm_null = gm_f1(); - Frama_C_dump_each(); - gm_f2(*p_gm_null); // Corrupts all the null base - Frama_C_dump_each(); // Joining the state with the previous call to - // Frama_C_dump_each may cause a crash is the offsetmap - // for NULL is invalid -} - - -void main() { - invalid_assigns_imprecise(); - write_garbled(); - abstract_structs(); - cast_address(); - garbled_mix_null(); -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/init_const_guard.i frama-c-20150201+sodium+dfsg/tests/misc/init_const_guard.i --- frama-c-20140301+neon+dfsg/tests/misc/init_const_guard.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/init_const_guard.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,36 @@ +/*run.config + STDOPT: +"-report -main f -then -main g -then -lib-entry -main f -then -main g" +*/ + +/** Same test exists in WP tests. Please keep synchronized */ + + + +int x ; +int * const q = &x ; +const int * p = &x ; + +/*@ + ensures Const: q == &x ; + ensures Pointed_Valid: \valid(q); + ensures Q_ReadOnly: \valid_read(&q); + ensures Q_NotWrite: !\valid(&q); +*/ +int f(void) +{ + return 0; +} + +volatile v; + +/*@ + ensures P_not_Const: \valid(&p); +*/ +void g(void) +{ + p = &x ; + //@ assert Read: \valid_read(p); + //@ assert Guard_against_Const: !\valid(p); + if (v) + *p = 2 ; // SHOULD BE A RUNTIME ERROR +} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/init.i frama-c-20150201+sodium+dfsg/tests/misc/init.i --- frama-c-20140301+neon+dfsg/tests/misc/init.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/init.i 2015-05-28 08:53:24.000000000 +0000 @@ -6,7 +6,7 @@ const char S[5] = "12345"; struct t1 { int x; int y; int name[10];} v1; -struct t1 TS[29] = {1,3,01234567890}; +struct t1 TS[29] = {1,3,01234570110}; struct t2 { int x2; short int y2; char *ptr;} v2; char C; char PC[]= "lkjlj"; diff -Nru frama-c-20140301+neon+dfsg/tests/misc/initialized.c frama-c-20150201+sodium+dfsg/tests/misc/initialized.c --- frama-c-20140301+neon+dfsg/tests/misc/initialized.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/initialized.c 2015-05-29 15:31:43.000000000 +0000 @@ -23,19 +23,19 @@ i=Frama_C_interval(3,6); j=Frama_C_interval(12,15); - //@ assert \initialized(&t3[i..j]); + //@ assert \initialized(&t3[i..j]); // under: t3[6..12]; over t3[3..15] i=Frama_C_interval(3,7); j=Frama_C_interval(7,15); - //@ assert \initialized(&t4[i..j]); + //@ assert \initialized(&t4[i..j]); // under t4[7]; over t4[3..15] i=Frama_C_interval(7,9); j=Frama_C_interval(4,6); - //@ assert \initialized(&t5[i..j]); + //@ assert \initialized(&t5[i..j]); // Empty range i=Frama_C_interval(7,9); j=Frama_C_interval(4,7); - //@ assert \initialized(&t6[i..j]); + //@ assert \initialized(&t6[i..j]); // t6[7] or empty } void g2() { @@ -96,7 +96,7 @@ r3 = x3 + 1; f(b6, &t1, 4); - f(b6, &t2, 250); + f(b6, &t2, 250); // above plevel } void g4() { @@ -133,11 +133,28 @@ //@ assert \initialized(p); } +extern int i6; + +void g6() { + int i; + + if (rand) + i6 = i; + //@ assert !\initialized(&i6) || i6 >= 3; // Does not work + //@ assert !\initialized(&i6) || i6 >= 3; + //@ assert !\initialized(&i6) || (\initialized(&i6) && i6 >= 3); + //@ assert !\initialized(&i6) || (\initialized(&i6) && i6 >= 3); + //@ assert !\initialized(&i6); + //@ assert !\initialized(&i6); +} + + int main () { g1(); g2(); g3(); if (rand) g4(); g5(); + g6(); return 0; } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/inout_formals.i frama-c-20150201+sodium+dfsg/tests/misc/inout_formals.i --- frama-c-20140301+neon+dfsg/tests/misc/inout_formals.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/inout_formals.i 2015-05-28 08:53:24.000000000 +0000 @@ -5,5 +5,6 @@ void main(int * const i) { *i=0; + Frama_C_show_each(i); if (*i==x) *i=y; } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/keep_entry_point.i frama-c-20150201+sodium+dfsg/tests/misc/keep_entry_point.i --- frama-c-20140301+neon+dfsg/tests/misc/keep_entry_point.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/keep_entry_point.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,14 @@ +/* run.config +EXECNOW: make -s @PTEST_DIR@/@PTEST_NAME@.cmxs +OPT: -main f -load-module @PTEST_DIR@/@PTEST_NAME@.cmxs -check -print +*/ + +static int f(void); + +static int x; + +static int y; + +static int g() { return y++; } + +static int f() { return x++; } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/keep_entry_point.ml frama-c-20150201+sodium+dfsg/tests/misc/keep_entry_point.ml --- frama-c-20140301+neon+dfsg/tests/misc/keep_entry_point.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/keep_entry_point.ml 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,3 @@ +let () = Rmtmps.rmUnusedStatic := true + +let () = Kernel.feedback "Do not keep unused static functions" diff -Nru frama-c-20140301+neon+dfsg/tests/misc/library.i frama-c-20150201+sodium+dfsg/tests/misc/library.i --- frama-c-20140301+neon+dfsg/tests/misc/library.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/library.i 2015-05-29 15:31:43.000000000 +0000 @@ -1,6 +1,6 @@ /* run.config GCC: - OPT: -val -deps -out -input -lib-entry -main main -context-depth 3 -journal-disable -then -main main2 -then -context-width 4 + OPT: -value-msg-key initial_state -val -deps -out -input -lib-entry -main main -context-depth 3 -journal-disable -then -main main2 -then -context-width 4 */ int f_int(int x); int *f_star_int(int x); diff -Nru frama-c-20140301+neon+dfsg/tests/misc/limits.c frama-c-20150201+sodium+dfsg/tests/misc/limits.c --- frama-c-20140301+neon+dfsg/tests/misc/limits.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/limits.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,5 +1,5 @@ /* run.config - OPT: -val -warn-signed-overflow -cpp-command "gcc -C -E -nostdinc -I. -Ishare/libc" + OPT: -val -warn-signed-overflow */ #include diff -Nru frama-c-20140301+neon+dfsg/tests/misc/linked_list.c frama-c-20150201+sodium+dfsg/tests/misc/linked_list.c --- frama-c-20140301+neon+dfsg/tests/misc/linked_list.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/linked_list.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -/* run.config - STDOPT: - STDOPT: +"-plevel 100" +"-big-ints-hex 257" - STDOPT: +"-slevel 12" +"-big-ints-hex 257" -*/ - -#define FRAMA_C_MALLOC_HEAP -#include "share/libc/stdlib.c" -#include "share/libc/stdio.h" -#include "share/libc/stdio.c" - -struct list_el { - int val; - struct list_el * next; -}; - -typedef struct list_el item; - -void main() { - item * curr, * head; - int i; - - head = NULL; - - for(i=1;i<=10;i++) { - CEA_DUMP(); - curr = (item *)malloc(sizeof(item)); - CEA_DUMP(); - curr->val = i; - curr->next = head; - head = curr; - } - - curr = head; - - while(curr) { - printf("%d\n", curr->val); - curr = curr->next ; - } -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/local_slevel.i frama-c-20150201+sodium+dfsg/tests/misc/local_slevel.i --- frama-c-20140301+neon+dfsg/tests/misc/local_slevel.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/local_slevel.i 2015-05-29 15:31:43.000000000 +0000 @@ -1,5 +1,5 @@ /* run.config - STDOPT: +"-print" + STDOPT: +"-print -then -scf -then-on propagated -val -no-scf" */ int *p; diff -Nru frama-c-20140301+neon+dfsg/tests/misc/logic.c frama-c-20150201+sodium+dfsg/tests/misc/logic.c --- frama-c-20140301+neon+dfsg/tests/misc/logic.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/logic.c 2015-05-29 15:31:43.000000000 +0000 @@ -33,7 +33,7 @@ //@ assert &s3[0..1].f2 != 0; //@ assert &s3[0 .. -1].f1 != &s3[0..1].f2; - //@ assert &s3[0 .. 1].f1 != &s3[0..1].f1; + //@ assert &s3[0 .. 1].f1 == &s3[0..1].f1; //@ assert s1 == s2; // True at link-time //@ assert t != u; // false @@ -60,8 +60,21 @@ //@ assert (double)5 == 5.; } +/*@ requires r1: \valid (input + (0..l-1)); + requires r2: \valid (&input[0..l-1]); + assigns input[0..l-1] \from \nothing; */ +void f_empty_tset (unsigned char * input, int l); + +void empty_tset () { + unsigned char T[1] = {2}; + f_empty_tset (T, 0); + //@ assert T[0] == 2; +} + + void main () { eq_tsets(); eq_char(); casts(); + empty_tset(); } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/logtrap.i frama-c-20150201+sodium+dfsg/tests/misc/logtrap.i --- frama-c-20140301+neon+dfsg/tests/misc/logtrap.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/logtrap.i 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -/* run.config - DONTRUN: waiting ocaml 3.12 -*/ -// OPT: -load-script tests/misc/logtrap.ml -// Should raise an assertion-failure exception. - diff -Nru frama-c-20140301+neon+dfsg/tests/misc/logtrap.ml frama-c-20150201+sodium+dfsg/tests/misc/logtrap.ml --- frama-c-20140301+neon+dfsg/tests/misc/logtrap.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/logtrap.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -let main () = - begin - Log.print_on_output - (fun fmt -> - Format.fprintf fmt "Start.@." ; - if true then assert false ; - Format.fprintf fmt "End.@." ; - ) - end - -let () = Db.Main.extend main diff -Nru frama-c-20140301+neon+dfsg/tests/misc/log_twice.ml frama-c-20150201+sodium+dfsg/tests/misc/log_twice.ml --- frama-c-20140301+neon+dfsg/tests/misc/log_twice.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/log_twice.ml 2015-05-28 08:53:24.000000000 +0000 @@ -5,6 +5,7 @@ let p_default = Project.create_by_copy ~src:(Project.from_unique_name "default") + ~last:false "default" in !Db.Value.compute (); diff -Nru frama-c-20140301+neon+dfsg/tests/misc/loop_test.i frama-c-20150201+sodium+dfsg/tests/misc/loop_test.i --- frama-c-20140301+neon+dfsg/tests/misc/loop_test.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/loop_test.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,7 +1,7 @@ /* run.config - DONTRUN: cannot find entry point: cent_onzes + OPT: -val -main test_onzes -journal-disable - OPT: -val -main cent_onzes -journal-disable + OPT: -val -main test_cent_onzes -journal-disable */ /***************** var CMP cste **********************/ diff -Nru frama-c-20140301+neon+dfsg/tests/misc/machdep.c frama-c-20150201+sodium+dfsg/tests/misc/machdep.c --- frama-c-20140301+neon+dfsg/tests/misc/machdep.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/machdep.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,5 +1,5 @@ /* run.config - OPT: -val -cpp-command "gcc -C -E -DPTEST" -journal-disable -then -machdep x86_64 -then -machdep x86_16 + OPT: -val -cpp-extra-args="-DPTEST" -journal-disable -then -machdep x86_64 -then -machdep x86_16 */ #ifndef PTEST diff -Nru frama-c-20140301+neon+dfsg/tests/misc/malloc_individual.c frama-c-20150201+sodium+dfsg/tests/misc/malloc_individual.c --- frama-c-20140301+neon+dfsg/tests/misc/malloc_individual.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/malloc_individual.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#define FRAMA_C_MALLOC_INDIVIDUAL -#include "share/libc/stdlib.c" - -int *p; -int A,B,C; - -void main(int c) -{ - p = malloc(sizeof(int)); - if (c) - *p = 3; - A = *p; - C = 1 + *p; - B = A; -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/memcmp.c frama-c-20150201+sodium+dfsg/tests/misc/memcmp.c --- frama-c-20140301+neon+dfsg/tests/misc/memcmp.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/memcmp.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -/* run.config - STDOPT: -*/ -#include "share/builtin.h" - -int main() { - unsigned char t[6] = { 0xef, 0xcd , 0xab , 0x00, 0x01, 0x01 }; - char s[6] = { 0xef, 0xcd , 0xab , 0x00, 0x01, 0x01 }; - const char* s1 = "hello world\n"; - const char* s2 = "bla+hello world\n"; - - int x = 0x00abcdef; - int y = 0x01abcdef; - - int z = Frama_C_memcmp(&x,&x,4); - //@ assert(z == 0); - - int a = Frama_C_memcmp(&x,&y,4); - //@ assert(a < 0); - - int b = Frama_C_memcmp(&y,&x,4); - //@ assert(b > 0); - - int c = Frama_C_memcmp(&x,t,4); - //@ assert(c == 0); - - int d = Frama_C_memcmp(t,&x,4); - //@ assert(d == 0); - - int e = Frama_C_memcmp(s,&x,4); - //@ assert(e == 0); - - int f = Frama_C_memcmp(&x,s,4); - //@ assert(f == 0); - - // int g = Frama_C_memcmp(&x,s,6); - - int h = Frama_C_memcmp(s1,s2+4,13); - //@ assert(h == 0); - - return 0; -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/memcpy2.c frama-c-20150201+sodium+dfsg/tests/misc/memcpy2.c --- frama-c-20140301+neon+dfsg/tests/misc/memcpy2.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/memcpy2.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -#include "share/libc/__fc_builtin.h" - -int main(int c, char **v) -{ - char t[512]; - char s[512] = { 0 }; - int l; - - l = Frama_C_interval(0,511); - Frama_C_memcpy(t, s, l); - - Frama_C_dump_each(); - - l = Frama_C_interval(0,512); - Frama_C_memcpy(t, s, l); - - l = Frama_C_interval(1,512); - Frama_C_memcpy(t, s, l); -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/memcpy.c frama-c-20150201+sodium+dfsg/tests/misc/memcpy.c --- frama-c-20140301+neon+dfsg/tests/misc/memcpy.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/memcpy.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,146 +0,0 @@ -/* run.config - STDOPT: +"-calldeps" +"-no-deps" +"-slevel-function" +"init:2000" +"-inout-callwise" +"-inout" +"-value-msg-key imprecision" +"-plevel 150" +"-then" +"-report" -*/ -#include "share/builtin.h" - -extern unsigned int i; -char src[20]; -char dst1[20], dst2[20], dst3[20]; -char dst4[20], dst5[100]; - -void init () { - int j; - for (j=0;j<20;j++) { - src[j] = j+1; - dst1[j] = -1; - dst2[j] = -1; - dst3[j] = -1; - dst4[j] = -1; - } - for (j=0;j<100;j++) dst5[j] = -1; -} - -volatile maybe; - -void buggy () { - char c; - char *p = maybe ? &c: "abc"; - Frama_C_memcpy(p,"d",1); -} - -int tm[1000]; -int um[1000]; - -typedef struct { - short ts; - int ti; -} typ; - -typ ttyp[1000]; - -void many() { - char s[] = "abcd"; - unsigned int p = maybe; - //@ assert p < 1000; - - tm[0]=0; - Frama_C_memcpy(&tm[p],s,4); - um[0]=0; - Frama_C_memcpy(&um[p],s,2); - - typ ty = {1, 2}; - ttyp[0] = ty; - Frama_C_memcpy(&ttyp[p],&ty,sizeof(typ)); -} - -struct t1 { int x; int y; int* p;} v1,v2, v3, v4, v5; -struct t1 t[4]; - - -void main (int a, int b){ - buggy (); - - many (); - - init (); - - //@ assert 5 <= b && b <= 15; - Frama_C_memcpy(dst1+1, src+2, b); - - Frama_C_memcpy(dst2+1, src+2, 2*b); - - //@ assert 5 <= b && b <= 14; - Frama_C_memcpy(dst3+5, src+2, b); - - Frama_C_memcpy(dst4+5, src+2, 2*b); - - v2 = v2; - v2.p = &v1.y; - t[1]=v2; - - v1.x = 5; - v1.y = 7; - Frama_C_memcpy(&v2, &v1, sizeof(v1)); - - Frama_C_memcpy(t+2, t, (1+!a)*sizeof(v1)); - - Frama_C_memcpy(&v3, t+(int)t, sizeof(v1)); - - Frama_C_memcpy(&v4 + (int)&v4, &v1, sizeof(v1)); - v4.y = &t[0]; - Frama_C_memcpy(&v5 + (int)&v5, &v4, sizeof(v4)); - - if (maybe) { - int x=1; - while(1) - Frama_C_memcpy((void *)&x, (void const*)&x, i); - } - - char *p; - p = maybe ? &dst5[0] : &dst5[20]; - Frama_C_memcpy(p, &src[0], b); - b = maybe; - //@ assert 1 <= b < 20; - p = maybe ? &dst5[40] : &dst5[70]; - Frama_C_memcpy(p, &src[0], b); - - // Destination pointer is unbounded - char ptop1[100]; - int *pptop = ptop1; - while (1) { - pptop++; - if (maybe) break; - } - Frama_C_memcpy(pptop, src, 4); - - char ptop2[100]; - pptop = &ptop2[50]; - while (1) { - pptop--; - if (maybe) break; - } - Frama_C_memcpy(pptop, src+1, 4); - - char ptop3[100]; - pptop = &ptop3[2]; - while (1) { - if (maybe) pptop--; - if (maybe) pptop++; - if (maybe) break; - } - Frama_C_memcpy(pptop, src+2, 4); - - char ptop4[100]; - pptop = &ptop4[2]; - while (1) { - if (maybe) pptop--; - if (maybe) pptop++; - if (maybe) break; - } - Frama_C_memcpy(pptop, src+2, 5); - - // Size is a garbled mix - char garbledsize[100]; - int* pgarbledsize = &garbledsize[10]; - Frama_C_memcpy(pgarbledsize, src, garbledsize); -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/memexec.c frama-c-20150201+sodium+dfsg/tests/misc/memexec.c --- frama-c-20140301+neon+dfsg/tests/misc/memexec.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/memexec.c 2015-05-29 15:31:43.000000000 +0000 @@ -88,6 +88,31 @@ } } +int g_f5_1, g_f5_2; + +void f5_aux (int x) { + //@ assert g_f5_1 <= 6; + int v = g_f5_2; + //@ assert g_f5_2 <= 7; + + while (x <= 8); +} + +void f5() { + int arg; + + g_f5_1 = c; + g_f5_2 = c; + arg = c; + f5_aux(arg); + Frama_C_show_each_f5(arg, g_f5_1, g_f5_2); + + g_f5_1 = c; + g_f5_2 = c; + arg = c; + f5_aux(arg); + Frama_C_show_each_f5(arg, g_f5_1, g_f5_2); // Cache, but reduce g_f5_* and arg after the call. Currently does not work for g_f5_1, because dependencies are not taken into account +} void main () { f1 (); @@ -95,6 +120,7 @@ f3 (); bug(); f4(); + f5(); } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/memset_block.i frama-c-20150201+sodium+dfsg/tests/misc/memset_block.i --- frama-c-20140301+neon+dfsg/tests/misc/memset_block.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/memset_block.i 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -/* run.config -STDOPT: +"-initialized-padding-locals" -STDOPT: +"-no-initialized-padding-locals" -*/ - -int main(void) { -const char S[5] = "12345"; - -struct t1 { int x; int y; int name[10];} v1; -struct t1 TS[29] = {1,3,01234567890}; -struct t2 { int x2; short int y2; char *ptr;} v2; -char C; -char PC[]= "lkjlj"; -struct t2 T2[50] = {{1,2,&PC[0]},{1,2,0}}; - -int T[10] = {1,0}; -int U[] = {3,4}; -int x = sizeof(U); -int y = sizeof(T); - -return sizeof(U); -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/memset.i frama-c-20150201+sodium+dfsg/tests/misc/memset.i --- frama-c-20140301+neon+dfsg/tests/misc/memset.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/memset.i 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -/* run.config - STDOPT: +"-calldeps" +"-no-deps" +"-inout-callwise" +"-inout" +"-value-msg-key imprecision" +"-plevel 500" -*/ - -//@ assigns *((char*)dst+(0..size-1)) \from v; -void Frama_C_memset(void * dst, int v, unsigned long size); - -int t1[100]; -int t2[100]; -int t3[100]; -int t4[100]; -int t5[100]; -int t6[100]; -int t7[100]; -int t8[100]; -int t9[100]; -int t10[100]; -int t11[100]; - -struct s { - char f1; - short f2; - int f3; - int f4[3]; -}; - -struct s ts[5]; - -volatile int vol; - -void main() { - Frama_C_memset(t1, 0x11, sizeof(t1)); // basic - Frama_C_memset(t2+(int)t2, 0x12, sizeof(t2)); // garbled dest - Frama_C_memset(t3+10, 0x11, t1); // garbled size - - if (vol) { - Frama_C_memset(t4+1, 1, sizeof(t4)); // out of bounds - } - - Frama_C_memset(t5, t1, sizeof(t4)); // garbled char - - int *p = vol ? t6+10 : t7; - Frama_C_memset(p, 0x22, 16); // multiple dest - - p = vol ? (char*) 0 : t8; - Frama_C_memset(p, 0x22, 16); // one valid dest; TODO - - p = t9+20; - while (1) { - if (vol) break; - p++; - } - Frama_C_memset(p, 0x8FE, 4); // imprecise dest - - unsigned long s = 12; - if (vol) s += 24; - Frama_C_memset(t10+4, 0x88, s); // imprecise size - - unsigned long s1 = 8; - if (vol) s1 += 8; - p = t11 + 2; - if (vol) - p++; - Frama_C_memset(p, 0x99, s1); // imprecise dest+size with juxtaposition - - if (vol) - Frama_C_memset(ts, 254, sizeof(ts)); -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/miel.i frama-c-20150201+sodium+dfsg/tests/misc/miel.i --- frama-c-20140301+neon+dfsg/tests/misc/miel.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/miel.i 1970-01-01 00:00:00.000000000 +0000 @@ -1,102 +0,0 @@ -/* run.config - DONTRUN: cannot find entry point: main -*/ - -void g() { j(); -} - -void j() { j();} - -void h() { - j(); -} - -void h1() { - j(); -} - -void h2() { - j(); -} - -void h3() { - j(); -} - -void h4() { - j(); -} - -void h5() { - j(); - p0(); -} - -void l1() { - l2(); -} - -void l2() { - -} - -void r0() { - l1 (); -} -void r1() { - l1 (); -} -void r2() { - l1 (); -} -void r3() { - l1 (); -} - -/* -void ldkfadl(void) -{ - p1(); -} -*/ - -void p0() { - // p1 (); -} -void p1() { - p2 (); - p3 (); - p0(); -} -void p2() { - p1 (); - p3 (); -} -void p3() { - p1 (); - p2 (); -} - - -void g0() { - g2 (); -} -void g1() { - g2 (); -} -void g2() { - g3 (); -} -void g3() { - g4 (); - g5 (); -} -void g4() { - g6 (); g3 (); -} -void g5() { - g6 (); -} -void g6() { - -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/my_visitor.c frama-c-20150201+sodium+dfsg/tests/misc/my_visitor.c --- frama-c-20140301+neon+dfsg/tests/misc/my_visitor.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/my_visitor.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,15 +1,7 @@ /* run.config -<<<<<<< .working EXECNOW: make -s tests/misc/my_visitor_plugin/my_visitor.opt CMD: ./tests/misc/my_visitor_plugin/my_visitor.opt OPT: -main f -======= - - -OPT: -load-script tests/misc/my_visitor_plugin/my_visitor.ml -main f - -OPT: -load-script tests/misc/dashtbl_plugin/dashtbl_plugin.ml -main f ->>>>>>> .merge-right.r18651 */ int f() { int y = 0; diff -Nru frama-c-20140301+neon+dfsg/tests/misc/my_visitor_plugin/my_visitor.ml frama-c-20150201+sodium+dfsg/tests/misc/my_visitor_plugin/my_visitor.ml --- frama-c-20140301+neon+dfsg/tests/misc/my_visitor_plugin/my_visitor.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/my_visitor_plugin/my_visitor.ml 2015-05-28 08:53:21.000000000 +0000 @@ -0,0 +1,91 @@ +open Logic_const +open Cil +open Cil_types + +module P = + Plugin.Register + (struct + let name = "My_visitor" + let shortname = "my_vis" + let help = "" + end) + +module S = + P.True(struct let option_name = "-s" let help = "" end) + +module S2 = + P.False(struct let option_name = "-s2" let help = "" end) + +let emitter1 = + Emitter.create "emitter1" [ Emitter.Code_annot ] + ~correctness:[ S.parameter ] ~tuning:[] + +let emitter2 = + Emitter.create "emitter2" [ Emitter.Code_annot ] + ~correctness:[ S2.parameter ] ~tuning:[] + +let emitter = + let even = ref true in + fun () -> + let e = !even in + even := not e; + if !even then emitter1 else emitter2 + +let add_assert loc kf stmt = + let x = Cil_const.make_logic_var_quant "x" Linteger in + let e = emitter () in + Annotations.add_assert e ~kf stmt + (pforall ([x],prel(Req, + {term_name = []; + term_node = TLval (TVar x,TNoOffset); + term_type = Linteger; + term_loc = loc}, + {term_name = []; + term_node = TLval (TVar x,TNoOffset); + term_type = Linteger; + term_loc = loc} + )));; + +class foo = object (self) + + inherit Visitor.frama_c_inplace + + method! vstmt_aux stmt = + let loc = Cil.CurrentLoc.get () in + add_assert loc (Extlib.the self#current_kf) stmt; + DoChildren + + method! vglob_aux _ = DoChildren + +end;; + +let print () = + File.pretty_ast (); + Kernel.log "================================" + +let main () = + (* The initial AST *) + print (); + let file = Ast.get () in + ignore (Cil.visitCilFileSameGlobals (new foo:>cilVisitor) file); + (* The AST with all asserts *) + print (); + Kernel.SafeArrays.set false; + Project.clear + ~selection:(State_selection.Static.with_dependencies S.self) (); + (* The AST with 1/2 asserts *) + print () + +let () = Db.Main.extend main + +(* This other main is a simple test for deep copy. *) + +let main () = + let p = File.create_project_from_visitor "param" (new Visitor.frama_c_copy) in + let selection = State_selection.singleton Kernel.LibEntry.self in + Project.copy ~selection p; + Kernel.LibEntry.on (); + assert (Kernel.LibEntry.get ()); + assert (Project.on p ~selection (fun () -> not (Kernel.LibEntry.get ())) ()) + +let () = Db.Main.extend main diff -Nru frama-c-20140301+neon+dfsg/tests/misc/not_ct_array_arg.i frama-c-20150201+sodium+dfsg/tests/misc/not_ct_array_arg.i --- frama-c-20140301+neon+dfsg/tests/misc/not_ct_array_arg.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/not_ct_array_arg.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,3 +1,7 @@ +/* run.config + STDOPT: +"-value-msg-key initial_state -journal-disable" +*/ + // Cf. Bts 856 volatile int v; diff -Nru frama-c-20140301+neon+dfsg/tests/misc/offset_neg.i frama-c-20150201+sodium+dfsg/tests/misc/offset_neg.i --- frama-c-20140301+neon+dfsg/tests/misc/offset_neg.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/offset_neg.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,4 +1,10 @@ +char mem[1]; +char *addr = mem; +unsigned long long off = -1; + int G[5]; int main () { + addr = addr + off + 1; + Frama_C_dump_each(); // the offset of addr overflow 64 bits. Beware in the pretty-printer G[-1] = 0; } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/abs_addr.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/abs_addr.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/abs_addr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/abs_addr.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/abs_addr.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + NULL[rbits 1048576 to 2097151] ∈ [--..--] + AutoTest[0..999] ∈ {0} +[value] computing for function TstRomUcmm <- main. + Called from tests/misc/abs_addr.i:46. +tests/misc/abs_addr.i:18:[value] entering loop for the first time +tests/misc/abs_addr.i:32:[value] entering loop for the first time +[value] Recording results for TstRomUcmm +[value] Done for function TstRomUcmm +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function TstRomUcmm: + AutoTest[0..72] ∈ {0} + [73] ∈ {0; 1} + [74..999] ∈ {0} + rom ∈ [--..--] or UNINITIALIZED + chkrom ∈ [--..--] + ptrom ∈ {262142} + __retres ∈ {0; 1} +[value] Values at end of function main: + AutoTest[0..72] ∈ {0} + [73] ∈ {0; 1} + [74..999] ∈ {0} +[from] Computing for function TstRomUcmm +[from] Done for function TstRomUcmm +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function TstRomUcmm: + AutoTest[73] FROM NULL[131072..262143] (and SELF) + \result FROM NULL[131072..262143]; AutoTest[73] +[from] Function main: + AutoTest[73] FROM NULL[131072..262143] (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function TstRomUcmm: + AutoTest[73]; rom; chkrom; ptrom; __retres +[inout] Inputs for function TstRomUcmm: + NULL[131072..262143]; AutoTest[73] +[inout] Out (internal) for function main: + AutoTest[73] +[inout] Inputs for function main: + NULL[131072..262143]; AutoTest[73] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/absolute_pointer.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/absolute_pointer.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/absolute_pointer.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/absolute_pointer.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,62 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/absolute_pointer.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + NULL[rbits 0 to 31] ∈ [--..--] + R ∈ {0} +[value] computing for function crash <- main. + Called from tests/misc/absolute_pointer.i:18. +[value] computing for function f <- crash <- main. + Called from tests/misc/absolute_pointer.i:12. +[value] Recording results for f +[value] Done for function f +tests/misc/absolute_pointer.i:12:[kernel] warning: out of bounds write. assert \valid(tmp); + (tmp from f()) +tests/misc/absolute_pointer.i:12:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for crash +[value] Done for function crash +[value] Recording results for main +[value] done for function main +tests/misc/absolute_pointer.i:12:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {100} +[value] Values at end of function crash: + NON TERMINATING FUNCTION +[value] Values at end of function main: + NULL[rbits 0 to 7] ∈ {2} + [rbits 8 to 15] ∈ [--..--] + [rbits 16 to 23] ∈ {2} + [rbits 24 to 31] ∈ [--..--] + R ∈ [--..--] +[from] Computing for function f +[from] Done for function f +[from] Computing for function crash +[from] Non-terminating function crash (no dependencies) +[from] Done for function crash +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM \nothing +[from] Function crash: + NON TERMINATING - NO EFFECTS +[from] Function main: + NULL{[0]; [2]} FROM \nothing + R FROM NULL[3] +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function crash: + v; tmp +[inout] Inputs for function crash: + \nothing +[inout] Out (internal) for function main: + NULL{[0]; [2]}; R +[inout] Inputs for function main: + NULL{[1]; [3]} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/abs.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/abs.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/abs.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/abs.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/abs.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/abs.i:6:[value] Function main: precondition got status unknown. +tests/misc/abs.i:9:[kernel] warning: signed overflow. assert -*p ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + S_p[0] ∈ [0..2147483647] + [1] ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + S_p[0] FROM p; S_p[0] (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + S_p[0] +[inout] Inputs for function main: + S_p[0] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/abstract_struct_1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/abstract_struct_1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/abstract_struct_1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/abstract_struct_1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/abstract_struct_1.c (with preprocessing) +[kernel] Parsing tests/misc/abstract_struct_2.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value:initial_state] creating variable S_data_0_S_repositories with imprecise size (type struct abstracttype [2]) +tests/misc/abstract_struct_1.c:10:[value] warning: during initialization of variable 'repositories', size of + type 'struct abstracttype' cannot be computed + (abstract type 'struct abstracttype') +[value:initial_state] creating variable S_data_1_S_repositories with imprecise size (type struct abstracttype [2]) +[value] Initial state computed +[value] Values of globals at initialization + __fc_random_counter ∈ [--..--] + __fc_rand_max ∈ {32767} + __fc_heap_status ∈ [--..--] + repositories ∈ {{ NULL ; &S_repositories[0] }} + S_repositories[0].data ∈ + {{ NULL ; (struct abstracttype *)&S_data_0_S_repositories }} + [1].data ∈ + {{ NULL ; (struct abstracttype *)&S_data_1_S_repositories }} + S_data_0_S_repositories[bits 0 to ..] ∈ [--..--] or UNINITIALIZED + S_data_1_S_repositories[bits 0 to ..] ∈ [--..--] or UNINITIALIZED +[value] computing for function calloc <- main. + Called from tests/misc/abstract_struct_1.c:13. +tests/misc/abstract_struct_1.c:13:[kernel] warning: Neither code nor specification for function calloc, generating default assigns from the prototype +[value] using specification for function calloc +[value] Done for function calloc +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + repositories ∈ + {{ NULL + [--..--] ; + &alloced_return_calloc + [0..2147483647] }} +[from] Computing for function main +[from] Computing for function calloc <-main +[from] Done for function calloc +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function calloc: + \result FROM nmemb; size +[from] Function main: + repositories FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + repositories +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/access_path.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/access_path.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/access_path.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/access_path.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/access_path.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/access_path.i:2:[kernel] warning: out of bounds read. assert \valid_read(p); +tests/misc/access_path.i:2:[kernel] warning: out of bounds write. assert \valid(*p); +tests/misc/access_path.i:2:[kernel] warning: signed overflow. assert *(*p)+1 ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + __retres ∈ {0} + S_0_S_p[0] ∈ [-2147483647..2147483647] + [1] ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + S_0_S_p[0] FROM p; S_p[0]; S_0_S_p[0] + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + __retres; S_0_S_p[0] +[inout] Inputs for function main: + S_p[0]; S_0_S_p[0] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/add_approx.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/add_approx.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/add_approx.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/add_approx.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/add_approx.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..9] ∈ {0} + x ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + t[0] ∈ {0; 2} + [1] ∈ {1; 2} + [2] ∈ {0} + [3] ∈ {77} + [4..9] ∈ {0} + x ∈ {0; 1} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + t[0] FROM c (and SELF) + [1] FROM c + [3] FROM \nothing + x FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + t{[0..1]; [3]}; x +[inout] Inputs for function main: + x diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/addition.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/addition.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/addition.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/addition.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,444 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/addition.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + NULL[rbits 360 to 391] ∈ [--..--] + t[0..9] ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} + zz ∈ {0} + p1 ∈ {0} + p2 ∈ {0} + p3 ∈ {0} + p4 ∈ {0} + p5 ∈ {0} + p6 ∈ {0} + p7 ∈ {0} + p8 ∈ {0} + p9 ∈ {0} + p10 ∈ {0} + p11 ∈ {0} + p12 ∈ {0} + p13 ∈ {0} + p14 ∈ {0} + p15 ∈ {0} + p16 ∈ {0} + p17 ∈ {0} + u1 ∈ {0} + u3 ∈ {0} + q1 ∈ {0} + quo1 ∈ {0} + rem1 ∈ {0} + quo2 ∈ {0} + rem2 ∈ {0} + quo3 ∈ {0} + rem3 ∈ {0} + quo4 ∈ {0} + rem4 ∈ {0} + quo5 ∈ {0} + rem5 ∈ {0} + mm1 ∈ {0} + mm2 ∈ {0} + mm3 ∈ {0} + quo6 ∈ {0} + c1 ∈ {0} + c2 ∈ {0} + qu1 ∈ {0} + qu2 ∈ {0} + ll1 ∈ {0} + ll2 ∈ {0} + tt[0..4] ∈ {0} + ttt[0..4][0..5] ∈ {0} + square ∈ {0} +tests/misc/addition.i:34:[value] warning: Operation {{ &p2 }} - {{ &p3 }} incurs a loss of precision +tests/misc/addition.i:34:[kernel] warning: signed overflow. assert -2147483648 ≤ &p2-&p3 ≤ 2147483647; +tests/misc/addition.i:34:[value] Assigning imprecise value to p1. + The imprecision originates from Arithmetic {tests/misc/addition.i:34} +tests/misc/addition.i:36:[value] Assigning imprecise value to p2. + The imprecision originates from Arithmetic {tests/misc/addition.i:36} +tests/misc/addition.i:38:[kernel] warning: casting address to a type smaller than sizeof(void*): {{ &p1 }} +tests/misc/addition.i:38:[value] Assigning imprecise value to p3. + The imprecision originates from Arithmetic {tests/misc/addition.i:38} +tests/misc/addition.i:40:[kernel] warning: casting address to a type smaller than sizeof(void*): {{ &p1 }} +tests/misc/addition.i:40:[value] Assigning imprecise value to p4. + The imprecision originates from Arithmetic {tests/misc/addition.i:40} +tests/misc/addition.i:42:[kernel] warning: casting address to a type smaller than sizeof(void*): {{ &p1 }} +tests/misc/addition.i:42:[kernel] warning: casting address to a type smaller than sizeof(void*): {{ &p2 }} +tests/misc/addition.i:42:[value] Assigning imprecise value to p5. + The imprecision originates from Arithmetic {tests/misc/addition.i:42} +tests/misc/addition.i:44:[kernel] warning: casting address to a type smaller than sizeof(void*): {{ &p1 }} +tests/misc/addition.i:44:[value] Assigning imprecise value to p6. + The imprecision originates from Arithmetic {tests/misc/addition.i:44} +tests/misc/addition.i:46:[kernel] warning: casting address to a type smaller than sizeof(void*): {{ &p2 }} +tests/misc/addition.i:46:[value] Assigning imprecise value to p7. + The imprecision originates from Arithmetic {tests/misc/addition.i:46} +tests/misc/addition.i:48:[kernel] warning: pointer comparison: assert \pointer_comparable(&p1+1, &p2); +tests/misc/addition.i:50:[value] warning: Operation {{ &p1 }} / {2} incurs a loss of precision +tests/misc/addition.i:50:[kernel] warning: signed overflow. assert -2147483648 ≤ (int)(&p1)/2 ≤ 2147483647; +tests/misc/addition.i:50:[value] Assigning imprecise value to p9. + The imprecision originates from Arithmetic {tests/misc/addition.i:50} +tests/misc/addition.i:52:[value] warning: Operation {12} & {{ &p1 }} incurs a loss of precision +tests/misc/addition.i:52:[value] Assigning imprecise value to p10. + The imprecision originates from Arithmetic {tests/misc/addition.i:52} +tests/misc/addition.i:56:[value] warning: Operation {{ &p1 }} & {{ &p2 }} incurs a loss of precision +tests/misc/addition.i:56:[value] Assigning imprecise value to p12. + The imprecision originates from Arithmetic {tests/misc/addition.i:56} +tests/misc/addition.i:59:[value] Reading left-value *((char *)(& q1)). + The location is {{ q1 -> {0} }}. + It contains a garbled mix of {p1} because of Misaligned + {tests/misc/addition.i:59}. +tests/misc/addition.i:59:[kernel] warning: signed overflow. + assert -2147483648 ≤ (int)*((char *)(&q1))+2 ≤ 2147483647; +tests/misc/addition.i:59:[value] Assigning imprecise value to p13. + The imprecision originates from Misaligned {tests/misc/addition.i:59} +tests/misc/addition.i:61:[value] Reading left-value *((char *)(& q1)). + The location is {{ q1 -> {0} }}. + It contains a garbled mix of {p1} because of Misaligned + {tests/misc/addition.i:61}. +tests/misc/addition.i:61:[kernel] warning: signed overflow. + assert -2147483648 ≤ (int)*((char *)(&q1))+2 ≤ 2147483647; +tests/misc/addition.i:61:[value] Assigning imprecise value to p14. + The imprecision originates from Misaligned {tests/misc/addition.i:61} +tests/misc/addition.i:66:[kernel] warning: out of bounds read. assert \valid_read(*((int **)45)); +[value] Called CEA_1([-10..15]) +tests/misc/addition.i:88:[value] Assertion got status valid. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + t[0] ∈ {0} + [1] ∈ {45} + [2] ∈ {3} + [3..9] ∈ {0} + z ∈ {37} + p1 ∈ + {{ garbled mix of &{p2; p3} + (origin: Arithmetic {tests/misc/addition.i:34}) }} + p2 ∈ + {{ garbled mix of &{p1} + (origin: Arithmetic {tests/misc/addition.i:36}) }} + p3 ∈ + {{ garbled mix of &{t; p1} + (origin: Arithmetic {tests/misc/addition.i:38}) }} + p4 ∈ + {{ garbled mix of &{p1; tt} + (origin: Arithmetic {tests/misc/addition.i:40}) }} + p5 ∈ + {{ garbled mix of &{p1; p2; ttt} + (origin: Arithmetic {tests/misc/addition.i:42}) }} + p6 ∈ + {{ garbled mix of &{p1; ttt} + (origin: Arithmetic {tests/misc/addition.i:44}) }} + p7 ∈ + {{ garbled mix of &{p2; ttt} + (origin: Arithmetic {tests/misc/addition.i:46}) }} + p8 ∈ {0; 1} + p9 ∈ + {{ garbled mix of &{p1} + (origin: Arithmetic {tests/misc/addition.i:50}) }} + p10 ∈ + {{ garbled mix of &{p1} + (origin: Arithmetic {tests/misc/addition.i:52}) }} + p11 ∈ [-2147483648..0] + p12 ∈ + {{ garbled mix of &{p1; p2} + (origin: Arithmetic {tests/misc/addition.i:56}) }} + p13 ∈ + {{ garbled mix of &{p1} + (origin: Misaligned {tests/misc/addition.i:59}) }} + p14 ∈ + {{ garbled mix of &{p1} + (origin: Misaligned {tests/misc/addition.i:61}) }} + p15 ∈ {-1} + p16 ∈ {2949122} + p17 ∈ {-2147483648; 0} + u1 ∈ {8} + q1 ∈ {{ &p1 }} + quo1 ∈ {3} + rem1 ∈ {1} + quo2 ∈ {-3} + rem2 ∈ {-1} + quo3 ∈ {3} + rem3 ∈ {-1} + quo4 ∈ {-3} + rem4 ∈ {1} + quo5 ∈ {-3} + rem5 ∈ {0} + mm1 ∈ [-224848..151152],0%16 + mm2 ∈ [-6982976..4665024],64%128 + mm3 ∈ [-1182974..789526],1%5 + quo6 ∈ [-446..-371],1%3 + c1 ∈ [-48..77],2%5 + c2 ∈ [-46..79],4%5 + qu1 ∈ [53..223] + qu2 ∈ [-14..23] + ll1 ∈ [4294967248..4294967373],3%5 + ll2 ∈ [4294967250..4294967375],0%5 + tt[0].a ∈ {0} + [0].b ∈ {-1} + {[0].[bits 34 to 63]; [1..4]} ∈ {0} + square ∈ [-150..225] + u2 ∈ {34} + __retres ∈ {6} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + t[1] FROM NULL[45..48] + [2] FROM \nothing + z FROM \nothing + p1 FROM \nothing + p2 FROM \nothing + p3 FROM \nothing + p4 FROM \nothing + p5 FROM \nothing + p6 FROM u2 + p7 FROM u2 + p8 FROM \nothing + p9 FROM \nothing + p10 FROM \nothing + p11 FROM u2 (and SELF) + p12 FROM \nothing + p13 FROM \nothing + p14 FROM \nothing + p15 FROM \nothing + p16 FROM NULL[45..48]; t[0][bits 16 to 31] + p17 FROM u4 + u1 FROM \nothing + q1 FROM \nothing + quo1 FROM \nothing + rem1 FROM \nothing + quo2 FROM \nothing + rem2 FROM \nothing + quo3 FROM \nothing + rem3 FROM \nothing + quo4 FROM \nothing + rem4 FROM \nothing + quo5 FROM \nothing + rem5 FROM \nothing + mm1 FROM u2; u3_0 + mm2 FROM u2; u3_0 + mm3 FROM u2; u3_0 + quo6 FROM u3_0 + c1 FROM u3_0 + c2 FROM u3_0 + qu1 FROM u3_0 + qu2 FROM u3_0 + ll1 FROM u3_0 + ll2 FROM u3_0 + tt[0].b FROM \nothing + square FROM u3_0 + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + t[1..2]; z; p1; p2; p3; p4; p5; p6; p7; p8; p9; p10; p11; p12; p13; + p14; p15; p16; p17; u1; q1; quo1; rem1; quo2; rem2; quo3; rem3; quo4; + rem4; quo5; rem5; mm1; mm2; mm3; quo6; c1; c2; qu1; qu2; ll1; ll2; + tt[0].b; square; u2; s; t_0; __retres +[inout] Inputs for function main: + NULL[45..48]; t{{[0][bits 16 to 31]; [1][bits 0 to 15]}; [2]}; z; p17; + q1[bits 0 to 7]; ll1; ll2; tt[0].b +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + NULL[rbits 360 to 399] ∈ [--..--] + t[0..9] ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} + zz ∈ {0} + p1 ∈ {0} + p2 ∈ {0} + p3 ∈ {0} + p4 ∈ {0} + p5 ∈ {0} + p6 ∈ {0} + p7 ∈ {0} + p8 ∈ {0} + p9 ∈ {0} + p10 ∈ {0} + p11 ∈ {0} + p12 ∈ {0} + p13 ∈ {0} + p14 ∈ {0} + p15 ∈ {0} + p16 ∈ {0} + p17 ∈ {0} + u1 ∈ {0} + u3 ∈ {0} + q1 ∈ {0} + quo1 ∈ {0} + rem1 ∈ {0} + quo2 ∈ {0} + rem2 ∈ {0} + quo3 ∈ {0} + rem3 ∈ {0} + quo4 ∈ {0} + rem4 ∈ {0} + quo5 ∈ {0} + rem5 ∈ {0} + mm1 ∈ {0} + mm2 ∈ {0} + mm3 ∈ {0} + quo6 ∈ {0} + c1 ∈ {0} + c2 ∈ {0} + qu1 ∈ {0} + qu2 ∈ {0} + ll1 ∈ {0} + ll2 ∈ {0} + tt[0..4] ∈ {0} + ttt[0..4][0..5] ∈ {0} + square ∈ {0} +tests/misc/addition.i:34:[kernel] warning: signed overflow. assert -2147483648 ≤ &p2-&p3 ≤ 2147483647; +tests/misc/addition.i:48:[kernel] warning: pointer comparison: assert \pointer_comparable(&p1+1, &p2); +tests/misc/addition.i:50:[kernel] warning: signed overflow. assert -2147483648 ≤ (int)(&p1)/2 ≤ 2147483647; +tests/misc/addition.i:59:[kernel] warning: signed overflow. + assert -2147483648 ≤ (int)*((char *)(&q1))+2 ≤ 2147483647; +tests/misc/addition.i:61:[kernel] warning: signed overflow. + assert -2147483648 ≤ (int)*((char *)(&q1))+2 ≤ 2147483647; +tests/misc/addition.i:66:[kernel] warning: out of bounds read. assert \valid_read(*((int **)45)); +[value] Called CEA_1([-10..15]) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + t[0] ∈ {0} + [1][bits 0 to 23] ∈ {0; 45; 46} + [1][bits 24 to 31] ∈ [--..--] + [2] ∈ {3} + [3..9] ∈ {0} + z ∈ {37} + p1 ∈ + {{ garbled mix of &{p2; p3} + (origin: Arithmetic {tests/misc/addition.i:34}) }} + p2 ∈ + {{ garbled mix of &{p1} + (origin: Arithmetic {tests/misc/addition.i:36}) }} + p3 ∈ + {{ garbled mix of &{t; p1} + (origin: Arithmetic {tests/misc/addition.i:38}) }} + p4 ∈ + {{ garbled mix of &{p1; tt} + (origin: Arithmetic {tests/misc/addition.i:40}) }} + p5 ∈ + {{ garbled mix of &{p1; p2; ttt} + (origin: Arithmetic {tests/misc/addition.i:42}) }} + p6 ∈ + {{ garbled mix of &{p1; ttt} + (origin: Arithmetic {tests/misc/addition.i:44}) }} + p7 ∈ + {{ garbled mix of &{p2; ttt} + (origin: Arithmetic {tests/misc/addition.i:46}) }} + p8 ∈ {0; 1} + p9 ∈ + {{ garbled mix of &{p1} + (origin: Arithmetic {tests/misc/addition.i:50}) }} + p10 ∈ + {{ garbled mix of &{p1} + (origin: Arithmetic {tests/misc/addition.i:52}) }} + p11 ∈ [-2147483648..0] + p12 ∈ + {{ garbled mix of &{p1; p2} + (origin: Arithmetic {tests/misc/addition.i:56}) }} + p13 ∈ + {{ garbled mix of &{p1} + (origin: Misaligned {tests/misc/addition.i:59}) }} + p14 ∈ + {{ garbled mix of &{p1} + (origin: Misaligned {tests/misc/addition.i:61}) }} + p15 ∈ {-1} + p16 ∈ {2; 2949122; 3014658} + p17 ∈ {-2147483648; 0} + u1 ∈ {8} + q1 ∈ {{ &p1 }} + quo1 ∈ {3} + rem1 ∈ {1} + quo2 ∈ {-3} + rem2 ∈ {-1} + quo3 ∈ {3} + rem3 ∈ {-1} + quo4 ∈ {-3} + rem4 ∈ {1} + quo5 ∈ {-3} + rem5 ∈ {0} + mm1 ∈ [-224848..151152],0%16 + mm2 ∈ [-6982976..4665024],64%128 + mm3 ∈ [-1182974..789526],1%5 + quo6 ∈ [-446..-371],1%3 + c1 ∈ [-48..77],2%5 + c2 ∈ [-46..79],4%5 + qu1 ∈ [53..223] + qu2 ∈ [-14..23] + ll1 ∈ [4294967248..4294967373],3%5 + ll2 ∈ [4294967250..4294967375],0%5 + tt[0].a ∈ {0} + [0].b ∈ {-1} + {[0].[bits 34 to 63]; [1..4]} ∈ {0} + square ∈ [-150..225] + u2 ∈ {34} + __retres ∈ {6} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + t[1] FROM NULL[45..49] + [2] FROM \nothing + z FROM \nothing + p1 FROM \nothing + p2 FROM \nothing + p3 FROM \nothing + p4 FROM \nothing + p5 FROM \nothing + p6 FROM u2 + p7 FROM u2 + p8 FROM \nothing + p9 FROM \nothing + p10 FROM \nothing + p11 FROM u2 (and SELF) + p12 FROM \nothing + p13 FROM \nothing + p14 FROM \nothing + p15 FROM \nothing + p16 FROM NULL[45..49]; t[0][bits 16 to 31] + p17 FROM u4 + u1 FROM \nothing + q1 FROM \nothing + quo1 FROM \nothing + rem1 FROM \nothing + quo2 FROM \nothing + rem2 FROM \nothing + quo3 FROM \nothing + rem3 FROM \nothing + quo4 FROM \nothing + rem4 FROM \nothing + quo5 FROM \nothing + rem5 FROM \nothing + mm1 FROM u2; u3_0 + mm2 FROM u2; u3_0 + mm3 FROM u2; u3_0 + quo6 FROM u3_0 + c1 FROM u3_0 + c2 FROM u3_0 + qu1 FROM u3_0 + qu2 FROM u3_0 + ll1 FROM u3_0 + ll2 FROM u3_0 + tt[0].b FROM \nothing + square FROM u3_0 + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + t[1..2]; z; p1; p2; p3; p4; p5; p6; p7; p8; p9; p10; p11; p12; p13; + p14; p15; p16; p17; u1; q1; quo1; rem1; quo2; rem2; quo3; rem3; quo4; + rem4; quo5; rem5; mm1; mm2; mm3; quo6; c1; c2; qu1; qu2; ll1; ll2; + tt[0].b; square; u2; s; t_0; __retres +[inout] Inputs for function main: + NULL[45..49]; t{{[0][bits 16 to 31]; [1][bits 0 to 15]}; [2]}; z; p17; + q1[bits 0 to 7]; ll1; ll2; tt[0].b diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/addr.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/addr.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/addr.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/addr.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/addr.i (no preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..4] ∈ {0} + x ∈ {0} + p ∈ {0} + q ∈ {0} +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + p ∈ {{ &t + [-8589934592..8589934588],0%4 }} +[from] Computing for function f +[from] Done for function f +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + p FROM i +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + p +[inout] Inputs for function f: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/addr2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/addr2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/addr2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/addr2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,31 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/addr2.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + t[0..12] ∈ {0} +tests/misc/addr2.i:13:[value] entering loop for the first time +[value] Called CEA_F({0}) +[value] Called CEA_F({0; 1}) +[value] Called CEA_F({0; 1; 2}) +[value] Called CEA_F({0; 1; 2; 3}) +[value] Called CEA_F({0; 1; 2; 3; 4}) +[value] Called CEA_F([0..12]) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {13} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/addrofstring.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/addrofstring.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/addrofstring.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/addrofstring.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,24 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/addrofstring.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + p ∈ {{ "bar" }} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM "bar"[bits 8 to 15] +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + p; __retres +[inout] Inputs for function main: + "bar"[bits 8 to 15] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/addr.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/addr.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/addr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/addr.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/addr.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..4] ∈ {0} + x ∈ {0} + p ∈ {0} + q ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/addr.i:20. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + p ∈ {{ &t[2] }} +[value] Values at end of function main: + t[0..1] ∈ {0} + [2] ∈ {77} + [3..4] ∈ {0} + p ∈ {{ &t[2] }} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + p FROM i +[from] Function main: + t[2] FROM \nothing + p FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + p +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main: + t[2]; p +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/affect_corrupt.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/affect_corrupt.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/affect_corrupt.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/affect_corrupt.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/affect_corrupt.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + NULL[rbits 0 to 31] ∈ [--..--] + p ∈ {0} + r ∈ {77} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + r ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + r FROM NULL[0..3]; p +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + r +[inout] Inputs for function main: + NULL[0..3]; p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/affect_corrupt.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/affect_corrupt.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/affect_corrupt.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/affect_corrupt.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/affect_corrupt.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + p ∈ {0} + r ∈ {77} +tests/misc/affect_corrupt.i:8:[kernel] warning: out of bounds read. assert \valid_read(p); +[value] Recording results for main +[value] done for function main +tests/misc/affect_corrupt.i:8:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + r +[inout] Inputs for function main: + p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/ai_annot.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/ai_annot.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/ai_annot.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/ai_annot.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,38 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/ai_annot.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + u ∈ {0} + v ∈ {0} + w ∈ {0} +tests/misc/ai_annot.i:9:[value] Assertion got status unknown. +tests/misc/ai_annot.i:10:[value] Assertion got status unknown. +tests/misc/ai_annot.i:11:[value] Assertion got status unknown. +tests/misc/ai_annot.i:12:[kernel] warning: out of bounds write. assert \valid(p+1); +tests/misc/ai_annot.i:14:[kernel] warning: out of bounds read. assert \valid_read(p+2); +tests/misc/ai_annot.i:14:[kernel] warning: signed overflow. assert x+*(p+2) ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[scope:rm_asserts] removing 2 assertion(s) +tests/misc/ai_annot.i:12:[scope:rm_asserts] removing redundant assert Value: mem_access: \valid(p+1); +tests/misc/ai_annot.i:14:[scope:rm_asserts] removing redundant assert Value: mem_access: \valid_read(p+2); +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + __retres ∈ [--..--] + S_p[0] ∈ [--..--] + [1] ∈ [0..2147483647] + [2] ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + S_p[1] FROM x; p + \result FROM x; p; S_p[2] +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + __retres; S_p[1] +[inout] Inputs for function main: + S_p[2] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/alias.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/alias.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/alias.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/alias.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,115 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/alias.i (no preprocessing) +[value] Analyzing a complete application starting at main3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + A ∈ {0} + B ∈ {0} + C ∈ {0} + D ∈ {0} + E ∈ {0} + F ∈ {0} + G ∈ {0} + p[0..4] ∈ {0} + q[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p2[0..4] ∈ {0} + q2[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p3[0..4] ∈ {0} + t ∈ {0} + u ∈ {0} + v ∈ {0} + w ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} + t2 ∈ {0} + v2 ∈ {0} + PTR1 ∈ {0} + PTR2 ∈ {0} + PTR3 ∈ {0} + PTR4 ∈ {0} + PTR5 ∈ {0} + PTR6 ∈ {0} + c ∈ [--..--] + c1 ∈ [--..--] + c2 ∈ [--..--] + c3 ∈ [--..--] + c4 ∈ [--..--] + e ∈ {0} + g ∈ {0} + h ∈ {0} + i ∈ {0} + tz1 ∈ {0} + tz2 ∈ {0} + tz3 ∈ {0} + tx ∈ {0} + ty ∈ {0} + tz ∈ {0} + U ∈ {0} + char1 ∈ {0} + ll1 ∈ {0} +tests/misc/alias.i:97:[kernel] warning: signed overflow. assert c+1 ≤ 2147483647; +tests/misc/alias.i:105:[kernel] warning: signed overflow. assert c+1 ≤ 2147483647; +tests/misc/alias.i:105:[kernel] warning: signed overflow. assert c+2 ≤ 2147483647; +tests/misc/alias.i:107:[kernel] warning: signed overflow. assert c+10 ≤ 2147483647; +tests/misc/alias.i:107:[kernel] warning: signed overflow. assert c+11 ≤ 2147483647; +tests/misc/alias.i:108:[kernel] warning: signed overflow. assert c+3 ≤ 2147483647; +tests/misc/alias.i:108:[kernel] warning: signed overflow. assert c+4 ≤ 2147483647; +[value] Recording results for main3 +[value] done for function main3 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main3: + p2[0] ∈ {0; 96; 97; 98} + [1..2] ∈ {0; 96; 97; 98; 99} + [3] ∈ {0} + [4] ∈ {0; 99} + t ∈ {3; 4} + u ∈ {0; 1} + v ∈ {0; 1} + x ∈ {0; 96; 97; 98; 99} + z ∈ {0; 1; 2} + t2 ∈ {0; 96; 97; 98; 99} + v2 ∈ {-1; 0; 1; 2; 3; 4} + PTR1 ∈ {{ &p2{[0], [1], [2]} }} + PTR2 ∈ {{ &p2{[1], [2]} }} + PTR3 ∈ {{ &p2{[1], [2], [4]} }} + PTR4 ∈ {{ &p2{[1], [2]} }} + p_0 ∈ {{ &s1 ; &s2 }} + s1.a ∈ {2; 7} + .b ∈ {4} + .c ∈ {6} + s2.a ∈ {1; 7} + .b ∈ {3} + .c ∈ {5} +[from] Computing for function main3 +[from] Done for function main3 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main3: + p2{[0..2]; [4]} FROM c (and SELF) + t FROM c + u FROM c + v FROM c + x FROM p2[0..2]; c + z FROM w; c + t2 FROM p2[0..2]; c + v2 FROM c + PTR1 FROM c + PTR2 FROM c + PTR3 FROM c + PTR4 FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main3: + p2{[0..2]; [4]}; t; u; v; x; z; t2; v2; PTR1; PTR2; PTR3; PTR4; p_0; + s1; s2; tmp; tmp_0; tmp_1; tmp_2; tmp_3 +[inout] Inputs for function main3: + p2[0..2]; u; v; w; PTR1; PTR2; PTR3; PTR4; c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/alias.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/alias.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/alias.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/alias.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,121 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/alias.i (no preprocessing) +[value] Analyzing a complete application starting at main4 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + NULL[rbits 0 to 2047] ∈ [--..--] + A ∈ {0} + B ∈ {0} + C ∈ {0} + D ∈ {0} + E ∈ {0} + F ∈ {0} + G ∈ {0} + p[0..4] ∈ {0} + q[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p2[0..4] ∈ {0} + q2[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p3[0..4] ∈ {0} + t ∈ {0} + u ∈ {0} + v ∈ {0} + w ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} + t2 ∈ {0} + v2 ∈ {0} + PTR1 ∈ {0} + PTR2 ∈ {0} + PTR3 ∈ {0} + PTR4 ∈ {0} + PTR5 ∈ {0} + PTR6 ∈ {0} + c ∈ [--..--] + c1 ∈ [--..--] + c2 ∈ [--..--] + c3 ∈ [--..--] + c4 ∈ [--..--] + e ∈ {0} + g ∈ {0} + h ∈ {0} + i ∈ {0} + tz1 ∈ {0} + tz2 ∈ {0} + tz3 ∈ {0} + tx ∈ {0} + ty ∈ {0} + tz ∈ {0} + U ∈ {0} + char1 ∈ {0} + ll1 ∈ {0} +tests/misc/alias.i:142:[kernel] warning: signed overflow. assert c+1 ≤ 2147483647; +tests/misc/alias.i:142:[kernel] warning: signed overflow. assert c+2 ≤ 2147483647; +tests/misc/alias.i:144:[kernel] warning: signed overflow. assert c+3 ≤ 2147483647; +tests/misc/alias.i:144:[kernel] warning: signed overflow. assert c+4 ≤ 2147483647; +[value] Recording results for main4 +[value] done for function main4 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main4: + u ∈ {0; 1; 2} + v ∈ {1; 2; 3} + x ∈ {1; 2; 5} + y ∈ {1; 2; 5} + z ∈ {-5; -4; -3; -2; -1; 0; 1; 1000} + p_0 ∈ {{ &t1.s2 ; &t2_0.s3 }} + s.a ∈ {4; 27; 777} + .b ∈ {5; 28} + .c ∈ {6; 29} + ss ∈ [--..--] + sss.a ∈ {4; 27; 777} + .b ∈ {5; 28; 888} + .c ∈ {6; 29} + pt ∈ {0} + t1.s1.a ∈ {1} + .s1.b ∈ {2} + .s1.c ∈ {3} + .s2.a ∈ {4; 777} + .s2.b ∈ {5; 888} + .s2.c ∈ {6} + .s3.a ∈ {7} + .s3.b ∈ {8} + .s3.c ∈ {9} + .s4.a ∈ {10} + .s4.b ∈ {11} + .s4.c ∈ {12} + t2_0.s1.a ∈ {21} + .s1.b ∈ {22} + .s1.c ∈ {23} + .s2.a ∈ {24} + .s2.b ∈ {25} + .s2.c ∈ {26} + .s3.a ∈ {27; 777} + .s3.b ∈ {28; 888} + .s3.c ∈ {29} + .s4.a ∈ {30} + .s4.b ∈ {31} + .s4.c ∈ {32} +[from] Computing for function main4 +[from] Done for function main4 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main4: + u FROM c + v FROM c + x FROM c + y FROM c + z FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main4: + u; v; x; y; z; p_0; s; ss; sss; pt; t1; t2_0; tmp; tmp_0 +[inout] Inputs for function main4: + NULL[0..11]; u; v; x; y; c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/alias.3.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/alias.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/alias.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/alias.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,108 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/alias.i (no preprocessing) +[value] Analyzing a complete application starting at main5 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + A ∈ {0} + B ∈ {0} + C ∈ {0} + D ∈ {0} + E ∈ {0} + F ∈ {0} + G ∈ {0} + p[0..4] ∈ {0} + q[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p2[0..4] ∈ {0} + q2[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p3[0..4] ∈ {0} + t ∈ {0} + u ∈ {0} + v ∈ {0} + w ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} + t2 ∈ {0} + v2 ∈ {0} + PTR1 ∈ {0} + PTR2 ∈ {0} + PTR3 ∈ {0} + PTR4 ∈ {0} + PTR5 ∈ {0} + PTR6 ∈ {0} + c ∈ [--..--] + c1 ∈ [--..--] + c2 ∈ [--..--] + c3 ∈ [--..--] + c4 ∈ [--..--] + e ∈ {0} + g ∈ {0} + h ∈ {0} + i ∈ {0} + tz1 ∈ {0} + tz2 ∈ {0} + tz3 ∈ {0} + tx ∈ {0} + ty ∈ {0} + tz ∈ {0} + U ∈ {0} + char1 ∈ {0} + ll1 ∈ {0} +tests/misc/alias.i:171:[kernel] warning: signed overflow. assert c+1 ≤ 2147483647; +[value] Recording results for main5 +[value] done for function main5 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main5: + u ∈ {0; 1} + v ∈ {0; 1} + z ∈ {0; 1; 2} + sss.a ∈ {4; 27} + .b ∈ {5; 28; 888; 999} + .c ∈ {6; 29} + pt ∈ {{ (struct T *)&t1.s2 ; (struct T *)&t2_0.s3 }} + t1.s1.a ∈ {1} + .s1.b ∈ {2} + .s1.c ∈ {3} + .s2.a ∈ {4} + .s2.b ∈ {5; 888} + .s2.c ∈ {6} + .s3.a ∈ {7} + .s3.b ∈ {8} + .s3.c ∈ {9} + .s4.a ∈ {10} + .s4.b ∈ {11} + .s4.c ∈ {12} + t2_0.s1.a ∈ {21} + .s1.b ∈ {22} + .s1.c ∈ {23} + .s2.a ∈ {24} + .s2.b ∈ {25} + .s2.c ∈ {26} + .s3.a ∈ {27} + .s3.b ∈ {28; 999} + .s3.c ∈ {29} + .s4.a ∈ {30} + .s4.b ∈ {31} + .s4.c ∈ {32} +[from] Computing for function main5 +[from] Done for function main5 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main5: + u FROM c + v FROM c + z FROM w; c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main5: + u; v; z; sss; pt; t1; t2_0 +[inout] Inputs for function main5: + u; v; w; c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/alias.4.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/alias.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/alias.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/alias.4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,104 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/alias.i (no preprocessing) +[value] Analyzing a complete application starting at main6 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + NULL[rbits 0 to 2047] ∈ [--..--] + A ∈ {0} + B ∈ {0} + C ∈ {0} + D ∈ {0} + E ∈ {0} + F ∈ {0} + G ∈ {0} + p[0..4] ∈ {0} + q[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p2[0..4] ∈ {0} + q2[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p3[0..4] ∈ {0} + t ∈ {0} + u ∈ {0} + v ∈ {0} + w ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} + t2 ∈ {0} + v2 ∈ {0} + PTR1 ∈ {0} + PTR2 ∈ {0} + PTR3 ∈ {0} + PTR4 ∈ {0} + PTR5 ∈ {0} + PTR6 ∈ {0} + c ∈ [--..--] + c1 ∈ [--..--] + c2 ∈ [--..--] + c3 ∈ [--..--] + c4 ∈ [--..--] + e ∈ {0} + g ∈ {0} + h ∈ {0} + i ∈ {0} + tz1 ∈ {0} + tz2 ∈ {0} + tz3 ∈ {0} + tx ∈ {0} + ty ∈ {0} + tz ∈ {0} + U ∈ {0} + char1 ∈ {0} + ll1 ∈ {0} +tests/misc/alias.i:185:[value] entering loop for the first time +tests/misc/alias.i:191:[kernel] warning: pointer comparison: assert \pointer_comparable(PTR2, (char *)PTR1); +tests/misc/alias.i:199:[kernel] warning: signed overflow. assert c+1 ≤ 2147483647; +[value] Recording results for main6 +[value] done for function main6 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main6: + p[0] ∈ {0} + [1] ∈ {0; 77} + [2..4] ∈ {0} + q[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3; 77} + [3] ∈ {4} + [4] ∈ {5} + u ∈ {0; 1} + v ∈ {0; 1} + w ∈ {0; 1} + x ∈ [0..99] + y ∈ {0; 3; 77} + z ∈ {-33} + PTR1 ∈ {{ &p[1] ; &q[2] }} + PTR2 ∈ [--..--] + i_0 ∈ {100} +[from] Computing for function main6 +[from] Done for function main6 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main6: + p[1] FROM c (and SELF) + q[2] FROM c (and SELF) + u FROM c + v FROM c + w FROM c + x FROM \nothing (and SELF) + y FROM p[1]; q[2]; c + z FROM NULL[0..3]; PTR2; c + PTR1 FROM c + PTR2 FROM NULL[0..3]; PTR2 +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main6: + p[1]; q[2]; u; v; w; x; y; z; PTR1; PTR2; i_0 +[inout] Inputs for function main6: + NULL[0..3]; p[1]; q[2]; u; v; PTR1; PTR2; c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/alias.5.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/alias.5.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/alias.5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/alias.5.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,222 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/alias.i (no preprocessing) +[value] Analyzing a complete application starting at main11 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + NULL[rbits 0 to 2047] ∈ [--..--] + A ∈ {0} + B ∈ {0} + C ∈ {0} + D ∈ {0} + E ∈ {0} + F ∈ {0} + G ∈ {0} + p[0..4] ∈ {0} + q[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p2[0..4] ∈ {0} + q2[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p3[0..4] ∈ {0} + t ∈ {0} + u ∈ {0} + v ∈ {0} + w ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} + t2 ∈ {0} + v2 ∈ {0} + PTR1 ∈ {0} + PTR2 ∈ {0} + PTR3 ∈ {0} + PTR4 ∈ {0} + PTR5 ∈ {0} + PTR6 ∈ {0} + c ∈ [--..--] + c1 ∈ [--..--] + c2 ∈ [--..--] + c3 ∈ [--..--] + c4 ∈ [--..--] + e ∈ {0} + g ∈ {0} + h ∈ {0} + i ∈ {0} + tz1 ∈ {0} + tz2 ∈ {0} + tz3 ∈ {0} + tx ∈ {0} + ty ∈ {0} + tz ∈ {0} + U ∈ {0} + char1 ∈ {0} + ll1 ∈ {0} +tests/misc/alias.i:260:[value] entering loop for the first time +[value] computing for function f2 <- main11. + Called from tests/misc/alias.i:268. +[value] DUMPING STATE of file tests/misc/alias.i line 23 + NULL[rbits 0 to 2047] ∈ [--..--] + x_0 ∈ {{ (char *)&p2 }} + q_0 ∈ {{ &p2 + {1} }} + A ∈ {0} + B ∈ {0} + C ∈ {0} + D ∈ {33} + E ∈ {0} + F ∈ {0} + G ∈ {0} + p[0..4] ∈ {0} + q[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p2[0][bits 0 to 15]# ∈ {1} repeated %8 + [0][bits 16 to 31] ∈ {0} + [1] ∈ {33} + [2..4] ∈ {0} + q2[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p3[0..4] ∈ {0} + t ∈ {0} + u ∈ {0} + v ∈ {0} + w ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} + t2 ∈ {0} + v2 ∈ {0} + PTR1 ∈ {0} + PTR2 ∈ {0} + PTR3 ∈ {{ &p2[1] }} + PTR4 ∈ {0} + PTR5 ∈ {0} + PTR6 ∈ {0} + c ∈ [--..--] + c1 ∈ [--..--] + c2 ∈ [--..--] + c3 ∈ [--..--] + c4 ∈ [--..--] + e ∈ {0} + g ∈ {0} + h ∈ {0} + i ∈ {0} + tz1 ∈ {0} + tz2 ∈ {0} + tz3 ∈ {0} + tx ∈ {0} + ty ∈ {0} + tz ∈ {0} + U ∈ {0} + char1 ∈ {0} + ll1 ∈ {0} + i_0 ∈ {0} + =END OF DUMP== +[value] Recording results for f2 +[value] Done for function f2 +tests/misc/alias.i:271:[kernel] warning: signed overflow. assert c2+1 ≤ 2147483647; +tests/misc/alias.i:273:[kernel] warning: signed overflow. assert c2+2 ≤ 2147483647; +tests/misc/alias.i:279:[value] entering loop for the first time +tests/misc/alias.i:285:[kernel] warning: pointer comparison: assert \pointer_comparable(PTR2, (char *)PTR1); +tests/misc/alias.i:292:[value] entering loop for the first time +tests/misc/alias.i:292:[kernel] warning: signed overflow. assert c1+1 ≤ 2147483647; +[value] Recording results for main11 +[value] done for function main11 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f2: + q_0 ∈ {{ &p2 + {1} }} + p2[0][bits 0 to 15]# ∈ {1} repeated %8 + [0][bits 16 to 31] ∈ {0} + [1] ∈ {33} + [2..4] ∈ {0} +[value] Values at end of function main11: + A ∈ {1; 33} + B ∈ {-32; 0; 32} + D ∈ {33} + p[0] ∈ {0} + [1] ∈ {0; 77} + [2..4] ∈ {0} + q[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3; 77} + [3] ∈ {4} + [4] ∈ {5} + p2[0][bits 0 to 15]# ∈ {1} repeated %8 + [0][bits 16 to 31] ∈ {0} + [1] ∈ {33} + [2..4] ∈ {0} + q2[0] ∈ {1; 33} + [1] ∈ {33} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + t ∈ {0; 1} + x ∈ [0..99] + y ∈ {0; 3; 77} + z ∈ {-33} + PTR1 ∈ {{ &p[1] ; &q[2] }} + PTR2 ∈ [--..--] + PTR3 ∈ {{ &p2[1] }} + PTR4 ∈ {{ &q2[1] }} + c1 ∈ [--..--] + U{.ll[bits 0 to 31]; .i; .c[bits 0 to 31]} ∈ {2; 3} + {.ll[bits 32 to 63]#; .i[bits 32 to 63]#; .c[bits 32 to 63]#} ∈ + {16; 17}%64, bits 32 to 63 + ll1 ∈ {15; 16} + i_0 ∈ {100} +[from] Computing for function f2 +[from] Computing for function Frama_C_dump_each <-f2 +[from] Done for function Frama_C_dump_each +[from] Done for function f2 +[from] Computing for function main11 +[from] Done for function main11 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f2: + p2[0][bits 0 to 7] FROM x_0; p2[0][bits 0 to 7] + [0][bits 8 to 15] FROM x_0; p2[0][bits 8 to 15] +[from] Function main11: + A FROM q2[0]; c1 + B FROM q2[0]; c1 + D FROM c + p[1] FROM c (and SELF) + q[2] FROM c (and SELF) + p2[0][bits 0 to 7] FROM p2[0][bits 0 to 7] + [0][bits 8 to 15] FROM p2[0][bits 8 to 15] + [1] FROM \nothing + [2] FROM p2[2]; c (and SELF) + q2[0] FROM c1 (and SELF) + [1] FROM \nothing + t FROM c2 + x FROM \nothing (and SELF) + y FROM p[1]; q[2]; c + z FROM NULL[0..3]; PTR2; c + PTR1 FROM c + PTR2 FROM NULL[0..3]; PTR2 + PTR3 FROM c + PTR4 FROM c1 + c1 FROM c1 + U FROM c2 + ll1 FROM c2 +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f2: + q_0; p2[0][bits 0 to 15] +[inout] Inputs for function f2: + p2[0][bits 0 to 15] +[inout] Out (internal) for function main11: + A; B; D; p[1]; q[2]; p2{[0][bits 0 to 15]; [1..2]}; q2[0..1]; t; x; + y; z; PTR1; PTR2; PTR3; PTR4; c1; U; ll1; i_0; tm; tmp +[inout] Inputs for function main11: + NULL[0..3]; A; p[1]; q[2]; p2{[0][bits 0 to 15]; [1..2]}; q2[0]; t; + PTR1; PTR2; PTR3; PTR4; c; c1; c2; ll1 diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/alias.6.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/alias.6.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/alias.6.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/alias.6.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,137 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/alias.i (no preprocessing) +[value] Analyzing a complete application starting at main8 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + NULL[rbits 0 to 2047] ∈ [--..--] + A ∈ {0} + B ∈ {0} + C ∈ {0} + D ∈ {0} + E ∈ {0} + F ∈ {0} + G ∈ {0} + p[0..4] ∈ {0} + q[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p2[0..4] ∈ {0} + q2[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p3[0..4] ∈ {0} + t ∈ {0} + u ∈ {0} + v ∈ {0} + w ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} + t2 ∈ {0} + v2 ∈ {0} + PTR1 ∈ {0} + PTR2 ∈ {0} + PTR3 ∈ {0} + PTR4 ∈ {0} + PTR5 ∈ {0} + PTR6 ∈ {0} + c ∈ [--..--] + c1 ∈ [--..--] + c2 ∈ [--..--] + c3 ∈ [--..--] + c4 ∈ [--..--] + e ∈ {0} + g ∈ {0} + h ∈ {0} + i ∈ {0} + tz1 ∈ {0} + tz2 ∈ {0} + tz3 ∈ {0} + tx ∈ {0} + ty ∈ {0} + tz ∈ {0} + U ∈ {0} + char1 ∈ {0} + ll1 ∈ {0} +[value] Recording results for main8 +[value] done for function main8 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main8: + A ∈ {3; 4} + B ∈ {4; 5} + C ∈ {2; 3; 33; 44} + D ∈ {0; 4; 5; 33; 44} + p[0..1] ∈ {0} + [2] ∈ {0; 33} + [3] ∈ {0; 44} + [4] ∈ {0} + q[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4; 33} + [4] ∈ {5; 44} + q2[0] ∈ {1} + [1] ∈ {2; 33} + [2] ∈ {3; 44} + [3] ∈ {4} + [4] ∈ {5} + t ∈ {4; 5; 6} + u ∈ {0; 5} + v ∈ {0; 5; 44} + w ∈ {0; 4} + x ∈ {0; 4; 33} + y ∈ {0; 1} + z ∈ {0; 4; 33} + PTR1 ∈ {{ &p[2] ; &q[3] }} + PTR2 ∈ {{ &p[3] ; &q[4] }} + PTR3 ∈ {{ &p[2] ; &q[3] }} + PTR4 ∈ {{ &q2{[1], [2]} }} + PTR5 ∈ {{ &p{[2], [3]} ; &q{[3], [4]} }} + tz1 ∈ {0; 1} + tz2 ∈ {0; 1} + tz3 ∈ {0; 1} + tx ∈ {2; 3} + ty ∈ {3; 4} + tz ∈ {5; 6} +[from] Computing for function main8 +[from] Done for function main8 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main8: + A FROM c1 + B FROM c1 + C FROM q2[1..2]; c3 + D FROM p[2..3]; q[3..4]; c2; c3 + p[2..3] FROM c2 (and SELF) + q[3..4] FROM c2 (and SELF) + q2[1..2] FROM c3 (and SELF) + t FROM c1 + u FROM p[3]; q[4]; c2 + v FROM p[3]; q[4]; c2 + w FROM p[2]; q[3]; c2 + x FROM p[2]; q[3]; c2 + y FROM c1 + z FROM p[2]; q[3]; c2 + PTR1 FROM c2 + PTR2 FROM c2 + PTR3 FROM c2 + PTR4 FROM c3 + PTR5 FROM c2; c3 + tz1 FROM c + tz2 FROM c + tz3 FROM c + tx FROM c + ty FROM c + tz FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main8: + A; B; C; D; p[2..3]; q[3..4]; q2[1..2]; t; u; v; w; x; y; z; PTR1; + PTR2; PTR3; PTR4; PTR5; tz1; tz2; tz3; tx; ty; tz +[inout] Inputs for function main8: + A; B; p[2..3]; q[3..4]; q2[1..2]; PTR1; PTR2; PTR3; PTR4; PTR5; c; + c1; c2; c3; tx; ty; tz diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/alias.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/alias.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/alias.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/alias.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,158 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/alias.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + A ∈ {0} + B ∈ {0} + C ∈ {0} + D ∈ {0} + E ∈ {0} + F ∈ {0} + G ∈ {0} + p[0..4] ∈ {0} + q[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p2[0..4] ∈ {0} + q2[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p3[0..4] ∈ {0} + t ∈ {0} + u ∈ {0} + v ∈ {0} + w ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} + t2 ∈ {0} + v2 ∈ {0} + PTR1 ∈ {0} + PTR2 ∈ {0} + PTR3 ∈ {0} + PTR4 ∈ {0} + PTR5 ∈ {0} + PTR6 ∈ {0} + c ∈ [--..--] + c1 ∈ [--..--] + c2 ∈ [--..--] + c3 ∈ [--..--] + c4 ∈ [--..--] + e ∈ {0} + g ∈ {0} + h ∈ {0} + i ∈ {0} + tz1 ∈ {0} + tz2 ∈ {0} + tz3 ∈ {0} + tx ∈ {0} + ty ∈ {0} + tz ∈ {0} + U ∈ {0} + char1 ∈ {0} + ll1 ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/alias.i:45. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/alias.i:46. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/alias.i:47. +[value] Recording results for f +[value] Done for function f +tests/misc/alias.i:82:[kernel] warning: signed overflow. assert -2147483648 ≤ p3[1]-vol ≤ 2147483647; +[value] Called Frama_C_show_each_d0([-2147483648..2147483647]) +tests/misc/alias.i:84:[kernel] warning: signed overflow. assert -2147483648 ≤ p3[1]-vol ≤ 2147483647; +[value] Called Frama_C_show_each_d2([-2147483648..2147483647]) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: +Cannot filter: dumping raw memory (including unchanged variables) + A ∈ {516} + B ∈ {4} + C ∈ {0} + D ∈ {0} + E ∈ {0} + F ∈ {0} + G ∈ {0} + p[0][bits 0 to 15]# ∈ {1} repeated %8 + {[0][bits 16 to 31]; [1..4]} ∈ {0} + q[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + p2[0] ∈ {0; 7} + [1] ∈ {0; 6} + [2..4] ∈ {0} + q2[0] ∈ {1} + [1] ∈ {2; 7} + [2] ∈ {3; 6} + [3] ∈ {4} + [4] ∈ {5} + p3[0] ∈ {0} + [1] ∈ [--..--] + [2..4] ∈ {0} + t ∈ {1; 2; 4} + u ∈ {2; 3; 4; 5} + v ∈ {1; 2; 4; 5} + w ∈ {1; 2; 4; 5} + x ∈ {1; 4} + y ∈ {2; 4; 5} + z ∈ {3; 5} + t2 ∈ {0; 3; 6} + v2 ∈ {0; 2; 7} + PTR1 ∈ {{ &x ; &y }} + PTR2 ∈ {{ &y ; &z }} + PTR3 ∈ {{ &x ; &y }} + PTR4 ∈ {{ &p2[1] ; &q2[2] }} + PTR5 ∈ {0} + PTR6 ∈ {0} + c ∈ [--..--] + c1 ∈ [--..--] + c2 ∈ [--..--] + c3 ∈ [--..--] + c4 ∈ [--..--] + vol ∈ [--..--] + e ∈ {0} + g ∈ {0} + h ∈ {0} + i ∈ {0} + tz1 ∈ {0} + tz2 ∈ {0} + tz3 ∈ {0} + tx ∈ {0} + ty ∈ {0} + tz ∈ {0} + U ∈ {0} + char1 ∈ {0} + ll1 ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + FROMTOP +[from] Function main: + FROMTOP +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + ANYTHING(origin:Unknown) +[inout] Inputs for function f: + ANYTHING(origin:Unknown) +[inout] Out (internal) for function main: + ANYTHING(origin:Unknown) +[inout] Inputs for function main: + ANYTHING(origin:Unknown) diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/align_char_array.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/align_char_array.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/align_char_array.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/align_char_array.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/align_char_array.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ {0} + t[0][0..1] ∈ {0} + [0][2..6] ∈ {1} + {[0][7..9]; [1..9][0..9]} ∈ {0} + d1 ∈ {0} + s1 ∈ {0} + d2 ∈ {0} + s2 ∈ {0} + overlapread1 ∈ {0} + overlapread2 ∈ {0} + overlapread3 ∈ {0} + overlapread4 ∈ {0} +tests/misc/align_char_array.c:25:[kernel] warning: signed overflow. + assert -2147483648 ≤ (int)((char (*)[10])t)+3 ≤ 2147483647; +tests/misc/align_char_array.c:26:[kernel] warning: signed overflow. + assert -2147483648 ≤ (int)((char (*)[10])t)+3 ≤ 2147483647; +tests/misc/align_char_array.c:27:[kernel] warning: signed overflow. + assert -2147483648 ≤ (int)((char (*)[10])t)+2 ≤ 2147483647; +tests/misc/align_char_array.c:28:[kernel] warning: signed overflow. + assert -2147483648 ≤ (int)((char (*)[10])t)+2 ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + d1 ∈ {1} + s1 ∈ {3} + d2 ∈ {22} + s2 ∈ {100} + overlapread1# ∈ {1} repeated %8 + overlapread2# ∈ {1} repeated %8 + overlapread3 ∈ {16843010} + overlapread4 ∈ {16843010} + __retres ∈ {0} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/align.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/align.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/align.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/align.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,30 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/align.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + c[0..4][0..9] ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + c[0][0] ∈ {120} + {[0][1..9]; [1][0..9]; [2][0][bits 0 to 7]} ∈ {0} + [2][0][bits 8 to 15] ∈ {121} + {[2]{[0][bits 16 to 31]; [1..9]}; [3..4][0..9]} ∈ {0} + d ∈ {{ (char *)&c }} + l[bits 0 to 7] ∈ {2} + [bits 8 to 31] ∈ {0} + pl ∈ {{ &l }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + c{[0][0]; [2][0][bits 8 to 15]} FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + c{[0][0]; [2][0][bits 8 to 15]}; d; l; pl +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/annot.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/annot.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/annot.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/annot.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,45 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/annot.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + A ∈ {0} + B ∈ {0} + C ∈ {0} + u ∈ {0} + v ∈ {0} + w ∈ {0} +tests/misc/annot.i:5:[value] Function main: precondition got status unknown. +tests/misc/annot.i:15:[value] Assertion got status valid. +[value] Called Frama_C_show_each_diff({1}) +tests/misc/annot.i:21:[value] Assertion got status valid. +tests/misc/annot.i:28:[value] Assertion got status unknown. +tests/misc/annot.i:33:[value] Assertion got status unknown. +tests/misc/annot.i:38:[value] Assertion got status unknown. +[value] Called Frama_C_show_each_elseif_A_B({0}, {2}) +[value] Called Frama_C_show_each_else_A_B({0; 1}, {0; 2}) +tests/misc/annot.i:42:[value] Assertion got status unknown. +[value] Called Frama_C_show_each_mn([0..9], [0..9]) +tests/misc/annot.i:46:[value] Assertion got status valid. +tests/misc/annot.i:47:[value] Assertion got status valid. +tests/misc/annot.i:51:[value] Assertion got status unknown. +tests/misc/annot.i:53:[value] Assertion got status invalid (stopping propagation). +tests/misc/annot.i:7:[value] Function main: no state left in which to evaluate postcondition, status not computed. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + A; B; x; y; z; a; b; tt[0] +[inout] Inputs for function main: + A; B; u diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/annot_valid.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/annot_valid.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/annot_valid.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/annot_valid.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,45 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/annot_valid.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} +tests/misc/annot_valid.i:8:[value] Assertion got status valid. +tests/misc/annot_valid.i:11:[value] Assertion got status invalid (stopping propagation). +tests/misc/annot_valid.i:14:[value] Assertion got status valid. +tests/misc/annot_valid.i:17:[value] Assertion got status valid. +tests/misc/annot_valid.i:20:[value] Assertion got status valid. +tests/misc/annot_valid.i:23:[value] Assertion got status invalid (stopping propagation). +tests/misc/annot_valid.i:26:[value] Assertion got status invalid (stopping propagation). +tests/misc/annot_valid.i:29:[value] Assertion got status unknown. +tests/misc/annot_valid.i:32:[value] Assertion got status invalid (stopping propagation). +tests/misc/annot_valid.i:35:[value] Assertion got status valid. +tests/misc/annot_valid.i:38:[value] Assertion got status unknown. +tests/misc/annot_valid.i:41:[value] Assertion got status valid. +tests/misc/annot_valid.i:44:[value] Assertion got status invalid (stopping propagation). +tests/misc/annot_valid.i:47:[value] Assertion got status valid. +tests/misc/annot_valid.i:50:[value] Assertion got status invalid (stopping propagation). +tests/misc/annot_valid.i:53:[value] Assertion got status valid. +tests/misc/annot_valid.i:56:[value] Assertion got status valid. +tests/misc/annot_valid.i:57:[value] cannot evaluate ACSL term, \at() on a C label is unsupported +tests/misc/annot_valid.i:57:[value] Assertion got status unknown. +tests/misc/annot_valid.i:62:[value] Assertion got status invalid (stopping propagation). +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + p ∈ {{ &G }} + c ∈ {{ (char *)&G }} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + p; c; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/anonymous_field.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/anonymous_field.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/anonymous_field.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/anonymous_field.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,43 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/anonymous_field.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Sa ∈ {0} +[value] computing for function set_anonymous_struct <- main. + Called from tests/misc/anonymous_field.i:19. +tests/misc/anonymous_field.i:10:[value] Function set_anonymous_struct: postcondition got status valid. +[value] Recording results for set_anonymous_struct +[value] Done for function set_anonymous_struct +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function set_anonymous_struct: + Sa{.a; .__anonCompField1.gcc_a} ∈ {42} + {.__anonCompField1.gcc_b; .b} ∈ {3} +[value] Values at end of function main: + Sa{.a; .__anonCompField1.gcc_a} ∈ {42} + {.__anonCompField1.gcc_b; .b} ∈ {3} + __retres ∈ {0} +[from] Computing for function set_anonymous_struct +[from] Done for function set_anonymous_struct +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function set_anonymous_struct: + Sa.__anonCompField1.gcc_a FROM Sa.a + .__anonCompField1.gcc_b FROM Sa.b +[from] Function main: + Sa FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function set_anonymous_struct: + Sa.__anonCompField1 +[inout] Inputs for function set_anonymous_struct: + Sa{.a; .b} +[inout] Out (internal) for function main: + Sa; __retres +[inout] Inputs for function main: + Sa{.a; .b} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/any_int.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/any_int.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/any_int.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/any_int.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,30 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/any_int.c (with preprocessing) +[value] Analyzing a complete application starting at any_int +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/any_int.c:9:[value] entering loop for the first time +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert y+1 ≤ 2147483647; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert y+1 ≤ 2147483647; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert -2147483648 ≤ y-1; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert -2147483648 ≤ x-1; +[value] Recording results for any_int +[value] done for function any_int +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function any_int: + y ∈ [--..--] + x ∈ [--..--] +[from] Computing for function any_int +[from] Done for function any_int +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function any_int: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function any_int: + y; x +[inout] Inputs for function any_int: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/arch.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/arch.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/arch.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/arch.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/arch.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} + c ∈ {0} + l ∈ {0} + t[0..9] ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + a ∈ {4} + b ∈ {4} + c ∈ {4} + l ∈ {{ (unsigned long)&t }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + a FROM \nothing + b FROM \nothing + c FROM \nothing + l FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + a; b; c; l +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/arg_array.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/arg_array.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/arg_array.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/arg_array.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,31 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/arg_array.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/arg_array.i:2:[kernel] warning: out of bounds write. assert \valid(T); +tests/misc/arg_array.i:4:[kernel] warning: out of bounds write. assert \valid(ptr+1); +tests/misc/arg_array.i:5:[kernel] warning: out of bounds write. assert \valid(ptr+2); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + ptr ∈ {{ &S_T[0] }} + T ∈ {{ &S_T[0] }} + S_T[0] ∈ {0} + [1] ∈ {1} + [2] ∈ {2} + [3] ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + S_T[0..2] FROM T +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + ptr; T; S_T[0..2] +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/arith_pointer.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/arith_pointer.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/arith_pointer.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/arith_pointer.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,198 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/arith_pointer.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + t[0..24] ∈ {0} + vol ∈ [--..--] +[value] computing for function main1 <- main. + Called from tests/misc/arith_pointer.c:69. +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/arith_pointer.c:70. +tests/misc/arith_pointer.c:30:[kernel] warning: pointer subtraction: assert \base_addr(p1) ≡ \base_addr(p2); +[value] Called Frama_C_show_each({-1}) +[value] Called Frama_C_show_each({0}) +tests/misc/arith_pointer.c:49:[kernel] warning: pointer subtraction: assert \base_addr(p2) ≡ \base_addr(p1); +[value] Called Frama_C_show_each({6; 11}) +tests/misc/arith_pointer.c:51:[kernel] warning: pointer subtraction: assert \base_addr(p2) ≡ \base_addr(p2); +[value] Called Frama_C_show_each({0}) +tests/misc/arith_pointer.c:54:[value] warning: Operation {{ &x }} + {{ &x }} incurs a loss of precision +tests/misc/arith_pointer.c:54:[value] Assigning imprecise value to p1. + The imprecision originates from Arithmetic {tests/misc/arith_pointer.c:54} +tests/misc/arith_pointer.c:56:[value] Reading left-value p1. + It contains a garbled mix of {x} because of Arithmetic + {tests/misc/arith_pointer.c:54}. +tests/misc/arith_pointer.c:56:[kernel] warning: pointer subtraction: assert \base_addr(p2) ≡ \base_addr(p1); +tests/misc/arith_pointer.c:56:[kernel] warning: signed overflow. assert -2147483648 ≤ p2-p1 ≤ 2147483647; +[value] Called Frama_C_show_each([-2147483648..2147483647]) +tests/misc/arith_pointer.c:60:[value] Assertion got status unknown. +[value] Called Frama_C_show_each([-3..5]) +tests/misc/arith_pointer.c:65:[value] Assertion got status unknown. +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +tests/misc/arith_pointer.c:30:[value] Assertion 'Value,differing_blocks' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main1: + t[0..1] ∈ {-3} + [2..5] ∈ {-2} + [6..9] ∈ {-1} + [10..13] ∈ {0} + [14..17] ∈ {1} + [18..19] ∈ {2} + [20..24] ∈ {0} + i ∈ {10} + j ∈ {-10} +[value] Values at end of function main2: + d ∈ {1} + p1 ∈ {{ &x + {0; 4; 8; 12; 16} }} + p2 ∈ {{ &x + {4; 8; 12; 16; 20} }} + i ∈ {0; 1; 2; 3; 4} +[value] Values at end of function main: + t[0..1] ∈ {-3} + [2..5] ∈ {-2} + [6..9] ∈ {-1} + [10..13] ∈ {0} + [14..17] ∈ {1} + [18..19] ∈ {2} + [20..24] ∈ {0} +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main1: + t[0..19] FROM \nothing +[from] Function main2: + NO EFFECTS +[from] Function main: + t[0..19] FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main1: + t[0..19]; i; j +[inout] Inputs for function main1: + \nothing +[inout] Out (internal) for function main2: + d; p1; p2; i +[inout] Inputs for function main2: + vol +[inout] Out (internal) for function main: + t[0..19] +[inout] Inputs for function main: + vol +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + t[0..24] ∈ {0} + vol ∈ [--..--] +[value] computing for function main1 <- main. + Called from tests/misc/arith_pointer.c:69. +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/arith_pointer.c:70. +tests/misc/arith_pointer.c:30:[value] warning: Operation {{ &x }} - {{ &y }} incurs a loss of precision +tests/misc/arith_pointer.c:30:[kernel] warning: signed overflow. assert -2147483648 ≤ p1-p2 ≤ 2147483647; +tests/misc/arith_pointer.c:30:[value] Assigning imprecise value to d. + The imprecision originates from Arithmetic {tests/misc/arith_pointer.c:30} +tests/misc/arith_pointer.c:31:[value] Reading left-value d. + It contains a garbled mix of {x; y} because of Arithmetic + {tests/misc/arith_pointer.c:30}. +[value] Called Frama_C_show_each({{ garbled mix of &{x; y} + (origin: Arithmetic {tests/misc/arith_pointer.c:30}) }}) +[value] Called Frama_C_show_each({-1}) +[value] Called Frama_C_show_each({0}) +tests/misc/arith_pointer.c:49:[value] warning: Operation {{ &x + {28} ; &y + {76} }} - {{ &x + {4} ; &y + {32} }} incurs a loss of precision +tests/misc/arith_pointer.c:49:[kernel] warning: signed overflow. assert -2147483648 ≤ p2-p1 ≤ 2147483647; +tests/misc/arith_pointer.c:49:[value] Assigning imprecise value to d. + The imprecision originates from Arithmetic {tests/misc/arith_pointer.c:49} +tests/misc/arith_pointer.c:50:[value] Reading left-value d. + It contains a garbled mix of {x; y} because of Arithmetic + {tests/misc/arith_pointer.c:49}. +[value] Called Frama_C_show_each({{ garbled mix of &{x; y} + (origin: Arithmetic {tests/misc/arith_pointer.c:49}) }}) +tests/misc/arith_pointer.c:51:[value] warning: Operation {{ &x + {28} ; &y + {76} }} - {{ &x + {28} ; &y + {76} }} incurs a loss of precision +tests/misc/arith_pointer.c:51:[kernel] warning: signed overflow. assert -2147483648 ≤ p2-p2 ≤ 2147483647; +tests/misc/arith_pointer.c:51:[value] Assigning imprecise value to d. + The imprecision originates from Arithmetic {tests/misc/arith_pointer.c:51} +tests/misc/arith_pointer.c:52:[value] Reading left-value d. + It contains a garbled mix of {x; y} because of Arithmetic + {tests/misc/arith_pointer.c:51}. +[value] Called Frama_C_show_each({{ garbled mix of &{x; y} + (origin: Arithmetic {tests/misc/arith_pointer.c:51}) }}) +tests/misc/arith_pointer.c:56:[kernel] warning: signed overflow. assert -2147483648 ≤ p2-p1 ≤ 2147483647; +tests/misc/arith_pointer.c:56:[value] Assigning imprecise value to d. + The imprecision originates from Arithmetic {tests/misc/arith_pointer.c:54; + tests/misc/arith_pointer.c:56} +tests/misc/arith_pointer.c:57:[value] Reading left-value d. + It contains a garbled mix of {x} because of Arithmetic + {tests/misc/arith_pointer.c:54; tests/misc/arith_pointer.c:56}. +[value] Called Frama_C_show_each({{ garbled mix of &{x} + (origin: Arithmetic {tests/misc/arith_pointer.c:54; + tests/misc/arith_pointer.c:56}) }}) +[value] Called Frama_C_show_each([-3..5]) +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main1: + t[0..1] ∈ {-3} + [2..5] ∈ {-2} + [6..9] ∈ {-1} + [10..13] ∈ {0} + [14..17] ∈ {1} + [18..19] ∈ {2} + [20..24] ∈ {0} + i ∈ {10} + j ∈ {-10} +[value] Values at end of function main2: + d ∈ {1} + p1 ∈ {{ &x + {0; 4; 8; 12; 16} }} + p2 ∈ {{ &x + {4; 8; 12; 16; 20} }} + i ∈ {0; 1; 2; 3; 4} +[value] Values at end of function main: + t[0..1] ∈ {-3} + [2..5] ∈ {-2} + [6..9] ∈ {-1} + [10..13] ∈ {0} + [14..17] ∈ {1} + [18..19] ∈ {2} + [20..24] ∈ {0} +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main1: + t[0..19] FROM \nothing +[from] Function main2: + NO EFFECTS +[from] Function main: + t[0..19] FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main1: + t[0..19]; i; j +[inout] Inputs for function main1: + \nothing +[inout] Out (internal) for function main2: + d; p1; p2; i +[inout] Inputs for function main2: + vol +[inout] Out (internal) for function main: + t[0..19] +[inout] Inputs for function main: + vol diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/array_access.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_access.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/array_access.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_access.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,195 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/array_access.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t1[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + [5] ∈ {6} + [6] ∈ {7} + [7] ∈ {8} + [8] ∈ {9} + t2[0] ∈ {11} + [1] ∈ {12} + [2] ∈ {13} + [3] ∈ {14} + [4] ∈ {15} + [5] ∈ {16} + [6] ∈ {17} + [7] ∈ {18} + [8] ∈ {19} + ch[0] ∈ {0} + [1] ∈ {1} + [2] ∈ {0} + [3] ∈ {1} + [4] ∈ {0} + [5] ∈ {1} + [6] ∈ {0} + [7] ∈ {1} + [8] ∈ {0} + [9] ∈ {1} + [10] ∈ {0} + [11] ∈ {1} + [12] ∈ {0} + [13] ∈ {1} + [14] ∈ {0} + [15..17] ∈ {1} + [18] ∈ {0} + [19] ∈ {1} + [20] ∈ {0} + [21] ∈ {1} + [22] ∈ {0} + [23] ∈ {1} + [24] ∈ {0} + [25] ∈ {1} + [26] ∈ {0} + [27] ∈ {1} + [28] ∈ {0} + [29] ∈ {1} + [30] ∈ {0} + [31] ∈ {1} + [32] ∈ {0} + [33] ∈ {1} + [34] ∈ {0} + [35] ∈ {1} + [36] ∈ {0} + [37] ∈ {1} + [38] ∈ {0} + [39] ∈ {1} + [40] ∈ {0} + [41] ∈ {1} + [42] ∈ {0} + [43] ∈ {1} + [44] ∈ {0} + [45] ∈ {1} + [46] ∈ {0} + [47] ∈ {1} + [48] ∈ {0} + [49] ∈ {1} + [50] ∈ {0} + [51] ∈ {1} + [52] ∈ {0} + [53] ∈ {1} + [54] ∈ {0} + [55] ∈ {1} + [56] ∈ {0} + [57] ∈ {1} + [58] ∈ {0} + [59] ∈ {1} + [60] ∈ {0} + [61] ∈ {1} + [62] ∈ {0} + [63] ∈ {1} + [64] ∈ {0} + [65] ∈ {1} + [66] ∈ {0} + [67] ∈ {1} + [68] ∈ {0} + [69] ∈ {1} + [70] ∈ {0} + [71] ∈ {1} + [72] ∈ {0} + [73] ∈ {1} + [74] ∈ {0} + [75] ∈ {1} + [76] ∈ {0} + [77] ∈ {1} + [78] ∈ {0} + [79] ∈ {1} + [80] ∈ {0} + [81] ∈ {1} + [82] ∈ {0} + [83] ∈ {1} + [84] ∈ {0} + [85] ∈ {1} + [86] ∈ {0} + [87] ∈ {1} + [88] ∈ {0} + [89] ∈ {1} + [90] ∈ {0} + [91] ∈ {1} + [92] ∈ {0} + [93] ∈ {1} + [94] ∈ {0} + [95] ∈ {1} + [96] ∈ {0} + [97] ∈ {1} + [98] ∈ {0} + [99] ∈ {1} + [100] ∈ {0} + [101] ∈ {1} + [102] ∈ {0} + [103] ∈ {1} + [104] ∈ {2} + [105] ∈ {3} + [106] ∈ {4} + R ∈ {0} +[value] Call to builtin bzero(({{ (unsigned char *)< }},{40})) +[value] computing for function any_int <- main. + Called from tests/misc/array_access.c:16. +tests/misc/any_int.c:9:[value] entering loop for the first time +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert y+1 ≤ 2147483647; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert y+1 ≤ 2147483647; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert -2147483648 ≤ y-1; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert -2147483648 ≤ x-1; +[value] Recording results for any_int +[value] Done for function any_int +[value] computing for function any_int <- main. + Called from tests/misc/array_access.c:16. +[value] Recording results for any_int +[value] Done for function any_int +[value] Called CEA_I([0..8]) +tests/misc/array_access.c:19:[kernel] warning: accessing out of bounds index [-9..-1]. assert 0 ≤ (int)((int)(-i)-1) < 10; +[value] computing for function any_int <- main. + Called from tests/misc/array_access.c:21. +[value] Recording results for any_int +[value] Done for function any_int +tests/misc/array_access.c:21:[kernel] warning: out of bounds read. + assert \valid_read((int *)((char *)ch)+tmp_0); + (tmp_0 from any_int()) +[value] Recording results for main +[value] done for function main +tests/misc/array_access.c:19:[value] Assertion 'Value,index_bound' got final status valid. +tests/misc/array_access.c:19:[value] Assertion 'Value,index_bound' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function any_int: + y ∈ [--..--] + x ∈ [--..--] +[value] Values at end of function main: + R[bits 0 to 7] ∈ {0; 1} + [bits 8 to 15] ∈ {1} + [bits 16 to 23] ∈ {0} + [bits 24 to 31] ∈ {1} + i ∈ [--..--] + j ∈ {10} + k ∈ {88} + c ∈ [--..--] + p ∈ UNINITIALIZED + LT[0] ∈ {1} + [1..9] ∈ {0} +[from] Computing for function any_int +[from] Done for function any_int +[from] Computing for function main +[from] Computing for function Frama_C_bzero <-main +[from] Done for function Frama_C_bzero +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function any_int: + \result FROM \nothing +[from] Function main: + R FROM ch[0..103] +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function any_int: + y; x +[inout] Inputs for function any_int: + \nothing +[inout] Out (internal) for function main: + R; i; j; k; c; p; LT[0..9]; tmp; tmp_0 +[inout] Inputs for function main: + t1[0..8]; t2[0..8]; ch[0..103] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/array_array.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_array.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/array_array.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_array.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/array_array.c (with preprocessing) +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + StaticAllocHEAP[0..3] ∈ {2} + [4..9999] ∈ {0} + next_free ∈ {0} +[value] computing for function LIB_MEM_StaticAlloc <- main2. + Called from tests/misc/array_array.c:41. +[value] Called CEA_ALLOCATION_WITH_STATIC_ALLOC({24}) +[value] Recording results for LIB_MEM_StaticAlloc +[value] Done for function LIB_MEM_StaticAlloc +tests/misc/array_array.c:45:[value] entering loop for the first time +[value] Called CEA_TMP({0}) +[value] Called CEA_I({29}) +tests/misc/array_array.c:48:[kernel] warning: accessing out of bounds index {29}. assert i < 3; +tests/misc/array_array.c:48:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main2 +[value] done for function main2 +tests/misc/array_array.c:48:[value] Assertion 'Value,index_bound' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function LIB_MEM_StaticAlloc: + new ∈ {{ (void *)&StaticAllocHEAP }} + next_free ∈ {24} +[value] Values at end of function main2: + NON TERMINATING FUNCTION +[from] Computing for function LIB_MEM_StaticAlloc +[from] Done for function LIB_MEM_StaticAlloc +[from] Computing for function main2 +[from] Non-terminating function main2 (no dependencies) +[from] Done for function main2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function LIB_MEM_StaticAlloc: + next_free FROM size; next_free + \result FROM next_free +[from] Function main2: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function LIB_MEM_StaticAlloc: + new; tmp; next_free +[inout] Inputs for function LIB_MEM_StaticAlloc: + next_free +[inout] Out (internal) for function main2: + v; i; tmp___0; next_free +[inout] Inputs for function main2: + next_free diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/array_array.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_array.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/array_array.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_array.2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,47 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/array_array.c (with preprocessing) +[value] Analyzing a complete application starting at main3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + StaticAllocHEAP[0..3] ∈ {2} + [4..9999] ∈ {0} + next_free ∈ {0} +[value] computing for function LIB_MEM_StaticAlloc <- main3. + Called from tests/misc/array_array.c:66. +[value] Called CEA_ALLOCATION_WITH_STATIC_ALLOC({24}) +[value] Recording results for LIB_MEM_StaticAlloc +[value] Done for function LIB_MEM_StaticAlloc +tests/misc/array_array.c:68:[value] entering loop for the first time +tests/misc/array_array.c:69:[kernel] warning: accessing out of bounds index {29}. assert i < 3; +tests/misc/array_array.c:69:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main3 +[value] done for function main3 +tests/misc/array_array.c:69:[value] Assertion 'Value,index_bound' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function LIB_MEM_StaticAlloc: + new ∈ {{ (void *)&StaticAllocHEAP }} + next_free ∈ {24} +[value] Values at end of function main3: + NON TERMINATING FUNCTION +[from] Computing for function LIB_MEM_StaticAlloc +[from] Done for function LIB_MEM_StaticAlloc +[from] Computing for function main3 +[from] Non-terminating function main3 (no dependencies) +[from] Done for function main3 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function LIB_MEM_StaticAlloc: + next_free FROM size; next_free + \result FROM next_free +[from] Function main3: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function LIB_MEM_StaticAlloc: + new; tmp; next_free +[inout] Inputs for function LIB_MEM_StaticAlloc: + next_free +[inout] Out (internal) for function main3: + v; i; next_free +[inout] Inputs for function main3: + next_free diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/array_array.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_array.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/array_array.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_array.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,48 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/array_array.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + StaticAllocHEAP[0..3] ∈ {2} + [4..9999] ∈ {0} + next_free ∈ {0} +[value] computing for function LIB_MEM_StaticAlloc <- main. + Called from tests/misc/array_array.c:24. +[value] Called CEA_ALLOCATION_WITH_STATIC_ALLOC({24}) +[value] Recording results for LIB_MEM_StaticAlloc +[value] Done for function LIB_MEM_StaticAlloc +tests/misc/array_array.c:26:[value] entering loop for the first time +[value] Called CEA_I({29}) +tests/misc/array_array.c:28:[kernel] warning: accessing out of bounds index {29}. assert i < 3; +tests/misc/array_array.c:28:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +tests/misc/array_array.c:28:[value] Assertion 'Value,index_bound' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function LIB_MEM_StaticAlloc: + new ∈ {{ (void *)&StaticAllocHEAP }} + next_free ∈ {24} +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function LIB_MEM_StaticAlloc +[from] Done for function LIB_MEM_StaticAlloc +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function LIB_MEM_StaticAlloc: + next_free FROM size; next_free + \result FROM next_free +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function LIB_MEM_StaticAlloc: + new; tmp; next_free +[inout] Inputs for function LIB_MEM_StaticAlloc: + next_free +[inout] Out (internal) for function main: + v; i; next_free +[inout] Inputs for function main: + next_free diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/array_bounds.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_bounds.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/array_bounds.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_bounds.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,82 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/array_bounds.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + c ∈ [--..--] + s.a ∈ {1} + .T[0] ∈ {0} + .T[1] ∈ {1} + .T[2] ∈ {2} + .T[3] ∈ {3} + .T[4] ∈ {4} + .T[5] ∈ {5} + .T[6] ∈ {6} + .T[7] ∈ {7} + .T[8] ∈ {8} + .T[9] ∈ {9} + .T[10] ∈ {10} + .T[11] ∈ {11} + .b ∈ {20} + u.a ∈ {1} + .T[0] ∈ {0} + .T[1] ∈ {1} + .T[2] ∈ {2} + .T[3] ∈ {3} + .T[4] ∈ {4} + .T[5] ∈ {5} + .T[6] ∈ {6} + .T[7] ∈ {7} + .T[8] ∈ {8} + .T[9] ∈ {9} + .T[10] ∈ {10} + .T[11] ∈ {11} + .b ∈ {20} +tests/misc/array_bounds.i:14:[value] entering loop for the first time +[value] Called Frama_C_show_each({0}) +[value] Called Frama_C_show_each({0; 1}) +[value] Called Frama_C_show_each({0; 1; 2}) +[value] Called Frama_C_show_each({0; 1; 2; 3}) +[value] Called Frama_C_show_each({0; 1; 2; 3; 4}) +[value] Called Frama_C_show_each([0..11]) +[value] Called Frama_C_show_each([0..12]) +[value] Called Frama_C_show_each([0..15]) +tests/misc/array_bounds.i:16:[kernel] warning: out of bounds write. assert \valid(&u.T[i]); +[value] Called Frama_C_show_each([0..16]) +[value] Called Frama_C_show_each([0..127]) +[value] Called Frama_C_show_each([0..128]) +[value] Called Frama_C_show_each([0..512]) +[value] Called Frama_C_show_each([0..513]) +[value] Called Frama_C_show_each([0..32767]) +[value] Called Frama_C_show_each([0..32768]) +tests/misc/array_bounds.i:14:[kernel] warning: signed overflow. assert i+5 ≤ 2147483647; +[value] Called Frama_C_show_each([0..2147483647]) +tests/misc/array_bounds.i:14:[kernel] warning: signed overflow. assert i+1 ≤ 2147483647; +tests/misc/array_bounds.i:19:[value] entering loop for the first time +tests/misc/array_bounds.i:20:[kernel] warning: out of bounds write. assert \valid(&s.T[j]); +tests/misc/array_bounds.i:19:[kernel] warning: signed overflow. assert j+5 ≤ 2147483647; +tests/misc/array_bounds.i:19:[kernel] warning: signed overflow. assert j+1 ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + s.a ∈ {9} + {.T[0..11]; .b} ∈ [--..--] + u.a ∈ {-1; 1} + {.T[0..11]; .b} ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + s.a FROM \nothing + .T[0..11] FROM c (and SELF) + .b FROM c + u.a FROM c (and SELF) + {.T[0..11]; .b} FROM c (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + s; u; i; j +[inout] Inputs for function main: + c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/array_bounds.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_bounds.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/array_bounds.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_bounds.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,79 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/array_bounds.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + c ∈ [--..--] + s.a ∈ {1} + .T[0] ∈ {0} + .T[1] ∈ {1} + .T[2] ∈ {2} + .T[3] ∈ {3} + .T[4] ∈ {4} + .T[5] ∈ {5} + .T[6] ∈ {6} + .T[7] ∈ {7} + .T[8] ∈ {8} + .T[9] ∈ {9} + .T[10] ∈ {10} + .T[11] ∈ {11} + .b ∈ {20} + u.a ∈ {1} + .T[0] ∈ {0} + .T[1] ∈ {1} + .T[2] ∈ {2} + .T[3] ∈ {3} + .T[4] ∈ {4} + .T[5] ∈ {5} + .T[6] ∈ {6} + .T[7] ∈ {7} + .T[8] ∈ {8} + .T[9] ∈ {9} + .T[10] ∈ {10} + .T[11] ∈ {11} + .b ∈ {20} +tests/misc/array_bounds.i:14:[value] entering loop for the first time +[value] Called Frama_C_show_each({0}) +[value] Called Frama_C_show_each({0; 1}) +[value] Called Frama_C_show_each({0; 1; 2}) +[value] Called Frama_C_show_each({0; 1; 2; 3}) +[value] Called Frama_C_show_each({0; 1; 2; 3; 4}) +[value] Called Frama_C_show_each([0..11]) +[value] Called Frama_C_show_each([0..12]) +tests/misc/array_bounds.i:16:[kernel] warning: accessing out of bounds index [0..12]. assert i < 12; +tests/misc/array_bounds.i:19:[value] entering loop for the first time +tests/misc/array_bounds.i:20:[kernel] warning: accessing out of bounds index [0..12]. assert j < 12; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + s.a ∈ {9} + .T[0] ∈ {0} + .T[1] ∈ {1} + .T[2] ∈ {2} + .T[3] ∈ {3} + .T[4] ∈ {4} + .T[5] ∈ {5} + .T[6] ∈ {6} + .T[7] ∈ {7} + .T[8] ∈ {8} + .T[9] ∈ {9} + .T[10] ∈ {10} + .T[11] ∈ {11} + .b ∈ {9} + u.a ∈ {1} + .T[0..11] ∈ [--..--] + .b ∈ {20} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + s{.a; .b} FROM \nothing + u.T[0..11] FROM c (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + s; u.T[0..11]; i; j +[inout] Inputs for function main: + c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/array_degenerating_loop.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_degenerating_loop.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/array_degenerating_loop.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_degenerating_loop.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/array_degenerating_loop.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..1] ∈ {1} + [2..99] ∈ {0} +tests/misc/array_degenerating_loop.i:8:[value] entering loop for the first time +tests/misc/array_degenerating_loop.i:9:[kernel] warning: accessing out of bounds index [0..100]. assert i < 100; +tests/misc/array_degenerating_loop.i:9:[kernel] warning: signed overflow. assert G+t[i] ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + G ∈ [55..2147483647] + i ∈ [0..100] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + G; i +[inout] Inputs for function main: + t[0..99] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/array_initializer.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_initializer.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/array_initializer.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_initializer.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,50 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/array_initializer.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..1] ∈ UNINITIALIZED + [2] ∈ {3} + [3..4] ∈ {0} + s.a ∈ {97} + {.t[0..1]; .[bits 8 to 31]} ∈ UNINITIALIZED + .t[2] ∈ {3} + .t[3..4] ∈ {0} + u[0..1] ∈ UNINITIALIZED + [2] ∈ {2} + [3] ∈ UNINITIALIZED + [4] ∈ {4} + [5] ∈ {0} +[value] DUMPING STATE of file tests/misc/array_initializer.i line 9 + t[0..1] ∈ UNINITIALIZED + [2] ∈ {3} + [3..4] ∈ {0} + s.a ∈ {97} + {.t[0..1]; .[bits 8 to 31]} ∈ UNINITIALIZED + .t[2] ∈ {3} + .t[3..4] ∈ {0} + u[0..1] ∈ UNINITIALIZED + [2] ∈ {2} + [3] ∈ UNINITIALIZED + [4] ∈ {4} + [5] ∈ {0} + =END OF DUMP== +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/array_loop.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_loop.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/array_loop.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_loop.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,46 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/array_loop.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0] ∈ {17} + [1] ∈ {18} + [2] ∈ {19} + [3] ∈ {20} + [4] ∈ {21} + [5] ∈ {22} + [6] ∈ {23} + [7] ∈ {24} + [8..17] ∈ {1} + [18..19] ∈ {0} + tt[0] ∈ {17} + [1] ∈ {18} + [2] ∈ {19} + [3] ∈ {20} + [4] ∈ {21} + [5] ∈ {22} + [6] ∈ {23} + [7] ∈ {24} + [8..17] ∈ {1} + [18..19] ∈ {0} +tests/misc/array_loop.i:7:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + t[0..7] ∈ [-14..24] + [8..17] ∈ {1} + [18..19] ∈ {0} + i ∈ {16} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + t[0..7] FROM tt[0..15] (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + t[0..7]; i +[inout] Inputs for function main: + tt[0..15] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/array_overlap.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_overlap.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/array_overlap.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_overlap.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,50 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/array_overlap.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..2] ∈ {1} + [3..4] ∈ {2} + [5] ∈ {3} + [6..9] ∈ {0} + U[0..2] ∈ {1} + [3..4] ∈ {2} + [5] ∈ {3} + [6..9] ∈ {0} +tests/misc/array_overlap.i:11:[kernel] warning: partially overlapping lvalue assignment (T with offsets {8}, size <48> bits; + T with offsets {0}, size <48> bits). + assert + ptr ≡ (struct S *)((char *)T) ∨ \separated(ptr, (struct S *)((char *)T)); +tests/misc/array_overlap.i:16:[kernel] warning: partially overlapping lvalue assignment (U with offsets {0; 8}, + size <48> bits; U with offsets {0}, size <48> bits). + assert + ptr ≡ (struct S *)((char *)U) ∨ \separated(ptr, (struct S *)((char *)U)); +[value] Recording results for main +[value] done for function main +tests/misc/array_overlap.i:11:[value] Assertion 'Value,overlap' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + T[0..3] ∈ {1} + [4..5] ∈ {2} + [6] ∈ {3} + [7..9] ∈ {0} + U[0..2] ∈ {1} + [3] ∈ {1; 2} + [4] ∈ {2} + [5] ∈ {2; 3} + [6] ∈ {0; 3} + [7..9] ∈ {0} + ptr ∈ {{ (struct S *)&U{[0], [1]} }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + T[1..6] FROM T[0..5] + U[0..6] FROM U[0..5]; c (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + T[1..6]; U[0..6]; ptr; i +[inout] Inputs for function main: + T[0..5]; U[0..5] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/array_ptr.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_ptr.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/array_ptr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_ptr.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,50 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/array_ptr.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {1} + l[0] ∈ {1} + [1..19] ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/array_ptr.i:15. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + G ∈ {1} + l[0] ∈ {2} + [1..19] ∈ {0} + __retres ∈ {2} +[value] Values at end of function main: + G ∈ {1} + l[0] ∈ {2} + [1..19] ∈ {0} + g ∈ {{ (int)&l }} + __retres ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + G FROM x; l[0]; g + l[0] FROM x; g + \result FROM \nothing +[from] Function main: + G FROM l[0] + l[0] FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + G; l[0]; __retres +[inout] Inputs for function f: + l[0]; g +[inout] Out (internal) for function main: + G; l[0]; g; __retres +[inout] Inputs for function main: + l[0] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/array_zero_length.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_zero_length.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/array_zero_length.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_zero_length.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,57 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/array_zero_length.i (no preprocessing) +tests/misc/array_zero_length.i:7:[kernel] warning: Length of array is zero. This GCC extension is unsupported. Assuming length is 1. +tests/misc/array_zero_length.i:9:[kernel] warning: Length of array is zero. This GCC extension is unsupported. Assuming length is 1. +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +tests/misc/array_zero_length.i:6:[value] warning: during initialization of variable 'T', size of type 'char []' cannot be + computed (Size of array without number of elements.) +tests/misc/array_zero_length.i:8:[value] warning: during initialization of variable 'V', size of type 'char [][2]' cannot be + computed (Size of array without number of elements.) +tests/misc/array_zero_length.i:9:[value] warning: during initialization of variable 'W', size of type 'char [][1]' cannot be + computed (Size of array without number of elements.) +tests/misc/array_zero_length.i:6:[value] no size specified for array, assuming 0 +tests/misc/array_zero_length.i:8:[value] no size specified for array, assuming 0 +tests/misc/array_zero_length.i:9:[value] no size specified for array, assuming 0 +[value] Initial state computed +[value] Values of globals at initialization + T[0..4294967295] ∈ {0} or UNINITIALIZED + U[0] ∈ [--..--] + V[0..2147483647][0..1] ∈ {0} or UNINITIALIZED + W[0..4294967295][0] ∈ {0} or UNINITIALIZED + pW ∈ {{ NULL ; &S_pW[0] }} + S_pW[0..1] ∈ [--..--] +tests/misc/array_zero_length.i:14:[kernel] warning: out of bounds write. assert \valid(&T[2]); +tests/misc/array_zero_length.i:15:[kernel] warning: out of bounds write. assert \valid(&T[1]); +tests/misc/array_zero_length.i:15:[kernel] warning: accessing uninitialized left-value: assert \initialized(&T[3]); +tests/misc/array_zero_length.i:15:[kernel] warning: out of bounds read. assert \valid_read(&T[3]); +tests/misc/array_zero_length.i:17:[kernel] warning: accessing out of bounds index {2}. assert 2 < 1; +tests/misc/array_zero_length.i:17:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +tests/misc/array_zero_length.i:18:[kernel] warning: accessing out of bounds index {1}. assert 1 < 1; +tests/misc/array_zero_length.i:18:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +tests/misc/array_zero_length.i:20:[kernel] warning: out of bounds write. assert \valid(&V[2][1]); +tests/misc/array_zero_length.i:21:[kernel] warning: out of bounds write. assert \valid(&V[1][1]); +tests/misc/array_zero_length.i:21:[kernel] warning: accessing uninitialized left-value: assert \initialized(&V[3][1]); +tests/misc/array_zero_length.i:21:[kernel] warning: out of bounds read. assert \valid_read(&V[3][1]); +tests/misc/array_zero_length.i:23:[kernel] warning: accessing out of bounds index {1}. assert 1 < 1; +tests/misc/array_zero_length.i:23:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +tests/misc/array_zero_length.i:24:[kernel] warning: accessing out of bounds index {1}. assert 1 < 1; +tests/misc/array_zero_length.i:24:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +tests/misc/array_zero_length.i:17:[value] Assertion 'Value,index_bound' got final status invalid. +tests/misc/array_zero_length.i:18:[value] Assertion 'Value,index_bound' got final status invalid. +tests/misc/array_zero_length.i:23:[value] Assertion 'Value,index_bound' got final status invalid. +tests/misc/array_zero_length.i:24:[value] Assertion 'Value,index_bound' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + T[0] ∈ {0} or UNINITIALIZED + [1] ∈ {0; 3} or UNINITIALIZED + [2] ∈ {3} + [3..4294967295] ∈ {0} or UNINITIALIZED + V{[0][0..1]; [1][0]} ∈ {0} or UNINITIALIZED + [1][1] ∈ {0; 3} or UNINITIALIZED + [2][0] ∈ {0} or UNINITIALIZED + [2][1] ∈ {0; 3} or UNINITIALIZED + [3..2147483647][0..1] ∈ {0} or UNINITIALIZED + pW ∈ {{ NULL ; &W[1][0] ; &S_pW[0] }} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/array_zero_length.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_zero_length.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/array_zero_length.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/array_zero_length.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,53 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/array_zero_length.i (no preprocessing) +tests/misc/array_zero_length.i:7:[kernel] warning: Length of array is zero. This GCC extension is unsupported. Assuming length is 1. +tests/misc/array_zero_length.i:9:[kernel] warning: Length of array is zero. This GCC extension is unsupported. Assuming length is 1. +[value] Analyzing a complete application starting at main +[value] Computing initial state +tests/misc/array_zero_length.i:6:[value] warning: during initialization of variable 'T', size of type 'char []' cannot be + computed (Size of array without number of elements.) +tests/misc/array_zero_length.i:8:[value] warning: during initialization of variable 'V', size of type 'char [][2]' cannot be + computed (Size of array without number of elements.) +tests/misc/array_zero_length.i:9:[value] warning: during initialization of variable 'W', size of type 'char [][1]' cannot be + computed (Size of array without number of elements.) +[value] Initial state computed +[value] Values of globals at initialization + T[0..4294967295] ∈ {0} or UNINITIALIZED + U[0] ∈ {0} + V[0..2147483647][0..1] ∈ {0} or UNINITIALIZED + W[0..4294967295][0] ∈ {0} or UNINITIALIZED + pW ∈ {0} +tests/misc/array_zero_length.i:14:[kernel] warning: out of bounds write. assert \valid(&T[2]); +tests/misc/array_zero_length.i:15:[kernel] warning: out of bounds write. assert \valid(&T[1]); +tests/misc/array_zero_length.i:15:[kernel] warning: accessing uninitialized left-value: assert \initialized(&T[3]); +tests/misc/array_zero_length.i:15:[kernel] warning: out of bounds read. assert \valid_read(&T[3]); +tests/misc/array_zero_length.i:17:[kernel] warning: accessing out of bounds index {2}. assert 2 < 1; +tests/misc/array_zero_length.i:17:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +tests/misc/array_zero_length.i:18:[kernel] warning: accessing out of bounds index {1}. assert 1 < 1; +tests/misc/array_zero_length.i:18:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +tests/misc/array_zero_length.i:20:[kernel] warning: out of bounds write. assert \valid(&V[2][1]); +tests/misc/array_zero_length.i:21:[kernel] warning: out of bounds write. assert \valid(&V[1][1]); +tests/misc/array_zero_length.i:21:[kernel] warning: accessing uninitialized left-value: assert \initialized(&V[3][1]); +tests/misc/array_zero_length.i:21:[kernel] warning: out of bounds read. assert \valid_read(&V[3][1]); +tests/misc/array_zero_length.i:23:[kernel] warning: accessing out of bounds index {1}. assert 1 < 1; +tests/misc/array_zero_length.i:23:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +tests/misc/array_zero_length.i:24:[kernel] warning: accessing out of bounds index {1}. assert 1 < 1; +tests/misc/array_zero_length.i:24:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +tests/misc/array_zero_length.i:17:[value] Assertion 'Value,index_bound' got final status invalid. +tests/misc/array_zero_length.i:18:[value] Assertion 'Value,index_bound' got final status invalid. +tests/misc/array_zero_length.i:23:[value] Assertion 'Value,index_bound' got final status invalid. +tests/misc/array_zero_length.i:24:[value] Assertion 'Value,index_bound' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + T[0] ∈ {0} or UNINITIALIZED + [1] ∈ {0; 3} or UNINITIALIZED + [2] ∈ {3} + [3..4294967295] ∈ {0} or UNINITIALIZED + V{[0][0..1]; [1][0]} ∈ {0} or UNINITIALIZED + [1][1] ∈ {0; 3} or UNINITIALIZED + [2][0] ∈ {0} or UNINITIALIZED + [2][1] ∈ {0; 3} or UNINITIALIZED + [3..2147483647][0..1] ∈ {0} or UNINITIALIZED + pW ∈ {{ NULL ; &W[1][0] }} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/assert_builtin.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/assert_builtin.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/assert_builtin.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/assert_builtin.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/assert_builtin.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..9] ∈ {0} +tests/misc/assert_builtin.i:6:[value] warning: Frama_C_assert: unknown +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +tests/misc/assert_builtin.i:6:[kernel] warning: Neither code nor specification for function Frama_C_assert, generating default assigns from the prototype +[value] Values at end of function main: + __retres ∈ {0} +[from] Computing for function main +[from] Computing for function Frama_C_assert <-main +[from] Done for function Frama_C_assert +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM t[0..9]; c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + __retres +[inout] Inputs for function main: + t[0..9] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/assert_ptr.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/assert_ptr.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/assert_ptr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/assert_ptr.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/assert_ptr.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + ptr ∈ {0} + q ∈ {0} + s_q ∈ {0} + a ∈ {0} + r ∈ {0} +tests/misc/assert_ptr.i:8:[value] Assertion got status valid. +[value] Called Frama_C_show_each_ptr({{ NULL ; &a }}) +tests/misc/assert_ptr.i:12:[value] Assertion got status unknown. +[value] Called Frama_C_show_each_q({{ &a }}) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + ptr ∈ {{ NULL ; &a }} + q ∈ {{ (int **)&s_q }} + s_q ∈ {{ (int)&a }} + a ∈ {0; 1} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + ptr FROM c (and SELF) + q FROM \nothing + s_q FROM d; e (and SELF) + a FROM ptr; a; c (and SELF) + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + ptr; q; s_q; a; __retres +[inout] Inputs for function main: + ptr; q; s_q; a diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/assigns_from.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/assigns_from.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/assigns_from.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/assigns_from.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,673 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/assigns_from.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + u ∈ {0} + v ∈ {0} + k ∈ {0} + a[0..9] ∈ {0} + constante ∈ {2} + t[0..99] ∈ {0} + p_t ∈ {{ &t[0] }} + t17[0..9] ∈ {0} +[value] computing for function main1 <- main. + Called from tests/misc/assigns_from.i:203. +[value] computing for function f <- main1 <- main. + Called from tests/misc/assigns_from.i:30. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for main1 +[from] Computing for function main1 +[from] Done for function main1 +tests/misc/assigns_from.i:12:[value] Function main1: assigns got status valid. +tests/misc/assigns_from.i:15:[value] Function main1, behavior true: assigns got status valid. +tests/misc/assigns_from.i:15:[value] Function main1, behavior true: \from ... part in assign clause got status valid. +tests/misc/assigns_from.i:16:[value] Function main1, behavior true: \from ... part in assign clause got status valid. +tests/misc/assigns_from.i:19:[value] Function main1, behavior ok_too_large: assigns got status valid. +tests/misc/assigns_from.i:19:[value] Function main1, behavior ok_too_large: \from ... part in assign clause got status valid. +tests/misc/assigns_from.i:20:[value] Function main1, behavior ok_too_large: \from ... part in assign clause got status valid. +tests/misc/assigns_from.i:23:[value] Function main1, behavior wrong: assigns got status valid. +tests/misc/assigns_from.i:23:[value] Function main1, behavior wrong: \from ... part in assign clause got status valid. +tests/misc/assigns_from.i:24:[value] Function main1, behavior wrong: \from ... part in assign clause got status unknown. +[value] Done for function main1 +[value] computing for function main15 <- main. + Called from tests/misc/assigns_from.i:204. +[value] Recording results for main15 +[from] Computing for function main15 +[from] Done for function main15 +tests/misc/assigns_from.i:37:[value] Function main15: assigns got status valid. +tests/misc/assigns_from.i:37:[value] Function main15: \from ... part in assign clause got status valid. +tests/misc/assigns_from.i:37:[value] Function main15: \from ... part in assign clause got status valid. +tests/misc/assigns_from.i:37:[value] Function main15: \from ... part in assign clause got status valid. +[value] Done for function main15 +[value] computing for function main2 <- main. + Called from tests/misc/assigns_from.i:205. +[value] Recording results for main2 +[from] Computing for function main2 +[from] Done for function main2 +tests/misc/assigns_from.i:45:[value] Function main2: assigns got status valid. +tests/misc/assigns_from.i:45:[value] Function main2: \from ... part in assign clause got status valid. +tests/misc/assigns_from.i:48:[value] Function main2, behavior true: assigns got status valid. +tests/misc/assigns_from.i:48:[value] Function main2, behavior true: \from ... part in assign clause got status valid. +tests/misc/assigns_from.i:52:[value] Function main2, behavior wrongassigns: assigns got status unknown. +tests/misc/assigns_from.i:52:[value] Function main2, behavior wrongassigns: \from ... part in assign clause got status valid. +tests/misc/assigns_from.i:56:[value] Function main2, behavior true2: assigns got status valid. +tests/misc/assigns_from.i:56:[value] Function main2, behavior true2: \from ... part in assign clause got status valid. +tests/misc/assigns_from.i:60:[value] Function main2, behavior wrongfrom: assigns got status valid. +tests/misc/assigns_from.i:60:[value] Function main2, behavior wrongfrom: \from ... part in assign clause got status unknown. +[value] Done for function main2 +[value] computing for function Frama_C_interval <- main. + Called from tests/misc/assigns_from.i:206. +[value] using specification for function Frama_C_interval +[value] Done for function Frama_C_interval +[value] computing for function main3 <- main. + Called from tests/misc/assigns_from.i:207. +[value] Recording results for main3 +[from] Computing for function main3 +[from] Done for function main3 +tests/misc/assigns_from.i:67:[value] Function main3: assigns got status valid. +tests/misc/assigns_from.i:67:[value] Function main3: \from ... part in assign clause got status valid. +[value] Done for function main3 +[value] computing for function main3 <- main. + Called from tests/misc/assigns_from.i:208. +[value] Recording results for main3 +[from] Computing for function main3 +[from] Done for function main3 +tests/misc/assigns_from.i:67:[value] Function main3: assigns got status unknown. +[value] Done for function main3 +[value] computing for function main4 <- main. + Called from tests/misc/assigns_from.i:209. +[value] Recording results for main4 +[from] Computing for function main4 +[from] Done for function main4 +tests/misc/assigns_from.i:78:[value] Function main4, behavior true: assigns got status valid. +tests/misc/assigns_from.i:78:[value] Function main4, behavior true: \from ... part in assign clause got status valid. +tests/misc/assigns_from.i:82:[value] Function main4, behavior wrong: assigns got status valid. +tests/misc/assigns_from.i:82:[value] Function main4, behavior wrong: \from ... part in assign clause got status unknown. +[value] Done for function main4 +[value] computing for function main5 <- main. + Called from tests/misc/assigns_from.i:210. +[value] Recording results for main5 +[from] Computing for function main5 +[from] Done for function main5 +tests/misc/assigns_from.i:92:[value] Function main5, behavior wrong: assigns got status valid. +tests/misc/assigns_from.i:92:[value] Function main5, behavior wrong: \from ... part in assign clause got status unknown. +tests/misc/assigns_from.i:95:[value] Function main5, behavior true: assigns got status valid. +tests/misc/assigns_from.i:95:[value] Function main5, behavior true: \from ... part in assign clause got status valid. +[value] Done for function main5 +[value] computing for function Frama_C_interval <- main. + Called from tests/misc/assigns_from.i:211. +[value] Done for function Frama_C_interval +[value] computing for function Frama_C_interval <- main. + Called from tests/misc/assigns_from.i:212. +[value] Done for function Frama_C_interval +[value] computing for function main6_right <- main. + Called from tests/misc/assigns_from.i:213. +[value] Recording results for main6_right +[from] Computing for function main6_right +[from] Done for function main6_right +tests/misc/assigns_from.i:111:[value] Function main6_right: assigns got status valid. +[value] Done for function main6_right +[value] computing for function main6_wrong <- main. + Called from tests/misc/assigns_from.i:214. +[value] Recording results for main6_wrong +[from] Computing for function main6_wrong +[from] Done for function main6_wrong +tests/misc/assigns_from.i:102:[value] Function main6_wrong: assigns got status unknown. +[value] Done for function main6_wrong +[value] computing for function main7 <- main. + Called from tests/misc/assigns_from.i:215. +[value] Recording results for main7 +[from] Computing for function main7 +[from] Done for function main7 +tests/misc/assigns_from.i:119:[value] Function main7, behavior right: assigns got status valid. +tests/misc/assigns_from.i:122:[value] Function main7, behavior wrong: assigns got status unknown. +[value] Done for function main7 +[value] computing for function main8 <- main. + Called from tests/misc/assigns_from.i:218. +[value] Recording results for main8 +[from] Computing for function main8 +[from] Done for function main8 +tests/misc/assigns_from.i:130:[value] Function main8: assigns got status valid. +tests/misc/assigns_from.i:130:[value] Function main8: \from ... part in assign clause got status valid. +[value] Done for function main8 +[value] computing for function main8 <- main. + Called from tests/misc/assigns_from.i:220. +[value] Recording results for main8 +[from] Computing for function main8 +[from] Done for function main8 +tests/misc/assigns_from.i:130:[value] Function main8: assigns got status unknown. +[value] Done for function main8 +[value] computing for function main9 <- main. + Called from tests/misc/assigns_from.i:222. +[value] Recording results for main9 +[from] Computing for function main9 +[from] Done for function main9 +tests/misc/assigns_from.i:141:[kernel] warning: using size of 'void' +tests/misc/assigns_from.i:135:[value] Function main9: assigns got status valid. +[value] Done for function main9 +[value] computing for function main10 <- main. + Called from tests/misc/assigns_from.i:223. +tests/misc/assigns_from.i:152:[value] entering loop for the first time +tests/misc/assigns_from.i:152:[kernel] warning: Neither code nor specification for function c, generating default assigns from the prototype +[value] computing for function c <- main10 <- main. + Called from tests/misc/assigns_from.i:152. +[value] using specification for function c +[value] Done for function c +[value] computing for function c <- main10 <- main. + Called from tests/misc/assigns_from.i:152. +[value] Done for function c +[value] computing for function c <- main10 <- main. + Called from tests/misc/assigns_from.i:152. +[value] Done for function c +[value] computing for function c <- main10 <- main. + Called from tests/misc/assigns_from.i:152. +[value] Done for function c +[value] computing for function c <- main10 <- main. + Called from tests/misc/assigns_from.i:152. +[value] Done for function c +[value] computing for function c <- main10 <- main. + Called from tests/misc/assigns_from.i:152. +[value] Done for function c +[value] computing for function c <- main10 <- main. + Called from tests/misc/assigns_from.i:152. +[value] Done for function c +[value] computing for function c <- main10 <- main. + Called from tests/misc/assigns_from.i:152. +[value] Done for function c +[value] computing for function c <- main10 <- main. + Called from tests/misc/assigns_from.i:152. +[value] Done for function c +tests/misc/assigns_from.i:154:[value] Assertion got status unknown. +[value] Recording results for main10 +[from] Computing for function main10 +[from] Done for function main10 +[value] Done for function main10 +[value] computing for function main11 <- main. + Called from tests/misc/assigns_from.i:224. +[value] Recording results for main11 +[from] Computing for function main11 +[from] Done for function main11 +tests/misc/assigns_from.i:157:[value] Function main11: assigns got status valid. +tests/misc/assigns_from.i:157:[value] Function main11: \from ... part in assign clause got status valid. +[value] Done for function main11 +[value] computing for function main11 <- main. + Called from tests/misc/assigns_from.i:225. +[value] Recording results for main11 +[from] Computing for function main11 +[from] Done for function main11 +tests/misc/assigns_from.i:157:[value] Function main11: assigns got status unknown. +tests/misc/assigns_from.i:157:[value] Function main11: \from ... part in assign clause got status unknown. +[value] Done for function main11 +[value] computing for function Frama_C_interval <- main. + Called from tests/misc/assigns_from.i:226. +[value] Done for function Frama_C_interval +[value] computing for function main11 <- main. + Called from tests/misc/assigns_from.i:226. +[value] Recording results for main11 +[from] Computing for function main11 +[from] Done for function main11 +[value] Done for function main11 +[value] computing for function main12 <- main. + Called from tests/misc/assigns_from.i:227. +[value] Recording results for main12 +[from] Computing for function main12 +[from] Done for function main12 +tests/misc/assigns_from.i:169:[value] Function main12, behavior ok: assigns got status valid. +tests/misc/assigns_from.i:167:[value] Function main12, behavior ok: \from ... part in assign clause got status valid. +[value] Done for function main12 +[value] computing for function main13 <- main. + Called from tests/misc/assigns_from.i:228. +[value] Recording results for main13 +[from] Computing for function main13 +[from] Done for function main13 +tests/misc/assigns_from.i:179:[value] Function main13, behavior ok: assigns got status valid. +tests/misc/assigns_from.i:174:[value] Function main13, behavior ok: \from ... part in assign clause got status valid. +tests/misc/assigns_from.i:179:[value] Function main13, behavior bad: assigns got status valid. +tests/misc/assigns_from.i:177:[value] Function main13, behavior bad: \from ... part in assign clause got status unknown. +[value] Done for function main13 +[value] computing for function main14 <- main. + Called from tests/misc/assigns_from.i:229. +tests/misc/assigns_from.i:183:[value] entering loop for the first time +[value] Recording results for main14 +[from] Computing for function main14 +[from] Done for function main14 +tests/misc/assigns_from.i:181:[value] Function main14: assigns got status valid. +tests/misc/assigns_from.i:181:[value] Function main14: \from ... part in assign clause got status unknown. +[value] Done for function main14 +[value] computing for function main16 <- main. + Called from tests/misc/assigns_from.i:230. +tests/misc/assigns_from.i:188:[value] entering loop for the first time +[value] Recording results for main16 +[from] Computing for function main16 +[from] Done for function main16 +tests/misc/assigns_from.i:186:[value] Function main16: assigns got status valid. +tests/misc/assigns_from.i:186:[value] Function main16: \from ... part in assign clause got status unknown. +[value] Done for function main16 +[value] computing for function main17 <- main. + Called from tests/misc/assigns_from.i:231. +tests/misc/assigns_from.i:195:[value] entering loop for the first time +[value] Recording results for main17 +[from] Computing for function main17 +[from] Done for function main17 +tests/misc/assigns_from.i:193:[value] Function main17: assigns got status valid. +tests/misc/assigns_from.i:193:[value] Function main17: \from ... part in assign clause got status unknown. +[value] Done for function main17 +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + k ∈ {0} +[value] Values at end of function main1: + u ∈ {0} + k ∈ {3} +[value] Values at end of function main10: + t10[0..13] ∈ {3} or UNINITIALIZED + [14..37] ∈ {3} + [38..49] ∈ {3} or UNINITIALIZED + i ∈ {50} +[value] Values at end of function main11: + a[0..1] ∈ {0; 3} + [2] ∈ {3} + [3..8] ∈ {0} + [9] ∈ {0; 3} +[value] Values at end of function main12: + __retres ∈ {{ &t[0] }} +[value] Values at end of function main13: + +[value] Values at end of function main14: + t[0..1] ∈ {0} + [2..38] ∈ [0..38] + [39..99] ∈ {0} + i ∈ {39} +[value] Values at end of function main15: + a[0..2] ∈ {0} + [3] ∈ {2} + [4] ∈ {3} + [5] ∈ {4} + [6..9] ∈ {0} +[value] Values at end of function main16: + t[0] ∈ {0} + [1] ∈ [0..19] + [2..38] ∈ [0..38] + [39..99] ∈ {0} + i ∈ {20} +[value] Values at end of function main17: + t17[0][bits 0 to 7] ∈ [0..9] + [0][bits 8 to 31] ∈ {0} + [1][bits 0 to 7] ∈ [0..9] + [1][bits 8 to 31] ∈ {0} + [2][bits 0 to 7] ∈ [0..9] + [2][bits 8 to 31] ∈ {0} + [3][bits 0 to 7] ∈ [0..9] + [3][bits 8 to 31] ∈ {0} + [4][bits 0 to 7] ∈ [0..9] + [4][bits 8 to 31] ∈ {0} + [5][bits 0 to 7] ∈ [0..9] + [5][bits 8 to 31] ∈ {0} + [6][bits 0 to 7] ∈ [0..9] + [6][bits 8 to 31] ∈ {0} + [7][bits 0 to 7] ∈ [0..9] + [7][bits 8 to 31] ∈ {0} + [8][bits 0 to 7] ∈ [0..9] + [8][bits 8 to 31] ∈ {0} + [9][bits 0 to 7] ∈ [0..9] + [9][bits 8 to 31] ∈ {0} + j ∈ {10; 11; 12; 13; 14; 15} +[value] Values at end of function main2: + a[0..2] ∈ {0} + [3] ∈ {2} + [4] ∈ {3} + [5] ∈ {4} + [6..9] ∈ {0} +[value] Values at end of function main3: + a[0..2] ∈ {0; 3} + [3] ∈ {2; 3} + [4] ∈ {3} + [5] ∈ {3; 4} + [6] ∈ {3} + [7..9] ∈ {0; 3} +[value] Values at end of function main4: + a[0..1] ∈ {0; 3} + [2] ∈ {3} + [3] ∈ {2; 3} + [4] ∈ {3} + [5] ∈ {3; 4} + [6] ∈ {3} + [7..9] ∈ {0; 3} +[value] Values at end of function main5: + a[0..1] ∈ {0; 3} + [2] ∈ {3} + [3] ∈ {2; 3} + [4] ∈ {3} + [5] ∈ {3; 4} + [6] ∈ {3} + [7..9] ∈ {0; 3} +[value] Values at end of function main6_right: + a[0..1] ∈ {0; 3} + [2] ∈ {3} + [3..5] ∈ {0} + [6] ∈ {3} + [7..9] ∈ {0; 3} +[value] Values at end of function main6_wrong: + a[0..1] ∈ {0; 3} + [2..6] ∈ {0} + [7..9] ∈ {0; 3} +[value] Values at end of function main7: + a[0..1] ∈ {0; 3} + [2..8] ∈ {0} + [9] ∈ {0; 3} +[value] Values at end of function main8: + c_0 ∈ {4} + d ∈ {4} or UNINITIALIZED +[value] Values at end of function main9: + +[value] Values at end of function main: + u ∈ {0} + k ∈ {3} + a[0..1] ∈ {0; 3} + [2] ∈ {3} + [3..8] ∈ {0} + [9] ∈ {0; 3} + constante ∈ {2} + t[0] ∈ {0} + [1] ∈ [0..19] + [2..38] ∈ [0..38] + [39..99] ∈ {0} + t17[0][bits 0 to 7] ∈ [0..9] + [0][bits 8 to 31] ∈ {0} + [1][bits 0 to 7] ∈ [0..9] + [1][bits 8 to 31] ∈ {0} + [2][bits 0 to 7] ∈ [0..9] + [2][bits 8 to 31] ∈ {0} + [3][bits 0 to 7] ∈ [0..9] + [3][bits 8 to 31] ∈ {0} + [4][bits 0 to 7] ∈ [0..9] + [4][bits 8 to 31] ∈ {0} + [5][bits 0 to 7] ∈ [0..9] + [5][bits 8 to 31] ∈ {0} + [6][bits 0 to 7] ∈ [0..9] + [6][bits 8 to 31] ∈ {0} + [7][bits 0 to 7] ∈ [0..9] + [7][bits 8 to 31] ∈ {0} + [8][bits 0 to 7] ∈ [0..9] + [8][bits 8 to 31] ∈ {0} + [9][bits 0 to 7] ∈ [0..9] + [9][bits 8 to 31] ∈ {0} + j ∈ [0..9] + a_0 ∈ {0; 1; 2; 3} + b ∈ {6; 7; 8; 9} + c_0 ∈ {4} + d ∈ {4} or UNINITIALIZED + p ∈ {{ &c_0 ; &d }} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main10 +[from] Computing for function c <-main10 +[from] Done for function c +[from] Done for function main10 +[from] Computing for function main11 +[from] Done for function main11 +[from] Computing for function main12 +[from] Done for function main12 +[from] Computing for function main13 +[from] Done for function main13 +[from] Computing for function main14 +[from] Done for function main14 +[from] Computing for function main15 +[from] Done for function main15 +[from] Computing for function main16 +[from] Done for function main16 +[from] Computing for function main17 +[from] Done for function main17 +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function main3 +[from] Done for function main3 +[from] Computing for function main4 +[from] Done for function main4 +[from] Computing for function main5 +[from] Done for function main5 +[from] Computing for function main6_right +[from] Done for function main6_right +[from] Computing for function main6_wrong +[from] Done for function main6_wrong +[from] Computing for function main7 +[from] Done for function main7 +[from] Computing for function main8 +[from] Done for function main8 +[from] Computing for function main9 +[from] Done for function main9 +[from] Computing for function main +[from] Computing for function Frama_C_interval <-main +[from] Done for function Frama_C_interval +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function Frama_C_interval: + \result FROM a; b +[from] Function c: + \result FROM \nothing +[from] Function f: + k FROM u +[from] Function main1: + u FROM v + k FROM \nothing +[from] Function main10: + NO EFFECTS +[from] Function main11: + a[2] FROM \nothing +[from] Function main12: + \result FROM \nothing +[from] Function main13: + \result FROM p_t +[from] Function main14: + t[2..38] FROM \nothing (and SELF) +[from] Function main15: + a[3..5] FROM \nothing +[from] Function main16: + t[1..19] FROM \nothing (and SELF) +[from] Function main17: + t17{[0][bits 0 to 7]; [1][bits 0 to 7]; [2][bits 0 to 7]; [3][bits 0 to 7]; + [4][bits 0 to 7]; [5][bits 0 to 7]; [6][bits 0 to 7]; [7][bits 0 to 7]; + [8][bits 0 to 7]; [9][bits 0 to 7]} + FROM p; i (and SELF) +[from] Function main2: + a[3..5] FROM \nothing +[from] Function main3: + a[0..9] FROM i (and SELF) +[from] Function main4: + a[2] FROM \nothing +[from] Function main5: + a[2] FROM a[4] +[from] Function main6_right: + a[3..5] FROM \nothing +[from] Function main6_wrong: + a[2..6] FROM \nothing +[from] Function main7: + a{[2]; [7..8]} FROM \nothing +[from] Function main8: + c_0 FROM p (and SELF) + d FROM p (and SELF) +[from] Function main9: + NO EFFECTS +[from] Function main: + u FROM v + k FROM \nothing + a{[0..1]; [9]} FROM \nothing (and SELF) + [2..8] FROM \nothing + constante FROM \nothing + t[1..38] FROM \nothing (and SELF) + t17{[0][bits 0 to 7]; [1][bits 0 to 7]; [2][bits 0 to 7]; [3][bits 0 to 7]; + [4][bits 0 to 7]; [5][bits 0 to 7]; [6][bits 0 to 7]; [7][bits 0 to 7]; + [8][bits 0 to 7]; [9][bits 0 to 7]} + FROM \nothing (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f at tests/misc/assigns_from.i:30 (by main1): + k FROM u +[from] call to c at tests/misc/assigns_from.i:152 (by main10): + \result FROM \nothing +[from] call to main1 at tests/misc/assigns_from.i:203 (by main): + u FROM v + k FROM \nothing +[from] call to main15 at tests/misc/assigns_from.i:204 (by main): + a[3..5] FROM \nothing +[from] call to main2 at tests/misc/assigns_from.i:205 (by main): + a[3..5] FROM \nothing +[from] call to Frama_C_interval at tests/misc/assigns_from.i:206 (by main): + \result FROM a; b +[from] call to main3 at tests/misc/assigns_from.i:207 (by main): + a[6] FROM i +[from] call to main3 at tests/misc/assigns_from.i:208 (by main): + a[0..9] FROM i (and SELF) +[from] call to main4 at tests/misc/assigns_from.i:209 (by main): + a[2] FROM \nothing +[from] call to main5 at tests/misc/assigns_from.i:210 (by main): + a[2] FROM a[4] +[from] call to Frama_C_interval at tests/misc/assigns_from.i:211 (by main): + \result FROM a; b +[from] call to Frama_C_interval at tests/misc/assigns_from.i:212 (by main): + \result FROM a; b +[from] call to main6_right at tests/misc/assigns_from.i:213 (by main): + a[3..5] FROM \nothing +[from] call to main6_wrong at tests/misc/assigns_from.i:214 (by main): + a[2..6] FROM \nothing +[from] call to main7 at tests/misc/assigns_from.i:215 (by main): + a{[2]; [7..8]} FROM \nothing +[from] call to main8 at tests/misc/assigns_from.i:218 (by main): + c_0 FROM p +[from] call to main8 at tests/misc/assigns_from.i:220 (by main): + c_0 FROM p (and SELF) + d FROM p (and SELF) +[from] call to main9 at tests/misc/assigns_from.i:222 (by main): + NO EFFECTS +[from] call to main10 at tests/misc/assigns_from.i:223 (by main): + NO EFFECTS +[from] call to main11 at tests/misc/assigns_from.i:224 (by main): + a[2] FROM \nothing +[from] call to main11 at tests/misc/assigns_from.i:225 (by main): + a[2] FROM \nothing +[from] call to main11 at tests/misc/assigns_from.i:226 (by main): + a[2] FROM \nothing +[from] call to Frama_C_interval at tests/misc/assigns_from.i:226 (by main): + \result FROM a; b +[from] call to main12 at tests/misc/assigns_from.i:227 (by main): + \result FROM \nothing +[from] call to main13 at tests/misc/assigns_from.i:228 (by main): + \result FROM p_t +[from] call to main14 at tests/misc/assigns_from.i:229 (by main): + t[2..38] FROM \nothing (and SELF) +[from] call to main16 at tests/misc/assigns_from.i:230 (by main): + t[1..19] FROM \nothing (and SELF) +[from] call to main17 at tests/misc/assigns_from.i:231 (by main): + t17{[0][bits 0 to 7]; [1][bits 0 to 7]; [2][bits 0 to 7]; [3][bits 0 to 7]; + [4][bits 0 to 7]; [5][bits 0 to 7]; [6][bits 0 to 7]; [7][bits 0 to 7]; + [8][bits 0 to 7]; [9][bits 0 to 7]} + FROM p; i (and SELF) +[from] entry point: + u FROM v + k FROM \nothing + a{[0..1]; [9]} FROM \nothing (and SELF) + [2..8] FROM \nothing + constante FROM \nothing + t[1..38] FROM \nothing (and SELF) + t17{[0][bits 0 to 7]; [1][bits 0 to 7]; [2][bits 0 to 7]; [3][bits 0 to 7]; + [4][bits 0 to 7]; [5][bits 0 to 7]; [6][bits 0 to 7]; [7][bits 0 to 7]; + [8][bits 0 to 7]; [9][bits 0 to 7]} + FROM \nothing (and SELF) +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[inout] Out (internal) for function f: + k +[inout] Inputs for function f: + u +[inout] Out (internal) for function main1: + u; k +[inout] Inputs for function main1: + u; v +[inout] Out (internal) for function main10: + t10[0..49]; i; tmp +[inout] Inputs for function main10: + \nothing +[inout] Out (internal) for function main11: + a[2] +[inout] Inputs for function main11: + \nothing +[inout] Out (internal) for function main12: + __retres +[inout] Inputs for function main12: + \nothing +[inout] Out (internal) for function main13: + \nothing +[inout] Inputs for function main13: + p_t +[inout] Out (internal) for function main14: + t[2..38]; i +[inout] Inputs for function main14: + \nothing +[inout] Out (internal) for function main15: + a[3..5] +[inout] Inputs for function main15: + \nothing +[inout] Out (internal) for function main16: + t[1..19]; i +[inout] Inputs for function main16: + \nothing +[inout] Out (internal) for function main17: + t17{[0][bits 0 to 7]; [1][bits 0 to 7]; [2][bits 0 to 7]; [3][bits 0 to 7]; + [4][bits 0 to 7]; [5][bits 0 to 7]; [6][bits 0 to 7]; [7][bits 0 to 7]; + [8][bits 0 to 7]; [9][bits 0 to 7]}; j +[inout] Inputs for function main17: + \nothing +[inout] Out (internal) for function main2: + a[3..5] +[inout] Inputs for function main2: + \nothing +[inout] Out (internal) for function main3: + a[0..9] +[inout] Inputs for function main3: + \nothing +[inout] Out (internal) for function main4: + a[2] +[inout] Inputs for function main4: + \nothing +[inout] Out (internal) for function main5: + a[2] +[inout] Inputs for function main5: + a[4] +[inout] Out (internal) for function main6_right: + a[3..5] +[inout] Inputs for function main6_right: + \nothing +[inout] Out (internal) for function main6_wrong: + a[2..6] +[inout] Inputs for function main6_wrong: + \nothing +[inout] Out (internal) for function main7: + a{[2]; [7..8]} +[inout] Inputs for function main7: + \nothing +[inout] Out (internal) for function main8: + c_0; d +[inout] Inputs for function main8: + \nothing +[inout] Out (internal) for function main9: + \nothing +[inout] Inputs for function main9: + \nothing +[inout] Out (internal) for function main: + u; k; a[0..9]; constante; t[1..38]; + t17{[0][bits 0 to 7]; [1][bits 0 to 7]; [2][bits 0 to 7]; [3][bits 0 to 7]; + [4][bits 0 to 7]; [5][bits 0 to 7]; [6][bits 0 to 7]; [7][bits 0 to 7]; + [8][bits 0 to 7]; [9][bits 0 to 7]}; j; a_0; b; c_0; d; p; tmp_2; + tmp_3 +[inout] Inputs for function main: + u; v; a[4]; p_t diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/assigns.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/assigns.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/assigns.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/assigns.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,1015 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/assigns.i (no preprocessing) +tests/misc/assigns.i:31:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] + G ∈ {0} + T[0..99] ∈ {0} + Tpost[0..99] ∈ {0} + t[0..9] ∈ {0} + t2[0..99999] ∈ {0} + t3[0..99999] ∈ {0} + x ∈ {0} + k ∈ {53} + y1 ∈ {0} + y2 ∈ {0} + y3 ∈ {0} + t_main3_1[0..6][0..7] ∈ {0} + t_main3_2[0..2][0..3][0..4] ∈ {0} + t_main4[0..999] ∈ {0} + u_main4[0..99] ∈ {0} +[value] computing for function main1 <- main. + Called from tests/misc/assigns.i:110. +[value] computing for function F1 <- main1 <- main. + Called from tests/misc/assigns.i:46. +[value] using specification for function F1 +[value] Done for function F1 +tests/misc/assigns.i:48:[value] entering loop for the first time +[value] computing for function f <- main1 <- main. + Called from tests/misc/assigns.i:49. +[value] using specification for function f +[value] Done for function f +[value] computing for function f <- main1 <- main. + Called from tests/misc/assigns.i:49. +[value] Done for function f +[value] computing for function f <- main1 <- main. + Called from tests/misc/assigns.i:49. +[value] Done for function f +[value] computing for function f <- main1 <- main. + Called from tests/misc/assigns.i:49. +[value] Done for function f +[value] computing for function f <- main1 <- main. + Called from tests/misc/assigns.i:49. +[value] Done for function f +[value] computing for function f <- main1 <- main. + Called from tests/misc/assigns.i:49. +[value] Done for function f +[value] computing for function f <- main1 <- main. + Called from tests/misc/assigns.i:49. +[value] Done for function f +tests/misc/assigns.i:51:[value] warning: Operation {2} * {{ &T }} incurs a loss of precision +tests/misc/assigns.i:51:[kernel] warning: signed overflow. assert -2147483648 ≤ 2*(int)(&T) ≤ 2147483647; +[value] computing for function g <- main1 <- main. + Called from tests/misc/assigns.i:51. +[value] using specification for function g +[value] Done for function g +tests/misc/assigns.i:52:[value] warning: Operation {2} * {{ &t3 }} incurs a loss of precision +tests/misc/assigns.i:52:[kernel] warning: signed overflow. assert -2147483648 ≤ 2*(int)(&t3) ≤ 2147483647; +[value] computing for function h <- main1 <- main. + Called from tests/misc/assigns.i:52. +[value] using specification for function h +[value] Done for function h +tests/misc/assigns.i:54:[value] Cannot evaluate range bound foo(*p) + (unsupported ACSL construct: logic functions or predicates). Approximating +[value] computing for function j <- main1 <- main. + Called from tests/misc/assigns.i:54. +[value] using specification for function j +[value] Done for function j +[value] computing for function assigns_post <- main1 <- main. + Called from tests/misc/assigns.i:56. +[value] using specification for function assigns_post +tests/misc/assigns.i:39:[value] warning: no \from part + for clause 'assigns Tpost[\at(\old(i),Post)], Tpost[\at(k,Post)];' of + function assigns_post +tests/misc/assigns.i:56:[value] warning: cannot interpret 'from' clause 'assigns \at(x,Post) \from \at(x,Post);' + of function assigns_post + (no environment to evaluate \at(_,Post)) +tests/misc/assigns.i:56:[value] warning: cannot interpret assigns Tpost[\at(k,Post)] in function assigns_post + (no environment to evaluate \at(_,Post)); effects will be ignored +[value] Done for function assigns_post +tests/misc/assigns.i:57:[value] warning: locals escaping the scope of main1 through x +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/assigns.i:111. +[value] computing for function ff1 <- main2 <- main. + Called from tests/misc/assigns.i:76. +[value] using specification for function ff1 +tests/misc/assigns.i:60:[value] warning: no 'assigns \result \from ...' clause specified for function ff1 +[value] Done for function ff1 +[value] computing for function ff3 <- main2 <- main. + Called from tests/misc/assigns.i:78. +[value] using specification for function ff3 +tests/misc/assigns.i:68:[value] warning: no \from part for clause 'assigns y1, y3;' of function ff3 +[value] Done for function ff3 +tests/misc/assigns.i:79:[kernel] warning: Neither code nor specification for function ff4, generating default assigns from the prototype +[value] computing for function ff4 <- main2 <- main. + Called from tests/misc/assigns.i:79. +[value] using specification for function ff4 +[value] Done for function ff4 +tests/misc/assigns.i:80:[kernel] warning: Neither code nor specification for function ff5, generating default assigns from the prototype +[value] computing for function ff5 <- main2 <- main. + Called from tests/misc/assigns.i:80. +[value] using specification for function ff5 +[value] Done for function ff5 +tests/misc/assigns.i:82:[kernel] warning: Neither code nor specification for function ff2, generating default assigns from the prototype +[value] computing for function ff2 <- main2 <- main. + Called from tests/misc/assigns.i:82. +[value] using specification for function ff2 +[value] Done for function ff2 +[value] computing for function ff2_bis <- main2 <- main. + Called from tests/misc/assigns.i:83. +[value] using specification for function ff2_bis +tests/misc/assigns.i:64:[value] warning: no 'assigns \result \from ...' clause specified for function ff2_bis +[value] Done for function ff2_bis +tests/misc/assigns.i:84:[kernel] warning: pointer comparison: assert \pointer_comparable(p, &x); +[value] Recording results for main2 +[value] Done for function main2 +tests/misc/assigns.i:112:[kernel] warning: Neither code nor specification for function main3, generating default assigns from the prototype +[value] computing for function main3 <- main. + Called from tests/misc/assigns.i:112. +[value] using specification for function main3 +[value] Done for function main3 +[value] computing for function main4 <- main. + Called from tests/misc/assigns.i:113. +tests/misc/assigns.i:104:[kernel] more than 200(1000) elements to enumerate. Approximating. +[value] computing for function f_main4_1 <- main4 <- main. + Called from tests/misc/assigns.i:104. +[value] using specification for function f_main4_1 +tests/misc/assigns.i:104:[kernel] more than 200(1000) locations to update in array. Approximating. +[value] Done for function f_main4_1 +[value] computing for function f_main4_2 <- main4 <- main. + Called from tests/misc/assigns.i:105. +[value] using specification for function f_main4_2 +tests/misc/assigns.i:105:[kernel] more than 200(1000) locations to update in array. Approximating. +[value] Done for function f_main4_2 +[value] Recording results for main4 +[value] Done for function main4 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main1: + T[0..99] ∈ [--..--] + Tpost[0..17] ∈ {0} + [18] ∈ [--..--] + [19..99] ∈ {0} + t[0].f1 ∈ {0} + {[0].f2; [1..5]} ∈ [--..--] + [6..9] ∈ {0} + t2[0..99999] ∈ [--..--] + t3[0..99999] ∈ [--..--] + x ∈ {{ ANYTHING }} +[value] Values at end of function main2: + y1 ∈ [--..--] + y2 ∈ [--..--] + y3 ∈ [--..--] + l ∈ [--..--] + p ∈ {{ NULL + [--..--] ; &alloced_return_ff2 + [0..2147483616],0%32 }} + q ∈ + {{ NULL + [--..--] ; &alloced_return_ff2_bis + [0..2147483616],0%32 }} + __retres ∈ {1} +[value] Values at end of function main4: + t_main4{[0..998]; [999].f1} ∈ [--..--] + [999].f2 ∈ {0} + u_main4[0].f1 ∈ [--..--] + [0].f2 ∈ {0} + [1].f1 ∈ [--..--] + [1].f2 ∈ {0} + [2].f1 ∈ [--..--] + [2].f2 ∈ {0} + [3].f1 ∈ [--..--] + [3].f2 ∈ {0} + [4].f1 ∈ [--..--] + [4].f2 ∈ {0} + [5].f1 ∈ [--..--] + [5].f2 ∈ {0} + [6].f1 ∈ [--..--] + [6].f2 ∈ {0} + [7].f1 ∈ [--..--] + [7].f2 ∈ {0} + [8].f1 ∈ [--..--] + [8].f2 ∈ {0} + [9].f1 ∈ [--..--] + [9].f2 ∈ {0} + [10].f1 ∈ [--..--] + [10].f2 ∈ {0} + [11].f1 ∈ [--..--] + [11].f2 ∈ {0} + [12].f1 ∈ [--..--] + [12].f2 ∈ {0} + [13].f1 ∈ [--..--] + [13].f2 ∈ {0} + [14].f1 ∈ [--..--] + [14].f2 ∈ {0} + [15].f1 ∈ [--..--] + [15].f2 ∈ {0} + [16].f1 ∈ [--..--] + [16].f2 ∈ {0} + [17].f1 ∈ [--..--] + [17].f2 ∈ {0} + [18].f1 ∈ [--..--] + [18].f2 ∈ {0} + [19].f1 ∈ [--..--] + [19].f2 ∈ {0} + [20].f1 ∈ [--..--] + [20].f2 ∈ {0} + [21].f1 ∈ [--..--] + [21].f2 ∈ {0} + [22].f1 ∈ [--..--] + [22].f2 ∈ {0} + [23].f1 ∈ [--..--] + [23].f2 ∈ {0} + [24].f1 ∈ [--..--] + [24].f2 ∈ {0} + [25].f1 ∈ [--..--] + [25].f2 ∈ {0} + [26].f1 ∈ [--..--] + [26].f2 ∈ {0} + [27].f1 ∈ [--..--] + [27].f2 ∈ {0} + [28].f1 ∈ [--..--] + [28].f2 ∈ {0} + [29].f1 ∈ [--..--] + [29].f2 ∈ {0} + [30].f1 ∈ [--..--] + [30].f2 ∈ {0} + [31].f1 ∈ [--..--] + [31].f2 ∈ {0} + [32].f1 ∈ [--..--] + [32].f2 ∈ {0} + [33].f1 ∈ [--..--] + [33].f2 ∈ {0} + [34].f1 ∈ [--..--] + [34].f2 ∈ {0} + [35].f1 ∈ [--..--] + [35].f2 ∈ {0} + [36].f1 ∈ [--..--] + [36].f2 ∈ {0} + [37].f1 ∈ [--..--] + [37].f2 ∈ {0} + [38].f1 ∈ [--..--] + [38].f2 ∈ {0} + [39].f1 ∈ [--..--] + [39].f2 ∈ {0} + [40].f1 ∈ [--..--] + [40].f2 ∈ {0} + [41].f1 ∈ [--..--] + [41].f2 ∈ {0} + [42].f1 ∈ [--..--] + [42].f2 ∈ {0} + [43].f1 ∈ [--..--] + [43].f2 ∈ {0} + [44].f1 ∈ [--..--] + [44].f2 ∈ {0} + [45].f1 ∈ [--..--] + [45].f2 ∈ {0} + [46].f1 ∈ [--..--] + [46].f2 ∈ {0} + [47].f1 ∈ [--..--] + [47].f2 ∈ {0} + [48].f1 ∈ [--..--] + [48].f2 ∈ {0} + [49].f1 ∈ [--..--] + [49].f2 ∈ {0} + [50].f1 ∈ [--..--] + [50].f2 ∈ {0} + [51].f1 ∈ [--..--] + [51].f2 ∈ {0} + [52].f1 ∈ [--..--] + [52].f2 ∈ {0} + [53].f1 ∈ [--..--] + [53].f2 ∈ {0} + [54].f1 ∈ [--..--] + [54].f2 ∈ {0} + [55].f1 ∈ [--..--] + [55].f2 ∈ {0} + [56].f1 ∈ [--..--] + [56].f2 ∈ {0} + [57].f1 ∈ [--..--] + [57].f2 ∈ {0} + [58].f1 ∈ [--..--] + [58].f2 ∈ {0} + [59].f1 ∈ [--..--] + [59].f2 ∈ {0} + [60].f1 ∈ [--..--] + [60].f2 ∈ {0} + [61].f1 ∈ [--..--] + [61].f2 ∈ {0} + [62].f1 ∈ [--..--] + [62].f2 ∈ {0} + [63].f1 ∈ [--..--] + [63].f2 ∈ {0} + [64].f1 ∈ [--..--] + [64].f2 ∈ {0} + [65].f1 ∈ [--..--] + [65].f2 ∈ {0} + [66].f1 ∈ [--..--] + [66].f2 ∈ {0} + [67].f1 ∈ [--..--] + [67].f2 ∈ {0} + [68].f1 ∈ [--..--] + [68].f2 ∈ {0} + [69].f1 ∈ [--..--] + [69].f2 ∈ {0} + [70].f1 ∈ [--..--] + [70].f2 ∈ {0} + [71].f1 ∈ [--..--] + [71].f2 ∈ {0} + [72].f1 ∈ [--..--] + [72].f2 ∈ {0} + [73].f1 ∈ [--..--] + [73].f2 ∈ {0} + [74].f1 ∈ [--..--] + [74].f2 ∈ {0} + [75].f1 ∈ [--..--] + [75].f2 ∈ {0} + [76].f1 ∈ [--..--] + [76].f2 ∈ {0} + [77].f1 ∈ [--..--] + [77].f2 ∈ {0} + [78].f1 ∈ [--..--] + [78].f2 ∈ {0} + [79].f1 ∈ [--..--] + [79].f2 ∈ {0} + [80].f1 ∈ [--..--] + [80].f2 ∈ {0} + [81].f1 ∈ [--..--] + [81].f2 ∈ {0} + [82].f1 ∈ [--..--] + [82].f2 ∈ {0} + [83].f1 ∈ [--..--] + [83].f2 ∈ {0} + [84].f1 ∈ [--..--] + [84].f2 ∈ {0} + [85].f1 ∈ [--..--] + [85].f2 ∈ {0} + [86].f1 ∈ [--..--] + [86].f2 ∈ {0} + [87].f1 ∈ [--..--] + [87].f2 ∈ {0} + [88].f1 ∈ [--..--] + [88].f2 ∈ {0} + [89].f1 ∈ [--..--] + [89].f2 ∈ {0} + [90].f1 ∈ [--..--] + [90].f2 ∈ {0} + [91].f1 ∈ [--..--] + [91].f2 ∈ {0} + [92].f1 ∈ [--..--] + [92].f2 ∈ {0} + [93].f1 ∈ [--..--] + [93].f2 ∈ {0} + [94].f1 ∈ [--..--] + [94].f2 ∈ {0} + [95].f1 ∈ [--..--] + [95].f2 ∈ {0} + [96].f1 ∈ [--..--] + [96].f2 ∈ {0} + [97].f1 ∈ [--..--] + [97].f2 ∈ {0} + [98].f1 ∈ [--..--] + [98].f2 ∈ {0} + [99].f1 ∈ [--..--] + [99].f2 ∈ {0} +[value] Values at end of function main: + T[0..99] ∈ [--..--] + Tpost[0..17] ∈ {0} + [18] ∈ [--..--] + [19..99] ∈ {0} + t[0].f1 ∈ {0} + {[0].f2; [1..5]} ∈ [--..--] + [6..9] ∈ {0} + t2[0..99999] ∈ [--..--] + t3[0..99999] ∈ [--..--] + x ∈ {{ ANYTHING }} or ESCAPINGADDR + y1 ∈ [--..--] + y2 ∈ [--..--] + y3 ∈ [--..--] + t_main3_1[0][0..7] ∈ [--..--] + [1..6][0..7] ∈ {0} + t_main3_2[0..2][0..3][0..4] ∈ [--..--] + t_main4{[0..998]; [999].f1} ∈ [--..--] + [999].f2 ∈ {0} + u_main4[0].f1 ∈ [--..--] + [0].f2 ∈ {0} + [1].f1 ∈ [--..--] + [1].f2 ∈ {0} + [2].f1 ∈ [--..--] + [2].f2 ∈ {0} + [3].f1 ∈ [--..--] + [3].f2 ∈ {0} + [4].f1 ∈ [--..--] + [4].f2 ∈ {0} + [5].f1 ∈ [--..--] + [5].f2 ∈ {0} + [6].f1 ∈ [--..--] + [6].f2 ∈ {0} + [7].f1 ∈ [--..--] + [7].f2 ∈ {0} + [8].f1 ∈ [--..--] + [8].f2 ∈ {0} + [9].f1 ∈ [--..--] + [9].f2 ∈ {0} + [10].f1 ∈ [--..--] + [10].f2 ∈ {0} + [11].f1 ∈ [--..--] + [11].f2 ∈ {0} + [12].f1 ∈ [--..--] + [12].f2 ∈ {0} + [13].f1 ∈ [--..--] + [13].f2 ∈ {0} + [14].f1 ∈ [--..--] + [14].f2 ∈ {0} + [15].f1 ∈ [--..--] + [15].f2 ∈ {0} + [16].f1 ∈ [--..--] + [16].f2 ∈ {0} + [17].f1 ∈ [--..--] + [17].f2 ∈ {0} + [18].f1 ∈ [--..--] + [18].f2 ∈ {0} + [19].f1 ∈ [--..--] + [19].f2 ∈ {0} + [20].f1 ∈ [--..--] + [20].f2 ∈ {0} + [21].f1 ∈ [--..--] + [21].f2 ∈ {0} + [22].f1 ∈ [--..--] + [22].f2 ∈ {0} + [23].f1 ∈ [--..--] + [23].f2 ∈ {0} + [24].f1 ∈ [--..--] + [24].f2 ∈ {0} + [25].f1 ∈ [--..--] + [25].f2 ∈ {0} + [26].f1 ∈ [--..--] + [26].f2 ∈ {0} + [27].f1 ∈ [--..--] + [27].f2 ∈ {0} + [28].f1 ∈ [--..--] + [28].f2 ∈ {0} + [29].f1 ∈ [--..--] + [29].f2 ∈ {0} + [30].f1 ∈ [--..--] + [30].f2 ∈ {0} + [31].f1 ∈ [--..--] + [31].f2 ∈ {0} + [32].f1 ∈ [--..--] + [32].f2 ∈ {0} + [33].f1 ∈ [--..--] + [33].f2 ∈ {0} + [34].f1 ∈ [--..--] + [34].f2 ∈ {0} + [35].f1 ∈ [--..--] + [35].f2 ∈ {0} + [36].f1 ∈ [--..--] + [36].f2 ∈ {0} + [37].f1 ∈ [--..--] + [37].f2 ∈ {0} + [38].f1 ∈ [--..--] + [38].f2 ∈ {0} + [39].f1 ∈ [--..--] + [39].f2 ∈ {0} + [40].f1 ∈ [--..--] + [40].f2 ∈ {0} + [41].f1 ∈ [--..--] + [41].f2 ∈ {0} + [42].f1 ∈ [--..--] + [42].f2 ∈ {0} + [43].f1 ∈ [--..--] + [43].f2 ∈ {0} + [44].f1 ∈ [--..--] + [44].f2 ∈ {0} + [45].f1 ∈ [--..--] + [45].f2 ∈ {0} + [46].f1 ∈ [--..--] + [46].f2 ∈ {0} + [47].f1 ∈ [--..--] + [47].f2 ∈ {0} + [48].f1 ∈ [--..--] + [48].f2 ∈ {0} + [49].f1 ∈ [--..--] + [49].f2 ∈ {0} + [50].f1 ∈ [--..--] + [50].f2 ∈ {0} + [51].f1 ∈ [--..--] + [51].f2 ∈ {0} + [52].f1 ∈ [--..--] + [52].f2 ∈ {0} + [53].f1 ∈ [--..--] + [53].f2 ∈ {0} + [54].f1 ∈ [--..--] + [54].f2 ∈ {0} + [55].f1 ∈ [--..--] + [55].f2 ∈ {0} + [56].f1 ∈ [--..--] + [56].f2 ∈ {0} + [57].f1 ∈ [--..--] + [57].f2 ∈ {0} + [58].f1 ∈ [--..--] + [58].f2 ∈ {0} + [59].f1 ∈ [--..--] + [59].f2 ∈ {0} + [60].f1 ∈ [--..--] + [60].f2 ∈ {0} + [61].f1 ∈ [--..--] + [61].f2 ∈ {0} + [62].f1 ∈ [--..--] + [62].f2 ∈ {0} + [63].f1 ∈ [--..--] + [63].f2 ∈ {0} + [64].f1 ∈ [--..--] + [64].f2 ∈ {0} + [65].f1 ∈ [--..--] + [65].f2 ∈ {0} + [66].f1 ∈ [--..--] + [66].f2 ∈ {0} + [67].f1 ∈ [--..--] + [67].f2 ∈ {0} + [68].f1 ∈ [--..--] + [68].f2 ∈ {0} + [69].f1 ∈ [--..--] + [69].f2 ∈ {0} + [70].f1 ∈ [--..--] + [70].f2 ∈ {0} + [71].f1 ∈ [--..--] + [71].f2 ∈ {0} + [72].f1 ∈ [--..--] + [72].f2 ∈ {0} + [73].f1 ∈ [--..--] + [73].f2 ∈ {0} + [74].f1 ∈ [--..--] + [74].f2 ∈ {0} + [75].f1 ∈ [--..--] + [75].f2 ∈ {0} + [76].f1 ∈ [--..--] + [76].f2 ∈ {0} + [77].f1 ∈ [--..--] + [77].f2 ∈ {0} + [78].f1 ∈ [--..--] + [78].f2 ∈ {0} + [79].f1 ∈ [--..--] + [79].f2 ∈ {0} + [80].f1 ∈ [--..--] + [80].f2 ∈ {0} + [81].f1 ∈ [--..--] + [81].f2 ∈ {0} + [82].f1 ∈ [--..--] + [82].f2 ∈ {0} + [83].f1 ∈ [--..--] + [83].f2 ∈ {0} + [84].f1 ∈ [--..--] + [84].f2 ∈ {0} + [85].f1 ∈ [--..--] + [85].f2 ∈ {0} + [86].f1 ∈ [--..--] + [86].f2 ∈ {0} + [87].f1 ∈ [--..--] + [87].f2 ∈ {0} + [88].f1 ∈ [--..--] + [88].f2 ∈ {0} + [89].f1 ∈ [--..--] + [89].f2 ∈ {0} + [90].f1 ∈ [--..--] + [90].f2 ∈ {0} + [91].f1 ∈ [--..--] + [91].f2 ∈ {0} + [92].f1 ∈ [--..--] + [92].f2 ∈ {0} + [93].f1 ∈ [--..--] + [93].f2 ∈ {0} + [94].f1 ∈ [--..--] + [94].f2 ∈ {0} + [95].f1 ∈ [--..--] + [95].f2 ∈ {0} + [96].f1 ∈ [--..--] + [96].f2 ∈ {0} + [97].f1 ∈ [--..--] + [97].f2 ∈ {0} + [98].f1 ∈ [--..--] + [98].f2 ∈ {0} + [99].f1 ∈ [--..--] + [99].f2 ∈ {0} +[from] Computing for function main1 +[from] Computing for function F1 <-main1 +[from] Done for function F1 +[from] Computing for function f <-main1 +[from] Done for function f +[from] Computing for function g <-main1 +[from] Done for function g +[from] Computing for function h <-main1 +[from] Done for function h +[from] Computing for function j <-main1 +[from] Done for function j +[from] Computing for function assigns_post <-main1 +[from] Done for function assigns_post +[from] Done for function main1 +[from] Computing for function main2 +[from] Computing for function ff1 <-main2 +[from] Done for function ff1 +[from] Computing for function ff3 <-main2 +[from] Done for function ff3 +[from] Computing for function ff4 <-main2 +[from] Done for function ff4 +[from] Computing for function ff5 <-main2 +[from] Done for function ff5 +[from] Computing for function ff2 <-main2 +[from] Done for function ff2 +[from] Computing for function ff2_bis <-main2 +[from] Done for function ff2_bis +[from] Done for function main2 +[from] Computing for function main4 +[from] Computing for function f_main4_1 <-main4 +tests/misc/assigns.i:104:[kernel] more than 200(1000) dependencies to update. Approximating. +[from] Done for function f_main4_1 +[from] Computing for function f_main4_2 <-main4 +tests/misc/assigns.i:105:[kernel] more than 200(1000) dependencies to update. Approximating. +[from] Done for function f_main4_2 +[from] Done for function main4 +[from] Computing for function main +[from] Computing for function main3 <-main +[from] Done for function main3 +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function F1: + T[0..99] FROM T[0..99] (and SELF) +[from] Function assigns_post: + Tpost{[18]; [53]} FROM ANYTHING(origin:Unknown) (and SELF) + x FROM x (and SELF) +[from] Function f: + t{[0].f2; [1..5]} FROM t{[1..5]; [6].f1} (and SELF) +[from] Function f_main4_1: + t_main4{[0..998]; [999].f1} FROM \nothing (and SELF) + u_main4{[0].f1; [1].f1; [2].f1; [3].f1; [4].f1; [5].f1; [6].f1; [7].f1; + [8].f1; [9].f1; [10].f1; [11].f1; [12].f1; [13].f1; [14].f1; + [15].f1; [16].f1; [17].f1; [18].f1; [19].f1; [20].f1; [21].f1; + [22].f1; [23].f1; [24].f1; [25].f1; [26].f1; [27].f1; [28].f1; + [29].f1; [30].f1; [31].f1; [32].f1; [33].f1; [34].f1; [35].f1; + [36].f1; [37].f1; [38].f1; [39].f1; [40].f1; [41].f1; [42].f1; + [43].f1; [44].f1; [45].f1; [46].f1; [47].f1; [48].f1; [49].f1; + [50].f1; [51].f1; [52].f1; [53].f1; [54].f1; [55].f1; [56].f1; + [57].f1; [58].f1; [59].f1; [60].f1; [61].f1; [62].f1; [63].f1; + [64].f1; [65].f1; [66].f1; [67].f1; [68].f1; [69].f1; [70].f1; + [71].f1; [72].f1; [73].f1; [74].f1; [75].f1; [76].f1; [77].f1; + [78].f1; [79].f1; [80].f1; [81].f1; [82].f1; [83].f1; [84].f1; + [85].f1; [86].f1; [87].f1; [88].f1; [89].f1; [90].f1; [91].f1; + [92].f1; [93].f1; [94].f1; [95].f1; [96].f1; [97].f1; [98].f1; + [99].f1} + FROM \nothing (and SELF) +[from] Function f_main4_2: + t_main4{[0..998]; [999].f1} FROM \nothing (and SELF) + u_main4{[0].f1; [1].f1; [2].f1; [3].f1; [4].f1; [5].f1; [6].f1; [7].f1; + [8].f1; [9].f1; [10].f1; [11].f1; [12].f1; [13].f1; [14].f1; + [15].f1; [16].f1; [17].f1; [18].f1; [19].f1; [20].f1; [21].f1; + [22].f1; [23].f1; [24].f1; [25].f1; [26].f1; [27].f1; [28].f1; + [29].f1; [30].f1; [31].f1; [32].f1; [33].f1; [34].f1; [35].f1; + [36].f1; [37].f1; [38].f1; [39].f1; [40].f1; [41].f1; [42].f1; + [43].f1; [44].f1; [45].f1; [46].f1; [47].f1; [48].f1; [49].f1; + [50].f1; [51].f1; [52].f1; [53].f1; [54].f1; [55].f1; [56].f1; + [57].f1; [58].f1; [59].f1; [60].f1; [61].f1; [62].f1; [63].f1; + [64].f1; [65].f1; [66].f1; [67].f1; [68].f1; [69].f1; [70].f1; + [71].f1; [72].f1; [73].f1; [74].f1; [75].f1; [76].f1; [77].f1; + [78].f1; [79].f1; [80].f1; [81].f1; [82].f1; [83].f1; [84].f1; + [85].f1; [86].f1; [87].f1; [88].f1; [89].f1; [90].f1; [91].f1; + [92].f1; [93].f1; [94].f1; [95].f1; [96].f1; [97].f1; [98].f1; + [99].f1} + FROM \nothing +[from] Function ff1: + \result FROM ANYTHING(origin:Unknown) +[from] Function ff2: + \result FROM \nothing +[from] Function ff2_bis: + \result FROM ANYTHING(origin:Unknown) +[from] Function ff3: + y1 FROM ANYTHING(origin:Unknown) (and SELF) + y2 FROM y2 (and SELF) + y3 FROM ANYTHING(origin:Unknown) (and SELF) +[from] Function ff4: + NO EFFECTS +[from] Function ff5: + \result FROM \nothing +[from] Function g: + t2[0..99999] FROM \nothing (and SELF) +[from] Function h: + t3[0..99999] FROM \nothing (and SELF) +[from] Function j: + T[9..96] FROM \nothing (and SELF) +[from] Function main1: + T[0..99] FROM T[0..99] (and SELF) + Tpost{[18]; [53]} FROM ANYTHING(origin:Unknown) (and SELF) + t{[0].f2; [1..5]} FROM t{[1..5]; [6].f1} (and SELF) + t2[0..99999] FROM \nothing (and SELF) + t3[0..99999] FROM \nothing (and SELF) + x FROM x (and SELF) +[from] Function main2: + y1 FROM ANYTHING(origin:Unknown) (and SELF) + y2 FROM y2 (and SELF) + y3 FROM ANYTHING(origin:Unknown) (and SELF) + \result FROM \nothing +[from] Function main3: + t_main3_1[0][0..7] + FROM t_main3_1[0][0..7]; t_main3_2[0..2][0..3][0..4] (and SELF) + t_main3_2[0..2][0..3][0..4] FROM t_main3_1[0][0..7]; + t_main3_2[0..2][0..3][0..4] (and SELF) + \result FROM t_main3_1[0][0..7]; t_main3_2[0..2][0..3][0..4] +[from] Function main4: + t_main4{[0..998]; [999].f1} FROM \nothing (and SELF) + u_main4{[0].f1; [1].f1; [2].f1; [3].f1; [4].f1; [5].f1; [6].f1; [7].f1; + [8].f1; [9].f1; [10].f1; [11].f1; [12].f1; [13].f1; [14].f1; + [15].f1; [16].f1; [17].f1; [18].f1; [19].f1; [20].f1; [21].f1; + [22].f1; [23].f1; [24].f1; [25].f1; [26].f1; [27].f1; [28].f1; + [29].f1; [30].f1; [31].f1; [32].f1; [33].f1; [34].f1; [35].f1; + [36].f1; [37].f1; [38].f1; [39].f1; [40].f1; [41].f1; [42].f1; + [43].f1; [44].f1; [45].f1; [46].f1; [47].f1; [48].f1; [49].f1; + [50].f1; [51].f1; [52].f1; [53].f1; [54].f1; [55].f1; [56].f1; + [57].f1; [58].f1; [59].f1; [60].f1; [61].f1; [62].f1; [63].f1; + [64].f1; [65].f1; [66].f1; [67].f1; [68].f1; [69].f1; [70].f1; + [71].f1; [72].f1; [73].f1; [74].f1; [75].f1; [76].f1; [77].f1; + [78].f1; [79].f1; [80].f1; [81].f1; [82].f1; [83].f1; [84].f1; + [85].f1; [86].f1; [87].f1; [88].f1; [89].f1; [90].f1; [91].f1; + [92].f1; [93].f1; [94].f1; [95].f1; [96].f1; [97].f1; [98].f1; + [99].f1} + FROM \nothing +[from] Function main: + T[0..99] FROM T[0..99] (and SELF) + Tpost{[18]; [53]} FROM ANYTHING(origin:Unknown) (and SELF) + t{[0].f2; [1..5]} FROM t{[1..5]; [6].f1} (and SELF) + t2[0..99999] FROM \nothing (and SELF) + t3[0..99999] FROM \nothing (and SELF) + x FROM x (and SELF) + y1 FROM ANYTHING(origin:Unknown) (and SELF) + y2 FROM y2 (and SELF) + y3 FROM ANYTHING(origin:Unknown) (and SELF) + t_main3_1[0][0..7] + FROM t_main3_1[0][0..7]; t_main3_2[0..2][0..3][0..4] (and SELF) + t_main3_2[0..2][0..3][0..4] FROM t_main3_1[0][0..7]; + t_main3_2[0..2][0..3][0..4] (and SELF) + t_main4{[0..998]; [999].f1} FROM \nothing (and SELF) + u_main4{[0].f1; [1].f1; [2].f1; [3].f1; [4].f1; [5].f1; [6].f1; [7].f1; + [8].f1; [9].f1; [10].f1; [11].f1; [12].f1; [13].f1; [14].f1; + [15].f1; [16].f1; [17].f1; [18].f1; [19].f1; [20].f1; [21].f1; + [22].f1; [23].f1; [24].f1; [25].f1; [26].f1; [27].f1; [28].f1; + [29].f1; [30].f1; [31].f1; [32].f1; [33].f1; [34].f1; [35].f1; + [36].f1; [37].f1; [38].f1; [39].f1; [40].f1; [41].f1; [42].f1; + [43].f1; [44].f1; [45].f1; [46].f1; [47].f1; [48].f1; [49].f1; + [50].f1; [51].f1; [52].f1; [53].f1; [54].f1; [55].f1; [56].f1; + [57].f1; [58].f1; [59].f1; [60].f1; [61].f1; [62].f1; [63].f1; + [64].f1; [65].f1; [66].f1; [67].f1; [68].f1; [69].f1; [70].f1; + [71].f1; [72].f1; [73].f1; [74].f1; [75].f1; [76].f1; [77].f1; + [78].f1; [79].f1; [80].f1; [81].f1; [82].f1; [83].f1; [84].f1; + [85].f1; [86].f1; [87].f1; [88].f1; [89].f1; [90].f1; [91].f1; + [92].f1; [93].f1; [94].f1; [95].f1; [96].f1; [97].f1; [98].f1; + [99].f1} + FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main1: + T[0..99]; Tpost{[18]; [53]}; t{[0].f2; [1..5]}; t2[0..99999]; t3[0..99999]; + x; i +[inout] Inputs for function main1: + ANYTHING(origin:Unknown) +[inout] InOut (internal) for function main1: + Operational inputs: + ANYTHING(origin:Unknown) + Operational inputs on termination: + ANYTHING(origin:Unknown) + Sure outputs: + i +[inout] Out (internal) for function main2: + y1; y2; y3; l; p; q; __retres +[inout] Inputs for function main2: + ANYTHING(origin:Unknown) +[inout] InOut (internal) for function main2: + Operational inputs: + ANYTHING(origin:Unknown) + Operational inputs on termination: + ANYTHING(origin:Unknown) + Sure outputs: + l; p; q; __retres +[inout] Out (internal) for function main4: + t_main4{[0..998]; [999].f1}; + u_main4{[0].f1; [1].f1; [2].f1; [3].f1; [4].f1; [5].f1; [6].f1; [7].f1; + [8].f1; [9].f1; [10].f1; [11].f1; [12].f1; [13].f1; [14].f1; + [15].f1; [16].f1; [17].f1; [18].f1; [19].f1; [20].f1; [21].f1; + [22].f1; [23].f1; [24].f1; [25].f1; [26].f1; [27].f1; [28].f1; + [29].f1; [30].f1; [31].f1; [32].f1; [33].f1; [34].f1; [35].f1; + [36].f1; [37].f1; [38].f1; [39].f1; [40].f1; [41].f1; [42].f1; + [43].f1; [44].f1; [45].f1; [46].f1; [47].f1; [48].f1; [49].f1; + [50].f1; [51].f1; [52].f1; [53].f1; [54].f1; [55].f1; [56].f1; + [57].f1; [58].f1; [59].f1; [60].f1; [61].f1; [62].f1; [63].f1; + [64].f1; [65].f1; [66].f1; [67].f1; [68].f1; [69].f1; [70].f1; + [71].f1; [72].f1; [73].f1; [74].f1; [75].f1; [76].f1; [77].f1; + [78].f1; [79].f1; [80].f1; [81].f1; [82].f1; [83].f1; [84].f1; + [85].f1; [86].f1; [87].f1; [88].f1; [89].f1; [90].f1; [91].f1; + [92].f1; [93].f1; [94].f1; [95].f1; [96].f1; [97].f1; [98].f1; + [99].f1} +[inout] Inputs for function main4: + v +[inout] InOut (internal) for function main4: + Operational inputs: + v + Operational inputs on termination: + v + Sure outputs: + u_main4{[0].f1; [1].f1; [2].f1; [3].f1; [4].f1; [5].f1; [6].f1; [7].f1; + [8].f1; [9].f1; [10].f1; [11].f1; [12].f1; [13].f1; [14].f1; + [15].f1; [16].f1; [17].f1; [18].f1; [19].f1; [20].f1; [21].f1; + [22].f1; [23].f1; [24].f1; [25].f1; [26].f1; [27].f1; [28].f1; + [29].f1; [30].f1; [31].f1; [32].f1; [33].f1; [34].f1; [35].f1; + [36].f1; [37].f1; [38].f1; [39].f1; [40].f1; [41].f1; [42].f1; + [43].f1; [44].f1; [45].f1; [46].f1; [47].f1; [48].f1; [49].f1; + [50].f1; [51].f1; [52].f1; [53].f1; [54].f1; [55].f1; [56].f1; + [57].f1; [58].f1; [59].f1; [60].f1; [61].f1; [62].f1; [63].f1; + [64].f1; [65].f1; [66].f1; [67].f1; [68].f1; [69].f1; [70].f1; + [71].f1; [72].f1; [73].f1; [74].f1; [75].f1; [76].f1; [77].f1; + [78].f1; [79].f1; [80].f1; [81].f1; [82].f1; [83].f1; [84].f1; + [85].f1; [86].f1; [87].f1; [88].f1; [89].f1; [90].f1; [91].f1; + [92].f1; [93].f1; [94].f1; [95].f1; [96].f1; [97].f1; [98].f1; + [99].f1} +[inout] Out (internal) for function main: + T[0..99]; Tpost{[18]; [53]}; t{[0].f2; [1..5]}; t2[0..99999]; t3[0..99999]; + x; y1; y2; y3; t_main3_1[0][0..7]; t_main3_2[0..2][0..3][0..4]; + t_main4{[0..998]; [999].f1}; + u_main4{[0].f1; [1].f1; [2].f1; [3].f1; [4].f1; [5].f1; [6].f1; [7].f1; + [8].f1; [9].f1; [10].f1; [11].f1; [12].f1; [13].f1; [14].f1; + [15].f1; [16].f1; [17].f1; [18].f1; [19].f1; [20].f1; [21].f1; + [22].f1; [23].f1; [24].f1; [25].f1; [26].f1; [27].f1; [28].f1; + [29].f1; [30].f1; [31].f1; [32].f1; [33].f1; [34].f1; [35].f1; + [36].f1; [37].f1; [38].f1; [39].f1; [40].f1; [41].f1; [42].f1; + [43].f1; [44].f1; [45].f1; [46].f1; [47].f1; [48].f1; [49].f1; + [50].f1; [51].f1; [52].f1; [53].f1; [54].f1; [55].f1; [56].f1; + [57].f1; [58].f1; [59].f1; [60].f1; [61].f1; [62].f1; [63].f1; + [64].f1; [65].f1; [66].f1; [67].f1; [68].f1; [69].f1; [70].f1; + [71].f1; [72].f1; [73].f1; [74].f1; [75].f1; [76].f1; [77].f1; + [78].f1; [79].f1; [80].f1; [81].f1; [82].f1; [83].f1; [84].f1; + [85].f1; [86].f1; [87].f1; [88].f1; [89].f1; [90].f1; [91].f1; + [92].f1; [93].f1; [94].f1; [95].f1; [96].f1; [97].f1; [98].f1; + [99].f1} +[inout] Inputs for function main: + ANYTHING(origin:Unknown) +[inout] InOut (internal) for function main: + Operational inputs: + ANYTHING(origin:Unknown) + Operational inputs on termination: + ANYTHING(origin:Unknown) + Sure outputs: + u_main4{[0].f1; [1].f1; [2].f1; [3].f1; [4].f1; [5].f1; [6].f1; [7].f1; + [8].f1; [9].f1; [10].f1; [11].f1; [12].f1; [13].f1; [14].f1; + [15].f1; [16].f1; [17].f1; [18].f1; [19].f1; [20].f1; [21].f1; + [22].f1; [23].f1; [24].f1; [25].f1; [26].f1; [27].f1; [28].f1; + [29].f1; [30].f1; [31].f1; [32].f1; [33].f1; [34].f1; [35].f1; + [36].f1; [37].f1; [38].f1; [39].f1; [40].f1; [41].f1; [42].f1; + [43].f1; [44].f1; [45].f1; [46].f1; [47].f1; [48].f1; [49].f1; + [50].f1; [51].f1; [52].f1; [53].f1; [54].f1; [55].f1; [56].f1; + [57].f1; [58].f1; [59].f1; [60].f1; [61].f1; [62].f1; [63].f1; + [64].f1; [65].f1; [66].f1; [67].f1; [68].f1; [69].f1; [70].f1; + [71].f1; [72].f1; [73].f1; [74].f1; [75].f1; [76].f1; [77].f1; + [78].f1; [79].f1; [80].f1; [81].f1; [82].f1; [83].f1; [84].f1; + [85].f1; [86].f1; [87].f1; [88].f1; [89].f1; [90].f1; [91].f1; + [92].f1; [93].f1; [94].f1; [95].f1; [96].f1; [97].f1; [98].f1; + [99].f1} +/* Generated by Frama-C */ +struct __anonstruct_ts_1 { + int f1 ; + int f2 ; +}; +typedef struct __anonstruct_ts_1 ts; +int volatile v; +int G; +/*@ assigns *(s+(..)); + assigns *(s+(..)) \from *(s+(..)); */ +extern void F1(char *s); + +char T[100]; +char Tpost[100]; +ts t[10]; +int t2[100000]; +int t3[100000]; +/*@ assigns *(p+(0 .. 3)); + assigns *(p+(0 .. 3)) \from *(p+(4 .. 7)); */ +extern void f(char *p); + +/*@ assigns t2[(unsigned char)len+1 .. (unsigned char)len+1]; + assigns t2[(unsigned char)len+1 .. (unsigned char)len+1] \from \nothing; + */ +extern void g(int len); + +/*@ assigns *(p+(..)); + assigns *(p+(..)) \from \nothing; */ +extern void h(int *p); + +/*@ logic int foo(int p) ; + */ +/*@ assigns *(p+(0 .. foo(*p))); + assigns *(p+(0 .. foo(*p))) \from \nothing; + */ +extern void j(int *p); + +int x; +int k = 53; +/*@ assigns \at(x,Post), Tpost[\at(\old(i),Post)], Tpost[\at(k,Post)]; + assigns \at(x,Post) \from \at(x,Post); + */ +extern void assigns_post(int i); + +void main1(void) +{ + F1(T); + { + int i; + i = 0; + while (i <= 5) { + f((char *)(& t[i].f2)); + i ++; + } + } + /*@ assert Value: signed_overflow: 2*(int)(&T) ≤ 2147483647; */ + /*@ assert Value: signed_overflow: -2147483648 ≤ 2*(int)(&T); */ + g(2 * (int)(& T)); + /*@ assert Value: signed_overflow: 2*(int)(&t3) ≤ 2147483647; */ + /*@ assert Value: signed_overflow: -2147483648 ≤ 2*(int)(&t3); */ + h((int *)(2 * (int)(& t3))); + j((int *)(& T[9])); + assigns_post(18); + return; +} + +/*@ assigns \nothing; */ +extern int ff1(); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int *ff2(); + +/*@ assigns \nothing; */ +extern int *ff2_bis(); + +int y1; +int y2; +int y3; +/*@ assigns y1, y2, y3; + assigns y2 \from y2; */ +extern void ff3(); + +/*@ assigns \nothing; */ +extern void ff4(); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int ff5(); + +int main2(void) +{ + int __retres; + int l; + int *p; + int *q; + l = ff1(); + ff3(); + ff4(); + ff5(); + p = ff2(); + q = ff2_bis(); + /*@ assert Value: ptr_comparison: \pointer_comparable(p, &x); */ + if (p != & x) { + __retres = 1; + goto return_label; + } + __retres = 0; + return_label: return __retres; +} + +int t_main3_1[7][8]; +int t_main3_2[3][4][5]; +/*@ assigns \result, (*a)[0 .. 7], (*(b+(0 .. 2)))[0 .. 3][0 .. 4]; + assigns \result \from (*a)[0 .. 7], (*(b+(0 .. 2)))[0 .. 3][0 .. 4]; + assigns (*a)[0 .. 7] \from (*a)[0 .. 7], (*(b+(0 .. 2)))[0 .. 3][0 .. 4]; + assigns (*(b+(0 .. 2)))[0 .. 3][0 .. 4] + \from (*a)[0 .. 7], (*(b+(0 .. 2)))[0 .. 3][0 .. 4]; + */ +extern int main3(int (*a)[8], int (* /*[3]*/ b)[4][5]); + +ts t_main4[1000]; +ts u_main4[100]; +/*@ assigns t_main4[i].f1, u_main4[i].f1; + assigns t_main4[i].f1 \from \nothing; + assigns u_main4[i].f1 \from \nothing; + */ +extern void f_main4_1(int i); + +/*@ assigns t_main4[0 .. 999].f1, u_main4[0 .. 99].f1; + assigns t_main4[0 .. 999].f1 \from \nothing; + assigns u_main4[0 .. 99].f1 \from \nothing; + */ +extern void f_main4_2(); + +void main4(void) +{ + f_main4_1(v); + f_main4_2(); + return; +} + +void main(void) +{ + main1(); + main2(); + main3(t_main3_1,t_main3_2); + main4(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/attribute-aligned.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/attribute-aligned.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/attribute-aligned.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/attribute-aligned.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,151 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/attribute-aligned.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ {0} + A ∈ {0} + B ∈ {0} +[value] computing for function ct <- main. + Called from tests/misc/attribute-aligned.c:94. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function dt <- main. + Called from tests/misc/attribute-aligned.c:95. +[value] Recording results for dt +[value] Done for function dt +[value] computing for function pt <- main. + Called from tests/misc/attribute-aligned.c:96. +[value] Recording results for pt +[value] Done for function pt +[value] computing for function qt <- main. + Called from tests/misc/attribute-aligned.c:97. +[value] Recording results for qt +[value] Done for function qt +[value] computing for function rt <- main. + Called from tests/misc/attribute-aligned.c:98. +[value] Recording results for rt +[value] Done for function rt +[value] computing for function st <- main. + Called from tests/misc/attribute-aligned.c:99. +[value] Recording results for st +[value] Done for function st +[value] computing for function tt <- main. + Called from tests/misc/attribute-aligned.c:100. +[value] Recording results for tt +[value] Done for function tt +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function ct: + S ∈ {1} + A ∈ {0} +[value] Values at end of function dt: + S ∈ {4} + A ∈ {0} +[value] Values at end of function pt: + S ∈ {4} + A ∈ {0} +[value] Values at end of function qt: + S ∈ {4} + A ∈ {0} + B ∈ {1} +[value] Values at end of function rt: + S ∈ {8} + A ∈ {0} + B ∈ {4} +[value] Values at end of function st: + S ∈ {8} + A ∈ {0} + B ∈ {4} +[value] Values at end of function tt: + S ∈ {4} + A ∈ {0} + B ∈ {4} +[value] Values at end of function main: + S ∈ {4} + A ∈ {0} + B ∈ {4} + __retres ∈ {0} +[from] Computing for function ct +[from] Done for function ct +[from] Computing for function dt +[from] Done for function dt +[from] Computing for function pt +[from] Done for function pt +[from] Computing for function qt +[from] Done for function qt +[from] Computing for function rt +[from] Done for function rt +[from] Computing for function st +[from] Done for function st +[from] Computing for function tt +[from] Done for function tt +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function ct: + S FROM \nothing + A FROM \nothing +[from] Function dt: + S FROM \nothing + A FROM \nothing +[from] Function pt: + S FROM \nothing + A FROM \nothing +[from] Function qt: + S FROM \nothing + A FROM \nothing + B FROM \nothing +[from] Function rt: + S FROM \nothing + A FROM \nothing + B FROM \nothing +[from] Function st: + S FROM \nothing + A FROM \nothing + B FROM \nothing +[from] Function tt: + S FROM \nothing + A FROM \nothing + B FROM \nothing +[from] Function main: + S FROM \nothing + A FROM \nothing + B FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function ct: + S; A +[inout] Inputs for function ct: + \nothing +[inout] Out (internal) for function dt: + S; A +[inout] Inputs for function dt: + \nothing +[inout] Out (internal) for function pt: + S; A +[inout] Inputs for function pt: + \nothing +[inout] Out (internal) for function qt: + S; A; B +[inout] Inputs for function qt: + \nothing +[inout] Out (internal) for function rt: + S; A; B +[inout] Inputs for function rt: + \nothing +[inout] Out (internal) for function st: + S; A; B +[inout] Inputs for function st: + \nothing +[inout] Out (internal) for function tt: + S; A; B +[inout] Inputs for function tt: + \nothing +[inout] Out (internal) for function main: + S; A; B; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/automalloc.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/automalloc.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/automalloc.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/automalloc.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,56 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/automalloc.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function malloc <- main. + Called from tests/misc/automalloc.i:10. +tests/misc/automalloc.i:10:[kernel] warning: Neither code nor specification for function malloc, generating default assigns from the prototype +[value] using specification for function malloc +[value] Done for function malloc +[value] computing for function realloc <- main. + Called from tests/misc/automalloc.i:11. +tests/misc/automalloc.i:11:[kernel] warning: Neither code nor specification for function realloc, generating default assigns from the prototype +[value] using specification for function realloc +[value] Done for function realloc +tests/misc/automalloc.i:13:[kernel] warning: out of bounds write. assert \valid(buf+1); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + test ∈ [--..--] + buf ∈ + {{ NULL + [--..--] ; &alloced_return_malloc + [0..2147483647] ; + &alloced_return_realloc + [0..2147483647] }} + alloced_return_malloc[bits 0 to ..] ∈ + {{ garbled mix of &{alloced_return_malloc} + (origin: Library function + {tests/misc/automalloc.i:10}) }} or UNINITIALIZED + alloced_return_realloc[bits 0 to ..] ∈ + {{ garbled mix of &{alloced_return_realloc} + (origin: Library function + {tests/misc/automalloc.i:11}) }} or UNINITIALIZED +[from] Computing for function main +[from] Computing for function malloc <-main +[from] Done for function malloc +[from] Computing for function realloc <-main +[from] Done for function realloc +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function malloc: + \result FROM s +[from] Function realloc: + test FROM s; test (and SELF) + \result FROM s; test +[from] Function main: + alloced_return_malloc[bits 8 to 17179869191] FROM test (and SELF) + alloced_return_realloc[bits 8 to 17179869191] FROM test (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + test; buf; alloced_return_malloc[bits 8 to 17179869191]; + alloced_return_realloc[bits 8 to 17179869191] +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bad_loop.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bad_loop.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bad_loop.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bad_loop.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bad_loop.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + c ∈ [--..--] +tests/misc/bad_loop.i:6:[value] entering loop for the first time +tests/misc/bad_loop.i:12:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + x ∈ {0; 1; 2} + d ∈ [--..--] + e ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + x; d; e +[inout] Inputs for function main: + c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/behavior_names.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/behavior_names.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/behavior_names.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/behavior_names.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,5 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/behavior_names.i (no preprocessing) +stmt: bli bar +new1: foo_0 +new2: bla diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bigarray.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bigarray.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bigarray.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bigarray.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bigarray.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0] ∈ {2} + [1] ∈ {3} + [2..8388607] ∈ {0} + S ∈ {{ "uututututututu" }} +tests/misc/bigarray.c:7:[kernel] warning: out of bounds write. assert \valid(S); +tests/misc/bigarray.c:7:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +tests/misc/bigarray.c:7:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + __retres +[inout] Inputs for function main: + S diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/big_lib_entry.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/big_lib_entry.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/big_lib_entry.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/big_lib_entry.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,9117 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/big_lib_entry.i (no preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +tests/misc/big_lib_entry.i:32:[value] Initializing a complex array of 1000 elements. This may take some time +[value] Initial state computed +[value] Values of globals at initialization + s.c1 ∈ [--..--] + .[bits 8 to 31] ∈ UNINITIALIZED + .tcs[0].f1 ∈ [--..--] + .tcs[0].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + .tcs[0].f3 ∈ [--..--] + .tcs[0].[bits 72 to 95] ∈ UNINITIALIZED + .tcs[0].f4 ∈ {{ NULL ; &S_f4_0_tcs_s[0] }} + .tcs[0].f5 ∈ [--..--] + .tcs[0].[bits 136 to 159] ∈ UNINITIALIZED + .tcs[1].f1 ∈ [--..--] + .tcs[1].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + .tcs[1].f3 ∈ [--..--] + .tcs[1].[bits 72 to 95] ∈ UNINITIALIZED + .tcs[1].f4 ∈ {{ NULL ; &S_f4_1_tcs_s[0] }} + .tcs[1].f5 ∈ [--..--] + .tcs[1].[bits 136 to 159] ∈ UNINITIALIZED + .tcs[2].f1 ∈ [--..--] + .tcs[2].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + .tcs[2].f3 ∈ [--..--] + .tcs[2].[bits 72 to 95] ∈ UNINITIALIZED + .tcs[2].f4 ∈ {{ NULL ; &S_f4_2_tcs_s[0] }} + .tcs[2].f5 ∈ [--..--] + .tcs[2].[bits 136 to 159] ∈ UNINITIALIZED + .tcs[3].f1 ∈ [--..--] + .tcs[3].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + .tcs[3].f3 ∈ [--..--] + .tcs[3].[bits 72 to 95] ∈ UNINITIALIZED + .tcs[3].f4 ∈ {{ NULL ; &S_f4_3_tcs_s[0] }} + .tcs[3].f5 ∈ [--..--] + .tcs[3].[bits 136 to 159] ∈ UNINITIALIZED + .tcs[4].f1 ∈ [--..--] + .tcs[4].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + .tcs[4].f3 ∈ [--..--] + .tcs[4].[bits 72 to 95] ∈ UNINITIALIZED + .tcs[4].f4 ∈ + {{ NULL ; &S_f4_0_tcs_s[0] ; &S_f4_1_tcs_s[0] ; &S_f4_2_tcs_s[0] ; + &S_f4_3_tcs_s[0] }} + .tcs[4].f5 ∈ [--..--] + .tcs[4].[bits 136 to 159] ∈ UNINITIALIZED + .tcs[5].f1 ∈ [--..--] + .tcs[5].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + .tcs[5].f3 ∈ [--..--] + .tcs[5].[bits 72 to 95] ∈ UNINITIALIZED + .tcs[5].f4 ∈ + {{ NULL ; &S_f4_0_tcs_s[0] ; &S_f4_1_tcs_s[0] ; &S_f4_2_tcs_s[0] ; + &S_f4_3_tcs_s[0] }} + .tcs[5].f5 ∈ [--..--] + .tcs[5].[bits 136 to 159] ∈ UNINITIALIZED + .tcs[6].f1 ∈ [--..--] + .tcs[6].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + .tcs[6].f3 ∈ [--..--] + .tcs[6].[bits 72 to 95] ∈ UNINITIALIZED + .tcs[6].f4 ∈ + {{ NULL ; &S_f4_0_tcs_s[0] ; &S_f4_1_tcs_s[0] ; &S_f4_2_tcs_s[0] ; + &S_f4_3_tcs_s[0] }} + .tcs[6].f5 ∈ [--..--] + .tcs[6].[bits 136 to 159] ∈ UNINITIALIZED + .tcs[7].f1 ∈ [--..--] + .tcs[7].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + .tcs[7].f3 ∈ [--..--] + .tcs[7].[bits 72 to 95] ∈ UNINITIALIZED + .tcs[7].f4 ∈ + {{ NULL ; &S_f4_0_tcs_s[0] ; &S_f4_1_tcs_s[0] ; &S_f4_2_tcs_s[0] ; + &S_f4_3_tcs_s[0] }} + .tcs[7].f5 ∈ [--..--] + .tcs[7].[bits 136 to 159] ∈ UNINITIALIZED + .tcs[8].f1 ∈ [--..--] + .tcs[8].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + .tcs[8].f3 ∈ [--..--] + .tcs[8].[bits 72 to 95] ∈ UNINITIALIZED + .tcs[8].f4 ∈ + {{ NULL ; &S_f4_0_tcs_s[0] ; &S_f4_1_tcs_s[0] ; &S_f4_2_tcs_s[0] ; + &S_f4_3_tcs_s[0] }} + .tcs[8].f5 ∈ [--..--] + .tcs[8].[bits 136 to 159] ∈ UNINITIALIZED + .tcs[9].f1 ∈ [--..--] + .tcs[9].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + .tcs[9].f3 ∈ [--..--] + .tcs[9].[bits 72 to 95] ∈ UNINITIALIZED + .tcs[9].f4 ∈ + {{ NULL ; &S_f4_0_tcs_s[0] ; &S_f4_1_tcs_s[0] ; &S_f4_2_tcs_s[0] ; + &S_f4_3_tcs_s[0] }} + .tcs[9].f5 ∈ [--..--] + .tcs[9].[bits 136 to 159] ∈ UNINITIALIZED + .c2 ∈ [--..--] + .[bits 1640 to 1663] ∈ UNINITIALIZED + t1[0] ∈ {{ NULL ; &S_0_t1[0] }} + [1] ∈ {{ NULL ; &S_1_t1[0] }} + [2] ∈ {{ NULL ; &S_2_t1[0] }} + [3] ∈ {{ NULL ; &S_3_t1[0] }} + [4..4999999] ∈ + {{ NULL ; &S_0_t1[0] ; &S_1_t1[0] ; &S_2_t1[0] ; &S_3_t1[0] }} + t2[0..4999999] ∈ [--..--] + t3[0].f1 ∈ [--..--] + [0].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [0].f3 ∈ [--..--] + [0].[bits 72 to 95] ∈ UNINITIALIZED + [0].f4 ∈ {{ NULL ; &S_f4_0_t3[0] }} + [0].f5 ∈ [--..--] + [0].[bits 136 to 159] ∈ UNINITIALIZED + [1].f1 ∈ [--..--] + [1].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [1].f3 ∈ [--..--] + [1].[bits 72 to 95] ∈ UNINITIALIZED + [1].f4 ∈ {{ NULL ; &S_f4_1_t3[0] }} + [1].f5 ∈ [--..--] + [1].[bits 136 to 159] ∈ UNINITIALIZED + [2].f1 ∈ [--..--] + [2].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [2].f3 ∈ [--..--] + [2].[bits 72 to 95] ∈ UNINITIALIZED + [2].f4 ∈ {{ NULL ; &S_f4_2_t3[0] }} + [2].f5 ∈ [--..--] + [2].[bits 136 to 159] ∈ UNINITIALIZED + [3].f1 ∈ [--..--] + [3].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [3].f3 ∈ [--..--] + [3].[bits 72 to 95] ∈ UNINITIALIZED + [3].f4 ∈ {{ NULL ; &S_f4_3_t3[0] }} + [3].f5 ∈ [--..--] + [3].[bits 136 to 159] ∈ UNINITIALIZED + [4].f1 ∈ [--..--] + [4].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [4].f3 ∈ [--..--] + [4].[bits 72 to 95] ∈ UNINITIALIZED + [4].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [4].f5 ∈ [--..--] + [4].[bits 136 to 159] ∈ UNINITIALIZED + [5].f1 ∈ [--..--] + [5].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [5].f3 ∈ [--..--] + [5].[bits 72 to 95] ∈ UNINITIALIZED + [5].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [5].f5 ∈ [--..--] + [5].[bits 136 to 159] ∈ UNINITIALIZED + [6].f1 ∈ [--..--] + [6].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [6].f3 ∈ [--..--] + [6].[bits 72 to 95] ∈ UNINITIALIZED + [6].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [6].f5 ∈ [--..--] + [6].[bits 136 to 159] ∈ UNINITIALIZED + [7].f1 ∈ [--..--] + [7].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [7].f3 ∈ [--..--] + [7].[bits 72 to 95] ∈ UNINITIALIZED + [7].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [7].f5 ∈ [--..--] + [7].[bits 136 to 159] ∈ UNINITIALIZED + [8].f1 ∈ [--..--] + [8].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [8].f3 ∈ [--..--] + [8].[bits 72 to 95] ∈ UNINITIALIZED + [8].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [8].f5 ∈ [--..--] + [8].[bits 136 to 159] ∈ UNINITIALIZED + [9].f1 ∈ [--..--] + [9].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [9].f3 ∈ [--..--] + [9].[bits 72 to 95] ∈ UNINITIALIZED + [9].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [9].f5 ∈ [--..--] + [9].[bits 136 to 159] ∈ UNINITIALIZED + [10].f1 ∈ [--..--] + [10].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [10].f3 ∈ [--..--] + [10].[bits 72 to 95] ∈ UNINITIALIZED + [10].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [10].f5 ∈ [--..--] + [10].[bits 136 to 159] ∈ UNINITIALIZED + [11].f1 ∈ [--..--] + [11].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [11].f3 ∈ [--..--] + [11].[bits 72 to 95] ∈ UNINITIALIZED + [11].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [11].f5 ∈ [--..--] + [11].[bits 136 to 159] ∈ UNINITIALIZED + [12].f1 ∈ [--..--] + [12].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [12].f3 ∈ [--..--] + [12].[bits 72 to 95] ∈ UNINITIALIZED + [12].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [12].f5 ∈ [--..--] + [12].[bits 136 to 159] ∈ UNINITIALIZED + [13].f1 ∈ [--..--] + [13].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [13].f3 ∈ [--..--] + [13].[bits 72 to 95] ∈ UNINITIALIZED + [13].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [13].f5 ∈ [--..--] + [13].[bits 136 to 159] ∈ UNINITIALIZED + [14].f1 ∈ [--..--] + [14].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [14].f3 ∈ [--..--] + [14].[bits 72 to 95] ∈ UNINITIALIZED + [14].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [14].f5 ∈ [--..--] + [14].[bits 136 to 159] ∈ UNINITIALIZED + [15].f1 ∈ [--..--] + [15].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [15].f3 ∈ [--..--] + [15].[bits 72 to 95] ∈ UNINITIALIZED + [15].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [15].f5 ∈ [--..--] + [15].[bits 136 to 159] ∈ UNINITIALIZED + [16].f1 ∈ [--..--] + [16].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [16].f3 ∈ [--..--] + [16].[bits 72 to 95] ∈ UNINITIALIZED + [16].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [16].f5 ∈ [--..--] + [16].[bits 136 to 159] ∈ UNINITIALIZED + [17].f1 ∈ [--..--] + [17].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [17].f3 ∈ [--..--] + [17].[bits 72 to 95] ∈ UNINITIALIZED + [17].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [17].f5 ∈ [--..--] + [17].[bits 136 to 159] ∈ UNINITIALIZED + [18].f1 ∈ [--..--] + [18].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [18].f3 ∈ [--..--] + [18].[bits 72 to 95] ∈ UNINITIALIZED + [18].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [18].f5 ∈ [--..--] + [18].[bits 136 to 159] ∈ UNINITIALIZED + [19].f1 ∈ [--..--] + [19].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [19].f3 ∈ [--..--] + [19].[bits 72 to 95] ∈ UNINITIALIZED + [19].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [19].f5 ∈ [--..--] + [19].[bits 136 to 159] ∈ UNINITIALIZED + [20].f1 ∈ [--..--] + [20].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [20].f3 ∈ [--..--] + [20].[bits 72 to 95] ∈ UNINITIALIZED + [20].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [20].f5 ∈ [--..--] + [20].[bits 136 to 159] ∈ UNINITIALIZED + [21].f1 ∈ [--..--] + [21].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [21].f3 ∈ [--..--] + [21].[bits 72 to 95] ∈ UNINITIALIZED + [21].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [21].f5 ∈ [--..--] + [21].[bits 136 to 159] ∈ UNINITIALIZED + [22].f1 ∈ [--..--] + [22].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [22].f3 ∈ [--..--] + [22].[bits 72 to 95] ∈ UNINITIALIZED + [22].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [22].f5 ∈ [--..--] + [22].[bits 136 to 159] ∈ UNINITIALIZED + [23].f1 ∈ [--..--] + [23].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [23].f3 ∈ [--..--] + [23].[bits 72 to 95] ∈ UNINITIALIZED + [23].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [23].f5 ∈ [--..--] + [23].[bits 136 to 159] ∈ UNINITIALIZED + [24].f1 ∈ [--..--] + [24].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [24].f3 ∈ [--..--] + [24].[bits 72 to 95] ∈ UNINITIALIZED + [24].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [24].f5 ∈ [--..--] + [24].[bits 136 to 159] ∈ UNINITIALIZED + [25].f1 ∈ [--..--] + [25].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [25].f3 ∈ [--..--] + [25].[bits 72 to 95] ∈ UNINITIALIZED + [25].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [25].f5 ∈ [--..--] + [25].[bits 136 to 159] ∈ UNINITIALIZED + [26].f1 ∈ [--..--] + [26].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [26].f3 ∈ [--..--] + [26].[bits 72 to 95] ∈ UNINITIALIZED + [26].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [26].f5 ∈ [--..--] + [26].[bits 136 to 159] ∈ UNINITIALIZED + [27].f1 ∈ [--..--] + [27].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [27].f3 ∈ [--..--] + [27].[bits 72 to 95] ∈ UNINITIALIZED + [27].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [27].f5 ∈ [--..--] + [27].[bits 136 to 159] ∈ UNINITIALIZED + [28].f1 ∈ [--..--] + [28].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [28].f3 ∈ [--..--] + [28].[bits 72 to 95] ∈ UNINITIALIZED + [28].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [28].f5 ∈ [--..--] + [28].[bits 136 to 159] ∈ UNINITIALIZED + [29].f1 ∈ [--..--] + [29].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [29].f3 ∈ [--..--] + [29].[bits 72 to 95] ∈ UNINITIALIZED + [29].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [29].f5 ∈ [--..--] + [29].[bits 136 to 159] ∈ UNINITIALIZED + [30].f1 ∈ [--..--] + [30].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [30].f3 ∈ [--..--] + [30].[bits 72 to 95] ∈ UNINITIALIZED + [30].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [30].f5 ∈ [--..--] + [30].[bits 136 to 159] ∈ UNINITIALIZED + [31].f1 ∈ [--..--] + [31].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [31].f3 ∈ [--..--] + [31].[bits 72 to 95] ∈ UNINITIALIZED + [31].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [31].f5 ∈ [--..--] + [31].[bits 136 to 159] ∈ UNINITIALIZED + [32].f1 ∈ [--..--] + [32].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [32].f3 ∈ [--..--] + [32].[bits 72 to 95] ∈ UNINITIALIZED + [32].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [32].f5 ∈ [--..--] + [32].[bits 136 to 159] ∈ UNINITIALIZED + [33].f1 ∈ [--..--] + [33].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [33].f3 ∈ [--..--] + [33].[bits 72 to 95] ∈ UNINITIALIZED + [33].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [33].f5 ∈ [--..--] + [33].[bits 136 to 159] ∈ UNINITIALIZED + [34].f1 ∈ [--..--] + [34].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [34].f3 ∈ [--..--] + [34].[bits 72 to 95] ∈ UNINITIALIZED + [34].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [34].f5 ∈ [--..--] + [34].[bits 136 to 159] ∈ UNINITIALIZED + [35].f1 ∈ [--..--] + [35].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [35].f3 ∈ [--..--] + [35].[bits 72 to 95] ∈ UNINITIALIZED + [35].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [35].f5 ∈ [--..--] + [35].[bits 136 to 159] ∈ UNINITIALIZED + [36].f1 ∈ [--..--] + [36].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [36].f3 ∈ [--..--] + [36].[bits 72 to 95] ∈ UNINITIALIZED + [36].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [36].f5 ∈ [--..--] + [36].[bits 136 to 159] ∈ UNINITIALIZED + [37].f1 ∈ [--..--] + [37].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [37].f3 ∈ [--..--] + [37].[bits 72 to 95] ∈ UNINITIALIZED + [37].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [37].f5 ∈ [--..--] + [37].[bits 136 to 159] ∈ UNINITIALIZED + [38].f1 ∈ [--..--] + [38].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [38].f3 ∈ [--..--] + [38].[bits 72 to 95] ∈ UNINITIALIZED + [38].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [38].f5 ∈ [--..--] + [38].[bits 136 to 159] ∈ UNINITIALIZED + [39].f1 ∈ [--..--] + [39].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [39].f3 ∈ [--..--] + [39].[bits 72 to 95] ∈ UNINITIALIZED + [39].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [39].f5 ∈ [--..--] + [39].[bits 136 to 159] ∈ UNINITIALIZED + [40].f1 ∈ [--..--] + [40].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [40].f3 ∈ [--..--] + [40].[bits 72 to 95] ∈ UNINITIALIZED + [40].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [40].f5 ∈ [--..--] + [40].[bits 136 to 159] ∈ UNINITIALIZED + [41].f1 ∈ [--..--] + [41].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [41].f3 ∈ [--..--] + [41].[bits 72 to 95] ∈ UNINITIALIZED + [41].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [41].f5 ∈ [--..--] + [41].[bits 136 to 159] ∈ UNINITIALIZED + [42].f1 ∈ [--..--] + [42].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [42].f3 ∈ [--..--] + [42].[bits 72 to 95] ∈ UNINITIALIZED + [42].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [42].f5 ∈ [--..--] + [42].[bits 136 to 159] ∈ UNINITIALIZED + [43].f1 ∈ [--..--] + [43].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [43].f3 ∈ [--..--] + [43].[bits 72 to 95] ∈ UNINITIALIZED + [43].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [43].f5 ∈ [--..--] + [43].[bits 136 to 159] ∈ UNINITIALIZED + [44].f1 ∈ [--..--] + [44].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [44].f3 ∈ [--..--] + [44].[bits 72 to 95] ∈ UNINITIALIZED + [44].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [44].f5 ∈ [--..--] + [44].[bits 136 to 159] ∈ UNINITIALIZED + [45].f1 ∈ [--..--] + [45].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [45].f3 ∈ [--..--] + [45].[bits 72 to 95] ∈ UNINITIALIZED + [45].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [45].f5 ∈ [--..--] + [45].[bits 136 to 159] ∈ UNINITIALIZED + [46].f1 ∈ [--..--] + [46].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [46].f3 ∈ [--..--] + [46].[bits 72 to 95] ∈ UNINITIALIZED + [46].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [46].f5 ∈ [--..--] + [46].[bits 136 to 159] ∈ UNINITIALIZED + [47].f1 ∈ [--..--] + [47].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [47].f3 ∈ [--..--] + [47].[bits 72 to 95] ∈ UNINITIALIZED + [47].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [47].f5 ∈ [--..--] + [47].[bits 136 to 159] ∈ UNINITIALIZED + [48].f1 ∈ [--..--] + [48].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [48].f3 ∈ [--..--] + [48].[bits 72 to 95] ∈ UNINITIALIZED + [48].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [48].f5 ∈ [--..--] + [48].[bits 136 to 159] ∈ UNINITIALIZED + [49].f1 ∈ [--..--] + [49].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [49].f3 ∈ [--..--] + [49].[bits 72 to 95] ∈ UNINITIALIZED + [49].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [49].f5 ∈ [--..--] + [49].[bits 136 to 159] ∈ UNINITIALIZED + [50].f1 ∈ [--..--] + [50].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [50].f3 ∈ [--..--] + [50].[bits 72 to 95] ∈ UNINITIALIZED + [50].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [50].f5 ∈ [--..--] + [50].[bits 136 to 159] ∈ UNINITIALIZED + [51].f1 ∈ [--..--] + [51].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [51].f3 ∈ [--..--] + [51].[bits 72 to 95] ∈ UNINITIALIZED + [51].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [51].f5 ∈ [--..--] + [51].[bits 136 to 159] ∈ UNINITIALIZED + [52].f1 ∈ [--..--] + [52].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [52].f3 ∈ [--..--] + [52].[bits 72 to 95] ∈ UNINITIALIZED + [52].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [52].f5 ∈ [--..--] + [52].[bits 136 to 159] ∈ UNINITIALIZED + [53].f1 ∈ [--..--] + [53].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [53].f3 ∈ [--..--] + [53].[bits 72 to 95] ∈ UNINITIALIZED + [53].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [53].f5 ∈ [--..--] + [53].[bits 136 to 159] ∈ UNINITIALIZED + [54].f1 ∈ [--..--] + [54].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [54].f3 ∈ [--..--] + [54].[bits 72 to 95] ∈ UNINITIALIZED + [54].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [54].f5 ∈ [--..--] + [54].[bits 136 to 159] ∈ UNINITIALIZED + [55].f1 ∈ [--..--] + [55].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [55].f3 ∈ [--..--] + [55].[bits 72 to 95] ∈ UNINITIALIZED + [55].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [55].f5 ∈ [--..--] + [55].[bits 136 to 159] ∈ UNINITIALIZED + [56].f1 ∈ [--..--] + [56].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [56].f3 ∈ [--..--] + [56].[bits 72 to 95] ∈ UNINITIALIZED + [56].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [56].f5 ∈ [--..--] + [56].[bits 136 to 159] ∈ UNINITIALIZED + [57].f1 ∈ [--..--] + [57].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [57].f3 ∈ [--..--] + [57].[bits 72 to 95] ∈ UNINITIALIZED + [57].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [57].f5 ∈ [--..--] + [57].[bits 136 to 159] ∈ UNINITIALIZED + [58].f1 ∈ [--..--] + [58].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [58].f3 ∈ [--..--] + [58].[bits 72 to 95] ∈ UNINITIALIZED + [58].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [58].f5 ∈ [--..--] + [58].[bits 136 to 159] ∈ UNINITIALIZED + [59].f1 ∈ [--..--] + [59].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [59].f3 ∈ [--..--] + [59].[bits 72 to 95] ∈ UNINITIALIZED + [59].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [59].f5 ∈ [--..--] + [59].[bits 136 to 159] ∈ UNINITIALIZED + [60].f1 ∈ [--..--] + [60].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [60].f3 ∈ [--..--] + [60].[bits 72 to 95] ∈ UNINITIALIZED + [60].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [60].f5 ∈ [--..--] + [60].[bits 136 to 159] ∈ UNINITIALIZED + [61].f1 ∈ [--..--] + [61].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [61].f3 ∈ [--..--] + [61].[bits 72 to 95] ∈ UNINITIALIZED + [61].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [61].f5 ∈ [--..--] + [61].[bits 136 to 159] ∈ UNINITIALIZED + [62].f1 ∈ [--..--] + [62].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [62].f3 ∈ [--..--] + [62].[bits 72 to 95] ∈ UNINITIALIZED + [62].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [62].f5 ∈ [--..--] + [62].[bits 136 to 159] ∈ UNINITIALIZED + [63].f1 ∈ [--..--] + [63].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [63].f3 ∈ [--..--] + [63].[bits 72 to 95] ∈ UNINITIALIZED + [63].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [63].f5 ∈ [--..--] + [63].[bits 136 to 159] ∈ UNINITIALIZED + [64].f1 ∈ [--..--] + [64].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [64].f3 ∈ [--..--] + [64].[bits 72 to 95] ∈ UNINITIALIZED + [64].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [64].f5 ∈ [--..--] + [64].[bits 136 to 159] ∈ UNINITIALIZED + [65].f1 ∈ [--..--] + [65].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [65].f3 ∈ [--..--] + [65].[bits 72 to 95] ∈ UNINITIALIZED + [65].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [65].f5 ∈ [--..--] + [65].[bits 136 to 159] ∈ UNINITIALIZED + [66].f1 ∈ [--..--] + [66].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [66].f3 ∈ [--..--] + [66].[bits 72 to 95] ∈ UNINITIALIZED + [66].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [66].f5 ∈ [--..--] + [66].[bits 136 to 159] ∈ UNINITIALIZED + [67].f1 ∈ [--..--] + [67].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [67].f3 ∈ [--..--] + [67].[bits 72 to 95] ∈ UNINITIALIZED + [67].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [67].f5 ∈ [--..--] + [67].[bits 136 to 159] ∈ UNINITIALIZED + [68].f1 ∈ [--..--] + [68].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [68].f3 ∈ [--..--] + [68].[bits 72 to 95] ∈ UNINITIALIZED + [68].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [68].f5 ∈ [--..--] + [68].[bits 136 to 159] ∈ UNINITIALIZED + [69].f1 ∈ [--..--] + [69].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [69].f3 ∈ [--..--] + [69].[bits 72 to 95] ∈ UNINITIALIZED + [69].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [69].f5 ∈ [--..--] + [69].[bits 136 to 159] ∈ UNINITIALIZED + [70].f1 ∈ [--..--] + [70].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [70].f3 ∈ [--..--] + [70].[bits 72 to 95] ∈ UNINITIALIZED + [70].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [70].f5 ∈ [--..--] + [70].[bits 136 to 159] ∈ UNINITIALIZED + [71].f1 ∈ [--..--] + [71].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [71].f3 ∈ [--..--] + [71].[bits 72 to 95] ∈ UNINITIALIZED + [71].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [71].f5 ∈ [--..--] + [71].[bits 136 to 159] ∈ UNINITIALIZED + [72].f1 ∈ [--..--] + [72].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [72].f3 ∈ [--..--] + [72].[bits 72 to 95] ∈ UNINITIALIZED + [72].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [72].f5 ∈ [--..--] + [72].[bits 136 to 159] ∈ UNINITIALIZED + [73].f1 ∈ [--..--] + [73].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [73].f3 ∈ [--..--] + [73].[bits 72 to 95] ∈ UNINITIALIZED + [73].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [73].f5 ∈ [--..--] + [73].[bits 136 to 159] ∈ UNINITIALIZED + [74].f1 ∈ [--..--] + [74].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [74].f3 ∈ [--..--] + [74].[bits 72 to 95] ∈ UNINITIALIZED + [74].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [74].f5 ∈ [--..--] + [74].[bits 136 to 159] ∈ UNINITIALIZED + [75].f1 ∈ [--..--] + [75].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [75].f3 ∈ [--..--] + [75].[bits 72 to 95] ∈ UNINITIALIZED + [75].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [75].f5 ∈ [--..--] + [75].[bits 136 to 159] ∈ UNINITIALIZED + [76].f1 ∈ [--..--] + [76].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [76].f3 ∈ [--..--] + [76].[bits 72 to 95] ∈ UNINITIALIZED + [76].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [76].f5 ∈ [--..--] + [76].[bits 136 to 159] ∈ UNINITIALIZED + [77].f1 ∈ [--..--] + [77].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [77].f3 ∈ [--..--] + [77].[bits 72 to 95] ∈ UNINITIALIZED + [77].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [77].f5 ∈ [--..--] + [77].[bits 136 to 159] ∈ UNINITIALIZED + [78].f1 ∈ [--..--] + [78].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [78].f3 ∈ [--..--] + [78].[bits 72 to 95] ∈ UNINITIALIZED + [78].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [78].f5 ∈ [--..--] + [78].[bits 136 to 159] ∈ UNINITIALIZED + [79].f1 ∈ [--..--] + [79].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [79].f3 ∈ [--..--] + [79].[bits 72 to 95] ∈ UNINITIALIZED + [79].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [79].f5 ∈ [--..--] + [79].[bits 136 to 159] ∈ UNINITIALIZED + [80].f1 ∈ [--..--] + [80].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [80].f3 ∈ [--..--] + [80].[bits 72 to 95] ∈ UNINITIALIZED + [80].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [80].f5 ∈ [--..--] + [80].[bits 136 to 159] ∈ UNINITIALIZED + [81].f1 ∈ [--..--] + [81].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [81].f3 ∈ [--..--] + [81].[bits 72 to 95] ∈ UNINITIALIZED + [81].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [81].f5 ∈ [--..--] + [81].[bits 136 to 159] ∈ UNINITIALIZED + [82].f1 ∈ [--..--] + [82].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [82].f3 ∈ [--..--] + [82].[bits 72 to 95] ∈ UNINITIALIZED + [82].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [82].f5 ∈ [--..--] + [82].[bits 136 to 159] ∈ UNINITIALIZED + [83].f1 ∈ [--..--] + [83].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [83].f3 ∈ [--..--] + [83].[bits 72 to 95] ∈ UNINITIALIZED + [83].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [83].f5 ∈ [--..--] + [83].[bits 136 to 159] ∈ UNINITIALIZED + [84].f1 ∈ [--..--] + [84].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [84].f3 ∈ [--..--] + [84].[bits 72 to 95] ∈ UNINITIALIZED + [84].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [84].f5 ∈ [--..--] + [84].[bits 136 to 159] ∈ UNINITIALIZED + [85].f1 ∈ [--..--] + [85].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [85].f3 ∈ [--..--] + [85].[bits 72 to 95] ∈ UNINITIALIZED + [85].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [85].f5 ∈ [--..--] + [85].[bits 136 to 159] ∈ UNINITIALIZED + [86].f1 ∈ [--..--] + [86].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [86].f3 ∈ [--..--] + [86].[bits 72 to 95] ∈ UNINITIALIZED + [86].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [86].f5 ∈ [--..--] + [86].[bits 136 to 159] ∈ UNINITIALIZED + [87].f1 ∈ [--..--] + [87].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [87].f3 ∈ [--..--] + [87].[bits 72 to 95] ∈ UNINITIALIZED + [87].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [87].f5 ∈ [--..--] + [87].[bits 136 to 159] ∈ UNINITIALIZED + [88].f1 ∈ [--..--] + [88].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [88].f3 ∈ [--..--] + [88].[bits 72 to 95] ∈ UNINITIALIZED + [88].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [88].f5 ∈ [--..--] + [88].[bits 136 to 159] ∈ UNINITIALIZED + [89].f1 ∈ [--..--] + [89].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [89].f3 ∈ [--..--] + [89].[bits 72 to 95] ∈ UNINITIALIZED + [89].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [89].f5 ∈ [--..--] + [89].[bits 136 to 159] ∈ UNINITIALIZED + [90].f1 ∈ [--..--] + [90].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [90].f3 ∈ [--..--] + [90].[bits 72 to 95] ∈ UNINITIALIZED + [90].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [90].f5 ∈ [--..--] + [90].[bits 136 to 159] ∈ UNINITIALIZED + [91].f1 ∈ [--..--] + [91].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [91].f3 ∈ [--..--] + [91].[bits 72 to 95] ∈ UNINITIALIZED + [91].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [91].f5 ∈ [--..--] + [91].[bits 136 to 159] ∈ UNINITIALIZED + [92].f1 ∈ [--..--] + [92].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [92].f3 ∈ [--..--] + [92].[bits 72 to 95] ∈ UNINITIALIZED + [92].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [92].f5 ∈ [--..--] + [92].[bits 136 to 159] ∈ UNINITIALIZED + [93].f1 ∈ [--..--] + [93].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [93].f3 ∈ [--..--] + [93].[bits 72 to 95] ∈ UNINITIALIZED + [93].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [93].f5 ∈ [--..--] + [93].[bits 136 to 159] ∈ UNINITIALIZED + [94].f1 ∈ [--..--] + [94].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [94].f3 ∈ [--..--] + [94].[bits 72 to 95] ∈ UNINITIALIZED + [94].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [94].f5 ∈ [--..--] + [94].[bits 136 to 159] ∈ UNINITIALIZED + [95].f1 ∈ [--..--] + [95].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [95].f3 ∈ [--..--] + [95].[bits 72 to 95] ∈ UNINITIALIZED + [95].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [95].f5 ∈ [--..--] + [95].[bits 136 to 159] ∈ UNINITIALIZED + [96].f1 ∈ [--..--] + [96].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [96].f3 ∈ [--..--] + [96].[bits 72 to 95] ∈ UNINITIALIZED + [96].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [96].f5 ∈ [--..--] + [96].[bits 136 to 159] ∈ UNINITIALIZED + [97].f1 ∈ [--..--] + [97].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [97].f3 ∈ [--..--] + [97].[bits 72 to 95] ∈ UNINITIALIZED + [97].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [97].f5 ∈ [--..--] + [97].[bits 136 to 159] ∈ UNINITIALIZED + [98].f1 ∈ [--..--] + [98].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [98].f3 ∈ [--..--] + [98].[bits 72 to 95] ∈ UNINITIALIZED + [98].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [98].f5 ∈ [--..--] + [98].[bits 136 to 159] ∈ UNINITIALIZED + [99].f1 ∈ [--..--] + [99].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [99].f3 ∈ [--..--] + [99].[bits 72 to 95] ∈ UNINITIALIZED + [99].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [99].f5 ∈ [--..--] + [99].[bits 136 to 159] ∈ UNINITIALIZED + [100].f1 ∈ [--..--] + [100].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [100].f3 ∈ [--..--] + [100].[bits 72 to 95] ∈ UNINITIALIZED + [100].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [100].f5 ∈ [--..--] + [100].[bits 136 to 159] ∈ UNINITIALIZED + [101].f1 ∈ [--..--] + [101].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [101].f3 ∈ [--..--] + [101].[bits 72 to 95] ∈ UNINITIALIZED + [101].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [101].f5 ∈ [--..--] + [101].[bits 136 to 159] ∈ UNINITIALIZED + [102].f1 ∈ [--..--] + [102].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [102].f3 ∈ [--..--] + [102].[bits 72 to 95] ∈ UNINITIALIZED + [102].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [102].f5 ∈ [--..--] + [102].[bits 136 to 159] ∈ UNINITIALIZED + [103].f1 ∈ [--..--] + [103].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [103].f3 ∈ [--..--] + [103].[bits 72 to 95] ∈ UNINITIALIZED + [103].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [103].f5 ∈ [--..--] + [103].[bits 136 to 159] ∈ UNINITIALIZED + [104].f1 ∈ [--..--] + [104].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [104].f3 ∈ [--..--] + [104].[bits 72 to 95] ∈ UNINITIALIZED + [104].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [104].f5 ∈ [--..--] + [104].[bits 136 to 159] ∈ UNINITIALIZED + [105].f1 ∈ [--..--] + [105].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [105].f3 ∈ [--..--] + [105].[bits 72 to 95] ∈ UNINITIALIZED + [105].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [105].f5 ∈ [--..--] + [105].[bits 136 to 159] ∈ UNINITIALIZED + [106].f1 ∈ [--..--] + [106].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [106].f3 ∈ [--..--] + [106].[bits 72 to 95] ∈ UNINITIALIZED + [106].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [106].f5 ∈ [--..--] + [106].[bits 136 to 159] ∈ UNINITIALIZED + [107].f1 ∈ [--..--] + [107].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [107].f3 ∈ [--..--] + [107].[bits 72 to 95] ∈ UNINITIALIZED + [107].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [107].f5 ∈ [--..--] + [107].[bits 136 to 159] ∈ UNINITIALIZED + [108].f1 ∈ [--..--] + [108].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [108].f3 ∈ [--..--] + [108].[bits 72 to 95] ∈ UNINITIALIZED + [108].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [108].f5 ∈ [--..--] + [108].[bits 136 to 159] ∈ UNINITIALIZED + [109].f1 ∈ [--..--] + [109].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [109].f3 ∈ [--..--] + [109].[bits 72 to 95] ∈ UNINITIALIZED + [109].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [109].f5 ∈ [--..--] + [109].[bits 136 to 159] ∈ UNINITIALIZED + [110].f1 ∈ [--..--] + [110].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [110].f3 ∈ [--..--] + [110].[bits 72 to 95] ∈ UNINITIALIZED + [110].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [110].f5 ∈ [--..--] + [110].[bits 136 to 159] ∈ UNINITIALIZED + [111].f1 ∈ [--..--] + [111].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [111].f3 ∈ [--..--] + [111].[bits 72 to 95] ∈ UNINITIALIZED + [111].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [111].f5 ∈ [--..--] + [111].[bits 136 to 159] ∈ UNINITIALIZED + [112].f1 ∈ [--..--] + [112].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [112].f3 ∈ [--..--] + [112].[bits 72 to 95] ∈ UNINITIALIZED + [112].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [112].f5 ∈ [--..--] + [112].[bits 136 to 159] ∈ UNINITIALIZED + [113].f1 ∈ [--..--] + [113].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [113].f3 ∈ [--..--] + [113].[bits 72 to 95] ∈ UNINITIALIZED + [113].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [113].f5 ∈ [--..--] + [113].[bits 136 to 159] ∈ UNINITIALIZED + [114].f1 ∈ [--..--] + [114].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [114].f3 ∈ [--..--] + [114].[bits 72 to 95] ∈ UNINITIALIZED + [114].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [114].f5 ∈ [--..--] + [114].[bits 136 to 159] ∈ UNINITIALIZED + [115].f1 ∈ [--..--] + [115].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [115].f3 ∈ [--..--] + [115].[bits 72 to 95] ∈ UNINITIALIZED + [115].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [115].f5 ∈ [--..--] + [115].[bits 136 to 159] ∈ UNINITIALIZED + [116].f1 ∈ [--..--] + [116].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [116].f3 ∈ [--..--] + [116].[bits 72 to 95] ∈ UNINITIALIZED + [116].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [116].f5 ∈ [--..--] + [116].[bits 136 to 159] ∈ UNINITIALIZED + [117].f1 ∈ [--..--] + [117].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [117].f3 ∈ [--..--] + [117].[bits 72 to 95] ∈ UNINITIALIZED + [117].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [117].f5 ∈ [--..--] + [117].[bits 136 to 159] ∈ UNINITIALIZED + [118].f1 ∈ [--..--] + [118].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [118].f3 ∈ [--..--] + [118].[bits 72 to 95] ∈ UNINITIALIZED + [118].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [118].f5 ∈ [--..--] + [118].[bits 136 to 159] ∈ UNINITIALIZED + [119].f1 ∈ [--..--] + [119].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [119].f3 ∈ [--..--] + [119].[bits 72 to 95] ∈ UNINITIALIZED + [119].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [119].f5 ∈ [--..--] + [119].[bits 136 to 159] ∈ UNINITIALIZED + [120].f1 ∈ [--..--] + [120].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [120].f3 ∈ [--..--] + [120].[bits 72 to 95] ∈ UNINITIALIZED + [120].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [120].f5 ∈ [--..--] + [120].[bits 136 to 159] ∈ UNINITIALIZED + [121].f1 ∈ [--..--] + [121].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [121].f3 ∈ [--..--] + [121].[bits 72 to 95] ∈ UNINITIALIZED + [121].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [121].f5 ∈ [--..--] + [121].[bits 136 to 159] ∈ UNINITIALIZED + [122].f1 ∈ [--..--] + [122].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [122].f3 ∈ [--..--] + [122].[bits 72 to 95] ∈ UNINITIALIZED + [122].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [122].f5 ∈ [--..--] + [122].[bits 136 to 159] ∈ UNINITIALIZED + [123].f1 ∈ [--..--] + [123].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [123].f3 ∈ [--..--] + [123].[bits 72 to 95] ∈ UNINITIALIZED + [123].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [123].f5 ∈ [--..--] + [123].[bits 136 to 159] ∈ UNINITIALIZED + [124].f1 ∈ [--..--] + [124].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [124].f3 ∈ [--..--] + [124].[bits 72 to 95] ∈ UNINITIALIZED + [124].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [124].f5 ∈ [--..--] + [124].[bits 136 to 159] ∈ UNINITIALIZED + [125].f1 ∈ [--..--] + [125].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [125].f3 ∈ [--..--] + [125].[bits 72 to 95] ∈ UNINITIALIZED + [125].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [125].f5 ∈ [--..--] + [125].[bits 136 to 159] ∈ UNINITIALIZED + [126].f1 ∈ [--..--] + [126].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [126].f3 ∈ [--..--] + [126].[bits 72 to 95] ∈ UNINITIALIZED + [126].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [126].f5 ∈ [--..--] + [126].[bits 136 to 159] ∈ UNINITIALIZED + [127].f1 ∈ [--..--] + [127].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [127].f3 ∈ [--..--] + [127].[bits 72 to 95] ∈ UNINITIALIZED + [127].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [127].f5 ∈ [--..--] + [127].[bits 136 to 159] ∈ UNINITIALIZED + [128].f1 ∈ [--..--] + [128].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [128].f3 ∈ [--..--] + [128].[bits 72 to 95] ∈ UNINITIALIZED + [128].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [128].f5 ∈ [--..--] + [128].[bits 136 to 159] ∈ UNINITIALIZED + [129].f1 ∈ [--..--] + [129].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [129].f3 ∈ [--..--] + [129].[bits 72 to 95] ∈ UNINITIALIZED + [129].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [129].f5 ∈ [--..--] + [129].[bits 136 to 159] ∈ UNINITIALIZED + [130].f1 ∈ [--..--] + [130].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [130].f3 ∈ [--..--] + [130].[bits 72 to 95] ∈ UNINITIALIZED + [130].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [130].f5 ∈ [--..--] + [130].[bits 136 to 159] ∈ UNINITIALIZED + [131].f1 ∈ [--..--] + [131].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [131].f3 ∈ [--..--] + [131].[bits 72 to 95] ∈ UNINITIALIZED + [131].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [131].f5 ∈ [--..--] + [131].[bits 136 to 159] ∈ UNINITIALIZED + [132].f1 ∈ [--..--] + [132].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [132].f3 ∈ [--..--] + [132].[bits 72 to 95] ∈ UNINITIALIZED + [132].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [132].f5 ∈ [--..--] + [132].[bits 136 to 159] ∈ UNINITIALIZED + [133].f1 ∈ [--..--] + [133].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [133].f3 ∈ [--..--] + [133].[bits 72 to 95] ∈ UNINITIALIZED + [133].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [133].f5 ∈ [--..--] + [133].[bits 136 to 159] ∈ UNINITIALIZED + [134].f1 ∈ [--..--] + [134].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [134].f3 ∈ [--..--] + [134].[bits 72 to 95] ∈ UNINITIALIZED + [134].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [134].f5 ∈ [--..--] + [134].[bits 136 to 159] ∈ UNINITIALIZED + [135].f1 ∈ [--..--] + [135].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [135].f3 ∈ [--..--] + [135].[bits 72 to 95] ∈ UNINITIALIZED + [135].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [135].f5 ∈ [--..--] + [135].[bits 136 to 159] ∈ UNINITIALIZED + [136].f1 ∈ [--..--] + [136].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [136].f3 ∈ [--..--] + [136].[bits 72 to 95] ∈ UNINITIALIZED + [136].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [136].f5 ∈ [--..--] + [136].[bits 136 to 159] ∈ UNINITIALIZED + [137].f1 ∈ [--..--] + [137].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [137].f3 ∈ [--..--] + [137].[bits 72 to 95] ∈ UNINITIALIZED + [137].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [137].f5 ∈ [--..--] + [137].[bits 136 to 159] ∈ UNINITIALIZED + [138].f1 ∈ [--..--] + [138].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [138].f3 ∈ [--..--] + [138].[bits 72 to 95] ∈ UNINITIALIZED + [138].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [138].f5 ∈ [--..--] + [138].[bits 136 to 159] ∈ UNINITIALIZED + [139].f1 ∈ [--..--] + [139].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [139].f3 ∈ [--..--] + [139].[bits 72 to 95] ∈ UNINITIALIZED + [139].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [139].f5 ∈ [--..--] + [139].[bits 136 to 159] ∈ UNINITIALIZED + [140].f1 ∈ [--..--] + [140].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [140].f3 ∈ [--..--] + [140].[bits 72 to 95] ∈ UNINITIALIZED + [140].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [140].f5 ∈ [--..--] + [140].[bits 136 to 159] ∈ UNINITIALIZED + [141].f1 ∈ [--..--] + [141].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [141].f3 ∈ [--..--] + [141].[bits 72 to 95] ∈ UNINITIALIZED + [141].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [141].f5 ∈ [--..--] + [141].[bits 136 to 159] ∈ UNINITIALIZED + [142].f1 ∈ [--..--] + [142].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [142].f3 ∈ [--..--] + [142].[bits 72 to 95] ∈ UNINITIALIZED + [142].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [142].f5 ∈ [--..--] + [142].[bits 136 to 159] ∈ UNINITIALIZED + [143].f1 ∈ [--..--] + [143].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [143].f3 ∈ [--..--] + [143].[bits 72 to 95] ∈ UNINITIALIZED + [143].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [143].f5 ∈ [--..--] + [143].[bits 136 to 159] ∈ UNINITIALIZED + [144].f1 ∈ [--..--] + [144].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [144].f3 ∈ [--..--] + [144].[bits 72 to 95] ∈ UNINITIALIZED + [144].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [144].f5 ∈ [--..--] + [144].[bits 136 to 159] ∈ UNINITIALIZED + [145].f1 ∈ [--..--] + [145].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [145].f3 ∈ [--..--] + [145].[bits 72 to 95] ∈ UNINITIALIZED + [145].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [145].f5 ∈ [--..--] + [145].[bits 136 to 159] ∈ UNINITIALIZED + [146].f1 ∈ [--..--] + [146].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [146].f3 ∈ [--..--] + [146].[bits 72 to 95] ∈ UNINITIALIZED + [146].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [146].f5 ∈ [--..--] + [146].[bits 136 to 159] ∈ UNINITIALIZED + [147].f1 ∈ [--..--] + [147].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [147].f3 ∈ [--..--] + [147].[bits 72 to 95] ∈ UNINITIALIZED + [147].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [147].f5 ∈ [--..--] + [147].[bits 136 to 159] ∈ UNINITIALIZED + [148].f1 ∈ [--..--] + [148].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [148].f3 ∈ [--..--] + [148].[bits 72 to 95] ∈ UNINITIALIZED + [148].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [148].f5 ∈ [--..--] + [148].[bits 136 to 159] ∈ UNINITIALIZED + [149].f1 ∈ [--..--] + [149].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [149].f3 ∈ [--..--] + [149].[bits 72 to 95] ∈ UNINITIALIZED + [149].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [149].f5 ∈ [--..--] + [149].[bits 136 to 159] ∈ UNINITIALIZED + [150].f1 ∈ [--..--] + [150].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [150].f3 ∈ [--..--] + [150].[bits 72 to 95] ∈ UNINITIALIZED + [150].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [150].f5 ∈ [--..--] + [150].[bits 136 to 159] ∈ UNINITIALIZED + [151].f1 ∈ [--..--] + [151].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [151].f3 ∈ [--..--] + [151].[bits 72 to 95] ∈ UNINITIALIZED + [151].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [151].f5 ∈ [--..--] + [151].[bits 136 to 159] ∈ UNINITIALIZED + [152].f1 ∈ [--..--] + [152].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [152].f3 ∈ [--..--] + [152].[bits 72 to 95] ∈ UNINITIALIZED + [152].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [152].f5 ∈ [--..--] + [152].[bits 136 to 159] ∈ UNINITIALIZED + [153].f1 ∈ [--..--] + [153].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [153].f3 ∈ [--..--] + [153].[bits 72 to 95] ∈ UNINITIALIZED + [153].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [153].f5 ∈ [--..--] + [153].[bits 136 to 159] ∈ UNINITIALIZED + [154].f1 ∈ [--..--] + [154].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [154].f3 ∈ [--..--] + [154].[bits 72 to 95] ∈ UNINITIALIZED + [154].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [154].f5 ∈ [--..--] + [154].[bits 136 to 159] ∈ UNINITIALIZED + [155].f1 ∈ [--..--] + [155].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [155].f3 ∈ [--..--] + [155].[bits 72 to 95] ∈ UNINITIALIZED + [155].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [155].f5 ∈ [--..--] + [155].[bits 136 to 159] ∈ UNINITIALIZED + [156].f1 ∈ [--..--] + [156].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [156].f3 ∈ [--..--] + [156].[bits 72 to 95] ∈ UNINITIALIZED + [156].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [156].f5 ∈ [--..--] + [156].[bits 136 to 159] ∈ UNINITIALIZED + [157].f1 ∈ [--..--] + [157].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [157].f3 ∈ [--..--] + [157].[bits 72 to 95] ∈ UNINITIALIZED + [157].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [157].f5 ∈ [--..--] + [157].[bits 136 to 159] ∈ UNINITIALIZED + [158].f1 ∈ [--..--] + [158].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [158].f3 ∈ [--..--] + [158].[bits 72 to 95] ∈ UNINITIALIZED + [158].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [158].f5 ∈ [--..--] + [158].[bits 136 to 159] ∈ UNINITIALIZED + [159].f1 ∈ [--..--] + [159].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [159].f3 ∈ [--..--] + [159].[bits 72 to 95] ∈ UNINITIALIZED + [159].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [159].f5 ∈ [--..--] + [159].[bits 136 to 159] ∈ UNINITIALIZED + [160].f1 ∈ [--..--] + [160].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [160].f3 ∈ [--..--] + [160].[bits 72 to 95] ∈ UNINITIALIZED + [160].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [160].f5 ∈ [--..--] + [160].[bits 136 to 159] ∈ UNINITIALIZED + [161].f1 ∈ [--..--] + [161].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [161].f3 ∈ [--..--] + [161].[bits 72 to 95] ∈ UNINITIALIZED + [161].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [161].f5 ∈ [--..--] + [161].[bits 136 to 159] ∈ UNINITIALIZED + [162].f1 ∈ [--..--] + [162].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [162].f3 ∈ [--..--] + [162].[bits 72 to 95] ∈ UNINITIALIZED + [162].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [162].f5 ∈ [--..--] + [162].[bits 136 to 159] ∈ UNINITIALIZED + [163].f1 ∈ [--..--] + [163].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [163].f3 ∈ [--..--] + [163].[bits 72 to 95] ∈ UNINITIALIZED + [163].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [163].f5 ∈ [--..--] + [163].[bits 136 to 159] ∈ UNINITIALIZED + [164].f1 ∈ [--..--] + [164].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [164].f3 ∈ [--..--] + [164].[bits 72 to 95] ∈ UNINITIALIZED + [164].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [164].f5 ∈ [--..--] + [164].[bits 136 to 159] ∈ UNINITIALIZED + [165].f1 ∈ [--..--] + [165].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [165].f3 ∈ [--..--] + [165].[bits 72 to 95] ∈ UNINITIALIZED + [165].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [165].f5 ∈ [--..--] + [165].[bits 136 to 159] ∈ UNINITIALIZED + [166].f1 ∈ [--..--] + [166].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [166].f3 ∈ [--..--] + [166].[bits 72 to 95] ∈ UNINITIALIZED + [166].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [166].f5 ∈ [--..--] + [166].[bits 136 to 159] ∈ UNINITIALIZED + [167].f1 ∈ [--..--] + [167].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [167].f3 ∈ [--..--] + [167].[bits 72 to 95] ∈ UNINITIALIZED + [167].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [167].f5 ∈ [--..--] + [167].[bits 136 to 159] ∈ UNINITIALIZED + [168].f1 ∈ [--..--] + [168].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [168].f3 ∈ [--..--] + [168].[bits 72 to 95] ∈ UNINITIALIZED + [168].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [168].f5 ∈ [--..--] + [168].[bits 136 to 159] ∈ UNINITIALIZED + [169].f1 ∈ [--..--] + [169].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [169].f3 ∈ [--..--] + [169].[bits 72 to 95] ∈ UNINITIALIZED + [169].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [169].f5 ∈ [--..--] + [169].[bits 136 to 159] ∈ UNINITIALIZED + [170].f1 ∈ [--..--] + [170].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [170].f3 ∈ [--..--] + [170].[bits 72 to 95] ∈ UNINITIALIZED + [170].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [170].f5 ∈ [--..--] + [170].[bits 136 to 159] ∈ UNINITIALIZED + [171].f1 ∈ [--..--] + [171].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [171].f3 ∈ [--..--] + [171].[bits 72 to 95] ∈ UNINITIALIZED + [171].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [171].f5 ∈ [--..--] + [171].[bits 136 to 159] ∈ UNINITIALIZED + [172].f1 ∈ [--..--] + [172].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [172].f3 ∈ [--..--] + [172].[bits 72 to 95] ∈ UNINITIALIZED + [172].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [172].f5 ∈ [--..--] + [172].[bits 136 to 159] ∈ UNINITIALIZED + [173].f1 ∈ [--..--] + [173].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [173].f3 ∈ [--..--] + [173].[bits 72 to 95] ∈ UNINITIALIZED + [173].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [173].f5 ∈ [--..--] + [173].[bits 136 to 159] ∈ UNINITIALIZED + [174].f1 ∈ [--..--] + [174].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [174].f3 ∈ [--..--] + [174].[bits 72 to 95] ∈ UNINITIALIZED + [174].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [174].f5 ∈ [--..--] + [174].[bits 136 to 159] ∈ UNINITIALIZED + [175].f1 ∈ [--..--] + [175].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [175].f3 ∈ [--..--] + [175].[bits 72 to 95] ∈ UNINITIALIZED + [175].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [175].f5 ∈ [--..--] + [175].[bits 136 to 159] ∈ UNINITIALIZED + [176].f1 ∈ [--..--] + [176].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [176].f3 ∈ [--..--] + [176].[bits 72 to 95] ∈ UNINITIALIZED + [176].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [176].f5 ∈ [--..--] + [176].[bits 136 to 159] ∈ UNINITIALIZED + [177].f1 ∈ [--..--] + [177].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [177].f3 ∈ [--..--] + [177].[bits 72 to 95] ∈ UNINITIALIZED + [177].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [177].f5 ∈ [--..--] + [177].[bits 136 to 159] ∈ UNINITIALIZED + [178].f1 ∈ [--..--] + [178].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [178].f3 ∈ [--..--] + [178].[bits 72 to 95] ∈ UNINITIALIZED + [178].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [178].f5 ∈ [--..--] + [178].[bits 136 to 159] ∈ UNINITIALIZED + [179].f1 ∈ [--..--] + [179].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [179].f3 ∈ [--..--] + [179].[bits 72 to 95] ∈ UNINITIALIZED + [179].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [179].f5 ∈ [--..--] + [179].[bits 136 to 159] ∈ UNINITIALIZED + [180].f1 ∈ [--..--] + [180].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [180].f3 ∈ [--..--] + [180].[bits 72 to 95] ∈ UNINITIALIZED + [180].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [180].f5 ∈ [--..--] + [180].[bits 136 to 159] ∈ UNINITIALIZED + [181].f1 ∈ [--..--] + [181].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [181].f3 ∈ [--..--] + [181].[bits 72 to 95] ∈ UNINITIALIZED + [181].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [181].f5 ∈ [--..--] + [181].[bits 136 to 159] ∈ UNINITIALIZED + [182].f1 ∈ [--..--] + [182].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [182].f3 ∈ [--..--] + [182].[bits 72 to 95] ∈ UNINITIALIZED + [182].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [182].f5 ∈ [--..--] + [182].[bits 136 to 159] ∈ UNINITIALIZED + [183].f1 ∈ [--..--] + [183].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [183].f3 ∈ [--..--] + [183].[bits 72 to 95] ∈ UNINITIALIZED + [183].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [183].f5 ∈ [--..--] + [183].[bits 136 to 159] ∈ UNINITIALIZED + [184].f1 ∈ [--..--] + [184].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [184].f3 ∈ [--..--] + [184].[bits 72 to 95] ∈ UNINITIALIZED + [184].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [184].f5 ∈ [--..--] + [184].[bits 136 to 159] ∈ UNINITIALIZED + [185].f1 ∈ [--..--] + [185].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [185].f3 ∈ [--..--] + [185].[bits 72 to 95] ∈ UNINITIALIZED + [185].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [185].f5 ∈ [--..--] + [185].[bits 136 to 159] ∈ UNINITIALIZED + [186].f1 ∈ [--..--] + [186].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [186].f3 ∈ [--..--] + [186].[bits 72 to 95] ∈ UNINITIALIZED + [186].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [186].f5 ∈ [--..--] + [186].[bits 136 to 159] ∈ UNINITIALIZED + [187].f1 ∈ [--..--] + [187].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [187].f3 ∈ [--..--] + [187].[bits 72 to 95] ∈ UNINITIALIZED + [187].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [187].f5 ∈ [--..--] + [187].[bits 136 to 159] ∈ UNINITIALIZED + [188].f1 ∈ [--..--] + [188].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [188].f3 ∈ [--..--] + [188].[bits 72 to 95] ∈ UNINITIALIZED + [188].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [188].f5 ∈ [--..--] + [188].[bits 136 to 159] ∈ UNINITIALIZED + [189].f1 ∈ [--..--] + [189].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [189].f3 ∈ [--..--] + [189].[bits 72 to 95] ∈ UNINITIALIZED + [189].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [189].f5 ∈ [--..--] + [189].[bits 136 to 159] ∈ UNINITIALIZED + [190].f1 ∈ [--..--] + [190].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [190].f3 ∈ [--..--] + [190].[bits 72 to 95] ∈ UNINITIALIZED + [190].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [190].f5 ∈ [--..--] + [190].[bits 136 to 159] ∈ UNINITIALIZED + [191].f1 ∈ [--..--] + [191].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [191].f3 ∈ [--..--] + [191].[bits 72 to 95] ∈ UNINITIALIZED + [191].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [191].f5 ∈ [--..--] + [191].[bits 136 to 159] ∈ UNINITIALIZED + [192].f1 ∈ [--..--] + [192].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [192].f3 ∈ [--..--] + [192].[bits 72 to 95] ∈ UNINITIALIZED + [192].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [192].f5 ∈ [--..--] + [192].[bits 136 to 159] ∈ UNINITIALIZED + [193].f1 ∈ [--..--] + [193].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [193].f3 ∈ [--..--] + [193].[bits 72 to 95] ∈ UNINITIALIZED + [193].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [193].f5 ∈ [--..--] + [193].[bits 136 to 159] ∈ UNINITIALIZED + [194].f1 ∈ [--..--] + [194].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [194].f3 ∈ [--..--] + [194].[bits 72 to 95] ∈ UNINITIALIZED + [194].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [194].f5 ∈ [--..--] + [194].[bits 136 to 159] ∈ UNINITIALIZED + [195].f1 ∈ [--..--] + [195].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [195].f3 ∈ [--..--] + [195].[bits 72 to 95] ∈ UNINITIALIZED + [195].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [195].f5 ∈ [--..--] + [195].[bits 136 to 159] ∈ UNINITIALIZED + [196].f1 ∈ [--..--] + [196].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [196].f3 ∈ [--..--] + [196].[bits 72 to 95] ∈ UNINITIALIZED + [196].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [196].f5 ∈ [--..--] + [196].[bits 136 to 159] ∈ UNINITIALIZED + [197].f1 ∈ [--..--] + [197].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [197].f3 ∈ [--..--] + [197].[bits 72 to 95] ∈ UNINITIALIZED + [197].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [197].f5 ∈ [--..--] + [197].[bits 136 to 159] ∈ UNINITIALIZED + [198].f1 ∈ [--..--] + [198].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [198].f3 ∈ [--..--] + [198].[bits 72 to 95] ∈ UNINITIALIZED + [198].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [198].f5 ∈ [--..--] + [198].[bits 136 to 159] ∈ UNINITIALIZED + [199].f1 ∈ [--..--] + [199].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [199].f3 ∈ [--..--] + [199].[bits 72 to 95] ∈ UNINITIALIZED + [199].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [199].f5 ∈ [--..--] + [199].[bits 136 to 159] ∈ UNINITIALIZED + [200].f1 ∈ [--..--] + [200].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [200].f3 ∈ [--..--] + [200].[bits 72 to 95] ∈ UNINITIALIZED + [200].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [200].f5 ∈ [--..--] + [200].[bits 136 to 159] ∈ UNINITIALIZED + [201].f1 ∈ [--..--] + [201].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [201].f3 ∈ [--..--] + [201].[bits 72 to 95] ∈ UNINITIALIZED + [201].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [201].f5 ∈ [--..--] + [201].[bits 136 to 159] ∈ UNINITIALIZED + [202].f1 ∈ [--..--] + [202].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [202].f3 ∈ [--..--] + [202].[bits 72 to 95] ∈ UNINITIALIZED + [202].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [202].f5 ∈ [--..--] + [202].[bits 136 to 159] ∈ UNINITIALIZED + [203].f1 ∈ [--..--] + [203].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [203].f3 ∈ [--..--] + [203].[bits 72 to 95] ∈ UNINITIALIZED + [203].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [203].f5 ∈ [--..--] + [203].[bits 136 to 159] ∈ UNINITIALIZED + [204].f1 ∈ [--..--] + [204].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [204].f3 ∈ [--..--] + [204].[bits 72 to 95] ∈ UNINITIALIZED + [204].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [204].f5 ∈ [--..--] + [204].[bits 136 to 159] ∈ UNINITIALIZED + [205].f1 ∈ [--..--] + [205].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [205].f3 ∈ [--..--] + [205].[bits 72 to 95] ∈ UNINITIALIZED + [205].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [205].f5 ∈ [--..--] + [205].[bits 136 to 159] ∈ UNINITIALIZED + [206].f1 ∈ [--..--] + [206].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [206].f3 ∈ [--..--] + [206].[bits 72 to 95] ∈ UNINITIALIZED + [206].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [206].f5 ∈ [--..--] + [206].[bits 136 to 159] ∈ UNINITIALIZED + [207].f1 ∈ [--..--] + [207].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [207].f3 ∈ [--..--] + [207].[bits 72 to 95] ∈ UNINITIALIZED + [207].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [207].f5 ∈ [--..--] + [207].[bits 136 to 159] ∈ UNINITIALIZED + [208].f1 ∈ [--..--] + [208].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [208].f3 ∈ [--..--] + [208].[bits 72 to 95] ∈ UNINITIALIZED + [208].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [208].f5 ∈ [--..--] + [208].[bits 136 to 159] ∈ UNINITIALIZED + [209].f1 ∈ [--..--] + [209].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [209].f3 ∈ [--..--] + [209].[bits 72 to 95] ∈ UNINITIALIZED + [209].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [209].f5 ∈ [--..--] + [209].[bits 136 to 159] ∈ UNINITIALIZED + [210].f1 ∈ [--..--] + [210].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [210].f3 ∈ [--..--] + [210].[bits 72 to 95] ∈ UNINITIALIZED + [210].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [210].f5 ∈ [--..--] + [210].[bits 136 to 159] ∈ UNINITIALIZED + [211].f1 ∈ [--..--] + [211].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [211].f3 ∈ [--..--] + [211].[bits 72 to 95] ∈ UNINITIALIZED + [211].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [211].f5 ∈ [--..--] + [211].[bits 136 to 159] ∈ UNINITIALIZED + [212].f1 ∈ [--..--] + [212].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [212].f3 ∈ [--..--] + [212].[bits 72 to 95] ∈ UNINITIALIZED + [212].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [212].f5 ∈ [--..--] + [212].[bits 136 to 159] ∈ UNINITIALIZED + [213].f1 ∈ [--..--] + [213].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [213].f3 ∈ [--..--] + [213].[bits 72 to 95] ∈ UNINITIALIZED + [213].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [213].f5 ∈ [--..--] + [213].[bits 136 to 159] ∈ UNINITIALIZED + [214].f1 ∈ [--..--] + [214].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [214].f3 ∈ [--..--] + [214].[bits 72 to 95] ∈ UNINITIALIZED + [214].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [214].f5 ∈ [--..--] + [214].[bits 136 to 159] ∈ UNINITIALIZED + [215].f1 ∈ [--..--] + [215].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [215].f3 ∈ [--..--] + [215].[bits 72 to 95] ∈ UNINITIALIZED + [215].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [215].f5 ∈ [--..--] + [215].[bits 136 to 159] ∈ UNINITIALIZED + [216].f1 ∈ [--..--] + [216].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [216].f3 ∈ [--..--] + [216].[bits 72 to 95] ∈ UNINITIALIZED + [216].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [216].f5 ∈ [--..--] + [216].[bits 136 to 159] ∈ UNINITIALIZED + [217].f1 ∈ [--..--] + [217].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [217].f3 ∈ [--..--] + [217].[bits 72 to 95] ∈ UNINITIALIZED + [217].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [217].f5 ∈ [--..--] + [217].[bits 136 to 159] ∈ UNINITIALIZED + [218].f1 ∈ [--..--] + [218].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [218].f3 ∈ [--..--] + [218].[bits 72 to 95] ∈ UNINITIALIZED + [218].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [218].f5 ∈ [--..--] + [218].[bits 136 to 159] ∈ UNINITIALIZED + [219].f1 ∈ [--..--] + [219].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [219].f3 ∈ [--..--] + [219].[bits 72 to 95] ∈ UNINITIALIZED + [219].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [219].f5 ∈ [--..--] + [219].[bits 136 to 159] ∈ UNINITIALIZED + [220].f1 ∈ [--..--] + [220].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [220].f3 ∈ [--..--] + [220].[bits 72 to 95] ∈ UNINITIALIZED + [220].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [220].f5 ∈ [--..--] + [220].[bits 136 to 159] ∈ UNINITIALIZED + [221].f1 ∈ [--..--] + [221].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [221].f3 ∈ [--..--] + [221].[bits 72 to 95] ∈ UNINITIALIZED + [221].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [221].f5 ∈ [--..--] + [221].[bits 136 to 159] ∈ UNINITIALIZED + [222].f1 ∈ [--..--] + [222].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [222].f3 ∈ [--..--] + [222].[bits 72 to 95] ∈ UNINITIALIZED + [222].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [222].f5 ∈ [--..--] + [222].[bits 136 to 159] ∈ UNINITIALIZED + [223].f1 ∈ [--..--] + [223].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [223].f3 ∈ [--..--] + [223].[bits 72 to 95] ∈ UNINITIALIZED + [223].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [223].f5 ∈ [--..--] + [223].[bits 136 to 159] ∈ UNINITIALIZED + [224].f1 ∈ [--..--] + [224].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [224].f3 ∈ [--..--] + [224].[bits 72 to 95] ∈ UNINITIALIZED + [224].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [224].f5 ∈ [--..--] + [224].[bits 136 to 159] ∈ UNINITIALIZED + [225].f1 ∈ [--..--] + [225].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [225].f3 ∈ [--..--] + [225].[bits 72 to 95] ∈ UNINITIALIZED + [225].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [225].f5 ∈ [--..--] + [225].[bits 136 to 159] ∈ UNINITIALIZED + [226].f1 ∈ [--..--] + [226].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [226].f3 ∈ [--..--] + [226].[bits 72 to 95] ∈ UNINITIALIZED + [226].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [226].f5 ∈ [--..--] + [226].[bits 136 to 159] ∈ UNINITIALIZED + [227].f1 ∈ [--..--] + [227].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [227].f3 ∈ [--..--] + [227].[bits 72 to 95] ∈ UNINITIALIZED + [227].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [227].f5 ∈ [--..--] + [227].[bits 136 to 159] ∈ UNINITIALIZED + [228].f1 ∈ [--..--] + [228].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [228].f3 ∈ [--..--] + [228].[bits 72 to 95] ∈ UNINITIALIZED + [228].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [228].f5 ∈ [--..--] + [228].[bits 136 to 159] ∈ UNINITIALIZED + [229].f1 ∈ [--..--] + [229].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [229].f3 ∈ [--..--] + [229].[bits 72 to 95] ∈ UNINITIALIZED + [229].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [229].f5 ∈ [--..--] + [229].[bits 136 to 159] ∈ UNINITIALIZED + [230].f1 ∈ [--..--] + [230].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [230].f3 ∈ [--..--] + [230].[bits 72 to 95] ∈ UNINITIALIZED + [230].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [230].f5 ∈ [--..--] + [230].[bits 136 to 159] ∈ UNINITIALIZED + [231].f1 ∈ [--..--] + [231].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [231].f3 ∈ [--..--] + [231].[bits 72 to 95] ∈ UNINITIALIZED + [231].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [231].f5 ∈ [--..--] + [231].[bits 136 to 159] ∈ UNINITIALIZED + [232].f1 ∈ [--..--] + [232].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [232].f3 ∈ [--..--] + [232].[bits 72 to 95] ∈ UNINITIALIZED + [232].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [232].f5 ∈ [--..--] + [232].[bits 136 to 159] ∈ UNINITIALIZED + [233].f1 ∈ [--..--] + [233].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [233].f3 ∈ [--..--] + [233].[bits 72 to 95] ∈ UNINITIALIZED + [233].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [233].f5 ∈ [--..--] + [233].[bits 136 to 159] ∈ UNINITIALIZED + [234].f1 ∈ [--..--] + [234].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [234].f3 ∈ [--..--] + [234].[bits 72 to 95] ∈ UNINITIALIZED + [234].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [234].f5 ∈ [--..--] + [234].[bits 136 to 159] ∈ UNINITIALIZED + [235].f1 ∈ [--..--] + [235].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [235].f3 ∈ [--..--] + [235].[bits 72 to 95] ∈ UNINITIALIZED + [235].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [235].f5 ∈ [--..--] + [235].[bits 136 to 159] ∈ UNINITIALIZED + [236].f1 ∈ [--..--] + [236].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [236].f3 ∈ [--..--] + [236].[bits 72 to 95] ∈ UNINITIALIZED + [236].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [236].f5 ∈ [--..--] + [236].[bits 136 to 159] ∈ UNINITIALIZED + [237].f1 ∈ [--..--] + [237].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [237].f3 ∈ [--..--] + [237].[bits 72 to 95] ∈ UNINITIALIZED + [237].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [237].f5 ∈ [--..--] + [237].[bits 136 to 159] ∈ UNINITIALIZED + [238].f1 ∈ [--..--] + [238].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [238].f3 ∈ [--..--] + [238].[bits 72 to 95] ∈ UNINITIALIZED + [238].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [238].f5 ∈ [--..--] + [238].[bits 136 to 159] ∈ UNINITIALIZED + [239].f1 ∈ [--..--] + [239].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [239].f3 ∈ [--..--] + [239].[bits 72 to 95] ∈ UNINITIALIZED + [239].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [239].f5 ∈ [--..--] + [239].[bits 136 to 159] ∈ UNINITIALIZED + [240].f1 ∈ [--..--] + [240].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [240].f3 ∈ [--..--] + [240].[bits 72 to 95] ∈ UNINITIALIZED + [240].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [240].f5 ∈ [--..--] + [240].[bits 136 to 159] ∈ UNINITIALIZED + [241].f1 ∈ [--..--] + [241].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [241].f3 ∈ [--..--] + [241].[bits 72 to 95] ∈ UNINITIALIZED + [241].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [241].f5 ∈ [--..--] + [241].[bits 136 to 159] ∈ UNINITIALIZED + [242].f1 ∈ [--..--] + [242].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [242].f3 ∈ [--..--] + [242].[bits 72 to 95] ∈ UNINITIALIZED + [242].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [242].f5 ∈ [--..--] + [242].[bits 136 to 159] ∈ UNINITIALIZED + [243].f1 ∈ [--..--] + [243].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [243].f3 ∈ [--..--] + [243].[bits 72 to 95] ∈ UNINITIALIZED + [243].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [243].f5 ∈ [--..--] + [243].[bits 136 to 159] ∈ UNINITIALIZED + [244].f1 ∈ [--..--] + [244].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [244].f3 ∈ [--..--] + [244].[bits 72 to 95] ∈ UNINITIALIZED + [244].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [244].f5 ∈ [--..--] + [244].[bits 136 to 159] ∈ UNINITIALIZED + [245].f1 ∈ [--..--] + [245].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [245].f3 ∈ [--..--] + [245].[bits 72 to 95] ∈ UNINITIALIZED + [245].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [245].f5 ∈ [--..--] + [245].[bits 136 to 159] ∈ UNINITIALIZED + [246].f1 ∈ [--..--] + [246].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [246].f3 ∈ [--..--] + [246].[bits 72 to 95] ∈ UNINITIALIZED + [246].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [246].f5 ∈ [--..--] + [246].[bits 136 to 159] ∈ UNINITIALIZED + [247].f1 ∈ [--..--] + [247].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [247].f3 ∈ [--..--] + [247].[bits 72 to 95] ∈ UNINITIALIZED + [247].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [247].f5 ∈ [--..--] + [247].[bits 136 to 159] ∈ UNINITIALIZED + [248].f1 ∈ [--..--] + [248].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [248].f3 ∈ [--..--] + [248].[bits 72 to 95] ∈ UNINITIALIZED + [248].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [248].f5 ∈ [--..--] + [248].[bits 136 to 159] ∈ UNINITIALIZED + [249].f1 ∈ [--..--] + [249].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [249].f3 ∈ [--..--] + [249].[bits 72 to 95] ∈ UNINITIALIZED + [249].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [249].f5 ∈ [--..--] + [249].[bits 136 to 159] ∈ UNINITIALIZED + [250].f1 ∈ [--..--] + [250].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [250].f3 ∈ [--..--] + [250].[bits 72 to 95] ∈ UNINITIALIZED + [250].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [250].f5 ∈ [--..--] + [250].[bits 136 to 159] ∈ UNINITIALIZED + [251].f1 ∈ [--..--] + [251].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [251].f3 ∈ [--..--] + [251].[bits 72 to 95] ∈ UNINITIALIZED + [251].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [251].f5 ∈ [--..--] + [251].[bits 136 to 159] ∈ UNINITIALIZED + [252].f1 ∈ [--..--] + [252].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [252].f3 ∈ [--..--] + [252].[bits 72 to 95] ∈ UNINITIALIZED + [252].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [252].f5 ∈ [--..--] + [252].[bits 136 to 159] ∈ UNINITIALIZED + [253].f1 ∈ [--..--] + [253].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [253].f3 ∈ [--..--] + [253].[bits 72 to 95] ∈ UNINITIALIZED + [253].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [253].f5 ∈ [--..--] + [253].[bits 136 to 159] ∈ UNINITIALIZED + [254].f1 ∈ [--..--] + [254].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [254].f3 ∈ [--..--] + [254].[bits 72 to 95] ∈ UNINITIALIZED + [254].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [254].f5 ∈ [--..--] + [254].[bits 136 to 159] ∈ UNINITIALIZED + [255].f1 ∈ [--..--] + [255].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [255].f3 ∈ [--..--] + [255].[bits 72 to 95] ∈ UNINITIALIZED + [255].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [255].f5 ∈ [--..--] + [255].[bits 136 to 159] ∈ UNINITIALIZED + [256].f1 ∈ [--..--] + [256].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [256].f3 ∈ [--..--] + [256].[bits 72 to 95] ∈ UNINITIALIZED + [256].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [256].f5 ∈ [--..--] + [256].[bits 136 to 159] ∈ UNINITIALIZED + [257].f1 ∈ [--..--] + [257].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [257].f3 ∈ [--..--] + [257].[bits 72 to 95] ∈ UNINITIALIZED + [257].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [257].f5 ∈ [--..--] + [257].[bits 136 to 159] ∈ UNINITIALIZED + [258].f1 ∈ [--..--] + [258].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [258].f3 ∈ [--..--] + [258].[bits 72 to 95] ∈ UNINITIALIZED + [258].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [258].f5 ∈ [--..--] + [258].[bits 136 to 159] ∈ UNINITIALIZED + [259].f1 ∈ [--..--] + [259].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [259].f3 ∈ [--..--] + [259].[bits 72 to 95] ∈ UNINITIALIZED + [259].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [259].f5 ∈ [--..--] + [259].[bits 136 to 159] ∈ UNINITIALIZED + [260].f1 ∈ [--..--] + [260].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [260].f3 ∈ [--..--] + [260].[bits 72 to 95] ∈ UNINITIALIZED + [260].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [260].f5 ∈ [--..--] + [260].[bits 136 to 159] ∈ UNINITIALIZED + [261].f1 ∈ [--..--] + [261].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [261].f3 ∈ [--..--] + [261].[bits 72 to 95] ∈ UNINITIALIZED + [261].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [261].f5 ∈ [--..--] + [261].[bits 136 to 159] ∈ UNINITIALIZED + [262].f1 ∈ [--..--] + [262].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [262].f3 ∈ [--..--] + [262].[bits 72 to 95] ∈ UNINITIALIZED + [262].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [262].f5 ∈ [--..--] + [262].[bits 136 to 159] ∈ UNINITIALIZED + [263].f1 ∈ [--..--] + [263].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [263].f3 ∈ [--..--] + [263].[bits 72 to 95] ∈ UNINITIALIZED + [263].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [263].f5 ∈ [--..--] + [263].[bits 136 to 159] ∈ UNINITIALIZED + [264].f1 ∈ [--..--] + [264].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [264].f3 ∈ [--..--] + [264].[bits 72 to 95] ∈ UNINITIALIZED + [264].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [264].f5 ∈ [--..--] + [264].[bits 136 to 159] ∈ UNINITIALIZED + [265].f1 ∈ [--..--] + [265].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [265].f3 ∈ [--..--] + [265].[bits 72 to 95] ∈ UNINITIALIZED + [265].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [265].f5 ∈ [--..--] + [265].[bits 136 to 159] ∈ UNINITIALIZED + [266].f1 ∈ [--..--] + [266].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [266].f3 ∈ [--..--] + [266].[bits 72 to 95] ∈ UNINITIALIZED + [266].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [266].f5 ∈ [--..--] + [266].[bits 136 to 159] ∈ UNINITIALIZED + [267].f1 ∈ [--..--] + [267].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [267].f3 ∈ [--..--] + [267].[bits 72 to 95] ∈ UNINITIALIZED + [267].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [267].f5 ∈ [--..--] + [267].[bits 136 to 159] ∈ UNINITIALIZED + [268].f1 ∈ [--..--] + [268].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [268].f3 ∈ [--..--] + [268].[bits 72 to 95] ∈ UNINITIALIZED + [268].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [268].f5 ∈ [--..--] + [268].[bits 136 to 159] ∈ UNINITIALIZED + [269].f1 ∈ [--..--] + [269].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [269].f3 ∈ [--..--] + [269].[bits 72 to 95] ∈ UNINITIALIZED + [269].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [269].f5 ∈ [--..--] + [269].[bits 136 to 159] ∈ UNINITIALIZED + [270].f1 ∈ [--..--] + [270].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [270].f3 ∈ [--..--] + [270].[bits 72 to 95] ∈ UNINITIALIZED + [270].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [270].f5 ∈ [--..--] + [270].[bits 136 to 159] ∈ UNINITIALIZED + [271].f1 ∈ [--..--] + [271].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [271].f3 ∈ [--..--] + [271].[bits 72 to 95] ∈ UNINITIALIZED + [271].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [271].f5 ∈ [--..--] + [271].[bits 136 to 159] ∈ UNINITIALIZED + [272].f1 ∈ [--..--] + [272].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [272].f3 ∈ [--..--] + [272].[bits 72 to 95] ∈ UNINITIALIZED + [272].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [272].f5 ∈ [--..--] + [272].[bits 136 to 159] ∈ UNINITIALIZED + [273].f1 ∈ [--..--] + [273].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [273].f3 ∈ [--..--] + [273].[bits 72 to 95] ∈ UNINITIALIZED + [273].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [273].f5 ∈ [--..--] + [273].[bits 136 to 159] ∈ UNINITIALIZED + [274].f1 ∈ [--..--] + [274].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [274].f3 ∈ [--..--] + [274].[bits 72 to 95] ∈ UNINITIALIZED + [274].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [274].f5 ∈ [--..--] + [274].[bits 136 to 159] ∈ UNINITIALIZED + [275].f1 ∈ [--..--] + [275].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [275].f3 ∈ [--..--] + [275].[bits 72 to 95] ∈ UNINITIALIZED + [275].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [275].f5 ∈ [--..--] + [275].[bits 136 to 159] ∈ UNINITIALIZED + [276].f1 ∈ [--..--] + [276].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [276].f3 ∈ [--..--] + [276].[bits 72 to 95] ∈ UNINITIALIZED + [276].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [276].f5 ∈ [--..--] + [276].[bits 136 to 159] ∈ UNINITIALIZED + [277].f1 ∈ [--..--] + [277].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [277].f3 ∈ [--..--] + [277].[bits 72 to 95] ∈ UNINITIALIZED + [277].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [277].f5 ∈ [--..--] + [277].[bits 136 to 159] ∈ UNINITIALIZED + [278].f1 ∈ [--..--] + [278].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [278].f3 ∈ [--..--] + [278].[bits 72 to 95] ∈ UNINITIALIZED + [278].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [278].f5 ∈ [--..--] + [278].[bits 136 to 159] ∈ UNINITIALIZED + [279].f1 ∈ [--..--] + [279].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [279].f3 ∈ [--..--] + [279].[bits 72 to 95] ∈ UNINITIALIZED + [279].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [279].f5 ∈ [--..--] + [279].[bits 136 to 159] ∈ UNINITIALIZED + [280].f1 ∈ [--..--] + [280].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [280].f3 ∈ [--..--] + [280].[bits 72 to 95] ∈ UNINITIALIZED + [280].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [280].f5 ∈ [--..--] + [280].[bits 136 to 159] ∈ UNINITIALIZED + [281].f1 ∈ [--..--] + [281].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [281].f3 ∈ [--..--] + [281].[bits 72 to 95] ∈ UNINITIALIZED + [281].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [281].f5 ∈ [--..--] + [281].[bits 136 to 159] ∈ UNINITIALIZED + [282].f1 ∈ [--..--] + [282].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [282].f3 ∈ [--..--] + [282].[bits 72 to 95] ∈ UNINITIALIZED + [282].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [282].f5 ∈ [--..--] + [282].[bits 136 to 159] ∈ UNINITIALIZED + [283].f1 ∈ [--..--] + [283].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [283].f3 ∈ [--..--] + [283].[bits 72 to 95] ∈ UNINITIALIZED + [283].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [283].f5 ∈ [--..--] + [283].[bits 136 to 159] ∈ UNINITIALIZED + [284].f1 ∈ [--..--] + [284].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [284].f3 ∈ [--..--] + [284].[bits 72 to 95] ∈ UNINITIALIZED + [284].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [284].f5 ∈ [--..--] + [284].[bits 136 to 159] ∈ UNINITIALIZED + [285].f1 ∈ [--..--] + [285].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [285].f3 ∈ [--..--] + [285].[bits 72 to 95] ∈ UNINITIALIZED + [285].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [285].f5 ∈ [--..--] + [285].[bits 136 to 159] ∈ UNINITIALIZED + [286].f1 ∈ [--..--] + [286].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [286].f3 ∈ [--..--] + [286].[bits 72 to 95] ∈ UNINITIALIZED + [286].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [286].f5 ∈ [--..--] + [286].[bits 136 to 159] ∈ UNINITIALIZED + [287].f1 ∈ [--..--] + [287].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [287].f3 ∈ [--..--] + [287].[bits 72 to 95] ∈ UNINITIALIZED + [287].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [287].f5 ∈ [--..--] + [287].[bits 136 to 159] ∈ UNINITIALIZED + [288].f1 ∈ [--..--] + [288].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [288].f3 ∈ [--..--] + [288].[bits 72 to 95] ∈ UNINITIALIZED + [288].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [288].f5 ∈ [--..--] + [288].[bits 136 to 159] ∈ UNINITIALIZED + [289].f1 ∈ [--..--] + [289].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [289].f3 ∈ [--..--] + [289].[bits 72 to 95] ∈ UNINITIALIZED + [289].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [289].f5 ∈ [--..--] + [289].[bits 136 to 159] ∈ UNINITIALIZED + [290].f1 ∈ [--..--] + [290].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [290].f3 ∈ [--..--] + [290].[bits 72 to 95] ∈ UNINITIALIZED + [290].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [290].f5 ∈ [--..--] + [290].[bits 136 to 159] ∈ UNINITIALIZED + [291].f1 ∈ [--..--] + [291].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [291].f3 ∈ [--..--] + [291].[bits 72 to 95] ∈ UNINITIALIZED + [291].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [291].f5 ∈ [--..--] + [291].[bits 136 to 159] ∈ UNINITIALIZED + [292].f1 ∈ [--..--] + [292].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [292].f3 ∈ [--..--] + [292].[bits 72 to 95] ∈ UNINITIALIZED + [292].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [292].f5 ∈ [--..--] + [292].[bits 136 to 159] ∈ UNINITIALIZED + [293].f1 ∈ [--..--] + [293].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [293].f3 ∈ [--..--] + [293].[bits 72 to 95] ∈ UNINITIALIZED + [293].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [293].f5 ∈ [--..--] + [293].[bits 136 to 159] ∈ UNINITIALIZED + [294].f1 ∈ [--..--] + [294].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [294].f3 ∈ [--..--] + [294].[bits 72 to 95] ∈ UNINITIALIZED + [294].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [294].f5 ∈ [--..--] + [294].[bits 136 to 159] ∈ UNINITIALIZED + [295].f1 ∈ [--..--] + [295].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [295].f3 ∈ [--..--] + [295].[bits 72 to 95] ∈ UNINITIALIZED + [295].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [295].f5 ∈ [--..--] + [295].[bits 136 to 159] ∈ UNINITIALIZED + [296].f1 ∈ [--..--] + [296].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [296].f3 ∈ [--..--] + [296].[bits 72 to 95] ∈ UNINITIALIZED + [296].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [296].f5 ∈ [--..--] + [296].[bits 136 to 159] ∈ UNINITIALIZED + [297].f1 ∈ [--..--] + [297].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [297].f3 ∈ [--..--] + [297].[bits 72 to 95] ∈ UNINITIALIZED + [297].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [297].f5 ∈ [--..--] + [297].[bits 136 to 159] ∈ UNINITIALIZED + [298].f1 ∈ [--..--] + [298].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [298].f3 ∈ [--..--] + [298].[bits 72 to 95] ∈ UNINITIALIZED + [298].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [298].f5 ∈ [--..--] + [298].[bits 136 to 159] ∈ UNINITIALIZED + [299].f1 ∈ [--..--] + [299].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [299].f3 ∈ [--..--] + [299].[bits 72 to 95] ∈ UNINITIALIZED + [299].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [299].f5 ∈ [--..--] + [299].[bits 136 to 159] ∈ UNINITIALIZED + [300].f1 ∈ [--..--] + [300].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [300].f3 ∈ [--..--] + [300].[bits 72 to 95] ∈ UNINITIALIZED + [300].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [300].f5 ∈ [--..--] + [300].[bits 136 to 159] ∈ UNINITIALIZED + [301].f1 ∈ [--..--] + [301].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [301].f3 ∈ [--..--] + [301].[bits 72 to 95] ∈ UNINITIALIZED + [301].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [301].f5 ∈ [--..--] + [301].[bits 136 to 159] ∈ UNINITIALIZED + [302].f1 ∈ [--..--] + [302].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [302].f3 ∈ [--..--] + [302].[bits 72 to 95] ∈ UNINITIALIZED + [302].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [302].f5 ∈ [--..--] + [302].[bits 136 to 159] ∈ UNINITIALIZED + [303].f1 ∈ [--..--] + [303].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [303].f3 ∈ [--..--] + [303].[bits 72 to 95] ∈ UNINITIALIZED + [303].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [303].f5 ∈ [--..--] + [303].[bits 136 to 159] ∈ UNINITIALIZED + [304].f1 ∈ [--..--] + [304].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [304].f3 ∈ [--..--] + [304].[bits 72 to 95] ∈ UNINITIALIZED + [304].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [304].f5 ∈ [--..--] + [304].[bits 136 to 159] ∈ UNINITIALIZED + [305].f1 ∈ [--..--] + [305].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [305].f3 ∈ [--..--] + [305].[bits 72 to 95] ∈ UNINITIALIZED + [305].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [305].f5 ∈ [--..--] + [305].[bits 136 to 159] ∈ UNINITIALIZED + [306].f1 ∈ [--..--] + [306].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [306].f3 ∈ [--..--] + [306].[bits 72 to 95] ∈ UNINITIALIZED + [306].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [306].f5 ∈ [--..--] + [306].[bits 136 to 159] ∈ UNINITIALIZED + [307].f1 ∈ [--..--] + [307].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [307].f3 ∈ [--..--] + [307].[bits 72 to 95] ∈ UNINITIALIZED + [307].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [307].f5 ∈ [--..--] + [307].[bits 136 to 159] ∈ UNINITIALIZED + [308].f1 ∈ [--..--] + [308].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [308].f3 ∈ [--..--] + [308].[bits 72 to 95] ∈ UNINITIALIZED + [308].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [308].f5 ∈ [--..--] + [308].[bits 136 to 159] ∈ UNINITIALIZED + [309].f1 ∈ [--..--] + [309].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [309].f3 ∈ [--..--] + [309].[bits 72 to 95] ∈ UNINITIALIZED + [309].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [309].f5 ∈ [--..--] + [309].[bits 136 to 159] ∈ UNINITIALIZED + [310].f1 ∈ [--..--] + [310].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [310].f3 ∈ [--..--] + [310].[bits 72 to 95] ∈ UNINITIALIZED + [310].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [310].f5 ∈ [--..--] + [310].[bits 136 to 159] ∈ UNINITIALIZED + [311].f1 ∈ [--..--] + [311].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [311].f3 ∈ [--..--] + [311].[bits 72 to 95] ∈ UNINITIALIZED + [311].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [311].f5 ∈ [--..--] + [311].[bits 136 to 159] ∈ UNINITIALIZED + [312].f1 ∈ [--..--] + [312].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [312].f3 ∈ [--..--] + [312].[bits 72 to 95] ∈ UNINITIALIZED + [312].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [312].f5 ∈ [--..--] + [312].[bits 136 to 159] ∈ UNINITIALIZED + [313].f1 ∈ [--..--] + [313].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [313].f3 ∈ [--..--] + [313].[bits 72 to 95] ∈ UNINITIALIZED + [313].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [313].f5 ∈ [--..--] + [313].[bits 136 to 159] ∈ UNINITIALIZED + [314].f1 ∈ [--..--] + [314].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [314].f3 ∈ [--..--] + [314].[bits 72 to 95] ∈ UNINITIALIZED + [314].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [314].f5 ∈ [--..--] + [314].[bits 136 to 159] ∈ UNINITIALIZED + [315].f1 ∈ [--..--] + [315].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [315].f3 ∈ [--..--] + [315].[bits 72 to 95] ∈ UNINITIALIZED + [315].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [315].f5 ∈ [--..--] + [315].[bits 136 to 159] ∈ UNINITIALIZED + [316].f1 ∈ [--..--] + [316].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [316].f3 ∈ [--..--] + [316].[bits 72 to 95] ∈ UNINITIALIZED + [316].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [316].f5 ∈ [--..--] + [316].[bits 136 to 159] ∈ UNINITIALIZED + [317].f1 ∈ [--..--] + [317].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [317].f3 ∈ [--..--] + [317].[bits 72 to 95] ∈ UNINITIALIZED + [317].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [317].f5 ∈ [--..--] + [317].[bits 136 to 159] ∈ UNINITIALIZED + [318].f1 ∈ [--..--] + [318].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [318].f3 ∈ [--..--] + [318].[bits 72 to 95] ∈ UNINITIALIZED + [318].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [318].f5 ∈ [--..--] + [318].[bits 136 to 159] ∈ UNINITIALIZED + [319].f1 ∈ [--..--] + [319].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [319].f3 ∈ [--..--] + [319].[bits 72 to 95] ∈ UNINITIALIZED + [319].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [319].f5 ∈ [--..--] + [319].[bits 136 to 159] ∈ UNINITIALIZED + [320].f1 ∈ [--..--] + [320].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [320].f3 ∈ [--..--] + [320].[bits 72 to 95] ∈ UNINITIALIZED + [320].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [320].f5 ∈ [--..--] + [320].[bits 136 to 159] ∈ UNINITIALIZED + [321].f1 ∈ [--..--] + [321].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [321].f3 ∈ [--..--] + [321].[bits 72 to 95] ∈ UNINITIALIZED + [321].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [321].f5 ∈ [--..--] + [321].[bits 136 to 159] ∈ UNINITIALIZED + [322].f1 ∈ [--..--] + [322].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [322].f3 ∈ [--..--] + [322].[bits 72 to 95] ∈ UNINITIALIZED + [322].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [322].f5 ∈ [--..--] + [322].[bits 136 to 159] ∈ UNINITIALIZED + [323].f1 ∈ [--..--] + [323].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [323].f3 ∈ [--..--] + [323].[bits 72 to 95] ∈ UNINITIALIZED + [323].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [323].f5 ∈ [--..--] + [323].[bits 136 to 159] ∈ UNINITIALIZED + [324].f1 ∈ [--..--] + [324].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [324].f3 ∈ [--..--] + [324].[bits 72 to 95] ∈ UNINITIALIZED + [324].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [324].f5 ∈ [--..--] + [324].[bits 136 to 159] ∈ UNINITIALIZED + [325].f1 ∈ [--..--] + [325].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [325].f3 ∈ [--..--] + [325].[bits 72 to 95] ∈ UNINITIALIZED + [325].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [325].f5 ∈ [--..--] + [325].[bits 136 to 159] ∈ UNINITIALIZED + [326].f1 ∈ [--..--] + [326].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [326].f3 ∈ [--..--] + [326].[bits 72 to 95] ∈ UNINITIALIZED + [326].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [326].f5 ∈ [--..--] + [326].[bits 136 to 159] ∈ UNINITIALIZED + [327].f1 ∈ [--..--] + [327].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [327].f3 ∈ [--..--] + [327].[bits 72 to 95] ∈ UNINITIALIZED + [327].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [327].f5 ∈ [--..--] + [327].[bits 136 to 159] ∈ UNINITIALIZED + [328].f1 ∈ [--..--] + [328].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [328].f3 ∈ [--..--] + [328].[bits 72 to 95] ∈ UNINITIALIZED + [328].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [328].f5 ∈ [--..--] + [328].[bits 136 to 159] ∈ UNINITIALIZED + [329].f1 ∈ [--..--] + [329].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [329].f3 ∈ [--..--] + [329].[bits 72 to 95] ∈ UNINITIALIZED + [329].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [329].f5 ∈ [--..--] + [329].[bits 136 to 159] ∈ UNINITIALIZED + [330].f1 ∈ [--..--] + [330].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [330].f3 ∈ [--..--] + [330].[bits 72 to 95] ∈ UNINITIALIZED + [330].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [330].f5 ∈ [--..--] + [330].[bits 136 to 159] ∈ UNINITIALIZED + [331].f1 ∈ [--..--] + [331].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [331].f3 ∈ [--..--] + [331].[bits 72 to 95] ∈ UNINITIALIZED + [331].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [331].f5 ∈ [--..--] + [331].[bits 136 to 159] ∈ UNINITIALIZED + [332].f1 ∈ [--..--] + [332].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [332].f3 ∈ [--..--] + [332].[bits 72 to 95] ∈ UNINITIALIZED + [332].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [332].f5 ∈ [--..--] + [332].[bits 136 to 159] ∈ UNINITIALIZED + [333].f1 ∈ [--..--] + [333].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [333].f3 ∈ [--..--] + [333].[bits 72 to 95] ∈ UNINITIALIZED + [333].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [333].f5 ∈ [--..--] + [333].[bits 136 to 159] ∈ UNINITIALIZED + [334].f1 ∈ [--..--] + [334].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [334].f3 ∈ [--..--] + [334].[bits 72 to 95] ∈ UNINITIALIZED + [334].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [334].f5 ∈ [--..--] + [334].[bits 136 to 159] ∈ UNINITIALIZED + [335].f1 ∈ [--..--] + [335].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [335].f3 ∈ [--..--] + [335].[bits 72 to 95] ∈ UNINITIALIZED + [335].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [335].f5 ∈ [--..--] + [335].[bits 136 to 159] ∈ UNINITIALIZED + [336].f1 ∈ [--..--] + [336].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [336].f3 ∈ [--..--] + [336].[bits 72 to 95] ∈ UNINITIALIZED + [336].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [336].f5 ∈ [--..--] + [336].[bits 136 to 159] ∈ UNINITIALIZED + [337].f1 ∈ [--..--] + [337].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [337].f3 ∈ [--..--] + [337].[bits 72 to 95] ∈ UNINITIALIZED + [337].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [337].f5 ∈ [--..--] + [337].[bits 136 to 159] ∈ UNINITIALIZED + [338].f1 ∈ [--..--] + [338].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [338].f3 ∈ [--..--] + [338].[bits 72 to 95] ∈ UNINITIALIZED + [338].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [338].f5 ∈ [--..--] + [338].[bits 136 to 159] ∈ UNINITIALIZED + [339].f1 ∈ [--..--] + [339].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [339].f3 ∈ [--..--] + [339].[bits 72 to 95] ∈ UNINITIALIZED + [339].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [339].f5 ∈ [--..--] + [339].[bits 136 to 159] ∈ UNINITIALIZED + [340].f1 ∈ [--..--] + [340].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [340].f3 ∈ [--..--] + [340].[bits 72 to 95] ∈ UNINITIALIZED + [340].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [340].f5 ∈ [--..--] + [340].[bits 136 to 159] ∈ UNINITIALIZED + [341].f1 ∈ [--..--] + [341].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [341].f3 ∈ [--..--] + [341].[bits 72 to 95] ∈ UNINITIALIZED + [341].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [341].f5 ∈ [--..--] + [341].[bits 136 to 159] ∈ UNINITIALIZED + [342].f1 ∈ [--..--] + [342].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [342].f3 ∈ [--..--] + [342].[bits 72 to 95] ∈ UNINITIALIZED + [342].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [342].f5 ∈ [--..--] + [342].[bits 136 to 159] ∈ UNINITIALIZED + [343].f1 ∈ [--..--] + [343].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [343].f3 ∈ [--..--] + [343].[bits 72 to 95] ∈ UNINITIALIZED + [343].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [343].f5 ∈ [--..--] + [343].[bits 136 to 159] ∈ UNINITIALIZED + [344].f1 ∈ [--..--] + [344].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [344].f3 ∈ [--..--] + [344].[bits 72 to 95] ∈ UNINITIALIZED + [344].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [344].f5 ∈ [--..--] + [344].[bits 136 to 159] ∈ UNINITIALIZED + [345].f1 ∈ [--..--] + [345].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [345].f3 ∈ [--..--] + [345].[bits 72 to 95] ∈ UNINITIALIZED + [345].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [345].f5 ∈ [--..--] + [345].[bits 136 to 159] ∈ UNINITIALIZED + [346].f1 ∈ [--..--] + [346].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [346].f3 ∈ [--..--] + [346].[bits 72 to 95] ∈ UNINITIALIZED + [346].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [346].f5 ∈ [--..--] + [346].[bits 136 to 159] ∈ UNINITIALIZED + [347].f1 ∈ [--..--] + [347].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [347].f3 ∈ [--..--] + [347].[bits 72 to 95] ∈ UNINITIALIZED + [347].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [347].f5 ∈ [--..--] + [347].[bits 136 to 159] ∈ UNINITIALIZED + [348].f1 ∈ [--..--] + [348].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [348].f3 ∈ [--..--] + [348].[bits 72 to 95] ∈ UNINITIALIZED + [348].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [348].f5 ∈ [--..--] + [348].[bits 136 to 159] ∈ UNINITIALIZED + [349].f1 ∈ [--..--] + [349].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [349].f3 ∈ [--..--] + [349].[bits 72 to 95] ∈ UNINITIALIZED + [349].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [349].f5 ∈ [--..--] + [349].[bits 136 to 159] ∈ UNINITIALIZED + [350].f1 ∈ [--..--] + [350].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [350].f3 ∈ [--..--] + [350].[bits 72 to 95] ∈ UNINITIALIZED + [350].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [350].f5 ∈ [--..--] + [350].[bits 136 to 159] ∈ UNINITIALIZED + [351].f1 ∈ [--..--] + [351].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [351].f3 ∈ [--..--] + [351].[bits 72 to 95] ∈ UNINITIALIZED + [351].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [351].f5 ∈ [--..--] + [351].[bits 136 to 159] ∈ UNINITIALIZED + [352].f1 ∈ [--..--] + [352].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [352].f3 ∈ [--..--] + [352].[bits 72 to 95] ∈ UNINITIALIZED + [352].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [352].f5 ∈ [--..--] + [352].[bits 136 to 159] ∈ UNINITIALIZED + [353].f1 ∈ [--..--] + [353].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [353].f3 ∈ [--..--] + [353].[bits 72 to 95] ∈ UNINITIALIZED + [353].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [353].f5 ∈ [--..--] + [353].[bits 136 to 159] ∈ UNINITIALIZED + [354].f1 ∈ [--..--] + [354].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [354].f3 ∈ [--..--] + [354].[bits 72 to 95] ∈ UNINITIALIZED + [354].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [354].f5 ∈ [--..--] + [354].[bits 136 to 159] ∈ UNINITIALIZED + [355].f1 ∈ [--..--] + [355].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [355].f3 ∈ [--..--] + [355].[bits 72 to 95] ∈ UNINITIALIZED + [355].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [355].f5 ∈ [--..--] + [355].[bits 136 to 159] ∈ UNINITIALIZED + [356].f1 ∈ [--..--] + [356].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [356].f3 ∈ [--..--] + [356].[bits 72 to 95] ∈ UNINITIALIZED + [356].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [356].f5 ∈ [--..--] + [356].[bits 136 to 159] ∈ UNINITIALIZED + [357].f1 ∈ [--..--] + [357].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [357].f3 ∈ [--..--] + [357].[bits 72 to 95] ∈ UNINITIALIZED + [357].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [357].f5 ∈ [--..--] + [357].[bits 136 to 159] ∈ UNINITIALIZED + [358].f1 ∈ [--..--] + [358].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [358].f3 ∈ [--..--] + [358].[bits 72 to 95] ∈ UNINITIALIZED + [358].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [358].f5 ∈ [--..--] + [358].[bits 136 to 159] ∈ UNINITIALIZED + [359].f1 ∈ [--..--] + [359].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [359].f3 ∈ [--..--] + [359].[bits 72 to 95] ∈ UNINITIALIZED + [359].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [359].f5 ∈ [--..--] + [359].[bits 136 to 159] ∈ UNINITIALIZED + [360].f1 ∈ [--..--] + [360].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [360].f3 ∈ [--..--] + [360].[bits 72 to 95] ∈ UNINITIALIZED + [360].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [360].f5 ∈ [--..--] + [360].[bits 136 to 159] ∈ UNINITIALIZED + [361].f1 ∈ [--..--] + [361].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [361].f3 ∈ [--..--] + [361].[bits 72 to 95] ∈ UNINITIALIZED + [361].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [361].f5 ∈ [--..--] + [361].[bits 136 to 159] ∈ UNINITIALIZED + [362].f1 ∈ [--..--] + [362].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [362].f3 ∈ [--..--] + [362].[bits 72 to 95] ∈ UNINITIALIZED + [362].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [362].f5 ∈ [--..--] + [362].[bits 136 to 159] ∈ UNINITIALIZED + [363].f1 ∈ [--..--] + [363].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [363].f3 ∈ [--..--] + [363].[bits 72 to 95] ∈ UNINITIALIZED + [363].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [363].f5 ∈ [--..--] + [363].[bits 136 to 159] ∈ UNINITIALIZED + [364].f1 ∈ [--..--] + [364].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [364].f3 ∈ [--..--] + [364].[bits 72 to 95] ∈ UNINITIALIZED + [364].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [364].f5 ∈ [--..--] + [364].[bits 136 to 159] ∈ UNINITIALIZED + [365].f1 ∈ [--..--] + [365].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [365].f3 ∈ [--..--] + [365].[bits 72 to 95] ∈ UNINITIALIZED + [365].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [365].f5 ∈ [--..--] + [365].[bits 136 to 159] ∈ UNINITIALIZED + [366].f1 ∈ [--..--] + [366].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [366].f3 ∈ [--..--] + [366].[bits 72 to 95] ∈ UNINITIALIZED + [366].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [366].f5 ∈ [--..--] + [366].[bits 136 to 159] ∈ UNINITIALIZED + [367].f1 ∈ [--..--] + [367].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [367].f3 ∈ [--..--] + [367].[bits 72 to 95] ∈ UNINITIALIZED + [367].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [367].f5 ∈ [--..--] + [367].[bits 136 to 159] ∈ UNINITIALIZED + [368].f1 ∈ [--..--] + [368].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [368].f3 ∈ [--..--] + [368].[bits 72 to 95] ∈ UNINITIALIZED + [368].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [368].f5 ∈ [--..--] + [368].[bits 136 to 159] ∈ UNINITIALIZED + [369].f1 ∈ [--..--] + [369].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [369].f3 ∈ [--..--] + [369].[bits 72 to 95] ∈ UNINITIALIZED + [369].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [369].f5 ∈ [--..--] + [369].[bits 136 to 159] ∈ UNINITIALIZED + [370].f1 ∈ [--..--] + [370].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [370].f3 ∈ [--..--] + [370].[bits 72 to 95] ∈ UNINITIALIZED + [370].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [370].f5 ∈ [--..--] + [370].[bits 136 to 159] ∈ UNINITIALIZED + [371].f1 ∈ [--..--] + [371].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [371].f3 ∈ [--..--] + [371].[bits 72 to 95] ∈ UNINITIALIZED + [371].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [371].f5 ∈ [--..--] + [371].[bits 136 to 159] ∈ UNINITIALIZED + [372].f1 ∈ [--..--] + [372].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [372].f3 ∈ [--..--] + [372].[bits 72 to 95] ∈ UNINITIALIZED + [372].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [372].f5 ∈ [--..--] + [372].[bits 136 to 159] ∈ UNINITIALIZED + [373].f1 ∈ [--..--] + [373].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [373].f3 ∈ [--..--] + [373].[bits 72 to 95] ∈ UNINITIALIZED + [373].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [373].f5 ∈ [--..--] + [373].[bits 136 to 159] ∈ UNINITIALIZED + [374].f1 ∈ [--..--] + [374].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [374].f3 ∈ [--..--] + [374].[bits 72 to 95] ∈ UNINITIALIZED + [374].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [374].f5 ∈ [--..--] + [374].[bits 136 to 159] ∈ UNINITIALIZED + [375].f1 ∈ [--..--] + [375].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [375].f3 ∈ [--..--] + [375].[bits 72 to 95] ∈ UNINITIALIZED + [375].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [375].f5 ∈ [--..--] + [375].[bits 136 to 159] ∈ UNINITIALIZED + [376].f1 ∈ [--..--] + [376].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [376].f3 ∈ [--..--] + [376].[bits 72 to 95] ∈ UNINITIALIZED + [376].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [376].f5 ∈ [--..--] + [376].[bits 136 to 159] ∈ UNINITIALIZED + [377].f1 ∈ [--..--] + [377].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [377].f3 ∈ [--..--] + [377].[bits 72 to 95] ∈ UNINITIALIZED + [377].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [377].f5 ∈ [--..--] + [377].[bits 136 to 159] ∈ UNINITIALIZED + [378].f1 ∈ [--..--] + [378].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [378].f3 ∈ [--..--] + [378].[bits 72 to 95] ∈ UNINITIALIZED + [378].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [378].f5 ∈ [--..--] + [378].[bits 136 to 159] ∈ UNINITIALIZED + [379].f1 ∈ [--..--] + [379].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [379].f3 ∈ [--..--] + [379].[bits 72 to 95] ∈ UNINITIALIZED + [379].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [379].f5 ∈ [--..--] + [379].[bits 136 to 159] ∈ UNINITIALIZED + [380].f1 ∈ [--..--] + [380].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [380].f3 ∈ [--..--] + [380].[bits 72 to 95] ∈ UNINITIALIZED + [380].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [380].f5 ∈ [--..--] + [380].[bits 136 to 159] ∈ UNINITIALIZED + [381].f1 ∈ [--..--] + [381].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [381].f3 ∈ [--..--] + [381].[bits 72 to 95] ∈ UNINITIALIZED + [381].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [381].f5 ∈ [--..--] + [381].[bits 136 to 159] ∈ UNINITIALIZED + [382].f1 ∈ [--..--] + [382].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [382].f3 ∈ [--..--] + [382].[bits 72 to 95] ∈ UNINITIALIZED + [382].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [382].f5 ∈ [--..--] + [382].[bits 136 to 159] ∈ UNINITIALIZED + [383].f1 ∈ [--..--] + [383].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [383].f3 ∈ [--..--] + [383].[bits 72 to 95] ∈ UNINITIALIZED + [383].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [383].f5 ∈ [--..--] + [383].[bits 136 to 159] ∈ UNINITIALIZED + [384].f1 ∈ [--..--] + [384].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [384].f3 ∈ [--..--] + [384].[bits 72 to 95] ∈ UNINITIALIZED + [384].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [384].f5 ∈ [--..--] + [384].[bits 136 to 159] ∈ UNINITIALIZED + [385].f1 ∈ [--..--] + [385].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [385].f3 ∈ [--..--] + [385].[bits 72 to 95] ∈ UNINITIALIZED + [385].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [385].f5 ∈ [--..--] + [385].[bits 136 to 159] ∈ UNINITIALIZED + [386].f1 ∈ [--..--] + [386].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [386].f3 ∈ [--..--] + [386].[bits 72 to 95] ∈ UNINITIALIZED + [386].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [386].f5 ∈ [--..--] + [386].[bits 136 to 159] ∈ UNINITIALIZED + [387].f1 ∈ [--..--] + [387].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [387].f3 ∈ [--..--] + [387].[bits 72 to 95] ∈ UNINITIALIZED + [387].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [387].f5 ∈ [--..--] + [387].[bits 136 to 159] ∈ UNINITIALIZED + [388].f1 ∈ [--..--] + [388].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [388].f3 ∈ [--..--] + [388].[bits 72 to 95] ∈ UNINITIALIZED + [388].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [388].f5 ∈ [--..--] + [388].[bits 136 to 159] ∈ UNINITIALIZED + [389].f1 ∈ [--..--] + [389].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [389].f3 ∈ [--..--] + [389].[bits 72 to 95] ∈ UNINITIALIZED + [389].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [389].f5 ∈ [--..--] + [389].[bits 136 to 159] ∈ UNINITIALIZED + [390].f1 ∈ [--..--] + [390].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [390].f3 ∈ [--..--] + [390].[bits 72 to 95] ∈ UNINITIALIZED + [390].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [390].f5 ∈ [--..--] + [390].[bits 136 to 159] ∈ UNINITIALIZED + [391].f1 ∈ [--..--] + [391].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [391].f3 ∈ [--..--] + [391].[bits 72 to 95] ∈ UNINITIALIZED + [391].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [391].f5 ∈ [--..--] + [391].[bits 136 to 159] ∈ UNINITIALIZED + [392].f1 ∈ [--..--] + [392].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [392].f3 ∈ [--..--] + [392].[bits 72 to 95] ∈ UNINITIALIZED + [392].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [392].f5 ∈ [--..--] + [392].[bits 136 to 159] ∈ UNINITIALIZED + [393].f1 ∈ [--..--] + [393].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [393].f3 ∈ [--..--] + [393].[bits 72 to 95] ∈ UNINITIALIZED + [393].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [393].f5 ∈ [--..--] + [393].[bits 136 to 159] ∈ UNINITIALIZED + [394].f1 ∈ [--..--] + [394].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [394].f3 ∈ [--..--] + [394].[bits 72 to 95] ∈ UNINITIALIZED + [394].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [394].f5 ∈ [--..--] + [394].[bits 136 to 159] ∈ UNINITIALIZED + [395].f1 ∈ [--..--] + [395].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [395].f3 ∈ [--..--] + [395].[bits 72 to 95] ∈ UNINITIALIZED + [395].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [395].f5 ∈ [--..--] + [395].[bits 136 to 159] ∈ UNINITIALIZED + [396].f1 ∈ [--..--] + [396].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [396].f3 ∈ [--..--] + [396].[bits 72 to 95] ∈ UNINITIALIZED + [396].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [396].f5 ∈ [--..--] + [396].[bits 136 to 159] ∈ UNINITIALIZED + [397].f1 ∈ [--..--] + [397].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [397].f3 ∈ [--..--] + [397].[bits 72 to 95] ∈ UNINITIALIZED + [397].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [397].f5 ∈ [--..--] + [397].[bits 136 to 159] ∈ UNINITIALIZED + [398].f1 ∈ [--..--] + [398].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [398].f3 ∈ [--..--] + [398].[bits 72 to 95] ∈ UNINITIALIZED + [398].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [398].f5 ∈ [--..--] + [398].[bits 136 to 159] ∈ UNINITIALIZED + [399].f1 ∈ [--..--] + [399].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [399].f3 ∈ [--..--] + [399].[bits 72 to 95] ∈ UNINITIALIZED + [399].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [399].f5 ∈ [--..--] + [399].[bits 136 to 159] ∈ UNINITIALIZED + [400].f1 ∈ [--..--] + [400].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [400].f3 ∈ [--..--] + [400].[bits 72 to 95] ∈ UNINITIALIZED + [400].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [400].f5 ∈ [--..--] + [400].[bits 136 to 159] ∈ UNINITIALIZED + [401].f1 ∈ [--..--] + [401].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [401].f3 ∈ [--..--] + [401].[bits 72 to 95] ∈ UNINITIALIZED + [401].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [401].f5 ∈ [--..--] + [401].[bits 136 to 159] ∈ UNINITIALIZED + [402].f1 ∈ [--..--] + [402].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [402].f3 ∈ [--..--] + [402].[bits 72 to 95] ∈ UNINITIALIZED + [402].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [402].f5 ∈ [--..--] + [402].[bits 136 to 159] ∈ UNINITIALIZED + [403].f1 ∈ [--..--] + [403].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [403].f3 ∈ [--..--] + [403].[bits 72 to 95] ∈ UNINITIALIZED + [403].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [403].f5 ∈ [--..--] + [403].[bits 136 to 159] ∈ UNINITIALIZED + [404].f1 ∈ [--..--] + [404].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [404].f3 ∈ [--..--] + [404].[bits 72 to 95] ∈ UNINITIALIZED + [404].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [404].f5 ∈ [--..--] + [404].[bits 136 to 159] ∈ UNINITIALIZED + [405].f1 ∈ [--..--] + [405].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [405].f3 ∈ [--..--] + [405].[bits 72 to 95] ∈ UNINITIALIZED + [405].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [405].f5 ∈ [--..--] + [405].[bits 136 to 159] ∈ UNINITIALIZED + [406].f1 ∈ [--..--] + [406].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [406].f3 ∈ [--..--] + [406].[bits 72 to 95] ∈ UNINITIALIZED + [406].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [406].f5 ∈ [--..--] + [406].[bits 136 to 159] ∈ UNINITIALIZED + [407].f1 ∈ [--..--] + [407].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [407].f3 ∈ [--..--] + [407].[bits 72 to 95] ∈ UNINITIALIZED + [407].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [407].f5 ∈ [--..--] + [407].[bits 136 to 159] ∈ UNINITIALIZED + [408].f1 ∈ [--..--] + [408].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [408].f3 ∈ [--..--] + [408].[bits 72 to 95] ∈ UNINITIALIZED + [408].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [408].f5 ∈ [--..--] + [408].[bits 136 to 159] ∈ UNINITIALIZED + [409].f1 ∈ [--..--] + [409].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [409].f3 ∈ [--..--] + [409].[bits 72 to 95] ∈ UNINITIALIZED + [409].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [409].f5 ∈ [--..--] + [409].[bits 136 to 159] ∈ UNINITIALIZED + [410].f1 ∈ [--..--] + [410].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [410].f3 ∈ [--..--] + [410].[bits 72 to 95] ∈ UNINITIALIZED + [410].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [410].f5 ∈ [--..--] + [410].[bits 136 to 159] ∈ UNINITIALIZED + [411].f1 ∈ [--..--] + [411].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [411].f3 ∈ [--..--] + [411].[bits 72 to 95] ∈ UNINITIALIZED + [411].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [411].f5 ∈ [--..--] + [411].[bits 136 to 159] ∈ UNINITIALIZED + [412].f1 ∈ [--..--] + [412].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [412].f3 ∈ [--..--] + [412].[bits 72 to 95] ∈ UNINITIALIZED + [412].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [412].f5 ∈ [--..--] + [412].[bits 136 to 159] ∈ UNINITIALIZED + [413].f1 ∈ [--..--] + [413].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [413].f3 ∈ [--..--] + [413].[bits 72 to 95] ∈ UNINITIALIZED + [413].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [413].f5 ∈ [--..--] + [413].[bits 136 to 159] ∈ UNINITIALIZED + [414].f1 ∈ [--..--] + [414].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [414].f3 ∈ [--..--] + [414].[bits 72 to 95] ∈ UNINITIALIZED + [414].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [414].f5 ∈ [--..--] + [414].[bits 136 to 159] ∈ UNINITIALIZED + [415].f1 ∈ [--..--] + [415].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [415].f3 ∈ [--..--] + [415].[bits 72 to 95] ∈ UNINITIALIZED + [415].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [415].f5 ∈ [--..--] + [415].[bits 136 to 159] ∈ UNINITIALIZED + [416].f1 ∈ [--..--] + [416].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [416].f3 ∈ [--..--] + [416].[bits 72 to 95] ∈ UNINITIALIZED + [416].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [416].f5 ∈ [--..--] + [416].[bits 136 to 159] ∈ UNINITIALIZED + [417].f1 ∈ [--..--] + [417].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [417].f3 ∈ [--..--] + [417].[bits 72 to 95] ∈ UNINITIALIZED + [417].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [417].f5 ∈ [--..--] + [417].[bits 136 to 159] ∈ UNINITIALIZED + [418].f1 ∈ [--..--] + [418].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [418].f3 ∈ [--..--] + [418].[bits 72 to 95] ∈ UNINITIALIZED + [418].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [418].f5 ∈ [--..--] + [418].[bits 136 to 159] ∈ UNINITIALIZED + [419].f1 ∈ [--..--] + [419].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [419].f3 ∈ [--..--] + [419].[bits 72 to 95] ∈ UNINITIALIZED + [419].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [419].f5 ∈ [--..--] + [419].[bits 136 to 159] ∈ UNINITIALIZED + [420].f1 ∈ [--..--] + [420].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [420].f3 ∈ [--..--] + [420].[bits 72 to 95] ∈ UNINITIALIZED + [420].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [420].f5 ∈ [--..--] + [420].[bits 136 to 159] ∈ UNINITIALIZED + [421].f1 ∈ [--..--] + [421].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [421].f3 ∈ [--..--] + [421].[bits 72 to 95] ∈ UNINITIALIZED + [421].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [421].f5 ∈ [--..--] + [421].[bits 136 to 159] ∈ UNINITIALIZED + [422].f1 ∈ [--..--] + [422].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [422].f3 ∈ [--..--] + [422].[bits 72 to 95] ∈ UNINITIALIZED + [422].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [422].f5 ∈ [--..--] + [422].[bits 136 to 159] ∈ UNINITIALIZED + [423].f1 ∈ [--..--] + [423].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [423].f3 ∈ [--..--] + [423].[bits 72 to 95] ∈ UNINITIALIZED + [423].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [423].f5 ∈ [--..--] + [423].[bits 136 to 159] ∈ UNINITIALIZED + [424].f1 ∈ [--..--] + [424].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [424].f3 ∈ [--..--] + [424].[bits 72 to 95] ∈ UNINITIALIZED + [424].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [424].f5 ∈ [--..--] + [424].[bits 136 to 159] ∈ UNINITIALIZED + [425].f1 ∈ [--..--] + [425].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [425].f3 ∈ [--..--] + [425].[bits 72 to 95] ∈ UNINITIALIZED + [425].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [425].f5 ∈ [--..--] + [425].[bits 136 to 159] ∈ UNINITIALIZED + [426].f1 ∈ [--..--] + [426].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [426].f3 ∈ [--..--] + [426].[bits 72 to 95] ∈ UNINITIALIZED + [426].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [426].f5 ∈ [--..--] + [426].[bits 136 to 159] ∈ UNINITIALIZED + [427].f1 ∈ [--..--] + [427].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [427].f3 ∈ [--..--] + [427].[bits 72 to 95] ∈ UNINITIALIZED + [427].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [427].f5 ∈ [--..--] + [427].[bits 136 to 159] ∈ UNINITIALIZED + [428].f1 ∈ [--..--] + [428].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [428].f3 ∈ [--..--] + [428].[bits 72 to 95] ∈ UNINITIALIZED + [428].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [428].f5 ∈ [--..--] + [428].[bits 136 to 159] ∈ UNINITIALIZED + [429].f1 ∈ [--..--] + [429].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [429].f3 ∈ [--..--] + [429].[bits 72 to 95] ∈ UNINITIALIZED + [429].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [429].f5 ∈ [--..--] + [429].[bits 136 to 159] ∈ UNINITIALIZED + [430].f1 ∈ [--..--] + [430].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [430].f3 ∈ [--..--] + [430].[bits 72 to 95] ∈ UNINITIALIZED + [430].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [430].f5 ∈ [--..--] + [430].[bits 136 to 159] ∈ UNINITIALIZED + [431].f1 ∈ [--..--] + [431].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [431].f3 ∈ [--..--] + [431].[bits 72 to 95] ∈ UNINITIALIZED + [431].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [431].f5 ∈ [--..--] + [431].[bits 136 to 159] ∈ UNINITIALIZED + [432].f1 ∈ [--..--] + [432].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [432].f3 ∈ [--..--] + [432].[bits 72 to 95] ∈ UNINITIALIZED + [432].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [432].f5 ∈ [--..--] + [432].[bits 136 to 159] ∈ UNINITIALIZED + [433].f1 ∈ [--..--] + [433].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [433].f3 ∈ [--..--] + [433].[bits 72 to 95] ∈ UNINITIALIZED + [433].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [433].f5 ∈ [--..--] + [433].[bits 136 to 159] ∈ UNINITIALIZED + [434].f1 ∈ [--..--] + [434].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [434].f3 ∈ [--..--] + [434].[bits 72 to 95] ∈ UNINITIALIZED + [434].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [434].f5 ∈ [--..--] + [434].[bits 136 to 159] ∈ UNINITIALIZED + [435].f1 ∈ [--..--] + [435].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [435].f3 ∈ [--..--] + [435].[bits 72 to 95] ∈ UNINITIALIZED + [435].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [435].f5 ∈ [--..--] + [435].[bits 136 to 159] ∈ UNINITIALIZED + [436].f1 ∈ [--..--] + [436].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [436].f3 ∈ [--..--] + [436].[bits 72 to 95] ∈ UNINITIALIZED + [436].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [436].f5 ∈ [--..--] + [436].[bits 136 to 159] ∈ UNINITIALIZED + [437].f1 ∈ [--..--] + [437].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [437].f3 ∈ [--..--] + [437].[bits 72 to 95] ∈ UNINITIALIZED + [437].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [437].f5 ∈ [--..--] + [437].[bits 136 to 159] ∈ UNINITIALIZED + [438].f1 ∈ [--..--] + [438].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [438].f3 ∈ [--..--] + [438].[bits 72 to 95] ∈ UNINITIALIZED + [438].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [438].f5 ∈ [--..--] + [438].[bits 136 to 159] ∈ UNINITIALIZED + [439].f1 ∈ [--..--] + [439].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [439].f3 ∈ [--..--] + [439].[bits 72 to 95] ∈ UNINITIALIZED + [439].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [439].f5 ∈ [--..--] + [439].[bits 136 to 159] ∈ UNINITIALIZED + [440].f1 ∈ [--..--] + [440].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [440].f3 ∈ [--..--] + [440].[bits 72 to 95] ∈ UNINITIALIZED + [440].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [440].f5 ∈ [--..--] + [440].[bits 136 to 159] ∈ UNINITIALIZED + [441].f1 ∈ [--..--] + [441].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [441].f3 ∈ [--..--] + [441].[bits 72 to 95] ∈ UNINITIALIZED + [441].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [441].f5 ∈ [--..--] + [441].[bits 136 to 159] ∈ UNINITIALIZED + [442].f1 ∈ [--..--] + [442].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [442].f3 ∈ [--..--] + [442].[bits 72 to 95] ∈ UNINITIALIZED + [442].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [442].f5 ∈ [--..--] + [442].[bits 136 to 159] ∈ UNINITIALIZED + [443].f1 ∈ [--..--] + [443].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [443].f3 ∈ [--..--] + [443].[bits 72 to 95] ∈ UNINITIALIZED + [443].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [443].f5 ∈ [--..--] + [443].[bits 136 to 159] ∈ UNINITIALIZED + [444].f1 ∈ [--..--] + [444].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [444].f3 ∈ [--..--] + [444].[bits 72 to 95] ∈ UNINITIALIZED + [444].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [444].f5 ∈ [--..--] + [444].[bits 136 to 159] ∈ UNINITIALIZED + [445].f1 ∈ [--..--] + [445].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [445].f3 ∈ [--..--] + [445].[bits 72 to 95] ∈ UNINITIALIZED + [445].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [445].f5 ∈ [--..--] + [445].[bits 136 to 159] ∈ UNINITIALIZED + [446].f1 ∈ [--..--] + [446].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [446].f3 ∈ [--..--] + [446].[bits 72 to 95] ∈ UNINITIALIZED + [446].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [446].f5 ∈ [--..--] + [446].[bits 136 to 159] ∈ UNINITIALIZED + [447].f1 ∈ [--..--] + [447].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [447].f3 ∈ [--..--] + [447].[bits 72 to 95] ∈ UNINITIALIZED + [447].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [447].f5 ∈ [--..--] + [447].[bits 136 to 159] ∈ UNINITIALIZED + [448].f1 ∈ [--..--] + [448].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [448].f3 ∈ [--..--] + [448].[bits 72 to 95] ∈ UNINITIALIZED + [448].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [448].f5 ∈ [--..--] + [448].[bits 136 to 159] ∈ UNINITIALIZED + [449].f1 ∈ [--..--] + [449].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [449].f3 ∈ [--..--] + [449].[bits 72 to 95] ∈ UNINITIALIZED + [449].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [449].f5 ∈ [--..--] + [449].[bits 136 to 159] ∈ UNINITIALIZED + [450].f1 ∈ [--..--] + [450].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [450].f3 ∈ [--..--] + [450].[bits 72 to 95] ∈ UNINITIALIZED + [450].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [450].f5 ∈ [--..--] + [450].[bits 136 to 159] ∈ UNINITIALIZED + [451].f1 ∈ [--..--] + [451].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [451].f3 ∈ [--..--] + [451].[bits 72 to 95] ∈ UNINITIALIZED + [451].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [451].f5 ∈ [--..--] + [451].[bits 136 to 159] ∈ UNINITIALIZED + [452].f1 ∈ [--..--] + [452].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [452].f3 ∈ [--..--] + [452].[bits 72 to 95] ∈ UNINITIALIZED + [452].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [452].f5 ∈ [--..--] + [452].[bits 136 to 159] ∈ UNINITIALIZED + [453].f1 ∈ [--..--] + [453].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [453].f3 ∈ [--..--] + [453].[bits 72 to 95] ∈ UNINITIALIZED + [453].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [453].f5 ∈ [--..--] + [453].[bits 136 to 159] ∈ UNINITIALIZED + [454].f1 ∈ [--..--] + [454].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [454].f3 ∈ [--..--] + [454].[bits 72 to 95] ∈ UNINITIALIZED + [454].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [454].f5 ∈ [--..--] + [454].[bits 136 to 159] ∈ UNINITIALIZED + [455].f1 ∈ [--..--] + [455].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [455].f3 ∈ [--..--] + [455].[bits 72 to 95] ∈ UNINITIALIZED + [455].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [455].f5 ∈ [--..--] + [455].[bits 136 to 159] ∈ UNINITIALIZED + [456].f1 ∈ [--..--] + [456].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [456].f3 ∈ [--..--] + [456].[bits 72 to 95] ∈ UNINITIALIZED + [456].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [456].f5 ∈ [--..--] + [456].[bits 136 to 159] ∈ UNINITIALIZED + [457].f1 ∈ [--..--] + [457].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [457].f3 ∈ [--..--] + [457].[bits 72 to 95] ∈ UNINITIALIZED + [457].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [457].f5 ∈ [--..--] + [457].[bits 136 to 159] ∈ UNINITIALIZED + [458].f1 ∈ [--..--] + [458].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [458].f3 ∈ [--..--] + [458].[bits 72 to 95] ∈ UNINITIALIZED + [458].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [458].f5 ∈ [--..--] + [458].[bits 136 to 159] ∈ UNINITIALIZED + [459].f1 ∈ [--..--] + [459].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [459].f3 ∈ [--..--] + [459].[bits 72 to 95] ∈ UNINITIALIZED + [459].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [459].f5 ∈ [--..--] + [459].[bits 136 to 159] ∈ UNINITIALIZED + [460].f1 ∈ [--..--] + [460].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [460].f3 ∈ [--..--] + [460].[bits 72 to 95] ∈ UNINITIALIZED + [460].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [460].f5 ∈ [--..--] + [460].[bits 136 to 159] ∈ UNINITIALIZED + [461].f1 ∈ [--..--] + [461].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [461].f3 ∈ [--..--] + [461].[bits 72 to 95] ∈ UNINITIALIZED + [461].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [461].f5 ∈ [--..--] + [461].[bits 136 to 159] ∈ UNINITIALIZED + [462].f1 ∈ [--..--] + [462].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [462].f3 ∈ [--..--] + [462].[bits 72 to 95] ∈ UNINITIALIZED + [462].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [462].f5 ∈ [--..--] + [462].[bits 136 to 159] ∈ UNINITIALIZED + [463].f1 ∈ [--..--] + [463].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [463].f3 ∈ [--..--] + [463].[bits 72 to 95] ∈ UNINITIALIZED + [463].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [463].f5 ∈ [--..--] + [463].[bits 136 to 159] ∈ UNINITIALIZED + [464].f1 ∈ [--..--] + [464].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [464].f3 ∈ [--..--] + [464].[bits 72 to 95] ∈ UNINITIALIZED + [464].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [464].f5 ∈ [--..--] + [464].[bits 136 to 159] ∈ UNINITIALIZED + [465].f1 ∈ [--..--] + [465].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [465].f3 ∈ [--..--] + [465].[bits 72 to 95] ∈ UNINITIALIZED + [465].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [465].f5 ∈ [--..--] + [465].[bits 136 to 159] ∈ UNINITIALIZED + [466].f1 ∈ [--..--] + [466].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [466].f3 ∈ [--..--] + [466].[bits 72 to 95] ∈ UNINITIALIZED + [466].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [466].f5 ∈ [--..--] + [466].[bits 136 to 159] ∈ UNINITIALIZED + [467].f1 ∈ [--..--] + [467].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [467].f3 ∈ [--..--] + [467].[bits 72 to 95] ∈ UNINITIALIZED + [467].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [467].f5 ∈ [--..--] + [467].[bits 136 to 159] ∈ UNINITIALIZED + [468].f1 ∈ [--..--] + [468].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [468].f3 ∈ [--..--] + [468].[bits 72 to 95] ∈ UNINITIALIZED + [468].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [468].f5 ∈ [--..--] + [468].[bits 136 to 159] ∈ UNINITIALIZED + [469].f1 ∈ [--..--] + [469].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [469].f3 ∈ [--..--] + [469].[bits 72 to 95] ∈ UNINITIALIZED + [469].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [469].f5 ∈ [--..--] + [469].[bits 136 to 159] ∈ UNINITIALIZED + [470].f1 ∈ [--..--] + [470].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [470].f3 ∈ [--..--] + [470].[bits 72 to 95] ∈ UNINITIALIZED + [470].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [470].f5 ∈ [--..--] + [470].[bits 136 to 159] ∈ UNINITIALIZED + [471].f1 ∈ [--..--] + [471].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [471].f3 ∈ [--..--] + [471].[bits 72 to 95] ∈ UNINITIALIZED + [471].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [471].f5 ∈ [--..--] + [471].[bits 136 to 159] ∈ UNINITIALIZED + [472].f1 ∈ [--..--] + [472].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [472].f3 ∈ [--..--] + [472].[bits 72 to 95] ∈ UNINITIALIZED + [472].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [472].f5 ∈ [--..--] + [472].[bits 136 to 159] ∈ UNINITIALIZED + [473].f1 ∈ [--..--] + [473].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [473].f3 ∈ [--..--] + [473].[bits 72 to 95] ∈ UNINITIALIZED + [473].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [473].f5 ∈ [--..--] + [473].[bits 136 to 159] ∈ UNINITIALIZED + [474].f1 ∈ [--..--] + [474].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [474].f3 ∈ [--..--] + [474].[bits 72 to 95] ∈ UNINITIALIZED + [474].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [474].f5 ∈ [--..--] + [474].[bits 136 to 159] ∈ UNINITIALIZED + [475].f1 ∈ [--..--] + [475].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [475].f3 ∈ [--..--] + [475].[bits 72 to 95] ∈ UNINITIALIZED + [475].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [475].f5 ∈ [--..--] + [475].[bits 136 to 159] ∈ UNINITIALIZED + [476].f1 ∈ [--..--] + [476].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [476].f3 ∈ [--..--] + [476].[bits 72 to 95] ∈ UNINITIALIZED + [476].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [476].f5 ∈ [--..--] + [476].[bits 136 to 159] ∈ UNINITIALIZED + [477].f1 ∈ [--..--] + [477].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [477].f3 ∈ [--..--] + [477].[bits 72 to 95] ∈ UNINITIALIZED + [477].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [477].f5 ∈ [--..--] + [477].[bits 136 to 159] ∈ UNINITIALIZED + [478].f1 ∈ [--..--] + [478].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [478].f3 ∈ [--..--] + [478].[bits 72 to 95] ∈ UNINITIALIZED + [478].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [478].f5 ∈ [--..--] + [478].[bits 136 to 159] ∈ UNINITIALIZED + [479].f1 ∈ [--..--] + [479].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [479].f3 ∈ [--..--] + [479].[bits 72 to 95] ∈ UNINITIALIZED + [479].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [479].f5 ∈ [--..--] + [479].[bits 136 to 159] ∈ UNINITIALIZED + [480].f1 ∈ [--..--] + [480].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [480].f3 ∈ [--..--] + [480].[bits 72 to 95] ∈ UNINITIALIZED + [480].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [480].f5 ∈ [--..--] + [480].[bits 136 to 159] ∈ UNINITIALIZED + [481].f1 ∈ [--..--] + [481].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [481].f3 ∈ [--..--] + [481].[bits 72 to 95] ∈ UNINITIALIZED + [481].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [481].f5 ∈ [--..--] + [481].[bits 136 to 159] ∈ UNINITIALIZED + [482].f1 ∈ [--..--] + [482].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [482].f3 ∈ [--..--] + [482].[bits 72 to 95] ∈ UNINITIALIZED + [482].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [482].f5 ∈ [--..--] + [482].[bits 136 to 159] ∈ UNINITIALIZED + [483].f1 ∈ [--..--] + [483].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [483].f3 ∈ [--..--] + [483].[bits 72 to 95] ∈ UNINITIALIZED + [483].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [483].f5 ∈ [--..--] + [483].[bits 136 to 159] ∈ UNINITIALIZED + [484].f1 ∈ [--..--] + [484].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [484].f3 ∈ [--..--] + [484].[bits 72 to 95] ∈ UNINITIALIZED + [484].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [484].f5 ∈ [--..--] + [484].[bits 136 to 159] ∈ UNINITIALIZED + [485].f1 ∈ [--..--] + [485].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [485].f3 ∈ [--..--] + [485].[bits 72 to 95] ∈ UNINITIALIZED + [485].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [485].f5 ∈ [--..--] + [485].[bits 136 to 159] ∈ UNINITIALIZED + [486].f1 ∈ [--..--] + [486].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [486].f3 ∈ [--..--] + [486].[bits 72 to 95] ∈ UNINITIALIZED + [486].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [486].f5 ∈ [--..--] + [486].[bits 136 to 159] ∈ UNINITIALIZED + [487].f1 ∈ [--..--] + [487].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [487].f3 ∈ [--..--] + [487].[bits 72 to 95] ∈ UNINITIALIZED + [487].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [487].f5 ∈ [--..--] + [487].[bits 136 to 159] ∈ UNINITIALIZED + [488].f1 ∈ [--..--] + [488].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [488].f3 ∈ [--..--] + [488].[bits 72 to 95] ∈ UNINITIALIZED + [488].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [488].f5 ∈ [--..--] + [488].[bits 136 to 159] ∈ UNINITIALIZED + [489].f1 ∈ [--..--] + [489].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [489].f3 ∈ [--..--] + [489].[bits 72 to 95] ∈ UNINITIALIZED + [489].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [489].f5 ∈ [--..--] + [489].[bits 136 to 159] ∈ UNINITIALIZED + [490].f1 ∈ [--..--] + [490].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [490].f3 ∈ [--..--] + [490].[bits 72 to 95] ∈ UNINITIALIZED + [490].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [490].f5 ∈ [--..--] + [490].[bits 136 to 159] ∈ UNINITIALIZED + [491].f1 ∈ [--..--] + [491].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [491].f3 ∈ [--..--] + [491].[bits 72 to 95] ∈ UNINITIALIZED + [491].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [491].f5 ∈ [--..--] + [491].[bits 136 to 159] ∈ UNINITIALIZED + [492].f1 ∈ [--..--] + [492].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [492].f3 ∈ [--..--] + [492].[bits 72 to 95] ∈ UNINITIALIZED + [492].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [492].f5 ∈ [--..--] + [492].[bits 136 to 159] ∈ UNINITIALIZED + [493].f1 ∈ [--..--] + [493].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [493].f3 ∈ [--..--] + [493].[bits 72 to 95] ∈ UNINITIALIZED + [493].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [493].f5 ∈ [--..--] + [493].[bits 136 to 159] ∈ UNINITIALIZED + [494].f1 ∈ [--..--] + [494].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [494].f3 ∈ [--..--] + [494].[bits 72 to 95] ∈ UNINITIALIZED + [494].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [494].f5 ∈ [--..--] + [494].[bits 136 to 159] ∈ UNINITIALIZED + [495].f1 ∈ [--..--] + [495].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [495].f3 ∈ [--..--] + [495].[bits 72 to 95] ∈ UNINITIALIZED + [495].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [495].f5 ∈ [--..--] + [495].[bits 136 to 159] ∈ UNINITIALIZED + [496].f1 ∈ [--..--] + [496].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [496].f3 ∈ [--..--] + [496].[bits 72 to 95] ∈ UNINITIALIZED + [496].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [496].f5 ∈ [--..--] + [496].[bits 136 to 159] ∈ UNINITIALIZED + [497].f1 ∈ [--..--] + [497].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [497].f3 ∈ [--..--] + [497].[bits 72 to 95] ∈ UNINITIALIZED + [497].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [497].f5 ∈ [--..--] + [497].[bits 136 to 159] ∈ UNINITIALIZED + [498].f1 ∈ [--..--] + [498].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [498].f3 ∈ [--..--] + [498].[bits 72 to 95] ∈ UNINITIALIZED + [498].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [498].f5 ∈ [--..--] + [498].[bits 136 to 159] ∈ UNINITIALIZED + [499].f1 ∈ [--..--] + [499].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [499].f3 ∈ [--..--] + [499].[bits 72 to 95] ∈ UNINITIALIZED + [499].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [499].f5 ∈ [--..--] + [499].[bits 136 to 159] ∈ UNINITIALIZED + [500].f1 ∈ [--..--] + [500].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [500].f3 ∈ [--..--] + [500].[bits 72 to 95] ∈ UNINITIALIZED + [500].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [500].f5 ∈ [--..--] + [500].[bits 136 to 159] ∈ UNINITIALIZED + [501].f1 ∈ [--..--] + [501].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [501].f3 ∈ [--..--] + [501].[bits 72 to 95] ∈ UNINITIALIZED + [501].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [501].f5 ∈ [--..--] + [501].[bits 136 to 159] ∈ UNINITIALIZED + [502].f1 ∈ [--..--] + [502].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [502].f3 ∈ [--..--] + [502].[bits 72 to 95] ∈ UNINITIALIZED + [502].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [502].f5 ∈ [--..--] + [502].[bits 136 to 159] ∈ UNINITIALIZED + [503].f1 ∈ [--..--] + [503].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [503].f3 ∈ [--..--] + [503].[bits 72 to 95] ∈ UNINITIALIZED + [503].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [503].f5 ∈ [--..--] + [503].[bits 136 to 159] ∈ UNINITIALIZED + [504].f1 ∈ [--..--] + [504].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [504].f3 ∈ [--..--] + [504].[bits 72 to 95] ∈ UNINITIALIZED + [504].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [504].f5 ∈ [--..--] + [504].[bits 136 to 159] ∈ UNINITIALIZED + [505].f1 ∈ [--..--] + [505].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [505].f3 ∈ [--..--] + [505].[bits 72 to 95] ∈ UNINITIALIZED + [505].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [505].f5 ∈ [--..--] + [505].[bits 136 to 159] ∈ UNINITIALIZED + [506].f1 ∈ [--..--] + [506].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [506].f3 ∈ [--..--] + [506].[bits 72 to 95] ∈ UNINITIALIZED + [506].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [506].f5 ∈ [--..--] + [506].[bits 136 to 159] ∈ UNINITIALIZED + [507].f1 ∈ [--..--] + [507].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [507].f3 ∈ [--..--] + [507].[bits 72 to 95] ∈ UNINITIALIZED + [507].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [507].f5 ∈ [--..--] + [507].[bits 136 to 159] ∈ UNINITIALIZED + [508].f1 ∈ [--..--] + [508].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [508].f3 ∈ [--..--] + [508].[bits 72 to 95] ∈ UNINITIALIZED + [508].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [508].f5 ∈ [--..--] + [508].[bits 136 to 159] ∈ UNINITIALIZED + [509].f1 ∈ [--..--] + [509].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [509].f3 ∈ [--..--] + [509].[bits 72 to 95] ∈ UNINITIALIZED + [509].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [509].f5 ∈ [--..--] + [509].[bits 136 to 159] ∈ UNINITIALIZED + [510].f1 ∈ [--..--] + [510].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [510].f3 ∈ [--..--] + [510].[bits 72 to 95] ∈ UNINITIALIZED + [510].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [510].f5 ∈ [--..--] + [510].[bits 136 to 159] ∈ UNINITIALIZED + [511].f1 ∈ [--..--] + [511].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [511].f3 ∈ [--..--] + [511].[bits 72 to 95] ∈ UNINITIALIZED + [511].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [511].f5 ∈ [--..--] + [511].[bits 136 to 159] ∈ UNINITIALIZED + [512].f1 ∈ [--..--] + [512].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [512].f3 ∈ [--..--] + [512].[bits 72 to 95] ∈ UNINITIALIZED + [512].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [512].f5 ∈ [--..--] + [512].[bits 136 to 159] ∈ UNINITIALIZED + [513].f1 ∈ [--..--] + [513].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [513].f3 ∈ [--..--] + [513].[bits 72 to 95] ∈ UNINITIALIZED + [513].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [513].f5 ∈ [--..--] + [513].[bits 136 to 159] ∈ UNINITIALIZED + [514].f1 ∈ [--..--] + [514].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [514].f3 ∈ [--..--] + [514].[bits 72 to 95] ∈ UNINITIALIZED + [514].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [514].f5 ∈ [--..--] + [514].[bits 136 to 159] ∈ UNINITIALIZED + [515].f1 ∈ [--..--] + [515].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [515].f3 ∈ [--..--] + [515].[bits 72 to 95] ∈ UNINITIALIZED + [515].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [515].f5 ∈ [--..--] + [515].[bits 136 to 159] ∈ UNINITIALIZED + [516].f1 ∈ [--..--] + [516].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [516].f3 ∈ [--..--] + [516].[bits 72 to 95] ∈ UNINITIALIZED + [516].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [516].f5 ∈ [--..--] + [516].[bits 136 to 159] ∈ UNINITIALIZED + [517].f1 ∈ [--..--] + [517].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [517].f3 ∈ [--..--] + [517].[bits 72 to 95] ∈ UNINITIALIZED + [517].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [517].f5 ∈ [--..--] + [517].[bits 136 to 159] ∈ UNINITIALIZED + [518].f1 ∈ [--..--] + [518].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [518].f3 ∈ [--..--] + [518].[bits 72 to 95] ∈ UNINITIALIZED + [518].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [518].f5 ∈ [--..--] + [518].[bits 136 to 159] ∈ UNINITIALIZED + [519].f1 ∈ [--..--] + [519].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [519].f3 ∈ [--..--] + [519].[bits 72 to 95] ∈ UNINITIALIZED + [519].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [519].f5 ∈ [--..--] + [519].[bits 136 to 159] ∈ UNINITIALIZED + [520].f1 ∈ [--..--] + [520].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [520].f3 ∈ [--..--] + [520].[bits 72 to 95] ∈ UNINITIALIZED + [520].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [520].f5 ∈ [--..--] + [520].[bits 136 to 159] ∈ UNINITIALIZED + [521].f1 ∈ [--..--] + [521].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [521].f3 ∈ [--..--] + [521].[bits 72 to 95] ∈ UNINITIALIZED + [521].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [521].f5 ∈ [--..--] + [521].[bits 136 to 159] ∈ UNINITIALIZED + [522].f1 ∈ [--..--] + [522].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [522].f3 ∈ [--..--] + [522].[bits 72 to 95] ∈ UNINITIALIZED + [522].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [522].f5 ∈ [--..--] + [522].[bits 136 to 159] ∈ UNINITIALIZED + [523].f1 ∈ [--..--] + [523].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [523].f3 ∈ [--..--] + [523].[bits 72 to 95] ∈ UNINITIALIZED + [523].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [523].f5 ∈ [--..--] + [523].[bits 136 to 159] ∈ UNINITIALIZED + [524].f1 ∈ [--..--] + [524].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [524].f3 ∈ [--..--] + [524].[bits 72 to 95] ∈ UNINITIALIZED + [524].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [524].f5 ∈ [--..--] + [524].[bits 136 to 159] ∈ UNINITIALIZED + [525].f1 ∈ [--..--] + [525].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [525].f3 ∈ [--..--] + [525].[bits 72 to 95] ∈ UNINITIALIZED + [525].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [525].f5 ∈ [--..--] + [525].[bits 136 to 159] ∈ UNINITIALIZED + [526].f1 ∈ [--..--] + [526].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [526].f3 ∈ [--..--] + [526].[bits 72 to 95] ∈ UNINITIALIZED + [526].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [526].f5 ∈ [--..--] + [526].[bits 136 to 159] ∈ UNINITIALIZED + [527].f1 ∈ [--..--] + [527].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [527].f3 ∈ [--..--] + [527].[bits 72 to 95] ∈ UNINITIALIZED + [527].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [527].f5 ∈ [--..--] + [527].[bits 136 to 159] ∈ UNINITIALIZED + [528].f1 ∈ [--..--] + [528].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [528].f3 ∈ [--..--] + [528].[bits 72 to 95] ∈ UNINITIALIZED + [528].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [528].f5 ∈ [--..--] + [528].[bits 136 to 159] ∈ UNINITIALIZED + [529].f1 ∈ [--..--] + [529].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [529].f3 ∈ [--..--] + [529].[bits 72 to 95] ∈ UNINITIALIZED + [529].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [529].f5 ∈ [--..--] + [529].[bits 136 to 159] ∈ UNINITIALIZED + [530].f1 ∈ [--..--] + [530].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [530].f3 ∈ [--..--] + [530].[bits 72 to 95] ∈ UNINITIALIZED + [530].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [530].f5 ∈ [--..--] + [530].[bits 136 to 159] ∈ UNINITIALIZED + [531].f1 ∈ [--..--] + [531].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [531].f3 ∈ [--..--] + [531].[bits 72 to 95] ∈ UNINITIALIZED + [531].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [531].f5 ∈ [--..--] + [531].[bits 136 to 159] ∈ UNINITIALIZED + [532].f1 ∈ [--..--] + [532].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [532].f3 ∈ [--..--] + [532].[bits 72 to 95] ∈ UNINITIALIZED + [532].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [532].f5 ∈ [--..--] + [532].[bits 136 to 159] ∈ UNINITIALIZED + [533].f1 ∈ [--..--] + [533].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [533].f3 ∈ [--..--] + [533].[bits 72 to 95] ∈ UNINITIALIZED + [533].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [533].f5 ∈ [--..--] + [533].[bits 136 to 159] ∈ UNINITIALIZED + [534].f1 ∈ [--..--] + [534].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [534].f3 ∈ [--..--] + [534].[bits 72 to 95] ∈ UNINITIALIZED + [534].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [534].f5 ∈ [--..--] + [534].[bits 136 to 159] ∈ UNINITIALIZED + [535].f1 ∈ [--..--] + [535].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [535].f3 ∈ [--..--] + [535].[bits 72 to 95] ∈ UNINITIALIZED + [535].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [535].f5 ∈ [--..--] + [535].[bits 136 to 159] ∈ UNINITIALIZED + [536].f1 ∈ [--..--] + [536].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [536].f3 ∈ [--..--] + [536].[bits 72 to 95] ∈ UNINITIALIZED + [536].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [536].f5 ∈ [--..--] + [536].[bits 136 to 159] ∈ UNINITIALIZED + [537].f1 ∈ [--..--] + [537].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [537].f3 ∈ [--..--] + [537].[bits 72 to 95] ∈ UNINITIALIZED + [537].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [537].f5 ∈ [--..--] + [537].[bits 136 to 159] ∈ UNINITIALIZED + [538].f1 ∈ [--..--] + [538].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [538].f3 ∈ [--..--] + [538].[bits 72 to 95] ∈ UNINITIALIZED + [538].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [538].f5 ∈ [--..--] + [538].[bits 136 to 159] ∈ UNINITIALIZED + [539].f1 ∈ [--..--] + [539].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [539].f3 ∈ [--..--] + [539].[bits 72 to 95] ∈ UNINITIALIZED + [539].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [539].f5 ∈ [--..--] + [539].[bits 136 to 159] ∈ UNINITIALIZED + [540].f1 ∈ [--..--] + [540].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [540].f3 ∈ [--..--] + [540].[bits 72 to 95] ∈ UNINITIALIZED + [540].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [540].f5 ∈ [--..--] + [540].[bits 136 to 159] ∈ UNINITIALIZED + [541].f1 ∈ [--..--] + [541].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [541].f3 ∈ [--..--] + [541].[bits 72 to 95] ∈ UNINITIALIZED + [541].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [541].f5 ∈ [--..--] + [541].[bits 136 to 159] ∈ UNINITIALIZED + [542].f1 ∈ [--..--] + [542].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [542].f3 ∈ [--..--] + [542].[bits 72 to 95] ∈ UNINITIALIZED + [542].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [542].f5 ∈ [--..--] + [542].[bits 136 to 159] ∈ UNINITIALIZED + [543].f1 ∈ [--..--] + [543].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [543].f3 ∈ [--..--] + [543].[bits 72 to 95] ∈ UNINITIALIZED + [543].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [543].f5 ∈ [--..--] + [543].[bits 136 to 159] ∈ UNINITIALIZED + [544].f1 ∈ [--..--] + [544].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [544].f3 ∈ [--..--] + [544].[bits 72 to 95] ∈ UNINITIALIZED + [544].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [544].f5 ∈ [--..--] + [544].[bits 136 to 159] ∈ UNINITIALIZED + [545].f1 ∈ [--..--] + [545].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [545].f3 ∈ [--..--] + [545].[bits 72 to 95] ∈ UNINITIALIZED + [545].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [545].f5 ∈ [--..--] + [545].[bits 136 to 159] ∈ UNINITIALIZED + [546].f1 ∈ [--..--] + [546].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [546].f3 ∈ [--..--] + [546].[bits 72 to 95] ∈ UNINITIALIZED + [546].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [546].f5 ∈ [--..--] + [546].[bits 136 to 159] ∈ UNINITIALIZED + [547].f1 ∈ [--..--] + [547].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [547].f3 ∈ [--..--] + [547].[bits 72 to 95] ∈ UNINITIALIZED + [547].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [547].f5 ∈ [--..--] + [547].[bits 136 to 159] ∈ UNINITIALIZED + [548].f1 ∈ [--..--] + [548].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [548].f3 ∈ [--..--] + [548].[bits 72 to 95] ∈ UNINITIALIZED + [548].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [548].f5 ∈ [--..--] + [548].[bits 136 to 159] ∈ UNINITIALIZED + [549].f1 ∈ [--..--] + [549].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [549].f3 ∈ [--..--] + [549].[bits 72 to 95] ∈ UNINITIALIZED + [549].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [549].f5 ∈ [--..--] + [549].[bits 136 to 159] ∈ UNINITIALIZED + [550].f1 ∈ [--..--] + [550].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [550].f3 ∈ [--..--] + [550].[bits 72 to 95] ∈ UNINITIALIZED + [550].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [550].f5 ∈ [--..--] + [550].[bits 136 to 159] ∈ UNINITIALIZED + [551].f1 ∈ [--..--] + [551].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [551].f3 ∈ [--..--] + [551].[bits 72 to 95] ∈ UNINITIALIZED + [551].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [551].f5 ∈ [--..--] + [551].[bits 136 to 159] ∈ UNINITIALIZED + [552].f1 ∈ [--..--] + [552].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [552].f3 ∈ [--..--] + [552].[bits 72 to 95] ∈ UNINITIALIZED + [552].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [552].f5 ∈ [--..--] + [552].[bits 136 to 159] ∈ UNINITIALIZED + [553].f1 ∈ [--..--] + [553].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [553].f3 ∈ [--..--] + [553].[bits 72 to 95] ∈ UNINITIALIZED + [553].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [553].f5 ∈ [--..--] + [553].[bits 136 to 159] ∈ UNINITIALIZED + [554].f1 ∈ [--..--] + [554].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [554].f3 ∈ [--..--] + [554].[bits 72 to 95] ∈ UNINITIALIZED + [554].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [554].f5 ∈ [--..--] + [554].[bits 136 to 159] ∈ UNINITIALIZED + [555].f1 ∈ [--..--] + [555].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [555].f3 ∈ [--..--] + [555].[bits 72 to 95] ∈ UNINITIALIZED + [555].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [555].f5 ∈ [--..--] + [555].[bits 136 to 159] ∈ UNINITIALIZED + [556].f1 ∈ [--..--] + [556].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [556].f3 ∈ [--..--] + [556].[bits 72 to 95] ∈ UNINITIALIZED + [556].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [556].f5 ∈ [--..--] + [556].[bits 136 to 159] ∈ UNINITIALIZED + [557].f1 ∈ [--..--] + [557].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [557].f3 ∈ [--..--] + [557].[bits 72 to 95] ∈ UNINITIALIZED + [557].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [557].f5 ∈ [--..--] + [557].[bits 136 to 159] ∈ UNINITIALIZED + [558].f1 ∈ [--..--] + [558].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [558].f3 ∈ [--..--] + [558].[bits 72 to 95] ∈ UNINITIALIZED + [558].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [558].f5 ∈ [--..--] + [558].[bits 136 to 159] ∈ UNINITIALIZED + [559].f1 ∈ [--..--] + [559].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [559].f3 ∈ [--..--] + [559].[bits 72 to 95] ∈ UNINITIALIZED + [559].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [559].f5 ∈ [--..--] + [559].[bits 136 to 159] ∈ UNINITIALIZED + [560].f1 ∈ [--..--] + [560].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [560].f3 ∈ [--..--] + [560].[bits 72 to 95] ∈ UNINITIALIZED + [560].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [560].f5 ∈ [--..--] + [560].[bits 136 to 159] ∈ UNINITIALIZED + [561].f1 ∈ [--..--] + [561].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [561].f3 ∈ [--..--] + [561].[bits 72 to 95] ∈ UNINITIALIZED + [561].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [561].f5 ∈ [--..--] + [561].[bits 136 to 159] ∈ UNINITIALIZED + [562].f1 ∈ [--..--] + [562].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [562].f3 ∈ [--..--] + [562].[bits 72 to 95] ∈ UNINITIALIZED + [562].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [562].f5 ∈ [--..--] + [562].[bits 136 to 159] ∈ UNINITIALIZED + [563].f1 ∈ [--..--] + [563].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [563].f3 ∈ [--..--] + [563].[bits 72 to 95] ∈ UNINITIALIZED + [563].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [563].f5 ∈ [--..--] + [563].[bits 136 to 159] ∈ UNINITIALIZED + [564].f1 ∈ [--..--] + [564].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [564].f3 ∈ [--..--] + [564].[bits 72 to 95] ∈ UNINITIALIZED + [564].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [564].f5 ∈ [--..--] + [564].[bits 136 to 159] ∈ UNINITIALIZED + [565].f1 ∈ [--..--] + [565].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [565].f3 ∈ [--..--] + [565].[bits 72 to 95] ∈ UNINITIALIZED + [565].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [565].f5 ∈ [--..--] + [565].[bits 136 to 159] ∈ UNINITIALIZED + [566].f1 ∈ [--..--] + [566].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [566].f3 ∈ [--..--] + [566].[bits 72 to 95] ∈ UNINITIALIZED + [566].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [566].f5 ∈ [--..--] + [566].[bits 136 to 159] ∈ UNINITIALIZED + [567].f1 ∈ [--..--] + [567].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [567].f3 ∈ [--..--] + [567].[bits 72 to 95] ∈ UNINITIALIZED + [567].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [567].f5 ∈ [--..--] + [567].[bits 136 to 159] ∈ UNINITIALIZED + [568].f1 ∈ [--..--] + [568].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [568].f3 ∈ [--..--] + [568].[bits 72 to 95] ∈ UNINITIALIZED + [568].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [568].f5 ∈ [--..--] + [568].[bits 136 to 159] ∈ UNINITIALIZED + [569].f1 ∈ [--..--] + [569].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [569].f3 ∈ [--..--] + [569].[bits 72 to 95] ∈ UNINITIALIZED + [569].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [569].f5 ∈ [--..--] + [569].[bits 136 to 159] ∈ UNINITIALIZED + [570].f1 ∈ [--..--] + [570].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [570].f3 ∈ [--..--] + [570].[bits 72 to 95] ∈ UNINITIALIZED + [570].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [570].f5 ∈ [--..--] + [570].[bits 136 to 159] ∈ UNINITIALIZED + [571].f1 ∈ [--..--] + [571].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [571].f3 ∈ [--..--] + [571].[bits 72 to 95] ∈ UNINITIALIZED + [571].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [571].f5 ∈ [--..--] + [571].[bits 136 to 159] ∈ UNINITIALIZED + [572].f1 ∈ [--..--] + [572].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [572].f3 ∈ [--..--] + [572].[bits 72 to 95] ∈ UNINITIALIZED + [572].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [572].f5 ∈ [--..--] + [572].[bits 136 to 159] ∈ UNINITIALIZED + [573].f1 ∈ [--..--] + [573].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [573].f3 ∈ [--..--] + [573].[bits 72 to 95] ∈ UNINITIALIZED + [573].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [573].f5 ∈ [--..--] + [573].[bits 136 to 159] ∈ UNINITIALIZED + [574].f1 ∈ [--..--] + [574].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [574].f3 ∈ [--..--] + [574].[bits 72 to 95] ∈ UNINITIALIZED + [574].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [574].f5 ∈ [--..--] + [574].[bits 136 to 159] ∈ UNINITIALIZED + [575].f1 ∈ [--..--] + [575].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [575].f3 ∈ [--..--] + [575].[bits 72 to 95] ∈ UNINITIALIZED + [575].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [575].f5 ∈ [--..--] + [575].[bits 136 to 159] ∈ UNINITIALIZED + [576].f1 ∈ [--..--] + [576].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [576].f3 ∈ [--..--] + [576].[bits 72 to 95] ∈ UNINITIALIZED + [576].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [576].f5 ∈ [--..--] + [576].[bits 136 to 159] ∈ UNINITIALIZED + [577].f1 ∈ [--..--] + [577].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [577].f3 ∈ [--..--] + [577].[bits 72 to 95] ∈ UNINITIALIZED + [577].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [577].f5 ∈ [--..--] + [577].[bits 136 to 159] ∈ UNINITIALIZED + [578].f1 ∈ [--..--] + [578].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [578].f3 ∈ [--..--] + [578].[bits 72 to 95] ∈ UNINITIALIZED + [578].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [578].f5 ∈ [--..--] + [578].[bits 136 to 159] ∈ UNINITIALIZED + [579].f1 ∈ [--..--] + [579].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [579].f3 ∈ [--..--] + [579].[bits 72 to 95] ∈ UNINITIALIZED + [579].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [579].f5 ∈ [--..--] + [579].[bits 136 to 159] ∈ UNINITIALIZED + [580].f1 ∈ [--..--] + [580].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [580].f3 ∈ [--..--] + [580].[bits 72 to 95] ∈ UNINITIALIZED + [580].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [580].f5 ∈ [--..--] + [580].[bits 136 to 159] ∈ UNINITIALIZED + [581].f1 ∈ [--..--] + [581].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [581].f3 ∈ [--..--] + [581].[bits 72 to 95] ∈ UNINITIALIZED + [581].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [581].f5 ∈ [--..--] + [581].[bits 136 to 159] ∈ UNINITIALIZED + [582].f1 ∈ [--..--] + [582].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [582].f3 ∈ [--..--] + [582].[bits 72 to 95] ∈ UNINITIALIZED + [582].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [582].f5 ∈ [--..--] + [582].[bits 136 to 159] ∈ UNINITIALIZED + [583].f1 ∈ [--..--] + [583].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [583].f3 ∈ [--..--] + [583].[bits 72 to 95] ∈ UNINITIALIZED + [583].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [583].f5 ∈ [--..--] + [583].[bits 136 to 159] ∈ UNINITIALIZED + [584].f1 ∈ [--..--] + [584].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [584].f3 ∈ [--..--] + [584].[bits 72 to 95] ∈ UNINITIALIZED + [584].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [584].f5 ∈ [--..--] + [584].[bits 136 to 159] ∈ UNINITIALIZED + [585].f1 ∈ [--..--] + [585].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [585].f3 ∈ [--..--] + [585].[bits 72 to 95] ∈ UNINITIALIZED + [585].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [585].f5 ∈ [--..--] + [585].[bits 136 to 159] ∈ UNINITIALIZED + [586].f1 ∈ [--..--] + [586].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [586].f3 ∈ [--..--] + [586].[bits 72 to 95] ∈ UNINITIALIZED + [586].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [586].f5 ∈ [--..--] + [586].[bits 136 to 159] ∈ UNINITIALIZED + [587].f1 ∈ [--..--] + [587].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [587].f3 ∈ [--..--] + [587].[bits 72 to 95] ∈ UNINITIALIZED + [587].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [587].f5 ∈ [--..--] + [587].[bits 136 to 159] ∈ UNINITIALIZED + [588].f1 ∈ [--..--] + [588].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [588].f3 ∈ [--..--] + [588].[bits 72 to 95] ∈ UNINITIALIZED + [588].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [588].f5 ∈ [--..--] + [588].[bits 136 to 159] ∈ UNINITIALIZED + [589].f1 ∈ [--..--] + [589].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [589].f3 ∈ [--..--] + [589].[bits 72 to 95] ∈ UNINITIALIZED + [589].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [589].f5 ∈ [--..--] + [589].[bits 136 to 159] ∈ UNINITIALIZED + [590].f1 ∈ [--..--] + [590].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [590].f3 ∈ [--..--] + [590].[bits 72 to 95] ∈ UNINITIALIZED + [590].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [590].f5 ∈ [--..--] + [590].[bits 136 to 159] ∈ UNINITIALIZED + [591].f1 ∈ [--..--] + [591].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [591].f3 ∈ [--..--] + [591].[bits 72 to 95] ∈ UNINITIALIZED + [591].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [591].f5 ∈ [--..--] + [591].[bits 136 to 159] ∈ UNINITIALIZED + [592].f1 ∈ [--..--] + [592].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [592].f3 ∈ [--..--] + [592].[bits 72 to 95] ∈ UNINITIALIZED + [592].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [592].f5 ∈ [--..--] + [592].[bits 136 to 159] ∈ UNINITIALIZED + [593].f1 ∈ [--..--] + [593].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [593].f3 ∈ [--..--] + [593].[bits 72 to 95] ∈ UNINITIALIZED + [593].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [593].f5 ∈ [--..--] + [593].[bits 136 to 159] ∈ UNINITIALIZED + [594].f1 ∈ [--..--] + [594].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [594].f3 ∈ [--..--] + [594].[bits 72 to 95] ∈ UNINITIALIZED + [594].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [594].f5 ∈ [--..--] + [594].[bits 136 to 159] ∈ UNINITIALIZED + [595].f1 ∈ [--..--] + [595].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [595].f3 ∈ [--..--] + [595].[bits 72 to 95] ∈ UNINITIALIZED + [595].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [595].f5 ∈ [--..--] + [595].[bits 136 to 159] ∈ UNINITIALIZED + [596].f1 ∈ [--..--] + [596].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [596].f3 ∈ [--..--] + [596].[bits 72 to 95] ∈ UNINITIALIZED + [596].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [596].f5 ∈ [--..--] + [596].[bits 136 to 159] ∈ UNINITIALIZED + [597].f1 ∈ [--..--] + [597].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [597].f3 ∈ [--..--] + [597].[bits 72 to 95] ∈ UNINITIALIZED + [597].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [597].f5 ∈ [--..--] + [597].[bits 136 to 159] ∈ UNINITIALIZED + [598].f1 ∈ [--..--] + [598].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [598].f3 ∈ [--..--] + [598].[bits 72 to 95] ∈ UNINITIALIZED + [598].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [598].f5 ∈ [--..--] + [598].[bits 136 to 159] ∈ UNINITIALIZED + [599].f1 ∈ [--..--] + [599].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [599].f3 ∈ [--..--] + [599].[bits 72 to 95] ∈ UNINITIALIZED + [599].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [599].f5 ∈ [--..--] + [599].[bits 136 to 159] ∈ UNINITIALIZED + [600].f1 ∈ [--..--] + [600].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [600].f3 ∈ [--..--] + [600].[bits 72 to 95] ∈ UNINITIALIZED + [600].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [600].f5 ∈ [--..--] + [600].[bits 136 to 159] ∈ UNINITIALIZED + [601].f1 ∈ [--..--] + [601].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [601].f3 ∈ [--..--] + [601].[bits 72 to 95] ∈ UNINITIALIZED + [601].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [601].f5 ∈ [--..--] + [601].[bits 136 to 159] ∈ UNINITIALIZED + [602].f1 ∈ [--..--] + [602].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [602].f3 ∈ [--..--] + [602].[bits 72 to 95] ∈ UNINITIALIZED + [602].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [602].f5 ∈ [--..--] + [602].[bits 136 to 159] ∈ UNINITIALIZED + [603].f1 ∈ [--..--] + [603].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [603].f3 ∈ [--..--] + [603].[bits 72 to 95] ∈ UNINITIALIZED + [603].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [603].f5 ∈ [--..--] + [603].[bits 136 to 159] ∈ UNINITIALIZED + [604].f1 ∈ [--..--] + [604].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [604].f3 ∈ [--..--] + [604].[bits 72 to 95] ∈ UNINITIALIZED + [604].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [604].f5 ∈ [--..--] + [604].[bits 136 to 159] ∈ UNINITIALIZED + [605].f1 ∈ [--..--] + [605].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [605].f3 ∈ [--..--] + [605].[bits 72 to 95] ∈ UNINITIALIZED + [605].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [605].f5 ∈ [--..--] + [605].[bits 136 to 159] ∈ UNINITIALIZED + [606].f1 ∈ [--..--] + [606].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [606].f3 ∈ [--..--] + [606].[bits 72 to 95] ∈ UNINITIALIZED + [606].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [606].f5 ∈ [--..--] + [606].[bits 136 to 159] ∈ UNINITIALIZED + [607].f1 ∈ [--..--] + [607].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [607].f3 ∈ [--..--] + [607].[bits 72 to 95] ∈ UNINITIALIZED + [607].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [607].f5 ∈ [--..--] + [607].[bits 136 to 159] ∈ UNINITIALIZED + [608].f1 ∈ [--..--] + [608].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [608].f3 ∈ [--..--] + [608].[bits 72 to 95] ∈ UNINITIALIZED + [608].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [608].f5 ∈ [--..--] + [608].[bits 136 to 159] ∈ UNINITIALIZED + [609].f1 ∈ [--..--] + [609].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [609].f3 ∈ [--..--] + [609].[bits 72 to 95] ∈ UNINITIALIZED + [609].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [609].f5 ∈ [--..--] + [609].[bits 136 to 159] ∈ UNINITIALIZED + [610].f1 ∈ [--..--] + [610].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [610].f3 ∈ [--..--] + [610].[bits 72 to 95] ∈ UNINITIALIZED + [610].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [610].f5 ∈ [--..--] + [610].[bits 136 to 159] ∈ UNINITIALIZED + [611].f1 ∈ [--..--] + [611].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [611].f3 ∈ [--..--] + [611].[bits 72 to 95] ∈ UNINITIALIZED + [611].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [611].f5 ∈ [--..--] + [611].[bits 136 to 159] ∈ UNINITIALIZED + [612].f1 ∈ [--..--] + [612].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [612].f3 ∈ [--..--] + [612].[bits 72 to 95] ∈ UNINITIALIZED + [612].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [612].f5 ∈ [--..--] + [612].[bits 136 to 159] ∈ UNINITIALIZED + [613].f1 ∈ [--..--] + [613].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [613].f3 ∈ [--..--] + [613].[bits 72 to 95] ∈ UNINITIALIZED + [613].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [613].f5 ∈ [--..--] + [613].[bits 136 to 159] ∈ UNINITIALIZED + [614].f1 ∈ [--..--] + [614].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [614].f3 ∈ [--..--] + [614].[bits 72 to 95] ∈ UNINITIALIZED + [614].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [614].f5 ∈ [--..--] + [614].[bits 136 to 159] ∈ UNINITIALIZED + [615].f1 ∈ [--..--] + [615].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [615].f3 ∈ [--..--] + [615].[bits 72 to 95] ∈ UNINITIALIZED + [615].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [615].f5 ∈ [--..--] + [615].[bits 136 to 159] ∈ UNINITIALIZED + [616].f1 ∈ [--..--] + [616].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [616].f3 ∈ [--..--] + [616].[bits 72 to 95] ∈ UNINITIALIZED + [616].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [616].f5 ∈ [--..--] + [616].[bits 136 to 159] ∈ UNINITIALIZED + [617].f1 ∈ [--..--] + [617].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [617].f3 ∈ [--..--] + [617].[bits 72 to 95] ∈ UNINITIALIZED + [617].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [617].f5 ∈ [--..--] + [617].[bits 136 to 159] ∈ UNINITIALIZED + [618].f1 ∈ [--..--] + [618].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [618].f3 ∈ [--..--] + [618].[bits 72 to 95] ∈ UNINITIALIZED + [618].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [618].f5 ∈ [--..--] + [618].[bits 136 to 159] ∈ UNINITIALIZED + [619].f1 ∈ [--..--] + [619].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [619].f3 ∈ [--..--] + [619].[bits 72 to 95] ∈ UNINITIALIZED + [619].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [619].f5 ∈ [--..--] + [619].[bits 136 to 159] ∈ UNINITIALIZED + [620].f1 ∈ [--..--] + [620].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [620].f3 ∈ [--..--] + [620].[bits 72 to 95] ∈ UNINITIALIZED + [620].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [620].f5 ∈ [--..--] + [620].[bits 136 to 159] ∈ UNINITIALIZED + [621].f1 ∈ [--..--] + [621].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [621].f3 ∈ [--..--] + [621].[bits 72 to 95] ∈ UNINITIALIZED + [621].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [621].f5 ∈ [--..--] + [621].[bits 136 to 159] ∈ UNINITIALIZED + [622].f1 ∈ [--..--] + [622].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [622].f3 ∈ [--..--] + [622].[bits 72 to 95] ∈ UNINITIALIZED + [622].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [622].f5 ∈ [--..--] + [622].[bits 136 to 159] ∈ UNINITIALIZED + [623].f1 ∈ [--..--] + [623].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [623].f3 ∈ [--..--] + [623].[bits 72 to 95] ∈ UNINITIALIZED + [623].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [623].f5 ∈ [--..--] + [623].[bits 136 to 159] ∈ UNINITIALIZED + [624].f1 ∈ [--..--] + [624].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [624].f3 ∈ [--..--] + [624].[bits 72 to 95] ∈ UNINITIALIZED + [624].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [624].f5 ∈ [--..--] + [624].[bits 136 to 159] ∈ UNINITIALIZED + [625].f1 ∈ [--..--] + [625].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [625].f3 ∈ [--..--] + [625].[bits 72 to 95] ∈ UNINITIALIZED + [625].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [625].f5 ∈ [--..--] + [625].[bits 136 to 159] ∈ UNINITIALIZED + [626].f1 ∈ [--..--] + [626].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [626].f3 ∈ [--..--] + [626].[bits 72 to 95] ∈ UNINITIALIZED + [626].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [626].f5 ∈ [--..--] + [626].[bits 136 to 159] ∈ UNINITIALIZED + [627].f1 ∈ [--..--] + [627].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [627].f3 ∈ [--..--] + [627].[bits 72 to 95] ∈ UNINITIALIZED + [627].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [627].f5 ∈ [--..--] + [627].[bits 136 to 159] ∈ UNINITIALIZED + [628].f1 ∈ [--..--] + [628].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [628].f3 ∈ [--..--] + [628].[bits 72 to 95] ∈ UNINITIALIZED + [628].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [628].f5 ∈ [--..--] + [628].[bits 136 to 159] ∈ UNINITIALIZED + [629].f1 ∈ [--..--] + [629].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [629].f3 ∈ [--..--] + [629].[bits 72 to 95] ∈ UNINITIALIZED + [629].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [629].f5 ∈ [--..--] + [629].[bits 136 to 159] ∈ UNINITIALIZED + [630].f1 ∈ [--..--] + [630].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [630].f3 ∈ [--..--] + [630].[bits 72 to 95] ∈ UNINITIALIZED + [630].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [630].f5 ∈ [--..--] + [630].[bits 136 to 159] ∈ UNINITIALIZED + [631].f1 ∈ [--..--] + [631].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [631].f3 ∈ [--..--] + [631].[bits 72 to 95] ∈ UNINITIALIZED + [631].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [631].f5 ∈ [--..--] + [631].[bits 136 to 159] ∈ UNINITIALIZED + [632].f1 ∈ [--..--] + [632].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [632].f3 ∈ [--..--] + [632].[bits 72 to 95] ∈ UNINITIALIZED + [632].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [632].f5 ∈ [--..--] + [632].[bits 136 to 159] ∈ UNINITIALIZED + [633].f1 ∈ [--..--] + [633].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [633].f3 ∈ [--..--] + [633].[bits 72 to 95] ∈ UNINITIALIZED + [633].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [633].f5 ∈ [--..--] + [633].[bits 136 to 159] ∈ UNINITIALIZED + [634].f1 ∈ [--..--] + [634].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [634].f3 ∈ [--..--] + [634].[bits 72 to 95] ∈ UNINITIALIZED + [634].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [634].f5 ∈ [--..--] + [634].[bits 136 to 159] ∈ UNINITIALIZED + [635].f1 ∈ [--..--] + [635].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [635].f3 ∈ [--..--] + [635].[bits 72 to 95] ∈ UNINITIALIZED + [635].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [635].f5 ∈ [--..--] + [635].[bits 136 to 159] ∈ UNINITIALIZED + [636].f1 ∈ [--..--] + [636].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [636].f3 ∈ [--..--] + [636].[bits 72 to 95] ∈ UNINITIALIZED + [636].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [636].f5 ∈ [--..--] + [636].[bits 136 to 159] ∈ UNINITIALIZED + [637].f1 ∈ [--..--] + [637].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [637].f3 ∈ [--..--] + [637].[bits 72 to 95] ∈ UNINITIALIZED + [637].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [637].f5 ∈ [--..--] + [637].[bits 136 to 159] ∈ UNINITIALIZED + [638].f1 ∈ [--..--] + [638].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [638].f3 ∈ [--..--] + [638].[bits 72 to 95] ∈ UNINITIALIZED + [638].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [638].f5 ∈ [--..--] + [638].[bits 136 to 159] ∈ UNINITIALIZED + [639].f1 ∈ [--..--] + [639].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [639].f3 ∈ [--..--] + [639].[bits 72 to 95] ∈ UNINITIALIZED + [639].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [639].f5 ∈ [--..--] + [639].[bits 136 to 159] ∈ UNINITIALIZED + [640].f1 ∈ [--..--] + [640].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [640].f3 ∈ [--..--] + [640].[bits 72 to 95] ∈ UNINITIALIZED + [640].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [640].f5 ∈ [--..--] + [640].[bits 136 to 159] ∈ UNINITIALIZED + [641].f1 ∈ [--..--] + [641].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [641].f3 ∈ [--..--] + [641].[bits 72 to 95] ∈ UNINITIALIZED + [641].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [641].f5 ∈ [--..--] + [641].[bits 136 to 159] ∈ UNINITIALIZED + [642].f1 ∈ [--..--] + [642].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [642].f3 ∈ [--..--] + [642].[bits 72 to 95] ∈ UNINITIALIZED + [642].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [642].f5 ∈ [--..--] + [642].[bits 136 to 159] ∈ UNINITIALIZED + [643].f1 ∈ [--..--] + [643].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [643].f3 ∈ [--..--] + [643].[bits 72 to 95] ∈ UNINITIALIZED + [643].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [643].f5 ∈ [--..--] + [643].[bits 136 to 159] ∈ UNINITIALIZED + [644].f1 ∈ [--..--] + [644].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [644].f3 ∈ [--..--] + [644].[bits 72 to 95] ∈ UNINITIALIZED + [644].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [644].f5 ∈ [--..--] + [644].[bits 136 to 159] ∈ UNINITIALIZED + [645].f1 ∈ [--..--] + [645].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [645].f3 ∈ [--..--] + [645].[bits 72 to 95] ∈ UNINITIALIZED + [645].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [645].f5 ∈ [--..--] + [645].[bits 136 to 159] ∈ UNINITIALIZED + [646].f1 ∈ [--..--] + [646].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [646].f3 ∈ [--..--] + [646].[bits 72 to 95] ∈ UNINITIALIZED + [646].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [646].f5 ∈ [--..--] + [646].[bits 136 to 159] ∈ UNINITIALIZED + [647].f1 ∈ [--..--] + [647].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [647].f3 ∈ [--..--] + [647].[bits 72 to 95] ∈ UNINITIALIZED + [647].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [647].f5 ∈ [--..--] + [647].[bits 136 to 159] ∈ UNINITIALIZED + [648].f1 ∈ [--..--] + [648].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [648].f3 ∈ [--..--] + [648].[bits 72 to 95] ∈ UNINITIALIZED + [648].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [648].f5 ∈ [--..--] + [648].[bits 136 to 159] ∈ UNINITIALIZED + [649].f1 ∈ [--..--] + [649].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [649].f3 ∈ [--..--] + [649].[bits 72 to 95] ∈ UNINITIALIZED + [649].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [649].f5 ∈ [--..--] + [649].[bits 136 to 159] ∈ UNINITIALIZED + [650].f1 ∈ [--..--] + [650].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [650].f3 ∈ [--..--] + [650].[bits 72 to 95] ∈ UNINITIALIZED + [650].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [650].f5 ∈ [--..--] + [650].[bits 136 to 159] ∈ UNINITIALIZED + [651].f1 ∈ [--..--] + [651].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [651].f3 ∈ [--..--] + [651].[bits 72 to 95] ∈ UNINITIALIZED + [651].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [651].f5 ∈ [--..--] + [651].[bits 136 to 159] ∈ UNINITIALIZED + [652].f1 ∈ [--..--] + [652].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [652].f3 ∈ [--..--] + [652].[bits 72 to 95] ∈ UNINITIALIZED + [652].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [652].f5 ∈ [--..--] + [652].[bits 136 to 159] ∈ UNINITIALIZED + [653].f1 ∈ [--..--] + [653].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [653].f3 ∈ [--..--] + [653].[bits 72 to 95] ∈ UNINITIALIZED + [653].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [653].f5 ∈ [--..--] + [653].[bits 136 to 159] ∈ UNINITIALIZED + [654].f1 ∈ [--..--] + [654].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [654].f3 ∈ [--..--] + [654].[bits 72 to 95] ∈ UNINITIALIZED + [654].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [654].f5 ∈ [--..--] + [654].[bits 136 to 159] ∈ UNINITIALIZED + [655].f1 ∈ [--..--] + [655].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [655].f3 ∈ [--..--] + [655].[bits 72 to 95] ∈ UNINITIALIZED + [655].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [655].f5 ∈ [--..--] + [655].[bits 136 to 159] ∈ UNINITIALIZED + [656].f1 ∈ [--..--] + [656].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [656].f3 ∈ [--..--] + [656].[bits 72 to 95] ∈ UNINITIALIZED + [656].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [656].f5 ∈ [--..--] + [656].[bits 136 to 159] ∈ UNINITIALIZED + [657].f1 ∈ [--..--] + [657].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [657].f3 ∈ [--..--] + [657].[bits 72 to 95] ∈ UNINITIALIZED + [657].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [657].f5 ∈ [--..--] + [657].[bits 136 to 159] ∈ UNINITIALIZED + [658].f1 ∈ [--..--] + [658].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [658].f3 ∈ [--..--] + [658].[bits 72 to 95] ∈ UNINITIALIZED + [658].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [658].f5 ∈ [--..--] + [658].[bits 136 to 159] ∈ UNINITIALIZED + [659].f1 ∈ [--..--] + [659].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [659].f3 ∈ [--..--] + [659].[bits 72 to 95] ∈ UNINITIALIZED + [659].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [659].f5 ∈ [--..--] + [659].[bits 136 to 159] ∈ UNINITIALIZED + [660].f1 ∈ [--..--] + [660].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [660].f3 ∈ [--..--] + [660].[bits 72 to 95] ∈ UNINITIALIZED + [660].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [660].f5 ∈ [--..--] + [660].[bits 136 to 159] ∈ UNINITIALIZED + [661].f1 ∈ [--..--] + [661].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [661].f3 ∈ [--..--] + [661].[bits 72 to 95] ∈ UNINITIALIZED + [661].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [661].f5 ∈ [--..--] + [661].[bits 136 to 159] ∈ UNINITIALIZED + [662].f1 ∈ [--..--] + [662].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [662].f3 ∈ [--..--] + [662].[bits 72 to 95] ∈ UNINITIALIZED + [662].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [662].f5 ∈ [--..--] + [662].[bits 136 to 159] ∈ UNINITIALIZED + [663].f1 ∈ [--..--] + [663].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [663].f3 ∈ [--..--] + [663].[bits 72 to 95] ∈ UNINITIALIZED + [663].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [663].f5 ∈ [--..--] + [663].[bits 136 to 159] ∈ UNINITIALIZED + [664].f1 ∈ [--..--] + [664].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [664].f3 ∈ [--..--] + [664].[bits 72 to 95] ∈ UNINITIALIZED + [664].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [664].f5 ∈ [--..--] + [664].[bits 136 to 159] ∈ UNINITIALIZED + [665].f1 ∈ [--..--] + [665].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [665].f3 ∈ [--..--] + [665].[bits 72 to 95] ∈ UNINITIALIZED + [665].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [665].f5 ∈ [--..--] + [665].[bits 136 to 159] ∈ UNINITIALIZED + [666].f1 ∈ [--..--] + [666].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [666].f3 ∈ [--..--] + [666].[bits 72 to 95] ∈ UNINITIALIZED + [666].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [666].f5 ∈ [--..--] + [666].[bits 136 to 159] ∈ UNINITIALIZED + [667].f1 ∈ [--..--] + [667].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [667].f3 ∈ [--..--] + [667].[bits 72 to 95] ∈ UNINITIALIZED + [667].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [667].f5 ∈ [--..--] + [667].[bits 136 to 159] ∈ UNINITIALIZED + [668].f1 ∈ [--..--] + [668].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [668].f3 ∈ [--..--] + [668].[bits 72 to 95] ∈ UNINITIALIZED + [668].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [668].f5 ∈ [--..--] + [668].[bits 136 to 159] ∈ UNINITIALIZED + [669].f1 ∈ [--..--] + [669].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [669].f3 ∈ [--..--] + [669].[bits 72 to 95] ∈ UNINITIALIZED + [669].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [669].f5 ∈ [--..--] + [669].[bits 136 to 159] ∈ UNINITIALIZED + [670].f1 ∈ [--..--] + [670].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [670].f3 ∈ [--..--] + [670].[bits 72 to 95] ∈ UNINITIALIZED + [670].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [670].f5 ∈ [--..--] + [670].[bits 136 to 159] ∈ UNINITIALIZED + [671].f1 ∈ [--..--] + [671].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [671].f3 ∈ [--..--] + [671].[bits 72 to 95] ∈ UNINITIALIZED + [671].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [671].f5 ∈ [--..--] + [671].[bits 136 to 159] ∈ UNINITIALIZED + [672].f1 ∈ [--..--] + [672].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [672].f3 ∈ [--..--] + [672].[bits 72 to 95] ∈ UNINITIALIZED + [672].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [672].f5 ∈ [--..--] + [672].[bits 136 to 159] ∈ UNINITIALIZED + [673].f1 ∈ [--..--] + [673].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [673].f3 ∈ [--..--] + [673].[bits 72 to 95] ∈ UNINITIALIZED + [673].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [673].f5 ∈ [--..--] + [673].[bits 136 to 159] ∈ UNINITIALIZED + [674].f1 ∈ [--..--] + [674].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [674].f3 ∈ [--..--] + [674].[bits 72 to 95] ∈ UNINITIALIZED + [674].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [674].f5 ∈ [--..--] + [674].[bits 136 to 159] ∈ UNINITIALIZED + [675].f1 ∈ [--..--] + [675].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [675].f3 ∈ [--..--] + [675].[bits 72 to 95] ∈ UNINITIALIZED + [675].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [675].f5 ∈ [--..--] + [675].[bits 136 to 159] ∈ UNINITIALIZED + [676].f1 ∈ [--..--] + [676].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [676].f3 ∈ [--..--] + [676].[bits 72 to 95] ∈ UNINITIALIZED + [676].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [676].f5 ∈ [--..--] + [676].[bits 136 to 159] ∈ UNINITIALIZED + [677].f1 ∈ [--..--] + [677].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [677].f3 ∈ [--..--] + [677].[bits 72 to 95] ∈ UNINITIALIZED + [677].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [677].f5 ∈ [--..--] + [677].[bits 136 to 159] ∈ UNINITIALIZED + [678].f1 ∈ [--..--] + [678].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [678].f3 ∈ [--..--] + [678].[bits 72 to 95] ∈ UNINITIALIZED + [678].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [678].f5 ∈ [--..--] + [678].[bits 136 to 159] ∈ UNINITIALIZED + [679].f1 ∈ [--..--] + [679].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [679].f3 ∈ [--..--] + [679].[bits 72 to 95] ∈ UNINITIALIZED + [679].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [679].f5 ∈ [--..--] + [679].[bits 136 to 159] ∈ UNINITIALIZED + [680].f1 ∈ [--..--] + [680].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [680].f3 ∈ [--..--] + [680].[bits 72 to 95] ∈ UNINITIALIZED + [680].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [680].f5 ∈ [--..--] + [680].[bits 136 to 159] ∈ UNINITIALIZED + [681].f1 ∈ [--..--] + [681].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [681].f3 ∈ [--..--] + [681].[bits 72 to 95] ∈ UNINITIALIZED + [681].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [681].f5 ∈ [--..--] + [681].[bits 136 to 159] ∈ UNINITIALIZED + [682].f1 ∈ [--..--] + [682].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [682].f3 ∈ [--..--] + [682].[bits 72 to 95] ∈ UNINITIALIZED + [682].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [682].f5 ∈ [--..--] + [682].[bits 136 to 159] ∈ UNINITIALIZED + [683].f1 ∈ [--..--] + [683].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [683].f3 ∈ [--..--] + [683].[bits 72 to 95] ∈ UNINITIALIZED + [683].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [683].f5 ∈ [--..--] + [683].[bits 136 to 159] ∈ UNINITIALIZED + [684].f1 ∈ [--..--] + [684].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [684].f3 ∈ [--..--] + [684].[bits 72 to 95] ∈ UNINITIALIZED + [684].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [684].f5 ∈ [--..--] + [684].[bits 136 to 159] ∈ UNINITIALIZED + [685].f1 ∈ [--..--] + [685].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [685].f3 ∈ [--..--] + [685].[bits 72 to 95] ∈ UNINITIALIZED + [685].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [685].f5 ∈ [--..--] + [685].[bits 136 to 159] ∈ UNINITIALIZED + [686].f1 ∈ [--..--] + [686].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [686].f3 ∈ [--..--] + [686].[bits 72 to 95] ∈ UNINITIALIZED + [686].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [686].f5 ∈ [--..--] + [686].[bits 136 to 159] ∈ UNINITIALIZED + [687].f1 ∈ [--..--] + [687].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [687].f3 ∈ [--..--] + [687].[bits 72 to 95] ∈ UNINITIALIZED + [687].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [687].f5 ∈ [--..--] + [687].[bits 136 to 159] ∈ UNINITIALIZED + [688].f1 ∈ [--..--] + [688].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [688].f3 ∈ [--..--] + [688].[bits 72 to 95] ∈ UNINITIALIZED + [688].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [688].f5 ∈ [--..--] + [688].[bits 136 to 159] ∈ UNINITIALIZED + [689].f1 ∈ [--..--] + [689].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [689].f3 ∈ [--..--] + [689].[bits 72 to 95] ∈ UNINITIALIZED + [689].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [689].f5 ∈ [--..--] + [689].[bits 136 to 159] ∈ UNINITIALIZED + [690].f1 ∈ [--..--] + [690].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [690].f3 ∈ [--..--] + [690].[bits 72 to 95] ∈ UNINITIALIZED + [690].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [690].f5 ∈ [--..--] + [690].[bits 136 to 159] ∈ UNINITIALIZED + [691].f1 ∈ [--..--] + [691].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [691].f3 ∈ [--..--] + [691].[bits 72 to 95] ∈ UNINITIALIZED + [691].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [691].f5 ∈ [--..--] + [691].[bits 136 to 159] ∈ UNINITIALIZED + [692].f1 ∈ [--..--] + [692].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [692].f3 ∈ [--..--] + [692].[bits 72 to 95] ∈ UNINITIALIZED + [692].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [692].f5 ∈ [--..--] + [692].[bits 136 to 159] ∈ UNINITIALIZED + [693].f1 ∈ [--..--] + [693].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [693].f3 ∈ [--..--] + [693].[bits 72 to 95] ∈ UNINITIALIZED + [693].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [693].f5 ∈ [--..--] + [693].[bits 136 to 159] ∈ UNINITIALIZED + [694].f1 ∈ [--..--] + [694].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [694].f3 ∈ [--..--] + [694].[bits 72 to 95] ∈ UNINITIALIZED + [694].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [694].f5 ∈ [--..--] + [694].[bits 136 to 159] ∈ UNINITIALIZED + [695].f1 ∈ [--..--] + [695].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [695].f3 ∈ [--..--] + [695].[bits 72 to 95] ∈ UNINITIALIZED + [695].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [695].f5 ∈ [--..--] + [695].[bits 136 to 159] ∈ UNINITIALIZED + [696].f1 ∈ [--..--] + [696].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [696].f3 ∈ [--..--] + [696].[bits 72 to 95] ∈ UNINITIALIZED + [696].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [696].f5 ∈ [--..--] + [696].[bits 136 to 159] ∈ UNINITIALIZED + [697].f1 ∈ [--..--] + [697].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [697].f3 ∈ [--..--] + [697].[bits 72 to 95] ∈ UNINITIALIZED + [697].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [697].f5 ∈ [--..--] + [697].[bits 136 to 159] ∈ UNINITIALIZED + [698].f1 ∈ [--..--] + [698].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [698].f3 ∈ [--..--] + [698].[bits 72 to 95] ∈ UNINITIALIZED + [698].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [698].f5 ∈ [--..--] + [698].[bits 136 to 159] ∈ UNINITIALIZED + [699].f1 ∈ [--..--] + [699].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [699].f3 ∈ [--..--] + [699].[bits 72 to 95] ∈ UNINITIALIZED + [699].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [699].f5 ∈ [--..--] + [699].[bits 136 to 159] ∈ UNINITIALIZED + [700].f1 ∈ [--..--] + [700].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [700].f3 ∈ [--..--] + [700].[bits 72 to 95] ∈ UNINITIALIZED + [700].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [700].f5 ∈ [--..--] + [700].[bits 136 to 159] ∈ UNINITIALIZED + [701].f1 ∈ [--..--] + [701].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [701].f3 ∈ [--..--] + [701].[bits 72 to 95] ∈ UNINITIALIZED + [701].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [701].f5 ∈ [--..--] + [701].[bits 136 to 159] ∈ UNINITIALIZED + [702].f1 ∈ [--..--] + [702].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [702].f3 ∈ [--..--] + [702].[bits 72 to 95] ∈ UNINITIALIZED + [702].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [702].f5 ∈ [--..--] + [702].[bits 136 to 159] ∈ UNINITIALIZED + [703].f1 ∈ [--..--] + [703].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [703].f3 ∈ [--..--] + [703].[bits 72 to 95] ∈ UNINITIALIZED + [703].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [703].f5 ∈ [--..--] + [703].[bits 136 to 159] ∈ UNINITIALIZED + [704].f1 ∈ [--..--] + [704].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [704].f3 ∈ [--..--] + [704].[bits 72 to 95] ∈ UNINITIALIZED + [704].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [704].f5 ∈ [--..--] + [704].[bits 136 to 159] ∈ UNINITIALIZED + [705].f1 ∈ [--..--] + [705].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [705].f3 ∈ [--..--] + [705].[bits 72 to 95] ∈ UNINITIALIZED + [705].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [705].f5 ∈ [--..--] + [705].[bits 136 to 159] ∈ UNINITIALIZED + [706].f1 ∈ [--..--] + [706].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [706].f3 ∈ [--..--] + [706].[bits 72 to 95] ∈ UNINITIALIZED + [706].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [706].f5 ∈ [--..--] + [706].[bits 136 to 159] ∈ UNINITIALIZED + [707].f1 ∈ [--..--] + [707].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [707].f3 ∈ [--..--] + [707].[bits 72 to 95] ∈ UNINITIALIZED + [707].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [707].f5 ∈ [--..--] + [707].[bits 136 to 159] ∈ UNINITIALIZED + [708].f1 ∈ [--..--] + [708].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [708].f3 ∈ [--..--] + [708].[bits 72 to 95] ∈ UNINITIALIZED + [708].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [708].f5 ∈ [--..--] + [708].[bits 136 to 159] ∈ UNINITIALIZED + [709].f1 ∈ [--..--] + [709].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [709].f3 ∈ [--..--] + [709].[bits 72 to 95] ∈ UNINITIALIZED + [709].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [709].f5 ∈ [--..--] + [709].[bits 136 to 159] ∈ UNINITIALIZED + [710].f1 ∈ [--..--] + [710].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [710].f3 ∈ [--..--] + [710].[bits 72 to 95] ∈ UNINITIALIZED + [710].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [710].f5 ∈ [--..--] + [710].[bits 136 to 159] ∈ UNINITIALIZED + [711].f1 ∈ [--..--] + [711].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [711].f3 ∈ [--..--] + [711].[bits 72 to 95] ∈ UNINITIALIZED + [711].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [711].f5 ∈ [--..--] + [711].[bits 136 to 159] ∈ UNINITIALIZED + [712].f1 ∈ [--..--] + [712].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [712].f3 ∈ [--..--] + [712].[bits 72 to 95] ∈ UNINITIALIZED + [712].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [712].f5 ∈ [--..--] + [712].[bits 136 to 159] ∈ UNINITIALIZED + [713].f1 ∈ [--..--] + [713].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [713].f3 ∈ [--..--] + [713].[bits 72 to 95] ∈ UNINITIALIZED + [713].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [713].f5 ∈ [--..--] + [713].[bits 136 to 159] ∈ UNINITIALIZED + [714].f1 ∈ [--..--] + [714].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [714].f3 ∈ [--..--] + [714].[bits 72 to 95] ∈ UNINITIALIZED + [714].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [714].f5 ∈ [--..--] + [714].[bits 136 to 159] ∈ UNINITIALIZED + [715].f1 ∈ [--..--] + [715].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [715].f3 ∈ [--..--] + [715].[bits 72 to 95] ∈ UNINITIALIZED + [715].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [715].f5 ∈ [--..--] + [715].[bits 136 to 159] ∈ UNINITIALIZED + [716].f1 ∈ [--..--] + [716].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [716].f3 ∈ [--..--] + [716].[bits 72 to 95] ∈ UNINITIALIZED + [716].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [716].f5 ∈ [--..--] + [716].[bits 136 to 159] ∈ UNINITIALIZED + [717].f1 ∈ [--..--] + [717].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [717].f3 ∈ [--..--] + [717].[bits 72 to 95] ∈ UNINITIALIZED + [717].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [717].f5 ∈ [--..--] + [717].[bits 136 to 159] ∈ UNINITIALIZED + [718].f1 ∈ [--..--] + [718].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [718].f3 ∈ [--..--] + [718].[bits 72 to 95] ∈ UNINITIALIZED + [718].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [718].f5 ∈ [--..--] + [718].[bits 136 to 159] ∈ UNINITIALIZED + [719].f1 ∈ [--..--] + [719].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [719].f3 ∈ [--..--] + [719].[bits 72 to 95] ∈ UNINITIALIZED + [719].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [719].f5 ∈ [--..--] + [719].[bits 136 to 159] ∈ UNINITIALIZED + [720].f1 ∈ [--..--] + [720].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [720].f3 ∈ [--..--] + [720].[bits 72 to 95] ∈ UNINITIALIZED + [720].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [720].f5 ∈ [--..--] + [720].[bits 136 to 159] ∈ UNINITIALIZED + [721].f1 ∈ [--..--] + [721].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [721].f3 ∈ [--..--] + [721].[bits 72 to 95] ∈ UNINITIALIZED + [721].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [721].f5 ∈ [--..--] + [721].[bits 136 to 159] ∈ UNINITIALIZED + [722].f1 ∈ [--..--] + [722].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [722].f3 ∈ [--..--] + [722].[bits 72 to 95] ∈ UNINITIALIZED + [722].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [722].f5 ∈ [--..--] + [722].[bits 136 to 159] ∈ UNINITIALIZED + [723].f1 ∈ [--..--] + [723].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [723].f3 ∈ [--..--] + [723].[bits 72 to 95] ∈ UNINITIALIZED + [723].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [723].f5 ∈ [--..--] + [723].[bits 136 to 159] ∈ UNINITIALIZED + [724].f1 ∈ [--..--] + [724].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [724].f3 ∈ [--..--] + [724].[bits 72 to 95] ∈ UNINITIALIZED + [724].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [724].f5 ∈ [--..--] + [724].[bits 136 to 159] ∈ UNINITIALIZED + [725].f1 ∈ [--..--] + [725].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [725].f3 ∈ [--..--] + [725].[bits 72 to 95] ∈ UNINITIALIZED + [725].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [725].f5 ∈ [--..--] + [725].[bits 136 to 159] ∈ UNINITIALIZED + [726].f1 ∈ [--..--] + [726].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [726].f3 ∈ [--..--] + [726].[bits 72 to 95] ∈ UNINITIALIZED + [726].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [726].f5 ∈ [--..--] + [726].[bits 136 to 159] ∈ UNINITIALIZED + [727].f1 ∈ [--..--] + [727].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [727].f3 ∈ [--..--] + [727].[bits 72 to 95] ∈ UNINITIALIZED + [727].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [727].f5 ∈ [--..--] + [727].[bits 136 to 159] ∈ UNINITIALIZED + [728].f1 ∈ [--..--] + [728].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [728].f3 ∈ [--..--] + [728].[bits 72 to 95] ∈ UNINITIALIZED + [728].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [728].f5 ∈ [--..--] + [728].[bits 136 to 159] ∈ UNINITIALIZED + [729].f1 ∈ [--..--] + [729].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [729].f3 ∈ [--..--] + [729].[bits 72 to 95] ∈ UNINITIALIZED + [729].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [729].f5 ∈ [--..--] + [729].[bits 136 to 159] ∈ UNINITIALIZED + [730].f1 ∈ [--..--] + [730].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [730].f3 ∈ [--..--] + [730].[bits 72 to 95] ∈ UNINITIALIZED + [730].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [730].f5 ∈ [--..--] + [730].[bits 136 to 159] ∈ UNINITIALIZED + [731].f1 ∈ [--..--] + [731].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [731].f3 ∈ [--..--] + [731].[bits 72 to 95] ∈ UNINITIALIZED + [731].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [731].f5 ∈ [--..--] + [731].[bits 136 to 159] ∈ UNINITIALIZED + [732].f1 ∈ [--..--] + [732].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [732].f3 ∈ [--..--] + [732].[bits 72 to 95] ∈ UNINITIALIZED + [732].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [732].f5 ∈ [--..--] + [732].[bits 136 to 159] ∈ UNINITIALIZED + [733].f1 ∈ [--..--] + [733].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [733].f3 ∈ [--..--] + [733].[bits 72 to 95] ∈ UNINITIALIZED + [733].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [733].f5 ∈ [--..--] + [733].[bits 136 to 159] ∈ UNINITIALIZED + [734].f1 ∈ [--..--] + [734].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [734].f3 ∈ [--..--] + [734].[bits 72 to 95] ∈ UNINITIALIZED + [734].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [734].f5 ∈ [--..--] + [734].[bits 136 to 159] ∈ UNINITIALIZED + [735].f1 ∈ [--..--] + [735].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [735].f3 ∈ [--..--] + [735].[bits 72 to 95] ∈ UNINITIALIZED + [735].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [735].f5 ∈ [--..--] + [735].[bits 136 to 159] ∈ UNINITIALIZED + [736].f1 ∈ [--..--] + [736].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [736].f3 ∈ [--..--] + [736].[bits 72 to 95] ∈ UNINITIALIZED + [736].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [736].f5 ∈ [--..--] + [736].[bits 136 to 159] ∈ UNINITIALIZED + [737].f1 ∈ [--..--] + [737].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [737].f3 ∈ [--..--] + [737].[bits 72 to 95] ∈ UNINITIALIZED + [737].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [737].f5 ∈ [--..--] + [737].[bits 136 to 159] ∈ UNINITIALIZED + [738].f1 ∈ [--..--] + [738].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [738].f3 ∈ [--..--] + [738].[bits 72 to 95] ∈ UNINITIALIZED + [738].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [738].f5 ∈ [--..--] + [738].[bits 136 to 159] ∈ UNINITIALIZED + [739].f1 ∈ [--..--] + [739].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [739].f3 ∈ [--..--] + [739].[bits 72 to 95] ∈ UNINITIALIZED + [739].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [739].f5 ∈ [--..--] + [739].[bits 136 to 159] ∈ UNINITIALIZED + [740].f1 ∈ [--..--] + [740].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [740].f3 ∈ [--..--] + [740].[bits 72 to 95] ∈ UNINITIALIZED + [740].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [740].f5 ∈ [--..--] + [740].[bits 136 to 159] ∈ UNINITIALIZED + [741].f1 ∈ [--..--] + [741].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [741].f3 ∈ [--..--] + [741].[bits 72 to 95] ∈ UNINITIALIZED + [741].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [741].f5 ∈ [--..--] + [741].[bits 136 to 159] ∈ UNINITIALIZED + [742].f1 ∈ [--..--] + [742].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [742].f3 ∈ [--..--] + [742].[bits 72 to 95] ∈ UNINITIALIZED + [742].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [742].f5 ∈ [--..--] + [742].[bits 136 to 159] ∈ UNINITIALIZED + [743].f1 ∈ [--..--] + [743].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [743].f3 ∈ [--..--] + [743].[bits 72 to 95] ∈ UNINITIALIZED + [743].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [743].f5 ∈ [--..--] + [743].[bits 136 to 159] ∈ UNINITIALIZED + [744].f1 ∈ [--..--] + [744].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [744].f3 ∈ [--..--] + [744].[bits 72 to 95] ∈ UNINITIALIZED + [744].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [744].f5 ∈ [--..--] + [744].[bits 136 to 159] ∈ UNINITIALIZED + [745].f1 ∈ [--..--] + [745].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [745].f3 ∈ [--..--] + [745].[bits 72 to 95] ∈ UNINITIALIZED + [745].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [745].f5 ∈ [--..--] + [745].[bits 136 to 159] ∈ UNINITIALIZED + [746].f1 ∈ [--..--] + [746].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [746].f3 ∈ [--..--] + [746].[bits 72 to 95] ∈ UNINITIALIZED + [746].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [746].f5 ∈ [--..--] + [746].[bits 136 to 159] ∈ UNINITIALIZED + [747].f1 ∈ [--..--] + [747].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [747].f3 ∈ [--..--] + [747].[bits 72 to 95] ∈ UNINITIALIZED + [747].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [747].f5 ∈ [--..--] + [747].[bits 136 to 159] ∈ UNINITIALIZED + [748].f1 ∈ [--..--] + [748].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [748].f3 ∈ [--..--] + [748].[bits 72 to 95] ∈ UNINITIALIZED + [748].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [748].f5 ∈ [--..--] + [748].[bits 136 to 159] ∈ UNINITIALIZED + [749].f1 ∈ [--..--] + [749].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [749].f3 ∈ [--..--] + [749].[bits 72 to 95] ∈ UNINITIALIZED + [749].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [749].f5 ∈ [--..--] + [749].[bits 136 to 159] ∈ UNINITIALIZED + [750].f1 ∈ [--..--] + [750].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [750].f3 ∈ [--..--] + [750].[bits 72 to 95] ∈ UNINITIALIZED + [750].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [750].f5 ∈ [--..--] + [750].[bits 136 to 159] ∈ UNINITIALIZED + [751].f1 ∈ [--..--] + [751].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [751].f3 ∈ [--..--] + [751].[bits 72 to 95] ∈ UNINITIALIZED + [751].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [751].f5 ∈ [--..--] + [751].[bits 136 to 159] ∈ UNINITIALIZED + [752].f1 ∈ [--..--] + [752].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [752].f3 ∈ [--..--] + [752].[bits 72 to 95] ∈ UNINITIALIZED + [752].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [752].f5 ∈ [--..--] + [752].[bits 136 to 159] ∈ UNINITIALIZED + [753].f1 ∈ [--..--] + [753].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [753].f3 ∈ [--..--] + [753].[bits 72 to 95] ∈ UNINITIALIZED + [753].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [753].f5 ∈ [--..--] + [753].[bits 136 to 159] ∈ UNINITIALIZED + [754].f1 ∈ [--..--] + [754].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [754].f3 ∈ [--..--] + [754].[bits 72 to 95] ∈ UNINITIALIZED + [754].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [754].f5 ∈ [--..--] + [754].[bits 136 to 159] ∈ UNINITIALIZED + [755].f1 ∈ [--..--] + [755].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [755].f3 ∈ [--..--] + [755].[bits 72 to 95] ∈ UNINITIALIZED + [755].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [755].f5 ∈ [--..--] + [755].[bits 136 to 159] ∈ UNINITIALIZED + [756].f1 ∈ [--..--] + [756].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [756].f3 ∈ [--..--] + [756].[bits 72 to 95] ∈ UNINITIALIZED + [756].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [756].f5 ∈ [--..--] + [756].[bits 136 to 159] ∈ UNINITIALIZED + [757].f1 ∈ [--..--] + [757].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [757].f3 ∈ [--..--] + [757].[bits 72 to 95] ∈ UNINITIALIZED + [757].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [757].f5 ∈ [--..--] + [757].[bits 136 to 159] ∈ UNINITIALIZED + [758].f1 ∈ [--..--] + [758].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [758].f3 ∈ [--..--] + [758].[bits 72 to 95] ∈ UNINITIALIZED + [758].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [758].f5 ∈ [--..--] + [758].[bits 136 to 159] ∈ UNINITIALIZED + [759].f1 ∈ [--..--] + [759].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [759].f3 ∈ [--..--] + [759].[bits 72 to 95] ∈ UNINITIALIZED + [759].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [759].f5 ∈ [--..--] + [759].[bits 136 to 159] ∈ UNINITIALIZED + [760].f1 ∈ [--..--] + [760].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [760].f3 ∈ [--..--] + [760].[bits 72 to 95] ∈ UNINITIALIZED + [760].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [760].f5 ∈ [--..--] + [760].[bits 136 to 159] ∈ UNINITIALIZED + [761].f1 ∈ [--..--] + [761].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [761].f3 ∈ [--..--] + [761].[bits 72 to 95] ∈ UNINITIALIZED + [761].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [761].f5 ∈ [--..--] + [761].[bits 136 to 159] ∈ UNINITIALIZED + [762].f1 ∈ [--..--] + [762].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [762].f3 ∈ [--..--] + [762].[bits 72 to 95] ∈ UNINITIALIZED + [762].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [762].f5 ∈ [--..--] + [762].[bits 136 to 159] ∈ UNINITIALIZED + [763].f1 ∈ [--..--] + [763].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [763].f3 ∈ [--..--] + [763].[bits 72 to 95] ∈ UNINITIALIZED + [763].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [763].f5 ∈ [--..--] + [763].[bits 136 to 159] ∈ UNINITIALIZED + [764].f1 ∈ [--..--] + [764].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [764].f3 ∈ [--..--] + [764].[bits 72 to 95] ∈ UNINITIALIZED + [764].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [764].f5 ∈ [--..--] + [764].[bits 136 to 159] ∈ UNINITIALIZED + [765].f1 ∈ [--..--] + [765].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [765].f3 ∈ [--..--] + [765].[bits 72 to 95] ∈ UNINITIALIZED + [765].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [765].f5 ∈ [--..--] + [765].[bits 136 to 159] ∈ UNINITIALIZED + [766].f1 ∈ [--..--] + [766].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [766].f3 ∈ [--..--] + [766].[bits 72 to 95] ∈ UNINITIALIZED + [766].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [766].f5 ∈ [--..--] + [766].[bits 136 to 159] ∈ UNINITIALIZED + [767].f1 ∈ [--..--] + [767].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [767].f3 ∈ [--..--] + [767].[bits 72 to 95] ∈ UNINITIALIZED + [767].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [767].f5 ∈ [--..--] + [767].[bits 136 to 159] ∈ UNINITIALIZED + [768].f1 ∈ [--..--] + [768].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [768].f3 ∈ [--..--] + [768].[bits 72 to 95] ∈ UNINITIALIZED + [768].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [768].f5 ∈ [--..--] + [768].[bits 136 to 159] ∈ UNINITIALIZED + [769].f1 ∈ [--..--] + [769].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [769].f3 ∈ [--..--] + [769].[bits 72 to 95] ∈ UNINITIALIZED + [769].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [769].f5 ∈ [--..--] + [769].[bits 136 to 159] ∈ UNINITIALIZED + [770].f1 ∈ [--..--] + [770].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [770].f3 ∈ [--..--] + [770].[bits 72 to 95] ∈ UNINITIALIZED + [770].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [770].f5 ∈ [--..--] + [770].[bits 136 to 159] ∈ UNINITIALIZED + [771].f1 ∈ [--..--] + [771].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [771].f3 ∈ [--..--] + [771].[bits 72 to 95] ∈ UNINITIALIZED + [771].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [771].f5 ∈ [--..--] + [771].[bits 136 to 159] ∈ UNINITIALIZED + [772].f1 ∈ [--..--] + [772].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [772].f3 ∈ [--..--] + [772].[bits 72 to 95] ∈ UNINITIALIZED + [772].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [772].f5 ∈ [--..--] + [772].[bits 136 to 159] ∈ UNINITIALIZED + [773].f1 ∈ [--..--] + [773].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [773].f3 ∈ [--..--] + [773].[bits 72 to 95] ∈ UNINITIALIZED + [773].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [773].f5 ∈ [--..--] + [773].[bits 136 to 159] ∈ UNINITIALIZED + [774].f1 ∈ [--..--] + [774].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [774].f3 ∈ [--..--] + [774].[bits 72 to 95] ∈ UNINITIALIZED + [774].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [774].f5 ∈ [--..--] + [774].[bits 136 to 159] ∈ UNINITIALIZED + [775].f1 ∈ [--..--] + [775].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [775].f3 ∈ [--..--] + [775].[bits 72 to 95] ∈ UNINITIALIZED + [775].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [775].f5 ∈ [--..--] + [775].[bits 136 to 159] ∈ UNINITIALIZED + [776].f1 ∈ [--..--] + [776].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [776].f3 ∈ [--..--] + [776].[bits 72 to 95] ∈ UNINITIALIZED + [776].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [776].f5 ∈ [--..--] + [776].[bits 136 to 159] ∈ UNINITIALIZED + [777].f1 ∈ [--..--] + [777].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [777].f3 ∈ [--..--] + [777].[bits 72 to 95] ∈ UNINITIALIZED + [777].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [777].f5 ∈ [--..--] + [777].[bits 136 to 159] ∈ UNINITIALIZED + [778].f1 ∈ [--..--] + [778].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [778].f3 ∈ [--..--] + [778].[bits 72 to 95] ∈ UNINITIALIZED + [778].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [778].f5 ∈ [--..--] + [778].[bits 136 to 159] ∈ UNINITIALIZED + [779].f1 ∈ [--..--] + [779].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [779].f3 ∈ [--..--] + [779].[bits 72 to 95] ∈ UNINITIALIZED + [779].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [779].f5 ∈ [--..--] + [779].[bits 136 to 159] ∈ UNINITIALIZED + [780].f1 ∈ [--..--] + [780].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [780].f3 ∈ [--..--] + [780].[bits 72 to 95] ∈ UNINITIALIZED + [780].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [780].f5 ∈ [--..--] + [780].[bits 136 to 159] ∈ UNINITIALIZED + [781].f1 ∈ [--..--] + [781].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [781].f3 ∈ [--..--] + [781].[bits 72 to 95] ∈ UNINITIALIZED + [781].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [781].f5 ∈ [--..--] + [781].[bits 136 to 159] ∈ UNINITIALIZED + [782].f1 ∈ [--..--] + [782].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [782].f3 ∈ [--..--] + [782].[bits 72 to 95] ∈ UNINITIALIZED + [782].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [782].f5 ∈ [--..--] + [782].[bits 136 to 159] ∈ UNINITIALIZED + [783].f1 ∈ [--..--] + [783].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [783].f3 ∈ [--..--] + [783].[bits 72 to 95] ∈ UNINITIALIZED + [783].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [783].f5 ∈ [--..--] + [783].[bits 136 to 159] ∈ UNINITIALIZED + [784].f1 ∈ [--..--] + [784].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [784].f3 ∈ [--..--] + [784].[bits 72 to 95] ∈ UNINITIALIZED + [784].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [784].f5 ∈ [--..--] + [784].[bits 136 to 159] ∈ UNINITIALIZED + [785].f1 ∈ [--..--] + [785].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [785].f3 ∈ [--..--] + [785].[bits 72 to 95] ∈ UNINITIALIZED + [785].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [785].f5 ∈ [--..--] + [785].[bits 136 to 159] ∈ UNINITIALIZED + [786].f1 ∈ [--..--] + [786].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [786].f3 ∈ [--..--] + [786].[bits 72 to 95] ∈ UNINITIALIZED + [786].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [786].f5 ∈ [--..--] + [786].[bits 136 to 159] ∈ UNINITIALIZED + [787].f1 ∈ [--..--] + [787].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [787].f3 ∈ [--..--] + [787].[bits 72 to 95] ∈ UNINITIALIZED + [787].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [787].f5 ∈ [--..--] + [787].[bits 136 to 159] ∈ UNINITIALIZED + [788].f1 ∈ [--..--] + [788].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [788].f3 ∈ [--..--] + [788].[bits 72 to 95] ∈ UNINITIALIZED + [788].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [788].f5 ∈ [--..--] + [788].[bits 136 to 159] ∈ UNINITIALIZED + [789].f1 ∈ [--..--] + [789].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [789].f3 ∈ [--..--] + [789].[bits 72 to 95] ∈ UNINITIALIZED + [789].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [789].f5 ∈ [--..--] + [789].[bits 136 to 159] ∈ UNINITIALIZED + [790].f1 ∈ [--..--] + [790].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [790].f3 ∈ [--..--] + [790].[bits 72 to 95] ∈ UNINITIALIZED + [790].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [790].f5 ∈ [--..--] + [790].[bits 136 to 159] ∈ UNINITIALIZED + [791].f1 ∈ [--..--] + [791].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [791].f3 ∈ [--..--] + [791].[bits 72 to 95] ∈ UNINITIALIZED + [791].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [791].f5 ∈ [--..--] + [791].[bits 136 to 159] ∈ UNINITIALIZED + [792].f1 ∈ [--..--] + [792].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [792].f3 ∈ [--..--] + [792].[bits 72 to 95] ∈ UNINITIALIZED + [792].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [792].f5 ∈ [--..--] + [792].[bits 136 to 159] ∈ UNINITIALIZED + [793].f1 ∈ [--..--] + [793].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [793].f3 ∈ [--..--] + [793].[bits 72 to 95] ∈ UNINITIALIZED + [793].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [793].f5 ∈ [--..--] + [793].[bits 136 to 159] ∈ UNINITIALIZED + [794].f1 ∈ [--..--] + [794].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [794].f3 ∈ [--..--] + [794].[bits 72 to 95] ∈ UNINITIALIZED + [794].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [794].f5 ∈ [--..--] + [794].[bits 136 to 159] ∈ UNINITIALIZED + [795].f1 ∈ [--..--] + [795].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [795].f3 ∈ [--..--] + [795].[bits 72 to 95] ∈ UNINITIALIZED + [795].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [795].f5 ∈ [--..--] + [795].[bits 136 to 159] ∈ UNINITIALIZED + [796].f1 ∈ [--..--] + [796].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [796].f3 ∈ [--..--] + [796].[bits 72 to 95] ∈ UNINITIALIZED + [796].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [796].f5 ∈ [--..--] + [796].[bits 136 to 159] ∈ UNINITIALIZED + [797].f1 ∈ [--..--] + [797].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [797].f3 ∈ [--..--] + [797].[bits 72 to 95] ∈ UNINITIALIZED + [797].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [797].f5 ∈ [--..--] + [797].[bits 136 to 159] ∈ UNINITIALIZED + [798].f1 ∈ [--..--] + [798].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [798].f3 ∈ [--..--] + [798].[bits 72 to 95] ∈ UNINITIALIZED + [798].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [798].f5 ∈ [--..--] + [798].[bits 136 to 159] ∈ UNINITIALIZED + [799].f1 ∈ [--..--] + [799].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [799].f3 ∈ [--..--] + [799].[bits 72 to 95] ∈ UNINITIALIZED + [799].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [799].f5 ∈ [--..--] + [799].[bits 136 to 159] ∈ UNINITIALIZED + [800].f1 ∈ [--..--] + [800].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [800].f3 ∈ [--..--] + [800].[bits 72 to 95] ∈ UNINITIALIZED + [800].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [800].f5 ∈ [--..--] + [800].[bits 136 to 159] ∈ UNINITIALIZED + [801].f1 ∈ [--..--] + [801].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [801].f3 ∈ [--..--] + [801].[bits 72 to 95] ∈ UNINITIALIZED + [801].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [801].f5 ∈ [--..--] + [801].[bits 136 to 159] ∈ UNINITIALIZED + [802].f1 ∈ [--..--] + [802].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [802].f3 ∈ [--..--] + [802].[bits 72 to 95] ∈ UNINITIALIZED + [802].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [802].f5 ∈ [--..--] + [802].[bits 136 to 159] ∈ UNINITIALIZED + [803].f1 ∈ [--..--] + [803].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [803].f3 ∈ [--..--] + [803].[bits 72 to 95] ∈ UNINITIALIZED + [803].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [803].f5 ∈ [--..--] + [803].[bits 136 to 159] ∈ UNINITIALIZED + [804].f1 ∈ [--..--] + [804].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [804].f3 ∈ [--..--] + [804].[bits 72 to 95] ∈ UNINITIALIZED + [804].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [804].f5 ∈ [--..--] + [804].[bits 136 to 159] ∈ UNINITIALIZED + [805].f1 ∈ [--..--] + [805].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [805].f3 ∈ [--..--] + [805].[bits 72 to 95] ∈ UNINITIALIZED + [805].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [805].f5 ∈ [--..--] + [805].[bits 136 to 159] ∈ UNINITIALIZED + [806].f1 ∈ [--..--] + [806].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [806].f3 ∈ [--..--] + [806].[bits 72 to 95] ∈ UNINITIALIZED + [806].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [806].f5 ∈ [--..--] + [806].[bits 136 to 159] ∈ UNINITIALIZED + [807].f1 ∈ [--..--] + [807].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [807].f3 ∈ [--..--] + [807].[bits 72 to 95] ∈ UNINITIALIZED + [807].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [807].f5 ∈ [--..--] + [807].[bits 136 to 159] ∈ UNINITIALIZED + [808].f1 ∈ [--..--] + [808].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [808].f3 ∈ [--..--] + [808].[bits 72 to 95] ∈ UNINITIALIZED + [808].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [808].f5 ∈ [--..--] + [808].[bits 136 to 159] ∈ UNINITIALIZED + [809].f1 ∈ [--..--] + [809].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [809].f3 ∈ [--..--] + [809].[bits 72 to 95] ∈ UNINITIALIZED + [809].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [809].f5 ∈ [--..--] + [809].[bits 136 to 159] ∈ UNINITIALIZED + [810].f1 ∈ [--..--] + [810].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [810].f3 ∈ [--..--] + [810].[bits 72 to 95] ∈ UNINITIALIZED + [810].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [810].f5 ∈ [--..--] + [810].[bits 136 to 159] ∈ UNINITIALIZED + [811].f1 ∈ [--..--] + [811].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [811].f3 ∈ [--..--] + [811].[bits 72 to 95] ∈ UNINITIALIZED + [811].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [811].f5 ∈ [--..--] + [811].[bits 136 to 159] ∈ UNINITIALIZED + [812].f1 ∈ [--..--] + [812].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [812].f3 ∈ [--..--] + [812].[bits 72 to 95] ∈ UNINITIALIZED + [812].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [812].f5 ∈ [--..--] + [812].[bits 136 to 159] ∈ UNINITIALIZED + [813].f1 ∈ [--..--] + [813].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [813].f3 ∈ [--..--] + [813].[bits 72 to 95] ∈ UNINITIALIZED + [813].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [813].f5 ∈ [--..--] + [813].[bits 136 to 159] ∈ UNINITIALIZED + [814].f1 ∈ [--..--] + [814].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [814].f3 ∈ [--..--] + [814].[bits 72 to 95] ∈ UNINITIALIZED + [814].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [814].f5 ∈ [--..--] + [814].[bits 136 to 159] ∈ UNINITIALIZED + [815].f1 ∈ [--..--] + [815].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [815].f3 ∈ [--..--] + [815].[bits 72 to 95] ∈ UNINITIALIZED + [815].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [815].f5 ∈ [--..--] + [815].[bits 136 to 159] ∈ UNINITIALIZED + [816].f1 ∈ [--..--] + [816].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [816].f3 ∈ [--..--] + [816].[bits 72 to 95] ∈ UNINITIALIZED + [816].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [816].f5 ∈ [--..--] + [816].[bits 136 to 159] ∈ UNINITIALIZED + [817].f1 ∈ [--..--] + [817].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [817].f3 ∈ [--..--] + [817].[bits 72 to 95] ∈ UNINITIALIZED + [817].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [817].f5 ∈ [--..--] + [817].[bits 136 to 159] ∈ UNINITIALIZED + [818].f1 ∈ [--..--] + [818].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [818].f3 ∈ [--..--] + [818].[bits 72 to 95] ∈ UNINITIALIZED + [818].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [818].f5 ∈ [--..--] + [818].[bits 136 to 159] ∈ UNINITIALIZED + [819].f1 ∈ [--..--] + [819].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [819].f3 ∈ [--..--] + [819].[bits 72 to 95] ∈ UNINITIALIZED + [819].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [819].f5 ∈ [--..--] + [819].[bits 136 to 159] ∈ UNINITIALIZED + [820].f1 ∈ [--..--] + [820].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [820].f3 ∈ [--..--] + [820].[bits 72 to 95] ∈ UNINITIALIZED + [820].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [820].f5 ∈ [--..--] + [820].[bits 136 to 159] ∈ UNINITIALIZED + [821].f1 ∈ [--..--] + [821].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [821].f3 ∈ [--..--] + [821].[bits 72 to 95] ∈ UNINITIALIZED + [821].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [821].f5 ∈ [--..--] + [821].[bits 136 to 159] ∈ UNINITIALIZED + [822].f1 ∈ [--..--] + [822].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [822].f3 ∈ [--..--] + [822].[bits 72 to 95] ∈ UNINITIALIZED + [822].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [822].f5 ∈ [--..--] + [822].[bits 136 to 159] ∈ UNINITIALIZED + [823].f1 ∈ [--..--] + [823].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [823].f3 ∈ [--..--] + [823].[bits 72 to 95] ∈ UNINITIALIZED + [823].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [823].f5 ∈ [--..--] + [823].[bits 136 to 159] ∈ UNINITIALIZED + [824].f1 ∈ [--..--] + [824].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [824].f3 ∈ [--..--] + [824].[bits 72 to 95] ∈ UNINITIALIZED + [824].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [824].f5 ∈ [--..--] + [824].[bits 136 to 159] ∈ UNINITIALIZED + [825].f1 ∈ [--..--] + [825].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [825].f3 ∈ [--..--] + [825].[bits 72 to 95] ∈ UNINITIALIZED + [825].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [825].f5 ∈ [--..--] + [825].[bits 136 to 159] ∈ UNINITIALIZED + [826].f1 ∈ [--..--] + [826].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [826].f3 ∈ [--..--] + [826].[bits 72 to 95] ∈ UNINITIALIZED + [826].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [826].f5 ∈ [--..--] + [826].[bits 136 to 159] ∈ UNINITIALIZED + [827].f1 ∈ [--..--] + [827].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [827].f3 ∈ [--..--] + [827].[bits 72 to 95] ∈ UNINITIALIZED + [827].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [827].f5 ∈ [--..--] + [827].[bits 136 to 159] ∈ UNINITIALIZED + [828].f1 ∈ [--..--] + [828].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [828].f3 ∈ [--..--] + [828].[bits 72 to 95] ∈ UNINITIALIZED + [828].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [828].f5 ∈ [--..--] + [828].[bits 136 to 159] ∈ UNINITIALIZED + [829].f1 ∈ [--..--] + [829].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [829].f3 ∈ [--..--] + [829].[bits 72 to 95] ∈ UNINITIALIZED + [829].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [829].f5 ∈ [--..--] + [829].[bits 136 to 159] ∈ UNINITIALIZED + [830].f1 ∈ [--..--] + [830].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [830].f3 ∈ [--..--] + [830].[bits 72 to 95] ∈ UNINITIALIZED + [830].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [830].f5 ∈ [--..--] + [830].[bits 136 to 159] ∈ UNINITIALIZED + [831].f1 ∈ [--..--] + [831].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [831].f3 ∈ [--..--] + [831].[bits 72 to 95] ∈ UNINITIALIZED + [831].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [831].f5 ∈ [--..--] + [831].[bits 136 to 159] ∈ UNINITIALIZED + [832].f1 ∈ [--..--] + [832].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [832].f3 ∈ [--..--] + [832].[bits 72 to 95] ∈ UNINITIALIZED + [832].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [832].f5 ∈ [--..--] + [832].[bits 136 to 159] ∈ UNINITIALIZED + [833].f1 ∈ [--..--] + [833].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [833].f3 ∈ [--..--] + [833].[bits 72 to 95] ∈ UNINITIALIZED + [833].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [833].f5 ∈ [--..--] + [833].[bits 136 to 159] ∈ UNINITIALIZED + [834].f1 ∈ [--..--] + [834].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [834].f3 ∈ [--..--] + [834].[bits 72 to 95] ∈ UNINITIALIZED + [834].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [834].f5 ∈ [--..--] + [834].[bits 136 to 159] ∈ UNINITIALIZED + [835].f1 ∈ [--..--] + [835].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [835].f3 ∈ [--..--] + [835].[bits 72 to 95] ∈ UNINITIALIZED + [835].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [835].f5 ∈ [--..--] + [835].[bits 136 to 159] ∈ UNINITIALIZED + [836].f1 ∈ [--..--] + [836].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [836].f3 ∈ [--..--] + [836].[bits 72 to 95] ∈ UNINITIALIZED + [836].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [836].f5 ∈ [--..--] + [836].[bits 136 to 159] ∈ UNINITIALIZED + [837].f1 ∈ [--..--] + [837].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [837].f3 ∈ [--..--] + [837].[bits 72 to 95] ∈ UNINITIALIZED + [837].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [837].f5 ∈ [--..--] + [837].[bits 136 to 159] ∈ UNINITIALIZED + [838].f1 ∈ [--..--] + [838].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [838].f3 ∈ [--..--] + [838].[bits 72 to 95] ∈ UNINITIALIZED + [838].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [838].f5 ∈ [--..--] + [838].[bits 136 to 159] ∈ UNINITIALIZED + [839].f1 ∈ [--..--] + [839].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [839].f3 ∈ [--..--] + [839].[bits 72 to 95] ∈ UNINITIALIZED + [839].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [839].f5 ∈ [--..--] + [839].[bits 136 to 159] ∈ UNINITIALIZED + [840].f1 ∈ [--..--] + [840].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [840].f3 ∈ [--..--] + [840].[bits 72 to 95] ∈ UNINITIALIZED + [840].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [840].f5 ∈ [--..--] + [840].[bits 136 to 159] ∈ UNINITIALIZED + [841].f1 ∈ [--..--] + [841].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [841].f3 ∈ [--..--] + [841].[bits 72 to 95] ∈ UNINITIALIZED + [841].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [841].f5 ∈ [--..--] + [841].[bits 136 to 159] ∈ UNINITIALIZED + [842].f1 ∈ [--..--] + [842].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [842].f3 ∈ [--..--] + [842].[bits 72 to 95] ∈ UNINITIALIZED + [842].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [842].f5 ∈ [--..--] + [842].[bits 136 to 159] ∈ UNINITIALIZED + [843].f1 ∈ [--..--] + [843].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [843].f3 ∈ [--..--] + [843].[bits 72 to 95] ∈ UNINITIALIZED + [843].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [843].f5 ∈ [--..--] + [843].[bits 136 to 159] ∈ UNINITIALIZED + [844].f1 ∈ [--..--] + [844].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [844].f3 ∈ [--..--] + [844].[bits 72 to 95] ∈ UNINITIALIZED + [844].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [844].f5 ∈ [--..--] + [844].[bits 136 to 159] ∈ UNINITIALIZED + [845].f1 ∈ [--..--] + [845].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [845].f3 ∈ [--..--] + [845].[bits 72 to 95] ∈ UNINITIALIZED + [845].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [845].f5 ∈ [--..--] + [845].[bits 136 to 159] ∈ UNINITIALIZED + [846].f1 ∈ [--..--] + [846].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [846].f3 ∈ [--..--] + [846].[bits 72 to 95] ∈ UNINITIALIZED + [846].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [846].f5 ∈ [--..--] + [846].[bits 136 to 159] ∈ UNINITIALIZED + [847].f1 ∈ [--..--] + [847].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [847].f3 ∈ [--..--] + [847].[bits 72 to 95] ∈ UNINITIALIZED + [847].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [847].f5 ∈ [--..--] + [847].[bits 136 to 159] ∈ UNINITIALIZED + [848].f1 ∈ [--..--] + [848].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [848].f3 ∈ [--..--] + [848].[bits 72 to 95] ∈ UNINITIALIZED + [848].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [848].f5 ∈ [--..--] + [848].[bits 136 to 159] ∈ UNINITIALIZED + [849].f1 ∈ [--..--] + [849].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [849].f3 ∈ [--..--] + [849].[bits 72 to 95] ∈ UNINITIALIZED + [849].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [849].f5 ∈ [--..--] + [849].[bits 136 to 159] ∈ UNINITIALIZED + [850].f1 ∈ [--..--] + [850].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [850].f3 ∈ [--..--] + [850].[bits 72 to 95] ∈ UNINITIALIZED + [850].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [850].f5 ∈ [--..--] + [850].[bits 136 to 159] ∈ UNINITIALIZED + [851].f1 ∈ [--..--] + [851].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [851].f3 ∈ [--..--] + [851].[bits 72 to 95] ∈ UNINITIALIZED + [851].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [851].f5 ∈ [--..--] + [851].[bits 136 to 159] ∈ UNINITIALIZED + [852].f1 ∈ [--..--] + [852].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [852].f3 ∈ [--..--] + [852].[bits 72 to 95] ∈ UNINITIALIZED + [852].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [852].f5 ∈ [--..--] + [852].[bits 136 to 159] ∈ UNINITIALIZED + [853].f1 ∈ [--..--] + [853].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [853].f3 ∈ [--..--] + [853].[bits 72 to 95] ∈ UNINITIALIZED + [853].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [853].f5 ∈ [--..--] + [853].[bits 136 to 159] ∈ UNINITIALIZED + [854].f1 ∈ [--..--] + [854].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [854].f3 ∈ [--..--] + [854].[bits 72 to 95] ∈ UNINITIALIZED + [854].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [854].f5 ∈ [--..--] + [854].[bits 136 to 159] ∈ UNINITIALIZED + [855].f1 ∈ [--..--] + [855].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [855].f3 ∈ [--..--] + [855].[bits 72 to 95] ∈ UNINITIALIZED + [855].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [855].f5 ∈ [--..--] + [855].[bits 136 to 159] ∈ UNINITIALIZED + [856].f1 ∈ [--..--] + [856].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [856].f3 ∈ [--..--] + [856].[bits 72 to 95] ∈ UNINITIALIZED + [856].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [856].f5 ∈ [--..--] + [856].[bits 136 to 159] ∈ UNINITIALIZED + [857].f1 ∈ [--..--] + [857].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [857].f3 ∈ [--..--] + [857].[bits 72 to 95] ∈ UNINITIALIZED + [857].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [857].f5 ∈ [--..--] + [857].[bits 136 to 159] ∈ UNINITIALIZED + [858].f1 ∈ [--..--] + [858].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [858].f3 ∈ [--..--] + [858].[bits 72 to 95] ∈ UNINITIALIZED + [858].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [858].f5 ∈ [--..--] + [858].[bits 136 to 159] ∈ UNINITIALIZED + [859].f1 ∈ [--..--] + [859].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [859].f3 ∈ [--..--] + [859].[bits 72 to 95] ∈ UNINITIALIZED + [859].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [859].f5 ∈ [--..--] + [859].[bits 136 to 159] ∈ UNINITIALIZED + [860].f1 ∈ [--..--] + [860].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [860].f3 ∈ [--..--] + [860].[bits 72 to 95] ∈ UNINITIALIZED + [860].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [860].f5 ∈ [--..--] + [860].[bits 136 to 159] ∈ UNINITIALIZED + [861].f1 ∈ [--..--] + [861].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [861].f3 ∈ [--..--] + [861].[bits 72 to 95] ∈ UNINITIALIZED + [861].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [861].f5 ∈ [--..--] + [861].[bits 136 to 159] ∈ UNINITIALIZED + [862].f1 ∈ [--..--] + [862].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [862].f3 ∈ [--..--] + [862].[bits 72 to 95] ∈ UNINITIALIZED + [862].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [862].f5 ∈ [--..--] + [862].[bits 136 to 159] ∈ UNINITIALIZED + [863].f1 ∈ [--..--] + [863].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [863].f3 ∈ [--..--] + [863].[bits 72 to 95] ∈ UNINITIALIZED + [863].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [863].f5 ∈ [--..--] + [863].[bits 136 to 159] ∈ UNINITIALIZED + [864].f1 ∈ [--..--] + [864].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [864].f3 ∈ [--..--] + [864].[bits 72 to 95] ∈ UNINITIALIZED + [864].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [864].f5 ∈ [--..--] + [864].[bits 136 to 159] ∈ UNINITIALIZED + [865].f1 ∈ [--..--] + [865].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [865].f3 ∈ [--..--] + [865].[bits 72 to 95] ∈ UNINITIALIZED + [865].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [865].f5 ∈ [--..--] + [865].[bits 136 to 159] ∈ UNINITIALIZED + [866].f1 ∈ [--..--] + [866].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [866].f3 ∈ [--..--] + [866].[bits 72 to 95] ∈ UNINITIALIZED + [866].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [866].f5 ∈ [--..--] + [866].[bits 136 to 159] ∈ UNINITIALIZED + [867].f1 ∈ [--..--] + [867].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [867].f3 ∈ [--..--] + [867].[bits 72 to 95] ∈ UNINITIALIZED + [867].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [867].f5 ∈ [--..--] + [867].[bits 136 to 159] ∈ UNINITIALIZED + [868].f1 ∈ [--..--] + [868].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [868].f3 ∈ [--..--] + [868].[bits 72 to 95] ∈ UNINITIALIZED + [868].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [868].f5 ∈ [--..--] + [868].[bits 136 to 159] ∈ UNINITIALIZED + [869].f1 ∈ [--..--] + [869].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [869].f3 ∈ [--..--] + [869].[bits 72 to 95] ∈ UNINITIALIZED + [869].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [869].f5 ∈ [--..--] + [869].[bits 136 to 159] ∈ UNINITIALIZED + [870].f1 ∈ [--..--] + [870].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [870].f3 ∈ [--..--] + [870].[bits 72 to 95] ∈ UNINITIALIZED + [870].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [870].f5 ∈ [--..--] + [870].[bits 136 to 159] ∈ UNINITIALIZED + [871].f1 ∈ [--..--] + [871].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [871].f3 ∈ [--..--] + [871].[bits 72 to 95] ∈ UNINITIALIZED + [871].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [871].f5 ∈ [--..--] + [871].[bits 136 to 159] ∈ UNINITIALIZED + [872].f1 ∈ [--..--] + [872].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [872].f3 ∈ [--..--] + [872].[bits 72 to 95] ∈ UNINITIALIZED + [872].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [872].f5 ∈ [--..--] + [872].[bits 136 to 159] ∈ UNINITIALIZED + [873].f1 ∈ [--..--] + [873].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [873].f3 ∈ [--..--] + [873].[bits 72 to 95] ∈ UNINITIALIZED + [873].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [873].f5 ∈ [--..--] + [873].[bits 136 to 159] ∈ UNINITIALIZED + [874].f1 ∈ [--..--] + [874].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [874].f3 ∈ [--..--] + [874].[bits 72 to 95] ∈ UNINITIALIZED + [874].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [874].f5 ∈ [--..--] + [874].[bits 136 to 159] ∈ UNINITIALIZED + [875].f1 ∈ [--..--] + [875].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [875].f3 ∈ [--..--] + [875].[bits 72 to 95] ∈ UNINITIALIZED + [875].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [875].f5 ∈ [--..--] + [875].[bits 136 to 159] ∈ UNINITIALIZED + [876].f1 ∈ [--..--] + [876].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [876].f3 ∈ [--..--] + [876].[bits 72 to 95] ∈ UNINITIALIZED + [876].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [876].f5 ∈ [--..--] + [876].[bits 136 to 159] ∈ UNINITIALIZED + [877].f1 ∈ [--..--] + [877].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [877].f3 ∈ [--..--] + [877].[bits 72 to 95] ∈ UNINITIALIZED + [877].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [877].f5 ∈ [--..--] + [877].[bits 136 to 159] ∈ UNINITIALIZED + [878].f1 ∈ [--..--] + [878].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [878].f3 ∈ [--..--] + [878].[bits 72 to 95] ∈ UNINITIALIZED + [878].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [878].f5 ∈ [--..--] + [878].[bits 136 to 159] ∈ UNINITIALIZED + [879].f1 ∈ [--..--] + [879].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [879].f3 ∈ [--..--] + [879].[bits 72 to 95] ∈ UNINITIALIZED + [879].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [879].f5 ∈ [--..--] + [879].[bits 136 to 159] ∈ UNINITIALIZED + [880].f1 ∈ [--..--] + [880].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [880].f3 ∈ [--..--] + [880].[bits 72 to 95] ∈ UNINITIALIZED + [880].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [880].f5 ∈ [--..--] + [880].[bits 136 to 159] ∈ UNINITIALIZED + [881].f1 ∈ [--..--] + [881].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [881].f3 ∈ [--..--] + [881].[bits 72 to 95] ∈ UNINITIALIZED + [881].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [881].f5 ∈ [--..--] + [881].[bits 136 to 159] ∈ UNINITIALIZED + [882].f1 ∈ [--..--] + [882].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [882].f3 ∈ [--..--] + [882].[bits 72 to 95] ∈ UNINITIALIZED + [882].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [882].f5 ∈ [--..--] + [882].[bits 136 to 159] ∈ UNINITIALIZED + [883].f1 ∈ [--..--] + [883].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [883].f3 ∈ [--..--] + [883].[bits 72 to 95] ∈ UNINITIALIZED + [883].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [883].f5 ∈ [--..--] + [883].[bits 136 to 159] ∈ UNINITIALIZED + [884].f1 ∈ [--..--] + [884].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [884].f3 ∈ [--..--] + [884].[bits 72 to 95] ∈ UNINITIALIZED + [884].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [884].f5 ∈ [--..--] + [884].[bits 136 to 159] ∈ UNINITIALIZED + [885].f1 ∈ [--..--] + [885].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [885].f3 ∈ [--..--] + [885].[bits 72 to 95] ∈ UNINITIALIZED + [885].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [885].f5 ∈ [--..--] + [885].[bits 136 to 159] ∈ UNINITIALIZED + [886].f1 ∈ [--..--] + [886].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [886].f3 ∈ [--..--] + [886].[bits 72 to 95] ∈ UNINITIALIZED + [886].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [886].f5 ∈ [--..--] + [886].[bits 136 to 159] ∈ UNINITIALIZED + [887].f1 ∈ [--..--] + [887].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [887].f3 ∈ [--..--] + [887].[bits 72 to 95] ∈ UNINITIALIZED + [887].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [887].f5 ∈ [--..--] + [887].[bits 136 to 159] ∈ UNINITIALIZED + [888].f1 ∈ [--..--] + [888].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [888].f3 ∈ [--..--] + [888].[bits 72 to 95] ∈ UNINITIALIZED + [888].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [888].f5 ∈ [--..--] + [888].[bits 136 to 159] ∈ UNINITIALIZED + [889].f1 ∈ [--..--] + [889].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [889].f3 ∈ [--..--] + [889].[bits 72 to 95] ∈ UNINITIALIZED + [889].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [889].f5 ∈ [--..--] + [889].[bits 136 to 159] ∈ UNINITIALIZED + [890].f1 ∈ [--..--] + [890].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [890].f3 ∈ [--..--] + [890].[bits 72 to 95] ∈ UNINITIALIZED + [890].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [890].f5 ∈ [--..--] + [890].[bits 136 to 159] ∈ UNINITIALIZED + [891].f1 ∈ [--..--] + [891].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [891].f3 ∈ [--..--] + [891].[bits 72 to 95] ∈ UNINITIALIZED + [891].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [891].f5 ∈ [--..--] + [891].[bits 136 to 159] ∈ UNINITIALIZED + [892].f1 ∈ [--..--] + [892].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [892].f3 ∈ [--..--] + [892].[bits 72 to 95] ∈ UNINITIALIZED + [892].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [892].f5 ∈ [--..--] + [892].[bits 136 to 159] ∈ UNINITIALIZED + [893].f1 ∈ [--..--] + [893].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [893].f3 ∈ [--..--] + [893].[bits 72 to 95] ∈ UNINITIALIZED + [893].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [893].f5 ∈ [--..--] + [893].[bits 136 to 159] ∈ UNINITIALIZED + [894].f1 ∈ [--..--] + [894].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [894].f3 ∈ [--..--] + [894].[bits 72 to 95] ∈ UNINITIALIZED + [894].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [894].f5 ∈ [--..--] + [894].[bits 136 to 159] ∈ UNINITIALIZED + [895].f1 ∈ [--..--] + [895].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [895].f3 ∈ [--..--] + [895].[bits 72 to 95] ∈ UNINITIALIZED + [895].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [895].f5 ∈ [--..--] + [895].[bits 136 to 159] ∈ UNINITIALIZED + [896].f1 ∈ [--..--] + [896].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [896].f3 ∈ [--..--] + [896].[bits 72 to 95] ∈ UNINITIALIZED + [896].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [896].f5 ∈ [--..--] + [896].[bits 136 to 159] ∈ UNINITIALIZED + [897].f1 ∈ [--..--] + [897].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [897].f3 ∈ [--..--] + [897].[bits 72 to 95] ∈ UNINITIALIZED + [897].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [897].f5 ∈ [--..--] + [897].[bits 136 to 159] ∈ UNINITIALIZED + [898].f1 ∈ [--..--] + [898].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [898].f3 ∈ [--..--] + [898].[bits 72 to 95] ∈ UNINITIALIZED + [898].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [898].f5 ∈ [--..--] + [898].[bits 136 to 159] ∈ UNINITIALIZED + [899].f1 ∈ [--..--] + [899].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [899].f3 ∈ [--..--] + [899].[bits 72 to 95] ∈ UNINITIALIZED + [899].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [899].f5 ∈ [--..--] + [899].[bits 136 to 159] ∈ UNINITIALIZED + [900].f1 ∈ [--..--] + [900].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [900].f3 ∈ [--..--] + [900].[bits 72 to 95] ∈ UNINITIALIZED + [900].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [900].f5 ∈ [--..--] + [900].[bits 136 to 159] ∈ UNINITIALIZED + [901].f1 ∈ [--..--] + [901].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [901].f3 ∈ [--..--] + [901].[bits 72 to 95] ∈ UNINITIALIZED + [901].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [901].f5 ∈ [--..--] + [901].[bits 136 to 159] ∈ UNINITIALIZED + [902].f1 ∈ [--..--] + [902].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [902].f3 ∈ [--..--] + [902].[bits 72 to 95] ∈ UNINITIALIZED + [902].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [902].f5 ∈ [--..--] + [902].[bits 136 to 159] ∈ UNINITIALIZED + [903].f1 ∈ [--..--] + [903].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [903].f3 ∈ [--..--] + [903].[bits 72 to 95] ∈ UNINITIALIZED + [903].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [903].f5 ∈ [--..--] + [903].[bits 136 to 159] ∈ UNINITIALIZED + [904].f1 ∈ [--..--] + [904].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [904].f3 ∈ [--..--] + [904].[bits 72 to 95] ∈ UNINITIALIZED + [904].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [904].f5 ∈ [--..--] + [904].[bits 136 to 159] ∈ UNINITIALIZED + [905].f1 ∈ [--..--] + [905].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [905].f3 ∈ [--..--] + [905].[bits 72 to 95] ∈ UNINITIALIZED + [905].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [905].f5 ∈ [--..--] + [905].[bits 136 to 159] ∈ UNINITIALIZED + [906].f1 ∈ [--..--] + [906].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [906].f3 ∈ [--..--] + [906].[bits 72 to 95] ∈ UNINITIALIZED + [906].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [906].f5 ∈ [--..--] + [906].[bits 136 to 159] ∈ UNINITIALIZED + [907].f1 ∈ [--..--] + [907].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [907].f3 ∈ [--..--] + [907].[bits 72 to 95] ∈ UNINITIALIZED + [907].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [907].f5 ∈ [--..--] + [907].[bits 136 to 159] ∈ UNINITIALIZED + [908].f1 ∈ [--..--] + [908].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [908].f3 ∈ [--..--] + [908].[bits 72 to 95] ∈ UNINITIALIZED + [908].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [908].f5 ∈ [--..--] + [908].[bits 136 to 159] ∈ UNINITIALIZED + [909].f1 ∈ [--..--] + [909].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [909].f3 ∈ [--..--] + [909].[bits 72 to 95] ∈ UNINITIALIZED + [909].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [909].f5 ∈ [--..--] + [909].[bits 136 to 159] ∈ UNINITIALIZED + [910].f1 ∈ [--..--] + [910].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [910].f3 ∈ [--..--] + [910].[bits 72 to 95] ∈ UNINITIALIZED + [910].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [910].f5 ∈ [--..--] + [910].[bits 136 to 159] ∈ UNINITIALIZED + [911].f1 ∈ [--..--] + [911].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [911].f3 ∈ [--..--] + [911].[bits 72 to 95] ∈ UNINITIALIZED + [911].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [911].f5 ∈ [--..--] + [911].[bits 136 to 159] ∈ UNINITIALIZED + [912].f1 ∈ [--..--] + [912].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [912].f3 ∈ [--..--] + [912].[bits 72 to 95] ∈ UNINITIALIZED + [912].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [912].f5 ∈ [--..--] + [912].[bits 136 to 159] ∈ UNINITIALIZED + [913].f1 ∈ [--..--] + [913].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [913].f3 ∈ [--..--] + [913].[bits 72 to 95] ∈ UNINITIALIZED + [913].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [913].f5 ∈ [--..--] + [913].[bits 136 to 159] ∈ UNINITIALIZED + [914].f1 ∈ [--..--] + [914].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [914].f3 ∈ [--..--] + [914].[bits 72 to 95] ∈ UNINITIALIZED + [914].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [914].f5 ∈ [--..--] + [914].[bits 136 to 159] ∈ UNINITIALIZED + [915].f1 ∈ [--..--] + [915].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [915].f3 ∈ [--..--] + [915].[bits 72 to 95] ∈ UNINITIALIZED + [915].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [915].f5 ∈ [--..--] + [915].[bits 136 to 159] ∈ UNINITIALIZED + [916].f1 ∈ [--..--] + [916].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [916].f3 ∈ [--..--] + [916].[bits 72 to 95] ∈ UNINITIALIZED + [916].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [916].f5 ∈ [--..--] + [916].[bits 136 to 159] ∈ UNINITIALIZED + [917].f1 ∈ [--..--] + [917].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [917].f3 ∈ [--..--] + [917].[bits 72 to 95] ∈ UNINITIALIZED + [917].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [917].f5 ∈ [--..--] + [917].[bits 136 to 159] ∈ UNINITIALIZED + [918].f1 ∈ [--..--] + [918].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [918].f3 ∈ [--..--] + [918].[bits 72 to 95] ∈ UNINITIALIZED + [918].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [918].f5 ∈ [--..--] + [918].[bits 136 to 159] ∈ UNINITIALIZED + [919].f1 ∈ [--..--] + [919].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [919].f3 ∈ [--..--] + [919].[bits 72 to 95] ∈ UNINITIALIZED + [919].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [919].f5 ∈ [--..--] + [919].[bits 136 to 159] ∈ UNINITIALIZED + [920].f1 ∈ [--..--] + [920].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [920].f3 ∈ [--..--] + [920].[bits 72 to 95] ∈ UNINITIALIZED + [920].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [920].f5 ∈ [--..--] + [920].[bits 136 to 159] ∈ UNINITIALIZED + [921].f1 ∈ [--..--] + [921].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [921].f3 ∈ [--..--] + [921].[bits 72 to 95] ∈ UNINITIALIZED + [921].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [921].f5 ∈ [--..--] + [921].[bits 136 to 159] ∈ UNINITIALIZED + [922].f1 ∈ [--..--] + [922].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [922].f3 ∈ [--..--] + [922].[bits 72 to 95] ∈ UNINITIALIZED + [922].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [922].f5 ∈ [--..--] + [922].[bits 136 to 159] ∈ UNINITIALIZED + [923].f1 ∈ [--..--] + [923].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [923].f3 ∈ [--..--] + [923].[bits 72 to 95] ∈ UNINITIALIZED + [923].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [923].f5 ∈ [--..--] + [923].[bits 136 to 159] ∈ UNINITIALIZED + [924].f1 ∈ [--..--] + [924].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [924].f3 ∈ [--..--] + [924].[bits 72 to 95] ∈ UNINITIALIZED + [924].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [924].f5 ∈ [--..--] + [924].[bits 136 to 159] ∈ UNINITIALIZED + [925].f1 ∈ [--..--] + [925].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [925].f3 ∈ [--..--] + [925].[bits 72 to 95] ∈ UNINITIALIZED + [925].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [925].f5 ∈ [--..--] + [925].[bits 136 to 159] ∈ UNINITIALIZED + [926].f1 ∈ [--..--] + [926].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [926].f3 ∈ [--..--] + [926].[bits 72 to 95] ∈ UNINITIALIZED + [926].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [926].f5 ∈ [--..--] + [926].[bits 136 to 159] ∈ UNINITIALIZED + [927].f1 ∈ [--..--] + [927].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [927].f3 ∈ [--..--] + [927].[bits 72 to 95] ∈ UNINITIALIZED + [927].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [927].f5 ∈ [--..--] + [927].[bits 136 to 159] ∈ UNINITIALIZED + [928].f1 ∈ [--..--] + [928].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [928].f3 ∈ [--..--] + [928].[bits 72 to 95] ∈ UNINITIALIZED + [928].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [928].f5 ∈ [--..--] + [928].[bits 136 to 159] ∈ UNINITIALIZED + [929].f1 ∈ [--..--] + [929].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [929].f3 ∈ [--..--] + [929].[bits 72 to 95] ∈ UNINITIALIZED + [929].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [929].f5 ∈ [--..--] + [929].[bits 136 to 159] ∈ UNINITIALIZED + [930].f1 ∈ [--..--] + [930].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [930].f3 ∈ [--..--] + [930].[bits 72 to 95] ∈ UNINITIALIZED + [930].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [930].f5 ∈ [--..--] + [930].[bits 136 to 159] ∈ UNINITIALIZED + [931].f1 ∈ [--..--] + [931].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [931].f3 ∈ [--..--] + [931].[bits 72 to 95] ∈ UNINITIALIZED + [931].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [931].f5 ∈ [--..--] + [931].[bits 136 to 159] ∈ UNINITIALIZED + [932].f1 ∈ [--..--] + [932].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [932].f3 ∈ [--..--] + [932].[bits 72 to 95] ∈ UNINITIALIZED + [932].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [932].f5 ∈ [--..--] + [932].[bits 136 to 159] ∈ UNINITIALIZED + [933].f1 ∈ [--..--] + [933].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [933].f3 ∈ [--..--] + [933].[bits 72 to 95] ∈ UNINITIALIZED + [933].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [933].f5 ∈ [--..--] + [933].[bits 136 to 159] ∈ UNINITIALIZED + [934].f1 ∈ [--..--] + [934].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [934].f3 ∈ [--..--] + [934].[bits 72 to 95] ∈ UNINITIALIZED + [934].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [934].f5 ∈ [--..--] + [934].[bits 136 to 159] ∈ UNINITIALIZED + [935].f1 ∈ [--..--] + [935].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [935].f3 ∈ [--..--] + [935].[bits 72 to 95] ∈ UNINITIALIZED + [935].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [935].f5 ∈ [--..--] + [935].[bits 136 to 159] ∈ UNINITIALIZED + [936].f1 ∈ [--..--] + [936].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [936].f3 ∈ [--..--] + [936].[bits 72 to 95] ∈ UNINITIALIZED + [936].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [936].f5 ∈ [--..--] + [936].[bits 136 to 159] ∈ UNINITIALIZED + [937].f1 ∈ [--..--] + [937].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [937].f3 ∈ [--..--] + [937].[bits 72 to 95] ∈ UNINITIALIZED + [937].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [937].f5 ∈ [--..--] + [937].[bits 136 to 159] ∈ UNINITIALIZED + [938].f1 ∈ [--..--] + [938].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [938].f3 ∈ [--..--] + [938].[bits 72 to 95] ∈ UNINITIALIZED + [938].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [938].f5 ∈ [--..--] + [938].[bits 136 to 159] ∈ UNINITIALIZED + [939].f1 ∈ [--..--] + [939].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [939].f3 ∈ [--..--] + [939].[bits 72 to 95] ∈ UNINITIALIZED + [939].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [939].f5 ∈ [--..--] + [939].[bits 136 to 159] ∈ UNINITIALIZED + [940].f1 ∈ [--..--] + [940].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [940].f3 ∈ [--..--] + [940].[bits 72 to 95] ∈ UNINITIALIZED + [940].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [940].f5 ∈ [--..--] + [940].[bits 136 to 159] ∈ UNINITIALIZED + [941].f1 ∈ [--..--] + [941].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [941].f3 ∈ [--..--] + [941].[bits 72 to 95] ∈ UNINITIALIZED + [941].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [941].f5 ∈ [--..--] + [941].[bits 136 to 159] ∈ UNINITIALIZED + [942].f1 ∈ [--..--] + [942].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [942].f3 ∈ [--..--] + [942].[bits 72 to 95] ∈ UNINITIALIZED + [942].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [942].f5 ∈ [--..--] + [942].[bits 136 to 159] ∈ UNINITIALIZED + [943].f1 ∈ [--..--] + [943].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [943].f3 ∈ [--..--] + [943].[bits 72 to 95] ∈ UNINITIALIZED + [943].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [943].f5 ∈ [--..--] + [943].[bits 136 to 159] ∈ UNINITIALIZED + [944].f1 ∈ [--..--] + [944].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [944].f3 ∈ [--..--] + [944].[bits 72 to 95] ∈ UNINITIALIZED + [944].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [944].f5 ∈ [--..--] + [944].[bits 136 to 159] ∈ UNINITIALIZED + [945].f1 ∈ [--..--] + [945].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [945].f3 ∈ [--..--] + [945].[bits 72 to 95] ∈ UNINITIALIZED + [945].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [945].f5 ∈ [--..--] + [945].[bits 136 to 159] ∈ UNINITIALIZED + [946].f1 ∈ [--..--] + [946].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [946].f3 ∈ [--..--] + [946].[bits 72 to 95] ∈ UNINITIALIZED + [946].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [946].f5 ∈ [--..--] + [946].[bits 136 to 159] ∈ UNINITIALIZED + [947].f1 ∈ [--..--] + [947].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [947].f3 ∈ [--..--] + [947].[bits 72 to 95] ∈ UNINITIALIZED + [947].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [947].f5 ∈ [--..--] + [947].[bits 136 to 159] ∈ UNINITIALIZED + [948].f1 ∈ [--..--] + [948].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [948].f3 ∈ [--..--] + [948].[bits 72 to 95] ∈ UNINITIALIZED + [948].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [948].f5 ∈ [--..--] + [948].[bits 136 to 159] ∈ UNINITIALIZED + [949].f1 ∈ [--..--] + [949].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [949].f3 ∈ [--..--] + [949].[bits 72 to 95] ∈ UNINITIALIZED + [949].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [949].f5 ∈ [--..--] + [949].[bits 136 to 159] ∈ UNINITIALIZED + [950].f1 ∈ [--..--] + [950].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [950].f3 ∈ [--..--] + [950].[bits 72 to 95] ∈ UNINITIALIZED + [950].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [950].f5 ∈ [--..--] + [950].[bits 136 to 159] ∈ UNINITIALIZED + [951].f1 ∈ [--..--] + [951].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [951].f3 ∈ [--..--] + [951].[bits 72 to 95] ∈ UNINITIALIZED + [951].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [951].f5 ∈ [--..--] + [951].[bits 136 to 159] ∈ UNINITIALIZED + [952].f1 ∈ [--..--] + [952].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [952].f3 ∈ [--..--] + [952].[bits 72 to 95] ∈ UNINITIALIZED + [952].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [952].f5 ∈ [--..--] + [952].[bits 136 to 159] ∈ UNINITIALIZED + [953].f1 ∈ [--..--] + [953].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [953].f3 ∈ [--..--] + [953].[bits 72 to 95] ∈ UNINITIALIZED + [953].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [953].f5 ∈ [--..--] + [953].[bits 136 to 159] ∈ UNINITIALIZED + [954].f1 ∈ [--..--] + [954].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [954].f3 ∈ [--..--] + [954].[bits 72 to 95] ∈ UNINITIALIZED + [954].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [954].f5 ∈ [--..--] + [954].[bits 136 to 159] ∈ UNINITIALIZED + [955].f1 ∈ [--..--] + [955].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [955].f3 ∈ [--..--] + [955].[bits 72 to 95] ∈ UNINITIALIZED + [955].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [955].f5 ∈ [--..--] + [955].[bits 136 to 159] ∈ UNINITIALIZED + [956].f1 ∈ [--..--] + [956].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [956].f3 ∈ [--..--] + [956].[bits 72 to 95] ∈ UNINITIALIZED + [956].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [956].f5 ∈ [--..--] + [956].[bits 136 to 159] ∈ UNINITIALIZED + [957].f1 ∈ [--..--] + [957].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [957].f3 ∈ [--..--] + [957].[bits 72 to 95] ∈ UNINITIALIZED + [957].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [957].f5 ∈ [--..--] + [957].[bits 136 to 159] ∈ UNINITIALIZED + [958].f1 ∈ [--..--] + [958].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [958].f3 ∈ [--..--] + [958].[bits 72 to 95] ∈ UNINITIALIZED + [958].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [958].f5 ∈ [--..--] + [958].[bits 136 to 159] ∈ UNINITIALIZED + [959].f1 ∈ [--..--] + [959].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [959].f3 ∈ [--..--] + [959].[bits 72 to 95] ∈ UNINITIALIZED + [959].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [959].f5 ∈ [--..--] + [959].[bits 136 to 159] ∈ UNINITIALIZED + [960].f1 ∈ [--..--] + [960].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [960].f3 ∈ [--..--] + [960].[bits 72 to 95] ∈ UNINITIALIZED + [960].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [960].f5 ∈ [--..--] + [960].[bits 136 to 159] ∈ UNINITIALIZED + [961].f1 ∈ [--..--] + [961].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [961].f3 ∈ [--..--] + [961].[bits 72 to 95] ∈ UNINITIALIZED + [961].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [961].f5 ∈ [--..--] + [961].[bits 136 to 159] ∈ UNINITIALIZED + [962].f1 ∈ [--..--] + [962].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [962].f3 ∈ [--..--] + [962].[bits 72 to 95] ∈ UNINITIALIZED + [962].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [962].f5 ∈ [--..--] + [962].[bits 136 to 159] ∈ UNINITIALIZED + [963].f1 ∈ [--..--] + [963].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [963].f3 ∈ [--..--] + [963].[bits 72 to 95] ∈ UNINITIALIZED + [963].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [963].f5 ∈ [--..--] + [963].[bits 136 to 159] ∈ UNINITIALIZED + [964].f1 ∈ [--..--] + [964].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [964].f3 ∈ [--..--] + [964].[bits 72 to 95] ∈ UNINITIALIZED + [964].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [964].f5 ∈ [--..--] + [964].[bits 136 to 159] ∈ UNINITIALIZED + [965].f1 ∈ [--..--] + [965].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [965].f3 ∈ [--..--] + [965].[bits 72 to 95] ∈ UNINITIALIZED + [965].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [965].f5 ∈ [--..--] + [965].[bits 136 to 159] ∈ UNINITIALIZED + [966].f1 ∈ [--..--] + [966].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [966].f3 ∈ [--..--] + [966].[bits 72 to 95] ∈ UNINITIALIZED + [966].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [966].f5 ∈ [--..--] + [966].[bits 136 to 159] ∈ UNINITIALIZED + [967].f1 ∈ [--..--] + [967].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [967].f3 ∈ [--..--] + [967].[bits 72 to 95] ∈ UNINITIALIZED + [967].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [967].f5 ∈ [--..--] + [967].[bits 136 to 159] ∈ UNINITIALIZED + [968].f1 ∈ [--..--] + [968].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [968].f3 ∈ [--..--] + [968].[bits 72 to 95] ∈ UNINITIALIZED + [968].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [968].f5 ∈ [--..--] + [968].[bits 136 to 159] ∈ UNINITIALIZED + [969].f1 ∈ [--..--] + [969].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [969].f3 ∈ [--..--] + [969].[bits 72 to 95] ∈ UNINITIALIZED + [969].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [969].f5 ∈ [--..--] + [969].[bits 136 to 159] ∈ UNINITIALIZED + [970].f1 ∈ [--..--] + [970].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [970].f3 ∈ [--..--] + [970].[bits 72 to 95] ∈ UNINITIALIZED + [970].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [970].f5 ∈ [--..--] + [970].[bits 136 to 159] ∈ UNINITIALIZED + [971].f1 ∈ [--..--] + [971].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [971].f3 ∈ [--..--] + [971].[bits 72 to 95] ∈ UNINITIALIZED + [971].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [971].f5 ∈ [--..--] + [971].[bits 136 to 159] ∈ UNINITIALIZED + [972].f1 ∈ [--..--] + [972].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [972].f3 ∈ [--..--] + [972].[bits 72 to 95] ∈ UNINITIALIZED + [972].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [972].f5 ∈ [--..--] + [972].[bits 136 to 159] ∈ UNINITIALIZED + [973].f1 ∈ [--..--] + [973].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [973].f3 ∈ [--..--] + [973].[bits 72 to 95] ∈ UNINITIALIZED + [973].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [973].f5 ∈ [--..--] + [973].[bits 136 to 159] ∈ UNINITIALIZED + [974].f1 ∈ [--..--] + [974].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [974].f3 ∈ [--..--] + [974].[bits 72 to 95] ∈ UNINITIALIZED + [974].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [974].f5 ∈ [--..--] + [974].[bits 136 to 159] ∈ UNINITIALIZED + [975].f1 ∈ [--..--] + [975].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [975].f3 ∈ [--..--] + [975].[bits 72 to 95] ∈ UNINITIALIZED + [975].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [975].f5 ∈ [--..--] + [975].[bits 136 to 159] ∈ UNINITIALIZED + [976].f1 ∈ [--..--] + [976].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [976].f3 ∈ [--..--] + [976].[bits 72 to 95] ∈ UNINITIALIZED + [976].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [976].f5 ∈ [--..--] + [976].[bits 136 to 159] ∈ UNINITIALIZED + [977].f1 ∈ [--..--] + [977].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [977].f3 ∈ [--..--] + [977].[bits 72 to 95] ∈ UNINITIALIZED + [977].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [977].f5 ∈ [--..--] + [977].[bits 136 to 159] ∈ UNINITIALIZED + [978].f1 ∈ [--..--] + [978].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [978].f3 ∈ [--..--] + [978].[bits 72 to 95] ∈ UNINITIALIZED + [978].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [978].f5 ∈ [--..--] + [978].[bits 136 to 159] ∈ UNINITIALIZED + [979].f1 ∈ [--..--] + [979].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [979].f3 ∈ [--..--] + [979].[bits 72 to 95] ∈ UNINITIALIZED + [979].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [979].f5 ∈ [--..--] + [979].[bits 136 to 159] ∈ UNINITIALIZED + [980].f1 ∈ [--..--] + [980].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [980].f3 ∈ [--..--] + [980].[bits 72 to 95] ∈ UNINITIALIZED + [980].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [980].f5 ∈ [--..--] + [980].[bits 136 to 159] ∈ UNINITIALIZED + [981].f1 ∈ [--..--] + [981].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [981].f3 ∈ [--..--] + [981].[bits 72 to 95] ∈ UNINITIALIZED + [981].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [981].f5 ∈ [--..--] + [981].[bits 136 to 159] ∈ UNINITIALIZED + [982].f1 ∈ [--..--] + [982].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [982].f3 ∈ [--..--] + [982].[bits 72 to 95] ∈ UNINITIALIZED + [982].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [982].f5 ∈ [--..--] + [982].[bits 136 to 159] ∈ UNINITIALIZED + [983].f1 ∈ [--..--] + [983].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [983].f3 ∈ [--..--] + [983].[bits 72 to 95] ∈ UNINITIALIZED + [983].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [983].f5 ∈ [--..--] + [983].[bits 136 to 159] ∈ UNINITIALIZED + [984].f1 ∈ [--..--] + [984].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [984].f3 ∈ [--..--] + [984].[bits 72 to 95] ∈ UNINITIALIZED + [984].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [984].f5 ∈ [--..--] + [984].[bits 136 to 159] ∈ UNINITIALIZED + [985].f1 ∈ [--..--] + [985].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [985].f3 ∈ [--..--] + [985].[bits 72 to 95] ∈ UNINITIALIZED + [985].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [985].f5 ∈ [--..--] + [985].[bits 136 to 159] ∈ UNINITIALIZED + [986].f1 ∈ [--..--] + [986].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [986].f3 ∈ [--..--] + [986].[bits 72 to 95] ∈ UNINITIALIZED + [986].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [986].f5 ∈ [--..--] + [986].[bits 136 to 159] ∈ UNINITIALIZED + [987].f1 ∈ [--..--] + [987].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [987].f3 ∈ [--..--] + [987].[bits 72 to 95] ∈ UNINITIALIZED + [987].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [987].f5 ∈ [--..--] + [987].[bits 136 to 159] ∈ UNINITIALIZED + [988].f1 ∈ [--..--] + [988].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [988].f3 ∈ [--..--] + [988].[bits 72 to 95] ∈ UNINITIALIZED + [988].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [988].f5 ∈ [--..--] + [988].[bits 136 to 159] ∈ UNINITIALIZED + [989].f1 ∈ [--..--] + [989].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [989].f3 ∈ [--..--] + [989].[bits 72 to 95] ∈ UNINITIALIZED + [989].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [989].f5 ∈ [--..--] + [989].[bits 136 to 159] ∈ UNINITIALIZED + [990].f1 ∈ [--..--] + [990].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [990].f3 ∈ [--..--] + [990].[bits 72 to 95] ∈ UNINITIALIZED + [990].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [990].f5 ∈ [--..--] + [990].[bits 136 to 159] ∈ UNINITIALIZED + [991].f1 ∈ [--..--] + [991].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [991].f3 ∈ [--..--] + [991].[bits 72 to 95] ∈ UNINITIALIZED + [991].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [991].f5 ∈ [--..--] + [991].[bits 136 to 159] ∈ UNINITIALIZED + [992].f1 ∈ [--..--] + [992].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [992].f3 ∈ [--..--] + [992].[bits 72 to 95] ∈ UNINITIALIZED + [992].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [992].f5 ∈ [--..--] + [992].[bits 136 to 159] ∈ UNINITIALIZED + [993].f1 ∈ [--..--] + [993].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [993].f3 ∈ [--..--] + [993].[bits 72 to 95] ∈ UNINITIALIZED + [993].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [993].f5 ∈ [--..--] + [993].[bits 136 to 159] ∈ UNINITIALIZED + [994].f1 ∈ [--..--] + [994].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [994].f3 ∈ [--..--] + [994].[bits 72 to 95] ∈ UNINITIALIZED + [994].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [994].f5 ∈ [--..--] + [994].[bits 136 to 159] ∈ UNINITIALIZED + [995].f1 ∈ [--..--] + [995].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [995].f3 ∈ [--..--] + [995].[bits 72 to 95] ∈ UNINITIALIZED + [995].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [995].f5 ∈ [--..--] + [995].[bits 136 to 159] ∈ UNINITIALIZED + [996].f1 ∈ [--..--] + [996].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [996].f3 ∈ [--..--] + [996].[bits 72 to 95] ∈ UNINITIALIZED + [996].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [996].f5 ∈ [--..--] + [996].[bits 136 to 159] ∈ UNINITIALIZED + [997].f1 ∈ [--..--] + [997].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [997].f3 ∈ [--..--] + [997].[bits 72 to 95] ∈ UNINITIALIZED + [997].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [997].f5 ∈ [--..--] + [997].[bits 136 to 159] ∈ UNINITIALIZED + [998].f1 ∈ [--..--] + [998].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [998].f3 ∈ [--..--] + [998].[bits 72 to 95] ∈ UNINITIALIZED + [998].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [998].f5 ∈ [--..--] + [998].[bits 136 to 159] ∈ UNINITIALIZED + [999].f1 ∈ [--..--] + [999].f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + [999].f3 ∈ [--..--] + [999].[bits 72 to 95] ∈ UNINITIALIZED + [999].f4 ∈ + {{ NULL ; &S_f4_0_t3[0] ; &S_f4_1_t3[0] ; &S_f4_2_t3[0] ; + &S_f4_3_t3[0] }} + [999].f5 ∈ [--..--] + [999].[bits 136 to 159] ∈ UNINITIALIZED + t4[0..4999999] ∈ [--..--] + t5[0] ∈ {{ NULL ; &S_0_t5[0] }} + [1] ∈ {{ NULL ; &S_1_t5[0] }} + [2] ∈ {{ NULL ; &S_2_t5[0] }} + t6[0..4999999]{.f1; .f2} ∈ [-1.79769313486e+308 .. 1.79769313486e+308] + S_f4_0_tcs_s[0..3] ∈ [--..--] + S_f4_1_tcs_s[0..3] ∈ [--..--] + S_f4_2_tcs_s[0..3] ∈ [--..--] + S_f4_3_tcs_s[0..3] ∈ [--..--] + S_0_t1[0..3] ∈ [--..--] + S_1_t1[0..3] ∈ [--..--] + S_2_t1[0..3] ∈ [--..--] + S_3_t1[0..3] ∈ [--..--] + S_f4_0_t3[0..3] ∈ [--..--] + S_f4_1_t3[0..3] ∈ [--..--] + S_f4_2_t3[0..3] ∈ [--..--] + S_f4_3_t3[0..3] ∈ [--..--] + S_0_t5[0..3] ∈ [--..--] + S_1_t5[0..3] ∈ [--..--] + S_2_t5[0..3] ∈ [--..--] +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bitfield_assign.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bitfield_assign.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bitfield_assign.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bitfield_assign.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,51 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bitfield_assign.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + g_18 ∈ {0} + g_5 ∈ {0} + g_2 ∈ {0} + g_7[0]{.f0; .f1[bits 0 to 6]; .f2[bits 0 to 6]; .f3.f0[bits 0 to 6]} ∈ + {52} + [0]{.f0[bits 7 to 31]; .f1[bits 7 to 31]; .f2[bits 7 to 31]; .f3.f0[bits 7 to 31]} ∈ + UNINITIALIZED + [0]{.f0[bits 32 to 159]; .f1[bits 32 to 159]; .f2[bits 32 to 159]; .f3{.f1; .f2; .f3; .[bits 48 to 63]; .[bits 90 to 95]}} ∈ + {0} +[value] Called Frama_C_show_each({21668890}) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + g_2 ∈ {21668890} + l_8 ∈ {1} + l_16 ∈ {3175785498} + g_7[0]{.f0; .f1[bits 0 to 6]; .f2[bits 0 to 6]; .f3.f0[bits 0 to 6]} ∈ + {52} + [0]{.f0[bits 7 to 31]; .f1[bits 7 to 31]; .f2[bits 7 to 31]; .f3.f0[bits 7 to 31]} ∈ + UNINITIALIZED + [0]{.f0[bits 32 to 63]; .f1[bits 32 to 63]; .f2[bits 32 to 63]; .f3{.f1; .[bits 48 to 63]}} ∈ + {0} + [0]{.f0[bits 64 to 89]; .f1[bits 64 to 89]; .f2[bits 64 to 89]; .f3.f2} ∈ + {21668890} + [0]{.f0[bits 90 to 159]; .f1[bits 90 to 159]; .f2[bits 90 to 159]; .f3{.f3; .[bits 90 to 95]}} ∈ + {0} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + g_2 FROM g_5; g_2 + g_7[0]{.f0[bits 64 to 89]; .f1[bits 64 to 89]; .f2[bits 64 to 89]; .f3.f2} + FROM g_5 + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + g_2; l_8; l_16; + g_7[0]{.f0[bits 64 to 89]; .f1[bits 64 to 89]; .f2[bits 64 to 89]; .f3.f2}; + __retres +[inout] Inputs for function main: + g_5; g_2; + g_7[0]{.f0[bits 64 to 89]; .f1[bits 64 to 89]; .f2[bits 64 to 89]; .f3.f2} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bitfield_longlong.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bitfield_longlong.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bitfield_longlong.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bitfield_longlong.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,21 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bitfield_longlong.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + s50.z ∈ {2} + .[bits 50 to 63] ∈ {0} + s10.z ∈ {2} + .[bits 10 to 31] ∈ {0} + u32.z ∈ {4294967295} + s32.z ∈ {-1} +[value] Called Frama_C_show_each({{ "%zu %zu %zu %zu\n" }}, {8}, {4}, {8}, {4}) +[value] Called Frama_C_show_each({{ "%d %d\n" }}, {1}, {0}) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + x ∈ {1} + y ∈ {0} + __retres ∈ {0} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bitfield_receives_result.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bitfield_receives_result.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bitfield_receives_result.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bitfield_receives_result.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,46 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bitfield_receives_result.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + s ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/bitfield_receives_result.i:9. +[value] Recording results for f +[value] Done for function f +[value] DUMPING STATE of file tests/misc/bitfield_receives_result.i line 10 + s.b ∈ {-1} + .[bits 31 to 31] ∈ {0} + =END OF DUMP== +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {-1} +[value] Values at end of function main: + s.b ∈ {-1} + .[bits 31 to 31] ∈ {0} + __retres ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM \nothing +[from] Function main: + s.b FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main: + s.b; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bitfield.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bitfield.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bitfield.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bitfield.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,242 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bitfield.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + h ∈ {0} + k ∈ {0} + k8 ∈ {0} + kr8 ∈ {0} + ll ∈ {0} + ini.a ∈ {2} + .b ∈ {-7} + .c ∈ {99999} + .[bits 28 to 31] ∈ UNINITIALIZED + .d ∈ {0} + VV ∈ {55} + q4 ∈ {40000} + X ∈ {0} + x{.f; .sf} ∈ {28349} + us ∈ {56355} + G ∈ {0} + H ∈ {0} + b ∈ {0} + c ∈ {0} + ee ∈ {0} + foo ∈ [--..--] +[value] Called Frama_C_show_each({1}) +[value] Called Frama_C_show_each({3}) +[value] casting address to a bit-field of 22 bits: this is smaller than sizeof(void*) +tests/misc/bitfield.i:91:[kernel] warning: signed overflow. assert -2147483648 ≤ v.d+1 ≤ 2147483647; +[value] computing for function f <- main. + Called from tests/misc/bitfield.i:94. +[value] DUMPING STATE of file tests/misc/bitfield.i line 17 + h ∈ {0} + k ∈ {0} + k8 ∈ {0} + kr8 ∈ {0} + ll ∈ {0} + ini.a ∈ {2} + .b ∈ {-7} + .c ∈ {99999} + .[bits 28 to 31] ∈ UNINITIALIZED + .d ∈ {0} + VV ∈ {0} + q4 ∈ {40000} + X ∈ {7} + x_0 ∈ {7} + x{.f; .sf} ∈ {28349} + us ∈ {56355} + G ∈ {0} + H ∈ {0} + b ∈ {0} + c ∈ {0} + ee ∈ {0} + foo ∈ [--..--] + a ∈ [--..--] + b_0 ∈ [--..--] + v.a ∈ {0} + .b ∈ {7} + .c ∈ + {{ garbled mix of &{v} (origin: Arithmetic {tests/misc/bitfield.i:89}) }} + .[bits 28 to 31] ∈ UNINITIALIZED + .d ∈ {{ &v + {9} }} + l_161{.f0; .f1[bits 0 to 31]} ∈ {-1} + =END OF DUMP== +[value] Recording results for f +[value] Done for function f +tests/misc/bitfield.i:95:[kernel] warning: signed overflow. assert -2147483648 ≤ a+b_0 ≤ 2147483647; +[value] casting address to a bit-field of 22 bits: this is smaller than sizeof(void*) +[value] computing for function return_8 <- main. + Called from tests/misc/bitfield.i:99. +[value] Recording results for return_8 +[value] Done for function return_8 +[value] computing for function g <- main. + Called from tests/misc/bitfield.i:102. +[value] Recording results for g +[value] Done for function g +[value] computing for function imprecise_bts_1671 <- main. + Called from tests/misc/bitfield.i:104. +tests/misc/bitfield.i:65:[value] entering loop for the first time +[value] computing for function leaf <- imprecise_bts_1671 <- main. + Called from tests/misc/bitfield.i:66. +tests/misc/bitfield.i:66:[kernel] warning: Neither code nor specification for function leaf, generating default assigns from the prototype +[value] using specification for function leaf +[value] Done for function leaf +tests/misc/bitfield.i:67:[value] Reading left-value ee. + It contains a garbled mix of {b} because of Misaligned + {tests/misc/bitfield.i:66}. +[value] Called Frama_C_show_each({{ garbled mix of &{b} + (origin: Misaligned {tests/misc/bitfield.i:66}) }}) +tests/misc/bitfield.i:69:[value] Reading left-value ee. + It contains a garbled mix of {b} because of Misaligned + {tests/misc/bitfield.i:66}. +[value] Called Frama_C_show_each(.next ∈ + {{ garbled mix of &{b} + (origin: Misaligned {tests/misc/bitfield.i:66}) }} + .bitf ∈ {0} + .[bits 65 to 95] ∈ + {{ garbled mix of &{b} + (origin: Misaligned {tests/misc/bitfield.i:66}) }}) +tests/misc/bitfield.i:70:[value] Assigning imprecise value to c. + The imprecision originates from Misaligned {tests/misc/bitfield.i:66} +tests/misc/bitfield.i:66:[value] Reading left-value c. + It contains a garbled mix of {b; ee} because of Misaligned + {tests/misc/bitfield.i:66}. +[value] computing for function leaf <- imprecise_bts_1671 <- main. + Called from tests/misc/bitfield.i:66. +[value] Done for function leaf +[value] Called Frama_C_show_each({{ garbled mix of &{b} + (origin: Misaligned {tests/misc/bitfield.i:66}) }}) +tests/misc/bitfield.i:68:[value] Reading left-value c. + It contains a garbled mix of {b; ee} because of Misaligned + {tests/misc/bitfield.i:66}. +tests/misc/bitfield.i:68:[kernel] warning: out of bounds write. assert \valid(&c->bitf); +[value] Called Frama_C_show_each({{ garbled mix of &{b} + (origin: Misaligned {tests/misc/bitfield.i:66}) }}) +tests/misc/bitfield.i:70:[kernel] warning: out of bounds read. assert \valid_read(&c->next.next); +[value] computing for function leaf <- imprecise_bts_1671 <- main. + Called from tests/misc/bitfield.i:66. +[value] Done for function leaf +[value] Recording results for imprecise_bts_1671 +[value] Done for function imprecise_bts_1671 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + X ∈ {7} +[value] Values at end of function g: + H ∈ {0} + r ∈ {1} +[value] Values at end of function imprecise_bts_1671: + b ∈ {0} + c ∈ + {{ garbled mix of &{b; ee} + (origin: Misaligned {tests/misc/bitfield.i:66}) }} + ee ∈ + {{ garbled mix of &{b} (origin: Misaligned {tests/misc/bitfield.i:66}) }} +[value] Values at end of function return_8: + __retres ∈ {8} +[value] Values at end of function main: + h.a ∈ {0} + .b ∈ [--..--] + .c ∈ + {{ garbled mix of &{v} (origin: Arithmetic {tests/misc/bitfield.i:96}) }} + {.d; .[bits 28 to 31]} ∈ {0} + k8.a ∈ {0} + .b ∈ {-8} + {.c; .d; .[bits 28 to 31]} ∈ {0} + kr8.a ∈ {0} + .b ∈ {-8} + {.c; .d; .[bits 28 to 31]} ∈ {0} + ll.b ∈ {-25536} + .[bits 16 to 31] ∈ {0} + VV ∈ {0} + X ∈ {7} + G ∈ {1} + H ∈ {0} + b ∈ {0} + c ∈ + {{ garbled mix of &{b; ee} + (origin: Misaligned {tests/misc/bitfield.i:66}) }} + ee ∈ + {{ garbled mix of &{b} (origin: Misaligned {tests/misc/bitfield.i:66}) }} + v.a ∈ {0} + .b ∈ {7} + .c ∈ + {{ garbled mix of &{v} (origin: Arithmetic {tests/misc/bitfield.i:89}) }} + .[bits 28 to 31] ∈ UNINITIALIZED + .d ∈ {{ &v + {9} }} + l_161{.f0; .f1[bits 0 to 31]} ∈ {-1} + __retres ∈ {0} +[from] Computing for function f +[from] Computing for function Frama_C_dump_each <-f +[from] Done for function Frama_C_dump_each +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] Computing for function imprecise_bts_1671 +[from] Computing for function leaf <-imprecise_bts_1671 +[from] Done for function leaf +[from] Done for function imprecise_bts_1671 +[from] Computing for function return_8 +[from] Done for function return_8 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + X FROM x_0 +[from] Function g: + H FROM x.sf; us + \result FROM x.f; us +[from] Function leaf: + ee FROM ee (and SELF) +[from] Function imprecise_bts_1671: + b FROM ee{.next.next; {.bitf; .[bits 65 to 95]}}; foo (and SELF) + c FROM ee{.next.next; {.bitf; .[bits 65 to 95]}}; foo + ee{.next.next; {.bitf; .[bits 65 to 95]}} + FROM ee{.next.next; {.bitf; .[bits 65 to 95]}}; foo (and SELF) + .next.prev FROM ee{.next.next; {.bitf; .[bits 65 to 95]}}; foo +[from] Function return_8: + \result FROM \nothing +[from] Function main: + h.a FROM h.a + .b FROM h{.a; .b}; a; b_0 + .c FROM \nothing + k8.b FROM \nothing + kr8.b FROM \nothing + ll.b FROM q4 + VV FROM h.a + X FROM \nothing + G FROM x.f; us + H FROM x.sf; us + b FROM ee{.next.next; {.bitf; .[bits 65 to 95]}}; foo (and SELF) + c FROM ee{.next.next; {.bitf; .[bits 65 to 95]}}; foo + ee{.next.next; {.bitf; .[bits 65 to 95]}} + FROM ee{.next.next; {.bitf; .[bits 65 to 95]}}; foo (and SELF) + .next.prev FROM ee{.next.next; {.bitf; .[bits 65 to 95]}}; foo + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + X +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function g: + H; r +[inout] Inputs for function g: + x; us +[inout] Out (internal) for function imprecise_bts_1671: + b; c; ee +[inout] Inputs for function imprecise_bts_1671: + c; ee; foo +[inout] Out (internal) for function return_8: + __retres +[inout] Inputs for function return_8: + \nothing +[inout] Out (internal) for function main: + h{.a; .b; .c}; k8.b; kr8.b; ll.b; VV; X; G; H; b; c; ee; + v{{.a; .b; .c}; .d}; l_161; __retres +[inout] Inputs for function main: + h{.a; .b}; VV; q4; x; us; c; ee; foo diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bitwise_float.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bitwise_float.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bitwise_float.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bitwise_float.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bitwise_float.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/bitwise_float.c:1:[value] Function main: precondition got status unknown. +[value] Called Frama_C_show_each_x([1028443341..1084227584]) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + x ∈ {0; 2} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM a +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + x +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bitwise_or.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bitwise_or.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bitwise_or.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bitwise_or.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,83 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bitwise_or.c (with preprocessing) +[kernel] Parsing share/builtin.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ {0} + or1 ∈ {0} + or2 ∈ {0} + or3 ∈ {0} + or4 ∈ {0} + or5 ∈ {0} + and1 ∈ {0} + and2 ∈ {0} + and3 ∈ {0} + and4 ∈ {0} + xor1 ∈ {0} + xor2 ∈ {0} + uand1 ∈ {0} + uand2 ∈ {0} + uand3 ∈ {0} + uand4 ∈ {0} + uand5 ∈ {0} + a ∈ {0} + b ∈ {0} + c ∈ {0} + d ∈ {0} + e ∈ {0} + s ∈ [--..--] +[value] computing for function Frama_C_interval <- main. + Called from tests/misc/bitwise_or.c:13. +share/builtin.h:46:[value] Function Frama_C_interval: precondition got status valid. +[value] computing for function Frama_C_update_entropy <- Frama_C_interval <- main. + Called from share/builtin.c:44. +[value] using specification for function Frama_C_update_entropy +[value] Done for function Frama_C_update_entropy +share/builtin.h:47:[value] Function Frama_C_interval: postcondition got status valid. +[value] Recording results for Frama_C_interval +[value] Done for function Frama_C_interval +[value] computing for function Frama_C_interval <- main. + Called from tests/misc/bitwise_or.c:14. +[value] computing for function Frama_C_update_entropy <- Frama_C_interval <- main. + Called from share/builtin.c:44. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_interval +[value] Done for function Frama_C_interval +[value] computing for function Frama_C_interval <- main. + Called from tests/misc/bitwise_or.c:15. +[value] computing for function Frama_C_update_entropy <- Frama_C_interval <- main. + Called from share/builtin.c:44. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_interval +[value] Done for function Frama_C_interval +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function Frama_C_interval: + Frama_C_entropy_source ∈ [--..--] + r ∈ [-3..27] + aux ∈ [--..--] +[value] Values at end of function main: + Frama_C_entropy_source ∈ [--..--] + or1 ∈ [--..--] + or2 ∈ [13..31] + or3 ∈ [--..--] + and1 ∈ [0..17] + and2 ∈ [0..17] + and3 ∈ [0..27] + xor1 ∈ [0..31] + xor2 ∈ [--..--] + uand4 ∈ [8..24] + a ∈ [3..17] + b ∈ [-3..17] + c ∈ [13..27] + i1 ∈ [0..0x1FFFE],0%2 + i2 ∈ [0..0x3FFFC],0%4 + v1 ∈ [0..0x1FFFE],0%2 + v2 ∈ [0..0x3FFFF] + mask07 ∈ {5} + mask0f ∈ {13} + mask1f ∈ {13; 29} + __retres ∈ {0} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bitwise_pointer.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bitwise_pointer.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bitwise_pointer.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bitwise_pointer.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,80 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bitwise_pointer.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0] ∈ {0} + [1] ∈ {1} + [2] ∈ {2} + [3] ∈ {3} + [4] ∈ {4} + [5] ∈ {5} + [6] ∈ {6} + [7] ∈ {7} + [8] ∈ {8} + [9] ∈ {9} + [10..99] ∈ {0} + p ∈ {0} + x ∈ {0} + t1[0] ∈ {0} + [1] ∈ {1} + [2] ∈ {2} + [3] ∈ {3} + [4] ∈ {4} + [5] ∈ {5} + [6] ∈ {6} + [7] ∈ {7} + [8] ∈ {8} + [9] ∈ {9} + [10..99] ∈ {0} + p1 ∈ {0} + x1 ∈ {0} +tests/misc/bitwise_pointer.i:18:[value] warning: Operation {{ &t + {7} }} & {-8} incurs a loss of precision +tests/misc/bitwise_pointer.i:18:[value] Assigning imprecise value to p. + The imprecision originates from Arithmetic {tests/misc/bitwise_pointer.i:18} +tests/misc/bitwise_pointer.i:19:[value] Reading left-value p. + It contains a garbled mix of {t} because of Arithmetic + {tests/misc/bitwise_pointer.i:18}. +tests/misc/bitwise_pointer.i:19:[kernel] warning: out of bounds write. assert \valid(p); +tests/misc/bitwise_pointer.i:22:[value] warning: Operation {{ &t1 + {7} }} & {-8} incurs a loss of precision +tests/misc/bitwise_pointer.i:22:[value] Assigning imprecise value to p1. + The imprecision originates from Arithmetic {tests/misc/bitwise_pointer.i:22} +tests/misc/bitwise_pointer.i:23:[value] Reading left-value p1. + It contains a garbled mix of {t1} because of Arithmetic + {tests/misc/bitwise_pointer.i:22}. +tests/misc/bitwise_pointer.i:23:[kernel] warning: out of bounds write. assert \valid(p1); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + t[0..99] ∈ [--..--] + p ∈ {{ &t + [0..99] }} + x ∈ [-128..127] + t1[0..99] ∈ [--..--] + p1 ∈ {{ &t1 + [0..99] }} + x1 ∈ [-128..127] + mask ∈ {7} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + t[0..99] FROM \nothing (and SELF) + p FROM \nothing + x FROM t[0..99] + t1[0..99] FROM \nothing (and SELF) + p1 FROM \nothing + x1 FROM t1[0..99] +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + t[0..99]; p; x; t1[0..99]; p1; x1; mask +[inout] Inputs for function main: + t[0..99]; p; t1[0..99]; p1 +[inout] InOut (internal) for function main: + Operational inputs: + t[0..99]; t1[0..99] + Operational inputs on termination: + t[0..99]; t1[0..99] + Sure outputs: + p; x; p1; x1; mask diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/biz.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/biz.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/biz.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/biz.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/biz.i (no preprocessing) +[value] Analyzing a complete application starting at f2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + p ∈ {0} + q ∈ {0} + G ∈ {0} +[value] Recording results for f2 +[value] done for function f2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f2: + p ∈ {{ &G + {1} }} + G[bits 0 to 7] ∈ {3} + [bits 8 to 31] ∈ {0} +[from] Computing for function f2 +[from] Done for function f2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f2: + p FROM \nothing + G[bits 0 to 7] FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f2: + p; G[bits 0 to 7]; tmp +[inout] Inputs for function f2: + p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bool.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bool.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bool.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bool.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,75 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bool.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] computing for function printf <- main. + Called from tests/misc/bool.i:12. +tests/misc/bool.i:12:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] using specification for function printf +[value] Done for function printf +[value] computing for function printf <- main. + Called from tests/misc/bool.i:14. +[value] Done for function printf +[value] computing for function printf <- main. + Called from tests/misc/bool.i:16. +[value] Done for function printf +[value] computing for function printf <- main. + Called from tests/misc/bool.i:18. +[value] Done for function printf +[value] computing for function printf <- main. + Called from tests/misc/bool.i:20. +[value] Done for function printf +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + x ∈ {1} + y ∈ {2} +[from] Computing for function main +[from] Computing for function printf <-main +[from] Done for function printf +tests/misc/bool.i:12:[from] warning: variadic call detected. Using only 1 argument(s). +tests/misc/bool.i:14:[from] warning: variadic call detected. Using only 1 argument(s). +tests/misc/bool.i:16:[from] warning: variadic call detected. Using only 1 argument(s). +tests/misc/bool.i:18:[from] warning: variadic call detected. Using only 1 argument(s). +tests/misc/bool.i:20:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function printf: + NO EFFECTS +[from] Function main: + x FROM \nothing + y FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + x; y +[inout] Inputs for function main: + x; y +/* Generated by Frama-C */ +/*@ assigns \nothing; */ +extern void printf(char const * , ...); + +_Bool x; +int y; +int main(void) +{ + x = (_Bool)0; + printf("%d\n",(int)x); + x = (_Bool)1; + printf("%d\n",(int)x); + y = (int)x + 1; + printf("%d,%d\n",(int)x,y); + x = (_Bool)((int)x + 1 != 0); + printf("%d\n",(int)x); + x = (_Bool)((int)x + 1 != 0); + printf("%d\n",(int)x); + return y; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/branch2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/branch2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/branch2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/branch2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,31 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/branch2.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + etat_to ∈ {0} + changepage ∈ {0} + plein ∈ {0} + NumFonct ∈ {0} + NumSsPage ∈ {0} +tests/misc/branch2.i:14:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + plein ∈ {1} + NumSsPage ∈ {9} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + plein FROM \nothing + NumSsPage FROM NumSsPage (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + plein; NumSsPage +[inout] Inputs for function main: + changepage; NumSsPage diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/branch.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/branch.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/branch.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/branch.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/branch.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} + c ∈ {0} + d ∈ {0} + e ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + a; b +[inout] Inputs for function main: + c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/broken_loop.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/broken_loop.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/broken_loop.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/broken_loop.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/broken_loop.i (no preprocessing) +[value] Analyzing a complete application starting at loop +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {0} +[value] Recording results for loop +[value] done for function loop +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function loop: + X ∈ {2} +[from] Computing for function loop +[from] Done for function loop +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function loop: + X FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function loop: + X +[inout] Inputs for function loop: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0451.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0451.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0451.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0451.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,5 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bts0451.i (no preprocessing) +tests/misc/bts0451.i:26:[kernel] user error: break outside of a loop or switch +[kernel] user error: stopping on file "tests/misc/bts0451.i" that has errors. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0452.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0452.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0452.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0452.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,4 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bts0452.i (no preprocessing) +tests/misc/bts0452.i:13:[kernel] warning: Body of function f falls-through. Adding a return statement +tests/misc/bts0452.i:27:[kernel] warning: Body of function h falls-through. Adding a return statement diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0489.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0489.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0489.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0489.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,13 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bts0489.i (no preprocessing) +Found representation 2 +Found representation 2U +Found representation 2 +Found representation 5UL +Found representation 5U +Found representation 1 +Found representation 20000 +Found representation 20000L +Found representation 20000 +Found representation 20000 +Found representation 20000 diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0506.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0506.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0506.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0506.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,276 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bts0506.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/misc/bts0506.i:47. +[value] Recording results for f +[value] Done for function f +[value] computing for function main2 <- main. + Called from tests/misc/bts0506.i:49. +[value] computing for function f1 <- main2 <- main. + Called from tests/misc/bts0506.i:15. +tests/misc/bts0506.i:15:[kernel] warning: Neither code nor specification for function f1, generating default assigns from the prototype +[value] using specification for function f1 +[value] Done for function f1 +[value] computing for function f1 <- main2 <- main. + Called from tests/misc/bts0506.i:16. +[value] Done for function f1 +[value] computing for function f1 <- main2 <- main. + Called from tests/misc/bts0506.i:17. +[value] Done for function f1 +[value] computing for function f1 <- main2 <- main. + Called from tests/misc/bts0506.i:18. +[value] Done for function f1 +[value] computing for function f2 <- main2 <- main. + Called from tests/misc/bts0506.i:20. +tests/misc/bts0506.i:20:[kernel] warning: Neither code nor specification for function f2, generating default assigns from the prototype +[value] using specification for function f2 +[value] Done for function f2 +[value] computing for function f2 <- main2 <- main. + Called from tests/misc/bts0506.i:21. +[value] Done for function f2 +[value] computing for function f2 <- main2 <- main. + Called from tests/misc/bts0506.i:22. +[value] Done for function f2 +[value] computing for function f3 <- main2 <- main. + Called from tests/misc/bts0506.i:24. +tests/misc/bts0506.i:24:[kernel] warning: Neither code nor specification for function f3, generating default assigns from the prototype +[value] using specification for function f3 +[value] Done for function f3 +[value] computing for function f3 <- main2 <- main. + Called from tests/misc/bts0506.i:25. +[value] Done for function f3 +[value] computing for function f4 <- main2 <- main. + Called from tests/misc/bts0506.i:27. +tests/misc/bts0506.i:27:[kernel] warning: Neither code nor specification for function f4, generating default assigns from the prototype +[value] using specification for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main2 <- main. + Called from tests/misc/bts0506.i:28. +[value] Done for function f4 +tests/misc/bts0506.i:28:[kernel] warning: non-finite float value being returned: assert(\is_finite(\returned_value)) +[value] computing for function f5 <- main2 <- main. + Called from tests/misc/bts0506.i:30. +tests/misc/bts0506.i:30:[kernel] warning: Neither code nor specification for function f5, generating default assigns from the prototype +[value] using specification for function f5 +[value] Done for function f5 +tests/misc/bts0506.i:30:[kernel] warning: non-finite double value ([--..--]): + assert \is_finite(tmp_10); + (tmp_10 from f5()) +tests/misc/bts0506.i:30:[kernel] warning: non-finite float value ([-1.79769313486e+308 .. 1.79769313486e+308]): + assert \is_finite((float)tmp_10); + (tmp_10 from f5()) +[value] computing for function f5 <- main2 <- main. + Called from tests/misc/bts0506.i:31. +[value] Done for function f5 +[value] computing for function f6 <- main2 <- main. + Called from tests/misc/bts0506.i:33. +tests/misc/bts0506.i:33:[kernel] warning: Neither code nor specification for function f6, generating default assigns from the prototype +[value] using specification for function f6 +[value] Done for function f6 +[value] computing for function f6 <- main2 <- main. + Called from tests/misc/bts0506.i:34. +[value] Done for function f6 +[value] computing for function f6 <- main2 <- main. + Called from tests/misc/bts0506.i:35. +[value] Done for function f6 +[value] computing for function f7 <- main2 <- main. + Called from tests/misc/bts0506.i:37. +tests/misc/bts0506.i:37:[kernel] warning: Neither code nor specification for function f7, generating default assigns from the prototype +[value] using specification for function f7 +[value] Done for function f7 +[value] computing for function f7 <- main2 <- main. + Called from tests/misc/bts0506.i:38. +[value] Done for function f7 +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {43} +[value] Values at end of function main2: + r1 ∈ [--..--] + r2 ∈ [--..--] + r3 ∈ [--..--] + r4 ∈ [--..--] + r5 ∈ [--..--] + r6 ∈ [--..--] + r7 ∈ [--..--] + r8 ∈ [--..--] + r8bis ∈ [--..--] + r9 ∈ [--..--] + r10 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + r11 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + r12 ∈ [--..--] + r13 ∈ {{ NULL + [--..--] ; &alloced_return_f6 + [0..2147483616],0%32 }} + r14 ∈ {{ NULL + [--..--] ; &alloced_return_f6 + [0..2147483616],0%32 }} + r15 ∈ {{ NULL + [--..--] ; &alloced_return_f6 + [0..2147483616],0%32 }} + r16 ∈ {{ NULL + [--..--] ; &alloced_return_f7 + [0..2147483647] }} + r17 ∈ {{ NULL + [--..--] ; &alloced_return_f7 + [0..2147483647] }} +[value] Values at end of function main: + x ∈ {43} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main2 +[from] Computing for function f1 <-main2 +[from] Done for function f1 +[from] Computing for function f2 <-main2 +[from] Done for function f2 +[from] Computing for function f3 <-main2 +[from] Done for function f3 +[from] Computing for function f4 <-main2 +[from] Done for function f4 +[from] Computing for function f5 <-main2 +[from] Done for function f5 +[from] Computing for function f6 <-main2 +[from] Done for function f6 +[from] Computing for function f7 <-main2 +[from] Done for function f7 +[from] Done for function main2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM x +[from] Function f1: + \result FROM \nothing +[from] Function f2: + \result FROM \nothing +[from] Function f3: + \result FROM \nothing +[from] Function f4: + \result FROM \nothing +[from] Function f5: + \result FROM \nothing +[from] Function f6: + \result FROM \nothing +[from] Function f7: + \result FROM \nothing +[from] Function main2: + NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main2: + r1; r2; tmp_0; r3; r4; tmp_2; r5; r6; r7; tmp_5; r8; r8bis; tmp_7; + r9; r10; r11; tmp_10; r12; r13; r14; r15; r16; r17 +[inout] Inputs for function main2: + \nothing +[inout] Out (internal) for function main: + x; tmp +[inout] Inputs for function main: + \nothing +/* Generated by Frama-C */ +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int f1(); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern long f2(); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern unsigned int f3(); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern float f4(); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern double f5(); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int *f6(); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern void *f7(); + +void main2(void) +{ + long r1; + short r2; + int tmp_0; + int r3; + unsigned int r4; + int tmp_2; + long r5; + int r6; + unsigned long r7; + long tmp_5; + unsigned int r8; + int r8bis; + unsigned int tmp_7; + float r9; + double r10; + float r11; + double tmp_10; + double r12; + void *r13; + int *r14; + char *r15; + void *r16; + int *r17; + r1 = (long)f1(); + tmp_0 = f1(); + r2 = (short)tmp_0; + r3 = f1(); + tmp_2 = f1(); + r4 = (unsigned int)tmp_2; + r5 = f2(); + r6 = (int)f2(); + tmp_5 = f2(); + r7 = (unsigned long)tmp_5; + r8 = f3(); + tmp_7 = f3(); + r8bis = (int)tmp_7; + r9 = f4(); + r10 = (double)f4(); + tmp_10 = f5(); + /*@ assert Value: is_nan_or_infinite: \is_finite(tmp_10); */ + /*@ assert Value: is_nan_or_infinite: \is_finite((float)tmp_10); */ + r11 = (float)tmp_10; + r12 = f5(); + r13 = (void *)f6(); + r14 = f6(); + r15 = (char *)f6(); + r16 = f7(); + r17 = (int *)f7(); + return; +} + +int f(int x) +{ + int __retres; + __retres = x + 1; + return __retres; +} + +void main(void) +{ + short x; + int tmp; + x = (short)4; + { + /*sequence*/ + tmp = f(42); + x = (short)tmp; + } + main2(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0506.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0506.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0506.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0506.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,307 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bts0506.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/misc/bts0506.i:47. +[value] Recording results for f +[value] Done for function f +[value] computing for function main2 <- main. + Called from tests/misc/bts0506.i:49. +[value] computing for function f1 <- main2 <- main. + Called from tests/misc/bts0506.i:15. +tests/misc/bts0506.i:15:[kernel] warning: Neither code nor specification for function f1, generating default assigns from the prototype +[value] using specification for function f1 +[value] Done for function f1 +[value] computing for function f1 <- main2 <- main. + Called from tests/misc/bts0506.i:16. +[value] Done for function f1 +[value] computing for function f1 <- main2 <- main. + Called from tests/misc/bts0506.i:17. +[value] Done for function f1 +[value] computing for function f1 <- main2 <- main. + Called from tests/misc/bts0506.i:18. +[value] Done for function f1 +[value] computing for function f2 <- main2 <- main. + Called from tests/misc/bts0506.i:20. +tests/misc/bts0506.i:20:[kernel] warning: Neither code nor specification for function f2, generating default assigns from the prototype +[value] using specification for function f2 +[value] Done for function f2 +[value] computing for function f2 <- main2 <- main. + Called from tests/misc/bts0506.i:21. +[value] Done for function f2 +[value] computing for function f2 <- main2 <- main. + Called from tests/misc/bts0506.i:22. +[value] Done for function f2 +[value] computing for function f3 <- main2 <- main. + Called from tests/misc/bts0506.i:24. +tests/misc/bts0506.i:24:[kernel] warning: Neither code nor specification for function f3, generating default assigns from the prototype +[value] using specification for function f3 +[value] Done for function f3 +[value] computing for function f3 <- main2 <- main. + Called from tests/misc/bts0506.i:25. +[value] Done for function f3 +[value] computing for function f4 <- main2 <- main. + Called from tests/misc/bts0506.i:27. +tests/misc/bts0506.i:27:[kernel] warning: Neither code nor specification for function f4, generating default assigns from the prototype +[value] using specification for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main2 <- main. + Called from tests/misc/bts0506.i:28. +[value] Done for function f4 +tests/misc/bts0506.i:28:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite(tmp_9); + (tmp_9 from f4()) +[value] computing for function f5 <- main2 <- main. + Called from tests/misc/bts0506.i:30. +tests/misc/bts0506.i:30:[kernel] warning: Neither code nor specification for function f5, generating default assigns from the prototype +[value] using specification for function f5 +[value] Done for function f5 +tests/misc/bts0506.i:30:[kernel] warning: non-finite double value ([--..--]): + assert \is_finite(tmp_10); + (tmp_10 from f5()) +tests/misc/bts0506.i:30:[kernel] warning: non-finite float value ([-1.79769313486e+308 .. 1.79769313486e+308]): + assert \is_finite((float)tmp_10); + (tmp_10 from f5()) +[value] computing for function f5 <- main2 <- main. + Called from tests/misc/bts0506.i:31. +[value] Done for function f5 +[value] computing for function f6 <- main2 <- main. + Called from tests/misc/bts0506.i:33. +tests/misc/bts0506.i:33:[kernel] warning: Neither code nor specification for function f6, generating default assigns from the prototype +[value] using specification for function f6 +[value] Done for function f6 +[value] computing for function f6 <- main2 <- main. + Called from tests/misc/bts0506.i:34. +[value] Done for function f6 +[value] computing for function f6 <- main2 <- main. + Called from tests/misc/bts0506.i:35. +[value] Done for function f6 +[value] computing for function f7 <- main2 <- main. + Called from tests/misc/bts0506.i:37. +tests/misc/bts0506.i:37:[kernel] warning: Neither code nor specification for function f7, generating default assigns from the prototype +[value] using specification for function f7 +[value] Done for function f7 +[value] computing for function f7 <- main2 <- main. + Called from tests/misc/bts0506.i:38. +[value] Done for function f7 +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {43} +[value] Values at end of function main2: + r1 ∈ [--..--] + r2 ∈ [--..--] + r3 ∈ [--..--] + r4 ∈ [--..--] + r5 ∈ [--..--] + r6 ∈ [--..--] + r7 ∈ [--..--] + r8 ∈ [--..--] + r8bis ∈ [--..--] + r9 ∈ [--..--] + r10 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + r11 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + r12 ∈ [--..--] + r13 ∈ {{ NULL + [--..--] ; &alloced_return_f6 + [0..2147483616],0%32 }} + r14 ∈ {{ NULL + [--..--] ; &alloced_return_f6 + [0..2147483616],0%32 }} + r15 ∈ {{ NULL + [--..--] ; &alloced_return_f6 + [0..2147483616],0%32 }} + r16 ∈ {{ NULL + [--..--] ; &alloced_return_f7 + [0..2147483647] }} + r17 ∈ {{ NULL + [--..--] ; &alloced_return_f7 + [0..2147483647] }} +[value] Values at end of function main: + x ∈ {43} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main2 +[from] Computing for function f1 <-main2 +[from] Done for function f1 +[from] Computing for function f2 <-main2 +[from] Done for function f2 +[from] Computing for function f3 <-main2 +[from] Done for function f3 +[from] Computing for function f4 <-main2 +[from] Done for function f4 +[from] Computing for function f5 <-main2 +[from] Done for function f5 +[from] Computing for function f6 <-main2 +[from] Done for function f6 +[from] Computing for function f7 <-main2 +[from] Done for function f7 +[from] Done for function main2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM x +[from] Function f1: + \result FROM \nothing +[from] Function f2: + \result FROM \nothing +[from] Function f3: + \result FROM \nothing +[from] Function f4: + \result FROM \nothing +[from] Function f5: + \result FROM \nothing +[from] Function f6: + \result FROM \nothing +[from] Function f7: + \result FROM \nothing +[from] Function main2: + NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main2: + r1; tmp; r2; tmp_0; r3; tmp_1; r4; tmp_2; r5; tmp_3; r6; tmp_4; r7; + tmp_5; r8; tmp_6; r8bis; tmp_7; r9; tmp_8; r10; tmp_9; r11; tmp_10; + r12; tmp_11; r13; tmp_12; r14; tmp_13; r15; tmp_14; r16; tmp_15; r17; + tmp_16 +[inout] Inputs for function main2: + \nothing +[inout] Out (internal) for function main: + x; tmp +[inout] Inputs for function main: + \nothing +/* Generated by Frama-C */ +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int f1(); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern long f2(); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern unsigned int f3(); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern float f4(); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern double f5(); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int *f6(); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern void *f7(); + +void main2(void) +{ + long r1; + int tmp; + short r2; + int tmp_0; + int r3; + int tmp_1; + unsigned int r4; + int tmp_2; + long r5; + long tmp_3; + int r6; + long tmp_4; + unsigned long r7; + long tmp_5; + unsigned int r8; + unsigned int tmp_6; + int r8bis; + unsigned int tmp_7; + float r9; + float tmp_8; + double r10; + float tmp_9; + float r11; + double tmp_10; + double r12; + double tmp_11; + void *r13; + int *tmp_12; + int *r14; + int *tmp_13; + char *r15; + int *tmp_14; + void *r16; + void *tmp_15; + int *r17; + void *tmp_16; + tmp = f1(); + r1 = (long)tmp; + tmp_0 = f1(); + r2 = (short)tmp_0; + tmp_1 = f1(); + r3 = tmp_1; + tmp_2 = f1(); + r4 = (unsigned int)tmp_2; + tmp_3 = f2(); + r5 = tmp_3; + tmp_4 = f2(); + r6 = (int)tmp_4; + tmp_5 = f2(); + r7 = (unsigned long)tmp_5; + tmp_6 = f3(); + r8 = tmp_6; + tmp_7 = f3(); + r8bis = (int)tmp_7; + tmp_8 = f4(); + r9 = tmp_8; + tmp_9 = f4(); + /*@ assert Value: is_nan_or_infinite: \is_finite(tmp_9); */ + r10 = (double)tmp_9; + tmp_10 = f5(); + /*@ assert Value: is_nan_or_infinite: \is_finite(tmp_10); */ + /*@ assert Value: is_nan_or_infinite: \is_finite((float)tmp_10); */ + r11 = (float)tmp_10; + tmp_11 = f5(); + r12 = tmp_11; + tmp_12 = f6(); + r13 = (void *)tmp_12; + tmp_13 = f6(); + r14 = tmp_13; + tmp_14 = f6(); + r15 = (char *)tmp_14; + tmp_15 = f7(); + r16 = tmp_15; + tmp_16 = f7(); + r17 = (int *)tmp_16; + return; +} + +int f(int x) +{ + int __retres; + __retres = x + 1; + return __retres; +} + +void main(void) +{ + short x; + int tmp; + x = (short)4; + { + /*sequence*/ + tmp = f(42); + x = (short)tmp; + } + main2(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0525-2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0525-2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0525-2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0525-2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,3 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bts0525-2.i (no preprocessing) +[kernel] Parsing tests/misc/bts0525.i (no preprocessing) diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0525.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0525.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0525.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0525.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,3 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bts0525.i (no preprocessing) +[kernel] Parsing tests/misc/bts0525-2.i (no preprocessing) diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0541.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0541.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0541.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0541.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bts0541.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + __fc_random_counter ∈ {0} + __fc_rand_max ∈ {32767} + __fc_heap_status ∈ [--..--] +tests/misc/bts0541.c:13:[value] Assertion got status valid. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + x ∈ {1} + __retres ∈ {0} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0775.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0775.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0775.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0775.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bts0775.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + r ∈ {1} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + r +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0858.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0858.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0858.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0858.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,24 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bts0858.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + tmp ∈ {4294967295} + __retres ∈ {1} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + tmp; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0990_link.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0990_link.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bts0990_link.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts0990_link.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,8 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bts0990_link.i (no preprocessing) +[kernel] Parsing tests/misc/bts0990_link_1.i (no preprocessing) +[kernel] user error: Incompatible declaration for s: + different type constructors: char * vs. char [100] + First declaration was at tests/misc/bts0990_link.i:8 + Current declaration is at tests/misc/bts0990_link_1.i:4 +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bts1135_ulevel.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts1135_ulevel.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bts1135_ulevel.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts1135_ulevel.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,38 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bts1135_ulevel.i (no preprocessing) +/* Generated by Frama-C */ +int X; +void main(int c) +{ + int i; + i = 0; + if (! (i < 10)) goto unrolling_2_loop; + if (c) + /*@ ensures \false; */ + goto there_unrolling_6_loop; + X ++; + there_unrolling_6_loop: i ++; + /*@ assert c ≡ 0 ⇒ \at(X,there_unrolling_6_loop) ≡ i+1; */ ; + unrolling_5_loop: ; + if (! (i < 10)) goto unrolling_2_loop; + if (c) + /*@ ensures \false; */ + goto there_unrolling_4_loop; + X ++; + there_unrolling_4_loop: i ++; + /*@ assert c ≡ 0 ⇒ \at(X,there_unrolling_4_loop) ≡ i+1; */ ; + unrolling_3_loop: ; + /*@ loop pragma UNROLL "done", 2; */ + while (i < 10) { + if (c) + /*@ ensures \false; */ + goto there; + X ++; + there: i ++; + /*@ assert c ≡ 0 ⇒ \at(X,there) ≡ i+1; */ ; + } + unrolling_2_loop: ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bts1201.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts1201.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bts1201.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts1201.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,30 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bts1201.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/bts1201.i:5:[value] Assertion got status valid. +[value] Recording results for main +[value] done for function main +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main2 +[value] done for function main2 +/* Generated by Frama-C */ +void main(void) +{ + /*@ assert \true; */ ; + return; +} + +void main2(void) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bts1306.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts1306.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bts1306.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts1306.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,72 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bts1306.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function g <- main. + Called from tests/misc/bts1306.i:9. +tests/misc/bts1306.i:5:[kernel] warning: non-finite double value ([-1.79769313486e+308 .. 1.79769313486e+308]): + assert \is_finite((double)(x*x)); +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function g: + y ∈ [-1.79769313486e+308 .. 1.79769313486e+308] +[value] Values at end of function main: + __retres ∈ {0} +/* Generated by Frama-C */ +void g(double x) +{ + double y; + /*@ assert Value: is_nan_or_infinite: \is_finite((double)(x*x)); */ + y = x * x; + return; +} + +int main(double x) +{ + int __retres; + g(x); + __retres = 0; + return __retres; +} + + +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function g <- main. + Called from tests/misc/bts1306.i:9. +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function g: + y ∈ [-1.79769313486e+308 .. 1.79769313486e+308] +[value] Values at end of function main: + __retres ∈ {0} +/* Generated by Frama-C */ +void g(double x) +{ + double y; + /*@ assert Value: is_nan_or_infinite: \is_finite((double)(x*x)); */ + y = x * x; + return; +} + +int main(double x) +{ + int __retres; + g(x); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bts1347.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts1347.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bts1347.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bts1347.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,76 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bts1347.i (no preprocessing) +[value] Analyzing an incomplete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/bts1347.i:9:[kernel] warning: out of bounds read. assert \valid_read(x); +[value] Recording results for f +[value] done for function f +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/bts1347.i:10:[kernel] warning: out of bounds read. assert \valid_read(tmp); + (tmp from x++) +[value] Recording results for g +[value] done for function g +[value] Analyzing an incomplete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/bts1347.i:9:[kernel] warning: out of bounds read. assert \valid_read(x); +:1:[value] Assertion 'emitter' got status valid. +[value] Recording results for f +[value] done for function f +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/bts1347.i:10:[kernel] warning: out of bounds read. assert \valid_read(tmp); + (tmp from x++) +[value] Recording results for g +[value] done for function g +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion 'emitter' (generated) + Locally valid, but unreachable. + By Value because: + - Unreachable return (file tests/misc/bts1347.i, line 9) +[ Dead ] Assertion 'emitter' (generated) + Locally valid, but unreachable. + By Value because: + - Unreachable return (file tests/misc/bts1347.i, line 9) +[Unreachable] Unreachable return (file tests/misc/bts1347.i, line 9) + by Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion 'emitter' (generated) + by Value. +[ - ] Assertion 'Value,mem_access' (file tests/misc/bts1347.i, line 10) + tried with Value. +[ Partial ] Assertion 'emitter' (generated) + By emitter, with pending: + - Assertion 'Value,mem_access' (file tests/misc/bts1347.i, line 10) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 1 Locally validated + 1 To be validated + 2 Dead properties + 1 Unreachable + 6 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/buffer_overflow.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/buffer_overflow.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/buffer_overflow.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/buffer_overflow.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/buffer_overflow.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/buffer_overflow.i:18:[kernel] warning: accessing out of bounds index {10}. assert loop_counter < 10; +tests/misc/buffer_overflow.i:18:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +tests/misc/buffer_overflow.i:18:[value] Assertion 'Value,index_bound' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + test_value; loop_counter; buf[1..9] +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/buffer_overflow.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/buffer_overflow.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/buffer_overflow.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/buffer_overflow.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/buffer_overflow.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/buffer_overflow.i:15:[value] entering loop for the first time +tests/misc/buffer_overflow.i:18:[kernel] warning: accessing out of bounds index [1..10]. assert loop_counter < 10; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + test_value; loop_counter; buf[1..9] +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bug0196.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug0196.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bug0196.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug0196.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,74 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bug0196.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function fact <- main. + Called from tests/misc/bug0196.c:16. +tests/misc/bug0196.c:7:[value] entering loop for the first time +tests/misc/bug0196.c:8:[value] Assertion got status valid. +tests/misc/bug0196.c:11:[value] cannot evaluate ACSL term, \at() on a C label is unsupported +tests/misc/bug0196.c:11:[value] Assertion got status unknown. +tests/misc/bug0196.c:10:[kernel] warning: signed overflow. assert r*tmp ≤ 2147483647; + (tmp from n--) +[value] Recording results for fact +[value] Done for function fact +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function fact: + n ∈ {0} + r ∈ [1..2147483647] +[value] Values at end of function main: + +[from] Computing for function fact +[from] Done for function fact +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function fact: + \result FROM n +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function fact: + n; r; tmp +[inout] Inputs for function fact: + \nothing +[inout] Out (internal) for function main: + tmp +[inout] Inputs for function main: + \nothing +/* Generated by Frama-C */ +int fact(int n) +{ + int r; + r = 1; + while (n > 0) { + int tmp; + /*@ assert n > 0; */ ; + before: + { + /*sequence*/ + tmp = n; + n --; + /*@ assert Value: signed_overflow: r*tmp ≤ 2147483647; */ + r *= tmp; + } + /*@ assert r ≡ \at(r*n,before); */ ; + } + while_0_break: ; + return r; +} + +int main(void) +{ + int tmp; + tmp = fact(3); + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bug_0209.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug_0209.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bug_0209.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug_0209.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,4 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bug_0209.c (with preprocessing) +[kernel] warning: no input file. +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bug0223.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug0223.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bug0223.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug0223.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,65 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bug0223.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + ch1 ∈ {{ NULL ; &S_ch1[0] }} + ch2 ∈ {{ NULL ; &S_ch2[0] }} + S_ch1[0..1] ∈ [--..--] + S_ch2[0..1] ∈ [--..--] +[value] computing for function F <- main. + Called from tests/misc/bug0223.i:33. +tests/misc/bug0223.i:33:[kernel] warning: Neither code nor specification for function F, generating default assigns from the prototype +[value] using specification for function F +[value] Done for function F +[value] computing for function F <- main. + Called from tests/misc/bug0223.i:34. +[value] Done for function F +[value] computing for function h2 <- main. + Called from tests/misc/bug0223.i:35. +[value] computing for function my_strcnmp <- h2 <- main. + Called from tests/misc/bug0223.i:16. +tests/misc/bug0223.i:16:[kernel] warning: Neither code nor specification for function my_strcnmp, generating default assigns from the prototype +[value] using specification for function my_strcnmp +[value] Done for function my_strcnmp +[value] Recording results for h2 +[value] Done for function h2 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function h2: + test ∈ {0; 1} +[value] Values at end of function main: + i ∈ {0} + j ∈ {0; 1} + k ∈ {0} + l ∈ {0; 1} + p ∈ {{ &j }} +[from] Computing for function h2 +[from] Computing for function my_strcnmp <-h2 +[from] Done for function my_strcnmp +[from] Done for function h2 +[from] Computing for function main +[from] Computing for function F <-main +[from] Done for function F +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function F: + \result FROM \nothing +[from] Function my_strcnmp: + \result FROM n +[from] Function h2: + NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function h2: + test; tmp +[inout] Inputs for function h2: + ch1; ch2 +[inout] Out (internal) for function main: + i; j; k; l; p; tmp; tmp_0 +[inout] Inputs for function main: + ch1; ch2 diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bug0223.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug0223.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bug0223.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug0223.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,65 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bug0223.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + ch1 ∈ {{ NULL ; &S_ch1[0] }} + ch2 ∈ {{ NULL ; &S_ch2[0] }} + S_ch1[0..1] ∈ [--..--] + S_ch2[0..1] ∈ [--..--] +[value] computing for function F <- main. + Called from tests/misc/bug0223.i:33. +tests/misc/bug0223.i:33:[kernel] warning: Neither code nor specification for function F, generating default assigns from the prototype +[value] using specification for function F +[value] Done for function F +[value] computing for function F <- main. + Called from tests/misc/bug0223.i:34. +[value] Done for function F +[value] computing for function h2 <- main. + Called from tests/misc/bug0223.i:35. +[value] computing for function my_strcnmp <- h2 <- main. + Called from tests/misc/bug0223.i:16. +tests/misc/bug0223.i:16:[kernel] warning: Neither code nor specification for function my_strcnmp, generating default assigns from the prototype +[value] using specification for function my_strcnmp +[value] Done for function my_strcnmp +[value] Recording results for h2 +[value] Done for function h2 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function h2: + test ∈ {0; 1} +[value] Values at end of function main: + i ∈ {0} + j ∈ {0; 1} + k ∈ {0} + l ∈ {0; 1} + p ∈ {{ &j }} +[from] Computing for function h2 +[from] Computing for function my_strcnmp <-h2 +[from] Done for function my_strcnmp +[from] Done for function h2 +[from] Computing for function main +[from] Computing for function F <-main +[from] Done for function F +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function F: + \result FROM \nothing +[from] Function my_strcnmp: + \result FROM n +[from] Function h2: + NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function h2: + test; tmp +[inout] Inputs for function h2: + ch1; ch2 +[inout] Out (internal) for function main: + i; j; k; l; p; tmp; tmp_0 +[inout] Inputs for function main: + ch1; ch2 diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bug_023.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug_023.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bug_023.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug_023.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,35 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bug_023.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + x ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/bug_023.i:8. +tests/misc/bug_023.i:8:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] using specification for function f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ [--..--] + __retres ∈ {0} +[from] Computing for function main +[from] Computing for function f <-main +[from] Done for function f +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM \nothing +[from] Function main: + i FROM i + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; tmp; __retres +[inout] Inputs for function main: + i diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bug_0244.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug_0244.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bug_0244.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug_0244.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,31 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bug_0244.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + R ∈ {0} + p ∈ {0} +tests/misc/bug_0244.i:7:[value] entering loop for the first time +tests/misc/bug_0244.i:10:[value] warning: locals {u} escaping the scope of a block of main through p +tests/misc/bug_0244.i:12:[kernel] warning: accessing left-value that contains escaping addresses: + assert ¬\dangling(&p); +tests/misc/bug_0244.i:12:[kernel] warning: out of bounds read. assert \valid_read(p); +[value] Recording results for main +[value] done for function main +tests/misc/bug_0244.i:12:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + R; p; a; i; u +[inout] Inputs for function main: + p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bug0245.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug0245.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bug0245.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug0245.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bug0245.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + R ∈ {0} + p ∈ {0} + S ∈ {0} + q ∈ {0} +tests/misc/bug0245.i:20:[value] warning: locals {u} escaping the scope of a block of main through p +tests/misc/bug0245.i:20:[value] warning: locals {v} escaping the scope of a block of main through q +tests/misc/bug0245.i:23:[kernel] warning: accessing left-value that contains escaping addresses: + assert ¬\dangling(&p); +tests/misc/bug0245.i:23:[kernel] warning: completely indeterminate value in p. +tests/misc/bug0245.i:24:[kernel] warning: accessing left-value that contains escaping addresses: + assert ¬\dangling(&q); +tests/misc/bug0245.i:24:[kernel] warning: completely indeterminate value in q. +[value] Recording results for main +[value] done for function main +tests/misc/bug0245.i:23:[value] Assertion 'Value,dangling_pointer' got final status invalid. +tests/misc/bug0245.i:24:[value] Assertion 'Value,dangling_pointer' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + R ∈ {0} + p ∈ ESCAPINGADDR + S ∈ {0} + q ∈ ESCAPINGADDR + a ∈ {2} + i ∈ {2} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + R FROM c (and SELF) + p FROM \nothing + S FROM d (and SELF) + q FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + R; p; S; q; a; i; u; v +[inout] Inputs for function main: + p; q diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bug0277.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug0277.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bug0277.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug0277.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,2 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bug0277.i (no preprocessing) diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/bug.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/bug.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/bug.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/bug.i (no preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + +[from] Computing for function f +[from] Done for function f +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + \nothing +[inout] Inputs for function f: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/call_2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/call_2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/call_2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/call_2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/call_2.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/call_2.i:15:[kernel] warning: signed overflow. assert -2147483648 ≤ i+j ≤ 2147483647; +[value] computing for function ff <- main. + Called from tests/misc/call_2.i:15. +tests/misc/call_2.i:6:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(f); +[value] Called Frama_C_show_each([-2147483648..2147483647], + [-3.40282346639e+38 .. 3.40282346639e+38], + {1}) +[value] Recording results for ff +[value] Done for function ff +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function ff: + +[value] Values at end of function main: + f ∈ [--..--] + z ∈ {1} or UNINITIALIZED + p ∈ {{ (int *)&f }} +[from] Computing for function ff +[from] Done for function ff +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function ff: + NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function ff: + \nothing +[inout] Inputs for function ff: + \nothing +[inout] Out (internal) for function main: + f; z; p +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/call_3.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/call_3.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/call_3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/call_3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/call_3.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + GG ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/call_3.i:13. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + GG ∈ {3} + G ∈ {2} + __retres ∈ {1} +[value] Values at end of function main: + GG ∈ {77} + lm ∈ {77} + res_f ∈ {1} + __retres ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + GG FROM \nothing + \result FROM \nothing +[from] Function main: + GG FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + GG; G; __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main: + GG; lm; res_f; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/call_alias.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/call_alias.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/call_alias.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/call_alias.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/call_alias.i (no preprocessing) +[value] Analyzing a complete application starting at main1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {0} + c ∈ {0} + u ∈ {0} + v ∈ {0} + w ∈ {0} + G ∈ {0} + H ∈ {0} + I ∈ {0} +[value] computing for function incr <- main1. + Called from tests/misc/call_alias.i:28. +[value] Recording results for incr +[value] Done for function incr +[value] Recording results for main1 +[value] done for function main1 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function incr: + G ∈ {2} + __retres ∈ {4} +[value] Values at end of function main1: + G ∈ {2} + I ∈ {4} +[from] Computing for function incr +[from] Done for function incr +[from] Computing for function main1 +[from] Done for function main1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function incr: + G FROM G; a; b + \result FROM G; a; b +[from] Function main1: + G FROM G + I FROM G + \result FROM G +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function incr: + G; __retres +[inout] Inputs for function incr: + G +[inout] Out (internal) for function main1: + G; I +[inout] Inputs for function main1: + G; I diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/call_alias.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/call_alias.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/call_alias.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/call_alias.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,45 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/call_alias.i (no preprocessing) +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {0} + c ∈ {0} + u ∈ {0} + v ∈ {0} + w ∈ {0} + G ∈ {0} + H ∈ {0} + I ∈ {0} +[value] computing for function sum <- main2. + Called from tests/misc/call_alias.i:33. +[value] Recording results for sum +[value] Done for function sum +[value] Recording results for main2 +[value] done for function main2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function sum: + __retres ∈ {0} +[value] Values at end of function main2: + I ∈ {0} +[from] Computing for function sum +[from] Done for function sum +[from] Computing for function main2 +[from] Done for function main2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function sum: + \result FROM a; b +[from] Function main2: + I FROM G; H + \result FROM G; H +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function sum: + __retres +[inout] Inputs for function sum: + \nothing +[inout] Out (internal) for function main2: + I +[inout] Inputs for function main2: + G; H; I diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/call_alias.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/call_alias.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/call_alias.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/call_alias.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,53 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/call_alias.i (no preprocessing) +[value] Analyzing a complete application starting at main0 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {0} + c ∈ {0} + u ∈ {0} + v ∈ {0} + w ∈ {0} + G ∈ {0} + H ∈ {0} + I ∈ {0} +[value] computing for function incr <- main0. + Called from tests/misc/call_alias.i:23. +[value] Recording results for incr +[value] Done for function incr +[value] Recording results for main0 +[value] done for function main0 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function incr: + G ∈ {1} + H ∈ {1} + __retres ∈ {2} +[value] Values at end of function main0: + G ∈ {1} + H ∈ {1} + I ∈ {2} +[from] Computing for function incr +[from] Done for function incr +[from] Computing for function main0 +[from] Done for function main0 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function incr: + G FROM G; a + H FROM b; H + \result FROM G; a; b; H +[from] Function main0: + G FROM G + H FROM H + I FROM G; H + \result FROM G; H +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function incr: + G; H; __retres +[inout] Inputs for function incr: + G; H +[inout] Out (internal) for function main0: + G; H; I +[inout] Inputs for function main0: + G; H; I diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/call_deep.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/call_deep.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/call_deep.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/call_deep.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,87 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/call_deep.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + R ∈ {77} + G ∈ {0} + pG ∈ {0} + F0 ∈ {0} + F1 ∈ {0} + H ∈ {0} + XX ∈ {0} + Fmain ∈ {0} +[value] computing for function f1 <- main. + Called from tests/misc/call_deep.i:31. +[value] computing for function f0 <- f1 <- main. + Called from tests/misc/call_deep.i:17. +[value] Recording results for f0 +[value] Done for function f0 +[value] Recording results for f1 +[value] Done for function f1 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f0: + G ∈ {77} + F0 ∈ {77} +[value] Values at end of function f1: + G ∈ {77} + F0 ∈ {77} + F1 ∈ {77} + H ∈ {77} + ph ∈ {{ &G }} + __retres ∈ {77} +[value] Values at end of function main: + G ∈ {77} + pG ∈ {{ &G }} + F0 ∈ {77} + F1 ∈ {77} + H ∈ {77} + XX ∈ {0} + Fmain ∈ {77} + ph ∈ {{ &G }} + pph ∈ {{ &ph }} + __retres ∈ {0} +[from] Computing for function f0 +[from] Done for function f0 +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f0: + G FROM R; p0 + F0 FROM R + \result FROM R +[from] Function f1: + G FROM R; pG + F0 FROM R + F1 FROM R + H FROM R; pp1; ph + ph FROM pG; pp1 + \result FROM R; pG; pp1 +[from] Function main: + G FROM R + pG FROM \nothing + F0 FROM R + F1 FROM R + H FROM R + XX FROM \nothing + Fmain FROM R + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f0: + G; F0 +[inout] Inputs for function f0: + R +[inout] Out (internal) for function f1: + G; F0; F1; H; ph; __retres +[inout] Inputs for function f1: + R; G; pG; ph +[inout] Out (internal) for function main: + G; pG; F0; F1; H; XX; Fmain; ph; pph; __retres +[inout] Inputs for function main: + R; G; pG diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/call_multi.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/call_multi.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/call_multi.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/call_multi.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,69 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/call_multi.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} +[value] computing for function uppol2 <- main. + Called from tests/misc/call_multi.c:29. +[value] computing for function printf <- uppol2 <- main. + Called from tests/misc/call_multi.c:23. +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol2 <- main. + Called from tests/misc/call_multi.c:30. +[value] computing for function printf <- uppol2 <- main. + Called from tests/misc/call_multi.c:23. +[value] Done for function printf +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol2 <- main. + Called from tests/misc/call_multi.c:31. +[value] computing for function printf <- uppol2 <- main. + Called from tests/misc/call_multi.c:23. +[value] Done for function printf +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol2 <- main. + Called from tests/misc/call_multi.c:32. +[value] computing for function printf <- uppol2 <- main. + Called from tests/misc/call_multi.c:23. +[value] Done for function printf +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function uppol2: + wd2 ∈ {0} + wd4 ∈ {-128; 128} + apl2 ∈ {-128; 128} +[value] Values at end of function main: + G ∈ {256} +[from] Computing for function uppol2 +[from] Computing for function printf <-uppol2 +[from] Done for function printf +tests/misc/call_multi.c:23:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function uppol2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function printf: + \result FROM ANYTHING(origin:Unknown) +[from] Function uppol2: + \result FROM al1; al2; plt; plt1; plt2 +[from] Function main: + G FROM G +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function uppol2: + wd2; wd4; apl2 +[inout] Inputs for function uppol2: + \nothing +[inout] Out (internal) for function main: + G; tmp; tmp_0; tmp_1; tmp_2 +[inout] Inputs for function main: + G diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/call.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/call.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/call.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/call.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,78 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/call.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + p[0..9] ∈ {0} + q[0..9] ∈ {0} + r ∈ {0} + res ∈ {0} + x ∈ {0} +tests/misc/call.i:19:[kernel] warning: out of bounds read. assert \valid_read(v+1); +[value] computing for function leaf_fun_int <- main. + Called from tests/misc/call.i:19. +tests/misc/call.i:19:[kernel] warning: Neither code nor specification for function leaf_fun_int, generating default assigns from the prototype +[value] using specification for function leaf_fun_int +[value] Done for function leaf_fun_int +tests/misc/call.i:20:[kernel] warning: out of bounds read. assert \valid_read(v+1); +[value] computing for function leaf_fun_charp <- main. + Called from tests/misc/call.i:20. +tests/misc/call.i:20:[kernel] warning: Neither code nor specification for function leaf_fun_charp, generating default assigns from the prototype +[value] using specification for function leaf_fun_charp +[value] Done for function leaf_fun_charp +tests/misc/call.i:23:[value] entering loop for the first time +[value] computing for function f <- main. + Called from tests/misc/call.i:39. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + res ∈ {177; 188} +[value] Values at end of function main: + p[0..4] ∈ {0; 1; 2; 3; 4; 5; 6} + [5] ∈ {177} + [6] ∈ {0; 1; 2; 3; 4; 5; 6} + [7..9] ∈ {0} + q[0..4] ∈ {0; 10; 11; 12; 13; 14; 15; 16} + [5] ∈ {188} + [6] ∈ {0; 10; 11; 12; 13; 14; 15; 16} + [7..9] ∈ {0} + res ∈ {177; 188} + lcount ∈ {7} + tmp ∈ {{ &p[0] ; &q[0] }} + S_1_S_v[0..1] ∈ [--..--] +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Computing for function leaf_fun_int <-main +[from] Done for function leaf_fun_int +[from] Computing for function leaf_fun_charp <-main +[from] Done for function leaf_fun_charp +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + res FROM p[5]; q[5]; t +[from] Function leaf_fun_charp: + S_1_S_v[0..1] FROM S_1_S_v[0..1] (and SELF) +[from] Function leaf_fun_int: + NO EFFECTS +[from] Function main: + p{[0..4]; [6]} FROM \nothing (and SELF) + [5] FROM \nothing + q{[0..4]; [6]} FROM \nothing (and SELF) + [5] FROM \nothing + res FROM c + S_1_S_v[0..1] FROM c; S_1_S_v[0..1] (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + res +[inout] Inputs for function f: + p[5]; q[5] +[inout] Out (internal) for function main: + p[0..6]; q[0..6]; res; lcount; tmp; S_1_S_v[0..1] +[inout] Inputs for function main: + p[5]; q[5]; S_v[1]; S_1_S_v[0..1] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/call_simple.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/call_simple.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/call_simple.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/call_simple.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,58 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/call_simple.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {0} + c ∈ {0} + u ∈ {0} + v ∈ {0} + w ∈ {0} + G ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/call_simple.i:14. +[value] Recording results for f +[value] Done for function f +tests/misc/call_simple.i:15:[kernel] warning: signed overflow. assert ll+1 ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + X ∈ {68} + u ∈ {0} + a ∈ {0} + i ∈ {{ &u }} +[value] Values at end of function main: + X ∈ {68} + c ∈ [--..--] + u ∈ {0} + v ∈ {0} + w ∈ {17} + ll ∈ [-2147483647..2147483647] + __retres ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + X FROM b; c_0 + u FROM a +[from] Function main: + X FROM G + c FROM ll + u FROM \nothing + v FROM G + w FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + X; u; a; i +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main: + X; c; u; v; w; ll; tmp; __retres +[inout] Inputs for function main: + v; w; G diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/callsite.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/callsite.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/callsite.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/callsite.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,14 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/callsite.i (no preprocessing) +Call Sites for f: +Call Sites for g: + - From f at #003 + - From f at #001 +Call Sites for h: + - From g at #008 + - From g at #006 + - From f at #002 +Call Sites for k: + - From h at #012 + - From h at #011 + - From g at #007 diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/case_analysis.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/case_analysis.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/case_analysis.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/case_analysis.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,20 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/case_analysis.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + sq ∈ {0} + s ∈ {0} + rq ∈ {0} + r ∈ {0} +tests/misc/case_analysis.i:14:[value] Assertion got status valid. +tests/misc/case_analysis.i:17:[value] Assertion got status unknown. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + sq ∈ [0..100] + s ∈ [-10..10] + rq ∈ [-0.0000000000000000*2^-1022 .. 100.0000000000000000] + r ∈ [-10.0000000000000000 .. 10.0000000000000000] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/case_analysis.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/case_analysis.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/case_analysis.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/case_analysis.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,20 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/case_analysis.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + sq ∈ {0} + s ∈ {0} + rq ∈ {0} + r ∈ {0} +tests/misc/case_analysis.i:14:[value] Assertion got status valid. +tests/misc/case_analysis.i:17:[value] Assertion got status valid. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + sq ∈ [0..100] + s ∈ [-10..10] + rq ∈ [-0.0000000000000000*2^-1022 .. 100.0000000000000000] + r ∈ [-10.0000000000000000 .. 10.0000000000000000] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cast1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cast1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cast1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cast1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cast1.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + si ∈ {0} + i ∈ {0} + S[0] ∈ {1} + [1..4] ∈ {0} + I[0] ∈ {1} + [1..4] ∈ {0} +tests/misc/cast1.i:7:[value] entering loop for the first time +tests/misc/cast1.i:8:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + si ∈ {2} + i ∈ {2} + S[0] ∈ {1; 2} + [1..4] ∈ {0} + I[0] ∈ {1; 2} + [1] ∈ {0; 2} + [2..4] ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + si FROM \nothing + i FROM \nothing + S[0] FROM i (and SELF) + I[0..1] FROM \nothing (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + si; i; S[0]; I[0..1] +[inout] Inputs for function main: + si; i diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cast2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cast2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cast2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cast2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,81 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cast2.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {255} +[value] computing for function g <- main. + Called from tests/misc/cast2.i:28. +[value] computing for function any_int <- g <- main. + Called from tests/misc/cast2.i:7. +tests/misc/cast2.i:7:[kernel] warning: Neither code nor specification for function any_int, generating default assigns from the prototype +[value] using specification for function any_int +[value] Done for function any_int +tests/misc/cast2.i:9:[kernel] warning: signed overflow. assert t+1 ≤ 2147483647; +[value] Recording results for g +[value] Done for function g +[value] computing for function h <- main. + Called from tests/misc/cast2.i:29. +[value] Recording results for h +[value] Done for function h +[value] computing for function passcast <- main. + Called from tests/misc/cast2.i:30. +[value] computing for function any_int <- passcast <- main. + Called from tests/misc/cast2.i:20. +[value] Done for function any_int +[value] Called Frama_C_show_each([-128..100]) +tests/misc/cast2.i:24:[value] entering loop for the first time +[value] Recording results for passcast +[value] Done for function passcast +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function g: + t ∈ [-2147483647..2147483647] + G_0 ∈ [--..--] +[value] Values at end of function h: + G ∈ {1} +[value] Values at end of function passcast: + i ∈ [-128..100] +[value] Values at end of function main: + G ∈ {1} +[from] Computing for function g +[from] Computing for function any_int <-g +[from] Done for function any_int +[from] Done for function g +[from] Computing for function h +[from] Done for function h +[from] Computing for function passcast +[from] Done for function passcast +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function any_int: + \result FROM \nothing +[from] Function g: + NO EFFECTS +[from] Function h: + G FROM \nothing +[from] Function passcast: + NO EFFECTS +[from] Function main: + G FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function g: + t; G_0 +[inout] Inputs for function g: + \nothing +[inout] Out (internal) for function h: + G +[inout] Inputs for function h: + \nothing +[inout] Out (internal) for function passcast: + i; tmp +[inout] Inputs for function passcast: + \nothing +[inout] Out (internal) for function main: + G +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cast_axalto.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cast_axalto.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cast_axalto.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cast_axalto.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,59 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cast_axalto.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + my_tab ∈ {0} + G[0] ∈ {77} + [1] ∈ {88} + [2] ∈ {99} + [3] ∈ {100} + [4..9] ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/cast_axalto.c:26. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + p ∈ {{ (my_structure *)&G[1] }} + G[0] ∈ {77} + [1][bits 0 to 7] ∈ {1} + [1][bits 8 to 31]# ∈ {88}%32, bits 8 to 31 + [2] ∈ {99} + [3] ∈ {100} + [4] ∈ {99} + [5..9] ∈ {0} +[value] Values at end of function main: + my_tab ∈ {{ &G[1] }} + G[0] ∈ {77} + [1][bits 0 to 7] ∈ {1} + [1][bits 8 to 31]# ∈ {88}%32, bits 8 to 31 + [2] ∈ {99} + [3] ∈ {100} + [4] ∈ {99} + [5..9] ∈ {0} + __retres ∈ {1} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + G{[1][bits 0 to 7]; [4]} FROM my_tab +[from] Function main: + my_tab FROM \nothing + G{[1][bits 0 to 7]; [4]} FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + p; G{[1][bits 0 to 7]; [4]} +[inout] Inputs for function f: + my_tab +[inout] Out (internal) for function main: + my_tab; G{[1][bits 0 to 7]; [4]}; __retres +[inout] Inputs for function main: + my_tab diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cast_fun.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cast_fun.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cast_fun.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cast_fun.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,117 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cast_fun.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f1 <- main. + Called from tests/misc/cast_fun.i:58. +[value] using specification for function f1 +tests/misc/cast_fun.i:6:[value] warning: no 'assigns \result \from ...' clause specified for function f1 +[value] Done for function f1 +tests/misc/cast_fun.i:63:[value] warning: Function pointer and pointed function 'f2' have incompatible types: + int (int ) vs. int (void). assert(function type matches) +[value] computing for function f3 <- main. + Called from tests/misc/cast_fun.i:68. +[value] using specification for function f3 +tests/misc/cast_fun.i:10:[value] warning: no 'assigns \result \from ...' clause specified for function f3 +[value] Done for function f3 +tests/misc/cast_fun.i:73:[value] warning: Function pointer and pointed function 'f4' have incompatible types: + int (int ) vs. void (int ). assert(function type matches) +tests/misc/cast_fun.i:78:[value] warning: Function pointer and pointed function 'f5' have incompatible types: + int (int ) vs. int (int , int ). assert(function type matches) +[value] computing for function f6 <- main. + Called from tests/misc/cast_fun.i:83. +[value] using specification for function f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/misc/cast_fun.i:88. +[value] using specification for function f7 +[value] Done for function f7 +tests/misc/cast_fun.i:93:[value] warning: Function pointer and pointed function 'f8' have incompatible types: + void (struct s1 ) vs. void (struct s3 ). assert(function type matches) +[value] computing for function f9 <- main. + Called from tests/misc/cast_fun.i:98. +[value] using specification for function f9 +[value] Done for function f9 +tests/misc/cast_fun.i:103:[value] warning: Function pointer and pointed function 'f10' have incompatible types: + void (int , ...) vs. void (). assert(function type matches) +tests/misc/cast_fun.i:108:[value] warning: Function pointer and pointed function 'f9' have incompatible types: void ( + ) vs. void (int , ...). assert(function type matches) +[value] computing for function f10 <- main. + Called from tests/misc/cast_fun.i:113. +[value] using specification for function f10 +[value] Done for function f10 +tests/misc/cast_fun.i:118:[value] warning: Function pointer and pointed function 'f10' have incompatible types: + int (int ) vs. void (). assert(function type matches) +tests/misc/cast_fun.i:123:[value] warning: Function pointer and pointed function 'f10' have incompatible types: + int (int ) vs. void (). assert(function type matches) +tests/misc/cast_fun.i:128:[value] warning: Function pointer and pointed function 'f1' have incompatible types: void ( + ) vs. int (). assert(function type matches) +[value] Recording results for main +[from] Computing for function main +tests/misc/cast_fun.i:58:[from] warning: variadic call detected. Using only 0 argument(s). +tests/misc/cast_fun.i:98:[from] warning: variadic call detected. Using only 1 argument(s). +tests/misc/cast_fun.i:113:[from] warning: variadic call detected. Using only 0 argument(s). +[from] Done for function main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + p1 ∈ {{ &f1 ; &f3 }} or UNINITIALIZED + p2 ∈ {{ &f6 ; (void (*)(struct s1 ))&f7 }} or UNINITIALIZED + p3 ∈ {{ &f9 }} or UNINITIALIZED + p4 ∈ {{ &f10 }} or UNINITIALIZED + x ∈ [--..--] or UNINITIALIZED + s ∈ {0} +[from] Computing for function main +[from] Computing for function f1 <-main +[from] Done for function f1 +[from] Computing for function f3 <-main +[from] Done for function f3 +[from] Computing for function f6 <-main +[from] Done for function f6 +[from] Computing for function f7 <-main +[from] Done for function f7 +[from] Computing for function f9 <-main +[from] Done for function f9 +[from] Computing for function f10 <-main +[from] Done for function f10 +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + \result FROM ANYTHING(origin:Unknown) +[from] Function f10: + NO EFFECTS +[from] Function f3: + \result FROM ANYTHING(origin:Unknown) +[from] Function f6: + NO EFFECTS +[from] Function f7: + NO EFFECTS +[from] Function f9: + NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f1 at tests/misc/cast_fun.i:58 (by main): + \result FROM ANYTHING(origin:Unknown) +[from] call to f3 at tests/misc/cast_fun.i:68 (by main): + \result FROM ANYTHING(origin:Unknown) +[from] call to f6 at tests/misc/cast_fun.i:83 (by main): + NO EFFECTS +[from] call to f7 at tests/misc/cast_fun.i:88 (by main): + NO EFFECTS +[from] call to f9 at tests/misc/cast_fun.i:98 (by main): + NO EFFECTS +[from] call to f10 at tests/misc/cast_fun.i:113 (by main): + NO EFFECTS +[from] entry point: + NO EFFECTS +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[inout] Out (internal) for function main: + p1; p2; p3; p4; x; s +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cast_hetero.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cast_hetero.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cast_hetero.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cast_hetero.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,45 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cast_hetero.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {0} + pt ∈ {0} + T[0..9] ∈ {0} +[value] computing for function g <- main. + Called from tests/misc/cast_hetero.i:16. +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function g: + pt ∈ {{ &X }} + T[0] ∈ {1} + [1..9] ∈ {0} +[value] Values at end of function main: + pt ∈ {{ &X }} + T[0] ∈ {1} + [1..9] ∈ {0} +[from] Computing for function g +[from] Done for function g +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function g: + pt FROM \nothing + T[0] FROM X; c +[from] Function main: + pt FROM \nothing + T[0] FROM X +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function g: + pt; T[0] +[inout] Inputs for function g: + X +[inout] Out (internal) for function main: + pt; T[0] +[inout] Inputs for function main: + X diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cast.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cast.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cast.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cast.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,67 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cast.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {{ "NULL" }} + G ∈ {0} + H ∈ {0} + K ∈ {0} + L ∈ {0} + i ∈ {0} + b ∈ {0} + I ∈ {0} + c ∈ {0} + d ∈ {0} + e ∈ {0} + uc ∈ {0} + ud ∈ {0} + ll ∈ {0} + gg ∈ {0} + ull ∈ {0} + ugg ∈ {0} +tests/misc/cast.i:64:[value] entering loop for the first time +[value] computing for function printf <- main. + Called from tests/misc/cast.i:67. +tests/misc/cast.i:67:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] using specification for function printf +[value] Done for function printf +[value] computing for function printf <- main. + Called from tests/misc/cast.i:67. +[value] Done for function printf +[value] computing for function printf <- main. + Called from tests/misc/cast.i:67. +[value] Done for function printf +[value] computing for function printf <- main. + Called from tests/misc/cast.i:67. +[value] Done for function printf +[value] computing for function printf <- main. + Called from tests/misc/cast.i:69. +[value] Done for function printf +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + min ∈ {130} + max ∈ {135} + i_0 ∈ [136..512] + G_0 ∈ {-126; -125; -124; -123; -122; -121} or UNINITIALIZED + __retres ∈ {0} +[from] Computing for function main +[from] Computing for function printf <-main +[from] Done for function printf +tests/misc/cast.i:67:[from] warning: variadic call detected. Using only 1 argument(s). +tests/misc/cast.i:69:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function printf: + NO EFFECTS +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + min; max; i_0; G_0; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cast_return.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cast_return.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cast_return.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cast_return.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,237 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cast_return.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ [--..--] + c ∈ [--..--] +[value] computing for function main1 <- main. + Called from tests/misc/cast_return.c:55. +[value] computing for function f <- main1 <- main. + Called from tests/misc/cast_return.c:26. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main1 <- main. + Called from tests/misc/cast_return.c:27. +[value] Recording results for g +[value] Done for function g +tests/misc/cast_return.c:27:[kernel] warning: accessing uninitialized left-value: + assert \initialized(&tmp_0); + (tmp_0 from g()) +[value] computing for function h <- main1 <- main. + Called from tests/misc/cast_return.c:31. +[value] Recording results for h +[value] Done for function h +tests/misc/cast_return.c:31:[kernel] warning: out of bounds write. assert \valid(*p); +tests/misc/cast_return.c:31:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/cast_return.c:56. +[value] computing for function fl1 <- main2 <- main. + Called from tests/misc/cast_return.c:50. +[value] Recording results for fl1 +[value] Done for function fl1 +tests/misc/cast_return.c:50:[kernel] warning: accessing uninitialized left-value: + assert \initialized(&tmp); + (tmp from fl1()) +tests/misc/cast_return.c:50:[kernel] warning: completely indeterminate value in tmp. +[value] computing for function fl2 <- main2 <- main. + Called from tests/misc/cast_return.c:51. +[value] Recording results for fl2 +[value] Done for function fl2 +tests/misc/cast_return.c:51:[kernel] warning: accessing uninitialized left-value: + assert \initialized(&tmp_0); + (tmp_0 from fl2()) +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +tests/misc/cast_return.c:31:[value] Assertion 'Value,mem_access' got final status invalid. +tests/misc/cast_return.c:50:[value] Assertion 'Value,initialisation' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + +[value] Values at end of function fl1: + v[bits 0 to 7] ∈ {1} + [bits 8 to 31] ∈ UNINITIALIZED +[value] Values at end of function fl2: + v ∈ {1.} or UNINITIALIZED +[value] Values at end of function g: + x ∈ {1} or UNINITIALIZED +[value] Values at end of function h: + __retres ∈ {1} +[value] Values at end of function main1: + +[value] Values at end of function main2: + d1 ∈ UNINITIALIZED + d2 ∈ {1.} +[value] Values at end of function main: + +[from] Computing for function f +[from] Done for function f +[from] Computing for function fl1 +[from] Done for function fl1 +[from] Computing for function fl2 +[from] Done for function fl2 +[from] Computing for function g +[from] Done for function g +[from] Computing for function h +[from] Done for function h +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM i +[from] Function fl1: + \result FROM \nothing +[from] Function fl2: + \result FROM c +[from] Function g: + \result FROM c +[from] Function h: + \result FROM \nothing +[from] Function main1: + NO EFFECTS +[from] Function main2: + NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + \nothing +[inout] Inputs for function f: + i +[inout] Out (internal) for function fl1: + v[bits 0 to 7] +[inout] Inputs for function fl1: + \nothing +[inout] Out (internal) for function fl2: + v +[inout] Inputs for function fl2: + c +[inout] Out (internal) for function g: + x +[inout] Inputs for function g: + c +[inout] Out (internal) for function h: + __retres +[inout] Inputs for function h: + \nothing +[inout] Out (internal) for function main1: + f_; tmp; v; tmp_0; x; p; tmp_1 +[inout] Inputs for function main1: + i; c +[inout] Out (internal) for function main2: + d1; d2; tmp; tmp_0 +[inout] Inputs for function main2: + c +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + i; c +/* Generated by Frama-C */ +extern int i; + +int f(void) +{ + return i; +} + +int volatile c; +int g(void) +{ + int x; + if (c) x = 1; + return x; +} + +char h(void) +{ + char __retres; + __retres = (char)1; + return __retres; +} + +void main1(void) +{ + if (c) { + float f_; + int tmp; + tmp = f(); + f_ = (float)tmp; + } + if (c) { + long long v; + int tmp_0; + tmp_0 = g(); + /*@ assert Value: initialisation: \initialized(&tmp_0); */ + v = (long long)tmp_0; + } + if (c) { + int *x; + int **p; + char tmp_1; + x = (int *)0; + p = & x; + { + /*sequence*/ + tmp_1 = h(); + /*@ assert Value: mem_access: \valid(*p); */ + *(*p) = (int)tmp_1; + } + } + return; +} + +float fl1(void) +{ + float v; + *((char *)(& v)) = (char)1; + return v; +} + +float fl2(void) +{ + float v; + if (c) v = (float)1; + return v; +} + +void main2(void) +{ + double d1; + double d2; + float tmp_0; + if (c) { + float tmp; + { + /*sequence*/ + tmp = fl1(); + /*@ assert Value: initialisation: \initialized(&tmp); */ + d1 = (double)tmp; + } + } + { + /*sequence*/ + tmp_0 = fl2(); + /*@ assert Value: initialisation: \initialized(&tmp_0); */ + d2 = (double)tmp_0; + } + return; +} + +void main(void) +{ + main1(); + main2(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cast_return.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cast_return.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cast_return.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cast_return.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,333 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cast_return.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ [--..--] + c ∈ [--..--] +[value] computing for function main1 <- main. + Called from tests/misc/cast_return.c:55. +[value] computing for function f <- main1 <- main. + Called from tests/misc/cast_return.c:26. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main1 <- main. + Called from tests/misc/cast_return.c:27. +[value] Recording results for g +[value] Done for function g +tests/misc/cast_return.c:27:[kernel] warning: returned value may be uninitialized: assert \initialized(\returned_value) +[value] computing for function h <- main1 <- main. + Called from tests/misc/cast_return.c:31. +[value] Recording results for h +[value] Done for function h +tests/misc/cast_return.c:31:[kernel] warning: out of bounds write. assert \valid(*p); +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/cast_return.c:56. +[value] computing for function fl1 <- main2 <- main. + Called from tests/misc/cast_return.c:50. +[value] Recording results for fl1 +[value] Done for function fl1 +tests/misc/cast_return.c:50:[kernel] warning: returned value may be uninitialized: assert \initialized(\returned_value) +[value] computing for function fl2 <- main2 <- main. + Called from tests/misc/cast_return.c:51. +[value] Recording results for fl2 +[value] Done for function fl2 +tests/misc/cast_return.c:51:[kernel] warning: returned value may be uninitialized: assert \initialized(\returned_value) +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +tests/misc/cast_return.c:31:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + +[value] Values at end of function fl1: + v[bits 0 to 7] ∈ {1} + [bits 8 to 31] ∈ UNINITIALIZED +[value] Values at end of function fl2: + v ∈ {1.} or UNINITIALIZED +[value] Values at end of function g: + x ∈ {1} or UNINITIALIZED +[value] Values at end of function h: + __retres ∈ {1} +[value] Values at end of function main1: + +[value] Values at end of function main2: + d1 ∈ UNINITIALIZED + d2 ∈ {1.} +[value] Values at end of function main: + +[from] Computing for function f +[from] Done for function f +[from] Computing for function fl1 +[from] Done for function fl1 +[from] Computing for function fl2 +[from] Done for function fl2 +[from] Computing for function g +[from] Done for function g +[from] Computing for function h +[from] Done for function h +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM i +[from] Function fl1: + \result FROM \nothing +[from] Function fl2: + \result FROM c +[from] Function g: + \result FROM c +[from] Function h: + \result FROM \nothing +[from] Function main1: + NO EFFECTS +[from] Function main2: + NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + \nothing +[inout] Inputs for function f: + i +[inout] Out (internal) for function fl1: + v[bits 0 to 7] +[inout] Inputs for function fl1: + \nothing +[inout] Out (internal) for function fl2: + v +[inout] Inputs for function fl2: + c +[inout] Out (internal) for function g: + x +[inout] Inputs for function g: + c +[inout] Out (internal) for function h: + __retres +[inout] Inputs for function h: + \nothing +[inout] Out (internal) for function main1: + f_; tmp; v; x; p +[inout] Inputs for function main1: + i; c +[inout] Out (internal) for function main2: + d1; d2 +[inout] Inputs for function main2: + c +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + i; c +/* Generated by Frama-C */ +extern int i; + +int f(void) +{ + return i; +} + +int volatile c; +int g(void) +{ + int x; + if (c) x = 1; + return x; +} + +char h(void) +{ + char __retres; + __retres = (char)1; + return __retres; +} + +void main1(void) +{ + if (c) { + float f_; + int tmp; + tmp = f(); + f_ = (float)tmp; + } + if (c) { + long long v; + v = (long long)g(); + } + if (c) { + int *x; + int **p; + x = (int *)0; + p = & x; + /*@ assert Value: mem_access: \valid(*p); */ + *(*p) = (int)h(); + } + return; +} + +float fl1(void) +{ + float v; + *((char *)(& v)) = (char)1; + return v; +} + +float fl2(void) +{ + float v; + if (c) v = (float)1; + return v; +} + +void main2(void) +{ + double d1; + double d2; + if (c) d1 = (double)fl1(); + d2 = (double)fl2(); + return; +} + +void main(void) +{ + main1(); + main2(); + return; +} + + +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ [--..--] + c ∈ [--..--] +[value] computing for function main1 <- main. + Called from tests/misc/cast_return.c:55. +[value] computing for function f <- main1 <- main. + Called from tests/misc/cast_return.c:26. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main1 <- main. + Called from tests/misc/cast_return.c:27. +tests/misc/cast_return.c:17:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x); +[value] Recording results for g +[value] Done for function g +[value] computing for function h <- main1 <- main. + Called from tests/misc/cast_return.c:31. +[value] Recording results for h +[value] Done for function h +tests/misc/cast_return.c:31:[kernel] warning: out of bounds write. assert \valid(*p); +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/cast_return.c:56. +[value] computing for function fl1 <- main2 <- main. + Called from tests/misc/cast_return.c:50. +tests/misc/cast_return.c:38:[kernel] warning: accessing uninitialized left-value: assert \initialized(&v); +[value] Recording results for fl1 +[value] Done for function fl1 +[value] computing for function fl2 <- main2 <- main. + Called from tests/misc/cast_return.c:51. +tests/misc/cast_return.c:44:[kernel] warning: accessing uninitialized left-value: assert \initialized(&v); +[value] Recording results for fl2 +[value] Done for function fl2 +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +tests/misc/cast_return.c:38:[value] Assertion 'Value,initialisation' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + +[value] Values at end of function fl1: + v[bits 0 to 7] ∈ {1} + [bits 8 to 31] ∈ UNINITIALIZED +[value] Values at end of function fl2: + v ∈ {1.} or UNINITIALIZED +[value] Values at end of function g: + x ∈ {1} or UNINITIALIZED +[value] Values at end of function h: + __retres ∈ {1} +[value] Values at end of function main1: + +[value] Values at end of function main2: + d1 ∈ UNINITIALIZED + d2 ∈ {1.} +[value] Values at end of function main: + +[from] Computing for function f +[from] Done for function f +[from] Computing for function fl1 +[from] Done for function fl1 +[from] Computing for function fl2 +[from] Done for function fl2 +[from] Computing for function g +[from] Done for function g +[from] Computing for function h +[from] Done for function h +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM i +[from] Function fl1: + \result FROM \nothing +[from] Function fl2: + \result FROM c +[from] Function g: + \result FROM c +[from] Function h: + \result FROM \nothing +[from] Function main1: + NO EFFECTS +[from] Function main2: + NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + \nothing +[inout] Inputs for function f: + i +[inout] Out (internal) for function fl1: + v[bits 0 to 7] +[inout] Inputs for function fl1: + \nothing +[inout] Out (internal) for function fl2: + v +[inout] Inputs for function fl2: + c +[inout] Out (internal) for function g: + x +[inout] Inputs for function g: + c +[inout] Out (internal) for function h: + __retres +[inout] Inputs for function h: + \nothing +[inout] Out (internal) for function main1: + f_; tmp; v; x; p +[inout] Inputs for function main1: + i; c +[inout] Out (internal) for function main2: + d1; d2 +[inout] Inputs for function main2: + c +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + i; c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cert_exp35_c.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cert_exp35_c.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cert_exp35_c.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cert_exp35_c.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,52 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cert_exp35_c.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function addressee <- main. + Called from tests/misc/cert_exp35_c.i:11. +[value] Recording results for addressee +[value] Done for function addressee +[value] computing for function printf <- main. + Called from tests/misc/cert_exp35_c.i:11. +tests/misc/cert_exp35_c.i:11:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function addressee: + result.a[0] ∈ {119} + .a[1] ∈ {111} + .a[2] ∈ {114} + .a[3] ∈ {108} + .a[4] ∈ {100} + .a[5] ∈ {0} +[value] Values at end of function main: + __retres ∈ {0} +[from] Computing for function addressee +[from] Done for function addressee +[from] Computing for function main +[from] Computing for function printf <-main +[from] Done for function printf +tests/misc/cert_exp35_c.i:11:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function addressee: + \result FROM \nothing +[from] Function printf: + NO EFFECTS +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function addressee: + result +[inout] Inputs for function addressee: + \nothing +[inout] Out (internal) for function main: + tmp; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/change_formals.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/change_formals.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/change_formals.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/change_formals.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,14 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/change_formals.c (with preprocessing) +[test] current prj = project "test" +/* Generated by Frama-C */ +extern int f(int x, int ok); + +int g(int ok) +{ + int tmp; + tmp = f(0,0); + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/change_formals.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/change_formals.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/change_formals.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/change_formals.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,20 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/change_formals.c (with preprocessing) +[test] current prj = project "test" +[test] current prj = project "test" +/* Generated by Frama-C */ +int f(int x, int ok); + +int f(int x, int ok) +{ + return x; +} + +int g(int ok) +{ + int tmp; + tmp = f(0,0); + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/change_formals.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/change_formals.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/change_formals.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/change_formals.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,18 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/change_formals.c (with preprocessing) +[test] current prj = project "test" +[test] current prj = project "test" +/* Generated by Frama-C */ +int f(int x, int ok) +{ + return x; +} + +int g(int ok) +{ + int tmp; + tmp = f(0,0); + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/change_main.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/change_main.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/change_main.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/change_main.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,22 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/change_main.i (no preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + +[value] Analyzing a complete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for g +[value] done for function g +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function g: + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/changeret.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/changeret.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/changeret.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/changeret.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,94 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/changeret.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + p ∈ {0} + v ∈ [--..--] +[value] computing for function main1 <- main. + Called from tests/misc/changeret.i:31. +[value] computing for function f <- main1 <- main. + Called from tests/misc/changeret.i:15. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/changeret.i:32. +[value] computing for function g <- main2 <- main. + Called from tests/misc/changeret.i:27. +tests/misc/changeret.i:19:[kernel] warning: out of bounds read. assert \valid_read(p); +[value] Recording results for g +[value] Done for function g +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + p ∈ {{ &y }} + __retres ∈ {1} +[value] Values at end of function g: + z ∈ {1} + __retres ∈ {1} +[value] Values at end of function main1: + x ∈ {0} + p ∈ {{ &y }} +[value] Values at end of function main2: + y ∈ {1} + p ∈ {{ &y }} +[value] Values at end of function main: + x ∈ {0} + y ∈ {1} + p ∈ {{ &y }} +[from] Computing for function f +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + p FROM \nothing + \result FROM \nothing +[from] Function g: + \result FROM \nothing +[from] Function main1: + x FROM \nothing + p FROM \nothing +[from] Function main2: + y FROM v + p FROM v +[from] Function main: + x FROM \nothing + y FROM v + p FROM v +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + p; __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function g: + z; __retres +[inout] Inputs for function g: + y; p +[inout] Out (internal) for function main1: + x; p +[inout] Inputs for function main1: + p +[inout] Out (internal) for function main2: + y; p +[inout] Inputs for function main2: + y; p; v +[inout] Out (internal) for function main: + x; y; p +[inout] Inputs for function main: + y; p; v diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/char_ampamp.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/char_ampamp.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/char_ampamp.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/char_ampamp.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,2 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/char_ampamp.c (with preprocessing) diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cmp_ptr.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cmp_ptr.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cmp_ptr.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cmp_ptr.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,103 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cmp_ptr.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + p ∈ {0} + T[0] ∈ {0} + [1] ∈ {1} + [2] ∈ {2} + [3] ∈ {3} + [4] ∈ {4} + [5] ∈ {5} + [6] ∈ {6} + [7] ∈ {7} + [8] ∈ {8} + [9] ∈ {9} + C[0] ∈ {0} + [1] ∈ {1} + [2] ∈ {2} + [3] ∈ {3} + [4] ∈ {4} + [5] ∈ {5} + [6] ∈ {6} + [7] ∈ {7} + [8] ∈ {8} + [9] ∈ {9} + q ∈ {0} + top_p ∈ [--..--] + top_q ∈ [--..--] + x ∈ {0} + y ∈ {0} + z ∈ {0} + t ∈ {0} + r ∈ {0} + ff ∈ {0} +tests/misc/cmp_ptr.i:21:[kernel] warning: pointer comparison: assert \pointer_comparable(p, &T[5]); +tests/misc/cmp_ptr.i:21:[kernel] warning: out of bounds write. assert \valid(p); +tests/misc/cmp_ptr.i:21:[kernel] warning: out of bounds write. assert \valid(q); +tests/misc/cmp_ptr.i:22:[kernel] warning: pointer comparison: assert \pointer_comparable((void *)0, &y+2); +tests/misc/cmp_ptr.i:24:[kernel] warning: non-finite float value ({{ &y + {8} }}): assert \is_finite(ff); +tests/misc/cmp_ptr.i:24:[kernel] warning: pointer comparison: assert \pointer_comparable((void *)0, (void *)ff); +tests/misc/cmp_ptr.i:28:[kernel] warning: signed overflow. + assert -2147483648 ≤ 1+(int)tmp_0 ≤ 2147483647; + (tmp_0 from u?& f:& g) +tests/misc/cmp_ptr.i:28:[kernel] warning: pointer comparison: + assert \pointer_comparable((void *)((int)(1+(int)tmp_0)), (void *)0); + (tmp_0 from u?& f:& g) +tests/misc/cmp_ptr.i:30:[kernel] warning: pointer comparison: assert \pointer_comparable((int *)T-1, (int *)0); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + p ∈ {{ &T + [-8589934588..8589934592],0%4 }} + T[0] ∈ {0; 88} + [1] ∈ {1; 88} + [2] ∈ {2; 88} + [3] ∈ {3; 88} + [4] ∈ {4; 88} + [5] ∈ {5; 88} + [6] ∈ {6; 88} + [7] ∈ {7; 88} + [8] ∈ {8; 88} + [9] ∈ {9; 88} + C[0] ∈ {0; 77} + [1] ∈ {1; 77} + [2] ∈ {2; 77} + [3] ∈ {3; 77} + [4] ∈ {4; 77} + [5] ∈ {5; 77} + [6] ∈ {6; 77} + [7] ∈ {7; 77} + [8] ∈ {8; 77} + [9] ∈ {9; 77} + q ∈ {{ &C + [-2147483647..2147483648] }} + x ∈ {0; 1} + y ∈ {0; 1} + z ∈ {0} + t ∈ {0; 1} + r ∈ {0; 1} + ff ∈ {{ &y + {8} }} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + p FROM top_p + T[0..9] FROM top_p (and SELF) + C[0..9] FROM top_p; top_q (and SELF) + q FROM top_q + x FROM \nothing + y FROM \nothing + z FROM u + t FROM u + r FROM \nothing + ff FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + p; T[0..9]; C[0..9]; q; x; y; z; t; r; ff; tmp; tmp_0; __retres +[inout] Inputs for function main: + p; q; top_p; top_q; ff diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cmp_ptr_follow_all_branches.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cmp_ptr_follow_all_branches.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cmp_ptr_follow_all_branches.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cmp_ptr_follow_all_branches.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cmp_ptr_follow_all_branches.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + p ∈ {{ (char *)&a }} + q ∈ {{ &a }} +tests/misc/cmp_ptr_follow_all_branches.i:14:[kernel] warning: pointer comparison: + assert \pointer_comparable(p+(unsigned int)((int)(-5)), p); +[value] Called Frama_C_show_each_1() +[value] Called Frama_C_show_each_2() +tests/misc/cmp_ptr_follow_all_branches.i:15:[kernel] warning: pointer comparison: + assert \pointer_comparable(q+(unsigned int)((int)(-5)), q); +[value] Called Frama_C_show_each_3() +[value] Called Frama_C_show_each_4() +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + __retres +[inout] Inputs for function main: + p; q diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cmp_ptr_follow_all_branches.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cmp_ptr_follow_all_branches.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cmp_ptr_follow_all_branches.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cmp_ptr_follow_all_branches.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,31 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cmp_ptr_follow_all_branches.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + p ∈ {{ (char *)&a }} + q ∈ {{ &a }} +tests/misc/cmp_ptr_follow_all_branches.i:14:[kernel] warning: pointer comparison: + assert \pointer_comparable(p+(unsigned int)((int)(-5)), p); +[value] Called Frama_C_show_each_2() +tests/misc/cmp_ptr_follow_all_branches.i:15:[kernel] warning: pointer comparison: + assert \pointer_comparable(q+(unsigned int)((int)(-5)), q); +[value] Called Frama_C_show_each_4() +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + __retres +[inout] Inputs for function main: + p; q diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cmp_ptr.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cmp_ptr.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cmp_ptr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cmp_ptr.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,103 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cmp_ptr.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + p ∈ {0} + T[0] ∈ {0} + [1] ∈ {1} + [2] ∈ {2} + [3] ∈ {3} + [4] ∈ {4} + [5] ∈ {5} + [6] ∈ {6} + [7] ∈ {7} + [8] ∈ {8} + [9] ∈ {9} + C[0] ∈ {0} + [1] ∈ {1} + [2] ∈ {2} + [3] ∈ {3} + [4] ∈ {4} + [5] ∈ {5} + [6] ∈ {6} + [7] ∈ {7} + [8] ∈ {8} + [9] ∈ {9} + q ∈ {0} + top_p ∈ [--..--] + top_q ∈ [--..--] + x ∈ {0} + y ∈ {0} + z ∈ {0} + t ∈ {0} + r ∈ {0} + ff ∈ {0} +tests/misc/cmp_ptr.i:21:[kernel] warning: pointer comparison: assert \pointer_comparable(p, &T[5]); +tests/misc/cmp_ptr.i:21:[kernel] warning: out of bounds write. assert \valid(p); +tests/misc/cmp_ptr.i:21:[kernel] warning: out of bounds write. assert \valid(q); +tests/misc/cmp_ptr.i:22:[kernel] warning: pointer comparison: assert \pointer_comparable((void *)0, &y+2); +tests/misc/cmp_ptr.i:24:[kernel] warning: non-finite float value ({{ &y + {8} }}): assert \is_finite(ff); +tests/misc/cmp_ptr.i:24:[kernel] warning: pointer comparison: assert \pointer_comparable((void *)0, (void *)ff); +tests/misc/cmp_ptr.i:28:[kernel] warning: signed overflow. + assert -2147483648 ≤ 1+(int)tmp_0 ≤ 2147483647; + (tmp_0 from u?& f:& g) +tests/misc/cmp_ptr.i:28:[kernel] warning: pointer comparison: + assert \pointer_comparable((void *)((int)(1+(int)tmp_0)), (void *)0); + (tmp_0 from u?& f:& g) +tests/misc/cmp_ptr.i:30:[kernel] warning: pointer comparison: assert \pointer_comparable((int *)T-1, (int *)0); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + p ∈ {{ &T + [-8589934588..36],0%4 }} + T[0] ∈ {0} + [1] ∈ {1} + [2] ∈ {2} + [3] ∈ {3} + [4] ∈ {4} + [5] ∈ {5; 88} + [6] ∈ {6; 88} + [7] ∈ {7; 88} + [8] ∈ {8; 88} + [9] ∈ {9; 88} + C[0] ∈ {0; 77} + [1] ∈ {1; 77} + [2] ∈ {2; 77} + [3] ∈ {3; 77} + [4] ∈ {4; 77} + [5] ∈ {5; 77} + [6] ∈ {6; 77} + [7] ∈ {7; 77} + [8] ∈ {8; 77} + [9] ∈ {9; 77} + q ∈ {{ &C + [-2147483647..2147483648] }} + x ∈ {0} + y ∈ {0; 1} + z ∈ {0} + t ∈ {0} + r ∈ {0} + ff ∈ {{ &y + {8} }} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + p FROM top_p + T[5..9] FROM top_p (and SELF) + C[0..9] FROM top_p; top_q (and SELF) + q FROM top_q + x FROM \nothing + y FROM \nothing + z FROM u + t FROM u + r FROM \nothing + ff FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + p; T[5..9]; C[0..9]; q; x; y; z; t; r; ff; tmp; tmp_0; __retres +[inout] Inputs for function main: + p; q; top_p; top_q; ff diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cmp.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cmp.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cmp.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cmp.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cmp.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/cmp.i:10:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. assert 0 ≤ d < 10; +[value] computing for function cmp <- main. + Called from tests/misc/cmp.i:11. +tests/misc/cmp.i:4:[kernel] warning: accessing uninitialized left-value: assert \initialized(s1); +tests/misc/cmp.i:4:[kernel] warning: out of bounds read. assert \valid_read(s1); +[value] Recording results for cmp +[value] Done for function cmp +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function cmp: + __retres ∈ {1} +[value] Values at end of function main: + T[0..9] ∈ [--..--] or UNINITIALIZED + r ∈ {1} +[from] Computing for function cmp +[from] Done for function cmp +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function cmp: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function cmp: + __retres +[inout] Inputs for function cmp: + T[0..9]; "V1.2"[bits 0 to 7] +[inout] Out (internal) for function main: + T[0..9]; r +[inout] Inputs for function main: + "V1.2"[bits 0 to 7] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cond2.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cond2.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cond2.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cond2.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,149 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cond2.i (no preprocessing) +[value] Analyzing a complete application starting at un_1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Gx ∈ [--..--] + Gy ∈ [--..--] + px ∈ {0} + py ∈ {0} + x ∈ {0} + y ∈ {0} + T[0..99] ∈ {0} + r ∈ {0} + s ∈ {0} + t ∈ {0} + u ∈ {0} +tests/misc/cond2.i:52:[value] entering loop for the first time +tests/misc/cond2.i:52:[kernel] warning: signed overflow. assert x+2 ≤ 2147483647; +tests/misc/cond2.i:53:[value] entering loop for the first time +tests/misc/cond2.i:53:[kernel] warning: signed overflow. assert y+2 ≤ 2147483647; +tests/misc/cond2.i:59:[value] entering loop for the first time +tests/misc/cond2.i:59:[kernel] warning: signed overflow. assert x+4 ≤ 2147483647; +tests/misc/cond2.i:60:[value] entering loop for the first time +tests/misc/cond2.i:60:[kernel] warning: signed overflow. assert y+4 ≤ 2147483647; +tests/misc/cond2.i:66:[value] entering loop for the first time +tests/misc/cond2.i:66:[kernel] warning: out of bounds write. assert \valid(px); +tests/misc/cond2.i:67:[value] entering loop for the first time +tests/misc/cond2.i:67:[kernel] warning: out of bounds write. assert \valid(py); +[value] Recording results for un_1 +[value] done for function un_1 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function un_1: + px ∈ {{ &T + [0..384],0%16 }} + py ∈ {{ &T + [4..388],4%16 }} + x ∈ [0..2147483646],0%2 + y ∈ [1..2147483647],1%2 + T[0..3] ∈ {0} + [4] ∈ {0; 1} + [5] ∈ {0; 2} + [6..7] ∈ {0} + [8] ∈ {0; 1} + [9] ∈ {0; 2} + [10..11] ∈ {0} + [12] ∈ {0; 1} + [13] ∈ {0; 2} + [14..15] ∈ {0} + [16] ∈ {0; 1} + [17] ∈ {0; 2} + [18..19] ∈ {0} + [20] ∈ {0; 1} + [21] ∈ {0; 2} + [22..23] ∈ {0} + [24] ∈ {0; 1} + [25] ∈ {0; 2} + [26..27] ∈ {0} + [28] ∈ {0; 1} + [29] ∈ {0; 2} + [30..31] ∈ {0} + [32] ∈ {0; 1} + [33] ∈ {0; 2} + [34..35] ∈ {0} + [36] ∈ {0; 1} + [37] ∈ {0; 2} + [38..39] ∈ {0} + [40] ∈ {0; 1} + [41] ∈ {0; 2} + [42..43] ∈ {0} + [44] ∈ {0; 1} + [45] ∈ {0; 2} + [46..47] ∈ {0} + [48] ∈ {0; 1} + [49] ∈ {0; 2} + [50..51] ∈ {0} + [52] ∈ {0; 1} + [53] ∈ {0; 2} + [54..55] ∈ {0} + [56] ∈ {0; 1} + [57] ∈ {0; 2} + [58..59] ∈ {0} + [60] ∈ {0; 1} + [61] ∈ {0; 2} + [62..63] ∈ {0} + [64] ∈ {0; 1} + [65] ∈ {0; 2} + [66..67] ∈ {0} + [68] ∈ {0; 1} + [69] ∈ {0; 2} + [70..71] ∈ {0} + [72] ∈ {0; 1} + [73] ∈ {0; 2} + [74..75] ∈ {0} + [76] ∈ {0; 1} + [77] ∈ {0; 2} + [78..79] ∈ {0} + [80] ∈ {0; 1} + [81] ∈ {0; 2} + [82..83] ∈ {0} + [84] ∈ {0; 1} + [85] ∈ {0; 2} + [86..87] ∈ {0} + [88] ∈ {0; 1} + [89] ∈ {0; 2} + [90..91] ∈ {0} + [92] ∈ {0; 1} + [93] ∈ {0; 2} + [94..95] ∈ {0} + [96] ∈ {0; 1} + [97] ∈ {0; 2} + [98..99] ∈ {0} + s ∈ {1} + t ∈ {1} + u ∈ {1} + r_0 ∈ {1} + i ∈ [0..2147483647] +[from] Computing for function un_1 +[from] Done for function un_1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function un_1: + px FROM Gx + py FROM Gy + x FROM Gx + y FROM Gy + T{[4]; [8]; [12]; [16]; [20]; [24]; [28]; [32]; [36]; [40]; [44]; [48]; + [52]; [56]; [60]; [64]; [68]; [72]; [76]; [80]; [84]; [88]; [92]; [96]} + FROM Gx (and SELF) + {[5]; [9]; [13]; [17]; [21]; [25]; [29]; [33]; [37]; [41]; [45]; [49]; + [53]; [57]; [61]; [65]; [69]; [73]; [77]; [81]; [85]; [89]; [93]; [97]} + FROM Gy (and SELF) + s FROM Gx; Gy + t FROM Gx; Gy + u FROM Gx; Gy + \result FROM Gx; Gy +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function un_1: + px; py; x; y; + T{[4..5]; [8..9]; [12..13]; [16..17]; [20..21]; [24..25]; [28..29]; + [32..33]; [36..37]; [40..41]; [44..45]; [48..49]; [52..53]; [56..57]; + [60..61]; [64..65]; [68..69]; [72..73]; [76..77]; [80..81]; [84..85]; + [88..89]; [92..93]; [96..97]}; s; t; u; r_0; i +[inout] Out (external) for function un_1: + px; py; x; y; + T{[4..5]; [8..9]; [12..13]; [16..17]; [20..21]; [24..25]; [28..29]; + [32..33]; [36..37]; [40..41]; [44..45]; [48..49]; [52..53]; [56..57]; + [60..61]; [64..65]; [68..69]; [72..73]; [76..77]; [80..81]; [84..85]; + [88..89]; [92..93]; [96..97]}; s; t; u +[inout] Inputs for function un_1: + Gx; Gy; px; py; x; y; u diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cond2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cond2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cond2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cond2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,50 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cond2.i (no preprocessing) +[value] Analyzing a complete application starting at zero_ou_un_0 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Gx ∈ [--..--] + Gy ∈ [--..--] + px ∈ {0} + py ∈ {0} + x ∈ {0} + y ∈ {0} + T[0..99] ∈ {0} + r ∈ {0} + s ∈ {0} + t ∈ {0} + u ∈ {0} +tests/misc/cond2.i:26:[value] entering loop for the first time +tests/misc/cond2.i:26:[kernel] warning: signed overflow. assert x+2 ≤ 2147483647; +tests/misc/cond2.i:27:[value] entering loop for the first time +tests/misc/cond2.i:27:[kernel] warning: signed overflow. assert y+5 ≤ 2147483647; +[value] Recording results for zero_ou_un_0 +[value] done for function zero_ou_un_0 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function zero_ou_un_0: + x ∈ {0; 2} + y ∈ {1; 2} + r ∈ {0; 1} + s ∈ {0; 1} + t ∈ {0; 1} + u ∈ {1} + i ∈ [0..2147483647] +[from] Computing for function zero_ou_un_0 +[from] Done for function zero_ou_un_0 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function zero_ou_un_0: + x FROM Gx + y FROM Gy + r FROM Gx (and SELF) + s FROM Gx; Gy (and SELF) + t FROM Gx; Gy (and SELF) + u FROM Gx +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function zero_ou_un_0: + x; y; r; s; t; u; i +[inout] Out (external) for function zero_ou_un_0: + x; y; r; s; t; u +[inout] Inputs for function zero_ou_un_0: + Gx; Gy; x; y diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cond3.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cond3.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cond3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cond3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cond3.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Gx ∈ {0} + r ∈ {0} + x ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + r ∈ {-1} + x ∈ {1} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + r FROM \nothing + x FROM Gx + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + r; x +[inout] Inputs for function main: + Gx; r; x diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cond_integer_cast_of_float.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cond_integer_cast_of_float.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cond_integer_cast_of_float.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cond_integer_cast_of_float.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,192 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cond_integer_cast_of_float.i (no preprocessing) +tests/misc/cond_integer_cast_of_float.i:79:[kernel] warning: Floating-point constant 1.17 is not represented exactly. Will use 0x1.2b851eb851eb8p0. See documentation for option -warn-decimal-float +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + b ∈ {0} + f1 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + f3 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + f4 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + d1 ∈ [-1.79769313486e+308 .. 1.79769313486e+308] + d2 ∈ [-1.79769313486e+308 .. 1.79769313486e+308] + i ∈ [--..--] + c ∈ [--..--] +[value] computing for function main1 <- main. + Called from tests/misc/cond_integer_cast_of_float.i:121. +tests/misc/cond_integer_cast_of_float.i:13:[value] Function main1: precondition got status unknown. +[value] Called Frama_C_show_each_float_([2. .. 8.]) +[value] Called Frama_C_show_each_float_([-0. .. 4.99999952316]) +[value] Called Frama_C_show_each_float_([1. .. 8.]) +[value] Called Frama_C_show_each_float_([3. .. 3.99999976158]) +[value] Called Frama_C_show_each_double([2. .. 8.]) +[value] Called Frama_C_show_each_double([-0. .. 5.]) +[value] Called Frama_C_show_each_double([1. .. 8.]) +[value] Called Frama_C_show_each_double([3. .. 4.]) +[value] Called Frama_C_show_each([-0. .. 8.], [0..8]) +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/cond_integer_cast_of_float.i:123. +[value] DUMPING STATE of file tests/misc/cond_integer_cast_of_float.i line 78 + b ∈ {0} + f1 ∈ [1.17000007629 .. 3.40282346639e+38] + f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + f3 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + f4 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + d1 ∈ [-1.79769313486e+308 .. 1.79769313486e+308] + d2 ∈ [-1.79769313486e+308 .. 1.79769313486e+308] + i ∈ [--..--] + c ∈ [--..--] + =END OF DUMP== +[value] DUMPING STATE of file tests/misc/cond_integer_cast_of_float.i line 81 + b ∈ {0} + f1 ∈ [-3.40282346639e+38 .. 1.16999995708] + f2 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + f3 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + f4 ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + d1 ∈ [-1.79769313486e+308 .. 1.79769313486e+308] + d2 ∈ [-1.79769313486e+308 .. 1.79769313486e+308] + i ∈ [--..--] + c ∈ [--..--] + =END OF DUMP== +[value] Called Frama_C_show_each_double([1.16999995708 .. 1.79769313486e+308]) +[value] Called Frama_C_show_each_double([1.17 .. 1.79769313486e+308]) +[value] Recording results for main2 +[value] Done for function main2 +[value] computing for function main3 <- main. + Called from tests/misc/cond_integer_cast_of_float.i:125. +tests/misc/cond_integer_cast_of_float.i:96:[value] Function main3: precondition got status unknown. +tests/misc/cond_integer_cast_of_float.i:97:[value] Function main3: precondition got status unknown. +tests/misc/cond_integer_cast_of_float.i:101:[value] Assertion got status unknown. +tests/misc/cond_integer_cast_of_float.i:102:[value] Assertion got status unknown. +tests/misc/cond_integer_cast_of_float.i:103:[value] Assertion got status unknown. +tests/misc/cond_integer_cast_of_float.i:106:[value] Assertion got status unknown. +tests/misc/cond_integer_cast_of_float.i:109:[value] Assertion got status unknown. +tests/misc/cond_integer_cast_of_float.i:112:[value] Assertion got status unknown. +tests/misc/cond_integer_cast_of_float.i:113:[value] Assertion got status unknown. +[value] DUMPING STATE of file tests/misc/cond_integer_cast_of_float.i line 115 + b ∈ {0} + f1 ∈ [10.0000009537 .. 3.40282346639e+38] + f2 ∈ [10.0000009537 .. 3.40282346639e+38] + f3 ∈ [10.0000009537 .. 3.40282346639e+38] + f4 ∈ [-1000. .. 1000.] + d1 ∈ [10. .. 1.79769313486e+308] + d2 ∈ [-1000. .. 1000.] + i ∈ [--..--] + c ∈ [--..--] + =END OF DUMP== +[value] Recording results for main3 +[value] Done for function main3 +[value] computing for function main3 <- main. + Called from tests/misc/cond_integer_cast_of_float.i:127. +[value] DUMPING STATE of file tests/misc/cond_integer_cast_of_float.i line 115 + b ∈ {0} + f1 ∈ [10.0000009537 .. 3.40282346639e+38] + f2 ∈ [10.0000009537 .. 3.40282346639e+38] + f3 ∈ [10.0000009537 .. 3.40282346639e+38] + f4 ∈ [-1000. .. 1000.] + d1 ∈ [10. .. 1.79769313486e+308] + d2 ∈ [-1000. .. 1000.] + i ∈ [--..--] + c ∈ [--..--] + =END OF DUMP== +[value] Recording results for main3 +[value] Done for function main3 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Analyzing a complete application starting at mainbis +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + b ∈ {0} + f1 ∈ [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + f2 ∈ [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + f3 ∈ [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + f4 ∈ [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + d1 ∈ [-0x1.fffffffffffffp1023 .. 0x1.fffffffffffffp1023] + d2 ∈ [-0x1.fffffffffffffp1023 .. 0x1.fffffffffffffp1023] + i ∈ [--..--] + c ∈ [--..--] +[value] computing for function main <- mainbis. + Called from tests/misc/cond_integer_cast_of_float.i:132. +[value] computing for function main1 <- main <- mainbis. + Called from tests/misc/cond_integer_cast_of_float.i:121. +[value] Called Frama_C_show_each_float_([0x1.0000000000000p1 .. 0x1.0000000000000p3]) +[value] Called Frama_C_show_each_float_([-0x0.0000000000000p-1022 .. 0x1.3ffffe0000000p2]) +[value] Called Frama_C_show_each_float_([0x1.0000000000000p0 .. 0x1.0000000000000p3]) +[value] Called Frama_C_show_each_float_([0x1.8000000000000p1 .. 0x1.fffffe0000000p1]) +[value] Called Frama_C_show_each_double([0x1.0000000000000p1 .. 0x1.0000000000000p3]) +[value] Called Frama_C_show_each_double([-0x0.0000000000000p-1022 .. 0x1.3ffffffffffffp2]) +[value] Called Frama_C_show_each_double([0x1.0000000000000p0 .. 0x1.0000000000000p3]) +[value] Called Frama_C_show_each_double([0x1.8000000000000p1 .. 0x1.fffffffffffffp1]) +[value] Called Frama_C_show_each([-0x0.0000000000000p-1022 .. 0x1.0000000000000p3], + [0..8]) +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main <- mainbis. + Called from tests/misc/cond_integer_cast_of_float.i:123. +[value] DUMPING STATE of file tests/misc/cond_integer_cast_of_float.i line 78 + b ∈ {0} + f1 ∈ [0x1.2b85200000000p0 .. 0x1.fffffe0000000p127] + f2 ∈ [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + f3 ∈ [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + f4 ∈ [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + d1 ∈ [-0x1.fffffffffffffp1023 .. 0x1.fffffffffffffp1023] + d2 ∈ [-0x1.fffffffffffffp1023 .. 0x1.fffffffffffffp1023] + i ∈ [--..--] + c ∈ [--..--] + =END OF DUMP== +[value] DUMPING STATE of file tests/misc/cond_integer_cast_of_float.i line 81 + b ∈ {0} + f1 ∈ [-0x1.fffffe0000000p127 .. 0x1.2b851e0000000p0] + f2 ∈ [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + f3 ∈ [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + f4 ∈ [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + d1 ∈ [-0x1.fffffffffffffp1023 .. 0x1.fffffffffffffp1023] + d2 ∈ [-0x1.fffffffffffffp1023 .. 0x1.fffffffffffffp1023] + i ∈ [--..--] + c ∈ [--..--] + =END OF DUMP== +[value] Called Frama_C_show_each_double([0x1.2b851e0000001p0 .. 0x1.fffffffffffffp1023]) +[value] Called Frama_C_show_each_double([0x1.2b851eb851eb9p0 .. 0x1.fffffffffffffp1023]) +[value] Recording results for main2 +[value] Done for function main2 +[value] computing for function main3 <- main <- mainbis. + Called from tests/misc/cond_integer_cast_of_float.i:125. +[value] DUMPING STATE of file tests/misc/cond_integer_cast_of_float.i line 115 + b ∈ {0} + f1 ∈ [0x1.4000020000000p3 .. 0x1.fffffe0000000p127] + f2 ∈ [0x1.4000020000000p3 .. 0x1.fffffe0000000p127] + f3 ∈ [0x1.4000020000000p3 .. 0x1.fffffe0000000p127] + f4 ∈ [-0x1.f400000000000p9 .. 0x1.f400000000000p9] + d1 ∈ [0x1.4000000000001p3 .. 0x1.fffffffffffffp1023] + d2 ∈ [-0x1.f400000000000p9 .. 0x1.f400000000000p9] + i ∈ [--..--] + c ∈ [--..--] + =END OF DUMP== +[value] Recording results for main3 +[value] Done for function main3 +[value] computing for function main3 <- main <- mainbis. + Called from tests/misc/cond_integer_cast_of_float.i:127. +[value] DUMPING STATE of file tests/misc/cond_integer_cast_of_float.i line 115 + b ∈ {0} + f1 ∈ [0x1.4000020000000p3 .. 0x1.fffffe0000000p127] + f2 ∈ [0x1.4000020000000p3 .. 0x1.fffffe0000000p127] + f3 ∈ [0x1.4000020000000p3 .. 0x1.fffffe0000000p127] + f4 ∈ [-0x1.f400000000000p9 .. 0x1.f400000000000p9] + d1 ∈ [0x1.4000000000001p3 .. 0x1.fffffffffffffp1023] + d2 ∈ [-0x1.f400000000000p9 .. 0x1.f400000000000p9] + i ∈ [--..--] + c ∈ [--..--] + =END OF DUMP== +[value] Recording results for main3 +[value] Done for function main3 +[value] Recording results for main +[value] Done for function main +[value] Recording results for mainbis +[value] done for function mainbis +[value] ====== VALUES COMPUTED ====== diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/conditional_initializer.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/conditional_initializer.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/conditional_initializer.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/conditional_initializer.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/conditional_initializer.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0] ∈ {2} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/cond.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/cond.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/cond.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/cond.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,86 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/cond.i (no preprocessing) +tests/misc/cond.i:34:[kernel] warning: Calling undeclared function unknf. Old style K&R code? +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + x ∈ {0} + y ∈ {0} + i ∈ {0} + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + [5] ∈ {6} + [6] ∈ {7} + [7] ∈ {8} + p ∈ {0} + z ∈ {0} + R ∈ {0} +tests/misc/cond.i:14:[kernel] warning: out of bounds read. assert \valid_read(argv); +tests/misc/cond.i:14:[kernel] warning: out of bounds read. assert \valid_read(*argv); +[value] computing for function f <- main. + Called from tests/misc/cond.i:20. +[value] Recording results for f +[value] Done for function f +[value] computing for function unknf <- main. + Called from tests/misc/cond.i:34. +tests/misc/cond.i:34:[kernel] warning: Neither code nor specification for function unknf, generating default assigns from the prototype +[value] using specification for function unknf +[value] Done for function unknf +[value] Called Frama_C_show_each_2({0; 1; 2; 4; 5; 6; 7; 8}) +[value] Called Frama_C_show_each_3([0..8]) +[value] Called Frama_C_show_each_4([0..16],0%2) +[value] Called Frama_C_show_each_5([0..16],0%2) +[value] Called Frama_C_show_each_6({0; 2; 4; 6; 8; 12; 14; 16}) +[value] Called Frama_C_show_each_7([0..16],0%2) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + +[value] Values at end of function main: + x ∈ [-128..0] + y ∈ [-10..32767] + i ∈ {1; 2; 3; 4; 5; 6; 7} + p ∈ {{ &t }} + z ∈ {0; 2} + R ∈ {0; 3} + r ∈ {-51} + inRet ∈ {-51} + c ∈ [--..--] + s ∈ [--..--] + u ∈ [0..8] + v ∈ [0..16],0%2 +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Computing for function unknf <-main +[from] Done for function unknf +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM G +[from] Function unknf: + \result FROM \nothing +[from] Function main: + x FROM argv; S_argv[0]; S_0_S_argv[0] (and SELF) + y FROM argc (and SELF) + i FROM argc + p FROM \nothing + z FROM t[1..3]; argc (and SELF) + R FROM t[1..7]; argc (and SELF) + \result FROM G +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + tmp +[inout] Inputs for function f: + G +[inout] Out (internal) for function main: + x; y; i; p; z; R; r; inRet; c; s; tmp; tmp_0; u; tmp_1; v +[inout] Inputs for function main: + G; i; t[1..7]; p; S_argv[0]; S_0_S_argv[0] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/const2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/const2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/const2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/const2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/const2.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0].a ∈ {1} + [0].[bits 8 to 31] ∈ UNINITIALIZED + [0].b ∈ {2} + [1].a ∈ {3} + [1].[bits 8 to 31] ∈ UNINITIALIZED + [1].b ∈ {4} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + __retres ∈ {2} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM T[0].b +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + __retres +[inout] Inputs for function main: + T[0].b diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/constarraylibentry.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/constarraylibentry.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/constarraylibentry.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/constarraylibentry.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,81 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/constarraylibentry.i (no preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + t2[0][0] ∈ {1} + [0][1] ∈ {2} + [0][2] ∈ {3} + [1][0] ∈ {4} + [1][1] ∈ {5} + [1][2] ∈ {6} + [2][0] ∈ {7} + [2][1] ∈ {8} + [2][2] ∈ {9} + t3[0][0] ∈ {10} + [0][1] ∈ {20} + [0][2] ∈ {30} + [1][0] ∈ {40} + [1][1] ∈ {50} + [1][2] ∈ {60} + [2][0] ∈ {70} + [2][1] ∈ {80} + [2][2] ∈ {90} + t4[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + [5] ∈ {6} + [6] ∈ {7} + [7] ∈ {8} + [8] ∈ {9} + [9] ∈ {10} + [10..11] ∈ {0} + t5[0].f1 ∈ [--..--] + [0].f2 ∈ {2} + [1].f1 ∈ [--..--] + [1].f2 ∈ {0} + [2].f1 ∈ [--..--] + [2].f2 ∈ {6} + [3].f1 ∈ [--..--] + [3].f2 ∈ {8} + [4].f1 ∈ [--..--] + [4].f2 ∈ {10} + [5].f1 ∈ [--..--] + [5].f2 ∈ {0} + [6].f1 ∈ [--..--] + [6].f2 ∈ {0} + t6[0].f0 ∈ [--..--] + [0].f2 ∈ {2} + [0].[bits 40 to 63] ∈ UNINITIALIZED + [1].f0 ∈ [--..--] + [1].f2 ∈ {4} + [1].[bits 40 to 63] ∈ UNINITIALIZED + [2].f0 ∈ [--..--] + [2].f2 ∈ {6} + [2].[bits 40 to 63] ∈ UNINITIALIZED + [3].f0 ∈ [--..--] + [3].f2 ∈ {8} + [3].[bits 40 to 63] ∈ UNINITIALIZED + [4].f0 ∈ [--..--] + [4].f2 ∈ {10} + [4].[bits 40 to 63] ∈ UNINITIALIZED + [5].f0 ∈ [--..--] + [5].f2 ∈ {0} + [5].[bits 40 to 63] ∈ UNINITIALIZED + t7[0..4] ∈ [--..--] + t8[0] ∈ {1} + [1] ∈ {2} + [2..4] ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + x ∈ {{ &t7[0] }} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/const.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/const.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/const.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/const.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,534 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/const.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + I ∈ {2} + J ∈ {8} + v ∈ [--..--] + X ∈ {0} + s.i1 ∈ {3} + .i2 ∈ {4} + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + [5] ∈ {6} + [6..9] ∈ {0} +[value] computing for function const_formal <- main. + Called from tests/misc/const.i:84. +[value] Called Frama_C_show_each([-2147483648..2147483647]) +[value] Recording results for const_formal +[value] Done for function const_formal +[value] computing for function const_formal <- main. + Called from tests/misc/const.i:85. +[value] Called Frama_C_show_each({42}) +[value] Recording results for const_formal +[value] Done for function const_formal +[value] computing for function modify_I <- main. + Called from tests/misc/const.i:87. +[value] Called Frama_C_show_each({2}) +[value] computing for function pointer_to_const <- modify_I <- main. + Called from tests/misc/const.i:39. +[value] Called Frama_C_show_each({2; 3}) +[value] Called Frama_C_show_each_dead() +[value] Recording results for pointer_to_const +[value] Done for function pointer_to_const +[value] computing for function const_destination <- modify_I <- main. + Called from tests/misc/const.i:40. +[value] Called Frama_C_show_each({0; 2; 3}) +[value] Called Frama_C_show_each({{ &I }}) +[value] Recording results for const_destination +[value] Done for function const_destination +[value] Recording results for modify_I +[value] Done for function modify_I +[value] computing for function modify_J <- main. + Called from tests/misc/const.i:88. +[value] Called Frama_C_show_each({8}) +[value] computing for function pointer_to_const <- modify_J <- main. + Called from tests/misc/const.i:46. +[value] Called Frama_C_show_each({8; 9}) +[value] Called Frama_C_show_each_dead() +[value] Recording results for pointer_to_const +[value] Done for function pointer_to_const +[value] computing for function const_destination <- modify_J <- main. + Called from tests/misc/const.i:47. +[value] Called Frama_C_show_each({0; 8; 9}) +[value] Called Frama_C_show_each({{ &J }}) +[value] Recording results for const_destination +[value] Done for function const_destination +[value] Recording results for modify_J +[value] Done for function modify_J +[value] computing for function modify_s <- main. + Called from tests/misc/const.i:89. +[value] Called Frama_C_show_each({3}) +[value] computing for function pointer_to_const <- modify_s <- main. + Called from tests/misc/const.i:53. +[value] Called Frama_C_show_each({4}) +[value] Called Frama_C_show_each_dead() +[value] Recording results for pointer_to_const +[value] Done for function pointer_to_const +[value] computing for function const_destination <- modify_s <- main. + Called from tests/misc/const.i:54. +[value] Called Frama_C_show_each({0; 4}) +[value] Called Frama_C_show_each({{ &s + {4} }}) +[value] Recording results for const_destination +[value] Done for function const_destination +[value] Recording results for modify_s +[value] Done for function modify_s +[value] computing for function modify_t <- main. + Called from tests/misc/const.i:90. +[value] Called Frama_C_show_each({6}) +[value] computing for function pointer_to_const <- modify_t <- main. + Called from tests/misc/const.i:60. +[value] Called Frama_C_show_each({4}) +[value] Called Frama_C_show_each_dead() +[value] Recording results for pointer_to_const +[value] Done for function pointer_to_const +[value] computing for function const_destination <- modify_t <- main. + Called from tests/misc/const.i:61. +[value] Called Frama_C_show_each({3}) +[value] Called Frama_C_show_each({{ &t + {8} }}) +[value] Recording results for const_destination +[value] Done for function const_destination +[value] Recording results for modify_t +[value] Done for function modify_t +[value] computing for function constrain_G <- main. + Called from tests/misc/const.i:91. +tests/misc/const.i:71:[value] Assertion got status unknown. +[value] Called Frama_C_show_each({1; 4}) +[value] Recording results for constrain_G +[value] Done for function constrain_G +[value] computing for function pointer_to_const_logic <- main. + Called from tests/misc/const.i:93. +[value] Recording results for pointer_to_const_logic +[value] Done for function pointer_to_const_logic +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function const_destination: + I ∈ {0; 2; 3} + J ∈ {0; 8; 9} + s.i1 ∈ {3; 4} + .i2 ∈ {0; 4} + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {0; 3} + [3] ∈ {0; 4} + [4] ∈ {5} + [5] ∈ {6; 7} + [6..9] ∈ {0} +[value] Values at end of function const_formal: + i ∈ [--..--] +[value] Values at end of function constrain_G: + r ∈ {3; 5} +[value] Values at end of function pointer_to_const: + I ∈ {0; 2; 3} + J ∈ {0; 8; 9} + s.i1 ∈ {3; 4} + .i2 ∈ {0; 4} + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {0; 4} + [4] ∈ {5} + [5] ∈ {6; 7} + [6..9] ∈ {0} +[value] Values at end of function modify_I: + I ∈ {0; 2; 3} + J ∈ {8} + s.i1 ∈ {3} + .i2 ∈ {4} + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + [5] ∈ {6} + [6..9] ∈ {0} +[value] Values at end of function modify_J: + I ∈ {0; 2; 3} + J ∈ {0; 8; 9} + s.i1 ∈ {3} + .i2 ∈ {4} + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + [5] ∈ {6} + [6..9] ∈ {0} +[value] Values at end of function modify_s: + I ∈ {0; 2; 3} + J ∈ {0; 8; 9} + s.i1 ∈ {3; 4} + .i2 ∈ {0; 4} + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + [5] ∈ {6} + [6..9] ∈ {0} +[value] Values at end of function modify_t: + I ∈ {0; 2; 3} + J ∈ {0; 8; 9} + s.i1 ∈ {3; 4} + .i2 ∈ {0; 4} + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {0; 3} + [3] ∈ {0; 4} + [4] ∈ {5} + [5] ∈ {6; 7} + [6..9] ∈ {0} +[value] Values at end of function pointer_to_const_logic: + J ∈ {0; 8; 9; 12} +[value] Values at end of function main: + I ∈ {0; 2; 3} + J ∈ {0; 8; 9; 12} + s.i1 ∈ {3; 4} + .i2 ∈ {0; 4} + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {0; 3} + [3] ∈ {0; 4} + [4] ∈ {5} + [5] ∈ {6; 7} + [6..9] ∈ {0} +[from] Computing for function const_destination +[from] Done for function const_destination +[from] Computing for function const_formal +[from] Done for function const_formal +[from] Computing for function constrain_G +[from] Done for function constrain_G +[from] Computing for function pointer_to_const +[from] Done for function pointer_to_const +[from] Computing for function modify_I +[from] Done for function modify_I +[from] Computing for function modify_J +[from] Done for function modify_J +[from] Computing for function modify_s +[from] Done for function modify_s +[from] Computing for function modify_t +[from] Done for function modify_t +[from] Computing for function pointer_to_const_logic +[from] Done for function pointer_to_const_logic +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function const_destination: + I FROM p (and SELF) + J FROM p (and SELF) + s.i2 FROM p (and SELF) + t[2] FROM p (and SELF) +[from] Function const_formal: + NO EFFECTS +[from] Function constrain_G: + NO EFFECTS +[from] Function pointer_to_const: + I FROM p (and SELF) + J FROM p (and SELF) + s.i2 FROM p (and SELF) + t[3] FROM p (and SELF) +[from] Function modify_I: + I FROM I; v (and SELF) + J FROM v (and SELF) + s.i2 FROM v (and SELF) + t[2..3] FROM v (and SELF) +[from] Function modify_J: + I FROM v (and SELF) + J FROM J; v (and SELF) + s.i2 FROM v (and SELF) + t[2..3] FROM v (and SELF) +[from] Function modify_s: + I FROM v (and SELF) + J FROM v (and SELF) + s.i1 FROM v; s.i1 (and SELF) + .i2 FROM v (and SELF) + t[2..3] FROM v (and SELF) +[from] Function modify_t: + I FROM v (and SELF) + J FROM v (and SELF) + s.i2 FROM v (and SELF) + t[2..3] FROM v (and SELF) + [5] FROM v; t[5] (and SELF) +[from] Function pointer_to_const_logic: + J FROM v; p (and SELF) +[from] Function main: + I FROM I; v (and SELF) + J FROM J; v (and SELF) + s.i1 FROM v; s.i1 (and SELF) + .i2 FROM v (and SELF) + t[2..3] FROM v (and SELF) + [5] FROM v; t[5] (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function const_destination: + I; J; s.i2; t[2] +[inout] Inputs for function const_destination: + I; J; s.i2; t[2] +[inout] Out (internal) for function const_formal: + i +[inout] Inputs for function const_formal: + v +[inout] Out (internal) for function constrain_G: + r +[inout] Inputs for function constrain_G: + G +[inout] Out (internal) for function pointer_to_const: + I; J; s.i2; t[3] +[inout] Inputs for function pointer_to_const: + I; J; s.i2; t[3] +[inout] Out (internal) for function modify_I: + I; J; s.i2; t[2..3] +[inout] Inputs for function modify_I: + I; J; v; s.i2; t[2..3] +[inout] Out (internal) for function modify_J: + I; J; s.i2; t[2..3] +[inout] Inputs for function modify_J: + I; J; v; s.i2; t[2..3] +[inout] Out (internal) for function modify_s: + I; J; s; t[2..3] +[inout] Inputs for function modify_s: + I; J; v; s; t[2..3] +[inout] Out (internal) for function modify_t: + I; J; s.i2; t{[2..3]; [5]} +[inout] Inputs for function modify_t: + I; J; v; s.i2; t{[2..3]; [5]} +[inout] Out (internal) for function pointer_to_const_logic: + J +[inout] Inputs for function pointer_to_const_logic: + v +[inout] Out (internal) for function main: + I; J; s; t{[2..3]; [5]} +[inout] Inputs for function main: + G; I; J; v; s; t{[2..3]; [5]} +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + I ∈ {2} + J ∈ {8} + v ∈ [--..--] + X ∈ {0} + s.i1 ∈ {3} + .i2 ∈ {4} + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + [5] ∈ {6} + [6..9] ∈ {0} +[value] computing for function const_formal <- main. + Called from tests/misc/const.i:84. +[value] Called Frama_C_show_each([-2147483648..2147483647]) +tests/misc/const.i:21:[kernel] warning: out of bounds write. assert \valid(&i); +tests/misc/const.i:21:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for const_formal +[value] Done for function const_formal +[value] computing for function const_formal <- main. + Called from tests/misc/const.i:85. +[value] Called Frama_C_show_each({42}) +[value] Recording results for const_formal +[value] Done for function const_formal +[value] computing for function modify_I <- main. + Called from tests/misc/const.i:87. +[value] Called Frama_C_show_each({2}) +tests/misc/const.i:38:[kernel] warning: out of bounds write. assert \valid(&I); +tests/misc/const.i:38:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] computing for function pointer_to_const <- modify_I <- main. + Called from tests/misc/const.i:39. +[value] Called Frama_C_show_each({2}) +tests/misc/const.i:26:[kernel] warning: out of bounds write. assert \valid(p); +tests/misc/const.i:26:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for pointer_to_const +[value] Done for function pointer_to_const +[value] computing for function const_destination <- modify_I <- main. + Called from tests/misc/const.i:40. +[value] Called Frama_C_show_each({2}) +tests/misc/const.i:32:[kernel] warning: out of bounds write. assert \valid(p); +tests/misc/const.i:32:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for const_destination +[value] Done for function const_destination +[value] Recording results for modify_I +[value] Done for function modify_I +[value] computing for function modify_J <- main. + Called from tests/misc/const.i:88. +[value] Called Frama_C_show_each({8}) +[value] computing for function pointer_to_const <- modify_J <- main. + Called from tests/misc/const.i:46. +[value] Called Frama_C_show_each({8; 9}) +[value] Recording results for pointer_to_const +[value] Done for function pointer_to_const +[value] computing for function const_destination <- modify_J <- main. + Called from tests/misc/const.i:47. +[value] Called Frama_C_show_each({8; 9}) +[value] Called Frama_C_show_each({{ &J }}) +[value] Recording results for const_destination +[value] Done for function const_destination +[value] Recording results for modify_J +[value] Done for function modify_J +[value] computing for function modify_s <- main. + Called from tests/misc/const.i:89. +[value] Called Frama_C_show_each({3}) +tests/misc/const.i:52:[kernel] warning: out of bounds write. assert \valid(&s.i1); +tests/misc/const.i:52:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] computing for function pointer_to_const <- modify_s <- main. + Called from tests/misc/const.i:53. +[value] Called Frama_C_show_each({4}) +[value] Recording results for pointer_to_const +[value] Done for function pointer_to_const +[value] computing for function const_destination <- modify_s <- main. + Called from tests/misc/const.i:54. +[value] Called Frama_C_show_each({4}) +[value] Recording results for const_destination +[value] Done for function const_destination +[value] Recording results for modify_s +[value] Done for function modify_s +[value] computing for function modify_t <- main. + Called from tests/misc/const.i:90. +[value] Called Frama_C_show_each({6}) +tests/misc/const.i:59:[kernel] warning: out of bounds write. assert \valid(&t[5]); +tests/misc/const.i:59:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] computing for function pointer_to_const <- modify_t <- main. + Called from tests/misc/const.i:60. +[value] Called Frama_C_show_each({4}) +[value] Recording results for pointer_to_const +[value] Done for function pointer_to_const +[value] computing for function const_destination <- modify_t <- main. + Called from tests/misc/const.i:61. +[value] Called Frama_C_show_each({3}) +[value] Recording results for const_destination +[value] Done for function const_destination +[value] Recording results for modify_t +[value] Done for function modify_t +[value] computing for function constrain_G <- main. + Called from tests/misc/const.i:91. +[value] Called Frama_C_show_each({1; 4}) +[value] Recording results for constrain_G +[value] Done for function constrain_G +[value] computing for function pointer_to_const_logic <- main. + Called from tests/misc/const.i:93. +tests/misc/const.i:80:[kernel] warning: out of bounds write. assert \valid(p); +tests/misc/const.i:80:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for pointer_to_const_logic +[value] Done for function pointer_to_const_logic +[value] Recording results for main +[value] done for function main +tests/misc/const.i:21:[value] Assertion 'Value,mem_access' got final status invalid. +tests/misc/const.i:26:[value] Assertion 'Value,mem_access' got final status invalid. +tests/misc/const.i:38:[value] Assertion 'Value,mem_access' got final status invalid. +tests/misc/const.i:52:[value] Assertion 'Value,mem_access' got final status invalid. +tests/misc/const.i:59:[value] Assertion 'Value,mem_access' got final status invalid. +tests/misc/const.i:80:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function const_destination: + J ∈ {0} +[value] Values at end of function const_formal: + +[value] Values at end of function constrain_G: + r ∈ {3; 5} +[value] Values at end of function pointer_to_const: + NON TERMINATING FUNCTION +[value] Values at end of function modify_I: + J ∈ {8} +[value] Values at end of function modify_J: + J ∈ {0; 8; 9} +[value] Values at end of function modify_s: + J ∈ {0; 8; 9} +[value] Values at end of function modify_t: + J ∈ {0; 8; 9} +[value] Values at end of function pointer_to_const_logic: + +[value] Values at end of function main: + J ∈ {0; 8; 9} +[from] Computing for function const_destination +[from] Done for function const_destination +[from] Computing for function const_formal +[from] Done for function const_formal +[from] Computing for function constrain_G +[from] Done for function constrain_G +[from] Computing for function pointer_to_const +[from] Non-terminating function pointer_to_const (no dependencies) +[from] Done for function pointer_to_const +[from] Computing for function modify_I +[from] Done for function modify_I +[from] Computing for function modify_J +[from] Done for function modify_J +[from] Computing for function modify_s +[from] Done for function modify_s +[from] Computing for function modify_t +[from] Done for function modify_t +[from] Computing for function pointer_to_const_logic +[from] Done for function pointer_to_const_logic +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function const_destination: + J FROM p +[from] Function const_formal: + NO EFFECTS +[from] Function constrain_G: + NO EFFECTS +[from] Function pointer_to_const: + NON TERMINATING - NO EFFECTS +[from] Function modify_I: + J FROM v (and SELF) +[from] Function modify_J: + J FROM J; v (and SELF) +[from] Function modify_s: + J FROM v (and SELF) +[from] Function modify_t: + J FROM v (and SELF) +[from] Function pointer_to_const_logic: + J FROM v; p (and SELF) +[from] Function main: + J FROM J; v (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function const_destination: + J +[inout] Inputs for function const_destination: + I; J; s.i2; t[2] +[inout] Out (internal) for function const_formal: + \nothing +[inout] Inputs for function const_formal: + v +[inout] Out (internal) for function constrain_G: + r +[inout] Inputs for function constrain_G: + G +[inout] Out (internal) for function pointer_to_const: + \nothing +[inout] Inputs for function pointer_to_const: + I; J; s.i2; t[3] +[inout] Out (internal) for function modify_I: + J +[inout] Inputs for function modify_I: + I; J; v; s.i2; t[2..3] +[inout] Out (internal) for function modify_J: + J +[inout] Inputs for function modify_J: + I; J; v; s.i2; t[2..3] +[inout] Out (internal) for function modify_s: + J +[inout] Inputs for function modify_s: + I; J; v; s; t[2..3] +[inout] Out (internal) for function modify_t: + J +[inout] Inputs for function modify_t: + I; J; v; s.i2; t{[2..3]; [5]} +[inout] Out (internal) for function pointer_to_const_logic: + \nothing +[inout] Inputs for function pointer_to_const_logic: + v +[inout] Out (internal) for function main: + J +[inout] Inputs for function main: + G; I; J; v; s; t{[2..3]; [5]} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/const_syntax.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/const_syntax.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/const_syntax.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/const_syntax.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/const_syntax.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + INSTRU_N_00_01_001_CRC___1525983317999999999994352352523523993424999 + ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + INSTRU_N_00_01_001_CRC___1525983317999999999994352352523523993425000 + ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + INSTRU_N_00_01_001_CRC___1525983317999999999994352352523523993425000 +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/const_typedef.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/const_typedef.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/const_typedef.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/const_typedef.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,84 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/const_typedef.i (no preprocessing) +/* Generated by Frama-C */ +typedef int INT[3][3]; +struct __anonstruct_ts_1 { + int s1 ; + int s2 ; +}; +typedef struct __anonstruct_ts_1 ts; +typedef int INT4[7]; +INT const __attribute__((__BLA__)) x1 = {{1, 2, 3}, {4, 5, 6}, {7}}; +INT const __attribute__((__BLA__)) x1bis; +int const ( __attribute__((__BLA__)) x2)[3][3] = {{1, 2, 3}, {4, 5, 6}, {7}}; +int const ( __attribute__((__BLA__)) x3)[2][7] = {{1, 2, 3, 4, 5, 6, 7}}; +ts const __attribute__((__BLA__)) s[3] = {{.s1 = 1, .s2 = 2}, + {.s1 = 3, .s2 = 4}, + {.s1 = 5, .s2 = 0}}; +INT4 const y1 = {0, 1, 2, 3, 4}; +int const y2[5] = {1, 2, 3, 4, 5}; +int const y3[7]; + +int const y3[7] = {1, 2}; +int main(void) +{ + int __retres; + __retres = 0; + return __retres; +} + + +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x1[0][0] ∈ {1} + [0][1] ∈ {2} + [0][2] ∈ {3} + [1][0] ∈ {4} + [1][1] ∈ {5} + [1][2] ∈ {6} + [2][0] ∈ {7} + [2][1..2] ∈ {0} + x1bis[0..2][0..2] ∈ {0} + x2[0][0] ∈ {1} + [0][1] ∈ {2} + [0][2] ∈ {3} + [1][0] ∈ {4} + [1][1] ∈ {5} + [1][2] ∈ {6} + [2][0] ∈ {7} + [2][1..2] ∈ {0} + x3[0][0] ∈ {1} + [0][1] ∈ {2} + [0][2] ∈ {3} + [0][3] ∈ {4} + [0][4] ∈ {5} + [0][5] ∈ {6} + [0][6] ∈ {7} + [1][0..6] ∈ {0} + s[0].s1 ∈ {1} + [0].s2 ∈ {2} + [1].s1 ∈ {3} + [1].s2 ∈ {4} + [2].s1 ∈ {5} + [2].s2 ∈ {0} + y1[0] ∈ {0} + [1] ∈ {1} + [2] ∈ {2} + [3] ∈ {3} + [4] ∈ {4} + [5..6] ∈ {0} + y2[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + y3[0] ∈ {1} + [1] ∈ {2} + [2..6] ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + __retres ∈ {0} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/context_free.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/context_free.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/context_free.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/context_free.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,188 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/context_free.i (no preprocessing) +[value] Analyzing an incomplete application starting at f +[value] Computing initial state +[value:initial_state] creating variable S_p_svoid with imprecise size (type void) +[value:initial_state] creating variable S_qvoid with imprecise size (type void) +[value:initial_state] creating variable S_p_svoid_0 with imprecise size (type void) +[value:initial_state] creating variable S_qvoid_0 with imprecise size (type void) +[value] Initial state computed +[value] Values of globals at initialization + a ∈ [--..--] + b ∈ [--..--] + c ∈ [--..--] + star_p ∈ [--..--] + star_w___500 ∈ [--..--] + s{.s1; .s2} ∈ [--..--] + .sp ∈ {{ NULL ; &S_sp_s[0] }} + .sg ∈ {{ garbled mix of &{S_sg_s} (origin: Well) }} + t{.s1; .s2} ∈ [--..--] + .sp ∈ {{ NULL ; &S_sp_t[0] }} + .sg ∈ {{ garbled mix of &{S_sg_t} (origin: Well) }} + tt.ss1{.s1; .s2} ∈ [--..--] + .ss1.sp ∈ {{ NULL ; &S_sp_ss1_tt[0] }} + .ss1.sg ∈ {{ garbled mix of &{S_sg_ss1_tt} (origin: Well) }} + .ss2 ∈ [--..--] + u[0..11] ∈ [--..--] + v[0..11][0..2] ∈ [--..--] + w[0] ∈ {{ NULL ; &S_0_w[0] }} + [1] ∈ {{ NULL ; &S_1_w[0] }} + [2..11] ∈ {{ NULL ; &S_0_w[0] ; &S_1_w[0] }} + ts[0]{.s1; .s2} ∈ [--..--] + [0].sp ∈ {{ NULL ; &S_sp_0_ts[0] }} + [0].sg ∈ {{ garbled mix of &{S_sg_0_ts} (origin: Well) }} + [1]{.s1; .s2} ∈ [--..--] + [1].sp ∈ {{ NULL ; &S_sp_1_ts[0] }} + [1].sg ∈ {{ garbled mix of &{S_sg_1_ts} (origin: Well) }} + [2]{.s1; .s2} ∈ [--..--] + [2].sp ∈ {{ NULL ; &S_sp_0_ts[0] ; &S_sp_1_ts[0] }} + [2].sg ∈ {{ garbled mix of &{S_sg_0_ts; S_sg_1_ts} (origin: Well) }} + [3]{.s1; .s2} ∈ [--..--] + [3].sp ∈ {{ NULL ; &S_sp_0_ts[0] ; &S_sp_1_ts[0] }} + [3].sg ∈ {{ garbled mix of &{S_sg_0_ts; S_sg_1_ts} (origin: Well) }} + [4]{.s1; .s2} ∈ [--..--] + [4].sp ∈ {{ NULL ; &S_sp_0_ts[0] ; &S_sp_1_ts[0] }} + [4].sg ∈ {{ garbled mix of &{S_sg_0_ts; S_sg_1_ts} (origin: Well) }} + [5]{.s1; .s2} ∈ [--..--] + [5].sp ∈ {{ NULL ; &S_sp_0_ts[0] ; &S_sp_1_ts[0] }} + [5].sg ∈ {{ garbled mix of &{S_sg_0_ts; S_sg_1_ts} (origin: Well) }} + [6]{.s1; .s2} ∈ [--..--] + [6].sp ∈ {{ NULL ; &S_sp_0_ts[0] ; &S_sp_1_ts[0] }} + [6].sg ∈ {{ garbled mix of &{S_sg_0_ts; S_sg_1_ts} (origin: Well) }} + [7]{.s1; .s2} ∈ [--..--] + [7].sp ∈ {{ NULL ; &S_sp_0_ts[0] ; &S_sp_1_ts[0] }} + [7].sg ∈ {{ garbled mix of &{S_sg_0_ts; S_sg_1_ts} (origin: Well) }} + [8]{.s1; .s2} ∈ [--..--] + [8].sp ∈ {{ NULL ; &S_sp_0_ts[0] ; &S_sp_1_ts[0] }} + [8].sg ∈ {{ garbled mix of &{S_sg_0_ts; S_sg_1_ts} (origin: Well) }} + [9]{.s1; .s2} ∈ [--..--] + [9].sp ∈ {{ NULL ; &S_sp_0_ts[0] ; &S_sp_1_ts[0] }} + [9].sg ∈ {{ garbled mix of &{S_sg_0_ts; S_sg_1_ts} (origin: Well) }} + uu ∈ {{ garbled mix of &{WELL_uu} (origin: Well) }} + uuu ∈ [--..--] + c_int ∈ [--..--] + svoid.f1 ∈ [--..--] + .p ∈ {{ garbled mix of &{S_p_svoid_0} (origin: Well) }} + qvoid ∈ {{ garbled mix of &{S_qvoid_0} (origin: Well) }} + S_p_svoid[bits 0 to ..] ∈ + {{ garbled mix of &{S_p_svoid} (origin: Well) }} + S_qvoid[bits 0 to ..] ∈ {{ garbled mix of &{S_qvoid} (origin: Well) }} + S_sp_s[0..1] ∈ [--..--] + S_sp_t[0..1] ∈ [--..--] + S_sp_ss1_tt[0..1] ∈ [--..--] + S_0_w[0..1] ∈ [--..--] + S_1_w[0..1] ∈ [--..--] + S_sp_0_ts[0..1] ∈ [--..--] + S_sp_1_ts[0..1] ∈ [--..--] + WELL_uu[bits 0 to ..] ∈ {{ garbled mix of &{WELL_uu} (origin: Well) }} + S_p_svoid_0[bits 0 to ..] ∈ + {{ garbled mix of &{S_p_svoid_0} (origin: Well) }} + S_qvoid_0[bits 0 to ..] ∈ + {{ garbled mix of &{S_qvoid_0} (origin: Well) }} +[value:initial_state] creating variable S_0_S_vvv with imprecise size (type void) +[value:initial_state] creating variable S_1_S_vvv with imprecise size (type void) +[value:initial_state] creating variable S_vv with imprecise size (type void) +tests/misc/context_free.i:46:[kernel] warning: out of bounds write. assert \valid(p); +tests/misc/context_free.i:51:[value] Assigning imprecise value to vv. + The imprecision originates from Well +tests/misc/context_free.i:52:[kernel] warning: out of bounds write. assert \valid(vvv); +tests/misc/context_free.i:52:[value] Assigning imprecise value to *vvv (pointing to S_vvv with offsets {0}). + The imprecision originates from Well +tests/misc/context_free.i:54:[value] Assigning imprecise value to uu.u1. + The imprecision originates from Well +tests/misc/context_free.i:56:[kernel] warning: out of bounds write. assert \valid(ta+1); +tests/misc/context_free.i:58:[value] Assigning imprecise value to pvoid. + The imprecision originates from Well +tests/misc/context_free.i:59:[value] Reading left-value pvoid. + It contains a garbled mix of {S_p_svoid_0} because of Well. +tests/misc/context_free.i:59:[kernel] warning: out of bounds write. assert \valid(pvoid); +tests/misc/context_free.i:60:[value] Assigning imprecise value to pvoid. + The imprecision originates from Well +tests/misc/context_free.i:61:[value] Reading left-value pvoid. + It contains a garbled mix of {S_qvoid_0} because of Well. +tests/misc/context_free.i:61:[kernel] warning: out of bounds write. assert \valid(pvoid); +tests/misc/context_free.i:61:[kernel] warning: casting address to a type smaller than sizeof(void*): {{ &pvoid }} +tests/misc/context_free.i:61:[value] Assigning imprecise value to *pvoid + (pointing to S_qvoid_0 with offsets [0..34359738360]). + The imprecision originates from Arithmetic {tests/misc/context_free.i:61} +tests/misc/context_free.i:62:[value] Reading left-value g. + It contains a garbled mix of {S_g} because of Well. +tests/misc/context_free.i:62:[value] warning: Function pointer for call is imprecise: assert(\valid_fun_pointer(*g)) +[value] computing for function S_g <- f. + Called from tests/misc/context_free.i:62. +tests/misc/context_free.i:62:[kernel] warning: Neither code nor specification for function S_g, generating default assigns from the prototype +[value] using specification for function S_g +[value] Done for function S_g +tests/misc/context_free.i:62:[value] warning: locals {pvoid} escaping the scope of f through S_qvoid_0 +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + a ∈ [--..--] + b ∈ [--..--] + t.s1 ∈ [--..--] + .s2 ∈ {3} + .sp ∈ {{ NULL ; &S_sp_t[0] }} + .sg ∈ {{ garbled mix of &{S_sg_t} (origin: Well) }} + tt.ss1{.s1; .s2} ∈ [--..--] + .ss1.sp ∈ {{ NULL ; &S_sp_ss1_tt[0] }} + .ss1.sg ∈ {{ garbled mix of &{S_sg_ss1_tt} (origin: Well) }} + .ss2 ∈ [--..--] + u[0] ∈ [--..--] + [1] ∈ {2} + [2..11] ∈ [--..--] + v[0][0] ∈ {5} + {[0][1..2]; [1..11][0..2]} ∈ [--..--] + w[0] ∈ {{ NULL ; &S_0_w[0] }} + [1] ∈ {{ NULL ; &S_1_w[0] }} + [2..3] ∈ {{ NULL ; &S_0_w[0] ; &S_1_w[0] }} + [4] ∈ {{ &a }} + [5..11] ∈ {{ NULL ; &S_0_w[0] ; &S_1_w[0] }} + ts[0]{.s1; .s2} ∈ [--..--] + [0].sp ∈ {{ NULL ; &S_sp_0_ts[0] }} + [0].sg ∈ {{ garbled mix of &{S_sg_0_ts} (origin: Well) }} + [1]{.s1; .s2} ∈ [--..--] + [1].sp ∈ {{ NULL ; &S_sp_1_ts[0] }} + [1].sg ∈ {{ garbled mix of &{S_sg_1_ts} (origin: Well) }} + [2]{.s1; .s2} ∈ [--..--] + [2].sp ∈ {{ NULL ; &S_sp_0_ts[0] ; &S_sp_1_ts[0] }} + [2].sg ∈ {{ garbled mix of &{S_sg_0_ts; S_sg_1_ts} (origin: Well) }} + [3]{.s1; .s2} ∈ [--..--] + [3].sp ∈ {{ NULL ; &S_sp_0_ts[0] ; &S_sp_1_ts[0] }} + [3].sg ∈ {{ garbled mix of &{S_sg_0_ts; S_sg_1_ts} (origin: Well) }} + [4]{.s1; .s2} ∈ [--..--] + [4].sp ∈ {{ NULL ; &S_sp_0_ts[0] ; &S_sp_1_ts[0] }} + [4].sg ∈ {{ garbled mix of &{S_sg_0_ts; S_sg_1_ts} (origin: Well) }} + [5]{.s1; .s2} ∈ [--..--] + [5].sp ∈ {{ NULL ; &S_sp_0_ts[0] ; &S_sp_1_ts[0] }} + [5].sg ∈ {{ garbled mix of &{S_sg_0_ts; S_sg_1_ts} (origin: Well) }} + [6]{.s1; .s2} ∈ [--..--] + [6].sp ∈ {{ NULL ; &S_sp_0_ts[0] ; &S_sp_1_ts[0] }} + [6].sg ∈ {{ garbled mix of &{S_sg_0_ts; S_sg_1_ts} (origin: Well) }} + [7]{.s1; .s2} ∈ [--..--] + [7].sp ∈ {{ NULL ; &S_sp_0_ts[0] ; &S_sp_1_ts[0] }} + [7].sg ∈ {{ garbled mix of &{S_sg_0_ts; S_sg_1_ts} (origin: Well) }} + [8]{.s1; .s2} ∈ [--..--] + [8].sp ∈ {{ NULL ; &S_sp_0_ts[0] ; &S_sp_1_ts[0] }} + [8].sg ∈ {{ garbled mix of &{S_sg_0_ts; S_sg_1_ts} (origin: Well) }} + [9]{.s1; .s2} ∈ [--..--] + [9].sp ∈ {{ NULL ; &S_sp_0_ts[0] ; &S_sp_1_ts[0] }} + [9].sg ∈ {{ garbled mix of &{S_sg_0_ts; S_sg_1_ts} (origin: Well) }} + uu ∈ {{ garbled mix of &{WELL_uu} (origin: Well) }} + uuu ∈ [--..--] + c_int ∈ [--..--] + p ∈ {{ &S_p[0] }} + vv ∈ {{ garbled mix of &{S_vv} (origin: Well) }} + ta ∈ {{ &S_ta[0] }} + pvoid ∈ {{ &S_qvoid_0 + [0..4294967295] }} + S_p_svoid_0[bits 0 to ..] ∈ + {{ garbled mix of &{S_p_svoid_0} (origin: Well) }} + S_qvoid_0[bits 0 to ..] ∈ + {{ garbled mix of &{pvoid; S_qvoid_0} (origin: Well) }} + S_ta[0] ∈ [--..--] + [1] ∈ {3} + [2..4] ∈ [--..--] + S_vvv[0] ∈ {{ garbled mix of &{S_0_S_vvv} (origin: Well) }} + [1] ∈ {{ garbled mix of &{S_1_S_vvv} (origin: Well) }} + S_p[0] ∈ {{ NULL ; &S_0_S_p[0] }} + [1] ∈ {{ NULL ; &S_1_S_p[0] }} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/context_free_simple.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/context_free_simple.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/context_free_simple.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/context_free_simple.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/context_free_simple.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + z ∈ {1} +[value] computing for function f <- main. + Called from tests/misc/context_free_simple.i:12. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + z ∈ {5} + __retres ∈ {4} +[value] Values at end of function main: + z ∈ {5} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + z FROM x; y + \result FROM y +[from] Function main: + z FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + z; __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main: + z +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/context_width.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/context_width.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/context_width.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/context_width.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,102 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/context_width.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} +tests/misc/context_width.i:17:[value] Assertion got status invalid (stopping propagation). +tests/misc/context_width.i:10:[kernel] warning: pointer comparison: assert \pointer_comparable(p+2, (int *)0); +tests/misc/context_width.i:12:[kernel] warning: pointer comparison: assert \pointer_comparable(p+1, &a); +tests/misc/context_width.i:15:[kernel] warning: out of bounds write. assert \valid(p+1); +tests/misc/context_width.i:16:[kernel] warning: out of bounds write. assert \valid(p+2); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + S_p[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + S_p[0..2] FROM p (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + S_p[0..2] +[inout] Inputs for function main: + \nothing +/* Generated by Frama-C */ +int a; +void main(int *p) +{ + if (! (p == (int *)0)) { + if (! (p + 1 == (int *)0)) + /*@ assert Value: ptr_comparison: \pointer_comparable(p+2, (int *)0); + */ + if (! (p + 2 == (int *)0)) ; + /*@ assert Value: ptr_comparison: \pointer_comparable(p+1, &a); */ + if (p + 1 == & a) ; + *p = 1; + /*@ assert Value: mem_access: \valid(p+1); */ + *(p + 1) = 2; + /*@ assert Value: mem_access: \valid(p+2); */ + *(p + 2) = 3; + } + else + /*@ assert \false; */ ; + return; +} + + +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} +tests/misc/context_width.i:10:[kernel] warning: pointer comparison: assert \pointer_comparable(p+2, (int *)0); +tests/misc/context_width.i:12:[kernel] warning: pointer comparison: assert \pointer_comparable(p+1, &a); +tests/misc/context_width.i:15:[kernel] warning: out of bounds write. assert \valid(p+1); +tests/misc/context_width.i:15:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +tests/misc/context_width.i:15:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + S_p_0[0] +[inout] Inputs for function main: + \nothing +/* Generated by Frama-C */ +int a; +void main(int *p) +{ + if (! (p == (int *)0)) { + if (! (p + 1 == (int *)0)) + /*@ assert Value: ptr_comparison: \pointer_comparable(p+2, (int *)0); + */ + if (! (p + 2 == (int *)0)) ; + /*@ assert Value: ptr_comparison: \pointer_comparable(p+1, &a); */ + if (p + 1 == & a) ; + *p = 1; + /*@ assert Value: mem_access: \valid(p+1); */ + *(p + 1) = 2; + *(p + 2) = 3; + } + else + /*@ assert \false; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/control.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/control.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/control.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/control.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/control.i (no preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + c ∈ {0} + d ∈ {0} +tests/misc/control.i:11:[value] entering loop for the first time +tests/misc/control.i:14:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + x ∈ [0..2147483647] + i ∈ {4} +[from] Computing for function f +[from] Done for function f +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + x FROM x (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + x; i +[inout] Inputs for function f: + x; c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/copy_machdep.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/copy_machdep.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/copy_machdep.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/copy_machdep.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,5 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/copy_machdep.i (no preprocessing) +[kernel] Machdep is preserved +[kernel] Enums is preserved +[kernel] Unicode is preserved diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/copy_paste_hidden_by_dummy_cast.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/copy_paste_hidden_by_dummy_cast.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/copy_paste_hidden_by_dummy_cast.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/copy_paste_hidden_by_dummy_cast.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/copy_paste_hidden_by_dummy_cast.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + A4O1_Ci_sNO_ERREUR_ANO.a ∈ {0} + .[bits 16 to 31] ∈ UNINITIALIZED + .b ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + Rl_sErreurAno.a ∈ {0} + .[bits 16 to 31] ∈ UNINITIALIZED + .b ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + Rl_sErreurAno +[inout] Inputs for function main: + A4O1_Ci_sNO_ERREUR_ANO diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/copy_paste.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/copy_paste.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/copy_paste.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/copy_paste.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,37 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/copy_paste.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..11] ∈ {0} + G ∈ {0} +tests/misc/copy_paste.i:8:[kernel] warning: accessing out of bounds index {-3; 4}. assert 0 ≤ j < 12; +tests/misc/copy_paste.i:9:[kernel] warning: out of bounds read. assert \valid_read((int *)l); +[value] Recording results for main +[value] done for function main +tests/misc/copy_paste.i:8:[value] Assertion 'Value,index_bound' got final status valid. +tests/misc/copy_paste.i:9:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + t[0..2] ∈ {0} + [3] ∈ {0; 3; 4} + [4] ∈ {4} + [5..11] ∈ {0} + G ∈ [--..--] + l ∈ [--..--] + i ∈ {3; 4} + j ∈ {4} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + t[3] FROM c (and SELF) + [4] FROM c + G FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + t[3..4]; G; l; i; tmp; j; tmp_0 +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/copy_stdin.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/copy_stdin.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/copy_stdin.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/copy_stdin.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,35 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/copy_stdin.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function leaf <- main. + Called from tests/misc/copy_stdin.i:4. +tests/misc/copy_stdin.i:4:[kernel] warning: Neither code nor specification for function leaf, generating default assigns from the prototype +[value] using specification for function leaf +[value] Done for function leaf +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + stdin ∈ + {{ NULL + [--..--] ; &alloced_return_leaf + [0..2147483616],0%32 }} + toto ∈ + {{ NULL + [--..--] ; &alloced_return_leaf + [0..2147483616],0%32 }} +[from] Computing for function main +[from] Computing for function leaf <-main +[from] Done for function leaf +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function leaf: + \result FROM \nothing +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + stdin; toto +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/CruiseControl.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/CruiseControl.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/CruiseControl.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/CruiseControl.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,3348 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/CruiseControl.c (with preprocessing) +tests/misc/CruiseControl.c:577:[kernel] warning: Floating-point constant 8.113 is not represented exactly. Will use 0x1.039db22d0e560p3. See documentation for option -warn-decimal-float +[kernel] Parsing tests/misc/CruiseControl_const.c (with preprocessing) +[value] Analyzing an incomplete application starting at CruiseControl +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + ZeroSpeed ∈ {0} + SpeedInc ∈ {0x1.0000000000000p1} + SpeedMax ∈ {0x1.2c00000000000p7} + SpeedMin ∈ {0x1.e000000000000p4} + ZeroPercent ∈ {0} + Kp ∈ [0x1.039db20000000p3 .. 0x1.039db40000000p3] + Ki ∈ {0x1.0000000000000p-1} + RegThrottleMax ∈ {0x1.6800000000000p5} +[value] computing for function DetectPedalsPressed <- CruiseControl. + Called from tests/misc/CruiseControl.c:462. +[value] Recording results for DetectPedalsPressed +[value] Done for function DetectPedalsPressed +[value] computing for function DetectSpeedLimits <- CruiseControl. + Called from tests/misc/CruiseControl.c:473. +[value] Recording results for DetectSpeedLimits +[value] Done for function DetectSpeedLimits +[value] computing for function CruiseStateMgt <- CruiseControl. + Called from tests/misc/CruiseControl.c:486. +[value] Recording results for CruiseStateMgt +[value] Done for function CruiseStateMgt +[value] computing for function CruiseSpeedMgt <- CruiseControl. + Called from tests/misc/CruiseControl.c:508. +tests/misc/CruiseControl.c:100:[kernel] warning: non-finite float value ([-0x1.fffffe0000000p127 .. 0x1.fffffe0000001p127]): + assert \is_finite((float)(_C_->_L10_CruiseControl+_C_->_L12_CruiseControl)); +tests/misc/CruiseControl.c:109:[kernel] warning: non-finite float value ([-0x1.fffffe0000001p127 .. 0x1.fffffe0000000p127]): + assert \is_finite((float)(_C_->_L10_CruiseControl-_C_->_L11_CruiseControl)); +[value] Recording results for CruiseSpeedMgt +[value] Done for function CruiseSpeedMgt +[value] computing for function ThrottleCmd <- CruiseControl. + Called from tests/misc/CruiseControl.c:525. +[value] computing for function ThrottleRegulation <- ThrottleCmd <- CruiseControl. + Called from tests/misc/CruiseControl.c:242. +tests/misc/CruiseControl.c:172:[kernel] warning: non-finite float value ([-0x1.fffffe0000000p128 .. 0x1.fffffe0000000p128]): + assert \is_finite((float)(_C_->_L1_CruiseControl-_C_->_L2_CruiseControl)); +tests/misc/CruiseControl.c:175:[kernel] warning: non-finite float value ([-0x1.039db2fc624c0p131 .. 0x1.039db2fc624c0p131]): + assert \is_finite((float)(_C_->_L3_CruiseControl*_C_->_L6_CruiseControl)); +tests/misc/CruiseControl.c:194:[kernel] warning: non-finite float value ([-0x1.fffffe0000000p128 .. 0x1.fffffe0000000p128]): + assert \is_finite((float)(_C_->_L16_CruiseControl+_C_->_L18_CruiseControl)); +tests/misc/CruiseControl.c:199:[kernel] warning: non-finite float value ([-0x1.7ffffe8000000p128 .. 0x1.7ffffe8000000p128]): + assert \is_finite((float)(_C_->ProportionnalAction+_C_->IntegralAction)); +[value] computing for function SaturateThrottle <- ThrottleRegulation <- + ThrottleCmd <- CruiseControl. + Called from tests/misc/CruiseControl.c:202. +tests/misc/CruiseControl.c:162:[value] Assertion got status unknown. +[value] Recording results for SaturateThrottle +[value] Done for function SaturateThrottle +[value] Recording results for ThrottleRegulation +[value] Done for function ThrottleRegulation +[value] Recording results for ThrottleCmd +[value] Done for function ThrottleCmd +[value] Recording results for CruiseControl +[value] done for function CruiseControl +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function CruiseSpeedMgt: + __retres ∈ {1} + S__C_[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel} ∈ + [--..--] + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [0]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{.BrakePressed; .AcceleratorPressed} ∈ {0; 1} + [0]{._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [0]._L95_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{.SpeedOutOffLimits; ._L82_CruiseControl} ∈ {0; 1} + [0]{._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._L96_CruiseControl ∈ {0} + [0]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [0]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt._L21_CruiseControl ∈ {0} + [0]._C0_CruiseSpeedMgt._L10_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt._L12_CruiseControl ∈ {0x1.0000000000000p1} + [0]._C0_CruiseSpeedMgt._L13_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt._L15_CruiseControl ∈ {0x1.2c00000000000p7} + [0]._C0_CruiseSpeedMgt._L16_CruiseControl ∈ {0; 1} + [0]._C0_CruiseSpeedMgt._L4_CruiseControl ∈ [--..--] + [0]._C0_CruiseSpeedMgt._L17_CruiseControl ∈ {0; 1} + [0]._C0_CruiseSpeedMgt._L11_CruiseControl ∈ {0x1.0000000000000p1} + [0]._C0_CruiseSpeedMgt._L14_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt._L19_CruiseControl ∈ {0x1.e000000000000p4} + [0]._C0_CruiseSpeedMgt._L18_CruiseControl ∈ {0; 1} + [0]._C0_CruiseSpeedMgt._L5_CruiseControl ∈ [--..--] + [0]._C0_CruiseSpeedMgt._L20_CruiseControl ∈ {0; 1} + [0]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + {0; 1} + [0]._C1_DetectPedalsPressed._L2_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed._L8_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L4_CruiseControl ∈ {0; 1} + [0]._C1_DetectPedalsPressed._L1_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed._L7_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L3_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._I0_speed ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L7_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C2_DetectSpeedLimits._L13_CruiseControl ∈ {0x1.e000000000000p4} + [0]._C2_DetectSpeedLimits._L8_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L14_CruiseControl ∈ {0x1.2c00000000000p7} + [0]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed}} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._I2_Resume; ._I3_On; ._I4_Off} ∈ [--..--] + [0]._C3_CruiseStateMgt{._I5_SpeedOutOffLimits; ._O0_Regul_ON} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._O1_Regul_OFF; ._O2_Regul_STDBY; ._LE24_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE0_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE4_CruiseControl; ._LE40_CruiseControl; ._LE26_CruiseControl; ._LE28_CruiseControl; ._LE9_CruiseControl; ._LE10_CruiseControl; ._LE11_CruiseControl; ._LE33_CruiseControl; ._LE35_CruiseControl; ._LE38_CruiseControl; ._LE12_CruiseControl; ._LE13_CruiseControl; ._LE14_CruiseControl; ._LE17_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE18_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE3_CruiseControl; ._LE16_CruiseControl; ._LE41_CruiseControl; ._LE19_CruiseControl; ._LE20_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE21_CruiseControl; ._LE1_CruiseControl; ._LE5_CruiseControl; ._LE22_CruiseControl; ._LE23_CruiseControl; ._LE25_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE29_CruiseControl; ._LE2_CruiseControl; ._LE30_CruiseControl; ._LE31_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl; ._LE42_CruiseControl; ._LE6_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE27_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt._LE36_CruiseControl ∈ [--..--] + [0]._C3_CruiseStateMgt._LE37_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE44_CruiseControl; ._LE8_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl ∈ {0} + [0]{._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [0]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [0]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + {[0]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl}; [1]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel}} ∈ + [--..--] + [1]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [1]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [1]._L95_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._L96_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [1]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + [--..--] + [1]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed._L4_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._L1_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed._L3_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._I0_speed ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [1]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [1]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [1]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl} ∈ + [--..--] +[value] Values at end of function CruiseStateMgt: + __retres ∈ {1} + S__C_[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel} ∈ + [--..--] + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [0]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{.BrakePressed; .AcceleratorPressed} ∈ {0; 1} + [0]{._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [0]._L95_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0].SpeedOutOffLimits ∈ {0; 1} + [0]{._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._L96_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [0]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + {0; 1} + [0]._C1_DetectPedalsPressed._L2_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed._L8_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L4_CruiseControl ∈ {0; 1} + [0]._C1_DetectPedalsPressed._L1_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed._L7_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L3_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._I0_speed ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L7_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C2_DetectSpeedLimits._L13_CruiseControl ∈ {0x1.e000000000000p4} + [0]._C2_DetectSpeedLimits._L8_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L14_CruiseControl ∈ {0x1.2c00000000000p7} + [0]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed}} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._I2_Resume; ._I3_On; ._I4_Off} ∈ [--..--] + [0]._C3_CruiseStateMgt{._I5_SpeedOutOffLimits; ._O0_Regul_ON} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._O1_Regul_OFF; ._O2_Regul_STDBY; ._LE24_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE0_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE4_CruiseControl; ._LE40_CruiseControl; ._LE26_CruiseControl; ._LE28_CruiseControl; ._LE9_CruiseControl; ._LE10_CruiseControl; ._LE11_CruiseControl; ._LE33_CruiseControl; ._LE35_CruiseControl; ._LE38_CruiseControl; ._LE12_CruiseControl; ._LE13_CruiseControl; ._LE14_CruiseControl; ._LE17_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE18_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE3_CruiseControl; ._LE16_CruiseControl; ._LE41_CruiseControl; ._LE19_CruiseControl; ._LE20_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE21_CruiseControl; ._LE1_CruiseControl; ._LE5_CruiseControl; ._LE22_CruiseControl; ._LE23_CruiseControl; ._LE25_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE29_CruiseControl; ._LE2_CruiseControl; ._LE30_CruiseControl; ._LE31_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl; ._LE42_CruiseControl; ._LE6_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE27_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt._LE36_CruiseControl ∈ [--..--] + [0]._C3_CruiseStateMgt._LE37_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE44_CruiseControl; ._LE8_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl ∈ {0} + [0]{._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [0]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [0]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + {[0]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl}; [1]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel}} ∈ + [--..--] + [1]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [1]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [1]._L95_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._L96_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [1]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + [--..--] + [1]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed._L4_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._L1_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed._L3_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._I0_speed ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [1]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [1]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [1]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl} ∈ + [--..--] +[value] Values at end of function DetectPedalsPressed: + __retres ∈ {1} + S__C_[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel} ∈ + [--..--] + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [0]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [0]._L95_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._L96_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [0]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + {0; 1} + [0]._C1_DetectPedalsPressed._L2_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed._L8_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L4_CruiseControl ∈ {0; 1} + [0]._C1_DetectPedalsPressed._L1_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed._L7_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L3_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._I0_speed ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [0]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [0]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [0]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [0]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + {[0]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl}; [1]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel}} ∈ + [--..--] + [1]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [1]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [1]._L95_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._L96_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [1]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + [--..--] + [1]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed._L4_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._L1_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed._L3_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._I0_speed ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [1]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [1]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [1]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl} ∈ + [--..--] +[value] Values at end of function DetectSpeedLimits: + __retres ∈ {1} + S__C_[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel} ∈ + [--..--] + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [0]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{.BrakePressed; .AcceleratorPressed} ∈ {0; 1} + [0]{._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [0]._L95_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._L96_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [0]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + {0; 1} + [0]._C1_DetectPedalsPressed._L2_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed._L8_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L4_CruiseControl ∈ {0; 1} + [0]._C1_DetectPedalsPressed._L1_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed._L7_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L3_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._I0_speed ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L7_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C2_DetectSpeedLimits._L13_CruiseControl ∈ {0x1.e000000000000p4} + [0]._C2_DetectSpeedLimits._L8_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L14_CruiseControl ∈ {0x1.2c00000000000p7} + [0]._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl} ∈ + {0; 1} + [0]{._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [0]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [0]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + {[0]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl}; [1]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel}} ∈ + [--..--] + [1]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [1]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [1]._L95_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._L96_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [1]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + [--..--] + [1]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed._L4_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._L1_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed._L3_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._I0_speed ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [1]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [1]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [1]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl} ∈ + [--..--] +[value] Values at end of function SaturateThrottle: + __retres ∈ {1} + S__C_[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel} ∈ + [--..--] + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [0]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{.BrakePressed; .AcceleratorPressed} ∈ {0; 1} + [0]{._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [0]._L95_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{.SpeedOutOffLimits; ._L82_CruiseControl} ∈ {0; 1} + [0]{._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._L96_CruiseControl ∈ {0} + [0]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [0]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + {0; 1} + [0]._C1_DetectPedalsPressed._L2_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed._L8_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L4_CruiseControl ∈ {0; 1} + [0]._C1_DetectPedalsPressed._L1_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed._L7_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L3_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._I0_speed ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L7_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C2_DetectSpeedLimits._L13_CruiseControl ∈ {0x1.e000000000000p4} + [0]._C2_DetectSpeedLimits._L8_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L14_CruiseControl ∈ {0x1.2c00000000000p7} + [0]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed}} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._I2_Resume; ._I3_On; ._I4_Off} ∈ [--..--] + [0]._C3_CruiseStateMgt{._I5_SpeedOutOffLimits; ._O0_Regul_ON} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._O1_Regul_OFF; ._O2_Regul_STDBY; ._LE24_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE0_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE4_CruiseControl; ._LE40_CruiseControl; ._LE26_CruiseControl; ._LE28_CruiseControl; ._LE9_CruiseControl; ._LE10_CruiseControl; ._LE11_CruiseControl; ._LE33_CruiseControl; ._LE35_CruiseControl; ._LE38_CruiseControl; ._LE12_CruiseControl; ._LE13_CruiseControl; ._LE14_CruiseControl; ._LE17_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE18_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE3_CruiseControl; ._LE16_CruiseControl; ._LE41_CruiseControl; ._LE19_CruiseControl; ._LE20_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE21_CruiseControl; ._LE1_CruiseControl; ._LE5_CruiseControl; ._LE22_CruiseControl; ._LE23_CruiseControl; ._LE25_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE29_CruiseControl; ._LE2_CruiseControl; ._LE30_CruiseControl; ._LE31_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl; ._LE42_CruiseControl; ._LE6_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE27_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt._LE36_CruiseControl ∈ [--..--] + [0]._C3_CruiseStateMgt._LE37_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE44_CruiseControl; ._LE8_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl ∈ {0} + [0]._M_condact_0_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._I0_Regul_ON ∈ {0; 1} + [0]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._L21_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._L20_CruiseControl ∈ {1} + [0]._C4_ThrottleCmd._L22_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd.ONRisingEdge ∈ {0; 1} + [0]._C4_ThrottleCmd._L26_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd{._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._M_init_0_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._I0_Reset ∈ {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L6_CruiseControl ∈ + [0x1.039db20000000p3 .. 0x1.039db40000000p3] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.ProportionnalAction ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L22_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L16_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L23_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L18_CruiseControl; ._L10_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L8_CruiseControl ∈ + {0x1.0000000000000p-1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.IntegralAction ∈ + [-0x1.fffffe0000000p126 .. 0x1.fffffe0000000p126] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L18_CruiseControl ∈ + {0x1.6800000000000p5} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L12_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl ∈ + {0; 1} + {[0]._C4_ThrottleCmd._M_condact_2_CruiseControl; [1]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel}} ∈ + [--..--] + [1]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [1]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [1]._L95_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._L96_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [1]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + [--..--] + [1]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed._L4_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._L1_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed._L3_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._I0_speed ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [1]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [1]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [1]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl} ∈ + [--..--] +[value] Values at end of function ThrottleRegulation: + __retres ∈ {1} + S__C_[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel} ∈ + [--..--] + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [0]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{.BrakePressed; .AcceleratorPressed} ∈ {0; 1} + [0]{._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [0]._L95_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{.SpeedOutOffLimits; ._L82_CruiseControl} ∈ {0; 1} + [0]{._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._L96_CruiseControl ∈ {0} + [0]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [0]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + {0; 1} + [0]._C1_DetectPedalsPressed._L2_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed._L8_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L4_CruiseControl ∈ {0; 1} + [0]._C1_DetectPedalsPressed._L1_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed._L7_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L3_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._I0_speed ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L7_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C2_DetectSpeedLimits._L13_CruiseControl ∈ {0x1.e000000000000p4} + [0]._C2_DetectSpeedLimits._L8_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L14_CruiseControl ∈ {0x1.2c00000000000p7} + [0]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed}} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._I2_Resume; ._I3_On; ._I4_Off} ∈ [--..--] + [0]._C3_CruiseStateMgt{._I5_SpeedOutOffLimits; ._O0_Regul_ON} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._O1_Regul_OFF; ._O2_Regul_STDBY; ._LE24_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE0_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE4_CruiseControl; ._LE40_CruiseControl; ._LE26_CruiseControl; ._LE28_CruiseControl; ._LE9_CruiseControl; ._LE10_CruiseControl; ._LE11_CruiseControl; ._LE33_CruiseControl; ._LE35_CruiseControl; ._LE38_CruiseControl; ._LE12_CruiseControl; ._LE13_CruiseControl; ._LE14_CruiseControl; ._LE17_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE18_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE3_CruiseControl; ._LE16_CruiseControl; ._LE41_CruiseControl; ._LE19_CruiseControl; ._LE20_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE21_CruiseControl; ._LE1_CruiseControl; ._LE5_CruiseControl; ._LE22_CruiseControl; ._LE23_CruiseControl; ._LE25_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE29_CruiseControl; ._LE2_CruiseControl; ._LE30_CruiseControl; ._LE31_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl; ._LE42_CruiseControl; ._LE6_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE27_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt._LE36_CruiseControl ∈ [--..--] + [0]._C3_CruiseStateMgt._LE37_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE44_CruiseControl; ._LE8_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl ∈ {0} + [0]._M_condact_0_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._I0_Regul_ON ∈ {0; 1} + [0]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._L21_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._L20_CruiseControl ∈ {1} + [0]._C4_ThrottleCmd._L22_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd.ONRisingEdge ∈ {0; 1} + [0]._C4_ThrottleCmd._L26_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd{._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._M_init_0_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._I0_Reset ∈ {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L6_CruiseControl ∈ + [0x1.039db20000000p3 .. 0x1.039db40000000p3] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.ProportionnalAction ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L22_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L16_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L23_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L18_CruiseControl; ._L10_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L8_CruiseControl ∈ + {0x1.0000000000000p-1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.IntegralAction ∈ + [-0x1.fffffe0000000p126 .. 0x1.fffffe0000000p126] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L18_CruiseControl ∈ + {0x1.6800000000000p5} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L12_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl ∈ + {0; 1} + {[0]._C4_ThrottleCmd._M_condact_2_CruiseControl; [1]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel}} ∈ + [--..--] + [1]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [1]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [1]._L95_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._L96_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [1]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + [--..--] + [1]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed._L4_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._L1_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed._L3_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._I0_speed ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [1]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [1]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [1]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl} ∈ + [--..--] +[value] Values at end of function ThrottleCmd: + __retres ∈ {1} + S__C_[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel} ∈ + [--..--] + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [0]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{.BrakePressed; .AcceleratorPressed} ∈ {0; 1} + [0]{._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [0]._L95_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{.SpeedOutOffLimits; ._L82_CruiseControl} ∈ {0; 1} + [0]{._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._L96_CruiseControl ∈ {0} + [0]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [0]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + {0; 1} + [0]._C1_DetectPedalsPressed._L2_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed._L8_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L4_CruiseControl ∈ {0; 1} + [0]._C1_DetectPedalsPressed._L1_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed._L7_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L3_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._I0_speed ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L7_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C2_DetectSpeedLimits._L13_CruiseControl ∈ {0x1.e000000000000p4} + [0]._C2_DetectSpeedLimits._L8_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L14_CruiseControl ∈ {0x1.2c00000000000p7} + [0]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed}} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._I2_Resume; ._I3_On; ._I4_Off} ∈ [--..--] + [0]._C3_CruiseStateMgt{._I5_SpeedOutOffLimits; ._O0_Regul_ON} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._O1_Regul_OFF; ._O2_Regul_STDBY; ._LE24_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE0_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE4_CruiseControl; ._LE40_CruiseControl; ._LE26_CruiseControl; ._LE28_CruiseControl; ._LE9_CruiseControl; ._LE10_CruiseControl; ._LE11_CruiseControl; ._LE33_CruiseControl; ._LE35_CruiseControl; ._LE38_CruiseControl; ._LE12_CruiseControl; ._LE13_CruiseControl; ._LE14_CruiseControl; ._LE17_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE18_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE3_CruiseControl; ._LE16_CruiseControl; ._LE41_CruiseControl; ._LE19_CruiseControl; ._LE20_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE21_CruiseControl; ._LE1_CruiseControl; ._LE5_CruiseControl; ._LE22_CruiseControl; ._LE23_CruiseControl; ._LE25_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE29_CruiseControl; ._LE2_CruiseControl; ._LE30_CruiseControl; ._LE31_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl; ._LE42_CruiseControl; ._LE6_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE27_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt._LE36_CruiseControl ∈ [--..--] + [0]._C3_CruiseStateMgt._LE37_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE44_CruiseControl; ._LE8_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl ∈ {0} + [0]._M_condact_0_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._I0_Regul_ON ∈ {0; 1} + [0]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._L21_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._L20_CruiseControl ∈ {0; 1} + [0]._C4_ThrottleCmd._L22_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd.ONRisingEdge ∈ {0; 1} + [0]._C4_ThrottleCmd._L26_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd{._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._M_init_0_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._I0_Reset ∈ [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + {[0]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl}; [1]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel}} ∈ + [--..--] + [1]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [1]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [1]._L95_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._L96_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [1]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + [--..--] + [1]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed._L4_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._L1_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed._L3_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._I0_speed ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [1]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [1]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [1]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl} ∈ + [--..--] +[value] Values at end of function CruiseControl: + __retres ∈ {1} + S__C_[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel} ∈ + [--..--] + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._O2_Regul_ON ∈ {0; 1} + [0]{._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [0]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{.BrakePressed; .AcceleratorPressed} ∈ {0; 1} + [0]{._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [0]._L95_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]{.SpeedOutOffLimits; ._L82_CruiseControl} ∈ {0; 1} + [0]{._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._L96_CruiseControl ∈ {0} + [0]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [0]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._M_init_CruiseControl ∈ {0} + [0]._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + {0; 1} + [0]._C1_DetectPedalsPressed._L2_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed._L8_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L4_CruiseControl ∈ {0; 1} + [0]._C1_DetectPedalsPressed._L1_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C1_DetectPedalsPressed._L7_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L3_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._I0_speed ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L7_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C2_DetectSpeedLimits._L13_CruiseControl ∈ {0x1.e000000000000p4} + [0]._C2_DetectSpeedLimits._L8_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L14_CruiseControl ∈ {0x1.2c00000000000p7} + [0]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed}} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._I2_Resume; ._I3_On; ._I4_Off} ∈ [--..--] + [0]._C3_CruiseStateMgt{._I5_SpeedOutOffLimits; ._O0_Regul_ON} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._O1_Regul_OFF; ._O2_Regul_STDBY; ._LE24_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE0_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE4_CruiseControl; ._LE40_CruiseControl; ._LE26_CruiseControl; ._LE28_CruiseControl; ._LE9_CruiseControl; ._LE10_CruiseControl; ._LE11_CruiseControl; ._LE33_CruiseControl; ._LE35_CruiseControl; ._LE38_CruiseControl; ._LE12_CruiseControl; ._LE13_CruiseControl; ._LE14_CruiseControl; ._LE17_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE18_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE3_CruiseControl; ._LE16_CruiseControl; ._LE41_CruiseControl; ._LE19_CruiseControl; ._LE20_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE21_CruiseControl; ._LE1_CruiseControl; ._LE5_CruiseControl; ._LE22_CruiseControl; ._LE23_CruiseControl; ._LE25_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE29_CruiseControl; ._LE2_CruiseControl; ._LE30_CruiseControl; ._LE31_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl; ._LE42_CruiseControl; ._LE6_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE27_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt._LE36_CruiseControl ∈ [--..--] + [0]._C3_CruiseStateMgt._LE37_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE44_CruiseControl; ._LE8_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl ∈ {0} + [0]._M_condact_0_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._I0_Regul_ON ∈ {0; 1} + [0]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._L21_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._L20_CruiseControl ∈ {0; 1} + [0]._C4_ThrottleCmd._L22_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd.ONRisingEdge ∈ {0; 1} + [0]._C4_ThrottleCmd._L26_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd{._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._M_init_0_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._I0_Reset ∈ [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + {[0]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl}; [1]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel}} ∈ + [--..--] + [1]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [1]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [1]._L95_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._L96_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [1]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + [--..--] + [1]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed._L4_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._L1_CruiseControl; ._L7_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C1_DetectPedalsPressed._L3_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._I0_speed ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [1]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [1]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [1]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-0x1.fffffe0000000p127 .. 0x1.fffffe0000000p127] + [1]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl} ∈ + [--..--] +[from] Computing for function CruiseSpeedMgt +[from] Done for function CruiseSpeedMgt +[from] Computing for function CruiseStateMgt +[from] Done for function CruiseStateMgt +[from] Computing for function DetectPedalsPressed +[from] Done for function DetectPedalsPressed +[from] Computing for function DetectSpeedLimits +[from] Done for function DetectSpeedLimits +[from] Computing for function SaturateThrottle +[from] Done for function SaturateThrottle +[from] Computing for function ThrottleRegulation +[from] Done for function ThrottleRegulation +[from] Computing for function ThrottleCmd +[from] Done for function ThrottleCmd +[from] Computing for function CruiseControl +[from] Done for function CruiseControl +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function CruiseSpeedMgt: + S__C_{[0]._C0_CruiseSpeedMgt._O0_CruiseSpeed; + [0]._C0_CruiseSpeedMgt._L7_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; _C_; + S__C_{[0]._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel; ._I4_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C0_CruiseSpeedMgt._L1_CruiseControl + FROM _C_; S__C_[0]._C0_CruiseSpeedMgt._I4_Speed + [0]._C0_CruiseSpeedMgt._L2_CruiseControl + FROM _C_; S__C_[0]._C0_CruiseSpeedMgt._I1_Set + [0]._C0_CruiseSpeedMgt._L3_CruiseControl + FROM _C_; S__C_[0]._C0_CruiseSpeedMgt._I0_On + [0]._C0_CruiseSpeedMgt._L6_CruiseControl + FROM _C_; S__C_[0]._C0_CruiseSpeedMgt{._I0_On; ._I1_Set} + [0]._C0_CruiseSpeedMgt._L21_CruiseControl FROM ZeroSpeed; _C_ + [0]._C0_CruiseSpeedMgt._L10_CruiseControl + FROM ZeroSpeed; _C_; + S__C_[0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl} + {[0]._C0_CruiseSpeedMgt._L12_CruiseControl; + [0]._C0_CruiseSpeedMgt._L11_CruiseControl} + FROM SpeedInc; _C_ + {[0]._C0_CruiseSpeedMgt._L13_CruiseControl; + [0]._C0_CruiseSpeedMgt._L14_CruiseControl} + FROM ZeroSpeed; SpeedInc; _C_; + S__C_[0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl} + [0]._C0_CruiseSpeedMgt._L15_CruiseControl FROM SpeedMax; _C_ + [0]._C0_CruiseSpeedMgt._L16_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; _C_; + S__C_[0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl} + [0]._C0_CruiseSpeedMgt._L4_CruiseControl + FROM _C_; S__C_[0]._C0_CruiseSpeedMgt._I2_QuickAccel + [0]._C0_CruiseSpeedMgt._L17_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; _C_; + S__C_{[0]._C0_CruiseSpeedMgt._I2_QuickAccel; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C0_CruiseSpeedMgt._L19_CruiseControl FROM SpeedMin; _C_ + [0]._C0_CruiseSpeedMgt._L18_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMin; _C_; + S__C_[0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl} + [0]._C0_CruiseSpeedMgt._L5_CruiseControl + FROM _C_; S__C_[0]._C0_CruiseSpeedMgt._I3_QuickDecel + [0]._C0_CruiseSpeedMgt._L20_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMin; _C_; + S__C_{[0]._C0_CruiseSpeedMgt._I3_QuickDecel; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C0_CruiseSpeedMgt._L9_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMin; _C_; + S__C_{[0]._C0_CruiseSpeedMgt._I3_QuickDecel; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C0_CruiseSpeedMgt._L8_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; _C_; + S__C_{[0]._C0_CruiseSpeedMgt{._I2_QuickAccel; ._I3_QuickDecel}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl FROM _C_ + \result FROM \nothing +[from] Function CruiseStateMgt: + S__C_{[0]._C3_CruiseStateMgt._O0_Regul_ON; + [0]._C3_CruiseStateMgt._O2_Regul_STDBY; + [0]._C3_CruiseStateMgt{._LE42_CruiseControl; ._LE6_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE44_CruiseControl; ._LE8_CruiseControl}} + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed; ._I2_Resume; ._I3_On; ._I4_Off; ._I5_SpeedOutOffLimits}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C3_CruiseStateMgt._O1_Regul_OFF; + [0]._C3_CruiseStateMgt{._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl}} + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._I0_BrakePressed; + [0]._C3_CruiseStateMgt{._I2_Resume; ._I3_On; ._I4_Off}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE24_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE23_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE0_CruiseControl + FROM _C_; S__C_[0]._C3_CruiseStateMgt._I0_BrakePressed + [0]._C3_CruiseStateMgt._LE4_CruiseControl + FROM _C_; S__C_[0]._C3_CruiseStateMgt._I4_Off + [0]._C3_CruiseStateMgt._LE40_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE26_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE25_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE28_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE9_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE25_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE10_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE11_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE33_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE32_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE35_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE34_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE38_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE12_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE34_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE13_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE14_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C3_CruiseStateMgt._LE17_CruiseControl; + [0]._C3_CruiseStateMgt._LE29_CruiseControl; + [0]._C3_CruiseStateMgt._LE30_CruiseControl} + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._I4_Off; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE18_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._I0_BrakePressed; + [0]._C3_CruiseStateMgt._I4_Off; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE3_CruiseControl + FROM _C_; S__C_[0]._C3_CruiseStateMgt._I3_On + [0]._C3_CruiseStateMgt._LE16_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE15_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE41_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE19_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._I3_On; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE20_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._I3_On; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt._LE15_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE21_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._I0_BrakePressed; + [0]._C3_CruiseStateMgt{._I3_On; ._I4_Off}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE1_CruiseControl + FROM _C_; S__C_[0]._C3_CruiseStateMgt._I1_AcceleratorPressed + [0]._C3_CruiseStateMgt._LE5_CruiseControl + FROM _C_; S__C_[0]._C3_CruiseStateMgt._I5_SpeedOutOffLimits + [0]._C3_CruiseStateMgt._LE22_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._I1_AcceleratorPressed; + [0]._C3_CruiseStateMgt._I5_SpeedOutOffLimits} + {[0]._C3_CruiseStateMgt._LE23_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl} + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed}; + [0]._C3_CruiseStateMgt{._I3_On; ._I4_Off; ._I5_SpeedOutOffLimits}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C3_CruiseStateMgt._LE25_CruiseControl; + [0]._C3_CruiseStateMgt._LE34_CruiseControl} + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed}; + [0]._C3_CruiseStateMgt{._I4_Off; ._I5_SpeedOutOffLimits}; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE2_CruiseControl + FROM _C_; S__C_[0]._C3_CruiseStateMgt._I2_Resume + [0]._C3_CruiseStateMgt._LE31_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._I2_Resume; + [0]._C3_CruiseStateMgt._I4_Off; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C3_CruiseStateMgt._LE32_CruiseControl; + [0]._C3_CruiseStateMgt{._LE36_CruiseControl; ._LE37_CruiseControl}} + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed; ._I2_Resume}; + [0]._C3_CruiseStateMgt{._I4_Off; ._I5_SpeedOutOffLimits}; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE15_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._I3_On; ._I4_Off}; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl FROM _C_ + \result FROM \nothing +[from] Function DetectPedalsPressed: + S__C_{[0]._C1_DetectPedalsPressed._O0_BrakePressed; + [0]._C1_DetectPedalsPressed._L4_CruiseControl} + FROM ZeroPercent; _C_; S__C_[0]._C1_DetectPedalsPressed._I0_Brake + {[0]._C1_DetectPedalsPressed._O1_AcceleratorPressed; + [0]._C1_DetectPedalsPressed._L3_CruiseControl} + FROM ZeroPercent; _C_; + S__C_[0]._C1_DetectPedalsPressed._I1_Accelerator + [0]._C1_DetectPedalsPressed._L2_CruiseControl + FROM _C_; S__C_[0]._C1_DetectPedalsPressed._I0_Brake + {[0]._C1_DetectPedalsPressed._L8_CruiseControl; + [0]._C1_DetectPedalsPressed._L7_CruiseControl} + FROM ZeroPercent; _C_ + [0]._C1_DetectPedalsPressed._L1_CruiseControl + FROM _C_; S__C_[0]._C1_DetectPedalsPressed._I1_Accelerator + \result FROM \nothing +[from] Function DetectSpeedLimits: + S__C_{[0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits; + [0]._C2_DetectSpeedLimits._L17_CruiseControl} + FROM SpeedMax; SpeedMin; _C_; S__C_[0]._C2_DetectSpeedLimits._I0_speed + [0]._C2_DetectSpeedLimits._L7_CruiseControl + FROM _C_; S__C_[0]._C2_DetectSpeedLimits._I0_speed + [0]._C2_DetectSpeedLimits._L13_CruiseControl FROM SpeedMin; _C_ + [0]._C2_DetectSpeedLimits._L8_CruiseControl + FROM SpeedMin; _C_; S__C_[0]._C2_DetectSpeedLimits._I0_speed + [0]._C2_DetectSpeedLimits._L14_CruiseControl FROM SpeedMax; _C_ + [0]._C2_DetectSpeedLimits._L9_CruiseControl + FROM SpeedMax; _C_; S__C_[0]._C2_DetectSpeedLimits._I0_speed + \result FROM \nothing +[from] Function SaturateThrottle: + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O0_ThrottleOut; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L8_CruiseControl} + FROM ZeroPercent; RegThrottleMax; _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl} + FROM ZeroPercent; RegThrottleMax; _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L18_CruiseControl + FROM RegThrottleMax; _C_ + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L12_CruiseControl + FROM _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl + FROM RegThrottleMax; _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl + FROM ZeroPercent; _C_ + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl + FROM ZeroPercent; _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L6_CruiseControl + FROM ZeroPercent; _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn + \result FROM \nothing +[from] Function ThrottleRegulation: + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation._O0_Throttle; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L13_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O0_ThrottleOut; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L8_CruiseControl} + FROM ZeroSpeed; ZeroPercent; Kp; Ki; RegThrottleMax; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L1_CruiseControl + FROM _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._I1_CruiseSpeed + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L2_CruiseControl + FROM _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._I2_VehiculeSpeed + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L3_CruiseControl + FROM _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L6_CruiseControl + FROM Kp; _C_ + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.ProportionnalAction + FROM Kp; _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed} + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L22_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L23_CruiseControl} + FROM ZeroSpeed; _C_ + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction + FROM _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L16_CruiseControl + FROM ZeroSpeed; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L18_CruiseControl + FROM ZeroSpeed; _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L10_CruiseControl + FROM ZeroSpeed; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L8_CruiseControl + FROM Ki; _C_ + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.IntegralAction + FROM ZeroSpeed; Ki; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L4_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L12_CruiseControl} + FROM ZeroSpeed; Kp; Ki; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl} + FROM ZeroSpeed; ZeroPercent; Kp; Ki; RegThrottleMax; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L19_CruiseControl + FROM _C_; S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._I0_Reset + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl + FROM ZeroSpeed; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I0_Reset; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl + FROM _C_ + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L18_CruiseControl + FROM RegThrottleMax; _C_ + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl + FROM ZeroSpeed; Kp; Ki; RegThrottleMax; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl + FROM ZeroPercent; _C_ + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl + FROM ZeroSpeed; ZeroPercent; Kp; Ki; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L6_CruiseControl + FROM ZeroSpeed; ZeroPercent; Kp; Ki; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + \result FROM \nothing +[from] Function ThrottleCmd: + S__C_{[0]._C4_ThrottleCmd._O0_Throttle; + [0]._C4_ThrottleCmd._L24_CruiseControl} + FROM ZeroSpeed; ZeroPercent; Kp; Ki; RegThrottleMax; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator}; + [0]._C4_ThrottleCmd._L19_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + {[0]._C4_ThrottleCmd._L21_CruiseControl; + [0]._C4_ThrottleCmd._L22_CruiseControl} + FROM _C_; + S__C_{[0]._C4_ThrottleCmd._L20_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl} + [0]._C4_ThrottleCmd._L20_CruiseControl + FROM _C_; S__C_[0]._C4_ThrottleCmd._I0_Regul_ON + [0]._C4_ThrottleCmd.ONRisingEdge + FROM _C_; + S__C_{[0]._C4_ThrottleCmd._I0_Regul_ON; + [0]._C4_ThrottleCmd._L20_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl} + [0]._C4_ThrottleCmd._L26_CruiseControl FROM ZeroPercent; _C_ + [0]._C4_ThrottleCmd._L1_CruiseControl + FROM _C_; S__C_[0]._C4_ThrottleCmd._I1_CruiseSpeed + [0]._C4_ThrottleCmd._L2_CruiseControl + FROM _C_; S__C_[0]._C4_ThrottleCmd._I2_VehiculeSpeed + [0]._C4_ThrottleCmd._L19_CruiseControl + FROM ZeroSpeed; ZeroPercent; Kp; Ki; RegThrottleMax; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._L25_CruiseControl + FROM _C_; + S__C_{[0]._C4_ThrottleCmd._I0_Regul_ON; + [0]._C4_ThrottleCmd._I3_Accelerator} + [0]._C4_ThrottleCmd._M_init_0_CruiseControl + FROM _C_; S__C_[0]._C4_ThrottleCmd._I0_Regul_ON + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._I0_Reset; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L19_CruiseControl} + FROM _C_; + S__C_{[0]._C4_ThrottleCmd._I0_Regul_ON; + [0]._C4_ThrottleCmd._L20_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._I1_CruiseSpeed; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L1_CruiseControl} + FROM _C_; + S__C_[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._I2_VehiculeSpeed; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L2_CruiseControl} + FROM _C_; + S__C_{[0]._C4_ThrottleCmd._I0_Regul_ON; + [0]._C4_ThrottleCmd._I2_VehiculeSpeed} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._O0_Throttle; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L13_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O0_ThrottleOut; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L8_CruiseControl} + FROM ZeroSpeed; ZeroPercent; Kp; Ki; RegThrottleMax; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L3_CruiseControl + FROM _C_; + S__C_[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L6_CruiseControl + FROM Kp; _C_; S__C_[0]._C4_ThrottleCmd._I0_Regul_ON (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.ProportionnalAction + FROM Kp; _C_; + S__C_[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L22_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L23_CruiseControl} + FROM ZeroSpeed; _C_; S__C_[0]._C4_ThrottleCmd._I0_Regul_ON (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction + FROM _C_; + S__C_{[0]._C4_ThrottleCmd._I0_Regul_ON; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L16_CruiseControl + FROM ZeroSpeed; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L18_CruiseControl + FROM ZeroSpeed; _C_; + S__C_{[0]._C4_ThrottleCmd._I0_Regul_ON; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L10_CruiseControl + FROM ZeroSpeed; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L8_CruiseControl + FROM Ki; _C_; S__C_[0]._C4_ThrottleCmd._I0_Regul_ON (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.IntegralAction + FROM ZeroSpeed; Ki; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L4_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L12_CruiseControl} + FROM ZeroSpeed; Kp; Ki; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl} + FROM ZeroSpeed; ZeroPercent; Kp; Ki; RegThrottleMax; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl + FROM ZeroSpeed; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._L20_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._M_condact_2_CruiseControl} + FROM _C_; S__C_[0]._C4_ThrottleCmd._I0_Regul_ON (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L18_CruiseControl + FROM RegThrottleMax; _C_; + S__C_[0]._C4_ThrottleCmd._I0_Regul_ON (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl + FROM ZeroSpeed; Kp; Ki; RegThrottleMax; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl + FROM ZeroPercent; _C_; + S__C_[0]._C4_ThrottleCmd._I0_Regul_ON (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl + FROM ZeroSpeed; ZeroPercent; Kp; Ki; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L6_CruiseControl + FROM ZeroSpeed; ZeroPercent; Kp; Ki; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + \result FROM _C_; S__C_[0]._C4_ThrottleCmd._I0_Regul_ON +[from] Function CruiseControl: + S__C_{[0]._O0_Cruise_speed; [0]._C4_ThrottleCmd._I1_CruiseSpeed; + [0]._C4_ThrottleCmd._L1_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._O1_Throttle_cmd; [0]._L22_CruiseControl; + [0]._C4_ThrottleCmd._O0_Throttle; + [0]._C4_ThrottleCmd._L24_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + Ki; RegThrottleMax; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._L19_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + {[0]._O2_Regul_ON; [0]._O4_Regul_STDBY; + [0]._C4_ThrottleCmd._I0_Regul_ON; + [0]._C4_ThrottleCmd._L20_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._O3_Regul_OFF + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._L73_CruiseControl; [0]._L60_CruiseControl; + [0]._C3_CruiseStateMgt._I3_On; + [0]._C3_CruiseStateMgt._LE3_CruiseControl} + FROM _C_; S__C_[0]._I0_On + {[0]._L59_CruiseControl; [0]._C1_DetectPedalsPressed._I0_Brake; + [0]._C1_DetectPedalsPressed._L2_CruiseControl} + FROM _C_; S__C_[0]._I7_Brake + {[0]._L62_CruiseControl; [0]._C1_DetectPedalsPressed._I1_Accelerator; + [0]._C1_DetectPedalsPressed._L1_CruiseControl} + FROM _C_; S__C_[0]._I6_Accel + {[0].BrakePressed; [0]._C1_DetectPedalsPressed._O0_BrakePressed; + [0]._C1_DetectPedalsPressed._L4_CruiseControl; + [0]._C3_CruiseStateMgt._I0_BrakePressed; + [0]._C3_CruiseStateMgt._LE0_CruiseControl} + FROM ZeroPercent; _C_; S__C_[0]._I7_Brake + {[0].AcceleratorPressed; + [0]._C1_DetectPedalsPressed._O1_AcceleratorPressed; + [0]._C1_DetectPedalsPressed._L3_CruiseControl; + [0]._C3_CruiseStateMgt._I1_AcceleratorPressed; + [0]._C3_CruiseStateMgt._LE1_CruiseControl} + FROM ZeroPercent; _C_; S__C_[0]._I6_Accel + {[0]._L61_CruiseControl; [0]._C3_CruiseStateMgt._I2_Resume; + [0]._C3_CruiseStateMgt._LE2_CruiseControl} + FROM _C_; S__C_[0]._I2_Resume + {[0]._L58_CruiseControl; [0]._C3_CruiseStateMgt._I4_Off; + [0]._C3_CruiseStateMgt._LE4_CruiseControl} + FROM _C_; S__C_[0]._I1_Off + {[0]._L95_CruiseControl; [0]._L23_CruiseControl; + [0]._C2_DetectSpeedLimits._I0_speed; + [0]._C2_DetectSpeedLimits._L7_CruiseControl} + FROM _C_; S__C_[0]._I8_Speed + {[0].SpeedOutOffLimits; + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits; + [0]._C2_DetectSpeedLimits._L17_CruiseControl; + [0]._C3_CruiseStateMgt._I5_SpeedOutOffLimits; + [0]._C3_CruiseStateMgt._LE5_CruiseControl} + FROM SpeedMax; SpeedMin; _C_; S__C_[0]._I8_Speed + {[0]._L82_CruiseControl; + [0]{._L84_CruiseControl; ._L19_CruiseControl}; + [0]._C3_CruiseStateMgt._O0_Regul_ON; + [0]._C3_CruiseStateMgt._O2_Regul_STDBY; + [0]._C3_CruiseStateMgt{._LE42_CruiseControl; ._LE6_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE44_CruiseControl; ._LE8_CruiseControl}} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._L83_CruiseControl; [0]._C3_CruiseStateMgt._O1_Regul_OFF; + [0]._C3_CruiseStateMgt{._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl}} + FROM ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; [0]._I7_Brake; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._L96_CruiseControl FROM ZeroSpeed; _C_ + [0]._L38_CruiseControl FROM _C_; S__C_[0]._I3_Set + [0]._L39_CruiseControl FROM _C_; S__C_[0]._I4_QuickAccel + [0]._L40_CruiseControl FROM _C_; S__C_[0]._I5_QuickDecel + [0].CruiseSpeed + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._L26_CruiseControl; [0]._C4_ThrottleCmd._I3_Accelerator; + [0]._C4_ThrottleCmd._L25_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._M_init_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C0_CruiseSpeedMgt._I0_On; + [0]._C0_CruiseSpeedMgt._L3_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._I1_Set; + [0]._C0_CruiseSpeedMgt._L2_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._I2_QuickAccel; + [0]._C0_CruiseSpeedMgt._L4_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; [0]._I4_QuickAccel; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._I3_QuickDecel; + [0]._C0_CruiseSpeedMgt._L5_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._I4_Speed; + [0]._C0_CruiseSpeedMgt._L1_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._I2_VehiculeSpeed; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L2_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._O0_CruiseSpeed; + [0]._C0_CruiseSpeedMgt._L7_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L6_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._L21_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L22_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L23_CruiseControl} + FROM ZeroSpeed; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L10_CruiseControl + FROM ZeroSpeed; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._L12_CruiseControl; + [0]._C0_CruiseSpeedMgt._L11_CruiseControl} + FROM SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._L13_CruiseControl; + [0]._C0_CruiseSpeedMgt._L14_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L15_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L16_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L17_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; [0]._I4_QuickAccel; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L19_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L18_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L20_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L9_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L8_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl; + [0]._M_condact_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._M_condact_2_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C1_DetectPedalsPressed._L8_CruiseControl; + [0]._C1_DetectPedalsPressed._L7_CruiseControl} + FROM ZeroPercent; _C_ + [0]._C2_DetectSpeedLimits._L13_CruiseControl FROM SpeedMin; _C_ + [0]._C2_DetectSpeedLimits._L8_CruiseControl + FROM SpeedMin; _C_; S__C_[0]._I8_Speed + [0]._C2_DetectSpeedLimits._L14_CruiseControl FROM SpeedMax; _C_ + [0]._C2_DetectSpeedLimits._L9_CruiseControl + FROM SpeedMax; _C_; S__C_[0]._I8_Speed + [0]._C3_CruiseStateMgt._LE24_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE23_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE40_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE26_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE25_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE28_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE9_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE25_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE10_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE11_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE33_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE32_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE35_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE34_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE38_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE12_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE34_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE13_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE14_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C3_CruiseStateMgt._LE17_CruiseControl; + [0]._C3_CruiseStateMgt._LE29_CruiseControl; + [0]._C3_CruiseStateMgt._LE30_CruiseControl} + FROM _C_; + S__C_{[0]._I1_Off; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE18_CruiseControl + FROM ZeroPercent; _C_; + S__C_{[0]._I1_Off; [0]._I7_Brake; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE16_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE15_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE41_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE19_CruiseControl + FROM _C_; + S__C_{[0]._I0_On; [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE20_CruiseControl + FROM _C_; + S__C_{[0]._I0_On; [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt._LE15_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE21_CruiseControl + FROM ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off}; [0]._I7_Brake; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE22_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]._I6_Accel; [0]._I8_Speed} + {[0]._C3_CruiseStateMgt._LE23_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C3_CruiseStateMgt._LE25_CruiseControl; + [0]._C3_CruiseStateMgt._LE34_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]._I1_Off; [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE31_CruiseControl + FROM _C_; + S__C_{[0]{._I1_Off; ._I2_Resume}; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C3_CruiseStateMgt._LE32_CruiseControl; + [0]._C3_CruiseStateMgt{._LE36_CruiseControl; ._LE37_CruiseControl}} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE15_CruiseControl + FROM _C_; + S__C_{[0]{._I0_On; ._I1_Off}; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl FROM _C_ + {[0]._C4_ThrottleCmd._I2_VehiculeSpeed; + [0]._C4_ThrottleCmd._L2_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C4_ThrottleCmd._L21_CruiseControl; + [0]._C4_ThrottleCmd._L22_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._L20_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl} + [0]._C4_ThrottleCmd.ONRisingEdge + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._L20_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl} + [0]._C4_ThrottleCmd._L26_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C4_ThrottleCmd._L19_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + Ki; RegThrottleMax; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._I0_Reset; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L19_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._L20_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._I1_CruiseSpeed; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L1_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L3_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._O0_Throttle; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L13_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O0_ThrottleOut; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L8_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + Ki; RegThrottleMax; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L6_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; Kp; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.ProportionnalAction + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L16_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L18_CruiseControl + FROM ZeroSpeed; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L10_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L8_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; Ki; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.IntegralAction + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Ki; + _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L4_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L12_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + Ki; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + Ki; RegThrottleMax; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._L20_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L18_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; RegThrottleMax; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + Ki; RegThrottleMax; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + Ki; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L6_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + Ki; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + \result FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function CruiseSpeedMgt: + __retres; + S__C_[0]._C0_CruiseSpeedMgt{._O0_CruiseSpeed; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; ._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl; ._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl; ._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl; ._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl; ._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl; ._M_init_0_CruiseControl} +[inout] Inputs for function CruiseSpeedMgt: + ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; + S__C_{[0]._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel; ._I4_Speed}; + [0]._C0_CruiseSpeedMgt{._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; ._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl; ._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl; ._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl; ._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl; ._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl; ._M_init_0_CruiseControl}} +[inout] Out (internal) for function CruiseStateMgt: + __retres; + S__C_[0]._C3_CruiseStateMgt{._O0_Regul_ON; ._O1_Regul_OFF; ._O2_Regul_STDBY; ._LE24_CruiseControl; ._LE0_CruiseControl; ._LE4_CruiseControl; ._LE40_CruiseControl; ._LE26_CruiseControl; ._LE28_CruiseControl; ._LE9_CruiseControl; ._LE10_CruiseControl; ._LE11_CruiseControl; ._LE33_CruiseControl; ._LE35_CruiseControl; ._LE38_CruiseControl; ._LE12_CruiseControl; ._LE13_CruiseControl; ._LE14_CruiseControl; ._LE17_CruiseControl; ._LE18_CruiseControl; ._LE3_CruiseControl; ._LE16_CruiseControl; ._LE41_CruiseControl; ._LE19_CruiseControl; ._LE20_CruiseControl; ._LE21_CruiseControl; ._LE1_CruiseControl; ._LE5_CruiseControl; ._LE22_CruiseControl; ._LE23_CruiseControl; ._LE25_CruiseControl; ._LE29_CruiseControl; ._LE2_CruiseControl; ._LE30_CruiseControl; ._LE31_CruiseControl; ._LE32_CruiseControl; ._LE34_CruiseControl; ._LE42_CruiseControl; ._LE6_CruiseControl; ._LE15_CruiseControl; ._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl; ._LE27_CruiseControl; ._LE36_CruiseControl; ._LE37_CruiseControl; ._LE44_CruiseControl; ._LE8_CruiseControl; ._M_init_0_CruiseControl} +[inout] Inputs for function CruiseStateMgt: + S__C_{[0]._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed; ._I2_Resume; ._I3_On; ._I4_Off; ._I5_SpeedOutOffLimits}; + [0]._C3_CruiseStateMgt{._LE24_CruiseControl; ._LE0_CruiseControl; ._LE4_CruiseControl; ._LE40_CruiseControl; ._LE26_CruiseControl; ._LE28_CruiseControl; ._LE9_CruiseControl; ._LE10_CruiseControl; ._LE11_CruiseControl; ._LE33_CruiseControl; ._LE35_CruiseControl; ._LE38_CruiseControl; ._LE12_CruiseControl; ._LE13_CruiseControl; ._LE14_CruiseControl; ._LE17_CruiseControl; ._LE18_CruiseControl; ._LE3_CruiseControl; ._LE16_CruiseControl; ._LE41_CruiseControl; ._LE19_CruiseControl; ._LE20_CruiseControl; ._LE21_CruiseControl; ._LE1_CruiseControl; ._LE5_CruiseControl; ._LE22_CruiseControl; ._LE23_CruiseControl; ._LE25_CruiseControl; ._LE29_CruiseControl; ._LE2_CruiseControl; ._LE30_CruiseControl; ._LE31_CruiseControl; ._LE32_CruiseControl; ._LE34_CruiseControl; ._LE42_CruiseControl; ._LE6_CruiseControl; ._LE15_CruiseControl; ._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl; ._LE27_CruiseControl; ._LE36_CruiseControl; ._LE37_CruiseControl; ._LE44_CruiseControl; ._LE8_CruiseControl; ._M_init_0_CruiseControl}} +[inout] Out (internal) for function DetectPedalsPressed: + __retres; + S__C_[0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed; ._L2_CruiseControl; ._L8_CruiseControl; ._L4_CruiseControl; ._L1_CruiseControl; ._L7_CruiseControl; ._L3_CruiseControl} +[inout] Inputs for function DetectPedalsPressed: + ZeroPercent; + S__C_{[0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator}; + [0]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl; ._L4_CruiseControl; ._L1_CruiseControl; ._L7_CruiseControl; ._L3_CruiseControl}} +[inout] Out (internal) for function DetectSpeedLimits: + __retres; + S__C_[0]._C2_DetectSpeedLimits{._O0_SpeedOutOffLimits; ._L7_CruiseControl; ._L13_CruiseControl; ._L8_CruiseControl; ._L14_CruiseControl; ._L9_CruiseControl; ._L17_CruiseControl} +[inout] Inputs for function DetectSpeedLimits: + SpeedMax; SpeedMin; + S__C_{[0]._C2_DetectSpeedLimits._I0_speed; + [0]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl; ._L8_CruiseControl; ._L14_CruiseControl; ._L9_CruiseControl; ._L17_CruiseControl}} +[inout] Out (internal) for function SaturateThrottle: + __retres; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._O0_ThrottleOut; ._O1_Saturate; ._L18_CruiseControl; ._L12_CruiseControl; ._L7_CruiseControl; ._L17_CruiseControl; ._L9_CruiseControl; ._L6_CruiseControl; ._L8_CruiseControl; ._L13_CruiseControl} +[inout] Inputs for function SaturateThrottle: + ZeroPercent; RegThrottleMax; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl; ._L7_CruiseControl; ._L17_CruiseControl; ._L9_CruiseControl; ._L6_CruiseControl; ._L8_CruiseControl; ._L13_CruiseControl}} +[inout] Out (internal) for function ThrottleRegulation: + tmp; __retres; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl; .HoldIntegralAction; ._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl; ._L21_CruiseControl; ._M_init_0_CruiseControl; ._C0_SaturateThrottle} +[inout] Inputs for function ThrottleRegulation: + ZeroSpeed; ZeroPercent; Kp; Ki; RegThrottleMax; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I0_Reset; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl; .HoldIntegralAction; ._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl; ._L21_CruiseControl; ._M_init_0_CruiseControl; ._C0_SaturateThrottle}} +[inout] Out (internal) for function ThrottleCmd: + tmp; __retres; + S__C_[0]._C4_ThrottleCmd{._O0_Throttle; ._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge; ._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl; ._M_init_0_CruiseControl; ._C0_ThrottleRegulation; ._M_condact_2_CruiseControl} +[inout] Inputs for function ThrottleCmd: + ZeroSpeed; ZeroPercent; Kp; Ki; RegThrottleMax; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator}; + [0]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge; ._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl; ._M_init_0_CruiseControl; ._C0_ThrottleRegulation}} +[inout] Out (internal) for function CruiseControl: + tmp; tmp_0; tmp_1; tmp_2; tmp_3; __retres; + S__C_[0]{._O0_Cruise_speed; ._O1_Throttle_cmd; ._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl; ._L59_CruiseControl; ._L62_CruiseControl; .BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl; ._L95_CruiseControl; .SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl; ._L96_CruiseControl; ._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl; ._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl; ._M_init_CruiseControl; ._C0_CruiseSpeedMgt; ._C1_DetectPedalsPressed; ._C2_DetectSpeedLimits; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd} +[inout] Inputs for function CruiseControl: + ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; Ki; + RegThrottleMax; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]{._L73_CruiseControl; ._L59_CruiseControl; ._L62_CruiseControl; .BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl; ._L95_CruiseControl; .SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl; ._L96_CruiseControl; ._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl; ._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl; ._M_init_CruiseControl; ._C0_CruiseSpeedMgt; ._C1_DetectPedalsPressed; ._C2_DetectSpeedLimits; ._C3_CruiseStateMgt}; + [0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle; ._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge; ._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl; ._M_init_0_CruiseControl; ._C0_ThrottleRegulation}} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/CruiseControl.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/CruiseControl.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/CruiseControl.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/CruiseControl.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,3355 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/CruiseControl.c (with preprocessing) +tests/misc/CruiseControl.c:577:[kernel] warning: Floating-point constant 8.113 is not represented exactly. Will use 0x1.039db22d0e560p3. See documentation for option -warn-decimal-float +[kernel] Parsing tests/misc/CruiseControl_const.c (with preprocessing) +[value] Analyzing an incomplete application starting at CruiseControl +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + ZeroSpeed ∈ {0} + SpeedInc ∈ {2.0000000000000000} + SpeedMax ∈ {150.0000000000000000} + SpeedMin ∈ {30.0000000000000000} + ZeroPercent ∈ {0} + Kp ∈ {8.1129999160766601} + Ki ∈ {1.0000000000000000*2^-1} + RegThrottleMax ∈ {45.0000000000000000} +[value] computing for function DetectPedalsPressed <- CruiseControl. + Called from tests/misc/CruiseControl.c:462. +[value] Recording results for DetectPedalsPressed +[value] Done for function DetectPedalsPressed +[value] computing for function DetectSpeedLimits <- CruiseControl. + Called from tests/misc/CruiseControl.c:473. +[value] Recording results for DetectSpeedLimits +[value] Done for function DetectSpeedLimits +[value] computing for function CruiseStateMgt <- CruiseControl. + Called from tests/misc/CruiseControl.c:486. +[value] Recording results for CruiseStateMgt +[value] Done for function CruiseStateMgt +[value] computing for function CruiseSpeedMgt <- CruiseControl. + Called from tests/misc/CruiseControl.c:508. +[value] Recording results for CruiseSpeedMgt +[value] Done for function CruiseSpeedMgt +[value] computing for function ThrottleCmd <- CruiseControl. + Called from tests/misc/CruiseControl.c:525. +[value] computing for function ThrottleRegulation <- ThrottleCmd <- CruiseControl. + Called from tests/misc/CruiseControl.c:242. +tests/misc/CruiseControl.c:172:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(_C_->_L1_CruiseControl-_C_->_L2_CruiseControl)); +tests/misc/CruiseControl.c:175:[kernel] warning: non-finite float value + ([-1.0141249290630227*2^131 .. 1.0141249290630227*2^131]): + assert \is_finite((float)(_C_->_L3_CruiseControl*_C_->_L6_CruiseControl)); +tests/misc/CruiseControl.c:194:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(_C_->_L16_CruiseControl+_C_->_L18_CruiseControl)); +tests/misc/CruiseControl.c:199:[kernel] warning: non-finite float value + ([-1.4999999105930328*2^128 .. 1.4999999105930328*2^128]): + assert \is_finite((float)(_C_->ProportionnalAction+_C_->IntegralAction)); +[value] computing for function SaturateThrottle <- ThrottleRegulation <- + ThrottleCmd <- CruiseControl. + Called from tests/misc/CruiseControl.c:202. +tests/misc/CruiseControl.c:162:[value] Assertion got status unknown. +[value] Recording results for SaturateThrottle +[value] Done for function SaturateThrottle +[value] Recording results for ThrottleRegulation +[value] Done for function ThrottleRegulation +[value] Recording results for ThrottleCmd +[value] Done for function ThrottleCmd +[value] Recording results for CruiseControl +[value] done for function CruiseControl +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function CruiseSpeedMgt: + __retres ∈ {1} + S__C_[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel} ∈ + [--..--] + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [0]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{.BrakePressed; .AcceleratorPressed} ∈ {0; 1} + [0]{._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [0]._L95_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{.SpeedOutOffLimits; ._L82_CruiseControl} ∈ {0; 1} + [0]{._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._L96_CruiseControl ∈ {0} + [0]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [0]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt._L21_CruiseControl ∈ {0} + [0]._C0_CruiseSpeedMgt._L10_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt._L12_CruiseControl ∈ {2.0000000000000000} + [0]._C0_CruiseSpeedMgt._L13_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt._L15_CruiseControl ∈ {150.0000000000000000} + [0]._C0_CruiseSpeedMgt._L16_CruiseControl ∈ {0; 1} + [0]._C0_CruiseSpeedMgt._L4_CruiseControl ∈ [--..--] + [0]._C0_CruiseSpeedMgt._L17_CruiseControl ∈ {0; 1} + [0]._C0_CruiseSpeedMgt._L11_CruiseControl ∈ {2.0000000000000000} + [0]._C0_CruiseSpeedMgt._L14_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt._L19_CruiseControl ∈ {30.0000000000000000} + [0]._C0_CruiseSpeedMgt._L18_CruiseControl ∈ {0; 1} + [0]._C0_CruiseSpeedMgt._L5_CruiseControl ∈ [--..--] + [0]._C0_CruiseSpeedMgt._L20_CruiseControl ∈ {0; 1} + [0]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + {0; 1} + [0]._C1_DetectPedalsPressed._L2_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed._L8_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L4_CruiseControl ∈ {0; 1} + [0]._C1_DetectPedalsPressed._L1_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed._L7_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L3_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._I0_speed ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L7_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C2_DetectSpeedLimits._L13_CruiseControl ∈ {30.0000000000000000} + [0]._C2_DetectSpeedLimits._L8_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + {150.0000000000000000} + [0]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed}} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._I2_Resume; ._I3_On; ._I4_Off} ∈ [--..--] + [0]._C3_CruiseStateMgt{._I5_SpeedOutOffLimits; ._O0_Regul_ON} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._O1_Regul_OFF; ._O2_Regul_STDBY; ._LE24_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE0_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE4_CruiseControl; ._LE40_CruiseControl; ._LE26_CruiseControl; ._LE28_CruiseControl; ._LE9_CruiseControl; ._LE10_CruiseControl; ._LE11_CruiseControl; ._LE33_CruiseControl; ._LE35_CruiseControl; ._LE38_CruiseControl; ._LE12_CruiseControl; ._LE13_CruiseControl; ._LE14_CruiseControl; ._LE17_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE18_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE3_CruiseControl; ._LE16_CruiseControl; ._LE41_CruiseControl; ._LE19_CruiseControl; ._LE20_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE21_CruiseControl; ._LE1_CruiseControl; ._LE5_CruiseControl; ._LE22_CruiseControl; ._LE23_CruiseControl; ._LE25_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE29_CruiseControl; ._LE2_CruiseControl; ._LE30_CruiseControl; ._LE31_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl; ._LE42_CruiseControl; ._LE6_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE27_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt._LE36_CruiseControl ∈ [--..--] + [0]._C3_CruiseStateMgt._LE37_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE44_CruiseControl; ._LE8_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl ∈ {0} + [0]{._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [0]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [0]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + {[0]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl}; [1]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel}} ∈ + [--..--] + [1]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [1]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [1]._L95_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._L96_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [1]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + [--..--] + [1]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed._L4_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._L1_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed._L3_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._I0_speed ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [1]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [1]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [1]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl} ∈ + [--..--] +[value] Values at end of function CruiseStateMgt: + __retres ∈ {1} + S__C_[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel} ∈ + [--..--] + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [0]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{.BrakePressed; .AcceleratorPressed} ∈ {0; 1} + [0]{._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [0]._L95_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0].SpeedOutOffLimits ∈ {0; 1} + [0]{._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._L96_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [0]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + {0; 1} + [0]._C1_DetectPedalsPressed._L2_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed._L8_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L4_CruiseControl ∈ {0; 1} + [0]._C1_DetectPedalsPressed._L1_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed._L7_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L3_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._I0_speed ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L7_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C2_DetectSpeedLimits._L13_CruiseControl ∈ {30.0000000000000000} + [0]._C2_DetectSpeedLimits._L8_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + {150.0000000000000000} + [0]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed}} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._I2_Resume; ._I3_On; ._I4_Off} ∈ [--..--] + [0]._C3_CruiseStateMgt{._I5_SpeedOutOffLimits; ._O0_Regul_ON} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._O1_Regul_OFF; ._O2_Regul_STDBY; ._LE24_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE0_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE4_CruiseControl; ._LE40_CruiseControl; ._LE26_CruiseControl; ._LE28_CruiseControl; ._LE9_CruiseControl; ._LE10_CruiseControl; ._LE11_CruiseControl; ._LE33_CruiseControl; ._LE35_CruiseControl; ._LE38_CruiseControl; ._LE12_CruiseControl; ._LE13_CruiseControl; ._LE14_CruiseControl; ._LE17_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE18_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE3_CruiseControl; ._LE16_CruiseControl; ._LE41_CruiseControl; ._LE19_CruiseControl; ._LE20_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE21_CruiseControl; ._LE1_CruiseControl; ._LE5_CruiseControl; ._LE22_CruiseControl; ._LE23_CruiseControl; ._LE25_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE29_CruiseControl; ._LE2_CruiseControl; ._LE30_CruiseControl; ._LE31_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl; ._LE42_CruiseControl; ._LE6_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE27_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt._LE36_CruiseControl ∈ [--..--] + [0]._C3_CruiseStateMgt._LE37_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE44_CruiseControl; ._LE8_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl ∈ {0} + [0]{._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [0]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [0]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + {[0]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl}; [1]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel}} ∈ + [--..--] + [1]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [1]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [1]._L95_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._L96_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [1]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + [--..--] + [1]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed._L4_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._L1_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed._L3_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._I0_speed ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [1]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [1]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [1]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl} ∈ + [--..--] +[value] Values at end of function DetectPedalsPressed: + __retres ∈ {1} + S__C_[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel} ∈ + [--..--] + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [0]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [0]._L95_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._L96_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [0]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + {0; 1} + [0]._C1_DetectPedalsPressed._L2_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed._L8_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L4_CruiseControl ∈ {0; 1} + [0]._C1_DetectPedalsPressed._L1_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed._L7_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L3_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._I0_speed ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [0]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [0]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [0]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [0]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + {[0]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl}; [1]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel}} ∈ + [--..--] + [1]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [1]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [1]._L95_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._L96_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [1]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + [--..--] + [1]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed._L4_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._L1_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed._L3_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._I0_speed ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [1]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [1]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [1]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl} ∈ + [--..--] +[value] Values at end of function DetectSpeedLimits: + __retres ∈ {1} + S__C_[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel} ∈ + [--..--] + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [0]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{.BrakePressed; .AcceleratorPressed} ∈ {0; 1} + [0]{._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [0]._L95_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._L96_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [0]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + {0; 1} + [0]._C1_DetectPedalsPressed._L2_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed._L8_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L4_CruiseControl ∈ {0; 1} + [0]._C1_DetectPedalsPressed._L1_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed._L7_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L3_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._I0_speed ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L7_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C2_DetectSpeedLimits._L13_CruiseControl ∈ {30.0000000000000000} + [0]._C2_DetectSpeedLimits._L8_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + {150.0000000000000000} + [0]._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl} ∈ + {0; 1} + [0]{._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [0]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [0]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + {[0]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl}; [1]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel}} ∈ + [--..--] + [1]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [1]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [1]._L95_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._L96_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [1]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + [--..--] + [1]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed._L4_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._L1_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed._L3_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._I0_speed ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [1]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [1]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [1]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl} ∈ + [--..--] +[value] Values at end of function SaturateThrottle: + __retres ∈ {1} + S__C_[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel} ∈ + [--..--] + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [0]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{.BrakePressed; .AcceleratorPressed} ∈ {0; 1} + [0]{._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [0]._L95_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{.SpeedOutOffLimits; ._L82_CruiseControl} ∈ {0; 1} + [0]{._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._L96_CruiseControl ∈ {0} + [0]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [0]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + {0; 1} + [0]._C1_DetectPedalsPressed._L2_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed._L8_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L4_CruiseControl ∈ {0; 1} + [0]._C1_DetectPedalsPressed._L1_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed._L7_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L3_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._I0_speed ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L7_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C2_DetectSpeedLimits._L13_CruiseControl ∈ {30.0000000000000000} + [0]._C2_DetectSpeedLimits._L8_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + {150.0000000000000000} + [0]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed}} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._I2_Resume; ._I3_On; ._I4_Off} ∈ [--..--] + [0]._C3_CruiseStateMgt{._I5_SpeedOutOffLimits; ._O0_Regul_ON} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._O1_Regul_OFF; ._O2_Regul_STDBY; ._LE24_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE0_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE4_CruiseControl; ._LE40_CruiseControl; ._LE26_CruiseControl; ._LE28_CruiseControl; ._LE9_CruiseControl; ._LE10_CruiseControl; ._LE11_CruiseControl; ._LE33_CruiseControl; ._LE35_CruiseControl; ._LE38_CruiseControl; ._LE12_CruiseControl; ._LE13_CruiseControl; ._LE14_CruiseControl; ._LE17_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE18_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE3_CruiseControl; ._LE16_CruiseControl; ._LE41_CruiseControl; ._LE19_CruiseControl; ._LE20_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE21_CruiseControl; ._LE1_CruiseControl; ._LE5_CruiseControl; ._LE22_CruiseControl; ._LE23_CruiseControl; ._LE25_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE29_CruiseControl; ._LE2_CruiseControl; ._LE30_CruiseControl; ._LE31_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl; ._LE42_CruiseControl; ._LE6_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE27_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt._LE36_CruiseControl ∈ [--..--] + [0]._C3_CruiseStateMgt._LE37_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE44_CruiseControl; ._LE8_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl ∈ {0} + [0]._M_condact_0_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._I0_Regul_ON ∈ {0; 1} + [0]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._L21_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._L20_CruiseControl ∈ {1} + [0]._C4_ThrottleCmd._L22_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd.ONRisingEdge ∈ {0; 1} + [0]._C4_ThrottleCmd._L26_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd{._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._M_init_0_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._I0_Reset ∈ {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L6_CruiseControl ∈ + {8.1129999160766601} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.ProportionnalAction ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L22_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L16_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L23_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L18_CruiseControl; ._L10_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L8_CruiseControl ∈ + {1.0000000000000000*2^-1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.IntegralAction ∈ + [-1.9999998807907104*2^126 .. 1.9999998807907104*2^126] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L18_CruiseControl ∈ + {45.0000000000000000} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L12_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl ∈ + {0; 1} + {[0]._C4_ThrottleCmd._M_condact_2_CruiseControl; [1]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel}} ∈ + [--..--] + [1]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [1]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [1]._L95_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._L96_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [1]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + [--..--] + [1]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed._L4_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._L1_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed._L3_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._I0_speed ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [1]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [1]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [1]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl} ∈ + [--..--] +[value] Values at end of function ThrottleRegulation: + __retres ∈ {1} + S__C_[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel} ∈ + [--..--] + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [0]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{.BrakePressed; .AcceleratorPressed} ∈ {0; 1} + [0]{._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [0]._L95_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{.SpeedOutOffLimits; ._L82_CruiseControl} ∈ {0; 1} + [0]{._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._L96_CruiseControl ∈ {0} + [0]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [0]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + {0; 1} + [0]._C1_DetectPedalsPressed._L2_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed._L8_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L4_CruiseControl ∈ {0; 1} + [0]._C1_DetectPedalsPressed._L1_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed._L7_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L3_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._I0_speed ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L7_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C2_DetectSpeedLimits._L13_CruiseControl ∈ {30.0000000000000000} + [0]._C2_DetectSpeedLimits._L8_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + {150.0000000000000000} + [0]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed}} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._I2_Resume; ._I3_On; ._I4_Off} ∈ [--..--] + [0]._C3_CruiseStateMgt{._I5_SpeedOutOffLimits; ._O0_Regul_ON} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._O1_Regul_OFF; ._O2_Regul_STDBY; ._LE24_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE0_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE4_CruiseControl; ._LE40_CruiseControl; ._LE26_CruiseControl; ._LE28_CruiseControl; ._LE9_CruiseControl; ._LE10_CruiseControl; ._LE11_CruiseControl; ._LE33_CruiseControl; ._LE35_CruiseControl; ._LE38_CruiseControl; ._LE12_CruiseControl; ._LE13_CruiseControl; ._LE14_CruiseControl; ._LE17_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE18_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE3_CruiseControl; ._LE16_CruiseControl; ._LE41_CruiseControl; ._LE19_CruiseControl; ._LE20_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE21_CruiseControl; ._LE1_CruiseControl; ._LE5_CruiseControl; ._LE22_CruiseControl; ._LE23_CruiseControl; ._LE25_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE29_CruiseControl; ._LE2_CruiseControl; ._LE30_CruiseControl; ._LE31_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl; ._LE42_CruiseControl; ._LE6_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE27_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt._LE36_CruiseControl ∈ [--..--] + [0]._C3_CruiseStateMgt._LE37_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE44_CruiseControl; ._LE8_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl ∈ {0} + [0]._M_condact_0_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._I0_Regul_ON ∈ {0; 1} + [0]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._L21_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._L20_CruiseControl ∈ {1} + [0]._C4_ThrottleCmd._L22_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd.ONRisingEdge ∈ {0; 1} + [0]._C4_ThrottleCmd._L26_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd{._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._M_init_0_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._I0_Reset ∈ {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L6_CruiseControl ∈ + {8.1129999160766601} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.ProportionnalAction ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L22_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L16_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L23_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L18_CruiseControl; ._L10_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L8_CruiseControl ∈ + {1.0000000000000000*2^-1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.IntegralAction ∈ + [-1.9999998807907104*2^126 .. 1.9999998807907104*2^126] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L18_CruiseControl ∈ + {45.0000000000000000} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L12_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + {0; 1} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl ∈ + {0; 1} + {[0]._C4_ThrottleCmd._M_condact_2_CruiseControl; [1]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel}} ∈ + [--..--] + [1]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [1]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [1]._L95_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._L96_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [1]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + [--..--] + [1]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed._L4_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._L1_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed._L3_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._I0_speed ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [1]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [1]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [1]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl} ∈ + [--..--] +[value] Values at end of function ThrottleCmd: + __retres ∈ {1} + S__C_[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel} ∈ + [--..--] + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [0]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{.BrakePressed; .AcceleratorPressed} ∈ {0; 1} + [0]{._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [0]._L95_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{.SpeedOutOffLimits; ._L82_CruiseControl} ∈ {0; 1} + [0]{._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._L96_CruiseControl ∈ {0} + [0]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [0]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + {0; 1} + [0]._C1_DetectPedalsPressed._L2_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed._L8_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L4_CruiseControl ∈ {0; 1} + [0]._C1_DetectPedalsPressed._L1_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed._L7_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L3_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._I0_speed ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L7_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C2_DetectSpeedLimits._L13_CruiseControl ∈ {30.0000000000000000} + [0]._C2_DetectSpeedLimits._L8_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + {150.0000000000000000} + [0]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed}} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._I2_Resume; ._I3_On; ._I4_Off} ∈ [--..--] + [0]._C3_CruiseStateMgt{._I5_SpeedOutOffLimits; ._O0_Regul_ON} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._O1_Regul_OFF; ._O2_Regul_STDBY; ._LE24_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE0_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE4_CruiseControl; ._LE40_CruiseControl; ._LE26_CruiseControl; ._LE28_CruiseControl; ._LE9_CruiseControl; ._LE10_CruiseControl; ._LE11_CruiseControl; ._LE33_CruiseControl; ._LE35_CruiseControl; ._LE38_CruiseControl; ._LE12_CruiseControl; ._LE13_CruiseControl; ._LE14_CruiseControl; ._LE17_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE18_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE3_CruiseControl; ._LE16_CruiseControl; ._LE41_CruiseControl; ._LE19_CruiseControl; ._LE20_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE21_CruiseControl; ._LE1_CruiseControl; ._LE5_CruiseControl; ._LE22_CruiseControl; ._LE23_CruiseControl; ._LE25_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE29_CruiseControl; ._LE2_CruiseControl; ._LE30_CruiseControl; ._LE31_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl; ._LE42_CruiseControl; ._LE6_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE27_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt._LE36_CruiseControl ∈ [--..--] + [0]._C3_CruiseStateMgt._LE37_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE44_CruiseControl; ._LE8_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl ∈ {0} + [0]._M_condact_0_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._I0_Regul_ON ∈ {0; 1} + [0]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._L21_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._L20_CruiseControl ∈ {0; 1} + [0]._C4_ThrottleCmd._L22_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd.ONRisingEdge ∈ {0; 1} + [0]._C4_ThrottleCmd._L26_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd{._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._M_init_0_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._I0_Reset ∈ [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + {[0]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl}; [1]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel}} ∈ + [--..--] + [1]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [1]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [1]._L95_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._L96_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [1]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + [--..--] + [1]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed._L4_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._L1_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed._L3_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._I0_speed ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [1]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [1]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [1]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl} ∈ + [--..--] +[value] Values at end of function CruiseControl: + __retres ∈ {1} + S__C_[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel} ∈ + [--..--] + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._O2_Regul_ON ∈ {0; 1} + [0]{._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [0]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{.BrakePressed; .AcceleratorPressed} ∈ {0; 1} + [0]{._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [0]._L95_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]{.SpeedOutOffLimits; ._L82_CruiseControl} ∈ {0; 1} + [0]{._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._L96_CruiseControl ∈ {0} + [0]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [0]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._M_init_CruiseControl ∈ {0} + [0]._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [0]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + {0; 1} + [0]._C1_DetectPedalsPressed._L2_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed._L8_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L4_CruiseControl ∈ {0; 1} + [0]._C1_DetectPedalsPressed._L1_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C1_DetectPedalsPressed._L7_CruiseControl ∈ {0} + [0]._C1_DetectPedalsPressed._L3_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._I0_speed ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L7_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C2_DetectSpeedLimits._L13_CruiseControl ∈ {30.0000000000000000} + [0]._C2_DetectSpeedLimits._L8_CruiseControl ∈ {0; 1} + [0]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + {150.0000000000000000} + [0]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed}} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._I2_Resume; ._I3_On; ._I4_Off} ∈ [--..--] + [0]._C3_CruiseStateMgt{._I5_SpeedOutOffLimits; ._O0_Regul_ON} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._O1_Regul_OFF; ._O2_Regul_STDBY; ._LE24_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE0_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE4_CruiseControl; ._LE40_CruiseControl; ._LE26_CruiseControl; ._LE28_CruiseControl; ._LE9_CruiseControl; ._LE10_CruiseControl; ._LE11_CruiseControl; ._LE33_CruiseControl; ._LE35_CruiseControl; ._LE38_CruiseControl; ._LE12_CruiseControl; ._LE13_CruiseControl; ._LE14_CruiseControl; ._LE17_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE18_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE3_CruiseControl; ._LE16_CruiseControl; ._LE41_CruiseControl; ._LE19_CruiseControl; ._LE20_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE21_CruiseControl; ._LE1_CruiseControl; ._LE5_CruiseControl; ._LE22_CruiseControl; ._LE23_CruiseControl; ._LE25_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE29_CruiseControl; ._LE2_CruiseControl; ._LE30_CruiseControl; ._LE31_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl; ._LE42_CruiseControl; ._LE6_CruiseControl} ∈ + {0; 1} + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._LE27_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt._LE36_CruiseControl ∈ [--..--] + [0]._C3_CruiseStateMgt._LE37_CruiseControl ∈ {0; 1} + [0]._C3_CruiseStateMgt{._LE44_CruiseControl; ._LE8_CruiseControl} ∈ + [--..--] + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl ∈ {0} + [0]._M_condact_0_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._I0_Regul_ON ∈ {0; 1} + [0]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._L21_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd._L20_CruiseControl ∈ {0; 1} + [0]._C4_ThrottleCmd._L22_CruiseControl ∈ [--..--] + [0]._C4_ThrottleCmd.ONRisingEdge ∈ {0; 1} + [0]._C4_ThrottleCmd._L26_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd{._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._M_init_0_CruiseControl ∈ {0} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._I0_Reset ∈ [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + {[0]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl}; [1]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel}} ∈ + [--..--] + [1]{._I6_Accel; ._I7_Brake; ._I8_Speed; ._O0_Cruise_speed; ._O1_Throttle_cmd} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl} ∈ + [--..--] + [1]{._L59_CruiseControl; ._L62_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{.BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl} ∈ + [--..--] + [1]._L95_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{.SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._L96_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl} ∈ + [--..--] + [1]{._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._M_init_CruiseControl; ._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel}} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._I4_Speed; ._O0_CruiseSpeed; ._L1_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt{._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl} ∈ + [--..--] + [1]._C0_CruiseSpeedMgt{._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C0_CruiseSpeedMgt._M_init_0_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed} ∈ + [--..--] + [1]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed._L4_CruiseControl ∈ [--..--] + [1]._C1_DetectPedalsPressed{._L1_CruiseControl; ._L7_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C1_DetectPedalsPressed._L3_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._I0_speed ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits ∈ [--..--] + [1]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C2_DetectSpeedLimits._L8_CruiseControl ∈ [--..--] + [1]._C2_DetectSpeedLimits._L14_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]{._C2_DetectSpeedLimits{._L9_CruiseControl; ._L17_CruiseControl}; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd._I0_Regul_ON} ∈ + [--..--] + [1]._C4_ThrottleCmd{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge} ∈ + [--..--] + [1]._C4_ThrottleCmd{._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._M_init_0_CruiseControl; ._C0_ThrottleRegulation._I0_Reset} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation{._L14_CruiseControl; ._L19_CruiseControl} ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._I0_ThrottleIn; ._O0_ThrottleOut} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl ∈ + [--..--] + [1]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L6_CruiseControl; ._L8_CruiseControl} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + [1]._C4_ThrottleCmd{._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl; ._M_condact_2_CruiseControl} ∈ + [--..--] +[from] Computing for function CruiseSpeedMgt +[from] Done for function CruiseSpeedMgt +[from] Computing for function CruiseStateMgt +[from] Done for function CruiseStateMgt +[from] Computing for function DetectPedalsPressed +[from] Done for function DetectPedalsPressed +[from] Computing for function DetectSpeedLimits +[from] Done for function DetectSpeedLimits +[from] Computing for function SaturateThrottle +[from] Done for function SaturateThrottle +[from] Computing for function ThrottleRegulation +[from] Done for function ThrottleRegulation +[from] Computing for function ThrottleCmd +[from] Done for function ThrottleCmd +[from] Computing for function CruiseControl +[from] Done for function CruiseControl +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function CruiseSpeedMgt: + S__C_{[0]._C0_CruiseSpeedMgt._O0_CruiseSpeed; + [0]._C0_CruiseSpeedMgt._L7_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; _C_; + S__C_{[0]._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel; ._I4_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C0_CruiseSpeedMgt._L1_CruiseControl + FROM _C_; S__C_[0]._C0_CruiseSpeedMgt._I4_Speed + [0]._C0_CruiseSpeedMgt._L2_CruiseControl + FROM _C_; S__C_[0]._C0_CruiseSpeedMgt._I1_Set + [0]._C0_CruiseSpeedMgt._L3_CruiseControl + FROM _C_; S__C_[0]._C0_CruiseSpeedMgt._I0_On + [0]._C0_CruiseSpeedMgt._L6_CruiseControl + FROM _C_; S__C_[0]._C0_CruiseSpeedMgt{._I0_On; ._I1_Set} + [0]._C0_CruiseSpeedMgt._L21_CruiseControl FROM ZeroSpeed; _C_ + [0]._C0_CruiseSpeedMgt._L10_CruiseControl + FROM ZeroSpeed; _C_; + S__C_[0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl} + {[0]._C0_CruiseSpeedMgt._L12_CruiseControl; + [0]._C0_CruiseSpeedMgt._L11_CruiseControl} + FROM SpeedInc; _C_ + {[0]._C0_CruiseSpeedMgt._L13_CruiseControl; + [0]._C0_CruiseSpeedMgt._L14_CruiseControl} + FROM ZeroSpeed; SpeedInc; _C_; + S__C_[0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl} + [0]._C0_CruiseSpeedMgt._L15_CruiseControl FROM SpeedMax; _C_ + [0]._C0_CruiseSpeedMgt._L16_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; _C_; + S__C_[0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl} + [0]._C0_CruiseSpeedMgt._L4_CruiseControl + FROM _C_; S__C_[0]._C0_CruiseSpeedMgt._I2_QuickAccel + [0]._C0_CruiseSpeedMgt._L17_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; _C_; + S__C_{[0]._C0_CruiseSpeedMgt._I2_QuickAccel; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C0_CruiseSpeedMgt._L19_CruiseControl FROM SpeedMin; _C_ + [0]._C0_CruiseSpeedMgt._L18_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMin; _C_; + S__C_[0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl} + [0]._C0_CruiseSpeedMgt._L5_CruiseControl + FROM _C_; S__C_[0]._C0_CruiseSpeedMgt._I3_QuickDecel + [0]._C0_CruiseSpeedMgt._L20_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMin; _C_; + S__C_{[0]._C0_CruiseSpeedMgt._I3_QuickDecel; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C0_CruiseSpeedMgt._L9_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMin; _C_; + S__C_{[0]._C0_CruiseSpeedMgt._I3_QuickDecel; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C0_CruiseSpeedMgt._L8_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; _C_; + S__C_{[0]._C0_CruiseSpeedMgt{._I2_QuickAccel; ._I3_QuickDecel}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl FROM _C_ + \result FROM \nothing +[from] Function CruiseStateMgt: + S__C_{[0]._C3_CruiseStateMgt._O0_Regul_ON; + [0]._C3_CruiseStateMgt._O2_Regul_STDBY; + [0]._C3_CruiseStateMgt{._LE42_CruiseControl; ._LE6_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE44_CruiseControl; ._LE8_CruiseControl}} + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed; ._I2_Resume; ._I3_On; ._I4_Off; ._I5_SpeedOutOffLimits}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C3_CruiseStateMgt._O1_Regul_OFF; + [0]._C3_CruiseStateMgt{._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl}} + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._I0_BrakePressed; + [0]._C3_CruiseStateMgt{._I2_Resume; ._I3_On; ._I4_Off}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE24_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE23_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE0_CruiseControl + FROM _C_; S__C_[0]._C3_CruiseStateMgt._I0_BrakePressed + [0]._C3_CruiseStateMgt._LE4_CruiseControl + FROM _C_; S__C_[0]._C3_CruiseStateMgt._I4_Off + [0]._C3_CruiseStateMgt._LE40_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE26_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE25_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE28_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE9_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE25_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE10_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE11_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE33_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE32_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE35_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE34_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE38_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE12_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE34_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE13_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE14_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C3_CruiseStateMgt._LE17_CruiseControl; + [0]._C3_CruiseStateMgt._LE29_CruiseControl; + [0]._C3_CruiseStateMgt._LE30_CruiseControl} + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._I4_Off; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE18_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._I0_BrakePressed; + [0]._C3_CruiseStateMgt._I4_Off; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE3_CruiseControl + FROM _C_; S__C_[0]._C3_CruiseStateMgt._I3_On + [0]._C3_CruiseStateMgt._LE16_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE15_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE41_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE19_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._I3_On; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE20_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._I3_On; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt._LE15_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE21_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._I0_BrakePressed; + [0]._C3_CruiseStateMgt{._I3_On; ._I4_Off}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE1_CruiseControl + FROM _C_; S__C_[0]._C3_CruiseStateMgt._I1_AcceleratorPressed + [0]._C3_CruiseStateMgt._LE5_CruiseControl + FROM _C_; S__C_[0]._C3_CruiseStateMgt._I5_SpeedOutOffLimits + [0]._C3_CruiseStateMgt._LE22_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._I1_AcceleratorPressed; + [0]._C3_CruiseStateMgt._I5_SpeedOutOffLimits} + {[0]._C3_CruiseStateMgt._LE23_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl} + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed}; + [0]._C3_CruiseStateMgt{._I3_On; ._I4_Off; ._I5_SpeedOutOffLimits}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C3_CruiseStateMgt._LE25_CruiseControl; + [0]._C3_CruiseStateMgt._LE34_CruiseControl} + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed}; + [0]._C3_CruiseStateMgt{._I4_Off; ._I5_SpeedOutOffLimits}; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE2_CruiseControl + FROM _C_; S__C_[0]._C3_CruiseStateMgt._I2_Resume + [0]._C3_CruiseStateMgt._LE31_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._I2_Resume; + [0]._C3_CruiseStateMgt._I4_Off; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C3_CruiseStateMgt._LE32_CruiseControl; + [0]._C3_CruiseStateMgt{._LE36_CruiseControl; ._LE37_CruiseControl}} + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed; ._I2_Resume}; + [0]._C3_CruiseStateMgt{._I4_Off; ._I5_SpeedOutOffLimits}; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE15_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._I3_On; ._I4_Off}; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl FROM _C_ + \result FROM \nothing +[from] Function DetectPedalsPressed: + S__C_{[0]._C1_DetectPedalsPressed._O0_BrakePressed; + [0]._C1_DetectPedalsPressed._L4_CruiseControl} + FROM ZeroPercent; _C_; S__C_[0]._C1_DetectPedalsPressed._I0_Brake + {[0]._C1_DetectPedalsPressed._O1_AcceleratorPressed; + [0]._C1_DetectPedalsPressed._L3_CruiseControl} + FROM ZeroPercent; _C_; + S__C_[0]._C1_DetectPedalsPressed._I1_Accelerator + [0]._C1_DetectPedalsPressed._L2_CruiseControl + FROM _C_; S__C_[0]._C1_DetectPedalsPressed._I0_Brake + {[0]._C1_DetectPedalsPressed._L8_CruiseControl; + [0]._C1_DetectPedalsPressed._L7_CruiseControl} + FROM ZeroPercent; _C_ + [0]._C1_DetectPedalsPressed._L1_CruiseControl + FROM _C_; S__C_[0]._C1_DetectPedalsPressed._I1_Accelerator + \result FROM \nothing +[from] Function DetectSpeedLimits: + S__C_{[0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits; + [0]._C2_DetectSpeedLimits._L17_CruiseControl} + FROM SpeedMax; SpeedMin; _C_; S__C_[0]._C2_DetectSpeedLimits._I0_speed + [0]._C2_DetectSpeedLimits._L7_CruiseControl + FROM _C_; S__C_[0]._C2_DetectSpeedLimits._I0_speed + [0]._C2_DetectSpeedLimits._L13_CruiseControl FROM SpeedMin; _C_ + [0]._C2_DetectSpeedLimits._L8_CruiseControl + FROM SpeedMin; _C_; S__C_[0]._C2_DetectSpeedLimits._I0_speed + [0]._C2_DetectSpeedLimits._L14_CruiseControl FROM SpeedMax; _C_ + [0]._C2_DetectSpeedLimits._L9_CruiseControl + FROM SpeedMax; _C_; S__C_[0]._C2_DetectSpeedLimits._I0_speed + \result FROM \nothing +[from] Function SaturateThrottle: + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O0_ThrottleOut; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L8_CruiseControl} + FROM ZeroPercent; RegThrottleMax; _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl} + FROM ZeroPercent; RegThrottleMax; _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L18_CruiseControl + FROM RegThrottleMax; _C_ + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L12_CruiseControl + FROM _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl + FROM RegThrottleMax; _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl + FROM ZeroPercent; _C_ + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl + FROM ZeroPercent; _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L6_CruiseControl + FROM ZeroPercent; _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn + \result FROM \nothing +[from] Function ThrottleRegulation: + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation._O0_Throttle; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L13_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O0_ThrottleOut; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L8_CruiseControl} + FROM ZeroSpeed; ZeroPercent; Kp; Ki; RegThrottleMax; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L1_CruiseControl + FROM _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._I1_CruiseSpeed + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L2_CruiseControl + FROM _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._I2_VehiculeSpeed + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L3_CruiseControl + FROM _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L6_CruiseControl + FROM Kp; _C_ + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.ProportionnalAction + FROM Kp; _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed} + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L22_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L23_CruiseControl} + FROM ZeroSpeed; _C_ + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction + FROM _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L16_CruiseControl + FROM ZeroSpeed; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L18_CruiseControl + FROM ZeroSpeed; _C_; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L10_CruiseControl + FROM ZeroSpeed; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L8_CruiseControl + FROM Ki; _C_ + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.IntegralAction + FROM ZeroSpeed; Ki; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L4_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L12_CruiseControl} + FROM ZeroSpeed; Kp; Ki; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl} + FROM ZeroSpeed; ZeroPercent; Kp; Ki; RegThrottleMax; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L19_CruiseControl + FROM _C_; S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._I0_Reset + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl + FROM ZeroSpeed; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I0_Reset; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl + FROM _C_ + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L18_CruiseControl + FROM RegThrottleMax; _C_ + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl + FROM ZeroSpeed; Kp; Ki; RegThrottleMax; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl + FROM ZeroPercent; _C_ + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl + FROM ZeroSpeed; ZeroPercent; Kp; Ki; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L6_CruiseControl + FROM ZeroSpeed; ZeroPercent; Kp; Ki; _C_; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + \result FROM \nothing +[from] Function ThrottleCmd: + S__C_{[0]._C4_ThrottleCmd._O0_Throttle; + [0]._C4_ThrottleCmd._L24_CruiseControl} + FROM ZeroSpeed; ZeroPercent; Kp; Ki; RegThrottleMax; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator}; + [0]._C4_ThrottleCmd._L19_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + {[0]._C4_ThrottleCmd._L21_CruiseControl; + [0]._C4_ThrottleCmd._L22_CruiseControl} + FROM _C_; + S__C_{[0]._C4_ThrottleCmd._L20_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl} + [0]._C4_ThrottleCmd._L20_CruiseControl + FROM _C_; S__C_[0]._C4_ThrottleCmd._I0_Regul_ON + [0]._C4_ThrottleCmd.ONRisingEdge + FROM _C_; + S__C_{[0]._C4_ThrottleCmd._I0_Regul_ON; + [0]._C4_ThrottleCmd._L20_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl} + [0]._C4_ThrottleCmd._L26_CruiseControl FROM ZeroPercent; _C_ + [0]._C4_ThrottleCmd._L1_CruiseControl + FROM _C_; S__C_[0]._C4_ThrottleCmd._I1_CruiseSpeed + [0]._C4_ThrottleCmd._L2_CruiseControl + FROM _C_; S__C_[0]._C4_ThrottleCmd._I2_VehiculeSpeed + [0]._C4_ThrottleCmd._L19_CruiseControl + FROM ZeroSpeed; ZeroPercent; Kp; Ki; RegThrottleMax; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._L25_CruiseControl + FROM _C_; + S__C_{[0]._C4_ThrottleCmd._I0_Regul_ON; + [0]._C4_ThrottleCmd._I3_Accelerator} + [0]._C4_ThrottleCmd._M_init_0_CruiseControl + FROM _C_; S__C_[0]._C4_ThrottleCmd._I0_Regul_ON + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._I0_Reset; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L19_CruiseControl} + FROM _C_; + S__C_{[0]._C4_ThrottleCmd._I0_Regul_ON; + [0]._C4_ThrottleCmd._L20_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._I1_CruiseSpeed; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L1_CruiseControl} + FROM _C_; + S__C_[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._I2_VehiculeSpeed; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L2_CruiseControl} + FROM _C_; + S__C_{[0]._C4_ThrottleCmd._I0_Regul_ON; + [0]._C4_ThrottleCmd._I2_VehiculeSpeed} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._O0_Throttle; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L13_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O0_ThrottleOut; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L8_CruiseControl} + FROM ZeroSpeed; ZeroPercent; Kp; Ki; RegThrottleMax; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L3_CruiseControl + FROM _C_; + S__C_[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L6_CruiseControl + FROM Kp; _C_; S__C_[0]._C4_ThrottleCmd._I0_Regul_ON (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.ProportionnalAction + FROM Kp; _C_; + S__C_[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L22_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L23_CruiseControl} + FROM ZeroSpeed; _C_; S__C_[0]._C4_ThrottleCmd._I0_Regul_ON (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction + FROM _C_; + S__C_{[0]._C4_ThrottleCmd._I0_Regul_ON; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L16_CruiseControl + FROM ZeroSpeed; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L18_CruiseControl + FROM ZeroSpeed; _C_; + S__C_{[0]._C4_ThrottleCmd._I0_Regul_ON; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L10_CruiseControl + FROM ZeroSpeed; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L8_CruiseControl + FROM Ki; _C_; S__C_[0]._C4_ThrottleCmd._I0_Regul_ON (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.IntegralAction + FROM ZeroSpeed; Ki; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L4_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L12_CruiseControl} + FROM ZeroSpeed; Kp; Ki; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl} + FROM ZeroSpeed; ZeroPercent; Kp; Ki; RegThrottleMax; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl + FROM ZeroSpeed; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._L20_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._M_condact_2_CruiseControl} + FROM _C_; S__C_[0]._C4_ThrottleCmd._I0_Regul_ON (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L18_CruiseControl + FROM RegThrottleMax; _C_; + S__C_[0]._C4_ThrottleCmd._I0_Regul_ON (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl + FROM ZeroSpeed; Kp; Ki; RegThrottleMax; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl + FROM ZeroPercent; _C_; + S__C_[0]._C4_ThrottleCmd._I0_Regul_ON (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl + FROM ZeroSpeed; ZeroPercent; Kp; Ki; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L6_CruiseControl + FROM ZeroSpeed; ZeroPercent; Kp; Ki; _C_; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + \result FROM _C_; S__C_[0]._C4_ThrottleCmd._I0_Regul_ON +[from] Function CruiseControl: + S__C_{[0]._O0_Cruise_speed; [0]._C4_ThrottleCmd._I1_CruiseSpeed; + [0]._C4_ThrottleCmd._L1_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._O1_Throttle_cmd; [0]._L22_CruiseControl; + [0]._C4_ThrottleCmd._O0_Throttle; + [0]._C4_ThrottleCmd._L24_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + Ki; RegThrottleMax; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._L19_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} + {[0]._O2_Regul_ON; [0]._O4_Regul_STDBY; + [0]._C4_ThrottleCmd._I0_Regul_ON; + [0]._C4_ThrottleCmd._L20_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._O3_Regul_OFF + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._L73_CruiseControl; [0]._L60_CruiseControl; + [0]._C3_CruiseStateMgt._I3_On; + [0]._C3_CruiseStateMgt._LE3_CruiseControl} + FROM _C_; S__C_[0]._I0_On + {[0]._L59_CruiseControl; [0]._C1_DetectPedalsPressed._I0_Brake; + [0]._C1_DetectPedalsPressed._L2_CruiseControl} + FROM _C_; S__C_[0]._I7_Brake + {[0]._L62_CruiseControl; [0]._C1_DetectPedalsPressed._I1_Accelerator; + [0]._C1_DetectPedalsPressed._L1_CruiseControl} + FROM _C_; S__C_[0]._I6_Accel + {[0].BrakePressed; [0]._C1_DetectPedalsPressed._O0_BrakePressed; + [0]._C1_DetectPedalsPressed._L4_CruiseControl; + [0]._C3_CruiseStateMgt._I0_BrakePressed; + [0]._C3_CruiseStateMgt._LE0_CruiseControl} + FROM ZeroPercent; _C_; S__C_[0]._I7_Brake + {[0].AcceleratorPressed; + [0]._C1_DetectPedalsPressed._O1_AcceleratorPressed; + [0]._C1_DetectPedalsPressed._L3_CruiseControl; + [0]._C3_CruiseStateMgt._I1_AcceleratorPressed; + [0]._C3_CruiseStateMgt._LE1_CruiseControl} + FROM ZeroPercent; _C_; S__C_[0]._I6_Accel + {[0]._L61_CruiseControl; [0]._C3_CruiseStateMgt._I2_Resume; + [0]._C3_CruiseStateMgt._LE2_CruiseControl} + FROM _C_; S__C_[0]._I2_Resume + {[0]._L58_CruiseControl; [0]._C3_CruiseStateMgt._I4_Off; + [0]._C3_CruiseStateMgt._LE4_CruiseControl} + FROM _C_; S__C_[0]._I1_Off + {[0]._L95_CruiseControl; [0]._L23_CruiseControl; + [0]._C2_DetectSpeedLimits._I0_speed; + [0]._C2_DetectSpeedLimits._L7_CruiseControl} + FROM _C_; S__C_[0]._I8_Speed + {[0].SpeedOutOffLimits; + [0]._C2_DetectSpeedLimits._O0_SpeedOutOffLimits; + [0]._C2_DetectSpeedLimits._L17_CruiseControl; + [0]._C3_CruiseStateMgt._I5_SpeedOutOffLimits; + [0]._C3_CruiseStateMgt._LE5_CruiseControl} + FROM SpeedMax; SpeedMin; _C_; S__C_[0]._I8_Speed + {[0]._L82_CruiseControl; + [0]{._L84_CruiseControl; ._L19_CruiseControl}; + [0]._C3_CruiseStateMgt._O0_Regul_ON; + [0]._C3_CruiseStateMgt._O2_Regul_STDBY; + [0]._C3_CruiseStateMgt{._LE42_CruiseControl; ._LE6_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE44_CruiseControl; ._LE8_CruiseControl}} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._L83_CruiseControl; [0]._C3_CruiseStateMgt._O1_Regul_OFF; + [0]._C3_CruiseStateMgt{._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl}} + FROM ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; [0]._I7_Brake; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._L96_CruiseControl FROM ZeroSpeed; _C_ + [0]._L38_CruiseControl FROM _C_; S__C_[0]._I3_Set + [0]._L39_CruiseControl FROM _C_; S__C_[0]._I4_QuickAccel + [0]._L40_CruiseControl FROM _C_; S__C_[0]._I5_QuickDecel + [0].CruiseSpeed + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._L26_CruiseControl; [0]._C4_ThrottleCmd._I3_Accelerator; + [0]._C4_ThrottleCmd._L25_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._M_init_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C0_CruiseSpeedMgt._I0_On; + [0]._C0_CruiseSpeedMgt._L3_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._I1_Set; + [0]._C0_CruiseSpeedMgt._L2_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._I2_QuickAccel; + [0]._C0_CruiseSpeedMgt._L4_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; [0]._I4_QuickAccel; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._I3_QuickDecel; + [0]._C0_CruiseSpeedMgt._L5_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._I4_Speed; + [0]._C0_CruiseSpeedMgt._L1_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._I2_VehiculeSpeed; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L2_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._O0_CruiseSpeed; + [0]._C0_CruiseSpeedMgt._L7_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L6_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._L21_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L22_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L23_CruiseControl} + FROM ZeroSpeed; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L10_CruiseControl + FROM ZeroSpeed; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._L12_CruiseControl; + [0]._C0_CruiseSpeedMgt._L11_CruiseControl} + FROM SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._L13_CruiseControl; + [0]._C0_CruiseSpeedMgt._L14_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L15_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L16_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L17_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; [0]._I4_QuickAccel; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L19_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L18_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L20_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L9_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C0_CruiseSpeedMgt._L8_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C0_CruiseSpeedMgt._M_init_0_CruiseControl; + [0]._M_condact_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._M_condact_2_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C1_DetectPedalsPressed._L8_CruiseControl; + [0]._C1_DetectPedalsPressed._L7_CruiseControl} + FROM ZeroPercent; _C_ + [0]._C2_DetectSpeedLimits._L13_CruiseControl FROM SpeedMin; _C_ + [0]._C2_DetectSpeedLimits._L8_CruiseControl + FROM SpeedMin; _C_; S__C_[0]._I8_Speed + [0]._C2_DetectSpeedLimits._L14_CruiseControl FROM SpeedMax; _C_ + [0]._C2_DetectSpeedLimits._L9_CruiseControl + FROM SpeedMax; _C_; S__C_[0]._I8_Speed + [0]._C3_CruiseStateMgt._LE24_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE23_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE40_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE26_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE25_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE28_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE9_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE25_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE10_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE11_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE33_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE32_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE35_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE34_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE38_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE12_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE34_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE13_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE14_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C3_CruiseStateMgt._LE17_CruiseControl; + [0]._C3_CruiseStateMgt._LE29_CruiseControl; + [0]._C3_CruiseStateMgt._LE30_CruiseControl} + FROM _C_; + S__C_{[0]._I1_Off; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE18_CruiseControl + FROM ZeroPercent; _C_; + S__C_{[0]._I1_Off; [0]._I7_Brake; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE16_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE15_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE41_CruiseControl + FROM _C_; + S__C_{[0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE19_CruiseControl + FROM _C_; + S__C_{[0]._I0_On; [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE20_CruiseControl + FROM _C_; + S__C_{[0]._I0_On; [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt._LE15_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE21_CruiseControl + FROM ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off}; [0]._I7_Brake; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE22_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]._I6_Accel; [0]._I8_Speed} + {[0]._C3_CruiseStateMgt._LE23_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C3_CruiseStateMgt._LE25_CruiseControl; + [0]._C3_CruiseStateMgt._LE34_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]._I1_Off; [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE31_CruiseControl + FROM _C_; + S__C_{[0]{._I1_Off; ._I2_Resume}; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C3_CruiseStateMgt._LE32_CruiseControl; + [0]._C3_CruiseStateMgt{._LE36_CruiseControl; ._LE37_CruiseControl}} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt._LE39_CruiseControl; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._LE15_CruiseControl + FROM _C_; + S__C_{[0]{._I0_On; ._I1_Off}; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl FROM _C_ + {[0]._C4_ThrottleCmd._I2_VehiculeSpeed; + [0]._C4_ThrottleCmd._L2_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + {[0]._C4_ThrottleCmd._L21_CruiseControl; + [0]._C4_ThrottleCmd._L22_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._L20_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl} + [0]._C4_ThrottleCmd.ONRisingEdge + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._L20_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl} + [0]._C4_ThrottleCmd._L26_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} + [0]._C4_ThrottleCmd._L19_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + Ki; RegThrottleMax; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._I0_Reset; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L19_CruiseControl} + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._L20_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._I1_CruiseSpeed; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L1_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L3_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._O0_Throttle; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L13_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O0_ThrottleOut; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L8_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + Ki; RegThrottleMax; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L6_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; Kp; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.ProportionnalAction + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.HoldIntegralAction + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L16_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L18_CruiseControl + FROM ZeroSpeed; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L10_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L8_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; Ki; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation.IntegralAction + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Ki; + _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L4_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L12_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + Ki; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + {[0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._O1_Saturate; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L13_CruiseControl} + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + Ki; RegThrottleMax; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L21_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._L20_CruiseControl; + [0]._C4_ThrottleCmd._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L18_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; RegThrottleMax; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L7_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + Ki; RegThrottleMax; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L17_CruiseControl + FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L9_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + Ki; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._L6_CruiseControl + FROM ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; + Ki; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0].CruiseSpeed; [0]._M_init_CruiseControl; + [0]._C0_CruiseSpeedMgt{._L7_CruiseControl; ._M_init_0_CruiseControl}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._L14_CruiseControl; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L21_CruiseControl; ._M_init_0_CruiseControl}} (and SELF) + \result FROM SpeedMax; SpeedMin; ZeroPercent; _C_; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume}; + [0]{._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]._C3_CruiseStateMgt._LE19_CruiseControl; + [0]._C3_CruiseStateMgt{._LE23_CruiseControl; ._LE25_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE32_CruiseControl; ._LE34_CruiseControl}; + [0]._C3_CruiseStateMgt{._LE15_CruiseControl; ._LE39_CruiseControl}; + [0]._C3_CruiseStateMgt._LE27_CruiseControl; + [0]._C3_CruiseStateMgt._LE37_CruiseControl; + [0]._C3_CruiseStateMgt._M_init_0_CruiseControl} +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function CruiseSpeedMgt: + __retres; + S__C_[0]._C0_CruiseSpeedMgt{._O0_CruiseSpeed; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; ._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl; ._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl; ._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl; ._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl; ._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl; ._M_init_0_CruiseControl} +[inout] Inputs for function CruiseSpeedMgt: + ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; + S__C_{[0]._C0_CruiseSpeedMgt{._I0_On; ._I1_Set; ._I2_QuickAccel; ._I3_QuickDecel; ._I4_Speed}; + [0]._C0_CruiseSpeedMgt{._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; ._L21_CruiseControl; ._L10_CruiseControl; ._L12_CruiseControl; ._L13_CruiseControl; ._L15_CruiseControl; ._L16_CruiseControl; ._L4_CruiseControl; ._L17_CruiseControl; ._L11_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl; ._L18_CruiseControl; ._L5_CruiseControl; ._L20_CruiseControl; ._L9_CruiseControl; ._L8_CruiseControl; ._L7_CruiseControl; ._M_init_0_CruiseControl}} +[inout] Out (internal) for function CruiseStateMgt: + __retres; + S__C_[0]._C3_CruiseStateMgt{._O0_Regul_ON; ._O1_Regul_OFF; ._O2_Regul_STDBY; ._LE24_CruiseControl; ._LE0_CruiseControl; ._LE4_CruiseControl; ._LE40_CruiseControl; ._LE26_CruiseControl; ._LE28_CruiseControl; ._LE9_CruiseControl; ._LE10_CruiseControl; ._LE11_CruiseControl; ._LE33_CruiseControl; ._LE35_CruiseControl; ._LE38_CruiseControl; ._LE12_CruiseControl; ._LE13_CruiseControl; ._LE14_CruiseControl; ._LE17_CruiseControl; ._LE18_CruiseControl; ._LE3_CruiseControl; ._LE16_CruiseControl; ._LE41_CruiseControl; ._LE19_CruiseControl; ._LE20_CruiseControl; ._LE21_CruiseControl; ._LE1_CruiseControl; ._LE5_CruiseControl; ._LE22_CruiseControl; ._LE23_CruiseControl; ._LE25_CruiseControl; ._LE29_CruiseControl; ._LE2_CruiseControl; ._LE30_CruiseControl; ._LE31_CruiseControl; ._LE32_CruiseControl; ._LE34_CruiseControl; ._LE42_CruiseControl; ._LE6_CruiseControl; ._LE15_CruiseControl; ._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl; ._LE27_CruiseControl; ._LE36_CruiseControl; ._LE37_CruiseControl; ._LE44_CruiseControl; ._LE8_CruiseControl; ._M_init_0_CruiseControl} +[inout] Inputs for function CruiseStateMgt: + S__C_{[0]._C3_CruiseStateMgt{._I0_BrakePressed; ._I1_AcceleratorPressed; ._I2_Resume; ._I3_On; ._I4_Off; ._I5_SpeedOutOffLimits}; + [0]._C3_CruiseStateMgt{._LE24_CruiseControl; ._LE0_CruiseControl; ._LE4_CruiseControl; ._LE40_CruiseControl; ._LE26_CruiseControl; ._LE28_CruiseControl; ._LE9_CruiseControl; ._LE10_CruiseControl; ._LE11_CruiseControl; ._LE33_CruiseControl; ._LE35_CruiseControl; ._LE38_CruiseControl; ._LE12_CruiseControl; ._LE13_CruiseControl; ._LE14_CruiseControl; ._LE17_CruiseControl; ._LE18_CruiseControl; ._LE3_CruiseControl; ._LE16_CruiseControl; ._LE41_CruiseControl; ._LE19_CruiseControl; ._LE20_CruiseControl; ._LE21_CruiseControl; ._LE1_CruiseControl; ._LE5_CruiseControl; ._LE22_CruiseControl; ._LE23_CruiseControl; ._LE25_CruiseControl; ._LE29_CruiseControl; ._LE2_CruiseControl; ._LE30_CruiseControl; ._LE31_CruiseControl; ._LE32_CruiseControl; ._LE34_CruiseControl; ._LE42_CruiseControl; ._LE6_CruiseControl; ._LE15_CruiseControl; ._LE39_CruiseControl; ._LE43_CruiseControl; ._LE7_CruiseControl; ._LE27_CruiseControl; ._LE36_CruiseControl; ._LE37_CruiseControl; ._LE44_CruiseControl; ._LE8_CruiseControl; ._M_init_0_CruiseControl}} +[inout] Out (internal) for function DetectPedalsPressed: + __retres; + S__C_[0]._C1_DetectPedalsPressed{._O0_BrakePressed; ._O1_AcceleratorPressed; ._L2_CruiseControl; ._L8_CruiseControl; ._L4_CruiseControl; ._L1_CruiseControl; ._L7_CruiseControl; ._L3_CruiseControl} +[inout] Inputs for function DetectPedalsPressed: + ZeroPercent; + S__C_{[0]._C1_DetectPedalsPressed{._I0_Brake; ._I1_Accelerator}; + [0]._C1_DetectPedalsPressed{._L2_CruiseControl; ._L8_CruiseControl; ._L4_CruiseControl; ._L1_CruiseControl; ._L7_CruiseControl; ._L3_CruiseControl}} +[inout] Out (internal) for function DetectSpeedLimits: + __retres; + S__C_[0]._C2_DetectSpeedLimits{._O0_SpeedOutOffLimits; ._L7_CruiseControl; ._L13_CruiseControl; ._L8_CruiseControl; ._L14_CruiseControl; ._L9_CruiseControl; ._L17_CruiseControl} +[inout] Inputs for function DetectSpeedLimits: + SpeedMax; SpeedMin; + S__C_{[0]._C2_DetectSpeedLimits._I0_speed; + [0]._C2_DetectSpeedLimits{._L7_CruiseControl; ._L13_CruiseControl; ._L8_CruiseControl; ._L14_CruiseControl; ._L9_CruiseControl; ._L17_CruiseControl}} +[inout] Out (internal) for function SaturateThrottle: + __retres; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._O0_ThrottleOut; ._O1_Saturate; ._L18_CruiseControl; ._L12_CruiseControl; ._L7_CruiseControl; ._L17_CruiseControl; ._L9_CruiseControl; ._L6_CruiseControl; ._L8_CruiseControl; ._L13_CruiseControl} +[inout] Inputs for function SaturateThrottle: + ZeroPercent; RegThrottleMax; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle._I0_ThrottleIn; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation._C0_SaturateThrottle{._L18_CruiseControl; ._L12_CruiseControl; ._L7_CruiseControl; ._L17_CruiseControl; ._L9_CruiseControl; ._L6_CruiseControl; ._L8_CruiseControl; ._L13_CruiseControl}} +[inout] Out (internal) for function ThrottleRegulation: + tmp; __retres; + S__C_[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._O0_Throttle; ._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl; .HoldIntegralAction; ._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl; ._L21_CruiseControl; ._M_init_0_CruiseControl; ._C0_SaturateThrottle} +[inout] Inputs for function ThrottleRegulation: + ZeroSpeed; ZeroPercent; Kp; Ki; RegThrottleMax; + S__C_{[0]._C4_ThrottleCmd._C0_ThrottleRegulation{._I0_Reset; ._I1_CruiseSpeed; ._I2_VehiculeSpeed}; + [0]._C4_ThrottleCmd._C0_ThrottleRegulation{._L1_CruiseControl; ._L2_CruiseControl; ._L3_CruiseControl; ._L6_CruiseControl; .ProportionnalAction; ._L22_CruiseControl; .HoldIntegralAction; ._L16_CruiseControl; ._L23_CruiseControl; ._L18_CruiseControl; ._L10_CruiseControl; ._L8_CruiseControl; .IntegralAction; ._L4_CruiseControl; ._L13_CruiseControl; ._L14_CruiseControl; ._L19_CruiseControl; ._L21_CruiseControl; ._M_init_0_CruiseControl; ._C0_SaturateThrottle}} +[inout] Out (internal) for function ThrottleCmd: + tmp; __retres; + S__C_[0]._C4_ThrottleCmd{._O0_Throttle; ._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge; ._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl; ._M_init_0_CruiseControl; ._C0_ThrottleRegulation; ._M_condact_2_CruiseControl} +[inout] Inputs for function ThrottleCmd: + ZeroSpeed; ZeroPercent; Kp; Ki; RegThrottleMax; + S__C_{[0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator}; + [0]._C4_ThrottleCmd{._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge; ._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl; ._M_init_0_CruiseControl; ._C0_ThrottleRegulation}} +[inout] Out (internal) for function CruiseControl: + tmp; tmp_0; tmp_1; tmp_2; tmp_3; __retres; + S__C_[0]{._O0_Cruise_speed; ._O1_Throttle_cmd; ._O2_Regul_ON; ._O3_Regul_OFF; ._O4_Regul_STDBY; ._L73_CruiseControl; ._L59_CruiseControl; ._L62_CruiseControl; .BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl; ._L95_CruiseControl; .SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl; ._L96_CruiseControl; ._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl; ._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl; ._M_init_CruiseControl; ._C0_CruiseSpeedMgt; ._C1_DetectPedalsPressed; ._C2_DetectSpeedLimits; ._C3_CruiseStateMgt; ._M_condact_0_CruiseControl; ._C4_ThrottleCmd} +[inout] Inputs for function CruiseControl: + ZeroSpeed; SpeedInc; SpeedMax; SpeedMin; ZeroPercent; Kp; Ki; + RegThrottleMax; + S__C_{[0]{._I0_On; ._I1_Off; ._I2_Resume; ._I3_Set; ._I4_QuickAccel; ._I5_QuickDecel; ._I6_Accel; ._I7_Brake; ._I8_Speed}; + [0]{._L73_CruiseControl; ._L59_CruiseControl; ._L62_CruiseControl; .BrakePressed; .AcceleratorPressed; ._L61_CruiseControl; ._L60_CruiseControl; ._L58_CruiseControl; ._L95_CruiseControl; .SpeedOutOffLimits; ._L82_CruiseControl; ._L83_CruiseControl; ._L84_CruiseControl; ._L19_CruiseControl; ._L96_CruiseControl; ._L38_CruiseControl; ._L39_CruiseControl; ._L40_CruiseControl; ._L23_CruiseControl; .CruiseSpeed; ._L26_CruiseControl; ._L22_CruiseControl; ._M_init_CruiseControl; ._C0_CruiseSpeedMgt; ._C1_DetectPedalsPressed; ._C2_DetectSpeedLimits; ._C3_CruiseStateMgt}; + [0]._C4_ThrottleCmd{._I0_Regul_ON; ._I1_CruiseSpeed; ._I2_VehiculeSpeed; ._I3_Accelerator; ._O0_Throttle; ._L21_CruiseControl; ._L20_CruiseControl; ._L22_CruiseControl; .ONRisingEdge; ._L26_CruiseControl; ._L1_CruiseControl; ._L2_CruiseControl; ._L19_CruiseControl; ._L25_CruiseControl; ._L24_CruiseControl; ._M_init_0_CruiseControl; ._C0_ThrottleRegulation}} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/dangling.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/dangling.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/dangling.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/dangling.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,34 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/dangling.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] +tests/misc/dangling.i:9:[value] warning: locals {v_0} escaping the scope of a block of main through x +tests/misc/dangling.i:15:[value] Assertion got status unknown. +tests/misc/dangling.i:16:[value] Assertion got status valid. +tests/misc/dangling.i:19:[kernel] warning: accessing left-value that contains escaping addresses: + assert ¬\dangling(&x); +tests/misc/dangling.i:23:[value] Assertion got status unknown. +tests/misc/dangling.i:24:[kernel] warning: accessing left-value that contains escaping addresses: + assert ¬\dangling(&x); +tests/misc/dangling.i:24:[kernel] warning: completely indeterminate value in x. +[value] Recording results for main +[value] done for function main +tests/misc/dangling.i:24:[value] Assertion 'Value,dangling_pointer' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + x ∈ {{ &y }} or ESCAPINGADDR + y ∈ {1} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + x; y; i; j; j_0 +[inout] Inputs for function main: + v diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/dataflow_order.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/dataflow_order.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/dataflow_order.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/dataflow_order.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,336 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/dataflow_order.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + c ∈ [--..--] + j ∈ {0} + k ∈ {0} +tests/misc/dataflow_order.i:17:[value] entering loop for the first time +[value] Called Frama_C_show_each_1({0}, {0}) +[value] Called Frama_C_show_each_then({1}, {0}) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else({1}, {0}) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1({0; 1}, {0; 1}) +[value] Called Frama_C_show_each_then({1; 2}, {0; 1}) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else({1; 2}, {0; 1}) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1({0; 1; 2}, {0; 1; 2}) +[value] Called Frama_C_show_each_then({1; 2; 3}, {0; 1; 2}) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else({1; 2; 3}, {0; 1; 2}) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1({0; 1; 2; 3}, {0; 1; 2; 3}) +[value] Called Frama_C_show_each_then({1; 2; 3; 4}, {0; 1; 2; 3}) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else({1; 2; 3; 4}, {0; 1; 2; 3}) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1({0; 1; 2; 3; 4}, {0; 1; 2; 3; 4}) +[value] Called Frama_C_show_each_then({1; 2; 3; 4; 5}, {0; 1; 2; 3; 4}) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else({1; 2; 3; 4; 5}, {0; 1; 2; 3; 4}) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..15], {0; 1; 2; 3; 4; 5}) +[value] Called Frama_C_show_each_then([1..16], {0; 1; 2; 3; 4; 5}) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..16], {0; 1; 2; 3; 4; 5}) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..16], {0; 1; 2; 3; 4; 5; 6}) +[value] Called Frama_C_show_each_then([1..17], {0; 1; 2; 3; 4; 5; 6}) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..17], {0; 1; 2; 3; 4; 5; 6}) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..127], {0; 1; 2; 3; 4; 5; 6; 7}) +[value] Called Frama_C_show_each_then([1..128], {0; 1; 2; 3; 4; 5; 6; 7}) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..128], {0; 1; 2; 3; 4; 5; 6; 7}) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..128], [0..8]) +[value] Called Frama_C_show_each_then([1..129], [0..8]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..129], [0..8]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..512], [0..9]) +[value] Called Frama_C_show_each_then([1..513], [0..9]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..513], [0..9]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..513], [0..10]) +[value] Called Frama_C_show_each_then([1..514], [0..10]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..514], [0..10]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..32767], [0..11]) +[value] Called Frama_C_show_each_then([1..32768], [0..11]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..32768], [0..11]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..32768], [0..12]) +[value] Called Frama_C_show_each_then([1..32769], [0..12]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..32769], [0..12]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..64999], [0..13]) +[value] Called Frama_C_show_each_then([1..65000], [0..13]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..65000], [0..13]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..64999], [0..14]) +[value] Called Frama_C_show_each_then([1..65000], [0..14]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..65000], [0..14]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..64999], [0..15]) +[value] Called Frama_C_show_each_then([1..65000], [0..15]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..65000], [0..15]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..64999], [0..16]) +[value] Called Frama_C_show_each_then([1..65000], [0..16]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..65000], [0..16]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..64999], [0..127]) +[value] Called Frama_C_show_each_then([1..65000], [0..127]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..65000], [0..127]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..64999], [0..128]) +[value] Called Frama_C_show_each_then([1..65000], [0..128]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..65000], [0..128]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..64999], [0..512]) +[value] Called Frama_C_show_each_then([1..65000], [0..512]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..65000], [0..512]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..64999], [0..513]) +[value] Called Frama_C_show_each_then([1..65000], [0..513]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..65000], [0..513]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..64999], [0..32767]) +[value] Called Frama_C_show_each_then([1..65000], [0..32767]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..65000], [0..32767]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..64999], [0..32768]) +[value] Called Frama_C_show_each_then([1..65000], [0..32768]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..65000], [0..32768]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..64999], [0..2147483647]) +[value] Called Frama_C_show_each_then([1..65000], [0..2147483647]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..65000], [0..2147483647]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..64999], [0..2147483648]) +[value] Called Frama_C_show_each_then([1..65000], [0..2147483648]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..65000], [0..2147483648]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_1([0..64999], [0..4294967295]) +[value] Called Frama_C_show_each_then([1..65000], [0..4294967295]) +[value] computing for function f <- main. + Called from tests/misc/dataflow_order.i:22. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_else([1..65000], [0..4294967295]) +[value] computing for function g <- main. + Called from tests/misc/dataflow_order.i:25. +[value] Recording results for g +[value] Done for function g +[value] Called Frama_C_show_each_end() +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + j ∈ [--..--] +[value] Values at end of function g: + k ∈ [--..--] +[value] Values at end of function main: + j ∈ [--..--] + k ∈ [--..--] + i ∈ {65000} +[from] Computing for function f +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + j FROM j +[from] Function g: + k FROM k +[from] Function main: + j FROM c; j (and SELF) + k FROM c; k (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + j +[inout] Inputs for function f: + j +[inout] Out (internal) for function g: + k +[inout] Inputs for function g: + k +[inout] Out (internal) for function main: + j; k; i +[inout] Inputs for function main: + c; j; k diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/dead_code2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/dead_code2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/dead_code2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/dead_code2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/dead_code2.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + G ∈ {0} + i ∈ {1} + l ∈ {17} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + G FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + G; i; l +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/dead_code.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/dead_code.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/dead_code.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/dead_code.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/dead_code.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {1} + j ∈ {17} + l ∈ {17} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; j; l +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/dead_inout.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/dead_inout.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/dead_inout.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/dead_inout.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,100 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/dead_inout.i (no preprocessing) +[value] Analyzing a complete application starting at main_all +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} +[value] computing for function main <- main_all. + Called from tests/misc/dead_inout.i:40. +[value] computing for function f <- main <- main_all. + Called from tests/misc/dead_inout.i:18. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main <- main_all. + Called from tests/misc/dead_inout.i:19. +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] Done for function main +[value] computing for function main2 <- main_all. + Called from tests/misc/dead_inout.i:41. +[value] computing for function f2 <- main2 <- main_all. + Called from tests/misc/dead_inout.i:33. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f2 <- main2 <- main_all. + Called from tests/misc/dead_inout.i:34. +[value] Recording results for f2 +[value] Done for function f2 +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main_all +[value] done for function main_all +[inout] Out (internal) for function f: + a +[inout] Inputs for function f: + b +[inout] InOut (internal) for function f: + Operational inputs: + b + Operational inputs on termination: + b + Sure outputs: + a +[inout] Out (internal) for function f2: + x; y +[inout] Inputs for function f2: + \nothing +[inout] InOut (internal) for function f2: + Operational inputs: + v; p; q + Operational inputs on termination: + v; p; q + Sure outputs: + \nothing +[inout] Out (internal) for function g: + x +[inout] Inputs for function g: + \nothing +[inout] InOut (internal) for function g: + Operational inputs: + \nothing + Operational inputs on termination: + \nothing + Sure outputs: + x +[inout] Out (internal) for function main: + a +[inout] Inputs for function main: + b +[inout] InOut (internal) for function main: + Operational inputs: + b + Operational inputs on termination: + b + Sure outputs: + a +[inout] Out (internal) for function main2: + x; y +[inout] Inputs for function main2: + \nothing +[inout] InOut (internal) for function main2: + Operational inputs: + \nothing + Operational inputs on termination: + \nothing + Sure outputs: + x; y +[inout] Out (internal) for function main_all: + a +[inout] Inputs for function main_all: + b +[inout] InOut (internal) for function main_all: + Operational inputs: + b + Operational inputs on termination: + b + Sure outputs: + a diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/dead_statuses.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/dead_statuses.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/dead_statuses.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/dead_statuses.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,141 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/dead_statuses.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/misc/dead_statuses.i:9. +[value] using specification for function f +tests/misc/dead_statuses.i:5:[value] Function f: precondition got status valid. +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/dead_statuses.i:11. +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + +[from] Computing for function main +[from] Computing for function f <-main +[from] Done for function f +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'Frama_C_bzero' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file share/libc/__fc_builtin_for_normalization.i, line 32) + Unverifiable but considered Valid. +[ Valid ] Pre-condition (file share/libc/__fc_builtin_for_normalization.i, line 30) + by Call Preconditions. +[ Extern ] Assigns (file share/libc/__fc_builtin_for_normalization.i, line 31) + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/__fc_builtin_for_normalization.i, line 31) + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Valid ] Pre-condition (file tests/misc/dead_statuses.i, line 5) + by Call Preconditions. +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Dead ] Post-condition for 'Frama_C_implicit_init' (file tests/misc/dead_statuses.i, line 14) at block + Locally valid, but unreachable. + By Frama-C kernel because: + - Unreachable block (after it) + By Value because: + - Unreachable block (after it) +[ Dead ] Post-condition for 'Frama_C_implicit_init' (file tests/misc/dead_statuses.i, line 14) at block + Locally valid, but unreachable. + By Frama-C kernel because: + - Unreachable block (after it) + By Value because: + - Unreachable block (after it) +[ Dead ] Pre-condition (file tests/misc/dead_statuses.i, line 18) at instruction (file tests/misc/dead_statuses.i, line 19) + Locally valid, but unreachable. + By Value because: + - Unreachable instruction (file tests/misc/dead_statuses.i, line 19) +[ Dead ] Assigns for 'Frama_C_implicit_init' (file tests/misc/dead_statuses.i, line 14) at block + Locally valid, but unreachable. + By Frama-C kernel because: + - Unreachable block (after it) + By Value because: + - Unreachable block (after it) +[ Dead ] Assertion (file tests/misc/dead_statuses.i, line 15) + Locally valid, but unreachable. + By Value because: + - Unreachable program point (file tests/misc/dead_statuses.i, line 15) +[ Dead ] Invariant (file tests/misc/dead_statuses.i, line 16) + Locally valid, but unreachable. + By Value because: + - Unreachable loop (file tests/misc/dead_statuses.i, line 17) +[ Dead ] Behavior 'Frama_C_implicit_init' at block + Locally valid, but unreachable. + By Frama-C kernel because: + - Unreachable block (after it) +[ Valid ] Default behavior at instruction (file tests/misc/dead_statuses.i, line 19) + by Frama-C kernel. +[Unreachable] Unreachable call 'f' (file tests/misc/dead_statuses.i, line 13) + by Value. +[Unreachable] Unreachable block (after it) + by Value. +[Unreachable] Unreachable call 'Frama_C_bzero' (file tests/misc/dead_statuses.i, line 14) + by Value. +[Unreachable] Unreachable program point (file tests/misc/dead_statuses.i, line 15) + by Value. +[Unreachable] Unreachable loop (file tests/misc/dead_statuses.i, line 17) + by Value. +[Unreachable] Unreachable instruction (file tests/misc/dead_statuses.i, line 19) + by Value. +[ Valid ] Instance of 'Pre-condition (file tests/misc/dead_statuses.i, line 5)' at call 'f' (file tests/misc/dead_statuses.i, line 9) + + by Value. +[ Valid ] Instance of 'Pre-condition (file tests/misc/dead_statuses.i, line 5)' at call 'f' (file tests/misc/dead_statuses.i, line 11) + + by Value. +[ Dead ] Instance of 'Pre-condition (file tests/misc/dead_statuses.i, line 5)' at call 'f' (file tests/misc/dead_statuses.i, line 13) + + Locally valid, but unreachable. + By Value because: + - Unreachable call 'f' (file tests/misc/dead_statuses.i, line 13) +[ Dead ] Instance of 'Pre-condition (file share/libc/__fc_builtin_for_normalization.i, line 30)' at call 'Frama_C_bzero' (file tests/misc/dead_statuses.i, line 14) + + Locally valid, but unreachable. + By Value because: + - Unreachable call 'Frama_C_bzero' (file tests/misc/dead_statuses.i, line 14) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 7 Completely validated + 4 Considered valid + 9 Dead properties + 6 Unreachable + 26 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/debug_category.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/debug_category.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/debug_category.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/debug_category.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,11 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/debug_category.i (no preprocessing) +[test:a] A is enabled +[test:a:b] B is enabled +[test:a:b:c] C is enabled +[test:a] A is enabled +[test:a:b] B is enabled +[test:a:b:c] C is enabled +[test:a] A is enabled +[test:a:b] B is enabled +[test:a:b:c] C is enabled diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/debug_category.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/debug_category.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/debug_category.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/debug_category.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,5 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/debug_category.i (no preprocessing) +[test:a] A is enabled +[test:a] A is enabled +[test:a] A is enabled diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/debug_category.3.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/debug_category.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/debug_category.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/debug_category.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,8 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/debug_category.i (no preprocessing) +[test:a] A is enabled +[test:a:b:c] C is enabled +[test:a] A is enabled +[test:a:b:c] C is enabled +[test:a] A is enabled +[test:a:b:c] C is enabled diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/debug_category.4.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/debug_category.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/debug_category.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/debug_category.4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,8 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/debug_category.i (no preprocessing) +[test:a:b:c] C is enabled +[test:d] D is enabled +[test:a:b:c] C is enabled +[test:d] D is enabled +[test:a:b:c] C is enabled +[test:d] D is enabled diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/debug_category.5.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/debug_category.5.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/debug_category.5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/debug_category.5.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,14 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/debug_category.i (no preprocessing) +[test:a] A is enabled +[test:a:b] B is enabled +[test:a:b:c] C is enabled +[test:d] D is enabled +[test:a] A is enabled +[test:a:b] B is enabled +[test:a:b:c] C is enabled +[test:d] D is enabled +[test:a] A is enabled +[test:a:b] B is enabled +[test:a:b:c] C is enabled +[test:d] D is enabled diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/debug_category.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/debug_category.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/debug_category.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/debug_category.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,7 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/debug_category.i (no preprocessing) +[test] Available message categories are: + a + a:b + a:b:c + d diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/deep_conditionals.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/deep_conditionals.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/deep_conditionals.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/deep_conditionals.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,24 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/deep_conditionals.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + X ∈ {33} + Y ∈ {77} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + X; Y; tmp +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/degeneration2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/degeneration2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/degeneration2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/degeneration2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,70 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/degeneration2.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] +tests/misc/degeneration2.i:14:[kernel] warning: accessing uninitialized left-value: assert \initialized(&A); +tests/misc/degeneration2.i:14:[kernel] warning: signed overflow. assert -2147483648 ≤ -((int)A) ≤ 2147483647; +tests/misc/degeneration2.i:14:[value] Assigning imprecise value to A. + The imprecision originates from Arithmetic {tests/misc/degeneration2.i:14} +tests/misc/degeneration2.i:16:[value] entering loop for the first time +tests/misc/degeneration2.i:17:[value] Reading left-value A. + It contains a garbled mix of {B} because of Arithmetic + {tests/misc/degeneration2.i:14}. +tests/misc/degeneration2.i:17:[kernel] warning: accessing uninitialized left-value: assert \initialized((int *)A); +tests/misc/degeneration2.i:17:[kernel] warning: out of bounds read. assert \valid_read((int *)A); +tests/misc/degeneration2.i:17:[value] Reading left-value *((int *)A). + The location is {{ B -> {0} }}. + It contains a garbled mix of {C} because of Misaligned + {tests/misc/degeneration2.i:17}. +tests/misc/degeneration2.i:17:[value] Assigning imprecise value to A. + The imprecision originates from Misaligned {tests/misc/degeneration2.i:17} +tests/misc/degeneration2.i:17:[value] Reading left-value A. + It contains a garbled mix of {B; C} because of Misaligned + {tests/misc/degeneration2.i:17}. +tests/misc/degeneration2.i:17:[value] Reading left-value *((int *)A). + The location is {{ B -> {0}; C -> {0} }}. + It contains a garbled mix of {C; D} because of Misaligned + {tests/misc/degeneration2.i:17}. +tests/misc/degeneration2.i:17:[value] Reading left-value A. + It contains a garbled mix of {B; C; D} because of Misaligned + {tests/misc/degeneration2.i:17}. +tests/misc/degeneration2.i:17:[value] Reading left-value *((int *)A). + The location is {{ B -> {0}; C -> {0}; D -> {0} }}. + It contains a garbled mix of {C; D; E} because of Misaligned + {tests/misc/degeneration2.i:17}. +tests/misc/degeneration2.i:17:[value] Reading left-value A. + It contains a garbled mix of {B; C; D; E} because of Misaligned + {tests/misc/degeneration2.i:17}. +tests/misc/degeneration2.i:17:[value] Reading left-value *((int *)A). + The location is {{ B -> {0}; C -> {0}; D -> {0}; E -> {0} }}. + It contains a garbled mix of {C; D; E} because of Misaligned + {tests/misc/degeneration2.i:17}. +tests/misc/degeneration2.i:25:[kernel] warning: accessing out of bounds index [0..10]. assert x < 10; +tests/misc/degeneration2.i:25:[kernel] warning: accessing uninitialized left-value: assert \initialized(&offset_uninit); +tests/misc/degeneration2.i:25:[kernel] warning: completely indeterminate value in offset_uninit. +[value] Recording results for main +[value] done for function main +tests/misc/degeneration2.i:25:[value] Assertion 'Value,initialisation' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + A ∈ + {{ garbled mix of &{B; C; D; E} + (origin: Misaligned {tests/misc/degeneration2.i:17}) }} + B ∈ {{ (void *)&C }} or UNINITIALIZED + C ∈ {{ (void *)&D }} or UNINITIALIZED + D ∈ {{ (void *)&E }} or UNINITIALIZED + x ∈ [0..10] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + A; B; C; D; x; tmp; tmp_0; vv +[inout] Inputs for function main: + v diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/deps.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/deps.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/deps.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/deps.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/deps.i (no preprocessing) +[value] Analyzing a complete application starting at fonc1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/deps.i:17:[kernel] warning: signed overflow. assert -2147483648 ≤ a+b ≤ 2147483647; +tests/misc/deps.i:24:[kernel] warning: signed overflow. assert -2147483648 ≤ w+v2.x ≤ 2147483647; +tests/misc/deps.i:24:[kernel] warning: signed overflow. assert -2147483648 ≤ (int)(w+v2.x)+v3.x ≤ 2147483647; +[value] Recording results for fonc1 +[value] done for function fonc1 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function fonc1: + w ∈ [--..--] + v1.x ∈ [--..--] + .y ∈ UNINITIALIZED +[from] Computing for function fonc1 +[from] Done for function fonc1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function fonc1: + \result FROM a; b +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function fonc1: + w; v1.x; v2.x; v3.x +[inout] Inputs for function fonc1: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/deps.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/deps.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/deps.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/deps.2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/deps.i (no preprocessing) +[value] Analyzing a complete application starting at fonc2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/deps.i:32:[kernel] warning: signed overflow. assert -2147483648 ≤ a+b ≤ 2147483647; +[value] Recording results for fonc2 +[value] done for function fonc2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function fonc2: + w ∈ [--..--] + v1.x ∈ [--..--] + .y ∈ UNINITIALIZED +[from] Computing for function fonc2 +[from] Done for function fonc2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function fonc2: + \result FROM a; b +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function fonc2: + w; v1.x +[inout] Inputs for function fonc2: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/deps_addr.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/deps_addr.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/deps_addr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/deps_addr.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/deps_addr.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t ∈ {0} + a ∈ {0} + tt[0..4][0..4] ∈ {0} +tests/misc/deps_addr.i:6:[value] warning: Operation {0} + {{ &a }} incurs a loss of precision +tests/misc/deps_addr.i:6:[kernel] warning: out of bounds read. assert \valid_read(t+(int)(&a)); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM t; a +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + __retres +[inout] Inputs for function main: + t; a diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/deps_compose.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/deps_compose.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/deps_compose.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/deps_compose.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,86 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/deps_compose.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + c ∈ {1} + z ∈ {0} + x1 ∈ {0} + y1 ∈ {0} + x2 ∈ {0} + y2 ∈ {0} + x3 ∈ {0} + y3 ∈ {0} + x4 ∈ {0} + y4 ∈ {0} + x5 ∈ {0} + y5 ∈ {0} + x6 ∈ {0} + y6 ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/deps_compose.i:17. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/deps_compose.i:26. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + x1 ∈ {0} + x2 ∈ {0} + x3 ∈ {0} + x4 ∈ {0} + x5 ∈ {0} + x6 ∈ {0} +[value] Values at end of function main: + x1 ∈ {0} + y1 ∈ {0} + x2 ∈ {0} + y2 ∈ {0} + x3 ∈ {0} + y3 ∈ {0} + x4 ∈ {0} + y4 ∈ {0} + x5 ∈ {0} + y5 ∈ {0} + x6 ∈ {0} + y6 ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + x1 FROM c; y1 + x2 FROM c; y2 + x3 FROM c; y3 + x4 FROM c; y4 + x5 FROM c; y5 + x6 FROM c; y6 +[from] Function main: + x1 FROM c; z + y1 FROM z + x2 FROM c; z + y2 FROM z + x3 FROM c; z + y3 FROM z + x4 FROM c; z + y4 FROM z + x5 FROM c; z + y5 FROM z + x6 FROM c; z + y6 FROM z +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + x1; x2; x3; x4; x5; x6 +[inout] Inputs for function f: + c; y1; y2; y3; y4; y5; y6 +[inout] Out (internal) for function main: + x1; y1; x2; y2; x3; y3; x4; y4; x5; y5; x6; y6 +[inout] Inputs for function main: + c; z; y1; y2; y3; y4; y5; y6 diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/deps_local.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/deps_local.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/deps_local.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/deps_local.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,75 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/deps_local.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + H ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/deps_local.i:22. +[value] computing for function h <- f <- main. + Called from tests/misc/deps_local.i:17. +[value] Recording results for h +[value] Done for function h +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/deps_local.i:23. +[value] computing for function h <- g <- main. + Called from tests/misc/deps_local.i:11. +[value] Recording results for h +[value] Done for function h +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function h: + ga ∈ {0} or UNINITIALIZED + fa ∈ {0} or UNINITIALIZED +[value] Values at end of function f: + fa ∈ {0} + __retres ∈ {0} +[value] Values at end of function g: + ga ∈ {0} + __retres ∈ {0} +[value] Values at end of function main: + __retres ∈ {0} +[from] Computing for function h +[from] Done for function h +[from] Computing for function f +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function h: + ga FROM H; argh (and SELF) + fa FROM H; argh (and SELF) + \result FROM H +[from] Function f: + \result FROM \nothing +[from] Function g: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function h: + ga; fa +[inout] Inputs for function h: + H +[inout] Out (internal) for function f: + fa; __retres +[inout] Inputs for function f: + H +[inout] Out (internal) for function g: + ga; __retres +[inout] Inputs for function g: + H +[inout] Out (internal) for function main: + __retres +[inout] Inputs for function main: + H diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/deps_mixed.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/deps_mixed.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/deps_mixed.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/deps_mixed.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,74 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/deps_mixed.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + p ∈ {0} + q ∈ {0} + a ∈ {0} + b ∈ {0} + r ∈ {2} + s ∈ {0} + t[0] ∈ {{ &f }} + [1] ∈ {{ &g }} +tests/misc/deps_mixed.i:20:[value] warning: Operation {{ NULL + {3} ; &a }} + {{ NULL + {2} ; &b }} incurs a loss of precision +tests/misc/deps_mixed.i:20:[kernel] warning: out of bounds read. assert \valid_read(p+(int)q); +tests/misc/deps_mixed.i:22:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. assert 0 ≤ i0 < 2; +[value] computing for function f <- main. + Called from tests/misc/deps_mixed.i:22. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/deps_mixed.i:22. +[value] Recording results for g +[value] Done for function g +tests/misc/deps_mixed.i:24:[value] warning: Operation {{ NULL + {3} ; &a }} + {{ NULL + {2} ; &b }} incurs a loss of precision +tests/misc/deps_mixed.i:24:[value] Assigning imprecise value to __retres. + The imprecision originates from Arithmetic {tests/misc/deps_mixed.i:24} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + +[value] Values at end of function g: + +[value] Values at end of function main: + p ∈ {{ NULL + {3} ; &a }} + q ∈ {{ NULL + {2} ; &b }} + r ∈ {0} + s ∈ [--..--] + __retres ∈ + {{ garbled mix of &{a; b} + (origin: Arithmetic {tests/misc/deps_mixed.i:24}) }} +[from] Computing for function f +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM x +[from] Function g: + \result FROM y +[from] Function main: + p FROM c + q FROM d + r FROM a; b; c; d + s FROM t[0..1]; i0; i1; i2 + \result FROM c; d +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + \nothing +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function g: + \nothing +[inout] Inputs for function g: + \nothing +[inout] Out (internal) for function main: + p; q; r; s; __retres +[inout] Inputs for function main: + p; q; a; b; t[0..1] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/deps.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/deps.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/deps.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/deps.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/deps.i (no preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + b ∈ [--..--] +[from] Computing for function f +[from] Done for function f +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + b +[inout] Inputs for function f: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/deps_unitialized_locals.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/deps_unitialized_locals.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/deps_unitialized_locals.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/deps_unitialized_locals.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,104 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/deps_unitialized_locals.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + maybe ∈ [--..--] + v1 ∈ {0} + v2 ∈ {0} + v ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/deps_unitialized_locals.i:33. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/deps_unitialized_locals.i:36. +[value] Recording results for g +[from] Computing for function g +[from] Done for function g +[value] Done for function g +[value] computing for function h <- main. + Called from tests/misc/deps_unitialized_locals.i:39. +[value] Recording results for h +[from] Computing for function h +[from] Done for function h +[value] Done for function h +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + v1.ts ∈ {1} + .[bits 16 to 31] ∈ UNINITIALIZED + .ti ∈ {2} + ty.ts ∈ {1} + .[bits 16 to 31] ∈ UNINITIALIZED + .ti ∈ {2} +[value] Values at end of function g: + v ∈ {1} or UNINITIALIZED + i ∈ {1} or UNINITIALIZED +[value] Values at end of function h: + v ∈ {1} + i ∈ {1} +[value] Values at end of function main: + v1.ts ∈ {1} + .[bits 16 to 31] ∈ UNINITIALIZED + .ti ∈ {2} + v2.ts ∈ {1} + .[bits 16 to 31] ∈ UNINITIALIZED + .ti ∈ {2} + v ∈ {1} + x ∈ {1} +[from] Computing for function f +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] Computing for function h +[from] Done for function h +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + v1 FROM \nothing +[from] Function g: + v FROM maybe +[from] Function h: + v FROM maybe; i +[from] Function main: + v1 FROM \nothing + v2 FROM \nothing + v FROM maybe +[from] ====== END OF DEPENDENCIES ====== +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f at tests/misc/deps_unitialized_locals.i:33 (by main): + v1 FROM \nothing +[from] call to g at tests/misc/deps_unitialized_locals.i:36 (by main): + v FROM maybe +[from] call to h at tests/misc/deps_unitialized_locals.i:39 (by main): + v FROM maybe; i +[from] entry point: + v1 FROM \nothing + v2 FROM \nothing + v FROM maybe +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[inout] Out (internal) for function f: + v1; ty{.ts; .ti} +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function g: + v; i +[inout] Inputs for function g: + maybe +[inout] Out (internal) for function h: + v; i +[inout] Inputs for function h: + maybe +[inout] Out (internal) for function main: + v1; v2; v; x +[inout] Inputs for function main: + maybe; v1 diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/deref.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/deref.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/deref.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/deref.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,30 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/deref.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} + c ∈ {0} + d ∈ {0} + e ∈ {0} + p ∈ {0} + t[0..9] ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + p ∈ {{ &a }} + i ∈ {0} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + p FROM \nothing + \result FROM a; b; c; d; t[0] +[from] ====== END OF DEPENDENCIES ====== +[inout] Derefs for function main: + a; d diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/disjoint_status.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/disjoint_status.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/disjoint_status.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/disjoint_status.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,93 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/disjoint_status.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} +tests/misc/disjoint_status.i:13:[value] Function main: precondition got status unknown. +tests/misc/disjoint_status.i:14:[value] Function main: precondition got status unknown. +[value] computing for function f <- main. + Called from tests/misc/disjoint_status.i:18. +tests/misc/disjoint_status.i:6:[value] Function f: precondition 'ReqTrue' got status valid. +tests/misc/disjoint_status.i:8:[value] Assertion 'A1' got status invalid (stopping propagation). +tests/misc/disjoint_status.i:6:[value] Function f: no state left in which to evaluate postcondition, status 'PostTrue' not computed. +[value] Recording results for f +[value] Done for function f +tests/misc/disjoint_status.i:19:[value] Assertion got status unknown. +[value] computing for function f <- main. + Called from tests/misc/disjoint_status.i:20. +tests/misc/disjoint_status.i:8:[value] Assertion 'A1' got status valid. +tests/misc/disjoint_status.i:9:[value] Assertion 'A2' got status valid. +tests/misc/disjoint_status.i:6:[value] Function f: postcondition 'PostTrue' got status valid. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + x ∈ {0} +[value] Values at end of function main: + x ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + x FROM c; d +[from] Function main: + x FROM c; d +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + x +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main: + x +[inout] Inputs for function main: + \nothing +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Valid ] Post-condition 'PostTrue' + by Value. +[ Valid ] Pre-condition 'ReqTrue' + by Call Preconditions. +[ - ] Assertion 'A1' (file tests/misc/disjoint_status.i, line 8) + tried with Value. +[ Valid ] Assertion 'A2' (file tests/misc/disjoint_status.i, line 9) + by Value. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Pre-condition (file tests/misc/disjoint_status.i, line 13) + tried with Value. +[ - ] Pre-condition (file tests/misc/disjoint_status.i, line 14) + tried with Value. +[ - ] Assertion (file tests/misc/disjoint_status.i, line 19) + tried with Value. +[ Valid ] Default behavior + by Frama-C kernel. +[ Valid ] Instance of 'Pre-condition 'ReqTrue'' at call 'f' (file tests/misc/disjoint_status.i, line 18) + + by Value. +[ Valid ] Instance of 'Pre-condition 'ReqTrue'' at call 'f' (file tests/misc/disjoint_status.i, line 20) + + by Value. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 7 Completely validated + 4 To be validated + 11 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/div.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/div.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/div.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/div.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,94 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/div.i (no preprocessing) +[rte] annotating function main +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {0} + Y ∈ {0} + Z1 ∈ {0} + Z2 ∈ {0} + T ∈ {0} + U1 ∈ {0} + U2 ∈ {0} + V ∈ {0} + W1 ∈ {0} + W2 ∈ {0} + a ∈ {0} + b ∈ {0} + d1 ∈ {0} + d2 ∈ {0} + d0 ∈ {0} + e ∈ {0} + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3..4] ∈ {0} + p ∈ {0} +tests/misc/div.i:14:[value] entering loop for the first time +tests/misc/div.i:14:[value] Assertion 'rte,signed_overflow' got status unknown. +tests/misc/div.i:16:[value] Assertion 'rte,signed_overflow' got status valid. +tests/misc/div.i:17:[value] Assertion 'rte,signed_overflow' got status unknown. +tests/misc/div.i:17:[value] Assertion 'rte,signed_overflow' got status valid. +tests/misc/div.i:16:[value] Assertion 'rte,signed_overflow' got status unknown. +tests/misc/div.i:17:[value] Assertion 'rte,signed_overflow' got status unknown. +tests/misc/div.i:22:[value] Assertion 'rte,signed_overflow' got status valid. +tests/misc/div.i:25:[value] Assertion 'rte,signed_overflow' got status valid. +tests/misc/div.i:28:[value] Assertion 'rte,signed_overflow' got status valid. +tests/misc/div.i:32:[value] Assertion 'rte,division_by_zero' got status unknown. +tests/misc/div.i:33:[value] Assertion 'rte,division_by_zero' got status unknown. +tests/misc/div.i:33:[value] Assertion 'rte,signed_overflow' got status unknown. +tests/misc/div.i:33:[value] warning: Operation {{ &Z2 }} / [-25..66] incurs a loss of precision +tests/misc/div.i:33:[kernel] warning: signed overflow. assert -2147483648 ≤ (int)(&Z2)/Z2; +tests/misc/div.i:33:[value] Assigning imprecise value to b. + The imprecision originates from Arithmetic {tests/misc/div.i:33} +tests/misc/div.i:34:[value] Assertion 'rte,division_by_zero' got status valid. +tests/misc/div.i:34:[kernel] warning: pointer comparison: + assert \pointer_comparable((void *)0, (void *)((int)(&X+2))); +tests/misc/div.i:34:[value] warning: Operation {100} / {{ &X + {8} }} incurs a loss of precision +tests/misc/div.i:34:[kernel] warning: signed overflow. assert -2147483648 ≤ 100/(int)(&X+2) ≤ 2147483647; +tests/misc/div.i:34:[value] Assigning imprecise value to d2. + The imprecision originates from Arithmetic {tests/misc/div.i:34} +tests/misc/div.i:35:[value] Assertion 'rte,division_by_zero' got status valid. +tests/misc/div.i:35:[value] warning: Operation {100} / {{ &X + {4} }} incurs a loss of precision +tests/misc/div.i:35:[kernel] warning: signed overflow. assert -2147483648 ≤ 100/(int)(&X+1) ≤ 2147483647; +tests/misc/div.i:35:[value] Assigning imprecise value to d1. + The imprecision originates from Arithmetic {tests/misc/div.i:35} +tests/misc/div.i:36:[value] Assertion 'rte,division_by_zero' got status valid. +tests/misc/div.i:36:[value] warning: Operation {100} / {{ &X }} incurs a loss of precision +tests/misc/div.i:36:[kernel] warning: signed overflow. assert -2147483648 ≤ 100/(int)(&X) ≤ 2147483647; +tests/misc/div.i:36:[value] Assigning imprecise value to d0. + The imprecision originates from Arithmetic {tests/misc/div.i:36} +tests/misc/div.i:37:[value] Assertion 'rte,signed_overflow' got status unknown. +tests/misc/div.i:37:[kernel] warning: signed overflow. assert -2147483648 ≤ -((int)(&X)) ≤ 2147483647; +tests/misc/div.i:37:[value] Assigning imprecise value to e. + The imprecision originates from Arithmetic {tests/misc/div.i:37} +[value] Recording results for main +[value] done for function main +tests/misc/div.i:22:[value] Assertion 'rte,signed_overflow' got final status valid. +tests/misc/div.i:25:[value] Assertion 'rte,signed_overflow' got final status valid. +tests/misc/div.i:28:[value] Assertion 'rte,signed_overflow' got final status valid. +tests/misc/div.i:34:[value] Assertion 'rte,division_by_zero' got final status valid. +tests/misc/div.i:35:[value] Assertion 'rte,division_by_zero' got final status valid. +tests/misc/div.i:36:[value] Assertion 'rte,division_by_zero' got final status valid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + X ∈ [--..--] + Y ∈ [-126..333],9%27 + Z1 ∈ [-42..111],3%9 + Z2 ∈ [-25..66] + T ∈ [34..493],7%27 + U1 ∈ [11..164],2%9 + U2 ∈ [6..98] + V ∈ [-125..334],10%27 + W1 ∈ [-41..111] + W2 ∈ [-25..66] + a ∈ [-40000..40000] + b ∈ {{ garbled mix of &{Z2} (origin: Arithmetic {tests/misc/div.i:33}) }} + d1 ∈ {{ garbled mix of &{X} (origin: Arithmetic {tests/misc/div.i:35}) }} + d2 ∈ {{ garbled mix of &{X} (origin: Arithmetic {tests/misc/div.i:34}) }} + d0 ∈ {{ garbled mix of &{X} (origin: Arithmetic {tests/misc/div.i:36}) }} + e ∈ {{ garbled mix of &{X} (origin: Arithmetic {tests/misc/div.i:37}) }} + p ∈ {{ &t[3] }} + c ∈ [--..--] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/divneg.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/divneg.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/divneg.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/divneg.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,82 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/divneg.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ [--..--] + r0 ∈ {0} + r1 ∈ {6} + r2 ∈ {-8} + r6 ∈ {0} + r7 ∈ {0} + r8 ∈ {0} + r9 ∈ {0} + rn1 ∈ {5} + rn2 ∈ {0} + rn3 ∈ {0} + rn4 ∈ {-3} + rn5 ∈ {0} + vic ∈ {0} +[value] Called Frama_C_show_each([-185..-5],4%9, [1..61],1%3) +[value] DUMPING STATE of file tests/misc/divneg.i line 42 + i ∈ [-100..100] + r0 ∈ [-100..100],0%5 + r1 ∈ [1..96],1%5 + r2 ∈ [-100..100] + r6 ∈ {0} + r7 ∈ [-100..100] + r8 ∈ [-100..100] + r9 ∈ {0} + rn1 ∈ [-99..99],1%2 + rn2 ∈ [-100..100],0%2 + rn3 ∈ [-100..100],0%2 + rn4 ∈ [-99..99],1%2 + rn5 ∈ [-100..100] + vic ∈ {0} + c ∈ [-185..-5],4%9 + rc ∈ [-185..-5],4%9 or UNINITIALIZED + =END OF DUMP== +[value] Called Frama_C_show_each_should({-1}) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + r0 ∈ [-100..100],0%5 + r1 ∈ [1..96],1%5 + r2 ∈ [-100..100] + r7 ∈ [-100..100] + r8 ∈ [-100..100] + rn1 ∈ [-99..99],1%2 + rn2 ∈ [-100..100],0%2 + rn3 ∈ [-100..100],0%2 + rn4 ∈ [-99..99],1%2 + rn5 ∈ [-100..100] + vic ∈ {4294967295} + c ∈ [5..185],5%9 + rc ∈ [14..176],14%18 + __retres ∈ {0} +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + r0 FROM i (and SELF) + r1 FROM i (and SELF) + r2 FROM i (and SELF) + r7 FROM i (and SELF) + r8 FROM i (and SELF) + rn1 FROM i (and SELF) + rn2 FROM i (and SELF) + rn3 FROM i (and SELF) + rn4 FROM i (and SELF) + rn5 FROM i (and SELF) + vic FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + r0; r1; r2; r7; r8; rn1; rn2; rn3; rn4; rn5; vic; c; rc; __retres +[inout] Inputs for function main: + i; vic diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/div.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/div.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/div.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/div.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,107 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/div.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {0} + Y ∈ {0} + Z1 ∈ {0} + Z2 ∈ {0} + T ∈ {0} + U1 ∈ {0} + U2 ∈ {0} + V ∈ {0} + W1 ∈ {0} + W2 ∈ {0} + a ∈ {0} + b ∈ {0} + d1 ∈ {0} + d2 ∈ {0} + d0 ∈ {0} + e ∈ {0} + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3..4] ∈ {0} + p ∈ {0} +tests/misc/div.i:14:[value] entering loop for the first time +tests/misc/div.i:14:[kernel] warning: signed overflow. assert c+1 ≤ 2147483647; +tests/misc/div.i:17:[kernel] warning: signed overflow. assert c+2 ≤ 2147483647; +tests/misc/div.i:16:[kernel] warning: signed overflow. assert X+1 ≤ 2147483647; +tests/misc/div.i:17:[kernel] warning: signed overflow. assert -2147483648 ≤ X-1; +tests/misc/div.i:32:[kernel] warning: division by zero: assert Z2 ≢ 0; +tests/misc/div.i:33:[kernel] warning: division by zero: assert Z2 ≢ 0; +tests/misc/div.i:33:[value] warning: Operation {{ &Z2 }} / [-25..66] incurs a loss of precision +tests/misc/div.i:33:[kernel] warning: signed overflow. assert -2147483648 ≤ (int)(&Z2)/Z2 ≤ 2147483647; +tests/misc/div.i:33:[value] Assigning imprecise value to b. + The imprecision originates from Arithmetic {tests/misc/div.i:33} +tests/misc/div.i:34:[kernel] warning: pointer comparison: + assert \pointer_comparable((void *)0, (void *)((int)(&X+2))); +tests/misc/div.i:34:[kernel] warning: division by zero: assert (int)(&X+2) ≢ 0; +tests/misc/div.i:34:[value] warning: Operation {100} / {{ &X + {8} }} incurs a loss of precision +tests/misc/div.i:34:[kernel] warning: signed overflow. assert -2147483648 ≤ 100/(int)(&X+2) ≤ 2147483647; +tests/misc/div.i:34:[value] Assigning imprecise value to d2. + The imprecision originates from Arithmetic {tests/misc/div.i:34} +tests/misc/div.i:35:[value] warning: Operation {100} / {{ &X + {4} }} incurs a loss of precision +tests/misc/div.i:35:[kernel] warning: signed overflow. assert -2147483648 ≤ 100/(int)(&X+1) ≤ 2147483647; +tests/misc/div.i:35:[value] Assigning imprecise value to d1. + The imprecision originates from Arithmetic {tests/misc/div.i:35} +tests/misc/div.i:36:[value] warning: Operation {100} / {{ &X }} incurs a loss of precision +tests/misc/div.i:36:[kernel] warning: signed overflow. assert -2147483648 ≤ 100/(int)(&X) ≤ 2147483647; +tests/misc/div.i:36:[value] Assigning imprecise value to d0. + The imprecision originates from Arithmetic {tests/misc/div.i:36} +tests/misc/div.i:37:[kernel] warning: signed overflow. assert -2147483648 ≤ -((int)(&X)) ≤ 2147483647; +tests/misc/div.i:37:[value] Assigning imprecise value to e. + The imprecision originates from Arithmetic {tests/misc/div.i:37} +[value] Recording results for main +[value] done for function main +tests/misc/div.i:34:[value] Assertion 'Value,division_by_zero' got final status valid. +[scope:rm_asserts] removing 1 assertion(s) +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + X ∈ [--..--] + Y ∈ [-126..333],9%27 + Z1 ∈ [-42..111],3%9 + Z2 ∈ [-25..66] + T ∈ [34..493],7%27 + U1 ∈ [11..164],2%9 + U2 ∈ [6..98] + V ∈ [-125..334],10%27 + W1 ∈ [-41..111] + W2 ∈ [-25..66] + a ∈ [-40000..40000] + b ∈ {{ garbled mix of &{Z2} (origin: Arithmetic {tests/misc/div.i:33}) }} + d1 ∈ {{ garbled mix of &{X} (origin: Arithmetic {tests/misc/div.i:35}) }} + d2 ∈ {{ garbled mix of &{X} (origin: Arithmetic {tests/misc/div.i:34}) }} + d0 ∈ {{ garbled mix of &{X} (origin: Arithmetic {tests/misc/div.i:36}) }} + e ∈ {{ garbled mix of &{X} (origin: Arithmetic {tests/misc/div.i:37}) }} + p ∈ {{ &t[3] }} + c ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + X FROM X (and SELF) + Y FROM X + Z1 FROM X + Z2 FROM X + T FROM X + U1 FROM X + U2 FROM X + V FROM X + W1 FROM X + W2 FROM X + a FROM X + b FROM X + d1 FROM \nothing + d2 FROM \nothing + d0 FROM \nothing + e FROM \nothing + p FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + X; Y; Z1; Z2; T; U1; U2; V; W1; W2; a; b; d1; d2; d0; e; p; c +[inout] Inputs for function main: + X; Y; Z2; T; V diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/div_strange.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/div_strange.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/div_strange.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/div_strange.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/div_strange.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Called CEA_F({1073741823}) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + x ∈ {1073741823} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + x; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/dur.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/dur.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/dur.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/dur.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,330 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/dur.i (no preprocessing) +[value] Analyzing a complete application starting at F2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G1 ∈ {0} + G2 ∈ {0} + G3 ∈ [--..--] + G4{.M6; .M7; .M8; .M9; .M10; .M11; .M12; .M13; .M14; .M15; .M16; .M17; .M18; .M19; .M20; .M21; .M22; .M23; .M24; .M25; .M26[0..25]; .M27[0..12]; .M28[0..2]; .M29; .M30; .M31; .M32; .M33; .M34; .M35; .M36; .M37; .M38; .M39; .M40; .M41; .M42; .M43; .M44; .M45; .M46; .M47; .M48; .M49; .M50; .M51; .M52; .M53; .M54; .M55; .M56; .M57; .M58; .M59; .M60; .M61; .M62; .M63; .M64[0..26]; .M65[0..26]; .M66[0..47]; .M67[0..47]; .M68[0..47]; .M69[0..47]; .M70[0..47]; .M71[0..47]; .M72[0..47]; .M73[0..47]; .M74[0..9]} ∈ + [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + G5.M75 ∈ [--..--] + .[bits 16 to 31] ∈ UNINITIALIZED + .M76[0].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[0]{.M2; .M3} ∈ [--..--] + .M76[1].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[1]{.M2; .M3} ∈ [--..--] + .M76[2].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[2]{.M2; .M3} ∈ [--..--] + .M76[3].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[3]{.M2; .M3} ∈ [--..--] + .M76[4].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[4]{.M2; .M3} ∈ [--..--] + .M76[5].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[5]{.M2; .M3} ∈ [--..--] + .M76[6].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[6]{.M2; .M3} ∈ [--..--] + .M76[7].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[7]{.M2; .M3} ∈ [--..--] + .M76[8].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[8]{.M2; .M3} ∈ [--..--] + .M76[9].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[9]{.M2; .M3} ∈ [--..--] + .M76[10].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[10]{.M2; .M3} ∈ [--..--] + .M76[11].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[11]{.M2; .M3} ∈ [--..--] + .M76[12].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[12]{.M2; .M3} ∈ [--..--] + .M76[13].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[13]{.M2; .M3} ∈ [--..--] + .M76[14].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[14]{.M2; .M3} ∈ [--..--] + .M76[15].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[15]{.M2; .M3} ∈ [--..--] + .M76[16].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[16]{.M2; .M3} ∈ [--..--] + .M76[17].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[17]{.M2; .M3} ∈ [--..--] + .M76[18].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[18]{.M2; .M3} ∈ [--..--] + .M76[19].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[19]{.M2; .M3} ∈ [--..--] + .M76[20].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[20]{.M2; .M3} ∈ [--..--] + .M76[21].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[21]{.M2; .M3} ∈ [--..--] + .M76[22].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[22]{.M2; .M3} ∈ [--..--] + .M76[23].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[23]{.M2; .M3} ∈ [--..--] + .M76[24].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[24]{.M2; .M3} ∈ [--..--] + .M76[25].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[25]{.M2; .M3} ∈ [--..--] + .M76[26].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[26]{.M2; .M3} ∈ [--..--] + .M76[27].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[27]{.M2; .M3} ∈ [--..--] + .M76[28].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[28]{.M2; .M3} ∈ [--..--] + .M76[29].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[29]{.M2; .M3} ∈ [--..--] + .M76[30].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[30]{.M2; .M3} ∈ [--..--] + .M76[31].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[31]{.M2; .M3} ∈ [--..--] + .M76[32].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[32]{.M2; .M3} ∈ [--..--] + .M76[33].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[33]{.M2; .M3} ∈ [--..--] + .M76[34].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[34]{.M2; .M3} ∈ [--..--] + .M76[35].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[35]{.M2; .M3} ∈ [--..--] + .M76[36].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[36]{.M2; .M3} ∈ [--..--] + .M76[37].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[37]{.M2; .M3} ∈ [--..--] + .M76[38].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[38]{.M2; .M3} ∈ [--..--] + .M76[39].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[39]{.M2; .M3} ∈ [--..--] + .M76[40].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[40]{.M2; .M3} ∈ [--..--] + .M76[41].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[41]{.M2; .M3} ∈ [--..--] + .M76[42].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[42]{.M2; .M3} ∈ [--..--] + .M76[43].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[43]{.M2; .M3} ∈ [--..--] + .M76[44].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[44]{.M2; .M3} ∈ [--..--] + .M76[45].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[45]{.M2; .M3} ∈ [--..--] + .M76[46].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[46]{.M2; .M3} ∈ [--..--] + .M76[47].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[47]{.M2; .M3} ∈ [--..--] + .M76[48].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[48]{.M2; .M3} ∈ [--..--] + .M76[49].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[49]{.M2; .M3} ∈ [--..--] + .M76[50].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[50]{.M2; .M3} ∈ [--..--] + .M76[51].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[51]{.M2; .M3} ∈ [--..--] + .M76[52].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[52]{.M2; .M3} ∈ [--..--] + .M77.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M77{.M2; .M3} ∈ [--..--] + .M78.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M78{.M2; .M3} ∈ [--..--] + .M79.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M79{.M2; .M3} ∈ [--..--] + .M80.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M80{.M2; .M3} ∈ [--..--] + .M81.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M81{.M2; .M3} ∈ [--..--] + .M82.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M82{.M2; .M3} ∈ [--..--] + .M83.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M83{.M2; .M3} ∈ [--..--] + .M84.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M84{.M2; .M3} ∈ [--..--] + .M85.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M85{.M2; .M3} ∈ [--..--] + .M86.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M86{.M2; .M3} ∈ [--..--] + .M87.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M87{.M2; .M3} ∈ [--..--] + .M88.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M88{.M2; .M3} ∈ [--..--] + .M89.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + {.M89{.M2; .M3}; .M90[0..3]; .M91} ∈ [--..--] + .M92[0].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M92[0]{.M2; .M3} ∈ [--..--] + .M92[1].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M92[1]{.M2; .M3} ∈ [--..--] + .M92[2].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M92[2]{.M2; .M3} ∈ [--..--] + .M92[3].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M92[3]{.M2; .M3} ∈ [--..--] + .M92[4].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M92[4]{.M2; .M3} ∈ [--..--] + .M92[5].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + {.M92[5]{.M2; .M3}; .M93[0..4]} ∈ [--..--] + G6 ∈ [--..--] + G7[0..160] ∈ [--..--] +tests/misc/dur.i:167:[value] entering loop for the first time +[value] Recording results for F2 +[value] done for function F2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function F2: + G5.M75 ∈ [0..255] + .[bits 16 to 31] ∈ UNINITIALIZED + .M76[0].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[0]{.M2; .M3} ∈ [--..--] + .M76[1].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[1]{.M2; .M3} ∈ [--..--] + .M76[2].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[2]{.M2; .M3} ∈ [--..--] + .M76[3].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[3]{.M2; .M3} ∈ [--..--] + .M76[4].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[4]{.M2; .M3} ∈ [--..--] + .M76[5].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[5]{.M2; .M3} ∈ [--..--] + .M76[6].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[6]{.M2; .M3} ∈ [--..--] + .M76[7].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[7]{.M2; .M3} ∈ [--..--] + .M76[8].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[8]{.M2; .M3} ∈ [--..--] + .M76[9].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[9]{.M2; .M3} ∈ [--..--] + .M76[10].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[10]{.M2; .M3} ∈ [--..--] + .M76[11].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[11]{.M2; .M3} ∈ [--..--] + .M76[12].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[12]{.M2; .M3} ∈ [--..--] + .M76[13].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[13]{.M2; .M3} ∈ [--..--] + .M76[14].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[14]{.M2; .M3} ∈ [--..--] + .M76[15].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[15]{.M2; .M3} ∈ [--..--] + .M76[16].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[16]{.M2; .M3} ∈ [--..--] + .M76[17].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[17]{.M2; .M3} ∈ [--..--] + .M76[18].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[18]{.M2; .M3} ∈ [--..--] + .M76[19].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[19]{.M2; .M3} ∈ [--..--] + .M76[20].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[20]{.M2; .M3} ∈ [--..--] + .M76[21].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[21]{.M2; .M3} ∈ [--..--] + .M76[22].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[22]{.M2; .M3} ∈ [--..--] + .M76[23].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[23]{.M2; .M3} ∈ [--..--] + .M76[24].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[24]{.M2; .M3} ∈ [--..--] + .M76[25].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[25]{.M2; .M3} ∈ [--..--] + .M76[26].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[26]{.M2; .M3} ∈ [--..--] + .M76[27].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[27]{.M2; .M3} ∈ [--..--] + .M76[28].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[28]{.M2; .M3} ∈ [--..--] + .M76[29].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[29]{.M2; .M3} ∈ [--..--] + .M76[30].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[30]{.M2; .M3} ∈ [--..--] + .M76[31].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[31]{.M2; .M3} ∈ [--..--] + .M76[32].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[32]{.M2; .M3} ∈ [--..--] + .M76[33].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[33]{.M2; .M3} ∈ [--..--] + .M76[34].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[34]{.M2; .M3} ∈ [--..--] + .M76[35].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[35]{.M2; .M3} ∈ [--..--] + .M76[36].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[36]{.M2; .M3} ∈ [--..--] + .M76[37].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[37]{.M2; .M3} ∈ [--..--] + .M76[38].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[38]{.M2; .M3} ∈ [--..--] + .M76[39].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[39]{.M2; .M3} ∈ [--..--] + .M76[40].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[40]{.M2; .M3} ∈ [--..--] + .M76[41].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[41]{.M2; .M3} ∈ [--..--] + .M76[42].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[42]{.M2; .M3} ∈ [--..--] + .M76[43].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[43]{.M2; .M3} ∈ [--..--] + .M76[44].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[44]{.M2; .M3} ∈ [--..--] + .M76[45].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[45]{.M2; .M3} ∈ [--..--] + .M76[46].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[46]{.M2; .M3} ∈ [--..--] + .M76[47].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[47]{.M2; .M3} ∈ [--..--] + .M76[48].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[48]{.M2; .M3} ∈ [--..--] + .M76[49].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[49]{.M2; .M3} ∈ [--..--] + .M76[50].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[50]{.M2; .M3} ∈ [--..--] + .M76[51].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[51]{.M2; .M3} ∈ [--..--] + .M76[52].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M76[52]{.M2; .M3} ∈ [--..--] + .M77.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M77{.M2; .M3} ∈ [--..--] + .M78.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M78{.M2; .M3} ∈ [--..--] + .M79.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M79{.M2; .M3} ∈ [--..--] + .M80.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M80{.M2; .M3} ∈ [--..--] + .M81.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M81{.M2; .M3} ∈ [--..--] + .M82.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M82{.M2; .M3} ∈ [--..--] + .M83.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M83{.M2; .M3} ∈ [--..--] + .M84.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M84{.M2; .M3} ∈ [--..--] + .M85.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M85{.M2; .M3} ∈ [--..--] + .M86.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M86{.M2; .M3} ∈ [--..--] + .M87.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M87{.M2; .M3} ∈ [--..--] + .M88.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M88{.M2; .M3} ∈ [--..--] + .M89.M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + {.M89{.M2; .M3}; .M90[0..3]; .M91} ∈ [--..--] + .M92[0].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M92[0]{.M2; .M3} ∈ [--..--] + .M92[1].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M92[1]{.M2; .M3} ∈ [--..--] + .M92[2].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M92[2]{.M2; .M3} ∈ [--..--] + .M92[3].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M92[3]{.M2; .M3} ∈ [--..--] + .M92[4].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + .M92[4]{.M2; .M3} ∈ [--..--] + .M92[5].M1 ∈ [-1.9999998807907104*2^127 .. 1.9999998807907104*2^127] + {.M92[5]{.M2; .M3}; .M93[0..4]} ∈ [--..--] + V5 ∈ {4} or UNINITIALIZED + V6 ∈ [--..--] or UNINITIALIZED + V7 ∈ [0..65532],0%2 or UNINITIALIZED +[from] Computing for function F2 +[from] Done for function F2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function F2: + G5.M75 FROM G3 + {.M90[0].M4; .M90[1].M4; .M90[2].M4; .M90[3].M4} + FROM G1; G2; V8 (and SELF) + {.M90[0].M5; .M90[1].M5; .M90[2].M5; .M90[3].M5} FROM G2; V8 (and SELF) + .M91.M4 FROM G6{.M96[0]; .M97[0]}; V8 (and SELF) + .M91.M5 FROM G6.M97[0]; V8 (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function F2: + G5{.M75; {.M90[0..3]; .M91}}; V5; V6; V7 +[inout] Inputs for function F2: + G1; G2; G3; G5{.M90[0].M4; .M90[1].M4; .M90[2].M4; .M90[3].M4}; + G6{.M96[0]; .M97[0]} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/empty_struct.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/empty_struct.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/empty_struct.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/empty_struct.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,6 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/empty_struct.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +tests/misc/empty_struct.c:24:[value] user error: empty struct are unsupported (type 'struct s', location s2.s). Aborting +[kernel] Plug-in value aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/empty_struct.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/empty_struct.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/empty_struct.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/empty_struct.2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,6 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/empty_struct.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +tests/misc/empty_struct.c:30:[value] user error: empty struct are unsupported (type 'struct s', location t[0]). Aborting +[kernel] Plug-in value aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/empty_struct.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/empty_struct.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/empty_struct.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/empty_struct.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,38 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/empty_struct.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + s.[bits 0 to ..] ∈ {0} or UNINITIALIZED + s2 ∈ {0} + t[bits 0 to ..] ∈ {0} or UNINITIALIZED +tests/misc/empty_struct.c:37:[kernel] warning: out of bounds write. assert \valid(&s2.s); +tests/misc/empty_struct.c:37:[kernel] warning: accessing uninitialized left-value: assert \initialized(&s); +tests/misc/empty_struct.c:37:[kernel] warning: out of bounds read. assert \valid_read(&s); +tests/misc/empty_struct.c:38:[kernel] warning: out of bounds write. assert \valid((struct s *)t); +tests/misc/empty_struct.c:38:[kernel] warning: accessing uninitialized left-value: assert \initialized(&t[1]); +tests/misc/empty_struct.c:38:[kernel] warning: out of bounds read. assert \valid_read(&t[1]); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + s2 ∈ {0} + t[bits 0 to ..] ∈ {0} or UNINITIALIZED + p ∈ {{ (void *)&s }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + s2 FROM s[..] (and SELF) + t[bits 0 to ..] FROM t[..] (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + s2[..]; t[..]; p +[inout] Inputs for function main: + s[..]; t[..] +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +tests/misc/empty_struct.c:18:[value] user error: empty struct are unsupported (type 'struct s', location s). Aborting +[kernel] Plug-in value aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/endian.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/endian.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/endian.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/endian.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,56 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/endian.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v1 ∈ {0} + UU ∈ {0} + b0 ∈ {0} + b1 ∈ {0} + b2 ∈ {0} + b3 ∈ {0} + f ∈ {0} + G0 ∈ {0} + G1 ∈ {0} + G2 ∈ {0} + G3 ∈ {0} + G{.f0; .f1[bits 0 to 15]; .f2[bits 0 to 15]; .f3[bits 0 to 15]} ∈ {65532} + {.f0[bits 16 to 31]; .f1[bits 16 to 31]; .f2[bits 16 to 31]; .f3[bits 16 to 31]} ∈ + {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + b0 ∈ {1} + b1 ∈ {2} + b2 ∈ {3} + b3 ∈ {255} + f ∈ {4278387200} + G0 ∈ {65532} + G1[bits 0 to 15] ∈ {65532} + [bits 16 to 31] ∈ {0} + G2 ∈ {-4} + G3# ∈ {65532}%16, bits 0 to 7 + data0{.full[bits 0 to 7]; .part.a} ∈ {0} + {.full[bits 8 to 31]#; .part{.b#; .c#; .d#}} ∈ + {4278387201}%32, bits 8 to 31 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + b0 FROM \nothing + b1 FROM \nothing + b2 FROM \nothing + b3 FROM \nothing + f FROM \nothing + G0 FROM G{.f0; .f1[bits 0 to 15]; .f2[bits 0 to 15]; .f3[bits 0 to 15]} + G1 FROM G + G2 FROM G{.f0[bits 0 to 4]; .f1[bits 0 to 4]; .f2; .f3[bits 0 to 4]} + G3 FROM G{.f0[bits 0 to 7]; .f1[bits 0 to 7]; .f2[bits 0 to 7]; .f3} +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + b0; b1; b2; b3; f; G0; G1; G2; G3; data0 +[inout] Inputs for function main: + G diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/ensures.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/ensures.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/ensures.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/ensures.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/ensures.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/ensures.i:8:[value] Function main: postcondition got status invalid. +[value] Recording results for main +[value] done for function main +[kernel] Frama_C_bzero: behavior default! + VALID according to Frama-C kernel (under hypotheses) +[kernel] Frama_C_bzero: behavior default! no verification attempted +[kernel] Frama_C_bzero: behavior default! no verification attempted +[kernel] Frama_C_bzero: behavior default! no verification attempted +[kernel] Frama_C_bzero: behavior default! no verification attempted +[kernel] Frama_C_copy_block: behavior default! + VALID according to Frama-C kernel (under hypotheses) +[kernel] Frama_C_copy_block: behavior default! no verification attempted +[kernel] Frama_C_copy_block: behavior default! no verification attempted +[kernel] Frama_C_copy_block: behavior default! no verification attempted +[kernel] Frama_C_copy_block: behavior default! no verification attempted +[kernel] Frama_C_copy_block: behavior default! no verification attempted +[kernel] main: behavior default! + **NOT** VALID according to Frama-C kernel (under hypotheses) +[kernel] main: behavior default! **NOT** VALID according to Value (under hypotheses) diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/enum2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/enum2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/enum2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/enum2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,87 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/enum2.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + must_be_one ∈ {0} + must_be_zero ∈ {0} +[value] computing for function enum1_sgn1_inf_sgn0 <- main. + Called from tests/misc/enum2.c:33. +[value] computing for function printf <- enum1_sgn1_inf_sgn0 <- main. + Called from tests/misc/enum2.c:27. +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for enum1_sgn1_inf_sgn0 +[value] Done for function enum1_sgn1_inf_sgn0 +[value] computing for function enum1_sgn1_positif <- main. + Called from tests/misc/enum2.c:34. +[value] computing for function f <- enum1_sgn1_positif <- main. + Called from tests/misc/enum2.c:21. +[value] Recording results for f +[value] Done for function f +[value] computing for function printf <- enum1_sgn1_positif <- main. + Called from tests/misc/enum2.c:22. +[value] Done for function printf +[value] Recording results for enum1_sgn1_positif +[value] Done for function enum1_sgn1_positif +[value] computing for function printf <- main. + Called from tests/misc/enum2.c:35. +[value] Done for function printf +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + y ∈ {2557891634} +[value] Values at end of function enum1_sgn1_inf_sgn0: + res ∈ {0} +[value] Values at end of function enum1_sgn1_positif: + res ∈ {1} +[value] Values at end of function main: + must_be_one ∈ {1} + must_be_zero ∈ {0} + res ∈ {8} +[from] Computing for function f +[from] Done for function f +[from] Computing for function enum1_sgn1_inf_sgn0 +[from] Computing for function printf <-enum1_sgn1_inf_sgn0 +[from] Done for function printf +tests/misc/enum2.c:27:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function enum1_sgn1_inf_sgn0 +[from] Computing for function enum1_sgn1_positif +tests/misc/enum2.c:22:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function enum1_sgn1_positif +[from] Computing for function main +tests/misc/enum2.c:35:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM x +[from] Function printf: + \result FROM \nothing +[from] Function enum1_sgn1_inf_sgn0: + \result FROM \nothing +[from] Function enum1_sgn1_positif: + \result FROM \nothing +[from] Function main: + must_be_one FROM \nothing + must_be_zero FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + y +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function enum1_sgn1_inf_sgn0: + res +[inout] Inputs for function enum1_sgn1_inf_sgn0: + \nothing +[inout] Out (internal) for function enum1_sgn1_positif: + res; tmp +[inout] Inputs for function enum1_sgn1_positif: + \nothing +[inout] Out (internal) for function main: + must_be_one; must_be_zero; res +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/enum.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/enum.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/enum.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/enum.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/enum.i (no preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0] ∈ {1} + [1..2] ∈ {0} + u[0] ∈ {2} + [1..2] ∈ {0} +[value] Call to builtin bzero(({{ (unsigned char *)&i }},{12})) +tests/misc/enum.i:16:[value] entering loop for the first time +tests/misc/enum.i:20:[value] Assertion got status valid. +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + t[0] ∈ {1} + [1] ∈ {0} + [2] ∈ {42} + u[0] ∈ {2} + [1] ∈ {0} + [2] ∈ {36} + i[0..1] ∈ {0; 1} + [2] ∈ {0} + j ∈ {2} + k ∈ {0} +[from] Computing for function f +[from] Computing for function Frama_C_bzero <-f +[from] Done for function Frama_C_bzero +[from] Done for function f +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + t[2] FROM \nothing + u[2] FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + t[2]; u[2]; i[0..2]; j; k +[inout] Inputs for function f: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/eval_separated.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/eval_separated.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/eval_separated.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/eval_separated.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,64 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/eval_separated.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + t1[0..5] ∈ {0} + t2[0..5] ∈ {0} +tests/misc/eval_separated.c:5:[value] Assertion got status valid. +tests/misc/eval_separated.c:6:[value] Assertion got status valid. +tests/misc/eval_separated.c:8:[value] Assertion got status valid. +tests/misc/eval_separated.c:9:[value] Assertion got status valid. +tests/misc/eval_separated.c:11:[value] warning: Operation {{ &q }} + {{ &q }} incurs a loss of precision +tests/misc/eval_separated.c:11:[kernel] warning: signed overflow. assert -2147483648 ≤ (int)(&q)+(int)(&q) ≤ 2147483647; +tests/misc/eval_separated.c:11:[value] Assigning imprecise value to q. + The imprecision originates from Arithmetic {tests/misc/eval_separated.c:11} +tests/misc/eval_separated.c:12:[value] warning: Operation {{ &r }} + {{ &r }} incurs a loss of precision +tests/misc/eval_separated.c:12:[kernel] warning: signed overflow. assert -2147483648 ≤ (int)(&r)+(int)(&r) ≤ 2147483647; +tests/misc/eval_separated.c:12:[value] Assigning imprecise value to r. + The imprecision originates from Arithmetic {tests/misc/eval_separated.c:12} +tests/misc/eval_separated.c:13:[value] Assertion got status unknown. +tests/misc/eval_separated.c:14:[value] Assertion got status unknown. +tests/misc/eval_separated.c:15:[value] Assertion got status unknown. +tests/misc/eval_separated.c:17:[value] Assertion got status valid. +tests/misc/eval_separated.c:18:[value] Assertion got status valid. +tests/misc/eval_separated.c:20:[value] Assertion got status valid. +tests/misc/eval_separated.c:21:[value] Assertion got status valid. +tests/misc/eval_separated.c:23:[value] Assertion got status valid. +tests/misc/eval_separated.c:24:[value] Assertion got status valid. +tests/misc/eval_separated.c:26:[value] Assertion got status valid. +tests/misc/eval_separated.c:27:[value] Assertion got status valid. +tests/misc/eval_separated.c:28:[value] Assertion got status valid. +tests/misc/eval_separated.c:30:[value] Assertion got status valid. +tests/misc/eval_separated.c:31:[value] Assertion got status valid. +tests/misc/eval_separated.c:33:[value] Assertion got status valid. +tests/misc/eval_separated.c:36:[value] Assertion got status valid. +tests/misc/eval_separated.c:38:[value] Assertion got status valid. +tests/misc/eval_separated.c:41:[value] Assertion got status valid. +tests/misc/eval_separated.c:43:[value] Assertion got status unknown. +tests/misc/eval_separated.c:45:[value] Assertion got status unknown. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + p ∈ {{ &t1 + [-8589934592..8589934588],0%4 }} + q ∈ + {{ garbled mix of &{q} + (origin: Arithmetic {tests/misc/eval_separated.c:11}) }} + r ∈ + {{ garbled mix of &{r} + (origin: Arithmetic {tests/misc/eval_separated.c:12}) }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + p; q; r +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/exception.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/exception.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/exception.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/exception.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,191 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/exception.i (no preprocessing) +/* Generated by Frama-C */ +struct my_exn { + int e ; +}; +struct my_exn2 { + char c ; +}; +enum __fc_exn_enum { + __fc_exn_kind___fc_Smy_exn2 = 3, + __fc_exn_kind___fc_Smy_exn = 2, + __fc_exn_kind___fc_pi = 1, + __fc_exn_kind___fc_i = 0 +}; +union __fc_exn_union { + struct my_exn2 __fc_Smy_exn2 ; + struct my_exn __fc_Smy_exn ; + int *__fc_pi ; + int __fc_i ; +}; +struct __fc_exn_struct { + int exn_uncaught ; + enum __fc_exn_enum exn_kind ; + union __fc_exn_union exn_obj ; +}; +struct __fc_exn_struct __fc_exn = {.exn_uncaught = 0, .exn_kind = 0, + .exn_obj = {.__fc_Smy_exn2 = {.c = (char)0}}}; +struct my_exn foo; +struct my_exn2 bar; +int x = 42; +int f1(int c) +{ + int __retres; + if (c) { + struct my_exn exn; + exn.e = 0; + __fc_exn.exn_uncaught = 1; + __fc_exn.exn_kind = __fc_exn_kind___fc_Smy_exn; + __fc_exn.exn_obj.__fc_Smy_exn = exn; + __retres = 0; + goto return_label; + } + else { + __retres = c; + goto return_label; + } + return_label: return __retres; +} + +/*@ ensures __fc_exn.exn_uncaught ≡ 0 ⇒ \result ≡ \old(c)+1; */ +int f2(int c) +{ + int __retres; + if (c < 50) { + int exn; + exn = 0; + __fc_exn.exn_uncaught = 1; + __fc_exn.exn_kind = __fc_exn_kind___fc_i; + __fc_exn.exn_obj.__fc_i = exn; + __retres = 0; + goto return_label; + } + else { + __retres = c + 1; + goto return_label; + } + return_label: return __retres; +} + +int f3(int c) +{ + int __retres; + if (c > 150) { + int *exn; + exn = & x; + __fc_exn.exn_uncaught = 1; + __fc_exn.exn_kind = __fc_exn_kind___fc_pi; + __fc_exn.exn_obj.__fc_pi = exn; + __retres = 0; + goto return_label; + } + else { + __retres = c + 2; + goto return_label; + } + return_label: return __retres; +} + +int f4(int c) +{ + int __retres; + if (c) { + struct my_exn2 exn; + exn.c = 0; + __fc_exn.exn_uncaught = 1; + __fc_exn.exn_kind = __fc_exn_kind___fc_Smy_exn2; + __fc_exn.exn_obj.__fc_Smy_exn2 = exn; + __retres = 0; + goto return_label; + } + else { + __retres = c + 3; + goto return_label; + } + return_label: return __retres; +} + +/*@ ensures __fc_exn.exn_uncaught ≡ 0 ⇒ \result ≢ 42; */ +int h(int c) +{ + int __retres; + { + struct my_exn2 exn2; + struct my_exn exn_aux; + int y; + struct my_exn exn; + if (c - 1 <= 0) { + int tmp; + tmp = f1(c); + if (__fc_exn.exn_uncaught == 1) + switch (__fc_exn.exn_kind) case __fc_exn_kind___fc_Smy_exn: + goto __fc_Smy_exn_1; + __retres = tmp; + goto return_label; + } + else + if (c - 100 <= 0) { + int tmp_0; + /*@ returns __fc_exn.exn_uncaught ≡ 0 ⇒ \result ≡ c+1; */ + { + tmp_0 = f2(c); + if (__fc_exn.exn_uncaught == 1) + switch (__fc_exn.exn_kind) case __fc_exn_kind___fc_i: + goto __fc_i; + __retres = tmp_0; + /*@ assert __retres ≡ c+1; */ ; + goto return_label; + } + } + else + if (c > 360) { + int tmp_1; + tmp_1 = f3(c); + if (__fc_exn.exn_uncaught == 1) + switch (__fc_exn.exn_kind) { + default: __retres = 0; + goto return_label; + } + __retres = tmp_1; + goto return_label; + } + else { + int tmp_2; + tmp_2 = f4(c); + if (__fc_exn.exn_uncaught == 1) + switch (__fc_exn.exn_kind) case __fc_exn_kind___fc_Smy_exn2: + goto __fc_Smy_exn2_2; + __retres = tmp_2; + goto return_label; + } + if (0) { + struct my_exn exn; + if (0) { + struct my_exn2 exn2; + __fc_Smy_exn2_2: exn2 = __fc_exn.exn_obj.__fc_Smy_exn2; + exn.e = exn2.c; + goto __fc_Smy_exn; + } + if (0) { + struct my_exn exn_aux; + __fc_Smy_exn_1: exn_aux = __fc_exn.exn_obj.__fc_Smy_exn; + exn = exn_aux; + goto __fc_Smy_exn; + } + __fc_Smy_exn: __fc_exn.exn_uncaught = 0; + __retres = exn.e; + goto return_label; + } + if (0) { + int y; + __fc_i: __fc_exn.exn_uncaught = 0; + y = __fc_exn.exn_obj.__fc_i; + __retres = y; + goto return_label; + } + } + return_label: return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/exception.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/exception.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/exception.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/exception.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,127 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/exception.i (no preprocessing) +/* Generated by Frama-C */ +struct my_exn { + int e ; +}; +struct my_exn2 { + char c ; +}; +struct my_exn foo; +struct my_exn2 bar; +int x = 42; +int f1(int c) +{ + int __retres; + if (c) { + struct my_exn exn; + exn.e = 0; + throw (exn); + } + else { + __retres = c; + goto return_label; + } + return_label: return __retres; +} + +/*@ ensures \result ≡ \old(c)+1; */ +int f2(int c) +{ + int __retres; + if (c < 50) { + int exn; + exn = 0; + throw (exn); + } + else { + __retres = c + 1; + goto return_label; + } + return_label: return __retres; +} + +int f3(int c) +{ + int __retres; + if (c > 150) { + int *exn; + exn = & x; + throw (exn); + } + else { + __retres = c + 2; + goto return_label; + } + return_label: return __retres; +} + +int f4(int c) +{ + int __retres; + if (c) { + struct my_exn2 exn; + exn.c = 0; + throw (exn); + } + else { + __retres = c + 3; + goto return_label; + } + return_label: return __retres; +} + +/*@ ensures \result ≢ 42; */ +int h(int c) +{ + int __retres; + try + struct my_exn2 exn2; + struct my_exn exn_aux; + int y; + struct my_exn exn; + if (c - 1 <= 0) { + int tmp; + tmp = f1(c); + __retres = tmp; + goto return_label; + } + else + if (c - 100 <= 0) { + int tmp_0; + /*@ returns \result ≡ c+1; */ + { + tmp_0 = f2(c); + __retres = tmp_0; + /*@ assert __retres ≡ c+1; */ ; + goto return_label; + } + } + else + if (c > 360) { + int tmp_1; + tmp_1 = f3(c); + __retres = tmp_1; + goto return_label; + } + else { + int tmp_2; + tmp_2 = f4(c); + __retres = tmp_2; + goto return_label; + } + catch ( struct my_exn exn + struct my_exn exn_aux + struct my_exn2 exn2 + ) { + __retres = exn.e; + goto return_label; + } + catch ( int y ) { + __retres = y; + goto return_label; + } +return_label: return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/extern.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/extern.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/extern.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/extern.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,40 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/extern.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +tests/misc/extern.i:4:[value] no size specified for array, assuming 0 +tests/misc/extern.i:5:[value] no size specified for array, assuming 0 +tests/misc/extern.i:14:[value] no size specified for array, assuming 0 +[value] Initial state computed +[value] Values of globals at initialization + T1 ∈ [--..--] + T2 ∈ [--..--] + T5[0..2] ∈ [--..--] + T6[0..2] ∈ [--..--] + c ∈ [--..--] + s.nb ∈ [--..--] + .[bits 8 to 31] ∈ UNINITIALIZED +tests/misc/extern.i:19:[kernel] warning: out of bounds read. assert \valid_read(&T3[3]); +tests/misc/extern.i:20:[kernel] warning: out of bounds write. assert \valid(&T2); +tests/misc/extern.i:20:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +tests/misc/extern.i:22:[kernel] warning: out of bounds write. assert \valid(&T2); +tests/misc/extern.i:22:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +tests/misc/extern.i:20:[value] Assertion 'Value,mem_access' got final status invalid. +tests/misc/extern.i:22:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + T1 +[inout] Inputs for function main: + T3[3]; T4[3]; T5[1]; T6[1]; c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/f1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/f1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/f1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/f1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/f1.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/misc/f1.i:5. +tests/misc/f1.i:5:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] using specification for function f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + +[from] Computing for function main +[from] Computing for function f <-main +[from] Done for function f +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM x +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/f2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/f2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/f2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/f2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/f2.i (no preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/false.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/false.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/false.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/false.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,51 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/false.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/misc/false.i:14. +tests/misc/false.i:14:[kernel] warning: No code nor implicit assigns clause for function f, generating default assigns from the prototype +[value] using specification for function f +tests/misc/false.i:1:[value] Function f: precondition got status invalid. +tests/misc/false.i:2:[value] Function f: no state left in which to evaluate precondition, status not computed. +tests/misc/false.i:3:[value] Function f: no state left in which to evaluate precondition, status not computed. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/false.i:15. +tests/misc/false.i:6:[value] Function g: postcondition got status invalid. +tests/misc/false.i:7:[value] Function g: no state left in which to evaluate postcondition, status not computed. +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function g: + +[value] Values at end of function main: + i ∈ {0} +[from] Computing for function g +[from] Done for function g +[from] Computing for function main +[from] Computing for function f <-main +[from] Done for function f +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + NO EFFECTS +[from] Function g: + \result FROM i +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function g: + \nothing +[inout] Inputs for function g: + \nothing +[inout] Out (internal) for function main: + i +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/find_enclosing_loop.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/find_enclosing_loop.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/find_enclosing_loop.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/find_enclosing_loop.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,3 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/find_enclosing_loop.c (with preprocessing) +tests/misc/find_enclosing_loop.c:15:[kernel] warning: Body of function f falls-through. Adding a return statement diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/find_ivaltop.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/find_ivaltop.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/find_ivaltop.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/find_ivaltop.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,45 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/find_ivaltop.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3] ∈ {4} + [4] ∈ {5} + [5] ∈ {6} + [6] ∈ {7} + [7] ∈ {8} + [8] ∈ {9} + [9] ∈ {0} + [10] ∈ {1} + [11] ∈ {2} + [12] ∈ {3} + [13] ∈ {4} + [14] ∈ {5} + [15] ∈ {6} + [16] ∈ {7} + [17] ∈ {8} + [18] ∈ {9} + [19] ∈ {0} +tests/misc/find_ivaltop.i:6:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {8} + j ∈ {0; 1; 2; 3; 4; 5; 6; 7} + X ∈ {1; 2; 3; 4; 5; 6; 7; 8} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM t[0..7] +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; j; X +[inout] Inputs for function main: + t[0..7] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/folding.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/folding.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/folding.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/folding.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,77 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/folding.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function g <- main. + Called from tests/misc/folding.i:23. +[value] computing for function f <- g <- main. + Called from tests/misc/folding.i:11. +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] Done for function g +[value] computing for function foo <- main. + Called from tests/misc/folding.i:24. +[value] Recording results for foo +[value] Done for function foo +[value] computing for function foo <- main. + Called from tests/misc/folding.i:24. +[value] Recording results for foo +[value] Done for function foo +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + +[value] Values at end of function foo: + unknown ∈ [--..--] + __retres ∈ {8; 9; 779} +[value] Values at end of function g: + pfct ∈ {{ &f }} + un ∈ {1} + p ∈ {{ &deux }} + deux ∈ {2} + trois ∈ {5} +[value] Values at end of function main: + a ∈ {17; 18; 787; 788} + b ∈ {4} + c ∈ {33; 34; 803; 804} + __retres ∈ {37; 38; 807; 808} +[from] Computing for function f +[from] Done for function f +[from] Computing for function foo +[from] Done for function foo +[from] Computing for function g +[from] Done for function g +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM x +[from] Function foo: + \result FROM x; y +[from] Function g: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + \nothing +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function foo: + unknown; __retres +[inout] Inputs for function foo: + \nothing +[inout] Out (internal) for function g: + pfct; un; p; deux; trois; tmp +[inout] Inputs for function g: + \nothing +[inout] Out (internal) for function main: + a; b; c; tmp; tmp_0; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/for_loops.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/for_loops.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/for_loops.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/for_loops.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,111 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/for_loops.c (with preprocessing) +[value] Analyzing a complete application starting at main_2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ [--..--] + x ∈ {0} +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:13. +[value] using specification for function Frama_C_interval +[value] Done for function Frama_C_interval +tests/misc/for_loops.c:16:[value] entering loop for the first time +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F({0; 1}) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F({0; 1; 2}) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F({0; 1; 2; 3}) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F({0; 1; 2; 3; 4}) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F({0; 1; 2; 3; 4; 5}) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F({0; 1; 2; 3; 4; 5; 6}) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F({0; 1; 2; 3; 4; 5; 6; 7}) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F([0..8]) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F([0..9]) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F([0..16]) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F([0..17]) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F([0..128]) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F([0..129]) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F([0..513]) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F([0..514]) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F([0..32768]) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +[value] Called CEA_F([0..32769]) +[value] computing for function Frama_C_interval <- main_2. + Called from tests/misc/for_loops.c:16. +[value] Done for function Frama_C_interval +tests/misc/for_loops.c:16:[kernel] warning: signed overflow. assert w+1 ≤ 2147483647; +[value] Called CEA_F([0..2147483647]) +[value] Recording results for main_2 +[value] done for function main_2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main_2: + Frama_C_entropy_source ∈ [--..--] + j ∈ [0..127] + nSelectors ∈ [0..100] + w ∈ [0..2147483647] + v ∈ {0} +[from] Computing for function main_2 +[from] Computing for function Frama_C_interval <-main_2 +[from] Done for function Frama_C_interval +[from] Done for function main_2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function Frama_C_interval: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) + \result FROM Frama_C_entropy_source; min; max +[from] Function main_2: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main_2: + Frama_C_entropy_source; j; nSelectors; w; v; tmp_0 +[inout] Inputs for function main_2: + Frama_C_entropy_source diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/for_loops.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/for_loops.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/for_loops.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/for_loops.2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,55 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/for_loops.c (with preprocessing) +[value] Analyzing a complete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ [--..--] + x ∈ {0} +[value] computing for function Frama_C_interval <- g. + Called from tests/misc/for_loops.c:37. +[value] using specification for function Frama_C_interval +[value] Done for function Frama_C_interval +[value] DUMPING STATE of file tests/misc/for_loops.c line 39 + Frama_C_entropy_source ∈ [--..--] + x ∈ {0} + nSelectors ∈ [0..1000] + w ∈ {0} + =END OF DUMP== +tests/misc/for_loops.c:40:[value] entering loop for the first time +[value] DUMPING STATE of file tests/misc/for_loops.c line 41 + Frama_C_entropy_source ∈ [--..--] + x ∈ {0} + j ∈ [0..1000] + T[0..999] ∈ {1} or UNINITIALIZED + nSelectors ∈ [0..1000] + w ∈ {0} + =END OF DUMP== +tests/misc/for_loops.c:42:[value] entering loop for the first time +tests/misc/for_loops.c:42:[kernel] warning: accessing uninitialized left-value: assert \initialized(&T[j]); +tests/misc/for_loops.c:42:[kernel] warning: signed overflow. assert w+T[j] ≤ 2147483647; +[value] Recording results for g +[value] done for function g +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function g: + Frama_C_entropy_source ∈ [--..--] + j ∈ [0..1000] + T[0..999] ∈ {1} or UNINITIALIZED + nSelectors ∈ [0..1000] + w ∈ [0..2147483647] +[from] Computing for function g +[from] Computing for function Frama_C_interval <-g +[from] Done for function Frama_C_interval +[from] Done for function g +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function Frama_C_interval: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) + \result FROM Frama_C_entropy_source; min; max +[from] Function g: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function g: + Frama_C_entropy_source; j; T[0..999]; nSelectors; w +[inout] Inputs for function g: + Frama_C_entropy_source diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/for_loops.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/for_loops.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/for_loops.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/for_loops.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,54 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/for_loops.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ [--..--] + x ∈ {0} +[value] computing for function Frama_C_interval <- main. + Called from tests/misc/for_loops.c:24. +[value] using specification for function Frama_C_interval +[value] Done for function Frama_C_interval +tests/misc/for_loops.c:27:[value] entering loop for the first time +tests/misc/for_loops.c:29:[value] entering loop for the first time +[value] Called CEA_F({0}) +[value] Called CEA_F({0; 1}) +[value] Called CEA_F({0; 1; 2}) +[value] Called CEA_F({0; 1; 2; 3}) +[value] Called CEA_F({0; 1; 2; 3; 4}) +[value] Called CEA_F([0..15]) +[value] Called CEA_F([0..16]) +[value] Called CEA_F([0..127]) +[value] Called CEA_F([0..128]) +[value] Called CEA_F([0..512]) +[value] Called CEA_F([0..513]) +[value] Called CEA_F([0..32767]) +[value] Called CEA_F([0..32768]) +[value] Called CEA_F([0..2147483647]) +tests/misc/for_loops.c:27:[kernel] warning: signed overflow. assert j+1 ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + Frama_C_entropy_source ∈ [--..--] + j ∈ [1..2147483647] + nSelectors ∈ [0..2147483646] + w ∈ {0} + v ∈ {0} +[from] Computing for function main +[from] Computing for function Frama_C_interval <-main +[from] Done for function Frama_C_interval +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function Frama_C_interval: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) + \result FROM Frama_C_entropy_source; min; max +[from] Function main: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + Frama_C_entropy_source; j; nSelectors; w; v +[inout] Inputs for function main: + Frama_C_entropy_source diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/FP5.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/FP5.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/FP5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/FP5.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,31 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/FP5.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/FP5.i:1:[value] Function main: precondition got status unknown. +tests/misc/FP5.i:2:[value] Function main: precondition got status unknown. +tests/misc/FP5.i:3:[value] Function main: precondition got status valid. +tests/misc/FP5.i:23:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ [0..2147483647] + S_c[0] ∈ {-1; 0; 1} + [1] ∈ [--..--] + S_b[0..1] ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + S_c[0] FROM a; c + S_b[0] FROM a; b (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; S_c[0]; S_b[0] +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/fptr.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/fptr.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/fptr.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/fptr.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,116 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/fptr.i (no preprocessing) +[value] Analyzing a complete application starting at main_uninit +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + R ∈ {77} + X ∈ {77} + XH ∈ {0} + XHH ∈ {0} + GLOBAL[0..9] ∈ {0} + G ∈ {0} + TA ∈ {0} +tests/misc/fptr.i:66:[value] entering loop for the first time +[value] Called CEA_F({{ &h }}) +[value] computing for function f <- main_uninit. + Called from tests/misc/fptr.i:68. +[value] computing for function h <- f <- main_uninit. + Called from tests/misc/fptr.i:9. +[value] Recording results for h +[value] Done for function h +[value] Recording results for f +[value] Done for function f +[value] Called CEA_F({{ &h ; &hh }}) +[value] computing for function f <- main_uninit. + Called from tests/misc/fptr.i:68. +[value] computing for function h <- f <- main_uninit. + Called from tests/misc/fptr.i:9. +[value] Recording results for h +[value] Done for function h +[value] computing for function hh <- f <- main_uninit. + Called from tests/misc/fptr.i:9. +[value] Recording results for hh +[value] Done for function hh +[value] Recording results for f +[value] Done for function f +[value] Called CEA_F({{ NULL + [0..4294967295] ; &h ; &hh }}) +[value] computing for function f <- main_uninit. + Called from tests/misc/fptr.i:68. +tests/misc/fptr.i:9:[value] warning: Function pointer call at absolute position in memory: ignoring this particular value: assert(\valid_fun_pointer(*ptr)) +[value] computing for function h <- f <- main_uninit. + Called from tests/misc/fptr.i:9. +[value] Recording results for h +[value] Done for function h +[value] computing for function hh <- f <- main_uninit. + Called from tests/misc/fptr.i:9. +[value] Recording results for hh +[value] Done for function hh +[value] Recording results for f +[value] Done for function f +[value] Recording results for main_uninit +[value] done for function main_uninit +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function h: + X ∈ {1} + XH ∈ {1} +[value] Values at end of function hh: + X ∈ {2} + XHH ∈ {1} +[value] Values at end of function f: + R ∈ {1; 2} + X ∈ {1; 2} + XH ∈ {0; 1} + XHH ∈ {0; 1} +[value] Values at end of function main_uninit: + R ∈ {1; 2; 77} + X ∈ {1; 2; 77} + XH ∈ {0; 1} + XHH ∈ {0; 1} + GLOBAL[0] ∈ {{ &h }} + [1] ∈ {{ &hh }} + [2] ∈ [--..--] + [3..9] ∈ {0} + G ∈ {0; 1; 2} + i ∈ {3} + j ∈ [--..--] +[from] Computing for function h +[from] Done for function h +[from] Computing for function hh +[from] Done for function hh +[from] Computing for function f +[from] Done for function f +[from] Computing for function main_uninit +[from] Done for function main_uninit +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function h: + X FROM y + XH FROM y + \result FROM y +[from] Function hh: + X FROM y + XHH FROM y + \result FROM y +[from] Function f: + R FROM ptr + X FROM ptr + XH FROM ptr (and SELF) + XHH FROM ptr (and SELF) + \result FROM ptr +[from] Function main_uninit: + R FROM \nothing (and SELF) + X FROM \nothing (and SELF) + XH FROM \nothing (and SELF) + XHH FROM \nothing (and SELF) + GLOBAL[0..2] FROM \nothing + G FROM \nothing (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function h: + X; XH +[inout] Out (internal) for function hh: + X; XHH +[inout] Out (internal) for function f: + R; X; XH; XHH +[inout] Out (internal) for function main_uninit: + R; X; XH; XHH; GLOBAL[0..2]; G; i; j diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/fptr.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/fptr.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/fptr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/fptr.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,158 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/fptr.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + R ∈ {77} + X ∈ {77} + XH ∈ {0} + XHH ∈ {0} + GLOBAL[0..9] ∈ {0} + G ∈ {0} + TA ∈ {0} +[value] computing for function retshort <- main. + Called from tests/misc/fptr.i:42. +[value] Recording results for retshort +[value] Done for function retshort +[value] computing for function retint <- main. + Called from tests/misc/fptr.i:43. +[value] Recording results for retint +[value] Done for function retint +tests/misc/fptr.i:44:[value] warning: Function pointer and pointed function 'retshort' have incompatible types: + int () vs. short (void). assert(function type matches) +tests/misc/fptr.i:45:[value] warning: Function pointer and pointed function 'retint' have incompatible types: + short () vs. int (void). assert(function type matches) +tests/misc/fptr.i:50:[value] entering loop for the first time +[value] Called CEA_F({{ &h }}) +[value] computing for function f <- main. + Called from tests/misc/fptr.i:52. +[value] computing for function h <- f <- main. + Called from tests/misc/fptr.i:9. +[value] Recording results for h +[value] Done for function h +[value] Recording results for f +[value] Done for function f +[value] Called CEA_F({{ &h ; &hh }}) +[value] computing for function f <- main. + Called from tests/misc/fptr.i:52. +[value] computing for function h <- f <- main. + Called from tests/misc/fptr.i:9. +[value] Recording results for h +[value] Done for function h +[value] computing for function hh <- f <- main. + Called from tests/misc/fptr.i:9. +[value] Recording results for hh +[value] Done for function hh +[value] Recording results for f +[value] Done for function f +[value] Called CEA_F({{ NULL ; &h ; &hh }}) +[value] computing for function f <- main. + Called from tests/misc/fptr.i:52. +tests/misc/fptr.i:9:[value] warning: Function pointer call at absolute position in memory: ignoring this particular value: assert(\valid_fun_pointer(*ptr)) +[value] computing for function h <- f <- main. + Called from tests/misc/fptr.i:9. +[value] Recording results for h +[value] Done for function h +[value] computing for function hh <- f <- main. + Called from tests/misc/fptr.i:9. +[value] Recording results for hh +[value] Done for function hh +[value] Recording results for f +[value] Done for function f +tests/misc/fptr.i:56:[kernel] warning: division by zero: assert (int)(c&64) ≢ 0; +[value] computing for function h <- main. + Called from tests/misc/fptr.i:56. +[value] Recording results for h +[value] Done for function h +[value] computing for function hh <- main. + Called from tests/misc/fptr.i:56. +[value] Recording results for hh +[value] Done for function hh +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function h: + X ∈ {0; 1} + XH ∈ {0; 1} +[value] Values at end of function hh: + X ∈ {0; 2} + XHH ∈ {0; 1} +[value] Values at end of function f: + R ∈ {1; 2} + X ∈ {1; 2} + XH ∈ {0; 1} + XHH ∈ {0; 1} +[value] Values at end of function retint: + __retres ∈ {42} +[value] Values at end of function retshort: + __retres ∈ {12} +[value] Values at end of function main: + R ∈ {1; 2; 77} + X ∈ {0; 1; 2; 77} + XH ∈ {0; 1} + XHH ∈ {0; 1} + GLOBAL[0] ∈ {{ &h }} + [1] ∈ {{ &hh }} + [2..9] ∈ {0} + G ∈ {0; 1; 2} + TA ∈ {0} + in ∈ {12} or UNINITIALIZED + pin ∈ UNINITIALIZED + sh ∈ {42} or UNINITIALIZED + psh ∈ UNINITIALIZED + i ∈ {3} + p ∈ {{ &h ; &hh }} +[from] Computing for function h +[from] Done for function h +[from] Computing for function hh +[from] Done for function hh +[from] Computing for function f +[from] Done for function f +[from] Computing for function retint +[from] Done for function retint +[from] Computing for function retshort +[from] Done for function retshort +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function h: + X FROM y + XH FROM y + \result FROM y +[from] Function hh: + X FROM y + XHH FROM y + \result FROM y +[from] Function f: + R FROM ptr + X FROM ptr + XH FROM ptr (and SELF) + XHH FROM ptr (and SELF) + \result FROM ptr +[from] Function retint: + \result FROM \nothing +[from] Function retshort: + \result FROM \nothing +[from] Function main: + R FROM GLOBAL[2] (and SELF) + X FROM GLOBAL[2]; c (and SELF) + XH FROM GLOBAL[2]; c (and SELF) + XHH FROM GLOBAL[2]; c (and SELF) + GLOBAL[0..1] FROM \nothing + G FROM GLOBAL[2] (and SELF) + TA FROM c (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function h: + X; XH +[inout] Out (internal) for function hh: + X; XHH +[inout] Out (internal) for function f: + R; X; XH; XHH +[inout] Out (internal) for function retint: + __retres +[inout] Out (internal) for function retshort: + __retres +[inout] Out (internal) for function main: + R; X; XH; XHH; GLOBAL[0..1]; G; TA; in; pin; sh; psh; tmp; i; p; tmp_0 diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,63 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from1.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + cx ∈ {0} + cy ∈ {0} + cz ∈ {0} + sx ∈ {0} + sy ∈ {0} + s ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/from1.i:23. +[value] Recording results for f +[value] Done for function f +[value] computing for function sf <- main. + Called from tests/misc/from1.i:25. +[value] Recording results for sf +[value] Done for function sf +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + cy ∈ {0} +[value] Values at end of function sf: + __retres ∈ {0} +[value] Values at end of function main: + G ∈ [--..--] + cx ∈ {0} + cy ∈ {0} + s_0 ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function sf +[from] Done for function sf +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + cy FROM cx +[from] Function sf: + \result FROM ps; s_0.a +[from] Function main: + G FROM x; y (and SELF) + cx FROM cz + cy FROM cz + \result FROM sx +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + cy +[inout] Inputs for function f: + cx +[inout] Out (internal) for function sf: + __retres +[inout] Inputs for function sf: + s_0.a +[inout] Out (internal) for function main: + G; cx; cy; s_0; tmp +[inout] Inputs for function main: + cx; cz; sx; sy diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_call.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_call.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_call.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_call.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,228 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_call.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} + c ∈ {0} + d ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} + t ∈ {0} + A1 ∈ {0} + A2 ∈ {0} + A3 ∈ {0} + A4 ∈ {0} + A5 ∈ {0} + A6 ∈ {0} + A7 ∈ {0} + A8 ∈ {0} + R1 ∈ {0} + R2 ∈ {0} + R3 ∈ {0} + S1 ∈ {0} + S2 ∈ {0} + S3 ∈ {0} + T0 ∈ {0} + T1 ∈ {0} + T2 ∈ {0} + tab[0..4] ∈ {0} + AA ∈ {0} + AR ∈ {0} + AS ∈ {0} + At[0] ∈ {{ (int)&AA }} + [1] ∈ {0} + Ar[0] ∈ {{ (int)&AA }} + [1] ∈ {0} + Ap ∈ {{ &At[0] }} + previous ∈ {{ &a }} +[value] computing for function f <- main. + Called from tests/misc/from_call.i:81. +[value] computing for function h <- f <- main. + Called from tests/misc/from_call.i:20. +tests/misc/from_call.i:20:[kernel] warning: Neither code nor specification for function h, generating default assigns from the prototype +[value] using specification for function h +[value] Done for function h +[value] computing for function g <- f <- main. + Called from tests/misc/from_call.i:20. +[value] Recording results for g +[value] Done for function g +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/from_call.i:82. +[value] computing for function h <- f <- main. + Called from tests/misc/from_call.i:20. +[value] Done for function h +[value] computing for function g <- f <- main. + Called from tests/misc/from_call.i:20. +[value] Recording results for g +[value] Done for function g +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/from_call.i:82. +[value] computing for function h <- f <- main. + Called from tests/misc/from_call.i:20. +[value] Done for function h +[value] computing for function g <- f <- main. + Called from tests/misc/from_call.i:20. +[value] Recording results for g +[value] Done for function g +[value] Recording results for f +[value] Done for function f +tests/misc/from_call.i:82:[kernel] warning: signed overflow. + assert -2147483648 ≤ tmp+tmp_0 ≤ 2147483647; + (tmp from f(& c), tmp_0 from f(& d)) +[value] computing for function dispatcher <- main. + Called from tests/misc/from_call.i:83. +[value] Recording results for dispatcher +[value] Done for function dispatcher +[value] computing for function dispatcher <- main. + Called from tests/misc/from_call.i:84. +[value] Recording results for dispatcher +[value] Done for function dispatcher +[value] computing for function dispatcher <- main. + Called from tests/misc/from_call.i:85. +[value] Recording results for dispatcher +[value] Done for function dispatcher +[value] computing for function call_dispatcher2_1 <- main. + Called from tests/misc/from_call.i:86. +[value] computing for function dispatcher2 <- call_dispatcher2_1 <- main. + Called from tests/misc/from_call.i:49. +[value] computing for function return_A1 <- dispatcher2 <- call_dispatcher2_1 <- main. + Called from tests/misc/from_call.i:44. +[value] Recording results for return_A1 +[value] Done for function return_A1 +[value] Recording results for dispatcher2 +[value] Done for function dispatcher2 +[value] Recording results for call_dispatcher2_1 +[value] Done for function call_dispatcher2_1 +[value] computing for function call_dispatcher2_0 <- main. + Called from tests/misc/from_call.i:87. +[value] computing for function dispatcher2 <- call_dispatcher2_0 <- main. + Called from tests/misc/from_call.i:54. +[value] computing for function return_A2 <- dispatcher2 <- call_dispatcher2_0 <- main. + Called from tests/misc/from_call.i:44. +[value] Recording results for return_A2 +[value] Done for function return_A2 +[value] Recording results for dispatcher2 +[value] Done for function dispatcher2 +[value] Recording results for call_dispatcher2_0 +[value] Done for function call_dispatcher2_0 +[value] computing for function call_dispatcher2 <- main. + Called from tests/misc/from_call.i:88. +[value] computing for function dispatcher2 <- call_dispatcher2 <- main. + Called from tests/misc/from_call.i:59. +[value] computing for function return_A1 <- dispatcher2 <- call_dispatcher2 <- main. + Called from tests/misc/from_call.i:44. +[value] Recording results for return_A1 +[value] Done for function return_A1 +[value] computing for function return_A2 <- dispatcher2 <- call_dispatcher2 <- main. + Called from tests/misc/from_call.i:44. +[value] Recording results for return_A2 +[value] Done for function return_A2 +[value] Recording results for dispatcher2 +[value] Done for function dispatcher2 +[value] Recording results for call_dispatcher2 +[value] Done for function call_dispatcher2 +[value] computing for function access_tab <- main. + Called from tests/misc/from_call.i:92. +[value] Recording results for access_tab +[value] Done for function access_tab +[value] computing for function access_tab <- main. + Called from tests/misc/from_call.i:93. +[value] Recording results for access_tab +[value] Done for function access_tab +[value] computing for function access_tab <- main. + Called from tests/misc/from_call.i:94. +[value] Recording results for access_tab +[value] Done for function access_tab +[value] computing for function unavailable_f <- main. + Called from tests/misc/from_call.i:96. +[value] using specification for function unavailable_f +[value] Done for function unavailable_f +[value] Recording results for main +[value] done for function main +[from] Computing for function access_tab +[from] Done for function access_tab +[from] Computing for function dispatcher +[from] Done for function dispatcher +[from] Computing for function g +[from] Done for function g +[from] Computing for function f +[from] Computing for function h <-f +[from] Done for function h +[from] Done for function f +[from] Computing for function return_A1 +[from] Done for function return_A1 +[from] Computing for function return_A2 +[from] Done for function return_A2 +[from] Computing for function dispatcher2 +[from] Done for function dispatcher2 +[from] Computing for function call_dispatcher2 +[from] Done for function call_dispatcher2 +[from] Computing for function call_dispatcher2_0 +[from] Done for function call_dispatcher2_0 +[from] Computing for function call_dispatcher2_1 +[from] Done for function call_dispatcher2_1 +[from] Computing for function main +[from] Computing for function unavailable_f <-main +[from] Done for function unavailable_f +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function access_tab: + \result FROM tab[0..2]; ind +[from] Function dispatcher: + \result FROM c_0; y_0; z_0 +[from] Function g: + \result FROM t; w +[from] Function h: + \result FROM \nothing +[from] Function f: + b FROM indirect: p; previous; direct: a; b; c (and SELF) + c FROM indirect: p; previous; direct: a; b; c (and SELF) + d FROM indirect: p; previous; direct: a; b; c (and SELF) + previous FROM direct: p + \result FROM a; b; c; d; t; p; previous +[from] Function return_A1: + \result FROM A1 +[from] Function return_A2: + \result FROM A2 +[from] Function dispatcher2: + \result FROM A1; A2; c_0 +[from] Function call_dispatcher2: + \result FROM A1; A2; r +[from] Function call_dispatcher2_0: + \result FROM A1; A2 +[from] Function call_dispatcher2_1: + \result FROM A1; A2 +[from] Function unavailable_f: + AR FROM direct: At[0..1] + AS FROM direct: Ar[0..1] +[from] Function main: + b FROM indirect: previous; direct: a; b; c (and SELF) + c FROM indirect: previous; direct: a; b; c (and SELF) + d FROM indirect: previous; direct: a; b; c (and SELF) + y FROM indirect: previous; direct: a; b; c; d; t + z FROM indirect: previous; direct: a; b; c; d; t + R1 FROM direct: A1; A2 + R2 FROM direct: A3; A4 + R3 FROM indirect: r; direct: A4; A5 + S1 FROM direct: A1; A2 + S2 FROM direct: A1; A2 + S3 FROM indirect: r; direct: A1; A2 + T0 FROM direct: A1; A2; A3; A4 + T1 FROM direct: A1; A2; A3; A4 + T2 FROM direct: A1; A2; A3; A4 + tab[0] FROM direct: A1 + [1] FROM direct: A2; A3 + [2] FROM direct: A4 + AR FROM direct: At[0..1] + AS FROM direct: Ar[0..1] + previous FROM \nothing +[from] ====== END OF DEPENDENCIES ====== diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_call.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_call.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_call.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_call.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,344 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_call.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} + c ∈ {0} + d ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} + t ∈ {0} + A1 ∈ {0} + A2 ∈ {0} + A3 ∈ {0} + A4 ∈ {0} + A5 ∈ {0} + A6 ∈ {0} + A7 ∈ {0} + A8 ∈ {0} + R1 ∈ {0} + R2 ∈ {0} + R3 ∈ {0} + S1 ∈ {0} + S2 ∈ {0} + S3 ∈ {0} + T0 ∈ {0} + T1 ∈ {0} + T2 ∈ {0} + tab[0..4] ∈ {0} + AA ∈ {0} + AR ∈ {0} + AS ∈ {0} + At[0] ∈ {{ (int)&AA }} + [1] ∈ {0} + Ar[0] ∈ {{ (int)&AA }} + [1] ∈ {0} + Ap ∈ {{ &At[0] }} + previous ∈ {{ &a }} +[value] computing for function f <- main. + Called from tests/misc/from_call.i:81. +tests/misc/from_call.i:20:[kernel] warning: Neither code nor specification for function h, generating default assigns from the prototype +[value] computing for function h <- f <- main. + Called from tests/misc/from_call.i:20. +[value] using specification for function h +[value] Done for function h +[value] computing for function g <- f <- main. + Called from tests/misc/from_call.i:20. +[value] Recording results for g +[from] Computing for function g +[from] Done for function g +[value] Done for function g +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/from_call.i:82. +[value] computing for function h <- f <- main. + Called from tests/misc/from_call.i:20. +[value] Done for function h +[value] computing for function g <- f <- main. + Called from tests/misc/from_call.i:20. +[value] Recording results for g +[from] Computing for function g +[from] Done for function g +[value] Done for function g +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/from_call.i:82. +[value] computing for function h <- f <- main. + Called from tests/misc/from_call.i:20. +[value] Done for function h +[value] computing for function g <- f <- main. + Called from tests/misc/from_call.i:20. +[value] Recording results for g +[from] Computing for function g +[from] Done for function g +[value] Done for function g +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +tests/misc/from_call.i:82:[kernel] warning: signed overflow. + assert -2147483648 ≤ tmp+tmp_0 ≤ 2147483647; + (tmp from f(& c), tmp_0 from f(& d)) +[value] computing for function dispatcher <- main. + Called from tests/misc/from_call.i:83. +[value] Recording results for dispatcher +[from] Computing for function dispatcher +[from] Done for function dispatcher +[value] Done for function dispatcher +[value] computing for function dispatcher <- main. + Called from tests/misc/from_call.i:84. +[value] Recording results for dispatcher +[from] Computing for function dispatcher +[from] Done for function dispatcher +[value] Done for function dispatcher +[value] computing for function dispatcher <- main. + Called from tests/misc/from_call.i:85. +[value] Recording results for dispatcher +[from] Computing for function dispatcher +[from] Done for function dispatcher +[value] Done for function dispatcher +[value] computing for function call_dispatcher2_1 <- main. + Called from tests/misc/from_call.i:86. +[value] computing for function dispatcher2 <- call_dispatcher2_1 <- main. + Called from tests/misc/from_call.i:49. +[value] computing for function return_A1 <- dispatcher2 <- call_dispatcher2_1 <- main. + Called from tests/misc/from_call.i:44. +[value] Recording results for return_A1 +[from] Computing for function return_A1 +[from] Done for function return_A1 +[value] Done for function return_A1 +[value] Recording results for dispatcher2 +[from] Computing for function dispatcher2 +[from] Done for function dispatcher2 +[value] Done for function dispatcher2 +[value] Recording results for call_dispatcher2_1 +[from] Computing for function call_dispatcher2_1 +[from] Done for function call_dispatcher2_1 +[value] Done for function call_dispatcher2_1 +[value] computing for function call_dispatcher2_0 <- main. + Called from tests/misc/from_call.i:87. +[value] computing for function dispatcher2 <- call_dispatcher2_0 <- main. + Called from tests/misc/from_call.i:54. +[value] computing for function return_A2 <- dispatcher2 <- call_dispatcher2_0 <- main. + Called from tests/misc/from_call.i:44. +[value] Recording results for return_A2 +[from] Computing for function return_A2 +[from] Done for function return_A2 +[value] Done for function return_A2 +[value] Recording results for dispatcher2 +[from] Computing for function dispatcher2 +[from] Done for function dispatcher2 +[value] Done for function dispatcher2 +[value] Recording results for call_dispatcher2_0 +[from] Computing for function call_dispatcher2_0 +[from] Done for function call_dispatcher2_0 +[value] Done for function call_dispatcher2_0 +[value] computing for function call_dispatcher2 <- main. + Called from tests/misc/from_call.i:88. +[value] computing for function dispatcher2 <- call_dispatcher2 <- main. + Called from tests/misc/from_call.i:59. +[value] computing for function return_A1 <- dispatcher2 <- call_dispatcher2 <- main. + Called from tests/misc/from_call.i:44. +[value] Recording results for return_A1 +[from] Computing for function return_A1 +[from] Done for function return_A1 +[value] Done for function return_A1 +[value] computing for function return_A2 <- dispatcher2 <- call_dispatcher2 <- main. + Called from tests/misc/from_call.i:44. +[value] Recording results for return_A2 +[from] Computing for function return_A2 +[from] Done for function return_A2 +[value] Done for function return_A2 +[value] Recording results for dispatcher2 +[from] Computing for function dispatcher2 +[from] Done for function dispatcher2 +[value] Done for function dispatcher2 +[value] Recording results for call_dispatcher2 +[from] Computing for function call_dispatcher2 +[from] Done for function call_dispatcher2 +[value] Done for function call_dispatcher2 +[value] computing for function access_tab <- main. + Called from tests/misc/from_call.i:92. +[value] Recording results for access_tab +[from] Computing for function access_tab +[from] Done for function access_tab +[value] Done for function access_tab +[value] computing for function access_tab <- main. + Called from tests/misc/from_call.i:93. +[value] Recording results for access_tab +[from] Computing for function access_tab +[from] Done for function access_tab +[value] Done for function access_tab +[value] computing for function access_tab <- main. + Called from tests/misc/from_call.i:94. +[value] Recording results for access_tab +[from] Computing for function access_tab +[from] Done for function access_tab +[value] Done for function access_tab +[value] computing for function unavailable_f <- main. + Called from tests/misc/from_call.i:96. +[value] using specification for function unavailable_f +[value] Done for function unavailable_f +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function access_tab: + __retres ∈ {0} +[value] Values at end of function dispatcher: + +[value] Values at end of function g: + __retres ∈ [--..--] +[value] Values at end of function f: + b ∈ {0} + c ∈ {0} + d ∈ {0} + previous ∈ {{ &b ; &c ; &d }} +[value] Values at end of function return_A1: + +[value] Values at end of function return_A2: + +[value] Values at end of function dispatcher2: + +[value] Values at end of function call_dispatcher2: + +[value] Values at end of function call_dispatcher2_0: + +[value] Values at end of function call_dispatcher2_1: + +[value] Values at end of function main: + b ∈ {0} + c ∈ {0} + d ∈ {0} + y ∈ [--..--] + z ∈ [--..--] + R1 ∈ {0} + R2 ∈ {0} + R3 ∈ {0} + S1 ∈ {0} + S2 ∈ {0} + S3 ∈ {0} + T0 ∈ {0} + T1 ∈ {0} + T2 ∈ {0} + tab[0..4] ∈ {0} + AR ∈ + {{ garbled mix of &{AA} + (origin: Arithmetic {tests/misc/from_call.i:96}) }} + AS ∈ + {{ garbled mix of &{AA} + (origin: Arithmetic {tests/misc/from_call.i:96}) }} + previous ∈ {{ &d }} +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to g at tests/misc/from_call.i:20 (by f): + \result FROM t; w +[from] call to h at tests/misc/from_call.i:20 (by f): + \result FROM \nothing +[from] call to return_A1 at tests/misc/from_call.i:44 (by dispatcher2): + \result FROM A1 +[from] call to return_A2 at tests/misc/from_call.i:44 (by dispatcher2): + \result FROM A2 +[from] call to dispatcher2 at tests/misc/from_call.i:59 (by call_dispatcher2): + \result FROM A1; A2; c_0 +[from] call to dispatcher2 at tests/misc/from_call.i:54 (by call_dispatcher2_0): + \result FROM A2; c_0 +[from] call to dispatcher2 at tests/misc/from_call.i:49 (by call_dispatcher2_1): + \result FROM A1; c_0 +[from] call to f at tests/misc/from_call.i:81 (by main): + b FROM a; p; previous + previous FROM p + \result FROM a; t; p; previous +[from] call to f at tests/misc/from_call.i:82 (by main): + c FROM b; p; previous + previous FROM p + \result FROM b; t; p; previous +[from] call to f at tests/misc/from_call.i:82 (by main): + d FROM c; p; previous + previous FROM p + \result FROM c; t; p; previous +[from] call to dispatcher at tests/misc/from_call.i:83 (by main): + \result FROM c_0; y_0 +[from] call to dispatcher at tests/misc/from_call.i:84 (by main): + \result FROM c_0; z_0 +[from] call to dispatcher at tests/misc/from_call.i:85 (by main): + \result FROM c_0; y_0; z_0 +[from] call to call_dispatcher2_1 at tests/misc/from_call.i:86 (by main): + \result FROM A1 +[from] call to call_dispatcher2_0 at tests/misc/from_call.i:87 (by main): + \result FROM A2 +[from] call to call_dispatcher2 at tests/misc/from_call.i:88 (by main): + \result FROM A1; A2; r +[from] call to access_tab at tests/misc/from_call.i:92 (by main): + \result FROM tab[0]; ind +[from] call to access_tab at tests/misc/from_call.i:93 (by main): + \result FROM tab[1]; ind +[from] call to access_tab at tests/misc/from_call.i:94 (by main): + \result FROM tab[2]; ind +[from] call to unavailable_f at tests/misc/from_call.i:96 (by main): + AR FROM At[0..1] + AS FROM Ar[0..1] +[from] entry point: + b FROM a; previous + c FROM a; previous + d FROM a; previous + y FROM a; t; previous + z FROM a; t; previous + R1 FROM A1 + R2 FROM A4 + R3 FROM A4; A5; r + S1 FROM A1 + S2 FROM A2 + S3 FROM A1; A2; r + T0 FROM A1 + T1 FROM A2; A3 + T2 FROM A4 + tab[0] FROM A1 + [1] FROM A2; A3 + [2] FROM A4 + AR FROM At[0..1] + AS FROM Ar[0..1] + previous FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[users] ====== DISPLAYING USERS ====== + f: g h + dispatcher2: return_A1 return_A2 + call_dispatcher2: return_A1 return_A2 dispatcher2 + call_dispatcher2_0: return_A2 dispatcher2 + call_dispatcher2_1: return_A1 dispatcher2 + main: g h f dispatcher return_A1 return_A2 dispatcher2 call_dispatcher2_1 + call_dispatcher2_0 call_dispatcher2 access_tab unavailable_f + ====== END OF USERS ========== +[inout] Inputs for function access_tab: + tab[0..2] +[inout] Inputs for function dispatcher: + \nothing +[inout] Inputs for function g: + t +[inout] Inputs for function f: + a; b; c; d; x; t; previous +[inout] Inputs for function return_A1: + A1 +[inout] Inputs for function return_A2: + A2 +[inout] Inputs for function dispatcher2: + A1; A2 +[inout] Inputs for function call_dispatcher2: + A1; A2 +[inout] Inputs for function call_dispatcher2_0: + A1; A2 +[inout] Inputs for function call_dispatcher2_1: + A1; A2 +[inout] Inputs for function main: + a; b; c; d; x; t; A1; A2; A3; A4; A5; A6; A7; tab[0..2]; At[0..1]; + Ar[0..1]; previous diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_global.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_global.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_global.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_global.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,50 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_global.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + A ∈ {0} + B ∈ {0} + C ∈ {0} + D ∈ {0} + E ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/from_global.i:13. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + B ∈ {0} + C ∈ {0} +[value] Values at end of function main: + A ∈ {0} + B ∈ {0} + C ∈ {0} + __retres ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + B FROM A + C FROM x + \result FROM x +[from] Function main: + A FROM D + B FROM D + C FROM E + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + B; C +[inout] Inputs for function f: + A; C +[inout] Out (internal) for function main: + A; B; C; __retres +[inout] Inputs for function main: + A; C; D; E diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_ind.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_ind.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_ind.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_ind.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_ind.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a[0..3] ∈ {0} + p ∈ {{ &a[0] }} + r ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + r ∈ {0} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + r FROM indirect: p; direct: a[1] + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + r; __retres +[inout] Inputs for function main: + a[1]; p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_pb.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_pb.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_pb.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_pb.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_pb.i (no preprocessing) +[value] Analyzing a complete application starting at main1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + k ∈ {0} + i ∈ {0} + j ∈ {0} + x ∈ {0} + c ∈ {0} + d ∈ {0} + T[0..9] ∈ {0} +[value] Recording results for main1 +[value] done for function main1 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main1: + x ∈ {0} +[from] Computing for function main1 +[from] Done for function main1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main1: + x FROM k; j +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main1: + x +[inout] Inputs for function main1: + k; j diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_pb.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_pb.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_pb.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_pb.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_pb.i (no preprocessing) +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + k ∈ {0} + i ∈ {0} + j ∈ {0} + x ∈ {0} + c ∈ {0} + d ∈ {0} + T[0..9] ∈ {0} +[value] Recording results for main2 +[value] done for function main2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main2: + x ∈ {0} +[from] Computing for function main2 +[from] Done for function main2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main2: + x FROM k; j +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main2: + x +[inout] Inputs for function main2: + k; j diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_pb.3.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_pb.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_pb.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_pb.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,30 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_pb.i (no preprocessing) +[value] Analyzing a complete application starting at main3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + k ∈ {0} + i ∈ {0} + j ∈ {0} + x ∈ {0} + c ∈ {0} + d ∈ {0} + T[0..9] ∈ {0} +[value] Recording results for main3 +[value] done for function main3 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main3: + T[0..9] ∈ {0} + p ∈ {{ &T + {1} }} +[from] Computing for function main3 +[from] Done for function main3 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main3: + T[1] FROM x; c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main3: + T[1]; p +[inout] Inputs for function main3: + x; c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_pb.4.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_pb.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_pb.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_pb.4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_pb.i (no preprocessing) +[value] Analyzing a complete application starting at main4 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + k ∈ {0} + i ∈ {0} + j ∈ {0} + x ∈ {0} + c ∈ {0} + d ∈ {0} + T[0..9] ∈ {0} +[value] Recording results for main4 +[value] done for function main4 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main4: + T[0..9] ∈ {0} +[from] Computing for function main4 +[from] Done for function main4 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main4: + T[0] FROM k; c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main4: + T[0] +[inout] Inputs for function main4: + k; c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_pb.5.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_pb.5.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_pb.5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_pb.5.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,30 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_pb.i (no preprocessing) +[value] Analyzing a complete application starting at main4bis +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + k ∈ {0} + i ∈ {0} + j ∈ {0} + x ∈ {0} + c ∈ {0} + d ∈ {0} + T[0..9] ∈ {0} +[value] Recording results for main4bis +[value] done for function main4bis +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main4bis: + T[0..9] ∈ {0} +[from] Computing for function main4bis +[from] Done for function main4bis +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main4bis: + T[0] FROM i; c + [2] FROM j; c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main4bis: + T{[0]; [2]} +[inout] Inputs for function main4bis: + i; j; c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_pb.6.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_pb.6.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_pb.6.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_pb.6.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_pb.i (no preprocessing) +[value] Analyzing a complete application starting at main5 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + k ∈ {0} + i ∈ {0} + j ∈ {0} + x ∈ {0} + c ∈ {0} + d ∈ {0} + T[0..9] ∈ {0} +[value] Recording results for main5 +[value] done for function main5 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main5: + T[0..9] ∈ {0} +[from] Computing for function main5 +[from] Done for function main5 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main5: + T[0] FROM k; c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main5: + T[0] +[inout] Inputs for function main5: + k; c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_pb.7.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_pb.7.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_pb.7.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_pb.7.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,30 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_pb.i (no preprocessing) +[value] Analyzing a complete application starting at main5bis +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + k ∈ {0} + i ∈ {0} + j ∈ {0} + x ∈ {0} + c ∈ {0} + d ∈ {0} + T[0..9] ∈ {0} +[value] Recording results for main5bis +[value] done for function main5bis +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main5bis: + T[0..9] ∈ {0} +[from] Computing for function main5bis +[from] Done for function main5bis +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main5bis: + T[0] FROM i; c + [1] FROM j; c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main5bis: + T[0..1] +[inout] Inputs for function main5bis: + i; j; c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_pb.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_pb.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_pb.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_pb.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_pb.i (no preprocessing) +[value] Analyzing a complete application starting at main0 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + k ∈ {0} + i ∈ {0} + j ∈ {0} + x ∈ {0} + c ∈ {0} + d ∈ {0} + T[0..9] ∈ {0} +[value] Recording results for main0 +[value] done for function main0 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main0: + x ∈ {0} +[from] Computing for function main0 +[from] Done for function main0 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main0: + x FROM k; j +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main0: + x +[inout] Inputs for function main0: + k; j diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_ptr.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_ptr.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_ptr.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_ptr.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,40 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_ptr.i (no preprocessing) +[value] Analyzing a complete application starting at main1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + x ∈ {0} + k ∈ {0} + l ∈ {0} + m ∈ {0} + n ∈ {0} + d ∈ {0} + a ∈ {0} + b ∈ {0} + p[0..9][0..9][0..9] ∈ {0} + q ∈ {0} +[value] Recording results for main1 +[value] done for function main1 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main1: + i ∈ {{ (long)&p }} + d ∈ {0} + p[0..9][0..9][0..9] ∈ {0} + q ∈ {{ &a ; &b }} +[from] Computing for function main1 +[from] Done for function main1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main1: + i FROM \nothing + d FROM a; b; c + p[0][0][0] FROM a; c (and SELF) + q FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main1: + i; d; p[0][0][0]; q +[inout] Inputs for function main1: + i; a; b; q diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_ptr2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_ptr2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_ptr2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_ptr2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,37 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_ptr2.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/misc/from_ptr2.i:7. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ [--..--] +[value] Values at end of function main: + s ∈ [--..--] +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM ps; s.a +[from] Function main: + \result FROM x +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + s.a +[inout] Out (internal) for function main: + s; tmp +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_ptr.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_ptr.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_ptr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_ptr.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_ptr.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + x ∈ {0} + k ∈ {0} + l ∈ {0} + m ∈ {0} + n ∈ {0} + d ∈ {0} + a ∈ {0} + b ∈ {0} + p[0..9][0..9][0..9] ∈ {0} + q ∈ {0} +tests/misc/from_ptr.i:17:[kernel] warning: out of bounds write. assert \valid((int *)i); +tests/misc/from_ptr.i:17:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +tests/misc/from_ptr.i:17:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {{ (long)&p[10] }} + d ∈ {0} + q ∈ {{ &b }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + i FROM \nothing + d FROM b; c + q FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; d; q +[inout] Inputs for function main: + i; a; b; q diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_res_2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_res_2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_res_2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_res_2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,104 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_res_2.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + A ∈ {0} + B ∈ {0} + C ∈ {0} + x1 ∈ {0} + x2 ∈ {0} + x3 ∈ {0} + y1 ∈ {0} + y2 ∈ {0} + y3 ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/from_res_2.i:26. +[value] Recording results for f +[value] Done for function f +[value] computing for function g1 <- main. + Called from tests/misc/from_res_2.i:30. +[value] Recording results for g1 +[value] Done for function g1 +[value] computing for function g2 <- main. + Called from tests/misc/from_res_2.i:34. +[value] Recording results for g2 +[value] Done for function g2 +[value] computing for function g3 <- main. + Called from tests/misc/from_res_2.i:38. +[value] Recording results for g3 +[value] Done for function g3 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {3} +[value] Values at end of function g1: + +[value] Values at end of function g2: + +[value] Values at end of function g3: + +[value] Values at end of function main: + G ∈ {3} + x1 ∈ {0} + x2 ∈ {0} + x3 ∈ {0} + y1 ∈ {0} + y2 ∈ {0} + y3 ∈ {0} + p ∈ {{ &G }} +[from] Computing for function f +[from] Done for function f +[from] Computing for function g1 +[from] Done for function g1 +[from] Computing for function g2 +[from] Done for function g2 +[from] Computing for function g3 +[from] Done for function g3 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM left; right +[from] Function g1: + \result FROM x1 +[from] Function g2: + \result FROM x2 +[from] Function g3: + \result FROM x3 +[from] Function main: + G FROM G + x1.a FROM A + .c FROM C + x2.a FROM A + .b FROM B + x3.b FROM B + .c FROM C + y1 FROM A; C; x1.b + y2 FROM A; B; x2.c + y3 FROM B; C; x3.a +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function g1: + \nothing +[inout] Inputs for function g1: + x1 +[inout] Out (internal) for function g2: + \nothing +[inout] Inputs for function g2: + x2 +[inout] Out (internal) for function g3: + \nothing +[inout] Inputs for function g3: + x3 +[inout] Out (internal) for function main: + G; x1{.a; .c}; x2{.a; .b}; x3{.b; .c}; y1; y2; y3; p +[inout] Inputs for function main: + G; A; B; C; x1; x2; x3 diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/from_termin.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_termin.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/from_termin.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/from_termin.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/from_termin.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + b ∈ {0} + c ∈ {0} + d ∈ {0} + e ∈ {0} +tests/misc/from_termin.i:8:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + b ∈ {0} + d ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + b FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + b; d +[inout] Inputs for function main: + c; e diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/function_return_serial_casts.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/function_return_serial_casts.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/function_return_serial_casts.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/function_return_serial_casts.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,60 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/function_return_serial_casts.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {-10} + y ∈ {0} + z ∈ {0} + t ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/function_return_serial_casts.i:17. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/function_return_serial_casts.i:18. +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {65526} +[value] Values at end of function g: + l ∈ {-10} +[value] Values at end of function main: + y ∈ {65526} + z ∈ {65526} + t ∈ {65526} + __retres ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM x +[from] Function g: + \result FROM x +[from] Function main: + y FROM x + z FROM x + t FROM x + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + x +[inout] Out (internal) for function g: + l +[inout] Inputs for function g: + x +[inout] Out (internal) for function main: + y; z; t; __retres +[inout] Inputs for function main: + x diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/fun_ptr.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/fun_ptr.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/fun_ptr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/fun_ptr.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,130 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/fun_ptr.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0] ∈ {{ (long)&f }} + [1] ∈ {{ (long)&g }} + R1 ∈ {0} + R2 ∈ {0} + R3 ∈ {0} + v ∈ [--..--] +[value] computing for function test1 <- main. + Called from tests/misc/fun_ptr.i:44. +tests/misc/fun_ptr.i:24:[value] warning: Function pointer and pointed function 'g' have incompatible types: + int (int ) vs. int (int x, int y). assert(function type matches) +[value] computing for function f <- test1 <- main. + Called from tests/misc/fun_ptr.i:24. +[value] Recording results for f +[value] Done for function f +[value] Recording results for test1 +[value] Done for function test1 +[value] computing for function test2 <- main. + Called from tests/misc/fun_ptr.i:45. +tests/misc/fun_ptr.i:29:[value] warning: Function pointer and pointed function 'f' have incompatible types: + int (int , int ) vs. int (int x). assert(function type matches) +[value] computing for function g <- test2 <- main. + Called from tests/misc/fun_ptr.i:29. +[value] Recording results for g +[value] Done for function g +[value] Recording results for test2 +[value] Done for function test2 +[value] computing for function test3 <- main. + Called from tests/misc/fun_ptr.i:46. +tests/misc/fun_ptr.i:34:[value] warning: Function pointer and pointed function 'f' have incompatible types: + double (int ) vs. int (int x). assert(function type matches) +tests/misc/fun_ptr.i:34:[value] warning: Function pointer and pointed function 'g' have incompatible types: + double (int ) vs. int (int x, int y). assert(function type matches) +[value] Recording results for test3 +[value] Done for function test3 +tests/misc/fun_ptr.i:49:[value] warning: Function type must match type at call site: assert(function type matches) +tests/misc/fun_ptr.i:51:[value] warning: Function type must match type at call site: assert(function type matches) +[value] computing for function h <- main. + Called from tests/misc/fun_ptr.i:53. +[value] Recording results for h +[value] Done for function h +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {4} +[value] Values at end of function g: + __retres ∈ {7} +[value] Values at end of function h: + __retres ∈ {3.} +[value] Values at end of function test1: + R1 ∈ {4} +[value] Values at end of function test2: + R2 ∈ {7} +[value] Values at end of function test3: + NON TERMINATING FUNCTION +[value] Values at end of function main: + R1 ∈ {4} + R2 ∈ {7} + R3 ∈ {0} + ph ∈ {{ &h }} + __retres ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] Computing for function h +[from] Done for function h +[from] Computing for function test1 +[from] Done for function test1 +[from] Computing for function test2 +[from] Done for function test2 +[from] Computing for function test3 +[from] Non-terminating function test3 (no dependencies) +[from] Done for function test3 +[from] Computing for function main +tests/misc/fun_ptr.i:51:[from] warning: variadic call detected. Using only 0 argument(s). +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM x +[from] Function g: + \result FROM x; y +[from] Function h: + \result FROM a; b +[from] Function test1: + R1 FROM t[0..1]; nd +[from] Function test2: + R2 FROM t[0..1]; nd +[from] Function test3: + NON TERMINATING - NO EFFECTS +[from] Function main: + R1 FROM t[0..1]; c + R2 FROM t[0..1]; c + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function g: + __retres +[inout] Inputs for function g: + \nothing +[inout] Out (internal) for function h: + __retres +[inout] Inputs for function h: + \nothing +[inout] Out (internal) for function test1: + R1 +[inout] Inputs for function test1: + t[0..1] +[inout] Out (internal) for function test2: + R2 +[inout] Inputs for function test2: + t[0..1] +[inout] Out (internal) for function test3: + R3 +[inout] Inputs for function test3: + t[0..1] +[inout] Out (internal) for function main: + R1; R2; R3; ph; __retres +[inout] Inputs for function main: + t[0..1] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/g1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/g1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/g1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/g1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/g1.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {1} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/garbled_init.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/garbled_init.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/garbled_init.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/garbled_init.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,24 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/garbled_init.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + PTR ∈ {0} + G ∈ {{ &PTR + {-4278190080} }} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + PTR ∈ {1} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + PTR FROM G +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + PTR +[inout] Inputs for function main: + G diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/ghost.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/ghost.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/ghost.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/ghost.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,31 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/ghost.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + GHOST ∈ {0} + H ∈ {0} +tests/misc/ghost.i:16:[value] entering loop for the first time +tests/misc/ghost.i:17:[kernel] warning: signed overflow. assert G+1 ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + G ∈ [0..2147483647] + GHOST ∈ {0} + i ∈ {11} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + G FROM \nothing + GHOST FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + G; GHOST; i; j +[inout] Inputs for function main: + G diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/global_bug.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/global_bug.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/global_bug.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/global_bug.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,38 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/global_bug.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +tests/misc/global_bug.i:6:[kernel] warning: invalid RHS operand for shift. assert 0 ≤ 63 < 32; +tests/misc/global_bug.i:7:[value] Evaluation of initializer '99 << 63' failed +[value] Initial state computed +[value] Values of globals at initialization + NOT ACCESSIBLE +[value] Value analysis not started because globals initialization is not computable. +[value] ====== VALUES COMPUTED ====== +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion 'Value,shift' (file tests/misc/global_bug.i, line 7) + tried with Value. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 To be validated + 1 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/goto.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/goto.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/goto.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/goto.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/goto.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function stop <- main. + Called from tests/misc/goto.i:10. +[value] Recording results for stop +[value] Done for function stop +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function stop: + NON TERMINATING FUNCTION +[value] Values at end of function main: + c ∈ [--..--] + __retres ∈ {0} +[from] Computing for function stop +[from] Non-terminating function stop (no dependencies) +[from] Done for function stop +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function stop: + NON TERMINATING - NO EFFECTS +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function stop: + \nothing +[inout] Inputs for function stop: + \nothing +[inout] Out (internal) for function main: + c; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/if.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/if.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/if.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/if.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/if.i (no preprocessing) +[value] Analyzing a complete application starting at main6 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + H ∈ {0} + J ∈ {0} + p ∈ {0} + q ∈ {0} + t[0..99] ∈ {0} +[value] Recording results for main6 +[value] done for function main6 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main6: + G ∈ {0} + __retres ∈ {1} +[from] Computing for function main6 +[from] Done for function main6 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main6: + G FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/if2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/if2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/if2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/if2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/if2.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + G_int ∈ {75} + mode_int ∈ {0} + mode ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + G_int ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + G_int FROM mode_int +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + G_int +[inout] Inputs for function main: + mode_int; mode diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/if.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/if.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/if.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/if.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,30 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/if.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + H ∈ {0} + J ∈ {0} + p ∈ {0} + q ∈ {0} + t[0..99] ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + p ∈ {{ &t[0] }} + q ∈ {{ &t[0] }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + p FROM G + q FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + p; q +[inout] Inputs for function main: + G; p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/ilevel.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/ilevel.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/ilevel.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/ilevel.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,104 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/ilevel.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] + i ∈ {0} + j ∈ {0} + k ∈ {0} + l ∈ {0} +tests/misc/ilevel.i:9:[value] entering loop for the first time +tests/misc/ilevel.i:12:[value] entering loop for the first time +tests/misc/ilevel.i:20:[value] Assertion got status unknown. +tests/misc/ilevel.i:22:[value] Assertion got status unknown. +[value] Called Frama_C_show_each([0..9]) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {0; 1; 2; 3; 4; 5; 6; 7} + j ∈ [0..16] + k ∈ [0..15] + l ∈ [0..9] + __retres ∈ [0..47] +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function Frama_C_show_each +[from] Done for function Frama_C_show_each +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] + i ∈ {0} + j ∈ {0} + k ∈ {0} + l ∈ {0} +tests/misc/ilevel.i:9:[value] entering loop for the first time +tests/misc/ilevel.i:12:[value] entering loop for the first time +tests/misc/ilevel.i:26:[kernel] warning: signed overflow. assert (int)((int)(i+j)+k)+l ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {0; 1; 2; 3; 4; 5; 6; 7} + j ∈ [0..16] + k ∈ {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15} + l ∈ [--..--] + __retres ∈ [--..--] +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] + i ∈ {0} + j ∈ {0} + k ∈ {0} + l ∈ {0} +[value] Called Frama_C_show_each({0; 1; 2; 3; 4; 6; 7; 8; 9}) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {0; 1; 2; 3; 4; 5; 6; 7} + j ∈ {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16} + k ∈ {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15} + l ∈ {0; 1; 2; 3; 4; 6; 7; 8; 9} + __retres ∈ [0..47] +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] + i ∈ {0} + j ∈ {0} + k ∈ {0} + l ∈ {0} +[value] Called Frama_C_show_each({0; 1; 2; 3; 4; 6; 7; 8; 9}) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {0; 1; 2; 3; 4; 5; 6; 7} + j ∈ {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16} + k ∈ {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15} + l ∈ {0; 1; 2; 3; 4; 6; 7; 8; 9} + __retres ∈ + {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; + 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; + 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/implies.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/implies.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/implies.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/implies.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/implies.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + A ∈ {0} + B ∈ {0} +tests/misc/implies.i:6:[value] Assertion got status unknown. +tests/misc/implies.i:8:[value] Assertion got status unknown. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + A ∈ {1} + __retres ∈ {1} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + A FROM d + \result FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + A; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/imprecise_invalid_write.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/imprecise_invalid_write.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/imprecise_invalid_write.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/imprecise_invalid_write.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,95 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/imprecise_invalid_write.i (no preprocessing) +tests/misc/imprecise_invalid_write.i:5:[kernel] warning: Body of function main1 falls-through. Adding a return statement +tests/misc/imprecise_invalid_write.i:10:[kernel] warning: Body of function main2 falls-through. Adding a return statement +tests/misc/imprecise_invalid_write.i:17:[kernel] warning: Body of function main3 falls-through. Adding a return statement +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + s ∈ {{ "abc" }} +[value] computing for function main1 <- main. + Called from tests/misc/imprecise_invalid_write.i:22. +tests/misc/imprecise_invalid_write.i:5:[kernel] warning: out of bounds write. assert \valid((int *)c); +tests/misc/imprecise_invalid_write.i:5:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/imprecise_invalid_write.i:25. +tests/misc/imprecise_invalid_write.i:9:[value] warning: Operation {{ &main1 }} + {{ &main1 }} incurs a loss of precision +tests/misc/imprecise_invalid_write.i:9:[value] Assigning imprecise value to p. + The imprecision originates from Arithmetic + {tests/misc/imprecise_invalid_write.i:9} +tests/misc/imprecise_invalid_write.i:10:[value] Reading left-value p. + It contains a garbled mix of {main1} because of Arithmetic + {tests/misc/imprecise_invalid_write.i:9}. +tests/misc/imprecise_invalid_write.i:10:[kernel] warning: out of bounds write. assert \valid(p); +tests/misc/imprecise_invalid_write.i:10:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main2 +[value] Done for function main2 +[value] computing for function main3 <- main. + Called from tests/misc/imprecise_invalid_write.i:28. +tests/misc/imprecise_invalid_write.i:16:[value] warning: Operation {{ "abc" }} + {{ "abc" }} incurs a loss of precision +tests/misc/imprecise_invalid_write.i:16:[value] Assigning imprecise value to p. + The imprecision originates from Arithmetic + {tests/misc/imprecise_invalid_write.i:16} +tests/misc/imprecise_invalid_write.i:17:[value] Reading left-value p. + It contains a garbled mix of {"abc"} because of Arithmetic + {tests/misc/imprecise_invalid_write.i:16}. +tests/misc/imprecise_invalid_write.i:17:[kernel] warning: out of bounds write. assert \valid(p); +tests/misc/imprecise_invalid_write.i:17:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main3 +[value] Done for function main3 +[value] Recording results for main +[value] done for function main +tests/misc/imprecise_invalid_write.i:5:[value] Assertion 'Value,mem_access' got final status invalid. +tests/misc/imprecise_invalid_write.i:10:[value] Assertion 'Value,mem_access' got final status invalid. +tests/misc/imprecise_invalid_write.i:17:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main1: + NON TERMINATING FUNCTION +[value] Values at end of function main2: + NON TERMINATING FUNCTION +[value] Values at end of function main3: + NON TERMINATING FUNCTION +[value] Values at end of function main: + +[from] Computing for function main1 +[from] Non-terminating function main1 (no dependencies) +[from] Done for function main1 +[from] Computing for function main2 +[from] Non-terminating function main2 (no dependencies) +[from] Done for function main2 +[from] Computing for function main3 +[from] Non-terminating function main3 (no dependencies) +[from] Done for function main3 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main1: + NON TERMINATING - NO EFFECTS +[from] Function main2: + NON TERMINATING - NO EFFECTS +[from] Function main3: + NON TERMINATING - NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main1: + \nothing +[inout] Inputs for function main1: + x +[inout] Out (internal) for function main2: + p +[inout] Inputs for function main2: + \nothing +[inout] Out (internal) for function main3: + p +[inout] Inputs for function main3: + s +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + x; s diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/incorrect_reduce_expr.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/incorrect_reduce_expr.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/incorrect_reduce_expr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/incorrect_reduce_expr.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,17 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/incorrect_reduce_expr.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + NULL[rbits 256 to 295] ∈ [--..--] + t[0..4] ∈ {0} + p ∈ {0} + x ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NULL[rbits 256 to 295] ∈ [--..--] + p ∈ {32; 36} + x ∈ {13} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/ineq.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/ineq.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/ineq.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/ineq.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,70 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/ineq.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G[0..9] ∈ {0} + g ∈ {0} + h ∈ {0} + i ∈ {0} + j ∈ {0} + k ∈ {1} + l ∈ {1} + m ∈ {-1} + n ∈ {-1} +[value] computing for function any_int <- main. + Called from tests/misc/ineq.c:6. +tests/misc/any_int.c:9:[value] entering loop for the first time +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert y+1 ≤ 2147483647; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert y+1 ≤ 2147483647; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert -2147483648 ≤ y-1; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert -2147483648 ≤ x-1; +[value] Recording results for any_int +[value] Done for function any_int +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function any_int: + y ∈ [--..--] + x ∈ [--..--] +[value] Values at end of function main: + G[0] ∈ {0; 7} + [1..9] ∈ {0} + g ∈ [0..2147483647] + h ∈ [-2147483648..0] + i ∈ [0..2147483647] + j ∈ [-2147483648..0] + k ∈ [1..2147483647] + l ∈ [1..2147483647] + m ∈ [-2147483648..-1] + n ∈ [-2147483648..-1] + x ∈ [--..--] +[from] Computing for function any_int +[from] Done for function any_int +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function any_int: + \result FROM \nothing +[from] Function main: + G[0] FROM \nothing + g FROM \nothing (and SELF) + h FROM \nothing (and SELF) + i FROM \nothing (and SELF) + j FROM \nothing (and SELF) + k FROM \nothing (and SELF) + l FROM \nothing (and SELF) + m FROM \nothing (and SELF) + n FROM \nothing (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function any_int: + y; x +[inout] Inputs for function any_int: + \nothing +[inout] Out (internal) for function main: + G[0]; g; h; i; j; k; l; m; n; x +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/infinite.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/infinite.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/infinite.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/infinite.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,34 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/infinite.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} +tests/misc/infinite.i:6:[value] entering loop for the first time +[value] computing for function pause <- main. + Called from tests/misc/infinite.i:9. +tests/misc/infinite.i:9:[kernel] warning: Neither code nor specification for function pause, generating default assigns from the prototype +[value] using specification for function pause +[value] Done for function pause +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Computing for function pause <-main +[from] Done for function pause +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function pause: + NO EFFECTS +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + G +[inout] Inputs for function main: + G diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/init.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/init.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/init.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/init.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,152 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/init.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S[0] ∈ {49} + [1] ∈ {50} + [2] ∈ {51} + [3] ∈ {52} + [4] ∈ {53} + v1 ∈ {0} + TS[0].x ∈ {1} + [0].y ∈ {3} + [0].name[0] ∈ {175304776} + {[0].name[1..9]; [1..28]} ∈ {0} + v2{.x2; .y2} ∈ {0} + .[bits 48 to 63] ∈ UNINITIALIZED + .ptr ∈ {0} + C ∈ {0} + PC[0] ∈ {108} + [1] ∈ {107} + [2] ∈ {106} + [3] ∈ {108} + [4] ∈ {106} + [5] ∈ {0} + T2[0].x2 ∈ {1} + [0].y2 ∈ {2} + [0].[bits 48 to 63] ∈ UNINITIALIZED + [0].ptr ∈ {{ &PC[0] }} + [1].x2 ∈ {1} + [1].y2 ∈ {2} + [1].[bits 48 to 63] ∈ UNINITIALIZED + {[1].ptr; [2]{.x2; .y2}} ∈ {0} + [2].[bits 48 to 63] ∈ UNINITIALIZED + {[2].ptr; [3]{.x2; .y2}} ∈ {0} + [3].[bits 48 to 63] ∈ UNINITIALIZED + {[3].ptr; [4]{.x2; .y2}} ∈ {0} + [4].[bits 48 to 63] ∈ UNINITIALIZED + {[4].ptr; [5]{.x2; .y2}} ∈ {0} + [5].[bits 48 to 63] ∈ UNINITIALIZED + {[5].ptr; [6]{.x2; .y2}} ∈ {0} + [6].[bits 48 to 63] ∈ UNINITIALIZED + {[6].ptr; [7]{.x2; .y2}} ∈ {0} + [7].[bits 48 to 63] ∈ UNINITIALIZED + {[7].ptr; [8]{.x2; .y2}} ∈ {0} + [8].[bits 48 to 63] ∈ UNINITIALIZED + {[8].ptr; [9]{.x2; .y2}} ∈ {0} + [9].[bits 48 to 63] ∈ UNINITIALIZED + {[9].ptr; [10]{.x2; .y2}} ∈ {0} + [10].[bits 48 to 63] ∈ UNINITIALIZED + {[10].ptr; [11]{.x2; .y2}} ∈ {0} + [11].[bits 48 to 63] ∈ UNINITIALIZED + {[11].ptr; [12]{.x2; .y2}} ∈ {0} + [12].[bits 48 to 63] ∈ UNINITIALIZED + {[12].ptr; [13]{.x2; .y2}} ∈ {0} + [13].[bits 48 to 63] ∈ UNINITIALIZED + {[13].ptr; [14]{.x2; .y2}} ∈ {0} + [14].[bits 48 to 63] ∈ UNINITIALIZED + {[14].ptr; [15]{.x2; .y2}} ∈ {0} + [15].[bits 48 to 63] ∈ UNINITIALIZED + {[15].ptr; [16]{.x2; .y2}} ∈ {0} + [16].[bits 48 to 63] ∈ UNINITIALIZED + {[16].ptr; [17]{.x2; .y2}} ∈ {0} + [17].[bits 48 to 63] ∈ UNINITIALIZED + {[17].ptr; [18]{.x2; .y2}} ∈ {0} + [18].[bits 48 to 63] ∈ UNINITIALIZED + {[18].ptr; [19]{.x2; .y2}} ∈ {0} + [19].[bits 48 to 63] ∈ UNINITIALIZED + {[19].ptr; [20]{.x2; .y2}} ∈ {0} + [20].[bits 48 to 63] ∈ UNINITIALIZED + {[20].ptr; [21]{.x2; .y2}} ∈ {0} + [21].[bits 48 to 63] ∈ UNINITIALIZED + {[21].ptr; [22]{.x2; .y2}} ∈ {0} + [22].[bits 48 to 63] ∈ UNINITIALIZED + {[22].ptr; [23]{.x2; .y2}} ∈ {0} + [23].[bits 48 to 63] ∈ UNINITIALIZED + {[23].ptr; [24]{.x2; .y2}} ∈ {0} + [24].[bits 48 to 63] ∈ UNINITIALIZED + {[24].ptr; [25]{.x2; .y2}} ∈ {0} + [25].[bits 48 to 63] ∈ UNINITIALIZED + {[25].ptr; [26]{.x2; .y2}} ∈ {0} + [26].[bits 48 to 63] ∈ UNINITIALIZED + {[26].ptr; [27]{.x2; .y2}} ∈ {0} + [27].[bits 48 to 63] ∈ UNINITIALIZED + {[27].ptr; [28]{.x2; .y2}} ∈ {0} + [28].[bits 48 to 63] ∈ UNINITIALIZED + {[28].ptr; [29]{.x2; .y2}} ∈ {0} + [29].[bits 48 to 63] ∈ UNINITIALIZED + {[29].ptr; [30]{.x2; .y2}} ∈ {0} + [30].[bits 48 to 63] ∈ UNINITIALIZED + {[30].ptr; [31]{.x2; .y2}} ∈ {0} + [31].[bits 48 to 63] ∈ UNINITIALIZED + {[31].ptr; [32]{.x2; .y2}} ∈ {0} + [32].[bits 48 to 63] ∈ UNINITIALIZED + {[32].ptr; [33]{.x2; .y2}} ∈ {0} + [33].[bits 48 to 63] ∈ UNINITIALIZED + {[33].ptr; [34]{.x2; .y2}} ∈ {0} + [34].[bits 48 to 63] ∈ UNINITIALIZED + {[34].ptr; [35]{.x2; .y2}} ∈ {0} + [35].[bits 48 to 63] ∈ UNINITIALIZED + {[35].ptr; [36]{.x2; .y2}} ∈ {0} + [36].[bits 48 to 63] ∈ UNINITIALIZED + {[36].ptr; [37]{.x2; .y2}} ∈ {0} + [37].[bits 48 to 63] ∈ UNINITIALIZED + {[37].ptr; [38]{.x2; .y2}} ∈ {0} + [38].[bits 48 to 63] ∈ UNINITIALIZED + {[38].ptr; [39]{.x2; .y2}} ∈ {0} + [39].[bits 48 to 63] ∈ UNINITIALIZED + {[39].ptr; [40]{.x2; .y2}} ∈ {0} + [40].[bits 48 to 63] ∈ UNINITIALIZED + {[40].ptr; [41]{.x2; .y2}} ∈ {0} + [41].[bits 48 to 63] ∈ UNINITIALIZED + {[41].ptr; [42]{.x2; .y2}} ∈ {0} + [42].[bits 48 to 63] ∈ UNINITIALIZED + {[42].ptr; [43]{.x2; .y2}} ∈ {0} + [43].[bits 48 to 63] ∈ UNINITIALIZED + {[43].ptr; [44]{.x2; .y2}} ∈ {0} + [44].[bits 48 to 63] ∈ UNINITIALIZED + {[44].ptr; [45]{.x2; .y2}} ∈ {0} + [45].[bits 48 to 63] ∈ UNINITIALIZED + {[45].ptr; [46]{.x2; .y2}} ∈ {0} + [46].[bits 48 to 63] ∈ UNINITIALIZED + {[46].ptr; [47]{.x2; .y2}} ∈ {0} + [47].[bits 48 to 63] ∈ UNINITIALIZED + {[47].ptr; [48]{.x2; .y2}} ∈ {0} + [48].[bits 48 to 63] ∈ UNINITIALIZED + {[48].ptr; [49]{.x2; .y2}} ∈ {0} + [49].[bits 48 to 63] ∈ UNINITIALIZED + [49].ptr ∈ {0} + T[0] ∈ {1} + [1..9] ∈ {0} + U[0] ∈ {3} + [1] ∈ {4} + x ∈ {8} + y ∈ {40} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + __retres ∈ {8} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + __retres +[inout] Inputs for function main: + U[0..1] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/init_const_guard.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/init_const_guard.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/init_const_guard.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/init_const_guard.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,277 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/init_const_guard.i (no preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + q ∈ {{ &x }} + p ∈ {{ &x }} + v ∈ [--..--] +tests/misc/init_const_guard.i:14:[value] Function f: postcondition 'Const' got status valid. +tests/misc/init_const_guard.i:15:[value] Function f: postcondition 'Pointed_Valid' got status valid. +tests/misc/init_const_guard.i:16:[value] Function f: postcondition 'Q_ReadOnly' got status valid. +tests/misc/init_const_guard.i:17:[value] Function f: postcondition 'Q_NotWrite' got status valid. +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + \nothing +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Valid ] Post-condition 'Const' + by Value. +[ Valid ] Post-condition 'Pointed_Valid' + by Value. +[ Valid ] Post-condition 'Q_ReadOnly' + by Value. +[ Valid ] Post-condition 'Q_NotWrite' + by Value. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion 'Read' (file tests/misc/init_const_guard.i, line 32) + Locally valid, but unreachable. + By Value because: + - Unreachable program point (file tests/misc/init_const_guard.i, line 32) +[ Dead ] Assertion 'Guard_against_Const' (file tests/misc/init_const_guard.i, line 33) + Locally valid, but unreachable. + By Value because: + - Unreachable program point (file tests/misc/init_const_guard.i, line 33) +[Unreachable] Unreachable program point (file tests/misc/init_const_guard.i, line 32) + by Value. +[Unreachable] Unreachable program point (file tests/misc/init_const_guard.i, line 33) + by Value. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 5 Completely validated + 2 Dead properties + 2 Unreachable + 9 Total +-------------------------------------------------------------------------------- +[value] Analyzing a complete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + q ∈ {{ &x }} + p ∈ {{ &x }} + v ∈ [--..--] +tests/misc/init_const_guard.i:32:[value] Assertion 'Read' got status valid. +tests/misc/init_const_guard.i:33:[value] Assertion 'Guard_against_Const' got status valid. +tests/misc/init_const_guard.i:35:[kernel] warning: out of bounds write. assert \valid(p); +tests/misc/init_const_guard.i:35:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +tests/misc/init_const_guard.i:27:[value] Function g: postcondition 'P_not_Const' got status valid. +[value] Recording results for g +[value] done for function g +tests/misc/init_const_guard.i:35:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function g: + p ∈ {{ &x }} +[from] Computing for function g +[from] Done for function g +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function g: + x FROM v (and SELF) + p FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function g: + p +[inout] Inputs for function g: + p; v +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Partial ] Default behavior + By Frama-C kernel, with pending: + - Post-condition 'Const' + - Post-condition 'Pointed_Valid' + - Post-condition 'Q_ReadOnly' + - Post-condition 'Q_NotWrite' + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Post-condition 'P_not_Const' + by Value. +[ Valid ] Assertion 'Read' (file tests/misc/init_const_guard.i, line 32) + by Value. +[ Valid ] Assertion 'Guard_against_Const' (file tests/misc/init_const_guard.i, line 33) + by Value. +[ Alarm ] Assertion 'Value,mem_access' (file tests/misc/init_const_guard.i, line 35) + By Value, with pending: + - Unreachable instruction (file tests/misc/init_const_guard.i, line 35) +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 4 Completely validated + 1 Locally validated + 1 Alarm emitted + 6 Total +-------------------------------------------------------------------------------- +[value] Analyzing an incomplete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ [--..--] + q ∈ {{ &x }} + p ∈ {{ NULL ; &S_p[0] }} + v ∈ [--..--] + S_q[0..1] ∈ [--..--] + S_p[0..1] ∈ [--..--] +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + \nothing +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Valid ] Post-condition 'Const' + by Value. +[ Valid ] Post-condition 'Pointed_Valid' + by Value. +[ Valid ] Post-condition 'Q_ReadOnly' + by Value. +[ Valid ] Post-condition 'Q_NotWrite' + by Value. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion 'Read' (file tests/misc/init_const_guard.i, line 32) + Locally valid, but unreachable. + By Value because: + - Unreachable program point (file tests/misc/init_const_guard.i, line 32) +[ Dead ] Assertion 'Guard_against_Const' (file tests/misc/init_const_guard.i, line 33) + Locally valid, but unreachable. + By Value because: + - Unreachable program point (file tests/misc/init_const_guard.i, line 33) +[ Partial ] Default behavior + By Frama-C kernel, with pending: + - Post-condition 'P_not_Const' +[Unreachable] Unreachable program point (file tests/misc/init_const_guard.i, line 32) + by Value. +[Unreachable] Unreachable program point (file tests/misc/init_const_guard.i, line 33) + by Value. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 5 Completely validated + 1 Locally validated + 2 Dead properties + 2 Unreachable + 10 Total +-------------------------------------------------------------------------------- +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ [--..--] + q ∈ {{ &x }} + p ∈ {{ NULL ; &S_p[0] }} + v ∈ [--..--] + S_q[0..1] ∈ [--..--] + S_p[0..1] ∈ [--..--] +tests/misc/init_const_guard.i:35:[kernel] warning: out of bounds write. assert \valid(p); +[value] Recording results for g +[value] done for function g +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function g: + p ∈ {{ &x }} +[from] Computing for function g +[from] Done for function g +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function g: + x FROM v (and SELF) + p FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function g: + p +[inout] Inputs for function g: + p; v +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Partial ] Default behavior + By Frama-C kernel, with pending: + - Post-condition 'Const' + - Post-condition 'Pointed_Valid' + - Post-condition 'Q_ReadOnly' + - Post-condition 'Q_NotWrite' + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Post-condition 'P_not_Const' + by Value. +[ Valid ] Assertion 'Read' (file tests/misc/init_const_guard.i, line 32) + by Value. +[ Valid ] Assertion 'Guard_against_Const' (file tests/misc/init_const_guard.i, line 33) + by Value. +[ Alarm ] Assertion 'Value,mem_access' (file tests/misc/init_const_guard.i, line 35) + By Value, with pending: + - Unreachable instruction (file tests/misc/init_const_guard.i, line 35) +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 4 Completely validated + 1 Locally validated + 1 Alarm emitted + 6 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/init_from_cil.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/init_from_cil.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/init_from_cil.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/init_from_cil.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,13 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/init_from_cil.i (no preprocessing) +/* Generated by Frama-C */ +extern int f(int x); + +int main(void) +{ + int tmp; + tmp = f(0); + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/initialized_copy.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/initialized_copy.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/initialized_copy.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/initialized_copy.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,121 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/initialized_copy.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + w[0..9] ∈ {0} + v ∈ [--..--] +[value] Called Frama_C_show_each_unreached() +[value] DUMPING STATE of file tests/misc/initialized_copy.i line 38 + w[0..9] ∈ {0} + v ∈ [--..--] + b_0 ∈ {1} or UNINITIALIZED + a_0 ∈ {1} or UNINITIALIZED + =END OF DUMP== +[value] Called Frama_C_show_each_unreached() +[value] DUMPING STATE of file tests/misc/initialized_copy.i line 65 + w[0..9] ∈ {0} + v ∈ [--..--] + c_0[bits 0 to 7] ∈ {1} or UNINITIALIZED + [bits 8 to 15] ∈ {2} + [bits 16 to 23] ∈ {3} + [bits 24 to 31] ∈ {4} + p_0 ∈ {{ &c_0 + {3} }} + a_2[bits 0 to 7] ∈ {1} or UNINITIALIZED + [bits 8 to 15] ∈ {2} + [bits 16 to 23] ∈ {3} + [bits 24 to 31] ∈ {4} + =END OF DUMP== +[value] Called Frama_C_show_each(.c ∈ {1} + .[bits 8 to 31] ∈ UNINITIALIZED + .i ∈ {5}) +[value] Called Frama_C_show_each({{ }}) +[value] Called Frama_C_show_each(.i1 ∈ {1} + .i2 ∈ UNINITIALIZED) +tests/misc/initialized_copy.i:90:[value] Assertion got status unknown. +[value] Called Frama_C_show_each_unreached() +tests/misc/initialized_copy.i:98:[value] Assertion got status unknown. +[value] DUMPING STATE of file tests/misc/initialized_copy.i line 102 + w[0..9] ∈ {0} + v ∈ [--..--] + i_0 ∈ [0..9] + t_0[0..9] ∈ {1} or UNINITIALIZED + v_1[0] ∈ UNINITIALIZED + [1] ∈ {1} + [2..9] ∈ UNINITIALIZED + =END OF DUMP== +tests/misc/initialized_copy.i:108:[value] Assertion got status unknown. +[value] DUMPING STATE of file tests/misc/initialized_copy.i line 112 + w[0..9] ∈ {0; 12} or UNINITIALIZED + v ∈ [--..--] + i_1 ∈ [0..9] + v_2[0] ∈ UNINITIALIZED + [1] ∈ {12} + [2..9] ∈ UNINITIALIZED + =END OF DUMP== +[value] computing for function f <- main. + Called from tests/misc/initialized_copy.i:129. +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each_unreached() +tests/misc/initialized_copy.i:135:[kernel] warning: accessing uninitialized left-value: assert \initialized(&a_6); +tests/misc/initialized_copy.i:135:[value] completely invalid value in evaluation of + argument a_6 +[value] computing for function f <- main. + Called from tests/misc/initialized_copy.i:143. +[value] Recording results for f +[value] Done for function f +[value] DUMPING STATE of file tests/misc/initialized_copy.i line 144 + w[0..9] ∈ {0; 12} or UNINITIALIZED + v ∈ [--..--] + a_7 ∈ {1} or UNINITIALIZED + =END OF DUMP== +tests/misc/initialized_copy.i:151:[kernel] warning: accessing uninitialized left-value: assert \initialized(&a_8); +[value] computing for function g <- main. + Called from tests/misc/initialized_copy.i:151. +tests/misc/initialized_copy.i:151:[kernel] warning: Neither code nor specification for function g, generating default assigns from the prototype +[value] using specification for function g +[value] Done for function g +[value] DUMPING STATE of file tests/misc/initialized_copy.i line 152 + w[0..9] ∈ {0; 12} or UNINITIALIZED + v ∈ [--..--] + a_8 ∈ {1} + =END OF DUMP== +[value] Recording results for main +[value] done for function main +tests/misc/initialized_copy.i:135:[value] Assertion 'Value,initialisation' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + +[value] Values at end of function main: + w[0..9] ∈ {0; 12} or UNINITIALIZED + __retres ∈ {0; 8} or UNINITIALIZED +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Computing for function g <-main +[from] Done for function g +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + NO EFFECTS +[from] Function g: + NO EFFECTS +[from] Function main: + w[0..9] FROM v (and SELF) + \result FROM v +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + \nothing +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main: + w[0..9]; a; b_0; a_0; c[bits 0 to 7]; p; a_1; c_0; p_0; a_2; s1{.c; .i}; + s2; sv1; sv1_0; sv2_0.i1; i; t[0..9]; i_0; t_0[0..9]; v_1[1]; i_1; + v_2[1]; a_4; a_7; a_8; __retres +[inout] Inputs for function main: + v diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/initialized_copy.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/initialized_copy.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/initialized_copy.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/initialized_copy.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,177 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/initialized_copy.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + w[0..9] ∈ {0} + v ∈ [--..--] +tests/misc/initialized_copy.i:29:[kernel] warning: accessing uninitialized left-value: assert \initialized(&b); +tests/misc/initialized_copy.i:37:[kernel] warning: accessing uninitialized left-value: assert \initialized(&b_0); +[value] DUMPING STATE of file tests/misc/initialized_copy.i line 38 + w[0..9] ∈ {0} + v ∈ [--..--] + b_0 ∈ {1} + a_0 ∈ {1} + =END OF DUMP== +tests/misc/initialized_copy.i:47:[kernel] warning: accessing uninitialized left-value: assert \initialized(&c); +tests/misc/initialized_copy.i:64:[kernel] warning: accessing uninitialized left-value: assert \initialized(&c_0); +[value] DUMPING STATE of file tests/misc/initialized_copy.i line 65 + w[0..9] ∈ {0} + v ∈ [--..--] + c_0[bits 0 to 7] ∈ {1} + [bits 8 to 15] ∈ {2} + [bits 16 to 23] ∈ {3} + [bits 24 to 31] ∈ {4} + p_0 ∈ {{ &c_0 + {3} }} + a_2[bits 0 to 7] ∈ {1} + [bits 8 to 15] ∈ {2} + [bits 16 to 23] ∈ {3} + [bits 24 to 31] ∈ {4} + =END OF DUMP== +[value] Called Frama_C_show_each(.c ∈ {1} + .[bits 8 to 31] ∈ UNINITIALIZED + .i ∈ {5}) +[value] Called Frama_C_show_each({{ }}) +[value] Called Frama_C_show_each(.i1 ∈ {1} + .i2 ∈ UNINITIALIZED) +tests/misc/initialized_copy.i:90:[value] Assertion got status unknown. +tests/misc/initialized_copy.i:92:[kernel] warning: accessing uninitialized left-value: assert \initialized(&v_0[i]); +tests/misc/initialized_copy.i:98:[value] Assertion got status unknown. +tests/misc/initialized_copy.i:101:[kernel] warning: accessing uninitialized left-value: assert \initialized(&v_1[i_0]); +[value] DUMPING STATE of file tests/misc/initialized_copy.i line 102 + w[0..9] ∈ {0} + v ∈ [--..--] + i_0 ∈ [0..9] + t_0[0..9] ∈ {1} or UNINITIALIZED + v_1[0] ∈ UNINITIALIZED + [1] ∈ {1} + [2..9] ∈ UNINITIALIZED + =END OF DUMP== +tests/misc/initialized_copy.i:108:[value] Assertion got status unknown. +tests/misc/initialized_copy.i:111:[kernel] warning: accessing uninitialized left-value: assert \initialized(&v_2[i_1]); +[value] DUMPING STATE of file tests/misc/initialized_copy.i line 112 + w[0..9] ∈ {0; 12} + v ∈ [--..--] + i_1 ∈ [0..9] + v_2[0] ∈ UNINITIALIZED + [1] ∈ {12} + [2..9] ∈ UNINITIALIZED + =END OF DUMP== +tests/misc/initialized_copy.i:117:[kernel] warning: accessing uninitialized left-value: assert \initialized(&a_3); +tests/misc/initialized_copy.i:129:[kernel] warning: accessing uninitialized left-value: assert \initialized(&a_5); +tests/misc/initialized_copy.i:129:[value] completely invalid value in evaluation of + argument a_5 +tests/misc/initialized_copy.i:124:[kernel] warning: accessing uninitialized left-value: assert \initialized(&a_4); +tests/misc/initialized_copy.i:135:[kernel] warning: accessing uninitialized left-value: assert \initialized(&a_6); +tests/misc/initialized_copy.i:135:[value] completely invalid value in evaluation of + argument a_6 +tests/misc/initialized_copy.i:143:[kernel] warning: accessing uninitialized left-value: assert \initialized(&a_7); +[value] computing for function f <- main. + Called from tests/misc/initialized_copy.i:143. +[value] Recording results for f +[value] Done for function f +[value] DUMPING STATE of file tests/misc/initialized_copy.i line 144 + w[0..9] ∈ {0; 12} + v ∈ [--..--] + a_7 ∈ {1} + =END OF DUMP== +tests/misc/initialized_copy.i:151:[kernel] warning: accessing uninitialized left-value: assert \initialized(&a_8); +[value] computing for function g <- main. + Called from tests/misc/initialized_copy.i:151. +tests/misc/initialized_copy.i:151:[kernel] warning: Neither code nor specification for function g, generating default assigns from the prototype +[value] using specification for function g +[value] Done for function g +[value] DUMPING STATE of file tests/misc/initialized_copy.i line 152 + w[0..9] ∈ {0; 12} + v ∈ [--..--] + a_8 ∈ {1} + =END OF DUMP== +[value] Recording results for main +[value] done for function main +tests/misc/initialized_copy.i:29:[value] Assertion 'Value,initialisation' got final status invalid. +tests/misc/initialized_copy.i:47:[value] Assertion 'Value,initialisation' got final status invalid. +tests/misc/initialized_copy.i:92:[value] Assertion 'Value,initialisation' got final status invalid. +tests/misc/initialized_copy.i:117:[value] Assertion 'Value,initialisation' got final status invalid. +tests/misc/initialized_copy.i:129:[value] Assertion 'Value,initialisation' got final status invalid. +tests/misc/initialized_copy.i:135:[value] Assertion 'Value,initialisation' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + +[value] Values at end of function main: + w[0..9] ∈ {0; 12} + __retres ∈ {0; 8} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Computing for function g <-main +[from] Done for function g +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + NO EFFECTS +[from] Function g: + NO EFFECTS +[from] Function main: + w[0..9] FROM v (and SELF) + \result FROM v +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + \nothing +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main: + w[0..9]; a; b_0; a_0; c[bits 0 to 7]; p; a_1; c_0; p_0; a_2; s1{.c; .i}; + s2; sv1; sv1_0; sv2_0.i1; i; t[0..9]; i_0; t_0[0..9]; v_1[1]; i_1; + v_2[1]; a_4; a_7; a_8; __retres +[inout] Inputs for function main: + v +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + w[0..9] ∈ {0} + v ∈ [--..--] +tests/misc/initialized_copy.i:160:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x); +[value] Recording results for main2 +[value] done for function main2 +tests/misc/initialized_copy.i:160:[value] Assertion 'Value,initialisation' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main2: + +[from] Computing for function main2 +[from] Done for function main2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main2: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main2: + \nothing +[inout] Inputs for function main2: + \nothing +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + w[0..9] ∈ {0} + v ∈ [--..--] +[value] Recording results for main2 +[value] done for function main2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main2: + +[from] Computing for function main2 +[from] Done for function main2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main2: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main2: + \nothing +[inout] Inputs for function main2: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/initialized.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/initialized.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/initialized.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/initialized.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,334 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/initialized.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ [--..--] + b1 ∈ [--..--] + b2 ∈ [--..--] + b3 ∈ [--..--] + b4 ∈ [--..--] + b5 ∈ [--..--] + b6 ∈ [--..--] + rand ∈ [--..--] + v1 ∈ {0} + i6 ∈ [--..--] +[value] computing for function g1 <- main. + Called from tests/misc/initialized.c:153. +tests/misc/initialized.c:19:[value] entering loop for the first time +tests/misc/initialized.c:21:[value] Assertion got status unknown. +tests/misc/initialized.c:22:[value] Assertion got status unknown. +[value] computing for function Frama_C_interval <- g1 <- main. + Called from tests/misc/initialized.c:24. +[value] using specification for function Frama_C_interval +share/builtin.h:46:[value] Function Frama_C_interval: precondition got status valid. +[value] Done for function Frama_C_interval +[value] computing for function Frama_C_interval <- g1 <- main. + Called from tests/misc/initialized.c:25. +[value] Done for function Frama_C_interval +tests/misc/initialized.c:26:[value] Assertion got status unknown. +[value] computing for function Frama_C_interval <- g1 <- main. + Called from tests/misc/initialized.c:28. +[value] Done for function Frama_C_interval +[value] computing for function Frama_C_interval <- g1 <- main. + Called from tests/misc/initialized.c:29. +[value] Done for function Frama_C_interval +tests/misc/initialized.c:30:[value] Assertion got status unknown. +[value] computing for function Frama_C_interval <- g1 <- main. + Called from tests/misc/initialized.c:32. +[value] Done for function Frama_C_interval +[value] computing for function Frama_C_interval <- g1 <- main. + Called from tests/misc/initialized.c:33. +[value] Done for function Frama_C_interval +tests/misc/initialized.c:34:[value] Assertion got status valid. +[value] computing for function Frama_C_interval <- g1 <- main. + Called from tests/misc/initialized.c:36. +[value] Done for function Frama_C_interval +[value] computing for function Frama_C_interval <- g1 <- main. + Called from tests/misc/initialized.c:37. +[value] Done for function Frama_C_interval +tests/misc/initialized.c:38:[value] Assertion got status unknown. +[value] Recording results for g1 +[value] Done for function g1 +[value] computing for function g2 <- main. + Called from tests/misc/initialized.c:154. +tests/misc/initialized.c:50:[value] warning: Operation {{ &b4 }} + {{ &b4 }} incurs a loss of precision +tests/misc/initialized.c:50:[kernel] warning: signed overflow. assert -2147483648 ≤ (int)(&b4)+(int)(&b4) ≤ 2147483647; +tests/misc/initialized.c:50:[value] Assigning imprecise value to t[6]. + The imprecision originates from Arithmetic {tests/misc/initialized.c:50} +tests/misc/initialized.c:51:[value] Assigning imprecise value to t[7]. + The imprecision originates from Arithmetic {tests/misc/initialized.c:50} +[value] DUMPING STATE of file tests/misc/initialized.c line 63 + Frama_C_entropy_source ∈ [--..--] + b1 ∈ [--..--] + b2 ∈ [--..--] + b3 ∈ [--..--] + b4 ∈ [--..--] + b5 ∈ [--..--] + b6 ∈ [--..--] + rand ∈ [--..--] + t[0..1] ∈ {0x11223344} or UNINITIALIZED + [2..3] ∈ {0x55667788} or UNINITIALIZED + [4..5] ∈ {0x12345678; 0x23456789} or UNINITIALIZED + [6..7] ∈ + {{ garbled mix of &{b4} + (origin: Arithmetic {tests/misc/initialized.c:50}) }} or UNINITIALIZED + [8..9] ∈ {1; 2} or UNINITIALIZED + [10][bits 0 to 23] ∈ {0} or UNINITIALIZED + {[10][bits 24 to 31]#; [11][bits 0 to 23]#} ∈ + {0x11111111} or UNINITIALIZED + {[11][bits 24 to 31]; [12][bits 0 to 23]} ∈ {0} or UNINITIALIZED + {[12][bits 24 to 31]#; [13][bits 0 to 23]#} ∈ + {0x11111111; 0x22222222} or UNINITIALIZED + [13][bits 24 to 31] ∈ {0} or UNINITIALIZED + v1 ∈ {0} + i6 ∈ [--..--] + =END OF DUMP== +tests/misc/initialized.c:66:[value] Assertion got status unknown. +[value] DUMPING STATE of file tests/misc/initialized.c line 68 + Frama_C_entropy_source ∈ [--..--] + b1 ∈ [--..--] + b2 ∈ [--..--] + b3 ∈ [--..--] + b4 ∈ [--..--] + b5 ∈ [--..--] + b6 ∈ [--..--] + rand ∈ [--..--] + t{[0]; [1][bits 0 to 23]#} ∈ + {0x11223344} or UNINITIALIZED repeated %32, bits 0 to 55 + [1][bits 24 to 31]# ∈ {0x11223344}%32, bits 24 to 31 + [2][bits 0 to 23]# ∈ {0x55667788}%32, bits 0 to 23 + [bits 88 to 127]# ∈ + {0x55667788} or UNINITIALIZED repeated %32, bits 24 to 63 + [4..5] ∈ {0x12345678; 0x23456789} or UNINITIALIZED + [6..7] ∈ + {{ garbled mix of &{b4} + (origin: Arithmetic {tests/misc/initialized.c:50}) }} or UNINITIALIZED + [8..9] ∈ {1; 2} or UNINITIALIZED + [10][bits 0 to 23] ∈ {0} or UNINITIALIZED + {[10][bits 24 to 31]#; [11][bits 0 to 23]#} ∈ + {0x11111111} or UNINITIALIZED + {[11][bits 24 to 31]; [12][bits 0 to 23]} ∈ {0} or UNINITIALIZED + {[12][bits 24 to 31]#; [13][bits 0 to 23]#} ∈ + {0x11111111; 0x22222222} or UNINITIALIZED + [13][bits 24 to 31] ∈ {0} or UNINITIALIZED + p_0 ∈ {{ &t + {7} }} + v1 ∈ {0} + i6 ∈ [--..--] + =END OF DUMP== +[value] Called Frama_C_show_each({0x66778811}) +tests/misc/initialized.c:72:[value] Assertion got status unknown. +tests/misc/initialized.c:74:[value] Assertion got status unknown. +tests/misc/initialized.c:76:[value] Assertion got status unknown. +tests/misc/initialized.c:78:[value] Assertion got status unknown. +tests/misc/initialized.c:80:[value] Assertion got status unknown. +[value] Recording results for g2 +[value] Done for function g2 +[value] computing for function g3 <- main. + Called from tests/misc/initialized.c:155. +tests/misc/initialized.c:89:[value] Assertion got status unknown. +tests/misc/initialized.c:93:[kernel] warning: accessing uninitialized left-value: assert \initialized(&r2); +tests/misc/initialized.c:93:[kernel] warning: completely indeterminate value in r2. +tests/misc/initialized.c:96:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x3); +[value] computing for function f <- g3 <- main. + Called from tests/misc/initialized.c:98. +tests/misc/initialized.c:11:[value] entering loop for the first time +tests/misc/initialized.c:8:[value] Function f: postcondition got status unknown. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- g3 <- main. + Called from tests/misc/initialized.c:99. +[value] Recording results for f +[value] Done for function f +[value] Recording results for g3 +[value] Done for function g3 +[value] computing for function g4 <- main. + Called from tests/misc/initialized.c:156. +tests/misc/initialized.c:104:[kernel] warning: accessing uninitialized left-value: assert \initialized(&y); +tests/misc/initialized.c:104:[kernel] warning: completely indeterminate value in y. +[value] Recording results for g4 +[value] Done for function g4 +[value] computing for function g5 <- main. + Called from tests/misc/initialized.c:157. +[value] computing for function wrong_assigns <- g5 <- main. + Called from tests/misc/initialized.c:127. +[value] using specification for function wrong_assigns +tests/misc/initialized.c:114:[value] Function wrong_assigns: this postcondition evaluates to false in this + context. If it is valid, either a precondition was not verified for this + call, or some assigns/from clauses are incomplete (or incorrect). +[value] Done for function wrong_assigns +tests/misc/initialized.c:130:[value] Assertion got status valid. +tests/misc/initialized.c:131:[value] Assertion got status valid. +tests/misc/initialized.c:133:[value] Assertion got status unknown. +[value] Recording results for g5 +[value] Done for function g5 +[value] computing for function g6 <- main. + Called from tests/misc/initialized.c:158. +tests/misc/initialized.c:143:[value] Assertion got status unknown. +tests/misc/initialized.c:144:[value] Assertion got status unknown. +tests/misc/initialized.c:145:[value] Assertion got status unknown. +tests/misc/initialized.c:146:[value] Assertion got status valid. +tests/misc/initialized.c:147:[value] Assertion got status unknown. +tests/misc/initialized.c:148:[value] Assertion got status valid. +[value] Recording results for g6 +[value] Done for function g6 +[value] Recording results for main +[value] done for function main +tests/misc/initialized.c:93:[value] Assertion 'Value,initialisation' got final status invalid. +tests/misc/initialized.c:104:[value] Assertion 'Value,initialisation' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + t1[0] ∈ UNINITIALIZED + [1..2] ∈ {1; 2} or UNINITIALIZED + [3..4] ∈ UNINITIALIZED + t2[0] ∈ UNINITIALIZED + [1..248] ∈ [1..248] or UNINITIALIZED + [249] ∈ UNINITIALIZED +[value] Values at end of function g1: + Frama_C_entropy_source ∈ [--..--] + t1[0..19] ∈ {1} + t2[0..3] ∈ {2} or UNINITIALIZED + [4..19] ∈ {2} + t3[0..5] ∈ {3} or UNINITIALIZED + [6..12] ∈ {3} + [13..19] ∈ {3} or UNINITIALIZED + t4[0..6] ∈ {4} or UNINITIALIZED + [7] ∈ {4} + [8..19] ∈ {4} or UNINITIALIZED + t5[0..19] ∈ {5} or UNINITIALIZED + t6[0..19] ∈ {6} or UNINITIALIZED + i ∈ {7; 8; 9} + j ∈ {4; 5; 6; 7} +[value] Values at end of function g2: + t{[0]; [1][bits 0 to 23]#} ∈ + {0x11223344} or UNINITIALIZED repeated %32, bits 0 to 55 + [1][bits 24 to 31]# ∈ {0x11223344}%32, bits 24 to 31 + [2][bits 0 to 23]# ∈ {0x55667788}%32, bits 0 to 23 + [bits 88 to 119]# ∈ + {0x55667788} or UNINITIALIZED repeated %32, bits 24 to 55 + [3][bits 24 to 31]# ∈ {0x55667788}%32, bits 24 to 31 + [4..5] ∈ {0x12345678; 0x23456789} or UNINITIALIZED + [6][bits 0 to 23] ∈ + {{ garbled mix of &{b4} + (origin: Arithmetic {tests/misc/initialized.c:50}) }} + {[6][bits 24 to 31]; [7]} ∈ + {{ garbled mix of &{b4} + (origin: Arithmetic {tests/misc/initialized.c:50}) }} or UNINITIALIZED + [8] ∈ {1; 2} or UNINITIALIZED + [9] ∈ {1; 2} + [10][bits 0 to 23] ∈ {0} or UNINITIALIZED + [10][bits 24 to 31]# ∈ {0x11111111} or UNINITIALIZED%32, bits 0 to 7 + [11][bits 0 to 23]# ∈ {0x11111111}%32, bits 8 to 31 + [11][bits 24 to 31] ∈ {0} + [12][bits 0 to 23] ∈ {0} or UNINITIALIZED + {[12][bits 24 to 31]#; [13][bits 0 to 23]#} ∈ + {0x11111111; 0x22222222} or UNINITIALIZED + [13][bits 24 to 31] ∈ {0} + p_0 ∈ {{ &t + {7} }} +[value] Values at end of function g3: + r1 ∈ {2} + x1 ∈ {1} + x2 ∈ UNINITIALIZED + x3 ∈ {1} + r3 ∈ {2} + t1[0] ∈ UNINITIALIZED + [1..2] ∈ {1; 2} + [3..4] ∈ UNINITIALIZED + t2[0] ∈ UNINITIALIZED + [1..248] ∈ [1..248] or UNINITIALIZED + [249] ∈ UNINITIALIZED +[value] Values at end of function g4: + NON TERMINATING FUNCTION +[value] Values at end of function g6: + i6 ∈ UNINITIALIZED +[value] Values at end of function g5: + v ∈ UNINITIALIZED + p ∈ {{ &v1 ; &v2 }} +[value] Values at end of function main: + Frama_C_entropy_source ∈ [--..--] + i6 ∈ UNINITIALIZED + __retres ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function g1 +[from] Computing for function Frama_C_interval <-g1 +[from] Done for function Frama_C_interval +[from] Done for function g1 +[from] Computing for function g2 +[from] Computing for function Frama_C_dump_each <-g2 +[from] Done for function Frama_C_dump_each +[from] Done for function g2 +[from] Computing for function g3 +[from] Done for function g3 +[from] Computing for function g4 +[from] Non-terminating function g4 (no dependencies) +[from] Done for function g4 +[from] Computing for function g6 +[from] Done for function g6 +[from] Computing for function g5 +[from] Computing for function wrong_assigns <-g5 +[from] Done for function wrong_assigns +[from] Done for function g5 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function Frama_C_interval: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) + \result FROM Frama_C_entropy_source; min; max +[from] Function f: + t1[1..4] FROM m; t; n (and SELF) + t2[1..248] FROM m; t; n (and SELF) +[from] Function g1: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) +[from] Function g2: + NO EFFECTS +[from] Function g3: + NO EFFECTS +[from] Function g4: + NON TERMINATING - NO EFFECTS +[from] Function g6: + i6 FROM rand (and SELF) +[from] Function wrong_assigns: + v{.a; .b} FROM \nothing +[from] Function g5: + NO EFFECTS +[from] Function main: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) + i6 FROM rand (and SELF) + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + i; t1[1..4]; t2[1..248] +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function g1: + Frama_C_entropy_source; t1[0..19]; t2[0..19]; t3[0..19]; t4[0..19]; + t5[0..19]; t6[0..19]; i; j; i_0 +[inout] Inputs for function g1: + Frama_C_entropy_source; rand +[inout] Out (internal) for function g2: + t[0..13]; p; p_0 +[inout] Inputs for function g2: + b4; b5 +[inout] Out (internal) for function g3: + r1; x1; x2; x3; r3; t1[1..2]; t2[1..248] +[inout] Inputs for function g3: + b1; b2; b3; b6 +[inout] Out (internal) for function g4: + x +[inout] Inputs for function g4: + \nothing +[inout] Out (internal) for function g6: + i6 +[inout] Inputs for function g6: + rand +[inout] Out (internal) for function g5: + v{.a; .b}; p; tmp +[inout] Inputs for function g5: + rand +[inout] Out (internal) for function main: + Frama_C_entropy_source; i6; __retres +[inout] Inputs for function main: + Frama_C_entropy_source; b1; b2; b3; b4; b5; b6; rand diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/init.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/init.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/init.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/init.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,54 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/init.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S[0] ∈ {49} + [1] ∈ {50} + [2] ∈ {51} + [3] ∈ {52} + [4] ∈ {53} + v1 ∈ {0} + TS[0].x ∈ {1} + [0].y ∈ {3} + [0].name[0] ∈ {175304776} + {[0].name[1..9]; [1..28]} ∈ {0} + v2 ∈ {0} + C ∈ {0} + PC[0] ∈ {108} + [1] ∈ {107} + [2] ∈ {106} + [3] ∈ {108} + [4] ∈ {106} + [5] ∈ {0} + T2[0].x2 ∈ {1} + [0].y2 ∈ {2} + [0].[bits 48 to 63] ∈ UNINITIALIZED + [0].ptr ∈ {{ &PC[0] }} + [1].x2 ∈ {1} + [1].y2 ∈ {2} + [1].[bits 48 to 63] ∈ UNINITIALIZED + {[1].ptr; [2..49]} ∈ {0} + T[0] ∈ {1} + [1..9] ∈ {0} + U[0] ∈ {3} + [1] ∈ {4} + x ∈ {8} + y ∈ {40} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + __retres ∈ {8} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + __retres +[inout] Inputs for function main: + U[0..1] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/inout.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/inout.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,42 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/inout.i (no preprocessing) +[value] Analyzing a complete application starting at inout_11_3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Xt ∈ {0} + Xs ∈ {0} + Xs_I ∈ {0} + Ys ∈ {0} + Ys_I ∈ {0} + Z ∈ {0} + I ∈ {0} + I_size ∈ {8} + Itab[0] ∈ {-40} + [1] ∈ {-25} + [2] ∈ {-15} + [3] ∈ {-5} + [4] ∈ {5} + [5] ∈ {15} + [6] ∈ {25} + [7] ∈ {40} + I5_nt ∈ {0} +tests/misc/inout.i:37:[value] entering loop for the first time +[value] Recording results for inout_11_3 +[value] done for function inout_11_3 +[from] Computing for function inout_11_3 +[from] Done for function inout_11_3 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function inout_11_3: + Xs FROM i1 + Z FROM I_size; Itab{[0]; [7]}; i2 (and SELF) + \result FROM I_size; Itab[0..7]; i2 +[from] ====== END OF DEPENDENCIES ====== +[inout] InOut (internal) for function inout_11_3: + Operational inputs: + I_size; Itab[0..7]; i1; i2; r + Operational inputs on termination: + I_size; Itab[0..7]; i1; i2; r + Sure outputs: + Xs; es diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/inout.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/inout.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/inout.i (no preprocessing) +[value] Analyzing a complete application starting at never_terminate +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Xt ∈ {0} + Xs ∈ {0} + Xs_I ∈ {0} + Ys ∈ {0} + Ys_I ∈ {0} + Z ∈ {0} + I ∈ {0} + I_size ∈ {8} + Itab[0] ∈ {-40} + [1] ∈ {-25} + [2] ∈ {-15} + [3] ∈ {-5} + [4] ∈ {5} + [5] ∈ {15} + [6] ∈ {25} + [7] ∈ {40} + I5_nt ∈ {0} +tests/misc/inout.i:50:[value] entering loop for the first time +[value] Recording results for never_terminate +[value] done for function never_terminate +[from] Computing for function never_terminate +[from] Non-terminating function never_terminate (no dependencies) +[from] Done for function never_terminate +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function never_terminate: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] InOut (internal) for function never_terminate: + Operational inputs: + i1_nt; i2_nt; i3_nt + Operational inputs on termination: + \nothing + Sure outputs: + ANYTHING(origin:Unknown) diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/inout.3.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/inout.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,40 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/inout.i (no preprocessing) +[value] Analyzing a complete application starting at may_not_terminate +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Xt ∈ {0} + Xs ∈ {0} + Xs_I ∈ {0} + Ys ∈ {0} + Ys_I ∈ {0} + Z ∈ {0} + I ∈ {0} + I_size ∈ {8} + Itab[0] ∈ {-40} + [1] ∈ {-25} + [2] ∈ {-15} + [3] ∈ {-5} + [4] ∈ {5} + [5] ∈ {15} + [6] ∈ {25} + [7] ∈ {40} + I5_nt ∈ {0} +tests/misc/inout.i:60:[value] entering loop for the first time +[value] Recording results for may_not_terminate +[value] done for function may_not_terminate +[from] Computing for function may_not_terminate +[from] Done for function may_not_terminate +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function may_not_terminate: + Xs FROM i3 +[from] ====== END OF DEPENDENCIES ====== +[inout] InOut (internal) for function may_not_terminate: + Operational inputs: + I5_nt; i1; i2; i3; i4; i5_nt + Operational inputs on termination: + i1; i2; i3; i4 + Sure outputs: + Xs; es diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/inout.4.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/inout.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout.4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,55 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/inout.i (no preprocessing) +[value] Analyzing a complete application starting at call_may_not_terminate +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Xt ∈ {0} + Xs ∈ {0} + Xs_I ∈ {0} + Ys ∈ {0} + Ys_I ∈ {0} + Z ∈ {0} + I ∈ {0} + I_size ∈ {8} + Itab[0] ∈ {-40} + [1] ∈ {-25} + [2] ∈ {-15} + [3] ∈ {-5} + [4] ∈ {5} + [5] ∈ {15} + [6] ∈ {25} + [7] ∈ {40} + I5_nt ∈ {0} +[value] computing for function may_not_terminate <- call_may_not_terminate. + Called from tests/misc/inout.i:68. +tests/misc/inout.i:60:[value] entering loop for the first time +[value] Recording results for may_not_terminate +[value] Done for function may_not_terminate +[value] Recording results for call_may_not_terminate +[value] done for function call_may_not_terminate +[from] Computing for function may_not_terminate +[from] Done for function may_not_terminate +[from] Computing for function call_may_not_terminate +[from] Done for function call_may_not_terminate +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function may_not_terminate: + Xs FROM i3 +[from] Function call_may_not_terminate: + Xs FROM j3 +[from] ====== END OF DEPENDENCIES ====== +[inout] InOut (internal) for function may_not_terminate: + Operational inputs: + I5_nt; i1; i2; i3; i4; i5_nt + Operational inputs on termination: + i1; i2; i3; i4 + Sure outputs: + Xs; es +[inout] InOut (internal) for function call_may_not_terminate: + Operational inputs: + I5_nt; j1; j2; j3; j4; j5; c1; c2 + Operational inputs on termination: + j1; j2; j3; j4; j5; c1; c2 + Sure outputs: + Xs diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/inout_diff.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout_diff.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/inout_diff.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout_diff.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,96 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/inout_diff.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..49] ∈ {0} + u[0..49] ∈ {0} + x ∈ {0} +tests/misc/inout_diff.i:11:[value] entering loop for the first time +tests/misc/inout_diff.i:18:[kernel] warning: accessing out of bounds index [0..105],0%7. assert c < 50; +tests/misc/inout_diff.i:20:[kernel] warning: accessing out of bounds index {1; 8; 15; 22; 29; 36; 43; 50}. + assert (int)(c+1) < 50; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + t[0..1] ∈ {1} + [2..4] ∈ {0} + [5..6] ∈ {1} + [7..9] ∈ {0} + [10..11] ∈ {1} + [12..14] ∈ {0} + [15..16] ∈ {1} + [17..19] ∈ {0} + [20..21] ∈ {1} + [22..24] ∈ {0} + [25..26] ∈ {1} + [27..29] ∈ {0} + [30..31] ∈ {1} + [32..34] ∈ {0} + [35..36] ∈ {1} + [37..39] ∈ {0} + [40..41] ∈ {1} + [42..44] ∈ {0} + [45..46] ∈ {1} + [47..49] ∈ {0} + u[0] ∈ {1} + [1..4] ∈ {0} + [5] ∈ {1} + [6..9] ∈ {0} + [10] ∈ {1} + [11..14] ∈ {0} + [15] ∈ {1} + [16..19] ∈ {0} + [20] ∈ {1} + [21..24] ∈ {0} + [25] ∈ {1} + [26..29] ∈ {0} + [30] ∈ {1} + [31..34] ∈ {0} + [35] ∈ {1} + [36..39] ∈ {0} + [40] ∈ {1} + [41..44] ∈ {0} + [45] ∈ {1} + [46..49] ∈ {0} + x ∈ {0; 1; 2; 3} + c ∈ {0; 7; 14; 21; 28; 35; 42; 49} + i ∈ {50} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + t{[0..1]; [5..6]; [10..11]; [15..16]; [20..21]; [25..26]; [30..31]; + [35..36]; [40..41]; [45..46]} + FROM \nothing + u{[0]; [5]; [10]; [15]; [20]; [25]; [30]; [35]; [40]; [45]} FROM \nothing + x FROM t{[7]; [14]; [28]; [42]; [49]}; + u{[1]; [7..8]; [14]; [21..22]; [28..29]; [36]; [42..43]; [49]}; + c + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + t{[0..1]; [5..6]; [10..11]; [15..16]; [20..21]; [25..26]; [30..31]; + [35..36]; [40..41]; [45..46]}; + u{[0]; [5]; [10]; [15]; [20]; [25]; [30]; [35]; [40]; [45]}; x; c; + i; __retres +[inout] Inputs for function main: + t{[0]; [7]; [14]; [21]; [28]; [35]; [42]; [49]}; + u{[0..1]; [7..8]; [14..15]; [21..22]; [28..29]; [35..36]; [42..43]; [49]}; + x +[inout] InOut (internal) for function main: + Operational inputs: + t{[7]; [14]; [28]; [42]; [49]}; + u{[1]; [7..8]; [14]; [21..22]; [28..29]; [36]; [42..43]; [49]}; c + Operational inputs on termination: + t{[7]; [14]; [28]; [42]; [49]}; + u{[1]; [7..8]; [14]; [21..22]; [28..29]; [36]; [42..43]; [49]}; c + Sure outputs: + t{[0..1]; [5..6]; [10..11]; [15..16]; [20..21]; [25..26]; [30..31]; + [35..36]; [40..41]; [45..46]}; + u{[0]; [5]; [10]; [15]; [20]; [25]; [30]; [35]; [40]; [45]}; x; c; + i; __retres diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/inout_formals.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout_formals.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/inout_formals.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout_formals.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/inout_formals.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +tests/misc/inout_formals.i:7:[kernel] warning: out of bounds write. assert \valid(i); +[value] Called Frama_C_show_each({{ &S_i }}) +[value] Recording results for main +[value] done for function main +[inout] InOut (internal) for function main: + Operational inputs: + x; y; i + Operational inputs on termination: + x; y; i + Sure outputs: + S_i[0] +[inout] InOut (with formals) for function main: + Operational inputs: + x; y; i + Operational inputs on termination: + x; y; i + Sure outputs: + S_i[0] +[inout] Inputs (with formals) for function main: + x; y; i; S_i[0] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/inout_on_alarms.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout_on_alarms.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/inout_on_alarms.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout_on_alarms.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,85 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/inout_on_alarms.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + t[0..9] ∈ {0} + p ∈ {0} + S[0..9] ∈ {0} + c ∈ [--..--] +[value] computing for function f <- main. + Called from tests/misc/inout_on_alarms.i:32. +tests/misc/inout_on_alarms.i:17:[kernel] warning: accessing out of bounds index {12}. assert p->i < 10; +tests/misc/inout_on_alarms.i:17:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/inout_on_alarms.i:34. +tests/misc/inout_on_alarms.i:21:[kernel] warning: accessing out of bounds index {12}. assert i < 10; +tests/misc/inout_on_alarms.i:21:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +tests/misc/inout_on_alarms.i:17:[value] Assertion 'Value,index_bound' got final status invalid. +tests/misc/inout_on_alarms.i:21:[value] Assertion 'Value,index_bound' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + NON TERMINATING FUNCTION +[value] Values at end of function g: + NON TERMINATING FUNCTION +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function f +[from] Non-terminating function f (no dependencies) +[from] Done for function f +[from] Computing for function g +[from] Non-terminating function g (no dependencies) +[from] Done for function g +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + NON TERMINATING - NO EFFECTS +[from] Function g: + NON TERMINATING - NO EFFECTS +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + \nothing +[inout] Inputs for function f: + p; S[8] +[inout] InOut (internal) for function f: + Operational inputs: + p; S[8] + Operational inputs on termination: + \nothing + Sure outputs: + ANYTHING(origin:Unknown) +[inout] Out (internal) for function g: + \nothing +[inout] Inputs for function g: + i +[inout] InOut (internal) for function g: + Operational inputs: + i + Operational inputs on termination: + \nothing + Sure outputs: + ANYTHING(origin:Unknown) +[inout] Out (internal) for function main: + i; p; S[8] +[inout] Inputs for function main: + i; p; S[8]; c +[inout] InOut (internal) for function main: + Operational inputs: + c + Operational inputs on termination: + \nothing + Sure outputs: + ANYTHING(origin:Unknown) diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/inout_proto.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout_proto.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/inout_proto.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout_proto.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,147 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/inout_proto.i (no preprocessing) +[value] Analyzing a complete application starting at main_main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} + c ∈ {0} + t[0..9] ∈ {0} + u[0..19] ∈ {0} +[value] computing for function main <- main_main. + Called from tests/misc/inout_proto.i:54. +[value] computing for function SendBuffer <- main <- main_main. + Called from tests/misc/inout_proto.i:19. +[value] using specification for function SendBuffer +[value] Done for function SendBuffer +[value] Recording results for main +[value] Done for function main +[value] computing for function main2 <- main_main. + Called from tests/misc/inout_proto.i:55. +[value] computing for function f <- main2 <- main_main. + Called from tests/misc/inout_proto.i:46. +[value] using specification for function f +[value] Done for function f +[value] computing for function g1 <- main2 <- main_main. + Called from tests/misc/inout_proto.i:47. +[value] computing for function g <- g1 <- main2 <- main_main. + Called from tests/misc/inout_proto.i:34. +[value] using specification for function g +[value] Done for function g +[value] Recording results for g1 +[value] Done for function g1 +[value] computing for function g2 <- main2 <- main_main. + Called from tests/misc/inout_proto.i:48. +[value] computing for function g <- g2 <- main2 <- main_main. + Called from tests/misc/inout_proto.i:38. +[value] Done for function g +[value] Recording results for g2 +[value] Done for function g2 +[value] computing for function g3 <- main2 <- main_main. + Called from tests/misc/inout_proto.i:50. +[value] computing for function g <- g3 <- main2 <- main_main. + Called from tests/misc/inout_proto.i:42. +[value] Done for function g +[value] Recording results for g3 +[value] Done for function g3 +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main_main +[value] done for function main_main +[inout] InOut (internal) for function g1: + Operational inputs: + t[6..7] + Operational inputs on termination: + t[6..7] + Sure outputs: + t[3..5] +[inout] InOut (with formals) for function g1: + Operational inputs: + t[6..7] + Operational inputs on termination: + t[6..7] + Sure outputs: + t[3..5] +[inout] Inputs (with formals) for function g1: + t[6..7] +[inout] InOut (internal) for function g2: + Operational inputs: + t[3..4] + Operational inputs on termination: + t[3..4] + Sure outputs: + t[0..2] +[inout] InOut (with formals) for function g2: + Operational inputs: + t[3..4] + Operational inputs on termination: + t[3..4] + Sure outputs: + t[0..2] +[inout] Inputs (with formals) for function g2: + t[3..4] +[inout] InOut (internal) for function g3: + Operational inputs: + u[8..10]; p + Operational inputs on termination: + u[8..10]; p + Sure outputs: + \nothing +[inout] InOut (with formals) for function g3: + Operational inputs: + u[8..10]; p + Operational inputs on termination: + u[8..10]; p + Sure outputs: + \nothing +[inout] Inputs (with formals) for function g3: + u[8..10]; p +[inout] InOut (internal) for function main: + Operational inputs: + length; msg + Operational inputs on termination: + length; msg + Sure outputs: + ret +[inout] InOut (with formals) for function main: + Operational inputs: + msg + Operational inputs on termination: + msg + Sure outputs: + \nothing +[inout] Inputs (with formals) for function main: + msg +[inout] InOut (internal) for function main2: + Operational inputs: + b; t[6..7]; u[8..10]; i + Operational inputs on termination: + b; t[6..7]; u[8..10]; i + Sure outputs: + a; c; t[0..5] +[inout] InOut (with formals) for function main2: + Operational inputs: + b; t[6..7]; u[8..10]; i + Operational inputs on termination: + b; t[6..7]; u[8..10]; i + Sure outputs: + a; c; t[0..5] +[inout] Inputs (with formals) for function main2: + b; t{[3..4]; [6..7]}; u[8..10]; i +[inout] InOut (internal) for function main_main: + Operational inputs: + length; b; t[6..7]; u[8..10]; msg; i + Operational inputs on termination: + length; b; t[6..7]; u[8..10]; msg; i + Sure outputs: + a; c; t[0..5] +[inout] InOut (with formals) for function main_main: + Operational inputs: + b; t[6..7]; u[8..10]; msg; i + Operational inputs on termination: + b; t[6..7]; u[8..10]; msg; i + Sure outputs: + a; c; t[0..5] +[inout] Inputs (with formals) for function main_main: + b; t{[3..4]; [6..7]}; u[8..10]; msg; i diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/inout.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/inout.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/inout.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,46 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/inout.i (no preprocessing) +[value] Analyzing a complete application starting at inout_11_0 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Xt ∈ {0} + Xs ∈ {0} + Xs_I ∈ {0} + Ys ∈ {0} + Ys_I ∈ {0} + Z ∈ {0} + I ∈ {0} + I_size ∈ {8} + Itab[0] ∈ {-40} + [1] ∈ {-25} + [2] ∈ {-15} + [3] ∈ {-5} + [4] ∈ {5} + [5] ∈ {15} + [6] ∈ {25} + [7] ∈ {40} + I5_nt ∈ {0} +tests/misc/inout.i:16:[kernel] warning: signed overflow. assert -2147483648 ≤ i1+i2 ≤ 2147483647; +tests/misc/inout.i:18:[kernel] warning: out of bounds write. assert \valid(i); +[value] Recording results for inout_11_0 +[value] done for function inout_11_0 +[from] Computing for function inout_11_0 +[from] Done for function inout_11_0 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function inout_11_0: + Xt FROM I + Xs FROM i1 + Xs_I FROM Xs_I + Ys FROM i1; i2 + Z FROM i + S_i[0] FROM i +[from] ====== END OF DEPENDENCIES ====== +[inout] InOut (internal) for function inout_11_0: + Operational inputs: + Xs_I; I; i1; i2; i + Operational inputs on termination: + Xs_I; I; i1; i2; i + Sure outputs: + Xt; Xs; Xs_I; Ys; Z; S_i[0] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/input.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/input.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/input.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/input.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,34 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/input.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/input.i:7. +tests/misc/input.i:7:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] using specification for function f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + +[from] Computing for function main +[from] Computing for function f <-main +[from] Done for function f +tests/misc/input.i:7:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM x +[from] Function main: + \result FROM a +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + tmp +[inout] Inputs for function main: + a; b diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/integers.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/integers.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/integers.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/integers.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/integers.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + bin ∈ {0} + hex ∈ {0} + oct ∈ {0} + dec ∈ {0} +tests/misc/integers.i:7:[value] Assertion got status valid. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + bin ∈ {84} + hex ∈ {84} + oct ∈ {84} + dec ∈ {42} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + bin FROM \nothing + hex FROM \nothing + oct FROM \nothing + dec FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + bin; hex; oct; dec +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/invalid_loc_return.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/invalid_loc_return.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/invalid_loc_return.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/invalid_loc_return.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,111 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/invalid_loc_return.i (no preprocessing) +[value] Analyzing a complete application starting at main1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + c ∈ [--..--] +[value] computing for function main <- main1. + Called from tests/misc/invalid_loc_return.i:21. +[value] computing for function foo <- main <- main1. + Called from tests/misc/invalid_loc_return.i:17. +[value] Recording results for foo +[value] Done for function foo +tests/misc/invalid_loc_return.i:17:[kernel] warning: accessing uninitialized left-value: assert \initialized(&p); +[value] Recording results for main +[value] Done for function main +[value] Recording results for main1 +[value] done for function main1 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function foo: + __retres ∈ {1} +[value] Values at end of function main: + x ∈ {1} + p ∈ {{ &q }} + q ∈ {{ &x }} +[value] Values at end of function main1: + +[from] Computing for function foo +[from] Done for function foo +[from] Computing for function main +[from] Done for function main +[from] Computing for function main1 +[from] Done for function main1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function foo: + \result FROM \nothing +[from] Function main: + NO EFFECTS +[from] Function main1: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function foo: + __retres +[inout] Inputs for function foo: + \nothing +[inout] Out (internal) for function main: + x; p; q +[inout] Inputs for function main: + c +[inout] Out (internal) for function main1: + \nothing +[inout] Inputs for function main1: + c +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + c ∈ [--..--] +[value] computing for function main <- main2. + Called from tests/misc/invalid_loc_return.i:25. +[value] computing for function foo <- main <- main2. + Called from tests/misc/invalid_loc_return.i:17. +[value] Recording results for foo +[value] Done for function foo +tests/misc/invalid_loc_return.i:17:[kernel] warning: accessing uninitialized left-value: assert \initialized(&p); +tests/misc/invalid_loc_return.i:17:[kernel] warning: completely indeterminate value in p. +[value] computing for function foo <- main <- main2. + Called from tests/misc/invalid_loc_return.i:17. +[value] Recording results for foo +[value] Done for function foo +[value] Recording results for main +[value] Done for function main +[value] Recording results for main2 +[value] done for function main2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function foo: + __retres ∈ {1} +[value] Values at end of function main: + x ∈ {1} + p ∈ {{ &q }} + q ∈ {{ &x }} +[value] Values at end of function main2: + +[from] Computing for function foo +[from] Done for function foo +[from] Computing for function main +[from] Done for function main +[from] Computing for function main2 +[from] Done for function main2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function foo: + \result FROM \nothing +[from] Function main: + NO EFFECTS +[from] Function main2: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function foo: + __retres +[inout] Inputs for function foo: + \nothing +[inout] Out (internal) for function main: + x; p; q +[inout] Inputs for function main: + c +[inout] Out (internal) for function main2: + \nothing +[inout] Inputs for function main2: + c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/invalid_lval_arg.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/invalid_lval_arg.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/invalid_lval_arg.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/invalid_lval_arg.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,43 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/invalid_lval_arg.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {0} + p ∈ {0} +tests/misc/invalid_lval_arg.i:15:[kernel] warning: out of bounds read. assert \valid_read((int **)0); +tests/misc/invalid_lval_arg.i:15:[value] completely invalid location in evaluation of + argument *(*((int **)0)) +tests/misc/invalid_lval_arg.i:17:[kernel] warning: out of bounds read. assert \valid_read((int **)0); +tests/misc/invalid_lval_arg.i:17:[value] completely invalid location in evaluation of + argument *(*((int **)0)) +tests/misc/invalid_lval_arg.i:19:[kernel] warning: out of bounds read. assert \valid_read((int **)0); +tests/misc/invalid_lval_arg.i:19:[value] completely invalid location in evaluation of + argument *(*((int **)0)) +[value] Recording results for main +[value] done for function main +tests/misc/invalid_lval_arg.i:15:[value] Assertion 'Value,mem_access' got final status invalid. +tests/misc/invalid_lval_arg.i:17:[value] Assertion 'Value,mem_access' got final status invalid. +tests/misc/invalid_lval_arg.i:19:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +tests/misc/invalid_lval_arg.i:15:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Computing for function f <-main +[from] Done for function f +[from] Computing for function g <-main +[from] Non-terminating function g (no dependencies) +[from] Done for function g +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + p +[inout] Inputs for function main: + p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/inversion2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/inversion2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/inversion2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/inversion2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,37 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/inversion2.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0] ∈ {3} + [1] ∈ {1} + [2] ∈ {2} + TT[0][0..2] ∈ {3} + [0][3..4] ∈ {0} + [1][0] ∈ {1} + [1][1..4] ∈ {0} + [2][0..1] ∈ {2} + [2][2..4] ∈ {0} + G ∈ {99} +tests/misc/inversion2.i:6:[value] entering loop for the first time +tests/misc/inversion2.i:7:[value] entering loop for the first time +tests/misc/inversion2.i:8:[kernel] warning: division by zero: assert TT[i][j] ≢ 0; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + G ∈ {5; 7; 15; 99} + i ∈ {3} + j ∈ {1; 2; 3; 77} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + G FROM T[0..2]; TT{[0][0..2]; [1][0..2]; [2][0..2]} (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + G; i; j +[inout] Inputs for function main: + T[0..2]; TT{[0][0..2]; [1][0..2]; [2][0..2]} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/inversion.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/inversion.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/inversion.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/inversion.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,57 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/inversion.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + z ∈ {0} + pz ∈ {{ &z }} + px ∈ {{ &x }} + py ∈ {{ &y }} + X ∈ {0} + pX ∈ {0} + t[0] ∈ {0} + [1].ok ∈ {1} + [1].p ∈ {{ &pz }} + [2].ok ∈ {1} + [2].p ∈ {{ &py }} + [3..4] ∈ {0} + t2[0..1] ∈ {0} + [2].ok ∈ {1} + [2].p ∈ {{ &px }} + [3..4] ∈ {0} + ii[0..1] ∈ {0} +tests/misc/inversion.i:23:[value] entering loop for the first time +tests/misc/inversion.i:30:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + x ∈ {0; 2} + y ∈ {0; 1; 2} + z ∈ {0; 1; 2} + X ∈ {0; 1; 2; 3; 4} + pX ∈ {{ NULL ; &X }} + ii[0] ∈ {0} + [1] ∈ {5} + i ∈ {5} + k ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + x FROM px; t2{[0].ok; [1].ok; {[2]; [3].ok}; [4].ok} (and SELF) + y FROM pz; py; t{[0].ok; {[1..2]; [3].ok}; [4].ok} (and SELF) + z FROM pz; py; t{[0].ok; {[1..2]; [3].ok}; [4].ok} (and SELF) + X FROM \nothing (and SELF) + pX FROM \nothing + ii[1] FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + x; y; z; X; pX; ii[1]; i; k +[inout] Inputs for function main: + pz; px; py; t{[0].ok; {[1..2]; [3].ok}; [4].ok}; + t2{[0].ok; [1].ok; {[2]; [3].ok}; [4].ok}; ii[1] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/jacques.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/jacques.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/jacques.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/jacques.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,61 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/jacques.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..3] ∈ {0} + p ∈ {0} + q ∈ {0} + A ∈ {0} + B ∈ {0} + C ∈ {0} +[value] Called CEA_f({{ NULL ; &S_pp }}) +tests/misc/jacques.i:23:[value] Assertion got status unknown. +[value] Called CEA_f({{ &S_pp }}) +tests/misc/jacques.i:29:[value] Assertion got status valid. +[value] computing for function f <- main. + Called from tests/misc/jacques.i:36. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/jacques.i:40. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + A ∈ {4; 5} + B ∈ {5} +[value] Values at end of function main: + p ∈ {{ &A }} + q ∈ {{ &A }} + A ∈ {5} + B ∈ {5} + S_pp[0] ∈ {5} + [1] ∈ [--..--] +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + A FROM p; q + B FROM q (and SELF) +[from] Function main: + p FROM \nothing + q FROM \nothing + A FROM \nothing + B FROM \nothing + S_pp[0] FROM pp +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + A; B +[inout] Inputs for function f: + p; q +[inout] Out (internal) for function main: + p; q; A; B; S_pp[0] +[inout] Inputs for function main: + p; q diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/join_misaligned.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/join_misaligned.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/join_misaligned.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/join_misaligned.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,81 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/join_misaligned.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..4] ∈ {0} + u[0..4] ∈ {1} + v[0..2] ∈ {0x22222222} + [3..6] ∈ {1} + w[0..6] ∈ {0} + x[0..4] ∈ {0} + y[0..2] ∈ {0x22222222} + [3..6] ∈ {1} + z[0..4] ∈ {255} + a ∈ {0} + va ∈ [--..--] +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + t{[0]; [1][bits 0 to 15]} ∈ {0} + [1][bits 16 to 23] ∈ {97; 98} + {[1][bits 24 to 31]; [2..4]} ∈ {0} + u{[0]; [1][bits 0 to 15]#} ∈ {1} repeated %32, bits 0 to 47 + [1][bits 16 to 23] ∈ {99; 100} + [bits 56 to 159]# ∈ {1} repeated %32, bits 24 to 127 + v{[0]; [1][bits 0 to 15]#} ∈ {0x22222222} repeated %32, bits 0 to 47 + [1][bits 16 to 23] ∈ {34; 68} + [1][bits 24 to 31] ∈ {68; 85} + [2][bits 0 to 7] ∈ {34; 85} + [2][bits 8 to 31]# ∈ {0x22222222}%32, bits 8 to 31 + [3..6] ∈ {1} + w{[0]; [1][bits 0 to 15]} ∈ {0} + [1][bits 16 to 23]# ∈ {0; 57}%16, bits 0 to 7 + [1][bits 24 to 31] ∈ {0; 59} + [2][bits 0 to 7]# ∈ {0; 59}%16, bits 8 to 15 + {[2][bits 8 to 31]; [3..6]} ∈ {0} + x[0] ∈ {0; 1} + [1] ∈ {0} + [2] ∈ {0; 1} + [3..4] ∈ {0} + y{[0]; [1][bits 0 to 15]#} ∈ {0x22222222} repeated %32, bits 0 to 47 + [1][bits 16 to 23] ∈ + {{ garbled mix of &{t} + (origin: Merge {tests/misc/join_misaligned.i:42}) }} + {[1][bits 24 to 31]; [2][bits 0 to 15]} ∈ + {{ garbled mix of &{t; u} + (origin: Merge {tests/misc/join_misaligned.i:42}) }} + [2][bits 16 to 23] ∈ + {{ garbled mix of &{u} + (origin: Merge {tests/misc/join_misaligned.i:42}) }} + [2][bits 24 to 31]# ∈ {0x22222222}%32, bits 24 to 31 + [3..6] ∈ {1} + z[0..2] ∈ {255} + [bits 24 to 39] ∈ {0x1111; 0xFFFF} + a ∈ [0xFFF..0xFFFFFFFF],0xFFF%0x1000 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + t[1][bits 16 to 23] FROM c + u[1][bits 16 to 23] FROM c + v{[1][bits 16 to 23]; [2][bits 0 to 7]} FROM c (and SELF) + [1][bits 24 to 31] FROM c + w{[1][bits 16 to 23]; [2][bits 0 to 7]} FROM c (and SELF) + [1][bits 24 to 31] FROM c + x[0..2] FROM c (and SELF) + y{[1][bits 16 to 23]; [2][bits 16 to 23]} FROM c (and SELF) + {[1][bits 24 to 31]; [2][bits 0 to 15]} FROM c + z[3..4] FROM c (and SELF) + a FROM va; c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + t[1][bits 16 to 23]; u[1][bits 16 to 23]; + v{[1][bits 16 to 31]; [2][bits 0 to 7]}; + w{[1][bits 16 to 31]; [2][bits 0 to 7]}; x[0..2]; + y{[1][bits 16 to 31]; [2][bits 0 to 23]}; z[3..4]; a +[inout] Inputs for function main: + a; va diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/justcopy.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/justcopy.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/justcopy.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/justcopy.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,2 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/justcopy.i (no preprocessing) diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/keep_entry_point.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/keep_entry_point.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/keep_entry_point.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/keep_entry_point.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,20 @@ +[kernel] Do not keep unused static functions +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/keep_entry_point.i (no preprocessing) +/* Generated by Frama-C */ +static int f(void); + +static int x; +static int f(void) +{ + int tmp; + { + /*sequence*/ + tmp = x; + x ++; + ; + } + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/label.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/label.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/label.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/label.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,46 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/label.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} + d ∈ {0} + e ∈ {0} + i ∈ {0} + p ∈ {0} + q ∈ {0} +tests/misc/label.i:18:[value] Assigning imprecise value to *((char *)(& p) + i) + (pointing to p with offsets {0; 8}). + The imprecision originates from Merge {tests/misc/label.i:18} +tests/misc/label.i:18:[value] Assigning imprecise value to *((char *)(& p) + i) + (pointing to p with offsets {0; 8; 16}). + The imprecision originates from Merge {tests/misc/label.i:18} +tests/misc/label.i:18:[value] Assigning imprecise value to *((char *)(& p) + i) + (pointing to p with offsets {0; 8; 16; 24}). + The imprecision originates from Merge {tests/misc/label.i:18} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + a ∈ {{ &d + {4} }} + b ∈ {1; 2} + i ∈ {4} + p ∈ {{ garbled mix of &{a; b} (origin: Merge {tests/misc/label.i:18}) }} + q ∈ {{ &a }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + a FROM \nothing + b FROM c + i FROM i + p FROM i; c + q FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + a; b; i; p; q +[inout] Inputs for function main: + i; p; q diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/lazy.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/lazy.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/lazy.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/lazy.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/lazy.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {-1} + b ∈ {0} + d ∈ {0} + q ∈ {0} + r ∈ {0} + s ∈ {0} + t ∈ {0} +tests/misc/lazy.i:11:[kernel] warning: pointer comparison: assert \pointer_comparable((void *)0, q); +tests/misc/lazy.i:14:[kernel] warning: pointer comparison: assert \pointer_comparable((void *)0, s); +tests/misc/lazy.i:19:[kernel] warning: pointer comparison: assert \pointer_comparable((void *)0, &a+2); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + a ∈ {2; 6} + b ∈ {1} + q ∈ {{ &a + {-4; 0} }} + r ∈ {{ NULL ; &a + {-4; 0} }} + s ∈ {{ &a + {-4; 0} }} + t ∈ {{ NULL ; &a + {-4} }} + S_p[0..1] ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + a FROM \nothing + b FROM \nothing + q FROM c + r FROM c (and SELF) + s FROM d_0 + t FROM d_0 (and SELF) + S_p[0] FROM p; S_p[0] (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + a; b; q; r; s; t; S_p[0] +[inout] Inputs for function main: + a; q; s; S_p[0] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/lazy.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/lazy.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/lazy.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/lazy.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,42 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/lazy.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {-1} + b ∈ {0} + d ∈ {0} + q ∈ {0} + r ∈ {0} + s ∈ {0} + t ∈ {0} +tests/misc/lazy.i:11:[kernel] warning: pointer comparison: assert \pointer_comparable((void *)0, q); +tests/misc/lazy.i:14:[kernel] warning: pointer comparison: assert \pointer_comparable((void *)0, s); +tests/misc/lazy.i:19:[kernel] warning: pointer comparison: assert \pointer_comparable((void *)0, &a+2); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + a ∈ {6} + b ∈ {1} + q ∈ {{ &a + {-4; 0} }} + r ∈ {{ &a + {-4; 0} }} + s ∈ {{ &a + {-4; 0} }} + S_p[0..1] ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + a FROM \nothing + b FROM \nothing + q FROM c + r FROM c (and SELF) + s FROM d_0 + S_p[0] FROM p; S_p[0] (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + a; b; q; r; s; S_p[0] +[inout] Inputs for function main: + a; q; s; S_p[0] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/leaf2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/leaf2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/leaf2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/leaf2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,42 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/leaf2.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + H ∈ {0} + I ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/leaf2.i:6. +tests/misc/leaf2.i:6:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] using specification for function f +[value] Done for function f +tests/misc/leaf2.i:7:[value] Reading left-value G. + It contains a garbled mix of {I} because of Arithmetic + {tests/misc/leaf2.i:6}. +tests/misc/leaf2.i:7:[kernel] warning: pointer comparison: + assert \pointer_comparable((void *)G, (void *)((int)(-1))); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + G ∈ {{ garbled mix of &{I} (origin: Arithmetic {tests/misc/leaf2.i:6}) }} + H ∈ {{ garbled mix of &{I} (origin: Arithmetic {tests/misc/leaf2.i:6}) }} +[from] Computing for function main +[from] Computing for function f <-main +[from] Done for function f +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + H FROM q; i; H (and SELF) + \result FROM q; i; H +[from] Function main: + G FROM H + H FROM H (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + G; H +[inout] Inputs for function main: + G; H diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/leaf.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/leaf.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/leaf.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/leaf.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,259 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/leaf.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0] ∈ {1} + [1..29] ∈ {0} + cv1 ∈ {10} + cv2 ∈ {20} + cv3 ∈ {30} + st_star_cint_1.p ∈ {{ &cv1 }} + st_star_cint_2.p ∈ {{ &cv2 }} + st_star_cint_3.p ∈ {{ &cv3 }} + v1 ∈ {10} + v2 ∈ {20} + v3 ∈ {30} + st_star_int_1.p ∈ {{ &v1 }} + st_star_int_2.p ∈ {{ &v2 }} + st_star_int_3.p ∈ {{ &v3 }} + st_tab3_int_1.t[0] ∈ {10} + .t[1] ∈ {11} + .t[2] ∈ {12} + st_tab3_int_2.t[0] ∈ {20} + .t[1] ∈ {21} + .t[2] ∈ {22} + st_tab3_int_3.t[0] ∈ {30} + .t[1] ∈ {31} + .t[2] ∈ {32} +[value] computing for function f_int_int <- main. + Called from tests/misc/leaf.i:41. +tests/misc/leaf.i:41:[kernel] warning: Neither code nor specification for function f_int_int, generating default assigns from the prototype +[value] using specification for function f_int_int +[value] Done for function f_int_int +[value] computing for function f_int_star_int <- main. + Called from tests/misc/leaf.i:43. +tests/misc/leaf.i:43:[kernel] warning: Neither code nor specification for function f_int_star_int, generating default assigns from the prototype +[value] using specification for function f_int_star_int +[value] Done for function f_int_star_int +tests/misc/leaf.i:44:[kernel] warning: out of bounds read. assert \valid_read(p); +[value] Called CEA_F([-2147483648..2147483647]) +tests/misc/leaf.i:45:[kernel] warning: out of bounds write. assert \valid(p); +tests/misc/leaf.i:45:[kernel] more than 200(67108864) locations to update in array. Approximating. +[value] Called CEA_F([-2147483648..2147483647]) +[value] computing for function f_int_star_int_star_int <- main. + Called from tests/misc/leaf.i:48. +tests/misc/leaf.i:48:[kernel] warning: Neither code nor specification for function f_int_star_int_star_int, generating default assigns from the prototype +[value] using specification for function f_int_star_int_star_int +[value] Done for function f_int_star_int_star_int +tests/misc/leaf.i:49:[kernel] warning: out of bounds read. assert \valid_read(pp); +tests/misc/leaf.i:49:[value] Reading left-value *pp. + The location is {{ NULL -> [0..34359738360],0%8; + alloced_return_f_int_star_int_star_int -> [0..17179868928],0%256 }}. + It contains a garbled mix of {alloced_return_f_int_star_int_star_int} + because of Library function {tests/misc/leaf.i:48}. +[value] Called CEA_G({{ garbled mix of &{alloced_return_f_int_star_int_star_int} + (origin: Library function {tests/misc/leaf.i:48}) }}) +tests/misc/leaf.i:50:[kernel] warning: out of bounds read. assert \valid_read(pp); +tests/misc/leaf.i:50:[value] Reading left-value *pp. + The location is {{ alloced_return_f_int_star_int_star_int -> [0..17179868928],0%256 }}. + It contains a garbled mix of {alloced_return_f_int_star_int_star_int} + because of Library function {tests/misc/leaf.i:48}. +tests/misc/leaf.i:50:[kernel] warning: out of bounds read. assert \valid_read(*pp); +tests/misc/leaf.i:50:[value] Reading left-value *(*pp). + The location is a garbled mix of {alloced_return_f_int_star_int_star_int} + because of Library function {tests/misc/leaf.i:48}. + It contains a garbled mix of {alloced_return_f_int_star_int_star_int} + because of Library function {tests/misc/leaf.i:48}. +[value] Called CEA_F({{ garbled mix of &{alloced_return_f_int_star_int_star_int} + (origin: Library function {tests/misc/leaf.i:48}) }}) +tests/misc/leaf.i:52:[value] Reading left-value *pp. + The location is {{ alloced_return_f_int_star_int_star_int -> [0..17179868928],0%256 }}. + It contains a garbled mix of {alloced_return_f_int_star_int_star_int} + because of Library function {tests/misc/leaf.i:48}. +[value] Called CEA_G({{ garbled mix of &{alloced_return_f_int_star_int_star_int} + (origin: Library function {tests/misc/leaf.i:48}) }}) +tests/misc/leaf.i:53:[value] Reading left-value *pp. + The location is {{ alloced_return_f_int_star_int_star_int -> [0..17179868928],0%256 }}. + It contains a garbled mix of {alloced_return_f_int_star_int_star_int} + because of Library function {tests/misc/leaf.i:48}. +tests/misc/leaf.i:53:[kernel] warning: out of bounds read. assert \valid_read(*pp); +tests/misc/leaf.i:53:[value] Reading left-value *(*pp). + The location is a garbled mix of {alloced_return_f_int_star_int_star_int} + because of Library function {tests/misc/leaf.i:48}. + It contains a garbled mix of {alloced_return_f_int_star_int_star_int} + because of Library function {tests/misc/leaf.i:48}. +[value] Called CEA_F({{ garbled mix of &{alloced_return_f_int_star_int_star_int} + (origin: Library function {tests/misc/leaf.i:48}) }}) +[value] computing for function f_star_int_cint <- main. + Called from tests/misc/leaf.i:55. +tests/misc/leaf.i:55:[kernel] warning: Neither code nor specification for function f_star_int_cint, generating default assigns from the prototype +[value] using specification for function f_star_int_cint +[value] Done for function f_star_int_cint +[value] computing for function f_star_int_int <- main. + Called from tests/misc/leaf.i:57. +tests/misc/leaf.i:57:[kernel] warning: Neither code nor specification for function f_star_int_int, generating default assigns from the prototype +[value] using specification for function f_star_int_int +[value] Done for function f_star_int_int +[value] computing for function f_tab3_int_int <- main. + Called from tests/misc/leaf.i:58. +tests/misc/leaf.i:58:[kernel] warning: Neither code nor specification for function f_tab3_int_int, generating default assigns from the prototype +[value] using specification for function f_tab3_int_int +[value] Done for function f_tab3_int_int +[value] computing for function f_tab_int_int <- main. + Called from tests/misc/leaf.i:59. +tests/misc/leaf.i:59:[kernel] warning: Neither code nor specification for function f_tab_int_int, generating default assigns from the prototype +[value] using specification for function f_tab_int_int +[value] Done for function f_tab_int_int +[value] computing for function f_st_star_cint_st_star_cint <- main. + Called from tests/misc/leaf.i:61. +tests/misc/leaf.i:61:[kernel] warning: Neither code nor specification for function f_st_star_cint_st_star_cint, generating default assigns from the prototype +[value] using specification for function f_st_star_cint_st_star_cint +[value] Done for function f_st_star_cint_st_star_cint +[value] computing for function f_st_star_int_st_star_int <- main. + Called from tests/misc/leaf.i:62. +tests/misc/leaf.i:62:[kernel] warning: Neither code nor specification for function f_st_star_int_st_star_int, generating default assigns from the prototype +[value] using specification for function f_st_star_int_st_star_int +[value] Done for function f_st_star_int_st_star_int +[value] computing for function f_st_tab3_int_st_tab3_int <- main. + Called from tests/misc/leaf.i:63. +tests/misc/leaf.i:63:[kernel] warning: Neither code nor specification for function f_st_tab3_int_st_tab3_int, generating default assigns from the prototype +[value] using specification for function f_st_tab3_int_st_tab3_int +[value] Done for function f_st_tab3_int_st_tab3_int +[value] computing for function f_star_st_star_cint_int <- main. + Called from tests/misc/leaf.i:65. +tests/misc/leaf.i:65:[kernel] warning: Neither code nor specification for function f_star_st_star_cint_int, generating default assigns from the prototype +[value] using specification for function f_star_st_star_cint_int +[value] Done for function f_star_st_star_cint_int +[value] computing for function f_star_st_star_int_int <- main. + Called from tests/misc/leaf.i:66. +tests/misc/leaf.i:66:[kernel] warning: Neither code nor specification for function f_star_st_star_int_int, generating default assigns from the prototype +[value] using specification for function f_star_st_star_int_int +[value] Done for function f_star_st_star_int_int +[value] computing for function f_star_st_tab3_int_int <- main. + Called from tests/misc/leaf.i:67. +tests/misc/leaf.i:67:[kernel] warning: Neither code nor specification for function f_star_st_tab3_int_int, generating default assigns from the prototype +[value] using specification for function f_star_st_tab3_int_int +[value] Done for function f_star_st_tab3_int_int +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +tests/misc/leaf.i:45:[kernel] more than 200(67108864) elements to enumerate. Approximating. +[value] Values at end of function main: + T[0] ∈ [--..--] + [1] ∈ {0} + [2] ∈ [--..--] + [3] ∈ {0} + [4] ∈ [--..--] + [5] ∈ {0} + [6..8] ∈ [--..--] + [9] ∈ {0} + [10] ∈ [--..--] + [11..29] ∈ {0} + st_star_cint_1 ∈ + {{ garbled mix of &{cv2; + alloced_return_f_st_star_cint_st_star_cint} + (origin: Arithmetic {tests/misc/leaf.i:61}) }} + st_star_cint_3 ∈ + {{ garbled mix of &{cv3} + (origin: Arithmetic {tests/misc/leaf.i:65}) }} + st_star_int_1 ∈ + {{ garbled mix of &{v2; + alloced_return_f_st_star_int_st_star_int} + (origin: Arithmetic {tests/misc/leaf.i:62}) }} + st_star_int_3 ∈ + {{ garbled mix of &{v3} + (origin: Arithmetic {tests/misc/leaf.i:66}) }} + st_tab3_int_1 ∈ [--..--] + st_tab3_int_3 ∈ [--..--] + p ∈ {{ &alloced_return_f_int_star_int + [0..2147483616],0%32 }} + pp ∈ {{ &alloced_return_f_int_star_int_star_int + [0..2147483616],0%32 }} + alloced_return_f_int_star_int[bits 0 to ..] ∈ [--..--] +[from] Computing for function main +[from] Computing for function f_int_int <-main +[from] Done for function f_int_int +[from] Computing for function f_int_star_int <-main +[from] Done for function f_int_star_int +tests/misc/leaf.i:45:[kernel] more than 200(67108864) dependencies to update. Approximating. +[from] Computing for function f_int_star_int_star_int <-main +[from] Done for function f_int_star_int_star_int +[from] Computing for function f_star_int_cint <-main +[from] Done for function f_star_int_cint +[from] Computing for function f_star_int_int <-main +[from] Done for function f_star_int_int +[from] Computing for function f_tab3_int_int <-main +[from] Done for function f_tab3_int_int +[from] Computing for function f_tab_int_int <-main +[from] Done for function f_tab_int_int +[from] Computing for function f_st_star_cint_st_star_cint <-main +[from] Done for function f_st_star_cint_st_star_cint +[from] Computing for function f_st_star_int_st_star_int <-main +[from] Done for function f_st_star_int_st_star_int +[from] Computing for function f_st_tab3_int_st_tab3_int <-main +[from] Done for function f_st_tab3_int_st_tab3_int +[from] Computing for function f_star_st_star_cint_int <-main +[from] Done for function f_star_st_star_cint_int +[from] Computing for function f_star_st_star_int_int <-main +[from] Done for function f_star_st_star_int_int +[from] Computing for function f_star_st_tab3_int_int <-main +[from] Done for function f_star_st_tab3_int_int +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f_int_int: + \result FROM x +[from] Function f_int_star_int: + \result FROM x +[from] Function f_int_star_int_star_int: + \result FROM x +[from] Function f_st_star_cint_st_star_cint: + \result FROM s +[from] Function f_st_star_int_st_star_int: + \result FROM s +[from] Function f_st_tab3_int_st_tab3_int: + \result FROM s +[from] Function f_star_int_cint: + \result FROM T[3] +[from] Function f_star_int_int: + T[4] FROM T[4] (and SELF) + \result FROM T[4] +[from] Function f_star_st_star_cint_int: + st_star_cint_3 FROM st_star_cint_3 (and SELF) + \result FROM st_star_cint_3 +[from] Function f_star_st_star_int_int: + st_star_int_3 FROM st_star_int_3 (and SELF) + \result FROM st_star_int_3 +[from] Function f_star_st_tab3_int_int: + st_tab3_int_3 FROM st_tab3_int_3 (and SELF) + \result FROM st_tab3_int_3 +[from] Function f_tab3_int_int: + T[6..8] FROM T[6..8] (and SELF) + \result FROM T[6..8] +[from] Function f_tab_int_int: + T[10] FROM T[10] (and SELF) + \result FROM T[10] +[from] Function main: + T[0] FROM \nothing + [2] FROM T[3] + [4] FROM T[4] (and SELF) + [6..8] FROM T[6..8] (and SELF) + [10] FROM T[10] (and SELF) + st_star_cint_1 FROM st_star_cint_2 + st_star_cint_3 FROM st_star_cint_3 (and SELF) + st_star_int_1 FROM st_star_int_2 + st_star_int_3 FROM st_star_int_3 (and SELF) + st_tab3_int_1 FROM st_tab3_int_2 + st_tab3_int_3 FROM st_tab3_int_3 (and SELF) + alloced_return_f_int_star_int[bits 0 to 17179868959] + FROM \nothing (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + T{[0]; [2]; [4]; [6..8]; [10]}; st_star_cint_1; st_star_cint_3; + st_star_int_1; st_star_int_3; st_tab3_int_1; st_tab3_int_3; p; pp; + alloced_return_f_int_star_int[bits 0 to 17179868959] +[inout] Inputs for function main: + T{[3..4]; [6..8]; [10]}; st_star_cint_2; st_star_cint_3; st_star_int_2; + st_star_int_3; st_tab3_int_2; st_tab3_int_3; + alloced_return_f_int_star_int[bits 0 to 17179868959]; + alloced_return_f_int_star_int_star_int[bits 0 to ..] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/leaf_spec.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/leaf_spec.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/leaf_spec.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/leaf_spec.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,34 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/leaf_spec.i (no preprocessing) +[value] Analyzing a complete application starting at main1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main1. + Called from tests/misc/leaf_spec.i:27. +tests/misc/leaf_spec.i:27:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] using specification for function f +tests/misc/leaf_spec.i:27:[value] warning: Completely invalid destination for assigns clause *x. Ignoring. +tests/misc/leaf_spec.i:27:[value] warning: Completely invalid destination for assigns clause *y. Ignoring. +[value] Done for function f +[value] Recording results for main1 +[value] done for function main1 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main1: + +[from] Computing for function main1 +[from] Computing for function f <-main1 +[from] Done for function f +[from] Done for function main1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + NO EFFECTS +[from] Function main1: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main1: + \nothing +[inout] Inputs for function main1: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/leaf_spec.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/leaf_spec.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/leaf_spec.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/leaf_spec.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,69 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/leaf_spec.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f1 <- main. + Called from tests/misc/leaf_spec.i:19. +tests/misc/leaf_spec.i:19:[kernel] warning: Neither code nor specification for function f1, generating default assigns from the prototype +[value] using specification for function f1 +[value] Done for function f1 +[value] computing for function g <- main. + Called from tests/misc/leaf_spec.i:20. +tests/misc/leaf_spec.i:20:[kernel] warning: Neither code nor specification for function g, generating default assigns from the prototype +[value] using specification for function g +[value] Done for function g +[value] computing for function h <- main. + Called from tests/misc/leaf_spec.i:21. +tests/misc/leaf_spec.i:21:[kernel] warning: Neither code nor specification for function h, generating default assigns from the prototype +[value] using specification for function h +[value] Done for function h +[value] computing for function k <- main. + Called from tests/misc/leaf_spec.i:22. +tests/misc/leaf_spec.i:22:[kernel] warning: Neither code nor specification for function k, generating default assigns from the prototype +[value] using specification for function k +tests/misc/leaf_spec.i:22:[value] warning: Completely invalid destination for assigns clause *l. Ignoring. +[value] Done for function k +[value] computing for function k0 <- main. + Called from tests/misc/leaf_spec.i:22. +tests/misc/leaf_spec.i:22:[kernel] warning: Neither code nor specification for function k0, generating default assigns from the prototype +[value] using specification for function k0 +[value] Done for function k0 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + +[from] Computing for function main +[from] Computing for function f1 <-main +[from] Done for function f1 +[from] Computing for function g <-main +[from] Done for function g +[from] Computing for function h <-main +[from] Done for function h +[from] Computing for function k <-main +[from] Done for function k +[from] Computing for function k0 <-main +[from] Done for function k0 +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + NO EFFECTS +[from] Function g: + \result FROM x +[from] Function h: + \result FROM y +[from] Function k: + \result FROM \nothing +[from] Function k0: + \result FROM \nothing +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/library_precond.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/library_precond.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/library_precond.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/library_precond.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/library_precond.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function mxml <- main. + Called from tests/misc/library_precond.i:9. +[value] using specification for function mxml +tests/misc/library_precond.i:3:[value] Function mxml: precondition got status invalid. +[value] Done for function mxml +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Computing for function mxml <-main +[from] Done for function mxml +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function mxml: + \result FROM ANYTHING(origin:Unknown) +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + p; a +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/library.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/library.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/library.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/library.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,444 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/library.i (no preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value:initial_state] creating variable S_0_p_ss with imprecise size (type struct ss [2]) +tests/misc/library.i:44:[value] warning: during initialization of variable 'ss', size of type 'struct ss' cannot be + computed (abstract type 'struct ss') +[value:initial_state] creating variable S_1_p_ss with imprecise size (type struct ss [2]) +[value:initial_state] creating variable S_q_ss with imprecise size (type struct ss [2][8]) +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {{ NULL ; &S_G[0] }} + G0 ∈ [--..--] + G1 ∈ {{ NULL ; &S_G1[0] }} + f ∈ {{ garbled mix of &{S_f_0} (origin: Well) }} + s.f[0] ∈ {{ garbled mix of &{S_0_f_s} (origin: Well) }} + .f[1] ∈ {{ garbled mix of &{S_1_f_s} (origin: Well) }} + ss.p[0] ∈ {{ NULL ; (struct ss *)&S_0_p_ss }} + .p[1] ∈ {{ NULL ; (struct ss *)&S_1_p_ss }} + .p[2..7] ∈ {{ NULL ; (struct ss *)&S_0_p_ss ; (struct ss *)&S_1_p_ss }} + .q ∈ {{ NULL ; (struct ss (*)[8])&S_q_ss }} + ff ∈ {{ garbled mix of &{S_ff} (origin: Well) }} + S_G[0] ∈ {{ NULL ; &S_0_S_G[0] }} + [1] ∈ {{ NULL ; &S_1_S_G[0] }} + S_0_S_G[0] ∈ {{ NULL ; &S_0_S_0_S_G[0] }} + [1] ∈ {{ NULL ; &S_1_S_0_S_G[0] }} + S_0_S_0_S_G[0] ∈ {{ NULL ; &S_0_S_0_S_0_S_G[0] }} + [1] ∈ {{ NULL ; &S_1_S_0_S_0_S_G[0] }} + S_0_S_0_S_0_S_G[0..1] ∈ [--..--] + S_1_S_0_S_0_S_G[0..1] ∈ [--..--] + S_1_S_0_S_G[0] ∈ {{ NULL ; &S_0_S_1_S_0_S_G[0] }} + [1] ∈ {{ NULL ; &S_1_S_1_S_0_S_G[0] }} + S_0_S_1_S_0_S_G[0..1] ∈ [--..--] + S_1_S_1_S_0_S_G[0..1] ∈ [--..--] + S_1_S_G[0] ∈ {{ NULL ; &S_0_S_1_S_G[0] }} + [1] ∈ {{ NULL ; &S_1_S_1_S_G[0] }} + S_0_S_1_S_G[0] ∈ {{ NULL ; &S_0_S_0_S_1_S_G[0] }} + [1] ∈ {{ NULL ; &S_1_S_0_S_1_S_G[0] }} + S_0_S_0_S_1_S_G[0..1] ∈ [--..--] + S_1_S_0_S_1_S_G[0..1] ∈ [--..--] + S_1_S_1_S_G[0] ∈ {{ NULL ; &S_0_S_1_S_1_S_G[0] }} + [1] ∈ {{ NULL ; &S_1_S_1_S_1_S_G[0] }} + S_0_S_1_S_1_S_G[0..1] ∈ [--..--] + S_1_S_1_S_1_S_G[0..1] ∈ [--..--] + S_G1[0..1] ∈ [--..--] + S_0_p_ss[bits 0 to ..] ∈ [--..--] or UNINITIALIZED + S_1_p_ss[bits 0 to ..] ∈ [--..--] or UNINITIALIZED + S_q_ss[bits 0 to ..] ∈ [--..--] or UNINITIALIZED +[value] computing for function f_int <- main. + Called from tests/misc/library.i:17. +tests/misc/library.i:17:[kernel] warning: Neither code nor specification for function f_int, generating default assigns from the prototype +[value] using specification for function f_int +[value] Done for function f_int +[value] computing for function f_star_int <- main. + Called from tests/misc/library.i:18. +tests/misc/library.i:18:[kernel] warning: Neither code nor specification for function f_star_int, generating default assigns from the prototype +[value] using specification for function f_star_int +[value] Done for function f_star_int +tests/misc/library.i:19:[kernel] warning: out of bounds write. assert \valid(G1); +tests/misc/library.i:19:[kernel] more than 200(67108864) locations to update in array. Approximating. +tests/misc/library.i:20:[kernel] warning: out of bounds read. assert \valid_read(G); +tests/misc/library.i:20:[kernel] warning: out of bounds read. assert \valid_read(*G); +tests/misc/library.i:20:[kernel] warning: out of bounds read. assert \valid_read(*(*G)); +tests/misc/library.i:20:[kernel] warning: out of bounds write. assert \valid(*(*(*G))); +[value] computing for function gen <- main. + Called from tests/misc/library.i:24. +tests/misc/library.i:24:[kernel] warning: Neither code nor specification for function gen, generating default assigns from the prototype +[value] using specification for function gen +[value] Done for function gen +tests/misc/library.i:25:[value] Reading left-value f. + It contains a garbled mix of {S_f_0} because of Well. +tests/misc/library.i:25:[value] warning: Function pointer for call is imprecise: assert(\valid_fun_pointer(*f)) +[value] computing for function S_f_0 <- main. + Called from tests/misc/library.i:25. +tests/misc/library.i:25:[kernel] warning: Neither code nor specification for function S_f_0, generating default assigns from the prototype +[value] using specification for function S_f_0 +[value] Done for function S_f_0 +tests/misc/library.i:26:[value] Reading left-value g. + It contains a garbled mix of {S_g} because of Well. +tests/misc/library.i:26:[value] warning: Function pointer for call is imprecise: assert(\valid_fun_pointer(*g)) +[value] computing for function S_g <- main. + Called from tests/misc/library.i:26. +tests/misc/library.i:26:[kernel] warning: Neither code nor specification for function S_g, generating default assigns from the prototype +[value] using specification for function S_g +[value] Done for function S_g +tests/misc/library.i:27:[value] warning: Function pointer call at absolute position in memory: ignoring this particular value: assert(\valid_fun_pointer(*h)) +tests/misc/library.i:27:[value] warning: Function pointer evaluates to function address plus offset: ignoring this particular value: assert(\valid_fun_pointer(*h)) +[value] computing for function alloced_return_gen <- main. + Called from tests/misc/library.i:27. +tests/misc/library.i:27:[kernel] warning: Neither code nor specification for function alloced_return_gen, generating default assigns from the prototype +[value] using specification for function alloced_return_gen +[value] Done for function alloced_return_gen +[value] computing for function i <- main. + Called from tests/misc/library.i:28. +tests/misc/library.i:28:[kernel] warning: Neither code nor specification for function i, generating default assigns from the prototype +[value] using specification for function i +[value] Done for function i +tests/misc/library.i:29:[kernel] warning: out of bounds read. assert \valid_read(pf); +tests/misc/library.i:30:[kernel] more than 200(67108864) locations to update in array. Approximating. +tests/misc/library.i:31:[kernel] warning: non-finite float value ([-6.80564693277e+38 .. 6.80564693277e+38]): + assert \is_finite((float)(*pf+*pf)); +tests/misc/library.i:31:[kernel] more than 200(67108864) locations to update in array. Approximating. +[value] computing for function k <- main. + Called from tests/misc/library.i:32. +tests/misc/library.i:32:[kernel] warning: Neither code nor specification for function k, generating default assigns from the prototype +[value] using specification for function k +[value] Done for function k +tests/misc/library.i:33:[kernel] warning: out of bounds write. assert \valid(pd); +tests/misc/library.i:33:[kernel] more than 200(33554432) locations to update in array. Approximating. +[value] Recording results for main +[value] done for function main +tests/misc/library.i:34:[kernel] more than 200(67108864) elements to enumerate. Approximating. +[value] ====== VALUES COMPUTED ====== +tests/misc/library.i:33:[kernel] more than 200(33554432) elements to enumerate. Approximating. +[value] Values at end of function main: + G0 ∈ [--..--] + G1 ∈ {{ &alloced_return_f_star_int + [0..2147483616],0%32 }} + x ∈ [--..--] + y ∈ {4} + h ∈ {{ NULL + [--..--] ; &alloced_return_gen + [0..2147483640],0%8 }} + z1 ∈ [--..--] + z2 ∈ [--..--] + z3 ∈ [--..--] + pf ∈ {{ &alloced_return_i + [0..2147483616],0%32 }} + vf ∈ [-3.40282346639e+38 .. 3.40282346639e+38] + pd ∈ {{ &alloced_return_k + [0..2147483584],0%64 }} + S_0_S_0_S_0_S_G[0] ∈ {1} + [1] ∈ [--..--] + alloced_return_f_star_int[bits 0 to ..] ∈ [--..--] + alloced_return_i[bits 0 to ..]# ∈ + [-3.40282346639e+38 .. 3.40282346639e+38] repeated %32 + alloced_return_k[bits 0 to ..]# ∈ + [-1.79769313486e+308 .. 1.79769313486e+308] repeated %64 +[from] Computing for function main +[from] Computing for function f_int <-main +[from] Done for function f_int +[from] Computing for function f_star_int <-main +[from] Done for function f_star_int +tests/misc/library.i:19:[kernel] more than 200(67108864) dependencies to update. Approximating. +[from] Computing for function gen <-main +[from] Done for function gen +[from] Computing for function S_f_0 <-main +[from] Done for function S_f_0 +[from] Computing for function S_g <-main +[from] Done for function S_g +[from] Computing for function alloced_return_gen <-main +[from] Done for function alloced_return_gen +[from] Computing for function i <-main +[from] Done for function i +tests/misc/library.i:30:[kernel] more than 200(67108864) dependencies to update. Approximating. +tests/misc/library.i:31:[kernel] more than 200(67108864) dependencies to update. Approximating. +[from] Computing for function k <-main +[from] Done for function k +tests/misc/library.i:33:[kernel] more than 200(33554432) dependencies to update. Approximating. +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function S_f_0: + x FROM x; y (and SELF) + \result FROM x; y +[from] Function S_g: + x FROM x; y (and SELF) + \result FROM x; y +[from] Function alloced_return_gen: + x FROM x; y (and SELF) + \result FROM x; y +[from] Function f_int: + \result FROM x +[from] Function f_star_int: + \result FROM x +[from] Function gen: + \result FROM \nothing +[from] Function i: + \result FROM \nothing +[from] Function k: + \result FROM \nothing +[from] Function main: + G0 FROM \nothing + G1 FROM \nothing + S_0_S_0_S_0_S_G[0] FROM G; S_G[0]; S_0_S_G[0]; S_0_S_0_S_G[0] + alloced_return_f_star_int[bits 0 to 17179868959] FROM \nothing (and SELF) + alloced_return_i[bits 0 to 17179868959] + FROM alloced_return_i[bits 0 to 17179868959] (and SELF) + alloced_return_k[bits 0 to 17179868735] FROM \nothing (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + G0; G1; x; y; h; z1; z2; z3; pf; vf; pd; S_0_S_0_S_0_S_G[0]; + alloced_return_f_star_int[bits 0 to 17179868959]; + alloced_return_i[bits 0 to 17179868959]; + alloced_return_k[bits 0 to 17179868735] +[inout] Inputs for function main: + G; G1; f; S_G[0]; S_0_S_G[0]; S_0_S_0_S_G[0]; + alloced_return_i[bits 0 to 17179868959] +[value] Analyzing an incomplete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {{ NULL ; &S_G[0] }} + G0 ∈ [--..--] + G1 ∈ {{ NULL ; &S_G1[0] }} + f ∈ {{ garbled mix of &{S_f_0} (origin: Well) }} + s.f[0] ∈ {{ garbled mix of &{S_0_f_s} (origin: Well) }} + .f[1] ∈ {{ garbled mix of &{S_1_f_s} (origin: Well) }} + ss.p[0] ∈ {{ NULL ; (struct ss *)&S_0_p_ss }} + .p[1] ∈ {{ NULL ; (struct ss *)&S_1_p_ss }} + .p[2..7] ∈ {{ NULL ; (struct ss *)&S_0_p_ss ; (struct ss *)&S_1_p_ss }} + .q ∈ {{ NULL ; (struct ss (*)[8])&S_q_ss }} + ff ∈ {{ garbled mix of &{S_ff} (origin: Well) }} + S_G[0] ∈ {{ NULL ; &S_0_S_G[0] }} + [1] ∈ {{ NULL ; &S_1_S_G[0] }} + S_0_S_G[0] ∈ {{ NULL ; &S_0_S_0_S_G[0] }} + [1] ∈ {{ NULL ; &S_1_S_0_S_G[0] }} + S_0_S_0_S_G[0] ∈ {{ NULL ; &S_0_S_0_S_0_S_G[0] }} + [1] ∈ {{ NULL ; &S_1_S_0_S_0_S_G[0] }} + S_0_S_0_S_0_S_G[0..1] ∈ [--..--] + S_1_S_0_S_0_S_G[0..1] ∈ [--..--] + S_1_S_0_S_G[0] ∈ {{ NULL ; &S_0_S_1_S_0_S_G[0] }} + [1] ∈ {{ NULL ; &S_1_S_1_S_0_S_G[0] }} + S_0_S_1_S_0_S_G[0..1] ∈ [--..--] + S_1_S_1_S_0_S_G[0..1] ∈ [--..--] + S_1_S_G[0] ∈ {{ NULL ; &S_0_S_1_S_G[0] }} + [1] ∈ {{ NULL ; &S_1_S_1_S_G[0] }} + S_0_S_1_S_G[0] ∈ {{ NULL ; &S_0_S_0_S_1_S_G[0] }} + [1] ∈ {{ NULL ; &S_1_S_0_S_1_S_G[0] }} + S_0_S_0_S_1_S_G[0..1] ∈ [--..--] + S_1_S_0_S_1_S_G[0..1] ∈ [--..--] + S_1_S_1_S_G[0] ∈ {{ NULL ; &S_0_S_1_S_1_S_G[0] }} + [1] ∈ {{ NULL ; &S_1_S_1_S_1_S_G[0] }} + S_0_S_1_S_1_S_G[0..1] ∈ [--..--] + S_1_S_1_S_1_S_G[0..1] ∈ [--..--] + S_G1[0..1] ∈ [--..--] + S_0_p_ss[bits 0 to ..] ∈ [--..--] or UNINITIALIZED + S_1_p_ss[bits 0 to ..] ∈ [--..--] or UNINITIALIZED + S_q_ss[bits 0 to ..] ∈ [--..--] or UNINITIALIZED +[value] Recording results for main2 +[value] done for function main2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main2: + +[from] Computing for function main2 +[from] Done for function main2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main2: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main2: + \nothing +[inout] Inputs for function main2: + \nothing +[value] Analyzing an incomplete application starting at main2 +[value] Computing initial state +[value:initial_state] creating variable S_0_p_ss_0 with imprecise size (type struct ss [4]) +[value:initial_state] creating variable S_1_p_ss_0 with imprecise size (type struct ss [4]) +[value:initial_state] creating variable S_2_p_ss with imprecise size (type struct ss [4]) +[value:initial_state] creating variable S_3_p_ss with imprecise size (type struct ss [4]) +[value:initial_state] creating variable S_q_ss_0 with imprecise size (type struct ss [4][8]) +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {{ NULL ; &S_G_0[0] }} + G0 ∈ [--..--] + G1 ∈ {{ NULL ; &S_G1_0[0] }} + f ∈ {{ garbled mix of &{S_f_1} (origin: Well) }} + s.f[0] ∈ {{ garbled mix of &{S_0_f_s_0} (origin: Well) }} + .f[1] ∈ {{ garbled mix of &{S_1_f_s_0} (origin: Well) }} + ss.p[0] ∈ {{ NULL ; (struct ss *)&S_0_p_ss_0 }} + .p[1] ∈ {{ NULL ; (struct ss *)&S_1_p_ss_0 }} + .p[2] ∈ {{ NULL ; (struct ss *)&S_2_p_ss }} + .p[3] ∈ {{ NULL ; (struct ss *)&S_3_p_ss }} + .p[4..7] ∈ + {{ NULL ; (struct ss *)&S_0_p_ss_0 ; (struct ss *)&S_1_p_ss_0 ; + (struct ss *)&S_2_p_ss ; (struct ss *)&S_3_p_ss }} + .q ∈ {{ NULL ; (struct ss (*)[8])&S_q_ss_0 }} + ff ∈ {{ garbled mix of &{S_ff_0} (origin: Well) }} + S_G_0[0] ∈ {{ NULL ; &S_0_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_G_0[0] }} + S_0_S_G_0[0] ∈ {{ NULL ; &S_0_S_0_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_0_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_0_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_0_S_G_0[0] }} + S_0_S_0_S_G_0[0] ∈ {{ NULL ; &S_0_S_0_S_0_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_0_S_0_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_0_S_0_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_0_S_0_S_G_0[0] }} + S_0_S_0_S_0_S_G_0[0..3] ∈ [--..--] + S_1_S_0_S_0_S_G_0[0..3] ∈ [--..--] + S_2_S_0_S_0_S_G_0[0..3] ∈ [--..--] + S_3_S_0_S_0_S_G_0[0..3] ∈ [--..--] + S_1_S_0_S_G_0[0] ∈ {{ NULL ; &S_0_S_1_S_0_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_1_S_0_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_1_S_0_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_1_S_0_S_G_0[0] }} + S_0_S_1_S_0_S_G_0[0..3] ∈ [--..--] + S_1_S_1_S_0_S_G_0[0..3] ∈ [--..--] + S_2_S_1_S_0_S_G_0[0..3] ∈ [--..--] + S_3_S_1_S_0_S_G_0[0..3] ∈ [--..--] + S_2_S_0_S_G_0[0] ∈ {{ NULL ; &S_0_S_2_S_0_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_2_S_0_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_2_S_0_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_2_S_0_S_G_0[0] }} + S_0_S_2_S_0_S_G_0[0..3] ∈ [--..--] + S_1_S_2_S_0_S_G_0[0..3] ∈ [--..--] + S_2_S_2_S_0_S_G_0[0..3] ∈ [--..--] + S_3_S_2_S_0_S_G_0[0..3] ∈ [--..--] + S_3_S_0_S_G_0[0] ∈ {{ NULL ; &S_0_S_3_S_0_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_3_S_0_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_3_S_0_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_3_S_0_S_G_0[0] }} + S_0_S_3_S_0_S_G_0[0..3] ∈ [--..--] + S_1_S_3_S_0_S_G_0[0..3] ∈ [--..--] + S_2_S_3_S_0_S_G_0[0..3] ∈ [--..--] + S_3_S_3_S_0_S_G_0[0..3] ∈ [--..--] + S_1_S_G_0[0] ∈ {{ NULL ; &S_0_S_1_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_1_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_1_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_1_S_G_0[0] }} + S_0_S_1_S_G_0[0] ∈ {{ NULL ; &S_0_S_0_S_1_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_0_S_1_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_0_S_1_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_0_S_1_S_G_0[0] }} + S_0_S_0_S_1_S_G_0[0..3] ∈ [--..--] + S_1_S_0_S_1_S_G_0[0..3] ∈ [--..--] + S_2_S_0_S_1_S_G_0[0..3] ∈ [--..--] + S_3_S_0_S_1_S_G_0[0..3] ∈ [--..--] + S_1_S_1_S_G_0[0] ∈ {{ NULL ; &S_0_S_1_S_1_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_1_S_1_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_1_S_1_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_1_S_1_S_G_0[0] }} + S_0_S_1_S_1_S_G_0[0..3] ∈ [--..--] + S_1_S_1_S_1_S_G_0[0..3] ∈ [--..--] + S_2_S_1_S_1_S_G_0[0..3] ∈ [--..--] + S_3_S_1_S_1_S_G_0[0..3] ∈ [--..--] + S_2_S_1_S_G_0[0] ∈ {{ NULL ; &S_0_S_2_S_1_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_2_S_1_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_2_S_1_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_2_S_1_S_G_0[0] }} + S_0_S_2_S_1_S_G_0[0..3] ∈ [--..--] + S_1_S_2_S_1_S_G_0[0..3] ∈ [--..--] + S_2_S_2_S_1_S_G_0[0..3] ∈ [--..--] + S_3_S_2_S_1_S_G_0[0..3] ∈ [--..--] + S_3_S_1_S_G_0[0] ∈ {{ NULL ; &S_0_S_3_S_1_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_3_S_1_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_3_S_1_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_3_S_1_S_G_0[0] }} + S_0_S_3_S_1_S_G_0[0..3] ∈ [--..--] + S_1_S_3_S_1_S_G_0[0..3] ∈ [--..--] + S_2_S_3_S_1_S_G_0[0..3] ∈ [--..--] + S_3_S_3_S_1_S_G_0[0..3] ∈ [--..--] + S_2_S_G_0[0] ∈ {{ NULL ; &S_0_S_2_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_2_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_2_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_2_S_G_0[0] }} + S_0_S_2_S_G_0[0] ∈ {{ NULL ; &S_0_S_0_S_2_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_0_S_2_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_0_S_2_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_0_S_2_S_G_0[0] }} + S_0_S_0_S_2_S_G_0[0..3] ∈ [--..--] + S_1_S_0_S_2_S_G_0[0..3] ∈ [--..--] + S_2_S_0_S_2_S_G_0[0..3] ∈ [--..--] + S_3_S_0_S_2_S_G_0[0..3] ∈ [--..--] + S_1_S_2_S_G_0[0] ∈ {{ NULL ; &S_0_S_1_S_2_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_1_S_2_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_1_S_2_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_1_S_2_S_G_0[0] }} + S_0_S_1_S_2_S_G_0[0..3] ∈ [--..--] + S_1_S_1_S_2_S_G_0[0..3] ∈ [--..--] + S_2_S_1_S_2_S_G_0[0..3] ∈ [--..--] + S_3_S_1_S_2_S_G_0[0..3] ∈ [--..--] + S_2_S_2_S_G_0[0] ∈ {{ NULL ; &S_0_S_2_S_2_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_2_S_2_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_2_S_2_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_2_S_2_S_G_0[0] }} + S_0_S_2_S_2_S_G_0[0..3] ∈ [--..--] + S_1_S_2_S_2_S_G_0[0..3] ∈ [--..--] + S_2_S_2_S_2_S_G_0[0..3] ∈ [--..--] + S_3_S_2_S_2_S_G_0[0..3] ∈ [--..--] + S_3_S_2_S_G_0[0] ∈ {{ NULL ; &S_0_S_3_S_2_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_3_S_2_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_3_S_2_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_3_S_2_S_G_0[0] }} + S_0_S_3_S_2_S_G_0[0..3] ∈ [--..--] + S_1_S_3_S_2_S_G_0[0..3] ∈ [--..--] + S_2_S_3_S_2_S_G_0[0..3] ∈ [--..--] + S_3_S_3_S_2_S_G_0[0..3] ∈ [--..--] + S_3_S_G_0[0] ∈ {{ NULL ; &S_0_S_3_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_3_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_3_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_3_S_G_0[0] }} + S_0_S_3_S_G_0[0] ∈ {{ NULL ; &S_0_S_0_S_3_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_0_S_3_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_0_S_3_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_0_S_3_S_G_0[0] }} + S_0_S_0_S_3_S_G_0[0..3] ∈ [--..--] + S_1_S_0_S_3_S_G_0[0..3] ∈ [--..--] + S_2_S_0_S_3_S_G_0[0..3] ∈ [--..--] + S_3_S_0_S_3_S_G_0[0..3] ∈ [--..--] + S_1_S_3_S_G_0[0] ∈ {{ NULL ; &S_0_S_1_S_3_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_1_S_3_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_1_S_3_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_1_S_3_S_G_0[0] }} + S_0_S_1_S_3_S_G_0[0..3] ∈ [--..--] + S_1_S_1_S_3_S_G_0[0..3] ∈ [--..--] + S_2_S_1_S_3_S_G_0[0..3] ∈ [--..--] + S_3_S_1_S_3_S_G_0[0..3] ∈ [--..--] + S_2_S_3_S_G_0[0] ∈ {{ NULL ; &S_0_S_2_S_3_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_2_S_3_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_2_S_3_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_2_S_3_S_G_0[0] }} + S_0_S_2_S_3_S_G_0[0..3] ∈ [--..--] + S_1_S_2_S_3_S_G_0[0..3] ∈ [--..--] + S_2_S_2_S_3_S_G_0[0..3] ∈ [--..--] + S_3_S_2_S_3_S_G_0[0..3] ∈ [--..--] + S_3_S_3_S_G_0[0] ∈ {{ NULL ; &S_0_S_3_S_3_S_G_0[0] }} + [1] ∈ {{ NULL ; &S_1_S_3_S_3_S_G_0[0] }} + [2] ∈ {{ NULL ; &S_2_S_3_S_3_S_G_0[0] }} + [3] ∈ {{ NULL ; &S_3_S_3_S_3_S_G_0[0] }} + S_0_S_3_S_3_S_G_0[0..3] ∈ [--..--] + S_1_S_3_S_3_S_G_0[0..3] ∈ [--..--] + S_2_S_3_S_3_S_G_0[0..3] ∈ [--..--] + S_3_S_3_S_3_S_G_0[0..3] ∈ [--..--] + S_G1_0[0..3] ∈ [--..--] + S_0_p_ss_0[bits 0 to ..] ∈ [--..--] or UNINITIALIZED + S_1_p_ss_0[bits 0 to ..] ∈ [--..--] or UNINITIALIZED + S_2_p_ss[bits 0 to ..] ∈ [--..--] or UNINITIALIZED + S_3_p_ss[bits 0 to ..] ∈ [--..--] or UNINITIALIZED + S_q_ss_0[bits 0 to ..] ∈ [--..--] or UNINITIALIZED +[value] Recording results for main2 +[value] done for function main2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main2: + +[from] Computing for function main2 +[from] Done for function main2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main2: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main2: + \nothing +[inout] Inputs for function main2: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/limits.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/limits.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/limits.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/limits.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,35 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/limits.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + cl ∈ {0} + cu ∈ {0} + ucu ∈ {0} + il ∈ {0} + iu ∈ {0} + uiu ∈ {0} + ll ∈ {0} + lu ∈ {0} + ulu ∈ {0} + lll ∈ {0} + llu ∈ {0} + ullu ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + cl ∈ {-128} + cu ∈ {127} + ucu ∈ {255} + il ∈ {-2147483648} + iu ∈ {2147483647} + uiu ∈ {-1} + ll ∈ {-2147483648} + lu ∈ {2147483647} + ulu ∈ {4294967295} + lll ∈ {-9223372036854775808} + llu ∈ {9223372036854775807} + ullu ∈ {18446744073709551615} + __retres ∈ {0} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/local_cleanup.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/local_cleanup.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/local_cleanup.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/local_cleanup.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,61 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/local_cleanup.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/misc/local_cleanup.c:16. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/local_cleanup.c:17. +[value] computing for function f <- g <- main. + Called from tests/misc/local_cleanup.c:11. +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + t[0] ∈ UNINITIALIZED + [1] ∈ {12} or UNINITIALIZED + lmain[0] ∈ UNINITIALIZED + [1] ∈ {12} +[value] Values at end of function g: + t[0] ∈ UNINITIALIZED + [1] ∈ {12} +[value] Values at end of function main: + lmain[0] ∈ UNINITIALIZED + [1] ∈ {12} +[from] Computing for function f +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + t[1] FROM p (and SELF) + lmain[1] FROM p (and SELF) +[from] Function g: + lmain[1] FROM \nothing (and SELF) +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + t[1]; lmain[1] +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function g: + t[1] +[inout] Inputs for function g: + \nothing +[inout] Out (internal) for function main: + lmain[1] +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/local.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/local.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/local.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/local.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,106 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/local.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {0} + Y ∈ {0} + Z ∈ {0} + T ∈ {0} + U ∈ {0} + V ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/local.i:26. +tests/misc/local.i:7:[value] warning: locals {b} escaping the scope of f through \result +tests/misc/local.i:7:[value] warning: locals {a} escaping the scope of f through X +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/local.i:27. +[value] computing for function f <- g <- main. + Called from tests/misc/local.i:13. +[value] Recording results for f +[value] Done for function f +tests/misc/local.i:15:[value] warning: locals {d} escaping the scope of g through \result +tests/misc/local.i:15:[value] warning: locals {d} escaping the scope of g through U +[value] Recording results for g +[value] Done for function g +[value] DUMPING STATE of file tests/misc/local.i line 28 + X ∈ ESCAPINGADDR + Y ∈ ESCAPINGADDR + Z ∈ ESCAPINGADDR + T ∈ ESCAPINGADDR + U ∈ ESCAPINGADDR + V ∈ {0} + =END OF DUMP== +[value] computing for function h <- main. + Called from tests/misc/local.i:29. +[value] Recording results for h +[value] Done for function h +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + X ∈ {{ &a }} + __retres ∈ {{ &b }} +[value] Values at end of function g: + X ∈ ESCAPINGADDR + T ∈ ESCAPINGADDR + U ∈ {{ &d }} or ESCAPINGADDR + d ∈ [--..--] +[value] Values at end of function h: + __retres ∈ {{ &e + {4} }} +[value] Values at end of function main: + X ∈ ESCAPINGADDR + Y ∈ ESCAPINGADDR + Z ∈ ESCAPINGADDR + T ∈ ESCAPINGADDR + U ∈ ESCAPINGADDR + V ∈ {{ &e + {4} }} +[from] Computing for function f +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] Computing for function h +[from] Done for function h +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + X FROM \nothing + \result FROM \nothing +[from] Function g: + X FROM \nothing + T FROM \nothing + U FROM \nothing + \result FROM \nothing +[from] Function h: + \result FROM x +[from] Function main: + X FROM \nothing + Y FROM \nothing + Z FROM \nothing + T FROM \nothing + U FROM \nothing + V FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + X; __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function g: + X; T; U; d +[inout] Inputs for function g: + T; U +[inout] Out (internal) for function h: + __retres +[inout] Inputs for function h: + \nothing +[inout] Out (internal) for function main: + X; Y; Z; T; U; V +[inout] Inputs for function main: + T; U diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/local_slevel.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/local_slevel.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/local_slevel.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/local_slevel.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,249 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/local_slevel.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + p ∈ {0} +tests/misc/local_slevel.i:10:[value] entering loop for the first time +[value] Called Frama_C_show_each({-1}, {0}, {0}) +[value] Called Frama_C_show_each({1}, {1}, {0; 1}) +[value] Called Frama_C_show_each({-1}, {0}, {0; 1}) +[value] Called Frama_C_show_each({1}, {1}, {0; 1; 2}) +[value] Called Frama_C_show_each({-1}, {0; 2}, {0; 1; 2}) +[value] Called Frama_C_show_each({1}, {1; 3}, {0; 1; 2; 3}) +[value] Called Frama_C_show_each({-1}, {0; 2}, {0; 1; 2; 3}) +[value] Called Frama_C_show_each({1}, {1; 3}, {0; 1; 2; 3; 4}) +[value] Called Frama_C_show_each({-1}, {0; 2; 4}, {0; 1; 2; 3; 4}) +[value] Called Frama_C_show_each({1}, [0..15], {0; 1; 2; 3; 4; 5}) +[value] Called Frama_C_show_each({-1}, [0..15], {0; 1; 2; 3; 4; 5}) +[value] Called Frama_C_show_each({1}, [0..16], {0; 1; 2; 3; 4; 5; 6}) +[value] Called Frama_C_show_each({-1}, [0..16], {0; 1; 2; 3; 4; 5; 6}) +[value] Called Frama_C_show_each({1}, [0..79], {0; 1; 2; 3; 4; 5; 6; 7}) +[value] Called Frama_C_show_each({-1}, [0..79], {0; 1; 2; 3; 4; 5; 6; 7}) +[value] Called Frama_C_show_each({1}, [0..79], [0..8]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..8]) +[value] Called Frama_C_show_each({1}, [0..79], [0..15]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..15]) +[value] Called Frama_C_show_each({1}, [0..79], [0..16]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..16]) +[value] Called Frama_C_show_each({1}, [0..79], [0..127]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..127]) +[value] Called Frama_C_show_each({1}, [0..79], [0..128]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..128]) +[value] Called Frama_C_show_each({1}, [0..79], [0..512]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..512]) +[value] Called Frama_C_show_each({1}, [0..79], [0..513]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..513]) +[value] Called Frama_C_show_each({1}, [0..79], [0..32767]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..32767]) +[value] Called Frama_C_show_each({1}, [0..79], [0..32768]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..32768]) +[value] Called Frama_C_show_each({1}, [0..79], [0..2147483647]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..2147483647]) +[value] Called Frama_C_show_each({1}, [0..79], [0..2147483648]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..2147483648]) +[value] Called Frama_C_show_each({1}, [0..79], [0..4294967295]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..4294967295]) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + v ∈ {1} or UNINITIALIZED + r ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + v; r; i +[inout] Inputs for function main: + \nothing +/* Generated by Frama-C */ +int *p; +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int ( /* missing proto */ Frama_C_show_each)(); + +void main(void) +{ + int v; + unsigned int r; + r = (unsigned int)0; + { + int i; + i = 0; + while (i < 80) { + /*@ ensures \true; + slevel 50; + assigns v; */ + if (i % 2) v = 1; else v = -1; + Frama_C_show_each(v,i,r); + v *= v; + r += (unsigned int)(2 / (v + 1)); + /*@ slevel default; */ ; + i ++; + } + } + return; +} + +void g(void) +{ + int i; + i = 0; + if (! (i < 5)) goto unrolling_2_loop; + i ++; + unrolling_3_loop: ; + /*@ loop pragma UNROLL 1; + loop pragma UNROLL "done", 1; */ + while (i < 5) i ++; + unrolling_2_loop: ; + return; +} + + +[scf] beginning constant propagation +/* Generated by Frama-C */ +int *p; +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int ( /* missing proto */ Frama_C_show_each)(); + +void main(void) +{ + int v; + unsigned int r; + r = 0U; + { + int i; + i = 0; + while (i < 80) { + /*@ ensures \true; + slevel 50; + assigns v; */ + if (i % 2) v = 1; else v = -1; + Frama_C_show_each(v,i,r); + v *= v; + r ++; + /*@ slevel default; */ ; + i ++; + } + } + return; +} + +void g(void) +{ + int i; + i = 0; + if (! (i < 5)) goto unrolling_2_loop; + i ++; + unrolling_3_loop: ; + /*@ loop pragma UNROLL 1; + loop pragma UNROLL "done", 1; */ + while (i < 5) i ++; + unrolling_2_loop: ; + return; +} + + +[scf] constant propagation done +/* Generated by Frama-C */ +int *p; +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int ( /* missing proto */ Frama_C_show_each)(); + +void main(void) +{ + int v; + unsigned int r; + r = (unsigned int)0; + { + int i; + i = 0; + while (i < 80) { + /*@ ensures \true; + slevel 50; + assigns v; */ + if (i % 2) v = 1; else v = -1; + Frama_C_show_each(v,i,r); + v *= v; + r += (unsigned int)(2 / (v + 1)); + /*@ slevel default; */ ; + i ++; + } + } + return; +} + +void g(void) +{ + int i; + i = 0; + if (! (i < 5)) goto unrolling_2_loop; + i ++; + unrolling_3_loop: ; + /*@ loop pragma UNROLL 1; + loop pragma UNROLL "done", 1; */ + while (i < 5) i ++; + unrolling_2_loop: ; + return; +} + + +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + p ∈ {0} +tests/misc/local_slevel.i:10:[value] entering loop for the first time +[value] Called Frama_C_show_each({-1}, {0}, {0}) +[value] Called Frama_C_show_each({1}, {1}, {0; 1}) +[value] Called Frama_C_show_each({-1}, {0}, {0; 1}) +[value] Called Frama_C_show_each({1}, {1}, {0; 1; 2}) +[value] Called Frama_C_show_each({-1}, {0; 2}, {0; 1; 2}) +[value] Called Frama_C_show_each({1}, {1; 3}, {0; 1; 2; 3}) +[value] Called Frama_C_show_each({-1}, {0; 2}, {0; 1; 2; 3}) +[value] Called Frama_C_show_each({1}, {1; 3}, {0; 1; 2; 3; 4}) +[value] Called Frama_C_show_each({-1}, {0; 2; 4}, {0; 1; 2; 3; 4}) +[value] Called Frama_C_show_each({1}, [0..15], {0; 1; 2; 3; 4; 5}) +[value] Called Frama_C_show_each({-1}, [0..15], {0; 1; 2; 3; 4; 5}) +[value] Called Frama_C_show_each({1}, [0..16], {0; 1; 2; 3; 4; 5; 6}) +[value] Called Frama_C_show_each({-1}, [0..16], {0; 1; 2; 3; 4; 5; 6}) +[value] Called Frama_C_show_each({1}, [0..79], {0; 1; 2; 3; 4; 5; 6; 7}) +[value] Called Frama_C_show_each({-1}, [0..79], {0; 1; 2; 3; 4; 5; 6; 7}) +[value] Called Frama_C_show_each({1}, [0..79], [0..8]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..8]) +[value] Called Frama_C_show_each({1}, [0..79], [0..15]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..15]) +[value] Called Frama_C_show_each({1}, [0..79], [0..16]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..16]) +[value] Called Frama_C_show_each({1}, [0..79], [0..127]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..127]) +[value] Called Frama_C_show_each({1}, [0..79], [0..128]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..128]) +[value] Called Frama_C_show_each({1}, [0..79], [0..512]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..512]) +[value] Called Frama_C_show_each({1}, [0..79], [0..513]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..513]) +[value] Called Frama_C_show_each({1}, [0..79], [0..32767]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..32767]) +[value] Called Frama_C_show_each({1}, [0..79], [0..32768]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..32768]) +[value] Called Frama_C_show_each({1}, [0..79], [0..2147483647]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..2147483647]) +[value] Called Frama_C_show_each({1}, [0..79], [0..2147483648]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..2147483648]) +[value] Called Frama_C_show_each({1}, [0..79], [0..4294967295]) +[value] Called Frama_C_show_each({-1}, [0..79], [0..4294967295]) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + v ∈ {1} or UNINITIALIZED + r ∈ [--..--] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/local_variables.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/local_variables.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/local_variables.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/local_variables.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,138 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/local_variables.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + A ∈ {0} + B ∈ {0} + C ∈ {0} + D ∈ {0} + R ∈ {0} + S ∈ {0} +[value] computing for function u <- main. + Called from tests/misc/local_variables.i:30. +[value] computing for function w <- u <- main. + Called from tests/misc/local_variables.i:11. +tests/misc/local_variables.i:24:[kernel] warning: Neither code nor specification for function unkn, generating default assigns from the prototype +[value] computing for function unkn <- w <- u <- main. + Called from tests/misc/local_variables.i:24. +[value] using specification for function unkn +[value] Done for function unkn +[value] Recording results for w +[value] Done for function w +[value] Recording results for u +[value] Done for function u +[value] computing for function v <- main. + Called from tests/misc/local_variables.i:31. +[value] computing for function w <- v <- main. + Called from tests/misc/local_variables.i:18. +[value] computing for function unkn <- w <- v <- main. + Called from tests/misc/local_variables.i:24. +[value] Done for function unkn +[value] Recording results for w +[value] Done for function w +[value] Recording results for v +[value] Done for function v +tests/misc/local_variables.i:35:[value] warning: locals {x} escaping the scope of a block of main through p +tests/misc/local_variables.i:43:[value] entering loop for the first time +tests/misc/local_variables.i:47:[kernel] warning: accessing left-value that contains escaping addresses: + assert ¬\dangling(&p); +tests/misc/local_variables.i:47:[kernel] warning: out of bounds read. assert \valid_read(p); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function w: + B ∈ {0} + wu ∈ {0} or UNINITIALIZED + wv ∈ {0} or UNINITIALIZED + __retres ∈ {0} +[value] Values at end of function u: + B ∈ {0} + ru ∈ {0} + wu ∈ {0} +[value] Values at end of function v: + B ∈ {0} + rv ∈ {0} + wv ∈ {0} +[value] Values at end of function main: + B ∈ {0} + R ∈ {0} + S ∈ {0} + p ∈ {{ &S_p[0] }} + __retres ∈ [--..--] +[from] Computing for function w +[from] Computing for function unkn <-w +[from] Done for function unkn +[from] Done for function w +[from] Computing for function u +[from] Done for function u +[from] Computing for function v +[from] Done for function v +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function unkn: + \result FROM \nothing +[from] Function w: + B FROM ru; rv; pr (and SELF) + wu FROM A; pw (and SELF) + wv FROM A; pw (and SELF) + \result FROM ru; rv; pr +[from] Function u: + B FROM C (and SELF) + \result FROM C +[from] Function v: + B FROM D (and SELF) + \result FROM D +[from] Function main: + B FROM C; D (and SELF) + R FROM C + S FROM D + \result FROM c; p; S_p[0] +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function w: + B; wu; wv; tmp; __retres +[inout] Inputs for function w: + A; ru; rv +[inout] InOut (internal) for function w: + Operational inputs: + A; ru; rv; pr; pw + Operational inputs on termination: + A; ru; rv; pr; pw + Sure outputs: + tmp; __retres +[inout] Out (internal) for function u: + B; ru; wu; tmp +[inout] Inputs for function u: + A; C +[inout] InOut (internal) for function u: + Operational inputs: + A; C + Operational inputs on termination: + A; C + Sure outputs: + ru; wu; tmp +[inout] Out (internal) for function v: + B; rv; wv; tmp +[inout] Inputs for function v: + A; D +[inout] InOut (internal) for function v: + Operational inputs: + A; D + Operational inputs on termination: + A; D + Sure outputs: + rv; wv; tmp +[inout] Out (internal) for function main: + B; R; S; p; x; y; z; t; i; a; __retres +[inout] Inputs for function main: + A; C; D; S_p[0] +[inout] InOut (internal) for function main: + Operational inputs: + A; C; D; c; p; S_p[0] + Operational inputs on termination: + A; C; D; c; p; S_p[0] + Sure outputs: + R; S; y; z; t; i; __retres diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/lock.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/lock.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/lock.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/lock.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,47 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/lock.i (no preprocessing) +[value] Analyzing a complete application starting at locks0_good +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + ghost_loctable[0..99] ∈ {0} + pmutex ∈ {0} +tests/misc/lock.i:48:[value] Function locks0_good: precondition got status unknown. +[value] computing for function acquire_lock <- locks0_good. + Called from tests/misc/lock.i:51. +[value] using specification for function acquire_lock +tests/misc/lock.i:19:[value] Function acquire_lock: precondition got status unknown. +tests/misc/lock.i:21:[value] warning: no \from part for clause 'assigns ghost_loctable[0 .. 99];' of + function acquire_lock +[value] Done for function acquire_lock +[value] computing for function release_lock <- locks0_good. + Called from tests/misc/lock.i:52. +[value] using specification for function release_lock +tests/misc/lock.i:27:[value] Function release_lock: precondition got status unknown. +tests/misc/lock.i:29:[value] warning: no \from part for clause 'assigns ghost_loctable[..];' of + function release_lock +[value] Done for function release_lock +[value] Recording results for locks0_good +[value] done for function locks0_good +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function locks0_good: + ghost_loctable[0..99] ∈ [--..--] +[from] Computing for function locks0_good +[from] Computing for function acquire_lock <-locks0_good +[from] Done for function acquire_lock +[from] Computing for function release_lock <-locks0_good +[from] Done for function release_lock +[from] Done for function locks0_good +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function acquire_lock: + ghost_loctable[0..99] FROM ANYTHING(origin:Unknown) (and SELF) +[from] Function release_lock: + ghost_loctable[0..99] FROM ANYTHING(origin:Unknown) (and SELF) +[from] Function locks0_good: + ghost_loctable[0..99] FROM ANYTHING(origin:Unknown) (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function locks0_good: + ghost_loctable[0..99] +[inout] Inputs for function locks0_good: + ANYTHING(origin:Unknown) diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/logicdeps.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/logicdeps.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/logicdeps.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/logicdeps.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,106 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/logicdeps.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..49] ∈ {0} + p ∈ {0} + y ∈ [--..--] + z ∈ [--..--] +tests/misc/logicdeps.i:19:[value] Assertion got status unknown. +tests/misc/logicdeps.i:20:[value] Assertion got status unknown. +[value] computing for function g <- main. + Called from tests/misc/logicdeps.i:23. +[value] computing for function f <- g <- main. + Called from tests/misc/logicdeps.i:13. +[value] using specification for function f +[value] Done for function f +[value] Recording results for g +[from] Computing for function g +[from] Done for function g +[value] Done for function g +[value] computing for function g <- main. + Called from tests/misc/logicdeps.i:24. +[value] computing for function f <- g <- main. + Called from tests/misc/logicdeps.i:13. +[value] Done for function f +[value] Recording results for g +[from] Computing for function g +[from] Done for function g +[value] Done for function g +tests/misc/logicdeps.i:25:[value] Reusing old results for call to g +tests/misc/logicdeps.i:27:[value] Assertion got status valid. +[value] computing for function g <- main. + Called from tests/misc/logicdeps.i:30. +[value] computing for function f <- g <- main. + Called from tests/misc/logicdeps.i:13. +[value] Done for function f +[value] Recording results for g +[from] Computing for function g +[from] Done for function g +[value] Done for function g +[value] computing for function g <- main. + Called from tests/misc/logicdeps.i:31. +[value] computing for function f <- g <- main. + Called from tests/misc/logicdeps.i:13. +[value] Done for function f +[value] Recording results for g +[from] Computing for function g +[from] Done for function g +[value] Done for function g +tests/misc/logicdeps.i:32:[value] Reusing old results for call to g +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function g: + t[0..19] ∈ {0} + [20..40] ∈ [--..--] + [41..49] ∈ {0} +[value] Values at end of function main: + t[0..19] ∈ {0} + [20..40] ∈ [--..--] + [41..49] ∈ {0} + p ∈ {{ &z }} +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f at tests/misc/logicdeps.i:13 (by g): + t[20..40] FROM t[0..20] (and SELF) +[from] call to g at tests/misc/logicdeps.i:23 (by main): + t[20] FROM t[0..10] + [21..30] FROM t[0..10] (and SELF) +[from] call to g at tests/misc/logicdeps.i:24 (by main): + t[20] FROM t[0..10] + [21..30] FROM t[0..10] (and SELF) +[from] call to g at tests/misc/logicdeps.i:25 (by main): + t[20] FROM t[0..10] + [21..30] FROM t[0..10] (and SELF) +[from] call to g at tests/misc/logicdeps.i:30 (by main): + t{[20]; [36..40]} FROM t[0..20] (and SELF) + [21..35] FROM t[0..20] +[from] call to g at tests/misc/logicdeps.i:31 (by main): + t{[20]; [36..40]} FROM t[0..20] (and SELF) + [21..35] FROM t[0..20] +[from] call to g at tests/misc/logicdeps.i:32 (by main): + t{[20]; [36..40]} FROM t[0..20] (and SELF) + [21..35] FROM t[0..20] +[from] entry point: + t[20..35] FROM t[0..19] + [36..40] FROM t[0..19] (and SELF) + p FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[inout] InOut (internal) for function g: + Operational inputs: + t[0..20]; p; y; z + Operational inputs on termination: + t[0..20]; p; y; z + Sure outputs: + \nothing +[inout] InOut (internal) for function main: + Operational inputs: + t[0..19]; y; z + Operational inputs on termination: + t[0..19]; y; z + Sure outputs: + t[20..35]; p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/logic_ptr_cast.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/logic_ptr_cast.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/logic_ptr_cast.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/logic_ptr_cast.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/logic_ptr_cast.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + p ∈ {0} + t[0..89] ∈ {0} +tests/misc/logic_ptr_cast.i:8:[value] warning: Operation {{ &t + {7} }} & {4294967288} incurs a loss of precision +tests/misc/logic_ptr_cast.i:8:[value] Assigning imprecise value to p. + The imprecision originates from Arithmetic {tests/misc/logic_ptr_cast.i:8} +tests/misc/logic_ptr_cast.i:9:[value] Assertion got status unknown. +[value] Called Frama_C_show_each({{ &t + {0; 1; 2; 3; 4; 5; 6; 7} }}) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +/* Generated by Frama-C */ +int *p; +int t[90]; +extern int ( /* missing proto */ Frama_C_show_each)(); + +int main(void) +{ + int __retres; + p = (int *)(((unsigned long)(t) + (unsigned long)7) & ~ 7UL); + /*@ + assert + p ≡ (int *)t ∨ p ≡ (int *)((char *)((int *)t)+1) ∨ + p ≡ (int *)((char *)((int *)t)+2) ∨ p ≡ (int *)((char *)((int *)t)+3) ∨ + p ≡ (int *)((char *)((int *)t)+4) ∨ p ≡ (int *)((char *)((int *)t)+5) ∨ + p ≡ (int *)((char *)((int *)t)+6) ∨ p ≡ (int *)((char *)((int *)t)+7); + */ + ; + Frama_C_show_each(p); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/logic.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/logic.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/logic.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/logic.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,134 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/logic.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..9] ∈ {0} + u[0..10] ∈ {0} + s1 ∈ {0} + s2 ∈ {0} + s3[0..9] ∈ {0} + x ∈ {0} +[value] computing for function eq_tsets <- main. + Called from tests/misc/logic.c:76. +tests/misc/logic.c:7:[value] cannot evaluate ACSL term, unsupported ACSL construct: == operation on non-supported type set<_#2> +tests/misc/logic.c:7:[value] Assertion got status unknown. +tests/misc/logic.c:9:[value] Assertion got status valid. +tests/misc/logic.c:10:[value] Assertion got status unknown. +tests/misc/logic.c:11:[value] Assertion got status unknown. +tests/misc/logic.c:12:[value] Assertion got status unknown. +tests/misc/logic.c:13:[value] Assertion got status unknown. +tests/misc/logic.c:14:[value] Assertion got status valid. +tests/misc/logic.c:15:[value] Assertion got status unknown. +tests/misc/logic.c:16:[value] Assertion got status unknown. +tests/misc/logic.c:17:[value] Assertion got status valid. +tests/misc/logic.c:19:[value] Assertion got status valid. +tests/misc/logic.c:21:[value] Assertion got status valid. +tests/misc/logic.c:23:[value] Assertion got status valid. +tests/misc/logic.c:24:[value] Assertion got status unknown. +tests/misc/logic.c:25:[value] Assertion got status valid. +tests/misc/logic.c:26:[value] Assertion got status unknown. +tests/misc/logic.c:29:[value] Assertion got status unknown. +tests/misc/logic.c:30:[value] Assertion got status unknown. +tests/misc/logic.c:31:[value] Assertion got status unknown. +tests/misc/logic.c:32:[value] Assertion got status valid. +tests/misc/logic.c:34:[value] Assertion got status valid. +tests/misc/logic.c:35:[value] Assertion got status valid. +tests/misc/logic.c:36:[value] Assertion got status unknown. +tests/misc/logic.c:38:[value] cannot evaluate ACSL term, unsupported ACSL construct: == operation on non-supported type struct ts +tests/misc/logic.c:38:[value] Assertion got status unknown. +tests/misc/logic.c:39:[value] cannot evaluate ACSL term, unsupported ACSL construct: != operation on non-supported type int [10] +tests/misc/logic.c:39:[value] Assertion got status unknown. +tests/misc/logic.c:41:[value] Assertion got status valid. +tests/misc/logic.c:42:[value] Assertion got status valid. +tests/misc/logic.c:43:[value] Assertion got status valid. +tests/misc/logic.c:45:[value] Assertion got status valid. +tests/misc/logic.c:47:[value] cannot evaluate ACSL term, unsupported ACSL construct: set intersection +tests/misc/logic.c:47:[value] Assertion got status unknown. +[value] Recording results for eq_tsets +[value] Done for function eq_tsets +[value] computing for function eq_char <- main. + Called from tests/misc/logic.c:77. +[value] Called Frama_C_show_each({-126}) +tests/misc/logic.c:54:[value] Assertion got status valid. +tests/misc/logic.c:55:[value] Assertion got status valid. +[value] Recording results for eq_char +[value] Done for function eq_char +[value] computing for function casts <- main. + Called from tests/misc/logic.c:78. +tests/misc/logic.c:59:[value] Assertion got status valid. +tests/misc/logic.c:60:[value] Assertion got status valid. +[value] Recording results for casts +[value] Done for function casts +[value] computing for function empty_tset <- main. + Called from tests/misc/logic.c:79. +[value] computing for function f_empty_tset <- empty_tset <- main. + Called from tests/misc/logic.c:70. +[value] using specification for function f_empty_tset +tests/misc/logic.c:63:[value] Function f_empty_tset: precondition 'r1' got status valid. +tests/misc/logic.c:64:[value] Function f_empty_tset: precondition 'r2' got status valid. +[value] Done for function f_empty_tset +tests/misc/logic.c:71:[value] Assertion got status valid. +[value] Recording results for empty_tset +[value] Done for function empty_tset +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function casts: + +[value] Values at end of function eq_char: + c ∈ {-126} +[value] Values at end of function eq_tsets: + +[value] Values at end of function empty_tset: + T[0] ∈ {2} +[value] Values at end of function main: + +[from] Computing for function casts +[from] Done for function casts +[from] Computing for function eq_char +[from] Done for function eq_char +[from] Computing for function eq_tsets +[from] Done for function eq_tsets +[from] Computing for function empty_tset +[from] Computing for function f_empty_tset <-empty_tset +[from] Done for function f_empty_tset +[from] Done for function empty_tset +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function casts: + NO EFFECTS +[from] Function eq_char: + NO EFFECTS +[from] Function eq_tsets: + NO EFFECTS +[from] Function f_empty_tset: + NO EFFECTS +[from] Function empty_tset: + NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function casts: + \nothing +[inout] Inputs for function casts: + \nothing +[inout] Out (internal) for function eq_char: + c +[inout] Inputs for function eq_char: + \nothing +[inout] Out (internal) for function eq_tsets: + \nothing +[inout] Inputs for function eq_tsets: + \nothing +[inout] Out (internal) for function empty_tset: + T[0] +[inout] Inputs for function empty_tset: + \nothing +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/log_twice.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/log_twice.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/log_twice.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/log_twice.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,36 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/log_twice.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/misc/log_twice.i:11. +tests/misc/log_twice.i:7:[value] warning: locals {x} escaping the scope of f through \result +[value] Recording results for f +[value] Done for function f +tests/misc/log_twice.i:12:[kernel] warning: accessing left-value that contains escaping addresses: + assert ¬\dangling(&p); +tests/misc/log_twice.i:12:[kernel] warning: completely indeterminate value in p. +tests/misc/log_twice.i:12:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +tests/misc/log_twice.i:12:[value] Assertion 'Value,dangling_pointer' got final status invalid. +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/misc/log_twice.i:11. +tests/misc/log_twice.i:7:[value] warning: locals {x} escaping the scope of f through \result +[value] Recording results for f +[value] Done for function f +tests/misc/log_twice.i:12:[kernel] warning: accessing left-value that contains escaping addresses: + assert ¬\dangling(&p); +tests/misc/log_twice.i:12:[kernel] warning: completely indeterminate value in p. +tests/misc/log_twice.i:12:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +tests/misc/log_twice.i:12:[value] Assertion 'Value,dangling_pointer' got final status invalid. diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/long_const.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/long_const.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/long_const.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/long_const.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,66 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/long_const.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Called CEA_f({4}, {18446603611099103232}, {0}) +[value] computing for function div64 <- main. + Called from tests/misc/long_const.i:37. +tests/misc/long_const.i:11:[value] Function div64: precondition got status unknown. +tests/misc/long_const.i:12:[value] Function div64: precondition got status unknown. +[value] computing for function LL_ABS <- div64 <- main. + Called from tests/misc/long_const.i:24. +[value] Recording results for LL_ABS +[value] Done for function LL_ABS +[value] computing for function LL_ABS <- div64 <- main. + Called from tests/misc/long_const.i:25. +[value] Recording results for LL_ABS +[value] Done for function LL_ABS +[value] Called Frama_C_show_each([-9223372036854775807..9223372036854775807], + [0..9223372036854775807], + [-9223372036854775807..9223372036854775807], + [0..9223372036854775807]) +[value] Recording results for div64 +[value] Done for function div64 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function LL_ABS: + +[value] Values at end of function div64: + loc_num ∈ [0..9223372036854775807] + loc_den ∈ [0..9223372036854775807] + signe_negatif ∈ {-9223372036854775808; 0} + __retres ∈ {0} +[value] Values at end of function main: + i ∈ {18446603611099103232} + j ∈ {0} +[from] Computing for function LL_ABS +[from] Done for function LL_ABS +[from] Computing for function div64 +[from] Done for function div64 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function LL_ABS: + \result FROM a +[from] Function div64: + \result FROM \nothing +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function LL_ABS: + tmp +[inout] Inputs for function LL_ABS: + \nothing +[inout] Out (internal) for function div64: + loc_num; loc_den; signe_negatif; __retres +[inout] Inputs for function div64: + \nothing +[inout] Out (internal) for function main: + i; j +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/long_const.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/long_const.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/long_const.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/long_const.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,66 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/long_const.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Called CEA_f({4}, {18446603611099103232}, {0}) +[value] computing for function div64 <- main. + Called from tests/misc/long_const.i:37. +tests/misc/long_const.i:11:[value] Function div64: precondition got status unknown. +tests/misc/long_const.i:12:[value] Function div64: precondition got status unknown. +[value] computing for function LL_ABS <- div64 <- main. + Called from tests/misc/long_const.i:24. +[value] Recording results for LL_ABS +[value] Done for function LL_ABS +[value] computing for function LL_ABS <- div64 <- main. + Called from tests/misc/long_const.i:25. +[value] Recording results for LL_ABS +[value] Done for function LL_ABS +[value] Called Frama_C_show_each([-9223372036854775807..9223372036854775807], + [0..9223372036854775807], + [-9223372036854775807..9223372036854775807], + [0..9223372036854775807]) +[value] Recording results for div64 +[value] Done for function div64 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function LL_ABS: + +[value] Values at end of function div64: + loc_num ∈ [0..9223372036854775807] + loc_den ∈ [0..9223372036854775807] + signe_negatif ∈ {-9223372036854775808; 0} + __retres ∈ {0} +[value] Values at end of function main: + i ∈ {18446603611099103232} + j ∈ {0} +[from] Computing for function LL_ABS +[from] Done for function LL_ABS +[from] Computing for function div64 +[from] Done for function div64 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function LL_ABS: + \result FROM a +[from] Function div64: + \result FROM \nothing +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function LL_ABS: + tmp +[inout] Inputs for function LL_ABS: + \nothing +[inout] Out (internal) for function div64: + loc_num; loc_den; signe_negatif; __retres +[inout] Inputs for function div64: + \nothing +[inout] Out (internal) for function main: + i; j +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/long_ident.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/long_ident.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/long_ident.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/long_ident.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,46 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/long_ident.c (with preprocessing) +/* *********************************** */ +/* start of dictionary for obfuscation */ +/* *********************************** */ +// enums +#define E1 OK +#define E2 NOT_OK +// functions +#define F1 f +// global variables +#define G1 X_9999999999999999999999999999999999999999999999999999 +#define G2 e +// types +#define T1 __anonenum_e_1 +// local variables +#define V1 X_10000000000000000000000000000000000000000000000000001 +// formal variables +#define f1 q +#define f2 X_10000000000000000000000000000000000000000000000000000 +#define f3 p +/*********************************** */ +/* end of dictionary for obfuscation */ +/*********************************** */ + +/* Generated by Frama-C */ +enum T1 { + E1 = 1, + E2 = 0 +}; +/*@ ensures \valid(\old(f1)); */ +extern int F1(int *f1); + +int G1; +enum T1 G2; +/*@ ensures \valid(\old(f3)); */ +void main(int f2, int *f3) +{ + int V1; + V1 = 0; + G2 = E1; + F1(f3); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/long.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/long.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/long.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/long.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,87 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/long.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + k ∈ {0} +tests/misc/long.i:11:[value] entering loop for the first time +[value] computing for function f <- main. + Called from tests/misc/long.i:12. +tests/misc/long.i:6:[value] entering loop for the first time +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/long.i:12. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/long.i:12. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/long.i:12. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/long.i:12. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/long.i:12. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/long.i:12. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/long.i:12. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/long.i:12. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/long.i:12. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/long.i:12. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/long.i:12. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + i ∈ {1000} +[value] Values at end of function main: + i ∈ {0; 1000} + j ∈ {1000} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + i FROM \nothing +[from] Function main: + i FROM \nothing (and SELF) + j FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + i +[inout] Inputs for function f: + i +[inout] Out (internal) for function main: + i; j +[inout] Inputs for function main: + i; j diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loop1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loop1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,62 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loop1.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + U[0] ∈ {1} + [1] ∈ {2} + [2..99] ∈ {0} + NULL_GLOBAL_LOOSING_BITS_ONE_BY_ONE ∈ {0} +[value] computing for function main1 <- main. + Called from tests/misc/loop1.i:22. +tests/misc/loop1.i:5:[value] entering loop for the first time +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/loop1.i:23. +tests/misc/loop1.i:14:[value] entering loop for the first time +tests/misc/loop1.i:16:[kernel] warning: accessing out of bounds index [0..100]. assert i < 100; +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main1: + U[0] ∈ {1; 7} + [1] ∈ {2; 7} + [2..99] ∈ {0; 7} + i ∈ {100} +[value] Values at end of function main2: + NON TERMINATING FUNCTION +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main2 +[from] Non-terminating function main2 (no dependencies) +[from] Done for function main2 +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main1: + U[0..99] FROM \nothing (and SELF) +[from] Function main2: + NON TERMINATING - NO EFFECTS +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main1: + U[0..99]; i +[inout] Inputs for function main1: + \nothing +[inout] Out (internal) for function main2: + U[0..99]; i +[inout] Inputs for function main2: + \nothing +[inout] Out (internal) for function main: + U[0..99] +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loop2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loop2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loop2.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + k ∈ {0} + l ∈ {0} + n ∈ {0} + r ∈ {0} + G[0..4] ∈ {0} + Reg5 ∈ {0} +tests/misc/loop2.i:8:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {5} + n ∈ {5} + G[0].a ∈ {0; 55; 56; 57; 58; 59} + [0].b ∈ {0; 57; 58; 59; 60; 61} + [1].a ∈ {0; 55; 56; 57; 58; 59} + [1].b ∈ {0; 57; 58; 59; 60; 61} + [2].a ∈ {0; 55; 56; 57; 58; 59} + [2].b ∈ {0; 57; 58; 59; 60; 61} + [3].a ∈ {0; 55; 56; 57; 58; 59} + [3].b ∈ {0; 57; 58; 59; 60; 61} + [4].a ∈ {0; 55; 56; 57; 58; 59} + [4].b ∈ {0; 57; 58; 59; 60; 61} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + i FROM \nothing + n FROM \nothing + G[0..4] FROM \nothing (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; n; G[0..4] +[inout] Inputs for function main: + i; n diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loop3.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop3.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loop3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,54 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loop3.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + k ∈ {0} +[value] computing for function any_int <- main. + Called from tests/misc/loop3.c:8. +tests/misc/any_int.c:9:[value] entering loop for the first time +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert y+1 ≤ 2147483647; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert y+1 ≤ 2147483647; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert -2147483648 ≤ y-1; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert -2147483648 ≤ x-1; +[value] Recording results for any_int +[value] Done for function any_int +tests/misc/loop3.c:11:[value] entering loop for the first time +tests/misc/loop3.c:11:[kernel] warning: signed overflow. assert j+3 ≤ 2147483647; +tests/misc/loop3.c:11:[kernel] warning: signed overflow. assert k+8 ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function any_int: + y ∈ [--..--] + x ∈ [--..--] +[value] Values at end of function main: + i ∈ {100} + j ∈ [0..2147483646],0%3 + k ∈ [0..2147483640],0%8 + b ∈ [--..--] +[from] Computing for function any_int +[from] Done for function any_int +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function any_int: + \result FROM \nothing +[from] Function main: + i FROM \nothing + j FROM \nothing + k FROM k (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function any_int: + y; x +[inout] Inputs for function any_int: + \nothing +[inout] Out (internal) for function main: + i; j; k; b +[inout] Inputs for function main: + i; j; k diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_array.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_array.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_array.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_array.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,35 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loop_array.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..9999] ∈ {0} + U[0..9999] ∈ {0} +tests/misc/loop_array.i:5:[value] entering loop for the first time +tests/misc/loop_array.i:8:[value] entering loop for the first time +tests/misc/loop_array.i:12:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + T[0..4] ∈ {0; 2} + [5] ∈ {0} + [6..9999] ∈ {0; 7} + U[0..199] ∈ {0} + [200] ∈ {-1; 0} + [201..9999] ∈ {0} + i ∈ {400} + j ∈ {10000} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + T{[0..4]; [6..9999]} FROM \nothing (and SELF) + U[0..1000] FROM \nothing (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + T{[0..4]; [6..9999]}; U[0..1000]; i; j +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loopfun.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loopfun.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loopfun.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loopfun.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,65 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loopfun.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {7} +[value] computing for function test <- main. + Called from tests/misc/loopfun.i:14. +[value] Recording results for test +[value] Done for function test +[value] computing for function test <- main. + Called from tests/misc/loopfun.i:14. +[value] Recording results for test +[value] Done for function test +[value] computing for function test <- main. + Called from tests/misc/loopfun.i:16. +[value] Recording results for test +[value] Done for function test +[value] Called Frama_C_show_each_t({5}) +[value] computing for function test <- main. + Called from tests/misc/loopfun.i:14. +[value] Recording results for test +[value] Done for function test +[value] computing for function test <- main. + Called from tests/misc/loopfun.i:14. +[value] Recording results for test +[value] Done for function test +[value] computing for function test <- main. + Called from tests/misc/loopfun.i:16. +[value] Recording results for test +[value] Done for function test +[value] Called Frama_C_show_each_t({2}) +[value] computing for function test <- main. + Called from tests/misc/loopfun.i:14. +[value] Recording results for test +[value] Done for function test +[value] computing for function test <- main. + Called from tests/misc/loopfun.i:14. +[value] Recording results for test +[value] Done for function test +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[from] Computing for function test +[from] Done for function test +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function test: + FROMTOP + \result FROM ANYTHING(origin:Unknown) +[from] Function main: + FROMTOP + \result FROM ANYTHING(origin:Unknown) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function test: + tmp; a +[inout] Inputs for function test: + a +[inout] Out (internal) for function main: + ANYTHING(origin:Unknown) +[inout] Inputs for function main: + ANYTHING(origin:Unknown) diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loopinv.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loopinv.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loopinv.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loopinv.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,176 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loopinv.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function main1 <- main. + Called from tests/misc/loopinv.c:51. +[value] computing for function init <- main1 <- main. + Called from tests/misc/loopinv.c:22. +tests/misc/loopinv.c:5:[value] Function init: precondition got status valid. +tests/misc/loopinv.c:6:[value] Function init: precondition got status valid. +tests/misc/loopinv.c:9:[value] Loop invariant got status valid. +tests/misc/loopinv.c:10:[value] entering loop for the first time +[value] Recording results for init +[value] Done for function init +[value] computing for function init <- main1 <- main. + Called from tests/misc/loopinv.c:25. +[value] Recording results for init +[value] Done for function init +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/loopinv.c:52. +tests/misc/loopinv.c:32:[value] Loop invariant got status valid. +tests/misc/loopinv.c:33:[value] Loop invariant got status valid. +tests/misc/loopinv.c:32:[value] Loop invariant got status invalid (stopping propagation). +tests/misc/loopinv.c:33:[value] no state left in which to evaluate loop invariant, status not computed. +[value] Recording results for main2 +[value] Done for function main2 +[value] computing for function main3 <- main. + Called from tests/misc/loopinv.c:53. +tests/misc/loopinv.c:42:[value] Loop invariant got status valid. +tests/misc/loopinv.c:43:[value] entering loop for the first time +[value] Called Frama_C_show_each({0}, {0}) +[value] Called Frama_C_show_each({0; 1}, {0; 1}) +tests/misc/loopinv.c:42:[value] Loop invariant got status unknown. +[value] Called Frama_C_show_each({0; 1; 2}, {0; 1; 2}) +[value] Called Frama_C_show_each({0; 1; 2; 3}, {0; 1; 2; 3}) +[value] Called Frama_C_show_each({0; 1; 2; 3; 4}, {0; 1; 2; 3; 4}) +[value] Called Frama_C_show_each([0..9], {0; 1; 2; 3; 4; 5}) +[value] Called Frama_C_show_each([0..10], {0; 1; 2; 3; 4; 5; 6}) +[value] Called Frama_C_show_each([0..13], {0; 1; 2; 3; 4; 5; 6; 7}) +[value] Called Frama_C_show_each([0..14], [0..8]) +[value] Called Frama_C_show_each([0..15], [0..9]) +[value] Called Frama_C_show_each([0..16], [0..10]) +[value] Called Frama_C_show_each([0..21], [0..11]) +[value] Called Frama_C_show_each([0..22], [0..12]) +[value] Called Frama_C_show_each([0..25], [0..13]) +[value] Called Frama_C_show_each([0..26], [0..14]) +[value] Called Frama_C_show_each([0..29], [0..15]) +[value] Called Frama_C_show_each([0..30], [0..16]) +[value] Called Frama_C_show_each([0..33], [0..17]) +[value] Called Frama_C_show_each([0..34], [0..18]) +[value] Called Frama_C_show_each([0..37], [0..19]) +[value] Called Frama_C_show_each([0..38], [0..20]) +[value] Called Frama_C_show_each([0..41], [0..21]) +[value] Called Frama_C_show_each([0..42], [0..22]) +[value] Called Frama_C_show_each([0..45], [0..23]) +[value] Called Frama_C_show_each([0..46], [0..24]) +[value] Called Frama_C_show_each([0..49], [0..25]) +[value] Called Frama_C_show_each([0..50], [0..26]) +[value] Called Frama_C_show_each([0..53], [0..27]) +[value] Called Frama_C_show_each([0..54], [0..28]) +[value] Called Frama_C_show_each([0..57], [0..29]) +[value] Called Frama_C_show_each([0..58], [0..30]) +[value] Called Frama_C_show_each([0..61], [0..31]) +[value] Called Frama_C_show_each([0..62], [0..32]) +[value] Called Frama_C_show_each([0..65], [0..33]) +[value] Called Frama_C_show_each([0..66], [0..34]) +[value] Called Frama_C_show_each([0..69], [0..35]) +[value] Called Frama_C_show_each([0..70], [0..36]) +[value] Called Frama_C_show_each([0..73], [0..37]) +[value] Called Frama_C_show_each([0..74], [0..38]) +[value] Called Frama_C_show_each([0..77], [0..39]) +[value] Called Frama_C_show_each([0..78], [0..40]) +[value] Called Frama_C_show_each([0..81], [0..41]) +[value] Called Frama_C_show_each([0..82], [0..42]) +[value] Called Frama_C_show_each([0..85], [0..43]) +[value] Called Frama_C_show_each([0..86], [0..44]) +[value] Called Frama_C_show_each([0..89], [0..45]) +[value] Called Frama_C_show_each([0..90], [0..46]) +[value] Called Frama_C_show_each([0..93], [0..47]) +[value] Called Frama_C_show_each([0..94], [0..48]) +[value] Called Frama_C_show_each([0..97], [0..49]) +[value] Called Frama_C_show_each([0..98], [0..50]) +[value] Called Frama_C_show_each([0..99], [0..51]) +[value] Called Frama_C_show_each([0..99], [0..52]) +[value] Called Frama_C_show_each([0..99], [0..128]) +[value] Called Frama_C_show_each([0..99], [0..129]) +[value] Called Frama_C_show_each([0..99], [0..513]) +[value] Called Frama_C_show_each([0..99], [0..514]) +[value] Called Frama_C_show_each([0..99], [0..32768]) +[value] Called Frama_C_show_each([0..99], [0..32769]) +tests/misc/loopinv.c:45:[kernel] warning: signed overflow. assert j+1 ≤ 2147483647; +[value] Called Frama_C_show_each([0..99], [0..2147483647]) +[value] Recording results for main3 +[value] Done for function main3 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function init: + p ∈ {{ &t1 + [4..284],0%4 ; &t2 + [4..40],0%4 }} + t1[0] ∈ UNINITIALIZED + [1..71] ∈ {1} or UNINITIALIZED + t2[0] ∈ UNINITIALIZED + [1..10] ∈ {1} or UNINITIALIZED +[value] Values at end of function main1: + t1[0] ∈ UNINITIALIZED + [1..71] ∈ {1} or UNINITIALIZED + t2[0] ∈ UNINITIALIZED + [1..10] ∈ {1} or UNINITIALIZED +[value] Values at end of function main2: + NON TERMINATING FUNCTION +[value] Values at end of function main3: + j ∈ [0..2147483647] +[value] Values at end of function main: + +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'init' +-------------------------------------------------------------------------------- + +[ Valid ] Pre-condition (file tests/misc/loopinv.c, line 5) + by Call Preconditions. +[ Valid ] Pre-condition (file tests/misc/loopinv.c, line 6) + by Call Preconditions. +[ Valid ] Invariant (file tests/misc/loopinv.c, line 9) + by Value. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main1' +-------------------------------------------------------------------------------- + +[ Valid ] Instance of 'Pre-condition (file tests/misc/loopinv.c, line 5)' at call 'init' (file tests/misc/loopinv.c, line 22) + + by Value. +[ Valid ] Instance of 'Pre-condition (file tests/misc/loopinv.c, line 6)' at call 'init' (file tests/misc/loopinv.c, line 22) + + by Value. +[ Valid ] Instance of 'Pre-condition (file tests/misc/loopinv.c, line 5)' at call 'init' (file tests/misc/loopinv.c, line 25) + + by Value. +[ Valid ] Instance of 'Pre-condition (file tests/misc/loopinv.c, line 6)' at call 'init' (file tests/misc/loopinv.c, line 25) + + by Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main2' +-------------------------------------------------------------------------------- + +[ - ] Invariant (file tests/misc/loopinv.c, line 32) + tried with Value. +[ Valid ] Invariant (file tests/misc/loopinv.c, line 33) + by Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main3' +-------------------------------------------------------------------------------- + +[ - ] Invariant (file tests/misc/loopinv.c, line 42) + tried with Value. +[ - ] Assertion 'Value,signed_overflow' (file tests/misc/loopinv.c, line 45) + tried with Value. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 9 Completely validated + 3 To be validated + 12 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_join.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_join.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_join.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_join.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loop_join.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + U[0..9999] ∈ {0} +tests/misc/loop_join.i:5:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + U[0..199] ∈ {0} + [200] ∈ {-1; 0} + [201..9999] ∈ {0} + i ∈ {400} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + U[0..1000] FROM \nothing (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + U[0..1000]; i +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_long.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_long.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_long.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_long.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loop_long.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..368199] ∈ {0} +tests/misc/loop_long.i:5:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + T[0..367] ∈ {0; 33} + [368..368199] ∈ {0} + i ∈ {368} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + T[0..367] FROM \nothing (and SELF) + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + T[0..367]; i +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_no_var.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_no_var.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_no_var.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_no_var.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loop_no_var.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/loop_no_var.i:3:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loop.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loop.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,45 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loop.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + k ∈ {0} + n ∈ {0} + r ∈ {0} + G ∈ {0} +tests/misc/loop.i:7:[value] entering loop for the first time +[value] Called CEA_F({0}) +[value] Called CEA_F({0; 2}) +[value] Called CEA_F({0; 2; 4}) +[value] Called CEA_F({0; 2; 4; 6; 8; 10; 12; 14}) +[value] Called CEA_F([0..16],0%2) +[value] Called CEA_F([0..48],0%2) +[value] Called CEA_F([0..48],0%2) +[value] Called CEA_F([0..48],0%2) +[value] Called CEA_F([0..48],0%2) +[value] Called CEA_F([0..48],0%2) +[value] Called CEA_F([0..48],0%2) +[value] Called CEA_F([0..48],0%2) +tests/misc/loop.i:9:[kernel] warning: signed overflow. assert i_0+r ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + n ∈ {50} + r ∈ [0..2147483646],0%2 + i_0 ∈ [50..126],0%2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + n FROM \nothing + r FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + n; r; i_0 +[inout] Inputs for function main: + n; r diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_simple.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_simple.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_simple.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_simple.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loop_simple.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + k ∈ {0} + n ∈ {0} + r ∈ {0} +tests/misc/loop_simple.i:24:[value] entering loop for the first time +tests/misc/loop_simple.i:25:[value] entering loop for the first time +tests/misc/loop_simple.i:26:[value] entering loop for the first time +tests/misc/loop_simple.i:27:[kernel] warning: signed overflow. assert (int)((int)(i+j)+k)+r ≤ 2147483647; +tests/misc/loop_simple.i:27:[kernel] warning: signed overflow. assert (int)((int)((int)(i+j)+k)+r)+1 ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {2} + j ∈ {0; 2} + k ∈ {0; 2} + n ∈ {2} + r ∈ [0..2147483647] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + i FROM \nothing + j FROM \nothing (and SELF) + k FROM \nothing + n FROM \nothing + r FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; j; k; n; r +[inout] Inputs for function main: + i; j; k; n; r diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_test.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_test.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_test.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_test.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,110 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loop_test.i (no preprocessing) +[value] Analyzing a complete application starting at test_cent_onzes +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + r0 ∈ {0} + r1 ∈ {0} + r2 ∈ {0} + r3 ∈ {0} + r4 ∈ {0} + r5 ∈ {0} + r6 ∈ {0} + r7 ∈ {0} + r8 ∈ {0} + r9 ∈ {0} + c0 ∈ {0} + c1 ∈ {0} + c2 ∈ {0} + c3 ∈ {0} + c4 ∈ {0} + c5 ∈ {0} + c6 ∈ {0} + c7 ∈ {0} + c8 ∈ {0} + c9 ∈ {0} +[value] computing for function cent_onze_0 <- test_cent_onzes. + Called from tests/misc/loop_test.i:101. +tests/misc/loop_test.i:57:[value] entering loop for the first time +[value] Recording results for cent_onze_0 +[value] Done for function cent_onze_0 +[value] computing for function cent_onze_1 <- test_cent_onzes. + Called from tests/misc/loop_test.i:102. +tests/misc/loop_test.i:60:[value] entering loop for the first time +[value] Recording results for cent_onze_1 +[value] Done for function cent_onze_1 +[value] computing for function cent_onze_2 <- test_cent_onzes. + Called from tests/misc/loop_test.i:103. +tests/misc/loop_test.i:64:[value] entering loop for the first time +[value] Recording results for cent_onze_2 +[value] Done for function cent_onze_2 +[value] computing for function cent_onze_3 <- test_cent_onzes. + Called from tests/misc/loop_test.i:104. +tests/misc/loop_test.i:68:[value] entering loop for the first time +[value] Recording results for cent_onze_3 +[value] Done for function cent_onze_3 +[value] computing for function cent_onze_4 <- test_cent_onzes. + Called from tests/misc/loop_test.i:105. +tests/misc/loop_test.i:72:[value] entering loop for the first time +[value] Recording results for cent_onze_4 +[value] Done for function cent_onze_4 +[value] computing for function cent_onze_5 <- test_cent_onzes. + Called from tests/misc/loop_test.i:106. +tests/misc/loop_test.i:77:[value] entering loop for the first time +[value] Recording results for cent_onze_5 +[value] Done for function cent_onze_5 +[value] computing for function cent_onze_6 <- test_cent_onzes. + Called from tests/misc/loop_test.i:107. +tests/misc/loop_test.i:80:[value] entering loop for the first time +[value] Recording results for cent_onze_6 +[value] Done for function cent_onze_6 +[value] computing for function cent_onze_7 <- test_cent_onzes. + Called from tests/misc/loop_test.i:108. +tests/misc/loop_test.i:84:[value] entering loop for the first time +[value] Recording results for cent_onze_7 +[value] Done for function cent_onze_7 +[value] computing for function cent_onze_8 <- test_cent_onzes. + Called from tests/misc/loop_test.i:109. +tests/misc/loop_test.i:88:[value] entering loop for the first time +[value] Recording results for cent_onze_8 +[value] Done for function cent_onze_8 +[value] computing for function cent_onze_9 <- test_cent_onzes. + Called from tests/misc/loop_test.i:110. +tests/misc/loop_test.i:92:[value] entering loop for the first time +[value] Recording results for cent_onze_9 +[value] Done for function cent_onze_9 +[value] Recording results for test_cent_onzes +[value] done for function test_cent_onzes +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function cent_onze_0: + cent_onze ∈ {111} +[value] Values at end of function cent_onze_1: + cent_onze ∈ {111} +[value] Values at end of function cent_onze_2: + cent_onze ∈ {111} +[value] Values at end of function cent_onze_3: + cent_onze ∈ {111} +[value] Values at end of function cent_onze_4: + cent_onze ∈ {111} +[value] Values at end of function cent_onze_5: + cent_onze ∈ {111} +[value] Values at end of function cent_onze_6: + cent_onze ∈ {111} +[value] Values at end of function cent_onze_7: + cent_onze ∈ {111} +[value] Values at end of function cent_onze_8: + cent_onze ∈ {111} +[value] Values at end of function cent_onze_9: + cent_onze ∈ {111} +[value] Values at end of function test_cent_onzes: + c0 ∈ {111} + c1 ∈ {111} + c2 ∈ {111} + c3 ∈ {111} + c4 ∈ {111} + c5 ∈ {111} + c6 ∈ {111} + c7 ∈ {111} + c8 ∈ {111} + c9 ∈ {111} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_test.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_test.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_test.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_test.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,110 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loop_test.i (no preprocessing) +[value] Analyzing a complete application starting at test_onzes +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + r0 ∈ {0} + r1 ∈ {0} + r2 ∈ {0} + r3 ∈ {0} + r4 ∈ {0} + r5 ∈ {0} + r6 ∈ {0} + r7 ∈ {0} + r8 ∈ {0} + r9 ∈ {0} + c0 ∈ {0} + c1 ∈ {0} + c2 ∈ {0} + c3 ∈ {0} + c4 ∈ {0} + c5 ∈ {0} + c6 ∈ {0} + c7 ∈ {0} + c8 ∈ {0} + c9 ∈ {0} +[value] computing for function onze_0 <- test_onzes. + Called from tests/misc/loop_test.i:43. +tests/misc/loop_test.i:9:[value] entering loop for the first time +[value] Recording results for onze_0 +[value] Done for function onze_0 +[value] computing for function onze_1 <- test_onzes. + Called from tests/misc/loop_test.i:44. +tests/misc/loop_test.i:12:[value] entering loop for the first time +[value] Recording results for onze_1 +[value] Done for function onze_1 +[value] computing for function onze_2 <- test_onzes. + Called from tests/misc/loop_test.i:45. +tests/misc/loop_test.i:15:[value] entering loop for the first time +[value] Recording results for onze_2 +[value] Done for function onze_2 +[value] computing for function onze_3 <- test_onzes. + Called from tests/misc/loop_test.i:46. +tests/misc/loop_test.i:18:[value] entering loop for the first time +[value] Recording results for onze_3 +[value] Done for function onze_3 +[value] computing for function onze_4 <- test_onzes. + Called from tests/misc/loop_test.i:47. +tests/misc/loop_test.i:21:[value] entering loop for the first time +[value] Recording results for onze_4 +[value] Done for function onze_4 +[value] computing for function onze_5 <- test_onzes. + Called from tests/misc/loop_test.i:48. +tests/misc/loop_test.i:25:[value] entering loop for the first time +[value] Recording results for onze_5 +[value] Done for function onze_5 +[value] computing for function onze_6 <- test_onzes. + Called from tests/misc/loop_test.i:49. +tests/misc/loop_test.i:28:[value] entering loop for the first time +[value] Recording results for onze_6 +[value] Done for function onze_6 +[value] computing for function onze_7 <- test_onzes. + Called from tests/misc/loop_test.i:50. +tests/misc/loop_test.i:31:[value] entering loop for the first time +[value] Recording results for onze_7 +[value] Done for function onze_7 +[value] computing for function onze_8 <- test_onzes. + Called from tests/misc/loop_test.i:51. +tests/misc/loop_test.i:34:[value] entering loop for the first time +[value] Recording results for onze_8 +[value] Done for function onze_8 +[value] computing for function onze_9 <- test_onzes. + Called from tests/misc/loop_test.i:52. +tests/misc/loop_test.i:37:[value] entering loop for the first time +[value] Recording results for onze_9 +[value] Done for function onze_9 +[value] Recording results for test_onzes +[value] done for function test_onzes +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function onze_0: + onze ∈ {11} +[value] Values at end of function onze_1: + onze ∈ {11} +[value] Values at end of function onze_2: + onze ∈ {11} +[value] Values at end of function onze_3: + onze ∈ {11} +[value] Values at end of function onze_4: + onze ∈ {11} +[value] Values at end of function onze_5: + onze ∈ {11} +[value] Values at end of function onze_6: + onze ∈ {11} +[value] Values at end of function onze_7: + onze ∈ {11} +[value] Values at end of function onze_8: + onze ∈ {11} +[value] Values at end of function onze_9: + onze ∈ {11} +[value] Values at end of function test_onzes: + r0 ∈ {11} + r1 ∈ {11} + r2 ∈ {11} + r3 ∈ {11} + r4 ∈ {11} + r5 ∈ {11} + r6 ∈ {11} + r7 ∈ {11} + r8 ∈ {11} + r9 ∈ {11} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_wvar.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_wvar.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_wvar.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_wvar.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loop_wvar.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} +tests/misc/loop_wvar.i:17:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {13} + j ∈ [0..55] + n ∈ {13} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_wvar.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_wvar.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_wvar.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_wvar.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loop_wvar.i (no preprocessing) +[value] Analyzing a complete application starting at main_err1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} +tests/misc/loop_wvar.i:27:[value] entering loop for the first time +[value] Recording results for main_err1 +[value] done for function main_err1 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main_err1: + i ∈ {13} + j ∈ [0..55] + n ∈ {13} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_wvar.3.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_wvar.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_wvar.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_wvar.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,17 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loop_wvar.i (no preprocessing) +[value] Analyzing a complete application starting at main_err2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} +tests/misc/loop_wvar.i:39:[value] entering loop for the first time +tests/misc/loop_wvar.i:39:[kernel] warning: could not interpret loop pragma relative to widening variables +[value] Recording results for main_err2 +[value] done for function main_err2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main_err2: + i ∈ {13; 14; 15} + j ∈ [0..55] + n ∈ {13} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_wvar.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_wvar.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/loop_wvar.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/loop_wvar.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,16 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/loop_wvar.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} +tests/misc/loop_wvar.i:17:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {13; 14; 15} + j ∈ [0..55] + n ∈ {13} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/m12_2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/m12_2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/m12_2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/m12_2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,87 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/m12_2.i (no preprocessing) +tests/misc/m12_2.i:51:[kernel] warning: Unspecified sequence with side effect: + /* y <- i */ + y = i; + y ++; + /* <- */ + tmp = i; + /* i <- */ + i ++; + /* z <- tmp */ + z = y + tmp; +tests/misc/m12_2.i:55:[kernel] warning: Unspecified sequence with side effect: + /* i <- */ + i ++; + /* y <- i */ + y = i; + y ++; + /* z <- */ + z = i + y; +tests/misc/m12_2.i:59:[kernel] warning: Unspecified sequence with side effect: + /* x <- tmp_1 */ + x = 3; + { + /*sequence*/ + tmp_1 = x; + x ++; + } + + /* <- x */ +tests/misc/m12_2.i:63:[kernel] warning: Unspecified sequence with side effect: + /* <- */ + tmp_2 = i; + /* i <- */ + i ++; + /* z <- i tmp_2 */ + z = i + tmp_2; +tests/misc/m12_2.i:67:[kernel] warning: Unspecified sequence with side effect: + /* i <- */ + i = 3; + /* z <- i */ + z = (i + i) + 8; +tests/misc/m12_2.i:69:[kernel] warning: Unspecified sequence with side effect: + /* this_st.st_m <- */ + this_st.st_m = 3; + /* z <- this_st.st_m */ + z = (this_st.st_m + this_st.st_m) + 8; +tests/misc/m12_2.i:77:[kernel] warning: Unspecified sequence with side effect: + /* i <- */ + i ++; + /* <- i */ +tests/misc/m12_2.i:81:[kernel] warning: Unspecified sequence with side effect: + /* i <- */ + i ++; + /* i <- tmp_5 + */ + if ((3 * 8) * 1) { + SI_32 tmp_5; + { + /*sequence*/ + tmp_5 = i; + i ++; + + } + if (tmp_5) tmp_6 = 1; else tmp_6 = 0; + } + else tmp_6 = 0; + /* z <- */ + z = i + tmp_6; +tests/misc/m12_2.i:85:[kernel] warning: Unspecified sequence with side effect: + /* i <- */ + i ++; + /* i <- tmp_8 + */ + if ((3 * 8) * 0) tmp_9 = 1; + else { + SI_32 tmp_8; + { + /*sequence*/ + tmp_8 = i; + i ++; + + } + if (tmp_8) tmp_9 = 1; else tmp_9 = 0; + } + /* z <- */ + z = i + tmp_9; diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/machdep.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/machdep.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/machdep.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/machdep.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,66 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/machdep.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function test1 <- main. + Called from tests/misc/machdep.c:25. +[value] Recording results for test1 +[value] Done for function test1 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function test1: + u ∈ {18446744073709551615} + w ∈ {4294967295} + q ∈ {4294967295} + c1 ∈ {0} + c2 ∈ {0} +[value] Values at end of function main: + +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/machdep.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function test1 <- main. + Called from tests/misc/machdep.c:25. +[value] Recording results for test1 +[value] Done for function test1 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function test1: + u ∈ {18446744073709551615} + w ∈ {18446744073709551615} + q ∈ {18446744073709551615} + c1 ∈ {1} + c2 ∈ {1} +[value] Values at end of function main: + +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/machdep.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function test1 <- main. + Called from tests/misc/machdep.c:25. +[value] Recording results for test1 +[value] Done for function test1 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function test1: + u ∈ {18446744073709551615} + w ∈ {4294967295} + q ∈ {4294967295} + c1 ∈ {0} + c2 ∈ {0} +[value] Values at end of function main: + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/memexec.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/memexec.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/memexec.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/memexec.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,304 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/memexec.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x1 ∈ {0} + y1 ∈ {0} + z1 ∈ {0} + c ∈ [--..--] + p ∈ {0} + i ∈ {0} + t[0..9] ∈ {0} + ps ∈ {0} + S[0..9] ∈ {0} + g_f5_1 ∈ {0} + g_f5_2 ∈ {0} +[value] computing for function f1 <- main. + Called from tests/misc/memexec.c:118. +[value] computing for function f11 <- f1 <- main. + Called from tests/misc/memexec.c:12. +[value] Recording results for f11 +[value] Done for function f11 +[value] computing for function f11 <- f1 <- main. + Called from tests/misc/memexec.c:13. +[value] Recording results for f11 +[value] Done for function f11 +tests/misc/memexec.c:14:[value] Reusing old results for call to f11 +tests/misc/memexec.c:16:[value] Reusing old results for call to f11 +tests/misc/memexec.c:18:[value] Reusing old results for call to f11 +[value] computing for function f11 <- f1 <- main. + Called from tests/misc/memexec.c:20. +[value] Recording results for f11 +[value] Done for function f11 +tests/misc/memexec.c:21:[value] Reusing old results for call to f11 +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/misc/memexec.c:119. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/misc/memexec.c:120. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function bug <- main. + Called from tests/misc/memexec.c:121. +[value] computing for function fbug <- bug <- main. + Called from tests/misc/memexec.c:40. +tests/misc/memexec.c:33:[kernel] warning: out of bounds read. assert \valid_read(p); +[value] Recording results for fbug +[value] Done for function fbug +[value] computing for function fbug <- bug <- main. + Called from tests/misc/memexec.c:42. +[value] Recording results for fbug +[value] Done for function fbug +tests/misc/memexec.c:43:[value] warning: locals {x} escaping the scope of bug through p +[value] Recording results for bug +[value] Done for function bug +[value] computing for function f4 <- main. + Called from tests/misc/memexec.c:122. +[value] computing for function f4_2 <- f4 <- main. + Called from tests/misc/memexec.c:84. +[value] computing for function f4_11 <- f4_2 <- f4 <- main. + Called from tests/misc/memexec.c:74. +tests/misc/memexec.c:59:[kernel] warning: accessing out of bounds index {12}. assert ps->i < 10; +tests/misc/memexec.c:59:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for f4_11 +[value] Done for function f4_11 +[value] computing for function f4_12 <- f4_2 <- f4 <- main. + Called from tests/misc/memexec.c:76. +tests/misc/memexec.c:63:[kernel] warning: accessing out of bounds index {11}. assert i < 10; +tests/misc/memexec.c:63:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for f4_12 +[value] Done for function f4_12 +[value] Recording results for f4_2 +[value] Done for function f4_2 +[value] computing for function f4_2 <- f4 <- main. + Called from tests/misc/memexec.c:87. +[value] computing for function f4_11 <- f4_2 <- f4 <- main. + Called from tests/misc/memexec.c:74. +[value] Recording results for f4_11 +[value] Done for function f4_11 +[value] computing for function f4_12 <- f4_2 <- f4 <- main. + Called from tests/misc/memexec.c:76. +[value] Recording results for f4_12 +[value] Done for function f4_12 +[value] Recording results for f4_2 +[value] Done for function f4_2 +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/misc/memexec.c:123. +[value] computing for function f5_aux <- f5 <- main. + Called from tests/misc/memexec.c:107. +tests/misc/memexec.c:94:[value] Assertion got status unknown. +tests/misc/memexec.c:96:[value] Assertion got status unknown. +tests/misc/memexec.c:98:[value] entering loop for the first time +[value] Recording results for f5_aux +[value] Done for function f5_aux +[value] Called Frama_C_show_each_f5([9..2147483647], + [-2147483648..6], + [-2147483648..7]) +tests/misc/memexec.c:113:[value] Reusing old results for call to f5_aux +[value] Called Frama_C_show_each_f5([9..2147483647], + [-2147483648..2147483647], + [-2147483648..7]) +[value] Recording results for f5 +[value] Done for function f5 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f11: + x1 ∈ {1} +[value] Values at end of function f1: + x1 ∈ {1} +[value] Values at end of function f2: + +[value] Values at end of function f3: + +[value] Values at end of function f4_11: + t[0..5] ∈ {0} + [6] ∈ {1} + [7..9] ∈ {0} +[value] Values at end of function f4_12: + t[0..1] ∈ {0} + [2] ∈ {3} + [3..4] ∈ {0} + [5] ∈ {2} + [6..9] ∈ {0} +[value] Values at end of function f4_2: + i ∈ {5} + t[0..1] ∈ {0} + [2] ∈ {0; 3} + [3..4] ∈ {0} + [5] ∈ {0; 2} + [6] ∈ {0; 1} + [7..9] ∈ {0} + ps ∈ {{ &S[8] }} + S[0..7] ∈ {0} + [8].i ∈ {6} + [9] ∈ {0} +[value] Values at end of function f4: + i ∈ {0; 5} + t[0..1] ∈ {0} + [2] ∈ {0; 3} + [3..4] ∈ {0} + [5] ∈ {0; 2} + [6] ∈ {0; 1} + [7..9] ∈ {0} + ps ∈ {{ NULL ; &S[8] }} + S[0..7] ∈ {0} + [8].i ∈ {0; 6} + [9] ∈ {0} + n ∈ {6; 12} +[value] Values at end of function f5_aux: + v ∈ [--..--] +[value] Values at end of function f5: + g_f5_1 ∈ [--..--] + g_f5_2 ∈ [-2147483648..7] + arg ∈ [9..2147483647] +[value] Values at end of function fbug: + __retres ∈ {1} +[value] Values at end of function bug: + p ∈ {{ &x }} + x ∈ {1} +[value] Values at end of function main: + x1 ∈ {1} + p ∈ ESCAPINGADDR + i ∈ {0; 5} + t[0..1] ∈ {0} + [2] ∈ {0; 3} + [3..4] ∈ {0} + [5] ∈ {0; 2} + [6] ∈ {0; 1} + [7..9] ∈ {0} + ps ∈ {{ NULL ; &S[8] }} + S[0..7] ∈ {0} + [8].i ∈ {0; 6} + [9] ∈ {0} + g_f5_1 ∈ [--..--] + g_f5_2 ∈ [-2147483648..7] +[rte] annotating function fbug +[from] Computing for function f11 +[from] Done for function f11 +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4_11 +[from] Done for function f4_11 +[from] Computing for function f4_12 +[from] Done for function f4_12 +[from] Computing for function f4_2 +[from] Done for function f4_2 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5_aux +[from] Done for function f5_aux +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function fbug +[from] Done for function fbug +[from] Computing for function bug +[from] Done for function bug +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f11: + x1 FROM \nothing +[from] Function f1: + x1 FROM \nothing +[from] Function f2: + NO EFFECTS +[from] Function f3: + NO EFFECTS +[from] Function f4_11: + t[6] FROM ps; S[8] +[from] Function f4_12: + t{[2]; [5]} FROM i +[from] Function f4_2: + i FROM v; n + t{[2]; [5..6]} FROM c; v; n (and SELF) + ps FROM \nothing + S[8] FROM v; n +[from] Function f4: + i FROM c (and SELF) + t{[2]; [5..6]} FROM c (and SELF) + ps FROM c (and SELF) + S[8] FROM c (and SELF) +[from] Function f5_aux: + NO EFFECTS +[from] Function f5: + g_f5_1 FROM c + g_f5_2 FROM c +[from] Function fbug: + \result FROM p; x +[from] Function bug: + p FROM \nothing +[from] Function main: + x1 FROM \nothing + p FROM \nothing + i FROM c (and SELF) + t{[2]; [5..6]} FROM c (and SELF) + ps FROM c (and SELF) + S[8] FROM c (and SELF) + g_f5_1 FROM c + g_f5_2 FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f11: + x1 +[inout] Inputs for function f11: + \nothing +[inout] Out (internal) for function f1: + x1 +[inout] Inputs for function f1: + \nothing +[inout] Out (internal) for function f2: + \nothing +[inout] Inputs for function f2: + \nothing +[inout] Out (internal) for function f3: + \nothing +[inout] Inputs for function f3: + \nothing +[inout] Out (internal) for function f4_11: + t[6] +[inout] Inputs for function f4_11: + ps; S[8] +[inout] Out (internal) for function f4_12: + t{[2]; [5]} +[inout] Inputs for function f4_12: + i +[inout] Out (internal) for function f4_2: + i; t{[2]; [5..6]}; ps; S[8] +[inout] Inputs for function f4_2: + c; i; ps; S[8]; n +[inout] Out (internal) for function f4: + i; t{[2]; [5..6]}; ps; S[8]; n +[inout] Inputs for function f4: + c; i; ps; S[8] +[inout] Out (internal) for function f5_aux: + v +[inout] Inputs for function f5_aux: + g_f5_2 +[inout] Out (internal) for function f5: + g_f5_1; g_f5_2; arg +[inout] Inputs for function f5: + c; g_f5_1; g_f5_2 +[inout] Out (internal) for function fbug: + __retres +[inout] Inputs for function fbug: + p; x +[inout] Out (internal) for function bug: + p; x +[inout] Inputs for function bug: + c; p +[inout] Out (internal) for function main: + x1; p; i; t{[2]; [5..6]}; ps; S[8]; g_f5_1; g_f5_2 +[inout] Inputs for function main: + c; p; i; ps; S[8]; g_f5_1; g_f5_2 diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/merge_bits.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/merge_bits.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/merge_bits.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/merge_bits.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,45 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/merge_bits.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0] ∈ {1} + [1..3] ∈ {0} + [4] ∈ {1} + [5] ∈ {2} + [6] ∈ {3} + [7] ∈ {4} + [8] ∈ {5} + [9] ∈ {0} + [10..12] ∈ {1} +[value] Called CEA_F({1}) +[value] Called CEA_F({16777216}) +[value] Called CEA_F({67305985}) +[value] Called CEA_F({16843008}) +[value] Called CEA_F({1048577}) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + T[0] ∈ {1} + [1] ∈ {0} + [bits 16 to 47] ∈ {-1879048176} + [6] ∈ {3} + [7] ∈ {4} + [8] ∈ {5} + [9] ∈ {0} + [10..12] ∈ {1} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + T[2..5] FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + T[2..5]; __retres +[inout] Inputs for function main: + T{[0..7]; [9..12]} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/mergestruct2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/mergestruct2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/mergestruct2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/mergestruct2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,37 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/mergestruct2.i (no preprocessing) +[kernel] Parsing tests/misc/mergestruct3.i (no preprocessing) +[kernel] Parsing tests/misc/mergestruct1.i (no preprocessing) +/* Generated by Frama-C */ +struct s; +struct s { + float a ; +}; +struct s_0 { + int a ; +}; +struct s *p; +void g(void) +{ + p = (struct s *)0; + return; +} + +struct s s2; +void f(void) +{ + s2.a = (float)1.0; + return; +} + +struct s_0 s1; +int main(void) +{ + int __retres; + s1.a = 1; + f(); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/mergestruct3.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/mergestruct3.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/mergestruct3.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/mergestruct3.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,36 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/mergestruct3.i (no preprocessing) +[kernel] Parsing tests/misc/mergestruct2.i (no preprocessing) +[kernel] Parsing tests/misc/mergestruct1.i (no preprocessing) +/* Generated by Frama-C */ +struct s { + float a ; +}; +struct s_0 { + int a ; +}; +struct s s2; +void f(void) +{ + s2.a = (float)1.0; + return; +} + +struct s *p; +void g(void) +{ + p = (struct s *)0; + return; +} + +struct s_0 s1; +int main(void) +{ + int __retres; + s1.a = 1; + f(); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/mergestruct3.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/mergestruct3.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/mergestruct3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/mergestruct3.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,36 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/mergestruct3.i (no preprocessing) +[kernel] Parsing tests/misc/mergestruct1.i (no preprocessing) +[kernel] Parsing tests/misc/mergestruct2.i (no preprocessing) +/* Generated by Frama-C */ +struct s { + float a ; +}; +struct s_0 { + int a ; +}; +struct s s2; +void f(void) +{ + s2.a = (float)1.0; + return; +} + +struct s_0 s1; +int main(void) +{ + int __retres; + s1.a = 1; + f(); + __retres = 0; + return __retres; +} + +struct s *p; +void g(void) +{ + p = (struct s *)0; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/mini_pointrer.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/mini_pointrer.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/mini_pointrer.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/mini_pointrer.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,35 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/mini_pointrer.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..1] ∈ {0} + ppp ∈ {0} + pp[0..1] ∈ {0} + p ∈ {0} +tests/misc/mini_pointrer.i:6:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. assert 0 ≤ c1 < 2; +tests/misc/mini_pointrer.i:8:[kernel] warning: out of bounds read. assert \valid_read(ppp); +tests/misc/mini_pointrer.i:8:[kernel] warning: out of bounds write. assert \valid(*ppp); +tests/misc/mini_pointrer.i:10:[kernel] warning: accessing out of bounds index {0; 1; 2; 3; 4; 5}. assert c2 < 2; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + T[0..1] ∈ {0; 4; 9} + ppp ∈ {{ (int **)&pp }} + pp[0] ∈ {{ (int)&T{[0], [1]} }} + [1] ∈ {{ NULL ; (int)&T{[0], [1]} }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + T[0..1] FROM pp[0]; c1; c2 (and SELF) + ppp FROM c2 + pp[0..1] FROM c1 (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + T[0..1]; ppp; pp[0..1] +[inout] Inputs for function main: + ppp; pp[0] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/misaligned_tabs.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/misaligned_tabs.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/misaligned_tabs.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/misaligned_tabs.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,109 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/misaligned_tabs.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..299] ∈ {0} + S1{.i1; .i2} ∈ {4369} + {.c1; .c2} ∈ {17} + {.i3; .i4} ∈ {4369} + S2{.i1; .i2} ∈ {4369} + {.c1; .c2} ∈ {17} + {.i3; .i4} ∈ {4369} + S3{.i1; .i2} ∈ {4369} + {.c1; .c2} ∈ {17} + {.i3; .i4} ∈ {4369} + S4{.i1; .i2} ∈ {4369} + {.c1; .c2} ∈ {17} + {.i3; .i4} ∈ {4369} +[value] computing for function misaligned_struct <- main. + Called from tests/misc/misaligned_tabs.i:58. +[value] Called Frama_C_show_each_1({1}) +[value] Called Frama_C_show_each_2({1}) +[value] Called Frama_C_show_each_3({1}) +[value] Called Frama_C_show_each_4({1}) +[value] Called Frama_C_show_each_5({1}) +[value] Called Frama_C_show_each_6({1}) +[value] Called Frama_C_show_each_7({1}) +[value] Called Frama_C_show_each_8({1}) +[value] Called Frama_C_show_each_9({1}) +[value] Called Frama_C_show_each_a({1}) +[value] Called Frama_C_show_each_b({1}) +[value] Called Frama_C_show_each_c({1}) +[value] Called Frama_C_show_each_d({1}) +[value] Called Frama_C_show_each_e({1}) +[value] Called Frama_C_show_each_f({1}) +[value] Recording results for misaligned_struct +[value] Done for function misaligned_struct +[value] Called Frama_C_show_each_g({1}) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function misaligned_struct: + S1.i1[bits 0 to 7] ∈ {17} + {.i1[bits 8 to 15]#; .i2} ∈ {4369} repeated %16, bits 8 to 31 + {.c1; .c2} ∈ {17} + {.i3; .i4} ∈ {4369} + S2.i1# ∈ {17} repeated %8 + .i2 ∈ {4369} + {.c1; .c2} ∈ {17} + {.i3; .i4} ∈ {4369} + S3.i1[bits 0 to 7]# ∈ {4369}%16, bits 0 to 7 + {.i1[bits 8 to 15]; .i2#; .c1; .c2; .i3#; .i4[bits 0 to 7]} ∈ + {17} repeated %8 + .i4[bits 8 to 15]# ∈ {4369}%16, bits 8 to 15 + S4{.i1#; .i2#} ∈ {17} repeated %8 + {.c1#; .c2#} ∈ {4369}%32, bits 0 to 15 + {.i3#; .i4#} ∈ {17} repeated %8 +[value] Values at end of function main: + T[0]# ∈ {1; 2}%32, bits 0 to 7 + [1]# ∈ {1; 2}%32, bits 8 to 15 + [bits 16 to 95]# ∈ {1; 2} repeated %32, bits 16 to 95 + [12..299] ∈ {0} + S1.i1[bits 0 to 7] ∈ {17} + {.i1[bits 8 to 15]#; .i2} ∈ {4369} repeated %16, bits 8 to 31 + {.c1; .c2} ∈ {17} + {.i3; .i4} ∈ {4369} + S2.i1# ∈ {17} repeated %8 + .i2 ∈ {4369} + {.c1; .c2} ∈ {17} + {.i3; .i4} ∈ {4369} + S3.i1[bits 0 to 7]# ∈ {4369}%16, bits 0 to 7 + {.i1[bits 8 to 15]; .i2#; .c1; .c2; .i3#; .i4[bits 0 to 7]} ∈ + {17} repeated %8 + .i4[bits 8 to 15]# ∈ {4369}%16, bits 8 to 15 + S4{.i1#; .i2#} ∈ {17} repeated %8 + {.c1#; .c2#} ∈ {4369}%32, bits 0 to 15 + {.i3#; .i4#} ∈ {17} repeated %8 +[from] Computing for function misaligned_struct +[from] Done for function misaligned_struct +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function misaligned_struct: + S1.i1[bits 0 to 7] FROM \nothing + S2.i1 FROM \nothing + S3{{.i1[bits 8 to 15]; .i2}; {.i3; .i4[bits 0 to 7]}} FROM \nothing + S4 FROM \nothing +[from] Function main: + T{[0]; [2..3]} FROM c1 + {[1]; [4..11]} FROM c2 + S1.i1[bits 0 to 7] FROM \nothing + S2.i1 FROM \nothing + S3{{.i1[bits 8 to 15]; .i2}; {.i3; .i4[bits 0 to 7]}} FROM \nothing + S4 FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function misaligned_struct: + S1.i1[bits 0 to 7]; S2.i1; + S3{{.i1[bits 8 to 15]; .i2}; {.i3; .i4[bits 0 to 7]}}; S4 +[inout] Inputs for function misaligned_struct: + S1{.i1; .i2; .c1; .c2}; S2{{.i1; .i2}; .c2}; S3{{.i1; .i2; .c1}; .i3}; + S4{.i1; .i2; .c1; .c2; .i3} +[inout] Out (internal) for function main: + T[0..11]; S1.i1[bits 0 to 7]; S2.i1; + S3{{.i1[bits 8 to 15]; .i2}; {.i3; .i4[bits 0 to 7]}}; S4 +[inout] Inputs for function main: + T[4..7]; S1{.i1; .i2; .c1; .c2}; S2{{.i1; .i2}; .c2}; + S3{{.i1; .i2; .c1}; .i3}; S4{.i1; .i2; .c1; .c2; .i3} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/mixed_val.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/mixed_val.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/mixed_val.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/mixed_val.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,36 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/mixed_val.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0] ∈ {97} + [1..9] ∈ {0} + a ∈ {0} + b ∈ {0} + c ∈ {0} + d ∈ {0} + e ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + T[0]# ∈ {128073}%32, bits 0 to 15 + [1..9] ∈ {0} + a ∈ {128073} + d ∈ {128073} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + T[0] FROM c + a FROM c + d FROM e + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + T[0]; a; d; __retres +[inout] Inputs for function main: + a[bits 0 to 15]; c; e diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/modifies.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/modifies.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/modifies.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/modifies.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,38 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/modifies.i (no preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + TAB[0..9] ∈ [--..--] + G ∈ [--..--] + H ∈ [--..--] + J ∈ [--..--] +tests/misc/modifies.i:8:[kernel] warning: signed overflow. assert J+1 ≤ 2147483647; +tests/misc/modifies.i:8:[kernel] warning: signed overflow. assert -2147483648 ≤ TAB[4]-1; +tests/misc/modifies.i:11:[kernel] warning: signed overflow. assert TAB[1]+1 ≤ 2147483647; +tests/misc/modifies.i:11:[kernel] warning: signed overflow. assert TAB[6]+1 ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + TAB[0..9] ∈ [--..--] + G ∈ [--..--] + H ∈ {0; 1; 3} + J ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + TAB[1] FROM TAB[1]; G; H; J (and SELF) + [4] FROM TAB[4]; H (and SELF) + [6] FROM TAB[6]; G; H; J (and SELF) + G FROM H; J (and SELF) + H FROM G; H; J (and SELF) + J FROM H; J (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + TAB{[1]; [4]; [6]}; G; H; J +[inout] Inputs for function main: + TAB{[1]; [4]; [6]}; G; H; J diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/modulo.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/modulo.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/modulo.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/modulo.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,284 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/modulo.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + A ∈ {0} + B ∈ {0} + C ∈ {0} + D ∈ {0} + E ∈ {0} + F ∈ {0} + G ∈ {0} + H ∈ {0} + I ∈ {0} + J ∈ {0} + K ∈ {0} + L ∈ {0} + M ∈ {0} + N ∈ {0} + O ∈ {0} + P ∈ {0} + Q ∈ {0} + R ∈ {0} + i ∈ [--..--] + a ∈ [--..--] + b ∈ [--..--] + i2 ∈ [--..--] + v ∈ [--..--] +[value] computing for function pgcd1 <- main. + Called from tests/misc/modulo.i:151. +tests/misc/modulo.i:34:[value] Function pgcd1: precondition got status unknown. +tests/misc/modulo.i:37:[value] Loop invariant got status valid. +tests/misc/modulo.i:38:[value] Loop invariant got status valid. +[value] Called Frama_C_show_each_1([1..10], [1..10], [0..9]) +[value] Called Frama_C_show_each_1({0}, [1..10], {0}) +[value] Called Frama_C_show_each_1([-10..-1], [1..10], [-9..0]) +[value] Called Frama_C_show_each_1([1..10], [-10..-1], [0..9]) +[value] Called Frama_C_show_each_1({0}, [-10..-1], {0}) +[value] Called Frama_C_show_each_1([-10..-1], [-10..-1], [-9..0]) +[value] Recording results for pgcd1 +[value] Done for function pgcd1 +[value] computing for function pgcd2 <- main. + Called from tests/misc/modulo.i:152. +tests/misc/modulo.i:47:[value] Function pgcd2: precondition got status unknown. +tests/misc/modulo.i:50:[value] Loop invariant got status valid. +[value] Called Frama_C_show_each_2([-10..10], [1..10], [-9..9]) +[value] Called Frama_C_show_each_2([-10..10], [-10..-1], [-9..9]) +[value] Recording results for pgcd2 +[value] Done for function pgcd2 +[value] computing for function pgcd3 <- main. + Called from tests/misc/modulo.i:153. +tests/misc/modulo.i:59:[value] Function pgcd3: precondition got status unknown. +tests/misc/modulo.i:63:[kernel] warning: division by zero: assert b_0 ≢ 0; +[value] Called Frama_C_show_each_3([-10..10], [-10..10], [-9..9]) +[value] Recording results for pgcd3 +[value] Done for function pgcd3 +[value] computing for function main2 <- main. + Called from tests/misc/modulo.i:155. +tests/misc/modulo.i:9:[kernel] warning: signed overflow. assert -2147483648 ≤ 4*i ≤ 2147483647; +tests/misc/modulo.i:10:[kernel] warning: signed overflow. assert -2147483648 ≤ 4*i ≤ 2147483647; +tests/misc/modulo.i:11:[value] Assertion got status unknown. +tests/misc/modulo.i:13:[value] Assertion got status unknown. +tests/misc/modulo.i:27:[kernel] warning: division by zero: assert G ≢ 0; +tests/misc/modulo.i:29:[kernel] warning: division by zero: assert L ≢ 0; +[value] Recording results for main2 +[value] Done for function main2 +[value] computing for function simultaneous_congruences <- main. + Called from tests/misc/modulo.i:156. +tests/misc/modulo.i:76:[value] Assertion got status unknown. +tests/misc/modulo.i:82:[value] entering loop for the first time +tests/misc/modulo.i:95:[value] entering loop for the first time +[value] Recording results for simultaneous_congruences +[value] Done for function simultaneous_congruences +[value] computing for function shift_modulo <- main. + Called from tests/misc/modulo.i:157. +tests/misc/modulo.i:100:[value] Assertion got status unknown. +tests/misc/modulo.i:103:[kernel] warning: signed overflow. assert (int)((int)(i*12)+5)<<25 ≤ 2147483647; +tests/misc/modulo.i:104:[kernel] warning: signed overflow. assert (int)((int)(i*13)+7)<<25 ≤ 2147483647; +[value] Recording results for shift_modulo +[value] Done for function shift_modulo +[value] computing for function extract_bits_modulo <- main. + Called from tests/misc/modulo.i:158. +tests/misc/modulo.i:109:[value] Assertion got status valid. +[value] Recording results for extract_bits_modulo +[value] Done for function extract_bits_modulo +[value] computing for function pos_rem <- main. + Called from tests/misc/modulo.i:159. +tests/misc/modulo.i:137:[value] Assertion got status unknown. +tests/misc/modulo.i:142:[value] Assertion got status unknown. +tests/misc/modulo.i:146:[value] Assertion got status unknown. +[value] Recording results for pos_rem +[value] Done for function pos_rem +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function extract_bits_modulo: + aa1 ∈ [1291..32011],1291%3072 + ptr1 ∈ {{ (unsigned char *)&aa1 }} + m1 ∈ {11} + n1 ∈ [5..125],1%4 + aa2 ∈ [1294..32124] + ptr2 ∈ {{ (unsigned char *)&aa2 }} + m2 ∈ [0..255] + n2 ∈ [5..125] + aa3 ∈ [1296..32126] + ptr3 ∈ {{ (unsigned char *)&aa3 }} + m3 ∈ [0..255] + n3 ∈ [5..125] + aa4 ∈ [16..126],5%11 + ptr4 ∈ {{ (unsigned char *)&aa4 }} + m4 ∈ [16..126] + n4 ∈ {0} +[value] Values at end of function main2: + A ∈ {0} + B ∈ {-3; 1} + C ∈ {1} + D ∈ {1; 4; 7; 10} + E ∈ {-11; -8; -5; -2; 1; 4; 7; 10} + F ∈ {5} + G ∈ [0..12] + H ∈ [0..100] + I ∈ [101..301],1%2 + J ∈ [-201..299],4%5 + K ∈ {-6; -1; 4; 9} + L ∈ [-9..9] + M ∈ {-6; -2; -1; 0; 1; 2; 4; 9} + N ∈ [-299..299] + O ∈ [0..11] + P ∈ {0} + Q ∈ [-8..8] +[value] Values at end of function pgcd1: + a_0 ∈ [-10..10] + b_0 ∈ {0} +[value] Values at end of function pgcd2: + a_0 ∈ [-10..10] + b_0 ∈ {0} +[value] Values at end of function pgcd3: + a_0 ∈ [-10..10] + b_0 ∈ {0} +[value] Values at end of function pos_rem: + n ∈ [-1..72] + j ∈ [-128..127] + k ∈ [0..135] + l ∈ [-128..127] +[value] Values at end of function shift_modulo: + r ∈ [20..500],20%48 + s ∈ [5..125],5%12 + q ∈ {5; 17; 29; 41; 53} + t ∈ {7; 20; 33; 46; 59} +[value] Values at end of function simultaneous_congruences: + n1 ∈ [98..436207493],98%195 + n2 ∈ [98..436207493],98%195 + n3 ∈ [98..436207493],98%195 + m1 ∈ [7..134217735],3%4 + m2 ∈ [10..201326602],4%6 + o1 ∈ [11..268435451],11%24 + o2 ∈ [11..268435451],11%24 + o3 ∈ [11..268435451],11%24 +[value] Values at end of function main: + A ∈ {0} + B ∈ {-3; 1} + C ∈ {1} + D ∈ {1; 4; 7; 10} + E ∈ {-11; -8; -5; -2; 1; 4; 7; 10} + F ∈ {5} + G ∈ [0..12] + H ∈ [0..100] + I ∈ [101..301],1%2 + J ∈ [-201..299],4%5 + K ∈ {-6; -1; 4; 9} + L ∈ [-9..9] + M ∈ {-6; -2; -1; 0; 1; 2; 4; 9} + N ∈ [-299..299] + O ∈ [0..11] + P ∈ {0} + Q ∈ [-8..8] +[from] Computing for function extract_bits_modulo +[from] Done for function extract_bits_modulo +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function pgcd1 +[from] Done for function pgcd1 +[from] Computing for function pgcd2 +[from] Done for function pgcd2 +[from] Computing for function pgcd3 +[from] Done for function pgcd3 +[from] Computing for function pos_rem +[from] Done for function pos_rem +[from] Computing for function shift_modulo +[from] Done for function shift_modulo +[from] Computing for function simultaneous_congruences +[from] Done for function simultaneous_congruences +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function extract_bits_modulo: + NO EFFECTS +[from] Function main2: + A FROM i + B FROM i + C FROM i + D FROM i + E FROM i + F FROM i + G FROM i + H FROM i + I FROM i + J FROM i + K FROM i + L FROM i + M FROM i + N FROM i + O FROM i + P FROM i + Q FROM i +[from] Function pgcd1: + \result FROM x; y +[from] Function pgcd2: + \result FROM x; y +[from] Function pgcd3: + \result FROM x; y +[from] Function pos_rem: + NO EFFECTS +[from] Function shift_modulo: + NO EFFECTS +[from] Function simultaneous_congruences: + NO EFFECTS +[from] Function main: + A FROM i + B FROM i + C FROM i + D FROM i + E FROM i + F FROM i + G FROM i + H FROM i + I FROM i + J FROM i + K FROM i + L FROM i + M FROM i + N FROM i + O FROM i + P FROM i + Q FROM i +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function extract_bits_modulo: + aa1; ptr1; m1; n1; aa2; ptr2; m2; n2; aa3; ptr3; m3; n3; aa4; ptr4; m4; n4 +[inout] Inputs for function extract_bits_modulo: + i +[inout] Out (internal) for function main2: + A; B; C; D; E; F; G; H; I; J; K; L; M; N; O; P; Q +[inout] Inputs for function main2: + A; D; G; I; J; K; L; i +[inout] Out (internal) for function pgcd1: + a_0; b_0; tmp +[inout] Inputs for function pgcd1: + \nothing +[inout] Out (internal) for function pgcd2: + a_0; b_0; tmp +[inout] Inputs for function pgcd2: + \nothing +[inout] Out (internal) for function pgcd3: + a_0; b_0; tmp +[inout] Inputs for function pgcd3: + \nothing +[inout] Out (internal) for function pos_rem: + n; j; k; l +[inout] Inputs for function pos_rem: + v +[inout] Out (internal) for function shift_modulo: + r; s; q; t +[inout] Inputs for function shift_modulo: + i +[inout] Out (internal) for function simultaneous_congruences: + n1; n2; n3; m1; m2; o1; o2; o3 +[inout] Inputs for function simultaneous_congruences: + i2 +[inout] Out (internal) for function main: + A; B; C; D; E; F; G; H; I; J; K; L; M; N; O; P; Q +[inout] Inputs for function main: + A; D; G; I; J; K; L; i; a; b; i2; v diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/multi_access.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/multi_access.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/multi_access.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/multi_access.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,24 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/multi_access.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + s{.a; .b} ∈ {2} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + s; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/my_visitor.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/my_visitor.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/my_visitor.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/my_visitor.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,54 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/my_visitor.c (with preprocessing) +/* Generated by Frama-C */ +int f(void) +{ + int __retres; + int y; + y = 0; + y ++; + /*@ assert y ≡ 1; */ ; + __retres = 0; + return __retres; +} + + +[kernel] ================================ +/* Generated by Frama-C */ +int f(void) +{ + int __retres; + int y; + /*@ assert emitter2: ∀ ℤ x; x ≡ x; */ + y = 0; + /*@ assert emitter1: ∀ ℤ x; x ≡ x; */ + y ++; + /*@ assert y ≡ 1; */ + /*@ assert emitter2: ∀ ℤ x; x ≡ x; */ + ; + /*@ assert emitter1: ∀ ℤ x; x ≡ x; */ + __retres = 0; + /*@ assert emitter2: ∀ ℤ x; x ≡ x; */ + return __retres; +} + + +[kernel] ================================ +/* Generated by Frama-C */ +int f(void) +{ + int __retres; + int y; + /*@ assert emitter2: ∀ ℤ x; x ≡ x; */ + y = 0; + y ++; + /*@ assert y ≡ 1; */ + /*@ assert emitter2: ∀ ℤ x; x ≡ x; */ + ; + __retres = 0; + /*@ assert emitter2: ∀ ℤ x; x ≡ x; */ + return __retres; +} + + +[kernel] ================================ diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/nested_struct_init.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/nested_struct_init.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/nested_struct_init.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/nested_struct_init.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,146 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/nested_struct_init.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + g_3.f0 ∈ {-1} + .[bits 8 to 15] ∈ UNINITIALIZED + .f1 ∈ {19284} + .f2 ∈ {6} + .f3 ∈ {7} + .f4 ∈ {-1} + .[bits 120 to 127] ∈ UNINITIALIZED + .f5 ∈ {1} + .f6 ∈ {-10} + .[bits 176 to 191] ∈ UNINITIALIZED + .f7 ∈ {1732606355} + .f8 ∈ {15485} + .[bits 240 to 255] ∈ {0} + g_8.f0.f0 ∈ {-43} + .f0.[bits 8 to 15] ∈ UNINITIALIZED + .f0.f1 ∈ {-10} + .f0.f2 ∈ {0} + .f0.[bits 48 to 63] ∈ UNINITIALIZED + .f0.f3 ∈ {-1878325119} + .f0.f4 ∈ {218} + .f0.[bits 104 to 127] ∈ UNINITIALIZED + .f0.f5.f0 ∈ {-37} + .f0.f5.[bits 8 to 15] ∈ UNINITIALIZED + .f0.f5.f1 ∈ {-31637} + .f0.f5.f2 ∈ {1} + .f0.f5.f3 ∈ {65529} + .f0.f5.f4 ∈ {-13} + .f0.f5.[bits 120 to 127] ∈ UNINITIALIZED + .f0.f5.f5 ∈ {-66898258} + .f0.f5.f6 ∈ {6} + .f0.f5.[bits 176 to 191] ∈ UNINITIALIZED + .f0.f5.f7 ∈ {1390716594} + .f0.f5.f8 ∈ {20144} + .f0.f5.[bits 240 to 255] ∈ {0} + .f0.f6 ∈ {1257091918934088959} + .f0.f7 ∈ {-100} + .f0.[bits 456 to 463] ∈ UNINITIALIZED + .f0.f8 ∈ {-1} + .f1 ∈ {372666747} + .f2 ∈ {4294967292} + .f3 ∈ {4} + .f4.f0 ∈ {-29} + .f4.[bits 8 to 15] ∈ UNINITIALIZED + .f4.f1 ∈ {-4900} + .f4.f2 ∈ {-1010372691391514597} + .f4.f3 ∈ {63392} + .f4.f4 ∈ {124} + .f4.[bits 120 to 127] ∈ UNINITIALIZED + .f4.f5 ∈ {0} + .f4.f6 ∈ {-22659} + .f4.[bits 176 to 191] ∈ UNINITIALIZED + .f4.f7 ∈ {2143805241} + .f4.f8 ∈ {15450} + .f4.[bits 240 to 255] ∈ {0} + .f5.f0 ∈ {-1593529130} + .f5.f1 ∈ {168} + .f5.[bits 40 to 63] ∈ {0} + .f6 ∈ {-83} + .f7 ∈ {8} + .[bits 944 to 959] ∈ {0} +[value] DUMPING STATE of file tests/misc/nested_struct_init.i line 55 + g_3.f0 ∈ {-1} + .[bits 8 to 15] ∈ UNINITIALIZED + .f1 ∈ {19284} + .f2 ∈ {6} + .f3 ∈ {7} + .f4 ∈ {-1} + .[bits 120 to 127] ∈ UNINITIALIZED + .f5 ∈ {1} + .f6 ∈ {-10} + .[bits 176 to 191] ∈ UNINITIALIZED + .f7 ∈ {1732606355} + .f8 ∈ {15485} + .[bits 240 to 255] ∈ {0} + g_8.f0.f0 ∈ {-43} + .f0.[bits 8 to 15] ∈ UNINITIALIZED + .f0.f1 ∈ {-10} + .f0.f2 ∈ {0} + .f0.[bits 48 to 63] ∈ UNINITIALIZED + .f0.f3 ∈ {-1878325119} + .f0.f4 ∈ {218} + .f0.[bits 104 to 127] ∈ UNINITIALIZED + .f0.f5.f0 ∈ {-37} + .f0.f5.[bits 8 to 15] ∈ UNINITIALIZED + .f0.f5.f1 ∈ {-31637} + .f0.f5.f2 ∈ {1} + .f0.f5.f3 ∈ {65529} + .f0.f5.f4 ∈ {-13} + .f0.f5.[bits 120 to 127] ∈ UNINITIALIZED + .f0.f5.f5 ∈ {-66898258} + .f0.f5.f6 ∈ {6} + .f0.f5.[bits 176 to 191] ∈ UNINITIALIZED + .f0.f5.f7 ∈ {1390716594} + .f0.f5.f8 ∈ {20144} + .f0.f5.[bits 240 to 255] ∈ {0} + .f0.f6 ∈ {1257091918934088959} + .f0.f7 ∈ {-100} + .f0.[bits 456 to 463] ∈ UNINITIALIZED + .f0.f8 ∈ {-1} + .f1 ∈ {372666747} + .f2 ∈ {4294967292} + .f3 ∈ {4} + .f4.f0 ∈ {-29} + .f4.[bits 8 to 15] ∈ UNINITIALIZED + .f4.f1 ∈ {-4900} + .f4.f2 ∈ {-1010372691391514597} + .f4.f3 ∈ {63392} + .f4.f4 ∈ {124} + .f4.[bits 120 to 127] ∈ UNINITIALIZED + .f4.f5 ∈ {0} + .f4.f6 ∈ {-22659} + .f4.[bits 176 to 191] ∈ UNINITIALIZED + .f4.f7 ∈ {2143805241} + .f4.f8 ∈ {15450} + .f4.[bits 240 to 255] ∈ {0} + .f5.f0 ∈ {-1593529130} + .f5.f1 ∈ {168} + .f5.[bits 40 to 63] ∈ {0} + .f6 ∈ {-83} + .f7 ∈ {8} + .[bits 944 to 959] ∈ {0} + =END OF DUMP== +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + __retres ∈ {0} +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/non_iso_initializer.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/non_iso_initializer.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/non_iso_initializer.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/non_iso_initializer.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/non_iso_initializer.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G0 ∈ {42} + G1 ∈ {21} + G2 ∈ {63} + G3 ∈ {-1} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + G3 ∈ {105} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + G3 FROM G0; G2 +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + G3 +[inout] Inputs for function main: + G0; G2 diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/non_natural.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/non_natural.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/non_natural.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/non_natural.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,260 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/non_natural.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] +[value] computing for function main1 <- main. + Called from tests/misc/non_natural.i:63. +tests/misc/non_natural.i:13:[kernel] warning: Non-natural loop detected. +[value] Called Frama_C_show_each({0}) +[value] Called Frama_C_show_each({0; 1}) +[value] Called Frama_C_show_each({0; 1; 2}) +[value] Called Frama_C_show_each({0; 1; 2; 3}) +[value] Called Frama_C_show_each({0; 1; 2; 3; 4}) +[value] Called Frama_C_show_each({0; 1; 2; 3; 4; 5}) +[value] Called Frama_C_show_each([0..16]) +[value] Called Frama_C_show_each([0..17]) +[value] Called Frama_C_show_each([0..128]) +[value] Called Frama_C_show_each([0..129]) +[value] Called Frama_C_show_each([0..513]) +[value] Called Frama_C_show_each([0..514]) +[value] Called Frama_C_show_each([0..32768]) +[value] Called Frama_C_show_each([0..32769]) +[value] Called Frama_C_show_each([0..999999]) +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/non_natural.i:64. +[value] computing for function duff1 <- main2 <- main. + Called from tests/misc/non_natural.i:57. +tests/misc/non_natural.i:21:[kernel] warning: Non-natural loop detected. +tests/misc/non_natural.i:21:[value] entering loop for the first time +[value] Called Frama_C_show_each({{ &p2 }}) +[value] Called Frama_C_show_each({{ &p2 + {0; 32} }}) +[value] Called Frama_C_show_each({{ &p2 + {0; 32; 64} }}) +[value] Called Frama_C_show_each({{ &p2 + {0; 32; 64; 96} }}) +[value] Called Frama_C_show_each({{ &p2 + {0; 32; 64; 96; 128} }}) +[value] Called Frama_C_show_each({{ &p2 + {0; 32; 64; 96; 128; 160} }}) +[value] Called Frama_C_show_each({{ &p2 + {0; 32; 64; 96; 128; 160; 192} }}) +[value] Called Frama_C_show_each({{ &p2 + {0; 32; 64; 96; 128; 160; 192; 224} }}) +[value] Called Frama_C_show_each({{ &p2 + [0..256],0%32 }}) +[value] Called Frama_C_show_each({{ &p2 + [0..288],0%32 }}) +[value] Called Frama_C_show_each({{ &p2 + [0..320],0%32 }}) +[value] Called Frama_C_show_each({{ &p2 + [0..352],0%32 }}) +[value] Called Frama_C_show_each({{ &p2 + [0..384],0%32 }}) +[value] Called Frama_C_show_each({{ &p2 + [0..399968],0%32 }}) +tests/misc/non_natural.i:23:[kernel] more than 200(12500) locations to update in array. Approximating. +tests/misc/non_natural.i:24:[kernel] more than 200(12500) locations to update in array. Approximating. +tests/misc/non_natural.i:25:[kernel] warning: out of bounds read. assert \valid_read(tmp_4); + (tmp_4 from from++) +tests/misc/non_natural.i:25:[kernel] more than 200(12500) locations to update in array. Approximating. +tests/misc/non_natural.i:26:[kernel] warning: out of bounds read. assert \valid_read(tmp_6); + (tmp_6 from from++) +tests/misc/non_natural.i:26:[kernel] more than 200(12500) locations to update in array. Approximating. +tests/misc/non_natural.i:27:[kernel] warning: out of bounds read. assert \valid_read(tmp_8); + (tmp_8 from from++) +tests/misc/non_natural.i:27:[kernel] more than 200(12500) locations to update in array. Approximating. +tests/misc/non_natural.i:28:[kernel] warning: out of bounds read. assert \valid_read(tmp_10); + (tmp_10 from from++) +tests/misc/non_natural.i:28:[kernel] more than 200(12500) locations to update in array. Approximating. +tests/misc/non_natural.i:29:[kernel] warning: out of bounds read. assert \valid_read(tmp_12); + (tmp_12 from from++) +tests/misc/non_natural.i:29:[kernel] more than 200(12500) locations to update in array. Approximating. +tests/misc/non_natural.i:30:[kernel] warning: out of bounds read. assert \valid_read(tmp_14); + (tmp_14 from from++) +tests/misc/non_natural.i:30:[kernel] more than 200(12500) locations to update in array. Approximating. +[value] Called Frama_C_show_each({{ &p2 + [0..400000],0%32 }}) +tests/misc/non_natural.i:23:[kernel] warning: out of bounds write. assert \valid(tmp); + (tmp from to++) +tests/misc/non_natural.i:23:[kernel] warning: out of bounds read. assert \valid_read(tmp_0); + (tmp_0 from from++) +tests/misc/non_natural.i:24:[kernel] warning: out of bounds write. assert \valid(tmp_1); + (tmp_1 from to++) +tests/misc/non_natural.i:24:[kernel] warning: out of bounds read. assert \valid_read(tmp_2); + (tmp_2 from from++) +tests/misc/non_natural.i:25:[kernel] warning: out of bounds write. assert \valid(tmp_3); + (tmp_3 from to++) +tests/misc/non_natural.i:26:[kernel] warning: out of bounds write. assert \valid(tmp_5); + (tmp_5 from to++) +tests/misc/non_natural.i:27:[kernel] warning: out of bounds write. assert \valid(tmp_7); + (tmp_7 from to++) +tests/misc/non_natural.i:28:[kernel] warning: out of bounds write. assert \valid(tmp_9); + (tmp_9 from to++) +tests/misc/non_natural.i:29:[kernel] warning: out of bounds write. assert \valid(tmp_11); + (tmp_11 from to++) +tests/misc/non_natural.i:30:[kernel] warning: out of bounds write. assert \valid(tmp_13); + (tmp_13 from to++) +[value] Called Frama_C_show_each({{ &p2 + [0..--],0%32 }}) +[value] Recording results for duff1 +[value] Done for function duff1 +tests/misc/non_natural.i:58:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ o < 100002; +[value] computing for function duff2 <- main2 <- main. + Called from tests/misc/non_natural.i:59. +tests/misc/non_natural.i:38:[kernel] warning: Non-natural loop detected. +[value] Called Frama_C_show_each({{ &p2 }}) +[value] Called Frama_C_show_each({{ &p2 + {0; 32} }}) +[value] Called Frama_C_show_each({{ &p2 + {0; 32; 64} }}) +[value] Called Frama_C_show_each({{ &p2 + [0..399968],0%32 }}) +tests/misc/non_natural.i:39:[kernel] more than 200(12500) locations to update in array. Approximating. +tests/misc/non_natural.i:40:[kernel] more than 200(12500) locations to update in array. Approximating. +tests/misc/non_natural.i:41:[kernel] warning: out of bounds read. assert \valid_read(tmp_4); + (tmp_4 from from++) +tests/misc/non_natural.i:41:[kernel] more than 200(12500) locations to update in array. Approximating. +tests/misc/non_natural.i:42:[kernel] warning: out of bounds read. assert \valid_read(tmp_6); + (tmp_6 from from++) +tests/misc/non_natural.i:42:[kernel] more than 200(12500) locations to update in array. Approximating. +tests/misc/non_natural.i:43:[kernel] warning: out of bounds read. assert \valid_read(tmp_8); + (tmp_8 from from++) +tests/misc/non_natural.i:43:[kernel] more than 200(12500) locations to update in array. Approximating. +tests/misc/non_natural.i:44:[kernel] warning: out of bounds read. assert \valid_read(tmp_10); + (tmp_10 from from++) +tests/misc/non_natural.i:44:[kernel] more than 200(12500) locations to update in array. Approximating. +tests/misc/non_natural.i:45:[kernel] warning: out of bounds read. assert \valid_read(tmp_12); + (tmp_12 from from++) +tests/misc/non_natural.i:45:[kernel] more than 200(12500) locations to update in array. Approximating. +tests/misc/non_natural.i:46:[kernel] warning: out of bounds read. assert \valid_read(tmp_14); + (tmp_14 from from++) +tests/misc/non_natural.i:46:[kernel] more than 200(12500) locations to update in array. Approximating. +[value] Called Frama_C_show_each({{ &p2 + [0..400000],0%32 }}) +tests/misc/non_natural.i:39:[kernel] warning: out of bounds write. assert \valid(tmp); + (tmp from to++) +tests/misc/non_natural.i:39:[kernel] warning: out of bounds read. assert \valid_read(tmp_0); + (tmp_0 from from++) +tests/misc/non_natural.i:40:[kernel] warning: out of bounds write. assert \valid(tmp_1); + (tmp_1 from to++) +tests/misc/non_natural.i:40:[kernel] warning: out of bounds read. assert \valid_read(tmp_2); + (tmp_2 from from++) +tests/misc/non_natural.i:41:[kernel] warning: out of bounds write. assert \valid(tmp_3); + (tmp_3 from to++) +tests/misc/non_natural.i:42:[kernel] warning: out of bounds write. assert \valid(tmp_5); + (tmp_5 from to++) +tests/misc/non_natural.i:43:[kernel] warning: out of bounds write. assert \valid(tmp_7); + (tmp_7 from to++) +tests/misc/non_natural.i:44:[kernel] warning: out of bounds write. assert \valid(tmp_9); + (tmp_9 from to++) +tests/misc/non_natural.i:45:[kernel] warning: out of bounds write. assert \valid(tmp_11); + (tmp_11 from to++) +tests/misc/non_natural.i:46:[kernel] warning: out of bounds write. assert \valid(tmp_13); + (tmp_13 from to++) +[value] Called Frama_C_show_each({{ &p2 + [0..--],0%32 }}) +[value] Called Frama_C_show_each({{ &p2 + [0..--],0%32 }}) +[value] Called Frama_C_show_each({{ &p2 + [0..--],0%32 }}) +[value] Called Frama_C_show_each({{ &p2 + [0..--],0%32 }}) +[value] Called Frama_C_show_each({{ &p2 + [0..--],0%32 }}) +[value] Called Frama_C_show_each({{ &p2 + [0..--],0%32 }}) +[value] Called Frama_C_show_each({{ &p2 + [0..--],0%32 }}) +[value] Recording results for duff2 +[value] Done for function duff2 +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +tests/misc/non_natural.i:23:[kernel] more than 200(12500) elements to enumerate. Approximating. +tests/misc/non_natural.i:24:[kernel] more than 200(12500) elements to enumerate. Approximating. +tests/misc/non_natural.i:25:[kernel] more than 200(12500) elements to enumerate. Approximating. +tests/misc/non_natural.i:26:[kernel] more than 200(12500) elements to enumerate. Approximating. +tests/misc/non_natural.i:27:[kernel] more than 200(12500) elements to enumerate. Approximating. +tests/misc/non_natural.i:28:[kernel] more than 200(12500) elements to enumerate. Approximating. +tests/misc/non_natural.i:29:[kernel] more than 200(12500) elements to enumerate. Approximating. +tests/misc/non_natural.i:30:[kernel] more than 200(12500) elements to enumerate. Approximating. +[value] Values at end of function duff1: + to ∈ {{ &p2 + [32..--],0%32 }} + from ∈ {{ &p1 + [32..--],0%32 }} + n ∈ {0} + p2[0..99999] ∈ {1} or UNINITIALIZED +[value] Values at end of function duff2: + to ∈ {{ &p2 + [32..--],0%32 }} + from ∈ {{ &p1 + [32..--],0%32 }} + n ∈ {0} + p2[0..99999] ∈ {1; 2} or UNINITIALIZED +[value] Values at end of function main1: + c ∈ {1000000} +tests/misc/non_natural.i:23:[kernel] more than 200(12501) elements to enumerate. Approximating. +tests/misc/non_natural.i:24:[kernel] more than 200(12501) elements to enumerate. Approximating. +[value] Values at end of function main2: + p1[0..100001] ∈ {1; 2} or UNINITIALIZED + p2[0..99999] ∈ {1; 2} or UNINITIALIZED + o ∈ [0..100001] +[value] Values at end of function main: + +[from] Computing for function duff1 +tests/misc/non_natural.i:23:[kernel] more than 200(12500) dependencies to update. Approximating. +tests/misc/non_natural.i:24:[kernel] more than 200(12500) dependencies to update. Approximating. +tests/misc/non_natural.i:25:[kernel] more than 200(12500) dependencies to update. Approximating. +tests/misc/non_natural.i:26:[kernel] more than 200(12500) dependencies to update. Approximating. +tests/misc/non_natural.i:27:[kernel] more than 200(12500) dependencies to update. Approximating. +tests/misc/non_natural.i:28:[kernel] more than 200(12500) dependencies to update. Approximating. +tests/misc/non_natural.i:29:[kernel] more than 200(12500) dependencies to update. Approximating. +tests/misc/non_natural.i:30:[kernel] more than 200(12500) dependencies to update. Approximating. +[from] Done for function duff1 +[from] Computing for function duff2 +tests/misc/non_natural.i:39:[kernel] more than 200(12500) dependencies to update. Approximating. +tests/misc/non_natural.i:40:[kernel] more than 200(12500) dependencies to update. Approximating. +tests/misc/non_natural.i:41:[kernel] more than 200(12500) dependencies to update. Approximating. +tests/misc/non_natural.i:42:[kernel] more than 200(12500) dependencies to update. Approximating. +tests/misc/non_natural.i:43:[kernel] more than 200(12500) dependencies to update. Approximating. +tests/misc/non_natural.i:44:[kernel] more than 200(12500) dependencies to update. Approximating. +tests/misc/non_natural.i:45:[kernel] more than 200(12500) dependencies to update. Approximating. +tests/misc/non_natural.i:46:[kernel] more than 200(12500) dependencies to update. Approximating. +[from] Done for function duff2 +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function duff1: + p2[0] FROM to; from; count; p1[0..100000] (and SELF) + [1..99992] FROM to; from; count; p1[0..100001] (and SELF) + [99993] FROM to; from; count; p1[1..100001] (and SELF) + [99994] FROM to; from; count; p1[2..99999] (and SELF) + [99995] FROM to; from; count; p1[3..99999] (and SELF) + [99996] FROM to; from; count; p1[4..99999] (and SELF) + [99997] FROM to; from; count; p1[5..99999] (and SELF) + [99998] FROM to; from; count; p1[6..99999] (and SELF) + [99999] FROM to; from; count; p1[7..99999] (and SELF) +[from] Function duff2: + p2[0] FROM to; from; count; p1[0..100000] (and SELF) + [1..99992] FROM to; from; count; p1[0..100001] (and SELF) + [99993] FROM to; from; count; p1[1..100001] (and SELF) + [99994] FROM to; from; count; p1[2..99999] (and SELF) + [99995] FROM to; from; count; p1[3..99999] (and SELF) + [99996] FROM to; from; count; p1[4..99999] (and SELF) + [99997] FROM to; from; count; p1[5..99999] (and SELF) + [99998] FROM to; from; count; p1[6..99999] (and SELF) + [99999] FROM to; from; count; p1[7..99999] (and SELF) +[from] Function main1: + NO EFFECTS +[from] Function main2: + NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function duff1: + to; from; n; tmp; tmp_0; tmp_1; tmp_2; tmp_3; tmp_4; tmp_5; tmp_6; + tmp_7; tmp_8; tmp_9; tmp_10; tmp_11; tmp_12; tmp_13; tmp_14; p2[0..99999] +[inout] Inputs for function duff1: + p1[0..100001] +[inout] Out (internal) for function duff2: + to; from; n; tmp; tmp_0; tmp_1; tmp_2; tmp_3; tmp_4; tmp_5; tmp_6; + tmp_7; tmp_8; tmp_9; tmp_10; tmp_11; tmp_12; tmp_13; tmp_14; p2[0..99999] +[inout] Inputs for function duff2: + p1[0..100001] +[inout] Out (internal) for function main1: + c +[inout] Inputs for function main1: + v +[inout] Out (internal) for function main2: + p1[0..100001]; p2[0..99999]; o +[inout] Inputs for function main2: + v +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + v diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/no_results.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/no_results.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/no_results.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/no_results.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,6109 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/no_results.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..2999] ∈ {0} +[value] computing for function init <- main. + Called from tests/misc/no_results.c:19. +[value] Semantic level unrolling superposing up to 100 states +[value] Semantic level unrolling superposing up to 200 states +[value] Semantic level unrolling superposing up to 300 states +[value] Semantic level unrolling superposing up to 400 states +[value] Semantic level unrolling superposing up to 500 states +[value] Semantic level unrolling superposing up to 600 states +[value] Semantic level unrolling superposing up to 700 states +[value] Semantic level unrolling superposing up to 800 states +[value] Semantic level unrolling superposing up to 900 states +[value] Semantic level unrolling superposing up to 1000 states +[value] Semantic level unrolling superposing up to 1100 states +[value] Semantic level unrolling superposing up to 1200 states +[value] Semantic level unrolling superposing up to 1300 states +[value] Semantic level unrolling superposing up to 1400 states +[value] Semantic level unrolling superposing up to 1500 states +[value] Semantic level unrolling superposing up to 1600 states +[value] Semantic level unrolling superposing up to 1700 states +[value] Semantic level unrolling superposing up to 1800 states +[value] Semantic level unrolling superposing up to 1900 states +[value] Semantic level unrolling superposing up to 2000 states +[value] Semantic level unrolling superposing up to 2100 states +[value] Semantic level unrolling superposing up to 2200 states +[value] Semantic level unrolling superposing up to 2300 states +[value] Semantic level unrolling superposing up to 2400 states +[value] Semantic level unrolling superposing up to 2500 states +[value] Semantic level unrolling superposing up to 2600 states +[value] Semantic level unrolling superposing up to 2700 states +[value] Semantic level unrolling superposing up to 2800 states +[value] Semantic level unrolling superposing up to 2900 states +[value] Semantic level unrolling superposing up to 3000 states +[value] Recording results for init +[value] Done for function init +[value] computing for function f <- main. + Called from tests/misc/no_results.c:20. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + t[0..1] ∈ {0} + [2] ∈ {2} + [3] ∈ {3} + [4] ∈ {4} + [5] ∈ {5} + [6] ∈ {6} + [7] ∈ {7} + [8] ∈ {8} + [9] ∈ {9} + [10] ∈ {10} + [11] ∈ {11} + [12] ∈ {12} + [13] ∈ {13} + [14] ∈ {14} + [15] ∈ {15} + [16] ∈ {16} + [17] ∈ {17} + [18] ∈ {18} + [19] ∈ {19} + [20] ∈ {20} + [21] ∈ {21} + [22] ∈ {22} + [23] ∈ {23} + [24] ∈ {24} + [25] ∈ {25} + [26] ∈ {26} + [27] ∈ {27} + [28] ∈ {28} + [29] ∈ {29} + [30] ∈ {30} + [31] ∈ {31} + [32] ∈ {32} + [33] ∈ {33} + [34] ∈ {34} + [35] ∈ {35} + [36] ∈ {36} + [37] ∈ {37} + [38] ∈ {38} + [39] ∈ {39} + [40] ∈ {40} + [41] ∈ {41} + [42] ∈ {42} + [43] ∈ {43} + [44] ∈ {44} + [45] ∈ {45} + [46] ∈ {46} + [47] ∈ {47} + [48] ∈ {48} + [49] ∈ {49} + [50] ∈ {50} + [51] ∈ {51} + [52] ∈ {52} + [53] ∈ {53} + [54] ∈ {54} + [55] ∈ {55} + [56] ∈ {56} + [57] ∈ {57} + [58] ∈ {58} + [59] ∈ {59} + [60] ∈ {60} + [61] ∈ {61} + [62] ∈ {62} + [63] ∈ {63} + [64] ∈ {64} + [65] ∈ {65} + [66] ∈ {66} + [67] ∈ {67} + [68] ∈ {68} + [69] ∈ {69} + [70] ∈ {70} + [71] ∈ {71} + [72] ∈ {72} + [73] ∈ {73} + [74] ∈ {74} + [75] ∈ {75} + [76] ∈ {76} + [77] ∈ {77} + [78] ∈ {78} + [79] ∈ {79} + [80] ∈ {80} + [81] ∈ {81} + [82] ∈ {82} + [83] ∈ {83} + [84] ∈ {84} + [85] ∈ {85} + [86] ∈ {86} + [87] ∈ {87} + [88] ∈ {88} + [89] ∈ {89} + [90] ∈ {90} + [91] ∈ {91} + [92] ∈ {92} + [93] ∈ {93} + [94] ∈ {94} + [95] ∈ {95} + [96] ∈ {96} + [97] ∈ {97} + [98] ∈ {98} + [99] ∈ {99} + [100] ∈ {100} + [101] ∈ {101} + [102] ∈ {102} + [103] ∈ {103} + [104] ∈ {104} + [105] ∈ {105} + [106] ∈ {106} + [107] ∈ {107} + [108] ∈ {108} + [109] ∈ {109} + [110] ∈ {110} + [111] ∈ {111} + [112] ∈ {112} + [113] ∈ {113} + [114] ∈ {114} + [115] ∈ {115} + [116] ∈ {116} + [117] ∈ {117} + [118] ∈ {118} + [119] ∈ {119} + [120] ∈ {120} + [121] ∈ {121} + [122] ∈ {122} + [123] ∈ {123} + [124] ∈ {124} + [125] ∈ {125} + [126] ∈ {126} + [127] ∈ {127} + [128] ∈ {128} + [129] ∈ {129} + [130] ∈ {130} + [131] ∈ {131} + [132] ∈ {132} + [133] ∈ {133} + [134] ∈ {134} + [135] ∈ {135} + [136] ∈ {136} + [137] ∈ {137} + [138] ∈ {138} + [139] ∈ {139} + [140] ∈ {140} + [141] ∈ {141} + [142] ∈ {142} + [143] ∈ {143} + [144] ∈ {144} + [145] ∈ {145} + [146] ∈ {146} + [147] ∈ {147} + [148] ∈ {148} + [149] ∈ {149} + [150] ∈ {150} + [151] ∈ {151} + [152] ∈ {152} + [153] ∈ {153} + [154] ∈ {154} + [155] ∈ {155} + [156] ∈ {156} + [157] ∈ {157} + [158] ∈ {158} + [159] ∈ {159} + [160] ∈ {160} + [161] ∈ {161} + [162] ∈ {162} + [163] ∈ {163} + [164] ∈ {164} + [165] ∈ {165} + [166] ∈ {166} + [167] ∈ {167} + [168] ∈ {168} + [169] ∈ {169} + [170] ∈ {170} + [171] ∈ {171} + [172] ∈ {172} + [173] ∈ {173} + [174] ∈ {174} + [175] ∈ {175} + [176] ∈ {176} + [177] ∈ {177} + [178] ∈ {178} + [179] ∈ {179} + [180] ∈ {180} + [181] ∈ {181} + [182] ∈ {182} + [183] ∈ {183} + [184] ∈ {184} + [185] ∈ {185} + [186] ∈ {186} + [187] ∈ {187} + [188] ∈ {188} + [189] ∈ {189} + [190] ∈ {190} + [191] ∈ {191} + [192] ∈ {192} + [193] ∈ {193} + [194] ∈ {194} + [195] ∈ {195} + [196] ∈ {196} + [197] ∈ {197} + [198] ∈ {198} + [199] ∈ {199} + [200] ∈ {200} + [201] ∈ {201} + [202] ∈ {202} + [203] ∈ {203} + [204] ∈ {204} + [205] ∈ {205} + [206] ∈ {206} + [207] ∈ {207} + [208] ∈ {208} + [209] ∈ {209} + [210] ∈ {210} + [211] ∈ {211} + [212] ∈ {212} + [213] ∈ {213} + [214] ∈ {214} + [215] ∈ {215} + [216] ∈ {216} + [217] ∈ {217} + [218] ∈ {218} + [219] ∈ {219} + [220] ∈ {220} + [221] ∈ {221} + [222] ∈ {222} + [223] ∈ {223} + [224] ∈ {224} + [225] ∈ {225} + [226] ∈ {226} + [227] ∈ {227} + [228] ∈ {228} + [229] ∈ {229} + [230] ∈ {230} + [231] ∈ {231} + [232] ∈ {232} + [233] ∈ {233} + [234] ∈ {234} + [235] ∈ {235} + [236] ∈ {236} + [237] ∈ {237} + [238] ∈ {238} + [239] ∈ {239} + [240] ∈ {240} + [241] ∈ {241} + [242] ∈ {242} + [243] ∈ {243} + [244] ∈ {244} + [245] ∈ {245} + [246] ∈ {246} + [247] ∈ {247} + [248] ∈ {248} + [249] ∈ {249} + [250] ∈ {250} + [251] ∈ {251} + [252] ∈ {252} + [253] ∈ {253} + [254] ∈ {254} + [255] ∈ {255} + [256] ∈ {256} + [257] ∈ {257} + [258] ∈ {258} + [259] ∈ {259} + [260] ∈ {260} + [261] ∈ {261} + [262] ∈ {262} + [263] ∈ {263} + [264] ∈ {264} + [265] ∈ {265} + [266] ∈ {266} + [267] ∈ {267} + [268] ∈ {268} + [269] ∈ {269} + [270] ∈ {270} + [271] ∈ {271} + [272] ∈ {272} + [273] ∈ {273} + [274] ∈ {274} + [275] ∈ {275} + [276] ∈ {276} + [277] ∈ {277} + [278] ∈ {278} + [279] ∈ {279} + [280] ∈ {280} + [281] ∈ {281} + [282] ∈ {282} + [283] ∈ {283} + [284] ∈ {284} + [285] ∈ {285} + [286] ∈ {286} + [287] ∈ {287} + [288] ∈ {288} + [289] ∈ {289} + [290] ∈ {290} + [291] ∈ {291} + [292] ∈ {292} + [293] ∈ {293} + [294] ∈ {294} + [295] ∈ {295} + [296] ∈ {296} + [297] ∈ {297} + [298] ∈ {298} + [299] ∈ {299} + [300] ∈ {300} + [301] ∈ {301} + [302] ∈ {302} + [303] ∈ {303} + [304] ∈ {304} + [305] ∈ {305} + [306] ∈ {306} + [307] ∈ {307} + [308] ∈ {308} + [309] ∈ {309} + [310] ∈ {310} + [311] ∈ {311} + [312] ∈ {312} + [313] ∈ {313} + [314] ∈ {314} + [315] ∈ {315} + [316] ∈ {316} + [317] ∈ {317} + [318] ∈ {318} + [319] ∈ {319} + [320] ∈ {320} + [321] ∈ {321} + [322] ∈ {322} + [323] ∈ {323} + [324] ∈ {324} + [325] ∈ {325} + [326] ∈ {326} + [327] ∈ {327} + [328] ∈ {328} + [329] ∈ {329} + [330] ∈ {330} + [331] ∈ {331} + [332] ∈ {332} + [333] ∈ {333} + [334] ∈ {334} + [335] ∈ {335} + [336] ∈ {336} + [337] ∈ {337} + [338] ∈ {338} + [339] ∈ {339} + [340] ∈ {340} + [341] ∈ {341} + [342] ∈ {342} + [343] ∈ {343} + [344] ∈ {344} + [345] ∈ {345} + [346] ∈ {346} + [347] ∈ {347} + [348] ∈ {348} + [349] ∈ {349} + [350] ∈ {350} + [351] ∈ {351} + [352] ∈ {352} + [353] ∈ {353} + [354] ∈ {354} + [355] ∈ {355} + [356] ∈ {356} + [357] ∈ {357} + [358] ∈ {358} + [359] ∈ {359} + [360] ∈ {360} + [361] ∈ {361} + [362] ∈ {362} + [363] ∈ {363} + [364] ∈ {364} + [365] ∈ {365} + [366] ∈ {366} + [367] ∈ {367} + [368] ∈ {368} + [369] ∈ {369} + [370] ∈ {370} + [371] ∈ {371} + [372] ∈ {372} + [373] ∈ {373} + [374] ∈ {374} + [375] ∈ {375} + [376] ∈ {376} + [377] ∈ {377} + [378] ∈ {378} + [379] ∈ {379} + [380] ∈ {380} + [381] ∈ {381} + [382] ∈ {382} + [383] ∈ {383} + [384] ∈ {384} + [385] ∈ {385} + [386] ∈ {386} + [387] ∈ {387} + [388] ∈ {388} + [389] ∈ {389} + [390] ∈ {390} + [391] ∈ {391} + [392] ∈ {392} + [393] ∈ {393} + [394] ∈ {394} + [395] ∈ {395} + [396] ∈ {396} + [397] ∈ {397} + [398] ∈ {398} + [399] ∈ {399} + [400] ∈ {400} + [401] ∈ {401} + [402] ∈ {402} + [403] ∈ {403} + [404] ∈ {404} + [405] ∈ {405} + [406] ∈ {406} + [407] ∈ {407} + [408] ∈ {408} + [409] ∈ {409} + [410] ∈ {410} + [411] ∈ {411} + [412] ∈ {412} + [413] ∈ {413} + [414] ∈ {414} + [415] ∈ {415} + [416] ∈ {416} + [417] ∈ {417} + [418] ∈ {418} + [419] ∈ {419} + [420] ∈ {420} + [421] ∈ {421} + [422] ∈ {422} + [423] ∈ {423} + [424] ∈ {424} + [425] ∈ {425} + [426] ∈ {426} + [427] ∈ {427} + [428] ∈ {428} + [429] ∈ {429} + [430] ∈ {430} + [431] ∈ {431} + [432] ∈ {432} + [433] ∈ {433} + [434] ∈ {434} + [435] ∈ {435} + [436] ∈ {436} + [437] ∈ {437} + [438] ∈ {438} + [439] ∈ {439} + [440] ∈ {440} + [441] ∈ {441} + [442] ∈ {442} + [443] ∈ {443} + [444] ∈ {444} + [445] ∈ {445} + [446] ∈ {446} + [447] ∈ {447} + [448] ∈ {448} + [449] ∈ {449} + [450] ∈ {450} + [451] ∈ {451} + [452] ∈ {452} + [453] ∈ {453} + [454] ∈ {454} + [455] ∈ {455} + [456] ∈ {456} + [457] ∈ {457} + [458] ∈ {458} + [459] ∈ {459} + [460] ∈ {460} + [461] ∈ {461} + [462] ∈ {462} + [463] ∈ {463} + [464] ∈ {464} + [465] ∈ {465} + [466] ∈ {466} + [467] ∈ {467} + [468] ∈ {468} + [469] ∈ {469} + [470] ∈ {470} + [471] ∈ {471} + [472] ∈ {472} + [473] ∈ {473} + [474] ∈ {474} + [475] ∈ {475} + [476] ∈ {476} + [477] ∈ {477} + [478] ∈ {478} + [479] ∈ {479} + [480] ∈ {480} + [481] ∈ {481} + [482] ∈ {482} + [483] ∈ {483} + [484] ∈ {484} + [485] ∈ {485} + [486] ∈ {486} + [487] ∈ {487} + [488] ∈ {488} + [489] ∈ {489} + [490] ∈ {490} + [491] ∈ {491} + [492] ∈ {492} + [493] ∈ {493} + [494] ∈ {494} + [495] ∈ {495} + [496] ∈ {496} + [497] ∈ {497} + [498] ∈ {498} + [499] ∈ {499} + [500] ∈ {500} + [501] ∈ {501} + [502] ∈ {502} + [503] ∈ {503} + [504] ∈ {504} + [505] ∈ {505} + [506] ∈ {506} + [507] ∈ {507} + [508] ∈ {508} + [509] ∈ {509} + [510] ∈ {510} + [511] ∈ {511} + [512] ∈ {512} + [513] ∈ {513} + [514] ∈ {514} + [515] ∈ {515} + [516] ∈ {516} + [517] ∈ {517} + [518] ∈ {518} + [519] ∈ {519} + [520] ∈ {520} + [521] ∈ {521} + [522] ∈ {522} + [523] ∈ {523} + [524] ∈ {524} + [525] ∈ {525} + [526] ∈ {526} + [527] ∈ {527} + [528] ∈ {528} + [529] ∈ {529} + [530] ∈ {530} + [531] ∈ {531} + [532] ∈ {532} + [533] ∈ {533} + [534] ∈ {534} + [535] ∈ {535} + [536] ∈ {536} + [537] ∈ {537} + [538] ∈ {538} + [539] ∈ {539} + [540] ∈ {540} + [541] ∈ {541} + [542] ∈ {542} + [543] ∈ {543} + [544] ∈ {544} + [545] ∈ {545} + [546] ∈ {546} + [547] ∈ {547} + [548] ∈ {548} + [549] ∈ {549} + [550] ∈ {550} + [551] ∈ {551} + [552] ∈ {552} + [553] ∈ {553} + [554] ∈ {554} + [555] ∈ {555} + [556] ∈ {556} + [557] ∈ {557} + [558] ∈ {558} + [559] ∈ {559} + [560] ∈ {560} + [561] ∈ {561} + [562] ∈ {562} + [563] ∈ {563} + [564] ∈ {564} + [565] ∈ {565} + [566] ∈ {566} + [567] ∈ {567} + [568] ∈ {568} + [569] ∈ {569} + [570] ∈ {570} + [571] ∈ {571} + [572] ∈ {572} + [573] ∈ {573} + [574] ∈ {574} + [575] ∈ {575} + [576] ∈ {576} + [577] ∈ {577} + [578] ∈ {578} + [579] ∈ {579} + [580] ∈ {580} + [581] ∈ {581} + [582] ∈ {582} + [583] ∈ {583} + [584] ∈ {584} + [585] ∈ {585} + [586] ∈ {586} + [587] ∈ {587} + [588] ∈ {588} + [589] ∈ {589} + [590] ∈ {590} + [591] ∈ {591} + [592] ∈ {592} + [593] ∈ {593} + [594] ∈ {594} + [595] ∈ {595} + [596] ∈ {596} + [597] ∈ {597} + [598] ∈ {598} + [599] ∈ {599} + [600] ∈ {600} + [601] ∈ {601} + [602] ∈ {602} + [603] ∈ {603} + [604] ∈ {604} + [605] ∈ {605} + [606] ∈ {606} + [607] ∈ {607} + [608] ∈ {608} + [609] ∈ {609} + [610] ∈ {610} + [611] ∈ {611} + [612] ∈ {612} + [613] ∈ {613} + [614] ∈ {614} + [615] ∈ {615} + [616] ∈ {616} + [617] ∈ {617} + [618] ∈ {618} + [619] ∈ {619} + [620] ∈ {620} + [621] ∈ {621} + [622] ∈ {622} + [623] ∈ {623} + [624] ∈ {624} + [625] ∈ {625} + [626] ∈ {626} + [627] ∈ {627} + [628] ∈ {628} + [629] ∈ {629} + [630] ∈ {630} + [631] ∈ {631} + [632] ∈ {632} + [633] ∈ {633} + [634] ∈ {634} + [635] ∈ {635} + [636] ∈ {636} + [637] ∈ {637} + [638] ∈ {638} + [639] ∈ {639} + [640] ∈ {640} + [641] ∈ {641} + [642] ∈ {642} + [643] ∈ {643} + [644] ∈ {644} + [645] ∈ {645} + [646] ∈ {646} + [647] ∈ {647} + [648] ∈ {648} + [649] ∈ {649} + [650] ∈ {650} + [651] ∈ {651} + [652] ∈ {652} + [653] ∈ {653} + [654] ∈ {654} + [655] ∈ {655} + [656] ∈ {656} + [657] ∈ {657} + [658] ∈ {658} + [659] ∈ {659} + [660] ∈ {660} + [661] ∈ {661} + [662] ∈ {662} + [663] ∈ {663} + [664] ∈ {664} + [665] ∈ {665} + [666] ∈ {666} + [667] ∈ {667} + [668] ∈ {668} + [669] ∈ {669} + [670] ∈ {670} + [671] ∈ {671} + [672] ∈ {672} + [673] ∈ {673} + [674] ∈ {674} + [675] ∈ {675} + [676] ∈ {676} + [677] ∈ {677} + [678] ∈ {678} + [679] ∈ {679} + [680] ∈ {680} + [681] ∈ {681} + [682] ∈ {682} + [683] ∈ {683} + [684] ∈ {684} + [685] ∈ {685} + [686] ∈ {686} + [687] ∈ {687} + [688] ∈ {688} + [689] ∈ {689} + [690] ∈ {690} + [691] ∈ {691} + [692] ∈ {692} + [693] ∈ {693} + [694] ∈ {694} + [695] ∈ {695} + [696] ∈ {696} + [697] ∈ {697} + [698] ∈ {698} + [699] ∈ {699} + [700] ∈ {700} + [701] ∈ {701} + [702] ∈ {702} + [703] ∈ {703} + [704] ∈ {704} + [705] ∈ {705} + [706] ∈ {706} + [707] ∈ {707} + [708] ∈ {708} + [709] ∈ {709} + [710] ∈ {710} + [711] ∈ {711} + [712] ∈ {712} + [713] ∈ {713} + [714] ∈ {714} + [715] ∈ {715} + [716] ∈ {716} + [717] ∈ {717} + [718] ∈ {718} + [719] ∈ {719} + [720] ∈ {720} + [721] ∈ {721} + [722] ∈ {722} + [723] ∈ {723} + [724] ∈ {724} + [725] ∈ {725} + [726] ∈ {726} + [727] ∈ {727} + [728] ∈ {728} + [729] ∈ {729} + [730] ∈ {730} + [731] ∈ {731} + [732] ∈ {732} + [733] ∈ {733} + [734] ∈ {734} + [735] ∈ {735} + [736] ∈ {736} + [737] ∈ {737} + [738] ∈ {738} + [739] ∈ {739} + [740] ∈ {740} + [741] ∈ {741} + [742] ∈ {742} + [743] ∈ {743} + [744] ∈ {744} + [745] ∈ {745} + [746] ∈ {746} + [747] ∈ {747} + [748] ∈ {748} + [749] ∈ {749} + [750] ∈ {750} + [751] ∈ {751} + [752] ∈ {752} + [753] ∈ {753} + [754] ∈ {754} + [755] ∈ {755} + [756] ∈ {756} + [757] ∈ {757} + [758] ∈ {758} + [759] ∈ {759} + [760] ∈ {760} + [761] ∈ {761} + [762] ∈ {762} + [763] ∈ {763} + [764] ∈ {764} + [765] ∈ {765} + [766] ∈ {766} + [767] ∈ {767} + [768] ∈ {768} + [769] ∈ {769} + [770] ∈ {770} + [771] ∈ {771} + [772] ∈ {772} + [773] ∈ {773} + [774] ∈ {774} + [775] ∈ {775} + [776] ∈ {776} + [777] ∈ {777} + [778] ∈ {778} + [779] ∈ {779} + [780] ∈ {780} + [781] ∈ {781} + [782] ∈ {782} + [783] ∈ {783} + [784] ∈ {784} + [785] ∈ {785} + [786] ∈ {786} + [787] ∈ {787} + [788] ∈ {788} + [789] ∈ {789} + [790] ∈ {790} + [791] ∈ {791} + [792] ∈ {792} + [793] ∈ {793} + [794] ∈ {794} + [795] ∈ {795} + [796] ∈ {796} + [797] ∈ {797} + [798] ∈ {798} + [799] ∈ {799} + [800] ∈ {800} + [801] ∈ {801} + [802] ∈ {802} + [803] ∈ {803} + [804] ∈ {804} + [805] ∈ {805} + [806] ∈ {806} + [807] ∈ {807} + [808] ∈ {808} + [809] ∈ {809} + [810] ∈ {810} + [811] ∈ {811} + [812] ∈ {812} + [813] ∈ {813} + [814] ∈ {814} + [815] ∈ {815} + [816] ∈ {816} + [817] ∈ {817} + [818] ∈ {818} + [819] ∈ {819} + [820] ∈ {820} + [821] ∈ {821} + [822] ∈ {822} + [823] ∈ {823} + [824] ∈ {824} + [825] ∈ {825} + [826] ∈ {826} + [827] ∈ {827} + [828] ∈ {828} + [829] ∈ {829} + [830] ∈ {830} + [831] ∈ {831} + [832] ∈ {832} + [833] ∈ {833} + [834] ∈ {834} + [835] ∈ {835} + [836] ∈ {836} + [837] ∈ {837} + [838] ∈ {838} + [839] ∈ {839} + [840] ∈ {840} + [841] ∈ {841} + [842] ∈ {842} + [843] ∈ {843} + [844] ∈ {844} + [845] ∈ {845} + [846] ∈ {846} + [847] ∈ {847} + [848] ∈ {848} + [849] ∈ {849} + [850] ∈ {850} + [851] ∈ {851} + [852] ∈ {852} + [853] ∈ {853} + [854] ∈ {854} + [855] ∈ {855} + [856] ∈ {856} + [857] ∈ {857} + [858] ∈ {858} + [859] ∈ {859} + [860] ∈ {860} + [861] ∈ {861} + [862] ∈ {862} + [863] ∈ {863} + [864] ∈ {864} + [865] ∈ {865} + [866] ∈ {866} + [867] ∈ {867} + [868] ∈ {868} + [869] ∈ {869} + [870] ∈ {870} + [871] ∈ {871} + [872] ∈ {872} + [873] ∈ {873} + [874] ∈ {874} + [875] ∈ {875} + [876] ∈ {876} + [877] ∈ {877} + [878] ∈ {878} + [879] ∈ {879} + [880] ∈ {880} + [881] ∈ {881} + [882] ∈ {882} + [883] ∈ {883} + [884] ∈ {884} + [885] ∈ {885} + [886] ∈ {886} + [887] ∈ {887} + [888] ∈ {888} + [889] ∈ {889} + [890] ∈ {890} + [891] ∈ {891} + [892] ∈ {892} + [893] ∈ {893} + [894] ∈ {894} + [895] ∈ {895} + [896] ∈ {896} + [897] ∈ {897} + [898] ∈ {898} + [899] ∈ {899} + [900] ∈ {900} + [901] ∈ {901} + [902] ∈ {902} + [903] ∈ {903} + [904] ∈ {904} + [905] ∈ {905} + [906] ∈ {906} + [907] ∈ {907} + [908] ∈ {908} + [909] ∈ {909} + [910] ∈ {910} + [911] ∈ {911} + [912] ∈ {912} + [913] ∈ {913} + [914] ∈ {914} + [915] ∈ {915} + [916] ∈ {916} + [917] ∈ {917} + [918] ∈ {918} + [919] ∈ {919} + [920] ∈ {920} + [921] ∈ {921} + [922] ∈ {922} + [923] ∈ {923} + [924] ∈ {924} + [925] ∈ {925} + [926] ∈ {926} + [927] ∈ {927} + [928] ∈ {928} + [929] ∈ {929} + [930] ∈ {930} + [931] ∈ {931} + [932] ∈ {932} + [933] ∈ {933} + [934] ∈ {934} + [935] ∈ {935} + [936] ∈ {936} + [937] ∈ {937} + [938] ∈ {938} + [939] ∈ {939} + [940] ∈ {940} + [941] ∈ {941} + [942] ∈ {942} + [943] ∈ {943} + [944] ∈ {944} + [945] ∈ {945} + [946] ∈ {946} + [947] ∈ {947} + [948] ∈ {948} + [949] ∈ {949} + [950] ∈ {950} + [951] ∈ {951} + [952] ∈ {952} + [953] ∈ {953} + [954] ∈ {954} + [955] ∈ {955} + [956] ∈ {956} + [957] ∈ {957} + [958] ∈ {958} + [959] ∈ {959} + [960] ∈ {960} + [961] ∈ {961} + [962] ∈ {962} + [963] ∈ {963} + [964] ∈ {964} + [965] ∈ {965} + [966] ∈ {966} + [967] ∈ {967} + [968] ∈ {968} + [969] ∈ {969} + [970] ∈ {970} + [971] ∈ {971} + [972] ∈ {972} + [973] ∈ {973} + [974] ∈ {974} + [975] ∈ {975} + [976] ∈ {976} + [977] ∈ {977} + [978] ∈ {978} + [979] ∈ {979} + [980] ∈ {980} + [981] ∈ {981} + [982] ∈ {982} + [983] ∈ {983} + [984] ∈ {984} + [985] ∈ {985} + [986] ∈ {986} + [987] ∈ {987} + [988] ∈ {988} + [989] ∈ {989} + [990] ∈ {990} + [991] ∈ {991} + [992] ∈ {992} + [993] ∈ {993} + [994] ∈ {994} + [995] ∈ {995} + [996] ∈ {996} + [997] ∈ {997} + [998] ∈ {998} + [999] ∈ {999} + [1000] ∈ {1000} + [1001] ∈ {1001} + [1002] ∈ {1002} + [1003] ∈ {1003} + [1004] ∈ {1004} + [1005] ∈ {1005} + [1006] ∈ {1006} + [1007] ∈ {1007} + [1008] ∈ {1008} + [1009] ∈ {1009} + [1010] ∈ {1010} + [1011] ∈ {1011} + [1012] ∈ {1012} + [1013] ∈ {1013} + [1014] ∈ {1014} + [1015] ∈ {1015} + [1016] ∈ {1016} + [1017] ∈ {1017} + [1018] ∈ {1018} + [1019] ∈ {1019} + [1020] ∈ {1020} + [1021] ∈ {1021} + [1022] ∈ {1022} + [1023] ∈ {1023} + [1024] ∈ {1024} + [1025] ∈ {1025} + [1026] ∈ {1026} + [1027] ∈ {1027} + [1028] ∈ {1028} + [1029] ∈ {1029} + [1030] ∈ {1030} + [1031] ∈ {1031} + [1032] ∈ {1032} + [1033] ∈ {1033} + [1034] ∈ {1034} + [1035] ∈ {1035} + [1036] ∈ {1036} + [1037] ∈ {1037} + [1038] ∈ {1038} + [1039] ∈ {1039} + [1040] ∈ {1040} + [1041] ∈ {1041} + [1042] ∈ {1042} + [1043] ∈ {1043} + [1044] ∈ {1044} + [1045] ∈ {1045} + [1046] ∈ {1046} + [1047] ∈ {1047} + [1048] ∈ {1048} + [1049] ∈ {1049} + [1050] ∈ {1050} + [1051] ∈ {1051} + [1052] ∈ {1052} + [1053] ∈ {1053} + [1054] ∈ {1054} + [1055] ∈ {1055} + [1056] ∈ {1056} + [1057] ∈ {1057} + [1058] ∈ {1058} + [1059] ∈ {1059} + [1060] ∈ {1060} + [1061] ∈ {1061} + [1062] ∈ {1062} + [1063] ∈ {1063} + [1064] ∈ {1064} + [1065] ∈ {1065} + [1066] ∈ {1066} + [1067] ∈ {1067} + [1068] ∈ {1068} + [1069] ∈ {1069} + [1070] ∈ {1070} + [1071] ∈ {1071} + [1072] ∈ {1072} + [1073] ∈ {1073} + [1074] ∈ {1074} + [1075] ∈ {1075} + [1076] ∈ {1076} + [1077] ∈ {1077} + [1078] ∈ {1078} + [1079] ∈ {1079} + [1080] ∈ {1080} + [1081] ∈ {1081} + [1082] ∈ {1082} + [1083] ∈ {1083} + [1084] ∈ {1084} + [1085] ∈ {1085} + [1086] ∈ {1086} + [1087] ∈ {1087} + [1088] ∈ {1088} + [1089] ∈ {1089} + [1090] ∈ {1090} + [1091] ∈ {1091} + [1092] ∈ {1092} + [1093] ∈ {1093} + [1094] ∈ {1094} + [1095] ∈ {1095} + [1096] ∈ {1096} + [1097] ∈ {1097} + [1098] ∈ {1098} + [1099] ∈ {1099} + [1100] ∈ {1100} + [1101] ∈ {1101} + [1102] ∈ {1102} + [1103] ∈ {1103} + [1104] ∈ {1104} + [1105] ∈ {1105} + [1106] ∈ {1106} + [1107] ∈ {1107} + [1108] ∈ {1108} + [1109] ∈ {1109} + [1110] ∈ {1110} + [1111] ∈ {1111} + [1112] ∈ {1112} + [1113] ∈ {1113} + [1114] ∈ {1114} + [1115] ∈ {1115} + [1116] ∈ {1116} + [1117] ∈ {1117} + [1118] ∈ {1118} + [1119] ∈ {1119} + [1120] ∈ {1120} + [1121] ∈ {1121} + [1122] ∈ {1122} + [1123] ∈ {1123} + [1124] ∈ {1124} + [1125] ∈ {1125} + [1126] ∈ {1126} + [1127] ∈ {1127} + [1128] ∈ {1128} + [1129] ∈ {1129} + [1130] ∈ {1130} + [1131] ∈ {1131} + [1132] ∈ {1132} + [1133] ∈ {1133} + [1134] ∈ {1134} + [1135] ∈ {1135} + [1136] ∈ {1136} + [1137] ∈ {1137} + [1138] ∈ {1138} + [1139] ∈ {1139} + [1140] ∈ {1140} + [1141] ∈ {1141} + [1142] ∈ {1142} + [1143] ∈ {1143} + [1144] ∈ {1144} + [1145] ∈ {1145} + [1146] ∈ {1146} + [1147] ∈ {1147} + [1148] ∈ {1148} + [1149] ∈ {1149} + [1150] ∈ {1150} + [1151] ∈ {1151} + [1152] ∈ {1152} + [1153] ∈ {1153} + [1154] ∈ {1154} + [1155] ∈ {1155} + [1156] ∈ {1156} + [1157] ∈ {1157} + [1158] ∈ {1158} + [1159] ∈ {1159} + [1160] ∈ {1160} + [1161] ∈ {1161} + [1162] ∈ {1162} + [1163] ∈ {1163} + [1164] ∈ {1164} + [1165] ∈ {1165} + [1166] ∈ {1166} + [1167] ∈ {1167} + [1168] ∈ {1168} + [1169] ∈ {1169} + [1170] ∈ {1170} + [1171] ∈ {1171} + [1172] ∈ {1172} + [1173] ∈ {1173} + [1174] ∈ {1174} + [1175] ∈ {1175} + [1176] ∈ {1176} + [1177] ∈ {1177} + [1178] ∈ {1178} + [1179] ∈ {1179} + [1180] ∈ {1180} + [1181] ∈ {1181} + [1182] ∈ {1182} + [1183] ∈ {1183} + [1184] ∈ {1184} + [1185] ∈ {1185} + [1186] ∈ {1186} + [1187] ∈ {1187} + [1188] ∈ {1188} + [1189] ∈ {1189} + [1190] ∈ {1190} + [1191] ∈ {1191} + [1192] ∈ {1192} + [1193] ∈ {1193} + [1194] ∈ {1194} + [1195] ∈ {1195} + [1196] ∈ {1196} + [1197] ∈ {1197} + [1198] ∈ {1198} + [1199] ∈ {1199} + [1200] ∈ {1200} + [1201] ∈ {1201} + [1202] ∈ {1202} + [1203] ∈ {1203} + [1204] ∈ {1204} + [1205] ∈ {1205} + [1206] ∈ {1206} + [1207] ∈ {1207} + [1208] ∈ {1208} + [1209] ∈ {1209} + [1210] ∈ {1210} + [1211] ∈ {1211} + [1212] ∈ {1212} + [1213] ∈ {1213} + [1214] ∈ {1214} + [1215] ∈ {1215} + [1216] ∈ {1216} + [1217] ∈ {1217} + [1218] ∈ {1218} + [1219] ∈ {1219} + [1220] ∈ {1220} + [1221] ∈ {1221} + [1222] ∈ {1222} + [1223] ∈ {1223} + [1224] ∈ {1224} + [1225] ∈ {1225} + [1226] ∈ {1226} + [1227] ∈ {1227} + [1228] ∈ {1228} + [1229] ∈ {1229} + [1230] ∈ {1230} + [1231] ∈ {1231} + [1232] ∈ {1232} + [1233] ∈ {1233} + [1234] ∈ {1234} + [1235] ∈ {1235} + [1236] ∈ {1236} + [1237] ∈ {1237} + [1238] ∈ {1238} + [1239] ∈ {1239} + [1240] ∈ {1240} + [1241] ∈ {1241} + [1242] ∈ {1242} + [1243] ∈ {1243} + [1244] ∈ {1244} + [1245] ∈ {1245} + [1246] ∈ {1246} + [1247] ∈ {1247} + [1248] ∈ {1248} + [1249] ∈ {1249} + [1250] ∈ {1250} + [1251] ∈ {1251} + [1252] ∈ {1252} + [1253] ∈ {1253} + [1254] ∈ {1254} + [1255] ∈ {1255} + [1256] ∈ {1256} + [1257] ∈ {1257} + [1258] ∈ {1258} + [1259] ∈ {1259} + [1260] ∈ {1260} + [1261] ∈ {1261} + [1262] ∈ {1262} + [1263] ∈ {1263} + [1264] ∈ {1264} + [1265] ∈ {1265} + [1266] ∈ {1266} + [1267] ∈ {1267} + [1268] ∈ {1268} + [1269] ∈ {1269} + [1270] ∈ {1270} + [1271] ∈ {1271} + [1272] ∈ {1272} + [1273] ∈ {1273} + [1274] ∈ {1274} + [1275] ∈ {1275} + [1276] ∈ {1276} + [1277] ∈ {1277} + [1278] ∈ {1278} + [1279] ∈ {1279} + [1280] ∈ {1280} + [1281] ∈ {1281} + [1282] ∈ {1282} + [1283] ∈ {1283} + [1284] ∈ {1284} + [1285] ∈ {1285} + [1286] ∈ {1286} + [1287] ∈ {1287} + [1288] ∈ {1288} + [1289] ∈ {1289} + [1290] ∈ {1290} + [1291] ∈ {1291} + [1292] ∈ {1292} + [1293] ∈ {1293} + [1294] ∈ {1294} + [1295] ∈ {1295} + [1296] ∈ {1296} + [1297] ∈ {1297} + [1298] ∈ {1298} + [1299] ∈ {1299} + [1300] ∈ {1300} + [1301] ∈ {1301} + [1302] ∈ {1302} + [1303] ∈ {1303} + [1304] ∈ {1304} + [1305] ∈ {1305} + [1306] ∈ {1306} + [1307] ∈ {1307} + [1308] ∈ {1308} + [1309] ∈ {1309} + [1310] ∈ {1310} + [1311] ∈ {1311} + [1312] ∈ {1312} + [1313] ∈ {1313} + [1314] ∈ {1314} + [1315] ∈ {1315} + [1316] ∈ {1316} + [1317] ∈ {1317} + [1318] ∈ {1318} + [1319] ∈ {1319} + [1320] ∈ {1320} + [1321] ∈ {1321} + [1322] ∈ {1322} + [1323] ∈ {1323} + [1324] ∈ {1324} + [1325] ∈ {1325} + [1326] ∈ {1326} + [1327] ∈ {1327} + [1328] ∈ {1328} + [1329] ∈ {1329} + [1330] ∈ {1330} + [1331] ∈ {1331} + [1332] ∈ {1332} + [1333] ∈ {1333} + [1334] ∈ {1334} + [1335] ∈ {1335} + [1336] ∈ {1336} + [1337] ∈ {1337} + [1338] ∈ {1338} + [1339] ∈ {1339} + [1340] ∈ {1340} + [1341] ∈ {1341} + [1342] ∈ {1342} + [1343] ∈ {1343} + [1344] ∈ {1344} + [1345] ∈ {1345} + [1346] ∈ {1346} + [1347] ∈ {1347} + [1348] ∈ {1348} + [1349] ∈ {1349} + [1350] ∈ {1350} + [1351] ∈ {1351} + [1352] ∈ {1352} + [1353] ∈ {1353} + [1354] ∈ {1354} + [1355] ∈ {1355} + [1356] ∈ {1356} + [1357] ∈ {1357} + [1358] ∈ {1358} + [1359] ∈ {1359} + [1360] ∈ {1360} + [1361] ∈ {1361} + [1362] ∈ {1362} + [1363] ∈ {1363} + [1364] ∈ {1364} + [1365] ∈ {1365} + [1366] ∈ {1366} + [1367] ∈ {1367} + [1368] ∈ {1368} + [1369] ∈ {1369} + [1370] ∈ {1370} + [1371] ∈ {1371} + [1372] ∈ {1372} + [1373] ∈ {1373} + [1374] ∈ {1374} + [1375] ∈ {1375} + [1376] ∈ {1376} + [1377] ∈ {1377} + [1378] ∈ {1378} + [1379] ∈ {1379} + [1380] ∈ {1380} + [1381] ∈ {1381} + [1382] ∈ {1382} + [1383] ∈ {1383} + [1384] ∈ {1384} + [1385] ∈ {1385} + [1386] ∈ {1386} + [1387] ∈ {1387} + [1388] ∈ {1388} + [1389] ∈ {1389} + [1390] ∈ {1390} + [1391] ∈ {1391} + [1392] ∈ {1392} + [1393] ∈ {1393} + [1394] ∈ {1394} + [1395] ∈ {1395} + [1396] ∈ {1396} + [1397] ∈ {1397} + [1398] ∈ {1398} + [1399] ∈ {1399} + [1400] ∈ {1400} + [1401] ∈ {1401} + [1402] ∈ {1402} + [1403] ∈ {1403} + [1404] ∈ {1404} + [1405] ∈ {1405} + [1406] ∈ {1406} + [1407] ∈ {1407} + [1408] ∈ {1408} + [1409] ∈ {1409} + [1410] ∈ {1410} + [1411] ∈ {1411} + [1412] ∈ {1412} + [1413] ∈ {1413} + [1414] ∈ {1414} + [1415] ∈ {1415} + [1416] ∈ {1416} + [1417] ∈ {1417} + [1418] ∈ {1418} + [1419] ∈ {1419} + [1420] ∈ {1420} + [1421] ∈ {1421} + [1422] ∈ {1422} + [1423] ∈ {1423} + [1424] ∈ {1424} + [1425] ∈ {1425} + [1426] ∈ {1426} + [1427] ∈ {1427} + [1428] ∈ {1428} + [1429] ∈ {1429} + [1430] ∈ {1430} + [1431] ∈ {1431} + [1432] ∈ {1432} + [1433] ∈ {1433} + [1434] ∈ {1434} + [1435] ∈ {1435} + [1436] ∈ {1436} + [1437] ∈ {1437} + [1438] ∈ {1438} + [1439] ∈ {1439} + [1440] ∈ {1440} + [1441] ∈ {1441} + [1442] ∈ {1442} + [1443] ∈ {1443} + [1444] ∈ {1444} + [1445] ∈ {1445} + [1446] ∈ {1446} + [1447] ∈ {1447} + [1448] ∈ {1448} + [1449] ∈ {1449} + [1450] ∈ {1450} + [1451] ∈ {1451} + [1452] ∈ {1452} + [1453] ∈ {1453} + [1454] ∈ {1454} + [1455] ∈ {1455} + [1456] ∈ {1456} + [1457] ∈ {1457} + [1458] ∈ {1458} + [1459] ∈ {1459} + [1460] ∈ {1460} + [1461] ∈ {1461} + [1462] ∈ {1462} + [1463] ∈ {1463} + [1464] ∈ {1464} + [1465] ∈ {1465} + [1466] ∈ {1466} + [1467] ∈ {1467} + [1468] ∈ {1468} + [1469] ∈ {1469} + [1470] ∈ {1470} + [1471] ∈ {1471} + [1472] ∈ {1472} + [1473] ∈ {1473} + [1474] ∈ {1474} + [1475] ∈ {1475} + [1476] ∈ {1476} + [1477] ∈ {1477} + [1478] ∈ {1478} + [1479] ∈ {1479} + [1480] ∈ {1480} + [1481] ∈ {1481} + [1482] ∈ {1482} + [1483] ∈ {1483} + [1484] ∈ {1484} + [1485] ∈ {1485} + [1486] ∈ {1486} + [1487] ∈ {1487} + [1488] ∈ {1488} + [1489] ∈ {1489} + [1490] ∈ {1490} + [1491] ∈ {1491} + [1492] ∈ {1492} + [1493] ∈ {1493} + [1494] ∈ {1494} + [1495] ∈ {1495} + [1496] ∈ {1496} + [1497] ∈ {1497} + [1498] ∈ {1498} + [1499] ∈ {1499} + [1500] ∈ {1500} + [1501] ∈ {1501} + [1502] ∈ {1502} + [1503] ∈ {1503} + [1504] ∈ {1504} + [1505] ∈ {1505} + [1506] ∈ {1506} + [1507] ∈ {1507} + [1508] ∈ {1508} + [1509] ∈ {1509} + [1510] ∈ {1510} + [1511] ∈ {1511} + [1512] ∈ {1512} + [1513] ∈ {1513} + [1514] ∈ {1514} + [1515] ∈ {1515} + [1516] ∈ {1516} + [1517] ∈ {1517} + [1518] ∈ {1518} + [1519] ∈ {1519} + [1520] ∈ {1520} + [1521] ∈ {1521} + [1522] ∈ {1522} + [1523] ∈ {1523} + [1524] ∈ {1524} + [1525] ∈ {1525} + [1526] ∈ {1526} + [1527] ∈ {1527} + [1528] ∈ {1528} + [1529] ∈ {1529} + [1530] ∈ {1530} + [1531] ∈ {1531} + [1532] ∈ {1532} + [1533] ∈ {1533} + [1534] ∈ {1534} + [1535] ∈ {1535} + [1536] ∈ {1536} + [1537] ∈ {1537} + [1538] ∈ {1538} + [1539] ∈ {1539} + [1540] ∈ {1540} + [1541] ∈ {1541} + [1542] ∈ {1542} + [1543] ∈ {1543} + [1544] ∈ {1544} + [1545] ∈ {1545} + [1546] ∈ {1546} + [1547] ∈ {1547} + [1548] ∈ {1548} + [1549] ∈ {1549} + [1550] ∈ {1550} + [1551] ∈ {1551} + [1552] ∈ {1552} + [1553] ∈ {1553} + [1554] ∈ {1554} + [1555] ∈ {1555} + [1556] ∈ {1556} + [1557] ∈ {1557} + [1558] ∈ {1558} + [1559] ∈ {1559} + [1560] ∈ {1560} + [1561] ∈ {1561} + [1562] ∈ {1562} + [1563] ∈ {1563} + [1564] ∈ {1564} + [1565] ∈ {1565} + [1566] ∈ {1566} + [1567] ∈ {1567} + [1568] ∈ {1568} + [1569] ∈ {1569} + [1570] ∈ {1570} + [1571] ∈ {1571} + [1572] ∈ {1572} + [1573] ∈ {1573} + [1574] ∈ {1574} + [1575] ∈ {1575} + [1576] ∈ {1576} + [1577] ∈ {1577} + [1578] ∈ {1578} + [1579] ∈ {1579} + [1580] ∈ {1580} + [1581] ∈ {1581} + [1582] ∈ {1582} + [1583] ∈ {1583} + [1584] ∈ {1584} + [1585] ∈ {1585} + [1586] ∈ {1586} + [1587] ∈ {1587} + [1588] ∈ {1588} + [1589] ∈ {1589} + [1590] ∈ {1590} + [1591] ∈ {1591} + [1592] ∈ {1592} + [1593] ∈ {1593} + [1594] ∈ {1594} + [1595] ∈ {1595} + [1596] ∈ {1596} + [1597] ∈ {1597} + [1598] ∈ {1598} + [1599] ∈ {1599} + [1600] ∈ {1600} + [1601] ∈ {1601} + [1602] ∈ {1602} + [1603] ∈ {1603} + [1604] ∈ {1604} + [1605] ∈ {1605} + [1606] ∈ {1606} + [1607] ∈ {1607} + [1608] ∈ {1608} + [1609] ∈ {1609} + [1610] ∈ {1610} + [1611] ∈ {1611} + [1612] ∈ {1612} + [1613] ∈ {1613} + [1614] ∈ {1614} + [1615] ∈ {1615} + [1616] ∈ {1616} + [1617] ∈ {1617} + [1618] ∈ {1618} + [1619] ∈ {1619} + [1620] ∈ {1620} + [1621] ∈ {1621} + [1622] ∈ {1622} + [1623] ∈ {1623} + [1624] ∈ {1624} + [1625] ∈ {1625} + [1626] ∈ {1626} + [1627] ∈ {1627} + [1628] ∈ {1628} + [1629] ∈ {1629} + [1630] ∈ {1630} + [1631] ∈ {1631} + [1632] ∈ {1632} + [1633] ∈ {1633} + [1634] ∈ {1634} + [1635] ∈ {1635} + [1636] ∈ {1636} + [1637] ∈ {1637} + [1638] ∈ {1638} + [1639] ∈ {1639} + [1640] ∈ {1640} + [1641] ∈ {1641} + [1642] ∈ {1642} + [1643] ∈ {1643} + [1644] ∈ {1644} + [1645] ∈ {1645} + [1646] ∈ {1646} + [1647] ∈ {1647} + [1648] ∈ {1648} + [1649] ∈ {1649} + [1650] ∈ {1650} + [1651] ∈ {1651} + [1652] ∈ {1652} + [1653] ∈ {1653} + [1654] ∈ {1654} + [1655] ∈ {1655} + [1656] ∈ {1656} + [1657] ∈ {1657} + [1658] ∈ {1658} + [1659] ∈ {1659} + [1660] ∈ {1660} + [1661] ∈ {1661} + [1662] ∈ {1662} + [1663] ∈ {1663} + [1664] ∈ {1664} + [1665] ∈ {1665} + [1666] ∈ {1666} + [1667] ∈ {1667} + [1668] ∈ {1668} + [1669] ∈ {1669} + [1670] ∈ {1670} + [1671] ∈ {1671} + [1672] ∈ {1672} + [1673] ∈ {1673} + [1674] ∈ {1674} + [1675] ∈ {1675} + [1676] ∈ {1676} + [1677] ∈ {1677} + [1678] ∈ {1678} + [1679] ∈ {1679} + [1680] ∈ {1680} + [1681] ∈ {1681} + [1682] ∈ {1682} + [1683] ∈ {1683} + [1684] ∈ {1684} + [1685] ∈ {1685} + [1686] ∈ {1686} + [1687] ∈ {1687} + [1688] ∈ {1688} + [1689] ∈ {1689} + [1690] ∈ {1690} + [1691] ∈ {1691} + [1692] ∈ {1692} + [1693] ∈ {1693} + [1694] ∈ {1694} + [1695] ∈ {1695} + [1696] ∈ {1696} + [1697] ∈ {1697} + [1698] ∈ {1698} + [1699] ∈ {1699} + [1700] ∈ {1700} + [1701] ∈ {1701} + [1702] ∈ {1702} + [1703] ∈ {1703} + [1704] ∈ {1704} + [1705] ∈ {1705} + [1706] ∈ {1706} + [1707] ∈ {1707} + [1708] ∈ {1708} + [1709] ∈ {1709} + [1710] ∈ {1710} + [1711] ∈ {1711} + [1712] ∈ {1712} + [1713] ∈ {1713} + [1714] ∈ {1714} + [1715] ∈ {1715} + [1716] ∈ {1716} + [1717] ∈ {1717} + [1718] ∈ {1718} + [1719] ∈ {1719} + [1720] ∈ {1720} + [1721] ∈ {1721} + [1722] ∈ {1722} + [1723] ∈ {1723} + [1724] ∈ {1724} + [1725] ∈ {1725} + [1726] ∈ {1726} + [1727] ∈ {1727} + [1728] ∈ {1728} + [1729] ∈ {1729} + [1730] ∈ {1730} + [1731] ∈ {1731} + [1732] ∈ {1732} + [1733] ∈ {1733} + [1734] ∈ {1734} + [1735] ∈ {1735} + [1736] ∈ {1736} + [1737] ∈ {1737} + [1738] ∈ {1738} + [1739] ∈ {1739} + [1740] ∈ {1740} + [1741] ∈ {1741} + [1742] ∈ {1742} + [1743] ∈ {1743} + [1744] ∈ {1744} + [1745] ∈ {1745} + [1746] ∈ {1746} + [1747] ∈ {1747} + [1748] ∈ {1748} + [1749] ∈ {1749} + [1750] ∈ {1750} + [1751] ∈ {1751} + [1752] ∈ {1752} + [1753] ∈ {1753} + [1754] ∈ {1754} + [1755] ∈ {1755} + [1756] ∈ {1756} + [1757] ∈ {1757} + [1758] ∈ {1758} + [1759] ∈ {1759} + [1760] ∈ {1760} + [1761] ∈ {1761} + [1762] ∈ {1762} + [1763] ∈ {1763} + [1764] ∈ {1764} + [1765] ∈ {1765} + [1766] ∈ {1766} + [1767] ∈ {1767} + [1768] ∈ {1768} + [1769] ∈ {1769} + [1770] ∈ {1770} + [1771] ∈ {1771} + [1772] ∈ {1772} + [1773] ∈ {1773} + [1774] ∈ {1774} + [1775] ∈ {1775} + [1776] ∈ {1776} + [1777] ∈ {1777} + [1778] ∈ {1778} + [1779] ∈ {1779} + [1780] ∈ {1780} + [1781] ∈ {1781} + [1782] ∈ {1782} + [1783] ∈ {1783} + [1784] ∈ {1784} + [1785] ∈ {1785} + [1786] ∈ {1786} + [1787] ∈ {1787} + [1788] ∈ {1788} + [1789] ∈ {1789} + [1790] ∈ {1790} + [1791] ∈ {1791} + [1792] ∈ {1792} + [1793] ∈ {1793} + [1794] ∈ {1794} + [1795] ∈ {1795} + [1796] ∈ {1796} + [1797] ∈ {1797} + [1798] ∈ {1798} + [1799] ∈ {1799} + [1800] ∈ {1800} + [1801] ∈ {1801} + [1802] ∈ {1802} + [1803] ∈ {1803} + [1804] ∈ {1804} + [1805] ∈ {1805} + [1806] ∈ {1806} + [1807] ∈ {1807} + [1808] ∈ {1808} + [1809] ∈ {1809} + [1810] ∈ {1810} + [1811] ∈ {1811} + [1812] ∈ {1812} + [1813] ∈ {1813} + [1814] ∈ {1814} + [1815] ∈ {1815} + [1816] ∈ {1816} + [1817] ∈ {1817} + [1818] ∈ {1818} + [1819] ∈ {1819} + [1820] ∈ {1820} + [1821] ∈ {1821} + [1822] ∈ {1822} + [1823] ∈ {1823} + [1824] ∈ {1824} + [1825] ∈ {1825} + [1826] ∈ {1826} + [1827] ∈ {1827} + [1828] ∈ {1828} + [1829] ∈ {1829} + [1830] ∈ {1830} + [1831] ∈ {1831} + [1832] ∈ {1832} + [1833] ∈ {1833} + [1834] ∈ {1834} + [1835] ∈ {1835} + [1836] ∈ {1836} + [1837] ∈ {1837} + [1838] ∈ {1838} + [1839] ∈ {1839} + [1840] ∈ {1840} + [1841] ∈ {1841} + [1842] ∈ {1842} + [1843] ∈ {1843} + [1844] ∈ {1844} + [1845] ∈ {1845} + [1846] ∈ {1846} + [1847] ∈ {1847} + [1848] ∈ {1848} + [1849] ∈ {1849} + [1850] ∈ {1850} + [1851] ∈ {1851} + [1852] ∈ {1852} + [1853] ∈ {1853} + [1854] ∈ {1854} + [1855] ∈ {1855} + [1856] ∈ {1856} + [1857] ∈ {1857} + [1858] ∈ {1858} + [1859] ∈ {1859} + [1860] ∈ {1860} + [1861] ∈ {1861} + [1862] ∈ {1862} + [1863] ∈ {1863} + [1864] ∈ {1864} + [1865] ∈ {1865} + [1866] ∈ {1866} + [1867] ∈ {1867} + [1868] ∈ {1868} + [1869] ∈ {1869} + [1870] ∈ {1870} + [1871] ∈ {1871} + [1872] ∈ {1872} + [1873] ∈ {1873} + [1874] ∈ {1874} + [1875] ∈ {1875} + [1876] ∈ {1876} + [1877] ∈ {1877} + [1878] ∈ {1878} + [1879] ∈ {1879} + [1880] ∈ {1880} + [1881] ∈ {1881} + [1882] ∈ {1882} + [1883] ∈ {1883} + [1884] ∈ {1884} + [1885] ∈ {1885} + [1886] ∈ {1886} + [1887] ∈ {1887} + [1888] ∈ {1888} + [1889] ∈ {1889} + [1890] ∈ {1890} + [1891] ∈ {1891} + [1892] ∈ {1892} + [1893] ∈ {1893} + [1894] ∈ {1894} + [1895] ∈ {1895} + [1896] ∈ {1896} + [1897] ∈ {1897} + [1898] ∈ {1898} + [1899] ∈ {1899} + [1900] ∈ {1900} + [1901] ∈ {1901} + [1902] ∈ {1902} + [1903] ∈ {1903} + [1904] ∈ {1904} + [1905] ∈ {1905} + [1906] ∈ {1906} + [1907] ∈ {1907} + [1908] ∈ {1908} + [1909] ∈ {1909} + [1910] ∈ {1910} + [1911] ∈ {1911} + [1912] ∈ {1912} + [1913] ∈ {1913} + [1914] ∈ {1914} + [1915] ∈ {1915} + [1916] ∈ {1916} + [1917] ∈ {1917} + [1918] ∈ {1918} + [1919] ∈ {1919} + [1920] ∈ {1920} + [1921] ∈ {1921} + [1922] ∈ {1922} + [1923] ∈ {1923} + [1924] ∈ {1924} + [1925] ∈ {1925} + [1926] ∈ {1926} + [1927] ∈ {1927} + [1928] ∈ {1928} + [1929] ∈ {1929} + [1930] ∈ {1930} + [1931] ∈ {1931} + [1932] ∈ {1932} + [1933] ∈ {1933} + [1934] ∈ {1934} + [1935] ∈ {1935} + [1936] ∈ {1936} + [1937] ∈ {1937} + [1938] ∈ {1938} + [1939] ∈ {1939} + [1940] ∈ {1940} + [1941] ∈ {1941} + [1942] ∈ {1942} + [1943] ∈ {1943} + [1944] ∈ {1944} + [1945] ∈ {1945} + [1946] ∈ {1946} + [1947] ∈ {1947} + [1948] ∈ {1948} + [1949] ∈ {1949} + [1950] ∈ {1950} + [1951] ∈ {1951} + [1952] ∈ {1952} + [1953] ∈ {1953} + [1954] ∈ {1954} + [1955] ∈ {1955} + [1956] ∈ {1956} + [1957] ∈ {1957} + [1958] ∈ {1958} + [1959] ∈ {1959} + [1960] ∈ {1960} + [1961] ∈ {1961} + [1962] ∈ {1962} + [1963] ∈ {1963} + [1964] ∈ {1964} + [1965] ∈ {1965} + [1966] ∈ {1966} + [1967] ∈ {1967} + [1968] ∈ {1968} + [1969] ∈ {1969} + [1970] ∈ {1970} + [1971] ∈ {1971} + [1972] ∈ {1972} + [1973] ∈ {1973} + [1974] ∈ {1974} + [1975] ∈ {1975} + [1976] ∈ {1976} + [1977] ∈ {1977} + [1978] ∈ {1978} + [1979] ∈ {1979} + [1980] ∈ {1980} + [1981] ∈ {1981} + [1982] ∈ {1982} + [1983] ∈ {1983} + [1984] ∈ {1984} + [1985] ∈ {1985} + [1986] ∈ {1986} + [1987] ∈ {1987} + [1988] ∈ {1988} + [1989] ∈ {1989} + [1990] ∈ {1990} + [1991] ∈ {1991} + [1992] ∈ {1992} + [1993] ∈ {1993} + [1994] ∈ {1994} + [1995] ∈ {1995} + [1996] ∈ {1996} + [1997] ∈ {1997} + [1998] ∈ {1998} + [1999] ∈ {1999} + [2000] ∈ {2000} + [2001] ∈ {2001} + [2002] ∈ {2002} + [2003] ∈ {2003} + [2004] ∈ {2004} + [2005] ∈ {2005} + [2006] ∈ {2006} + [2007] ∈ {2007} + [2008] ∈ {2008} + [2009] ∈ {2009} + [2010] ∈ {2010} + [2011] ∈ {2011} + [2012] ∈ {2012} + [2013] ∈ {2013} + [2014] ∈ {2014} + [2015] ∈ {2015} + [2016] ∈ {2016} + [2017] ∈ {2017} + [2018] ∈ {2018} + [2019] ∈ {2019} + [2020] ∈ {2020} + [2021] ∈ {2021} + [2022] ∈ {2022} + [2023] ∈ {2023} + [2024] ∈ {2024} + [2025] ∈ {2025} + [2026] ∈ {2026} + [2027] ∈ {2027} + [2028] ∈ {2028} + [2029] ∈ {2029} + [2030] ∈ {2030} + [2031] ∈ {2031} + [2032] ∈ {2032} + [2033] ∈ {2033} + [2034] ∈ {2034} + [2035] ∈ {2035} + [2036] ∈ {2036} + [2037] ∈ {2037} + [2038] ∈ {2038} + [2039] ∈ {2039} + [2040] ∈ {2040} + [2041] ∈ {2041} + [2042] ∈ {2042} + [2043] ∈ {2043} + [2044] ∈ {2044} + [2045] ∈ {2045} + [2046] ∈ {2046} + [2047] ∈ {2047} + [2048] ∈ {2048} + [2049] ∈ {2049} + [2050] ∈ {2050} + [2051] ∈ {2051} + [2052] ∈ {2052} + [2053] ∈ {2053} + [2054] ∈ {2054} + [2055] ∈ {2055} + [2056] ∈ {2056} + [2057] ∈ {2057} + [2058] ∈ {2058} + [2059] ∈ {2059} + [2060] ∈ {2060} + [2061] ∈ {2061} + [2062] ∈ {2062} + [2063] ∈ {2063} + [2064] ∈ {2064} + [2065] ∈ {2065} + [2066] ∈ {2066} + [2067] ∈ {2067} + [2068] ∈ {2068} + [2069] ∈ {2069} + [2070] ∈ {2070} + [2071] ∈ {2071} + [2072] ∈ {2072} + [2073] ∈ {2073} + [2074] ∈ {2074} + [2075] ∈ {2075} + [2076] ∈ {2076} + [2077] ∈ {2077} + [2078] ∈ {2078} + [2079] ∈ {2079} + [2080] ∈ {2080} + [2081] ∈ {2081} + [2082] ∈ {2082} + [2083] ∈ {2083} + [2084] ∈ {2084} + [2085] ∈ {2085} + [2086] ∈ {2086} + [2087] ∈ {2087} + [2088] ∈ {2088} + [2089] ∈ {2089} + [2090] ∈ {2090} + [2091] ∈ {2091} + [2092] ∈ {2092} + [2093] ∈ {2093} + [2094] ∈ {2094} + [2095] ∈ {2095} + [2096] ∈ {2096} + [2097] ∈ {2097} + [2098] ∈ {2098} + [2099] ∈ {2099} + [2100] ∈ {2100} + [2101] ∈ {2101} + [2102] ∈ {2102} + [2103] ∈ {2103} + [2104] ∈ {2104} + [2105] ∈ {2105} + [2106] ∈ {2106} + [2107] ∈ {2107} + [2108] ∈ {2108} + [2109] ∈ {2109} + [2110] ∈ {2110} + [2111] ∈ {2111} + [2112] ∈ {2112} + [2113] ∈ {2113} + [2114] ∈ {2114} + [2115] ∈ {2115} + [2116] ∈ {2116} + [2117] ∈ {2117} + [2118] ∈ {2118} + [2119] ∈ {2119} + [2120] ∈ {2120} + [2121] ∈ {2121} + [2122] ∈ {2122} + [2123] ∈ {2123} + [2124] ∈ {2124} + [2125] ∈ {2125} + [2126] ∈ {2126} + [2127] ∈ {2127} + [2128] ∈ {2128} + [2129] ∈ {2129} + [2130] ∈ {2130} + [2131] ∈ {2131} + [2132] ∈ {2132} + [2133] ∈ {2133} + [2134] ∈ {2134} + [2135] ∈ {2135} + [2136] ∈ {2136} + [2137] ∈ {2137} + [2138] ∈ {2138} + [2139] ∈ {2139} + [2140] ∈ {2140} + [2141] ∈ {2141} + [2142] ∈ {2142} + [2143] ∈ {2143} + [2144] ∈ {2144} + [2145] ∈ {2145} + [2146] ∈ {2146} + [2147] ∈ {2147} + [2148] ∈ {2148} + [2149] ∈ {2149} + [2150] ∈ {2150} + [2151] ∈ {2151} + [2152] ∈ {2152} + [2153] ∈ {2153} + [2154] ∈ {2154} + [2155] ∈ {2155} + [2156] ∈ {2156} + [2157] ∈ {2157} + [2158] ∈ {2158} + [2159] ∈ {2159} + [2160] ∈ {2160} + [2161] ∈ {2161} + [2162] ∈ {2162} + [2163] ∈ {2163} + [2164] ∈ {2164} + [2165] ∈ {2165} + [2166] ∈ {2166} + [2167] ∈ {2167} + [2168] ∈ {2168} + [2169] ∈ {2169} + [2170] ∈ {2170} + [2171] ∈ {2171} + [2172] ∈ {2172} + [2173] ∈ {2173} + [2174] ∈ {2174} + [2175] ∈ {2175} + [2176] ∈ {2176} + [2177] ∈ {2177} + [2178] ∈ {2178} + [2179] ∈ {2179} + [2180] ∈ {2180} + [2181] ∈ {2181} + [2182] ∈ {2182} + [2183] ∈ {2183} + [2184] ∈ {2184} + [2185] ∈ {2185} + [2186] ∈ {2186} + [2187] ∈ {2187} + [2188] ∈ {2188} + [2189] ∈ {2189} + [2190] ∈ {2190} + [2191] ∈ {2191} + [2192] ∈ {2192} + [2193] ∈ {2193} + [2194] ∈ {2194} + [2195] ∈ {2195} + [2196] ∈ {2196} + [2197] ∈ {2197} + [2198] ∈ {2198} + [2199] ∈ {2199} + [2200] ∈ {2200} + [2201] ∈ {2201} + [2202] ∈ {2202} + [2203] ∈ {2203} + [2204] ∈ {2204} + [2205] ∈ {2205} + [2206] ∈ {2206} + [2207] ∈ {2207} + [2208] ∈ {2208} + [2209] ∈ {2209} + [2210] ∈ {2210} + [2211] ∈ {2211} + [2212] ∈ {2212} + [2213] ∈ {2213} + [2214] ∈ {2214} + [2215] ∈ {2215} + [2216] ∈ {2216} + [2217] ∈ {2217} + [2218] ∈ {2218} + [2219] ∈ {2219} + [2220] ∈ {2220} + [2221] ∈ {2221} + [2222] ∈ {2222} + [2223] ∈ {2223} + [2224] ∈ {2224} + [2225] ∈ {2225} + [2226] ∈ {2226} + [2227] ∈ {2227} + [2228] ∈ {2228} + [2229] ∈ {2229} + [2230] ∈ {2230} + [2231] ∈ {2231} + [2232] ∈ {2232} + [2233] ∈ {2233} + [2234] ∈ {2234} + [2235] ∈ {2235} + [2236] ∈ {2236} + [2237] ∈ {2237} + [2238] ∈ {2238} + [2239] ∈ {2239} + [2240] ∈ {2240} + [2241] ∈ {2241} + [2242] ∈ {2242} + [2243] ∈ {2243} + [2244] ∈ {2244} + [2245] ∈ {2245} + [2246] ∈ {2246} + [2247] ∈ {2247} + [2248] ∈ {2248} + [2249] ∈ {2249} + [2250] ∈ {2250} + [2251] ∈ {2251} + [2252] ∈ {2252} + [2253] ∈ {2253} + [2254] ∈ {2254} + [2255] ∈ {2255} + [2256] ∈ {2256} + [2257] ∈ {2257} + [2258] ∈ {2258} + [2259] ∈ {2259} + [2260] ∈ {2260} + [2261] ∈ {2261} + [2262] ∈ {2262} + [2263] ∈ {2263} + [2264] ∈ {2264} + [2265] ∈ {2265} + [2266] ∈ {2266} + [2267] ∈ {2267} + [2268] ∈ {2268} + [2269] ∈ {2269} + [2270] ∈ {2270} + [2271] ∈ {2271} + [2272] ∈ {2272} + [2273] ∈ {2273} + [2274] ∈ {2274} + [2275] ∈ {2275} + [2276] ∈ {2276} + [2277] ∈ {2277} + [2278] ∈ {2278} + [2279] ∈ {2279} + [2280] ∈ {2280} + [2281] ∈ {2281} + [2282] ∈ {2282} + [2283] ∈ {2283} + [2284] ∈ {2284} + [2285] ∈ {2285} + [2286] ∈ {2286} + [2287] ∈ {2287} + [2288] ∈ {2288} + [2289] ∈ {2289} + [2290] ∈ {2290} + [2291] ∈ {2291} + [2292] ∈ {2292} + [2293] ∈ {2293} + [2294] ∈ {2294} + [2295] ∈ {2295} + [2296] ∈ {2296} + [2297] ∈ {2297} + [2298] ∈ {2298} + [2299] ∈ {2299} + [2300] ∈ {2300} + [2301] ∈ {2301} + [2302] ∈ {2302} + [2303] ∈ {2303} + [2304] ∈ {2304} + [2305] ∈ {2305} + [2306] ∈ {2306} + [2307] ∈ {2307} + [2308] ∈ {2308} + [2309] ∈ {2309} + [2310] ∈ {2310} + [2311] ∈ {2311} + [2312] ∈ {2312} + [2313] ∈ {2313} + [2314] ∈ {2314} + [2315] ∈ {2315} + [2316] ∈ {2316} + [2317] ∈ {2317} + [2318] ∈ {2318} + [2319] ∈ {2319} + [2320] ∈ {2320} + [2321] ∈ {2321} + [2322] ∈ {2322} + [2323] ∈ {2323} + [2324] ∈ {2324} + [2325] ∈ {2325} + [2326] ∈ {2326} + [2327] ∈ {2327} + [2328] ∈ {2328} + [2329] ∈ {2329} + [2330] ∈ {2330} + [2331] ∈ {2331} + [2332] ∈ {2332} + [2333] ∈ {2333} + [2334] ∈ {2334} + [2335] ∈ {2335} + [2336] ∈ {2336} + [2337] ∈ {2337} + [2338] ∈ {2338} + [2339] ∈ {2339} + [2340] ∈ {2340} + [2341] ∈ {2341} + [2342] ∈ {2342} + [2343] ∈ {2343} + [2344] ∈ {2344} + [2345] ∈ {2345} + [2346] ∈ {2346} + [2347] ∈ {2347} + [2348] ∈ {2348} + [2349] ∈ {2349} + [2350] ∈ {2350} + [2351] ∈ {2351} + [2352] ∈ {2352} + [2353] ∈ {2353} + [2354] ∈ {2354} + [2355] ∈ {2355} + [2356] ∈ {2356} + [2357] ∈ {2357} + [2358] ∈ {2358} + [2359] ∈ {2359} + [2360] ∈ {2360} + [2361] ∈ {2361} + [2362] ∈ {2362} + [2363] ∈ {2363} + [2364] ∈ {2364} + [2365] ∈ {2365} + [2366] ∈ {2366} + [2367] ∈ {2367} + [2368] ∈ {2368} + [2369] ∈ {2369} + [2370] ∈ {2370} + [2371] ∈ {2371} + [2372] ∈ {2372} + [2373] ∈ {2373} + [2374] ∈ {2374} + [2375] ∈ {2375} + [2376] ∈ {2376} + [2377] ∈ {2377} + [2378] ∈ {2378} + [2379] ∈ {2379} + [2380] ∈ {2380} + [2381] ∈ {2381} + [2382] ∈ {2382} + [2383] ∈ {2383} + [2384] ∈ {2384} + [2385] ∈ {2385} + [2386] ∈ {2386} + [2387] ∈ {2387} + [2388] ∈ {2388} + [2389] ∈ {2389} + [2390] ∈ {2390} + [2391] ∈ {2391} + [2392] ∈ {2392} + [2393] ∈ {2393} + [2394] ∈ {2394} + [2395] ∈ {2395} + [2396] ∈ {2396} + [2397] ∈ {2397} + [2398] ∈ {2398} + [2399] ∈ {2399} + [2400] ∈ {2400} + [2401] ∈ {2401} + [2402] ∈ {2402} + [2403] ∈ {2403} + [2404] ∈ {2404} + [2405] ∈ {2405} + [2406] ∈ {2406} + [2407] ∈ {2407} + [2408] ∈ {2408} + [2409] ∈ {2409} + [2410] ∈ {2410} + [2411] ∈ {2411} + [2412] ∈ {2412} + [2413] ∈ {2413} + [2414] ∈ {2414} + [2415] ∈ {2415} + [2416] ∈ {2416} + [2417] ∈ {2417} + [2418] ∈ {2418} + [2419] ∈ {2419} + [2420] ∈ {2420} + [2421] ∈ {2421} + [2422] ∈ {2422} + [2423] ∈ {2423} + [2424] ∈ {2424} + [2425] ∈ {2425} + [2426] ∈ {2426} + [2427] ∈ {2427} + [2428] ∈ {2428} + [2429] ∈ {2429} + [2430] ∈ {2430} + [2431] ∈ {2431} + [2432] ∈ {2432} + [2433] ∈ {2433} + [2434] ∈ {2434} + [2435] ∈ {2435} + [2436] ∈ {2436} + [2437] ∈ {2437} + [2438] ∈ {2438} + [2439] ∈ {2439} + [2440] ∈ {2440} + [2441] ∈ {2441} + [2442] ∈ {2442} + [2443] ∈ {2443} + [2444] ∈ {2444} + [2445] ∈ {2445} + [2446] ∈ {2446} + [2447] ∈ {2447} + [2448] ∈ {2448} + [2449] ∈ {2449} + [2450] ∈ {2450} + [2451] ∈ {2451} + [2452] ∈ {2452} + [2453] ∈ {2453} + [2454] ∈ {2454} + [2455] ∈ {2455} + [2456] ∈ {2456} + [2457] ∈ {2457} + [2458] ∈ {2458} + [2459] ∈ {2459} + [2460] ∈ {2460} + [2461] ∈ {2461} + [2462] ∈ {2462} + [2463] ∈ {2463} + [2464] ∈ {2464} + [2465] ∈ {2465} + [2466] ∈ {2466} + [2467] ∈ {2467} + [2468] ∈ {2468} + [2469] ∈ {2469} + [2470] ∈ {2470} + [2471] ∈ {2471} + [2472] ∈ {2472} + [2473] ∈ {2473} + [2474] ∈ {2474} + [2475] ∈ {2475} + [2476] ∈ {2476} + [2477] ∈ {2477} + [2478] ∈ {2478} + [2479] ∈ {2479} + [2480] ∈ {2480} + [2481] ∈ {2481} + [2482] ∈ {2482} + [2483] ∈ {2483} + [2484] ∈ {2484} + [2485] ∈ {2485} + [2486] ∈ {2486} + [2487] ∈ {2487} + [2488] ∈ {2488} + [2489] ∈ {2489} + [2490] ∈ {2490} + [2491] ∈ {2491} + [2492] ∈ {2492} + [2493] ∈ {2493} + [2494] ∈ {2494} + [2495] ∈ {2495} + [2496] ∈ {2496} + [2497] ∈ {2497} + [2498] ∈ {2498} + [2499] ∈ {2499} + [2500] ∈ {2500} + [2501] ∈ {2501} + [2502] ∈ {2502} + [2503] ∈ {2503} + [2504] ∈ {2504} + [2505] ∈ {2505} + [2506] ∈ {2506} + [2507] ∈ {2507} + [2508] ∈ {2508} + [2509] ∈ {2509} + [2510] ∈ {2510} + [2511] ∈ {2511} + [2512] ∈ {2512} + [2513] ∈ {2513} + [2514] ∈ {2514} + [2515] ∈ {2515} + [2516] ∈ {2516} + [2517] ∈ {2517} + [2518] ∈ {2518} + [2519] ∈ {2519} + [2520] ∈ {2520} + [2521] ∈ {2521} + [2522] ∈ {2522} + [2523] ∈ {2523} + [2524] ∈ {2524} + [2525] ∈ {2525} + [2526] ∈ {2526} + [2527] ∈ {2527} + [2528] ∈ {2528} + [2529] ∈ {2529} + [2530] ∈ {2530} + [2531] ∈ {2531} + [2532] ∈ {2532} + [2533] ∈ {2533} + [2534] ∈ {2534} + [2535] ∈ {2535} + [2536] ∈ {2536} + [2537] ∈ {2537} + [2538] ∈ {2538} + [2539] ∈ {2539} + [2540] ∈ {2540} + [2541] ∈ {2541} + [2542] ∈ {2542} + [2543] ∈ {2543} + [2544] ∈ {2544} + [2545] ∈ {2545} + [2546] ∈ {2546} + [2547] ∈ {2547} + [2548] ∈ {2548} + [2549] ∈ {2549} + [2550] ∈ {2550} + [2551] ∈ {2551} + [2552] ∈ {2552} + [2553] ∈ {2553} + [2554] ∈ {2554} + [2555] ∈ {2555} + [2556] ∈ {2556} + [2557] ∈ {2557} + [2558] ∈ {2558} + [2559] ∈ {2559} + [2560] ∈ {2560} + [2561] ∈ {2561} + [2562] ∈ {2562} + [2563] ∈ {2563} + [2564] ∈ {2564} + [2565] ∈ {2565} + [2566] ∈ {2566} + [2567] ∈ {2567} + [2568] ∈ {2568} + [2569] ∈ {2569} + [2570] ∈ {2570} + [2571] ∈ {2571} + [2572] ∈ {2572} + [2573] ∈ {2573} + [2574] ∈ {2574} + [2575] ∈ {2575} + [2576] ∈ {2576} + [2577] ∈ {2577} + [2578] ∈ {2578} + [2579] ∈ {2579} + [2580] ∈ {2580} + [2581] ∈ {2581} + [2582] ∈ {2582} + [2583] ∈ {2583} + [2584] ∈ {2584} + [2585] ∈ {2585} + [2586] ∈ {2586} + [2587] ∈ {2587} + [2588] ∈ {2588} + [2589] ∈ {2589} + [2590] ∈ {2590} + [2591] ∈ {2591} + [2592] ∈ {2592} + [2593] ∈ {2593} + [2594] ∈ {2594} + [2595] ∈ {2595} + [2596] ∈ {2596} + [2597] ∈ {2597} + [2598] ∈ {2598} + [2599] ∈ {2599} + [2600] ∈ {2600} + [2601] ∈ {2601} + [2602] ∈ {2602} + [2603] ∈ {2603} + [2604] ∈ {2604} + [2605] ∈ {2605} + [2606] ∈ {2606} + [2607] ∈ {2607} + [2608] ∈ {2608} + [2609] ∈ {2609} + [2610] ∈ {2610} + [2611] ∈ {2611} + [2612] ∈ {2612} + [2613] ∈ {2613} + [2614] ∈ {2614} + [2615] ∈ {2615} + [2616] ∈ {2616} + [2617] ∈ {2617} + [2618] ∈ {2618} + [2619] ∈ {2619} + [2620] ∈ {2620} + [2621] ∈ {2621} + [2622] ∈ {2622} + [2623] ∈ {2623} + [2624] ∈ {2624} + [2625] ∈ {2625} + [2626] ∈ {2626} + [2627] ∈ {2627} + [2628] ∈ {2628} + [2629] ∈ {2629} + [2630] ∈ {2630} + [2631] ∈ {2631} + [2632] ∈ {2632} + [2633] ∈ {2633} + [2634] ∈ {2634} + [2635] ∈ {2635} + [2636] ∈ {2636} + [2637] ∈ {2637} + [2638] ∈ {2638} + [2639] ∈ {2639} + [2640] ∈ {2640} + [2641] ∈ {2641} + [2642] ∈ {2642} + [2643] ∈ {2643} + [2644] ∈ {2644} + [2645] ∈ {2645} + [2646] ∈ {2646} + [2647] ∈ {2647} + [2648] ∈ {2648} + [2649] ∈ {2649} + [2650] ∈ {2650} + [2651] ∈ {2651} + [2652] ∈ {2652} + [2653] ∈ {2653} + [2654] ∈ {2654} + [2655] ∈ {2655} + [2656] ∈ {2656} + [2657] ∈ {2657} + [2658] ∈ {2658} + [2659] ∈ {2659} + [2660] ∈ {2660} + [2661] ∈ {2661} + [2662] ∈ {2662} + [2663] ∈ {2663} + [2664] ∈ {2664} + [2665] ∈ {2665} + [2666] ∈ {2666} + [2667] ∈ {2667} + [2668] ∈ {2668} + [2669] ∈ {2669} + [2670] ∈ {2670} + [2671] ∈ {2671} + [2672] ∈ {2672} + [2673] ∈ {2673} + [2674] ∈ {2674} + [2675] ∈ {2675} + [2676] ∈ {2676} + [2677] ∈ {2677} + [2678] ∈ {2678} + [2679] ∈ {2679} + [2680] ∈ {2680} + [2681] ∈ {2681} + [2682] ∈ {2682} + [2683] ∈ {2683} + [2684] ∈ {2684} + [2685] ∈ {2685} + [2686] ∈ {2686} + [2687] ∈ {2687} + [2688] ∈ {2688} + [2689] ∈ {2689} + [2690] ∈ {2690} + [2691] ∈ {2691} + [2692] ∈ {2692} + [2693] ∈ {2693} + [2694] ∈ {2694} + [2695] ∈ {2695} + [2696] ∈ {2696} + [2697] ∈ {2697} + [2698] ∈ {2698} + [2699] ∈ {2699} + [2700] ∈ {2700} + [2701] ∈ {2701} + [2702] ∈ {2702} + [2703] ∈ {2703} + [2704] ∈ {2704} + [2705] ∈ {2705} + [2706] ∈ {2706} + [2707] ∈ {2707} + [2708] ∈ {2708} + [2709] ∈ {2709} + [2710] ∈ {2710} + [2711] ∈ {2711} + [2712] ∈ {2712} + [2713] ∈ {2713} + [2714] ∈ {2714} + [2715] ∈ {2715} + [2716] ∈ {2716} + [2717] ∈ {2717} + [2718] ∈ {2718} + [2719] ∈ {2719} + [2720] ∈ {2720} + [2721] ∈ {2721} + [2722] ∈ {2722} + [2723] ∈ {2723} + [2724] ∈ {2724} + [2725] ∈ {2725} + [2726] ∈ {2726} + [2727] ∈ {2727} + [2728] ∈ {2728} + [2729] ∈ {2729} + [2730] ∈ {2730} + [2731] ∈ {2731} + [2732] ∈ {2732} + [2733] ∈ {2733} + [2734] ∈ {2734} + [2735] ∈ {2735} + [2736] ∈ {2736} + [2737] ∈ {2737} + [2738] ∈ {2738} + [2739] ∈ {2739} + [2740] ∈ {2740} + [2741] ∈ {2741} + [2742] ∈ {2742} + [2743] ∈ {2743} + [2744] ∈ {2744} + [2745] ∈ {2745} + [2746] ∈ {2746} + [2747] ∈ {2747} + [2748] ∈ {2748} + [2749] ∈ {2749} + [2750] ∈ {2750} + [2751] ∈ {2751} + [2752] ∈ {2752} + [2753] ∈ {2753} + [2754] ∈ {2754} + [2755] ∈ {2755} + [2756] ∈ {2756} + [2757] ∈ {2757} + [2758] ∈ {2758} + [2759] ∈ {2759} + [2760] ∈ {2760} + [2761] ∈ {2761} + [2762] ∈ {2762} + [2763] ∈ {2763} + [2764] ∈ {2764} + [2765] ∈ {2765} + [2766] ∈ {2766} + [2767] ∈ {2767} + [2768] ∈ {2768} + [2769] ∈ {2769} + [2770] ∈ {2770} + [2771] ∈ {2771} + [2772] ∈ {2772} + [2773] ∈ {2773} + [2774] ∈ {2774} + [2775] ∈ {2775} + [2776] ∈ {2776} + [2777] ∈ {2777} + [2778] ∈ {2778} + [2779] ∈ {2779} + [2780] ∈ {2780} + [2781] ∈ {2781} + [2782] ∈ {2782} + [2783] ∈ {2783} + [2784] ∈ {2784} + [2785] ∈ {2785} + [2786] ∈ {2786} + [2787] ∈ {2787} + [2788] ∈ {2788} + [2789] ∈ {2789} + [2790] ∈ {2790} + [2791] ∈ {2791} + [2792] ∈ {2792} + [2793] ∈ {2793} + [2794] ∈ {2794} + [2795] ∈ {2795} + [2796] ∈ {2796} + [2797] ∈ {2797} + [2798] ∈ {2798} + [2799] ∈ {2799} + [2800] ∈ {2800} + [2801] ∈ {2801} + [2802] ∈ {2802} + [2803] ∈ {2803} + [2804] ∈ {2804} + [2805] ∈ {2805} + [2806] ∈ {2806} + [2807] ∈ {2807} + [2808] ∈ {2808} + [2809] ∈ {2809} + [2810] ∈ {2810} + [2811] ∈ {2811} + [2812] ∈ {2812} + [2813] ∈ {2813} + [2814] ∈ {2814} + [2815] ∈ {2815} + [2816] ∈ {2816} + [2817] ∈ {2817} + [2818] ∈ {2818} + [2819] ∈ {2819} + [2820] ∈ {2820} + [2821] ∈ {2821} + [2822] ∈ {2822} + [2823] ∈ {2823} + [2824] ∈ {2824} + [2825] ∈ {2825} + [2826] ∈ {2826} + [2827] ∈ {2827} + [2828] ∈ {2828} + [2829] ∈ {2829} + [2830] ∈ {2830} + [2831] ∈ {2831} + [2832] ∈ {2832} + [2833] ∈ {2833} + [2834] ∈ {2834} + [2835] ∈ {2835} + [2836] ∈ {2836} + [2837] ∈ {2837} + [2838] ∈ {2838} + [2839] ∈ {2839} + [2840] ∈ {2840} + [2841] ∈ {2841} + [2842] ∈ {2842} + [2843] ∈ {2843} + [2844] ∈ {2844} + [2845] ∈ {2845} + [2846] ∈ {2846} + [2847] ∈ {2847} + [2848] ∈ {2848} + [2849] ∈ {2849} + [2850] ∈ {2850} + [2851] ∈ {2851} + [2852] ∈ {2852} + [2853] ∈ {2853} + [2854] ∈ {2854} + [2855] ∈ {2855} + [2856] ∈ {2856} + [2857] ∈ {2857} + [2858] ∈ {2858} + [2859] ∈ {2859} + [2860] ∈ {2860} + [2861] ∈ {2861} + [2862] ∈ {2862} + [2863] ∈ {2863} + [2864] ∈ {2864} + [2865] ∈ {2865} + [2866] ∈ {2866} + [2867] ∈ {2867} + [2868] ∈ {2868} + [2869] ∈ {2869} + [2870] ∈ {2870} + [2871] ∈ {2871} + [2872] ∈ {2872} + [2873] ∈ {2873} + [2874] ∈ {2874} + [2875] ∈ {2875} + [2876] ∈ {2876} + [2877] ∈ {2877} + [2878] ∈ {2878} + [2879] ∈ {2879} + [2880] ∈ {2880} + [2881] ∈ {2881} + [2882] ∈ {2882} + [2883] ∈ {2883} + [2884] ∈ {2884} + [2885] ∈ {2885} + [2886] ∈ {2886} + [2887] ∈ {2887} + [2888] ∈ {2888} + [2889] ∈ {2889} + [2890] ∈ {2890} + [2891] ∈ {2891} + [2892] ∈ {2892} + [2893] ∈ {2893} + [2894] ∈ {2894} + [2895] ∈ {2895} + [2896] ∈ {2896} + [2897] ∈ {2897} + [2898] ∈ {2898} + [2899] ∈ {2899} + [2900] ∈ {2900} + [2901] ∈ {2901} + [2902] ∈ {2902} + [2903] ∈ {2903} + [2904] ∈ {2904} + [2905] ∈ {2905} + [2906] ∈ {2906} + [2907] ∈ {2907} + [2908] ∈ {2908} + [2909] ∈ {2909} + [2910] ∈ {2910} + [2911] ∈ {2911} + [2912] ∈ {2912} + [2913] ∈ {2913} + [2914] ∈ {2914} + [2915] ∈ {2915} + [2916] ∈ {2916} + [2917] ∈ {2917} + [2918] ∈ {2918} + [2919] ∈ {2919} + [2920] ∈ {2920} + [2921] ∈ {2921} + [2922] ∈ {2922} + [2923] ∈ {2923} + [2924] ∈ {2924} + [2925] ∈ {2925} + [2926] ∈ {2926} + [2927] ∈ {2927} + [2928] ∈ {2928} + [2929] ∈ {2929} + [2930] ∈ {2930} + [2931] ∈ {2931} + [2932] ∈ {2932} + [2933] ∈ {2933} + [2934] ∈ {2934} + [2935] ∈ {2935} + [2936] ∈ {2936} + [2937] ∈ {2937} + [2938] ∈ {2938} + [2939] ∈ {2939} + [2940] ∈ {2940} + [2941] ∈ {2941} + [2942] ∈ {2942} + [2943] ∈ {2943} + [2944] ∈ {2944} + [2945] ∈ {2945} + [2946] ∈ {2946} + [2947] ∈ {2947} + [2948] ∈ {2948} + [2949] ∈ {2949} + [2950] ∈ {2950} + [2951] ∈ {2951} + [2952] ∈ {2952} + [2953] ∈ {2953} + [2954] ∈ {2954} + [2955] ∈ {2955} + [2956] ∈ {2956} + [2957] ∈ {2957} + [2958] ∈ {2958} + [2959] ∈ {2959} + [2960] ∈ {2960} + [2961] ∈ {2961} + [2962] ∈ {2962} + [2963] ∈ {2963} + [2964] ∈ {2964} + [2965] ∈ {2965} + [2966] ∈ {2966} + [2967] ∈ {2967} + [2968] ∈ {2968} + [2969] ∈ {2969} + [2970] ∈ {2970} + [2971] ∈ {2971} + [2972] ∈ {2972} + [2973] ∈ {2973} + [2974] ∈ {2974} + [2975] ∈ {2975} + [2976] ∈ {2976} + [2977] ∈ {2977} + [2978] ∈ {2978} + [2979] ∈ {2979} + [2980] ∈ {2980} + [2981] ∈ {2981} + [2982] ∈ {2982} + [2983] ∈ {2983} + [2984] ∈ {2984} + [2985] ∈ {2985} + [2986] ∈ {2986} + [2987] ∈ {2987} + [2988] ∈ {2988} + [2989] ∈ {2989} + [2990] ∈ {2990} + [2991] ∈ {2991} + [2992] ∈ {2992} + [2993] ∈ {2993} + [2994] ∈ {2994} + [2995] ∈ {2995} + [2996] ∈ {2996} + [2997] ∈ {2997} + [2998] ∈ {2998} + [2999] ∈ {2999} +[value] Values at end of function main: +Cannot filter: dumping raw memory (including unchanged variables) + t[0..1] ∈ {0} + [2] ∈ {2} + [3] ∈ {3} + [4] ∈ {4} + [5] ∈ {5} + [6] ∈ {6} + [7] ∈ {7} + [8] ∈ {8} + [9] ∈ {9} + [10] ∈ {10} + [11] ∈ {11} + [12] ∈ {12} + [13] ∈ {13} + [14] ∈ {14} + [15] ∈ {15} + [16] ∈ {16} + [17] ∈ {17} + [18] ∈ {18} + [19] ∈ {19} + [20] ∈ {20} + [21] ∈ {21} + [22] ∈ {22} + [23] ∈ {23} + [24] ∈ {24} + [25] ∈ {25} + [26] ∈ {26} + [27] ∈ {27} + [28] ∈ {28} + [29] ∈ {29} + [30] ∈ {30} + [31] ∈ {31} + [32] ∈ {32} + [33] ∈ {33} + [34] ∈ {34} + [35] ∈ {35} + [36] ∈ {36} + [37] ∈ {37} + [38] ∈ {38} + [39] ∈ {39} + [40] ∈ {40} + [41] ∈ {41} + [42] ∈ {42} + [43] ∈ {43} + [44] ∈ {44} + [45] ∈ {45} + [46] ∈ {46} + [47] ∈ {47} + [48] ∈ {48} + [49] ∈ {49} + [50] ∈ {50} + [51] ∈ {51} + [52] ∈ {52} + [53] ∈ {53} + [54] ∈ {54} + [55] ∈ {55} + [56] ∈ {56} + [57] ∈ {57} + [58] ∈ {58} + [59] ∈ {59} + [60] ∈ {60} + [61] ∈ {61} + [62] ∈ {62} + [63] ∈ {63} + [64] ∈ {64} + [65] ∈ {65} + [66] ∈ {66} + [67] ∈ {67} + [68] ∈ {68} + [69] ∈ {69} + [70] ∈ {70} + [71] ∈ {71} + [72] ∈ {72} + [73] ∈ {73} + [74] ∈ {74} + [75] ∈ {75} + [76] ∈ {76} + [77] ∈ {77} + [78] ∈ {78} + [79] ∈ {79} + [80] ∈ {80} + [81] ∈ {81} + [82] ∈ {82} + [83] ∈ {83} + [84] ∈ {84} + [85] ∈ {85} + [86] ∈ {86} + [87] ∈ {87} + [88] ∈ {88} + [89] ∈ {89} + [90] ∈ {90} + [91] ∈ {91} + [92] ∈ {92} + [93] ∈ {93} + [94] ∈ {94} + [95] ∈ {95} + [96] ∈ {96} + [97] ∈ {97} + [98] ∈ {98} + [99] ∈ {99} + [100] ∈ {100} + [101] ∈ {101} + [102] ∈ {102} + [103] ∈ {103} + [104] ∈ {104} + [105] ∈ {105} + [106] ∈ {106} + [107] ∈ {107} + [108] ∈ {108} + [109] ∈ {109} + [110] ∈ {110} + [111] ∈ {111} + [112] ∈ {112} + [113] ∈ {113} + [114] ∈ {114} + [115] ∈ {115} + [116] ∈ {116} + [117] ∈ {117} + [118] ∈ {118} + [119] ∈ {119} + [120] ∈ {120} + [121] ∈ {121} + [122] ∈ {122} + [123] ∈ {123} + [124] ∈ {124} + [125] ∈ {125} + [126] ∈ {126} + [127] ∈ {127} + [128] ∈ {128} + [129] ∈ {129} + [130] ∈ {130} + [131] ∈ {131} + [132] ∈ {132} + [133] ∈ {133} + [134] ∈ {134} + [135] ∈ {135} + [136] ∈ {136} + [137] ∈ {137} + [138] ∈ {138} + [139] ∈ {139} + [140] ∈ {140} + [141] ∈ {141} + [142] ∈ {142} + [143] ∈ {143} + [144] ∈ {144} + [145] ∈ {145} + [146] ∈ {146} + [147] ∈ {147} + [148] ∈ {148} + [149] ∈ {149} + [150] ∈ {150} + [151] ∈ {151} + [152] ∈ {152} + [153] ∈ {153} + [154] ∈ {154} + [155] ∈ {155} + [156] ∈ {156} + [157] ∈ {157} + [158] ∈ {158} + [159] ∈ {159} + [160] ∈ {160} + [161] ∈ {161} + [162] ∈ {162} + [163] ∈ {163} + [164] ∈ {164} + [165] ∈ {165} + [166] ∈ {166} + [167] ∈ {167} + [168] ∈ {168} + [169] ∈ {169} + [170] ∈ {170} + [171] ∈ {171} + [172] ∈ {172} + [173] ∈ {173} + [174] ∈ {174} + [175] ∈ {175} + [176] ∈ {176} + [177] ∈ {177} + [178] ∈ {178} + [179] ∈ {179} + [180] ∈ {180} + [181] ∈ {181} + [182] ∈ {182} + [183] ∈ {183} + [184] ∈ {184} + [185] ∈ {185} + [186] ∈ {186} + [187] ∈ {187} + [188] ∈ {188} + [189] ∈ {189} + [190] ∈ {190} + [191] ∈ {191} + [192] ∈ {192} + [193] ∈ {193} + [194] ∈ {194} + [195] ∈ {195} + [196] ∈ {196} + [197] ∈ {197} + [198] ∈ {198} + [199] ∈ {199} + [200] ∈ {200} + [201] ∈ {201} + [202] ∈ {202} + [203] ∈ {203} + [204] ∈ {204} + [205] ∈ {205} + [206] ∈ {206} + [207] ∈ {207} + [208] ∈ {208} + [209] ∈ {209} + [210] ∈ {210} + [211] ∈ {211} + [212] ∈ {212} + [213] ∈ {213} + [214] ∈ {214} + [215] ∈ {215} + [216] ∈ {216} + [217] ∈ {217} + [218] ∈ {218} + [219] ∈ {219} + [220] ∈ {220} + [221] ∈ {221} + [222] ∈ {222} + [223] ∈ {223} + [224] ∈ {224} + [225] ∈ {225} + [226] ∈ {226} + [227] ∈ {227} + [228] ∈ {228} + [229] ∈ {229} + [230] ∈ {230} + [231] ∈ {231} + [232] ∈ {232} + [233] ∈ {233} + [234] ∈ {234} + [235] ∈ {235} + [236] ∈ {236} + [237] ∈ {237} + [238] ∈ {238} + [239] ∈ {239} + [240] ∈ {240} + [241] ∈ {241} + [242] ∈ {242} + [243] ∈ {243} + [244] ∈ {244} + [245] ∈ {245} + [246] ∈ {246} + [247] ∈ {247} + [248] ∈ {248} + [249] ∈ {249} + [250] ∈ {250} + [251] ∈ {251} + [252] ∈ {252} + [253] ∈ {253} + [254] ∈ {254} + [255] ∈ {255} + [256] ∈ {256} + [257] ∈ {257} + [258] ∈ {258} + [259] ∈ {259} + [260] ∈ {260} + [261] ∈ {261} + [262] ∈ {262} + [263] ∈ {263} + [264] ∈ {264} + [265] ∈ {265} + [266] ∈ {266} + [267] ∈ {267} + [268] ∈ {268} + [269] ∈ {269} + [270] ∈ {270} + [271] ∈ {271} + [272] ∈ {272} + [273] ∈ {273} + [274] ∈ {274} + [275] ∈ {275} + [276] ∈ {276} + [277] ∈ {277} + [278] ∈ {278} + [279] ∈ {279} + [280] ∈ {280} + [281] ∈ {281} + [282] ∈ {282} + [283] ∈ {283} + [284] ∈ {284} + [285] ∈ {285} + [286] ∈ {286} + [287] ∈ {287} + [288] ∈ {288} + [289] ∈ {289} + [290] ∈ {290} + [291] ∈ {291} + [292] ∈ {292} + [293] ∈ {293} + [294] ∈ {294} + [295] ∈ {295} + [296] ∈ {296} + [297] ∈ {297} + [298] ∈ {298} + [299] ∈ {299} + [300] ∈ {300} + [301] ∈ {301} + [302] ∈ {302} + [303] ∈ {303} + [304] ∈ {304} + [305] ∈ {305} + [306] ∈ {306} + [307] ∈ {307} + [308] ∈ {308} + [309] ∈ {309} + [310] ∈ {310} + [311] ∈ {311} + [312] ∈ {312} + [313] ∈ {313} + [314] ∈ {314} + [315] ∈ {315} + [316] ∈ {316} + [317] ∈ {317} + [318] ∈ {318} + [319] ∈ {319} + [320] ∈ {320} + [321] ∈ {321} + [322] ∈ {322} + [323] ∈ {323} + [324] ∈ {324} + [325] ∈ {325} + [326] ∈ {326} + [327] ∈ {327} + [328] ∈ {328} + [329] ∈ {329} + [330] ∈ {330} + [331] ∈ {331} + [332] ∈ {332} + [333] ∈ {333} + [334] ∈ {334} + [335] ∈ {335} + [336] ∈ {336} + [337] ∈ {337} + [338] ∈ {338} + [339] ∈ {339} + [340] ∈ {340} + [341] ∈ {341} + [342] ∈ {342} + [343] ∈ {343} + [344] ∈ {344} + [345] ∈ {345} + [346] ∈ {346} + [347] ∈ {347} + [348] ∈ {348} + [349] ∈ {349} + [350] ∈ {350} + [351] ∈ {351} + [352] ∈ {352} + [353] ∈ {353} + [354] ∈ {354} + [355] ∈ {355} + [356] ∈ {356} + [357] ∈ {357} + [358] ∈ {358} + [359] ∈ {359} + [360] ∈ {360} + [361] ∈ {361} + [362] ∈ {362} + [363] ∈ {363} + [364] ∈ {364} + [365] ∈ {365} + [366] ∈ {366} + [367] ∈ {367} + [368] ∈ {368} + [369] ∈ {369} + [370] ∈ {370} + [371] ∈ {371} + [372] ∈ {372} + [373] ∈ {373} + [374] ∈ {374} + [375] ∈ {375} + [376] ∈ {376} + [377] ∈ {377} + [378] ∈ {378} + [379] ∈ {379} + [380] ∈ {380} + [381] ∈ {381} + [382] ∈ {382} + [383] ∈ {383} + [384] ∈ {384} + [385] ∈ {385} + [386] ∈ {386} + [387] ∈ {387} + [388] ∈ {388} + [389] ∈ {389} + [390] ∈ {390} + [391] ∈ {391} + [392] ∈ {392} + [393] ∈ {393} + [394] ∈ {394} + [395] ∈ {395} + [396] ∈ {396} + [397] ∈ {397} + [398] ∈ {398} + [399] ∈ {399} + [400] ∈ {400} + [401] ∈ {401} + [402] ∈ {402} + [403] ∈ {403} + [404] ∈ {404} + [405] ∈ {405} + [406] ∈ {406} + [407] ∈ {407} + [408] ∈ {408} + [409] ∈ {409} + [410] ∈ {410} + [411] ∈ {411} + [412] ∈ {412} + [413] ∈ {413} + [414] ∈ {414} + [415] ∈ {415} + [416] ∈ {416} + [417] ∈ {417} + [418] ∈ {418} + [419] ∈ {419} + [420] ∈ {420} + [421] ∈ {421} + [422] ∈ {422} + [423] ∈ {423} + [424] ∈ {424} + [425] ∈ {425} + [426] ∈ {426} + [427] ∈ {427} + [428] ∈ {428} + [429] ∈ {429} + [430] ∈ {430} + [431] ∈ {431} + [432] ∈ {432} + [433] ∈ {433} + [434] ∈ {434} + [435] ∈ {435} + [436] ∈ {436} + [437] ∈ {437} + [438] ∈ {438} + [439] ∈ {439} + [440] ∈ {440} + [441] ∈ {441} + [442] ∈ {442} + [443] ∈ {443} + [444] ∈ {444} + [445] ∈ {445} + [446] ∈ {446} + [447] ∈ {447} + [448] ∈ {448} + [449] ∈ {449} + [450] ∈ {450} + [451] ∈ {451} + [452] ∈ {452} + [453] ∈ {453} + [454] ∈ {454} + [455] ∈ {455} + [456] ∈ {456} + [457] ∈ {457} + [458] ∈ {458} + [459] ∈ {459} + [460] ∈ {460} + [461] ∈ {461} + [462] ∈ {462} + [463] ∈ {463} + [464] ∈ {464} + [465] ∈ {465} + [466] ∈ {466} + [467] ∈ {467} + [468] ∈ {468} + [469] ∈ {469} + [470] ∈ {470} + [471] ∈ {471} + [472] ∈ {472} + [473] ∈ {473} + [474] ∈ {474} + [475] ∈ {475} + [476] ∈ {476} + [477] ∈ {477} + [478] ∈ {478} + [479] ∈ {479} + [480] ∈ {480} + [481] ∈ {481} + [482] ∈ {482} + [483] ∈ {483} + [484] ∈ {484} + [485] ∈ {485} + [486] ∈ {486} + [487] ∈ {487} + [488] ∈ {488} + [489] ∈ {489} + [490] ∈ {490} + [491] ∈ {491} + [492] ∈ {492} + [493] ∈ {493} + [494] ∈ {494} + [495] ∈ {495} + [496] ∈ {496} + [497] ∈ {497} + [498] ∈ {498} + [499] ∈ {499} + [500] ∈ {500} + [501] ∈ {501} + [502] ∈ {502} + [503] ∈ {503} + [504] ∈ {504} + [505] ∈ {505} + [506] ∈ {506} + [507] ∈ {507} + [508] ∈ {508} + [509] ∈ {509} + [510] ∈ {510} + [511] ∈ {511} + [512] ∈ {512} + [513] ∈ {513} + [514] ∈ {514} + [515] ∈ {515} + [516] ∈ {516} + [517] ∈ {517} + [518] ∈ {518} + [519] ∈ {519} + [520] ∈ {520} + [521] ∈ {521} + [522] ∈ {522} + [523] ∈ {523} + [524] ∈ {524} + [525] ∈ {525} + [526] ∈ {526} + [527] ∈ {527} + [528] ∈ {528} + [529] ∈ {529} + [530] ∈ {530} + [531] ∈ {531} + [532] ∈ {532} + [533] ∈ {533} + [534] ∈ {534} + [535] ∈ {535} + [536] ∈ {536} + [537] ∈ {537} + [538] ∈ {538} + [539] ∈ {539} + [540] ∈ {540} + [541] ∈ {541} + [542] ∈ {542} + [543] ∈ {543} + [544] ∈ {544} + [545] ∈ {545} + [546] ∈ {546} + [547] ∈ {547} + [548] ∈ {548} + [549] ∈ {549} + [550] ∈ {550} + [551] ∈ {551} + [552] ∈ {552} + [553] ∈ {553} + [554] ∈ {554} + [555] ∈ {555} + [556] ∈ {556} + [557] ∈ {557} + [558] ∈ {558} + [559] ∈ {559} + [560] ∈ {560} + [561] ∈ {561} + [562] ∈ {562} + [563] ∈ {563} + [564] ∈ {564} + [565] ∈ {565} + [566] ∈ {566} + [567] ∈ {567} + [568] ∈ {568} + [569] ∈ {569} + [570] ∈ {570} + [571] ∈ {571} + [572] ∈ {572} + [573] ∈ {573} + [574] ∈ {574} + [575] ∈ {575} + [576] ∈ {576} + [577] ∈ {577} + [578] ∈ {578} + [579] ∈ {579} + [580] ∈ {580} + [581] ∈ {581} + [582] ∈ {582} + [583] ∈ {583} + [584] ∈ {584} + [585] ∈ {585} + [586] ∈ {586} + [587] ∈ {587} + [588] ∈ {588} + [589] ∈ {589} + [590] ∈ {590} + [591] ∈ {591} + [592] ∈ {592} + [593] ∈ {593} + [594] ∈ {594} + [595] ∈ {595} + [596] ∈ {596} + [597] ∈ {597} + [598] ∈ {598} + [599] ∈ {599} + [600] ∈ {600} + [601] ∈ {601} + [602] ∈ {602} + [603] ∈ {603} + [604] ∈ {604} + [605] ∈ {605} + [606] ∈ {606} + [607] ∈ {607} + [608] ∈ {608} + [609] ∈ {609} + [610] ∈ {610} + [611] ∈ {611} + [612] ∈ {612} + [613] ∈ {613} + [614] ∈ {614} + [615] ∈ {615} + [616] ∈ {616} + [617] ∈ {617} + [618] ∈ {618} + [619] ∈ {619} + [620] ∈ {620} + [621] ∈ {621} + [622] ∈ {622} + [623] ∈ {623} + [624] ∈ {624} + [625] ∈ {625} + [626] ∈ {626} + [627] ∈ {627} + [628] ∈ {628} + [629] ∈ {629} + [630] ∈ {630} + [631] ∈ {631} + [632] ∈ {632} + [633] ∈ {633} + [634] ∈ {634} + [635] ∈ {635} + [636] ∈ {636} + [637] ∈ {637} + [638] ∈ {638} + [639] ∈ {639} + [640] ∈ {640} + [641] ∈ {641} + [642] ∈ {642} + [643] ∈ {643} + [644] ∈ {644} + [645] ∈ {645} + [646] ∈ {646} + [647] ∈ {647} + [648] ∈ {648} + [649] ∈ {649} + [650] ∈ {650} + [651] ∈ {651} + [652] ∈ {652} + [653] ∈ {653} + [654] ∈ {654} + [655] ∈ {655} + [656] ∈ {656} + [657] ∈ {657} + [658] ∈ {658} + [659] ∈ {659} + [660] ∈ {660} + [661] ∈ {661} + [662] ∈ {662} + [663] ∈ {663} + [664] ∈ {664} + [665] ∈ {665} + [666] ∈ {666} + [667] ∈ {667} + [668] ∈ {668} + [669] ∈ {669} + [670] ∈ {670} + [671] ∈ {671} + [672] ∈ {672} + [673] ∈ {673} + [674] ∈ {674} + [675] ∈ {675} + [676] ∈ {676} + [677] ∈ {677} + [678] ∈ {678} + [679] ∈ {679} + [680] ∈ {680} + [681] ∈ {681} + [682] ∈ {682} + [683] ∈ {683} + [684] ∈ {684} + [685] ∈ {685} + [686] ∈ {686} + [687] ∈ {687} + [688] ∈ {688} + [689] ∈ {689} + [690] ∈ {690} + [691] ∈ {691} + [692] ∈ {692} + [693] ∈ {693} + [694] ∈ {694} + [695] ∈ {695} + [696] ∈ {696} + [697] ∈ {697} + [698] ∈ {698} + [699] ∈ {699} + [700] ∈ {700} + [701] ∈ {701} + [702] ∈ {702} + [703] ∈ {703} + [704] ∈ {704} + [705] ∈ {705} + [706] ∈ {706} + [707] ∈ {707} + [708] ∈ {708} + [709] ∈ {709} + [710] ∈ {710} + [711] ∈ {711} + [712] ∈ {712} + [713] ∈ {713} + [714] ∈ {714} + [715] ∈ {715} + [716] ∈ {716} + [717] ∈ {717} + [718] ∈ {718} + [719] ∈ {719} + [720] ∈ {720} + [721] ∈ {721} + [722] ∈ {722} + [723] ∈ {723} + [724] ∈ {724} + [725] ∈ {725} + [726] ∈ {726} + [727] ∈ {727} + [728] ∈ {728} + [729] ∈ {729} + [730] ∈ {730} + [731] ∈ {731} + [732] ∈ {732} + [733] ∈ {733} + [734] ∈ {734} + [735] ∈ {735} + [736] ∈ {736} + [737] ∈ {737} + [738] ∈ {738} + [739] ∈ {739} + [740] ∈ {740} + [741] ∈ {741} + [742] ∈ {742} + [743] ∈ {743} + [744] ∈ {744} + [745] ∈ {745} + [746] ∈ {746} + [747] ∈ {747} + [748] ∈ {748} + [749] ∈ {749} + [750] ∈ {750} + [751] ∈ {751} + [752] ∈ {752} + [753] ∈ {753} + [754] ∈ {754} + [755] ∈ {755} + [756] ∈ {756} + [757] ∈ {757} + [758] ∈ {758} + [759] ∈ {759} + [760] ∈ {760} + [761] ∈ {761} + [762] ∈ {762} + [763] ∈ {763} + [764] ∈ {764} + [765] ∈ {765} + [766] ∈ {766} + [767] ∈ {767} + [768] ∈ {768} + [769] ∈ {769} + [770] ∈ {770} + [771] ∈ {771} + [772] ∈ {772} + [773] ∈ {773} + [774] ∈ {774} + [775] ∈ {775} + [776] ∈ {776} + [777] ∈ {777} + [778] ∈ {778} + [779] ∈ {779} + [780] ∈ {780} + [781] ∈ {781} + [782] ∈ {782} + [783] ∈ {783} + [784] ∈ {784} + [785] ∈ {785} + [786] ∈ {786} + [787] ∈ {787} + [788] ∈ {788} + [789] ∈ {789} + [790] ∈ {790} + [791] ∈ {791} + [792] ∈ {792} + [793] ∈ {793} + [794] ∈ {794} + [795] ∈ {795} + [796] ∈ {796} + [797] ∈ {797} + [798] ∈ {798} + [799] ∈ {799} + [800] ∈ {800} + [801] ∈ {801} + [802] ∈ {802} + [803] ∈ {803} + [804] ∈ {804} + [805] ∈ {805} + [806] ∈ {806} + [807] ∈ {807} + [808] ∈ {808} + [809] ∈ {809} + [810] ∈ {810} + [811] ∈ {811} + [812] ∈ {812} + [813] ∈ {813} + [814] ∈ {814} + [815] ∈ {815} + [816] ∈ {816} + [817] ∈ {817} + [818] ∈ {818} + [819] ∈ {819} + [820] ∈ {820} + [821] ∈ {821} + [822] ∈ {822} + [823] ∈ {823} + [824] ∈ {824} + [825] ∈ {825} + [826] ∈ {826} + [827] ∈ {827} + [828] ∈ {828} + [829] ∈ {829} + [830] ∈ {830} + [831] ∈ {831} + [832] ∈ {832} + [833] ∈ {833} + [834] ∈ {834} + [835] ∈ {835} + [836] ∈ {836} + [837] ∈ {837} + [838] ∈ {838} + [839] ∈ {839} + [840] ∈ {840} + [841] ∈ {841} + [842] ∈ {842} + [843] ∈ {843} + [844] ∈ {844} + [845] ∈ {845} + [846] ∈ {846} + [847] ∈ {847} + [848] ∈ {848} + [849] ∈ {849} + [850] ∈ {850} + [851] ∈ {851} + [852] ∈ {852} + [853] ∈ {853} + [854] ∈ {854} + [855] ∈ {855} + [856] ∈ {856} + [857] ∈ {857} + [858] ∈ {858} + [859] ∈ {859} + [860] ∈ {860} + [861] ∈ {861} + [862] ∈ {862} + [863] ∈ {863} + [864] ∈ {864} + [865] ∈ {865} + [866] ∈ {866} + [867] ∈ {867} + [868] ∈ {868} + [869] ∈ {869} + [870] ∈ {870} + [871] ∈ {871} + [872] ∈ {872} + [873] ∈ {873} + [874] ∈ {874} + [875] ∈ {875} + [876] ∈ {876} + [877] ∈ {877} + [878] ∈ {878} + [879] ∈ {879} + [880] ∈ {880} + [881] ∈ {881} + [882] ∈ {882} + [883] ∈ {883} + [884] ∈ {884} + [885] ∈ {885} + [886] ∈ {886} + [887] ∈ {887} + [888] ∈ {888} + [889] ∈ {889} + [890] ∈ {890} + [891] ∈ {891} + [892] ∈ {892} + [893] ∈ {893} + [894] ∈ {894} + [895] ∈ {895} + [896] ∈ {896} + [897] ∈ {897} + [898] ∈ {898} + [899] ∈ {899} + [900] ∈ {900} + [901] ∈ {901} + [902] ∈ {902} + [903] ∈ {903} + [904] ∈ {904} + [905] ∈ {905} + [906] ∈ {906} + [907] ∈ {907} + [908] ∈ {908} + [909] ∈ {909} + [910] ∈ {910} + [911] ∈ {911} + [912] ∈ {912} + [913] ∈ {913} + [914] ∈ {914} + [915] ∈ {915} + [916] ∈ {916} + [917] ∈ {917} + [918] ∈ {918} + [919] ∈ {919} + [920] ∈ {920} + [921] ∈ {921} + [922] ∈ {922} + [923] ∈ {923} + [924] ∈ {924} + [925] ∈ {925} + [926] ∈ {926} + [927] ∈ {927} + [928] ∈ {928} + [929] ∈ {929} + [930] ∈ {930} + [931] ∈ {931} + [932] ∈ {932} + [933] ∈ {933} + [934] ∈ {934} + [935] ∈ {935} + [936] ∈ {936} + [937] ∈ {937} + [938] ∈ {938} + [939] ∈ {939} + [940] ∈ {940} + [941] ∈ {941} + [942] ∈ {942} + [943] ∈ {943} + [944] ∈ {944} + [945] ∈ {945} + [946] ∈ {946} + [947] ∈ {947} + [948] ∈ {948} + [949] ∈ {949} + [950] ∈ {950} + [951] ∈ {951} + [952] ∈ {952} + [953] ∈ {953} + [954] ∈ {954} + [955] ∈ {955} + [956] ∈ {956} + [957] ∈ {957} + [958] ∈ {958} + [959] ∈ {959} + [960] ∈ {960} + [961] ∈ {961} + [962] ∈ {962} + [963] ∈ {963} + [964] ∈ {964} + [965] ∈ {965} + [966] ∈ {966} + [967] ∈ {967} + [968] ∈ {968} + [969] ∈ {969} + [970] ∈ {970} + [971] ∈ {971} + [972] ∈ {972} + [973] ∈ {973} + [974] ∈ {974} + [975] ∈ {975} + [976] ∈ {976} + [977] ∈ {977} + [978] ∈ {978} + [979] ∈ {979} + [980] ∈ {980} + [981] ∈ {981} + [982] ∈ {982} + [983] ∈ {983} + [984] ∈ {984} + [985] ∈ {985} + [986] ∈ {986} + [987] ∈ {987} + [988] ∈ {988} + [989] ∈ {989} + [990] ∈ {990} + [991] ∈ {991} + [992] ∈ {992} + [993] ∈ {993} + [994] ∈ {994} + [995] ∈ {995} + [996] ∈ {996} + [997] ∈ {997} + [998] ∈ {998} + [999] ∈ {999} + [1000] ∈ {1000} + [1001] ∈ {1001} + [1002] ∈ {1002} + [1003] ∈ {1003} + [1004] ∈ {1004} + [1005] ∈ {1005} + [1006] ∈ {1006} + [1007] ∈ {1007} + [1008] ∈ {1008} + [1009] ∈ {1009} + [1010] ∈ {1010} + [1011] ∈ {1011} + [1012] ∈ {1012} + [1013] ∈ {1013} + [1014] ∈ {1014} + [1015] ∈ {1015} + [1016] ∈ {1016} + [1017] ∈ {1017} + [1018] ∈ {1018} + [1019] ∈ {1019} + [1020] ∈ {1020} + [1021] ∈ {1021} + [1022] ∈ {1022} + [1023] ∈ {1023} + [1024] ∈ {1024} + [1025] ∈ {1025} + [1026] ∈ {1026} + [1027] ∈ {1027} + [1028] ∈ {1028} + [1029] ∈ {1029} + [1030] ∈ {1030} + [1031] ∈ {1031} + [1032] ∈ {1032} + [1033] ∈ {1033} + [1034] ∈ {1034} + [1035] ∈ {1035} + [1036] ∈ {1036} + [1037] ∈ {1037} + [1038] ∈ {1038} + [1039] ∈ {1039} + [1040] ∈ {1040} + [1041] ∈ {1041} + [1042] ∈ {1042} + [1043] ∈ {1043} + [1044] ∈ {1044} + [1045] ∈ {1045} + [1046] ∈ {1046} + [1047] ∈ {1047} + [1048] ∈ {1048} + [1049] ∈ {1049} + [1050] ∈ {1050} + [1051] ∈ {1051} + [1052] ∈ {1052} + [1053] ∈ {1053} + [1054] ∈ {1054} + [1055] ∈ {1055} + [1056] ∈ {1056} + [1057] ∈ {1057} + [1058] ∈ {1058} + [1059] ∈ {1059} + [1060] ∈ {1060} + [1061] ∈ {1061} + [1062] ∈ {1062} + [1063] ∈ {1063} + [1064] ∈ {1064} + [1065] ∈ {1065} + [1066] ∈ {1066} + [1067] ∈ {1067} + [1068] ∈ {1068} + [1069] ∈ {1069} + [1070] ∈ {1070} + [1071] ∈ {1071} + [1072] ∈ {1072} + [1073] ∈ {1073} + [1074] ∈ {1074} + [1075] ∈ {1075} + [1076] ∈ {1076} + [1077] ∈ {1077} + [1078] ∈ {1078} + [1079] ∈ {1079} + [1080] ∈ {1080} + [1081] ∈ {1081} + [1082] ∈ {1082} + [1083] ∈ {1083} + [1084] ∈ {1084} + [1085] ∈ {1085} + [1086] ∈ {1086} + [1087] ∈ {1087} + [1088] ∈ {1088} + [1089] ∈ {1089} + [1090] ∈ {1090} + [1091] ∈ {1091} + [1092] ∈ {1092} + [1093] ∈ {1093} + [1094] ∈ {1094} + [1095] ∈ {1095} + [1096] ∈ {1096} + [1097] ∈ {1097} + [1098] ∈ {1098} + [1099] ∈ {1099} + [1100] ∈ {1100} + [1101] ∈ {1101} + [1102] ∈ {1102} + [1103] ∈ {1103} + [1104] ∈ {1104} + [1105] ∈ {1105} + [1106] ∈ {1106} + [1107] ∈ {1107} + [1108] ∈ {1108} + [1109] ∈ {1109} + [1110] ∈ {1110} + [1111] ∈ {1111} + [1112] ∈ {1112} + [1113] ∈ {1113} + [1114] ∈ {1114} + [1115] ∈ {1115} + [1116] ∈ {1116} + [1117] ∈ {1117} + [1118] ∈ {1118} + [1119] ∈ {1119} + [1120] ∈ {1120} + [1121] ∈ {1121} + [1122] ∈ {1122} + [1123] ∈ {1123} + [1124] ∈ {1124} + [1125] ∈ {1125} + [1126] ∈ {1126} + [1127] ∈ {1127} + [1128] ∈ {1128} + [1129] ∈ {1129} + [1130] ∈ {1130} + [1131] ∈ {1131} + [1132] ∈ {1132} + [1133] ∈ {1133} + [1134] ∈ {1134} + [1135] ∈ {1135} + [1136] ∈ {1136} + [1137] ∈ {1137} + [1138] ∈ {1138} + [1139] ∈ {1139} + [1140] ∈ {1140} + [1141] ∈ {1141} + [1142] ∈ {1142} + [1143] ∈ {1143} + [1144] ∈ {1144} + [1145] ∈ {1145} + [1146] ∈ {1146} + [1147] ∈ {1147} + [1148] ∈ {1148} + [1149] ∈ {1149} + [1150] ∈ {1150} + [1151] ∈ {1151} + [1152] ∈ {1152} + [1153] ∈ {1153} + [1154] ∈ {1154} + [1155] ∈ {1155} + [1156] ∈ {1156} + [1157] ∈ {1157} + [1158] ∈ {1158} + [1159] ∈ {1159} + [1160] ∈ {1160} + [1161] ∈ {1161} + [1162] ∈ {1162} + [1163] ∈ {1163} + [1164] ∈ {1164} + [1165] ∈ {1165} + [1166] ∈ {1166} + [1167] ∈ {1167} + [1168] ∈ {1168} + [1169] ∈ {1169} + [1170] ∈ {1170} + [1171] ∈ {1171} + [1172] ∈ {1172} + [1173] ∈ {1173} + [1174] ∈ {1174} + [1175] ∈ {1175} + [1176] ∈ {1176} + [1177] ∈ {1177} + [1178] ∈ {1178} + [1179] ∈ {1179} + [1180] ∈ {1180} + [1181] ∈ {1181} + [1182] ∈ {1182} + [1183] ∈ {1183} + [1184] ∈ {1184} + [1185] ∈ {1185} + [1186] ∈ {1186} + [1187] ∈ {1187} + [1188] ∈ {1188} + [1189] ∈ {1189} + [1190] ∈ {1190} + [1191] ∈ {1191} + [1192] ∈ {1192} + [1193] ∈ {1193} + [1194] ∈ {1194} + [1195] ∈ {1195} + [1196] ∈ {1196} + [1197] ∈ {1197} + [1198] ∈ {1198} + [1199] ∈ {1199} + [1200] ∈ {1200} + [1201] ∈ {1201} + [1202] ∈ {1202} + [1203] ∈ {1203} + [1204] ∈ {1204} + [1205] ∈ {1205} + [1206] ∈ {1206} + [1207] ∈ {1207} + [1208] ∈ {1208} + [1209] ∈ {1209} + [1210] ∈ {1210} + [1211] ∈ {1211} + [1212] ∈ {1212} + [1213] ∈ {1213} + [1214] ∈ {1214} + [1215] ∈ {1215} + [1216] ∈ {1216} + [1217] ∈ {1217} + [1218] ∈ {1218} + [1219] ∈ {1219} + [1220] ∈ {1220} + [1221] ∈ {1221} + [1222] ∈ {1222} + [1223] ∈ {1223} + [1224] ∈ {1224} + [1225] ∈ {1225} + [1226] ∈ {1226} + [1227] ∈ {1227} + [1228] ∈ {1228} + [1229] ∈ {1229} + [1230] ∈ {1230} + [1231] ∈ {1231} + [1232] ∈ {1232} + [1233] ∈ {1233} + [1234] ∈ {1234} + [1235] ∈ {1235} + [1236] ∈ {1236} + [1237] ∈ {1237} + [1238] ∈ {1238} + [1239] ∈ {1239} + [1240] ∈ {1240} + [1241] ∈ {1241} + [1242] ∈ {1242} + [1243] ∈ {1243} + [1244] ∈ {1244} + [1245] ∈ {1245} + [1246] ∈ {1246} + [1247] ∈ {1247} + [1248] ∈ {1248} + [1249] ∈ {1249} + [1250] ∈ {1250} + [1251] ∈ {1251} + [1252] ∈ {1252} + [1253] ∈ {1253} + [1254] ∈ {1254} + [1255] ∈ {1255} + [1256] ∈ {1256} + [1257] ∈ {1257} + [1258] ∈ {1258} + [1259] ∈ {1259} + [1260] ∈ {1260} + [1261] ∈ {1261} + [1262] ∈ {1262} + [1263] ∈ {1263} + [1264] ∈ {1264} + [1265] ∈ {1265} + [1266] ∈ {1266} + [1267] ∈ {1267} + [1268] ∈ {1268} + [1269] ∈ {1269} + [1270] ∈ {1270} + [1271] ∈ {1271} + [1272] ∈ {1272} + [1273] ∈ {1273} + [1274] ∈ {1274} + [1275] ∈ {1275} + [1276] ∈ {1276} + [1277] ∈ {1277} + [1278] ∈ {1278} + [1279] ∈ {1279} + [1280] ∈ {1280} + [1281] ∈ {1281} + [1282] ∈ {1282} + [1283] ∈ {1283} + [1284] ∈ {1284} + [1285] ∈ {1285} + [1286] ∈ {1286} + [1287] ∈ {1287} + [1288] ∈ {1288} + [1289] ∈ {1289} + [1290] ∈ {1290} + [1291] ∈ {1291} + [1292] ∈ {1292} + [1293] ∈ {1293} + [1294] ∈ {1294} + [1295] ∈ {1295} + [1296] ∈ {1296} + [1297] ∈ {1297} + [1298] ∈ {1298} + [1299] ∈ {1299} + [1300] ∈ {1300} + [1301] ∈ {1301} + [1302] ∈ {1302} + [1303] ∈ {1303} + [1304] ∈ {1304} + [1305] ∈ {1305} + [1306] ∈ {1306} + [1307] ∈ {1307} + [1308] ∈ {1308} + [1309] ∈ {1309} + [1310] ∈ {1310} + [1311] ∈ {1311} + [1312] ∈ {1312} + [1313] ∈ {1313} + [1314] ∈ {1314} + [1315] ∈ {1315} + [1316] ∈ {1316} + [1317] ∈ {1317} + [1318] ∈ {1318} + [1319] ∈ {1319} + [1320] ∈ {1320} + [1321] ∈ {1321} + [1322] ∈ {1322} + [1323] ∈ {1323} + [1324] ∈ {1324} + [1325] ∈ {1325} + [1326] ∈ {1326} + [1327] ∈ {1327} + [1328] ∈ {1328} + [1329] ∈ {1329} + [1330] ∈ {1330} + [1331] ∈ {1331} + [1332] ∈ {1332} + [1333] ∈ {1333} + [1334] ∈ {1334} + [1335] ∈ {1335} + [1336] ∈ {1336} + [1337] ∈ {1337} + [1338] ∈ {1338} + [1339] ∈ {1339} + [1340] ∈ {1340} + [1341] ∈ {1341} + [1342] ∈ {1342} + [1343] ∈ {1343} + [1344] ∈ {1344} + [1345] ∈ {1345} + [1346] ∈ {1346} + [1347] ∈ {1347} + [1348] ∈ {1348} + [1349] ∈ {1349} + [1350] ∈ {1350} + [1351] ∈ {1351} + [1352] ∈ {1352} + [1353] ∈ {1353} + [1354] ∈ {1354} + [1355] ∈ {1355} + [1356] ∈ {1356} + [1357] ∈ {1357} + [1358] ∈ {1358} + [1359] ∈ {1359} + [1360] ∈ {1360} + [1361] ∈ {1361} + [1362] ∈ {1362} + [1363] ∈ {1363} + [1364] ∈ {1364} + [1365] ∈ {1365} + [1366] ∈ {1366} + [1367] ∈ {1367} + [1368] ∈ {1368} + [1369] ∈ {1369} + [1370] ∈ {1370} + [1371] ∈ {1371} + [1372] ∈ {1372} + [1373] ∈ {1373} + [1374] ∈ {1374} + [1375] ∈ {1375} + [1376] ∈ {1376} + [1377] ∈ {1377} + [1378] ∈ {1378} + [1379] ∈ {1379} + [1380] ∈ {1380} + [1381] ∈ {1381} + [1382] ∈ {1382} + [1383] ∈ {1383} + [1384] ∈ {1384} + [1385] ∈ {1385} + [1386] ∈ {1386} + [1387] ∈ {1387} + [1388] ∈ {1388} + [1389] ∈ {1389} + [1390] ∈ {1390} + [1391] ∈ {1391} + [1392] ∈ {1392} + [1393] ∈ {1393} + [1394] ∈ {1394} + [1395] ∈ {1395} + [1396] ∈ {1396} + [1397] ∈ {1397} + [1398] ∈ {1398} + [1399] ∈ {1399} + [1400] ∈ {1400} + [1401] ∈ {1401} + [1402] ∈ {1402} + [1403] ∈ {1403} + [1404] ∈ {1404} + [1405] ∈ {1405} + [1406] ∈ {1406} + [1407] ∈ {1407} + [1408] ∈ {1408} + [1409] ∈ {1409} + [1410] ∈ {1410} + [1411] ∈ {1411} + [1412] ∈ {1412} + [1413] ∈ {1413} + [1414] ∈ {1414} + [1415] ∈ {1415} + [1416] ∈ {1416} + [1417] ∈ {1417} + [1418] ∈ {1418} + [1419] ∈ {1419} + [1420] ∈ {1420} + [1421] ∈ {1421} + [1422] ∈ {1422} + [1423] ∈ {1423} + [1424] ∈ {1424} + [1425] ∈ {1425} + [1426] ∈ {1426} + [1427] ∈ {1427} + [1428] ∈ {1428} + [1429] ∈ {1429} + [1430] ∈ {1430} + [1431] ∈ {1431} + [1432] ∈ {1432} + [1433] ∈ {1433} + [1434] ∈ {1434} + [1435] ∈ {1435} + [1436] ∈ {1436} + [1437] ∈ {1437} + [1438] ∈ {1438} + [1439] ∈ {1439} + [1440] ∈ {1440} + [1441] ∈ {1441} + [1442] ∈ {1442} + [1443] ∈ {1443} + [1444] ∈ {1444} + [1445] ∈ {1445} + [1446] ∈ {1446} + [1447] ∈ {1447} + [1448] ∈ {1448} + [1449] ∈ {1449} + [1450] ∈ {1450} + [1451] ∈ {1451} + [1452] ∈ {1452} + [1453] ∈ {1453} + [1454] ∈ {1454} + [1455] ∈ {1455} + [1456] ∈ {1456} + [1457] ∈ {1457} + [1458] ∈ {1458} + [1459] ∈ {1459} + [1460] ∈ {1460} + [1461] ∈ {1461} + [1462] ∈ {1462} + [1463] ∈ {1463} + [1464] ∈ {1464} + [1465] ∈ {1465} + [1466] ∈ {1466} + [1467] ∈ {1467} + [1468] ∈ {1468} + [1469] ∈ {1469} + [1470] ∈ {1470} + [1471] ∈ {1471} + [1472] ∈ {1472} + [1473] ∈ {1473} + [1474] ∈ {1474} + [1475] ∈ {1475} + [1476] ∈ {1476} + [1477] ∈ {1477} + [1478] ∈ {1478} + [1479] ∈ {1479} + [1480] ∈ {1480} + [1481] ∈ {1481} + [1482] ∈ {1482} + [1483] ∈ {1483} + [1484] ∈ {1484} + [1485] ∈ {1485} + [1486] ∈ {1486} + [1487] ∈ {1487} + [1488] ∈ {1488} + [1489] ∈ {1489} + [1490] ∈ {1490} + [1491] ∈ {1491} + [1492] ∈ {1492} + [1493] ∈ {1493} + [1494] ∈ {1494} + [1495] ∈ {1495} + [1496] ∈ {1496} + [1497] ∈ {1497} + [1498] ∈ {1498} + [1499] ∈ {1499} + [1500] ∈ {1500} + [1501] ∈ {1501} + [1502] ∈ {1502} + [1503] ∈ {1503} + [1504] ∈ {1504} + [1505] ∈ {1505} + [1506] ∈ {1506} + [1507] ∈ {1507} + [1508] ∈ {1508} + [1509] ∈ {1509} + [1510] ∈ {1510} + [1511] ∈ {1511} + [1512] ∈ {1512} + [1513] ∈ {1513} + [1514] ∈ {1514} + [1515] ∈ {1515} + [1516] ∈ {1516} + [1517] ∈ {1517} + [1518] ∈ {1518} + [1519] ∈ {1519} + [1520] ∈ {1520} + [1521] ∈ {1521} + [1522] ∈ {1522} + [1523] ∈ {1523} + [1524] ∈ {1524} + [1525] ∈ {1525} + [1526] ∈ {1526} + [1527] ∈ {1527} + [1528] ∈ {1528} + [1529] ∈ {1529} + [1530] ∈ {1530} + [1531] ∈ {1531} + [1532] ∈ {1532} + [1533] ∈ {1533} + [1534] ∈ {1534} + [1535] ∈ {1535} + [1536] ∈ {1536} + [1537] ∈ {1537} + [1538] ∈ {1538} + [1539] ∈ {1539} + [1540] ∈ {1540} + [1541] ∈ {1541} + [1542] ∈ {1542} + [1543] ∈ {1543} + [1544] ∈ {1544} + [1545] ∈ {1545} + [1546] ∈ {1546} + [1547] ∈ {1547} + [1548] ∈ {1548} + [1549] ∈ {1549} + [1550] ∈ {1550} + [1551] ∈ {1551} + [1552] ∈ {1552} + [1553] ∈ {1553} + [1554] ∈ {1554} + [1555] ∈ {1555} + [1556] ∈ {1556} + [1557] ∈ {1557} + [1558] ∈ {1558} + [1559] ∈ {1559} + [1560] ∈ {1560} + [1561] ∈ {1561} + [1562] ∈ {1562} + [1563] ∈ {1563} + [1564] ∈ {1564} + [1565] ∈ {1565} + [1566] ∈ {1566} + [1567] ∈ {1567} + [1568] ∈ {1568} + [1569] ∈ {1569} + [1570] ∈ {1570} + [1571] ∈ {1571} + [1572] ∈ {1572} + [1573] ∈ {1573} + [1574] ∈ {1574} + [1575] ∈ {1575} + [1576] ∈ {1576} + [1577] ∈ {1577} + [1578] ∈ {1578} + [1579] ∈ {1579} + [1580] ∈ {1580} + [1581] ∈ {1581} + [1582] ∈ {1582} + [1583] ∈ {1583} + [1584] ∈ {1584} + [1585] ∈ {1585} + [1586] ∈ {1586} + [1587] ∈ {1587} + [1588] ∈ {1588} + [1589] ∈ {1589} + [1590] ∈ {1590} + [1591] ∈ {1591} + [1592] ∈ {1592} + [1593] ∈ {1593} + [1594] ∈ {1594} + [1595] ∈ {1595} + [1596] ∈ {1596} + [1597] ∈ {1597} + [1598] ∈ {1598} + [1599] ∈ {1599} + [1600] ∈ {1600} + [1601] ∈ {1601} + [1602] ∈ {1602} + [1603] ∈ {1603} + [1604] ∈ {1604} + [1605] ∈ {1605} + [1606] ∈ {1606} + [1607] ∈ {1607} + [1608] ∈ {1608} + [1609] ∈ {1609} + [1610] ∈ {1610} + [1611] ∈ {1611} + [1612] ∈ {1612} + [1613] ∈ {1613} + [1614] ∈ {1614} + [1615] ∈ {1615} + [1616] ∈ {1616} + [1617] ∈ {1617} + [1618] ∈ {1618} + [1619] ∈ {1619} + [1620] ∈ {1620} + [1621] ∈ {1621} + [1622] ∈ {1622} + [1623] ∈ {1623} + [1624] ∈ {1624} + [1625] ∈ {1625} + [1626] ∈ {1626} + [1627] ∈ {1627} + [1628] ∈ {1628} + [1629] ∈ {1629} + [1630] ∈ {1630} + [1631] ∈ {1631} + [1632] ∈ {1632} + [1633] ∈ {1633} + [1634] ∈ {1634} + [1635] ∈ {1635} + [1636] ∈ {1636} + [1637] ∈ {1637} + [1638] ∈ {1638} + [1639] ∈ {1639} + [1640] ∈ {1640} + [1641] ∈ {1641} + [1642] ∈ {1642} + [1643] ∈ {1643} + [1644] ∈ {1644} + [1645] ∈ {1645} + [1646] ∈ {1646} + [1647] ∈ {1647} + [1648] ∈ {1648} + [1649] ∈ {1649} + [1650] ∈ {1650} + [1651] ∈ {1651} + [1652] ∈ {1652} + [1653] ∈ {1653} + [1654] ∈ {1654} + [1655] ∈ {1655} + [1656] ∈ {1656} + [1657] ∈ {1657} + [1658] ∈ {1658} + [1659] ∈ {1659} + [1660] ∈ {1660} + [1661] ∈ {1661} + [1662] ∈ {1662} + [1663] ∈ {1663} + [1664] ∈ {1664} + [1665] ∈ {1665} + [1666] ∈ {1666} + [1667] ∈ {1667} + [1668] ∈ {1668} + [1669] ∈ {1669} + [1670] ∈ {1670} + [1671] ∈ {1671} + [1672] ∈ {1672} + [1673] ∈ {1673} + [1674] ∈ {1674} + [1675] ∈ {1675} + [1676] ∈ {1676} + [1677] ∈ {1677} + [1678] ∈ {1678} + [1679] ∈ {1679} + [1680] ∈ {1680} + [1681] ∈ {1681} + [1682] ∈ {1682} + [1683] ∈ {1683} + [1684] ∈ {1684} + [1685] ∈ {1685} + [1686] ∈ {1686} + [1687] ∈ {1687} + [1688] ∈ {1688} + [1689] ∈ {1689} + [1690] ∈ {1690} + [1691] ∈ {1691} + [1692] ∈ {1692} + [1693] ∈ {1693} + [1694] ∈ {1694} + [1695] ∈ {1695} + [1696] ∈ {1696} + [1697] ∈ {1697} + [1698] ∈ {1698} + [1699] ∈ {1699} + [1700] ∈ {1700} + [1701] ∈ {1701} + [1702] ∈ {1702} + [1703] ∈ {1703} + [1704] ∈ {1704} + [1705] ∈ {1705} + [1706] ∈ {1706} + [1707] ∈ {1707} + [1708] ∈ {1708} + [1709] ∈ {1709} + [1710] ∈ {1710} + [1711] ∈ {1711} + [1712] ∈ {1712} + [1713] ∈ {1713} + [1714] ∈ {1714} + [1715] ∈ {1715} + [1716] ∈ {1716} + [1717] ∈ {1717} + [1718] ∈ {1718} + [1719] ∈ {1719} + [1720] ∈ {1720} + [1721] ∈ {1721} + [1722] ∈ {1722} + [1723] ∈ {1723} + [1724] ∈ {1724} + [1725] ∈ {1725} + [1726] ∈ {1726} + [1727] ∈ {1727} + [1728] ∈ {1728} + [1729] ∈ {1729} + [1730] ∈ {1730} + [1731] ∈ {1731} + [1732] ∈ {1732} + [1733] ∈ {1733} + [1734] ∈ {1734} + [1735] ∈ {1735} + [1736] ∈ {1736} + [1737] ∈ {1737} + [1738] ∈ {1738} + [1739] ∈ {1739} + [1740] ∈ {1740} + [1741] ∈ {1741} + [1742] ∈ {1742} + [1743] ∈ {1743} + [1744] ∈ {1744} + [1745] ∈ {1745} + [1746] ∈ {1746} + [1747] ∈ {1747} + [1748] ∈ {1748} + [1749] ∈ {1749} + [1750] ∈ {1750} + [1751] ∈ {1751} + [1752] ∈ {1752} + [1753] ∈ {1753} + [1754] ∈ {1754} + [1755] ∈ {1755} + [1756] ∈ {1756} + [1757] ∈ {1757} + [1758] ∈ {1758} + [1759] ∈ {1759} + [1760] ∈ {1760} + [1761] ∈ {1761} + [1762] ∈ {1762} + [1763] ∈ {1763} + [1764] ∈ {1764} + [1765] ∈ {1765} + [1766] ∈ {1766} + [1767] ∈ {1767} + [1768] ∈ {1768} + [1769] ∈ {1769} + [1770] ∈ {1770} + [1771] ∈ {1771} + [1772] ∈ {1772} + [1773] ∈ {1773} + [1774] ∈ {1774} + [1775] ∈ {1775} + [1776] ∈ {1776} + [1777] ∈ {1777} + [1778] ∈ {1778} + [1779] ∈ {1779} + [1780] ∈ {1780} + [1781] ∈ {1781} + [1782] ∈ {1782} + [1783] ∈ {1783} + [1784] ∈ {1784} + [1785] ∈ {1785} + [1786] ∈ {1786} + [1787] ∈ {1787} + [1788] ∈ {1788} + [1789] ∈ {1789} + [1790] ∈ {1790} + [1791] ∈ {1791} + [1792] ∈ {1792} + [1793] ∈ {1793} + [1794] ∈ {1794} + [1795] ∈ {1795} + [1796] ∈ {1796} + [1797] ∈ {1797} + [1798] ∈ {1798} + [1799] ∈ {1799} + [1800] ∈ {1800} + [1801] ∈ {1801} + [1802] ∈ {1802} + [1803] ∈ {1803} + [1804] ∈ {1804} + [1805] ∈ {1805} + [1806] ∈ {1806} + [1807] ∈ {1807} + [1808] ∈ {1808} + [1809] ∈ {1809} + [1810] ∈ {1810} + [1811] ∈ {1811} + [1812] ∈ {1812} + [1813] ∈ {1813} + [1814] ∈ {1814} + [1815] ∈ {1815} + [1816] ∈ {1816} + [1817] ∈ {1817} + [1818] ∈ {1818} + [1819] ∈ {1819} + [1820] ∈ {1820} + [1821] ∈ {1821} + [1822] ∈ {1822} + [1823] ∈ {1823} + [1824] ∈ {1824} + [1825] ∈ {1825} + [1826] ∈ {1826} + [1827] ∈ {1827} + [1828] ∈ {1828} + [1829] ∈ {1829} + [1830] ∈ {1830} + [1831] ∈ {1831} + [1832] ∈ {1832} + [1833] ∈ {1833} + [1834] ∈ {1834} + [1835] ∈ {1835} + [1836] ∈ {1836} + [1837] ∈ {1837} + [1838] ∈ {1838} + [1839] ∈ {1839} + [1840] ∈ {1840} + [1841] ∈ {1841} + [1842] ∈ {1842} + [1843] ∈ {1843} + [1844] ∈ {1844} + [1845] ∈ {1845} + [1846] ∈ {1846} + [1847] ∈ {1847} + [1848] ∈ {1848} + [1849] ∈ {1849} + [1850] ∈ {1850} + [1851] ∈ {1851} + [1852] ∈ {1852} + [1853] ∈ {1853} + [1854] ∈ {1854} + [1855] ∈ {1855} + [1856] ∈ {1856} + [1857] ∈ {1857} + [1858] ∈ {1858} + [1859] ∈ {1859} + [1860] ∈ {1860} + [1861] ∈ {1861} + [1862] ∈ {1862} + [1863] ∈ {1863} + [1864] ∈ {1864} + [1865] ∈ {1865} + [1866] ∈ {1866} + [1867] ∈ {1867} + [1868] ∈ {1868} + [1869] ∈ {1869} + [1870] ∈ {1870} + [1871] ∈ {1871} + [1872] ∈ {1872} + [1873] ∈ {1873} + [1874] ∈ {1874} + [1875] ∈ {1875} + [1876] ∈ {1876} + [1877] ∈ {1877} + [1878] ∈ {1878} + [1879] ∈ {1879} + [1880] ∈ {1880} + [1881] ∈ {1881} + [1882] ∈ {1882} + [1883] ∈ {1883} + [1884] ∈ {1884} + [1885] ∈ {1885} + [1886] ∈ {1886} + [1887] ∈ {1887} + [1888] ∈ {1888} + [1889] ∈ {1889} + [1890] ∈ {1890} + [1891] ∈ {1891} + [1892] ∈ {1892} + [1893] ∈ {1893} + [1894] ∈ {1894} + [1895] ∈ {1895} + [1896] ∈ {1896} + [1897] ∈ {1897} + [1898] ∈ {1898} + [1899] ∈ {1899} + [1900] ∈ {1900} + [1901] ∈ {1901} + [1902] ∈ {1902} + [1903] ∈ {1903} + [1904] ∈ {1904} + [1905] ∈ {1905} + [1906] ∈ {1906} + [1907] ∈ {1907} + [1908] ∈ {1908} + [1909] ∈ {1909} + [1910] ∈ {1910} + [1911] ∈ {1911} + [1912] ∈ {1912} + [1913] ∈ {1913} + [1914] ∈ {1914} + [1915] ∈ {1915} + [1916] ∈ {1916} + [1917] ∈ {1917} + [1918] ∈ {1918} + [1919] ∈ {1919} + [1920] ∈ {1920} + [1921] ∈ {1921} + [1922] ∈ {1922} + [1923] ∈ {1923} + [1924] ∈ {1924} + [1925] ∈ {1925} + [1926] ∈ {1926} + [1927] ∈ {1927} + [1928] ∈ {1928} + [1929] ∈ {1929} + [1930] ∈ {1930} + [1931] ∈ {1931} + [1932] ∈ {1932} + [1933] ∈ {1933} + [1934] ∈ {1934} + [1935] ∈ {1935} + [1936] ∈ {1936} + [1937] ∈ {1937} + [1938] ∈ {1938} + [1939] ∈ {1939} + [1940] ∈ {1940} + [1941] ∈ {1941} + [1942] ∈ {1942} + [1943] ∈ {1943} + [1944] ∈ {1944} + [1945] ∈ {1945} + [1946] ∈ {1946} + [1947] ∈ {1947} + [1948] ∈ {1948} + [1949] ∈ {1949} + [1950] ∈ {1950} + [1951] ∈ {1951} + [1952] ∈ {1952} + [1953] ∈ {1953} + [1954] ∈ {1954} + [1955] ∈ {1955} + [1956] ∈ {1956} + [1957] ∈ {1957} + [1958] ∈ {1958} + [1959] ∈ {1959} + [1960] ∈ {1960} + [1961] ∈ {1961} + [1962] ∈ {1962} + [1963] ∈ {1963} + [1964] ∈ {1964} + [1965] ∈ {1965} + [1966] ∈ {1966} + [1967] ∈ {1967} + [1968] ∈ {1968} + [1969] ∈ {1969} + [1970] ∈ {1970} + [1971] ∈ {1971} + [1972] ∈ {1972} + [1973] ∈ {1973} + [1974] ∈ {1974} + [1975] ∈ {1975} + [1976] ∈ {1976} + [1977] ∈ {1977} + [1978] ∈ {1978} + [1979] ∈ {1979} + [1980] ∈ {1980} + [1981] ∈ {1981} + [1982] ∈ {1982} + [1983] ∈ {1983} + [1984] ∈ {1984} + [1985] ∈ {1985} + [1986] ∈ {1986} + [1987] ∈ {1987} + [1988] ∈ {1988} + [1989] ∈ {1989} + [1990] ∈ {1990} + [1991] ∈ {1991} + [1992] ∈ {1992} + [1993] ∈ {1993} + [1994] ∈ {1994} + [1995] ∈ {1995} + [1996] ∈ {1996} + [1997] ∈ {1997} + [1998] ∈ {1998} + [1999] ∈ {1999} + [2000] ∈ {2000} + [2001] ∈ {2001} + [2002] ∈ {2002} + [2003] ∈ {2003} + [2004] ∈ {2004} + [2005] ∈ {2005} + [2006] ∈ {2006} + [2007] ∈ {2007} + [2008] ∈ {2008} + [2009] ∈ {2009} + [2010] ∈ {2010} + [2011] ∈ {2011} + [2012] ∈ {2012} + [2013] ∈ {2013} + [2014] ∈ {2014} + [2015] ∈ {2015} + [2016] ∈ {2016} + [2017] ∈ {2017} + [2018] ∈ {2018} + [2019] ∈ {2019} + [2020] ∈ {2020} + [2021] ∈ {2021} + [2022] ∈ {2022} + [2023] ∈ {2023} + [2024] ∈ {2024} + [2025] ∈ {2025} + [2026] ∈ {2026} + [2027] ∈ {2027} + [2028] ∈ {2028} + [2029] ∈ {2029} + [2030] ∈ {2030} + [2031] ∈ {2031} + [2032] ∈ {2032} + [2033] ∈ {2033} + [2034] ∈ {2034} + [2035] ∈ {2035} + [2036] ∈ {2036} + [2037] ∈ {2037} + [2038] ∈ {2038} + [2039] ∈ {2039} + [2040] ∈ {2040} + [2041] ∈ {2041} + [2042] ∈ {2042} + [2043] ∈ {2043} + [2044] ∈ {2044} + [2045] ∈ {2045} + [2046] ∈ {2046} + [2047] ∈ {2047} + [2048] ∈ {2048} + [2049] ∈ {2049} + [2050] ∈ {2050} + [2051] ∈ {2051} + [2052] ∈ {2052} + [2053] ∈ {2053} + [2054] ∈ {2054} + [2055] ∈ {2055} + [2056] ∈ {2056} + [2057] ∈ {2057} + [2058] ∈ {2058} + [2059] ∈ {2059} + [2060] ∈ {2060} + [2061] ∈ {2061} + [2062] ∈ {2062} + [2063] ∈ {2063} + [2064] ∈ {2064} + [2065] ∈ {2065} + [2066] ∈ {2066} + [2067] ∈ {2067} + [2068] ∈ {2068} + [2069] ∈ {2069} + [2070] ∈ {2070} + [2071] ∈ {2071} + [2072] ∈ {2072} + [2073] ∈ {2073} + [2074] ∈ {2074} + [2075] ∈ {2075} + [2076] ∈ {2076} + [2077] ∈ {2077} + [2078] ∈ {2078} + [2079] ∈ {2079} + [2080] ∈ {2080} + [2081] ∈ {2081} + [2082] ∈ {2082} + [2083] ∈ {2083} + [2084] ∈ {2084} + [2085] ∈ {2085} + [2086] ∈ {2086} + [2087] ∈ {2087} + [2088] ∈ {2088} + [2089] ∈ {2089} + [2090] ∈ {2090} + [2091] ∈ {2091} + [2092] ∈ {2092} + [2093] ∈ {2093} + [2094] ∈ {2094} + [2095] ∈ {2095} + [2096] ∈ {2096} + [2097] ∈ {2097} + [2098] ∈ {2098} + [2099] ∈ {2099} + [2100] ∈ {2100} + [2101] ∈ {2101} + [2102] ∈ {2102} + [2103] ∈ {2103} + [2104] ∈ {2104} + [2105] ∈ {2105} + [2106] ∈ {2106} + [2107] ∈ {2107} + [2108] ∈ {2108} + [2109] ∈ {2109} + [2110] ∈ {2110} + [2111] ∈ {2111} + [2112] ∈ {2112} + [2113] ∈ {2113} + [2114] ∈ {2114} + [2115] ∈ {2115} + [2116] ∈ {2116} + [2117] ∈ {2117} + [2118] ∈ {2118} + [2119] ∈ {2119} + [2120] ∈ {2120} + [2121] ∈ {2121} + [2122] ∈ {2122} + [2123] ∈ {2123} + [2124] ∈ {2124} + [2125] ∈ {2125} + [2126] ∈ {2126} + [2127] ∈ {2127} + [2128] ∈ {2128} + [2129] ∈ {2129} + [2130] ∈ {2130} + [2131] ∈ {2131} + [2132] ∈ {2132} + [2133] ∈ {2133} + [2134] ∈ {2134} + [2135] ∈ {2135} + [2136] ∈ {2136} + [2137] ∈ {2137} + [2138] ∈ {2138} + [2139] ∈ {2139} + [2140] ∈ {2140} + [2141] ∈ {2141} + [2142] ∈ {2142} + [2143] ∈ {2143} + [2144] ∈ {2144} + [2145] ∈ {2145} + [2146] ∈ {2146} + [2147] ∈ {2147} + [2148] ∈ {2148} + [2149] ∈ {2149} + [2150] ∈ {2150} + [2151] ∈ {2151} + [2152] ∈ {2152} + [2153] ∈ {2153} + [2154] ∈ {2154} + [2155] ∈ {2155} + [2156] ∈ {2156} + [2157] ∈ {2157} + [2158] ∈ {2158} + [2159] ∈ {2159} + [2160] ∈ {2160} + [2161] ∈ {2161} + [2162] ∈ {2162} + [2163] ∈ {2163} + [2164] ∈ {2164} + [2165] ∈ {2165} + [2166] ∈ {2166} + [2167] ∈ {2167} + [2168] ∈ {2168} + [2169] ∈ {2169} + [2170] ∈ {2170} + [2171] ∈ {2171} + [2172] ∈ {2172} + [2173] ∈ {2173} + [2174] ∈ {2174} + [2175] ∈ {2175} + [2176] ∈ {2176} + [2177] ∈ {2177} + [2178] ∈ {2178} + [2179] ∈ {2179} + [2180] ∈ {2180} + [2181] ∈ {2181} + [2182] ∈ {2182} + [2183] ∈ {2183} + [2184] ∈ {2184} + [2185] ∈ {2185} + [2186] ∈ {2186} + [2187] ∈ {2187} + [2188] ∈ {2188} + [2189] ∈ {2189} + [2190] ∈ {2190} + [2191] ∈ {2191} + [2192] ∈ {2192} + [2193] ∈ {2193} + [2194] ∈ {2194} + [2195] ∈ {2195} + [2196] ∈ {2196} + [2197] ∈ {2197} + [2198] ∈ {2198} + [2199] ∈ {2199} + [2200] ∈ {2200} + [2201] ∈ {2201} + [2202] ∈ {2202} + [2203] ∈ {2203} + [2204] ∈ {2204} + [2205] ∈ {2205} + [2206] ∈ {2206} + [2207] ∈ {2207} + [2208] ∈ {2208} + [2209] ∈ {2209} + [2210] ∈ {2210} + [2211] ∈ {2211} + [2212] ∈ {2212} + [2213] ∈ {2213} + [2214] ∈ {2214} + [2215] ∈ {2215} + [2216] ∈ {2216} + [2217] ∈ {2217} + [2218] ∈ {2218} + [2219] ∈ {2219} + [2220] ∈ {2220} + [2221] ∈ {2221} + [2222] ∈ {2222} + [2223] ∈ {2223} + [2224] ∈ {2224} + [2225] ∈ {2225} + [2226] ∈ {2226} + [2227] ∈ {2227} + [2228] ∈ {2228} + [2229] ∈ {2229} + [2230] ∈ {2230} + [2231] ∈ {2231} + [2232] ∈ {2232} + [2233] ∈ {2233} + [2234] ∈ {2234} + [2235] ∈ {2235} + [2236] ∈ {2236} + [2237] ∈ {2237} + [2238] ∈ {2238} + [2239] ∈ {2239} + [2240] ∈ {2240} + [2241] ∈ {2241} + [2242] ∈ {2242} + [2243] ∈ {2243} + [2244] ∈ {2244} + [2245] ∈ {2245} + [2246] ∈ {2246} + [2247] ∈ {2247} + [2248] ∈ {2248} + [2249] ∈ {2249} + [2250] ∈ {2250} + [2251] ∈ {2251} + [2252] ∈ {2252} + [2253] ∈ {2253} + [2254] ∈ {2254} + [2255] ∈ {2255} + [2256] ∈ {2256} + [2257] ∈ {2257} + [2258] ∈ {2258} + [2259] ∈ {2259} + [2260] ∈ {2260} + [2261] ∈ {2261} + [2262] ∈ {2262} + [2263] ∈ {2263} + [2264] ∈ {2264} + [2265] ∈ {2265} + [2266] ∈ {2266} + [2267] ∈ {2267} + [2268] ∈ {2268} + [2269] ∈ {2269} + [2270] ∈ {2270} + [2271] ∈ {2271} + [2272] ∈ {2272} + [2273] ∈ {2273} + [2274] ∈ {2274} + [2275] ∈ {2275} + [2276] ∈ {2276} + [2277] ∈ {2277} + [2278] ∈ {2278} + [2279] ∈ {2279} + [2280] ∈ {2280} + [2281] ∈ {2281} + [2282] ∈ {2282} + [2283] ∈ {2283} + [2284] ∈ {2284} + [2285] ∈ {2285} + [2286] ∈ {2286} + [2287] ∈ {2287} + [2288] ∈ {2288} + [2289] ∈ {2289} + [2290] ∈ {2290} + [2291] ∈ {2291} + [2292] ∈ {2292} + [2293] ∈ {2293} + [2294] ∈ {2294} + [2295] ∈ {2295} + [2296] ∈ {2296} + [2297] ∈ {2297} + [2298] ∈ {2298} + [2299] ∈ {2299} + [2300] ∈ {2300} + [2301] ∈ {2301} + [2302] ∈ {2302} + [2303] ∈ {2303} + [2304] ∈ {2304} + [2305] ∈ {2305} + [2306] ∈ {2306} + [2307] ∈ {2307} + [2308] ∈ {2308} + [2309] ∈ {2309} + [2310] ∈ {2310} + [2311] ∈ {2311} + [2312] ∈ {2312} + [2313] ∈ {2313} + [2314] ∈ {2314} + [2315] ∈ {2315} + [2316] ∈ {2316} + [2317] ∈ {2317} + [2318] ∈ {2318} + [2319] ∈ {2319} + [2320] ∈ {2320} + [2321] ∈ {2321} + [2322] ∈ {2322} + [2323] ∈ {2323} + [2324] ∈ {2324} + [2325] ∈ {2325} + [2326] ∈ {2326} + [2327] ∈ {2327} + [2328] ∈ {2328} + [2329] ∈ {2329} + [2330] ∈ {2330} + [2331] ∈ {2331} + [2332] ∈ {2332} + [2333] ∈ {2333} + [2334] ∈ {2334} + [2335] ∈ {2335} + [2336] ∈ {2336} + [2337] ∈ {2337} + [2338] ∈ {2338} + [2339] ∈ {2339} + [2340] ∈ {2340} + [2341] ∈ {2341} + [2342] ∈ {2342} + [2343] ∈ {2343} + [2344] ∈ {2344} + [2345] ∈ {2345} + [2346] ∈ {2346} + [2347] ∈ {2347} + [2348] ∈ {2348} + [2349] ∈ {2349} + [2350] ∈ {2350} + [2351] ∈ {2351} + [2352] ∈ {2352} + [2353] ∈ {2353} + [2354] ∈ {2354} + [2355] ∈ {2355} + [2356] ∈ {2356} + [2357] ∈ {2357} + [2358] ∈ {2358} + [2359] ∈ {2359} + [2360] ∈ {2360} + [2361] ∈ {2361} + [2362] ∈ {2362} + [2363] ∈ {2363} + [2364] ∈ {2364} + [2365] ∈ {2365} + [2366] ∈ {2366} + [2367] ∈ {2367} + [2368] ∈ {2368} + [2369] ∈ {2369} + [2370] ∈ {2370} + [2371] ∈ {2371} + [2372] ∈ {2372} + [2373] ∈ {2373} + [2374] ∈ {2374} + [2375] ∈ {2375} + [2376] ∈ {2376} + [2377] ∈ {2377} + [2378] ∈ {2378} + [2379] ∈ {2379} + [2380] ∈ {2380} + [2381] ∈ {2381} + [2382] ∈ {2382} + [2383] ∈ {2383} + [2384] ∈ {2384} + [2385] ∈ {2385} + [2386] ∈ {2386} + [2387] ∈ {2387} + [2388] ∈ {2388} + [2389] ∈ {2389} + [2390] ∈ {2390} + [2391] ∈ {2391} + [2392] ∈ {2392} + [2393] ∈ {2393} + [2394] ∈ {2394} + [2395] ∈ {2395} + [2396] ∈ {2396} + [2397] ∈ {2397} + [2398] ∈ {2398} + [2399] ∈ {2399} + [2400] ∈ {2400} + [2401] ∈ {2401} + [2402] ∈ {2402} + [2403] ∈ {2403} + [2404] ∈ {2404} + [2405] ∈ {2405} + [2406] ∈ {2406} + [2407] ∈ {2407} + [2408] ∈ {2408} + [2409] ∈ {2409} + [2410] ∈ {2410} + [2411] ∈ {2411} + [2412] ∈ {2412} + [2413] ∈ {2413} + [2414] ∈ {2414} + [2415] ∈ {2415} + [2416] ∈ {2416} + [2417] ∈ {2417} + [2418] ∈ {2418} + [2419] ∈ {2419} + [2420] ∈ {2420} + [2421] ∈ {2421} + [2422] ∈ {2422} + [2423] ∈ {2423} + [2424] ∈ {2424} + [2425] ∈ {2425} + [2426] ∈ {2426} + [2427] ∈ {2427} + [2428] ∈ {2428} + [2429] ∈ {2429} + [2430] ∈ {2430} + [2431] ∈ {2431} + [2432] ∈ {2432} + [2433] ∈ {2433} + [2434] ∈ {2434} + [2435] ∈ {2435} + [2436] ∈ {2436} + [2437] ∈ {2437} + [2438] ∈ {2438} + [2439] ∈ {2439} + [2440] ∈ {2440} + [2441] ∈ {2441} + [2442] ∈ {2442} + [2443] ∈ {2443} + [2444] ∈ {2444} + [2445] ∈ {2445} + [2446] ∈ {2446} + [2447] ∈ {2447} + [2448] ∈ {2448} + [2449] ∈ {2449} + [2450] ∈ {2450} + [2451] ∈ {2451} + [2452] ∈ {2452} + [2453] ∈ {2453} + [2454] ∈ {2454} + [2455] ∈ {2455} + [2456] ∈ {2456} + [2457] ∈ {2457} + [2458] ∈ {2458} + [2459] ∈ {2459} + [2460] ∈ {2460} + [2461] ∈ {2461} + [2462] ∈ {2462} + [2463] ∈ {2463} + [2464] ∈ {2464} + [2465] ∈ {2465} + [2466] ∈ {2466} + [2467] ∈ {2467} + [2468] ∈ {2468} + [2469] ∈ {2469} + [2470] ∈ {2470} + [2471] ∈ {2471} + [2472] ∈ {2472} + [2473] ∈ {2473} + [2474] ∈ {2474} + [2475] ∈ {2475} + [2476] ∈ {2476} + [2477] ∈ {2477} + [2478] ∈ {2478} + [2479] ∈ {2479} + [2480] ∈ {2480} + [2481] ∈ {2481} + [2482] ∈ {2482} + [2483] ∈ {2483} + [2484] ∈ {2484} + [2485] ∈ {2485} + [2486] ∈ {2486} + [2487] ∈ {2487} + [2488] ∈ {2488} + [2489] ∈ {2489} + [2490] ∈ {2490} + [2491] ∈ {2491} + [2492] ∈ {2492} + [2493] ∈ {2493} + [2494] ∈ {2494} + [2495] ∈ {2495} + [2496] ∈ {2496} + [2497] ∈ {2497} + [2498] ∈ {2498} + [2499] ∈ {2499} + [2500] ∈ {2500} + [2501] ∈ {2501} + [2502] ∈ {2502} + [2503] ∈ {2503} + [2504] ∈ {2504} + [2505] ∈ {2505} + [2506] ∈ {2506} + [2507] ∈ {2507} + [2508] ∈ {2508} + [2509] ∈ {2509} + [2510] ∈ {2510} + [2511] ∈ {2511} + [2512] ∈ {2512} + [2513] ∈ {2513} + [2514] ∈ {2514} + [2515] ∈ {2515} + [2516] ∈ {2516} + [2517] ∈ {2517} + [2518] ∈ {2518} + [2519] ∈ {2519} + [2520] ∈ {2520} + [2521] ∈ {2521} + [2522] ∈ {2522} + [2523] ∈ {2523} + [2524] ∈ {2524} + [2525] ∈ {2525} + [2526] ∈ {2526} + [2527] ∈ {2527} + [2528] ∈ {2528} + [2529] ∈ {2529} + [2530] ∈ {2530} + [2531] ∈ {2531} + [2532] ∈ {2532} + [2533] ∈ {2533} + [2534] ∈ {2534} + [2535] ∈ {2535} + [2536] ∈ {2536} + [2537] ∈ {2537} + [2538] ∈ {2538} + [2539] ∈ {2539} + [2540] ∈ {2540} + [2541] ∈ {2541} + [2542] ∈ {2542} + [2543] ∈ {2543} + [2544] ∈ {2544} + [2545] ∈ {2545} + [2546] ∈ {2546} + [2547] ∈ {2547} + [2548] ∈ {2548} + [2549] ∈ {2549} + [2550] ∈ {2550} + [2551] ∈ {2551} + [2552] ∈ {2552} + [2553] ∈ {2553} + [2554] ∈ {2554} + [2555] ∈ {2555} + [2556] ∈ {2556} + [2557] ∈ {2557} + [2558] ∈ {2558} + [2559] ∈ {2559} + [2560] ∈ {2560} + [2561] ∈ {2561} + [2562] ∈ {2562} + [2563] ∈ {2563} + [2564] ∈ {2564} + [2565] ∈ {2565} + [2566] ∈ {2566} + [2567] ∈ {2567} + [2568] ∈ {2568} + [2569] ∈ {2569} + [2570] ∈ {2570} + [2571] ∈ {2571} + [2572] ∈ {2572} + [2573] ∈ {2573} + [2574] ∈ {2574} + [2575] ∈ {2575} + [2576] ∈ {2576} + [2577] ∈ {2577} + [2578] ∈ {2578} + [2579] ∈ {2579} + [2580] ∈ {2580} + [2581] ∈ {2581} + [2582] ∈ {2582} + [2583] ∈ {2583} + [2584] ∈ {2584} + [2585] ∈ {2585} + [2586] ∈ {2586} + [2587] ∈ {2587} + [2588] ∈ {2588} + [2589] ∈ {2589} + [2590] ∈ {2590} + [2591] ∈ {2591} + [2592] ∈ {2592} + [2593] ∈ {2593} + [2594] ∈ {2594} + [2595] ∈ {2595} + [2596] ∈ {2596} + [2597] ∈ {2597} + [2598] ∈ {2598} + [2599] ∈ {2599} + [2600] ∈ {2600} + [2601] ∈ {2601} + [2602] ∈ {2602} + [2603] ∈ {2603} + [2604] ∈ {2604} + [2605] ∈ {2605} + [2606] ∈ {2606} + [2607] ∈ {2607} + [2608] ∈ {2608} + [2609] ∈ {2609} + [2610] ∈ {2610} + [2611] ∈ {2611} + [2612] ∈ {2612} + [2613] ∈ {2613} + [2614] ∈ {2614} + [2615] ∈ {2615} + [2616] ∈ {2616} + [2617] ∈ {2617} + [2618] ∈ {2618} + [2619] ∈ {2619} + [2620] ∈ {2620} + [2621] ∈ {2621} + [2622] ∈ {2622} + [2623] ∈ {2623} + [2624] ∈ {2624} + [2625] ∈ {2625} + [2626] ∈ {2626} + [2627] ∈ {2627} + [2628] ∈ {2628} + [2629] ∈ {2629} + [2630] ∈ {2630} + [2631] ∈ {2631} + [2632] ∈ {2632} + [2633] ∈ {2633} + [2634] ∈ {2634} + [2635] ∈ {2635} + [2636] ∈ {2636} + [2637] ∈ {2637} + [2638] ∈ {2638} + [2639] ∈ {2639} + [2640] ∈ {2640} + [2641] ∈ {2641} + [2642] ∈ {2642} + [2643] ∈ {2643} + [2644] ∈ {2644} + [2645] ∈ {2645} + [2646] ∈ {2646} + [2647] ∈ {2647} + [2648] ∈ {2648} + [2649] ∈ {2649} + [2650] ∈ {2650} + [2651] ∈ {2651} + [2652] ∈ {2652} + [2653] ∈ {2653} + [2654] ∈ {2654} + [2655] ∈ {2655} + [2656] ∈ {2656} + [2657] ∈ {2657} + [2658] ∈ {2658} + [2659] ∈ {2659} + [2660] ∈ {2660} + [2661] ∈ {2661} + [2662] ∈ {2662} + [2663] ∈ {2663} + [2664] ∈ {2664} + [2665] ∈ {2665} + [2666] ∈ {2666} + [2667] ∈ {2667} + [2668] ∈ {2668} + [2669] ∈ {2669} + [2670] ∈ {2670} + [2671] ∈ {2671} + [2672] ∈ {2672} + [2673] ∈ {2673} + [2674] ∈ {2674} + [2675] ∈ {2675} + [2676] ∈ {2676} + [2677] ∈ {2677} + [2678] ∈ {2678} + [2679] ∈ {2679} + [2680] ∈ {2680} + [2681] ∈ {2681} + [2682] ∈ {2682} + [2683] ∈ {2683} + [2684] ∈ {2684} + [2685] ∈ {2685} + [2686] ∈ {2686} + [2687] ∈ {2687} + [2688] ∈ {2688} + [2689] ∈ {2689} + [2690] ∈ {2690} + [2691] ∈ {2691} + [2692] ∈ {2692} + [2693] ∈ {2693} + [2694] ∈ {2694} + [2695] ∈ {2695} + [2696] ∈ {2696} + [2697] ∈ {2697} + [2698] ∈ {2698} + [2699] ∈ {2699} + [2700] ∈ {2700} + [2701] ∈ {2701} + [2702] ∈ {2702} + [2703] ∈ {2703} + [2704] ∈ {2704} + [2705] ∈ {2705} + [2706] ∈ {2706} + [2707] ∈ {2707} + [2708] ∈ {2708} + [2709] ∈ {2709} + [2710] ∈ {2710} + [2711] ∈ {2711} + [2712] ∈ {2712} + [2713] ∈ {2713} + [2714] ∈ {2714} + [2715] ∈ {2715} + [2716] ∈ {2716} + [2717] ∈ {2717} + [2718] ∈ {2718} + [2719] ∈ {2719} + [2720] ∈ {2720} + [2721] ∈ {2721} + [2722] ∈ {2722} + [2723] ∈ {2723} + [2724] ∈ {2724} + [2725] ∈ {2725} + [2726] ∈ {2726} + [2727] ∈ {2727} + [2728] ∈ {2728} + [2729] ∈ {2729} + [2730] ∈ {2730} + [2731] ∈ {2731} + [2732] ∈ {2732} + [2733] ∈ {2733} + [2734] ∈ {2734} + [2735] ∈ {2735} + [2736] ∈ {2736} + [2737] ∈ {2737} + [2738] ∈ {2738} + [2739] ∈ {2739} + [2740] ∈ {2740} + [2741] ∈ {2741} + [2742] ∈ {2742} + [2743] ∈ {2743} + [2744] ∈ {2744} + [2745] ∈ {2745} + [2746] ∈ {2746} + [2747] ∈ {2747} + [2748] ∈ {2748} + [2749] ∈ {2749} + [2750] ∈ {2750} + [2751] ∈ {2751} + [2752] ∈ {2752} + [2753] ∈ {2753} + [2754] ∈ {2754} + [2755] ∈ {2755} + [2756] ∈ {2756} + [2757] ∈ {2757} + [2758] ∈ {2758} + [2759] ∈ {2759} + [2760] ∈ {2760} + [2761] ∈ {2761} + [2762] ∈ {2762} + [2763] ∈ {2763} + [2764] ∈ {2764} + [2765] ∈ {2765} + [2766] ∈ {2766} + [2767] ∈ {2767} + [2768] ∈ {2768} + [2769] ∈ {2769} + [2770] ∈ {2770} + [2771] ∈ {2771} + [2772] ∈ {2772} + [2773] ∈ {2773} + [2774] ∈ {2774} + [2775] ∈ {2775} + [2776] ∈ {2776} + [2777] ∈ {2777} + [2778] ∈ {2778} + [2779] ∈ {2779} + [2780] ∈ {2780} + [2781] ∈ {2781} + [2782] ∈ {2782} + [2783] ∈ {2783} + [2784] ∈ {2784} + [2785] ∈ {2785} + [2786] ∈ {2786} + [2787] ∈ {2787} + [2788] ∈ {2788} + [2789] ∈ {2789} + [2790] ∈ {2790} + [2791] ∈ {2791} + [2792] ∈ {2792} + [2793] ∈ {2793} + [2794] ∈ {2794} + [2795] ∈ {2795} + [2796] ∈ {2796} + [2797] ∈ {2797} + [2798] ∈ {2798} + [2799] ∈ {2799} + [2800] ∈ {2800} + [2801] ∈ {2801} + [2802] ∈ {2802} + [2803] ∈ {2803} + [2804] ∈ {2804} + [2805] ∈ {2805} + [2806] ∈ {2806} + [2807] ∈ {2807} + [2808] ∈ {2808} + [2809] ∈ {2809} + [2810] ∈ {2810} + [2811] ∈ {2811} + [2812] ∈ {2812} + [2813] ∈ {2813} + [2814] ∈ {2814} + [2815] ∈ {2815} + [2816] ∈ {2816} + [2817] ∈ {2817} + [2818] ∈ {2818} + [2819] ∈ {2819} + [2820] ∈ {2820} + [2821] ∈ {2821} + [2822] ∈ {2822} + [2823] ∈ {2823} + [2824] ∈ {2824} + [2825] ∈ {2825} + [2826] ∈ {2826} + [2827] ∈ {2827} + [2828] ∈ {2828} + [2829] ∈ {2829} + [2830] ∈ {2830} + [2831] ∈ {2831} + [2832] ∈ {2832} + [2833] ∈ {2833} + [2834] ∈ {2834} + [2835] ∈ {2835} + [2836] ∈ {2836} + [2837] ∈ {2837} + [2838] ∈ {2838} + [2839] ∈ {2839} + [2840] ∈ {2840} + [2841] ∈ {2841} + [2842] ∈ {2842} + [2843] ∈ {2843} + [2844] ∈ {2844} + [2845] ∈ {2845} + [2846] ∈ {2846} + [2847] ∈ {2847} + [2848] ∈ {2848} + [2849] ∈ {2849} + [2850] ∈ {2850} + [2851] ∈ {2851} + [2852] ∈ {2852} + [2853] ∈ {2853} + [2854] ∈ {2854} + [2855] ∈ {2855} + [2856] ∈ {2856} + [2857] ∈ {2857} + [2858] ∈ {2858} + [2859] ∈ {2859} + [2860] ∈ {2860} + [2861] ∈ {2861} + [2862] ∈ {2862} + [2863] ∈ {2863} + [2864] ∈ {2864} + [2865] ∈ {2865} + [2866] ∈ {2866} + [2867] ∈ {2867} + [2868] ∈ {2868} + [2869] ∈ {2869} + [2870] ∈ {2870} + [2871] ∈ {2871} + [2872] ∈ {2872} + [2873] ∈ {2873} + [2874] ∈ {2874} + [2875] ∈ {2875} + [2876] ∈ {2876} + [2877] ∈ {2877} + [2878] ∈ {2878} + [2879] ∈ {2879} + [2880] ∈ {2880} + [2881] ∈ {2881} + [2882] ∈ {2882} + [2883] ∈ {2883} + [2884] ∈ {2884} + [2885] ∈ {2885} + [2886] ∈ {2886} + [2887] ∈ {2887} + [2888] ∈ {2888} + [2889] ∈ {2889} + [2890] ∈ {2890} + [2891] ∈ {2891} + [2892] ∈ {2892} + [2893] ∈ {2893} + [2894] ∈ {2894} + [2895] ∈ {2895} + [2896] ∈ {2896} + [2897] ∈ {2897} + [2898] ∈ {2898} + [2899] ∈ {2899} + [2900] ∈ {2900} + [2901] ∈ {2901} + [2902] ∈ {2902} + [2903] ∈ {2903} + [2904] ∈ {2904} + [2905] ∈ {2905} + [2906] ∈ {2906} + [2907] ∈ {2907} + [2908] ∈ {2908} + [2909] ∈ {2909} + [2910] ∈ {2910} + [2911] ∈ {2911} + [2912] ∈ {2912} + [2913] ∈ {2913} + [2914] ∈ {2914} + [2915] ∈ {2915} + [2916] ∈ {2916} + [2917] ∈ {2917} + [2918] ∈ {2918} + [2919] ∈ {2919} + [2920] ∈ {2920} + [2921] ∈ {2921} + [2922] ∈ {2922} + [2923] ∈ {2923} + [2924] ∈ {2924} + [2925] ∈ {2925} + [2926] ∈ {2926} + [2927] ∈ {2927} + [2928] ∈ {2928} + [2929] ∈ {2929} + [2930] ∈ {2930} + [2931] ∈ {2931} + [2932] ∈ {2932} + [2933] ∈ {2933} + [2934] ∈ {2934} + [2935] ∈ {2935} + [2936] ∈ {2936} + [2937] ∈ {2937} + [2938] ∈ {2938} + [2939] ∈ {2939} + [2940] ∈ {2940} + [2941] ∈ {2941} + [2942] ∈ {2942} + [2943] ∈ {2943} + [2944] ∈ {2944} + [2945] ∈ {2945} + [2946] ∈ {2946} + [2947] ∈ {2947} + [2948] ∈ {2948} + [2949] ∈ {2949} + [2950] ∈ {2950} + [2951] ∈ {2951} + [2952] ∈ {2952} + [2953] ∈ {2953} + [2954] ∈ {2954} + [2955] ∈ {2955} + [2956] ∈ {2956} + [2957] ∈ {2957} + [2958] ∈ {2958} + [2959] ∈ {2959} + [2960] ∈ {2960} + [2961] ∈ {2961} + [2962] ∈ {2962} + [2963] ∈ {2963} + [2964] ∈ {2964} + [2965] ∈ {2965} + [2966] ∈ {2966} + [2967] ∈ {2967} + [2968] ∈ {2968} + [2969] ∈ {2969} + [2970] ∈ {2970} + [2971] ∈ {2971} + [2972] ∈ {2972} + [2973] ∈ {2973} + [2974] ∈ {2974} + [2975] ∈ {2975} + [2976] ∈ {2976} + [2977] ∈ {2977} + [2978] ∈ {2978} + [2979] ∈ {2979} + [2980] ∈ {2980} + [2981] ∈ {2981} + [2982] ∈ {2982} + [2983] ∈ {2983} + [2984] ∈ {2984} + [2985] ∈ {2985} + [2986] ∈ {2986} + [2987] ∈ {2987} + [2988] ∈ {2988} + [2989] ∈ {2989} + [2990] ∈ {2990} + [2991] ∈ {2991} + [2992] ∈ {2992} + [2993] ∈ {2993} + [2994] ∈ {2994} + [2995] ∈ {2995} + [2996] ∈ {2996} + [2997] ∈ {2997} + [2998] ∈ {2998} + [2999] ∈ {2999} +[from] Computing for function f +[from] Done for function f +[from] Computing for function init +[from] Done for function init +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + t[1] FROM t[0] +[from] Function init: + FROMTOP +[from] Function main: + FROMTOP +[from] ====== END OF DEPENDENCIES ====== +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to init at tests/misc/no_results.c:19 (by main): + FROMTOP +[from] call to f at tests/misc/no_results.c:20 (by main): + t[1] FROM t[0] +[from] entry point: + FROMTOP +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[inout] Out (internal) for function f: + t[1] +[inout] Inputs for function f: + t[0] +[inout] InOut (internal) for function f: + Operational inputs: + t[0] + Operational inputs on termination: + t[0] + Sure outputs: + t[1] +[inout] Out (internal) for function init: + ANYTHING(origin:Unknown) +[inout] Inputs for function init: + \nothing +[inout] InOut (internal) for function init: + Operational inputs: + ANYTHING(origin:Unknown) + Operational inputs on termination: + ANYTHING(origin:Unknown) + Sure outputs: + \nothing +[inout] Out (internal) for function main: + ANYTHING(origin:Unknown) +[inout] Inputs for function main: + t[0] +[inout] InOut (internal) for function main: + Operational inputs: + ANYTHING(origin:Unknown) + Operational inputs on termination: + ANYTHING(origin:Unknown) + Sure outputs: + t[1] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/noreturn.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/noreturn.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/noreturn.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/noreturn.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,113 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/noreturn.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +tests/misc/noreturn.i:22:[value] warning: global initialization of volatile value ignored +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] +[value] computing for function warn_may_never_end <- main. + Called from tests/misc/noreturn.i:26. +tests/misc/noreturn.i:20:[value] entering loop for the first time +[value] Recording results for warn_may_never_end +[value] Done for function warn_may_never_end +[value] computing for function warn_may_never_end <- main. + Called from tests/misc/noreturn.i:27. +[value] Recording results for warn_may_never_end +[value] Done for function warn_may_never_end +[value] computing for function warn_never_ends <- main. + Called from tests/misc/noreturn.i:28. +tests/misc/noreturn.i:16:[value] entering loop for the first time +[value] Recording results for warn_never_ends +[value] Done for function warn_never_ends +[value] computing for function stop <- main. + Called from tests/misc/noreturn.i:29. +tests/misc/noreturn.i:29:[kernel] warning: Neither code nor specification for function stop, generating default assigns from the prototype +[value] using specification for function stop +[value] Done for function stop +[value] computing for function haltme <- main. + Called from tests/misc/noreturn.i:30. +tests/misc/noreturn.i:30:[kernel] warning: Neither code nor specification for function haltme, generating default assigns from the prototype +[value] using specification for function haltme +[value] Done for function haltme +[value] computing for function never_ends <- main. + Called from tests/misc/noreturn.i:31. +tests/misc/noreturn.i:7:[value] entering loop for the first time +[value] Recording results for never_ends +[value] Done for function never_ends +[value] computing for function should_never_end <- main. + Called from tests/misc/noreturn.i:32. +tests/misc/noreturn.i:13:[value] entering loop for the first time +[value] Recording results for should_never_end +tests/misc/noreturn.i:13:[value] warning: function should_never_end may terminate but has the noreturn attribute +[value] Done for function should_never_end +[value] computing for function should_never_end <- main. + Called from tests/misc/noreturn.i:33. +[value] Recording results for should_never_end +[value] Done for function should_never_end +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function never_ends: + NON TERMINATING FUNCTION +[value] Values at end of function should_never_end: + +[value] Values at end of function warn_may_never_end: + +[value] Values at end of function warn_never_ends: + NON TERMINATING FUNCTION +[value] Values at end of function main: + x ∈ {0} +[from] Computing for function never_ends +[from] Non-terminating function never_ends (no dependencies) +[from] Done for function never_ends +[from] Computing for function should_never_end +[from] Done for function should_never_end +[from] Computing for function warn_may_never_end +[from] Done for function warn_may_never_end +[from] Computing for function warn_never_ends +[from] Non-terminating function warn_never_ends (no dependencies) +[from] Done for function warn_never_ends +[from] Computing for function main +[from] Computing for function stop <-main +[from] Done for function stop +[from] Computing for function haltme <-main +[from] Done for function haltme +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function haltme: + \result FROM \nothing +[from] Function never_ends: + NON TERMINATING - NO EFFECTS +[from] Function should_never_end: + NO EFFECTS +[from] Function stop: + NO EFFECTS +[from] Function warn_may_never_end: + NO EFFECTS +[from] Function warn_never_ends: + NON TERMINATING - NO EFFECTS +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function never_ends: + \nothing +[inout] Inputs for function never_ends: + \nothing +[inout] Out (internal) for function should_never_end: + \nothing +[inout] Inputs for function should_never_end: + \nothing +[inout] Out (internal) for function warn_may_never_end: + \nothing +[inout] Inputs for function warn_may_never_end: + \nothing +[inout] Out (internal) for function warn_never_ends: + \nothing +[inout] Inputs for function warn_never_ends: + \nothing +[inout] Out (internal) for function main: + x +[inout] Inputs for function main: + v diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/not_ct_array_arg.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/not_ct_array_arg.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/not_ct_array_arg.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/not_ct_array_arg.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,66 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/not_ct_array_arg.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] +[value:initial_state] creating variable S_tb with imprecise size (type int [10][a]) +tests/misc/not_ct_array_arg.i:9:[value] warning: during initialization of variable 'tb', size of type 'int [a]' cannot be + computed (Array with non-constant length.) +tests/misc/not_ct_array_arg.i:10:[kernel] warning: out of bounds write. assert \valid((int *)tb); +[value] DUMPING STATE of file tests/misc/not_ct_array_arg.i line 11 + v ∈ [--..--] + a ∈ [--..--] + tb ∈ {{ (int (*)[a])&S_tb }} + tc ∈ {{ NULL ; &S_tc[0] }} + S_tc[0..1][0..9] ∈ [--..--] + S_tb[bits 0 to 31] ∈ {1} + [bits 32 to ..] ∈ [--..--] or UNINITIALIZED + =END OF DUMP== +tests/misc/not_ct_array_arg.i:12:[kernel] warning: out of bounds write. assert \valid(&(*(tb+9))[100]); +[value] DUMPING STATE of file tests/misc/not_ct_array_arg.i line 13 + v ∈ [--..--] + a ∈ [--..--] + tb ∈ {{ (int (*)[a])&S_tb }} + tc ∈ {{ NULL ; &S_tc[0] }} + S_tc[0..1][0..9] ∈ [--..--] + S_tb[bits 0 to 31] ∈ + {{ garbled mix of &{tb} + (origin: Misaligned {tests/misc/not_ct_array_arg.i:12}) }} + [bits 32 to ..] ∈ + {{ garbled mix of &{tb} + (origin: Misaligned {tests/misc/not_ct_array_arg.i:12}) }} or UNINITIALIZED + =END OF DUMP== +tests/misc/not_ct_array_arg.i:14:[kernel] warning: out of bounds write. assert \valid(&(*(tc+1))[1]); +tests/misc/not_ct_array_arg.i:16:[kernel] warning: accessing out of bounds index {16}. assert 16 < 10; +tests/misc/not_ct_array_arg.i:16:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +tests/misc/not_ct_array_arg.i:16:[value] Assertion 'Value,index_bound' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + S_tc{[0][0..9]; [1][0]} ∈ [--..--] + [1][1] ∈ {3} + [1][2..9] ∈ [--..--] + S_tb[bits 0 to 31] ∈ + {{ garbled mix of &{tb} + (origin: Misaligned {tests/misc/not_ct_array_arg.i:12}) }} + [bits 32 to ..] ∈ + {{ garbled mix of &{tb} + (origin: Misaligned {tests/misc/not_ct_array_arg.i:12}) }} or UNINITIALIZED +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + S_tc[1][1] FROM tc + S_tb[bits 0 to 31] FROM tb + [bits 32 to ..] FROM tb (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + S_tc[1][1]; S_tb[bits 0 to ..] +[inout] Inputs for function main: + v diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/not.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/not.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/not.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/not.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,24 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/not.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + x ∈ {0; 1} + loc ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + x FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + x; loc +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/null_lt_valid.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/null_lt_valid.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/null_lt_valid.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/null_lt_valid.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,84 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/null_lt_valid.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..22] ∈ {0} + p ∈ {0} + q ∈ {0} + r ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/null_lt_valid.i:27. +tests/misc/null_lt_valid.i:6:[kernel] warning: out of bounds write. assert \valid(p); +tests/misc/null_lt_valid.i:6:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/null_lt_valid.i:30. +[value] Recording results for g +[value] Done for function g +[value] computing for function h <- main. + Called from tests/misc/null_lt_valid.i:33. +tests/misc/null_lt_valid.i:19:[kernel] warning: pointer comparison: assert \pointer_comparable(r, &t[22]); +[value] Recording results for h +[value] Done for function h +tests/misc/null_lt_valid.i:36:[kernel] warning: pointer comparison: assert \pointer_comparable(r, &t[22]); +[value] Recording results for main +[value] done for function main +tests/misc/null_lt_valid.i:6:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + NON TERMINATING FUNCTION +[value] Values at end of function g: + q1 ∈ {{ NULL ; &t + [0..60],0%4 }} +[value] Values at end of function h: + r1 ∈ {{ NULL ; &t + [0..84],0%4 }} or UNINITIALIZED + r2 ∈ {{ &t + [88..124],0%4 }} or UNINITIALIZED +[value] Values at end of function main: + t[0] ∈ {1} + [1..2] ∈ {0; 1} + [3..22] ∈ {0} + q ∈ {{ NULL ; &t + [0..60],0%4 }} + r ∈ {{ NULL ; &t + [0..124],0%4 }} + __retres ∈ {0} +[from] Computing for function f +[from] Non-terminating function f (no dependencies) +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] Computing for function h +[from] Done for function h +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + NON TERMINATING - NO EFFECTS +[from] Function g: + NO EFFECTS +[from] Function h: + NO EFFECTS +[from] Function main: + t[0] FROM p + [1..2] FROM p; c + q FROM p; c + r FROM p; c + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + \nothing +[inout] Inputs for function f: + p +[inout] Out (internal) for function g: + q1 +[inout] Inputs for function g: + q +[inout] Out (internal) for function h: + r1; r2 +[inout] Inputs for function h: + r +[inout] Out (internal) for function main: + t[0..2]; q; r; __retres +[inout] Inputs for function main: + p; q; r diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/obfuscate.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/obfuscate.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/obfuscate.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/obfuscate.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,107 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/obfuscate.i (no preprocessing) +/* *********************************** */ +/* start of dictionary for obfuscation */ +/* *********************************** */ +// behaviors +#define B1 bhv +// enums +#define E1 first +#define E2 second +#define E3 third +// functions +#define F1 my_func +#define F2 f +#define F3 logic +// global variables +#define G1 my_var +// labels +#define L1 end +#define L2 end +// logic variables +#define LV1 I +#define LV2 x +// predicates +#define P1 never +// types +#define T1 my_enum +// local variables +#define V1 x +#define V2 __retres +#define V3 V1 +#define V4 __retres +// formal variables +#define f1 p +#define f2 f1 +#define f3 p +/*********************************** */ +/* end of dictionary for obfuscation */ +/*********************************** */ + +/* *********************************************************** */ +/* start of dictionary required to compile the obfuscated code */ +/* *********************************************************** */ +// literal strings +#define LS1 "ti\rti" +/* ********************************************************* */ +/* end of dictionary required to compile the obfuscated code */ +/* ********************************************************* */ + +/* Generated by Frama-C */ +enum T1 { + E1 = 0, + E2 = 1, + E3 = 4 +}; +int G1 = 0; +/*@ global invariant LV1: G1 ≥ 0; + */ +/*@ requires G1 > 0; + ensures G1 > \old(G1); + ensures ∀ ℤ LV2; LV2 ≡ LV2; + */ +int F1(void) +{ + int V2; + enum T1 V1; + V1 = E1; + /*@ assert G1 ≥ E1; */ ; + G1 ++; + if (! G1) goto L1; + V2 = (int)((unsigned int)G1 + V1); + goto return_label; + L1: ; + V2 = -1; + return_label: return V2; +} + +/*@ requires \valid(f1); + ensures *\old(f1) ≡ 0; */ +extern void F2(int *f1); + +/*@ behavior B1: + exits P1: \false; + + complete behaviors B1; + disjoint behaviors B1; + */ +int F3(int f2) +{ + int V3; + V3 = 0; + if (f2) goto L2; + V3 ++; + /*@ assert property: V3≢0? 1 ≢ 0: 0 ≢ 0; */ ; + L2: ; + return V3; +} + +int main(int *f3) +{ + int V4; + if (LS1 == LS1) F2(f3); + V4 = 0; + return V4; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/offset_misaligned.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/offset_misaligned.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/offset_misaligned.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/offset_misaligned.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,30 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/offset_misaligned.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..299] ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + t[0] ∈ {1} + [bits 8 to 39] ∈ {2} + [5..9] ∈ {0} + [10..265] ∈ {0; 3} + [266..299] ∈ {0} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + t[0..4] FROM \nothing + [10..265] FROM u (and SELF) + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + t{[0..4]; [10..265]}; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/offset_neg.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/offset_neg.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/offset_neg.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/offset_neg.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/offset_neg.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + mem[0] ∈ {0} + addr ∈ {{ &mem[0] }} + off ∈ {18446744073709551615} + G[0..4] ∈ {0} +[value] DUMPING STATE of file tests/misc/offset_neg.i line 8 + mem[0] ∈ {0} + addr ∈ {{ &mem + {18446744073709551616} }} + off ∈ {18446744073709551615} + G[0..4] ∈ {0} + =END OF DUMP== +tests/misc/offset_neg.i:9:[kernel] warning: accessing out of bounds index {-1}. assert 0 ≤ (int)(-1) < 5; +tests/misc/offset_neg.i:9:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +tests/misc/offset_neg.i:9:[value] Assertion 'Value,index_bound' got final status valid. +tests/misc/offset_neg.i:9:[value] Assertion 'Value,index_bound' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + addr +[inout] Inputs for function main: + addr; off diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/offset_top.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/offset_top.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/offset_top.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/offset_top.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/offset_top.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + NULL[rbits 0 to 2047] ∈ [--..--] + T ∈ {0} + TAB[0..9] ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {{ &TAB + [-8589934592..8589934588],0%4 }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i +[inout] Inputs for function main: + NULL[0..3]; T diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/origin.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/origin.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/origin.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/origin.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,105 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/origin.i (no preprocessing) +[value] Analyzing a complete application starting at origin +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} + aa2 ∈ {0} + p ∈ {0} + pa1 ∈ {0} + pa2 ∈ {0} + qa2 ∈ {0} + pa3 ∈ {0} + q ∈ {0} + t[0..11] ∈ {0} + tt[0..9] ∈ {0} + ta1[0..9] ∈ {0} + ta2[0..9] ∈ {0} + ta3[0..9] ∈ {0} + tta2[0..9] ∈ {0} + l1 ∈ {0} + l2 ∈ {0} + l3 ∈ {0} + pl ∈ {0} + Tm1[0] ∈ {{ &a }} + [1] ∈ {{ &b }} + Tm2[0] ∈ {{ &a }} + [1] ∈ {{ &b }} + Tm3[0] ∈ {{ &a }} + [1] ∈ {{ &b }} + Tm4[0] ∈ {{ &a }} + [1] ∈ {{ &b }} + pm1 ∈ {0} + pm2 ∈ {0} + qm2 ∈ {0} + pun ∈ {0} + pun2 ∈ {0} + qun2 ∈ {0} + random ∈ [--..--] + esc1 ∈ {0} + esc2 ∈ {0} + esc3 ∈ {0} + esc4 ∈ {0} + esc5 ∈ {0} + x ∈ {0} + y ∈ {0} + v.c ∈ {1} + .[bits 8 to 15] ∈ UNINITIALIZED + .i ∈ {2} + .p ∈ {{ &x }} + .t[0] ∈ {{ &y }} + .t[1] ∈ {0} +[value] computing for function f <- origin. + Called from tests/misc/origin.i:122. +tests/misc/origin.i:122:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] using specification for function f +[value] Done for function f +tests/misc/origin.i:124:[value] Reading left-value *((int *)(& v.c + 3)). + The location is {{ v -> {24} }}. + It contains a garbled mix of {x} because of Misaligned + {tests/misc/origin.i:124}. +tests/misc/origin.i:124:[value] Assigning imprecise value to r.p. + The imprecision originates from Misaligned {tests/misc/origin.i:124} +tests/misc/origin.i:127:[value] Assigning imprecise value to r.t[0]. + The imprecision originates from Merge {tests/misc/origin.i:127} +tests/misc/origin.i:128:[kernel] warning: signed overflow. assert -2147483648 ≤ -((int)(&x)) ≤ 2147483647; +tests/misc/origin.i:128:[value] Assigning imprecise value to r.t[1]. + The imprecision originates from Arithmetic {tests/misc/origin.i:128} +[value] Recording results for origin +[value] done for function origin +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function origin: + r.c ∈ [--..--] + .[bits 8 to 15] ∈ UNINITIALIZED + .i ∈ [--..--] + .p ∈ + {{ garbled mix of &{x} (origin: Misaligned {tests/misc/origin.i:124}) }} + .t[0][bits 0 to 7] ∈ + {{ garbled mix of &{y} (origin: Merge {tests/misc/origin.i:127}) }} + .t[0][bits 8 to 15]# ∈ {{ NULL ; (? *)&y }}%32, bits 24 to 31 + .t[0][bits 16 to 31] ∈ {0} + .t[1] ∈ + {{ garbled mix of &{x} (origin: Arithmetic {tests/misc/origin.i:128}) }} + q1[bits 0 to 15]# ∈ {{ (? *)&y }}%32, bits 16 to 31 + [bits 16 to 31] ∈ {0} + q2[bits 0 to 7] ∈ + {{ garbled mix of &{y} (origin: Merge {tests/misc/origin.i:127}) }} + [bits 8 to 15]# ∈ {{ NULL ; (? *)&y }}%32, bits 24 to 31 + [bits 16 to 31] ∈ {0} +[from] Computing for function origin +[from] Computing for function f <-origin +[from] Done for function f +[from] Done for function origin +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM \nothing +[from] Function origin: + \result FROM v{{.i[bits 8 to 15]; .p[bits 0 to 23]}; + .t{[0][bits 16 to 31]; [1][bits 0 to 23]}}; + c0 +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function origin: + r{.c; {.i; .p; .t[0..1]}}; q1; q2 diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/origin.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/origin.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/origin.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/origin.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,367 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/origin.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} + aa2 ∈ {0} + p ∈ {0} + pa1 ∈ {0} + pa2 ∈ {0} + qa2 ∈ {0} + pa3 ∈ {0} + q ∈ {0} + t[0..11] ∈ {0} + tt[0..9] ∈ {0} + ta1[0..9] ∈ {0} + ta2[0..9] ∈ {0} + ta3[0..9] ∈ {0} + tta2[0..9] ∈ {0} + l1 ∈ {0} + l2 ∈ {0} + l3 ∈ {0} + pl ∈ {0} + Tm1[0] ∈ {{ &a }} + [1] ∈ {{ &b }} + Tm2[0] ∈ {{ &a }} + [1] ∈ {{ &b }} + Tm3[0] ∈ {{ &a }} + [1] ∈ {{ &b }} + Tm4[0] ∈ {{ &a }} + [1] ∈ {{ &b }} + pm1 ∈ {0} + pm2 ∈ {0} + qm2 ∈ {0} + pun ∈ {0} + pun2 ∈ {0} + qun2 ∈ {0} + random ∈ [--..--] + esc1 ∈ {0} + esc2 ∈ {0} + esc3 ∈ {0} + esc4 ∈ {0} + esc5 ∈ {0} + x ∈ {0} + y ∈ {0} + v.c ∈ {1} + .[bits 8 to 15] ∈ UNINITIALIZED + .i ∈ {2} + .p ∈ {{ &x }} + .t[0] ∈ {{ &y }} + .t[1] ∈ {0} +[value] computing for function origin_arithmetic_1 <- main. + Called from tests/misc/origin.i:92. +tests/misc/origin.i:14:[kernel] warning: signed overflow. assert -2147483648 ≤ -((int)((int *)ta1)) ≤ 2147483647; +tests/misc/origin.i:14:[value] Assigning imprecise value to pa1. + The imprecision originates from Arithmetic {tests/misc/origin.i:14} +tests/misc/origin.i:15:[value] Reading left-value pa1. + It contains a garbled mix of {ta1} because of Arithmetic + {tests/misc/origin.i:14}. +tests/misc/origin.i:15:[kernel] warning: out of bounds write. assert \valid(pa1); +[value] Recording results for origin_arithmetic_1 +[value] Done for function origin_arithmetic_1 +[value] computing for function origin_arithmetic_2 <- main. + Called from tests/misc/origin.i:93. +tests/misc/origin.i:19:[kernel] warning: signed overflow. assert -2147483648 ≤ -((int)((int *)ta2)) ≤ 2147483647; +tests/misc/origin.i:19:[value] Assigning imprecise value to pa2. + The imprecision originates from Arithmetic {tests/misc/origin.i:19} +tests/misc/origin.i:20:[value] Assigning imprecise value to qa2. + The imprecision originates from Arithmetic {tests/misc/origin.i:19} +tests/misc/origin.i:20:[kernel] warning: signed overflow. assert -2147483648 ≤ -((int)((int *)tta2)) ≤ 2147483647; +tests/misc/origin.i:20:[value] Assigning imprecise value to qa2. + The imprecision originates from Arithmetic {tests/misc/origin.i:20} +tests/misc/origin.i:21:[value] Reading left-value qa2. + It contains a garbled mix of {ta2; tta2} because of Arithmetic + {tests/misc/origin.i:19; tests/misc/origin.i:20}. +tests/misc/origin.i:21:[kernel] warning: out of bounds write. assert \valid(qa2); +[value] Recording results for origin_arithmetic_2 +[value] Done for function origin_arithmetic_2 +[value] computing for function origin_arithmetic_3 <- main. + Called from tests/misc/origin.i:94. +tests/misc/origin.i:25:[kernel] warning: signed overflow. assert -2147483648 ≤ -((int)((int *)ta3)) ≤ 2147483647; +tests/misc/origin.i:25:[value] Assigning imprecise value to pa3. + The imprecision originates from Arithmetic {tests/misc/origin.i:25} +tests/misc/origin.i:26:[value] Reading left-value pa3. + It contains a garbled mix of {ta3} because of Arithmetic + {tests/misc/origin.i:25}. +tests/misc/origin.i:26:[kernel] warning: out of bounds write. assert \valid(pa3); +[value] Recording results for origin_arithmetic_3 +[value] Done for function origin_arithmetic_3 +[value] computing for function origin_leaf_1 <- main. + Called from tests/misc/origin.i:95. +[value] computing for function g <- origin_leaf_1 <- main. + Called from tests/misc/origin.i:36. +tests/misc/origin.i:36:[kernel] warning: Neither code nor specification for function g, generating default assigns from the prototype +[value] using specification for function g +[value] Done for function g +[value] Recording results for origin_leaf_1 +[value] Done for function origin_leaf_1 +[value] computing for function g <- main. + Called from tests/misc/origin.i:97. +[value] Done for function g +tests/misc/origin.i:97:[kernel] warning: signed overflow. assert -2147483648 ≤ l2+tmp ≤ 2147483647; + (tmp from g()) +[value] computing for function gp <- main. + Called from tests/misc/origin.i:98. +tests/misc/origin.i:98:[kernel] warning: Neither code nor specification for function gp, generating default assigns from the prototype +[value] using specification for function gp +[value] Done for function gp +tests/misc/origin.i:99:[kernel] warning: out of bounds read. assert \valid_read(pl); +[value] computing for function origin_misalign_1 <- main. + Called from tests/misc/origin.i:100. +tests/misc/origin.i:47:[value] Reading left-value pm1. + It contains a garbled mix of {a; b} because of Misaligned + {tests/misc/origin.i:47}. +tests/misc/origin.i:47:[kernel] warning: out of bounds write. assert \valid(pm1); +[value] Recording results for origin_misalign_1 +[value] Done for function origin_misalign_1 +[value] computing for function origin_misalign_2 <- main. + Called from tests/misc/origin.i:101. +tests/misc/origin.i:52:[value] Reading left-value pm2. + It contains a garbled mix of {a; b} because of Misaligned + {tests/misc/origin.i:52}. +tests/misc/origin.i:52:[value] Assigning imprecise value to qm2. + The imprecision originates from Misaligned {tests/misc/origin.i:52} +tests/misc/origin.i:53:[value] Reading left-value qm2. + It contains a garbled mix of {a; b} because of Misaligned + {tests/misc/origin.i:52}. +[value] Called Frama_C_show_each({{ garbled mix of &{a; b} + (origin: Misaligned {tests/misc/origin.i:52}) }}) +tests/misc/origin.i:54:[value] Reading left-value qm2. + It contains a garbled mix of {a; b} because of Misaligned + {tests/misc/origin.i:52}. +tests/misc/origin.i:54:[kernel] warning: out of bounds write. assert \valid(qm2); +[value] Recording results for origin_misalign_2 +[value] Done for function origin_misalign_2 +[value] computing for function origin_uninitialized_1 <- main. + Called from tests/misc/origin.i:104. +[value] Recording results for origin_uninitialized_1 +[value] Done for function origin_uninitialized_1 +[value] computing for function origin_uninitialized_2 <- main. + Called from tests/misc/origin.i:105. +tests/misc/origin.i:73:[kernel] warning: accessing uninitialized left-value: assert \initialized(&pun2); +tests/misc/origin.i:73:[kernel] warning: accessing uninitialized left-value: assert \initialized(&i); +tests/misc/origin.i:73:[kernel] warning: completely indeterminate value in i. +[value] Recording results for origin_uninitialized_2 +[value] Done for function origin_uninitialized_2 +[value] computing for function local_escape_1 <- main. + Called from tests/misc/origin.i:106. +tests/misc/origin.i:83:[kernel] warning: signed overflow. assert -2147483648 ≤ -((int)(&arg)) ≤ 2147483647; +tests/misc/origin.i:83:[value] Assigning imprecise value to esc3. + The imprecision originates from Arithmetic {tests/misc/origin.i:83} +tests/misc/origin.i:87:[value] warning: locals {arg} escaping the scope of local_escape_1 through esc1 +tests/misc/origin.i:87:[value] warning: locals {local1} escaping the scope of local_escape_1 through esc2 +tests/misc/origin.i:87:[value] warning: locals {arg} escaping the scope of local_escape_1 through esc3 +tests/misc/origin.i:87:[value] warning: locals {local1} escaping the scope of local_escape_1 through esc4 +[value] Recording results for local_escape_1 +[value] Done for function local_escape_1 +[value] Recording results for main +[value] done for function main +tests/misc/origin.i:73:[value] Assertion 'Value,initialisation' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function local_escape_1: + esc1 ∈ {{ (int)&arg }} + esc2 ∈ {{ (int)&local1 }} + esc3 ∈ + {{ garbled mix of &{arg} + (origin: Arithmetic {tests/misc/origin.i:83}) }} + esc4 ∈ {{ NULL + {12} ; (int)&local1 }} + esc5 ∈ {{ (int)&esc1 }} + local2 ∈ {{ (int)&local1 }} +[value] Values at end of function origin_arithmetic_1: + pa1 ∈ {{ &ta1 + [0..36] }} + ta1[0..9] ∈ {0} +[value] Values at end of function origin_arithmetic_2: + pa2 ∈ + {{ garbled mix of &{ta2} + (origin: Arithmetic {tests/misc/origin.i:19}) }} + qa2 ∈ {{ &ta2 + [0..36] ; &tta2 + [0..36] }} + ta2[0..9] ∈ + {{ garbled mix of &{aa2} + (origin: Misaligned {tests/misc/origin.i:21}) }} + tta2[0..9] ∈ + {{ garbled mix of &{aa2} + (origin: Misaligned {tests/misc/origin.i:21}) }} +[value] Values at end of function origin_arithmetic_3: + pa3 ∈ {{ &ta3 + [0..36] }} + ta3[0..9] ∈ [--..--] +[value] Values at end of function origin_leaf_1: + l1 ∈ [--..--] +[value] Values at end of function origin_misalign_1: + a ∈ {0; 1} + b ∈ {0; 1} + pm1 ∈ {{ &a ; &b }} +[value] Values at end of function origin_misalign_2: + a ∈ {{ NULL + {0; 1} ; (int)&a }} + b ∈ {{ NULL + {0; 1} ; (int)&a }} + pm2[bits 0 to 15]# ∈ {{ (? *)&a }}%32, bits 16 to 31 + [bits 16 to 31]# ∈ {{ (? *)&b }}%32, bits 0 to 15 + qm2 ∈ {{ &a ; &b }} +[value] Values at end of function origin_uninitialized_1: + pun ∈ {{ &a }} or UNINITIALIZED + pi ∈ {{ &a }} or UNINITIALIZED +[value] Values at end of function origin_uninitialized_2: + pun2 ∈ {{ &a }} or UNINITIALIZED + qun2 ∈ {0} + pi ∈ {{ &a }} or UNINITIALIZED +[value] Values at end of function main: + a ∈ {{ NULL + {0; 1} ; (int)&a }} + b ∈ {{ NULL + {0; 1} ; (int)&a }} + p[bits 0 to 15]# ∈ {{ (? *)&a }}%32, bits 16 to 31 + [bits 16 to 31]# ∈ {{ (? *)&b }}%32, bits 0 to 15 + pa1 ∈ {{ &ta1 + [0..36] }} + pa2 ∈ + {{ garbled mix of &{ta2} + (origin: Arithmetic {tests/misc/origin.i:19}) }} + qa2 ∈ {{ &ta2 + [0..36] ; &tta2 + [0..36] }} + pa3 ∈ {{ &ta3 + [0..36] }} + q[bits 0 to 7] ∈ + {{ garbled mix of &{a} (origin: Merge {tests/misc/origin.i:104}) }} + [bits 8 to 15] ∈ + {{ garbled mix of &{a; b} (origin: Merge {tests/misc/origin.i:104}) }} + [bits 16 to 31] ∈ + {{ garbled mix of &{b} (origin: Merge {tests/misc/origin.i:104}) }} + ta1[0..9] ∈ {0} + ta2[0..9] ∈ + {{ garbled mix of &{aa2} + (origin: Misaligned {tests/misc/origin.i:21}) }} + ta3[0..9] ∈ [--..--] + tta2[0..9] ∈ + {{ garbled mix of &{aa2} + (origin: Misaligned {tests/misc/origin.i:21}) }} + l1 ∈ [--..--] + l2 ∈ [--..--] + l3 ∈ [--..--] + pl ∈ {{ &alloced_return_gp + [0..2147483616],0%32 }} + pm1 ∈ {{ &a ; &b }} + pm2[bits 0 to 15]# ∈ {{ (? *)&a }}%32, bits 16 to 31 + [bits 16 to 31]# ∈ {{ (? *)&b }}%32, bits 0 to 15 + qm2 ∈ {{ &a ; &b }} + pun ∈ {{ &a }} or UNINITIALIZED + pun2 ∈ {{ &a }} or UNINITIALIZED + qun2 ∈ {0} + esc1 ∈ ESCAPINGADDR + esc2 ∈ ESCAPINGADDR + esc3 ∈ [--..--] or ESCAPINGADDR + esc4 ∈ {12} or ESCAPINGADDR + esc5 ∈ {{ (int)&esc1 }} +[from] Computing for function local_escape_1 +[from] Done for function local_escape_1 +[from] Computing for function origin_arithmetic_1 +[from] Done for function origin_arithmetic_1 +[from] Computing for function origin_arithmetic_2 +[from] Done for function origin_arithmetic_2 +[from] Computing for function origin_arithmetic_3 +[from] Done for function origin_arithmetic_3 +[from] Computing for function origin_leaf_1 +[from] Computing for function g <-origin_leaf_1 +[from] Done for function g +[from] Done for function origin_leaf_1 +[from] Computing for function origin_misalign_1 +[from] Done for function origin_misalign_1 +[from] Computing for function origin_misalign_2 +[from] Done for function origin_misalign_2 +[from] Computing for function origin_uninitialized_1 +[from] Done for function origin_uninitialized_1 +[from] Computing for function origin_uninitialized_2 +[from] Done for function origin_uninitialized_2 +[from] Computing for function main +[from] Computing for function gp <-main +[from] Done for function gp +tests/misc/origin.i:99:[kernel] more than 200(67108864) elements to enumerate. Approximating. +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function g: + \result FROM \nothing +[from] Function gp: + \result FROM \nothing +[from] Function local_escape_1: + esc1 FROM \nothing + esc2 FROM \nothing + esc3 FROM \nothing + esc4 FROM random + esc5 FROM \nothing +[from] Function origin_arithmetic_1: + pa1 FROM \nothing + ta1[0..9] FROM \nothing (and SELF) +[from] Function origin_arithmetic_2: + pa2 FROM \nothing + qa2 FROM c1 + ta2[0..9] FROM c1 (and SELF) + tta2[0..9] FROM c1 (and SELF) +[from] Function origin_arithmetic_3: + pa3 FROM \nothing + ta3[0..9] FROM \nothing (and SELF) +[from] Function origin_leaf_1: + l1 FROM \nothing +[from] Function origin_misalign_1: + a FROM Tm1{[0][bits 16 to 31]; [1][bits 0 to 15]} (and SELF) + b FROM Tm1{[0][bits 16 to 31]; [1][bits 0 to 15]} (and SELF) + pm1 FROM Tm1{[0][bits 16 to 31]; [1][bits 0 to 15]} +[from] Function origin_misalign_2: + a FROM Tm2{[0][bits 16 to 31]; [1][bits 0 to 15]} (and SELF) + b FROM Tm2{[0][bits 16 to 31]; [1][bits 0 to 15]} (and SELF) + pm2 FROM Tm2{[0][bits 16 to 31]; [1][bits 0 to 15]} + qm2 FROM Tm2{[0][bits 16 to 31]; [1][bits 0 to 15]} +[from] Function origin_uninitialized_1: + pun FROM c1 +[from] Function origin_uninitialized_2: + pun2 FROM c1 + qun2 FROM c1; c2 (and SELF) +[from] Function main: + a FROM Tm1{[0][bits 16 to 31]; [1][bits 0 to 15]}; + Tm2{[0][bits 16 to 31]; [1][bits 0 to 15]} (and SELF) + b FROM Tm1{[0][bits 16 to 31]; [1][bits 0 to 15]}; + Tm2{[0][bits 16 to 31]; [1][bits 0 to 15]} (and SELF) + p FROM Tm3{[0][bits 16 to 31]; [1][bits 0 to 15]} + pa1 FROM \nothing + pa2 FROM \nothing + qa2 FROM c1 + pa3 FROM \nothing + q FROM Tm3{[0][bits 16 to 31]; [1][bits 0 to 15]}; + Tm4{[0][bits 24 to 31]; [1][bits 0 to 23]}; c1 + ta1[0..9] FROM \nothing (and SELF) + ta2[0..9] FROM c1 (and SELF) + ta3[0..9] FROM \nothing (and SELF) + tta2[0..9] FROM c1 (and SELF) + l1 FROM \nothing + l2 FROM \nothing + l3 FROM alloced_return_gp[bits 0 to 17179868959] + pl FROM \nothing + pm1 FROM Tm1{[0][bits 16 to 31]; [1][bits 0 to 15]} + pm2 FROM Tm2{[0][bits 16 to 31]; [1][bits 0 to 15]} + qm2 FROM Tm2{[0][bits 16 to 31]; [1][bits 0 to 15]} + pun FROM c1 + pun2 FROM c1 + qun2 FROM c1; c2 (and SELF) + esc1 FROM \nothing + esc2 FROM \nothing + esc3 FROM \nothing + esc4 FROM random + esc5 FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function local_escape_1: + esc1; esc2; esc3; esc4; esc5; local2 +[inout] Out (internal) for function origin_arithmetic_1: + pa1; ta1[0..9] +[inout] Out (internal) for function origin_arithmetic_2: + pa2; qa2; ta2[0..9]; tta2[0..9] +[inout] Out (internal) for function origin_arithmetic_3: + pa3; ta3[0..9] +[inout] Out (internal) for function origin_leaf_1: + l1 +[inout] Out (internal) for function origin_misalign_1: + a; b; pm1 +[inout] Out (internal) for function origin_misalign_2: + a; b; pm2; qm2 +[inout] Out (internal) for function origin_uninitialized_1: + pun; pi +[inout] Out (internal) for function origin_uninitialized_2: + pun2; qun2; pi +[inout] Out (internal) for function main: + a; b; p; pa1; pa2; qa2; pa3; q; ta1[0..9]; ta2[0..9]; ta3[0..9]; + tta2[0..9]; l1; l2; l3; pl; pm1; pm2; qm2; pun; pun2; qun2; esc1; esc2; + esc3; esc4; esc5; tmp diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/output_leafs.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/output_leafs.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/output_leafs.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/output_leafs.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,154 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/output_leafs.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + H ∈ {0} + G ∈ {0} + K ∈ {0} + L ∈ {0} + M ∈ {0} + N ∈ {0} + P ∈ {0} + a ∈ {0} + b ∈ {0} + c ∈ {0} + d ∈ {0} +[value] computing for function main1 <- main. + Called from tests/misc/output_leafs.i:45. +[value] computing for function crypt <- main1 <- main. + Called from tests/misc/output_leafs.i:13. +[value] using specification for function crypt +[value] Done for function crypt +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/output_leafs.i:46. +[value] computing for function g1 <- main2 <- main. + Called from tests/misc/output_leafs.i:31. +[value] computing for function g <- g1 <- main2 <- main. + Called from tests/misc/output_leafs.i:23. +[value] using specification for function g +[value] Done for function g +[value] Recording results for g1 +[value] Done for function g1 +[value] computing for function g2 <- main2 <- main. + Called from tests/misc/output_leafs.i:32. +[value] computing for function g <- g2 <- main2 <- main. + Called from tests/misc/output_leafs.i:27. +[value] Done for function g +[value] Recording results for g2 +[value] Done for function g2 +[value] Recording results for main2 +[value] Done for function main2 +[value] computing for function main3 <- main. + Called from tests/misc/output_leafs.i:47. +[value] computing for function f <- main3 <- main. + Called from tests/misc/output_leafs.i:40. +tests/misc/output_leafs.i:40:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] using specification for function f +[value] Done for function f +[value] Recording results for main3 +[value] Done for function main3 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function g1: + b ∈ [--..--] +[value] Values at end of function g2: + d ∈ [--..--] +[value] Values at end of function main1: + H ∈ {{ &K }} + G ∈ [--..--] + K ∈ [--..--] + L ∈ [--..--] +[value] Values at end of function main2: + b ∈ [--..--] + d ∈ [--..--] +[value] Values at end of function main3: + x ∈ [--..--] +[value] Values at end of function main: + H ∈ {{ &K }} + G ∈ [--..--] + K ∈ [--..--] + L ∈ [--..--] + b ∈ [--..--] + d ∈ [--..--] +[from] Computing for function g1 +[from] Computing for function g <-g1 +[from] Done for function g +[from] Done for function g1 +[from] Computing for function g2 +[from] Done for function g2 +[from] Computing for function main1 +[from] Computing for function crypt <-main1 +[from] Done for function crypt +[from] Done for function main1 +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function main3 +[from] Computing for function f <-main3 +[from] Done for function f +[from] Done for function main3 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function crypt: + G FROM G; K (and SELF) + K FROM P + L FROM \nothing +[from] Function f: + x FROM x (and SELF) +[from] Function g: + b FROM a; c (and SELF) + d FROM a; c (and SELF) +[from] Function g1: + b FROM a; c (and SELF) + d FROM a; c (and SELF) +[from] Function g2: + b FROM a; c (and SELF) + d FROM a; c (and SELF) +[from] Function main1: + H FROM \nothing + G FROM G; K (and SELF) + K FROM P + L FROM \nothing +[from] Function main2: + b FROM a; c (and SELF) + d FROM a; c (and SELF) +[from] Function main3: + \result FROM \nothing +[from] Function main: + H FROM \nothing + G FROM G; K (and SELF) + K FROM P + L FROM \nothing + b FROM a; c (and SELF) + d FROM a; c (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function g1: + b +[inout] Inputs for function g1: + a +[inout] Out (internal) for function g2: + d +[inout] Inputs for function g2: + c +[inout] Out (internal) for function main1: + H; G; K; L +[inout] Inputs for function main1: + G; K; P +[inout] Out (internal) for function main2: + b; d +[inout] Inputs for function main2: + a; c +[inout] Out (internal) for function main3: + x +[inout] Inputs for function main3: + \nothing +[inout] Out (internal) for function main: + H; G; K; L; b; d +[inout] Inputs for function main: + G; K; P; a; c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/overflow.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/overflow.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/overflow.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/overflow.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/overflow.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/overflow.i:20:[value] warning: 2's complement assumed for overflow +tests/misc/overflow.i:21:[value] warning: 2's complement assumed for overflow +tests/misc/overflow.i:22:[value] warning: 2's complement assumed for overflow +tests/misc/overflow.i:31:[value] warning: 2's complement assumed for overflow +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {18446744073709551615} + j ∈ {4294967295} + is ∈ {-1} + js ∈ {-1} + minjs ∈ {-2147483648} + maxjs ∈ {2147483647} + i1 ∈ {0} + j1 ∈ {0} + y ∈ {1; 100000} + x ∈ {0; 17050} + z ∈ {1000000; 1215752192} + t ∈ {-10000000; 727379968} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; j; is; js; minjs; maxjs; i1; j1; y; tmp; x; z; t; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/overflow_cast_float_int.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/overflow_cast_float_int.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/overflow_cast_float_int.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/overflow_cast_float_int.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,64 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/overflow_cast_float_int.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] +tests/misc/overflow_cast_float_int.i:16:[kernel] warning: overflow in conversion of vf1 ([2147483520. .. 2147483648.]) from + floating-point to integer. assert vf1 < 2147483648; +tests/misc/overflow_cast_float_int.i:20:[kernel] warning: overflow in conversion of - 2147483649.5 ({-2147483649.5}) from + floating-point to integer. assert -2147483649 < -2147483649.5; +[value] Recording results for main +[value] done for function main +tests/misc/overflow_cast_float_int.i:20:[value] Assertion 'Value,float_to_int' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + vf1 ∈ [2147483520. .. 2147483648.] or UNINITIALIZED + e ∈ [2147483520..2147483647] or UNINITIALIZED + d ∈ {2147483647} + c1 ∈ {2147483647} + c2 ∈ UNINITIALIZED + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + vf1; e; d; c1; c2; __retres +[inout] Inputs for function main: + v +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] +tests/misc/overflow_cast_float_int.i:16:[kernel] warning: overflow in conversion of vf1 ({2147483648.}) from floating-point to integer. + assert vf1 < 2147483648; +tests/misc/overflow_cast_float_int.i:20:[kernel] warning: overflow in conversion of - 2147483649.5 ({-2147483649.5}) from + floating-point to integer. assert -2147483649 < -2147483649.5; +[value] Recording results for main +[value] done for function main +tests/misc/overflow_cast_float_int.i:16:[value] Assertion 'Value,float_to_int' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + vf1 ∈ UNINITIALIZED + e ∈ UNINITIALIZED + d ∈ {2147483647} + c1 ∈ {2147483647} + c2 ∈ UNINITIALIZED + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + vf1; e; d; c1; c2; __retres +[inout] Inputs for function main: + v diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/overflow.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/overflow.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/overflow.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/overflow.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/overflow.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/overflow.i:20:[kernel] warning: signed overflow. assert 60000*y ≤ 2147483647; +tests/misc/overflow.i:21:[kernel] warning: signed overflow. assert (int)(y*1000)*1000 ≤ 2147483647; +tests/misc/overflow.i:22:[kernel] warning: signed overflow. assert -2147483648 ≤ (int)(-y)*10000000; +tests/misc/overflow.i:31:[kernel] warning: signed overflow. assert -c ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {18446744073709551615} + j ∈ {4294967295} + is ∈ {-1} + js ∈ {-1} + minjs ∈ {-2147483648} + maxjs ∈ {2147483647} + i1 ∈ {0} + j1 ∈ {0} + y ∈ {1; 100000} + x ∈ {0} + z ∈ {1000000} + t ∈ {-10000000} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; j; is; js; minjs; maxjs; i1; j1; y; tmp; x; z; t; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/packed.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/packed.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/packed.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/packed.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,24 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/packed.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/paths.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/paths.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/paths.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/paths.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,105 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/paths.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} + c ∈ {0} + d ∈ {0} + e ∈ {0} + i ∈ {0} + d1 ∈ {0} + d2 ∈ {0} + d3 ∈ {0} + d4 ∈ {0} + X1 ∈ {0} + X2 ∈ {0} + X3 ∈ {0} + X4 ∈ {0} + X5 ∈ {0} + X ∈ {0} + t[0] ∈ {{ &f1 }} + [1] ∈ {{ &f2 }} + [2] ∈ {{ &f3 }} +[value] computing for function unknownfun <- main. + Called from tests/misc/paths.i:38. +[value] using specification for function unknownfun +[value] Done for function unknownfun +tests/misc/paths.i:41:[kernel] warning: signed overflow. assert r+1 ≤ 2147483647; +tests/misc/paths.i:44:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. assert 0 ≤ w < 3; +[value] computing for function f1 <- main. + Called from tests/misc/paths.i:44. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/misc/paths.i:44. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/misc/paths.i:44. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f <- main. + Called from tests/misc/paths.i:48. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[from] Computing for function f +[from] Now calling From callbacks +Computing path dependencies for function f +Path dependencies of f: fy +[from] Done for function f +[from] Computing for function f1 +[from] Now calling From callbacks +Computing path dependencies for function f1 +Path dependencies of f1: d1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Now calling From callbacks +Computing path dependencies for function f2 +Path dependencies of f2: \nothing +[from] Done for function f2 +[from] Computing for function f3 +[from] Now calling From callbacks +Computing path dependencies for function f3 +Path dependencies of f3: \nothing +[from] Done for function f3 +[from] Computing for function main +[from] Computing for function unknownfun <-main +[from] Done for function unknownfun +[from] Now calling From callbacks +Computing path dependencies for function main +Assuming library function unknownfun has no path dependencies +Path dependencies of main: b; X1; X2; X3; X4; t[0..2]; s; u; v; w; x; +y; z; +ww +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + i FROM i; fy (and SELF) + d2 FROM fx + \result FROM d3 +[from] Function f1: + X FROM d1; X1; X4 +[from] Function f2: + X FROM X2 +[from] Function f3: + X FROM X3 +[from] Function unknownfun: + \result FROM x +[from] Function main: + a FROM b; v (and SELF) + c FROM a; b; u + d FROM b; v + i FROM i; s; y; z; ww (and SELF) + d1 FROM x + d2 FROM y + d3 FROM z + d4 FROM ww + X FROM X1; X2; X3; X4; t[0..2]; w; x + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/pb.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/pb.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/pb.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/pb.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/pb.i (no preprocessing) +tests/misc/pb.i:2:[kernel] warning: Calling undeclared function f. Old style K&R code? +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/misc/pb.i:2. +tests/misc/pb.i:2:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] using specification for function f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + +[from] Computing for function main +[from] Computing for function f <-main +[from] Done for function f +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM \nothing +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/period.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/period.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/period.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/period.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,174 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/period.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + g[0..9] ∈ {0} + Frama_C_periodic_t_320[0] ∈ {1} + [1..59] ∈ {0} + u[0] ∈ {-1} + [1] ∈ {-2} + [2] ∈ {-3} + [3..59] ∈ {0} + v[0] ∈ {-1} + [1] ∈ {-2} + [2] ∈ {-3} + w[0..9] ∈ {0} + Au ∈ {0} + Bu ∈ {0} + Cu ∈ {0} + Du ∈ {0} + Eu ∈ {0} + Fu ∈ {0} + Gu ∈ {12} + Hu ∈ {0} + At ∈ {0} + Bt ∈ {0} + Ct ∈ {0} + Dt ∈ {0} + Et ∈ {0} + Ft ∈ {0} + Gt ∈ {12} + Ht ∈ {0} +[value] DUMPING STATE of file tests/misc/period.c line 49 + g[0..9] ∈ {0} + Frama_C_periodic_t_320[0] ∈ {1} + [1..3] ∈ {0} + [4] ∈ {24} + [5..12] ∈ {0} + [13] ∈ {2} + [14..40] ∈ {0} + [41] ∈ {6} + [42..59] ∈ {0} + u[0] ∈ {-1} + [1] ∈ {-2} + [2] ∈ {-3} + [3] ∈ {0} + [4] ∈ {24} + [5..12] ∈ {0} + [13] ∈ {2} + [14..40] ∈ {0} + [41] ∈ {6} + [42..59] ∈ {0} + v[0] ∈ {-1} + [1] ∈ {1} + [2] ∈ {-3} + w[0].s1 ∈ {1} + {[0]{.s2; .s3}; [1].s1} ∈ {0} + [1].s2 ∈ {2} + {[1].s3; [2]{.s1; .s2}} ∈ {0} + [2].s3 ∈ {3} + [3..9] ∈ {0} + Au ∈ {-1} + Bu ∈ {0} + Cu ∈ {-3} + Du ∈ {0} + Eu ∈ {0} + Fu ∈ {2} + Gu ∈ {12} + Hu ∈ {1} + At ∈ {1} + Bt ∈ {0} + Ct ∈ {0} + Dt ∈ {0} + Et ∈ {0} + Ft ∈ {2} + Gt ∈ {12} + Ht ∈ {1} + =END OF DUMP== +tests/misc/period.c:51:[value] warning: Operation {{ &g }} + {{ &g }} incurs a loss of precision +tests/misc/period.c:51:[value] Assigning imprecise value to p. + The imprecision originates from Arithmetic {tests/misc/period.c:51} +tests/misc/period.c:52:[value] Reading left-value p. + It contains a garbled mix of {g} because of Arithmetic + {tests/misc/period.c:51}. +tests/misc/period.c:52:[kernel] warning: out of bounds write. assert \valid(p); +tests/misc/period.c:53:[value] warning: Operation {{ &g }} + {{ &g }} incurs a loss of precision +tests/misc/period.c:53:[value] Assigning imprecise value to p. + The imprecision originates from Arithmetic {tests/misc/period.c:53} +tests/misc/period.c:54:[value] Reading left-value p. + It contains a garbled mix of {g} because of Arithmetic + {tests/misc/period.c:53}. +tests/misc/period.c:54:[kernel] warning: out of bounds read. assert \valid_read(p); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + g[0..9] ∈ + {{ garbled mix of &{vg} (origin: Misaligned {tests/misc/period.c:55}) }} + Frama_C_periodic_t_320[0] ∈ {1} + [1..3] ∈ {0} + [4] ∈ {24} + [5..12] ∈ {0} + [13] ∈ {2} + [14..40] ∈ {0} + [41] ∈ {6} + [42..59] ∈ {0} + u[0] ∈ {-1} + [1] ∈ {-2} + [2] ∈ {-3} + [3] ∈ {0} + [4] ∈ {24} + [5..12] ∈ {0} + [13] ∈ {2} + [14..40] ∈ {0} + [41] ∈ {6} + [42..59] ∈ {0} + v[0] ∈ {-1} + [1] ∈ {1} + [2] ∈ {-3} + w[0].s1 ∈ {1} + {[0]{.s2; .s3}; [1].s1} ∈ {0} + [1].s2 ∈ {2} + {[1].s3; [2]{.s1; .s2}} ∈ {0} + [2].s3 ∈ {3} + [3..9] ∈ {0} + Au ∈ {-1} + Bu ∈ {0} + Cu ∈ {-3} + Eu ∈ {0} + Fu ∈ {2} + Hu ∈ {1} + At ∈ {1} + Bt ∈ {0} + Ct ∈ {0} + Et ∈ {0} + Ft ∈ {2} + Ht ∈ {1} + p ∈ {{ &g + [0..36] }} + vg ∈ [--..--] +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + g[0..9] FROM \nothing (and SELF) + Frama_C_periodic_t_320[4] FROM Gt + {[13]; [41]} FROM Frama_C_periodic_t_320[20] + u[4] FROM Gu + {[13]; [41]} FROM u[22] + v[1] FROM \nothing + w{[0].s1; [1].s2; [2].s3} FROM \nothing + Au FROM u[0] + Bu FROM u[11] + Cu FROM u[2] + Eu FROM u[12] + Fu FROM u[22] + Hu FROM u[25] + At FROM Frama_C_periodic_t_320[0] + Bt FROM Frama_C_periodic_t_320[11] + Ct FROM Frama_C_periodic_t_320[2] + Et FROM Frama_C_periodic_t_320[12] + Ft FROM Frama_C_periodic_t_320[20] + Ht FROM Frama_C_periodic_t_320[25] +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + g[0..9]; Frama_C_periodic_t_320{[4]; [13]; [41]}; u{[4]; [13]; [41]}; + v[1]; w{[0].s1; [1].s2; [2].s3}; Au; Bu; Cu; Eu; Fu; Hu; At; Bt; Ct; + Et; Ft; Ht; p; vg +[inout] Inputs for function main: + g[0..9]; Frama_C_periodic_t_320{[0]; [2]; [11..12]; [20]; [25]}; + u{[0]; [2]; [11..12]; [22]; [25]}; w{[0].s1; [1].s2}; Fu; Gu; Ft; Gt diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/plevel.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/plevel.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/plevel.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/plevel.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,130 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/plevel.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..0xFFFE] ∈ {0} + i ∈ [--..--] +tests/misc/plevel.i:11:[value] Assertion got status unknown. +tests/misc/plevel.i:13:[value] Assertion got status unknown. +tests/misc/plevel.i:21:[kernel] more than 40(65) locations to update in array. Approximating. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +tests/misc/plevel.i:21:[kernel] more than 40(65) elements to enumerate. Approximating. +[value] Values at end of function main: + t[0..0xFF] ∈ {0} + [0x100..0x120] ∈ {0; 1} + [0x121..0x1FF] ∈ {0} + [0x200..0x240] ∈ {0; 2} + [0x241..0x2FF] ∈ {0} + [0x300] ∈ {0; 3} + [0x301] ∈ {0} + [0x302] ∈ {0; 3} + [0x303] ∈ {0} + [0x304] ∈ {0; 3} + [0x305] ∈ {0} + [0x306] ∈ {0; 3} + [0x307] ∈ {0} + [0x308] ∈ {0; 3} + [0x309] ∈ {0} + [0x30A] ∈ {0; 3} + [0x30B] ∈ {0} + [0x30C] ∈ {0; 3} + [0x30D] ∈ {0} + [0x30E] ∈ {0; 3} + [0x30F] ∈ {0} + [0x310] ∈ {0; 3} + [0x311] ∈ {0} + [0x312] ∈ {0; 3} + [0x313] ∈ {0} + [0x314] ∈ {0; 3} + [0x315] ∈ {0} + [0x316] ∈ {0; 3} + [0x317] ∈ {0} + [0x318] ∈ {0; 3} + [0x319] ∈ {0} + [0x31A] ∈ {0; 3} + [0x31B] ∈ {0} + [0x31C] ∈ {0; 3} + [0x31D] ∈ {0} + [0x31E] ∈ {0; 3} + [0x31F] ∈ {0} + [0x320] ∈ {0; 3} + [0x321] ∈ {0} + [0x322] ∈ {0; 3} + [0x323] ∈ {0} + [0x324] ∈ {0; 3} + [0x325] ∈ {0} + [0x326] ∈ {0; 3} + [0x327] ∈ {0} + [0x328] ∈ {0; 3} + [0x329] ∈ {0} + [0x32A] ∈ {0; 3} + [0x32B] ∈ {0} + [0x32C] ∈ {0; 3} + [0x32D] ∈ {0} + [0x32E] ∈ {0; 3} + [0x32F] ∈ {0} + [0x330] ∈ {0; 3} + [0x331] ∈ {0} + [0x332] ∈ {0; 3} + [0x333] ∈ {0} + [0x334] ∈ {0; 3} + [0x335] ∈ {0} + [0x336] ∈ {0; 3} + [0x337] ∈ {0} + [0x338] ∈ {0; 3} + [0x339] ∈ {0} + [0x33A] ∈ {0; 3} + [0x33B] ∈ {0} + [0x33C] ∈ {0; 3} + [0x33D] ∈ {0} + [0x33E] ∈ {0; 3} + [0x33F] ∈ {0} + [0x340] ∈ {0; 3} + [0x341..0x3FF] ∈ {0} + [0x400..0x480] ∈ {0; 4} + [0x481..0x4FF] ∈ {0} + [0x500][bits 0 to 15]# ∈ {0; 0x5555}%32, bits 0 to 15 + {[0x500][bits 16 to 31]; [0x501..0x520]} ∈ [--..--] + [0x521][bits 0 to 15]# ∈ {0; 0x5656}%32, bits 16 to 31 + {[0x521][bits 16 to 31]; [0x522..0x5FF]} ∈ {0} + [0x600][bits 0 to 15]# ∈ {0; 0x6666}%32, bits 0 to 15 + {[0x600][bits 16 to 31]; [0x601..0x640]} ∈ [--..--] + [0x641][bits 0 to 15]# ∈ {0; 0x6767}%32, bits 16 to 31 + {[0x641][bits 16 to 31]; [0x642..0x6FF]} ∈ {0} + [0x700..0x708] ∈ [--..--] + [0x709..0x7FF] ∈ {0} + [0x800..0x810] ∈ [--..--] + [0x811..0xFFFE] ∈ {0} + i1 ∈ [0..32] + i2 ∈ [0..64] + p ∈ {{ &t + [0x2000..0x2040] }} +[from] Computing for function main +tests/misc/plevel.i:21:[kernel] more than 40(65) dependencies to update. Approximating. +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + t{[0x100..0x120]; [0x200..0x240]; [0x300]; [0x302]; [0x304]; [0x306]; + [0x308]; [0x30A]; [0x30C]; [0x30E]; [0x310]; [0x312]; [0x314]; [0x316]; + [0x318]; [0x31A]; [0x31C]; [0x31E]; [0x320]; [0x322]; [0x324]; [0x326]; + [0x328]; [0x32A]; [0x32C]; [0x32E]; [0x330]; [0x332]; [0x334]; [0x336]; + [0x338]; [0x33A]; [0x33C]; [0x33E]; [0x340]; [0x400..0x480]; + {[0x500..0x520]; [0x521][bits 0 to 15]}; + {[0x600..0x640]; [0x641][bits 0 to 15]}; [0x700..0x708]; [0x800..0x810]} + FROM i (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + t{[0x100..0x120]; [0x200..0x240]; [0x300]; [0x302]; [0x304]; [0x306]; + [0x308]; [0x30A]; [0x30C]; [0x30E]; [0x310]; [0x312]; [0x314]; [0x316]; + [0x318]; [0x31A]; [0x31C]; [0x31E]; [0x320]; [0x322]; [0x324]; [0x326]; + [0x328]; [0x32A]; [0x32C]; [0x32E]; [0x330]; [0x332]; [0x334]; [0x336]; + [0x338]; [0x33A]; [0x33C]; [0x33E]; [0x340]; [0x400..0x480]; + {[0x500..0x520]; [0x521][bits 0 to 15]}; + {[0x600..0x640]; [0x641][bits 0 to 15]}; [0x700..0x708]; [0x800..0x810]}; + i1; i2; p +[inout] Inputs for function main: + i diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer2.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer2.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer2.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer2.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/pointer2.i (no preprocessing) +[value] Analyzing a complete application starting at h +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + p ∈ {0} + q ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} +[value] computing for function f <- h. + Called from tests/misc/pointer2.i:18. +[value] Recording results for f +[value] Done for function f +[value] Recording results for h +[value] done for function h +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + +[value] Values at end of function h: + q ∈ {{ &y }} +[from] Computing for function f +[from] Done for function f +[from] Computing for function h +[from] Done for function h +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM r +[from] Function h: + q FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + \nothing +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function h: + q +[inout] Inputs for function h: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/pointer2.i (no preprocessing) +[value] Analyzing a complete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + p ∈ {0} + q ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} +[value] computing for function f <- g. + Called from tests/misc/pointer2.i:14. +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + +[value] Values at end of function g: + p ∈ {{ &x }} +[from] Computing for function f +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM r +[from] Function g: + p FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + \nothing +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function g: + p +[inout] Inputs for function g: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer3.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer3.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,52 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/pointer3.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + c ∈ {0} + p ∈ {0} + q ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/pointer3.i:11. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/pointer3.i:12. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + c ∈ {2} +[value] Values at end of function main: + x ∈ {2} + c ∈ {2} + p ∈ {{ &x }} + q ∈ {{ &y }} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + c FROM \nothing + \result FROM x_0 +[from] Function main: + x FROM \nothing + c FROM \nothing + p FROM \nothing + q FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + c +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main: + x; c; p; q +[inout] Inputs for function main: + c; p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer4.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer4.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/pointer4.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + NULL[rbits 0 to 63] ∈ [--..--] + d ∈ {0} + e[0..9] ∈ {0} + c ∈ {0} +tests/misc/pointer4.i:12:[value] entering loop for the first time +tests/misc/pointer4.i:15:[kernel] warning: out of bounds write. assert \valid((int *)0x0+c); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + NULL[0..7]; d; e[0]; c +[inout] Inputs for function main: + c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer_arg.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer_arg.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer_arg.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer_arg.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/pointer_arg.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] +tests/misc/pointer_arg.i:4:[kernel] warning: out of bounds write. assert \valid(arg+0); +tests/misc/pointer_arg.i:5:[kernel] warning: out of bounds write. assert \valid(arg+1); +tests/misc/pointer_arg.i:6:[kernel] warning: out of bounds write. assert \valid(arg+2); +tests/misc/pointer_arg.i:6:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +tests/misc/pointer_arg.i:7:[kernel] warning: out of bounds write. assert \valid(arg+1000); +tests/misc/pointer_arg.i:7:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +tests/misc/pointer_arg.i:8:[kernel] warning: out of bounds write. assert \valid(arg+argc); +tests/misc/pointer_arg.i:11:[kernel] warning: out of bounds write. assert \valid(argv+1); +tests/misc/pointer_arg.i:15:[kernel] warning: out of bounds read. assert \valid_read(argv+0); +tests/misc/pointer_arg.i:15:[kernel] warning: out of bounds write. assert \valid(*(argv+0)+0); +[value] Recording results for main +[value] done for function main +tests/misc/pointer_arg.i:6:[value] Assertion 'Value,mem_access' got final status invalid. +tests/misc/pointer_arg.i:7:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + __retres ∈ {0} + S_argv[0] ∈ {{ &S_0_S_argv[0] }} + [1] ∈ {{ NULL ; &S_1_S_argv[0] ; "5069" }} + S_0_S_argv[0] ∈ {48} + [1] ∈ [--..--] + S_arg[0] ∈ {0; 4} + [1] ∈ {1; 4} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + S_argv[0..1] FROM v; argv (and SELF) + S_0_S_argv[0] FROM v; argv; S_argv[0] + S_arg[0..1] FROM arg; argc + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + __retres; S_argv[0..1]; S_0_S_argv[0]; S_arg[0..1] +[inout] Inputs for function main: + v; S_argv[0] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer_comparison.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer_comparison.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer_comparison.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer_comparison.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,47 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/pointer_comparison.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + p ∈ {0} +[value] Called Frama_C_show_each_1t({{ &x + {4} }}) +tests/misc/pointer_comparison.c:10:[kernel] warning: pointer comparison: assert \pointer_comparable(tmp_0, &y); + (tmp_0 from p++) +[value] Called Frama_C_show_each_2({{ &x + {8} }}) +[value] Called Frama_C_show_each_2e({{ &x + {8} }}) +tests/misc/pointer_comparison.c:12:[kernel] warning: pointer comparison: assert \pointer_comparable(tmp_1, &y); + (tmp_1 from p++) +[value] Called Frama_C_show_each_3({{ &x + {12} }}) +[value] Called Frama_C_show_each_3e({{ &x + {12} }}) +tests/misc/pointer_comparison.c:14:[kernel] warning: pointer comparison: assert \pointer_comparable(tmp_2, &y); + (tmp_2 from p++) +[value] Called Frama_C_show_each_4({{ &x + {16} }}) +[value] Called Frama_C_show_each_4e({{ &x + {16} }}) +tests/misc/pointer_comparison.c:16:[value] entering loop for the first time +tests/misc/pointer_comparison.c:16:[kernel] warning: pointer comparison: assert \pointer_comparable(tmp_3, &y); + (tmp_3 from p++) +[value] Called Frama_C_show_each_5({{ &x + {20} }}) +[value] Called Frama_C_show_each_5({{ &x + {20; 24} }}) +[value] Called Frama_C_show_each_5({{ &x + {20; 24; 28} }}) +[value] Called Frama_C_show_each_5({{ &x + [20..--],0%4 }}) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + p ∈ {{ &x + [20..--],0%4 }} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + p FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + p; tmp; tmp_0; tmp_1; tmp_2; tmp_3; __retres +[inout] Inputs for function main: + p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer_comparison.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer_comparison.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer_comparison.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer_comparison.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,43 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/pointer_comparison.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + p ∈ {0} +[value] Called Frama_C_show_each_1t({{ &x + {4} }}) +tests/misc/pointer_comparison.c:10:[kernel] warning: pointer comparison: assert \pointer_comparable(tmp_0, &y); + (tmp_0 from p++) +[value] Called Frama_C_show_each_2({{ &x + {8} }}) +tests/misc/pointer_comparison.c:12:[kernel] warning: pointer comparison: assert \pointer_comparable(tmp_1, &y); + (tmp_1 from p++) +[value] Called Frama_C_show_each_3({{ &x + {12} }}) +tests/misc/pointer_comparison.c:14:[kernel] warning: pointer comparison: assert \pointer_comparable(tmp_2, &y); + (tmp_2 from p++) +[value] Called Frama_C_show_each_4({{ &x + {16} }}) +tests/misc/pointer_comparison.c:16:[value] entering loop for the first time +tests/misc/pointer_comparison.c:16:[kernel] warning: pointer comparison: assert \pointer_comparable(tmp_3, &y); + (tmp_3 from p++) +[value] Called Frama_C_show_each_5({{ &x + {20} }}) +[value] Called Frama_C_show_each_5({{ &x + {20; 24} }}) +[value] Called Frama_C_show_each_5({{ &x + {20; 24; 28} }}) +[value] Called Frama_C_show_each_5({{ &x + [20..--],0%4 }}) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + p; tmp; tmp_0; tmp_1; tmp_2; tmp_3 +[inout] Inputs for function main: + p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer_comp.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer_comp.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer_comp.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer_comp.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,43 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/pointer_comp.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] + str1[0] ∈ {97} + [1] ∈ {98} + [2] ∈ {115} + [3] ∈ {100} + [4] ∈ {0} + str2[0] ∈ {97} + [1] ∈ {98} + [2..3] ∈ {100} + [4] ∈ {0} + s1 ∈ {0} + s2[0..7] ∈ {0} + NULL ∈ {0} +tests/misc/pointer_comp.c:33:[kernel] warning: pointer comparison: assert \pointer_comparable(&s2[9], NULL); +tests/misc/pointer_comp.c:34:[kernel] warning: pointer comparison: assert \pointer_comparable(&s2[9], &s2[9]); +tests/misc/pointer_comp.c:37:[kernel] warning: pointer comparison: assert \pointer_comparable(&str1, &str2); +tests/misc/pointer_comp.c:38:[kernel] warning: pointer comparison: assert \pointer_comparable(&s1, &s2); +tests/misc/pointer_comp.c:39:[kernel] warning: pointer comparison: + assert \pointer_comparable((void (*)())(&f), (void (*)())(&g)); +tests/misc/pointer_comp.c:46:[kernel] warning: pointer comparison: assert \pointer_comparable((void (*)())p, NULL); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {0; 1} + p ∈ {{ &f ; &g }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; p; tmp +[inout] Inputs for function main: + v; NULL diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer_int_cast.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer_int_cast.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer_int_cast.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer_int_cast.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/pointer_int_cast.i (no preprocessing) +[value] Analyzing a complete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + q ∈ {0} + x ∈ {0} + y ∈ {0} +[value] Recording results for g +[value] done for function g +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function g: + q ∈ {{ &y }} + y ∈ {0} + i ∈ {{ (int)&y }} +[from] Computing for function g +[from] Done for function g +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function g: + q FROM y + y FROM x; y +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function g: + q; y; i +[inout] Inputs for function g: + q; x; y diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer_loop.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer_loop.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer_loop.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer_loop.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/pointer_loop.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + base0 ∈ {7} + base1 ∈ {1} + base2 ∈ {2} + base_p[0] ∈ {{ &base1 }} + [1] ∈ {{ &base2 }} + Ctrl_p ∈ {0} + Ctrl[0..1] ∈ {0} + Slot[0].Elements ∈ {2} + [0].Ctrl_p ∈ {{ &ACtrl[0] }} + [1] ∈ {0} + ACtrl[0] ∈ {{ &Ctrl[0] }} + [1] ∈ {{ &Ctrl[1] }} +tests/misc/pointer_loop.i:13:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + base1 ∈ {1; 3; 4} + base2 ∈ {2; 3; 4} + Ctrl_p ∈ {{ NULL ; &base1 ; &base2 }} + i ∈ {2} + Elements ∈ {2} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + base1 FROM base_p[0..1] (and SELF) + base2 FROM base_p[0..1] (and SELF) + Ctrl_p FROM base_p[0..1] (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + base1; base2; Ctrl_p; i; Elements +[inout] Inputs for function main: + base_p[0..1]; Ctrl_p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/pointer.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/pointer.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,78 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/pointer.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + c ∈ {0} + p ∈ {0} + q ∈ {0} + T[0..9] ∈ {0} + cc1 ∈ {0} + cc2 ∈ {0} +[value] computing for function k <- main. + Called from tests/misc/pointer.i:37. +[value] computing for function l <- k <- main. + Called from tests/misc/pointer.i:29. +[value] Recording results for l +[value] Done for function l +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- main. + Called from tests/misc/pointer.i:38. +[value] computing for function l <- k <- main. + Called from tests/misc/pointer.i:29. +[value] Recording results for l +[value] Done for function l +[value] Recording results for k +[value] Done for function k +tests/misc/pointer.i:40:[kernel] warning: pointer comparison: assert \pointer_comparable((int *)T-1, (int *)T); +tests/misc/pointer.i:41:[kernel] warning: pointer comparison: assert \pointer_comparable((int *)T, &T[12]); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function l: + x ∈ {19} + c ∈ {19} +[value] Values at end of function k: + x ∈ {19} + c ∈ {19} +[value] Values at end of function main: + x ∈ {19} + c ∈ {19} + cc1 ∈ {1; 99} + cc2 ∈ {1; 99} +[from] Computing for function l +[from] Done for function l +[from] Computing for function k +[from] Done for function k +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function l: + x FROM x; y_0 (and SELF) + c FROM x; y_0 (and SELF) +[from] Function k: + x FROM x; x_0 (and SELF) + c FROM x; x_0 (and SELF) +[from] Function main: + x FROM \nothing + c FROM \nothing + cc1 FROM en + cc2 FROM en +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function l: + x; c +[inout] Inputs for function l: + x +[inout] Out (internal) for function k: + x; c +[inout] Inputs for function k: + x +[inout] Out (internal) for function main: + x; c; cc1; cc2 +[inout] Inputs for function main: + x; cc2 diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/postcondition.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/postcondition.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/postcondition.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/postcondition.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,297 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/postcondition.i (no preprocessing) +tests/misc/postcondition.i:68:[kernel] warning: Return statement with a value in function returning void +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + A ∈ {0} + B ∈ {0} + C ∈ {0} + D ∈ {0} + E ∈ {0} + EX ∈ {0} + X ∈ {0} + p ∈ {0} + TAB[0..9] ∈ {0} +[value] computing for function get_index <- main. + Called from tests/misc/postcondition.i:84. +tests/misc/postcondition.i:11:[value] Function get_index: precondition got status valid. +[value] Called Frama_C_show_each_cmd({1}) +tests/misc/postcondition.i:18:[value] entering loop for the first time +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +tests/misc/postcondition.i:20:[kernel] warning: No code nor implicit assigns clause for function u, generating default assigns from the prototype +[value] using specification for function u +[value] Done for function u +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +tests/misc/postcondition.i:12:[value] Function get_index: postcondition got status valid. +[value] Recording results for get_index +[value] Done for function get_index +[value] computing for function u <- main. + Called from tests/misc/postcondition.i:85. +[value] Done for function u +[value] computing for function bound <- main. + Called from tests/misc/postcondition.i:86. +tests/misc/postcondition.i:26:[value] Function bound: postcondition got status unknown. +[value] Recording results for bound +[value] Done for function bound +[value] computing for function u <- main. + Called from tests/misc/postcondition.i:87. +[value] Done for function u +[value] computing for function get_index <- main. + Called from tests/misc/postcondition.i:87. +tests/misc/postcondition.i:11:[value] Function get_index: precondition got status unknown. +[value] Called Frama_C_show_each_cmd({4}) +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +[value] computing for function u <- get_index <- main. + Called from tests/misc/postcondition.i:20. +[value] Done for function u +tests/misc/postcondition.i:12:[value] Function get_index: postcondition got status unknown. +[value] Recording results for get_index +[value] Done for function get_index +[value] computing for function u <- main. + Called from tests/misc/postcondition.i:88. +[value] Done for function u +[value] computing for function cap <- main. + Called from tests/misc/postcondition.i:89. +tests/misc/postcondition.i:89:[kernel] warning: No code nor implicit assigns clause for function cap, generating default assigns from the prototype +[value] using specification for function cap +[value] Done for function cap +[value] computing for function u <- main. + Called from tests/misc/postcondition.i:90. +[value] Done for function u +[value] computing for function t0 <- main. + Called from tests/misc/postcondition.i:90. +tests/misc/postcondition.i:33:[value] Function t0: postcondition got status valid. +[value] Recording results for t0 +[value] Done for function t0 +[value] computing for function u <- main. + Called from tests/misc/postcondition.i:91. +[value] Done for function u +[value] computing for function t1 <- main. + Called from tests/misc/postcondition.i:91. +tests/misc/postcondition.i:38:[value] Function t1: postcondition got status invalid. +[value] Recording results for t1 +[value] Done for function t1 +[value] computing for function u <- main. + Called from tests/misc/postcondition.i:92. +[value] Done for function u +[value] computing for function t2 <- main. + Called from tests/misc/postcondition.i:92. +tests/misc/postcondition.i:45:[value] Function t2: postcondition got status valid. +[value] Recording results for t2 +[value] Done for function t2 +[value] computing for function u <- main. + Called from tests/misc/postcondition.i:93. +[value] Done for function u +[value] computing for function t3 <- main. + Called from tests/misc/postcondition.i:93. +tests/misc/postcondition.i:60:[value] Function t3: postcondition got status valid. +[value] Recording results for t3 +[value] Done for function t3 +[value] computing for function t4 <- main. + Called from tests/misc/postcondition.i:94. +tests/misc/postcondition.i:65:[value] Function t4: postcondition got status valid. +[value] Recording results for t4 +[value] Done for function t4 +[value] computing for function u <- main. + Called from tests/misc/postcondition.i:95. +[value] Done for function u +[value] computing for function t5 <- main. + Called from tests/misc/postcondition.i:95. +tests/misc/postcondition.i:71:[value] Function t5: postcondition got status valid. +tests/misc/postcondition.i:72:[value] Function t5: postcondition got status valid. +[value] Recording results for t5 +[value] Done for function t5 +[value] computing for function f <- main. + Called from tests/misc/postcondition.i:96. +tests/misc/postcondition.i:78:[value] Function f: postcondition got status valid. +tests/misc/postcondition.i:79:[value] Function f: postcondition got status invalid. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function bound: + cmd ∈ {2} + __retres ∈ {0} +[value] Values at end of function f: + __retres ∈ {0} +[value] Values at end of function t0: + G ∈ {6} +[value] Values at end of function t1: + G ∈ {6} +[value] Values at end of function t2: + G ∈ {6} + p ∈ {{ &G }} +[value] Values at end of function t3: + TAB[0].a ∈ {12} + {[0]{.b; .c}; [1..9]} ∈ {0} +[value] Values at end of function t4: + x ∈ {4} + y ∈ {3} +[value] Values at end of function t5: + x ∈ {9} +[value] Values at end of function get_index: + ret ∈ [0..512] + __retres ∈ [0..512] +[value] Values at end of function main: + G ∈ {0; 6} + B ∈ {0} + C ∈ [0..299] + D ∈ [-100..100] + E ∈ [20..80] + EX ∈ [-100..8] + X ∈ {0; 8} + p ∈ {{ NULL ; &G }} + TAB[0].a ∈ {0; 12} + {[0]{.b; .c}; [1..9]} ∈ {0} +[from] Computing for function bound +[from] Done for function bound +[from] Computing for function f +[from] Done for function f +[from] Computing for function t0 +[from] Done for function t0 +[from] Computing for function t1 +[from] Done for function t1 +[from] Computing for function t2 +[from] Done for function t2 +[from] Computing for function t3 +[from] Done for function t3 +[from] Computing for function t4 +[from] Done for function t4 +[from] Computing for function t5 +[from] Done for function t5 +[from] Computing for function get_index +[from] Computing for function u <-get_index +[from] Done for function u +[from] Done for function get_index +[from] Computing for function main +[from] Computing for function cap <-main +[from] Done for function cap +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function bound: + \result FROM \nothing +[from] Function cap: + \result FROM min; max +[from] Function f: + \result FROM \nothing +[from] Function t0: + G FROM \nothing +[from] Function t1: + G FROM \nothing +[from] Function t2: + G FROM \nothing + p FROM \nothing +[from] Function t3: + TAB[0].a FROM \nothing +[from] Function t4: + NO EFFECTS +[from] Function t5: + \result FROM X +[from] Function u: + \result FROM \nothing +[from] Function get_index: + \result FROM cmd +[from] Function main: + G FROM \nothing (and SELF) + B FROM \nothing + C FROM \nothing + D FROM \nothing + E FROM \nothing + EX FROM \nothing + X FROM \nothing (and SELF) + p FROM \nothing (and SELF) + TAB[0].a FROM \nothing (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function bound: + cmd; __retres +[inout] Inputs for function bound: + \nothing +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function t0: + G +[inout] Inputs for function t0: + \nothing +[inout] Out (internal) for function t1: + G +[inout] Inputs for function t1: + \nothing +[inout] Out (internal) for function t2: + G; p +[inout] Inputs for function t2: + p +[inout] Out (internal) for function t3: + TAB[0].a +[inout] Inputs for function t3: + \nothing +[inout] Out (internal) for function t4: + x; y +[inout] Inputs for function t4: + \nothing +[inout] Out (internal) for function t5: + x +[inout] Inputs for function t5: + X +[inout] Out (internal) for function get_index: + ret; tmp; __retres +[inout] Inputs for function get_index: + \nothing +[inout] Out (internal) for function main: + G; B; C; D; E; EX; X; p; TAB[0].a; tmp; tmp_0; tmp_1; tmp_2; tmp_3; + tmp_4; tmp_5 +[inout] Inputs for function main: + B; X; p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/postcond_leaf.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/postcond_leaf.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/postcond_leaf.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/postcond_leaf.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,219 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/postcond_leaf.c (with preprocessing) +[value] user error: no assigns specified for function 'g1', for which a builtin + or the specification will be used. Potential unsoundness. +[value] user error: no assigns specified for function 'g2', for which a builtin + or the specification will be used. Potential unsoundness. +[value] user error: no assigns specified for function 'g3', for which a builtin + or the specification will be used. Potential unsoundness. +[value] warning: Generating potentially incorrect assigns for function 'g1' for which option -val-use-spec is set +tests/misc/postcond_leaf.c:37:[kernel] warning: No code nor implicit assigns clause for function g1, generating default assigns from the prototype +[value] warning: Generating potentially incorrect assigns for function 'g2' for which option -val-use-spec is set +tests/misc/postcond_leaf.c:44:[kernel] warning: No code nor implicit assigns clause for function g2, generating default assigns from the prototype +[value] warning: Generating potentially incorrect assigns for function 'g3' for which option -val-use-spec is set +tests/misc/postcond_leaf.c:48:[kernel] warning: No code nor implicit assigns clause for function g3, generating default assigns from the prototype +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ [--..--] +tests/misc/postcond_leaf.c:77:[kernel] warning: No code nor implicit assigns clause for function f1, generating default assigns from the prototype +[value] using specification for function f1 +tests/misc/postcond_leaf.c:21:[value] Function f1: this postcondition evaluates to false in this context. + If it is valid, either a precondition was not verified for this call, + or some assigns/from clauses are incomplete (or incorrect). +tests/misc/postcond_leaf.c:80:[kernel] warning: No code nor implicit assigns clause for function f2, generating default assigns from the prototype +[value] using specification for function f2 +tests/misc/postcond_leaf.c:26:[value] Function f2, behavior b: this postcondition evaluates to false in this + context. If it is valid, either a precondition was not verified for this + call, the behavior was inactive, or some assigns/from clauses are incomplete + (or incorrect). +tests/misc/postcond_leaf.c:83:[kernel] warning: No code nor implicit assigns clause for function f3, generating default assigns from the prototype +[value] using specification for function f3 +tests/misc/postcond_leaf.c:86:[kernel] warning: No code nor implicit assigns clause for function f4, generating default assigns from the prototype +[value] using specification for function f4 +[value] using specification for function g1 +tests/misc/postcond_leaf.c:36:[value] Function g1: this postcondition evaluates to false in this context. + If it is valid, either a precondition was not verified for this call, + or some assigns/from clauses are incomplete (or incorrect). +[value] using specification for function g2 +tests/misc/postcond_leaf.c:42:[value] Function g2, behavior b: this postcondition evaluates to false in this + context. If it is valid, either a precondition was not verified for this + call, the behavior was inactive, or some assigns/from clauses are incomplete + (or incorrect). +[value] using specification for function g3 +tests/misc/postcond_leaf.c:51:[value] Function h1: postcondition got status invalid. +tests/misc/postcond_leaf.c:57:[value] Function h2, behavior b: postcondition got status invalid. (Behavior may be inactive, no reduction performed.) +tests/misc/postcond_leaf.c:62:[value] Function h3: postcondition got status unknown. +tests/misc/postcond_leaf.c:66:[value] Function h4: postcondition got status invalid. +tests/misc/postcond_leaf.c:111:[kernel] warning: No code nor implicit assigns clause for function k, generating default assigns from the prototype +[value] using specification for function k +tests/misc/postcond_leaf.c:71:[value] Function k: this postcondition evaluates to false in this context. + If it is valid, either a precondition was not verified for this call, + or some assigns/from clauses are incomplete (or incorrect). +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function h1: + +[value] Values at end of function h2: + +[value] Values at end of function h3: + +[value] Values at end of function h4: + +[value] Values at end of function main: + +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f1' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file tests/misc/postcond_leaf.c, line 21) + Unverifiable but considered Valid. +[ - ] Assigns nothing + tried with Inferred annotations. +[ - ] Default behavior + tried with Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition for 'b' (file tests/misc/postcond_leaf.c, line 26) + Unverifiable but considered Valid. +[ - ] Assigns nothing + tried with Inferred annotations. +[ Valid ] Behavior 'b' + by Frama-C kernel. +[ - ] Default behavior + tried with Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f3' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file tests/misc/postcond_leaf.c, line 30) + Unverifiable but considered Valid. +[ - ] Assigns nothing + tried with Inferred annotations. +[ - ] Default behavior + tried with Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f4' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file tests/misc/postcond_leaf.c, line 33) + Unverifiable but considered Valid. +[ - ] Assigns nothing + tried with Inferred annotations. +[ - ] Default behavior + tried with Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g1' +-------------------------------------------------------------------------------- + +[ Alarm ] Post-condition (file tests/misc/postcond_leaf.c, line 36) + By Value, with pending: + - Unreachable g1 +[ - ] Assigns nothing + tried with Inferred annotations. +[ Alarm ] Default behavior + By Frama-C kernel, with pending: + - Assigns nothing + - Unreachable g1 + +-------------------------------------------------------------------------------- +--- Properties of Function 'g2' +-------------------------------------------------------------------------------- + +[ Alarm ] Post-condition for 'b' (file tests/misc/postcond_leaf.c, line 42) + By Value, with pending: + - Unreachable g2 +[ - ] Assigns nothing + tried with Inferred annotations. +[ Alarm ] Behavior 'b' + By Frama-C kernel, with pending: + - Unreachable g2 +[ - ] Default behavior + tried with Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g3' +-------------------------------------------------------------------------------- + +[ - ] Post-condition (file tests/misc/postcond_leaf.c, line 47) + tried with Value. +[ - ] Assigns nothing + tried with Inferred annotations. +[ - ] Default behavior + tried with Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h1' +-------------------------------------------------------------------------------- + +[ Alarm ] Post-condition (file tests/misc/postcond_leaf.c, line 51) + By Value, with pending: + - Unreachable h1 +[ Alarm ] Default behavior + By Frama-C kernel, with pending: + - Unreachable h1 + +-------------------------------------------------------------------------------- +--- Properties of Function 'h2' +-------------------------------------------------------------------------------- + +[ Alarm ] Post-condition for 'b' (file tests/misc/postcond_leaf.c, line 57) + By Value, with pending: + - Unreachable h2 +[ Alarm ] Behavior 'b' + By Frama-C kernel, with pending: + - Unreachable h2 + +-------------------------------------------------------------------------------- +--- Properties of Function 'h3' +-------------------------------------------------------------------------------- + +[ - ] Post-condition (file tests/misc/postcond_leaf.c, line 62) + tried with Value. +[ - ] Default behavior + tried with Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'h4' +-------------------------------------------------------------------------------- + +[ Alarm ] Post-condition (file tests/misc/postcond_leaf.c, line 66) + By Value, with pending: + - Unreachable h4 +[ Alarm ] Default behavior + By Frama-C kernel, with pending: + - Unreachable h4 + +-------------------------------------------------------------------------------- +--- Properties of Function 'k' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file tests/misc/postcond_leaf.c, line 71) + Unverifiable but considered Valid. +[ - ] Assigns (file tests/misc/postcond_leaf.c, line 72) + tried with Inferred annotations. +[ - ] Froms (generated) + tried with Inferred annotations. +[ - ] Froms (file tests/misc/postcond_leaf.c, line 72) + tried with Inferred annotations. +[ - ] Default behavior + tried with Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 5 Considered valid + 20 To be validated + 10 Alarms emitted + 36 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/pragma.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/pragma.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/pragma.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/pragma.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/pragma.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/precise_locations.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/precise_locations.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/precise_locations.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/precise_locations.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,3440 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/precise_locations.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..49] ∈ {0} + i ∈ {0} + j ∈ {0} + q ∈ {0} + r ∈ {0} +tests/misc/precise_locations.i:28:[value] entering loop for the first time +tests/misc/precise_locations.i:29:[value] entering loop for the first time +[value] DUMPING STATE of file tests/misc/precise_locations.i line 33 + t{[0..48]{.f1[0..4]; .f_inter[0..4]; .f2#; .f_inter2[0..4]; .[bits 328 to 351]#}; [49].f1[0..4]} ∈ + {0; 10} repeated %32 + [49]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + i ∈ {5} + j ∈ {0; 50} + q ∈ {0} + r ∈ {0} + v ∈ [--..--] + =END OF DUMP== +tests/misc/precise_locations.i:34:[value] entering loop for the first time +tests/misc/precise_locations.i:37:[value] entering loop for the first time +tests/misc/precise_locations.i:38:[value] entering loop for the first time +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] DUMPING STATE of file tests/misc/precise_locations.i line 42 + t[0].f1[0..1] ∈ {0; 10; 20} + [0].f1[2] ∈ [0..120],0%10 + [0].f1[3] ∈ {0; 10; 20} + [0]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [0].f2 ∈ [--..--] + [0]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [1].f1[0..1] ∈ {0; 10; 20} + [1].f1[2] ∈ [0..120],0%10 + [1].f1[3] ∈ {0; 10; 20} + [1]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [1].f2 ∈ [--..--] + [1]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [2].f1[0..1] ∈ {0; 10; 20} + [2].f1[2] ∈ [0..120],0%10 + [2].f1[3] ∈ {0; 10; 20} + [2]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [2].f2 ∈ [--..--] + [2]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [3].f1[0..1] ∈ {0; 10; 20} + [3].f1[2] ∈ [0..120],0%10 + [3].f1[3] ∈ {0; 10; 20} + [3]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [3].f2 ∈ [--..--] + [3]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [4].f1[0..1] ∈ {0; 10; 20} + [4].f1[2] ∈ [0..120],0%10 + [4].f1[3] ∈ {0; 10; 20} + [4]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [4].f2 ∈ [--..--] + [4]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [5].f1[0..1] ∈ {0; 10; 20} + [5].f1[2] ∈ [0..120],0%10 + [5].f1[3] ∈ {0; 10; 20} + [5]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [5].f2 ∈ [--..--] + [5]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [6].f1[0..1] ∈ {0; 10; 20} + [6].f1[2] ∈ [0..120],0%10 + [6].f1[3] ∈ {0; 10; 20} + [6]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [6].f2 ∈ [--..--] + [6]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [7].f1[0..1] ∈ {0; 10; 20} + [7].f1[2] ∈ [0..120],0%10 + [7].f1[3] ∈ {0; 10; 20} + [7]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [7].f2 ∈ [--..--] + [7]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [8].f1[0..1] ∈ {0; 10; 20} + [8].f1[2] ∈ [0..120],0%10 + [8].f1[3] ∈ {0; 10; 20} + [8]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [8].f2 ∈ [--..--] + [8]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [9].f1[0..1] ∈ {0; 10; 20} + [9].f1[2] ∈ [0..120],0%10 + [9].f1[3] ∈ {0; 10; 20} + [9]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [9].f2 ∈ [--..--] + [9]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [10].f1[0..1] ∈ {0; 10; 20} + [10].f1[2] ∈ [0..120],0%10 + [10].f1[3] ∈ {0; 10; 20} + [10]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [10].f2 ∈ [--..--] + [10]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [11].f1[0..1] ∈ {0; 10; 20} + [11].f1[2] ∈ [0..120],0%10 + [11].f1[3] ∈ {0; 10; 20} + [11]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [11].f2 ∈ [--..--] + [11]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [12].f1[0..1] ∈ {0; 10; 20} + [12].f1[2] ∈ [0..120],0%10 + [12].f1[3] ∈ {0; 10; 20} + [12]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [12].f2 ∈ [--..--] + [12]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [13].f1[0..1] ∈ {0; 10; 20} + [13].f1[2] ∈ [0..120],0%10 + [13].f1[3] ∈ {0; 10; 20} + [13]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [13].f2 ∈ [--..--] + [13]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [14].f1[0..1] ∈ {0; 10; 20} + [14].f1[2] ∈ [0..120],0%10 + [14].f1[3] ∈ {0; 10; 20} + [14]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [14].f2 ∈ [--..--] + [14]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [15].f1[0..1] ∈ {0; 10; 20} + [15].f1[2] ∈ [0..120],0%10 + [15].f1[3] ∈ {0; 10; 20} + [15]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [15].f2 ∈ [--..--] + [15]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [16].f1[0..1] ∈ {0; 10; 20} + [16].f1[2] ∈ [0..120],0%10 + [16].f1[3] ∈ {0; 10; 20} + [16]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [16].f2 ∈ [--..--] + [16]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [17].f1[0..1] ∈ {0; 10; 20} + [17].f1[2] ∈ [0..120],0%10 + [17].f1[3] ∈ {0; 10; 20} + [17]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [17].f2 ∈ [--..--] + [17]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [18].f1[0..1] ∈ {0; 10; 20} + [18].f1[2] ∈ [0..120],0%10 + [18].f1[3] ∈ {0; 10; 20} + [18]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [18].f2 ∈ [--..--] + [18]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [19].f1[0..1] ∈ {0; 10; 20} + [19].f1[2] ∈ [0..120],0%10 + [19].f1[3] ∈ {0; 10; 20} + [19]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [19].f2 ∈ [--..--] + [19]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [20].f1[0..1] ∈ {0; 10; 20} + [20].f1[2] ∈ [0..120],0%10 + [20].f1[3] ∈ {0; 10; 20} + [20]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [20].f2 ∈ [--..--] + [20]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [21].f1[0..1] ∈ {0; 10; 20} + [21].f1[2] ∈ [0..120],0%10 + [21].f1[3] ∈ {0; 10; 20} + [21]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [21].f2 ∈ [--..--] + [21]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [22].f1[0..1] ∈ {0; 10; 20} + [22].f1[2] ∈ [0..120],0%10 + [22].f1[3] ∈ {0; 10; 20} + [22]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [22].f2 ∈ [--..--] + [22]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [23].f1[0..1] ∈ {0; 10; 20} + [23].f1[2] ∈ [0..120],0%10 + [23].f1[3] ∈ {0; 10; 20} + [23]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [23].f2 ∈ [--..--] + [23]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [24].f1[0..1] ∈ {0; 10; 20} + [24].f1[2] ∈ [0..120],0%10 + [24].f1[3] ∈ {0; 10; 20} + [24]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [24].f2 ∈ [--..--] + [24]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [25].f1[0..1] ∈ {0; 10; 20} + [25].f1[2] ∈ [0..120],0%10 + [25].f1[3] ∈ {0; 10; 20} + [25]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [25].f2 ∈ [--..--] + [25]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [26].f1[0..1] ∈ {0; 10; 20} + [26].f1[2] ∈ [0..120],0%10 + [26].f1[3] ∈ {0; 10; 20} + [26]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [26].f2 ∈ [--..--] + [26]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [27].f1[0..1] ∈ {0; 10; 20} + [27].f1[2] ∈ [0..120],0%10 + [27].f1[3] ∈ {0; 10; 20} + [27]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [27].f2 ∈ [--..--] + [27]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [28].f1[0..1] ∈ {0; 10; 20} + [28].f1[2] ∈ [0..120],0%10 + [28].f1[3] ∈ {0; 10; 20} + [28]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [28].f2 ∈ [--..--] + [28]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [29].f1[0..1] ∈ {0; 10; 20} + [29].f1[2] ∈ [0..120],0%10 + [29].f1[3] ∈ {0; 10; 20} + [29]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [29].f2 ∈ [--..--] + [29]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [30].f1[0..1] ∈ {0; 10; 20} + [30].f1[2] ∈ [0..120],0%10 + [30].f1[3] ∈ {0; 10; 20} + [30]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [30].f2 ∈ [--..--] + [30]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [31].f1[0..1] ∈ {0; 10; 20} + [31].f1[2] ∈ [0..120],0%10 + [31].f1[3] ∈ {0; 10; 20} + [31]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [31].f2 ∈ [--..--] + [31]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [32].f1[0..1] ∈ {0; 10; 20} + [32].f1[2] ∈ [0..120],0%10 + [32].f1[3] ∈ {0; 10; 20} + [32]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [32].f2 ∈ [--..--] + [32]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [33].f1[0..1] ∈ {0; 10; 20} + [33].f1[2] ∈ [0..120],0%10 + [33].f1[3] ∈ {0; 10; 20} + [33]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [33].f2 ∈ [--..--] + [33]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [34].f1[0..1] ∈ {0; 10; 20} + [34].f1[2] ∈ [0..120],0%10 + [34].f1[3] ∈ {0; 10; 20} + [34]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [34].f2 ∈ [--..--] + [34]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [35].f1[0..1] ∈ {0; 10; 20} + [35].f1[2] ∈ [0..120],0%10 + [35].f1[3] ∈ {0; 10; 20} + [35]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [35].f2 ∈ [--..--] + [35]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [36].f1[0..1] ∈ {0; 10; 20} + [36].f1[2] ∈ [0..120],0%10 + [36].f1[3] ∈ {0; 10; 20} + [36]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [36].f2 ∈ [--..--] + [36]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [37].f1[0..1] ∈ {0; 10; 20} + [37].f1[2] ∈ [0..120],0%10 + [37].f1[3] ∈ {0; 10; 20} + [37]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [37].f2 ∈ [--..--] + [37]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [38].f1[0..1] ∈ {0; 10; 20} + [38].f1[2] ∈ [0..120],0%10 + [38].f1[3] ∈ {0; 10; 20} + [38]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [38].f2 ∈ [--..--] + [38]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [39].f1[0..1] ∈ {0; 10; 20} + [39].f1[2] ∈ [0..120],0%10 + [39].f1[3] ∈ {0; 10; 20} + [39]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [39].f2 ∈ [--..--] + [39]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [40].f1[0..1] ∈ {0; 10; 20} + [40].f1[2] ∈ [0..120],0%10 + [40].f1[3] ∈ {0; 10; 20} + [40]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [40].f2 ∈ [--..--] + [40]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [41].f1[0..1] ∈ {0; 10; 20} + [41].f1[2] ∈ [0..120],0%10 + [41].f1[3] ∈ {0; 10; 20} + [41]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [41].f2 ∈ [--..--] + [41]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [42].f1[0..1] ∈ {0; 10; 20} + [42].f1[2] ∈ [0..120],0%10 + [42].f1[3] ∈ {0; 10; 20} + [42]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [42].f2 ∈ [--..--] + [42]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [43].f1[0..1] ∈ {0; 10; 20} + [43].f1[2] ∈ [0..120],0%10 + [43].f1[3] ∈ {0; 10; 20} + [43]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [43].f2 ∈ [--..--] + [43]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [44].f1[0..1] ∈ {0; 10; 20} + [44].f1[2] ∈ [0..120],0%10 + [44].f1[3] ∈ {0; 10; 20} + [44]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [44].f2 ∈ [--..--] + [44]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [45].f1[0..1] ∈ {0; 10; 20} + [45].f1[2] ∈ [0..120],0%10 + [45].f1[3] ∈ {0; 10; 20} + [45]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [45].f2 ∈ [--..--] + [45]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [46].f1[0..1] ∈ {0; 10; 20} + [46].f1[2] ∈ [0..120],0%10 + [46].f1[3] ∈ {0; 10; 20} + [46]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [46].f2 ∈ [--..--] + [46]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [47].f1[0..1] ∈ {0; 10; 20} + [47].f1[2] ∈ [0..120],0%10 + [47].f1[3] ∈ {0; 10; 20} + [47]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [47].f2 ∈ [--..--] + [47]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [48].f1[0..1] ∈ {0; 10; 20} + [48].f1[2] ∈ [0..120],0%10 + [48].f1[3] ∈ {0; 10; 20} + [48]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [48].f2 ∈ [--..--] + [48]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [49].f1[0..1] ∈ {0; 10; 20} + [49].f1[2] ∈ [0..120],0%10 + [49].f1[3] ∈ {0; 10; 20} + [49].f1[4] ∈ [0..120],0%10 + [49].f_inter[0..4] ∈ {0} + [49].f2 ∈ {-99; 0} + [49]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + i ∈ {5} + j ∈ {50} + q ∈ {0} + r ∈ {0} + v ∈ [--..--] + =END OF DUMP== +tests/misc/precise_locations.i:44:[value] entering loop for the first time +tests/misc/precise_locations.i:45:[value] entering loop for the first time +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] using specification for function f +tests/misc/precise_locations.i:18:[value] Function f: precondition got status valid. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] using specification for function g +tests/misc/precise_locations.i:21:[value] Function g: precondition got status valid. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +tests/misc/precise_locations.i:46:[kernel] warning: signed overflow. assert t[j].f1[i]+1 ≤ 2147483647; +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +tests/misc/precise_locations.i:18:[value] Function f: precondition got status unknown. +[value] Done for function f +tests/misc/precise_locations.i:49:[kernel] warning: signed overflow. assert t[j].f1[i]+1 ≤ 2147483647; +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +tests/misc/precise_locations.i:21:[value] Function g: precondition got status unknown. +[value] Done for function g +tests/misc/precise_locations.i:52:[kernel] warning: signed overflow. assert -2147483648 ≤ q+r ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function ct: + __retres ∈ {20} +[value] Values at end of function main: + t[0].f1[0..1] ∈ {0; 10; 20} + [0].f1[2] ∈ [0..120],0%10 + [0].f1[3] ∈ {0; 10; 20} + [0]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [0].f2 ∈ [--..--] + [0]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [1].f1[0..1] ∈ {0; 10; 20} + [1].f1[2] ∈ [0..120],0%10 + [1].f1[3] ∈ {0; 10; 20} + [1]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [1].f2 ∈ [--..--] + [1]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [2].f1[0..1] ∈ {0; 10; 20} + [2].f1[2] ∈ [0..120],0%10 + [2].f1[3] ∈ {0; 10; 20} + [2]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [2].f2 ∈ [--..--] + [2]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [3].f1[0..1] ∈ {0; 10; 20} + [3].f1[2] ∈ [0..120],0%10 + [3].f1[3] ∈ {0; 10; 20} + [3]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [3].f2 ∈ [--..--] + [3]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [4].f1[0..1] ∈ {0; 10; 20} + [4].f1[2] ∈ [0..120],0%10 + [4].f1[3] ∈ {0; 10; 20} + [4]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [4].f2 ∈ [--..--] + [4]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [5].f1[0..1] ∈ {0; 10; 20} + [5].f1[2] ∈ [0..120],0%10 + [5].f1[3] ∈ {0; 10; 20} + [5]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [5].f2 ∈ [--..--] + [5]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [6].f1[0..1] ∈ {0; 10; 20} + [6].f1[2] ∈ [0..120],0%10 + [6].f1[3] ∈ {0; 10; 20} + [6]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [6].f2 ∈ [--..--] + [6]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [7].f1[0..1] ∈ {0; 10; 20} + [7].f1[2] ∈ [0..120],0%10 + [7].f1[3] ∈ {0; 10; 20} + [7]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [7].f2 ∈ [--..--] + [7]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [8].f1[0..1] ∈ {0; 10; 20} + [8].f1[2] ∈ [0..120],0%10 + [8].f1[3] ∈ {0; 10; 20} + [8]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [8].f2 ∈ [--..--] + [8]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [9].f1[0..1] ∈ {0; 10; 20} + [9].f1[2] ∈ [0..120],0%10 + [9].f1[3] ∈ {0; 10; 20} + [9]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [9].f2 ∈ [--..--] + [9]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [10].f1[0..1] ∈ {0; 10; 20} + [10].f1[2] ∈ [0..120],0%10 + [10].f1[3] ∈ {0; 10; 20} + [10]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [10].f2 ∈ [--..--] + [10]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [11].f1[0..1] ∈ {0; 10; 20} + [11].f1[2] ∈ [0..120],0%10 + [11].f1[3] ∈ {0; 10; 20} + [11]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [11].f2 ∈ [--..--] + [11]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [12].f1[0..1] ∈ {0; 10; 20} + [12].f1[2] ∈ [0..120],0%10 + [12].f1[3] ∈ {0; 10; 20} + [12]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [12].f2 ∈ [--..--] + [12]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [13].f1[0..1] ∈ {0; 10; 20} + [13].f1[2] ∈ [0..120],0%10 + [13].f1[3] ∈ {0; 10; 20} + [13]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [13].f2 ∈ [--..--] + [13]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [14].f1[0..1] ∈ {0; 10; 20} + [14].f1[2] ∈ [0..120],0%10 + [14].f1[3] ∈ {0; 10; 20} + [14]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [14].f2 ∈ [--..--] + [14]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [15].f1[0..1] ∈ {0; 10; 20} + [15].f1[2] ∈ [0..120],0%10 + [15].f1[3] ∈ {0; 10; 20} + [15]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [15].f2 ∈ [--..--] + [15]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [16].f1[0..1] ∈ {0; 10; 20} + [16].f1[2] ∈ [0..120],0%10 + [16].f1[3] ∈ {0; 10; 20} + [16]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [16].f2 ∈ [--..--] + [16]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [17].f1[0..1] ∈ {0; 10; 20} + [17].f1[2] ∈ [0..120],0%10 + [17].f1[3] ∈ {0; 10; 20} + [17]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [17].f2 ∈ [--..--] + [17]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [18].f1[0..1] ∈ {0; 10; 20} + [18].f1[2] ∈ [0..120],0%10 + [18].f1[3] ∈ {0; 10; 20} + [18]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [18].f2 ∈ [--..--] + [18]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [19].f1[0..1] ∈ {0; 10; 20} + [19].f1[2] ∈ [0..120],0%10 + [19].f1[3] ∈ {0; 10; 20} + [19]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [19].f2 ∈ [--..--] + [19]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [20].f1[0..1] ∈ {0; 10; 20} + [20].f1[2] ∈ [0..120],0%10 + [20].f1[3] ∈ {0; 10; 20} + [20]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [20].f2 ∈ [--..--] + [20]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [21].f1[0..1] ∈ {0; 10; 20} + [21].f1[2] ∈ [0..120],0%10 + [21].f1[3] ∈ {0; 10; 20} + [21]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [21].f2 ∈ [--..--] + [21]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [22].f1[0..1] ∈ {0; 10; 20} + [22].f1[2] ∈ [0..120],0%10 + [22].f1[3] ∈ {0; 10; 20} + [22]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [22].f2 ∈ [--..--] + [22]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [23].f1[0..1] ∈ {0; 10; 20} + [23].f1[2] ∈ [0..120],0%10 + [23].f1[3] ∈ {0; 10; 20} + [23]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [23].f2 ∈ [--..--] + [23]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [24].f1[0..1] ∈ {0; 10; 20} + [24].f1[2] ∈ [0..120],0%10 + [24].f1[3] ∈ {0; 10; 20} + [24]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [24].f2 ∈ [--..--] + [24]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [25].f1[0..1] ∈ {0; 10; 20} + [25].f1[2] ∈ [0..120],0%10 + [25].f1[3] ∈ {0; 10; 20} + [25]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [25].f2 ∈ [--..--] + [25]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [26].f1[0..1] ∈ {0; 10; 20} + [26].f1[2] ∈ [0..120],0%10 + [26].f1[3] ∈ {0; 10; 20} + [26]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [26].f2 ∈ [--..--] + [26]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [27].f1[0..1] ∈ {0; 10; 20} + [27].f1[2] ∈ [0..120],0%10 + [27].f1[3] ∈ {0; 10; 20} + [27]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [27].f2 ∈ [--..--] + [27]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [28].f1[0..1] ∈ {0; 10; 20} + [28].f1[2] ∈ [0..120],0%10 + [28].f1[3] ∈ {0; 10; 20} + [28]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [28].f2 ∈ [--..--] + [28]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [29].f1[0..1] ∈ {0; 10; 20} + [29].f1[2] ∈ [0..120],0%10 + [29].f1[3] ∈ {0; 10; 20} + [29]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [29].f2 ∈ [--..--] + [29]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [30].f1[0..1] ∈ {0; 10; 20} + [30].f1[2] ∈ [0..120],0%10 + [30].f1[3] ∈ {0; 10; 20} + [30]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [30].f2 ∈ [--..--] + [30]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [31].f1[0..1] ∈ {0; 10; 20} + [31].f1[2] ∈ [0..120],0%10 + [31].f1[3] ∈ {0; 10; 20} + [31]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [31].f2 ∈ [--..--] + [31]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [32].f1[0..1] ∈ {0; 10; 20} + [32].f1[2] ∈ [0..120],0%10 + [32].f1[3] ∈ {0; 10; 20} + [32]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [32].f2 ∈ [--..--] + [32]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [33].f1[0..1] ∈ {0; 10; 20} + [33].f1[2] ∈ [0..120],0%10 + [33].f1[3] ∈ {0; 10; 20} + [33]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [33].f2 ∈ [--..--] + [33]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [34].f1[0..1] ∈ {0; 10; 20} + [34].f1[2] ∈ [0..120],0%10 + [34].f1[3] ∈ {0; 10; 20} + [34]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [34].f2 ∈ [--..--] + [34]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [35].f1[0..1] ∈ {0; 10; 20} + [35].f1[2] ∈ [0..120],0%10 + [35].f1[3] ∈ {0; 10; 20} + [35]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [35].f2 ∈ [--..--] + [35]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [36].f1[0..1] ∈ {0; 10; 20} + [36].f1[2] ∈ [0..120],0%10 + [36].f1[3] ∈ {0; 10; 20} + [36]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [36].f2 ∈ [--..--] + [36]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [37].f1[0..1] ∈ {0; 10; 20} + [37].f1[2] ∈ [0..120],0%10 + [37].f1[3] ∈ {0; 10; 20} + [37]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [37].f2 ∈ [--..--] + [37]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [38].f1[0..1] ∈ {0; 10; 20} + [38].f1[2] ∈ [0..120],0%10 + [38].f1[3] ∈ {0; 10; 20} + [38]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [38].f2 ∈ [--..--] + [38]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [39].f1[0..1] ∈ {0; 10; 20} + [39].f1[2] ∈ [0..120],0%10 + [39].f1[3] ∈ {0; 10; 20} + [39]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [39].f2 ∈ [--..--] + [39]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [40].f1[0..1] ∈ {0; 10; 20} + [40].f1[2] ∈ [0..120],0%10 + [40].f1[3] ∈ {0; 10; 20} + [40]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [40].f2 ∈ [--..--] + [40]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [41].f1[0..1] ∈ {0; 10; 20} + [41].f1[2] ∈ [0..120],0%10 + [41].f1[3] ∈ {0; 10; 20} + [41]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [41].f2 ∈ [--..--] + [41]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [42].f1[0..1] ∈ {0; 10; 20} + [42].f1[2] ∈ [0..120],0%10 + [42].f1[3] ∈ {0; 10; 20} + [42]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [42].f2 ∈ [--..--] + [42]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [43].f1[0..1] ∈ {0; 10; 20} + [43].f1[2] ∈ [0..120],0%10 + [43].f1[3] ∈ {0; 10; 20} + [43]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [43].f2 ∈ [--..--] + [43]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [44].f1[0..1] ∈ {0; 10; 20} + [44].f1[2] ∈ [0..120],0%10 + [44].f1[3] ∈ {0; 10; 20} + [44]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [44].f2 ∈ [--..--] + [44]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [45].f1[0..1] ∈ {0; 10; 20} + [45].f1[2] ∈ [0..120],0%10 + [45].f1[3] ∈ {0; 10; 20} + [45]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [45].f2 ∈ [--..--] + [45]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [46].f1[0..1] ∈ {0; 10; 20} + [46].f1[2] ∈ [0..120],0%10 + [46].f1[3] ∈ {0; 10; 20} + [46]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [46].f2 ∈ [--..--] + [46]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [47].f1[0..1] ∈ {0; 10; 20} + [47].f1[2] ∈ [0..120],0%10 + [47].f1[3] ∈ {0; 10; 20} + [47]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [47].f2 ∈ [--..--] + [47]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [48].f1[0..1] ∈ {0; 10; 20} + [48].f1[2] ∈ [0..120],0%10 + [48].f1[3] ∈ {0; 10; 20} + [48]{.f1[4]; .f_inter[0..4]} ∈ [0..120],0%10 + [48].f2 ∈ [--..--] + [48]{.f_inter2[0..4]; .[bits 328 to 351]#} ∈ + [0..120],0%10 repeated %32, bits 8 to 191 + [49].f1[0..1] ∈ {0; 10; 20} + [49].f1[2] ∈ [0..120],0%10 + [49].f1[3] ∈ {0; 10; 20} + [49].f1[4] ∈ [0..120],0%10 + [49].f_inter[0..4] ∈ {0} + [49].f2 ∈ {-99; 0} + [49]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + i ∈ {5} + j ∈ {50} + q[bits 0 to 7] ∈ [--..--] + [bits 8 to 31]# ∈ [0..120],0%10%32, bits 8 to 31 + r ∈ [--..--] + __retres ∈ [--..--] +[from] Computing for function ct +[from] Done for function ct +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Computing for function f <-main +[from] Done for function f +[from] Computing for function g <-main +[from] Done for function g +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function ct: + \result FROM \nothing +[from] Function f: + NO EFFECTS +[from] Function g: + NO EFFECTS +[from] Function main: + t{{[0..48]; [49].f1[0..4]}; [49].f2} FROM \nothing (and SELF) + i FROM \nothing + j FROM \nothing + q FROM t{[0..48]; [49].f1[0..4]} (and SELF) + r FROM t{[0..48]; [49].f1[0..4]} (and SELF) + \result FROM t{[0..48]; [49].f1[0..4]}; q; r +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function ct: + __retres +[inout] Inputs for function ct: + \nothing +[inout] InOut (internal) for function ct: + Operational inputs: + \nothing + Operational inputs on termination: + \nothing + Sure outputs: + __retres +[inout] Out (internal) for function main: + t{{[0..48]; [49].f1[0..4]}; [49].f2}; i; j; q; r; __retres +[inout] Inputs for function main: + t{[0..48]; [49].f1[0..4]}; i; j; q; r +[inout] InOut (internal) for function main: + Operational inputs: + t{[0..48]; [49].f1[0..4]}; q; r + Operational inputs on termination: + t{[0..48]; [49].f1[0..4]}; q; r + Sure outputs: + i; j; __retres +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ - ] Pre-condition (file tests/misc/precise_locations.i, line 18) + tried with Call Preconditions. +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Pre-condition (file tests/misc/precise_locations.i, line 21) + tried with Call Preconditions. +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ - ] Assertion 'Value,signed_overflow' (file tests/misc/precise_locations.i, line 46) + tried with Value. +[ - ] Assertion 'Value,signed_overflow' (file tests/misc/precise_locations.i, line 49) + tried with Value. +[ - ] Assertion 'Value,signed_overflow' (file tests/misc/precise_locations.i, line 52) + tried with Value. +[ - ] Assertion 'Value,signed_overflow' (file tests/misc/precise_locations.i, line 52) + tried with Value. +[ - ] Instance of 'Pre-condition (file tests/misc/precise_locations.i, line 18)' at call 'f' (file tests/misc/precise_locations.i, line 48) + + tried with Value. +[ - ] Instance of 'Pre-condition (file tests/misc/precise_locations.i, line 21)' at call 'g' (file tests/misc/precise_locations.i, line 49) + + tried with Value. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 2 Completely validated + 2 Considered valid + 8 To be validated + 12 Total +-------------------------------------------------------------------------------- +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..49] ∈ {0} + i ∈ {0} + j ∈ {0} + q ∈ {0} + r ∈ {0} +[value] DUMPING STATE of file tests/misc/precise_locations.i line 33 + t[0].f1[0..4] ∈ {0; 10} + [0]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [1].f1[0..4] ∈ {0; 10} + [1]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [2].f1[0..4] ∈ {0; 10} + [2]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [3].f1[0..4] ∈ {0; 10} + [3]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [4].f1[0..4] ∈ {0; 10} + [4]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [5].f1[0..4] ∈ {0; 10} + [5]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [6].f1[0..4] ∈ {0; 10} + [6]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [7].f1[0..4] ∈ {0; 10} + [7]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [8].f1[0..4] ∈ {0; 10} + [8]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [9].f1[0..4] ∈ {0; 10} + [9]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [10].f1[0..4] ∈ {0; 10} + [10]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [11].f1[0..4] ∈ {0; 10} + [11]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [12].f1[0..4] ∈ {0; 10} + [12]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [13].f1[0..4] ∈ {0; 10} + [13]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [14].f1[0..4] ∈ {0; 10} + [14]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [15].f1[0..4] ∈ {0; 10} + [15]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [16].f1[0..4] ∈ {0; 10} + [16]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [17].f1[0..4] ∈ {0; 10} + [17]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [18].f1[0..4] ∈ {0; 10} + [18]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [19].f1[0..4] ∈ {0; 10} + [19]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [20].f1[0..4] ∈ {0; 10} + [20]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [21].f1[0..4] ∈ {0; 10} + [21]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [22].f1[0..4] ∈ {0; 10} + [22]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [23].f1[0..4] ∈ {0; 10} + [23]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [24].f1[0..4] ∈ {0; 10} + [24]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [25].f1[0..4] ∈ {0; 10} + [25]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [26].f1[0..4] ∈ {0; 10} + [26]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [27].f1[0..4] ∈ {0; 10} + [27]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [28].f1[0..4] ∈ {0; 10} + [28]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [29].f1[0..4] ∈ {0; 10} + [29]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [30].f1[0..4] ∈ {0; 10} + [30]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [31].f1[0..4] ∈ {0; 10} + [31]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [32].f1[0..4] ∈ {0; 10} + [32]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [33].f1[0..4] ∈ {0; 10} + [33]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [34].f1[0..4] ∈ {0; 10} + [34]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [35].f1[0..4] ∈ {0; 10} + [35]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [36].f1[0..4] ∈ {0; 10} + [36]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [37].f1[0..4] ∈ {0; 10} + [37]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [38].f1[0..4] ∈ {0; 10} + [38]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [39].f1[0..4] ∈ {0; 10} + [39]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [40].f1[0..4] ∈ {0; 10} + [40]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [41].f1[0..4] ∈ {0; 10} + [41]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [42].f1[0..4] ∈ {0; 10} + [42]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [43].f1[0..4] ∈ {0; 10} + [43]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [44].f1[0..4] ∈ {0; 10} + [44]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [45].f1[0..4] ∈ {0; 10} + [45]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [46].f1[0..4] ∈ {0; 10} + [46]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [47].f1[0..4] ∈ {0; 10} + [47]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [48].f1[0..4] ∈ {0; 10} + [48]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [49].f1[0..4] ∈ {0; 10} + [49]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + i ∈ {5} + j ∈ {0; 50} + q ∈ {0} + r ∈ {0} + v ∈ [--..--] + =END OF DUMP== +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] DUMPING STATE of file tests/misc/precise_locations.i line 42 + t[0].f1[0..1] ∈ {0; 10; 20} + [0].f1[2] ∈ [0..120],0%10 + [0].f1[3] ∈ {0; 10; 20} + [0].f1[4] ∈ [0..120],0%10 + [0].f_inter[0..4] ∈ {0} + [0].f2 ∈ {-99; 0} + [0]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [1].f1[0..1] ∈ {0; 10; 20} + [1].f1[2] ∈ [0..120],0%10 + [1].f1[3] ∈ {0; 10; 20} + [1].f1[4] ∈ [0..120],0%10 + [1].f_inter[0..4] ∈ {0} + [1].f2 ∈ {-99; 0} + [1]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [2].f1[0..1] ∈ {0; 10; 20} + [2].f1[2] ∈ [0..120],0%10 + [2].f1[3] ∈ {0; 10; 20} + [2].f1[4] ∈ [0..120],0%10 + [2].f_inter[0..4] ∈ {0} + [2].f2 ∈ {-99; 0} + [2]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [3].f1[0..1] ∈ {0; 10; 20} + [3].f1[2] ∈ [0..120],0%10 + [3].f1[3] ∈ {0; 10; 20} + [3].f1[4] ∈ [0..120],0%10 + [3].f_inter[0..4] ∈ {0} + [3].f2 ∈ {-99; 0} + [3]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [4].f1[0..1] ∈ {0; 10; 20} + [4].f1[2] ∈ [0..120],0%10 + [4].f1[3] ∈ {0; 10; 20} + [4].f1[4] ∈ [0..120],0%10 + [4].f_inter[0..4] ∈ {0} + [4].f2 ∈ {-99; 0} + [4]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [5].f1[0..1] ∈ {0; 10; 20} + [5].f1[2] ∈ [0..120],0%10 + [5].f1[3] ∈ {0; 10; 20} + [5].f1[4] ∈ [0..120],0%10 + [5].f_inter[0..4] ∈ {0} + [5].f2 ∈ {-99; 0} + [5]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [6].f1[0..1] ∈ {0; 10; 20} + [6].f1[2] ∈ [0..120],0%10 + [6].f1[3] ∈ {0; 10; 20} + [6].f1[4] ∈ [0..120],0%10 + [6].f_inter[0..4] ∈ {0} + [6].f2 ∈ {-99; 0} + [6]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [7].f1[0..1] ∈ {0; 10; 20} + [7].f1[2] ∈ [0..120],0%10 + [7].f1[3] ∈ {0; 10; 20} + [7].f1[4] ∈ [0..120],0%10 + [7].f_inter[0..4] ∈ {0} + [7].f2 ∈ {-99; 0} + [7]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [8].f1[0..1] ∈ {0; 10; 20} + [8].f1[2] ∈ [0..120],0%10 + [8].f1[3] ∈ {0; 10; 20} + [8].f1[4] ∈ [0..120],0%10 + [8].f_inter[0..4] ∈ {0} + [8].f2 ∈ {-99; 0} + [8]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [9].f1[0..1] ∈ {0; 10; 20} + [9].f1[2] ∈ [0..120],0%10 + [9].f1[3] ∈ {0; 10; 20} + [9].f1[4] ∈ [0..120],0%10 + [9].f_inter[0..4] ∈ {0} + [9].f2 ∈ {-99; 0} + [9]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [10].f1[0..1] ∈ {0; 10; 20} + [10].f1[2] ∈ [0..120],0%10 + [10].f1[3] ∈ {0; 10; 20} + [10].f1[4] ∈ [0..120],0%10 + [10].f_inter[0..4] ∈ {0} + [10].f2 ∈ {-99; 0} + [10]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [11].f1[0..1] ∈ {0; 10; 20} + [11].f1[2] ∈ [0..120],0%10 + [11].f1[3] ∈ {0; 10; 20} + [11].f1[4] ∈ [0..120],0%10 + [11].f_inter[0..4] ∈ {0} + [11].f2 ∈ {-99; 0} + [11]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [12].f1[0..1] ∈ {0; 10; 20} + [12].f1[2] ∈ [0..120],0%10 + [12].f1[3] ∈ {0; 10; 20} + [12].f1[4] ∈ [0..120],0%10 + [12].f_inter[0..4] ∈ {0} + [12].f2 ∈ {-99; 0} + [12]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [13].f1[0..1] ∈ {0; 10; 20} + [13].f1[2] ∈ [0..120],0%10 + [13].f1[3] ∈ {0; 10; 20} + [13].f1[4] ∈ [0..120],0%10 + [13].f_inter[0..4] ∈ {0} + [13].f2 ∈ {-99; 0} + [13]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [14].f1[0..1] ∈ {0; 10; 20} + [14].f1[2] ∈ [0..120],0%10 + [14].f1[3] ∈ {0; 10; 20} + [14].f1[4] ∈ [0..120],0%10 + [14].f_inter[0..4] ∈ {0} + [14].f2 ∈ {-99; 0} + [14]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [15].f1[0..1] ∈ {0; 10; 20} + [15].f1[2] ∈ [0..120],0%10 + [15].f1[3] ∈ {0; 10; 20} + [15].f1[4] ∈ [0..120],0%10 + [15].f_inter[0..4] ∈ {0} + [15].f2 ∈ {-99; 0} + [15]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [16].f1[0..1] ∈ {0; 10; 20} + [16].f1[2] ∈ [0..120],0%10 + [16].f1[3] ∈ {0; 10; 20} + [16].f1[4] ∈ [0..120],0%10 + [16].f_inter[0..4] ∈ {0} + [16].f2 ∈ {-99; 0} + [16]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [17].f1[0..1] ∈ {0; 10; 20} + [17].f1[2] ∈ [0..120],0%10 + [17].f1[3] ∈ {0; 10; 20} + [17].f1[4] ∈ [0..120],0%10 + [17].f_inter[0..4] ∈ {0} + [17].f2 ∈ {-99; 0} + [17]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [18].f1[0..1] ∈ {0; 10; 20} + [18].f1[2] ∈ [0..120],0%10 + [18].f1[3] ∈ {0; 10; 20} + [18].f1[4] ∈ [0..120],0%10 + [18].f_inter[0..4] ∈ {0} + [18].f2 ∈ {-99; 0} + [18]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [19].f1[0..1] ∈ {0; 10; 20} + [19].f1[2] ∈ [0..120],0%10 + [19].f1[3] ∈ {0; 10; 20} + [19].f1[4] ∈ [0..120],0%10 + [19].f_inter[0..4] ∈ {0} + [19].f2 ∈ {-99; 0} + [19]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [20].f1[0..1] ∈ {0; 10; 20} + [20].f1[2] ∈ [0..120],0%10 + [20].f1[3] ∈ {0; 10; 20} + [20].f1[4] ∈ [0..120],0%10 + [20].f_inter[0..4] ∈ {0} + [20].f2 ∈ {-99; 0} + [20]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [21].f1[0..1] ∈ {0; 10; 20} + [21].f1[2] ∈ [0..120],0%10 + [21].f1[3] ∈ {0; 10; 20} + [21].f1[4] ∈ [0..120],0%10 + [21].f_inter[0..4] ∈ {0} + [21].f2 ∈ {-99; 0} + [21]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [22].f1[0..1] ∈ {0; 10; 20} + [22].f1[2] ∈ [0..120],0%10 + [22].f1[3] ∈ {0; 10; 20} + [22].f1[4] ∈ [0..120],0%10 + [22].f_inter[0..4] ∈ {0} + [22].f2 ∈ {-99; 0} + [22]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [23].f1[0..1] ∈ {0; 10; 20} + [23].f1[2] ∈ [0..120],0%10 + [23].f1[3] ∈ {0; 10; 20} + [23].f1[4] ∈ [0..120],0%10 + [23].f_inter[0..4] ∈ {0} + [23].f2 ∈ {-99; 0} + [23]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [24].f1[0..1] ∈ {0; 10; 20} + [24].f1[2] ∈ [0..120],0%10 + [24].f1[3] ∈ {0; 10; 20} + [24].f1[4] ∈ [0..120],0%10 + [24].f_inter[0..4] ∈ {0} + [24].f2 ∈ {-99; 0} + [24]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [25].f1[0..1] ∈ {0; 10; 20} + [25].f1[2] ∈ [0..120],0%10 + [25].f1[3] ∈ {0; 10; 20} + [25].f1[4] ∈ [0..120],0%10 + [25].f_inter[0..4] ∈ {0} + [25].f2 ∈ {-99; 0} + [25]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [26].f1[0..1] ∈ {0; 10; 20} + [26].f1[2] ∈ [0..120],0%10 + [26].f1[3] ∈ {0; 10; 20} + [26].f1[4] ∈ [0..120],0%10 + [26].f_inter[0..4] ∈ {0} + [26].f2 ∈ {-99; 0} + [26]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [27].f1[0..1] ∈ {0; 10; 20} + [27].f1[2] ∈ [0..120],0%10 + [27].f1[3] ∈ {0; 10; 20} + [27].f1[4] ∈ [0..120],0%10 + [27].f_inter[0..4] ∈ {0} + [27].f2 ∈ {-99; 0} + [27]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [28].f1[0..1] ∈ {0; 10; 20} + [28].f1[2] ∈ [0..120],0%10 + [28].f1[3] ∈ {0; 10; 20} + [28].f1[4] ∈ [0..120],0%10 + [28].f_inter[0..4] ∈ {0} + [28].f2 ∈ {-99; 0} + [28]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [29].f1[0..1] ∈ {0; 10; 20} + [29].f1[2] ∈ [0..120],0%10 + [29].f1[3] ∈ {0; 10; 20} + [29].f1[4] ∈ [0..120],0%10 + [29].f_inter[0..4] ∈ {0} + [29].f2 ∈ {-99; 0} + [29]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [30].f1[0..1] ∈ {0; 10; 20} + [30].f1[2] ∈ [0..120],0%10 + [30].f1[3] ∈ {0; 10; 20} + [30].f1[4] ∈ [0..120],0%10 + [30].f_inter[0..4] ∈ {0} + [30].f2 ∈ {-99; 0} + [30]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [31].f1[0..1] ∈ {0; 10; 20} + [31].f1[2] ∈ [0..120],0%10 + [31].f1[3] ∈ {0; 10; 20} + [31].f1[4] ∈ [0..120],0%10 + [31].f_inter[0..4] ∈ {0} + [31].f2 ∈ {-99; 0} + [31]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [32].f1[0..1] ∈ {0; 10; 20} + [32].f1[2] ∈ [0..120],0%10 + [32].f1[3] ∈ {0; 10; 20} + [32].f1[4] ∈ [0..120],0%10 + [32].f_inter[0..4] ∈ {0} + [32].f2 ∈ {-99; 0} + [32]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [33].f1[0..1] ∈ {0; 10; 20} + [33].f1[2] ∈ [0..120],0%10 + [33].f1[3] ∈ {0; 10; 20} + [33].f1[4] ∈ [0..120],0%10 + [33].f_inter[0..4] ∈ {0} + [33].f2 ∈ {-99; 0} + [33]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [34].f1[0..1] ∈ {0; 10; 20} + [34].f1[2] ∈ [0..120],0%10 + [34].f1[3] ∈ {0; 10; 20} + [34].f1[4] ∈ [0..120],0%10 + [34].f_inter[0..4] ∈ {0} + [34].f2 ∈ {-99; 0} + [34]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [35].f1[0..1] ∈ {0; 10; 20} + [35].f1[2] ∈ [0..120],0%10 + [35].f1[3] ∈ {0; 10; 20} + [35].f1[4] ∈ [0..120],0%10 + [35].f_inter[0..4] ∈ {0} + [35].f2 ∈ {-99; 0} + [35]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [36].f1[0..1] ∈ {0; 10; 20} + [36].f1[2] ∈ [0..120],0%10 + [36].f1[3] ∈ {0; 10; 20} + [36].f1[4] ∈ [0..120],0%10 + [36].f_inter[0..4] ∈ {0} + [36].f2 ∈ {-99; 0} + [36]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [37].f1[0..1] ∈ {0; 10; 20} + [37].f1[2] ∈ [0..120],0%10 + [37].f1[3] ∈ {0; 10; 20} + [37].f1[4] ∈ [0..120],0%10 + [37].f_inter[0..4] ∈ {0} + [37].f2 ∈ {-99; 0} + [37]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [38].f1[0..1] ∈ {0; 10; 20} + [38].f1[2] ∈ [0..120],0%10 + [38].f1[3] ∈ {0; 10; 20} + [38].f1[4] ∈ [0..120],0%10 + [38].f_inter[0..4] ∈ {0} + [38].f2 ∈ {-99; 0} + [38]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [39].f1[0..1] ∈ {0; 10; 20} + [39].f1[2] ∈ [0..120],0%10 + [39].f1[3] ∈ {0; 10; 20} + [39].f1[4] ∈ [0..120],0%10 + [39].f_inter[0..4] ∈ {0} + [39].f2 ∈ {-99; 0} + [39]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [40].f1[0..1] ∈ {0; 10; 20} + [40].f1[2] ∈ [0..120],0%10 + [40].f1[3] ∈ {0; 10; 20} + [40].f1[4] ∈ [0..120],0%10 + [40].f_inter[0..4] ∈ {0} + [40].f2 ∈ {-99; 0} + [40]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [41].f1[0..1] ∈ {0; 10; 20} + [41].f1[2] ∈ [0..120],0%10 + [41].f1[3] ∈ {0; 10; 20} + [41].f1[4] ∈ [0..120],0%10 + [41].f_inter[0..4] ∈ {0} + [41].f2 ∈ {-99; 0} + [41]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [42].f1[0..1] ∈ {0; 10; 20} + [42].f1[2] ∈ [0..120],0%10 + [42].f1[3] ∈ {0; 10; 20} + [42].f1[4] ∈ [0..120],0%10 + [42].f_inter[0..4] ∈ {0} + [42].f2 ∈ {-99; 0} + [42]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [43].f1[0..1] ∈ {0; 10; 20} + [43].f1[2] ∈ [0..120],0%10 + [43].f1[3] ∈ {0; 10; 20} + [43].f1[4] ∈ [0..120],0%10 + [43].f_inter[0..4] ∈ {0} + [43].f2 ∈ {-99; 0} + [43]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [44].f1[0..1] ∈ {0; 10; 20} + [44].f1[2] ∈ [0..120],0%10 + [44].f1[3] ∈ {0; 10; 20} + [44].f1[4] ∈ [0..120],0%10 + [44].f_inter[0..4] ∈ {0} + [44].f2 ∈ {-99; 0} + [44]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [45].f1[0..1] ∈ {0; 10; 20} + [45].f1[2] ∈ [0..120],0%10 + [45].f1[3] ∈ {0; 10; 20} + [45].f1[4] ∈ [0..120],0%10 + [45].f_inter[0..4] ∈ {0} + [45].f2 ∈ {-99; 0} + [45]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [46].f1[0..1] ∈ {0; 10; 20} + [46].f1[2] ∈ [0..120],0%10 + [46].f1[3] ∈ {0; 10; 20} + [46].f1[4] ∈ [0..120],0%10 + [46].f_inter[0..4] ∈ {0} + [46].f2 ∈ {-99; 0} + [46]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [47].f1[0..1] ∈ {0; 10; 20} + [47].f1[2] ∈ [0..120],0%10 + [47].f1[3] ∈ {0; 10; 20} + [47].f1[4] ∈ [0..120],0%10 + [47].f_inter[0..4] ∈ {0} + [47].f2 ∈ {-99; 0} + [47]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [48].f1[0..1] ∈ {0; 10; 20} + [48].f1[2] ∈ [0..120],0%10 + [48].f1[3] ∈ {0; 10; 20} + [48].f1[4] ∈ [0..120],0%10 + [48].f_inter[0..4] ∈ {0} + [48].f2 ∈ {-99; 0} + [48]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [49].f1[0..1] ∈ {0; 10; 20} + [49].f1[2] ∈ [0..120],0%10 + [49].f1[3] ∈ {0; 10; 20} + [49].f1[4] ∈ [0..120],0%10 + [49].f_inter[0..4] ∈ {0} + [49].f2 ∈ {-99; 0} + [49]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + i ∈ {5} + j ∈ {50} + q ∈ {0} + r ∈ {0} + v ∈ [--..--] + =END OF DUMP== +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] Recording results for main +[value] done for function main +tests/misc/precise_locations.i:46:[value] Assertion 'Value,signed_overflow' got final status valid. +tests/misc/precise_locations.i:49:[value] Assertion 'Value,signed_overflow' got final status valid. +tests/misc/precise_locations.i:52:[value] Assertion 'Value,signed_overflow' got final status valid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function ct: + __retres ∈ {20} +[value] Values at end of function main: + t[0].f1[0..1] ∈ {0; 10; 20} + [0].f1[2] ∈ [0..120],0%10 + [0].f1[3] ∈ {0; 10; 20} + [0].f1[4] ∈ [0..120],0%10 + [0].f_inter[0..4] ∈ {0} + [0].f2 ∈ {-99; 0} + [0]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [1].f1[0..1] ∈ {0; 10; 20} + [1].f1[2] ∈ [0..120],0%10 + [1].f1[3] ∈ {0; 10; 20} + [1].f1[4] ∈ [0..120],0%10 + [1].f_inter[0..4] ∈ {0} + [1].f2 ∈ {-99; 0} + [1]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [2].f1[0..1] ∈ {0; 10; 20} + [2].f1[2] ∈ [0..120],0%10 + [2].f1[3] ∈ {0; 10; 20} + [2].f1[4] ∈ [0..120],0%10 + [2].f_inter[0..4] ∈ {0} + [2].f2 ∈ {-99; 0} + [2]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [3].f1[0..1] ∈ {0; 10; 20} + [3].f1[2] ∈ [0..120],0%10 + [3].f1[3] ∈ {0; 10; 20} + [3].f1[4] ∈ [0..120],0%10 + [3].f_inter[0..4] ∈ {0} + [3].f2 ∈ {-99; 0} + [3]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [4].f1[0..1] ∈ {0; 10; 20} + [4].f1[2] ∈ [0..120],0%10 + [4].f1[3] ∈ {0; 10; 20} + [4].f1[4] ∈ [0..120],0%10 + [4].f_inter[0..4] ∈ {0} + [4].f2 ∈ {-99; 0} + [4]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [5].f1[0..1] ∈ {0; 10; 20} + [5].f1[2] ∈ [0..120],0%10 + [5].f1[3] ∈ {0; 10; 20} + [5].f1[4] ∈ [0..120],0%10 + [5].f_inter[0..4] ∈ {0} + [5].f2 ∈ {-99; 0} + [5]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [6].f1[0..1] ∈ {0; 10; 20} + [6].f1[2] ∈ [0..120],0%10 + [6].f1[3] ∈ {0; 10; 20} + [6].f1[4] ∈ [0..120],0%10 + [6].f_inter[0..4] ∈ {0} + [6].f2 ∈ {-99; 0} + [6]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [7].f1[0..1] ∈ {0; 10; 20} + [7].f1[2] ∈ [0..120],0%10 + [7].f1[3] ∈ {0; 10; 20} + [7].f1[4] ∈ [0..120],0%10 + [7].f_inter[0..4] ∈ {0} + [7].f2 ∈ {-99; 0} + [7]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [8].f1[0..1] ∈ {0; 10; 20} + [8].f1[2] ∈ [0..120],0%10 + [8].f1[3] ∈ {0; 10; 20} + [8].f1[4] ∈ [0..120],0%10 + [8].f_inter[0..4] ∈ {0} + [8].f2 ∈ {-99; 0} + [8]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [9].f1[0..1] ∈ {0; 10; 20} + [9].f1[2] ∈ [0..120],0%10 + [9].f1[3] ∈ {0; 10; 20} + [9].f1[4] ∈ [0..120],0%10 + [9].f_inter[0..4] ∈ {0} + [9].f2 ∈ {-99; 0} + [9]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [10].f1[0..1] ∈ {0; 10; 20} + [10].f1[2] ∈ [0..120],0%10 + [10].f1[3] ∈ {0; 10; 20} + [10].f1[4] ∈ [0..120],0%10 + [10].f_inter[0..4] ∈ {0} + [10].f2 ∈ {-99; 0} + [10]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [11].f1[0..1] ∈ {0; 10; 20} + [11].f1[2] ∈ [0..120],0%10 + [11].f1[3] ∈ {0; 10; 20} + [11].f1[4] ∈ [0..120],0%10 + [11].f_inter[0..4] ∈ {0} + [11].f2 ∈ {-99; 0} + [11]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [12].f1[0..1] ∈ {0; 10; 20} + [12].f1[2] ∈ [0..120],0%10 + [12].f1[3] ∈ {0; 10; 20} + [12].f1[4] ∈ [0..120],0%10 + [12].f_inter[0..4] ∈ {0} + [12].f2 ∈ {-99; 0} + [12]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [13].f1[0..1] ∈ {0; 10; 20} + [13].f1[2] ∈ [0..120],0%10 + [13].f1[3] ∈ {0; 10; 20} + [13].f1[4] ∈ [0..120],0%10 + [13].f_inter[0..4] ∈ {0} + [13].f2 ∈ {-99; 0} + [13]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [14].f1[0..1] ∈ {0; 10; 20} + [14].f1[2] ∈ [0..120],0%10 + [14].f1[3] ∈ {0; 10; 20} + [14].f1[4] ∈ [0..120],0%10 + [14].f_inter[0..4] ∈ {0} + [14].f2 ∈ {-99; 0} + [14]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [15].f1[0..1] ∈ {0; 10; 20} + [15].f1[2] ∈ [0..120],0%10 + [15].f1[3] ∈ {0; 10; 20} + [15].f1[4] ∈ [0..120],0%10 + [15].f_inter[0..4] ∈ {0} + [15].f2 ∈ {-99; 0} + [15]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [16].f1[0..1] ∈ {0; 10; 20} + [16].f1[2] ∈ [0..120],0%10 + [16].f1[3] ∈ {0; 10; 20} + [16].f1[4] ∈ [0..120],0%10 + [16].f_inter[0..4] ∈ {0} + [16].f2 ∈ {-99; 0} + [16]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [17].f1[0..1] ∈ {0; 10; 20} + [17].f1[2] ∈ [0..120],0%10 + [17].f1[3] ∈ {0; 10; 20} + [17].f1[4] ∈ [0..120],0%10 + [17].f_inter[0..4] ∈ {0} + [17].f2 ∈ {-99; 0} + [17]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [18].f1[0..1] ∈ {0; 10; 20} + [18].f1[2] ∈ [0..120],0%10 + [18].f1[3] ∈ {0; 10; 20} + [18].f1[4] ∈ [0..120],0%10 + [18].f_inter[0..4] ∈ {0} + [18].f2 ∈ {-99; 0} + [18]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [19].f1[0..1] ∈ {0; 10; 20} + [19].f1[2] ∈ [0..120],0%10 + [19].f1[3] ∈ {0; 10; 20} + [19].f1[4] ∈ [0..120],0%10 + [19].f_inter[0..4] ∈ {0} + [19].f2 ∈ {-99; 0} + [19]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [20].f1[0..1] ∈ {0; 10; 20} + [20].f1[2] ∈ [0..120],0%10 + [20].f1[3] ∈ {0; 10; 20} + [20].f1[4] ∈ [0..120],0%10 + [20].f_inter[0..4] ∈ {0} + [20].f2 ∈ {-99; 0} + [20]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [21].f1[0..1] ∈ {0; 10; 20} + [21].f1[2] ∈ [0..120],0%10 + [21].f1[3] ∈ {0; 10; 20} + [21].f1[4] ∈ [0..120],0%10 + [21].f_inter[0..4] ∈ {0} + [21].f2 ∈ {-99; 0} + [21]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [22].f1[0..1] ∈ {0; 10; 20} + [22].f1[2] ∈ [0..120],0%10 + [22].f1[3] ∈ {0; 10; 20} + [22].f1[4] ∈ [0..120],0%10 + [22].f_inter[0..4] ∈ {0} + [22].f2 ∈ {-99; 0} + [22]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [23].f1[0..1] ∈ {0; 10; 20} + [23].f1[2] ∈ [0..120],0%10 + [23].f1[3] ∈ {0; 10; 20} + [23].f1[4] ∈ [0..120],0%10 + [23].f_inter[0..4] ∈ {0} + [23].f2 ∈ {-99; 0} + [23]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [24].f1[0..1] ∈ {0; 10; 20} + [24].f1[2] ∈ [0..120],0%10 + [24].f1[3] ∈ {0; 10; 20} + [24].f1[4] ∈ [0..120],0%10 + [24].f_inter[0..4] ∈ {0} + [24].f2 ∈ {-99; 0} + [24]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [25].f1[0..1] ∈ {0; 10; 20} + [25].f1[2] ∈ [0..120],0%10 + [25].f1[3] ∈ {0; 10; 20} + [25].f1[4] ∈ [0..120],0%10 + [25].f_inter[0..4] ∈ {0} + [25].f2 ∈ {-99; 0} + [25]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [26].f1[0..1] ∈ {0; 10; 20} + [26].f1[2] ∈ [0..120],0%10 + [26].f1[3] ∈ {0; 10; 20} + [26].f1[4] ∈ [0..120],0%10 + [26].f_inter[0..4] ∈ {0} + [26].f2 ∈ {-99; 0} + [26]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [27].f1[0..1] ∈ {0; 10; 20} + [27].f1[2] ∈ [0..120],0%10 + [27].f1[3] ∈ {0; 10; 20} + [27].f1[4] ∈ [0..120],0%10 + [27].f_inter[0..4] ∈ {0} + [27].f2 ∈ {-99; 0} + [27]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [28].f1[0..1] ∈ {0; 10; 20} + [28].f1[2] ∈ [0..120],0%10 + [28].f1[3] ∈ {0; 10; 20} + [28].f1[4] ∈ [0..120],0%10 + [28].f_inter[0..4] ∈ {0} + [28].f2 ∈ {-99; 0} + [28]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [29].f1[0..1] ∈ {0; 10; 20} + [29].f1[2] ∈ [0..120],0%10 + [29].f1[3] ∈ {0; 10; 20} + [29].f1[4] ∈ [0..120],0%10 + [29].f_inter[0..4] ∈ {0} + [29].f2 ∈ {-99; 0} + [29]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [30].f1[0..1] ∈ {0; 10; 20} + [30].f1[2] ∈ [0..120],0%10 + [30].f1[3] ∈ {0; 10; 20} + [30].f1[4] ∈ [0..120],0%10 + [30].f_inter[0..4] ∈ {0} + [30].f2 ∈ {-99; 0} + [30]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [31].f1[0..1] ∈ {0; 10; 20} + [31].f1[2] ∈ [0..120],0%10 + [31].f1[3] ∈ {0; 10; 20} + [31].f1[4] ∈ [0..120],0%10 + [31].f_inter[0..4] ∈ {0} + [31].f2 ∈ {-99; 0} + [31]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [32].f1[0..1] ∈ {0; 10; 20} + [32].f1[2] ∈ [0..120],0%10 + [32].f1[3] ∈ {0; 10; 20} + [32].f1[4] ∈ [0..120],0%10 + [32].f_inter[0..4] ∈ {0} + [32].f2 ∈ {-99; 0} + [32]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [33].f1[0..1] ∈ {0; 10; 20} + [33].f1[2] ∈ [0..120],0%10 + [33].f1[3] ∈ {0; 10; 20} + [33].f1[4] ∈ [0..120],0%10 + [33].f_inter[0..4] ∈ {0} + [33].f2 ∈ {-99; 0} + [33]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [34].f1[0..1] ∈ {0; 10; 20} + [34].f1[2] ∈ [0..120],0%10 + [34].f1[3] ∈ {0; 10; 20} + [34].f1[4] ∈ [0..120],0%10 + [34].f_inter[0..4] ∈ {0} + [34].f2 ∈ {-99; 0} + [34]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [35].f1[0..1] ∈ {0; 10; 20} + [35].f1[2] ∈ [0..120],0%10 + [35].f1[3] ∈ {0; 10; 20} + [35].f1[4] ∈ [0..120],0%10 + [35].f_inter[0..4] ∈ {0} + [35].f2 ∈ {-99; 0} + [35]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [36].f1[0..1] ∈ {0; 10; 20} + [36].f1[2] ∈ [0..120],0%10 + [36].f1[3] ∈ {0; 10; 20} + [36].f1[4] ∈ [0..120],0%10 + [36].f_inter[0..4] ∈ {0} + [36].f2 ∈ {-99; 0} + [36]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [37].f1[0..1] ∈ {0; 10; 20} + [37].f1[2] ∈ [0..120],0%10 + [37].f1[3] ∈ {0; 10; 20} + [37].f1[4] ∈ [0..120],0%10 + [37].f_inter[0..4] ∈ {0} + [37].f2 ∈ {-99; 0} + [37]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [38].f1[0..1] ∈ {0; 10; 20} + [38].f1[2] ∈ [0..120],0%10 + [38].f1[3] ∈ {0; 10; 20} + [38].f1[4] ∈ [0..120],0%10 + [38].f_inter[0..4] ∈ {0} + [38].f2 ∈ {-99; 0} + [38]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [39].f1[0..1] ∈ {0; 10; 20} + [39].f1[2] ∈ [0..120],0%10 + [39].f1[3] ∈ {0; 10; 20} + [39].f1[4] ∈ [0..120],0%10 + [39].f_inter[0..4] ∈ {0} + [39].f2 ∈ {-99; 0} + [39]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [40].f1[0..1] ∈ {0; 10; 20} + [40].f1[2] ∈ [0..120],0%10 + [40].f1[3] ∈ {0; 10; 20} + [40].f1[4] ∈ [0..120],0%10 + [40].f_inter[0..4] ∈ {0} + [40].f2 ∈ {-99; 0} + [40]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [41].f1[0..1] ∈ {0; 10; 20} + [41].f1[2] ∈ [0..120],0%10 + [41].f1[3] ∈ {0; 10; 20} + [41].f1[4] ∈ [0..120],0%10 + [41].f_inter[0..4] ∈ {0} + [41].f2 ∈ {-99; 0} + [41]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [42].f1[0..1] ∈ {0; 10; 20} + [42].f1[2] ∈ [0..120],0%10 + [42].f1[3] ∈ {0; 10; 20} + [42].f1[4] ∈ [0..120],0%10 + [42].f_inter[0..4] ∈ {0} + [42].f2 ∈ {-99; 0} + [42]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [43].f1[0..1] ∈ {0; 10; 20} + [43].f1[2] ∈ [0..120],0%10 + [43].f1[3] ∈ {0; 10; 20} + [43].f1[4] ∈ [0..120],0%10 + [43].f_inter[0..4] ∈ {0} + [43].f2 ∈ {-99; 0} + [43]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [44].f1[0..1] ∈ {0; 10; 20} + [44].f1[2] ∈ [0..120],0%10 + [44].f1[3] ∈ {0; 10; 20} + [44].f1[4] ∈ [0..120],0%10 + [44].f_inter[0..4] ∈ {0} + [44].f2 ∈ {-99; 0} + [44]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [45].f1[0..1] ∈ {0; 10; 20} + [45].f1[2] ∈ [0..120],0%10 + [45].f1[3] ∈ {0; 10; 20} + [45].f1[4] ∈ [0..120],0%10 + [45].f_inter[0..4] ∈ {0} + [45].f2 ∈ {-99; 0} + [45]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [46].f1[0..1] ∈ {0; 10; 20} + [46].f1[2] ∈ [0..120],0%10 + [46].f1[3] ∈ {0; 10; 20} + [46].f1[4] ∈ [0..120],0%10 + [46].f_inter[0..4] ∈ {0} + [46].f2 ∈ {-99; 0} + [46]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [47].f1[0..1] ∈ {0; 10; 20} + [47].f1[2] ∈ [0..120],0%10 + [47].f1[3] ∈ {0; 10; 20} + [47].f1[4] ∈ [0..120],0%10 + [47].f_inter[0..4] ∈ {0} + [47].f2 ∈ {-99; 0} + [47]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [48].f1[0..1] ∈ {0; 10; 20} + [48].f1[2] ∈ [0..120],0%10 + [48].f1[3] ∈ {0; 10; 20} + [48].f1[4] ∈ [0..120],0%10 + [48].f_inter[0..4] ∈ {0} + [48].f2 ∈ {-99; 0} + [48]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [49].f1[0..1] ∈ {0; 10; 20} + [49].f1[2] ∈ [0..120],0%10 + [49].f1[3] ∈ {0; 10; 20} + [49].f1[4] ∈ [0..120],0%10 + [49].f_inter[0..4] ∈ {0} + [49].f2 ∈ {-99; 0} + [49]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + i ∈ {5} + j ∈ {50} + q ∈ [0..120],0%10 + r ∈ [0..127] + __retres ∈ [0..247] +[from] Computing for function ct +[from] Done for function ct +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Computing for function f <-main +[from] Done for function f +[from] Computing for function g <-main +[from] Done for function g +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function ct: + \result FROM \nothing +[from] Function f: + NO EFFECTS +[from] Function g: + NO EFFECTS +[from] Function main: + t{[0].f1[0..4]; [0].f2; [1].f1[0..4]; [1].f2; [2].f1[0..4]; [2].f2; + [3].f1[0..4]; [3].f2; [4].f1[0..4]; [4].f2; [5].f1[0..4]; [5].f2; + [6].f1[0..4]; [6].f2; [7].f1[0..4]; [7].f2; [8].f1[0..4]; [8].f2; + [9].f1[0..4]; [9].f2; [10].f1[0..4]; [10].f2; [11].f1[0..4]; [11].f2; + [12].f1[0..4]; [12].f2; [13].f1[0..4]; [13].f2; [14].f1[0..4]; [14].f2; + [15].f1[0..4]; [15].f2; [16].f1[0..4]; [16].f2; [17].f1[0..4]; [17].f2; + [18].f1[0..4]; [18].f2; [19].f1[0..4]; [19].f2; [20].f1[0..4]; [20].f2; + [21].f1[0..4]; [21].f2; [22].f1[0..4]; [22].f2; [23].f1[0..4]; [23].f2; + [24].f1[0..4]; [24].f2; [25].f1[0..4]; [25].f2; [26].f1[0..4]; [26].f2; + [27].f1[0..4]; [27].f2; [28].f1[0..4]; [28].f2; [29].f1[0..4]; [29].f2; + [30].f1[0..4]; [30].f2; [31].f1[0..4]; [31].f2; [32].f1[0..4]; [32].f2; + [33].f1[0..4]; [33].f2; [34].f1[0..4]; [34].f2; [35].f1[0..4]; [35].f2; + [36].f1[0..4]; [36].f2; [37].f1[0..4]; [37].f2; [38].f1[0..4]; [38].f2; + [39].f1[0..4]; [39].f2; [40].f1[0..4]; [40].f2; [41].f1[0..4]; [41].f2; + [42].f1[0..4]; [42].f2; [43].f1[0..4]; [43].f2; [44].f1[0..4]; [44].f2; + [45].f1[0..4]; [45].f2; [46].f1[0..4]; [46].f2; [47].f1[0..4]; [47].f2; + [48].f1[0..4]; [48].f2; [49].f1[0..4]; [49].f2} + FROM \nothing (and SELF) + i FROM \nothing + j FROM \nothing + q FROM t{[0].f1[0..4]; [1].f1[0..4]; [2].f1[0..4]; [3].f1[0..4]; + [4].f1[0..4]; [5].f1[0..4]; [6].f1[0..4]; [7].f1[0..4]; + [8].f1[0..4]; [9].f1[0..4]; [10].f1[0..4]; [11].f1[0..4]; + [12].f1[0..4]; [13].f1[0..4]; [14].f1[0..4]; [15].f1[0..4]; + [16].f1[0..4]; [17].f1[0..4]; [18].f1[0..4]; [19].f1[0..4]; + [20].f1[0..4]; [21].f1[0..4]; [22].f1[0..4]; [23].f1[0..4]; + [24].f1[0..4]; [25].f1[0..4]; [26].f1[0..4]; [27].f1[0..4]; + [28].f1[0..4]; [29].f1[0..4]; [30].f1[0..4]; [31].f1[0..4]; + [32].f1[0..4]; [33].f1[0..4]; [34].f1[0..4]; [35].f1[0..4]; + [36].f1[0..4]; [37].f1[0..4]; [38].f1[0..4]; [39].f1[0..4]; + [40].f1[0..4]; [41].f1[0..4]; [42].f1[0..4]; [43].f1[0..4]; + [44].f1[0..4]; [45].f1[0..4]; [46].f1[0..4]; [47].f1[0..4]; + [48].f1[0..4]; [49].f1[0..4]} (and SELF) + r FROM t{[0].f1[0..4]; [1].f1[0..4]; [2].f1[0..4]; [3].f1[0..4]; + [4].f1[0..4]; [5].f1[0..4]; [6].f1[0..4]; [7].f1[0..4]; + [8].f1[0..4]; [9].f1[0..4]; [10].f1[0..4]; [11].f1[0..4]; + [12].f1[0..4]; [13].f1[0..4]; [14].f1[0..4]; [15].f1[0..4]; + [16].f1[0..4]; [17].f1[0..4]; [18].f1[0..4]; [19].f1[0..4]; + [20].f1[0..4]; [21].f1[0..4]; [22].f1[0..4]; [23].f1[0..4]; + [24].f1[0..4]; [25].f1[0..4]; [26].f1[0..4]; [27].f1[0..4]; + [28].f1[0..4]; [29].f1[0..4]; [30].f1[0..4]; [31].f1[0..4]; + [32].f1[0..4]; [33].f1[0..4]; [34].f1[0..4]; [35].f1[0..4]; + [36].f1[0..4]; [37].f1[0..4]; [38].f1[0..4]; [39].f1[0..4]; + [40].f1[0..4]; [41].f1[0..4]; [42].f1[0..4]; [43].f1[0..4]; + [44].f1[0..4]; [45].f1[0..4]; [46].f1[0..4]; [47].f1[0..4]; + [48].f1[0..4]; [49].f1[0..4]} (and SELF) + \result FROM t{[0].f1[0..4]; [1].f1[0..4]; [2].f1[0..4]; [3].f1[0..4]; + [4].f1[0..4]; [5].f1[0..4]; [6].f1[0..4]; [7].f1[0..4]; + [8].f1[0..4]; [9].f1[0..4]; [10].f1[0..4]; [11].f1[0..4]; + [12].f1[0..4]; [13].f1[0..4]; [14].f1[0..4]; [15].f1[0..4]; + [16].f1[0..4]; [17].f1[0..4]; [18].f1[0..4]; [19].f1[0..4]; + [20].f1[0..4]; [21].f1[0..4]; [22].f1[0..4]; [23].f1[0..4]; + [24].f1[0..4]; [25].f1[0..4]; [26].f1[0..4]; [27].f1[0..4]; + [28].f1[0..4]; [29].f1[0..4]; [30].f1[0..4]; [31].f1[0..4]; + [32].f1[0..4]; [33].f1[0..4]; [34].f1[0..4]; [35].f1[0..4]; + [36].f1[0..4]; [37].f1[0..4]; [38].f1[0..4]; [39].f1[0..4]; + [40].f1[0..4]; [41].f1[0..4]; [42].f1[0..4]; [43].f1[0..4]; + [44].f1[0..4]; [45].f1[0..4]; [46].f1[0..4]; [47].f1[0..4]; + [48].f1[0..4]; [49].f1[0..4]}; + q; r +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function ct: + __retres +[inout] Inputs for function ct: + \nothing +[inout] InOut (internal) for function ct: + Operational inputs: + \nothing + Operational inputs on termination: + \nothing + Sure outputs: + __retres +[inout] Out (internal) for function main: + t{[0].f1[0..4]; [0].f2; [1].f1[0..4]; [1].f2; [2].f1[0..4]; [2].f2; + [3].f1[0..4]; [3].f2; [4].f1[0..4]; [4].f2; [5].f1[0..4]; [5].f2; + [6].f1[0..4]; [6].f2; [7].f1[0..4]; [7].f2; [8].f1[0..4]; [8].f2; + [9].f1[0..4]; [9].f2; [10].f1[0..4]; [10].f2; [11].f1[0..4]; [11].f2; + [12].f1[0..4]; [12].f2; [13].f1[0..4]; [13].f2; [14].f1[0..4]; [14].f2; + [15].f1[0..4]; [15].f2; [16].f1[0..4]; [16].f2; [17].f1[0..4]; [17].f2; + [18].f1[0..4]; [18].f2; [19].f1[0..4]; [19].f2; [20].f1[0..4]; [20].f2; + [21].f1[0..4]; [21].f2; [22].f1[0..4]; [22].f2; [23].f1[0..4]; [23].f2; + [24].f1[0..4]; [24].f2; [25].f1[0..4]; [25].f2; [26].f1[0..4]; [26].f2; + [27].f1[0..4]; [27].f2; [28].f1[0..4]; [28].f2; [29].f1[0..4]; [29].f2; + [30].f1[0..4]; [30].f2; [31].f1[0..4]; [31].f2; [32].f1[0..4]; [32].f2; + [33].f1[0..4]; [33].f2; [34].f1[0..4]; [34].f2; [35].f1[0..4]; [35].f2; + [36].f1[0..4]; [36].f2; [37].f1[0..4]; [37].f2; [38].f1[0..4]; [38].f2; + [39].f1[0..4]; [39].f2; [40].f1[0..4]; [40].f2; [41].f1[0..4]; [41].f2; + [42].f1[0..4]; [42].f2; [43].f1[0..4]; [43].f2; [44].f1[0..4]; [44].f2; + [45].f1[0..4]; [45].f2; [46].f1[0..4]; [46].f2; [47].f1[0..4]; [47].f2; + [48].f1[0..4]; [48].f2; [49].f1[0..4]; [49].f2}; i; j; q; r; __retres +[inout] Inputs for function main: + t{[0].f1[0..4]; [1].f1[0..4]; [2].f1[0..4]; [3].f1[0..4]; [4].f1[0..4]; + [5].f1[0..4]; [6].f1[0..4]; [7].f1[0..4]; [8].f1[0..4]; [9].f1[0..4]; + [10].f1[0..4]; [11].f1[0..4]; [12].f1[0..4]; [13].f1[0..4]; + [14].f1[0..4]; [15].f1[0..4]; [16].f1[0..4]; [17].f1[0..4]; + [18].f1[0..4]; [19].f1[0..4]; [20].f1[0..4]; [21].f1[0..4]; + [22].f1[0..4]; [23].f1[0..4]; [24].f1[0..4]; [25].f1[0..4]; + [26].f1[0..4]; [27].f1[0..4]; [28].f1[0..4]; [29].f1[0..4]; + [30].f1[0..4]; [31].f1[0..4]; [32].f1[0..4]; [33].f1[0..4]; + [34].f1[0..4]; [35].f1[0..4]; [36].f1[0..4]; [37].f1[0..4]; + [38].f1[0..4]; [39].f1[0..4]; [40].f1[0..4]; [41].f1[0..4]; + [42].f1[0..4]; [43].f1[0..4]; [44].f1[0..4]; [45].f1[0..4]; + [46].f1[0..4]; [47].f1[0..4]; [48].f1[0..4]; [49].f1[0..4]}; i; j; + q; r +[inout] InOut (internal) for function main: + Operational inputs: + t{[0].f1[0..4]; [1].f1[0..4]; [2].f1[0..4]; [3].f1[0..4]; [4].f1[0..4]; + [5].f1[0..4]; [6].f1[0..4]; [7].f1[0..4]; [8].f1[0..4]; [9].f1[0..4]; + [10].f1[0..4]; [11].f1[0..4]; [12].f1[0..4]; [13].f1[0..4]; + [14].f1[0..4]; [15].f1[0..4]; [16].f1[0..4]; [17].f1[0..4]; + [18].f1[0..4]; [19].f1[0..4]; [20].f1[0..4]; [21].f1[0..4]; + [22].f1[0..4]; [23].f1[0..4]; [24].f1[0..4]; [25].f1[0..4]; + [26].f1[0..4]; [27].f1[0..4]; [28].f1[0..4]; [29].f1[0..4]; + [30].f1[0..4]; [31].f1[0..4]; [32].f1[0..4]; [33].f1[0..4]; + [34].f1[0..4]; [35].f1[0..4]; [36].f1[0..4]; [37].f1[0..4]; + [38].f1[0..4]; [39].f1[0..4]; [40].f1[0..4]; [41].f1[0..4]; + [42].f1[0..4]; [43].f1[0..4]; [44].f1[0..4]; [45].f1[0..4]; + [46].f1[0..4]; [47].f1[0..4]; [48].f1[0..4]; [49].f1[0..4]}; q; r + Operational inputs on termination: + t{[0].f1[0..4]; [1].f1[0..4]; [2].f1[0..4]; [3].f1[0..4]; [4].f1[0..4]; + [5].f1[0..4]; [6].f1[0..4]; [7].f1[0..4]; [8].f1[0..4]; [9].f1[0..4]; + [10].f1[0..4]; [11].f1[0..4]; [12].f1[0..4]; [13].f1[0..4]; + [14].f1[0..4]; [15].f1[0..4]; [16].f1[0..4]; [17].f1[0..4]; + [18].f1[0..4]; [19].f1[0..4]; [20].f1[0..4]; [21].f1[0..4]; + [22].f1[0..4]; [23].f1[0..4]; [24].f1[0..4]; [25].f1[0..4]; + [26].f1[0..4]; [27].f1[0..4]; [28].f1[0..4]; [29].f1[0..4]; + [30].f1[0..4]; [31].f1[0..4]; [32].f1[0..4]; [33].f1[0..4]; + [34].f1[0..4]; [35].f1[0..4]; [36].f1[0..4]; [37].f1[0..4]; + [38].f1[0..4]; [39].f1[0..4]; [40].f1[0..4]; [41].f1[0..4]; + [42].f1[0..4]; [43].f1[0..4]; [44].f1[0..4]; [45].f1[0..4]; + [46].f1[0..4]; [47].f1[0..4]; [48].f1[0..4]; [49].f1[0..4]}; q; r + Sure outputs: + i; j; __retres +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Valid ] Pre-condition (file tests/misc/precise_locations.i, line 18) + by Call Preconditions. +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Pre-condition (file tests/misc/precise_locations.i, line 21) + by Call Preconditions. +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion 'Value,signed_overflow' (file tests/misc/precise_locations.i, line 46) + by Value (v2). +[ Valid ] Assertion 'Value,signed_overflow' (file tests/misc/precise_locations.i, line 49) + by Value (v2). +[ Valid ] Assertion 'Value,signed_overflow' (file tests/misc/precise_locations.i, line 52) + by Value (v2). +[ Valid ] Assertion 'Value,signed_overflow' (file tests/misc/precise_locations.i, line 52) + by Value (v2). +[ Valid ] Instance of 'Pre-condition (file tests/misc/precise_locations.i, line 18)' at call 'f' (file tests/misc/precise_locations.i, line 48) + + by Value (v2). +[ Valid ] Instance of 'Pre-condition (file tests/misc/precise_locations.i, line 21)' at call 'g' (file tests/misc/precise_locations.i, line 49) + + by Value (v2). + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 10 Completely validated + 2 Considered valid + 12 Total +-------------------------------------------------------------------------------- +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..49] ∈ {0} + i ∈ {0} + j ∈ {0} + q ∈ {0} + r ∈ {0} +[value] DUMPING STATE of file tests/misc/precise_locations.i line 33 + t[0].f1[0..4] ∈ {0; 10} + [0]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [1].f1[0..4] ∈ {0; 10} + [1]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [2].f1[0..4] ∈ {0; 10} + [2]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [3].f1[0..4] ∈ {0; 10} + [3]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [4].f1[0..4] ∈ {0; 10} + [4]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [5].f1[0..4] ∈ {0; 10} + [5]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [6].f1[0..4] ∈ {0; 10} + [6]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [7].f1[0..4] ∈ {0; 10} + [7]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [8].f1[0..4] ∈ {0; 10} + [8]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [9].f1[0..4] ∈ {0; 10} + [9]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [10].f1[0..4] ∈ {0; 10} + [10]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [11].f1[0..4] ∈ {0; 10} + [11]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [12].f1[0..4] ∈ {0; 10} + [12]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [13].f1[0..4] ∈ {0; 10} + [13]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [14].f1[0..4] ∈ {0; 10} + [14]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [15].f1[0..4] ∈ {0; 10} + [15]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [16].f1[0..4] ∈ {0; 10} + [16]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [17].f1[0..4] ∈ {0; 10} + [17]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [18].f1[0..4] ∈ {0; 10} + [18]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [19].f1[0..4] ∈ {0; 10} + [19]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [20].f1[0..4] ∈ {0; 10} + [20]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [21].f1[0..4] ∈ {0; 10} + [21]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [22].f1[0..4] ∈ {0; 10} + [22]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [23].f1[0..4] ∈ {0; 10} + [23]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [24].f1[0..4] ∈ {0; 10} + [24]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [25].f1[0..4] ∈ {0; 10} + [25]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [26].f1[0..4] ∈ {0; 10} + [26]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [27].f1[0..4] ∈ {0; 10} + [27]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [28].f1[0..4] ∈ {0; 10} + [28]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [29].f1[0..4] ∈ {0; 10} + [29]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [30].f1[0..4] ∈ {0; 10} + [30]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [31].f1[0..4] ∈ {0; 10} + [31]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [32].f1[0..4] ∈ {0; 10} + [32]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [33].f1[0..4] ∈ {0; 10} + [33]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [34].f1[0..4] ∈ {0; 10} + [34]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [35].f1[0..4] ∈ {0; 10} + [35]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [36].f1[0..4] ∈ {0; 10} + [36]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [37].f1[0..4] ∈ {0; 10} + [37]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [38].f1[0..4] ∈ {0; 10} + [38]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [39].f1[0..4] ∈ {0; 10} + [39]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [40].f1[0..4] ∈ {0; 10} + [40]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [41].f1[0..4] ∈ {0; 10} + [41]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [42].f1[0..4] ∈ {0; 10} + [42]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [43].f1[0..4] ∈ {0; 10} + [43]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [44].f1[0..4] ∈ {0; 10} + [44]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [45].f1[0..4] ∈ {0; 10} + [45]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [46].f1[0..4] ∈ {0; 10} + [46]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [47].f1[0..4] ∈ {0; 10} + [47]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [48].f1[0..4] ∈ {0; 10} + [48]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [49].f1[0..4] ∈ {0; 10} + [49]{.f_inter[0..4]; .f2; .f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + i ∈ {5} + j ∈ {0; 50} + q ∈ {0} + r ∈ {0} + v ∈ [--..--] + =END OF DUMP== +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] computing for function ct <- main. + Called from tests/misc/precise_locations.i:39. +[value] Recording results for ct +[value] Done for function ct +[value] DUMPING STATE of file tests/misc/precise_locations.i line 42 + t[0].f1[0..4] ∈ {0; 10; 20} + [0].f_inter[0..4] ∈ {0} + [0].f2 ∈ {-99; 0} + [0]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [1].f1[0..4] ∈ {0; 10; 20} + [1].f_inter[0..4] ∈ {0} + [1].f2 ∈ {-99; 0} + [1]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [2].f1[0..4] ∈ {0; 10; 20} + [2].f_inter[0..4] ∈ {0} + [2].f2 ∈ {-99; 0} + [2]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [3].f1[0..4] ∈ {0; 10; 20} + [3].f_inter[0..4] ∈ {0} + [3].f2 ∈ {-99; 0} + [3]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [4].f1[0..4] ∈ {0; 10; 20} + [4].f_inter[0..4] ∈ {0} + [4].f2 ∈ {-99; 0} + [4]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [5].f1[0..4] ∈ {0; 10; 20} + [5].f_inter[0..4] ∈ {0} + [5].f2 ∈ {-99; 0} + [5]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [6].f1[0..4] ∈ {0; 10; 20} + [6].f_inter[0..4] ∈ {0} + [6].f2 ∈ {-99; 0} + [6]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [7].f1[0..4] ∈ {0; 10; 20} + [7].f_inter[0..4] ∈ {0} + [7].f2 ∈ {-99; 0} + [7]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [8].f1[0..4] ∈ {0; 10; 20} + [8].f_inter[0..4] ∈ {0} + [8].f2 ∈ {-99; 0} + [8]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [9].f1[0..4] ∈ {0; 10; 20} + [9].f_inter[0..4] ∈ {0} + [9].f2 ∈ {-99; 0} + [9]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [10].f1[0..4] ∈ {0; 10; 20} + [10].f_inter[0..4] ∈ {0} + [10].f2 ∈ {-99; 0} + [10]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [11].f1[0..4] ∈ {0; 10; 20} + [11].f_inter[0..4] ∈ {0} + [11].f2 ∈ {-99; 0} + [11]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [12].f1[0..4] ∈ {0; 10; 20} + [12].f_inter[0..4] ∈ {0} + [12].f2 ∈ {-99; 0} + [12]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [13].f1[0..4] ∈ {0; 10; 20} + [13].f_inter[0..4] ∈ {0} + [13].f2 ∈ {-99; 0} + [13]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [14].f1[0..4] ∈ {0; 10; 20} + [14].f_inter[0..4] ∈ {0} + [14].f2 ∈ {-99; 0} + [14]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [15].f1[0..4] ∈ {0; 10; 20} + [15].f_inter[0..4] ∈ {0} + [15].f2 ∈ {-99; 0} + [15]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [16].f1[0..4] ∈ {0; 10; 20} + [16].f_inter[0..4] ∈ {0} + [16].f2 ∈ {-99; 0} + [16]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [17].f1[0..4] ∈ {0; 10; 20} + [17].f_inter[0..4] ∈ {0} + [17].f2 ∈ {-99; 0} + [17]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [18].f1[0..4] ∈ {0; 10; 20} + [18].f_inter[0..4] ∈ {0} + [18].f2 ∈ {-99; 0} + [18]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [19].f1[0..4] ∈ {0; 10; 20} + [19].f_inter[0..4] ∈ {0} + [19].f2 ∈ {-99; 0} + [19]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [20].f1[0..4] ∈ {0; 10; 20} + [20].f_inter[0..4] ∈ {0} + [20].f2 ∈ {-99; 0} + [20]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [21].f1[0..4] ∈ {0; 10; 20} + [21].f_inter[0..4] ∈ {0} + [21].f2 ∈ {-99; 0} + [21]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [22].f1[0..4] ∈ {0; 10; 20} + [22].f_inter[0..4] ∈ {0} + [22].f2 ∈ {-99; 0} + [22]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [23].f1[0..4] ∈ {0; 10; 20} + [23].f_inter[0..4] ∈ {0} + [23].f2 ∈ {-99; 0} + [23]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [24].f1[0..4] ∈ {0; 10; 20} + [24].f_inter[0..4] ∈ {0} + [24].f2 ∈ {-99; 0} + [24]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [25].f1[0..4] ∈ {0; 10; 20} + [25].f_inter[0..4] ∈ {0} + [25].f2 ∈ {-99; 0} + [25]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [26].f1[0..4] ∈ {0; 10; 20} + [26].f_inter[0..4] ∈ {0} + [26].f2 ∈ {-99; 0} + [26]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [27].f1[0..4] ∈ {0; 10; 20} + [27].f_inter[0..4] ∈ {0} + [27].f2 ∈ {-99; 0} + [27]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [28].f1[0..4] ∈ {0; 10; 20} + [28].f_inter[0..4] ∈ {0} + [28].f2 ∈ {-99; 0} + [28]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [29].f1[0..4] ∈ {0; 10; 20} + [29].f_inter[0..4] ∈ {0} + [29].f2 ∈ {-99; 0} + [29]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [30].f1[0..4] ∈ {0; 10; 20} + [30].f_inter[0..4] ∈ {0} + [30].f2 ∈ {-99; 0} + [30]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [31].f1[0..4] ∈ {0; 10; 20} + [31].f_inter[0..4] ∈ {0} + [31].f2 ∈ {-99; 0} + [31]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [32].f1[0..4] ∈ {0; 10; 20} + [32].f_inter[0..4] ∈ {0} + [32].f2 ∈ {-99; 0} + [32]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [33].f1[0..4] ∈ {0; 10; 20} + [33].f_inter[0..4] ∈ {0} + [33].f2 ∈ {-99; 0} + [33]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [34].f1[0..4] ∈ {0; 10; 20} + [34].f_inter[0..4] ∈ {0} + [34].f2 ∈ {-99; 0} + [34]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [35].f1[0..4] ∈ {0; 10; 20} + [35].f_inter[0..4] ∈ {0} + [35].f2 ∈ {-99; 0} + [35]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [36].f1[0..4] ∈ {0; 10; 20} + [36].f_inter[0..4] ∈ {0} + [36].f2 ∈ {-99; 0} + [36]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [37].f1[0..4] ∈ {0; 10; 20} + [37].f_inter[0..4] ∈ {0} + [37].f2 ∈ {-99; 0} + [37]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [38].f1[0..4] ∈ {0; 10; 20} + [38].f_inter[0..4] ∈ {0} + [38].f2 ∈ {-99; 0} + [38]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [39].f1[0..4] ∈ {0; 10; 20} + [39].f_inter[0..4] ∈ {0} + [39].f2 ∈ {-99; 0} + [39]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [40].f1[0..4] ∈ {0; 10; 20} + [40].f_inter[0..4] ∈ {0} + [40].f2 ∈ {-99; 0} + [40]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [41].f1[0..4] ∈ {0; 10; 20} + [41].f_inter[0..4] ∈ {0} + [41].f2 ∈ {-99; 0} + [41]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [42].f1[0..4] ∈ {0; 10; 20} + [42].f_inter[0..4] ∈ {0} + [42].f2 ∈ {-99; 0} + [42]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [43].f1[0..4] ∈ {0; 10; 20} + [43].f_inter[0..4] ∈ {0} + [43].f2 ∈ {-99; 0} + [43]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [44].f1[0..4] ∈ {0; 10; 20} + [44].f_inter[0..4] ∈ {0} + [44].f2 ∈ {-99; 0} + [44]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [45].f1[0..4] ∈ {0; 10; 20} + [45].f_inter[0..4] ∈ {0} + [45].f2 ∈ {-99; 0} + [45]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [46].f1[0..4] ∈ {0; 10; 20} + [46].f_inter[0..4] ∈ {0} + [46].f2 ∈ {-99; 0} + [46]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [47].f1[0..4] ∈ {0; 10; 20} + [47].f_inter[0..4] ∈ {0} + [47].f2 ∈ {-99; 0} + [47]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [48].f1[0..4] ∈ {0; 10; 20} + [48].f_inter[0..4] ∈ {0} + [48].f2 ∈ {-99; 0} + [48]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [49].f1[0..4] ∈ {0; 10; 20} + [49].f_inter[0..4] ∈ {0} + [49].f2 ∈ {-99; 0} + [49]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + i ∈ {5} + j ∈ {50} + q ∈ {0} + r ∈ {0} + v ∈ [--..--] + =END OF DUMP== +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/precise_locations.i:48. +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precise_locations.i:49. +[value] Done for function g +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function ct: + __retres ∈ {20} +[value] Values at end of function main: + t[0].f1[0..4] ∈ {0; 10; 20} + [0].f_inter[0..4] ∈ {0} + [0].f2 ∈ {-99; 0} + [0]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [1].f1[0..4] ∈ {0; 10; 20} + [1].f_inter[0..4] ∈ {0} + [1].f2 ∈ {-99; 0} + [1]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [2].f1[0..4] ∈ {0; 10; 20} + [2].f_inter[0..4] ∈ {0} + [2].f2 ∈ {-99; 0} + [2]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [3].f1[0..4] ∈ {0; 10; 20} + [3].f_inter[0..4] ∈ {0} + [3].f2 ∈ {-99; 0} + [3]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [4].f1[0..4] ∈ {0; 10; 20} + [4].f_inter[0..4] ∈ {0} + [4].f2 ∈ {-99; 0} + [4]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [5].f1[0..4] ∈ {0; 10; 20} + [5].f_inter[0..4] ∈ {0} + [5].f2 ∈ {-99; 0} + [5]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [6].f1[0..4] ∈ {0; 10; 20} + [6].f_inter[0..4] ∈ {0} + [6].f2 ∈ {-99; 0} + [6]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [7].f1[0..4] ∈ {0; 10; 20} + [7].f_inter[0..4] ∈ {0} + [7].f2 ∈ {-99; 0} + [7]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [8].f1[0..4] ∈ {0; 10; 20} + [8].f_inter[0..4] ∈ {0} + [8].f2 ∈ {-99; 0} + [8]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [9].f1[0..4] ∈ {0; 10; 20} + [9].f_inter[0..4] ∈ {0} + [9].f2 ∈ {-99; 0} + [9]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [10].f1[0..4] ∈ {0; 10; 20} + [10].f_inter[0..4] ∈ {0} + [10].f2 ∈ {-99; 0} + [10]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [11].f1[0..4] ∈ {0; 10; 20} + [11].f_inter[0..4] ∈ {0} + [11].f2 ∈ {-99; 0} + [11]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [12].f1[0..4] ∈ {0; 10; 20} + [12].f_inter[0..4] ∈ {0} + [12].f2 ∈ {-99; 0} + [12]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [13].f1[0..4] ∈ {0; 10; 20} + [13].f_inter[0..4] ∈ {0} + [13].f2 ∈ {-99; 0} + [13]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [14].f1[0..4] ∈ {0; 10; 20} + [14].f_inter[0..4] ∈ {0} + [14].f2 ∈ {-99; 0} + [14]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [15].f1[0..4] ∈ {0; 10; 20} + [15].f_inter[0..4] ∈ {0} + [15].f2 ∈ {-99; 0} + [15]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [16].f1[0..4] ∈ {0; 10; 20} + [16].f_inter[0..4] ∈ {0} + [16].f2 ∈ {-99; 0} + [16]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [17].f1[0..4] ∈ {0; 10; 20} + [17].f_inter[0..4] ∈ {0} + [17].f2 ∈ {-99; 0} + [17]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [18].f1[0..4] ∈ {0; 10; 20} + [18].f_inter[0..4] ∈ {0} + [18].f2 ∈ {-99; 0} + [18]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [19].f1[0..4] ∈ {0; 10; 20} + [19].f_inter[0..4] ∈ {0} + [19].f2 ∈ {-99; 0} + [19]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [20].f1[0..4] ∈ {0; 10; 20} + [20].f_inter[0..4] ∈ {0} + [20].f2 ∈ {-99; 0} + [20]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [21].f1[0..4] ∈ {0; 10; 20} + [21].f_inter[0..4] ∈ {0} + [21].f2 ∈ {-99; 0} + [21]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [22].f1[0..4] ∈ {0; 10; 20} + [22].f_inter[0..4] ∈ {0} + [22].f2 ∈ {-99; 0} + [22]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [23].f1[0..4] ∈ {0; 10; 20} + [23].f_inter[0..4] ∈ {0} + [23].f2 ∈ {-99; 0} + [23]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [24].f1[0..4] ∈ {0; 10; 20} + [24].f_inter[0..4] ∈ {0} + [24].f2 ∈ {-99; 0} + [24]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [25].f1[0..4] ∈ {0; 10; 20} + [25].f_inter[0..4] ∈ {0} + [25].f2 ∈ {-99; 0} + [25]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [26].f1[0..4] ∈ {0; 10; 20} + [26].f_inter[0..4] ∈ {0} + [26].f2 ∈ {-99; 0} + [26]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [27].f1[0..4] ∈ {0; 10; 20} + [27].f_inter[0..4] ∈ {0} + [27].f2 ∈ {-99; 0} + [27]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [28].f1[0..4] ∈ {0; 10; 20} + [28].f_inter[0..4] ∈ {0} + [28].f2 ∈ {-99; 0} + [28]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [29].f1[0..4] ∈ {0; 10; 20} + [29].f_inter[0..4] ∈ {0} + [29].f2 ∈ {-99; 0} + [29]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [30].f1[0..4] ∈ {0; 10; 20} + [30].f_inter[0..4] ∈ {0} + [30].f2 ∈ {-99; 0} + [30]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [31].f1[0..4] ∈ {0; 10; 20} + [31].f_inter[0..4] ∈ {0} + [31].f2 ∈ {-99; 0} + [31]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [32].f1[0..4] ∈ {0; 10; 20} + [32].f_inter[0..4] ∈ {0} + [32].f2 ∈ {-99; 0} + [32]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [33].f1[0..4] ∈ {0; 10; 20} + [33].f_inter[0..4] ∈ {0} + [33].f2 ∈ {-99; 0} + [33]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [34].f1[0..4] ∈ {0; 10; 20} + [34].f_inter[0..4] ∈ {0} + [34].f2 ∈ {-99; 0} + [34]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [35].f1[0..4] ∈ {0; 10; 20} + [35].f_inter[0..4] ∈ {0} + [35].f2 ∈ {-99; 0} + [35]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [36].f1[0..4] ∈ {0; 10; 20} + [36].f_inter[0..4] ∈ {0} + [36].f2 ∈ {-99; 0} + [36]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [37].f1[0..4] ∈ {0; 10; 20} + [37].f_inter[0..4] ∈ {0} + [37].f2 ∈ {-99; 0} + [37]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [38].f1[0..4] ∈ {0; 10; 20} + [38].f_inter[0..4] ∈ {0} + [38].f2 ∈ {-99; 0} + [38]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [39].f1[0..4] ∈ {0; 10; 20} + [39].f_inter[0..4] ∈ {0} + [39].f2 ∈ {-99; 0} + [39]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [40].f1[0..4] ∈ {0; 10; 20} + [40].f_inter[0..4] ∈ {0} + [40].f2 ∈ {-99; 0} + [40]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [41].f1[0..4] ∈ {0; 10; 20} + [41].f_inter[0..4] ∈ {0} + [41].f2 ∈ {-99; 0} + [41]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [42].f1[0..4] ∈ {0; 10; 20} + [42].f_inter[0..4] ∈ {0} + [42].f2 ∈ {-99; 0} + [42]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [43].f1[0..4] ∈ {0; 10; 20} + [43].f_inter[0..4] ∈ {0} + [43].f2 ∈ {-99; 0} + [43]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [44].f1[0..4] ∈ {0; 10; 20} + [44].f_inter[0..4] ∈ {0} + [44].f2 ∈ {-99; 0} + [44]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [45].f1[0..4] ∈ {0; 10; 20} + [45].f_inter[0..4] ∈ {0} + [45].f2 ∈ {-99; 0} + [45]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [46].f1[0..4] ∈ {0; 10; 20} + [46].f_inter[0..4] ∈ {0} + [46].f2 ∈ {-99; 0} + [46]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [47].f1[0..4] ∈ {0; 10; 20} + [47].f_inter[0..4] ∈ {0} + [47].f2 ∈ {-99; 0} + [47]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [48].f1[0..4] ∈ {0; 10; 20} + [48].f_inter[0..4] ∈ {0} + [48].f2 ∈ {-99; 0} + [48]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + [49].f1[0..4] ∈ {0; 10; 20} + [49].f_inter[0..4] ∈ {0} + [49].f2 ∈ {-99; 0} + [49]{.f_inter2[0..4]; .[bits 328 to 351]} ∈ {0} + i ∈ {5} + j ∈ {50} + q ∈ {0; 10; 20} + r ∈ {0; 1; 11; 21} + __retres ∈ {0; 1; 10; 11; 20; 21; 31; 41} +[from] Computing for function ct +[from] Done for function ct +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Computing for function f <-main +[from] Done for function f +[from] Computing for function g <-main +[from] Done for function g +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function ct: + \result FROM \nothing +[from] Function f: + NO EFFECTS +[from] Function g: + NO EFFECTS +[from] Function main: + t{[0].f1[0..4]; [0].f2; [1].f1[0..4]; [1].f2; [2].f1[0..4]; [2].f2; + [3].f1[0..4]; [3].f2; [4].f1[0..4]; [4].f2; [5].f1[0..4]; [5].f2; + [6].f1[0..4]; [6].f2; [7].f1[0..4]; [7].f2; [8].f1[0..4]; [8].f2; + [9].f1[0..4]; [9].f2; [10].f1[0..4]; [10].f2; [11].f1[0..4]; [11].f2; + [12].f1[0..4]; [12].f2; [13].f1[0..4]; [13].f2; [14].f1[0..4]; [14].f2; + [15].f1[0..4]; [15].f2; [16].f1[0..4]; [16].f2; [17].f1[0..4]; [17].f2; + [18].f1[0..4]; [18].f2; [19].f1[0..4]; [19].f2; [20].f1[0..4]; [20].f2; + [21].f1[0..4]; [21].f2; [22].f1[0..4]; [22].f2; [23].f1[0..4]; [23].f2; + [24].f1[0..4]; [24].f2; [25].f1[0..4]; [25].f2; [26].f1[0..4]; [26].f2; + [27].f1[0..4]; [27].f2; [28].f1[0..4]; [28].f2; [29].f1[0..4]; [29].f2; + [30].f1[0..4]; [30].f2; [31].f1[0..4]; [31].f2; [32].f1[0..4]; [32].f2; + [33].f1[0..4]; [33].f2; [34].f1[0..4]; [34].f2; [35].f1[0..4]; [35].f2; + [36].f1[0..4]; [36].f2; [37].f1[0..4]; [37].f2; [38].f1[0..4]; [38].f2; + [39].f1[0..4]; [39].f2; [40].f1[0..4]; [40].f2; [41].f1[0..4]; [41].f2; + [42].f1[0..4]; [42].f2; [43].f1[0..4]; [43].f2; [44].f1[0..4]; [44].f2; + [45].f1[0..4]; [45].f2; [46].f1[0..4]; [46].f2; [47].f1[0..4]; [47].f2; + [48].f1[0..4]; [48].f2; [49].f1[0..4]; [49].f2} + FROM \nothing (and SELF) + i FROM \nothing + j FROM \nothing + q FROM t{[0].f1[0..4]; [1].f1[0..4]; [2].f1[0..4]; [3].f1[0..4]; + [4].f1[0..4]; [5].f1[0..4]; [6].f1[0..4]; [7].f1[0..4]; + [8].f1[0..4]; [9].f1[0..4]; [10].f1[0..4]; [11].f1[0..4]; + [12].f1[0..4]; [13].f1[0..4]; [14].f1[0..4]; [15].f1[0..4]; + [16].f1[0..4]; [17].f1[0..4]; [18].f1[0..4]; [19].f1[0..4]; + [20].f1[0..4]; [21].f1[0..4]; [22].f1[0..4]; [23].f1[0..4]; + [24].f1[0..4]; [25].f1[0..4]; [26].f1[0..4]; [27].f1[0..4]; + [28].f1[0..4]; [29].f1[0..4]; [30].f1[0..4]; [31].f1[0..4]; + [32].f1[0..4]; [33].f1[0..4]; [34].f1[0..4]; [35].f1[0..4]; + [36].f1[0..4]; [37].f1[0..4]; [38].f1[0..4]; [39].f1[0..4]; + [40].f1[0..4]; [41].f1[0..4]; [42].f1[0..4]; [43].f1[0..4]; + [44].f1[0..4]; [45].f1[0..4]; [46].f1[0..4]; [47].f1[0..4]; + [48].f1[0..4]; [49].f1[0..4]} (and SELF) + r FROM t{[0].f1[0..4]; [1].f1[0..4]; [2].f1[0..4]; [3].f1[0..4]; + [4].f1[0..4]; [5].f1[0..4]; [6].f1[0..4]; [7].f1[0..4]; + [8].f1[0..4]; [9].f1[0..4]; [10].f1[0..4]; [11].f1[0..4]; + [12].f1[0..4]; [13].f1[0..4]; [14].f1[0..4]; [15].f1[0..4]; + [16].f1[0..4]; [17].f1[0..4]; [18].f1[0..4]; [19].f1[0..4]; + [20].f1[0..4]; [21].f1[0..4]; [22].f1[0..4]; [23].f1[0..4]; + [24].f1[0..4]; [25].f1[0..4]; [26].f1[0..4]; [27].f1[0..4]; + [28].f1[0..4]; [29].f1[0..4]; [30].f1[0..4]; [31].f1[0..4]; + [32].f1[0..4]; [33].f1[0..4]; [34].f1[0..4]; [35].f1[0..4]; + [36].f1[0..4]; [37].f1[0..4]; [38].f1[0..4]; [39].f1[0..4]; + [40].f1[0..4]; [41].f1[0..4]; [42].f1[0..4]; [43].f1[0..4]; + [44].f1[0..4]; [45].f1[0..4]; [46].f1[0..4]; [47].f1[0..4]; + [48].f1[0..4]; [49].f1[0..4]} (and SELF) + \result FROM t{[0].f1[0..4]; [1].f1[0..4]; [2].f1[0..4]; [3].f1[0..4]; + [4].f1[0..4]; [5].f1[0..4]; [6].f1[0..4]; [7].f1[0..4]; + [8].f1[0..4]; [9].f1[0..4]; [10].f1[0..4]; [11].f1[0..4]; + [12].f1[0..4]; [13].f1[0..4]; [14].f1[0..4]; [15].f1[0..4]; + [16].f1[0..4]; [17].f1[0..4]; [18].f1[0..4]; [19].f1[0..4]; + [20].f1[0..4]; [21].f1[0..4]; [22].f1[0..4]; [23].f1[0..4]; + [24].f1[0..4]; [25].f1[0..4]; [26].f1[0..4]; [27].f1[0..4]; + [28].f1[0..4]; [29].f1[0..4]; [30].f1[0..4]; [31].f1[0..4]; + [32].f1[0..4]; [33].f1[0..4]; [34].f1[0..4]; [35].f1[0..4]; + [36].f1[0..4]; [37].f1[0..4]; [38].f1[0..4]; [39].f1[0..4]; + [40].f1[0..4]; [41].f1[0..4]; [42].f1[0..4]; [43].f1[0..4]; + [44].f1[0..4]; [45].f1[0..4]; [46].f1[0..4]; [47].f1[0..4]; + [48].f1[0..4]; [49].f1[0..4]}; + q; r +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function ct: + __retres +[inout] Inputs for function ct: + \nothing +[inout] InOut (internal) for function ct: + Operational inputs: + \nothing + Operational inputs on termination: + \nothing + Sure outputs: + __retres +[inout] Out (internal) for function main: + t{[0].f1[0..4]; [0].f2; [1].f1[0..4]; [1].f2; [2].f1[0..4]; [2].f2; + [3].f1[0..4]; [3].f2; [4].f1[0..4]; [4].f2; [5].f1[0..4]; [5].f2; + [6].f1[0..4]; [6].f2; [7].f1[0..4]; [7].f2; [8].f1[0..4]; [8].f2; + [9].f1[0..4]; [9].f2; [10].f1[0..4]; [10].f2; [11].f1[0..4]; [11].f2; + [12].f1[0..4]; [12].f2; [13].f1[0..4]; [13].f2; [14].f1[0..4]; [14].f2; + [15].f1[0..4]; [15].f2; [16].f1[0..4]; [16].f2; [17].f1[0..4]; [17].f2; + [18].f1[0..4]; [18].f2; [19].f1[0..4]; [19].f2; [20].f1[0..4]; [20].f2; + [21].f1[0..4]; [21].f2; [22].f1[0..4]; [22].f2; [23].f1[0..4]; [23].f2; + [24].f1[0..4]; [24].f2; [25].f1[0..4]; [25].f2; [26].f1[0..4]; [26].f2; + [27].f1[0..4]; [27].f2; [28].f1[0..4]; [28].f2; [29].f1[0..4]; [29].f2; + [30].f1[0..4]; [30].f2; [31].f1[0..4]; [31].f2; [32].f1[0..4]; [32].f2; + [33].f1[0..4]; [33].f2; [34].f1[0..4]; [34].f2; [35].f1[0..4]; [35].f2; + [36].f1[0..4]; [36].f2; [37].f1[0..4]; [37].f2; [38].f1[0..4]; [38].f2; + [39].f1[0..4]; [39].f2; [40].f1[0..4]; [40].f2; [41].f1[0..4]; [41].f2; + [42].f1[0..4]; [42].f2; [43].f1[0..4]; [43].f2; [44].f1[0..4]; [44].f2; + [45].f1[0..4]; [45].f2; [46].f1[0..4]; [46].f2; [47].f1[0..4]; [47].f2; + [48].f1[0..4]; [48].f2; [49].f1[0..4]; [49].f2}; i; j; q; r; __retres +[inout] Inputs for function main: + t{[0].f1[0..4]; [1].f1[0..4]; [2].f1[0..4]; [3].f1[0..4]; [4].f1[0..4]; + [5].f1[0..4]; [6].f1[0..4]; [7].f1[0..4]; [8].f1[0..4]; [9].f1[0..4]; + [10].f1[0..4]; [11].f1[0..4]; [12].f1[0..4]; [13].f1[0..4]; + [14].f1[0..4]; [15].f1[0..4]; [16].f1[0..4]; [17].f1[0..4]; + [18].f1[0..4]; [19].f1[0..4]; [20].f1[0..4]; [21].f1[0..4]; + [22].f1[0..4]; [23].f1[0..4]; [24].f1[0..4]; [25].f1[0..4]; + [26].f1[0..4]; [27].f1[0..4]; [28].f1[0..4]; [29].f1[0..4]; + [30].f1[0..4]; [31].f1[0..4]; [32].f1[0..4]; [33].f1[0..4]; + [34].f1[0..4]; [35].f1[0..4]; [36].f1[0..4]; [37].f1[0..4]; + [38].f1[0..4]; [39].f1[0..4]; [40].f1[0..4]; [41].f1[0..4]; + [42].f1[0..4]; [43].f1[0..4]; [44].f1[0..4]; [45].f1[0..4]; + [46].f1[0..4]; [47].f1[0..4]; [48].f1[0..4]; [49].f1[0..4]}; i; j; + q; r +[inout] InOut (internal) for function main: + Operational inputs: + t{[0].f1[0..4]; [1].f1[0..4]; [2].f1[0..4]; [3].f1[0..4]; [4].f1[0..4]; + [5].f1[0..4]; [6].f1[0..4]; [7].f1[0..4]; [8].f1[0..4]; [9].f1[0..4]; + [10].f1[0..4]; [11].f1[0..4]; [12].f1[0..4]; [13].f1[0..4]; + [14].f1[0..4]; [15].f1[0..4]; [16].f1[0..4]; [17].f1[0..4]; + [18].f1[0..4]; [19].f1[0..4]; [20].f1[0..4]; [21].f1[0..4]; + [22].f1[0..4]; [23].f1[0..4]; [24].f1[0..4]; [25].f1[0..4]; + [26].f1[0..4]; [27].f1[0..4]; [28].f1[0..4]; [29].f1[0..4]; + [30].f1[0..4]; [31].f1[0..4]; [32].f1[0..4]; [33].f1[0..4]; + [34].f1[0..4]; [35].f1[0..4]; [36].f1[0..4]; [37].f1[0..4]; + [38].f1[0..4]; [39].f1[0..4]; [40].f1[0..4]; [41].f1[0..4]; + [42].f1[0..4]; [43].f1[0..4]; [44].f1[0..4]; [45].f1[0..4]; + [46].f1[0..4]; [47].f1[0..4]; [48].f1[0..4]; [49].f1[0..4]}; q; r + Operational inputs on termination: + t{[0].f1[0..4]; [1].f1[0..4]; [2].f1[0..4]; [3].f1[0..4]; [4].f1[0..4]; + [5].f1[0..4]; [6].f1[0..4]; [7].f1[0..4]; [8].f1[0..4]; [9].f1[0..4]; + [10].f1[0..4]; [11].f1[0..4]; [12].f1[0..4]; [13].f1[0..4]; + [14].f1[0..4]; [15].f1[0..4]; [16].f1[0..4]; [17].f1[0..4]; + [18].f1[0..4]; [19].f1[0..4]; [20].f1[0..4]; [21].f1[0..4]; + [22].f1[0..4]; [23].f1[0..4]; [24].f1[0..4]; [25].f1[0..4]; + [26].f1[0..4]; [27].f1[0..4]; [28].f1[0..4]; [29].f1[0..4]; + [30].f1[0..4]; [31].f1[0..4]; [32].f1[0..4]; [33].f1[0..4]; + [34].f1[0..4]; [35].f1[0..4]; [36].f1[0..4]; [37].f1[0..4]; + [38].f1[0..4]; [39].f1[0..4]; [40].f1[0..4]; [41].f1[0..4]; + [42].f1[0..4]; [43].f1[0..4]; [44].f1[0..4]; [45].f1[0..4]; + [46].f1[0..4]; [47].f1[0..4]; [48].f1[0..4]; [49].f1[0..4]}; q; r + Sure outputs: + i; j; __retres +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Valid ] Pre-condition (file tests/misc/precise_locations.i, line 18) + by Call Preconditions. +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Pre-condition (file tests/misc/precise_locations.i, line 21) + by Call Preconditions. +[ Extern ] Assigns nothing + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion 'Value,signed_overflow' (file tests/misc/precise_locations.i, line 46) + by Value (v2). + by Value (v3). +[ Valid ] Assertion 'Value,signed_overflow' (file tests/misc/precise_locations.i, line 49) + by Value (v2). + by Value (v3). +[ Valid ] Assertion 'Value,signed_overflow' (file tests/misc/precise_locations.i, line 52) + by Value (v2). + by Value (v3). +[ Valid ] Assertion 'Value,signed_overflow' (file tests/misc/precise_locations.i, line 52) + by Value (v2). + by Value (v3). +[ Valid ] Instance of 'Pre-condition (file tests/misc/precise_locations.i, line 18)' at call 'f' (file tests/misc/precise_locations.i, line 48) + + by Value (v2). + by Value (v3). +[ Valid ] Instance of 'Pre-condition (file tests/misc/precise_locations.i, line 21)' at call 'g' (file tests/misc/precise_locations.i, line 49) + + by Value (v2). + by Value (v3). + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 10 Completely validated + 2 Considered valid + 12 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/precond2.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/precond2.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/precond2.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/precond2.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,99 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/precond2.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/precond2.c:21. +tests/misc/precond2.c:9:[value] Function f: precondition got status valid. +tests/misc/precond2.c:10:[value] Function f: precondition got status valid. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/precond2.c:22. +tests/misc/precond2.c:10:[value] Function f: precondition got status invalid. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precond2.c:24. +tests/misc/precond2.c:24:[kernel] warning: No code nor implicit assigns clause for function g, generating default assigns from the prototype +[value] using specification for function g +tests/misc/precond2.c:16:[value] Function g: precondition got status valid. +[value] Done for function g +[value] computing for function g <- main. + Called from tests/misc/precond2.c:24. +[value] Done for function g +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + x ∈ {1} +[value] Values at end of function main: + x ∈ {0; 1} +[rte] annotating function f +[rte] annotating function main +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Assigns nothing + assigns \nothing; + tried with Inferred annotations. +[ - ] Default behavior + default behavior + tried with Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Default behavior at call 'f' (file tests/misc/precond2.c, line 21) + default behavior for statement 6 + by Frama-C kernel. +[ Valid ] Default behavior at call 'f' (file tests/misc/precond2.c, line 22) + default behavior for statement 9 + by Frama-C kernel. +[ Valid ] Default behavior at call 'g' (file tests/misc/precond2.c, line 24) + default behavior for statement 12 + by Frama-C kernel. +[ Valid ] Default behavior at call 'g' (file tests/misc/precond2.c, line 24) + default behavior for statement 13 + by Frama-C kernel. +[ Valid ] Instance of 'Pre-condition (file tests/misc/precond2.c, line 9)' at call 'f' (file tests/misc/precond2.c, line 21) + + status of 'requires i+1 ≥ 0' of f at stmt 6 + by Value. +[ Valid ] Instance of 'Pre-condition (file tests/misc/precond2.c, line 10)' at call 'f' (file tests/misc/precond2.c, line 21) + + status of 'requires i ≥ 0' of f at stmt 6 + by Value. +[ Valid ] Instance of 'Pre-condition (file tests/misc/precond2.c, line 9)' at call 'f' (file tests/misc/precond2.c, line 22) + + status of 'requires i+1 ≥ 0' of f at stmt 9 + by Value. +[ Alarm ] Instance of 'Pre-condition (file tests/misc/precond2.c, line 10)' at call 'f' (file tests/misc/precond2.c, line 22) + + status of 'requires i ≥ 0' of f at stmt 9 + By Value, with pending: + - Unreachable call 'f' (file tests/misc/precond2.c, line 22) +[ Valid ] Instance of 'Pre-condition (file tests/misc/precond2.c, line 16)' at call 'g' (file tests/misc/precond2.c, line 24) + + status of 'requires x ≤ 8' of g at stmt 12 + by Value. +[ Valid ] Instance of 'Pre-condition (file tests/misc/precond2.c, line 16)' at call 'g' (file tests/misc/precond2.c, line 24) + + status of 'requires x ≤ 8' of g at stmt 13 + by Value. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 9 Completely validated + 2 To be validated + 1 Alarm emitted + 12 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/precond2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/precond2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/precond2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/precond2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,108 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/precond2.c (with preprocessing) +[rte] annotating function f +[rte] annotating function main +tests/misc/precond2.c:24:[kernel] warning: No code nor implicit assigns clause for function g, generating default assigns from the prototype +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/precond2.c:21. +tests/misc/precond2.c:9:[value] Function f: precondition got status valid. +tests/misc/precond2.c:10:[value] Function f: precondition got status valid. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/precond2.c:22. +tests/misc/precond2.c:10:[value] Function f: precondition got status invalid. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precond2.c:24. +[value] using specification for function g +tests/misc/precond2.c:16:[value] Function g: precondition got status valid. +[value] Done for function g +[value] computing for function g <- main. + Called from tests/misc/precond2.c:24. +[value] Done for function g +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + x ∈ {1} +[value] Values at end of function main: + x ∈ {0; 1} +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Valid ] Pre-condition (file tests/misc/precond2.c, line 9) + requires i+1 ≥ 0 + by Call Preconditions. +[ Alarm ] Pre-condition (file tests/misc/precond2.c, line 10) + requires i ≥ 0 + By Call Preconditions, with pending: + - Unreachable call 'f' (file tests/misc/precond2.c, line 22) + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ Valid ] Pre-condition (file tests/misc/precond2.c, line 16) + requires x ≤ 8 + by Call Preconditions. +[ - ] Assigns nothing + assigns \nothing; + tried with Inferred annotations. +[ - ] Default behavior + default behavior + tried with Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Pre-condition for 'pre_f' (generated) at call 'f' (file tests/misc/precond2.c, line 21) + requires 1+1 ≥ 0 + by Value. +[ Valid ] Pre-condition for 'pre_f' (generated) at call 'f' (file tests/misc/precond2.c, line 21) + requires 1 ≥ 0 + by Value. +[ Valid ] Pre-condition for 'pre_f_2' (generated) at call 'f' (file tests/misc/precond2.c, line 22) + requires (int)(-1)+1 ≥ 0 + by Value. +[ Alarm ] Pre-condition for 'pre_f_2' (generated) at call 'f' (file tests/misc/precond2.c, line 22) + requires (int)(-1) ≥ 0 + By Value, with pending: + - Unreachable call 'f' (file tests/misc/precond2.c, line 22) +[ Valid ] Pre-condition for 'pre_g' (generated) at call 'g' (file tests/misc/precond2.c, line 24) + requires x ≤ 8 + by Value. +[ Valid ] Pre-condition for 'pre_g_2' (generated) at call 'g' (file tests/misc/precond2.c, line 24) + requires x ≤ 8 + by Value. +[ Valid ] Default behavior at call 'f' (file tests/misc/precond2.c, line 21) + default behavior for statement 6 + by Frama-C kernel. +[ Valid ] Default behavior at call 'f' (file tests/misc/precond2.c, line 22) + default behavior for statement 9 + by Frama-C kernel. +[ Valid ] Default behavior at call 'g' (file tests/misc/precond2.c, line 24) + default behavior for statement 12 + by Frama-C kernel. +[ Valid ] Default behavior at call 'g' (file tests/misc/precond2.c, line 24) + default behavior for statement 13 + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 11 Completely validated + 2 To be validated + 2 Alarms emitted + 15 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/precond.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/precond.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/precond.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/precond.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,211 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/precond.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ [--..--] + pf2 ∈ {{ &f2 }} +[value] computing for function f <- main. + Called from tests/misc/precond.c:31. +tests/misc/precond.c:8:[value] Function f: precondition got status valid. +tests/misc/precond.c:9:[value] Function f: precondition got status valid. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/precond.c:32. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/precond.c:34. +tests/misc/precond.c:34:[kernel] warning: No code nor implicit assigns clause for function g, generating default assigns from the prototype +[value] using specification for function g +tests/misc/precond.c:24:[value] Function g: precondition got status unknown. +[value] Done for function g +[value] computing for function aux <- main. + Called from tests/misc/precond.c:36. +[value] computing for function f2 <- aux <- main. + Called from tests/misc/precond.c:21. +tests/misc/precond.c:21:[kernel] warning: No code nor implicit assigns clause for function f2, generating default assigns from the prototype +[value] using specification for function f2 +tests/misc/precond.c:15:[value] Function f2: precondition got status valid. +[value] Done for function f2 +[value] Recording results for aux +[value] Done for function aux +[value] computing for function aux <- main. + Called from tests/misc/precond.c:37. +[value] computing for function f2 <- aux <- main. + Called from tests/misc/precond.c:21. +tests/misc/precond.c:15:[value] Function f2: precondition got status unknown. +[value] Done for function f2 +[value] Recording results for aux +[value] Done for function aux +[value] computing for function f <- main. + Called from tests/misc/precond.c:39. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/precond.c:40. +tests/misc/precond.c:9:[value] Function f: precondition got status invalid. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + x ∈ {0; 1} +[value] Values at end of function aux: + +[value] Values at end of function main: + NON TERMINATING FUNCTION +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Valid ] Pre-condition (file tests/misc/precond.c, line 8) + requires i+1 ≥ 0 + by Call Preconditions. +[ Alarm ] Pre-condition (file tests/misc/precond.c, line 9) + requires i ≥ 0 + By Call Preconditions, with pending: + - Unreachable instruction (file tests/misc/precond.c, line 40) + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ - ] Pre-condition (file tests/misc/precond.c, line 15) + requires i ≥ 0 + tried with Call Preconditions. +[ - ] Assigns nothing + assigns \nothing; + tried with Inferred annotations. +[ - ] Default behavior + default behavior + tried with Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'aux' +-------------------------------------------------------------------------------- + +[ - ] Instance of 'Pre-condition (file tests/misc/precond.c, line 15)' at instruction (file tests/misc/precond.c, line 21) + + status of 'requires i ≥ 0' of f2 at stmt 4 + tried with Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Pre-condition (file tests/misc/precond.c, line 24) + requires x ≤ 8 + tried with Call Preconditions. +[ - ] Assigns nothing + assigns \nothing; + tried with Inferred annotations. +[ - ] Default behavior + default behavior + tried with Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main' +-------------------------------------------------------------------------------- + +[ Valid ] Instance of 'Pre-condition (file tests/misc/precond.c, line 8)' at call 'f' (file tests/misc/precond.c, line 31) + + status of 'requires i+1 ≥ 0' of f at stmt 11 + by Value. +[ Valid ] Instance of 'Pre-condition (file tests/misc/precond.c, line 9)' at call 'f' (file tests/misc/precond.c, line 31) + + status of 'requires i ≥ 0' of f at stmt 11 + by Value. +[ Valid ] Instance of 'Pre-condition (file tests/misc/precond.c, line 8)' at call 'f' (file tests/misc/precond.c, line 32) + + status of 'requires i+1 ≥ 0' of f at stmt 14 + by Value. +[ Valid ] Instance of 'Pre-condition (file tests/misc/precond.c, line 9)' at call 'f' (file tests/misc/precond.c, line 32) + + status of 'requires i ≥ 0' of f at stmt 14 + by Value. +[ - ] Instance of 'Pre-condition (file tests/misc/precond.c, line 24)' at call 'g' (file tests/misc/precond.c, line 34) + + status of 'requires x ≤ 8' of g at stmt 17 + tried with Value. +[ Valid ] Instance of 'Pre-condition (file tests/misc/precond.c, line 8)' at instruction (file tests/misc/precond.c, line 39) + + status of 'requires i+1 ≥ 0' of f at stmt 20 + by Value. +[ Valid ] Instance of 'Pre-condition (file tests/misc/precond.c, line 9)' at instruction (file tests/misc/precond.c, line 39) + + status of 'requires i ≥ 0' of f at stmt 20 + by Value. +[ Valid ] Instance of 'Pre-condition (file tests/misc/precond.c, line 8)' at instruction (file tests/misc/precond.c, line 40) + + status of 'requires i+1 ≥ 0' of f at stmt 21 + by Value. +[ Alarm ] Instance of 'Pre-condition (file tests/misc/precond.c, line 9)' at instruction (file tests/misc/precond.c, line 40) + + status of 'requires i ≥ 0' of f at stmt 21 + By Value, with pending: + - Unreachable instruction (file tests/misc/precond.c, line 40) + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 8 Completely validated + 8 To be validated + 2 Alarms emitted + 18 Total +-------------------------------------------------------------------------------- +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'f' +-------------------------------------------------------------------------------- + +[ Valid ] Pre-condition (file tests/misc/precond.c, line 8) + requires i+1 ≥ 0 + by Call Preconditions. +[ Alarm ] Pre-condition (file tests/misc/precond.c, line 9) + requires i ≥ 0 + By Call Preconditions, with pending: + - Unreachable instruction (file tests/misc/precond.c, line 40) + +-------------------------------------------------------------------------------- +--- Properties of Function 'f2' +-------------------------------------------------------------------------------- + +[ - ] Pre-condition (file tests/misc/precond.c, line 15) + requires i ≥ 0 + tried with Call Preconditions. +[ - ] Assigns nothing + assigns \nothing; + tried with Inferred annotations. +[ - ] Default behavior + default behavior + tried with Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'g' +-------------------------------------------------------------------------------- + +[ - ] Pre-condition (file tests/misc/precond.c, line 24) + requires x ≤ 8 + tried with Call Preconditions. +[ - ] Assigns nothing + assigns \nothing; + tried with Inferred annotations. +[ - ] Default behavior + default behavior + tried with Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 1 Completely validated + 6 To be validated + 1 Alarm emitted + 8 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/protomain.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/protomain.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/protomain.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/protomain.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,11 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/protomain.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +:0:[kernel] warning: Neither code nor specification for function main, generating default assigns from the prototype +[value] using specification for function main +[value] done for function main +[value] ====== VALUES COMPUTED ====== diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/ptr_relation.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/ptr_relation.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/ptr_relation.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/ptr_relation.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/ptr_relation.i (no preprocessing) +[value] Analyzing a complete application starting at main1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + x ∈ {0} + k ∈ {0} + l ∈ {0} + m ∈ {0} + n ∈ {0} + d ∈ {0} + a ∈ {0} + b ∈ {0} + ptr ∈ {0} + tab_ptr_fct2[0] ∈ {{ &f2 }} + [1] ∈ {{ &g2 }} +[value] Recording results for main1 +[value] done for function main1 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main1: + i ∈ {3; 4} + j ∈ {-1; 0; 1} + x ∈ {3; 4} +[from] Computing for function main1 +[from] Done for function main1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main1: + i FROM c + j FROM c + x FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main1: + i; j; x +[inout] Inputs for function main1: + i; x diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/ptr_relation.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/ptr_relation.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/ptr_relation.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/ptr_relation.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,69 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/ptr_relation.i (no preprocessing) +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + x ∈ {0} + k ∈ {0} + l ∈ {0} + m ∈ {0} + n ∈ {0} + d ∈ {0} + a ∈ {0} + b ∈ {0} + ptr ∈ {0} + tab_ptr_fct2[0] ∈ {{ &f2 }} + [1] ∈ {{ &g2 }} +[value] computing for function f2 <- main2. + Called from tests/misc/ptr_relation.i:38. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function g2 <- main2. + Called from tests/misc/ptr_relation.i:38. +[value] Recording results for g2 +[value] Done for function g2 +[value] Recording results for main2 +[value] done for function main2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f2: + a ∈ [--..--] + b ∈ [--..--] +[value] Values at end of function g2: + a ∈ [--..--] +[value] Values at end of function main2: + j ∈ {0; 1} + a ∈ [--..--] + b ∈ [--..--] +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function g2 +[from] Done for function g2 +[from] Computing for function main2 +[from] Done for function main2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f2: + a FROM m; arg + b FROM l; arg +[from] Function g2: + a FROM n; arg +[from] Function main2: + j FROM c + a FROM m; n; tab_ptr_fct2[0..1]; c; arg + b FROM l; tab_ptr_fct2[0..1]; c; arg (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f2: + a; b +[inout] Inputs for function f2: + l; m +[inout] Out (internal) for function g2: + a +[inout] Inputs for function g2: + n +[inout] Out (internal) for function main2: + j; a; b +[inout] Inputs for function main2: + j; l; m; n; tab_ptr_fct2[0..1] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/ptr_relation.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/ptr_relation.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/ptr_relation.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/ptr_relation.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/ptr_relation.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + x ∈ {0} + k ∈ {0} + l ∈ {0} + m ∈ {0} + n ∈ {0} + d ∈ {0} + a ∈ {0} + b ∈ {0} + ptr ∈ {0} + tab_ptr_fct2[0] ∈ {{ &f2 }} + [1] ∈ {{ &g2 }} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {0; 77; 333} + a ∈ {77; 333} + b ∈ {0; 77} + ptr ∈ {{ &a ; &b }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + i FROM b; c + a FROM c + b FROM c (and SELF) + ptr FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; a; b; ptr +[inout] Inputs for function main: + a; b; ptr diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/pure_exp.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/pure_exp.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/pure_exp.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/pure_exp.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/pure_exp.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t ∈ {0} +tests/misc/pure_exp.i:8:[kernel] warning: out of bounds read. assert \valid_read(t); +[value] Recording results for main +[value] done for function main +tests/misc/pure_exp.i:8:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + t diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/qualified_arrays.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/qualified_arrays.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/qualified_arrays.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/qualified_arrays.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/qualified_arrays.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +tests/misc/qualified_arrays.i:9:[value] warning: global initialization of volatile value ignored +[value] Initial state computed +[value] Values of globals at initialization + volatile_tab_120_2[0..1][0..119] ∈ [--..--] + p_first_volatile ∈ {{ &volatile_tab_120_2[0][0] }} + f ∈ [--..--] + x ∈ {{ &f.x }} +tests/misc/qualified_arrays.i:13:[value] Function main: precondition got status valid. +tests/misc/qualified_arrays.i:14:[value] Function main: precondition got status valid. +tests/misc/qualified_arrays.i:17:[kernel] warning: out of bounds write. assert \valid(&p_first_volatile); +tests/misc/qualified_arrays.i:17:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +tests/misc/qualified_arrays.i:17:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/raz.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/raz.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/raz.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/raz.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/raz.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + h ∈ [--..--] +tests/misc/raz.i:8:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + n ∈ {0; 10} + r ∈ {0; 1} + i ∈ [0..15] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM h +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + n; tmp; r; i +[inout] Inputs for function main: + h diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/reading_null.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/reading_null.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/reading_null.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/reading_null.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,45 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/reading_null.i (no preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + AutoTest[0..999] ∈ [--..--] + X ∈ [--..--] + T[0] ∈ {{ NULL ; &S_0_T[0] }} + [1] ∈ {{ NULL ; &S_1_T[0] }} + X1 ∈ [--..--] + X2 ∈ [--..--] + X3 ∈ [--..--] + X4 ∈ [--..--] + X5 ∈ [--..--] + X6 ∈ [--..--] + X7 ∈ [--..--] + X8 ∈ [--..--] + X9 ∈ [--..--] + S_0_T[0..1] ∈ [--..--] + S_1_T[0..1] ∈ [--..--] +tests/misc/reading_null.i:24:[value] entering loop for the first time +[value] Called CEA_F([-2147483648..2147483647], {0}) +[value] Called CEA_F([-2147483648..2147483647], {0; 1}) +[value] Called CEA_F([-2147483648..2147483647], {0; 1; 2}) +[value] Called CEA_F([-2147483648..2147483647], {0; 1; 2; 3}) +[value] Called CEA_F([-2147483648..2147483647], {0; 1; 2; 3; 4}) +[value] Called CEA_F([-2147483648..2147483647], [0..9]) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + X ∈ [--..--] + count ∈ {10} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + X FROM X1; X2; X3; X4; X5; X6; X7; X8; X9 (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + X; count +[inout] Inputs for function main: + X; X1; X2; X3; X4; X5; X6; X7; X8; X9 diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/read.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/read.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/read.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/read.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,53 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/read.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ [--..--] + any ∈ [--..--] + my_errno ∈ {0} +[value] computing for function read <- main. + Called from tests/misc/read.c:6. +share/libc.c:374:[value] entering loop for the first time +share/libc.c:375:[kernel] warning: out of bounds write. assert \valid(tmp); + (tmp from ptr++) +[value] Recording results for read +[value] Done for function read +tests/misc/read.c:7:[kernel] warning: accessing uninitialized left-value: assert \initialized(&BUFFER[3]); +tests/misc/read.c:8:[kernel] warning: accessing uninitialized left-value: assert \initialized(&BUFFER[5]); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function read: + count ∈ [--..--] + ptr ∈ {{ &BUFFER + [0..--] }} + BUFFER[0..9] ∈ [--..--] or UNINITIALIZED +[value] Values at end of function main: + BUFFER[0..2] ∈ [--..--] or UNINITIALIZED + [3] ∈ [--..--] + [4] ∈ [--..--] or UNINITIALIZED + [5] ∈ [--..--] + [6..9] ∈ [--..--] or UNINITIALIZED + r ∈ [--..--] + __retres ∈ [--..--] +[from] Computing for function read +[from] Done for function read +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function read: + BUFFER[0..9] FROM any; buf; count (and SELF) + \result FROM any +[from] Function main: + \result FROM any +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function read: + count; ptr; tmp; tmp_0; BUFFER[0..9] +[inout] Inputs for function read: + any +[inout] Out (internal) for function main: + BUFFER[0..9]; r; tmp; __retres +[inout] Inputs for function main: + any diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/recol.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/recol.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/recol.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/recol.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,72 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/recol.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + s[0..99] ∈ {0} + c ∈ {0} + s_int ∈ {0} + p_int ∈ {0} + ones[0..7] ∈ {49} + [8] ∈ {0} + one23[0] ∈ {49} + [1..2] ∈ {50} + [3] ∈ {51} + [4] ∈ {0} + col_ones ∈ {0} + col_123 ∈ {0} +tests/misc/recol.c:30:[value] warning: 2's complement assumed for overflow +tests/misc/recol.c:47:[value] warning: 2's complement assumed for overflow +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + s[bits 0 to 15] ∈ {97} + [bits 16 to 47] ∈ {776} + [6] ∈ {-103} + [bits 56 to 71] ∈ {-26736} + [bits 72 to 103] ∈ {271697} + [13] ∈ {-104} + [bits 112 to 127] ∈ {10121} + [bits 128 to 159] ∈ {93197600} + [20] ∈ {65} + [21] ∈ {40} + [bits 176 to 191] ∈ {25465} + [bits 192 to 223] ∈ {429177008} + [bits 224 to 255] ∈ {-1290728143} + [bits 256 to 287] ∈ {-445162312} + [bits 288 to 303] ∈ {-30359} + [38] ∈ {64} + [bits 312 to 343] ∈ {1928155169} + [43] ∈ {72} + [44] ∈ {89} + [bits 360 to 391] ∈ {-67735088} + [bits 392 to 423] ∈ {-474145519} + [bits 424 to 439] ∈ {-13352} + [55] ∈ {73} + [bits 448 to 463] ∈ {1888} + [bits 464 to 495] ∈ {-257018879} + [bits 496 to 527] ∈ {-1799132056} + [66] ∈ {57} + [bits 536 to 551] ∈ {-15632} + [bits 552 to 583] ∈ {1373000945} + [bits 584 to 599] ∈ {21240} + [75] ∈ {41} + [76] ∈ {-128} + [77] ∈ {-31} + [bits 624 to 655] ∈ {-832127096} + [82] ∈ {25} + [83] ∈ {16} + [bits 672 to 703] ∈ {-1951746863} + [bits 704 to 735] ∈ {-777326056} + [bits 736 to 767] ∈ {-1146314999} + [bits 768 to 783] ∈ {22944} + [98..99] ∈ {0} + c ∈ {565729696} + s_int ∈ {-1480071902} + p_int ∈ {{ (int *)&s[100] }} + col_ones ∈ {825307442} + col_123 ∈ {825373236} + p ∈ {{ &s[98] }} + __retres ∈ {0} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/recol.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/recol.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/recol.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/recol.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,72 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/recol.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + s[0..99] ∈ {0} + c ∈ {0} + s_int ∈ {0} + p_int ∈ {0} + ones[0..7] ∈ {49} + [8] ∈ {0} + one23[0] ∈ {49} + [1..2] ∈ {50} + [3] ∈ {51} + [4] ∈ {0} + col_ones ∈ {0} + col_123 ∈ {0} +tests/misc/recol.c:30:[value] warning: 2's complement assumed for overflow +tests/misc/recol.c:47:[value] warning: 2's complement assumed for overflow +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + s[bits 0 to 15] ∈ {97} + [bits 16 to 47] ∈ {776} + [6] ∈ {-103} + [bits 56 to 71] ∈ {-26736} + [bits 72 to 103] ∈ {271697} + [13] ∈ {-104} + [bits 112 to 127] ∈ {10121} + [bits 128 to 159] ∈ {93197600} + [20] ∈ {65} + [21] ∈ {40} + [bits 176 to 191] ∈ {25465} + [bits 192 to 223] ∈ {429177008} + [bits 224 to 255] ∈ {-1290728143} + [bits 256 to 287] ∈ {-445162312} + [bits 288 to 303] ∈ {-30359} + [38] ∈ {64} + [bits 312 to 343] ∈ {1928155169} + [43] ∈ {72} + [44] ∈ {89} + [bits 360 to 391] ∈ {-67735088} + [bits 392 to 423] ∈ {-474145519} + [bits 424 to 439] ∈ {-13352} + [55] ∈ {73} + [bits 448 to 463] ∈ {1888} + [bits 464 to 495] ∈ {-257018879} + [bits 496 to 527] ∈ {-1799132056} + [66] ∈ {57} + [bits 536 to 551] ∈ {-15632} + [bits 552 to 583] ∈ {1373000945} + [bits 584 to 599] ∈ {21240} + [75] ∈ {41} + [76] ∈ {-128} + [77] ∈ {-31} + [bits 624 to 655] ∈ {-832127096} + [82] ∈ {25} + [83] ∈ {16} + [bits 672 to 703] ∈ {-1951746863} + [bits 704 to 735] ∈ {-777326056} + [bits 736 to 767] ∈ {-1146314999} + [bits 768 to 783] ∈ {22944} + [98..99] ∈ {0} + c ∈ {565729696} + s_int ∈ {-833811464} + p_int ∈ {{ (int *)&s[100] }} + col_ones ∈ {825307442} + col_123 ∈ {858927666} + p ∈ {{ &s[98] }} + __retres ∈ {0} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/rec.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/rec.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/rec.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/rec.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/rec.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + X ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + X +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/recursion.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/recursion.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/recursion.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/recursion.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,101 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/recursion.i (no preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + x ∈ [--..--] + c ∈ [--..--] + s ∈ [--..--] + pg ∈ {{ NULL ; &S_pg[0] }} + S_pg[0..1] ∈ [--..--] +[value] computing for function ff <- main. + Called from tests/misc/recursion.i:67. +tests/misc/recursion.i:8:[value] warning: recursive call during value analysis + of ff (ff <- ff :: tests/misc/recursion.i:67 <- main). + Using specification of ff. +[value] user error: Recursive call on an unspecified function. Using potentially invalid + inferred assigns 'assigns \result \from \nothing;' +[value] using specification for function ff +[value] Recording results for ff +[value] Done for function ff +[value] computing for function g <- main. + Called from tests/misc/recursion.i:68. +tests/misc/recursion.i:39:[value] warning: recursive call during value analysis + of g (g <- g :: tests/misc/recursion.i:68 <- main). Using specification of g. +[value] user error: Recursive call on an unspecified function. Using potentially invalid + inferred assigns 'assigns \nothing' +[value] using specification for function g +[value] Recording results for g +[value] Done for function g +[value] computing for function h <- main. + Called from tests/misc/recursion.i:70. +tests/misc/recursion.i:44:[value] warning: recursive call during value analysis + of h (h <- h :: tests/misc/recursion.i:70 <- main). Using specification of h. +[value] user error: Recursive call on an unspecified function. Using potentially invalid + inferred assigns 'assigns *p1 \from *p1, *p2; assigns *p2 \from *p1, *p2;' +[value] using specification for function h +[value] Recording results for h +[value] Done for function h +[value] Called Frama_C_show_each([-2147483648..2147483647], [-2147483648..2147483647]) +[value] computing for function escaping_formal <- main. + Called from tests/misc/recursion.i:72. +tests/misc/recursion.i:52:[value] Function escaping_formal: precondition got status valid. +[value] Called Frama_C_show_each({{ &i }}, {10}, {0}, {10}) +tests/misc/recursion.i:59:[value] warning: recursive call during value analysis + of escaping_formal (escaping_formal <- escaping_formal :: tests/misc/recursion.i:72 <- + main). + Using specification of escaping_formal. +[value] using specification for function escaping_formal +tests/misc/recursion.i:52:[value] Function escaping_formal: precondition got status unknown. +tests/misc/recursion.i:54:[value] Function escaping_formal: postcondition got status unknown. +[value] Called Frama_C_show_each({{ &i }}, + [-2147483648..2147483647], + {0}, + [-2147483648..2147483647]) +tests/misc/recursion.i:54:[value] Function escaping_formal: postcondition got status valid. +[value] Recording results for escaping_formal +[value] Done for function escaping_formal +[value] computing for function f <- main. + Called from tests/misc/recursion.i:73. +[value] Called Frama_C_show_each({2}, {0}) +tests/misc/recursion.i:30:[value] warning: recursive call during value analysis + of f (f <- f :: tests/misc/recursion.i:73 <- main). Using specification of f. +[value] using specification for function f +[value] Called Frama_C_show_each([-2147483648..2147483647], {0}) +[value] Recording results for f +[value] Done for function f +[value] Called Frama_C_show_each([-2147483648..2147483647]) +tests/misc/recursion.i:75:[kernel] warning: signed overflow. assert r.f1+1 ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +tests/misc/recursion.i:59:[inout] warning: During inout context analysis of escaping_formal: + ignoring probable recursive call. +[value] Values at end of function escaping_formal: + pg ∈ {0} +tests/misc/recursion.i:30:[inout] warning: During inout context analysis of f: + ignoring probable recursive call. +[value] Values at end of function f: + x ∈ [--..--] + s ∈ [--..--] +tests/misc/recursion.i:8:[inout] warning: During inout context analysis of ff: + ignoring probable recursive call. +[value] Values at end of function ff: + __retres ∈ {5} +tests/misc/recursion.i:39:[inout] warning: During inout context analysis of g: + ignoring probable recursive call. +[value] Values at end of function g: + +tests/misc/recursion.i:44:[inout] warning: During inout context analysis of h: + ignoring probable recursive call. +[value] Values at end of function h: + +[value] Values at end of function main: + G ∈ {5} + x ∈ [--..--] + s ∈ [--..--] + pg ∈ {0} + r ∈ [--..--] + __retres ∈ [-2147483647..2147483647] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/recursion2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/recursion2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/recursion2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/recursion2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,68 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/recursion2.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] computing for function h2 <- main. + Called from tests/misc/recursion2.i:21. +[value] computing for function h1 <- h2 <- main. + Called from tests/misc/recursion2.i:17. +[value] Recording results for h1 +[value] Done for function h1 +[value] Recording results for h2 +[value] Done for function h2 +[value] computing for function h1 <- main. + Called from tests/misc/recursion2.i:22. +[value] computing for function h2 <- h1 <- main. + Called from tests/misc/recursion2.i:12. +[value] Recording results for h2 +[value] Done for function h2 +[value] Recording results for h1 +[value] Done for function h1 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function h1: + r ∈ {0} + q ∈ {0} or UNINITIALIZED +[value] Values at end of function h2: + r ∈ {0} or UNINITIALIZED + q ∈ {0} +[value] Values at end of function main: + +[inout] Out (internal) for function h1: + r; q +[inout] Inputs for function h1: + x; y; i; j +[inout] InOut (internal) for function h1: + Operational inputs: + x; i + Operational inputs on termination: + x; i + Sure outputs: + r +[inout] Out (internal) for function h2: + r; q +[inout] Inputs for function h2: + x; y; i; j +[inout] InOut (internal) for function h2: + Operational inputs: + x; y; i; j + Operational inputs on termination: + x; y; i; j + Sure outputs: + q +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + x; y +[inout] InOut (internal) for function main: + Operational inputs: + x; y; i; j + Operational inputs on termination: + x; y; i; j + Sure outputs: + r; q diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/recursion.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/recursion.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/recursion.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/recursion.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,24 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/recursion.i (no preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + x ∈ [--..--] + c ∈ [--..--] + s ∈ [--..--] + pg ∈ {{ NULL ; &S_pg[0] }} + S_pg[0..1] ∈ [--..--] +[value] computing for function ff <- main. + Called from tests/misc/recursion.i:67. +tests/misc/recursion.i:8:[value] warning: detected recursive call (ff <- ff :: tests/misc/recursion.i:67 <- main) + Use -val-ignore-recursive-calls to ignore (beware this will make the analysis + unsound) +[value] user error: Degeneration occurred: + results are not correct for lines of code that can be reached from the degeneration point. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function ff: + NON TERMINATING FUNCTION +[value] Values at end of function main: + NON TERMINATING FUNCTION diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/reduce_by_valid.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/reduce_by_valid.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/reduce_by_valid.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/reduce_by_valid.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,314 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/reduce_by_valid.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..4] ∈ {0} + u[0..4] ∈ {0} + v ∈ [--..--] + sv ∈ [--..--] + vs ∈ {{ NULL ; &S_vs[0] }} + S_vs[0].f1 ∈ {{ NULL ; &S_f1_0_S_vs[0] }} + [1].f1 ∈ {{ NULL ; &S_f1_1_S_vs[0] }} + S_f1_0_S_vs[0..1] ∈ [--..--] + S_f1_1_S_vs[0..1] ∈ [--..--] +[value] computing for function main1 <- main. + Called from tests/misc/reduce_by_valid.i:260. +tests/misc/reduce_by_valid.i:14:[value] Assertion got status unknown. +tests/misc/reduce_by_valid.i:17:[value] Assertion got status unknown. +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/reduce_by_valid.i:261. +tests/misc/reduce_by_valid.i:29:[value] Assertion got status unknown. +tests/misc/reduce_by_valid.i:31:[value] Assertion got status unknown. +tests/misc/reduce_by_valid.i:33:[value] Assertion got status unknown. +tests/misc/reduce_by_valid.i:35:[value] Assertion got status unknown. +[value] Recording results for main2 +[value] Done for function main2 +[value] computing for function main3 <- main. + Called from tests/misc/reduce_by_valid.i:262. +tests/misc/reduce_by_valid.i:48:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:49:[value] Assertion got status unknown. +[value] Recording results for main3 +[value] Done for function main3 +[value] computing for function main4 <- main. + Called from tests/misc/reduce_by_valid.i:263. +tests/misc/reduce_by_valid.i:54:[value] Assertion got status unknown. +tests/misc/reduce_by_valid.i:55:[value] Assertion got status unknown. +tests/misc/reduce_by_valid.i:57:[value] Assertion got status unknown. +tests/misc/reduce_by_valid.i:59:[value] Assertion got status unknown. +[value] Recording results for main4 +[value] Done for function main4 +[value] computing for function main5 <- main. + Called from tests/misc/reduce_by_valid.i:264. +tests/misc/reduce_by_valid.i:72:[value] warning: locals {x} escaping the scope of a block of main5 through p +tests/misc/reduce_by_valid.i:74:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:75:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:76:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:80:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:82:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:85:[value] Assertion got status unknown. +[value] Recording results for main5 +[value] Done for function main5 +[value] computing for function main6 <- main. + Called from tests/misc/reduce_by_valid.i:265. +tests/misc/reduce_by_valid.i:95:[value] Function main6: precondition got status unknown. +tests/misc/reduce_by_valid.i:96:[value] Function main6: precondition got status unknown. +tests/misc/reduce_by_valid.i:97:[value] Function main6: precondition got status unknown. +tests/misc/reduce_by_valid.i:98:[value] Function main6: precondition got status valid. +tests/misc/reduce_by_valid.i:99:[value] Function main6: precondition got status unknown. +tests/misc/reduce_by_valid.i:100:[value] Function main6: precondition got status valid. +[value] Recording results for main6 +[value] Done for function main6 +[value] computing for function main7 <- main. + Called from tests/misc/reduce_by_valid.i:266. +tests/misc/reduce_by_valid.i:111:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:112:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:113:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:117:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:120:[value] Assertion got status unknown. +tests/misc/reduce_by_valid.i:121:[value] Assertion got status valid. +[value] Recording results for main7 +[value] Done for function main7 +[value] computing for function main8 <- main. + Called from tests/misc/reduce_by_valid.i:267. +tests/misc/reduce_by_valid.i:137:[value] Assertion got status unknown. +tests/misc/reduce_by_valid.i:138:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:141:[value] Assertion got status unknown. +tests/misc/reduce_by_valid.i:142:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:146:[value] Assertion got status unknown. +tests/misc/reduce_by_valid.i:147:[value] Assertion got status unknown. +[value] Recording results for main8 +[value] Done for function main8 +[value] computing for function main9 <- main. + Called from tests/misc/reduce_by_valid.i:268. +tests/misc/reduce_by_valid.i:162:[value] Assertion got status unknown. +tests/misc/reduce_by_valid.i:165:[value] Assertion got status valid. +[value] Recording results for main9 +[value] Done for function main9 +[value] computing for function main10 <- main. + Called from tests/misc/reduce_by_valid.i:269. +tests/misc/reduce_by_valid.i:176:[kernel] warning: out of bounds write. assert \valid((int *)p); +[value] Called Frama_C_show_each_main10_1({{ &t_0 + [0..36] }}) +tests/misc/reduce_by_valid.i:178:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:181:[kernel] warning: out of bounds write. assert \valid((int *)p+2); +[value] Called Frama_C_show_each_main10_2({{ &t_0 + [-8..28] }}) +tests/misc/reduce_by_valid.i:183:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:186:[kernel] warning: out of bounds write. assert \valid((int *)(p+2)); +[value] Called Frama_C_show_each_main10_3({{ &t_0 + [-2147483648..2147483647] }}) +tests/misc/reduce_by_valid.i:188:[value] Assertion got status unknown. +tests/misc/reduce_by_valid.i:197:[kernel] warning: out of bounds write. assert \valid(&((struct s_1 *)p)->b); +[value] Called Frama_C_show_each_main10_4({{ &t_0 + [-4..32] }}) +tests/misc/reduce_by_valid.i:200:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:203:[kernel] warning: out of bounds write. assert \valid(&((struct s_1 *)p+2)->b); +[value] Called Frama_C_show_each_main10_4({{ &t_0 + [-20..16] }}) +tests/misc/reduce_by_valid.i:206:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:210:[kernel] warning: out of bounds write. assert \valid((char *)q); +[value] Called Frama_C_show_each({{ &u_0 + [0..79] }}) +tests/misc/reduce_by_valid.i:213:[value] Assertion got status valid. +tests/misc/reduce_by_valid.i:216:[kernel] warning: out of bounds write. assert \valid((char *)q+2); +[value] Called Frama_C_show_each({{ &u_0 + [-2..77] }}) +tests/misc/reduce_by_valid.i:219:[value] Assertion got status valid. +[value] Recording results for main10 +[value] Done for function main10 +[value] computing for function main11 <- main. + Called from tests/misc/reduce_by_valid.i:270. +tests/misc/reduce_by_valid.i:228:[value] Assertion got status unknown. +[value] Called Frama_C_show_each({{ &TC + [10..410] }}) +tests/misc/reduce_by_valid.i:231:[value] Assertion got status unknown. +tests/misc/reduce_by_valid.i:237:[value] Assertion got status unknown. +[value] Called Frama_C_show_each({{ &TU + [40..1640],0%4 }}) +tests/misc/reduce_by_valid.i:240:[value] Assertion got status unknown. +tests/misc/reduce_by_valid.i:245:[value] Assertion got status unknown. +[value] Called Frama_C_show_each({{ &TU + [40..840] }}) +tests/misc/reduce_by_valid.i:248:[value] Assertion got status unknown. +tests/misc/reduce_by_valid.i:253:[value] Assertion got status unknown. +[value] Called Frama_C_show_each({{ &TC + [10..410],2%4 }}) +tests/misc/reduce_by_valid.i:256:[value] Assertion got status unknown. +[value] Recording results for main11 +[value] Done for function main11 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main1: + t[0..2] ∈ {0} + [3] ∈ {0; 1} + [4] ∈ {1} + p ∈ {{ &t{[0], [1]} }} + q ∈ {{ &t[1] }} +[value] Values at end of function main10: + t_0[0..39] ∈ [--..--] or UNINITIALIZED + p ∈ {{ &t_0 + [-20..16] }} + u_0[0..19]# ∈ {1} or UNINITIALIZED repeated %8 + q ∈ {{ &u_0 + [-2..77] }} +[value] Values at end of function main11: + p ∈ {{ &TU + [40..200] }} + off ∈ [0..100] + len ∈ [50..100] + q ∈ {{ &TC + [10..298],2%4 }} +[value] Values at end of function main2: + u[0].a ∈ {0; 1} + [0].b ∈ {0; 2; 4} + [1].a ∈ {0; 1; 3} + [1].b ∈ {0; 2; 4} + [2].a ∈ {0; 1; 3} + [2].b ∈ {0; 2; 4} + [3].a ∈ {0; 1; 3} + [3].b ∈ {0; 2; 4} + [4].a ∈ {0; 1; 3} + [4].b ∈ {0; 2} + p ∈ {{ &u{[0], [1], [2], [3], [4]} }} + q ∈ {{ (ts *)&u{[0].b, [1].b, [2].b, [3].b, [4].b} }} + r ∈ {{ (ts *)&u{[0].b, [1].b, [2].b, [3].b} }} + s ∈ {{ (ts *)&u{[0].b, [1].b, [2].b, [3].b} }} +[value] Values at end of function main3: + p ∈ {{ (int *)&t{[0], [1], [2], [3], [4]} }} + q ∈ {{ (int *)&c2 }} +[value] Values at end of function main4: + c1 ∈ [--..--] + c2 ∈ [--..--] + c3 ∈ [--..--] + c4 ∈ [--..--] + p ∈ {{ (int *)&t }} + q ∈ {{ &u[0] }} +[value] Values at end of function main5: + q ∈ {{ &y }} + p ∈ {0} + r ∈ {{ &y }} or UNINITIALIZED +[value] Values at end of function main6: + S_f1_0_S_vs[0] ∈ {1} + [1] ∈ [--..--] +[value] Values at end of function main7: + p ∈ {{ &t7_2 + [20..38996],0%4 }} +[value] Values at end of function main8: + tp[0] ∈ {{ &t8_1[0] }} + [1] ∈ {{ &t8_1 + [0..17179869180],0%4 }} + [2] ∈ {{ &t8_2 + [0..17179869180],0%4 }} + [3] ∈ {{ &t8_1 + [0..17179869180],0%4 ; &t8_2 + [0..17179869180],0%4 }} + p ∈ {{ &tp[0] }} +[value] Values at end of function main9: + tc[0..58] ∈ {1} or UNINITIALIZED + [59..98] ∈ UNINITIALIZED + [99..157] ∈ {2} or UNINITIALIZED + p ∈ {{ &tc + [-8..50] }} +[value] Values at end of function main: + t[0..2] ∈ {0} + [3] ∈ {0; 1} + [4] ∈ {1} + u[0].a ∈ {0; 1} + [0].b ∈ {0; 2; 4} + [1].a ∈ {0; 1; 3} + [1].b ∈ {0; 2; 4} + [2].a ∈ {0; 1; 3} + [2].b ∈ {0; 2; 4} + [3].a ∈ {0; 1; 3} + [3].b ∈ {0; 2; 4} + [4].a ∈ {0; 1; 3} + [4].b ∈ {0; 2} + S_f1_0_S_vs[0] ∈ {1} + [1] ∈ [--..--] +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main10 +[from] Done for function main10 +[from] Computing for function main11 +[from] Done for function main11 +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function main3 +[from] Done for function main3 +[from] Computing for function main4 +[from] Done for function main4 +[from] Computing for function main5 +[from] Done for function main5 +[from] Computing for function main6 +[from] Done for function main6 +[from] Computing for function main7 +[from] Done for function main7 +[from] Computing for function main8 +[from] Done for function main8 +[from] Computing for function main9 +[from] Done for function main9 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main1: + t[3] FROM v (and SELF) + [4] FROM v +[from] Function main10: + NO EFFECTS +[from] Function main11: + NO EFFECTS +[from] Function main2: + u[0..4] FROM v (and SELF) +[from] Function main3: + NO EFFECTS +[from] Function main4: + NO EFFECTS +[from] Function main5: + NO EFFECTS +[from] Function main6: + S_f1_0_S_vs[0] FROM p; S_vs[0] +[from] Function main7: + NO EFFECTS +[from] Function main8: + NO EFFECTS +[from] Function main9: + NO EFFECTS +[from] Function main: + t[3] FROM v (and SELF) + [4] FROM v + u[0..4] FROM v (and SELF) + S_f1_0_S_vs[0] FROM vs; S_vs[0] +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main1: + t[3..4]; p; q +[inout] Inputs for function main1: + v +[inout] Out (internal) for function main10: + t_0[0..39]; p; u_0[0..19]; q +[inout] Inputs for function main10: + sv +[inout] Out (internal) for function main11: + p; off; len; q +[inout] Inputs for function main11: + v +[inout] Out (internal) for function main2: + u[0..4]; p; q; r; s +[inout] Inputs for function main2: + v +[inout] Out (internal) for function main3: + p; q +[inout] Inputs for function main3: + \nothing +[inout] Out (internal) for function main4: + c1; c2; c3; c4; p; q +[inout] Inputs for function main4: + \nothing +[inout] Out (internal) for function main5: + q; p; r; x +[inout] Inputs for function main5: + v +[inout] Out (internal) for function main6: + S_f1_0_S_vs[0] +[inout] Inputs for function main6: + S_vs[0] +[inout] Out (internal) for function main7: + p +[inout] Inputs for function main7: + v +[inout] Out (internal) for function main8: + tp[0..3]; p +[inout] Inputs for function main8: + v +[inout] Out (internal) for function main9: + tc{[0..58]; [99..157]}; p +[inout] Inputs for function main9: + v +[inout] Out (internal) for function main: + t[3..4]; u[0..4]; S_f1_0_S_vs[0] +[inout] Inputs for function main: + v; sv; vs; S_vs[0] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/reduce_formals.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/reduce_formals.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/reduce_formals.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/reduce_formals.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,176 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/reduce_formals.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function main1 <- main. + Called from tests/misc/reduce_formals.i:56. +tests/misc/reduce_formals.i:2:[value] Assertion got status unknown. +tests/misc/reduce_formals.i:5:[value] entering loop for the first time +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/reduce_formals.i:57. +[value] using specification for function main2 +tests/misc/reduce_formals.i:8:[value] Function main2: precondition got status unknown. +[value] Done for function main2 +[value] DUMPING STATE of file tests/misc/reduce_formals.i line 59 + v ∈ [--..--] + w ∈ [6..2147483647] + x ∈ [5..2147483647] + y ∈ [--..--] + z ∈ [8..2147483647] + =END OF DUMP== +[value] computing for function main3 <- main. + Called from tests/misc/reduce_formals.i:62. +tests/misc/reduce_formals.i:18:[value] Assertion got status valid. +[value] computing for function f_main3 <- main3 <- main. + Called from tests/misc/reduce_formals.i:19. +[value] Recording results for f_main3 +[value] Done for function f_main3 +[value] Called Frama_C_show_each({6}) +[value] Recording results for main3 +[value] Done for function main3 +[value] computing for function main4 <- main. + Called from tests/misc/reduce_formals.i:63. +[value] computing for function f_main4_1 <- main4 <- main. + Called from tests/misc/reduce_formals.i:33. +tests/misc/reduce_formals.i:24:[value] Assertion got status unknown. +[value] Recording results for f_main4_1 +[value] Done for function f_main4_1 +[value] computing for function f_main4_2 <- main4 <- main. + Called from tests/misc/reduce_formals.i:36. +tests/misc/reduce_formals.i:28:[value] Assertion got status unknown. +[value] Recording results for f_main4_2 +[value] Done for function f_main4_2 +[value] Called Frama_C_show_each_v([-2147483648..15]) +[value] Called Frama_C_show_each_v([16..2147483647]) +[value] Recording results for main4 +[value] Done for function main4 +[value] computing for function main5 <- main. + Called from tests/misc/reduce_formals.i:64. +[value] computing for function f_main_1 <- main5 <- main. + Called from tests/misc/reduce_formals.i:52. +[value] computing for function f_main_2 <- f_main_1 <- main5 <- main. + Called from tests/misc/reduce_formals.i:47. +[value] Recording results for f_main_2 +[value] Done for function f_main_2 +[value] Recording results for f_main_1 +[value] Done for function f_main_1 +[value] Recording results for main5 +[value] Done for function main5 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f_main3: + x ∈ {6} +[value] Values at end of function f_main4_1: + +[value] Values at end of function f_main4_2: + +[value] Values at end of function f_main_2: + __retres ∈ {0} +[value] Values at end of function f_main_1: + v ∈ {0} +[value] Values at end of function main1: + j ∈ [-306783375..306783381] +[value] Values at end of function main3: + x ∈ {6} + p ∈ {{ &x }} +[value] Values at end of function main4: + +[value] Values at end of function main5: + l ∈ {2} +[value] Values at end of function main: + +[from] Computing for function f_main3 +[from] Done for function f_main3 +[from] Computing for function f_main4_1 +[from] Done for function f_main4_1 +[from] Computing for function f_main4_2 +[from] Done for function f_main4_2 +[from] Computing for function f_main_2 +[from] Done for function f_main_2 +[from] Computing for function f_main_1 +[from] Done for function f_main_1 +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main3 +[from] Done for function main3 +[from] Computing for function main4 +[from] Done for function main4 +[from] Computing for function main5 +[from] Done for function main5 +[from] Computing for function main +[from] Computing for function main2 <-main +[from] Done for function main2 +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f_main3: + x FROM p; a; x +[from] Function f_main4_1: + NO EFFECTS +[from] Function f_main4_2: + NO EFFECTS +[from] Function f_main_2: + \result FROM \nothing +[from] Function f_main_1: + NO EFFECTS +[from] Function main1: + NO EFFECTS +[from] Function main2: + NO EFFECTS +[from] Function main3: + NO EFFECTS +[from] Function main4: + NO EFFECTS +[from] Function main5: + NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f_main3: + x +[inout] Inputs for function f_main3: + x +[inout] Out (internal) for function f_main4_1: + \nothing +[inout] Inputs for function f_main4_1: + \nothing +[inout] Out (internal) for function f_main4_2: + \nothing +[inout] Inputs for function f_main4_2: + \nothing +[inout] Out (internal) for function f_main_2: + __retres +[inout] Inputs for function f_main_2: + \nothing +[inout] Out (internal) for function f_main_1: + v +[inout] Inputs for function f_main_1: + \nothing +[inout] Out (internal) for function main1: + j +[inout] Inputs for function main1: + \nothing +[inout] Out (internal) for function main3: + x; p +[inout] Inputs for function main3: + \nothing +[inout] Out (internal) for function main4: + \nothing +[inout] Inputs for function main4: + \nothing +[inout] Out (internal) for function main5: + l +[inout] Inputs for function main5: + \nothing +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/reduce_index.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/reduce_index.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/reduce_index.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/reduce_index.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,451 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/reduce_index.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..9] ∈ {0} + u[0..10] ∈ {0} + maybe ∈ [--..--] + c1 ∈ [--..--] + c2 ∈ [--..--] + c3 ∈ [--..--] + c4 ∈ [--..--] + c5 ∈ [--..--] + c6 ∈ [--..--] + c7 ∈ [--..--] + c8 ∈ [--..--] + c9 ∈ [--..--] + c10 ∈ [--..--] + c11 ∈ [--..--] + c12 ∈ [--..--] + ts[0..9] ∈ {0} + p8 ∈ {0} + ti_4[0..3] ∈ {0} + ti_7[0..6] ∈ {0} + k1 ∈ [--..--] + k2 ∈ [--..--] + k3 ∈ [--..--] + k4 ∈ [--..--] + nulli ∈ [--..--] +[value] computing for function f1 <- main. + Called from tests/misc/reduce_index.i:130. +[value] computing for function f1_aux <- f1 <- main. + Called from tests/misc/reduce_index.i:11. +[value] Recording results for f1_aux +[value] Done for function f1_aux +tests/misc/reduce_index.i:11:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ c1 < 10; +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/misc/reduce_index.i:131. +tests/misc/reduce_index.i:17:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ c2 < 10; +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/misc/reduce_index.i:132. +tests/misc/reduce_index.i:21:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ c3 < 10; +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/misc/reduce_index.i:133. +tests/misc/reduce_index.i:27:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ c4 < 10; +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/misc/reduce_index.i:134. +tests/misc/reduce_index.i:35:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ c5 < 10; +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/misc/reduce_index.i:135. +tests/misc/reduce_index.i:42:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ c6 < 11; +tests/misc/reduce_index.i:42:[kernel] warning: accessing out of bounds index [0..10]. assert c6 < 10; +[value] Recording results for f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/misc/reduce_index.i:136. +tests/misc/reduce_index.i:48:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ c7 < 10; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/misc/reduce_index.i:137. +tests/misc/reduce_index.i:64:[kernel] warning: out of bounds write. assert \valid(&p8->f1); +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f9 <- main. + Called from tests/misc/reduce_index.i:138. +tests/misc/reduce_index.i:72:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ c9 < 10; +[value] Recording results for f9 +[value] Done for function f9 +[value] computing for function f10 <- main. + Called from tests/misc/reduce_index.i:139. +tests/misc/reduce_index.i:86:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ c10 < 7; +[value] Recording results for f10 +[value] Done for function f10 +[value] computing for function f11 <- main. + Called from tests/misc/reduce_index.i:140. +tests/misc/reduce_index.i:93:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ c11 < 7; +tests/misc/reduce_index.i:93:[kernel] warning: out of bounds write. assert \valid(&(*p7)[c11]); +[value] Recording results for f11 +[value] Done for function f11 +[value] computing for function f12 <- main. + Called from tests/misc/reduce_index.i:141. +tests/misc/reduce_index.i:100:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ c12 < 4; +[value] Recording results for f12 +[value] Done for function f12 +[value] computing for function pointer_index <- main. + Called from tests/misc/reduce_index.i:143. +tests/misc/reduce_index.i:110:[kernel] warning: out of bounds read. assert \valid_read(p+k1); +tests/misc/reduce_index.i:113:[kernel] warning: out of bounds read. assert \valid_read(p+k2); +tests/misc/reduce_index.i:116:[kernel] warning: out of bounds read. assert \valid_read(p+k3); +tests/misc/reduce_index.i:119:[kernel] warning: out of bounds read. assert \valid_read(p+k4); +[value] Recording results for pointer_index +[value] Done for function pointer_index +[value] computing for function null_index <- main. + Called from tests/misc/reduce_index.i:144. +tests/misc/reduce_index.i:126:[kernel] warning: out of bounds write. assert \valid((int *)0+nulli); +tests/misc/reduce_index.i:126:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for null_index +[value] Done for function null_index +[value] Recording results for main +[value] done for function main +tests/misc/reduce_index.i:126:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f10: + c10 ∈ {0; 1; 2; 3; 4; 5; 6} + ti_7[0..6] ∈ {0; 10} + p7 ∈ {{ &ti_7 }} +[value] Values at end of function f11: + c11 ∈ {0; 1; 2; 3; 4; 5; 6} + ti_4[0..3] ∈ {0; 11} + p4 ∈ {{ &ti_4 }} + p7 ∈ {{ (ti7 *)&ti_4 }} +[value] Values at end of function f12: + c12 ∈ {0; 1; 2; 3} + ti_7[0..3] ∈ {0; 10; 12} + [4..6] ∈ {0; 10} + p7 ∈ {{ &ti_7 }} + p4 ∈ {{ (ti4 *)&ti_7 }} +[value] Values at end of function f1_aux: + __retres ∈ {1} +[value] Values at end of function f1: + t[0..9] ∈ {0; 1} + c1 ∈ [0..9] +[value] Values at end of function f2: + c2 ∈ [0..9] + __retres ∈ {0; 1} +[value] Values at end of function f3: + c3 ∈ [0..9] + __retres ∈ {0} +[value] Values at end of function f4: + c4 ∈ [0..9] + __retres ∈ {0} +[value] Values at end of function f5: + c5 ∈ [0..9] + c ∈ {0; 1} + __retres ∈ {0} +[value] Values at end of function f6: + t[0..9] ∈ {0; 1} + u[0..10] ∈ {0; 1} + c6 ∈ [0..9] +[value] Values at end of function f7: + t[0..9] ∈ {0; 1} + u[0..10] ∈ {0; 1} + c7 ∈ [0..9] +[value] Values at end of function f8: + c8 ∈ [--..--] + ts[0].f1 ∈ {0; 1} + [0].f2 ∈ {0; 2} + [1].f1 ∈ {0; 1} + [1].f2 ∈ {0; 2} + [2].f1 ∈ {0; 1} + [2].f2 ∈ {0; 2} + [3].f1 ∈ {0; 1} + [3].f2 ∈ {0; 2} + [4].f1 ∈ {0; 1} + [4].f2 ∈ {0; 2} + [5].f1 ∈ {0; 1} + [5].f2 ∈ {0; 2} + [6].f1 ∈ {0; 1} + [6].f2 ∈ {0; 2} + [7].f1 ∈ {0; 1} + [7].f2 ∈ {0; 2} + [8].f1 ∈ {0; 1} + [8].f2 ∈ {0; 2} + [9].f1 ∈ {0; 1} + [9].f2 ∈ {0; 2} + p8 ∈ {{ &ts + [0..72],0%8 }} + __retres ∈ {0} +[value] Values at end of function f9: + c9 ∈ [0..9] + ts[0].f1 ∈ {0; 1} + [0].f2 ∈ {0; 2} + [1].f1 ∈ {0; 1} + [1].f2 ∈ {0; 2} + [2].f1 ∈ {0; 1} + [2].f2 ∈ {0; 2} + [3].f1 ∈ {0; 1} + [3].f2 ∈ {0; 2} + [4].f1 ∈ {0; 1} + [4].f2 ∈ {0; 2} + [5].f1 ∈ {0; 1} + [5].f2 ∈ {0; 2} + [6].f1 ∈ {0; 1} + [6].f2 ∈ {0; 2} + [7].f1 ∈ {0; 1} + [7].f2 ∈ {0; 2} + [8].f1 ∈ {0; 1} + [8].f2 ∈ {0; 2} + [9].f1 ∈ {0; 1} + [9].f2 ∈ {0; 2} + __retres ∈ {0} +[value] Values at end of function null_index: + NON TERMINATING FUNCTION +[value] Values at end of function pointer_index: + k1 ∈ [0..10] + k2 ∈ [-1..8] + k3 ∈ [-2..7] + k4 ∈ [-3..7] + p ∈ {{ &u[3] }} + l ∈ {0; 1} +[value] Values at end of function main: + t[0..9] ∈ {0; 1} + u[0..10] ∈ {0; 1} + c1 ∈ [0..9] + c2 ∈ [0..9] + c3 ∈ [0..9] + c4 ∈ [0..9] + c5 ∈ [0..9] + c6 ∈ [0..9] + c7 ∈ [0..9] + c8 ∈ [--..--] + c9 ∈ [0..9] + c10 ∈ {0; 1; 2; 3; 4; 5; 6} + c11 ∈ {0; 1; 2; 3; 4; 5; 6} + c12 ∈ {0; 1; 2; 3} + ts[0].f1 ∈ {0; 1} + [0].f2 ∈ {0; 2} + [1].f1 ∈ {0; 1} + [1].f2 ∈ {0; 2} + [2].f1 ∈ {0; 1} + [2].f2 ∈ {0; 2} + [3].f1 ∈ {0; 1} + [3].f2 ∈ {0; 2} + [4].f1 ∈ {0; 1} + [4].f2 ∈ {0; 2} + [5].f1 ∈ {0; 1} + [5].f2 ∈ {0; 2} + [6].f1 ∈ {0; 1} + [6].f2 ∈ {0; 2} + [7].f1 ∈ {0; 1} + [7].f2 ∈ {0; 2} + [8].f1 ∈ {0; 1} + [8].f2 ∈ {0; 2} + [9].f1 ∈ {0; 1} + [9].f2 ∈ {0; 2} + p8 ∈ {{ &ts + [0..72],0%8 }} + ti_4[0..3] ∈ {0; 11} + ti_7[0..3] ∈ {0; 10; 12} + [4..6] ∈ {0; 10} + k1 ∈ [0..10] + k2 ∈ [-1..8] + k3 ∈ [-2..7] + k4 ∈ [-3..7] +[from] Computing for function f10 +[from] Done for function f10 +[from] Computing for function f11 +[from] Done for function f11 +[from] Computing for function f12 +[from] Done for function f12 +[from] Computing for function f1_aux +[from] Done for function f1_aux +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function f9 +[from] Done for function f9 +[from] Computing for function null_index +[from] Non-terminating function null_index (no dependencies) +[from] Done for function null_index +[from] Computing for function pointer_index +[from] Done for function pointer_index +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f10: + c10 FROM c10 + ti_7[0..6] FROM c10 (and SELF) +[from] Function f11: + c11 FROM c11 + ti_4[0..3] FROM c11 (and SELF) +[from] Function f12: + c12 FROM c12 + ti_7[0..3] FROM c12 (and SELF) +[from] Function f1_aux: + \result FROM \nothing +[from] Function f1: + t[0..9] FROM c1 (and SELF) + c1 FROM c1 +[from] Function f2: + c2 FROM c2 + \result FROM t[0..9]; c2 +[from] Function f3: + c3 FROM c3 + \result FROM \nothing +[from] Function f4: + c4 FROM c4 + \result FROM \nothing +[from] Function f5: + c5 FROM c5 + \result FROM \nothing +[from] Function f6: + t[0..9] FROM t[0..9]; u[0..9]; c6 (and SELF) + u[0..10] FROM t[0..9]; c6 (and SELF) + c6 FROM c6 +[from] Function f7: + t[0..9] FROM u[0..10]; c7 (and SELF) + u[0..9] FROM t[0..9]; u[0..10]; c7 (and SELF) + c7 FROM c7 +[from] Function f8: + c8 FROM c8 + ts[0..9] FROM c8 (and SELF) + p8 FROM c8 + \result FROM \nothing +[from] Function f9: + c9 FROM c9 + ts{[0].f1; [1].f1; [2].f1; [3].f1; [4].f1; [5].f1; [6].f1; [7].f1; [8].f1; + [9].f1} + FROM c9 (and SELF) + \result FROM \nothing +[from] Function null_index: + NON TERMINATING - NO EFFECTS +[from] Function pointer_index: + k1 FROM k1 + k2 FROM k2 + k3 FROM k3 + k4 FROM k4 +[from] Function main: + t[0..9] FROM t[0..9]; u[0..10]; c1; c6; c7 (and SELF) + u[0..9] FROM t[0..9]; u[0..10]; c1; c6; c7 (and SELF) + [10] FROM t[0..9]; c1; c6 (and SELF) + c1 FROM c1 + c2 FROM c2 + c3 FROM c3 + c4 FROM c4 + c5 FROM c5 + c6 FROM c6 + c7 FROM c7 + c8 FROM c8 + c9 FROM c9 + c10 FROM c10 + c11 FROM c11 + c12 FROM c12 + ts{[0].f1; [1].f1; [2].f1; [3].f1; [4].f1; [5].f1; [6].f1; [7].f1; [8].f1; + [9].f1} + FROM c8; c9 (and SELF) + {[0].f2; [1].f2; [2].f2; [3].f2; [4].f2; [5].f2; [6].f2; [7].f2; [8].f2; + [9].f2} + FROM c8 (and SELF) + p8 FROM c8 + ti_4[0..3] FROM c11 (and SELF) + ti_7[0..3] FROM c10; c12 (and SELF) + [4..6] FROM c10 (and SELF) + k1 FROM k1 + k2 FROM k2 + k3 FROM k3 + k4 FROM k4 +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f10: + c10; ti_7[0..6]; p7 +[inout] Inputs for function f10: + c10 +[inout] Out (internal) for function f11: + c11; ti_4[0..3]; p4; p7 +[inout] Inputs for function f11: + c11 +[inout] Out (internal) for function f12: + c12; ti_7[0..3]; p7; p4 +[inout] Inputs for function f12: + c12 +[inout] Out (internal) for function f1_aux: + __retres +[inout] Inputs for function f1_aux: + \nothing +[inout] Out (internal) for function f1: + t[0..9]; c1 +[inout] Inputs for function f1: + c1 +[inout] Out (internal) for function f2: + c2; __retres +[inout] Inputs for function f2: + t[0..9]; c2 +[inout] Out (internal) for function f3: + c3; __retres +[inout] Inputs for function f3: + t[0..9]; c3 +[inout] Out (internal) for function f4: + c4; x; __retres +[inout] Inputs for function f4: + t[0..9]; c4 +[inout] Out (internal) for function f5: + c5; c; __retres +[inout] Inputs for function f5: + t[0..9]; c5 +[inout] Out (internal) for function f6: + t[0..9]; u[0..10]; c6 +[inout] Inputs for function f6: + t[0..9]; u[0..9]; c6 +[inout] Out (internal) for function f7: + t[0..9]; u[0..9]; c7 +[inout] Inputs for function f7: + t[0..9]; u[0..10]; c7 +[inout] Out (internal) for function f8: + c8; ts[0..9]; p8; __retres +[inout] Inputs for function f8: + c8; p8 +[inout] Out (internal) for function f9: + c9; + ts{[0].f1; [1].f1; [2].f1; [3].f1; [4].f1; [5].f1; [6].f1; [7].f1; [8].f1; + [9].f1}; __retres +[inout] Inputs for function f9: + c9 +[inout] Out (internal) for function null_index: + \nothing +[inout] Inputs for function null_index: + nulli +[inout] Out (internal) for function pointer_index: + k1; k2; k3; k4; p; l +[inout] Inputs for function pointer_index: + u[0..10]; k1; k2; k3; k4 +[inout] Out (internal) for function main: + t[0..9]; u[0..10]; c1; c2; c3; c4; c5; c6; c7; c8; c9; c10; c11; c12; + ts[0..9]; p8; ti_4[0..3]; ti_7[0..6]; k1; k2; k3; k4 +[inout] Inputs for function main: + t[0..9]; u[0..10]; maybe; c1; c2; c3; c4; c5; c6; c7; c8; c9; c10; + c11; c12; p8; k1; k2; k3; k4; nulli diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/reduce_valid.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/reduce_valid.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/reduce_valid.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/reduce_valid.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,51 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/reduce_valid.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..1] ∈ {0} + u[0..1] ∈ {0} + p ∈ {0} + q ∈ {0} + r ∈ {0} + A ∈ {0} + offs ∈ {0} +tests/misc/reduce_valid.i:9:[kernel] warning: out of bounds write. assert \valid(p); +[value] Called CEA_ici({0}) +tests/misc/reduce_valid.i:17:[kernel] warning: out of bounds write. assert \valid(q); +tests/misc/reduce_valid.i:17:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +tests/misc/reduce_valid.i:24:[kernel] warning: out of bounds read. assert \valid_read(r+offs); +[value] Called Frama_C_show_each_r({{ &t }}) +tests/misc/reduce_valid.i:26:[kernel] warning: accessing out of bounds index [1..65536]. assert (int)((int)h+1) < 2; +[value] Recording results for main +[value] done for function main +tests/misc/reduce_valid.i:17:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + t[0] ∈ {4} + [1] ∈ {3} + u[0] ∈ {0} + [1] ∈ {1} + p ∈ {{ &t[0] }} + q ∈ {0} + r ∈ {{ &t[0] }} + A ∈ {3} + offs ∈ {1} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + t[0..1] FROM c + u[1] FROM h + p FROM c + q FROM \nothing + r FROM e; f + A FROM c; e; f; g + offs FROM g +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + t[0..1]; u[1]; p; q; r; A; offs; tmp +[inout] Inputs for function main: + t[1]; p; q; r; offs diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/redundant_alarms.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/redundant_alarms.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/redundant_alarms.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/redundant_alarms.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,122 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/redundant_alarms.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ [--..--] +[value] computing for function main1 <- main. + Called from tests/misc/redundant_alarms.c:26. +tests/misc/redundant_alarms.c:11:[kernel] warning: accessing uninitialized left-value: assert \initialized(p); +tests/misc/redundant_alarms.c:12:[kernel] warning: accessing uninitialized left-value: assert \initialized(p); +tests/misc/redundant_alarms.c:15:[kernel] warning: accessing uninitialized left-value: assert \initialized(p); +tests/misc/redundant_alarms.c:15:[kernel] warning: completely indeterminate value in x; + y. +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/redundant_alarms.c:27. +tests/misc/redundant_alarms.c:20:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. assert 0 ≤ i < 10; +tests/misc/redundant_alarms.c:21:[kernel] warning: accessing uninitialized left-value: assert \initialized(&t[i]); +tests/misc/redundant_alarms.c:22:[kernel] warning: accessing uninitialized left-value: assert \initialized(&t[i]); +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +tests/misc/redundant_alarms.c:15:[value] Assertion 'Value,initialisation' got final status invalid. +[scope:rm_asserts] removing 1 assertion(s) +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main1 +[pdg] done for function main1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main2 +[from] Done for function main2 +[pdg] done for function main +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int volatile v; +void main1(int c) +{ + int x; + int y; + int t; + int *p; + int *tmp; + int z; + int w; + if (c) tmp = & x; else tmp = & y; + p = tmp; + *p = 1; + /*@ assert Value: initialisation: \initialized(p); */ + z = *p + 1; + w = *p + 2; + x = t; + y = t; + x = t; + if (v) + /*@ assert Value: initialisation: \initialized(p); */ + z = *p + 2; + return; +} + +void main2(int i) +{ + int t[10]; + /*@ assert Value: index_bound: 0 ≤ i; */ + /*@ assert Value: index_bound: i < 10; */ + t[i] = 1; + /*@ assert Value: initialisation: \initialized(&t[i]); */ + t[i] += 3; + /*@ assert Value: initialisation: \initialized(&t[i]); */ + t[i] += 5; + return; +} + +void main(void) +{ + if (v) main1(v); + main2(v); + return; +} + + +/* Generated by Frama-C */ +int volatile v; +void main1_slice_1(int c) +{ + int x; + int y; + int t; + int *p; + int *tmp; + int z; + if (c) tmp = & x; else tmp = & y; + p = tmp; + *p = 1; + z = *p + 1; + y = t; + x = t; + if (v) z = *p + 2; + return; +} + +void main(void) +{ + if (v) main1_slice_1(v); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/reevaluate_alarms.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/reevaluate_alarms.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/reevaluate_alarms.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/reevaluate_alarms.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,288 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/reevaluate_alarms.i (no preprocessing) +tests/misc/reevaluate_alarms.i:15:[kernel] warning: Return statement with a value in function returning void +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ {0} + T[0..4] ∈ {0} + n ∈ {1} +[value] computing for function loop <- main. + Called from tests/misc/reevaluate_alarms.i:34. +tests/misc/reevaluate_alarms.i:13:[value] entering loop for the first time +tests/misc/reevaluate_alarms.i:14:[kernel] warning: out of bounds write. assert \valid(tmp); + (tmp from p++) +tests/misc/reevaluate_alarms.i:14:[kernel] warning: signed overflow. assert S+i ≤ 2147483647; +[value] Recording results for loop +[value] Done for function loop +[value] computing for function compute_n <- main. + Called from tests/misc/reevaluate_alarms.i:36. +tests/misc/reevaluate_alarms.i:19:[value] entering loop for the first time +tests/misc/reevaluate_alarms.i:20:[kernel] warning: signed overflow. assert n*i ≤ 2147483647; +[value] Recording results for compute_n +[value] Done for function compute_n +[value] computing for function init_p <- main. + Called from tests/misc/reevaluate_alarms.i:40. +[value] Recording results for init_p +[value] Done for function init_p +[value] computing for function initialized_p <- main. + Called from tests/misc/reevaluate_alarms.i:41. +tests/misc/reevaluate_alarms.i:30:[kernel] warning: accessing uninitialized left-value: assert \initialized(p); +[value] Recording results for initialized_p +[value] Done for function initialized_p +[value] computing for function init_p <- main. + Called from tests/misc/reevaluate_alarms.i:43. +[value] Recording results for init_p +[value] Done for function init_p +[value] computing for function initialized_p <- main. + Called from tests/misc/reevaluate_alarms.i:44. +[value] Recording results for initialized_p +[value] Done for function initialized_p +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function compute_n: + n ∈ [1..2147483647] + i ∈ {6} +[value] Values at end of function init_p: + x ∈ {0} or UNINITIALIZED + y ∈ {0} or UNINITIALIZED +[value] Values at end of function initialized_p: + x ∈ {1} +[value] Values at end of function loop: + S ∈ [0..2147483647] + T[0..4] ∈ [0..2147483647] + i ∈ {5} + p ∈ {{ &T + [0..--],0%4 }} +[value] Values at end of function main: + S ∈ [0..2147483647] + T[0..4] ∈ [0..2147483647] + n ∈ [1..2147483647] + x ∈ {0} + y ∈ {0} + __retres ∈ {0} +[from] Computing for function compute_n +[from] Done for function compute_n +[from] Computing for function init_p +[from] Done for function init_p +[from] Computing for function initialized_p +[from] Done for function initialized_p +[from] Computing for function loop +[from] Done for function loop +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function compute_n: + n FROM n (and SELF) +[from] Function init_p: + x FROM n; p (and SELF) + y FROM n; p (and SELF) +[from] Function initialized_p: + NO EFFECTS +[from] Function loop: + S FROM S (and SELF) + T[0..4] FROM S (and SELF) +[from] Function main: + S FROM S (and SELF) + T[0..4] FROM S (and SELF) + n FROM n (and SELF) + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function compute_n: + n; i +[inout] Inputs for function compute_n: + n +[inout] Out (internal) for function init_p: + x; y +[inout] Inputs for function init_p: + n +[inout] Out (internal) for function initialized_p: + x +[inout] Inputs for function initialized_p: + x; y +[inout] Out (internal) for function loop: + S; T[0..4]; i; p; tmp +[inout] Inputs for function loop: + S +[inout] Out (internal) for function main: + S; T[0..4]; n; x; y; __retres +[inout] Inputs for function main: + S; n +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'loop' +-------------------------------------------------------------------------------- + +[ - ] Assertion 'Value,mem_access' (file tests/misc/reevaluate_alarms.i, line 14) + tried with Value. +[ - ] Assertion 'Value,signed_overflow' (file tests/misc/reevaluate_alarms.i, line 14) + tried with Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'compute_n' +-------------------------------------------------------------------------------- + +[ - ] Assertion 'Value,signed_overflow' (file tests/misc/reevaluate_alarms.i, line 20) + tried with Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'initialized_p' +-------------------------------------------------------------------------------- + +[ - ] Assertion 'Value,initialisation' (file tests/misc/reevaluate_alarms.i, line 30) + tried with Value. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 4 To be validated + 4 Total +-------------------------------------------------------------------------------- +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ {0} + T[0..4] ∈ {0} + n ∈ {1} +[value] computing for function loop <- main. + Called from tests/misc/reevaluate_alarms.i:34. +[value] Recording results for loop +[value] Done for function loop +[value] computing for function compute_n <- main. + Called from tests/misc/reevaluate_alarms.i:36. +[value] Recording results for compute_n +[value] Done for function compute_n +[value] computing for function init_p <- main. + Called from tests/misc/reevaluate_alarms.i:40. +[value] Recording results for init_p +[value] Done for function init_p +[value] computing for function initialized_p <- main. + Called from tests/misc/reevaluate_alarms.i:41. +[value] Recording results for initialized_p +[value] Done for function initialized_p +[value] computing for function init_p <- main. + Called from tests/misc/reevaluate_alarms.i:43. +[value] Recording results for init_p +[value] Done for function init_p +[value] computing for function initialized_p <- main. + Called from tests/misc/reevaluate_alarms.i:44. +[value] Recording results for initialized_p +[value] Done for function initialized_p +[value] Recording results for main +[value] done for function main +tests/misc/reevaluate_alarms.i:14:[value] Assertion 'Value,signed_overflow' got final status valid. +tests/misc/reevaluate_alarms.i:14:[value] Assertion 'Value,mem_access' got final status valid. +tests/misc/reevaluate_alarms.i:20:[value] Assertion 'Value,signed_overflow' got final status valid. +tests/misc/reevaluate_alarms.i:30:[value] Assertion 'Value,initialisation' got final status valid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function compute_n: + n ∈ {120} + i ∈ {6} +[value] Values at end of function init_p: + x ∈ {0} + y ∈ {0} or UNINITIALIZED +[value] Values at end of function initialized_p: + x ∈ {1} +[value] Values at end of function loop: + S ∈ {10} + T[0] ∈ {0} + [1] ∈ {1} + [2] ∈ {3} + [3] ∈ {6} + [4] ∈ {10} + i ∈ {5} + p ∈ {{ &T[5] }} +[value] Values at end of function main: + S ∈ {10} + T[0] ∈ {0} + [1] ∈ {1} + [2] ∈ {3} + [3] ∈ {6} + [4] ∈ {10} + n ∈ {120} + x ∈ {0} + y ∈ {0} + __retres ∈ {0} +[from] Computing for function compute_n +[from] Done for function compute_n +[from] Computing for function init_p +[from] Done for function init_p +[from] Computing for function initialized_p +[from] Done for function initialized_p +[from] Computing for function loop +[from] Done for function loop +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function compute_n: + n FROM n (and SELF) +[from] Function init_p: + x FROM n; p (and SELF) + y FROM n; p (and SELF) +[from] Function initialized_p: + NO EFFECTS +[from] Function loop: + S FROM S (and SELF) + T[0..4] FROM S (and SELF) +[from] Function main: + S FROM S (and SELF) + T[0..4] FROM S (and SELF) + n FROM n (and SELF) + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function compute_n: + n; i +[inout] Inputs for function compute_n: + n +[inout] Out (internal) for function init_p: + x; y +[inout] Inputs for function init_p: + n +[inout] Out (internal) for function initialized_p: + x +[inout] Inputs for function initialized_p: + x; y +[inout] Out (internal) for function loop: + S; T[0..4]; i; p; tmp +[inout] Inputs for function loop: + S +[inout] Out (internal) for function main: + S; T[0..4]; n; x; y; __retres +[inout] Inputs for function main: + S; n +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'loop' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion 'Value,mem_access' (file tests/misc/reevaluate_alarms.i, line 14) + by Value (v2). +[ Valid ] Assertion 'Value,signed_overflow' (file tests/misc/reevaluate_alarms.i, line 14) + by Value (v2). + +-------------------------------------------------------------------------------- +--- Properties of Function 'compute_n' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion 'Value,signed_overflow' (file tests/misc/reevaluate_alarms.i, line 20) + by Value (v2). + +-------------------------------------------------------------------------------- +--- Properties of Function 'initialized_p' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion 'Value,initialisation' (file tests/misc/reevaluate_alarms.i, line 30) + by Value (v2). + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 4 Completely validated + 4 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/relation_reduction.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/relation_reduction.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/relation_reduction.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/relation_reduction.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,50 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/relation_reduction.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + y ∈ {0} + t ∈ {0} + R1 ∈ {0} + R2 ∈ {0} + R3 ∈ {0} + R4 ∈ {0} + c ∈ {0} + tab[0] ∈ {101} + [1] ∈ {102} + [2] ∈ {103} + [3] ∈ {104} + [4] ∈ {105} + [5] ∈ {106} + [6] ∈ {103} + [7] ∈ {102} + [8] ∈ {101} +tests/misc/relation_reduction.i:9:[kernel] warning: signed overflow. assert y+10 ≤ 2147483647; +tests/misc/relation_reduction.i:20:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. assert 0 ≤ y < 9; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + y ∈ [--..--] + t ∈ [-2147483638..2147483647] + R1 ∈ [--..--] + R2 ∈ [-2147483638..2147483647] + R3 ∈ [--..--] + R4 ∈ {0; 1; 2; 3; 4; 5} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + y FROM x + t FROM x + R1 FROM x (and SELF) + R2 FROM x (and SELF) + R3 FROM x (and SELF) + R4 FROM tab[0..8]; x (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + y; t; R1; R2; R3; R4 +[inout] Inputs for function main: + y; t; tab[0..8] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/relations_difficult.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/relations_difficult.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/relations_difficult.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/relations_difficult.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/relations_difficult.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + p ∈ {0} + A ∈ {0} + B ∈ {0} + C ∈ {0} + Z ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + x ∈ {4} + y ∈ {1; 2} + p ∈ {{ &x ; &y }} + A ∈ {1; 2; 3} + B ∈ {1; 2; 4} + C ∈ {1; 2; 4} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + x FROM \nothing + y FROM c + p FROM c + A FROM c + B FROM Z; c + C FROM c + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + x; y; p; A; B; C; __retres +[inout] Inputs for function main: + x; y; p; Z diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/relation_shift.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/relation_shift.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/relation_shift.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/relation_shift.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,63 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/relation_shift.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + r1 ∈ {0} + r2 ∈ {0} + r3 ∈ {0} + r4 ∈ {0} +tests/misc/relation_shift.i:5:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +tests/misc/relation_shift.i:6:[kernel] warning: signed overflow. assert -2147483648 ≤ y-1; +tests/misc/relation_shift.i:11:[kernel] warning: signed overflow. assert z+t ≤ 2147483647; +tests/misc/relation_shift.i:12:[kernel] warning: out of bounds write. assert \valid(q); +tests/misc/relation_shift.i:15:[kernel] warning: signed overflow. assert -2147483648 ≤ x-y ≤ 2147483647; +tests/misc/relation_shift.i:16:[kernel] warning: signed overflow. assert -2147483648 ≤ z-y ≤ 2147483647; +tests/misc/relation_shift.i:18:[kernel] warning: out of bounds read. assert \valid_read(q); +[value] DUMPING STATE of file tests/misc/relation_shift.i line 19 + r1 ∈ [--..--] + r2 ∈ [--..--] + r3 ∈ {3} + r4 ∈ [--..--] + x ∈ [-2147483647..2147483647] + y ∈ [-2147483648..2147483646] + z ∈ [-2147483642..2147483647] + t ∈ {5} + p ∈ {{ &p + {4} }} + q ∈ {{ &S_q[1] }} + S_q[0] ∈ {3} + [1] ∈ [--..--] + S_p[0..1] ∈ [--..--] + =END OF DUMP== +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + r1 ∈ [--..--] + r2 ∈ [--..--] + r3 ∈ {3} + r4 ∈ [--..--] + x ∈ [-2147483647..2147483647] + y ∈ [-2147483648..2147483646] + z ∈ [-2147483642..2147483647] + t ∈ {5} + p ∈ {{ &p + {4} }} + q ∈ {{ &S_q[1] }} + S_q[0] ∈ {3} + [1] ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + r1 FROM y + r2 FROM y + r3 FROM q + r4 FROM q; S_q[1] + S_q[0] FROM q +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + r1; r2; r3; r4; x; y; z; t; p; q; S_q[0] +[inout] Inputs for function main: + S_q[0..1] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/relations.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/relations.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/relations.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/relations.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,100 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/relations.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + p ∈ {0} + x ∈ {0} + u[0..19] ∈ {0} + R1 ∈ {0} + R2 ∈ {0} + R3 ∈ {0} + R4 ∈ {0} + R5 ∈ {0} + R6 ∈ {0} + R7 ∈ {0} + A7 ∈ {0} + R8 ∈ {0} + A8 ∈ {0} + S1 ∈ {0} + S2 ∈ {0} + S3 ∈ {0} + S4 ∈ {0} + S5 ∈ {0} + S6 ∈ {0} + S7 ∈ {0} + B7 ∈ {0} + S8 ∈ {0} + B8 ∈ {0} +tests/misc/relations.i:35:[kernel] warning: signed overflow. assert u[0]+1 ≤ 2147483647; +tests/misc/relations.i:41:[kernel] warning: signed overflow. assert -2147483648 ≤ u[5]-u[0] ≤ 2147483647; +tests/misc/relations.i:46:[kernel] warning: signed overflow. assert -2147483648 ≤ u[10]-u[11] ≤ 2147483647; +tests/misc/relations.i:48:[kernel] warning: signed overflow. assert -2147483648 ≤ u[1]-u[0] ≤ 2147483647; +tests/misc/relations.i:52:[kernel] warning: signed overflow. assert -2147483648 ≤ u[5]-u[1] ≤ 2147483647; +tests/misc/relations.i:56:[kernel] warning: out of bounds read. assert \valid_read(&pCs->L0); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + t[0..1] ∈ {4} + [2] ∈ {3} + p ∈ {{ &t[1] }} + x ∈ {4} + u[0..1] ∈ [--..--] + [2..4] ∈ {0} + [5] ∈ [-2147483647..2147483647] + [6..9] ∈ {0} + [10..11] ∈ [--..--] + [12..19] ∈ {0} + R1 ∈ [--..--] + R2 ∈ [--..--] + R3 ∈ [--..--] + R4 ∈ [--..--] + R5 ∈ [--..--] + R6 ∈ [--..--] + R7 ∈ {0; 1} + A7 ∈ [--..--] + R8 ∈ {0; 1} + A8 ∈ [--..--] + S1 ∈ {-1; 0; 1} + S2 ∈ {0; 1} + c ∈ {0} + e ∈ [--..--] + f ∈ [--..--] + S_pCs[0]{.L0; .L1} ∈ [--..--] + [0]{.T13; .T; .L8} ∈ {0; 1} + [1] ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + t[0..1] FROM \nothing + p FROM \nothing + x FROM \nothing + u{[0..1]; [5]} FROM g + [10] FROM h + [11] FROM i + R1 FROM g (and SELF) + R2 FROM g (and SELF) + R3 FROM g (and SELF) + R4 FROM g (and SELF) + R5 FROM g + R6 FROM h; i (and SELF) + R7 FROM g (and SELF) + A7 FROM g + R8 FROM g (and SELF) + A8 FROM g + S1 FROM pCs; S_pCs[0]{.L0; .L1} + S2 FROM pCs; S_pCs[0]{.L0; .L1} (and SELF) + S_pCs[0]{.T13; .T; .L8} FROM pCs; S_pCs[0]{.L0; .L1} +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + t[0..1]; p; x; u{[0..1]; [5]; [10..11]}; R1; R2; R3; R4; R5; R6; R7; + A7; R8; A8; S1; S2; c; e; f; tmp; tmp_0; S_pCs[0]{.T13; .T; .L8} +[inout] Inputs for function main: + t[0..1]; p; x; u{[0..1]; [5]; [10..11]}; S_pCs[0]{.L0; .L1; .T13; .T} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/replace_by_show_each.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/replace_by_show_each.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/replace_by_show_each.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/replace_by_show_each.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,53 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/replace_by_show_each.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} +[value] Called Frama_C_show_each_2() +[inout] warning: no assigns clauses for function Frama_C_show_each_1. Results will be + imprecise. +[from] warning: no assigns clauses for function Frama_C_show_each_1. Results will be + imprecise. +[value] Called Frama_C_show_each_1() +tests/misc/replace_by_show_each.c:26:[kernel] warning: signed overflow. assert j+1 ≤ 2147483647; +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: +Cannot filter: dumping raw memory (including unchanged variables) + x ∈ {0} + j ∈ [--..--] + i ∈ [-2147483647..2147483647] +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to Frama_C_show_each_2 at tests/misc/replace_by_show_each.c:23 (by main): + NO EFFECTS +[from] call to Frama_C_show_each_1 at tests/misc/replace_by_show_each.c:25 (by main): + FROMTOP +[from] entry point: + \result FROM j +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[inout] InOut (internal) for function Frama_C_show_each_1: + Operational inputs: + ANYTHING(origin:Unknown) + Operational inputs on termination: + ANYTHING(origin:Unknown) + Sure outputs: + \nothing +[inout] InOut (internal) for function Frama_C_show_each_2: + Operational inputs: + \nothing + Operational inputs on termination: + \nothing + Sure outputs: + \nothing +[inout] InOut (internal) for function main: + Operational inputs: + ANYTHING(origin:Unknown) + Operational inputs on termination: + ANYTHING(origin:Unknown) + Sure outputs: + i diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/resolve.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/resolve.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/resolve.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/resolve.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/resolve.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/misc/resolve.i:12. +tests/misc/resolve.i:12:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] using specification for function f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + +[from] Computing for function main +[from] Computing for function f <-main +[from] Done for function f +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + tmp +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/return.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/return.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/return.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/return.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/return.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + H ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/return.i:18. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/return.i:19. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {0} +[value] Values at end of function main: + G ∈ {0} + H ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM G; x +[from] Function main: + G FROM G; c (and SELF) + H FROM G; H; c (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + G +[inout] Out (internal) for function main: + G; H +[inout] Inputs for function main: + G; H diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/save_comments.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/save_comments.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/save_comments.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/save_comments.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,131 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/save_comments.i (no preprocessing) +Printing default project first time: +/* Generated by Frama-C */ +/* ************************************************************************ */ +/* */ +/* This file is part of Frama-C. */ +/* */ +/* Copyright (C) 2007-2015 */ +/* 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). */ +/* */ +/* ************************************************************************ */ +/* Functions used internally by the normalization phase. */ +/* This file is systematically included by Frama-C's kernel. */ +/* FC's code normalization can use some of the functions declared here. */ +/* If you add something here, be sure to use the FC_BUILTIN attribute, */ +/* that will ensure that the builtin is printed iff it is actually used */ +/* in the normalized code. */ +/* run.config + OPT: -load-script tests/misc/save_comments.ml -keep-comments + */ +int f(void) +{ + int x; + x = 0; + /* Hello, I'm the f function */ + return x; +} + + +Printing default project second time: +/* Generated by Frama-C */ +/* ************************************************************************ */ +/* */ +/* This file is part of Frama-C. */ +/* */ +/* Copyright (C) 2007-2015 */ +/* 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). */ +/* */ +/* ************************************************************************ */ +/* Functions used internally by the normalization phase. */ +/* This file is systematically included by Frama-C's kernel. */ +/* FC's code normalization can use some of the functions declared here. */ +/* If you add something here, be sure to use the FC_BUILTIN attribute, */ +/* that will ensure that the builtin is printed iff it is actually used */ +/* in the normalized code. */ +/* run.config + OPT: -load-script tests/misc/save_comments.ml -keep-comments + */ +int f(void) +{ + int x; + x = 0; + /* Hello, I'm the f function */ + return x; +} + + +In project default, searching for comments between tests/misc/save_comments.i:6 and tests/misc/save_comments.i:9: + Hello, I'm the f function +End of comments +In project saved_project, searching for comments between tests/misc/save_comments.i:6 and tests/misc/save_comments.i:9: + Hello, I'm the f function +End of comments +Printing saved project: +/* Generated by Frama-C */ +/* ************************************************************************ */ +/* */ +/* This file is part of Frama-C. */ +/* */ +/* Copyright (C) 2007-2015 */ +/* 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). */ +/* */ +/* ************************************************************************ */ +/* Functions used internally by the normalization phase. */ +/* This file is systematically included by Frama-C's kernel. */ +/* FC's code normalization can use some of the functions declared here. */ +/* If you add something here, be sure to use the FC_BUILTIN attribute, */ +/* that will ensure that the builtin is printed iff it is actually used */ +/* in the normalized code. */ +/* run.config + OPT: -load-script tests/misc/save_comments.ml -keep-comments + */ +int f(void) +{ + int x; + x = 0; + /* Hello, I'm the f function */ + return x; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/semaphore.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/semaphore.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/semaphore.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/semaphore.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,91 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/semaphore.i (no preprocessing) +[value] Analyzing a complete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Sa ∈ {0} + Sb ∈ {0} +tests/misc/semaphore.i:28:[value] entering loop for the first time +tests/misc/semaphore.i:29:[value] entering loop for the first time +[value] computing for function V <- g. + Called from tests/misc/semaphore.i:31. +tests/misc/semaphore.i:31:[kernel] warning: Neither code nor specification for function V, generating default assigns from the prototype +[value] using specification for function V +[value] Done for function V +[value] computing for function V <- g. + Called from tests/misc/semaphore.i:31. +[value] Done for function V +[value] computing for function V <- g. + Called from tests/misc/semaphore.i:31. +[value] Done for function V +[value] computing for function V <- g. + Called from tests/misc/semaphore.i:31. +[value] Done for function V +[value] computing for function P <- g. + Called from tests/misc/semaphore.i:34. +tests/misc/semaphore.i:34:[kernel] warning: Neither code nor specification for function P, generating default assigns from the prototype +[value] using specification for function P +[value] Done for function P +[value] computing for function P <- g. + Called from tests/misc/semaphore.i:35. +[value] Done for function P +[value] computing for function V <- g. + Called from tests/misc/semaphore.i:37. +[value] Done for function V +[value] computing for function V <- g. + Called from tests/misc/semaphore.i:38. +[value] Done for function V +[value] computing for function f <- g. + Called from tests/misc/semaphore.i:40. +[value] computing for function P <- f <- g. + Called from tests/misc/semaphore.i:14. +[value] Done for function P +[value] computing for function P <- f <- g. + Called from tests/misc/semaphore.i:16. +[value] Done for function P +[value] computing for function P <- f <- g. + Called from tests/misc/semaphore.i:17. +[value] Done for function P +[value] computing for function V <- f <- g. + Called from tests/misc/semaphore.i:19. +[value] Done for function V +[value] computing for function V <- f <- g. + Called from tests/misc/semaphore.i:20. +[value] Done for function V +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + c ∈ {12} +[value] Values at end of function g: + c ∈ {-26; -1} +[from] Computing for function f +[from] Computing for function P <-f +[from] Done for function P +[from] Computing for function V <-f +[from] Done for function V +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function P: + NO EFFECTS +[from] Function V: + NO EFFECTS +[from] Function f: + NO EFFECTS +[from] Function g: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + c +[inout] Inputs for function f: + Sa; Sb +[inout] Out (internal) for function g: + c; tmp +[inout] Inputs for function g: + Sa; Sb diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/sep.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/sep.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/sep.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/sep.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/sep.i (no preprocessing) +[value] Analyzing an incomplete application starting at f1 +[value] Part of a case analysis: 1 of 0..3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + index ∈ [--..--] + tab[0..4] ∈ [--..--] +tests/misc/sep.i:36:[value] Function f1: precondition got status unknown. +[value] computing for function init1 <- f1. + Called from tests/misc/sep.i:41. +[value] computing for function init2 <- init1 <- f1. + Called from tests/misc/sep.i:18. +tests/misc/sep.i:18:[kernel] warning: No code nor implicit assigns clause for function init2, generating default assigns from the prototype +[value] using specification for function init2 +[value] Done for function init2 +tests/misc/sep.i:20:[value] warning: Statement 3: only propagating for condition false +tests/misc/sep.i:26:[value] warning: Statement 6: only propagating for condition true +[value] Recording results for init1 +[value] Done for function init1 +[value] Recording results for f1 +[value] done for function f1 +[value] Next case to cover in sequential order: 2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function init1: + index ∈ {0} + res ∈ {0} +[value] Values at end of function f1: + index ∈ {0} + res ∈ {0} + __retres ∈ [--..--] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/sep.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/sep.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/sep.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/sep.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,31 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/sep.i (no preprocessing) +[value] Analyzing an incomplete application starting at f1 +[value] Part of a case analysis: 2 of 0..3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + index ∈ [--..--] + tab[0..4] ∈ [--..--] +tests/misc/sep.i:36:[value] Function f1: precondition got status unknown. +[value] computing for function init1 <- f1. + Called from tests/misc/sep.i:41. +[value] computing for function init2 <- init1 <- f1. + Called from tests/misc/sep.i:18. +tests/misc/sep.i:18:[kernel] warning: No code nor implicit assigns clause for function init2, generating default assigns from the prototype +[value] using specification for function init2 +[value] Done for function init2 +tests/misc/sep.i:20:[value] warning: Statement 3: only propagating for condition true +[value] Recording results for init1 +[value] Done for function init1 +[value] Recording results for f1 +[value] done for function f1 +[value] This analysis covers cases 2 to 3 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function init1: + index ∈ {0} + res ∈ {0} +[value] Values at end of function f1: + index ∈ {0} + res ∈ {0} + __retres ∈ [--..--] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/sep.3.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/sep.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/sep.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/sep.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,31 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/sep.i (no preprocessing) +[value] Analyzing an incomplete application starting at f1 +[value] Part of a case analysis: 3 of 0..3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + index ∈ [--..--] + tab[0..4] ∈ [--..--] +tests/misc/sep.i:36:[value] Function f1: precondition got status unknown. +[value] computing for function init1 <- f1. + Called from tests/misc/sep.i:41. +[value] computing for function init2 <- init1 <- f1. + Called from tests/misc/sep.i:18. +tests/misc/sep.i:18:[kernel] warning: No code nor implicit assigns clause for function init2, generating default assigns from the prototype +[value] using specification for function init2 +[value] Done for function init2 +tests/misc/sep.i:20:[value] warning: Statement 3: only propagating for condition true +[value] Recording results for init1 +[value] Done for function init1 +[value] Recording results for f1 +[value] done for function f1 +[value] This analysis covers cases 2 to 3 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function init1: + index ∈ {0} + res ∈ {0} +[value] Values at end of function f1: + index ∈ {0} + res ∈ {0} + __retres ∈ [--..--] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/sep.4.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/sep.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/sep.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/sep.4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,31 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/sep.i (no preprocessing) +[value] Splitting return states on: + \return(init2) == 0, 1 (auto) + \return(init1) == 0 (auto) +[value] Analyzing an incomplete application starting at f1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + index ∈ [--..--] + tab[0..4] ∈ [--..--] +tests/misc/sep.i:36:[value] Function f1: precondition got status unknown. +[value] computing for function init1 <- f1. + Called from tests/misc/sep.i:41. +[value] computing for function init2 <- init1 <- f1. + Called from tests/misc/sep.i:18. +tests/misc/sep.i:18:[kernel] warning: No code nor implicit assigns clause for function init2, generating default assigns from the prototype +[value] using specification for function init2 +[value] Done for function init2 +[value] Recording results for init1 +[value] Done for function init1 +[value] Recording results for f1 +[value] done for function f1 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function init1: + index ∈ [--..--] + res ∈ {-1; 0} +[value] Values at end of function f1: + index ∈ [--..--] + res ∈ {-1; 0} + __retres ∈ [--..--] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/separated.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/separated.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/separated.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/separated.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/separated.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..14] ∈ {0} + p ∈ {{ &t[0] }} + x ∈ {0} +tests/misc/separated.i:10:[value] Assertion got status valid. +tests/misc/separated.i:13:[value] Assertion got status invalid (stopping propagation). +tests/misc/separated.i:16:[value] Assertion got status invalid (stopping propagation). +tests/misc/separated.i:19:[value] Assertion got status invalid (stopping propagation). +tests/misc/separated.i:22:[value] Assertion got status valid. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + x ∈ {1} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + x FROM c + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + x; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/sep.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/sep.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/sep.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/sep.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,30 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/sep.i (no preprocessing) +[value] Analyzing an incomplete application starting at f1 +[value] Part of a case analysis: 0 of 0..3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + index ∈ [--..--] + tab[0..4] ∈ [--..--] +tests/misc/sep.i:36:[value] Function f1: precondition got status unknown. +[value] computing for function init1 <- f1. + Called from tests/misc/sep.i:41. +[value] computing for function init2 <- init1 <- f1. + Called from tests/misc/sep.i:18. +tests/misc/sep.i:18:[kernel] warning: No code nor implicit assigns clause for function init2, generating default assigns from the prototype +[value] using specification for function init2 +[value] Done for function init2 +tests/misc/sep.i:20:[value] warning: Statement 3: only propagating for condition false +tests/misc/sep.i:26:[value] warning: Statement 6: only propagating for condition false +[value] Recording results for init1 +[value] Done for function init1 +[value] Recording results for f1 +[value] done for function f1 +[value] Next case to cover in sequential order: 1 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function init1: + res ∈ {-1} +[value] Values at end of function f1: + res ∈ {-1} + __retres ∈ {-1} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/shift.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/shift.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/shift.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/shift.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,87 @@ +[value] warning: New option name for -no-val-left-shift-negative-alarms is -no-val-warn-left-shift-negative +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/shift.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} + d ∈ {0} + e ∈ {0} + f ∈ {0} + g ∈ {0} + h ∈ {0} + ua ∈ {0} + ub ∈ {0} + uc ∈ {0} + ud ∈ {0} + ue ∈ {0} + uf ∈ {0} + t[0..9] ∈ {0} +tests/misc/shift.i:21:[kernel] warning: invalid RHS operand for shift. assert 0 ≤ c < 32; +tests/misc/shift.i:22:[value] Assertion got status valid. +tests/misc/shift.i:25:[kernel] warning: invalid RHS operand for shift. assert 0 ≤ c < 32; +tests/misc/shift.i:26:[value] Assertion got status valid. +tests/misc/shift.i:29:[kernel] warning: invalid RHS operand for shift. assert 0 ≤ c < 32; +tests/misc/shift.i:32:[value] Assertion got status unknown. +tests/misc/shift.i:35:[kernel] warning: invalid RHS operand for shift. assert 0 ≤ 32 < 32; +tests/misc/shift.i:36:[kernel] warning: invalid RHS operand for shift. assert 0 ≤ 5555 < 32; +tests/misc/shift.i:40:[kernel] warning: invalid RHS operand for shift. assert 0 ≤ b < 32; +[value] computing for function printf <- main. + Called from tests/misc/shift.i:48. +tests/misc/shift.i:48:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] using specification for function printf +[value] Done for function printf +tests/misc/shift.i:52:[value] warning: Operation {{ &t }} << {8} incurs a loss of precision +tests/misc/shift.i:52:[value] Assigning imprecise value to r. + The imprecision originates from Arithmetic {tests/misc/shift.i:52} +tests/misc/shift.i:53:[value] Reading left-value r. + It contains a garbled mix of {t} because of Arithmetic + {tests/misc/shift.i:52}. +tests/misc/shift.i:53:[value] warning: Operation {{ &t }} << {8} incurs a loss of precision +tests/misc/shift.i:53:[kernel] warning: signed overflow. assert -2147483648 ≤ (long)((char *)t)<<8 ≤ 2147483647; +tests/misc/shift.i:53:[kernel] warning: signed overflow. + assert -2147483648 ≤ (long)r+(long)((long)((char *)t)<<8) ≤ 2147483647; +tests/misc/shift.i:53:[value] Assigning imprecise value to r. + The imprecision originates from Arithmetic {tests/misc/shift.i:52; + tests/misc/shift.i:53} +[value] Recording results for main +[value] done for function main +tests/misc/shift.i:35:[value] Assertion 'Value,shift' got final status invalid. +tests/misc/shift.i:36:[value] Assertion 'Value,shift' got final status invalid. +tests/misc/shift.i:40:[value] Assertion 'Value,shift' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + a ∈ {314; 1256; 5024} + b ∈ {0} + d ∈ {61; 246; 255; 987} + f ∈ {-988; -255; -247; -62} + ua ∈ {1401} + ub ∈ {1073741074} + c ∈ [--..--] + z ∈ [--..--] + zz ∈ {0} + shl ∈ {0} +[from] Computing for function main +[from] Computing for function printf <-main +[from] Done for function printf +tests/misc/shift.i:48:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function printf: + NO EFFECTS +[from] Function main: + a FROM c + b FROM z (and SELF) + d FROM c + f FROM c + ua FROM \nothing + ub FROM \nothing + \result FROM b; z +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + a; b; d; f; ua; ub; c; z; zz; cc; r; shl +[inout] Inputs for function main: + b; d; f; ua; ub diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/shift.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/shift.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/shift.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/shift.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,81 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/shift.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} + d ∈ {0} + e ∈ {0} + f ∈ {0} + g ∈ {0} + h ∈ {0} + ua ∈ {0} + ub ∈ {0} + uc ∈ {0} + ud ∈ {0} + ue ∈ {0} + uf ∈ {0} + t[0..9] ∈ {0} +tests/misc/shift.i:21:[kernel] warning: invalid RHS operand for shift. assert 0 ≤ c < 32; +tests/misc/shift.i:22:[value] Assertion got status valid. +tests/misc/shift.i:25:[kernel] warning: invalid RHS operand for shift. assert 0 ≤ c < 32; +tests/misc/shift.i:26:[value] Assertion got status valid. +tests/misc/shift.i:29:[kernel] warning: invalid RHS operand for shift. assert 0 ≤ c < 32; +tests/misc/shift.i:31:[kernel] warning: invalid LHS operand for left shift. assert 0 ≤ c; +tests/misc/shift.i:32:[value] Assertion got status valid. +tests/misc/shift.i:35:[kernel] warning: invalid RHS operand for shift. assert 0 ≤ 32 < 32; +tests/misc/shift.i:36:[kernel] warning: invalid RHS operand for shift. assert 0 ≤ 5555 < 32; +tests/misc/shift.i:40:[kernel] warning: invalid RHS operand for shift. assert 0 ≤ b < 32; +[value] computing for function printf <- main. + Called from tests/misc/shift.i:48. +tests/misc/shift.i:48:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] using specification for function printf +[value] Done for function printf +tests/misc/shift.i:52:[value] warning: Operation {{ &t }} << {8} incurs a loss of precision +tests/misc/shift.i:52:[value] Assigning imprecise value to r. + The imprecision originates from Arithmetic {tests/misc/shift.i:52} +tests/misc/shift.i:53:[value] Reading left-value r. + It contains a garbled mix of {t} because of Arithmetic + {tests/misc/shift.i:52}. +tests/misc/shift.i:53:[kernel] warning: invalid LHS operand for left shift. assert 0 ≤ (long)((char *)t); +[value] Recording results for main +[value] done for function main +tests/misc/shift.i:35:[value] Assertion 'Value,shift' got final status invalid. +tests/misc/shift.i:36:[value] Assertion 'Value,shift' got final status invalid. +tests/misc/shift.i:40:[value] Assertion 'Value,shift' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + a ∈ {314; 1256; 5024} + b ∈ {0} + d ∈ {61; 246; 255; 987} + f ∈ {-988; -255; -247; -62} + ua ∈ {1401} + ub ∈ {1073741074} + c ∈ [--..--] + z ∈ [--..--] + zz ∈ {0} + shl ∈ {0} +[from] Computing for function main +[from] Computing for function printf <-main +[from] Done for function printf +tests/misc/shift.i:48:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function printf: + NO EFFECTS +[from] Function main: + a FROM c + b FROM z (and SELF) + d FROM c + f FROM c + ua FROM \nothing + ub FROM \nothing + \result FROM b; z +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + a; b; d; f; ua; ub; c; z; zz; cc; r; shl +[inout] Inputs for function main: + b; d; f; ua; ub diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/sign_of_bitfiled_int.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/sign_of_bitfiled_int.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/sign_of_bitfiled_int.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/sign_of_bitfiled_int.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,14 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/sign_of_bitfiled_int.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + bf ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + bf.c ∈ {-1} + .u ∈ {65535} + int_inside_bitfield_is_unsigned ∈ {1} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/sign_of_bitfiled_int.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/sign_of_bitfiled_int.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/sign_of_bitfiled_int.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/sign_of_bitfiled_int.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,14 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/sign_of_bitfiled_int.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + bf ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + bf.c ∈ {-1} + .u ∈ {65535} + int_inside_bitfield_is_unsigned ∈ {1} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/simple_packed.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/simple_packed.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/simple_packed.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/simple_packed.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/simple_packed.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/misc/simple_packed.c:19. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + bar{.c; .i; .s.c} ∈ [--..--] + .s.[bits 8 to 31] ∈ UNINITIALIZED + .s.i ∈ [--..--] +[value] Values at end of function main: + +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM foo +[from] Function main: + \result FROM foo +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + bar +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/simple_path.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/simple_path.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/simple_path.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/simple_path.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,30 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/simple_path.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + H ∈ {0} + p ∈ {{ &G }} + q ∈ {{ &H }} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + G ∈ {3} + H ∈ {5} + p ∈ {{ &H }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + G FROM p + H FROM \nothing + p FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + G; H; p +[inout] Inputs for function main: + p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/simplify_cfg.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/simplify_cfg.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/simplify_cfg.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/simplify_cfg.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,13 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/simplify_cfg.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + z ∈ {1; 100} + c ∈ {99} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/simplify_cfg.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/simplify_cfg.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/simplify_cfg.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/simplify_cfg.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,13 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/simplify_cfg.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + z ∈ {1; 100} + c ∈ {99} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/sizeof.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/sizeof.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/sizeof.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/sizeof.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,139 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/sizeof.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + sz_str ∈ {0} + sz_typ ∈ {0} + align_str ∈ {0} + align_typ ∈ {0} + s1 ∈ {0} + i ∈ [--..--] +[value] computing for function main1 <- main. + Called from tests/misc/sizeof.i:38. +tests/misc/sizeof.i:10:[value] Assertion got status valid. +tests/misc/sizeof.i:14:[value] Assertion got status valid. +tests/misc/sizeof.i:17:[value] Assertion got status valid. +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/sizeof.i:39. +tests/misc/sizeof.i:32:[value] warning: Operation {{ &s1 }} + {{ &s1 }} incurs a loss of precision +tests/misc/sizeof.i:32:[value] Assigning imprecise value to p. + The imprecision originates from Arithmetic {tests/misc/sizeof.i:32} +tests/misc/sizeof.i:33:[kernel] warning: accessing out of bounds index [0..4294967295]. + assert (unsigned int)(sizeof(s1.t)-(unsigned int)i) < 10; +tests/misc/sizeof.i:33:[value] Reading left-value p. + It contains a garbled mix of {s1} because of Arithmetic + {tests/misc/sizeof.i:32}. +tests/misc/sizeof.i:33:[kernel] warning: out of bounds write. + assert \valid(&p->t[(unsigned int)(sizeof(s1.t)-(unsigned int)i)]); +tests/misc/sizeof.i:34:[kernel] warning: accessing out of bounds index [0..4294967295]. + assert (unsigned int)(sizeof(s1.t)-(unsigned int)i) < 10; +tests/misc/sizeof.i:34:[value] Reading left-value p. + It contains a garbled mix of {s1} because of Arithmetic + {tests/misc/sizeof.i:32}. +tests/misc/sizeof.i:34:[kernel] warning: out of bounds write. + assert \valid(&p->t[(unsigned int)(sizeof(s1.t)-(unsigned int)i)]); +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +[scope:rm_asserts] removing 2 assertion(s) +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main1: + sz_str ∈ {4} + sz_typ ∈ {1} + align_str ∈ {1} + align_typ ∈ {4} +[value] Values at end of function main2: + s1 ∈ [--..--] + p ∈ + {{ garbled mix of &{s1} (origin: Arithmetic {tests/misc/sizeof.i:32}) }} +[value] Values at end of function main: + sz_str ∈ {4} + sz_typ ∈ {1} + align_str ∈ {1} + align_typ ∈ {4} + s1 ∈ [--..--] +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main1: + sz_str FROM \nothing + sz_typ FROM \nothing + align_str FROM \nothing + align_typ FROM \nothing +[from] Function main2: + s1 FROM i (and SELF) +[from] Function main: + sz_str FROM \nothing + sz_typ FROM \nothing + align_str FROM \nothing + align_typ FROM \nothing + s1 FROM i (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main1: + sz_str; sz_typ; align_str; align_typ +[inout] Inputs for function main1: + \nothing +[inout] Out (internal) for function main2: + s1; p +[inout] Inputs for function main2: + i +[inout] Out (internal) for function main: + sz_str; sz_typ; align_str; align_typ; s1 +[inout] Inputs for function main: + i +/* Generated by Frama-C */ +struct s { + int t[10] ; +}; +int sz_str; +int sz_typ; +int align_str; +int align_typ; +void main1(void) +{ + sz_str = (int)sizeof("ONE"); + /*@ assert sz_str ≡ sizeof("ONE"); */ ; + align_str = (int)__alignof__("FOO"); + sz_typ = (int)sizeof(char); + /*@ assert sz_typ ≡ sizeof(char); */ ; + align_typ = (int)__alignof__(char *); + /*@ assert sizeof("BLA") ≢ sizeof("FOOBAR"); */ ; + return; +} + +struct s s1; +int volatile i; +void main2(void) +{ + struct s *p; + p = & s1 + (int)(& s1); + /*@ assert + Value: index_bound: (unsigned int)(sizeof(s1.t)-(unsigned int)i) < 10; + */ + /*@ assert + Value: mem_access: + \valid(&p->t[(unsigned int)(sizeof(s1.t)-(unsigned int)i)]); + */ + p->t[sizeof(s1.t) - (unsigned int)i] = 1; + p->t[sizeof(s1.t) - (unsigned int)i] = 2; + return; +} + +void main(void) +{ + main1(); + main2(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/slevelex.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/slevelex.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/slevelex.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/slevelex.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,114 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/slevelex.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + c ∈ [--..--] +tests/misc/slevelex.i:80:[value] Assertion got status unknown. +[value] Called Frama_C_show_each_xy({1; 2}, {1; 2}) +[value] computing for function f <- main. + Called from tests/misc/slevelex.i:83. +[value] Recording results for f +[value] Done for function f +tests/misc/slevelex.i:84:[value] Assertion got status valid. +[value] computing for function gu <- main. + Called from tests/misc/slevelex.i:88. +tests/misc/slevelex.i:26:[value] Assertion got status valid. +[value] Called Frama_C_show_each_u({1}) +[value] Called Frama_C_show_each_u({2}) +[value] Called Frama_C_show_each_u({3}) +[value] Called Frama_C_show_each_u({4}) +[value] Called Frama_C_show_each_u({5}) +[value] Called Frama_C_show_each_u({6}) +[value] Called Frama_C_show_each_u({7}) +[value] Called Frama_C_show_each_u({8}) +[value] Called Frama_C_show_each_u({9}) +[value] Called Frama_C_show_each_u({10}) +[value] Called Frama_C_show_each_u({11}) +[value] Called Frama_C_show_each_u({12}) +[value] Called Frama_C_show_each_u({13}) +[value] Called Frama_C_show_each_u({14}) +[value] Called Frama_C_show_each_u({15}) +[value] Called Frama_C_show_each_u({16}) +[value] Called Frama_C_show_each_u({17}) +[value] Called Frama_C_show_each_u({18}) +[value] Called Frama_C_show_each_u({19}) +[value] Called Frama_C_show_each_u({20}) +[value] Recording results for gu +[value] Done for function gu +[value] computing for function ginc <- main. + Called from tests/misc/slevelex.i:89. +tests/misc/slevelex.i:49:[value] Assertion got status valid. +[value] Called Frama_C_show_each_inc({4}) +[value] Called Frama_C_show_each_inc({8}) +[value] Called Frama_C_show_each_inc({12}) +[value] Called Frama_C_show_each_inc({16}) +[value] Called Frama_C_show_each_inc({20}) +[value] Called Frama_C_show_each_inc({24}) +[value] Called Frama_C_show_each_inc({28}) +[value] Called Frama_C_show_each_inc({32}) +[value] Called Frama_C_show_each_inc({36}) +[value] Called Frama_C_show_each_inc({40}) +[value] Called Frama_C_show_each_inc({44}) +[value] Called Frama_C_show_each_inc({48}) +[value] Called Frama_C_show_each_inc({52}) +[value] Called Frama_C_show_each_inc({56}) +[value] Called Frama_C_show_each_inc({60}) +[value] Called Frama_C_show_each_inc({64}) +[value] Called Frama_C_show_each_inc({68}) +[value] Called Frama_C_show_each_inc({72}) +[value] Called Frama_C_show_each_inc({76}) +[value] Called Frama_C_show_each_inc({80}) +[value] Recording results for ginc +[value] Done for function ginc +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + x ∈ {1; 2} + y ∈ {1; 2} + __retres ∈ {0} +[value] Values at end of function ginc: + inc ∈ [4..80],0%4 +[value] Values at end of function gu: + +[value] Values at end of function main: + un ∈ [1..20] + x ∈ {0} + y ∈ {1; 2} +[from] Computing for function f +[from] Done for function f +[from] Computing for function ginc +[from] Done for function ginc +[from] Computing for function gu +[from] Done for function gu +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM c +[from] Function ginc: + NO EFFECTS +[from] Function gu: + NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + x; y; __retres +[inout] Inputs for function f: + c +[inout] Out (internal) for function ginc: + inc +[inout] Inputs for function ginc: + \nothing +[inout] Out (internal) for function gu: + \nothing +[inout] Inputs for function gu: + \nothing +[inout] Out (internal) for function main: + un; x; y +[inout] Inputs for function main: + c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/slevel_return.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/slevel_return.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/slevel_return.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/slevel_return.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,68 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/slevel_return.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] computing for function main1 <- main. + Called from tests/misc/slevel_return.i:44. +tests/misc/slevel_return.i:7:[value] Function main1: postcondition got status valid. +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/slevel_return.i:45. +[value] DUMPING STATE of file tests/misc/slevel_return.i line 38 + x ∈ {-3} + y ∈ {0; 1; 6} + c ∈ [--..--] + c ∈ [--..--] + =END OF DUMP== +tests/misc/slevel_return.i:23:[value] Function main2: postcondition got status valid. +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main1: + x ∈ {-3; 0; 5} + y ∈ {0; 1; 6} +[value] Values at end of function main2: + x ∈ {-3; 0; 5} + y ∈ {0; 1; 6} +[value] Values at end of function main: + x ∈ {-3; 0; 5} + y ∈ {0; 1; 6} +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main2 +[from] Computing for function Frama_C_dump_each <-main2 +[from] Done for function Frama_C_dump_each +[from] Done for function main2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main1: + x FROM c + y FROM c (and SELF) +[from] Function main2: + x FROM c + y FROM c (and SELF) +[from] Function main: + x FROM c + y FROM c (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main1: + x; y +[inout] Inputs for function main1: + \nothing +[inout] Out (internal) for function main2: + x; y +[inout] Inputs for function main2: + \nothing +[inout] Out (internal) for function main: + x; y +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/small_conditionals.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/small_conditionals.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/small_conditionals.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/small_conditionals.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/small_conditionals.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Y ∈ {0} + Z ∈ {0} + U ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + Y ∈ [--..--] + Z ∈ {4} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + Y FROM X + Z FROM U +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + Y; Z; tmp +[inout] Inputs for function main: + U diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/sort4.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/sort4.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/sort4.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/sort4.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,56 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/sort4.i (no preprocessing) +tests/misc/sort4.i:25:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +[value] Analyzing an incomplete application starting at sort4_4 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ [--..--] + b ∈ [--..--] + c ∈ [--..--] + d ∈ [--..--] +tests/misc/sort4.i:25:[value] Function sort4_4: precondition got status unknown. +tests/misc/sort4.i:29:[kernel] warning: out of bounds read. assert \valid_read(t+1); +tests/misc/sort4.i:29:[kernel] warning: out of bounds read. assert \valid_read(t+1); +tests/misc/sort4.i:29:[kernel] warning: out of bounds write. assert \valid(t+1); +tests/misc/sort4.i:30:[kernel] warning: out of bounds read. assert \valid_read(t+2); +tests/misc/sort4.i:30:[kernel] warning: out of bounds read. assert \valid_read(t+3); +tests/misc/sort4.i:30:[kernel] warning: out of bounds read. assert \valid_read(t+2); +tests/misc/sort4.i:30:[kernel] warning: out of bounds write. assert \valid(t+2); +tests/misc/sort4.i:30:[kernel] warning: out of bounds read. assert \valid_read(t+3); +tests/misc/sort4.i:30:[kernel] warning: out of bounds write. assert \valid(t+3); +tests/misc/sort4.i:31:[kernel] warning: out of bounds read. assert \valid_read(t+2); +tests/misc/sort4.i:31:[kernel] warning: out of bounds read. assert \valid_read(t+2); +tests/misc/sort4.i:31:[kernel] warning: out of bounds write. assert \valid(t+2); +tests/misc/sort4.i:32:[kernel] warning: out of bounds read. assert \valid_read(t+1); +tests/misc/sort4.i:32:[kernel] warning: out of bounds read. assert \valid_read(t+3); +tests/misc/sort4.i:32:[kernel] warning: out of bounds read. assert \valid_read(t+1); +tests/misc/sort4.i:32:[kernel] warning: out of bounds write. assert \valid(t+1); +tests/misc/sort4.i:32:[kernel] warning: out of bounds read. assert \valid_read(t+3); +tests/misc/sort4.i:32:[kernel] warning: out of bounds write. assert \valid(t+3); +tests/misc/sort4.i:33:[kernel] warning: out of bounds read. assert \valid_read(t+1); +tests/misc/sort4.i:33:[kernel] warning: out of bounds read. assert \valid_read(t+2); +tests/misc/sort4.i:33:[kernel] warning: out of bounds read. assert \valid_read(t+1); +tests/misc/sort4.i:33:[kernel] warning: out of bounds write. assert \valid(t+1); +tests/misc/sort4.i:33:[kernel] warning: out of bounds read. assert \valid_read(t+2); +tests/misc/sort4.i:33:[kernel] warning: out of bounds write. assert \valid(t+2); +tests/misc/sort4.i:26:[value] Function sort4_4: postcondition got status unknown. +[value] Recording results for sort4_4 +[value] done for function sort4_4 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function sort4_4: + tmp ∈ [-2147483647..2147483647] or UNINITIALIZED + S_t[0..3] ∈ [--..--] +[from] Computing for function sort4_4 +[from] Done for function sort4_4 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function sort4_4: + S_t[0] FROM t; S_t[0..3] (and SELF) + [1..2] FROM t; S_t[0..3] (and SELF) + [3] FROM t; S_t[0..3] (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function sort4_4: + tmp; S_t[0..3] +[inout] Inputs for function sort4_4: + S_t[0..3] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/sort4.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/sort4.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/sort4.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/sort4.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/sort4.i (no preprocessing) +tests/misc/sort4.i:25:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +[value] Analyzing an incomplete application starting at sort4_3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ [--..--] + b ∈ [--..--] + c ∈ [--..--] + d ∈ [--..--] +tests/misc/sort4.i:59:[value] Function sort4_3: precondition got status unknown. +tests/misc/sort4.i:61:[value] Function sort4_3: postcondition got status unknown. +[value] Recording results for sort4_3 +[value] done for function sort4_3 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function sort4_3: + tmp ∈ [-2147483647..2147483647] or UNINITIALIZED + S_d_0[0..1] ∈ [--..--] + S_c_0[0..1] ∈ [--..--] + S_b_0[0..1] ∈ [--..--] + S_a_0[0..1] ∈ [--..--] +[from] Computing for function sort4_3 +[from] Done for function sort4_3 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function sort4_3: + S_d_0[0] + FROM a_0; b_0; c_0; d_0; S_d_0[0]; S_c_0[0]; S_b_0[0]; + S_a_0[0] (and SELF) + S_c_0[0] + FROM a_0; b_0; c_0; d_0; S_d_0[0]; S_c_0[0]; S_b_0[0]; + S_a_0[0] (and SELF) + S_b_0[0] + FROM a_0; b_0; c_0; d_0; S_d_0[0]; S_c_0[0]; S_b_0[0]; + S_a_0[0] (and SELF) + S_a_0[0] + FROM a_0; b_0; c_0; d_0; S_d_0[0]; S_c_0[0]; S_b_0[0]; + S_a_0[0] (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function sort4_3: + tmp; S_d_0[0]; S_c_0[0]; S_b_0[0]; S_a_0[0] +[inout] Inputs for function sort4_3: + S_d_0[0]; S_c_0[0]; S_b_0[0]; S_a_0[0] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/sort4.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/sort4.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/sort4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/sort4.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,35 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/sort4.i (no preprocessing) +tests/misc/sort4.i:25:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +[value] Analyzing an incomplete application starting at sort4_1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ [--..--] + b ∈ [--..--] + c ∈ [--..--] + d ∈ [--..--] +tests/misc/sort4.i:20:[value] Assertion got status unknown. +[value] Recording results for sort4_1 +[value] done for function sort4_1 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function sort4_1: + a ∈ [--..--] + b ∈ [--..--] + c ∈ [--..--] + d ∈ [--..--] + tmp ∈ [-2147483647..2147483647] or UNINITIALIZED +[from] Computing for function sort4_1 +[from] Done for function sort4_1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function sort4_1: + a FROM a; b; c; d (and SELF) + b FROM a; b; c; d (and SELF) + c FROM a; b; c; d (and SELF) + d FROM a; b; c; d (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function sort4_1: + a; b; c; d; tmp +[inout] Inputs for function sort4_1: + a; b; c; d diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/split_return.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/split_return.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/split_return.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/split_return.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,354 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/split_return.i (no preprocessing) +[value] Splitting return states on: + \return(f7) == 0, 3 (user) + \return(init) == 0 (auto) + \return(f2) == 0 (auto) + \return(f3) == -2 (auto) + \return(f4) == 4 (auto) + \return(f5) == -2 (auto) + \return(f6) == 0 (auto) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i2 ∈ [--..--] + i3 ∈ [--..--] + i4 ∈ [--..--] + i5 ∈ [--..--] + v ∈ [--..--] + v7 ∈ {0} +[value] computing for function main1 <- main. + Called from tests/misc/split_return.i:153. +[value] computing for function init <- main1 <- main. + Called from tests/misc/split_return.i:14. +[value] using specification for function init +[value] Done for function init +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/split_return.i:154. +[value] computing for function f2 <- main2 <- main. + Called from tests/misc/split_return.i:44. +[value] Recording results for f2 +[value] Done for function f2 +[value] Called Frama_C_show_each_f2({5; 7}, {5}) +[value] Called Frama_C_show_each_f2({0}, {0}) +tests/misc/split_return.i:47:[value] Assertion got status valid. +[value] Called Frama_C_show_each_f2_2({5; 7}, {5}) +tests/misc/split_return.i:50:[value] Assertion got status valid. +[value] Recording results for main2 +[value] Done for function main2 +[value] computing for function main3 <- main. + Called from tests/misc/split_return.i:155. +[value] computing for function f3 <- main3 <- main. + Called from tests/misc/split_return.i:69. +[value] Recording results for f3 +[value] Done for function f3 +[value] Called Frama_C_show_each_f3({7}, {5}) +[value] Called Frama_C_show_each_f3({-2}, {0}) +tests/misc/split_return.i:72:[value] Assertion got status valid. +tests/misc/split_return.i:74:[value] Assertion got status valid. +[value] Recording results for main3 +[value] Done for function main3 +[value] computing for function main4 <- main. + Called from tests/misc/split_return.i:156. +[value] computing for function f4 <- main4 <- main. + Called from tests/misc/split_return.i:90. +[value] Recording results for f4 +[value] Done for function f4 +[value] Called Frama_C_show_each_f4({7}, {5}) +[value] Called Frama_C_show_each_f4({4}, {0}) +tests/misc/split_return.i:93:[value] Assertion got status valid. +tests/misc/split_return.i:95:[value] Assertion got status valid. +[value] Recording results for main4 +[value] Done for function main4 +[value] computing for function main5 <- main. + Called from tests/misc/split_return.i:157. +[value] computing for function f5 <- main5 <- main. + Called from tests/misc/split_return.i:113. +[value] Recording results for f5 +[value] Done for function f5 +[value] Called Frama_C_show_each_f5({7}, {5}) +[value] Called Frama_C_show_each_f5({-2}, {0}) +tests/misc/split_return.i:116:[value] Assertion got status valid. +tests/misc/split_return.i:118:[value] Assertion got status valid. +[value] Recording results for main5 +[value] Done for function main5 +[value] computing for function main6 <- main. + Called from tests/misc/split_return.i:158. +[value] computing for function f6 <- main6 <- main. + Called from tests/misc/split_return.i:131. +tests/misc/split_return.i:126:[value] Assertion got status unknown. +tests/misc/split_return.i:127:[value] f6: cannot properly split on \result == 0 +[value] Recording results for f6 +[value] Done for function f6 +[value] Recording results for main6 +[value] Done for function main6 +[value] computing for function main7 <- main. + Called from tests/misc/split_return.i:159. +[value] computing for function f7 <- main7 <- main. + Called from tests/misc/split_return.i:144. +[value] Recording results for f7 +[value] Done for function f7 +[value] Called Frama_C_show_each_NULL({0}, {0}) +[value] Called Frama_C_show_each_NULL({{ &v }}, {1}) +[value] Recording results for main7 +[value] Done for function main7 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f2: + i2 ∈ {0; 5} + __retres ∈ {0; 5; 7} +[value] Values at end of function f3: + i3 ∈ {0; 5} + res1 ∈ {-2; 7} + res2 ∈ {-2; 7} +[value] Values at end of function f4: + i4 ∈ {0; 5} + __retres ∈ {4; 7} +[value] Values at end of function f5: + i5 ∈ {0; 5} + res ∈ {-2; 7} +[value] Values at end of function f6: + i ∈ [-5..5] +[value] Values at end of function f7: + v7 ∈ {0; 1} + __retres ∈ {{ NULL ; &v }} +[value] Values at end of function main1: + x ∈ [0..2147483649] + r ∈ {0; 1} +[value] Values at end of function main2: + i2 ∈ {0; 5} + r ∈ {0; 5; 7} +[value] Values at end of function main3: + i3 ∈ {0; 5} + r ∈ {-2; 7} +[value] Values at end of function main4: + i4 ∈ {0; 5} + r ∈ {4; 7} +[value] Values at end of function main5: + i5 ∈ {0; 5} + r ∈ {-2; 7} +[value] Values at end of function main6: + +[value] Values at end of function main7: + v7 ∈ {0; 1} + p ∈ {{ NULL ; &v }} +[value] Values at end of function main: + i2 ∈ {0; 5} + i3 ∈ {0; 5} + i4 ∈ {0; 5} + i5 ∈ {0; 5} + v7 ∈ {0; 1} +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function main1 +[from] Computing for function init <-main1 +[from] Done for function init +[from] Done for function main1 +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function main3 +[from] Done for function main3 +[from] Computing for function main4 +[from] Done for function main4 +[from] Computing for function main5 +[from] Done for function main5 +[from] Computing for function main6 +[from] Done for function main6 +[from] Computing for function main7 +[from] Done for function main7 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f2: + i2 FROM i2 + \result FROM i2 +[from] Function f3: + i3 FROM i3 + \result FROM i3 +[from] Function f4: + i4 FROM i4 + \result FROM i4 +[from] Function f5: + i5 FROM i5 + \result FROM i5 +[from] Function f6: + \result FROM v +[from] Function f7: + v7 FROM v + \result FROM v +[from] Function init: + x FROM \nothing + \result FROM \nothing +[from] Function main1: + \result FROM \nothing +[from] Function main2: + i2 FROM i2 +[from] Function main3: + i3 FROM i3 +[from] Function main4: + i4 FROM i4 +[from] Function main5: + i5 FROM i5 +[from] Function main6: + NO EFFECTS +[from] Function main7: + v7 FROM v +[from] Function main: + i2 FROM i2 + i3 FROM i3 + i4 FROM i4 + i5 FROM i5 + v7 FROM v +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f2: + i2; __retres +[inout] Inputs for function f2: + i2 +[inout] Out (internal) for function f3: + i3; res1; res2 +[inout] Inputs for function f3: + i3 +[inout] Out (internal) for function f4: + i4; __retres +[inout] Inputs for function f4: + i4 +[inout] Out (internal) for function f5: + i5; res +[inout] Inputs for function f5: + i5 +[inout] Out (internal) for function f6: + i +[inout] Inputs for function f6: + v +[inout] Out (internal) for function f7: + v7; __retres +[inout] Inputs for function f7: + v +[inout] Out (internal) for function main1: + x; r +[inout] Inputs for function main1: + \nothing +[inout] Out (internal) for function main2: + i2; r +[inout] Inputs for function main2: + i2 +[inout] Out (internal) for function main3: + i3; r +[inout] Inputs for function main3: + i3 +[inout] Out (internal) for function main4: + i4; r +[inout] Inputs for function main4: + i4 +[inout] Out (internal) for function main5: + i5; r +[inout] Inputs for function main5: + i5 +[inout] Out (internal) for function main6: + tmp +[inout] Inputs for function main6: + v +[inout] Out (internal) for function main7: + v7; p +[inout] Inputs for function main7: + v; v7 +[inout] Out (internal) for function main: + i2; i3; i4; i5; v7 +[inout] Inputs for function main: + i2; i3; i4; i5; v; v7 +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'init' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file tests/misc/split_return.i, line 9) + Unverifiable but considered Valid. +[ Extern ] Assigns (file tests/misc/split_return.i, line 7) + Unverifiable but considered Valid. +[ Extern ] Froms (file tests/misc/split_return.i, line 7) + Unverifiable but considered Valid. +[ Extern ] Froms (file tests/misc/split_return.i, line 8) + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main1' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/misc/split_return.i, line 24) + Locally valid, but unreachable. + By Value because: + - Unreachable program point (file tests/misc/split_return.i, line 24) +[Unreachable] Unreachable program point (file tests/misc/split_return.i, line 24) + by Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main2' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/misc/split_return.i, line 47) + by Value. +[ Valid ] Assertion (file tests/misc/split_return.i, line 50) + by Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main3' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/misc/split_return.i, line 72) + by Value. +[ Valid ] Assertion (file tests/misc/split_return.i, line 74) + by Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main4' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/misc/split_return.i, line 93) + by Value. +[ Valid ] Assertion (file tests/misc/split_return.i, line 95) + by Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main5' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/misc/split_return.i, line 116) + by Value. +[ Valid ] Assertion (file tests/misc/split_return.i, line 118) + by Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f6' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/misc/split_return.i, line 126) + tried with Value. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 9 Completely validated + 4 Considered valid + 1 To be validated + 1 Dead property + 1 Unreachable + 16 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/split_return.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/split_return.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/split_return.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/split_return.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,4 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/split_return.i (no preprocessing) +[value] user error: incorrect argument for option -slevel-function (no function 'NON_EXISTING'). +[kernel] Plug-in value aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/split_return.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/split_return.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/split_return.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/split_return.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,349 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/split_return.i (no preprocessing) +[value] warning: ignoring non-existing function 'NON_EXISTING'. +[value] Splitting return states on: + \return(f2) == 0 (user) + \return(f3) == -2, -4 (user) + \return(f4) == 4 (user) + \return(f5) == -2 (user) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i2 ∈ [--..--] + i3 ∈ [--..--] + i4 ∈ [--..--] + i5 ∈ [--..--] + v ∈ [--..--] + v7 ∈ {0} +[value] computing for function main1 <- main. + Called from tests/misc/split_return.i:153. +[value] computing for function init <- main1 <- main. + Called from tests/misc/split_return.i:14. +[value] using specification for function init +[value] Done for function init +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/split_return.i:154. +[value] computing for function f2 <- main2 <- main. + Called from tests/misc/split_return.i:44. +[value] Recording results for f2 +[value] Done for function f2 +[value] Called Frama_C_show_each_f2({5; 7}, {5}) +[value] Called Frama_C_show_each_f2({0}, {0}) +tests/misc/split_return.i:47:[value] Assertion got status valid. +[value] Called Frama_C_show_each_f2_2({5; 7}, {5}) +tests/misc/split_return.i:50:[value] Assertion got status valid. +[value] Recording results for main2 +[value] Done for function main2 +[value] computing for function main3 <- main. + Called from tests/misc/split_return.i:155. +[value] computing for function f3 <- main3 <- main. + Called from tests/misc/split_return.i:69. +tests/misc/split_return.i:65:[value] f3: cannot properly split on \result == -2 +[value] Recording results for f3 +[value] Done for function f3 +[value] Called Frama_C_show_each_f3({-2; 7}, {0; 5}) +tests/misc/split_return.i:72:[value] Assertion got status unknown. +tests/misc/split_return.i:74:[value] Assertion got status unknown. +[value] Recording results for main3 +[value] Done for function main3 +[value] computing for function main4 <- main. + Called from tests/misc/split_return.i:156. +[value] computing for function f4 <- main4 <- main. + Called from tests/misc/split_return.i:90. +[value] Recording results for f4 +[value] Done for function f4 +[value] Called Frama_C_show_each_f4({4; 7}, {0; 5}) +tests/misc/split_return.i:93:[value] Assertion got status unknown. +tests/misc/split_return.i:95:[value] Assertion got status unknown. +[value] Recording results for main4 +[value] Done for function main4 +[value] computing for function main5 <- main. + Called from tests/misc/split_return.i:157. +[value] computing for function f5 <- main5 <- main. + Called from tests/misc/split_return.i:113. +[value] Recording results for f5 +[value] Done for function f5 +[value] Called Frama_C_show_each_f5({7}, {5}) +[value] Called Frama_C_show_each_f5({-2}, {0}) +tests/misc/split_return.i:116:[value] Assertion got status valid. +tests/misc/split_return.i:118:[value] Assertion got status valid. +[value] Recording results for main5 +[value] Done for function main5 +[value] computing for function main6 <- main. + Called from tests/misc/split_return.i:158. +[value] computing for function f6 <- main6 <- main. + Called from tests/misc/split_return.i:131. +tests/misc/split_return.i:126:[value] Assertion got status unknown. +[value] Recording results for f6 +[value] Done for function f6 +[value] Recording results for main6 +[value] Done for function main6 +[value] computing for function main7 <- main. + Called from tests/misc/split_return.i:159. +[value] computing for function f7 <- main7 <- main. + Called from tests/misc/split_return.i:144. +[value] Recording results for f7 +[value] Done for function f7 +[value] Called Frama_C_show_each_NULL({{ NULL ; &v }}, {0; 1}) +[value] Recording results for main7 +[value] Done for function main7 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f2: + i2 ∈ {0; 5} + __retres ∈ {0; 5; 7} +[value] Values at end of function f3: + i3 ∈ {0; 5} + res1 ∈ {-2; 7} + res2 ∈ {-2; 7} +[value] Values at end of function f4: + i4 ∈ {0; 5} + __retres ∈ {4; 7} +[value] Values at end of function f5: + i5 ∈ {0; 5} + res ∈ {-2; 7} +[value] Values at end of function f6: + i ∈ [-5..5] +[value] Values at end of function f7: + v7 ∈ {0; 1} + __retres ∈ {{ NULL ; &v }} +[value] Values at end of function main1: + x ∈ [0..2147483649] + r ∈ {0; 1} +[value] Values at end of function main2: + i2 ∈ {0; 5} + r ∈ {0; 5; 7} +[value] Values at end of function main3: + i3 ∈ {0; 5} + r ∈ {-2; 7} +[value] Values at end of function main4: + i4 ∈ {0; 5} + r ∈ {4; 7} +[value] Values at end of function main5: + i5 ∈ {0; 5} + r ∈ {-2; 7} +[value] Values at end of function main6: + +[value] Values at end of function main7: + v7 ∈ {0; 1} + p ∈ {{ NULL ; &v }} +[value] Values at end of function main: + i2 ∈ {0; 5} + i3 ∈ {0; 5} + i4 ∈ {0; 5} + i5 ∈ {0; 5} + v7 ∈ {0; 1} +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function main1 +[from] Computing for function init <-main1 +[from] Done for function init +[from] Done for function main1 +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function main3 +[from] Done for function main3 +[from] Computing for function main4 +[from] Done for function main4 +[from] Computing for function main5 +[from] Done for function main5 +[from] Computing for function main6 +[from] Done for function main6 +[from] Computing for function main7 +[from] Done for function main7 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f2: + i2 FROM i2 + \result FROM i2 +[from] Function f3: + i3 FROM i3 + \result FROM i3 +[from] Function f4: + i4 FROM i4 + \result FROM i4 +[from] Function f5: + i5 FROM i5 + \result FROM i5 +[from] Function f6: + \result FROM v +[from] Function f7: + v7 FROM v + \result FROM v +[from] Function init: + x FROM \nothing + \result FROM \nothing +[from] Function main1: + \result FROM \nothing +[from] Function main2: + i2 FROM i2 +[from] Function main3: + i3 FROM i3 +[from] Function main4: + i4 FROM i4 +[from] Function main5: + i5 FROM i5 +[from] Function main6: + NO EFFECTS +[from] Function main7: + v7 FROM v +[from] Function main: + i2 FROM i2 + i3 FROM i3 + i4 FROM i4 + i5 FROM i5 + v7 FROM v +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f2: + i2; __retres +[inout] Inputs for function f2: + i2 +[inout] Out (internal) for function f3: + i3; res1; res2 +[inout] Inputs for function f3: + i3 +[inout] Out (internal) for function f4: + i4; __retres +[inout] Inputs for function f4: + i4 +[inout] Out (internal) for function f5: + i5; res +[inout] Inputs for function f5: + i5 +[inout] Out (internal) for function f6: + i +[inout] Inputs for function f6: + v +[inout] Out (internal) for function f7: + v7; __retres +[inout] Inputs for function f7: + v +[inout] Out (internal) for function main1: + x; r +[inout] Inputs for function main1: + \nothing +[inout] Out (internal) for function main2: + i2; r +[inout] Inputs for function main2: + i2 +[inout] Out (internal) for function main3: + i3; r +[inout] Inputs for function main3: + i3 +[inout] Out (internal) for function main4: + i4; r +[inout] Inputs for function main4: + i4 +[inout] Out (internal) for function main5: + i5; r +[inout] Inputs for function main5: + i5 +[inout] Out (internal) for function main6: + tmp +[inout] Inputs for function main6: + v +[inout] Out (internal) for function main7: + v7; p +[inout] Inputs for function main7: + v; v7 +[inout] Out (internal) for function main: + i2; i3; i4; i5; v7 +[inout] Inputs for function main: + i2; i3; i4; i5; v; v7 +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'init' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file tests/misc/split_return.i, line 9) + Unverifiable but considered Valid. +[ Extern ] Assigns (file tests/misc/split_return.i, line 7) + Unverifiable but considered Valid. +[ Extern ] Froms (file tests/misc/split_return.i, line 7) + Unverifiable but considered Valid. +[ Extern ] Froms (file tests/misc/split_return.i, line 8) + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main1' +-------------------------------------------------------------------------------- + +[ Dead ] Assertion (file tests/misc/split_return.i, line 24) + Locally valid, but unreachable. + By Value because: + - Unreachable program point (file tests/misc/split_return.i, line 24) +[Unreachable] Unreachable program point (file tests/misc/split_return.i, line 24) + by Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main2' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/misc/split_return.i, line 47) + by Value. +[ Valid ] Assertion (file tests/misc/split_return.i, line 50) + by Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main3' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/misc/split_return.i, line 72) + tried with Value. +[ - ] Assertion (file tests/misc/split_return.i, line 74) + tried with Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main4' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/misc/split_return.i, line 93) + tried with Value. +[ - ] Assertion (file tests/misc/split_return.i, line 95) + tried with Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main5' +-------------------------------------------------------------------------------- + +[ Valid ] Assertion (file tests/misc/split_return.i, line 116) + by Value. +[ Valid ] Assertion (file tests/misc/split_return.i, line 118) + by Value. + +-------------------------------------------------------------------------------- +--- Properties of Function 'f6' +-------------------------------------------------------------------------------- + +[ - ] Assertion (file tests/misc/split_return.i, line 126) + tried with Value. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 5 Completely validated + 4 Considered valid + 5 To be validated + 1 Dead property + 1 Unreachable + 16 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/statement_contract.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/statement_contract.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/statement_contract.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/statement_contract.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/statement_contract.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + A ∈ {0} +tests/misc/statement_contract.i:5:[value] Function main, behavior test: postcondition got status valid. +tests/misc/statement_contract.i:8:[value] Function main, behavior test2: assumes got status invalid; postcondition not evaluated. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + d ∈ {3} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + d +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/static.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/static.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/static.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/static.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,66 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/static.i (no preprocessing) +tests/misc/static.i:21:[kernel] Dropping side-effect in sizeof. Nothing to worry, this is by the book. +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + GLOB ∈ {0} + T[0..9] ∈ {0} + IT[0..9] ∈ {0} + G ∈ {0} + H ∈ {0} + R ∈ {0} + p ∈ {0} + a[0] ∈ {77} + [1] ∈ {0} + Rv ∈ {99} + x ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/static.i:19. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/misc/static.i:20. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {{ &x }} +[value] Values at end of function main: + GLOB ∈ {4} + G ∈ {0} + H ∈ {0} + R ∈ {3} + p ∈ {{ &a[0] }} + Rv ∈ [--..--] + x ∈ {3} + __retres ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM \nothing +[from] Function main: + GLOB FROM \nothing + G FROM T[1..4] + H FROM IT[9][bits 0 to 7] + R FROM \nothing + p FROM \nothing + Rv FROM a[0] + x FROM \nothing + \result FROM T[0] +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main: + GLOB; G; H; R; p; Rv; tmp; tmp_0; x; __retres +[inout] Inputs for function main: + T[0..4]; IT[9][bits 0 to 7]; p; a[0]; x diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/strange.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/strange.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/strange.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/strange.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/strange.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + GG ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/strange.i:13. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + GG ∈ {3} + G ∈ {2} + __retres ∈ {1} +[value] Values at end of function main: + GG ∈ {77} + lm ∈ {77} + res_f ∈ {1} + __retres ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + GG FROM \nothing + \result FROM \nothing +[from] Function main: + GG FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + GG; G; __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main: + GG; lm; res_f; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/strings.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/strings.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/strings.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/strings.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,139 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/strings.i (no preprocessing) +tests/misc/strings.i:58:[kernel] warning: Return statement with a value in function returning void +[value] Analyzing a complete application starting at main6 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + s1[0] ∈ {104} + [1] ∈ {101} + [2..3] ∈ {108} + [4] ∈ {111} + [5] ∈ {0} + [6] ∈ {32} + [7] ∈ {119} + [8] ∈ {111} + [9] ∈ {114} + [10] ∈ {108} + [11] ∈ {100} + [12] ∈ {0} + s2[0] ∈ {104} + [1] ∈ {101} + [2..3] ∈ {108} + [4] ∈ {111} + [5] ∈ {0} + s5 ∈ {0} + s6 ∈ {0} + cc ∈ {97} + Q ∈ {0} + R ∈ {0} + S ∈ {0} + T ∈ {0} + U ∈ {0} + V ∈ {0} + W ∈ {0} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} + s3 ∈ {{ "tutu" }} + s4 ∈ {{ "tutu" }} + s7 ∈ {{ "hello\000 world" }} + s8 ∈ {{ "hello" }} +[value] computing for function u <- main6. + Called from tests/misc/strings.i:72. +tests/misc/strings.i:72:[kernel] warning: Neither code nor specification for function u, generating default assigns from the prototype +[value] using specification for function u +[value] Done for function u +tests/misc/strings.i:73:[kernel] warning: pointer comparison: assert \pointer_comparable(s3, s4); +[value] computing for function u <- main6. + Called from tests/misc/strings.i:74. +[value] Done for function u +[value] computing for function u <- main6. + Called from tests/misc/strings.i:76. +[value] Done for function u +[value] computing for function u <- main6. + Called from tests/misc/strings.i:78. +[value] Done for function u +tests/misc/strings.i:79:[kernel] warning: pointer comparison: assert \pointer_comparable(s7, s8); +[value] computing for function u <- main6. + Called from tests/misc/strings.i:80. +[value] Done for function u +[value] computing for function u <- main6. + Called from tests/misc/strings.i:82. +[value] Done for function u +tests/misc/strings.i:83:[kernel] warning: pointer comparison: assert \pointer_comparable(s7+1, s8+1); +[value] computing for function u <- main6. + Called from tests/misc/strings.i:84. +[value] Done for function u +[value] computing for function u <- main6. + Called from tests/misc/strings.i:86. +[value] Done for function u +[value] computing for function u <- main6. + Called from tests/misc/strings.i:87. +[value] Done for function u +[value] computing for function u <- main6. + Called from tests/misc/strings.i:88. +[value] Done for function u +[value] computing for function u <- main6. + Called from tests/misc/strings.i:89. +[value] Done for function u +[value] computing for function u <- main6. + Called from tests/misc/strings.i:89. +[value] Done for function u +[value] computing for function u <- main6. + Called from tests/misc/strings.i:90. +[value] Done for function u +tests/misc/strings.i:91:[kernel] warning: pointer comparison: assert \pointer_comparable(s5, s6); +[value] computing for function u <- main6. + Called from tests/misc/strings.i:92. +[value] Done for function u +tests/misc/strings.i:93:[kernel] warning: pointer comparison: assert \pointer_comparable("oh, hello"+4, s7); +[value] Recording results for main6 +[value] done for function main6 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main6: + s5 ∈ {{ "tutu" ; "hello" }} + s6 ∈ {{ "tutu" ; "tutu" ; "hello" }} + cc ∈ {116} + Q ∈ {0} + R ∈ {0} + S ∈ {0} + T ∈ {0} + U ∈ {0} + V ∈ {0} + W ∈ {0} + X ∈ {0; 1} + Y ∈ {0; 1} + Z ∈ {0; 1} + s ∈ {{ "toto" }} + __retres ∈ {116} +[from] Computing for function main6 +[from] Computing for function u <-main6 +[from] Done for function u +[from] Done for function main6 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function u: + \result FROM \nothing +[from] Function main6: + s5 FROM s3; s8 + s6 FROM s3; s4; s8 + cc FROM "toto"[bits 0 to 7] + Q FROM s7 (and SELF) + R FROM s3; s4 (and SELF) + S FROM \nothing (and SELF) + T FROM s3 (and SELF) + U FROM s7; s8 (and SELF) + V FROM s4; s7 (and SELF) + W FROM s7; s8 (and SELF) + X FROM s3 (and SELF) + Y FROM s3; s8 (and SELF) + Z FROM s3; s4; s8 (and SELF) + \result FROM "toto"[bits 0 to 7] +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main6: + s5; s6; cc; Q; R; S; T; U; V; W; X; Y; Z; s; tmp; tmp_0; tmp_1; tmp_2; + tmp_3; tmp_4; tmp_5; tmp_6; tmp_7; tmp_8; tmp_9; tmp_10; tmp_11; tmp_12; + tmp_13; tmp_14; __retres +[inout] Inputs for function main6: + s5; s6; cc; s3; s4; s7; s8; "toto"[bits 0 to 7] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/strings.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/strings.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/strings.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/strings.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,68 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/strings.i (no preprocessing) +tests/misc/strings.i:58:[kernel] warning: Return statement with a value in function returning void +[value] Analyzing a complete application starting at main7 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + s1[0] ∈ {104} + [1] ∈ {101} + [2..3] ∈ {108} + [4] ∈ {111} + [5] ∈ {0} + [6] ∈ {32} + [7] ∈ {119} + [8] ∈ {111} + [9] ∈ {114} + [10] ∈ {108} + [11] ∈ {100} + [12] ∈ {0} + s2[0] ∈ {104} + [1] ∈ {101} + [2..3] ∈ {108} + [4] ∈ {111} + [5] ∈ {0} + s5 ∈ {0} + s6 ∈ {0} + cc ∈ {97} + Q ∈ {0} + R ∈ {0} + S ∈ {0} + T ∈ {0} + U ∈ {0} + V ∈ {0} + W ∈ {0} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} + s3 ∈ {{ "tutu" }} + s4 ∈ {{ "tutu" }} + s7 ∈ {{ "hello\000 world" }} + s8 ∈ {{ "hello" }} +tests/misc/strings.i:101:[kernel] warning: out of bounds write. assert \valid(tmp); + (tmp from f?s5 + 2:& c) +tests/misc/strings.i:103:[kernel] warning: out of bounds write. assert \valid(s5); +tests/misc/strings.i:105:[kernel] warning: out of bounds write. assert \valid(s6); +[value] Recording results for main7 +[value] done for function main7 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main7: + s5 ∈ {{ &c }} + s6 ∈ {{ &c }} + R ∈ {84} + c ∈ {116} + __retres ∈ {116} +[from] Computing for function main7 +[from] Done for function main7 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main7: + s5 FROM s3; d + s6 FROM s3; e + R FROM s3; d; f + \result FROM s4; "tutu"[bits 0 to 7] +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main7: + s5; s6; R; c; tmp; __retres +[inout] Inputs for function main7: + s5; s6; cc; s3; s4; "tutu"[bits 0 to 7] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/strings.3.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/strings.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/strings.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/strings.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,114 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/strings.i (no preprocessing) +tests/misc/strings.i:58:[kernel] warning: Return statement with a value in function returning void +[value] Analyzing a complete application starting at main8 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + s1[0] ∈ {104} + [1] ∈ {101} + [2..3] ∈ {108} + [4] ∈ {111} + [5] ∈ {0} + [6] ∈ {32} + [7] ∈ {119} + [8] ∈ {111} + [9] ∈ {114} + [10] ∈ {108} + [11] ∈ {100} + [12] ∈ {0} + s2[0] ∈ {104} + [1] ∈ {101} + [2..3] ∈ {108} + [4] ∈ {111} + [5] ∈ {0} + s5 ∈ {0} + s6 ∈ {0} + cc ∈ {97} + Q ∈ {0} + R ∈ {0} + S ∈ {0} + T ∈ {0} + U ∈ {0} + V ∈ {0} + W ∈ {0} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} + s3 ∈ {{ "tutu" }} + s4 ∈ {{ "tutu" }} + s7 ∈ {{ "hello\000 world" }} + s8 ∈ {{ "hello" }} +[value] computing for function assigns <- main8. + Called from tests/misc/strings.i:127. +[value] using specification for function assigns +tests/misc/strings.i:121:[value] warning: no \from part for clause 'assigns *(p+(0 .. s-1));' of function assigns +[value] Done for function assigns +[value] computing for function strcmp <- main8. + Called from tests/misc/strings.i:128. +tests/misc/strings.i:114:[kernel] warning: out of bounds read. assert \valid_read(tmp_0); + (tmp_0 from s2_0++) +[value] Recording results for strcmp +[value] Done for function strcmp +[value] Recording results for main8 +[value] done for function main8 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function strcmp: + s1_0 ∈ {{ &long_chain + [0..29] }} + s2_0 ∈ {{ &tc + [0..29] }} + __retres ∈ [-223..121] +[value] Values at end of function main8: + tc[0..29] ∈ [--..--] + long_chain[0] ∈ {114} + [1] ∈ {101} + [2] ∈ {97} + [3..4] ∈ {108} + [5] ∈ {121} + [6] ∈ {32} + [7] ∈ {114} + [8] ∈ {101} + [9] ∈ {97} + [10..11] ∈ {108} + [12] ∈ {121} + [13] ∈ {32} + [14] ∈ {114} + [15] ∈ {101} + [16] ∈ {97} + [17..18] ∈ {108} + [19] ∈ {121} + [20] ∈ {32} + [21] ∈ {108} + [22] ∈ {111} + [23] ∈ {110} + [24] ∈ {103} + [25] ∈ {32} + [26] ∈ {99} + [27] ∈ {104} + [28] ∈ {97} + [29] ∈ {105} + [30] ∈ {110} + [31] ∈ {0} + x ∈ [-223..121] +[from] Computing for function strcmp +[from] Done for function strcmp +[from] Computing for function main8 +[from] Computing for function assigns <-main8 +[from] Done for function assigns +[from] Done for function main8 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function assigns: + tc[0..29] FROM ANYTHING(origin:Unknown) (and SELF) +[from] Function strcmp: + \result FROM s1_0; s2_0; tc[0..29]; long_chain[0..30] +[from] Function main8: + \result FROM ANYTHING(origin:Unknown) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function strcmp: + s1_0; s2_0; tmp; tmp_0; __retres +[inout] Inputs for function strcmp: + tc[0..29]; long_chain[0..30] +[inout] Out (internal) for function main8: + tc[0..29]; long_chain[0..31]; x +[inout] Inputs for function main8: + ANYTHING(origin:Unknown) diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/strings_cond.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/strings_cond.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/strings_cond.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/strings_cond.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,46 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/strings_cond.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function foo <- main. + Called from tests/misc/strings_cond.i:8. +[value] DUMPING STATE of file tests/misc/strings_cond.i line 3 + s ∈ {{ "Bla" }} + =END OF DUMP== +tests/misc/strings_cond.i:4:[value] entering loop for the first time +[value] Called Frama_C_show_each_s({{ "Bla" }}) +[value] Called Frama_C_show_each_s({{ "Bla" + {0; 1} }}) +[value] Called Frama_C_show_each_s({{ "Bla" + {0; 1; 2} }}) +[value] Recording results for foo +[value] Done for function foo +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function foo: + s ∈ {{ "Bla" + {3} }} +[value] Values at end of function main: + +[from] Computing for function foo +[from] Computing for function Frama_C_dump_each <-foo +[from] Done for function Frama_C_dump_each +[from] Done for function foo +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function foo: + NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function foo: + s +[inout] Inputs for function foo: + "Bla" +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + "Bla" diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/strings.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/strings.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/strings.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/strings.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,145 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/strings.i (no preprocessing) +tests/misc/strings.i:58:[kernel] warning: Return statement with a value in function returning void +[value] Analyzing a complete application starting at main1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + s1[0] ∈ {104} + [1] ∈ {101} + [2..3] ∈ {108} + [4] ∈ {111} + [5] ∈ {0} + [6] ∈ {32} + [7] ∈ {119} + [8] ∈ {111} + [9] ∈ {114} + [10] ∈ {108} + [11] ∈ {100} + [12] ∈ {0} + s2[0] ∈ {104} + [1] ∈ {101} + [2..3] ∈ {108} + [4] ∈ {111} + [5] ∈ {0} + s5 ∈ {0} + s6 ∈ {0} + cc ∈ {97} + Q ∈ {0} + R ∈ {0} + S ∈ {0} + T ∈ {0} + U ∈ {0} + V ∈ {0} + W ∈ {0} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} + s3 ∈ {{ "tutu" }} + s4 ∈ {{ "tutu" }} + s7 ∈ {{ "hello\000 world" }} + s8 ∈ {{ "hello" }} +[value] computing for function u <- main1. + Called from tests/misc/strings.i:39. +tests/misc/strings.i:39:[kernel] warning: Neither code nor specification for function u, generating default assigns from the prototype +[value] using specification for function u +[value] Done for function u +tests/misc/strings.i:39:[kernel] warning: out of bounds read. assert \valid_read(p-4); +[value] computing for function u <- main1. + Called from tests/misc/strings.i:42. +[value] Done for function u +tests/misc/strings.i:42:[kernel] warning: out of bounds read. assert \valid_read(p+12); +[value] computing for function u <- main1. + Called from tests/misc/strings.i:44. +[value] Done for function u +[value] computing for function u <- main1. + Called from tests/misc/strings.i:48. +[value] Done for function u +tests/misc/strings.i:48:[kernel] warning: out of bounds read. assert \valid_read(p-4); +[value] Call to builtin bzero(({{ (unsigned char *)&a }},{10})) +[value] computing for function u <- main1. + Called from tests/misc/strings.i:53. +[value] Done for function u +[value] computing for function strcpy <- main1. + Called from tests/misc/strings.i:53. +tests/misc/strings.i:21:[kernel] warning: out of bounds write. + assert \valid(tmp_unroll_46); + (tmp_unroll_46 from ldst++) +tests/misc/strings.i:21:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for strcpy +[value] Done for function strcpy +[value] computing for function strlen <- main1. + Called from tests/misc/strings.i:58. +[value] Recording results for strlen +[value] Done for function strlen +[value] Recording results for main1 +[value] done for function main1 +tests/misc/strings.i:21:[value] Assertion 'Value,mem_access' got final status invalid. +tests/misc/strings.i:39:[value] Assertion 'Value,mem_access' got final status invalid. +tests/misc/strings.i:42:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function strcpy: + NON TERMINATING FUNCTION +[value] Values at end of function strlen: + s ∈ {{ &s1[6] }} + l ∈ {5} +[value] Values at end of function main1: + s1[0] ∈ {104} + [1] ∈ {101} + [2] ∈ {108} + [3] ∈ {97} + [4] ∈ {111} + [5] ∈ {0} + [6] ∈ {97} + [7] ∈ {119} + [8] ∈ {111} + [9] ∈ {114} + [10] ∈ {108} + [11] ∈ {100} + [12] ∈ {0} + R ∈ {0} + S ∈ {0} + T ∈ {0; 101} + p ∈ {{ &s1[5] ; &s2[3] }} +[from] Computing for function strcpy +[from] Non-terminating function strcpy (no dependencies) +[from] Done for function strcpy +[from] Computing for function strlen +[from] Done for function strlen +[from] Computing for function main1 +[from] Computing for function u <-main1 +[from] Done for function u +[from] Computing for function Frama_C_bzero <-main1 +[from] Done for function Frama_C_bzero +[from] Done for function main1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function strcpy: + NON TERMINATING - NO EFFECTS +[from] Function strlen: + \result FROM s1[0..4]; s +[from] Function u: + \result FROM \nothing +[from] Function main1: + s1{[3]; [6]} FROM cc + R FROM \nothing (and SELF) + S FROM \nothing (and SELF) + T FROM s1[1] (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function strcpy: + src; ldst; b[0..4]; tmp_unroll_46; tmp_1_unroll_46; tmp_0_unroll_46; + tmp_unroll_49; tmp_1_unroll_49; tmp_0_unroll_49; tmp_unroll_52; + tmp_1_unroll_52; tmp_0_unroll_52; tmp_unroll_55; tmp_1_unroll_55; + tmp_0_unroll_55; tmp_unroll_58; tmp_1_unroll_58; tmp_0_unroll_58; + tmp_unroll_61; tmp_1_unroll_61; tmp_0_unroll_61 +[inout] Inputs for function strcpy: + a[0..5] +[inout] Out (internal) for function strlen: + s; l; tmp_unroll_106; tmp_unroll_109; tmp_unroll_112; tmp_unroll_115; + tmp_unroll_118; tmp_unroll_121 +[inout] Inputs for function strlen: + s1[0..5] +[inout] Out (internal) for function main1: + s1{[3]; [6]}; R; S; T; p; tmp; tmp_0; tmp_1; tmp_2; a[0..9]; b[0..4]; tmp_3 +[inout] Inputs for function main1: + s1[0..5]; cc diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/struct2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/struct2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,187 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/struct2.i (no preprocessing) +[value] Analyzing a complete application starting at f_precis +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + NULL[rbits 32768 to 65543] ∈ [--..--] + tabst[0..9] ∈ {0} + tabst2[0..9] ∈ {0} + tab_s[0..1] ∈ {0} + tab_s1[0..1] ∈ {0} + tab_s2[0..1] ∈ {0} + tab_s3[0..1] ∈ {0} + tab_s4[0..1] ∈ {0} + s1 ∈ {0} + s2 ∈ {0} + s4 ∈ {0} + s5 ∈ {0} + s6 ∈ {0} + s8 ∈ {0} + s7 ∈ {0} + tabl[0..9] ∈ {0} + tab1[0..1] ∈ {0} + tab2[0..1] ∈ {0} + tab3[0..1] ∈ {0} + tab4[0..1] ∈ {0} + tab5[0..1] ∈ {0} + tab6[0..1] ∈ {0} + p ∈ {0} + p2 ∈ {0} + p3 ∈ {0} + p4 ∈ {0} + p5 ∈ {0} + p6 ∈ {0} + p7 ∈ {0} + q ∈ {0} + r ∈ {0} + s ∈ {0} + t ∈ {0} + a ∈ {0} + b ∈ {0} + v ∈ [--..--] + Tab[0..9] ∈ {0} + P ∈ {0} +tests/misc/struct2.i:74:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. assert 0 ≤ i < 2; +tests/misc/struct2.i:76:[kernel] warning: signed overflow. assert i+j ≤ 2147483647; +tests/misc/struct2.i:76:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ (int)(i+j) < 2; +tests/misc/struct2.i:78:[kernel] warning: accessing out of bounds index {0; 2}. assert tab2[i] < 2; +tests/misc/struct2.i:80:[kernel] warning: accessing out of bounds index {0; 2}. assert tab2[1] < 2; +tests/misc/struct2.i:82:[kernel] warning: signed overflow. assert tab2[i]+j ≤ 2147483647; +tests/misc/struct2.i:82:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ (int)(tab2[i]+j) < 2; +tests/misc/struct2.i:99:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ (int)(tabl[i]+x) < 2; +tests/misc/struct2.i:117:[kernel] warning: signed overflow. assert -2147483648 ≤ *p+x ≤ 2147483647; +tests/misc/struct2.i:124:[kernel] warning: out of bounds read. assert \valid_read(r); +tests/misc/struct2.i:124:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +tests/misc/struct2.i:130:[kernel] warning: out of bounds read. assert \valid_read(p3+2); +tests/misc/struct2.i:138:[kernel] warning: signed overflow. assert *((int *)0x1020)+i ≤ 2147483647; +tests/misc/struct2.i:149:[kernel] warning: out of bounds write. assert \valid(*t+i); +tests/misc/struct2.i:185:[kernel] warning: signed overflow. assert i+j ≤ 2147483647; +tests/misc/struct2.i:185:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ (int)(i+j) < 2; +tests/misc/struct2.i:185:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. assert 0 ≤ l < 2; +tests/misc/struct2.i:185:[kernel] warning: signed overflow. assert -2147483648 ≤ tab3[l]+m ≤ 2147483647; +tests/misc/struct2.i:185:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ (int)(tab3[l]+m) < 10; +tests/misc/struct2.i:185:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. assert 0 ≤ k < 2; +[value] Recording results for f_precis +[value] done for function f_precis +tests/misc/struct2.i:124:[value] Assertion 'Value,mem_access' got final status invalid. +tests/misc/struct2.i:130:[value] Assertion 'Value,mem_access' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f_precis: + NULL[rbits 32768 to 32799] ∈ {{ NULL + [--..--] ; (? *)&a }} + [rbits 32800 to 65543] ∈ [--..--] + tab_s[0] ∈ {0} + [1].a ∈ [--..--] + [1]{.d[0..9]; .b; .e[0..9]; .c} ∈ {0} + tab_s1[0..1] ∈ {0} + tab_s2[0].a ∈ [--..--] + {[0]{.d[0..9]; .b; .e[0..9]; .c}; [1]} ∈ {0} + tab_s3[0].a ∈ [--..--] + {[0]{.d[0..9]; .b; .e[0..9]; .c}; [1]} ∈ {0} + tab_s4[0].a ∈ [--..--] + [0]{.d[0..9]; .b; .e[0..9]; .c} ∈ {0} + [1].a ∈ [--..--] + [1]{.d[0..9]; .b; .e[0..9]; .c} ∈ {0} + s1.a ∈ [--..--] + .d[0] ∈ {0} + .d[1] ∈ [--..--] + {.d[2..9]; .b; .e[0..9]} ∈ {0} + .c ∈ {{ &s2 }} + s2{.a; .d[0..1]} ∈ [--..--] + .d[2..9] ∈ {0} + .b.a ∈ [--..--] + .b.b ∈ {{ &a }} + .e[0..9] ∈ {0} + .c ∈ {{ &s2 }} + s4{.a; .d[0..9]; .b} ∈ {0} + .e[0].a ∈ [-128..127] + {.e{[0].b; [1..9]}; .c} ∈ {0} + s8.a ∈ {0} + .b ∈ {{ &a }} + s7 ∈ {0} + tab1[0..1] ∈ {2} + tab2[0] ∈ {0; 2} + [1] ∈ {0} + tab3[0..1] ∈ [--..--] + tab4[0] ∈ {2} + [1] ∈ {0} + tab5[0] ∈ {2} + [1] ∈ {0} + tab6[0..1] ∈ {0; 2} + p ∈ {{ &a }} + p2 ∈ {{ &tab1[2] }} + p3 ∈ {{ &tab1{[0], [1]} }} + p4 ∈ {{ &a }} + p5 ∈ {4096} + p6 ∈ {4112} + p7 ∈ {{ &tab1[3] }} + q ∈ {4096} + r ∈ {0} + s ∈ {4144} + t ∈ {4176} + a ∈ [--..--] + b ∈ {0} +[from] Computing for function f_precis +[from] Done for function f_precis +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f_precis: + NULL{[4096..4099]; [4144..4147]} FROM NULL[4176..4179]; i + {[4100..4111]; [4116..4143]; [4148..8192]} + FROM NULL[4176..4179]; i (and SELF) + [4112..4115] FROM NULL{[4128..4131]; [4176..4179]}; i + tab_s[0] FROM s2 + [1].a FROM x + tab_s1{[0].b; [1].b} FROM s8; i (and SELF) + tab_s2[0] FROM s2; s8; tabl[0]; x + tab_s3[0].a FROM tabl[1]; x + tab_s4{[0].a; [1].a} FROM tabl[0..1]; x; i (and SELF) + s1{.a; .d[1]} FROM x + {.d[0]; .d[2..9]; .e[0..9]} FROM s2 + .b FROM s8 + .c FROM \nothing + s2{.a; .b.a} FROM x + .d[0..1] FROM x; i (and SELF) + {.b.b; .c} FROM \nothing + s4.e[0].a + FROM NULL{[4176..4179]; [4192]; [4200]}; tabst[2].a; + tabst2{[0].a; [1].a; [2].a; [3].a; [4].a; [5].a; [6].a; [7].a; + [8].a; [9].a}; + s5.e[0].b; tab2[0..1]; tab3[0..1]; i; j; k; l; m + s8.b FROM \nothing + s7 FROM s6.b + tab1[0..1] FROM \nothing + tab2[0..1] FROM i (and SELF) + tab3[0..1] FROM i; j; k (and SELF) + tab4[0] FROM tab2[0..1]; i + tab5[0] FROM tab2[1]; i + tab6[0..1] FROM tab2[0..1]; i; j (and SELF) + p FROM \nothing + p2 FROM \nothing + p3 FROM i + p4 FROM \nothing + p5 FROM \nothing + p6 FROM \nothing + p7 FROM \nothing + q FROM \nothing + r FROM \nothing + s FROM \nothing + t FROM \nothing + a FROM x + b FROM v; i (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f_precis: + NULL[4096..8192]; tab_s{[0]; [1].a}; tab_s1{[0].b; [1].b}; tab_s2[0]; + tab_s3[0].a; tab_s4{[0].a; [1].a}; s1; s2{{.a; .d[0..1]}; .b; .c}; + s4.e[0].a; s8.b; s7; tab1[0..1]; tab2[0..1]; tab3[0..1]; tab4[0]; tab5[0]; + tab6[0..1]; p; p2; p3; p4; p5; p6; p7; q; r; s; t; a; b +[inout] Inputs for function f_precis: + NULL{[4128..4131]; [4176..4179]; [4192]; [4200]}; tabst[2].a; + tabst2{[0].a; [1].a; [2].a; [3].a; [4].a; [5].a; [6].a; [7].a; [8].a; + [9].a}; s1; s2; s5.e[0].b; s6.b; s8; tabl[0..1]; tab1[0..1]; + tab2[0..1]; tab3[0..1]; p; p2; p3; p6; q; r; s; t; a; v diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/struct3.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct3.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/struct3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,47 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/struct3.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + tabst[0..9] ∈ {0} + tabst2[0..9] ∈ {0} + tab_s[0..1] ∈ {0} + tab_s1[0..1] ∈ {0} + tab_s2[0..1] ∈ {0} + tab_s3[0..1] ∈ {0} + tab_s4[0..1] ∈ {0} + s1 ∈ {0} + s2 ∈ {0} + s4 ∈ {0} + s5 ∈ {0} + s6 ∈ {0} + s8 ∈ {0} + s7 ∈ {0} + v ∈ [--..--] +tests/misc/struct3.i:38:[kernel] warning: accessing out of bounds index {10}. assert 10 < 10; +tests/misc/struct3.i:38:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +tests/misc/struct3.i:38:[value] Assertion 'Value,index_bound' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + s1.a ∈ {2} + .d[0] ∈ {1} + .d[1..2] ∈ {2} + .d[3..7] ∈ {0} + .d[8..9] ∈ {2} + .b.a ∈ {3} + {.b.b; .e[0..9]} ∈ {0} + .c ∈ {{ &s1 }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + s1{{.a; .d[0..2]}; {.d[8..9]; .b.a}; .c} FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + s1{{.a; .d[0..2]}; {.d[8..9]; .b.a}; .c} +[inout] Inputs for function main: + v diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/struct_array.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct_array.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/struct_array.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct_array.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,68 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/struct_array.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + outp ∈ {0} + x ∈ {0} + y ∈ {0} + z1 ∈ {0} + z2 ∈ {0} + z3 ∈ {0} + z4 ∈ {0} + T[0].a ∈ {1} + [0].b ∈ {2} + [0].pp ∈ {0} + [0].p ∈ {{ &x }} + [1].a ∈ {{ (int)&z1 }} + [1].b ∈ {{ (int)&z2 }} + [1].pp ∈ {{ &z3 }} + [1].p ∈ {{ &y }} + [2].a ∈ {{ (int)&z4 }} + [2].b ∈ {2} + [2].pp ∈ {0} + [2].p ∈ {{ &x }} + [3].a ∈ {1} + [3].b ∈ {2} + [3].pp ∈ {0} + [3].p ∈ {{ &x }} + [4..21] ∈ {0} +tests/misc/struct_array.i:11:[kernel] warning: accessing out of bounds index [-128..127]. assert 0 ≤ c < 22; +tests/misc/struct_array.i:12:[kernel] warning: out of bounds write. assert \valid(outp); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + outp ∈ {{ &x ; &y }} + x ∈ {0; 5} + y ∈ {0; 5} + z1 ∈ {1} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + outp FROM T{[0].p; [1].p; [2].p; [3].p; [4].p; [5].p; [6].p; [7].p; [8].p; + [9].p; [10].p; [11].p; [12].p; [13].p; [14].p; [15].p; [16].p; + [17].p; [18].p; [19].p; [20].p; [21].p}; + c + x FROM T{[0].p; [1].p; [2].p; [3].p; [4].p; [5].p; [6].p; [7].p; [8].p; + [9].p; [10].p; [11].p; [12].p; [13].p; [14].p; [15].p; [16].p; + [17].p; [18].p; [19].p; [20].p; [21].p}; + c (and SELF) + y FROM T{[0].p; [1].p; [2].p; [3].p; [4].p; [5].p; [6].p; [7].p; [8].p; + [9].p; [10].p; [11].p; [12].p; [13].p; [14].p; [15].p; [16].p; + [17].p; [18].p; [19].p; [20].p; [21].p}; + c (and SELF) + z1 FROM z1 + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + outp; x; y; z1; __retres +[inout] Inputs for function main: + outp; z1; + T{[0].p; [1].p; [2].p; [3].p; [4].p; [5].p; [6].p; [7].p; [8].p; [9].p; + [10].p; [11].p; [12].p; [13].p; [14].p; [15].p; [16].p; [17].p; [18].p; + [19].p; [20].p; [21].p} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/struct_call.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct_call.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/struct_call.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct_call.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,109 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/struct_call.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {77} + GG ∈ {0} + t[0..3] ∈ {0} + tt[0..4] ∈ {0} + C.c1 ∈ [--..--] + .[bits 16 to 31] ∈ UNINITIALIZED + .c2 ∈ {{ NULL ; &S_c2_C[0] }} + S_c2_C[0..1] ∈ [--..--] +[value] computing for function main1 <- main. + Called from tests/misc/struct_call.i:46. +[value] computing for function g <- main1 <- main. + Called from tests/misc/struct_call.i:33. +[value] Called Frama_C_show_each_G({0}) +[value] Recording results for g +[value] Done for function g +[value] computing for function create_A <- main1 <- main. + Called from tests/misc/struct_call.i:34. +[value] Called Frama_C_show_each_GG(.x ∈ {1} + .y ∈ {0}) +[value] Recording results for create_A +[value] Done for function create_A +[value] computing for function g <- main1 <- main. + Called from tests/misc/struct_call.i:35. +[value] Called Frama_C_show_each_G(.x ∈ {0} + .y ∈ {77}) +[value] Recording results for g +[value] Done for function g +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function h <- main. + Called from tests/misc/struct_call.i:47. +[value] Called Frama_C_show_each([-32768..32767], {{ NULL ; &S_c2_C }}) +[value] Recording results for h +[value] Done for function h +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function create_A: + r.x ∈ {1} + .y ∈ {0} +[value] Values at end of function g: + __retres ∈ {0; 77} +[value] Values at end of function h: + +[value] Values at end of function main1: + GG ∈ {0} + t{[0]; [1].x} ∈ {0} + [1].y ∈ {77} + [2..3] ∈ {0} + i ∈ {1} + init.x ∈ {1} + .y ∈ {0} +[value] Values at end of function main: + GG ∈ {0} + t{[0]; [1].x} ∈ {0} + [1].y ∈ {77} + [2..3] ∈ {0} +[from] Computing for function create_A +[from] Done for function create_A +[from] Computing for function g +[from] Done for function g +[from] Computing for function h +[from] Done for function h +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function create_A: + \result FROM \nothing +[from] Function g: + \result FROM s.y +[from] Function h: + NO EFFECTS +[from] Function main1: + GG FROM tt[1] + t[1].y FROM G + \result FROM G; t[1].x +[from] Function main: + GG FROM tt[1] + t[1].y FROM G +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function create_A: + r +[inout] Inputs for function create_A: + \nothing +[inout] Out (internal) for function g: + __retres +[inout] Inputs for function g: + \nothing +[inout] Out (internal) for function h: + \nothing +[inout] Inputs for function h: + \nothing +[inout] Out (internal) for function main1: + GG; t[1].y; i; init; tmp_0 +[inout] Inputs for function main1: + G; t[1]; tt[1] +[inout] Out (internal) for function main: + GG; t[1].y +[inout] Inputs for function main: + G; t[1]; tt[1]; C diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/struct_call.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct_call.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/struct_call.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct_call.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,109 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/struct_call.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {77} + GG ∈ {0} + t[0..3] ∈ {0} + tt[0..4] ∈ {0} + C.c1 ∈ [--..--] + .[bits 16 to 31] ∈ UNINITIALIZED + .c2 ∈ {{ NULL ; &S_c2_C[0] }} + S_c2_C[0..1] ∈ [--..--] +[value] computing for function main1 <- main. + Called from tests/misc/struct_call.i:46. +[value] computing for function g <- main1 <- main. + Called from tests/misc/struct_call.i:33. +[value] Called Frama_C_show_each_G({0}) +[value] Recording results for g +[value] Done for function g +[value] computing for function create_A <- main1 <- main. + Called from tests/misc/struct_call.i:34. +[value] Called Frama_C_show_each_GG(.x ∈ {1} + .y ∈ {0}) +[value] Recording results for create_A +[value] Done for function create_A +[value] computing for function g <- main1 <- main. + Called from tests/misc/struct_call.i:35. +[value] Called Frama_C_show_each_G(.x ∈ {0} + .y ∈ {77}) +[value] Recording results for g +[value] Done for function g +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function h <- main. + Called from tests/misc/struct_call.i:47. +[value] Called Frama_C_show_each([-32768..32767], {{ NULL ; &S_c2_C }}) +[value] Recording results for h +[value] Done for function h +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function create_A: + r.x ∈ {1} + .y ∈ {0} +[value] Values at end of function g: + __retres ∈ {0; 77} +[value] Values at end of function h: + +[value] Values at end of function main1: + GG ∈ {0} + t{[0]; [1].x} ∈ {0} + [1].y ∈ {77} + [2..3] ∈ {0} + i ∈ {1} + init.x ∈ {1} + .y ∈ {0} +[value] Values at end of function main: + GG ∈ {0} + t{[0]; [1].x} ∈ {0} + [1].y ∈ {77} + [2..3] ∈ {0} +[from] Computing for function create_A +[from] Done for function create_A +[from] Computing for function g +[from] Done for function g +[from] Computing for function h +[from] Done for function h +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function create_A: + \result FROM \nothing +[from] Function g: + \result FROM s.y +[from] Function h: + NO EFFECTS +[from] Function main1: + GG FROM tt[1] + t[1].y FROM G + \result FROM G; t[1].x +[from] Function main: + GG FROM tt[1] + t[1].y FROM G +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function create_A: + r +[inout] Inputs for function create_A: + \nothing +[inout] Out (internal) for function g: + __retres +[inout] Inputs for function g: + \nothing +[inout] Out (internal) for function h: + \nothing +[inout] Inputs for function h: + \nothing +[inout] Out (internal) for function main1: + GG; t[1].y; i; init; tmp_0 +[inout] Inputs for function main1: + G; t[1]; tt[1] +[inout] Out (internal) for function main: + GG; t[1].y +[inout] Inputs for function main: + G; t[1]; tt[1]; C diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/struct_deps.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct_deps.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/struct_deps.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct_deps.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,37 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/struct_deps.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/misc/struct_deps.i:12. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ [--..--] +[value] Values at end of function main: + s ∈ [--..--] +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM ps; s.a +[from] Function main: + \result FROM x +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + s.a +[inout] Out (internal) for function main: + s; tmp +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/struct_incl.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct_incl.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/struct_incl.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct_incl.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,57 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/struct_incl.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + tabst[0..9] ∈ {0} + tabst2[0..9] ∈ {0} + tab_s[0..1] ∈ {0} + tab_s1[0..1] ∈ {0} + tab_s2[0..1] ∈ {0} + tab_s3[0..1] ∈ {0} + tab_s4[0..1] ∈ {0} + s1 ∈ {0} + s2 ∈ {0} + s4 ∈ {0} + s5 ∈ {0} + s6 ∈ {0} + s8 ∈ {0} + s7 ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} + t ∈ {0} + v ∈ [--..--] +tests/misc/struct_incl.i:48:[kernel] warning: accessing out of bounds index {10}. assert 10 < 10; +tests/misc/struct_incl.i:48:[kernel] warning: all target addresses were invalid. This path is assumed to be dead. +[value] Recording results for main +[value] done for function main +tests/misc/struct_incl.i:48:[value] Assertion 'Value,index_bound' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + s1{.a; .d[0..2]} ∈ {2} + .d[3..4] ∈ {0} + .d[5] ∈ {7} + .d[6..7] ∈ {0} + .d[8..9] ∈ {8} + .b.a ∈ {3} + {.b.b; .e[0..9]} ∈ {0} + .c ∈ {{ &s1 }} + x ∈ {{ (long)&s1.d[9] }} + y ∈ {{ (long)&s1.b }} + z ∈ {{ (long)&s1.b }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + s1{{.a; .d[0..2]}; .d[5]; {.d[8..9]; .b.a}; .c} FROM \nothing + x FROM \nothing + y FROM \nothing + z FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + s1{{.a; .d[0..2]}; .d[5]; {.d[8..9]; .b.a}; .c}; x; y; z +[inout] Inputs for function main: + v diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/struct_p_call.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct_p_call.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/struct_p_call.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct_p_call.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,42 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/struct_p_call.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/misc/struct_p_call.i:14. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + H1.v ∈ {1} + .[bits 8 to 31] ∈ UNINITIALIZED + .w ∈ {0} +[value] Values at end of function main: + H1.v ∈ {1} + .[bits 8 to 31] ∈ UNINITIALIZED + .w ∈ {0} + __retres ∈ {1} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + H1{.v; .w} FROM G1 +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + H1{.v; .w} +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main: + H1{.v; .w}; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/struct.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/struct.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/struct.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,47 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/struct.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + GG ∈ {0} + w ∈ {0} + v1 ∈ {0} + v2 ∈ {0} + v3 ∈ {0} + T[0..1] ∈ {1} + R1 ∈ {0} + R2 ∈ {0} + G ∈ {0} +tests/misc/struct.i:47:[kernel] warning: signed overflow. assert -2147483648 ≤ a+b ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + w ∈ [--..--] + v1.x ∈ [--..--] + .y ∈ {0} + v2.x ∈ [--..--] + .y ∈ {0} + T[0][bits 0 to 7] ∈ {2} + [bits 8 to 63]# ∈ {1} repeated %32, bits 8 to 63 + R1 ∈ {65537} + R2 ∈ {3} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + w FROM a; b + v1.x FROM a; b + .y FROM v2 + v2.x FROM a (and SELF) + T[0][bits 0 to 7] FROM \nothing + R1 FROM T{[0][bits 16 to 31]; [1][bits 0 to 15]} + R2 FROM T[0][bits 8 to 31] + \result FROM a; b +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + w; v1; v2.x; T[0][bits 0 to 7]; R1; R2 +[inout] Inputs for function main: + w; v1.x; v2; T{[0]; [1][bits 0 to 15]} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/strucval.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/strucval.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/strucval.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/strucval.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,34 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/strucval.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function h <- main. + Called from tests/misc/strucval.c:27. +[value] using specification for function h +[value] Done for function h +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + SharedData.FunctionCode ∈ {0} + .MachineNumber ∈ {1456} + .[bits 48 to 63] ∈ UNINITIALIZED + .Line ∈ {25} +[from] Computing for function main +[from] Computing for function h <-main +[from] Done for function h +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function h: + NO EFFECTS +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + SharedData{{.FunctionCode; .MachineNumber}; .Line} +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/switch.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/switch.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/switch.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/switch.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,40 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/switch.i (no preprocessing) +tests/misc/switch.i:52:[kernel] Case label 0xFFFFFFFF exceeds range of long for switch expression. Nothing to worry. +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + result1 ∈ {0} + result3 ∈ {0} + result4 ∈ {0} + result2 ∈ {7} + d2 ∈ {0} +[value] Called CEA_F({0}) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + result1 ∈ {0; 1; 2; 4} + result3 ∈ {0; 42} + result4 ∈ {0; 1; 2} + result2 ∈ {0; 7} + d2 ∈ [-0.0000000000000000*2^-1022 .. 1.9999999999999998*2^1023] + f ∈ [--..--] + __retres ∈ {0; 2; 77} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + result1 FROM d (and SELF) + result3 FROM c; f (and SELF) + result4 FROM c; l (and SELF) + result2 FROM c; e (and SELF) + d2 FROM c; d1 (and SELF) + \result FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + result1; result3; result4; result2; d2; f; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/switch2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/switch2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/switch2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/switch2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,47 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/switch2.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/misc/switch2.i:13. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/switch2.i:13. +tests/misc/switch2.i:13:[kernel] warning: Neither code nor specification for function g, generating default assigns from the prototype +[value] using specification for function g +[value] Done for function g +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {3} +[value] Values at end of function main: + exit_loop ∈ {3} + __retres ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Computing for function g <-main +[from] Done for function g +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM x +[from] Function g: + NO EFFECTS +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main: + exit_loop; tmp_0; tmp_1; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/switch_cast.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/switch_cast.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/switch_cast.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/switch_cast.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/switch_cast.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ [--..--] +[value] computing for function g <- main. + Called from tests/misc/switch_cast.i:70. +[value] Called Frama_C_show_each([1..241],1%2) +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function g: + x ∈ [0..15] + y ∈ [1..241],1%2 +[value] Values at end of function main: + x ∈ [0..15] +[from] Computing for function g +[from] Done for function g +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function g: + x FROM x +[from] Function main: + x FROM x +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function g: + x; y +[inout] Inputs for function g: + x +[inout] Out (internal) for function main: + x +[inout] Inputs for function main: + x diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/switch.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/switch.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/switch.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/switch.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,40 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/switch.i (no preprocessing) +tests/misc/switch.i:52:[kernel] Case label 0xFFFFFFFF exceeds range of long for switch expression. Nothing to worry. +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + result1 ∈ {0} + result3 ∈ {0} + result4 ∈ {0} + result2 ∈ {7} + d2 ∈ {0} +[value] Called CEA_F({0}) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + result1 ∈ {0; 1; 2; 4} + result3 ∈ {0; 42} + result4 ∈ {0; 1; 2} + result2 ∈ {0; 7} + d2 ∈ [-0.0000000000000000*2^-1022 .. 1.9999999999999998*2^1023] + f ∈ [--..--] + __retres ∈ {0; 2; 77} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + result1 FROM d (and SELF) + result3 FROM c; f (and SELF) + result4 FROM c; l (and SELF) + result2 FROM c; e (and SELF) + d2 FROM c; d1 (and SELF) + \result FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + result1; result3; result4; result2; d2; f; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/tab1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/tab1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/tab1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/tab1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/tab1.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G[0..9] ∈ {0} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + G[0] ∈ [0..2147483647] + [1] ∈ [-2147483648..0] + [2..9] ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + G[0..1] FROM x (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + G[0..1] +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/tab.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/tab.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/tab.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/tab.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,64 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/tab.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {55} + y ∈ {77} + t[0..3] ∈ {0} + TT[0][0] ∈ {0} + [0][1..2] ∈ {1} + {[0][3..4]; [1][0..4]; [2][0]} ∈ {0} + [2][1] ∈ {1} + {[2][2..4]; [3..4][0..4]} ∈ {0} + TTT[0][0] ∈ {1} + [0][1] ∈ {2} + [0][2] ∈ {3} + [0][3] ∈ {4} + [0][4] ∈ {5} + [1][0..4] ∈ {0} + [2][0] ∈ {1} + {[2][1..4]; [3..4][0..4]} ∈ {0} +[value] computing for function any_int <- main. + Called from tests/misc/tab.c:11. +tests/misc/any_int.c:9:[value] entering loop for the first time +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert y_0+1 ≤ 2147483647; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert y_0+1 ≤ 2147483647; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert -2147483648 ≤ y_0-1; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert x_0+1 ≤ 2147483647; +tests/misc/any_int.c:9:[kernel] warning: signed overflow. assert -2147483648 ≤ x_0-1; +[value] Recording results for any_int +[value] Done for function any_int +tests/misc/tab.c:12:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. assert 0 ≤ i < 4; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function any_int: + y_0 ∈ [--..--] + x_0 ∈ [--..--] +[value] Values at end of function main: + t[0] ∈ {0; 1} + [1] ∈ {77} + [2..3] ∈ {0; 1} + i ∈ {0; 1; 2; 3} +[from] Computing for function any_int +[from] Done for function any_int +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function any_int: + \result FROM \nothing +[from] Function main: + t{[0]; [2..3]} FROM \nothing (and SELF) + [1] FROM y +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function any_int: + y_0; x_0 +[inout] Inputs for function any_int: + \nothing +[inout] Out (internal) for function main: + t[0..3]; i +[inout] Inputs for function main: + y diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/termination.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/termination.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/termination.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/termination.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,38 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/termination.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G[0..9] ∈ {0} + X ∈ {0} +[value] computing for function loop <- main. + Called from tests/misc/termination.i:33. +[value] Recording results for loop +[value] Done for function loop +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function loop: + X ∈ {2} +[value] Values at end of function main: + X ∈ {2} +[from] Computing for function loop +[from] Done for function loop +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function loop: + X FROM \nothing +[from] Function main: + X FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function loop: + X +[inout] Inputs for function loop: + \nothing +[inout] Out (internal) for function main: + X; tmp +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/test.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/test.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/test.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/test.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,24 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/test.i (no preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + t[0] ∈ {99} + [1..88887] ∈ UNINITIALIZED +[from] Computing for function f +[from] Done for function f +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + t[0..1] +[inout] Inputs for function f: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/test_arith.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/test_arith.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/test_arith.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/test_arith.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,51 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/test_arith.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..9] ∈ {0} + j ∈ {0} + k ∈ {0} + ecart ∈ {0} + tmp ∈ {0} + pptr ∈ {0} + ptr ∈ {0} + qtr ∈ {0} + m1 ∈ {0} + m2 ∈ {0} + m3 ∈ {0} + G ∈ {0} +tests/misc/test_arith.c:16:[kernel] warning: signed overflow. assert n+1 ≤ 2147483647; +tests/misc/test_arith.c:18:[kernel] warning: signed overflow. assert -2147483648 ≤ (int)ptr+1 ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + t[0..4] ∈ {0} + [5] ∈ {11} + [6..9] ∈ {0} + j ∈ {23} + k ∈ {{ &t + {5} }} + ecart ∈ {2} + pptr ∈ {{ &ptr }} + ptr ∈ {{ &t[1] }} + qtr ∈ {{ &t[2] }} + n ∈ [-2147483647..2147483647] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + t{[1]; [5]} FROM \nothing + j FROM \nothing + k FROM \nothing + ecart FROM \nothing + pptr FROM \nothing + ptr FROM \nothing + qtr FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + t{[1]; [5]}; j; k; ecart; pptr; ptr; qtr; n +[inout] Inputs for function main: + t{[1]; [5]}; j; ptr diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/test.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/test.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/test.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/test.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,37 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/test.i (no preprocessing) +[value] Analyzing a complete application starting at inst_F6 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/test.i:9:[value] entering loop for the first time +tests/misc/test.i:10:[value] entering loop for the first time +tests/misc/test.i:11:[value] entering loop for the first time +tests/misc/test.i:11:[kernel] warning: out of bounds read. assert \valid_read(v+j); +tests/misc/test.i:11:[kernel] warning: out of bounds read. assert \valid_read(v+(int)(j+ecart)); +tests/misc/test.i:13:[kernel] warning: out of bounds read. assert \valid_read(v+(int)(j+ecart)); +tests/misc/test.i:14:[kernel] warning: out of bounds write. assert \valid(v+(int)(j+ecart)); +[value] Recording results for inst_F6 +[value] done for function inst_F6 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function inst_F6: + t[0] ∈ UNINITIALIZED + [1] ∈ {4} + [2] ∈ UNINITIALIZED + i ∈ [1..2147483647] or UNINITIALIZED + j ∈ [--..--] + ecart ∈ [-1073741824..0] + tmp ∈ [--..--] or UNINITIALIZED + S_v[0..1] ∈ [--..--] +[from] Computing for function inst_F6 +[from] Done for function inst_F6 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function inst_F6: + S_v[0..1] FROM v; n; S_v[0..1] (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function inst_F6: + t[1]; i; j; ecart; tmp; i_0; S_v[0..1] +[inout] Inputs for function inst_F6: + S_v[0..1] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/threat_array.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/threat_array.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/threat_array.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/threat_array.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,30 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/threat_array.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..9] ∈ {0} + p ∈ {0} +tests/misc/threat_array.i:5:[value] Assertion got status unknown. +tests/misc/threat_array.i:7:[value] Assertion got status valid. +tests/misc/threat_array.i:12:[value] Assertion got status valid. +tests/misc/threat_array.i:15:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. assert 0 ≤ c < 10; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + T[0..9] ∈ {0; 4} + p ∈ {{ (int (*)[10])&T[5] }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + T[0..9] FROM c (and SELF) + p FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + T[0..9]; p +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/threat_if.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/threat_if.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/threat_if.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/threat_if.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,43 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/threat_if.i (no preprocessing) +tests/misc/threat_if.i:19:[kernel] warning: Return statement with a value in function returning void +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + p ∈ {0} + l ∈ {0} + m ∈ {0} + i ∈ {0} + X ∈ {-992} +tests/misc/threat_if.i:14:[kernel] warning: out of bounds write. assert \valid(p); +[value] computing for function printf <- main. + Called from tests/misc/threat_if.i:18. +tests/misc/threat_if.i:18:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + p ∈ {{ NULL ; &l }} + l ∈ {0; 1} + G ∈ {-126} + c ∈ {-126} +[from] Computing for function main +[from] Computing for function printf <-main +[from] Done for function printf +tests/misc/threat_if.i:18:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function printf: + NO EFFECTS +[from] Function main: + p FROM i_0 (and SELF) + l FROM p; i_0 (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + p; l; G; c +[inout] Inputs for function main: + p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/threat_redundant.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/threat_redundant.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/threat_redundant.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/threat_redundant.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,51 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/threat_redundant.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + s1[0] ∈ {97} + [1] ∈ {98} + [2] ∈ {97} + [3] ∈ {98} + [4] ∈ {97} + [5] ∈ {98} + [6] ∈ {97} + [7] ∈ {98} + [8] ∈ {97} + [9] ∈ {98} + x ∈ {0} +[value] computing for function strchr <- main. + Called from tests/misc/threat_redundant.c:16. +tests/misc/threat_redundant.c:5:[value] entering loop for the first time +tests/misc/threat_redundant.c:5:[kernel] warning: out of bounds read. assert \valid_read(s); +[value] Recording results for strchr +[value] Done for function strchr +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function strchr: + NON TERMINATING FUNCTION +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function strchr +[from] Non-terminating function strchr (no dependencies) +[from] Done for function strchr +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function strchr: + NON TERMINATING - NO EFFECTS +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function strchr: + s +[inout] Inputs for function strchr: + s1[0..9] +[inout] Out (internal) for function main: + x +[inout] Inputs for function main: + s1[0..9] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/tricky_logic.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/tricky_logic.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/tricky_logic.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/tricky_logic.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,117 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/tricky_logic.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + vol ∈ [--..--] + str ∈ {{ "abc" }} + x ∈ {0} + y ∈ {0} +tests/misc/tricky_logic.i:56:[value] Function main: precondition got status valid. +[value] computing for function f1 <- main. + Called from tests/misc/tricky_logic.i:58. +tests/misc/tricky_logic.i:15:[value] Assertion got status valid. +tests/misc/tricky_logic.i:16:[value] Assertion got status valid. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/misc/tricky_logic.i:62. +tests/misc/tricky_logic.i:23:[value] Assertion got status valid. +tests/misc/tricky_logic.i:24:[value] Assertion got status valid. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/misc/tricky_logic.i:65. +tests/misc/tricky_logic.i:29:[value] Assertion got status valid. +tests/misc/tricky_logic.i:30:[value] Assertion got status valid. +tests/misc/tricky_logic.i:31:[value] Assertion got status unknown. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/misc/tricky_logic.i:67. +[value] computing for function g4 <- f4 <- main. + Called from tests/misc/tricky_logic.i:51. +tests/misc/tricky_logic.i:38:[value] Assertion got status valid. +tests/misc/tricky_logic.i:39:[value] Assertion got status unknown. +[value] Recording results for g4 +[value] Done for function g4 +tests/misc/tricky_logic.i:52:[value] Assertion got status valid. +tests/misc/tricky_logic.i:53:[value] Assertion got status valid. +[value] Recording results for f4 +[value] Done for function f4 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f1: + +[value] Values at end of function f2: + x ∈ {4} + y ∈ {5} +[value] Values at end of function f3: + +[value] Values at end of function g4: + s.i1 ∈ {3} + .i2 ∈ {2} or UNINITIALIZED + x_0 ∈ {1} +[value] Values at end of function f4: + p ∈ {{ &z }} + q ∈ {{ &x }} + s.i1 ∈ {1} or UNINITIALIZED + .i2 ∈ {2} or UNINITIALIZED +[value] Values at end of function main: + x ∈ {2; 3} + y ∈ {5} +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function g4 +[from] Done for function g4 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + NO EFFECTS +[from] Function f2: + x FROM \nothing + y FROM \nothing +[from] Function f3: + NO EFFECTS +[from] Function g4: + NO EFFECTS +[from] Function f4: + NO EFFECTS +[from] Function main: + x FROM vol + y FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f1: + \nothing +[inout] Inputs for function f1: + \nothing +[inout] Out (internal) for function f2: + x; y +[inout] Inputs for function f2: + \nothing +[inout] Out (internal) for function f3: + \nothing +[inout] Inputs for function f3: + \nothing +[inout] Out (internal) for function g4: + s.i1; x_0 +[inout] Inputs for function g4: + \nothing +[inout] Out (internal) for function f4: + p; q; s +[inout] Inputs for function f4: + vol +[inout] Out (internal) for function main: + x; y +[inout] Inputs for function main: + vol diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/typedef_function.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/typedef_function.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/typedef_function.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/typedef_function.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/typedef_function.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G209[0] ∈ {0} + [1] ∈ {{ &F476 }} +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {0} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; __retres +[inout] Inputs for function main: + G209[0] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/typeof.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/typeof.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/typeof.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/typeof.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/typeof.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + \nothing +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/ulongvslonglong.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/ulongvslonglong.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/ulongvslonglong.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/ulongvslonglong.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,18 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/ulongvslonglong.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + x2 ∈ {0} + x9[0..5][0..1] ∈ {0} +tests/misc/ulongvslonglong.i:12:[value] entering loop for the first time +tests/misc/ulongvslonglong.i:14:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + x ∈ {0} + x2 ∈ {-1501552701} + x9[0..5][0..1] ∈ {0; 1} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/ulongvslonglong.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/ulongvslonglong.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/ulongvslonglong.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/ulongvslonglong.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,18 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/ulongvslonglong.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + x2 ∈ {0} + x9[0..5][0..1] ∈ {0} +tests/misc/ulongvslonglong.i:12:[value] entering loop for the first time +tests/misc/ulongvslonglong.i:14:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + x ∈ {1} + x2 ∈ {2793414595} + x9[0..5][0..1] ∈ {0; 1} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/undef_behavior_bts1059.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/undef_behavior_bts1059.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/undef_behavior_bts1059.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/undef_behavior_bts1059.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,47 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/undef_behavior_bts1059.i (no preprocessing) +tests/misc/undef_behavior_bts1059.i:15:[kernel] warning: Unspecified sequence with side effect: + /* a <- + */ + + if (b) tmp = 1; + else { + a ++; + if (a == 2) tmp = 1; else tmp = 0; + } + /* a <- */ + a = tmp; +tests/misc/undef_behavior_bts1059.i:23:[kernel] warning: Unspecified sequence with side effect: + /* <- */ + tmp_4 = a; + /* a <- */ + a ++; + /* a <- tmp_4 */ + a = tmp_4; +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + c ∈ [--..--] +tests/misc/undef_behavior_bts1059.i:15:[kernel] warning: undefined multiple accesses in expression. assert \separated(&a, &a); +tests/misc/undef_behavior_bts1059.i:23:[kernel] warning: undefined multiple accesses in expression. assert \separated(&a, &a); +[value] Recording results for main +[value] done for function main +tests/misc/undef_behavior_bts1059.i:15:[value] Assertion 'Value,separation' got final status invalid. +tests/misc/undef_behavior_bts1059.i:23:[value] Assertion 'Value,separation' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + a ∈ {1} + b ∈ {2} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + a; b; tmp_0; tmp_1; tmp_2; tmp_3; __retres +[inout] Inputs for function main: + c diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/undef_fct.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/undef_fct.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/undef_fct.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/undef_fct.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/undef_fct.i (no preprocessing) +tests/misc/undef_fct.i:3:[kernel] warning: Calling undeclared function f. Old style K&R code? +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/misc/undef_fct.i:3. +tests/misc/undef_fct.i:3:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] using specification for function f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + +[from] Computing for function main +[from] Computing for function f <-main +[from] Done for function f +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM x_0 +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + tmp +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/undefined_sequence.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/undefined_sequence.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/undefined_sequence.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/undefined_sequence.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,148 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/undefined_sequence.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G[0..9] ∈ {0} + c ∈ [--..--] + r ∈ {0} + H ∈ {0} +tests/misc/undefined_sequence.i:36:[value] entering loop for the first time +tests/misc/undefined_sequence.i:38:[value] entering loop for the first time +tests/misc/undefined_sequence.i:40:[value] entering loop for the first time +tests/misc/undefined_sequence.i:40:[kernel] warning: signed overflow. + assert G[tmp_2]+G[tmp_3] ≤ 2147483647; + (tmp_2 from j++, tmp_3 from i++) +tests/misc/undefined_sequence.i:43:[value] entering loop for the first time +tests/misc/undefined_sequence.i:49:[value] entering loop for the first time +tests/misc/undefined_sequence.i:50:[kernel] warning: signed overflow. assert G[j]+G[tmp_6] ≤ 2147483647; + (tmp_6 from j++) +tests/misc/undefined_sequence.i:51:[kernel] warning: signed overflow. assert G[tmp_7]+G[i] ≤ 2147483647; + (tmp_7 from i++) +[value] computing for function g <- main. + Called from tests/misc/undefined_sequence.i:53. +[value] Recording results for g +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/undefined_sequence.i:53. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/undefined_sequence.i:54. +[value] Recording results for g +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/undefined_sequence.i:54. +[value] Recording results for f +[value] Done for function f +[value] computing for function h <- main. + Called from tests/misc/undefined_sequence.i:56. +[value] Recording results for h +[value] Done for function h +[value] computing for function h <- main. + Called from tests/misc/undefined_sequence.i:56. +[value] Recording results for h +[value] Done for function h +[value] computing for function func <- main. + Called from tests/misc/undefined_sequence.i:60. +[value] Recording results for func +[value] Done for function func +[value] computing for function ub_ret <- main. + Called from tests/misc/undefined_sequence.i:65. +[value] Recording results for ub_ret +[value] Done for function ub_ret +[value] computing for function f <- main. + Called from tests/misc/undefined_sequence.i:67. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/misc/undefined_sequence.i:67. +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {2; 6; 7; 8} +[value] Values at end of function func: + __retres ∈ {5; 6} +[value] Values at end of function g: + __retres ∈ {4; 5} +[value] Values at end of function h: + r ∈ {1; 2} + H ∈ {0; 1} + i ∈ {0; 1} +[value] Values at end of function ub_ret: + d ∈ {0} + __retres ∈ {0} +[value] Values at end of function main: + G[0..1] ∈ [0..2147483647] + [2] ∈ {0; 1} + [3..9] ∈ [0..2147483647] + r ∈ {0; 1} + H ∈ {0; 1} + x ∈ {6; 7; 8} + y ∈ {{ &G[2] }} + i ∈ [0..9] + j ∈ [0..9] + my_f ∈ {{ &f ; &g }} +[from] Computing for function f +[from] Done for function f +[from] Computing for function func +[from] Done for function func +[from] Computing for function g +[from] Done for function g +[from] Computing for function h +[from] Done for function h +[from] Computing for function ub_ret +[from] Done for function ub_ret +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM x +[from] Function func: + \result FROM x; y +[from] Function g: + \result FROM x +[from] Function h: + r FROM c; r + H FROM c; r + \result FROM c; r +[from] Function ub_ret: + \result FROM \nothing +[from] Function main: + G{[0..1]; [3..9]} FROM G[0..9]; c (and SELF) + [2] FROM G[0..9]; c + r FROM c; r; a (and SELF) + H FROM c; r; a (and SELF) + \result FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function func: + __retres +[inout] Inputs for function func: + \nothing +[inout] Out (internal) for function g: + __retres +[inout] Inputs for function g: + \nothing +[inout] Out (internal) for function h: + r; H; i; tmp; tmp_0 +[inout] Inputs for function h: + c; r +[inout] Out (internal) for function ub_ret: + d; __retres +[inout] Inputs for function ub_ret: + \nothing +[inout] Out (internal) for function main: + G[0..9]; r; H; x; y; i; j; tmp; tmp_0; tmp_1; tmp_2; tmp_3; tmp_4; + tmp_5; tmp_6; tmp_7; tmp_8; tmp_9; tmp_10; tmp_11; tmp_12; tmp_13; + tmp_14; tmp_15; my_f; tmp_16; tmp_17; tmp_18 +[inout] Inputs for function main: + G[0..9]; c; r diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/undefined_sequence2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/undefined_sequence2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/undefined_sequence2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/undefined_sequence2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,158 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/undefined_sequence2.i (no preprocessing) +tests/misc/undefined_sequence2.i:11:[kernel] warning: Unspecified sequence with side effect: + /* *x <- x */ + tmp = 0; + *x = tmp; + /* *x <- x */ + tmp_0 = 0; + *x = tmp_0; +tests/misc/undefined_sequence2.i:18:[kernel] warning: Unspecified sequence with side effect: + /* i <- */ + i ++; + /* i <- */ + i ++; +tests/misc/undefined_sequence2.i:26:[kernel] warning: Unspecified sequence with side effect: + /* <- */ + tmp = i; + /* i <- */ + i ++; + /* a[tmp] <- tmp i */ + a[tmp] = i; +tests/misc/undefined_sequence2.i:34:[kernel] warning: Unspecified sequence with side effect: + /* *x <- x */ + tmp = 0; + *x = tmp; + /* *y <- y */ + tmp_0 = 0; + *y = tmp_0; +tests/misc/undefined_sequence2.i:47:[kernel] warning: Unspecified sequence with side effect: + /* *x <- x */ + tmp = 0; + *x = tmp; + /* *y <- y */ + tmp_0 = 0; + *y = tmp_0; +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a[0..1] ∈ {0} + foo ∈ [--..--] +[value] computing for function multiple_update_wrong_1 <- main. + Called from tests/misc/undefined_sequence2.i:56. +tests/misc/undefined_sequence2.i:11:[kernel] warning: undefined multiple accesses in expression. assert \separated(x, x); +[value] Recording results for multiple_update_wrong_1 +[value] Done for function multiple_update_wrong_1 +[value] computing for function multiple_update_wrong_2 <- main. + Called from tests/misc/undefined_sequence2.i:58. +tests/misc/undefined_sequence2.i:18:[kernel] warning: undefined multiple accesses in expression. assert \separated(&i, &i); +[value] Recording results for multiple_update_wrong_2 +[value] Done for function multiple_update_wrong_2 +[value] computing for function multiple_update_wrong_3 <- main. + Called from tests/misc/undefined_sequence2.i:60. +tests/misc/undefined_sequence2.i:26:[kernel] warning: undefined multiple accesses in expression. assert \separated(&i, &i); +[value] Recording results for multiple_update_wrong_3 +[value] Done for function multiple_update_wrong_3 +[value] computing for function multiple_update_unsafe <- main. + Called from tests/misc/undefined_sequence2.i:62. +[value] Recording results for multiple_update_unsafe +[value] Done for function multiple_update_unsafe +[value] Called Frama_C_show_each_passed4() +[value] computing for function multiple_update_unsafe <- main. + Called from tests/misc/undefined_sequence2.i:64. +tests/misc/undefined_sequence2.i:34:[kernel] warning: undefined multiple accesses in expression. assert \separated(x, y); +[value] Recording results for multiple_update_unsafe +[value] Done for function multiple_update_unsafe +[value] computing for function multiple_update_safe <- main. + Called from tests/misc/undefined_sequence2.i:66. +[value] Recording results for multiple_update_safe +[value] Done for function multiple_update_safe +[value] Called Frama_C_show_each_passed6() +[value] computing for function multiple_update_safe <- main. + Called from tests/misc/undefined_sequence2.i:68. +[value] Recording results for multiple_update_safe +[value] Done for function multiple_update_safe +[value] Called Frama_C_show_each_passed7() +[value] Recording results for main +[value] done for function main +tests/misc/undefined_sequence2.i:11:[value] Assertion 'Value,separation' got final status invalid. +tests/misc/undefined_sequence2.i:18:[value] Assertion 'Value,separation' got final status invalid. +tests/misc/undefined_sequence2.i:26:[value] Assertion 'Value,separation' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function multiple_update_safe: + b ∈ {0} + c ∈ {0} + __retres ∈ {0} +[value] Values at end of function multiple_update_unsafe: + b ∈ {0} + c ∈ {0} + __retres ∈ {0} +[value] Values at end of function multiple_update_wrong_1: + NON TERMINATING FUNCTION +[value] Values at end of function multiple_update_wrong_2: + NON TERMINATING FUNCTION +[value] Values at end of function multiple_update_wrong_3: + NON TERMINATING FUNCTION +[value] Values at end of function main: + b ∈ {0} + c ∈ {0} + __retres ∈ {0} +[from] Computing for function multiple_update_safe +[from] Done for function multiple_update_safe +[from] Computing for function multiple_update_unsafe +[from] Done for function multiple_update_unsafe +[from] Computing for function multiple_update_wrong_1 +[from] Non-terminating function multiple_update_wrong_1 (no dependencies) +[from] Done for function multiple_update_wrong_1 +[from] Computing for function multiple_update_wrong_2 +[from] Non-terminating function multiple_update_wrong_2 (no dependencies) +[from] Done for function multiple_update_wrong_2 +[from] Computing for function multiple_update_wrong_3 +[from] Non-terminating function multiple_update_wrong_3 (no dependencies) +[from] Done for function multiple_update_wrong_3 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function multiple_update_safe: + b FROM x; y (and SELF) + c FROM x; y (and SELF) + \result FROM x; y +[from] Function multiple_update_unsafe: + b FROM x + c FROM y + \result FROM \nothing +[from] Function multiple_update_wrong_1: + NON TERMINATING - NO EFFECTS +[from] Function multiple_update_wrong_2: + NON TERMINATING - NO EFFECTS +[from] Function multiple_update_wrong_3: + NON TERMINATING - NO EFFECTS +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function multiple_update_safe: + tmp; tmp_0; b; c; __retres +[inout] Inputs for function multiple_update_safe: + \nothing +[inout] Out (internal) for function multiple_update_unsafe: + tmp; tmp_0; b; c; __retres +[inout] Inputs for function multiple_update_unsafe: + \nothing +[inout] Out (internal) for function multiple_update_wrong_1: + \nothing +[inout] Inputs for function multiple_update_wrong_1: + \nothing +[inout] Out (internal) for function multiple_update_wrong_2: + \nothing +[inout] Inputs for function multiple_update_wrong_2: + \nothing +[inout] Out (internal) for function multiple_update_wrong_3: + \nothing +[inout] Inputs for function multiple_update_wrong_3: + \nothing +[inout] Out (internal) for function main: + b; c; __retres +[inout] Inputs for function main: + foo diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/undefined_sequence.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/undefined_sequence.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/undefined_sequence.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/undefined_sequence.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,214 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/undefined_sequence.i (no preprocessing) +tests/misc/undefined_sequence.i:16:[kernel] warning: Unspecified sequence with side effect: + /* <- */ + tmp = r; + /* r <- */ + r ++; + /* r <- tmp */ + r = tmp; +tests/misc/undefined_sequence.i:28:[kernel] warning: Unspecified sequence with side effect: + /* d <- */ + d = 0; + /* <- d */ +tests/misc/undefined_sequence.i:35:[kernel] warning: Unspecified sequence with side effect: + /* x <- */ + x = 0; + /* *y <- y */ + tmp = 1; + *y = tmp; + /* i <- */ + i = x + tmp; +tests/misc/undefined_sequence.i:44:[kernel] warning: Unspecified sequence with side effect: + /* <- */ + tmp_4 = j; + /* j <- */ + j ++; + /* G[j] <- j G[tmp_4] tmp_4 */ + G[j] = G[tmp_4]; +tests/misc/undefined_sequence.i:45:[kernel] warning: Unspecified sequence with side effect: + /* <- */ + tmp_5 = i; + /* i <- */ + i ++; + /* G[tmp_5] <- tmp_5 G[i] i */ + G[tmp_5] = G[i]; +tests/misc/undefined_sequence.i:50:[kernel] warning: Unspecified sequence with side effect: + /* <- */ + tmp_6 = j; + /* j <- */ + j ++; + /* G[j] <- j G[tmp_6] tmp_6 */ + G[j] += G[tmp_6]; +tests/misc/undefined_sequence.i:51:[kernel] warning: Unspecified sequence with side effect: + /* <- */ + tmp_7 = i; + /* i <- */ + i ++; + /* G[tmp_7] <- tmp_7 G[i] i */ + G[tmp_7] += G[i]; +tests/misc/undefined_sequence.i:53:[kernel] warning: Unspecified sequence with side effect: + /* <- x */ + { + /*sequence*/ + tmp_8 = g(3); + + } + tmp_9 = f(tmp_8 + x); + /* <- */ + tmp_10 = x; + /* x <- */ + x ++; + /* i <- tmp_10 */ + i = tmp_9 + tmp_10; +tests/misc/undefined_sequence.i:67:[kernel] warning: Unspecified sequence with side effect: + /* my_f <- g */ + my_f = & g; + tmp_16 = f(1); + /* <- my_f */ + tmp_17 = (*my_f)(2); + /* <- */ + tmp_18 = tmp_16 + tmp_17; +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G[0..9] ∈ {0} + c ∈ [--..--] + r ∈ {0} + H ∈ {0} +tests/misc/undefined_sequence.i:35:[kernel] warning: undefined multiple accesses in expression. assert \separated(&x, y); +tests/misc/undefined_sequence.i:36:[value] entering loop for the first time +tests/misc/undefined_sequence.i:38:[value] entering loop for the first time +tests/misc/undefined_sequence.i:40:[value] entering loop for the first time +tests/misc/undefined_sequence.i:40:[kernel] warning: signed overflow. + assert G[tmp_2]+G[tmp_3] ≤ 2147483647; + (tmp_2 from j++, tmp_3 from i++) +tests/misc/undefined_sequence.i:43:[value] entering loop for the first time +tests/misc/undefined_sequence.i:44:[kernel] warning: undefined multiple accesses in expression. assert \separated(&j, &j); +tests/misc/undefined_sequence.i:45:[kernel] warning: undefined multiple accesses in expression. assert \separated(&i, &i); +tests/misc/undefined_sequence.i:49:[value] entering loop for the first time +tests/misc/undefined_sequence.i:50:[kernel] warning: undefined multiple accesses in expression. assert \separated(&j, &j); +tests/misc/undefined_sequence.i:51:[kernel] warning: undefined multiple accesses in expression. assert \separated(&i, &i); +tests/misc/undefined_sequence.i:53:[kernel] warning: undefined multiple accesses in expression. assert \separated(&x, &x); +[value] computing for function g <- main. + Called from tests/misc/undefined_sequence.i:54. +[value] Recording results for g +[value] Done for function g +[value] computing for function f <- main. + Called from tests/misc/undefined_sequence.i:54. +[value] Recording results for f +[value] Done for function f +[value] computing for function h <- main. + Called from tests/misc/undefined_sequence.i:56. +tests/misc/undefined_sequence.i:16:[kernel] warning: undefined multiple accesses in expression. assert \separated(&r, &r); +[value] Recording results for h +[value] Done for function h +[value] computing for function h <- main. + Called from tests/misc/undefined_sequence.i:56. +[value] Recording results for h +[value] Done for function h +[value] computing for function func <- main. + Called from tests/misc/undefined_sequence.i:60. +[value] Recording results for func +[value] Done for function func +[value] computing for function ub_ret <- main. + Called from tests/misc/undefined_sequence.i:65. +tests/misc/undefined_sequence.i:28:[kernel] warning: undefined multiple accesses in expression. assert \separated(&d, &d); +[value] Recording results for ub_ret +[value] Done for function ub_ret +tests/misc/undefined_sequence.i:67:[kernel] warning: undefined multiple accesses in expression. assert \separated(&my_f, &my_f); +[value] Recording results for main +[value] done for function main +tests/misc/undefined_sequence.i:16:[value] Assertion 'Value,separation' got final status invalid. +tests/misc/undefined_sequence.i:28:[value] Assertion 'Value,separation' got final status invalid. +tests/misc/undefined_sequence.i:35:[value] Assertion 'Value,separation' got final status invalid. +tests/misc/undefined_sequence.i:44:[value] Assertion 'Value,separation' got final status invalid. +tests/misc/undefined_sequence.i:45:[value] Assertion 'Value,separation' got final status invalid. +tests/misc/undefined_sequence.i:50:[value] Assertion 'Value,separation' got final status invalid. +tests/misc/undefined_sequence.i:51:[value] Assertion 'Value,separation' got final status invalid. +tests/misc/undefined_sequence.i:53:[value] Assertion 'Value,separation' got final status invalid. +tests/misc/undefined_sequence.i:67:[value] Assertion 'Value,separation' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {6} +[value] Values at end of function func: + __retres ∈ {5; 6} +[value] Values at end of function g: + __retres ∈ {5} +[value] Values at end of function h: + r ∈ {1; 2} + H ∈ {0; 1} + i ∈ {0; 1} +[value] Values at end of function ub_ret: + NON TERMINATING FUNCTION +[value] Values at end of function main: + G[0..1] ∈ [0..2147483647] + [2] ∈ {0; 1} + [3..9] ∈ [0..2147483647] + r ∈ {0; 1} + H ∈ {0; 1} + x ∈ {6} + y ∈ {{ &G[2] }} + i ∈ {0} + j ∈ {0} + my_f ∈ {{ &f }} +[from] Computing for function f +[from] Done for function f +[from] Computing for function func +[from] Done for function func +[from] Computing for function g +[from] Done for function g +[from] Computing for function h +[from] Done for function h +[from] Computing for function ub_ret +[from] Non-terminating function ub_ret (no dependencies) +[from] Done for function ub_ret +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM x +[from] Function func: + \result FROM x; y +[from] Function g: + \result FROM x +[from] Function h: + r FROM r + H FROM r + \result FROM r +[from] Function ub_ret: + NON TERMINATING - NO EFFECTS +[from] Function main: + G{[0..1]; [3..9]} FROM G[0..9] (and SELF) + [2] FROM G[0..9] + r FROM r; a (and SELF) + H FROM r; a (and SELF) + \result FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function func: + __retres +[inout] Inputs for function func: + \nothing +[inout] Out (internal) for function g: + __retres +[inout] Inputs for function g: + \nothing +[inout] Out (internal) for function h: + r; H; i; tmp_0 +[inout] Inputs for function h: + c; r +[inout] Out (internal) for function ub_ret: + d +[inout] Inputs for function ub_ret: + \nothing +[inout] Out (internal) for function main: + G[0..9]; r; H; x; y; i; j; tmp_0; tmp_1; tmp_2; tmp_3; tmp_11; tmp_12; + tmp_13; tmp_14; tmp_15; my_f; tmp_18 +[inout] Inputs for function main: + G[0..9]; c; r diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/uninit_callstack.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/uninit_callstack.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/uninit_callstack.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/uninit_callstack.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,13 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/uninit_callstack.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + p ∈ {0} + x ∈ {0} +tests/misc/uninit_callstack.i:8:[kernel] warning: accessing uninitialized left-value: assert \initialized(p); + stack: f :: tests/misc/uninit_callstack.i:14 <- main +tests/misc/uninit_callstack.i:8:[kernel] warning: completely indeterminate value in a. +[value] done for function main +[value] ====== VALUES COMPUTED ====== diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/uninitialized_gnubody.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/uninitialized_gnubody.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/uninitialized_gnubody.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/uninitialized_gnubody.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/uninitialized_gnubody.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + x ∈ {44} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + x; y; tmp +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/uninit.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/uninit.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/uninit.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/uninit.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/uninit.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/uninit.i:3:[kernel] warning: accessing uninitialized left-value: assert \initialized(&i); +tests/misc/uninit.i:3:[kernel] warning: completely indeterminate value in i. +[value] Recording results for main +[value] done for function main +tests/misc/uninit.i:3:[value] Assertion 'Value,initialisation' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/unknown_sizeof.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/unknown_sizeof.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/unknown_sizeof.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/unknown_sizeof.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,11 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/unknown_sizeof.i (no preprocessing) +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +tests/misc/unknown_sizeof.i:8:[value] warning: during initialization of variable 's', size of type 'struct s' cannot be + computed (abstract type 'struct s') +[value] Initial state computed +[value] Values of globals at initialization + s.[bits 0 to ..] ∈ {0} or UNINITIALIZED +tests/misc/unknown_sizeof.i:23:[value] user error: Function argument *((struct s *)((char *)(& s) + 1)) has unknown size. Aborting +[kernel] Plug-in value aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/unknown_sizeof.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/unknown_sizeof.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/unknown_sizeof.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/unknown_sizeof.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,17 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/unknown_sizeof.i (no preprocessing) +[value] Analyzing a complete application starting at main1 +[value] Computing initial state +tests/misc/unknown_sizeof.i:8:[value] warning: during initialization of variable 's', size of type 'struct s' cannot be + computed (abstract type 'struct s') +[value] Initial state computed +[value] Values of globals at initialization + s.[bits 0 to ..] ∈ {0} or UNINITIALIZED +[value] computing for function g <- main1. + Called from tests/misc/unknown_sizeof.i:19. +tests/misc/unknown_sizeof.i:15:[kernel] warning: out of bounds write. assert \valid(&__retres); +tests/misc/unknown_sizeof.i:15:[kernel] warning: accessing uninitialized left-value: + assert \initialized((struct s *)((char *)(&s)+1)); +tests/misc/unknown_sizeof.i:15:[kernel] warning: out of bounds read. assert \valid_read((struct s *)((char *)(&s)+1)); +tests/misc/unknown_sizeof.i:15:[value] user error: Function g returns a value of unknown size. Aborting +[kernel] Plug-in value aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/unroll.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/unroll.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/unroll.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/unroll.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,42 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/unroll.i (no preprocessing) +tests/misc/unroll.i:49:[kernel] warning: ignoring unrolling directive (not an understood constant expression) +tests/misc/unroll.i:54:[kernel] warning: ignoring invalid unrolling directive +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t_biosmap[0..9] ∈ {0} + g_biosmap ∈ {{ &t_biosmap[0] }} + biosmap ∈ {0} +tests/misc/unroll.i:31:[value] entering loop for the first time +tests/misc/unroll.i:34:[kernel] warning: signed overflow. assert -2147483648 ≤ j-1; +tests/misc/unroll.i:32:[kernel] warning: signed overflow. assert G+i ≤ 2147483647; +tests/misc/unroll.i:33:[kernel] warning: signed overflow. assert i+1 ≤ 2147483647; +tests/misc/unroll.i:39:[value] entering loop for the first time +tests/misc/unroll.i:49:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + c ∈ {0} + G ∈ [17739..2147483647] + i ∈ [257..2147483647] + MAX ∈ {12} + JMAX ∈ {5} + j ∈ [-2147483648..-1] + k ∈ {13} + S ∈ {479001600} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + c; G; i; MAX; JMAX; j; k; S; tmp; tmp_unroll_3752; tmp_unroll_3760; + tmp_unroll_3768; tmp_unroll_3776; tmp_unroll_3784; tmp_unroll_3792; + tmp_unroll_3800; tmp_unroll_3808; tmp_unroll_3816; tmp_unroll_3824 +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/unroll_simple.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/unroll_simple.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/unroll_simple.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/unroll_simple.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,35 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/unroll_simple.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/unroll_simple.i:8:[value] entering loop for the first time +tests/misc/unroll_simple.i:11:[kernel] warning: signed overflow. assert -2147483648 ≤ j-1; +tests/misc/unroll_simple.i:9:[kernel] warning: signed overflow. assert G+i ≤ 2147483647; +tests/misc/unroll_simple.i:10:[kernel] warning: signed overflow. assert i+1 ≤ 2147483647; +tests/misc/unroll_simple.i:16:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + c ∈ {0} + G ∈ [8772..2147483647] + i ∈ [257..2147483647] + MAX ∈ {12} + JMAX ∈ {5} + j ∈ [-2147483648..-1] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + c; G; i; MAX; JMAX; j; tmp; tmp_unroll_774; tmp_unroll_782; tmp_unroll_790; + tmp_unroll_798; tmp_unroll_806; tmp_unroll_814; tmp_unroll_822; + tmp_unroll_830; tmp_unroll_838; tmp_unroll_846 +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/unsigned_overflow.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/unsigned_overflow.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/unsigned_overflow.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/unsigned_overflow.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/unsigned_overflow.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i1 ∈ [--..--] + i2 ∈ [--..--] +tests/misc/unsigned_overflow.c:4:[value] Assertion got status unknown. +tests/misc/unsigned_overflow.c:5:[value] Assertion got status unknown. +[value] Called Frama_C_show_each_dead() +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + v ∈ [--..--] + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + v; w; __retres +[inout] Inputs for function main: + i1; i2 diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/user_assertion_uninit_var.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/user_assertion_uninit_var.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/user_assertion_uninit_var.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/user_assertion_uninit_var.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/user_assertion_uninit_var.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/user_assertion_uninit_var.i:3:[value] entering loop for the first time +tests/misc/user_assertion_uninit_var.i:4:[value] Assertion got status unknown. +tests/misc/user_assertion_uninit_var.i:6:[kernel] warning: accessing uninitialized left-value: assert \initialized(&n); +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {10} + n ∈ [0..9] + x ∈ {0; 1} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; n; x +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/use_spec.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/use_spec.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/use_spec.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/use_spec.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,77 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/use_spec.i (no preprocessing) +[value] user error: no assigns specified for function 'f', for which a builtin + or the specification will be used. Potential unsoundness. +[value] warning: Generating potentially incorrect assigns for function 'f' for which option -val-use-spec is set +tests/misc/use_spec.i:7:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + w ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/use_spec.i:22. +[value] using specification for function f +[value] Done for function f +tests/misc/use_spec.i:23:[kernel] warning: Neither code nor specification for function g, generating default assigns from the prototype +[value] computing for function g <- main. + Called from tests/misc/use_spec.i:23. +[value] using specification for function g +[value] Done for function g +[value] computing for function h <- main. + Called from tests/misc/use_spec.i:24. +[value] using specification for function h +[value] Done for function h +[value] computing for function i <- main. + Called from tests/misc/use_spec.i:25. +[value] using specification for function i +[value] Done for function i +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + w ∈ [--..--] + x ∈ [--..--] + y ∈ [--..--] + z ∈ [--..--] +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f at tests/misc/use_spec.i:22 (by main): + x FROM direct: x (and SELF) +[from] call to g at tests/misc/use_spec.i:23 (by main): + y FROM direct: y (and SELF) +[from] call to h at tests/misc/use_spec.i:24 (by main): + z FROM \nothing +[from] call to i at tests/misc/use_spec.i:25 (by main): + w FROM \nothing +[from] entry point: + w FROM \nothing + x FROM direct: x (and SELF) + y FROM direct: y (and SELF) + z FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[inout] InOut (internal) for function f: + Operational inputs: + x + Operational inputs on termination: + x + Sure outputs: + \nothing +[inout] InOut (internal) for function h: + Operational inputs: + \nothing + Operational inputs on termination: + \nothing + Sure outputs: + z +[inout] InOut (internal) for function main: + Operational inputs: + x; y + Operational inputs on termination: + x; y + Sure outputs: + w; z diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/use_spec.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/use_spec.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/use_spec.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/use_spec.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,77 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/use_spec.i (no preprocessing) +[value] user error: no assigns specified for function 'f', for which a builtin + or the specification will be used. Potential unsoundness. +[value] warning: Generating potentially incorrect assigns for function 'f' for which option -val-use-spec is set +tests/misc/use_spec.i:7:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + w ∈ {0} + x ∈ {0} + y ∈ {0} + z ∈ {0} +[value] computing for function f <- main. + Called from tests/misc/use_spec.i:22. +[value] using specification for function f +[value] Done for function f +tests/misc/use_spec.i:23:[kernel] warning: Neither code nor specification for function g, generating default assigns from the prototype +[value] computing for function g <- main. + Called from tests/misc/use_spec.i:23. +[value] using specification for function g +[value] Done for function g +[value] computing for function h <- main. + Called from tests/misc/use_spec.i:24. +[value] using specification for function h +[value] Done for function h +[value] computing for function i <- main. + Called from tests/misc/use_spec.i:25. +[value] using specification for function i +[value] Done for function i +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + w ∈ [--..--] + x ∈ [--..--] + y ∈ [--..--] + z ∈ [--..--] +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f at tests/misc/use_spec.i:22 (by main): + x FROM x (and SELF) +[from] call to g at tests/misc/use_spec.i:23 (by main): + y FROM y (and SELF) +[from] call to h at tests/misc/use_spec.i:24 (by main): + z FROM \nothing +[from] call to i at tests/misc/use_spec.i:25 (by main): + w FROM \nothing +[from] entry point: + w FROM \nothing + x FROM x (and SELF) + y FROM y (and SELF) + z FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[inout] InOut (internal) for function f: + Operational inputs: + x + Operational inputs on termination: + x + Sure outputs: + \nothing +[inout] InOut (internal) for function h: + Operational inputs: + \nothing + Operational inputs on termination: + \nothing + Sure outputs: + z +[inout] InOut (internal) for function main: + Operational inputs: + x; y + Operational inputs on termination: + x; y + Sure outputs: + w; z diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/usp.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/usp.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/usp.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/usp.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,52 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/usp.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {-12} + b ∈ {0} + p ∈ {{ (unsigned int *)&a }} + q ∈ {{ (unsigned int *)&b }} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} + T ∈ {0} +[value] Called Frama_C_show_each({-1; 5}) +[value] DUMPING STATE of file tests/misc/usp.i line 18 + a ∈ {-12} + b ∈ {5; 4294967295} + p ∈ {{ (unsigned int *)&a }} + q ∈ {{ (unsigned int *)&b }} + X ∈ {0} + Y ∈ {-12} + Z ∈ {-1; 0} + T ∈ {0; 5} + c ∈ [--..--] + =END OF DUMP== +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + b ∈ {-1; 5} + Y ∈ {-12} + Z ∈ {-1; 0} + T ∈ {0; 5} + __retres ∈ {0} +[from] Computing for function main +[from] Computing for function Frama_C_dump_each <-main +[from] Done for function Frama_C_dump_each +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + b FROM c + Y FROM a; p + Z FROM q; c (and SELF) + T FROM q; c (and SELF) + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + b; Y; Z; T; __retres +[inout] Inputs for function main: + a; b; p; q diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/val6.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/val6.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/val6.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/val6.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/val6.i (no preprocessing) +[value] Analyzing a complete application starting at f1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + NULL[rbits 8 to 8388607] ∈ [--..--] + c ∈ {0} + a ∈ {0} + b ∈ {0} + y ∈ {0} + x ∈ {0} +[value] Recording results for f1 +[value] done for function f1 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f1: + NULL[rbits 8 to 135] ∈ [--..--] + [rbits 136 to 143] ∈ {27} + [rbits 144 to 151] ∈ [--..--] + [rbits 152 to 159] ∈ {0} + [rbits 160 to 8388607] ∈ [--..--] + b ∈ {19} + x ∈ {19} + __retres ∈ {0} +[from] Computing for function f1 +[from] Done for function f1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + NULL[17] FROM \nothing + [19] FROM c + b FROM c + x FROM c + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f1: + NULL{[17]; [19]}; b; x; __retres +[inout] Inputs for function f1: + c; b; x diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/val6.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/val6.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/val6.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/val6.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,43 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/val6.i (no preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + NULL[rbits 8 to 8388607] ∈ [--..--] + c ∈ {0} + a ∈ {0} + b ∈ {0} + y ∈ {0} + x ∈ {0} +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + NULL[rbits 8 to 143] ∈ [--..--] + [rbits 144 to 175] ∈ {{ (? *)&b }} + [rbits 176 to 8388607] ∈ [--..--] + c ∈ {{ &b }} + a ∈ {98} + b[bits 0 to 7] ∈ {97} + [bits 8 to 31]# ∈ {{ (? *)&a }}%32, bits 8 to 31 + y ∈ {{ &b }} + x ∈ {{ (int)&b }} + __retres ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + NULL[18..21] FROM \nothing + c FROM \nothing + a FROM \nothing + b FROM \nothing + y FROM \nothing + x FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + NULL[18..21]; c; a; b; y; x; __retres +[inout] Inputs for function f: + NULL[18..21]; c; x diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/val9.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/val9.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/val9.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/val9.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,99 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/val9.i (no preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + TT[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3..9] ∈ {0} + T[0] ∈ {1} + [1] ∈ {2} + [2] ∈ {3} + [3..9] ∈ {0} + i ∈ {0} + a ∈ {0} + b ∈ {0} + a7 ∈ {0} + b7 ∈ {0} + O1[0..19] ∈ {0} + O2[0..19] ∈ {0} + p ∈ {0} + x2 ∈ {0} + b2 ∈ {0} + a2 ∈ {0} +tests/misc/val9.i:17:[value] entering loop for the first time +tests/misc/val9.i:27:[value] entering loop for the first time +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + TT[0][bits 0 to 7]# ∈ [0..8]%32, bits 0 to 7 + [bits 8 to 39]# ∈ [0..8] repeated %32, bits 8 to 39 + [bits 40 to 71]# ∈ [0..8] repeated %32, bits 8 to 39 + [bits 72 to 103]# ∈ [0..8] repeated %32, bits 8 to 39 + [bits 104 to 135]# ∈ [0..8] repeated %32, bits 8 to 39 + [bits 136 to 287]# ∈ [0..8] repeated %32, bits 8 to 159 + [9] ∈ {0} + T[0][bits 0 to 7]# ∈ {1}%32, bits 0 to 7 + [0][bits 8 to 31]# ∈ {0; 1}%32, bits 8 to 31 + [1][bits 0 to 7]# ∈ {0; 2}%32, bits 0 to 7 + [1][bits 8 to 31]# ∈ {0; 2}%32, bits 8 to 31 + [2][bits 0 to 7]# ∈ {0; 3}%32, bits 0 to 7 + [2][bits 8 to 31]# ∈ {0; 3}%32, bits 8 to 31 + [3..5] ∈ {0} + [6][bits 0 to 7]# ∈ {0; 7}%32, bits 0 to 7 + [6][bits 8 to 31]# ∈ {0; 7}%32, bits 8 to 31 + [7..9] ∈ {0} + i ∈ {9} + a[bits 0 to 7] ∈ {1; 6} + [bits 8 to 31]# ∈ {6}%32, bits 8 to 31 + b[bits 0 to 7] ∈ {0; 1} + [bits 8 to 31]# ∈ {0; 6}%32, bits 8 to 31 + a7[bits 0 to 7] ∈ {1} + [bits 8 to 31]# ∈ {97}%32, bits 8 to 31 + b7[bits 0 to 7] ∈ {1} + [bits 8 to 31]# ∈ {97}%32, bits 8 to 31 + O1[0][bits 0 to 7] ∈ {0} + [0][bits 8 to 15] ∈ {18} + [0][bits 16 to 31] ∈ {0} + [1] ∈ {17} + [2..8] ∈ {0} + [9] ∈ {1} + [10..19] ∈ {0} + O2[0][bits 0 to 7]# ∈ {10}%32, bits 0 to 7 + [0][bits 8 to 15] ∈ {11} + [0][bits 16 to 31]# ∈ {10}%32, bits 16 to 31 + [1..19] ∈ {0} + p ∈ {{ &O1[9] }} + x2 ∈ {1} + b2 ∈ {{ &x2 }} + a2 ∈ {{ (int)&x2 }} +[from] Computing for function f +[from] Done for function f +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + TT{[0..8]; [9][bits 0 to 7]} FROM \nothing (and SELF) + T{{[0][bits 8 to 31]; [1..5]}; {[7..8]; [9][bits 0 to 7]}} + FROM \nothing (and SELF) + [6] FROM b + i FROM \nothing + a FROM b + b FROM b (and SELF) + a7 FROM \nothing + b7 FROM \nothing + O1{[0][bits 8 to 15]; [1]; [6]; [9]} FROM \nothing + O2[0] FROM \nothing + p FROM \nothing + x2 FROM \nothing + b2 FROM \nothing + a2 FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + TT{[0..8]; [9][bits 0 to 7]}; + T{[0][bits 8 to 31]; [1..8]; [9][bits 0 to 7]}; i; a; b; a7; b7; + O1{[0][bits 8 to 15]; [1]; [6]; [9]}; O2[0]; p; x2; b2; a2 +[inout] Inputs for function f: + i; a; b; a7; p; x2; b2; a2 diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/val_if.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/val_if.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/val_if.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/val_if.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,38 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/val_if.i (no preprocessing) +[value] Analyzing a complete application starting at f1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + x ∈ {0} + k ∈ {0} + l ∈ {0} + m ∈ {0} + n ∈ {0} + d ∈ {0} +[value] Recording results for f1 +[value] done for function f1 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f1: + i ∈ {10} + j ∈ {-1; 13} + x ∈ {-1; 1} + k ∈ {14} + l ∈ {-1; 15} +[from] Computing for function f1 +[from] Done for function f1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + i FROM \nothing + j FROM c + x FROM c + k FROM \nothing + l FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f1: + i; j; x; k; l +[inout] Inputs for function f1: + x diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/val_if.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/val_if.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/val_if.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/val_if.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,38 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/val_if.i (no preprocessing) +[value] Analyzing a complete application starting at f2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + x ∈ {0} + k ∈ {0} + l ∈ {0} + m ∈ {0} + n ∈ {0} + d ∈ {0} +[value] Recording results for f2 +[value] done for function f2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f2: + i ∈ {10} + j ∈ {2} + x ∈ {2} + k ∈ {17} + l ∈ {18} +[from] Computing for function f2 +[from] Done for function f2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f2: + i FROM \nothing + j FROM d; c + x FROM d; c + k FROM \nothing + l FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f2: + i; j; x; k; l +[inout] Inputs for function f2: + x; d diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/val_if.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/val_if.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/val_if.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/val_if.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/val_if.i (no preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + x ∈ {0} + k ∈ {0} + l ∈ {0} + m ∈ {0} + n ∈ {0} + d ∈ {0} +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + i ∈ {10} + x ∈ {-1; 1} + j_0 ∈ {12} +[from] Computing for function f +[from] Done for function f +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + i FROM \nothing + x FROM c +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + i; x; j_0 +[inout] Inputs for function f: + x diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/va_list2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/va_list2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/va_list2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/va_list2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,40 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/va_list2.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/va_list2.c:8:[value] entering loop for the first time +tests/misc/va_list2.c:8:[kernel] warning: out of bounds read. assert \valid_read(fmt); +[value] Called Frama_C_show_each_i([-2147483648..2147483647]) +tests/misc/va_list2.c:17:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(f); +[value] Called Frama_C_show_each_f([-3.40282346639e+38 .. 3.40282346639e+38]) +tests/misc/va_list2.c:9:[kernel] warning: out of bounds read. assert \valid_read(fmt); +[value] Called Frama_C_show_each_i([-2147483648..2147483647]) +[value] Called Frama_C_show_each_f([-3.40282346639e+38 .. 3.40282346639e+38]) +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +tests/misc/va_list2.c:7:[kernel] warning: Neither code nor specification for function __builtin_va_start, generating default assigns from the prototype +tests/misc/va_list2.c:11:[kernel] warning: Neither code nor specification for function __builtin_va_arg, generating default assigns from the prototype +tests/misc/va_list2.c:24:[kernel] warning: Neither code nor specification for function __builtin_va_end, generating default assigns from the prototype +[value] Values at end of function main: + fmt ∈ {{ &S_fmt{[0], [1]} }} +[from] Computing for function main +[from] Computing for function __builtin_va_start <-main +[from] Done for function __builtin_va_start +[from] Computing for function __builtin_va_arg <-main +[from] Done for function __builtin_va_arg +[from] Computing for function __builtin_va_end <-main +[from] Done for function __builtin_va_end +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + fmt; i; f +[inout] Inputs for function main: + S_fmt[0..1] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/va_list.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/va_list.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/va_list.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/va_list.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,35 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/va_list.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function __builtin_next_arg <- main. + Called from tests/misc/va_list.c:9. +tests/misc/va_list.c:9:[kernel] warning: Neither code nor specification for function __builtin_next_arg, generating default assigns from the prototype +[value] using specification for function __builtin_next_arg +tests/misc/va_list.c:9:[value] user error: functions returning variadic arguments must be stubbed +[value] Done for function __builtin_next_arg +tests/misc/va_list.c:9:[value] warning: cast to __builtin_va_list is not precisely implemented yet +tests/misc/va_list.c:9:[value] warning: cast to __builtin_va_list is not precisely implemented yet +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + vlParameters ∈ [--..--] +[from] Computing for function main +[from] Computing for function __builtin_next_arg <-main +[from] Done for function __builtin_next_arg +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function __builtin_next_arg: + \result FROM \nothing +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + vlParameters; tmp +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/val_ptr.1.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/val_ptr.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/val_ptr.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/val_ptr.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,36 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/val_ptr.i (no preprocessing) +[value] Analyzing a complete application starting at f1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + x ∈ {0} + k ∈ {0} + l ∈ {0} + m ∈ {0} + n ∈ {0} + d ∈ {0} + a ∈ {0} + b ∈ {0} + c ∈ {0} + p ∈ {0} + T[0..7] ∈ {0} +tests/misc/val_ptr.i:34:[value] entering loop for the first time +[value] Recording results for f1 +[value] done for function f1 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f1: + p ∈ {{ &T[0] }} +[from] Computing for function f1 +[from] Done for function f1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + p FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f1: + p +[inout] Inputs for function f1: + p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/val_ptr.2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/val_ptr.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/val_ptr.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/val_ptr.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,37 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/val_ptr.i (no preprocessing) +[value] Analyzing a complete application starting at f3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + x ∈ {0} + k ∈ {0} + l ∈ {0} + m ∈ {0} + n ∈ {0} + d ∈ {0} + a ∈ {0} + b ∈ {0} + c ∈ {0} + p ∈ {0} + T[0..7] ∈ {0} +[value] Recording results for f3 +[value] done for function f3 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f3: + p ∈ {{ &T[0] }} + T[0..7] ∈ {0} +[from] Computing for function f3 +[from] Done for function f3 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f3: + p FROM \nothing + T[0] FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f3: + p; T[0] +[inout] Inputs for function f3: + p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/val_ptr.3.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/val_ptr.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/val_ptr.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/val_ptr.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,42 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/val_ptr.i (no preprocessing) +[value] Analyzing a complete application starting at f2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + x ∈ {0} + k ∈ {0} + l ∈ {0} + m ∈ {0} + n ∈ {0} + d ∈ {0} + a ∈ {0} + b ∈ {0} + c ∈ {0} + p ∈ {0} + T[0..7] ∈ {0} +[value] Recording results for f2 +[value] done for function f2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f2: + j ∈ {3} + a ∈ {1} + b ∈ {2} + p ∈ {{ &a }} + c_0 ∈ {0} +[from] Computing for function f2 +[from] Done for function f2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f2: + j FROM \nothing + a FROM \nothing + b FROM \nothing + p FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f2: + j; a; b; p; c_0 +[inout] Inputs for function f2: + p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/val_ptr.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/val_ptr.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/val_ptr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/val_ptr.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/val_ptr.i (no preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i ∈ {0} + j ∈ {0} + x ∈ {0} + k ∈ {0} + l ∈ {0} + m ∈ {0} + n ∈ {0} + d ∈ {0} + a ∈ {0} + b ∈ {0} + c ∈ {0} + p ∈ {0} + T[0..7] ∈ {0} +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + i ∈ {10} + j ∈ {10; 12; 16} + k ∈ {10; 11; 12} + l ∈ {18} + d ∈ {13} + a ∈ {10; 11} + b ∈ {12} + p ∈ {{ &a ; &b }} +[from] Computing for function f +[from] Done for function f +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + i FROM \nothing + j FROM c_0 + k FROM c_0 + l FROM \nothing + d FROM \nothing + a FROM c_0 + b FROM \nothing + p FROM c_0 +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + i; j; k; l; d; a; b; p +[inout] Inputs for function f: + d; a; b; p diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/video_detect.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/video_detect.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/video_detect.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/video_detect.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,47 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/video_detect.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + NULL[rbits 256 to 287] ∈ [--..--] + G ∈ {0} +[value] computing for function detect_video <- main. + Called from tests/misc/video_detect.i:36. +[value] Recording results for detect_video +[value] Done for function detect_video +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function detect_video: + NULL[rbits 256 to 287] ∈ [--..--] + p ∈ {32} + saved1 ∈ [--..--] + saved2 ∈ [--..--] + video_found ∈ {0} +[value] Values at end of function main: + NULL[rbits 256 to 287] ∈ [--..--] + ADDR ∈ {32} +[from] Computing for function detect_video +[from] Done for function detect_video +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function detect_video: + NULL[32..33] FROM NULL[32..33]; video_base + [34..35] FROM NULL[34..35]; video_base + \result FROM video_base +[from] Function main: + NULL[32..33] FROM NULL[32..33] + [34..35] FROM NULL[34..35] + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function detect_video: + NULL[32..35]; p; saved1; saved2; video_found +[inout] Inputs for function detect_video: + NULL[32..35] +[inout] Out (internal) for function main: + NULL[32..35]; ADDR; tmp +[inout] Inputs for function main: + NULL[32..35] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/visitor_creates_func_bts_1349.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/visitor_creates_func_bts_1349.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/visitor_creates_func_bts_1349.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/visitor_creates_func_bts_1349.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,12 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/visitor_creates_func_bts_1349.i (no preprocessing) +/* Generated by Frama-C */ +int a = 10; +int f(int x); + +int f(int x) +{ + return x; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/vis_spec.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/vis_spec.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/vis_spec.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/vis_spec.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/vis_spec.i (no preprocessing) +Starting visit +Considering spec of function Frama_C_bzero +Function prototype; Funspec is +'requires \valid(dest+(0 .. n-1)); + ensures ∀ ℤ i; 0 ≤ i < \old(n) ⇒ *(\old(dest)+i) ≡ 0; + assigns *(dest+(0 .. n-1)); + assigns *(dest+(0 .. n-1)) \from \nothing;' +Considering spec of function Frama_C_copy_block +Function prototype; Funspec is +'requires \valid(dest+(0 .. size*n-1)); + requires n ≥ 1; + ensures + ∀ ℤ i, ℤ j; + 0 ≤ i < \old(size) ∧ 1 ≤ j < \old(n) ⇒ + *(\old(dest)+(i+j*\old(size))) ≡ *(\old(dest)+i); + assigns *(dest+(size .. size*n-1)); + assigns *(dest+(size .. size*n-1)) \from *(dest+(0 .. size-1));' +Considering spec of function g +Function prototype; Funspec is 'assigns \nothing;' +Considering spec of function f +Funspec of f is 'assigns \nothing;' through visitor +It is 'assigns \nothing;' through get_spec +End visit diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/volatile2.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/volatile2.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/volatile2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/volatile2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,255 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/volatile2.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..9] ∈ [--..--] + u ∈ [--..--] + pu ∈ {{ &u }} + s ∈ {0} + ps ∈ {{ &s }} + v ∈ [--..--] + BITF ∈ [--..--] +[value] computing for function main1 <- main. + Called from tests/misc/volatile2.i:102. +tests/misc/volatile2.i:23:[kernel] warning: signed overflow. assert (int)c<<8 ≤ 32767; +tests/misc/volatile2.i:24:[kernel] warning: signed overflow. assert (int)*p<<8 ≤ 32767; +tests/misc/volatile2.i:25:[kernel] warning: signed overflow. assert (int)t[1]<<8 ≤ 32767; +tests/misc/volatile2.i:26:[kernel] warning: signed overflow. assert (int)u.f1<<8 ≤ 32767; +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/volatile2.i:103. +[value] Recording results for main2 +[value] Done for function main2 +[value] computing for function main3 <- main. + Called from tests/misc/volatile2.i:104. +tests/misc/volatile2.i:47:[value] Assertion got status invalid (stopping propagation). +tests/misc/volatile2.i:52:[value] Assertion got status valid. +tests/misc/volatile2.i:55:[value] Assertion got status unknown. +tests/misc/volatile2.i:56:[value] Assertion got status unknown. +tests/misc/volatile2.i:59:[value] Assertion got status valid. +[value] Recording results for main3 +[value] Done for function main3 +[value] computing for function main4 <- main. + Called from tests/misc/volatile2.i:105. +[value] Recording results for main4 +[value] Done for function main4 +[value] computing for function main5 <- main. + Called from tests/misc/volatile2.i:106. +tests/misc/volatile2.i:76:[kernel] warning: signed overflow. assert i+1 ≤ 32767; +tests/misc/volatile2.i:76:[kernel] warning: signed overflow. assert j+1 ≤ 32767; +tests/misc/volatile2.i:76:[kernel] warning: signed overflow. + assert -32768 ≤ tmp+tmp_0 ≤ 32767; + (tmp from i++, tmp_0 from j++) +tests/misc/volatile2.i:78:[kernel] warning: signed overflow. assert i+1 ≤ 32767; +tests/misc/volatile2.i:78:[kernel] warning: signed overflow. assert j+1 ≤ 32767; +tests/misc/volatile2.i:78:[kernel] warning: signed overflow. assert -32768 ≤ i+j ≤ 32767; +[value] DUMPING STATE of file tests/misc/volatile2.i line 80 + t[0..9] ∈ [--..--] + u ∈ [--..--] + pu ∈ {{ &u }} + s ∈ {0} + ps ∈ {{ &s }} + v ∈ [--..--] + i ∈ [--..--] + j ∈ [--..--] + k ∈ [--..--] + tmp ∈ [--..--] + tmp_0 ∈ [--..--] + l ∈ [--..--] + BITF ∈ [--..--] + =END OF DUMP== +[value] Recording results for main5 +[value] Done for function main5 +[value] computing for function main6 <- main. + Called from tests/misc/volatile2.i:107. +[value] Recording results for main6 +[value] Done for function main6 +[value] computing for function main7 <- main. + Called from tests/misc/volatile2.i:108. +[value] Recording results for main7 +[value] Done for function main7 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main1: + c ∈ [--..--] + x ∈ {1} + p ∈ {{ (unsigned char volatile *)&x }} + i ∈ [0..32767] + j ∈ [0..32767] + k ∈ [0..32767] + l ∈ [0..32767] +[value] Values at end of function main2: + i ∈ [-128..127] + j ∈ [0..255] + k ∈ [0..255] +[value] Values at end of function main3: + +[value] Values at end of function main4: + p1 ∈ {{ &i }} + p2 ∈ {{ &i + [--..--] }} +[value] Values at end of function main5: + i ∈ [--..--] + j ∈ [--..--] + k ∈ [--..--] + l ∈ [--..--] +[value] Values at end of function main6: + i ∈ {1} + j ∈ {1} +[value] Values at end of function main7: + i ∈ {-3; -2; -1; 0; 1; 2; 3; 4} + k ∈ [1..16] +[value] Values at end of function main: + +/* Generated by Frama-C */ +struct u { + unsigned char f1 ; + unsigned char f2 ; +}; +struct s { + char i1 ; + char i2 ; +}; +struct bitf { + int i : 3 ; + unsigned int j : 4 ; +}; +unsigned char volatile t[10]; +struct u volatile u; +struct u *pu = (struct u *)(& u); +void main1(void) +{ + unsigned char volatile c; + int x; + unsigned char volatile *p; + unsigned int i; + unsigned int j; + unsigned int k; + unsigned int l; + c = (unsigned char)1; + x = 1; + p = (unsigned char volatile *)(& x); + /*@ assert Value: signed_overflow: (int)c<<8 ≤ 32767; */ + i = (unsigned int)(((int)c << 8) + (int)c); + /*@ assert Value: signed_overflow: (int)*p<<8 ≤ 32767; */ + j = (unsigned int)(((int)*p << 8) + (int)*p); + /*@ assert Value: signed_overflow: (int)t[1]<<8 ≤ 32767; */ + k = (unsigned int)(((int)t[1] << 8) + (int)t[2]); + /*@ assert Value: signed_overflow: (int)u.f1<<8 ≤ 32767; */ + l = (unsigned int)(((int)u.f1 << 8) + (int)u.f2); + return; +} + +struct s s; +struct s volatile *ps = (struct s volatile *)(& s); +void main2(void) +{ + int i; + int j; + int k; + i = (int)ps->i1; + j = (int)u.f1; + k = (int)t[1]; + return; +} + +int volatile v; +void main3(void) +{ + if (v) + /*@ assert \false; */ ; + if (v) + /*@ assert \true; */ ; + /*@ assert v ≡ 0; */ ; + /*@ assert v ≡ 0; */ ; + if (v) + /*@ assert \true; */ ; + return; +} + +void main4(void) +{ + int volatile i; + int volatile *p1; + int volatile * volatile p2; + p1 = & i; + p2 = & i; + return; +} + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int ( /* missing proto */ Frama_C_dump_each)(); + +void main5(void) +{ + int volatile i; + int volatile j; + int k; + int tmp; + int tmp_0; + int l; + i = 0; + j = 0; + { + /*sequence*/ + tmp = i; + /*@ assert Value: signed_overflow: i+1 ≤ 32767; */ + i ++; + tmp_0 = j; + /*@ assert Value: signed_overflow: j+1 ≤ 32767; */ + j ++; + ; + } + /*@ assert Value: signed_overflow: tmp+tmp_0 ≤ 32767; */ + /*@ assert Value: signed_overflow: -32768 ≤ tmp+tmp_0; */ + k = tmp + tmp_0; + { + /*sequence*/ + /*@ assert Value: signed_overflow: i+1 ≤ 32767; */ + i ++; + /*@ assert Value: signed_overflow: j+1 ≤ 32767; */ + j ++; + } + /*@ assert Value: signed_overflow: i+j ≤ 32767; */ + /*@ assert Value: signed_overflow: -32768 ≤ i+j; */ + l = i + j; + Frama_C_dump_each(); + return; +} + +void main6(void) +{ + int i; + int j; + i = 1; + j = i; + return; +} + +struct bitf volatile BITF; +void main7(void) +{ + int i; + int k; + i = BITF.i + 1; + k = (int)BITF.j + 1; + return; +} + +void main(void) +{ + main1(); + main2(); + main3(); + main4(); + main5(); + main6(); + main7(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/volatile.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/volatile.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/volatile.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/volatile.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,218 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/volatile.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +tests/misc/volatile.i:1:[value] warning: global initialization of volatile value ignored +tests/misc/volatile.i:7:[value] warning: global initialization of volatile field ignored +tests/misc/volatile.i:11:[value] warning: global initialization of volatile value ignored +tests/misc/volatile.i:13:[value] warning: global initialization of volatile field ignored +tests/misc/volatile.i:14:[value] warning: global initialization of volatile field ignored +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + F ∈ [--..--] + E ∈ [--..--] + X ∈ [--..--] + Y ∈ [--..--] + pV ∈ {0} + k ∈ {1} + x ∈ {2} + y ∈ {3} + a ∈ {0} + b ∈ {0} + c ∈ {0} + d ∈ {0} + e ∈ {0} + f ∈ {0} + g ∈ {0} + h ∈ {0} + i ∈ {0} + j ∈ {0} + l ∈ {0} + m ∈ {0} + n ∈ {0} + o ∈ {0} + pv ∈ {0} + s1 ∈ {0} + s2.a ∈ {1} + .b ∈ [--..--] + sv1 ∈ [--..--] + sv2 ∈ [--..--] + sv3.a ∈ {3} + .b ∈ [--..--] + sv4.a ∈ {4} + .b ∈ [--..--] + R1 ∈ {0} + R2 ∈ {0} +[value] computing for function main1 <- main. + Called from tests/misc/volatile.i:79. +[value] computing for function fn1 <- main1 <- main. + Called from tests/misc/volatile.i:29. +[value] Called Frama_C_show_each_1([-2147483648..2147483647]) +[value] Called Frama_C_show_each_2([-2147483648..2147483647]) +tests/misc/volatile.i:22:[kernel] warning: signed overflow. assert -2147483648 ≤ x_0+y_0 ≤ 2147483647; +[value] Recording results for fn1 +[value] Done for function fn1 +[value] computing for function fn2 <- main1 <- main. + Called from tests/misc/volatile.i:30. +tests/misc/volatile.i:30:[kernel] warning: Neither code nor specification for function fn2, generating default assigns from the prototype +[value] using specification for function fn2 +[value] Done for function fn2 +[value] Called Frama_C_show_each_d([-2147483648..2147483647]) +tests/misc/volatile.i:42:[kernel] warning: signed overflow. assert -2147483648 ≤ b-c ≤ 2147483647; +tests/misc/volatile.i:43:[kernel] warning: signed overflow. assert -2147483648 ≤ F-F ≤ 2147483647; +tests/misc/volatile.i:45:[kernel] warning: signed overflow. assert -2147483648 ≤ F-g ≤ 2147483647; +tests/misc/volatile.i:46:[kernel] warning: signed overflow. assert F+1 ≤ 2147483647; +tests/misc/volatile.i:47:[kernel] warning: signed overflow. assert 2+F ≤ 2147483647; +tests/misc/volatile.i:48:[kernel] warning: signed overflow. assert -2147483648 ≤ F-l ≤ 2147483647; +tests/misc/volatile.i:49:[kernel] warning: signed overflow. assert -2147483648 ≤ m-l ≤ 2147483647; +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/volatile.i:80. +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function fn1: + __retres ∈ [--..--] +[value] Values at end of function main1: + G ∈ [--..--] + E ∈ [--..--] + X ∈ {2} + Y ∈ [--..--] + pV ∈ {{ &Y }} + k ∈ [--..--] + x ∈ {2} + y ∈ [--..--] + a ∈ {11; 12} + b ∈ [--..--] + c ∈ [--..--] + d ∈ [--..--] + e ∈ [--..--] + f ∈ [--..--] + g ∈ [--..--] + h ∈ {1} + l ∈ [-2147483647..2147483647] + m ∈ [-2147483646..2147483647] + n ∈ [--..--] + o ∈ [--..--] + pv ∈ {{ &X }} + R1 ∈ [--..--] + R2 ∈ [--..--] +[value] Values at end of function main2: + k ∈ {{ NULL ; (int)&X }} + p1 ∈ {{ NULL + [--..--] ; &X + [--..--] }} + p2 ∈ {{ &X + [--..--] }} + p3 ∈ {{ NULL + [--..--] ; &X + [--..--] }} + __retres ∈ {{ NULL + [--..--] ; &X + [--..--] }} +[value] Values at end of function main: + G ∈ [--..--] + E ∈ [--..--] + X ∈ {2} + Y ∈ [--..--] + pV ∈ {{ &Y }} + k ∈ {{ NULL ; (int)&X }} + x ∈ {2} + y ∈ [--..--] + a ∈ {11; 12} + b ∈ [--..--] + c ∈ [--..--] + d ∈ [--..--] + e ∈ [--..--] + f ∈ [--..--] + g ∈ [--..--] + h ∈ {1} + l ∈ [-2147483647..2147483647] + m ∈ [-2147483646..2147483647] + n ∈ [--..--] + o ∈ [--..--] + pv ∈ {{ &X }} + R1 ∈ [--..--] + R2 ∈ [--..--] +[from] Computing for function fn1 +[from] Done for function fn1 +[from] Computing for function main1 +[from] Computing for function fn2 <-main1 +[from] Done for function fn2 +[from] Done for function main1 +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function fn1: + \result FROM x_0; y_0 +[from] Function fn2: + \result FROM \nothing +[from] Function main1: + G FROM G + E FROM \nothing + X FROM x + Y FROM y + pV FROM \nothing + k FROM G + x FROM x + y FROM y + a FROM F + b FROM F + c FROM F + d FROM F + e FROM F + f FROM F + g FROM F + h FROM \nothing + l FROM F + m FROM F + n FROM F + o FROM F + pv FROM \nothing + R1 FROM G + R2 FROM \nothing + \result FROM y +[from] Function main2: + k FROM G + \result FROM G +[from] Function main: + G FROM G + E FROM \nothing + X FROM x + Y FROM y + pV FROM \nothing + k FROM G + x FROM x + y FROM y + a FROM F + b FROM F + c FROM F + d FROM F + e FROM F + f FROM F + g FROM F + h FROM \nothing + l FROM F + m FROM F + n FROM F + o FROM F + pv FROM \nothing + R1 FROM G + R2 FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function fn1: + __retres +[inout] Inputs for function fn1: + \nothing +[inout] Out (internal) for function main1: + G; E; X; Y; pV; k; x; y; a; b; c; d; e; f; g; h; l; m; n; o; pv; R1; R2 +[inout] Inputs for function main1: + G; F; X; Y; pV; x; y; b; c; g; h; l; m; pv +[inout] Out (internal) for function main2: + k; p1; p2; p3; __retres +[inout] Inputs for function main2: + G; k +[inout] Out (internal) for function main: + G; E; X; Y; pV; k; x; y; a; b; c; d; e; f; g; h; l; m; n; o; pv; R1; R2 +[inout] Inputs for function main: + G; F; X; Y; pV; k; x; y; b; c; g; h; l; m; pv diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/volatilestruct.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/volatilestruct.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/volatilestruct.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/volatilestruct.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,38 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/volatilestruct.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + p ∈ {0} + s2 ∈ {0} + x ∈ {0} + y ∈ {0} +tests/misc/volatilestruct.c:33:[value] warning: 2's complement assumed for overflow +tests/misc/volatilestruct.c:34:[value] warning: 2's complement assumed for overflow +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + p ∈ {{ &s2 }} + s2.f4.f1 ∈ {{ &x + [--..--] }} + .f4.f2 ∈ {{ &y + [--..--] }} + {.f4.f3; .f5} ∈ {0} + q1 ∈ {{ &x + [--..--] }} + q2 ∈ {{ &y + [--..--] }} + i ∈ [--..--] + j ∈ {{ &y + [--..--] }} + r ∈ [--..--] + s ∈ [--..--] +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + p FROM \nothing + s2.f4{.f1; .f2} FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + p; s2.f4{.f1; .f2}; q1; q2; i; j; r; s +[inout] Inputs for function main: + p; s2{.f4{.f1; .f2}; .f5} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/widen_non_constant.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/widen_non_constant.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/widen_non_constant.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/widen_non_constant.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,165 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/widen_non_constant.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + N ∈ {24} + A[0..23] ∈ [--..--] + B[0..25] ∈ [--..--] + C[0..23] ∈ [--..--] + t[0..19] ∈ {0} + u[0..39] ∈ {0} +[value] computing for function main1 <- main. + Called from tests/misc/widen_non_constant.i:84. +tests/misc/widen_non_constant.i:10:[value] entering loop for the first time +[value] Called Frama_C_show_each_out({0}) +tests/misc/widen_non_constant.i:12:[value] entering loop for the first time +[value] Called Frama_C_show_each_in({0}, {1}) +[value] Called Frama_C_show_each_in({0}, {1; 2}) +[value] Called Frama_C_show_each_in({0}, {1; 2; 3}) +[value] Called Frama_C_show_each_in({0}, [1..15]) +[value] Called Frama_C_show_each_in({0}, [1..16]) +[value] Called Frama_C_show_each_in({0}, [1..23]) +[value] Called Frama_C_show_each_out({0; 1}) +[value] Called Frama_C_show_each_in({0; 1}, [1..23]) +[value] Called Frama_C_show_each_out({0; 1; 2}) +[value] Called Frama_C_show_each_in({0; 1; 2}, [1..23]) +[value] Called Frama_C_show_each_out({0; 1; 2; 3}) +[value] Called Frama_C_show_each_in({0; 1; 2; 3}, [1..23]) +[value] Called Frama_C_show_each_out({0; 1; 2; 3; 4}) +[value] Called Frama_C_show_each_in({0; 1; 2; 3; 4}, [1..23]) +[value] Called Frama_C_show_each_out([0..15]) +[value] Called Frama_C_show_each_in([0..15], [1..23]) +[value] Called Frama_C_show_each_out([0..16]) +[value] Called Frama_C_show_each_in([0..16], [1..23]) +[value] Called Frama_C_show_each_out([0..22]) +[value] Called Frama_C_show_each_in([0..23], [1..23]) +[value] Recording results for main1 +[value] Done for function main1 +[value] computing for function main2 <- main. + Called from tests/misc/widen_non_constant.i:85. +tests/misc/widen_non_constant.i:26:[value] entering loop for the first time +[value] Called Frama_C_show_each_out({0}) +tests/misc/widen_non_constant.i:28:[value] entering loop for the first time +[value] Called Frama_C_show_each_in({0}, {1}) +[value] Called Frama_C_show_each_in({0}, {1; 2}) +[value] Called Frama_C_show_each_in({0}, {1; 2; 3}) +[value] Called Frama_C_show_each_in({0}, [1..15]) +[value] Called Frama_C_show_each_in({0}, [1..16]) +[value] Called Frama_C_show_each_in({0}, [1..23]) +[value] Called Frama_C_show_each_out({0; 1}) +[value] Called Frama_C_show_each_in({0; 1}, [1..23]) +[value] Called Frama_C_show_each_out({0; 1; 2}) +[value] Called Frama_C_show_each_in({0; 1; 2; 3}, [1..23]) +[value] Called Frama_C_show_each_out([0..15]) +[value] Called Frama_C_show_each_in([0..15], [1..23]) +[value] Called Frama_C_show_each_out([0..16]) +[value] Called Frama_C_show_each_in([0..25], [1..23]) +[value] Called Frama_C_show_each_out([0..22]) +[value] Recording results for main2 +[value] Done for function main2 +[value] computing for function main3 <- main. + Called from tests/misc/widen_non_constant.i:86. +tests/misc/widen_non_constant.i:45:[value] entering loop for the first time +[value] Called Frama_C_show_each_out({0}) +tests/misc/widen_non_constant.i:47:[value] entering loop for the first time +[value] Called Frama_C_show_each_in({0}, {1}) +[value] Called Frama_C_show_each_in({0}, {1; 2}) +[value] Called Frama_C_show_each_in({0}, {1; 2; 3}) +[value] Called Frama_C_show_each_in({0}, [1..15]) +[value] Called Frama_C_show_each_in({0}, [1..16]) +[value] Called Frama_C_show_each_in({0}, [1..23]) +[value] Called Frama_C_show_each_out({0; 1}) +[value] Called Frama_C_show_each_in({0; 1}, [1..23]) +[value] Called Frama_C_show_each_out({0; 1; 2}) +[value] Called Frama_C_show_each_in({0; 1; 2; 3}, [1..23]) +[value] Called Frama_C_show_each_out([0..15]) +[value] Called Frama_C_show_each_in([0..15], [1..23]) +[value] Called Frama_C_show_each_out([0..16]) +[value] Called Frama_C_show_each_in([0..127], [1..23]) +tests/misc/widen_non_constant.i:49:[kernel] warning: out of bounds read. assert \valid_read(p+j); +[value] Called Frama_C_show_each_out([0..22]) +[value] Recording results for main3 +[value] Done for function main3 +[value] computing for function main4 <- main. + Called from tests/misc/widen_non_constant.i:87. +tests/misc/widen_non_constant.i:63:[value] entering loop for the first time +tests/misc/widen_non_constant.i:69:[value] entering loop for the first time +[value] Called Frama_C_show_each({43}) +tests/misc/widen_non_constant.i:75:[value] entering loop for the first time +[value] Called Frama_C_show_each({35; 36; 37; 38; 39; 40; 41; 42}) +[value] Recording results for main4 +[value] Done for function main4 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main1: + i ∈ {24} or UNINITIALIZED + j ∈ {23; 24} +[value] Values at end of function main2: + i ∈ {24; 25} or UNINITIALIZED + j ∈ {23; 24; 25; 26} +[value] Values at end of function main3: + i ∈ [24..127] or UNINITIALIZED + j ∈ [23..512] + p ∈ {{ &C[0] }} +[value] Values at end of function main4: + t[0] ∈ {-1} + [1..19] ∈ [0..18] + u[0..39] ∈ [0..42] + i ∈ {19} + j ∈ {35; 36; 37; 38; 39; 40; 41; 42} + maxi ∈ {19} + maxj ∈ {35} +[value] Values at end of function main: + t[0] ∈ {-1} + [1..19] ∈ [0..18] + u[0..39] ∈ [0..42] +[from] Computing for function main1 +[from] Done for function main1 +[from] Computing for function main2 +[from] Done for function main2 +[from] Computing for function main3 +[from] Done for function main3 +[from] Computing for function main4 +[from] Done for function main4 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main1: + NO EFFECTS +[from] Function main2: + NO EFFECTS +[from] Function main3: + NO EFFECTS +[from] Function main4: + t[0] FROM \nothing + [1..19] FROM \nothing (and SELF) + u[0..39] FROM \nothing (and SELF) +[from] Function main: + t[0] FROM \nothing + [1..19] FROM \nothing (and SELF) + u[0..39] FROM \nothing (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main1: + i; j +[inout] Inputs for function main1: + N; A[0..23] +[inout] Out (internal) for function main2: + i; j +[inout] Inputs for function main2: + N; B[0..25] +[inout] Out (internal) for function main3: + i; j; p +[inout] Inputs for function main3: + N; C[0..23] +[inout] Out (internal) for function main4: + t[0..19]; u[0..39]; i; j; maxi; maxj +[inout] Inputs for function main4: + \nothing +[inout] Out (internal) for function main: + t[0..19]; u[0..39] +[inout] Inputs for function main: + N; A[0..23]; B[0..25]; C[0..23] diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/widen_on_non_monotonic.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/widen_on_non_monotonic.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/widen_on_non_monotonic.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/widen_on_non_monotonic.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,54 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/widen_on_non_monotonic.i (no preprocessing) +tests/misc/widen_on_non_monotonic.i:57:[kernel] warning: Calling undeclared function fn1. Old style K&R code? +tests/misc/widen_on_non_monotonic.i:58:[kernel] warning: Calling undeclared function fn2. Old style K&R code? +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {0} + b ∈ {0} + c ∈ {0} + d ∈ {0} + u ∈ {0} + g ∈ {0} + i ∈ {0} + j ∈ {0} + k ∈ {0} +[value] computing for function main1 <- main. + Called from tests/misc/widen_on_non_monotonic.i:71. +tests/misc/widen_on_non_monotonic.i:25:[value] entering loop for the first time +tests/misc/widen_on_non_monotonic.i:23:[value] entering loop for the first time +tests/misc/widen_on_non_monotonic.i:26:[value] entering loop for the first time +tests/misc/widen_on_non_monotonic.i:27:[kernel] warning: signed overflow. assert -2147483648 ≤ b-1; +tests/misc/widen_on_non_monotonic.i:21:[value] entering loop for the first time +[value] Recording results for main1 +[value] Done for function main1 +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main1: + NON TERMINATING FUNCTION +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function main1 +[from] Non-terminating function main1 (no dependencies) +[from] Done for function main1 +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main1: + NON TERMINATING - NO EFFECTS +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main1: + a; b; c; d +[inout] Inputs for function main1: + a{.f0[bits 0 to 15]; .f1[bits 0 to 15]; .f3}; b; c; d +[inout] Out (internal) for function main: + a; b; c; d +[inout] Inputs for function main: + a{.f0[bits 0 to 15]; .f1[bits 0 to 15]; .f3}; b; c; d diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/wide_string.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/wide_string.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/wide_string.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/wide_string.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,31 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/wide_string.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/misc/wide_string.c:16:[kernel] warning: accessing out of bounds index {4}. assert 4 < 4; +tests/misc/wide_string.c:19:[kernel] warning: accessing out of bounds index {4}. assert 4 < 4; +[value] Recording results for main +[value] done for function main +tests/misc/wide_string.c:16:[value] Assertion 'Value,index_bound' got final status invalid. +tests/misc/wide_string.c:19:[value] Assertion 'Value,index_bound' got final status invalid. +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + p ∈ {{ "bar" }} + q ∈ {{ L"foO" }} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM "bar"{[bits 8 to 15]; [bits 24 to 31]}; + L"foO"{[bits 32 to 63]; [bits 96 to 127]} +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + p; q; c; wc; __retres +[inout] Inputs for function main: + "bar"{[bits 8 to 15]; [bits 24 to 31]}; + L"foO"{[bits 32 to 63]; [bits 96 to 127]} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/with_comment.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/with_comment.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/with_comment.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/with_comment.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/with_comment.i (no preprocessing) +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + HHH ∈ {0} + G ∈ {0} +tests/misc/with_comment.i:20:[value] entering loop for the first time +tests/misc/with_comment.i:21:[kernel] warning: signed overflow. assert G+1 ≤ 2147483647; +[value] Recording results for main2 +[value] done for function main2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main2: + i ∈ {11} + G ∈ [0..2147483647] +[from] Computing for function main2 +[from] Done for function main2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main2: + G FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main2: + i; j; G +[inout] Inputs for function main2: + G diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/wstring_phase6.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/wstring_phase6.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/wstring_phase6.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/wstring_phase6.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,5 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/wstring_phase6.i (no preprocessing) +tests/misc/wstring_phase6.i:9:[kernel] user error: syntax error +[kernel] user error: stopping on file "tests/misc/wstring_phase6.i" that has errors. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle/zerolengtharrays.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle/zerolengtharrays.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle/zerolengtharrays.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle/zerolengtharrays.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/misc/zerolengtharrays.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + T[bits 0 to 31] ∈ {4} + [bits 32 to 63] ∈ {5} + [8..99] ∈ UNINITIALIZED + F ∈ {{ (struct foo *)&T }} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + T[0..7]; F +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/misc/oracle_cabscond/cabscond.res.oracle frama-c-20150201+sodium+dfsg/tests/misc/oracle_cabscond/cabscond.res.oracle --- frama-c-20140301+neon+dfsg/tests/misc/oracle_cabscond/cabscond.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/oracle_cabscond/cabscond.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,96 @@ +[kernel] Computing Branches +[kernel] preprocessing with "gcc -C -E -I. tests/misc/cabscond.c" +/* Generated by Frama-C */ +extern int f(int); +int test(int a, int b, int c) +{ + int __retres; + int tmp; + int tmp_2; + tmp = f(a); + /*[CID:0] IF ((here && !(_)) || _) */ + if (tmp) { + int tmp_0; + tmp_0 = f(b); + /*[CID:0] IF ((_ && !(here)) || _) */ + if (tmp_0) { goto _LAND; } + else { goto _LOR; } + } + else { + int tmp_1; + _LAND: /* internal */ tmp_1 = f(c); + /*[CID:0] IF ((_ && !(_)) || here) */ + if (tmp_1) { + _LOR: /* internal */ + /*[THEN:0]*/ + __retres = 0; + goto return_label; + } + else { /*[ELSE:0]*/ __retres = 1; goto return_label; } + } + tmp_2 = f(a); + /*[CID:1] IF ((here && !(_)) || _) */ + if (tmp_2) { + int tmp_3; + tmp_3 = f(a); + /*[CID:1] IF ((_ && !(here)) || _) */ + if (tmp_3) { goto _LAND_0; } + else { goto _LOR_0; } + } + else { + int tmp_4; + _LAND_0: /* internal */ tmp_4 = f(a); + /*[CID:1] IF ((_ && !(_)) || here) */ + if (tmp_4) { + _LOR_0: /* internal */ + /*[THEN:1]*/ + __retres = 0; + goto return_label; + } + else { /*[ELSE:1]*/ __retres = 1; goto return_label; } + } + while (1) { + int tmp_5; + tmp_5 = f(a); + /*[CID:2] WHILE ((here && !(_)) || _) */ + if (tmp_5) { + int tmp_6; + tmp_6 = f(a); + /*[CID:2] WHILE ((_ && !(here)) || _) */ + if (tmp_6) { goto _LAND_1; } + } + else { + int tmp_7; + _LAND_1: /* internal */ tmp_7 = f(c); + /*[CID:2] WHILE ((_ && !(_)) || here) */ + if (! tmp_7) { /*[ELSE:2]*/ break; } + } + __retres = 0; + goto return_label; + } + a = 0; + while (1) { + int tmp_8; + tmp_8 = f(a); + /*[CID:3] FOR ((here && !(_)) || _) */ + if (tmp_8) { + int tmp_9; + tmp_9 = f(b); + /*[CID:3] FOR ((_ && !(here)) || _) */ + if (tmp_9) { goto _LAND_2; } + } + else { + int tmp_10; + _LAND_2: /* internal */ tmp_10 = f(c); + /*[CID:3] FOR ((_ && !(_)) || here) */ + if (! tmp_10) { /*[ELSE:3]*/ break; } + } + __retres = 0; + goto return_label; + a += c; + } + return_label: /* internal */ + return (__retres); +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/origin.i frama-c-20150201+sodium+dfsg/tests/misc/origin.i --- frama-c-20140301+neon+dfsg/tests/misc/origin.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/origin.i 2015-05-28 08:53:24.000000000 +0000 @@ -50,6 +50,7 @@ void origin_misalign_2(void) { pm2 = *(int**)(2 + (char *) Tm2); qm2 = pm2+1; + Frama_C_show_each(qm2); *qm2 = (int)&a; } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/outside_builtin_callwise.i frama-c-20150201+sodium+dfsg/tests/misc/outside_builtin_callwise.i --- frama-c-20140301+neon+dfsg/tests/misc/outside_builtin_callwise.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/outside_builtin_callwise.i 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -/* run.config - DONTRUN: OPT: -inout-callwise -val-builtin strlen:Frama_C_strlen -val -*/ - -int strlen () -{ - return 0; -} - -int main () -{ - strlen(); // note that we pass the wrong number of arguments, - // causing Db.Value.Outside_builtin_possibilities to be raised. -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/overflow_cast_float_int.i frama-c-20150201+sodium+dfsg/tests/misc/overflow_cast_float_int.i --- frama-c-20140301+neon+dfsg/tests/misc/overflow_cast_float_int.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/overflow_cast_float_int.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,3 +1,7 @@ +/* run.config + STDOPT: +" -all-rounding-modes -then -no-all-rounding-modes" +*/ + volatile v; int main() diff -Nru frama-c-20140301+neon+dfsg/tests/misc/period.c frama-c-20150201+sodium+dfsg/tests/misc/period.c --- frama-c-20140301+neon+dfsg/tests/misc/period.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/period.c 2015-05-28 08:53:24.000000000 +0000 @@ -50,6 +50,7 @@ int *p = &g + (int)&g; *p = 1; + p = &g + (int)&g; int vg = *p; *p = &vg; } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/pointer_arg.i frama-c-20150201+sodium+dfsg/tests/misc/pointer_arg.i --- frama-c-20140301+neon+dfsg/tests/misc/pointer_arg.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/pointer_arg.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,12 +1,16 @@ +volatile int v; + int main(char*arg,int argc,char *argv[2]) { arg[0] = 0; arg[1] = 1; - arg[2] = 1; + if (v) { arg[2] = 1;} if (!argc) arg[1000]=1000; arg[argc] = 4; - argv[1] = "5069"; - argv[0] = "5069"; + if (v) { + argv[1] = "5069"; + argv[0] = "5069"; + } argv[0][0] = '0'; } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/precise_locations.i frama-c-20150201+sodium+dfsg/tests/misc/precise_locations.i --- frama-c-20140301+neon+dfsg/tests/misc/precise_locations.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/precise_locations.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,5 +1,5 @@ /* run.config - STDOPT: +"-input -out -inout -then -plevel 250 -then -wlevel 56" + STDOPT: +"-input -out -inout -report -then -plevel 250 -then -wlevel 56" */ struct s { diff -Nru frama-c-20140301+neon+dfsg/tests/misc/precond.c frama-c-20150201+sodium+dfsg/tests/misc/precond.c --- frama-c-20140301+neon+dfsg/tests/misc/precond.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/precond.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,5 +1,5 @@ /* run.config - OPT: -load-module lib/plugins/Report -lib-entry -val -then -report -report-print-properties + OPT: -load-module lib/plugins/Report -lib-entry -val -then -report -report-print-properties -then -report-no-specialized */ diff -Nru frama-c-20140301+neon+dfsg/tests/misc/realloc.c frama-c-20150201+sodium+dfsg/tests/misc/realloc.c --- frama-c-20140301+neon+dfsg/tests/misc/realloc.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/realloc.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -/*@ assigns ((char*)\result)[0..s-1] \from ((char*)p)[0..s-1]; */ -void *Frama_C_realloc(void *p, unsigned long s); - -int main(int c){ - int *p = Frama_C_alloc_size(sizeof(int)); - *p = 17; - int *pp = p; - Frama_C_dump_each(); - int *q = Frama_C_realloc(p, 2 * sizeof(int)); - Frama_C_dump_each(); -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/recol.c frama-c-20150201+sodium+dfsg/tests/misc/recol.c --- frama-c-20140301+neon+dfsg/tests/misc/recol.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/recol.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,6 +1,6 @@ /* run.config - OPT: -val -slevel 100 -cpp-command "gcc -C -E -DPTEST " -journal-disable -no-warn-signed-overflow - OPT: -val -slevel 100 -cpp-command "gcc -C -E -DPTEST " -journal-disable -machdep ppc_32 -no-warn-signed-overflow + OPT: -val -slevel 100 -cpp-extra-args="-DPTEST " -journal-disable -no-warn-signed-overflow + OPT: -val -slevel 100 -cpp-extra-args="-DPTEST " -journal-disable -machdep ppc_32 -no-warn-signed-overflow */ #ifndef PTEST diff -Nru frama-c-20140301+neon+dfsg/tests/misc/reduce_by_valid.i frama-c-20150201+sodium+dfsg/tests/misc/reduce_by_valid.i --- frama-c-20140301+neon+dfsg/tests/misc/reduce_by_valid.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/reduce_by_valid.i 2015-05-28 08:53:24.000000000 +0000 @@ -7,8 +7,9 @@ ts u[5]; volatile unsigned int v; +volatile signed int sv; -void f () { +void main1 () { long *p = &t[v]; //@ assert \valid(p+3); p[3]=1; @@ -19,7 +20,7 @@ q = q; } -void g() { +void main2() { ts *p = &u[v]; ts *q = ((int*)&u[v])+1; ts *r = ((int*)&u[v])+1; @@ -41,7 +42,7 @@ -void h(unsigned int c1, unsigned int c2) { +void main3(unsigned int c1, unsigned int c2) { int *p = &t[c1]; int *q = &c2; //@ assert \valid(\union(q, q)); @@ -49,7 +50,7 @@ p = p; } -void i(unsigned int c1, unsigned int c2, unsigned int c3, unsigned int c4) { +void main4(unsigned int c1, unsigned int c2, unsigned int c3, unsigned int c4) { //@ assert \valid(&t[c1]); //@ assert \valid(&t[c2]); int *p = &t[0]; @@ -62,7 +63,7 @@ c4 = c4; } -void j() { +void main5() { int y; int *q = &y; int *p; @@ -98,16 +99,173 @@ requires \valid(p->f1); requires \valid(p->f1); */ -void k(struct s *p) { +void main6(struct s *p) { *(p->f1)=1; } +void main7 () { + int t7_1[10]; + + int *p = t7_1; + + //@ assert !\valid(p+(0..1000)); + //@ assert !\valid(p+(-1..9)); + //@ assert \valid(p+(0..9)); + + int t7_2[10000]; + p = t7_2; + //@ assert !\valid(p+(0..10000)); + + p = t7_2+v; + //@ assert \valid(p+(-5..250)); + //@ assert \valid(p+(-5..250)); +} + +void main8 () { + int t8_1[10]; + int t8_2[20]; + int *tp[4]; + + tp[0] = t8_1; + tp[1] = t8_1+v; + tp[2] = t8_2+v; + tp[3] = v ? t8_1+v : t8_2+v; + + int **p = &tp; + + if (v) { + //@ assert \valid(p[0..3]); + //@ assert \valid(p[0..3]); // Reduction succeeds + } + if (v) { + //@ assert \valid(tp[0..3]); + //@ assert \valid(tp[0..3]); // Same + } + + if (v) { + //@ assert \valid(tp[0..3]+1); + //@ assert \valid(tp[0..3]+1); // Not written yet + + } +} + +void main9() { + struct s { + int a; + int b; + char t[100]; + }; + + char tc[sizeof(struct s) + 50]; + struct s* p = tc + v - 100; + + //@ assert \valid(&p->t[0..99]); + p->t[0] = 1; + p->t[99] = 2; + //@ assert \valid(&p->t[0..99]); + +} + +void main10() { + char t[40]; + char *p; + int u[20]; + int *q; + + p = &t[sv]; + *((int *)p) = 1; + Frama_C_show_each_main10_1(p); + //@ assert \valid((int *)p); + + p = &t[sv]; + *((int *)p+2) = 2; + Frama_C_show_each_main10_2(p); + //@ assert \valid(((int *)p)+2); + + p = &t[sv]; + *((int *)(p+2)) = 1; // TODO + Frama_C_show_each_main10_3(p); + //@ assert \valid((int *)(p+2)); + + + struct s { + int a; + int b; + }; + + p = &t[sv]; + ((struct s *)p)->b = 4; + Frama_C_show_each_main10_4(p); + ((struct s *)p)->b = 4; + //@ assert \valid(&(((struct s *)p)->b)); + + p = &t[sv]; + ((struct s *)p+2)->b = 4; + Frama_C_show_each_main10_4(p); + ((struct s *)p+2)->b = 4; + //@ assert \valid(&(((struct s *)p+2)->b)); + + + q = (int*)(((char*)&u)+sv); + *((char *)q) = 1; + Frama_C_show_each(q); + *((char *)q) = 1; + //@ assert \valid((char *)q); + + q = (int*)(((char*)&u)+sv); + *((char *)q+2) = 1; + Frama_C_show_each(q); + *((char *)q+2) = 1; + //@ assert \valid((char *)q+2); + +} + +void main11() { + char TC[500]; + char * p = TC+10; + int off = v; + int len = v; + //@ assert 0 <= off <= 400 && 200 <= len <= 400; + p = p + off; + Frama_C_show_each(p); + //@ assert \valid(p+(0 .. len-1)); + + int TU[500]; + int * q = TU+10; + off = v; + len = v; + //@ assert 0 <= off <= 400 && 200 <= len <= 400; + q = q + off; + Frama_C_show_each(q); + //@ assert \valid(q+(0 .. len-1)); + + p = TU+10; + off = v; + len = v; + //@ assert 0 <= off <= 800 && 1800 <= len <= 2200; + p = p + off; + Frama_C_show_each(p); + //@ assert \valid(p+(0 .. len-1)); + + q = TC+10; + off = v; + len = v; + //@ assert 0 <= off <= 100 && 50 <= len <= 100; + q = q + off; + Frama_C_show_each(q); + //@ assert \valid(q+(0 .. len-1)); +} void main () { - f(); - g(); - h(v,v); - i(v,v,v,v); - j(); - k(vs); + main1(); + main2(); + main3(v,v); + main4(v,v,v,v); + main5(); + main6(vs); + main7(); + main8(); + main9(); + main10(); + main11(); } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/reduce_formals.i frama-c-20150201+sodium+dfsg/tests/misc/reduce_formals.i --- frama-c-20140301+neon+dfsg/tests/misc/reduce_formals.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/reduce_formals.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,65 @@ +void main1(int i, int j, int k) { + //@ assert i >= 5; + j = j/7+3; + if (k <= 7) + while (1); +} + +//@ requires i >= 6; assigns \nothing; +void main2(int i); + +void f_main3 (int * p, int a) { + *p += a; +} + +void main3 (void) { + long x = 3; + long * p = &x; + //@ assert sizeof(long) == sizeof(int); + f_main3 (p, x); // go through the casts on p and x + Frama_C_show_each(x); +} + +void f_main4_1 (float f) { + //@ assert f >= 10; +} + +void f_main4_2 (unsigned int f) { + //@ assert f <= 20; +} + +void main4 (int v) { + if (v <= 15) { + f_main4_1(v); + Frama_C_show_each_v(v); // no reduction for now, because of cast + } else { + f_main4_2(v); + Frama_C_show_each_v(v); // same + } +} + +int f_main_2() { + return 0; +} + + +void f_main_1(int v) { + v = f_main_2(); +} + +void main5() { + int l = 2; + f_main_1(l); // no reduction here, l is written in f_main_1 +} + +void main(int v, int w, int x, int y, int z) { + main1(x, y, z); + main2(w); + + Frama_C_dump_each(); // i, j, k must have been removed. + // w, x and z should have been reduced. + + main3(); + main4(v); + main5(); +} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/reevaluate_alarms.i frama-c-20150201+sodium+dfsg/tests/misc/reevaluate_alarms.i --- frama-c-20140301+neon+dfsg/tests/misc/reevaluate_alarms.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/reevaluate_alarms.i 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,46 @@ +/* run.config + STDOPT: +"-load-module lib/plugins/Report -report -then -slevel 10" +*/ + + +int S=0; +int T[5]; +int n = 1; + +void loop () { + int i; + int *p = &T[0] ; + for (i=0; i<5; i++) + { S = S+i; *p++ = S; } + return S; +} + +void compute_n () { + for (int i=1; i <= 5; i++) { + n *= i; + } +} + +void init_p (int *p) { + if (n == 120) + *p = 0; +} + +void initialized_p (int *p) { + int x = *p + 1; +} + +int main(void) { + loop (); + + compute_n (); + + int x, y; + + init_p (&x); + initialized_p (&x); + + init_p (&y); + initialized_p (&y); +} + diff -Nru frama-c-20140301+neon+dfsg/tests/misc/replace_by_show_each.c frama-c-20150201+sodium+dfsg/tests/misc/replace_by_show_each.c --- frama-c-20140301+neon+dfsg/tests/misc/replace_by_show_each.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/replace_by_show_each.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +/* run.config + OPT: -val -inout-callwise -inout -calldeps +*/ + +#define show_each_1 Frama_C_show_each_1 +#define show_each_2 Frama_C_show_each_2 + +void show_each_1() { +} + +void show_each_2() { +} + + +//@ assigns \nothing; +void Frama_C_show_each_2(); + +int x = 0; + + +int main(int j) { + int i = 1; + show_each_2(); + i = 2; + show_each_1(); + return i = (j+1); +} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/serv.i frama-c-20150201+sodium+dfsg/tests/misc/serv.i --- frama-c-20140301+neon+dfsg/tests/misc/serv.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/serv.i 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -/* run.config - DONTRUN: cannot find entry point: main -*/ - -void f1() { - f3(); -} - -void f2() { - f4(); -} - -void f3() { - f4 (); -} - -void f4() { - f3 (); -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/shift.i frama-c-20150201+sodium+dfsg/tests/misc/shift.i --- frama-c-20140301+neon+dfsg/tests/misc/shift.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/shift.i 2015-05-28 08:53:24.000000000 +0000 @@ -17,11 +17,19 @@ f= -255; if ((c<=3) && (c>=0)) { c = 2*c-1; + int cc = c; a = 157 << c; + //@ assert c >= 0; // Reduction by the alarm on RHS + c = cc; d=1975; d = d >> c; + //@ assert c >= 0; // Reduction by the alarm on RHS + c = cc; f= -1975; f = f >> c; + c = cc; + c = c << 3; + //@ assert c >= 0; // Reduction by the alarm on LHS } if (z & 1) z=1<<32; diff -Nru frama-c-20140301+neon+dfsg/tests/misc/sign_of_bitfiled_int.c frama-c-20150201+sodium+dfsg/tests/misc/sign_of_bitfiled_int.c --- frama-c-20140301+neon+dfsg/tests/misc/sign_of_bitfiled_int.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/sign_of_bitfiled_int.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,6 +1,6 @@ /* run.config - OPT: -val -cpp-command "gcc -C -E -DPTEST" -journal-disable - OPT: -machdep ppc_32 -val -cpp-command "gcc -C -E -DPTEST" -journal-disable + OPT: -val -cpp-extra-args="-DPTEST" -journal-disable + OPT: -machdep ppc_32 -val -cpp-extra-args="-DPTEST" -journal-disable */ diff -Nru frama-c-20140301+neon+dfsg/tests/misc/split_return.i frama-c-20150201+sodium+dfsg/tests/misc/split_return.i --- frama-c-20140301+neon+dfsg/tests/misc/split_return.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/split_return.i 2015-05-29 15:31:43.000000000 +0000 @@ -1,6 +1,8 @@ /* run.config - STDOPT: +"-slevel-function init:3,main1:3,f2:4,main2:4,f4:3,main5:3" +"-val-split-return-function f2:0,f3:-2,f4:4,f5:-2" +"-then -report" - STDOPT: +"-slevel 6" +"-val-split-return-auto" +"-then -report" + STDOPT: +"-slevel-function init:3,main1:3,f2:4,main2:4,f4:3,main5:3 -val-split-return-function f2:0,f3:-2:-4,f4:4,f5:-2,NON_EXISTING:4 -permissive -then -report" + STDOPT: +"-slevel 6 -val-split-return-auto -val-split-return-function f7:0:3 -then -report" + COMMENT: below command must fail, as -permissive is not set + STDOPT: +"-slevel-function NON_EXISTING:4" */ /*@ assigns \result \from \nothing; assigns *p \from \nothing; @@ -130,6 +132,23 @@ } } +volatile v; +int v7; + +int* f7() { + if (v) { v7 = 0; return 0; } + else { v7 = 1; return &v; } +} + +void main7() { + int* p = f7(); + if (p == (void*)0) { + + } else { + } + Frama_C_show_each_NULL(p, v7); +} + void main() { main1(); main2(); @@ -137,4 +156,5 @@ main4(); // not enough slevel in main4. No warning main5(); // no need for slevel, because we do not fuse on return instr main6(); + main7(); } diff -Nru frama-c-20140301+neon+dfsg/tests/misc/strlen.c frama-c-20150201+sodium+dfsg/tests/misc/strlen.c --- frama-c-20140301+neon+dfsg/tests/misc/strlen.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/strlen.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -/* run.config - STDOPT: -*/ -#include "share/builtin.h" - -const char* static_str = "Hello World\n"; -const char* zero_str = "abc\0\0\0abc"; - -#define TSZ 12 -const char* tab_str[TSZ] = - { - "" , // 0 - "a", // 1 - "aa" , // 2 - "aaa" , // 3 - "aaaa" , // 4 - "aaaaa" , // 5 - "aaaaaa" , // 6 - /* hole */ - "aaaaaaaaa" , // 9 - "aaaaaaaaaa" , - "aaaaaaaaaaa", - "aaaaaaaaaaaa" , - "aaaaaaaaaaaaa" }; // 13 - -char unterminated_string[12] = "unterminated"; - -int main (int c) { - const char* loc_str = "Bonjour Monde\n"; - char loc_char_array[5]; - size_t sz1,sz2,sz3,sz4,sz5, szu; - int x = 0xabcdef00; - int z = 0x12345600; - int i; - char *str; - - if (c & 1) - { - szu = Frama_C_strlen(unterminated_string); - Frama_C_dump_each(); - } - - str = Frama_C_nondet(0,1) ? static_str : loc_str; - sz1 = Frama_C_strlen(str); - //@ assert(sz1 == 12) || (sz1 == 14); - str = &x; - str = Frama_C_nondet(0,1) ? str : str + 3; - sz2 = Frama_C_strlen(str); - //@ assert(sz2 == 0) ; // no, could also do an RTE - i = Frama_C_interval(0,TSZ-1); - str = tab_str[i]; - sz3 = Frama_C_strlen(str); - //@ assert (sz3 >= 0) && (sz3 <= 13); - loc_char_array[3] = '\0'; - sz4 = Frama_C_strlen(loc_char_array); - //@ assert (sz4 >=0) && (sz4 <=3); - sz5 = Frama_C_strlen(zero_str); - //@ assert(sz5 == 3); - return 0; -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/strnlen.i frama-c-20150201+sodium+dfsg/tests/misc/strnlen.i --- frama-c-20140301+neon+dfsg/tests/misc/strnlen.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/strnlen.i 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ - -unsigned long Frama_C_strnlen(char *, unsigned long); - -char t1[5] = "abcde"; -char t2[] = "abcde"; - -main(int c){ - int r1a, r1b, r1c, r2a, r2b, r2c; - r1a = Frama_C_strnlen(t1, 3); - r1b = Frama_C_strnlen(t1, 5); - if (c & 1) r1c = Frama_C_strnlen(t1, 6); - - r2a = Frama_C_strnlen(t2, 3); - r2b = Frama_C_strnlen(t2, 5); - r2c = Frama_C_strnlen(t2, 6); - - Frama_C_dump_each(); -} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/test_config frama-c-20150201+sodium+dfsg/tests/misc/test_config --- frama-c-20140301+neon+dfsg/tests/misc/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/test_config 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1 @@ +CMD: FRAMAC_PLUGIN=tests/.empty @frama-c@ \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/tests/misc/tests.sh frama-c-20150201+sodium+dfsg/tests/misc/tests.sh --- frama-c-20140301+neon+dfsg/tests/misc/tests.sh 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/tests.sh 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,63 @@ +#!/bin/sh + +if [ $# -lt 5 ] ; then + echo "tests/tests.sh: a subshell invoked by default to perform testing run." + exit 1 +fi + +DIFF="diff -b -B" + +Compare() { + if [ -e $1$2 ]; then + File=`basename $1$2 .log`.oracle + Dir=`dirname $1` + Dir=`dirname $Dir` + File="$Dir/oracle/$File" + if [ -e ${File} ]; then + if ! ${DIFF} --brief $1$2 ${File} >/dev/null + then + echo ". KO: ${DIFF} $1$2 ${File}" + fi + else + echo ". NO oracle ${File}" + fi + fi +} + +# input file +Src=$1 +shift + +# prefix for the out files +PreFix=$1 +shift + +# extension for out files issued from stdout +PostFix1=$1 +shift + +# extension for out files issued from stderr +PostFix2=$1 +shift + +# command running the test +Cmd=$1 +shift + +# check the compilation of the source code. +gcc -c ${Src} -o ${PreFix}.o 2> /dev/null +Res=$? +rm -f ${PreFix}.o +if [ "${Res}" != 0 ] ; then + echo "# compilation problem with: gcc -c ${Src} -o ${PreFix}.o" +fi + +# run the test on the input file +echo "${Cmd} $* ${Src}" +${Cmd} $* ${Src} > ${PreFix}${PostFix1} 2> ${PreFix}${PostFix2} +Res=$? +if [ "${Res}" != 0 ] ; then + exit ${Res} +fi +Compare ${PreFix} ${PostFix1} stdout +Compare ${PreFix} ${PostFix2} stderr \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/tests/misc/tricky_logic.i frama-c-20150201+sodium+dfsg/tests/misc/tricky_logic.i --- frama-c-20140301+neon+dfsg/tests/misc/tricky_logic.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/tricky_logic.i 2015-05-28 08:53:24.000000000 +0000 @@ -21,6 +21,7 @@ x = 4; y = 5; //@ assert \at(x == 2 && y == 3, Pre) && x == 4 && y == 5; + //@ assert x == 4+\at(x, Init); } @@ -52,7 +53,7 @@ //@ assert \initialized{Pre}(q); } - +//@ requires x==\at(x,Init)==0; void main() { f1(); diff -Nru frama-c-20140301+neon+dfsg/tests/misc/unknown_sizeof.i frama-c-20150201+sodium+dfsg/tests/misc/unknown_sizeof.i --- frama-c-20140301+neon+dfsg/tests/misc/unknown_sizeof.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/unknown_sizeof.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,24 @@ +/* run.config + OPT: -val -main main1 + OPT: -val -main main2 +*/ + +struct s; + +struct s s; + +void f(struct s) { // Argument has unknown size + return; +} + +struct s g() { + return *(struct s*)((char*)(&s)+1); // Return has unknown size +} + +void main1() { + g(); +} + +void main2() { + f(*(struct s*)((char*)(&s)+1)); +} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/use_spec.i frama-c-20150201+sodium+dfsg/tests/misc/use_spec.i --- frama-c-20140301+neon+dfsg/tests/misc/use_spec.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/use_spec.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,6 +1,6 @@ /* run.config - OPT: -val-use-spec f,g,h,i,k -val -inout -inout-callwise -calldeps - OPT: -val-use-spec f,g,h,i,k -val -inout -inout-callwise -calldeps -show-indirect-deps + OPT: -val-use-spec f,h -val -inout -inout-callwise -calldeps + OPT: -val-use-spec f,h -val -inout -inout-callwise -calldeps -show-indirect-deps */ diff -Nru frama-c-20140301+neon+dfsg/tests/misc/video_detect.i frama-c-20150201+sodium+dfsg/tests/misc/video_detect.i --- frama-c-20140301+neon+dfsg/tests/misc/video_detect.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/video_detect.i 2015-05-29 15:31:43.000000000 +0000 @@ -1,3 +1,7 @@ +/* run.config + STDOPT: +"-absolute-valid-range 0x20-0x23" +*/ + int G; typedef short u16; diff -Nru frama-c-20140301+neon+dfsg/tests/misc/volatile2.i frama-c-20150201+sodium+dfsg/tests/misc/volatile2.i --- frama-c-20140301+neon+dfsg/tests/misc/volatile2.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/volatile2.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,109 @@ +/* run.config + OPT: -print -val -machdep x86_16 +*/ + + +volatile unsigned char t[10]; +struct u { unsigned char f1; unsigned char f2;}; +volatile struct u u; + +struct u * pu = &u; // Cast: remove volatile qualifier + +void main1() { + volatile unsigned char c = 1; + + int x = 1; + volatile unsigned char *p = &x; + /* The computation c << 8 overflows: c is promoted to _signed_ int, + hence there is an overflow on 16 bits architecture. However, the + entire computation does NOT overflow. c << 8 is NOT volatile (it + is an expression), hence the last 8 bits are not set and the sum + does not overflow. We check this for all kinds of lvalues, as + they correspond to different branches of Cabs2cil. */ + unsigned int i = (c << 8) + c; + unsigned int j = (*p << 8) + *p; + unsigned int k = (t[1] << 8) + t[2]; + unsigned int l = (u.f1 << 8) + u.f2; +} + +struct s { + char i1; + char i2; +} s; + +volatile struct s *ps = &s; // Cast: add volatile qualifier + +void main2() { + // i and s are not volatile, but the access ps->i1 is. + int i = ps->i1; + int j = u.f1; // this field access is volatile + int k = t[1]; +} + +volatile int v; + +void main3() { + if (v) { + //@ assert \false; + } + + if (v) { + // Should be reachable: v must not be reduced by the 'if(v)' + //@ assert \true; + } + + //@ assert v == 0; + //@ assert v == 0; + if (v) { + // Same + //@ assert \true; + } +} + +void main4() { + volatile int i; + + volatile int * p1 = &i; // No cast, &i has volatile qualifier + volatile int * volatile p2 = &i; // No cast needed either. However, p2 itself + // is also is volatile +} + + +void main5() { + + volatile int i = 0; + volatile int j = 0; + int k = i++ + j++; + + int l = ++i + ++j; + + Frama_C_dump_each(); +} + +void main6() { + int i = 1; + int j = (volatile int)i; // The cast can be dismissed: C99 6.5.4:4, note 86 +} + +struct bitf { + int i: 3; + unsigned j: 4; +}; + +volatile struct bitf BITF; + +void main7() { + int i = BITF.i + 1; + int k = BITF.j + 1; +} + + +void main() { + main1(); + main2(); + main3(); + main4(); + main5(); + main6(); + main7(); +} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/widen_non_constant.i frama-c-20150201+sodium+dfsg/tests/misc/widen_non_constant.i --- frama-c-20140301+neon+dfsg/tests/misc/widen_non_constant.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/widen_non_constant.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,88 @@ +// NOT defined as a constant. This file tests complicated widenings in presence +// of non-obvious bounds +int N = 24; + +extern int A[24], B[26], C[24]; + +void main1() { + int i, j; + + for (j=0; j A[j]) { + // Swap + } + } + } +} + +// Same as maiN1, except that the array is a bit larger. Ideally, we would +// infer the tight bound, not the size of B +void main2() { + int i, j; + + for (j=0; j B[j]) { + // Swap + } + } + } +} + +// Same again, except that we access the array through an indirection. Our +// Syntactic heuristic does not work here, we should infer something directly +// from N +void main3() { + int i, j; + + int *p = C; + + for (j=0; j p[j]) { + // Swap + } + } + } +} + +int t[20]; +int u[40]; + +void main4() { + int i, j; + + int maxi = 19; + for (i = 0; i < maxi; i++) { + t[i+1] = i; + } + t[i-maxi] = -1; // Optimal, inferred from t[i+1] + + int maxj = 40+3; + for (j = 3; j < maxj; j++) { + u[j-3] = j; + } + Frama_C_show_each(j); // Optimal, inferred from u[j-3] + + maxj = 35; + for (j = 4; j < maxj; j++) { + u[j-4] = j+1; + } + Frama_C_show_each(j); // Not optimal, inferred from u[j-4]. Could be improved + // by considering j < maxj instead +} + + +void main() { + main1(); + main2(); + main3(); + main4(); +} diff -Nru frama-c-20140301+neon+dfsg/tests/misc/zerolengtharrays.i frama-c-20150201+sodium+dfsg/tests/misc/zerolengtharrays.i --- frama-c-20140301+neon+dfsg/tests/misc/zerolengtharrays.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/misc/zerolengtharrays.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,10 @@ +/* This is a test for the zero-sized arrays of GCC. */ +struct foo { int x; int y[0]; }; +struct bar { struct foo z; }; + +void main() { +unsigned char T[100]; + struct foo * F=T; + F->x=4; + F->y[0]=5; +} diff -Nru frama-c-20140301+neon+dfsg/tests/more_wp/Makefile frama-c-20150201+sodium+dfsg/tests/more_wp/Makefile --- frama-c-20140301+neon+dfsg/tests/more_wp/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/more_wp/Makefile 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,137 @@ +########################################################################## +# # +# This file is part of Frama-C. # +# # +# Copyright (C) 2007-2009 # +# CEA (Commissariat l'nergie Atomique) # +# INRIA (Institut National de Recherche en Informatique et en # +# Automatique) # +# # +# 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 v2.1 # +# for more details (enclosed in the file licenses/LGPLv2.1). # +# # +########################################################################## + +FD=../.. +WD=$(FD)/tests/more_wp +WHYDIR=$(FD)/why + +EXEC=$(FD)/bin/toplevel.opt +CMD=FRAMAC_SHARE=$(FD)/share WHYLIB=$(WHYDIR)/lib WHYBIN=$(WHYDIR)/bin/why.opt WHYDP=$(WHYDIR)/bin/why-dp.opt $(EXEC) -journal-disable -wp-verbose 1 -wp-no-bot -wp-proof +#CMD=FRAMAC_SHARE=$(FD)/share $(EXEC) -journal-disable -wp-verbose 1 + +all : res_0 res_2 + +.PHONY : all + +JD=$(FD)/tests/jessie +JFILES=$(wildcard $(JD)/*.c) + +WP_FILES=$(JFILES:$(JD)/%.c=$(WD)/%.X) +STATUS=valid invalid unknown timeout failure +RES_FILES=$(STATUS:%=%.X) failed.X errors.X + +LOG_0=$(WP_FILES:%.X=%.0.log) +ERR_0=$(WP_FILES:%.X=%.0.err) +RES_0 = $(RES_FILES:%.X=%.0) +.PRECIOUS : $(LOG_0) $(ERR_0) +.PHONY : RES_0 + +LOG_0 : $(LOG_0) +ERR_0 : $(ERR_0) +RES_0 : $(RES_0) + +LOG_2=$(WP_FILES:%.X=%.2.log) +ERR_2=$(WP_FILES:%.X=%.2.err) +RES_2 = $(RES_FILES:%.X=%.2) +.PRECIOUS : $(LOG_2) $(ERR_2) +.PHONY : RES_2 + +LOG_2 : $(LOG_2) +ERR_2 : $(ERR_2) +RES_2 : $(RES_2) + +LOG_0 ERR_0 LOG_2 ERR_2 : + # we need to have a way to store the timestamp + touch $@ + +$(WD)/%.0.log $(WD)/%.0.err : $(JD)/%.c $(EXEC) + -$(CMD) -wp-mm 0 $< > $(WD)/$*.0.log 2> $(WD)/$*.0.err + +$(WD)/%.2.log $(WD)/%.2.err : $(JD)/%.c $(EXEC) $(WD)/%.2.no + @echo "Don't run test M2 for $<" + touch $@ + +$(WD)/%.2.log $(WD)/%.2.err : $(JD)/%.c $(EXEC) + -$(CMD) -wp-mm 2 $< > $(WD)/$*.2.log 2> $(WD)/$*.2.err + +errors.% : ERR_% + -grep Fatal $($<) > $@ + -grep Unbound $($<) >> $@ + -grep "Could not run why" $($<) >> $@ + -grep "Could not run why" $(LOG_$*) >> $@ + echo "TOTAL errors = `wc -l $@`" >> $@ + +failed.% : LOG_% + -grep Failed $($<) > $@ + echo "TOTAL failed = `wc -l $@`" >> $@ + +%.0 : $(LOG_0) + -grep $* $+ | grep "%" | grep -v " 0%" > $@ + echo "TOTAL $* = \ + `gawk 'BEGIN { cpt = 0; } { cpt += $$3; } END { print cpt; }' \ + $@`" >> $@ + +%.2 : $(LOG_2) + -grep $* $+ | grep "%" | grep -v " 0%" > $@ + echo "TOTAL $* = \ + `gawk 'BEGIN { cpt = 0; } { cpt += $$3; } END { print cpt; }' \ + $@`" >> $@ + +res_% : RES_% + @echo "=== Results for model $* :" + grep "TOTAL" $($<) > $@ + cat $@ + +failed.%.m : failed.% Makefile + cat $< \ + | grep -v " [cfg] switch handling" \ + | grep -v " char constant expr" \ + | grep -v " string constant expr" \ + | grep -v " cast" \ + | grep -v " logic function with labels" \ + | grep -v " predicate with label" \ + | grep -v " fol term range" \ + | grep -v " unsupported C or logic type" \ + > $@ + + +# identification of "normal" (or known) failed cases +f0 : failed.0.m + -cat $< \ + | grep -v ": indirect assign" \ + | grep -v ": indirect access" \ + | grep -v ": no assigns clause in called function" \ + +f2 : failed.2.m + -cat $< \ + | grep -v ": pointer to logic_type not implemented" \ + +clean : + rm -f $(LOG_0) $(ERR_0) $(RES_0) LOG_0 ERR_0 RES_0 + rm -f $(LOG_2) $(ERR_2) $(RES_2) LOG_2 ERR_2 RES_2 + rm -f frama_c_journal.ml + rm -f failed.*.m res_0 res_2 + rm -f gwhy.cache + +# .SILENT : + diff -Nru frama-c-20140301+neon+dfsg/tests/more_wp/TODO frama-c-20150201+sodium+dfsg/tests/more_wp/TODO --- frama-c-20140301+neon+dfsg/tests/more_wp/TODO 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/more_wp/TODO 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,31 @@ +- traiter les " global invariant". + exemple : ../jessie/band.c + ../../tests/jessie/init.c +- gestion des variables globales const ? + exemple : ../../tests/jessie/init2.c +- 2 alloc donne des pointeurs diffrents + exemple : ../../tests/jessie/alloc.c +- ajouter les axiomes dans le fichiers why + exemple : ../../tests/jessie/count_bits.c +- intervale pour un enum (se ramener un invariant de type ?) + exemple : ../../tests/jessie/enum.c +- predicate avec label + exemple : ../../tests/jessie/glob.c + +- dtection des labels non traits + +- tudier les tests : + ../../tests/jessie/weber3.c + tests/more_wp/bubblesort.c + tests/more_wp/quicksort.c + +- pb traduction des dfinitions de prdicats en M2 + (doit-on faire intervenir la memoire ou non ???) + exemple : ../../tests/jessie/interval_arith.c avec M2 + + +DONE : +- simplification des let et forall +- behaviors +- some casts (integer -> integer and real -> real) +- base_id for local variables diff -Nru frama-c-20140301+neon+dfsg/tests/occurrence/oracle/decl_func.res.oracle frama-c-20150201+sodium+dfsg/tests/occurrence/oracle/decl_func.res.oracle --- frama-c-20140301+neon+dfsg/tests/occurrence/oracle/decl_func.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/occurrence/oracle/decl_func.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/occurrence/decl_func.i (no preprocessing) +[occurrence] beginning analysis +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] computing for function f <- main. + Called from tests/occurrence/decl_func.i:16. +[value] using specification for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/occurrence/decl_func.i:17. +[value] Done for function f +[value] computing for function f <- main. + Called from tests/occurrence/decl_func.i:18. +[value] Done for function f +[value] Recording results for main +[value] done for function main +[occurrence] analysis done +[occurrence] variable dest (parameter of Frama_C_bzero): + specification of Frama_C_bzero: dest + variable n (parameter of Frama_C_bzero): + specification of Frama_C_bzero: n + variable dest (parameter of Frama_C_copy_block): + specification of Frama_C_copy_block: dest + variable size (parameter of Frama_C_copy_block): + specification of Frama_C_copy_block: size + variable n (parameter of Frama_C_copy_block): + specification of Frama_C_copy_block: n + variable x (global): + global: x + variable y (global): + global: y + variable x (parameter of f): + specification of f: x + variable y_0 (local of main): + sid 1: y_0 + variable z (local of main): + sid 2: z + variable tmp_0 (local of main): + sid 4: tmp_0 diff -Nru frama-c-20140301+neon+dfsg/tests/occurrence/oracle/ptr_assert.res.oracle frama-c-20150201+sodium+dfsg/tests/occurrence/oracle/ptr_assert.res.oracle --- frama-c-20140301+neon+dfsg/tests/occurrence/oracle/ptr_assert.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/occurrence/oracle/ptr_assert.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,34 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/occurrence/ptr_assert.i (no preprocessing) +[occurrence] beginning analysis +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +tests/occurrence/ptr_assert.i:11:[value] Assertion got status valid. +tests/occurrence/ptr_assert.i:16:[value] Assertion got status valid. +[value] Recording results for main +[value] done for function main +[occurrence] analysis done +[occurrence] variable dest (parameter of Frama_C_bzero): + specification of Frama_C_bzero: dest + variable n (parameter of Frama_C_bzero): + specification of Frama_C_bzero: n + variable dest (parameter of Frama_C_copy_block): + specification of Frama_C_copy_block: dest + variable size (parameter of Frama_C_copy_block): + specification of Frama_C_copy_block: size + variable n (parameter of Frama_C_copy_block): + specification of Frama_C_copy_block: n + variable x (global): + sid 2: x + variable y (global): + sid 5: y + variable z (parameter of main): + sid 12: z + variable p (local of main): + sid 2: p + variable q (local of main): + sid 5: q diff -Nru frama-c-20140301+neon+dfsg/tests/occurrence/test_config frama-c-20150201+sodium+dfsg/tests/occurrence/test_config --- frama-c-20140301+neon+dfsg/tests/occurrence/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/occurrence/test_config 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1 @@ +STDOPT: -"-val" -"-out" -"-input" -"-deps" +"-occurrence-verbose 1" diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/const.i frama-c-20150201+sodium+dfsg/tests/pdg/const.i --- frama-c-20140301+neon+dfsg/tests/pdg/const.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/const.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,46 @@ +/* run.config + STDOPT: +"-calldeps -pdg -pdg-print" +*/ + +struct T1 { + int M1 ; + int M2 ; +}; +struct T2 { + struct T1 *M3 ; + struct T1 *M4 ; +}; +typedef struct T2 T3; +struct T4 { + struct T1 *M5 ; +}; +typedef struct T4 T5; +struct T1 G1; +struct T1 G2; +struct T1 G3; +T5 const G4 = {.M5 = & G1}; +void F1(T3 * const f1) +{ + (f1->M4)->M2 = (f1->M3)->M2; + return; +} + +int F2(T5 * const f2) +{ + int V1; + (f2->M5)->M1 = 0; + return V1; +} + +T3 const G5 = {.M3 = & G2, .M4 = & G3}; +int main(void) +{ + int V2; + F2((T5 *)(& G4)); + G2 = G1; + F1((T3 *)(& G5)); + V2 = 0; + return V2; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/annot.1.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/annot.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/annot.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/annot.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,72 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/annot.c (with preprocessing) +[value] Analyzing a complete application starting at loop +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} +tests/pdg/annot.c:22:[value] Loop invariant got status unknown. +tests/pdg/annot.c:25:[value] entering loop for the first time +tests/pdg/annot.c:22:[value] Loop invariant got status valid. +tests/pdg/annot.c:26:[kernel] warning: signed overflow. assert s+2 ≤ 2147483647; +[value] Recording results for loop +[value] done for function loop +[pdg] computing for function loop +[pdg] done for function loop +[pdg] PDG for loop + {n1}: InCtrl + {n2}: VarDecl : n + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : i + {n5}: VarDecl : s + {n6}: s = 0; + -[-c-]-> 1 + -[a--]-> 5 + {n7}: i = 0; + -[-c-]-> 1 + -[a--]-> 4 + {n8}: while(1) + -[-c-]-> 1 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 12 + {n9}: i < n + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[--d]-> 4 + -[--d]-> 7 + -[-c-]-> 8 + -[-c-]-> 9 + -[--d]-> 11 + -[-c-]-> 12 + {n10}: s += 2; + -[-c-]-> 1 + -[a-d]-> 5 + -[--d]-> 6 + -[-c-]-> 8 + -[-c-]-> 9 + -[--d]-> 10 + -[-c-]-> 12 + {n11}: i ++; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 7 + -[-c-]-> 8 + -[-c-]-> 9 + -[--d]-> 11 + -[-c-]-> 12 + {n12}: break; + -[-c-]-> 1 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 12 + {n13}: return s; + -[-c-]-> 1 + -[--d]-> 5 + -[--d]-> 6 + -[--d]-> 10 + {n14}: OutRet + -[--d]-> 13 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/annot.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/annot.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/annot.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/annot.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/annot.c (with preprocessing) +[value] Analyzing a complete application starting at f1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} +tests/pdg/annot.c:12:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +tests/pdg/annot.c:13:[value] Assertion got status valid. +[value] Recording results for f1 +[value] done for function f1 +[pdg] computing for function f1 +[pdg] done for function f1 +[pdg] PDG for f1 + {n1}: InCtrl + {n2}: VarDecl : x + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : a + {n5}: a = 10; + -[-c-]-> 1 + -[a--]-> 4 + {n6}: x < 10 + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + {n7}: x = 10; + -[-c-]-> 1 + -[a--]-> 2 + -[-c-]-> 6 + {n8}: L: + -[-c-]-> 1 + {n9}: L: x ++; + -[-c-]-> 1 + -[a-d]-> 2 + -[--d]-> 3 + -[--d]-> 7 + {n10}: ; + -[-c-]-> 1 + {n11}: x = 3; + -[-c-]-> 1 + -[a--]-> 2 + {n12}: return x; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 11 + {n13}: OutRet + -[--d]-> 12 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/array_struct.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/array_struct.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/array_struct.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/array_struct.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,224 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/array_struct.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..99] ∈ {0} +[value] computing for function f <- main. + Called from tests/pdg/array_struct.i:18. +tests/pdg/array_struct.i:13:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. + assert 0 ≤ c < 100; +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/pdg/array_struct.i:19. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[pdg] computing for function f +[pdg] done for function f +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[pdg] done for function main +[pdg] ====== PDG GRAPH COMPUTED ====== +[pdg] PDG for f + {n1}: InCtrl + {n2}: VarDecl : c + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: t[c].a = t[c].a; + -[-c-]-> 1 + -[a-d]-> 2 + -[a-d]-> 3 + -[--d]-> 8 + {n5}: t[c].b = t[c].b; + -[-c-]-> 1 + -[a-d]-> 2 + -[a-d]-> 3 + -[--d]-> 7 + {n6}: return; + -[-c-]-> 1 + {n7}: + In(t{[0].b; [1].b; [2].b; [3].b; [4].b; [5].b; [6].b; [7].b; [8].b; [9].b; + [10].b; [11].b; [12].b; [13].b; [14].b; [15].b; [16].b; [17].b; + [18].b; [19].b; [20].b; [21].b; [22].b; [23].b; [24].b; [25].b; + [26].b; [27].b; [28].b; [29].b; [30].b; [31].b; [32].b; [33].b; + [34].b; [35].b; [36].b; [37].b; [38].b; [39].b; [40].b; [41].b; + [42].b; [43].b; [44].b; [45].b; [46].b; [47].b; [48].b; [49].b; + [50].b; [51].b; [52].b; [53].b; [54].b; [55].b; [56].b; [57].b; + [58].b; [59].b; [60].b; [61].b; [62].b; [63].b; [64].b; [65].b; + [66].b; [67].b; [68].b; [69].b; [70].b; [71].b; [72].b; [73].b; + [74].b; [75].b; [76].b; [77].b; [78].b; [79].b; [80].b; [81].b; + [82].b; [83].b; [84].b; [85].b; [86].b; [87].b; [88].b; [89].b; + [90].b; [91].b; [92].b; [93].b; [94].b; [95].b; [96].b; [97].b; + [98].b; [99].b}) + {n8}: + In(t{[0].a; [1].a; [2].a; [3].a; [4].a; [5].a; [6].a; [7].a; [8].a; [9].a; + [10].a; [11].a; [12].a; [13].a; [14].a; [15].a; [16].a; [17].a; + [18].a; [19].a; [20].a; [21].a; [22].a; [23].a; [24].a; [25].a; + [26].a; [27].a; [28].a; [29].a; [30].a; [31].a; [32].a; [33].a; + [34].a; [35].a; [36].a; [37].a; [38].a; [39].a; [40].a; [41].a; + [42].a; [43].a; [44].a; [45].a; [46].a; [47].a; [48].a; [49].a; + [50].a; [51].a; [52].a; [53].a; [54].a; [55].a; [56].a; [57].a; + [58].a; [59].a; [60].a; [61].a; [62].a; [63].a; [64].a; [65].a; + [66].a; [67].a; [68].a; [69].a; [70].a; [71].a; [72].a; [73].a; + [74].a; [75].a; [76].a; [77].a; [78].a; [79].a; [80].a; [81].a; + [82].a; [83].a; [84].a; [85].a; [86].a; [87].a; [88].a; [89].a; + [90].a; [91].a; [92].a; [93].a; [94].a; [95].a; [96].a; [97].a; + [98].a; [99].a}) +[pdg] PDG for main + {n9}: InCtrl + {n10}: VarDecl : c + -[a--]-> 11 + {n11}: In1 + -[a--]-> 10 + {n12}: Call5-InCtrl : f(c); + -[-c-]-> 9 + {n13}: Call5-In1 : f(c); + -[-c-]-> 9 + -[--d]-> 10 + -[--d]-> 11 + -[-c-]-> 12 + {n14}: + Call5-Out(t{[0].a; [1].a; [2].a; [3].a; [4].a; [5].a; [6].a; [7].a; [8].a; + [9].a; [10].a; [11].a; [12].a; [13].a; [14].a; [15].a; [16].a; + [17].a; [18].a; [19].a; [20].a; [21].a; [22].a; [23].a; + [24].a; [25].a; [26].a; [27].a; [28].a; [29].a; [30].a; + [31].a; [32].a; [33].a; [34].a; [35].a; [36].a; [37].a; + [38].a; [39].a; [40].a; [41].a; [42].a; [43].a; [44].a; + [45].a; [46].a; [47].a; [48].a; [49].a; [50].a; [51].a; + [52].a; [53].a; [54].a; [55].a; [56].a; [57].a; [58].a; + [59].a; [60].a; [61].a; [62].a; [63].a; [64].a; [65].a; + [66].a; [67].a; [68].a; [69].a; [70].a; [71].a; [72].a; + [73].a; [74].a; [75].a; [76].a; [77].a; [78].a; [79].a; + [80].a; [81].a; [82].a; [83].a; [84].a; [85].a; [86].a; + [87].a; [88].a; [89].a; [90].a; [91].a; [92].a; [93].a; + [94].a; [95].a; [96].a; [97].a; [98].a; [99].a}) : f(c); + -[-c-]-> 9 + -[-c-]-> 12 + -[--d]-> 13 + -[--d]-> 22 + {n15}: + Call5-Out(t{[0].b; [1].b; [2].b; [3].b; [4].b; [5].b; [6].b; [7].b; [8].b; + [9].b; [10].b; [11].b; [12].b; [13].b; [14].b; [15].b; [16].b; + [17].b; [18].b; [19].b; [20].b; [21].b; [22].b; [23].b; + [24].b; [25].b; [26].b; [27].b; [28].b; [29].b; [30].b; + [31].b; [32].b; [33].b; [34].b; [35].b; [36].b; [37].b; + [38].b; [39].b; [40].b; [41].b; [42].b; [43].b; [44].b; + [45].b; [46].b; [47].b; [48].b; [49].b; [50].b; [51].b; + [52].b; [53].b; [54].b; [55].b; [56].b; [57].b; [58].b; + [59].b; [60].b; [61].b; [62].b; [63].b; [64].b; [65].b; + [66].b; [67].b; [68].b; [69].b; [70].b; [71].b; [72].b; + [73].b; [74].b; [75].b; [76].b; [77].b; [78].b; [79].b; + [80].b; [81].b; [82].b; [83].b; [84].b; [85].b; [86].b; + [87].b; [88].b; [89].b; [90].b; [91].b; [92].b; [93].b; + [94].b; [95].b; [96].b; [97].b; [98].b; [99].b}) : f(c); + -[-c-]-> 9 + -[-c-]-> 12 + -[--d]-> 13 + -[--d]-> 21 + {n16}: Call6-InCtrl : f(c); + -[-c-]-> 9 + {n17}: Call6-In1 : f(c); + -[-c-]-> 9 + -[--d]-> 10 + -[--d]-> 11 + -[-c-]-> 16 + {n18}: + Call6-Out(t{[0].a; [1].a; [2].a; [3].a; [4].a; [5].a; [6].a; [7].a; [8].a; + [9].a; [10].a; [11].a; [12].a; [13].a; [14].a; [15].a; [16].a; + [17].a; [18].a; [19].a; [20].a; [21].a; [22].a; [23].a; + [24].a; [25].a; [26].a; [27].a; [28].a; [29].a; [30].a; + [31].a; [32].a; [33].a; [34].a; [35].a; [36].a; [37].a; + [38].a; [39].a; [40].a; [41].a; [42].a; [43].a; [44].a; + [45].a; [46].a; [47].a; [48].a; [49].a; [50].a; [51].a; + [52].a; [53].a; [54].a; [55].a; [56].a; [57].a; [58].a; + [59].a; [60].a; [61].a; [62].a; [63].a; [64].a; [65].a; + [66].a; [67].a; [68].a; [69].a; [70].a; [71].a; [72].a; + [73].a; [74].a; [75].a; [76].a; [77].a; [78].a; [79].a; + [80].a; [81].a; [82].a; [83].a; [84].a; [85].a; [86].a; + [87].a; [88].a; [89].a; [90].a; [91].a; [92].a; [93].a; + [94].a; [95].a; [96].a; [97].a; [98].a; [99].a}) : f(c); + -[-c-]-> 9 + -[--d](t{[0].a; [1].a; [2].a; [3].a; [4].a; [5].a; [6].a; [7].a; [8].a; + [9].a; [10].a; [11].a; [12].a; [13].a; [14].a; [15].a; [16].a; + [17].a; [18].a; [19].a; [20].a; [21].a; [22].a; [23].a; [24].a; + [25].a; [26].a; [27].a; [28].a; [29].a; [30].a; [31].a; [32].a; + [33].a; [34].a; [35].a; [36].a; [37].a; [38].a; [39].a; [40].a; + [41].a; [42].a; [43].a; [44].a; [45].a; [46].a; [47].a; [48].a; + [49].a; [50].a; [51].a; [52].a; [53].a; [54].a; [55].a; [56].a; + [57].a; [58].a; [59].a; [60].a; [61].a; [62].a; [63].a; [64].a; + [65].a; [66].a; [67].a; [68].a; [69].a; [70].a; [71].a; [72].a; + [73].a; [74].a; [75].a; [76].a; [77].a; [78].a; [79].a; [80].a; + [81].a; [82].a; [83].a; [84].a; [85].a; [86].a; [87].a; [88].a; + [89].a; [90].a; [91].a; [92].a; [93].a; [94].a; [95].a; [96].a; + [97].a; [98].a; [99].a})-> 14 + -[-c-]-> 16 + -[--d]-> 17 + -[--d]-> 22 + {n19}: + Call6-Out(t{[0].b; [1].b; [2].b; [3].b; [4].b; [5].b; [6].b; [7].b; [8].b; + [9].b; [10].b; [11].b; [12].b; [13].b; [14].b; [15].b; [16].b; + [17].b; [18].b; [19].b; [20].b; [21].b; [22].b; [23].b; + [24].b; [25].b; [26].b; [27].b; [28].b; [29].b; [30].b; + [31].b; [32].b; [33].b; [34].b; [35].b; [36].b; [37].b; + [38].b; [39].b; [40].b; [41].b; [42].b; [43].b; [44].b; + [45].b; [46].b; [47].b; [48].b; [49].b; [50].b; [51].b; + [52].b; [53].b; [54].b; [55].b; [56].b; [57].b; [58].b; + [59].b; [60].b; [61].b; [62].b; [63].b; [64].b; [65].b; + [66].b; [67].b; [68].b; [69].b; [70].b; [71].b; [72].b; + [73].b; [74].b; [75].b; [76].b; [77].b; [78].b; [79].b; + [80].b; [81].b; [82].b; [83].b; [84].b; [85].b; [86].b; + [87].b; [88].b; [89].b; [90].b; [91].b; [92].b; [93].b; + [94].b; [95].b; [96].b; [97].b; [98].b; [99].b}) : f(c); + -[-c-]-> 9 + -[--d](t{[0].b; [1].b; [2].b; [3].b; [4].b; [5].b; [6].b; [7].b; [8].b; + [9].b; [10].b; [11].b; [12].b; [13].b; [14].b; [15].b; [16].b; + [17].b; [18].b; [19].b; [20].b; [21].b; [22].b; [23].b; [24].b; + [25].b; [26].b; [27].b; [28].b; [29].b; [30].b; [31].b; [32].b; + [33].b; [34].b; [35].b; [36].b; [37].b; [38].b; [39].b; [40].b; + [41].b; [42].b; [43].b; [44].b; [45].b; [46].b; [47].b; [48].b; + [49].b; [50].b; [51].b; [52].b; [53].b; [54].b; [55].b; [56].b; + [57].b; [58].b; [59].b; [60].b; [61].b; [62].b; [63].b; [64].b; + [65].b; [66].b; [67].b; [68].b; [69].b; [70].b; [71].b; [72].b; + [73].b; [74].b; [75].b; [76].b; [77].b; [78].b; [79].b; [80].b; + [81].b; [82].b; [83].b; [84].b; [85].b; [86].b; [87].b; [88].b; + [89].b; [90].b; [91].b; [92].b; [93].b; [94].b; [95].b; [96].b; + [97].b; [98].b; [99].b})-> 15 + -[-c-]-> 16 + -[--d]-> 17 + -[--d]-> 21 + {n20}: return; + -[-c-]-> 9 + {n21}: + In(t{[0].b; [1].b; [2].b; [3].b; [4].b; [5].b; [6].b; [7].b; [8].b; [9].b; + [10].b; [11].b; [12].b; [13].b; [14].b; [15].b; [16].b; [17].b; + [18].b; [19].b; [20].b; [21].b; [22].b; [23].b; [24].b; [25].b; + [26].b; [27].b; [28].b; [29].b; [30].b; [31].b; [32].b; [33].b; + [34].b; [35].b; [36].b; [37].b; [38].b; [39].b; [40].b; [41].b; + [42].b; [43].b; [44].b; [45].b; [46].b; [47].b; [48].b; [49].b; + [50].b; [51].b; [52].b; [53].b; [54].b; [55].b; [56].b; [57].b; + [58].b; [59].b; [60].b; [61].b; [62].b; [63].b; [64].b; [65].b; + [66].b; [67].b; [68].b; [69].b; [70].b; [71].b; [72].b; [73].b; + [74].b; [75].b; [76].b; [77].b; [78].b; [79].b; [80].b; [81].b; + [82].b; [83].b; [84].b; [85].b; [86].b; [87].b; [88].b; [89].b; + [90].b; [91].b; [92].b; [93].b; [94].b; [95].b; [96].b; [97].b; + [98].b; [99].b}) + {n22}: + In(t{[0].a; [1].a; [2].a; [3].a; [4].a; [5].a; [6].a; [7].a; [8].a; [9].a; + [10].a; [11].a; [12].a; [13].a; [14].a; [15].a; [16].a; [17].a; + [18].a; [19].a; [20].a; [21].a; [22].a; [23].a; [24].a; [25].a; + [26].a; [27].a; [28].a; [29].a; [30].a; [31].a; [32].a; [33].a; + [34].a; [35].a; [36].a; [37].a; [38].a; [39].a; [40].a; [41].a; + [42].a; [43].a; [44].a; [45].a; [46].a; [47].a; [48].a; [49].a; + [50].a; [51].a; [52].a; [53].a; [54].a; [55].a; [56].a; [57].a; + [58].a; [59].a; [60].a; [61].a; [62].a; [63].a; [64].a; [65].a; + [66].a; [67].a; [68].a; [69].a; [70].a; [71].a; [72].a; [73].a; + [74].a; [75].a; [76].a; [77].a; [78].a; [79].a; [80].a; [81].a; + [82].a; [83].a; [84].a; [85].a; [86].a; [87].a; [88].a; [89].a; + [90].a; [91].a; [92].a; [93].a; [94].a; [95].a; [96].a; [97].a; + [98].a; [99].a}) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/assigns.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/assigns.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/assigns.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/assigns.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,64 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/assigns.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] computing for function f <- main. + Called from tests/pdg/assigns.i:13. +[value] using specification for function f +[value] Done for function f +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f at tests/pdg/assigns.i:13 (by main): + x FROM x (and SELF) +[from] entry point: + x FROM \nothing + y FROM \nothing + \result FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[pdg] computing for function f +[from] Computing for function f +[from] Done for function f +[pdg] done for function f +[pdg] computing for function main +[pdg] done for function main +[pdg] ====== PDG GRAPH COMPUTED ====== +[pdg] PDG for f + {n1}: InCtrl + {n2}: Out(x) + -[--d]-> 3 + {n3}: In(x) +[pdg] PDG for main + {n4}: InCtrl + {n5}: VarDecl : __retres + {n6}: x = 1U; + -[-c-]-> 4 + {n7}: y = 2U; + -[-c-]-> 4 + {n8}: Call3-InCtrl : f(); + -[-c-]-> 4 + {n9}: Call3-Out(x) : f(); + -[-c-]-> 4 + -[--d]-> 6 + -[-c-]-> 8 + {n10}: y += (unsigned int)2; + -[-c-]-> 4 + -[--d]-> 7 + {n11}: __retres = (int)(x + y); + -[-c-]-> 4 + -[a--]-> 5 + -[--d]-> 6 + -[--d](x)-> 9 + -[--d]-> 10 + {n12}: return __retres; + -[-c-]-> 4 + -[--d]-> 5 + -[--d]-> 11 + {n13}: OutRet + -[--d]-> 12 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/bts1194.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/bts1194.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/bts1194.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/bts1194.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,259 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/bts1194.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Y ∈ {0} + X ∈ {0} + v ∈ [--..--] +[value] computing for function f <- main. + Called from tests/pdg/bts1194.c:32. +[value] computing for function input <- f <- main. + Called from tests/pdg/bts1194.c:13. +[value] using specification for function input +[value] Done for function input +tests/pdg/bts1194.c:17:[value] Assertion got status unknown. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function h <- main. + Called from tests/pdg/bts1194.c:33. +[value] computing for function g <- h <- main. + Called from tests/pdg/bts1194.c:26. +tests/pdg/bts1194.c:22:[value] entering loop for the first time +tests/pdg/bts1194.c:20:[value] Function g: no state left in which to evaluate postcondition, status not computed. +[value] Recording results for g +[from] Computing for function g +[from] Non-terminating function g (no dependencies) +[from] Done for function g +[value] Done for function g +[value] Recording results for h +[from] Computing for function h +[from] Done for function h +[value] Done for function h +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function g: + NON TERMINATING FUNCTION +[value] Values at end of function h: + X ∈ {2} +[value] Values at end of function f: + Y ∈ [1..2147483647] + l ∈ {0} +[value] Values at end of function main: + Y ∈ [1..2147483647] + X ∈ {2} +[from] Computing for function g +[from] Non-terminating function g (no dependencies) +[from] Done for function g +[from] Computing for function h +[from] Done for function h +[from] Computing for function f +[from] Computing for function input <-f +[from] Done for function input +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function g: + NON TERMINATING - NO EFFECTS +[from] Function h: + X FROM X; v +[from] Function input: + \result FROM \nothing +[from] Function f: + Y FROM \nothing +[from] Function main: + Y FROM \nothing + X FROM X; v + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to g at tests/pdg/bts1194.c:26 (by h): + NON TERMINATING - NO EFFECTS +[from] call to input at tests/pdg/bts1194.c:13 (by f): + \result FROM \nothing +[from] call to f at tests/pdg/bts1194.c:32 (by main): + Y FROM \nothing +[from] call to h at tests/pdg/bts1194.c:33 (by main): + X FROM X; v +[from] entry point: + Y FROM \nothing + X FROM X; v + \result FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[inout] InOut (internal) for function g: + Operational inputs: + \nothing + Operational inputs on termination: + \nothing + Sure outputs: + ANYTHING(origin:Unknown) +[inout] InOut (internal) for function h: + Operational inputs: + X; v + Operational inputs on termination: + X; v + Sure outputs: + X +[inout] InOut (internal) for function f: + Operational inputs: + \nothing + Operational inputs on termination: + \nothing + Sure outputs: + Y; l +[inout] InOut (internal) for function main: + Operational inputs: + X; v + Operational inputs on termination: + X; v + Sure outputs: + Y; X +[pdg] computing for function g +tests/pdg/bts1194.c:22:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function g +[pdg] computing for function h +[pdg] done for function h +[pdg] computing for function input +[pdg] done for function input +[pdg] computing for function f +[pdg] done for function f +[pdg] computing for function main +[pdg] done for function main +[pdg] ====== PDG GRAPH COMPUTED ====== +[pdg] PDG for g + {n1}: InCtrl + {n2}: while(1) + -[-c-]-> 1 + -[-c-]-> 2 + {n3}: return; + -[-c-]-> 1 +[pdg] PDG for h + {n4}: InCtrl + {n5}: v + -[-c-]-> 4 + -[--d]-> 10 + {n6}: Call15-InCtrl : g(); + -[-c-]-> 4 + -[-c-]-> 5 + {n7}: X += 2; + -[-c-]-> 4 + -[-c-]-> 5 + -[--d]-> 9 + {n8}: return; + -[-c-]-> 4 + {n9}: In(X) + {n10}: In(v) +[pdg] PDG for input + {n11}: InCtrl + {n12}: OutRet +[pdg] PDG for f + {n13}: InCtrl + {n14}: VarDecl : l + {n15}: l = 0; + -[-c-]-> 13 + -[a--]-> 14 + {n16}: Call2-InCtrl : Y = input(); + -[-c-]-> 13 + {n17}: Call2-OutRet : Y = input(); + -[-c-]-> 13 + -[-c-]-> 16 + {n18}: l > 0 + -[-c-]-> 13 + -[--d]-> 14 + -[--d]-> 15 + {n19}: ; + -[-c-]-> 13 + {n20}: return; + -[-c-]-> 13 +[pdg] PDG for main + {n21}: InCtrl + {n22}: Y = 3; + -[-c-]-> 21 + {n23}: Call20-InCtrl : f(); + -[-c-]-> 21 + {n24}: Call20-Out(Y) : f(); + -[-c-]-> 21 + -[-c-]-> 23 + {n25}: Call21-InCtrl : h(); + -[-c-]-> 21 + {n26}: Call21-Out(X) : h(); + -[-c-]-> 21 + -[-c-]-> 25 + -[--d]-> 29 + -[--d]-> 30 + {n27}: return Y; + -[-c-]-> 21 + -[--d](Y)-> 24 + {n28}: OutRet + -[--d]-> 27 + {n29}: In(X) + {n30}: In(v) +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Y ∈ {0} +[value] computing for function f_slice_1 <- main. + Called from tests/pdg/bts1194.c:32. +tests/pdg/bts1194.c:13:[kernel] warning: Neither code nor specification for function input, generating default assigns from the prototype +[value] computing for function input <- f_slice_1 <- main. + Called from tests/pdg/bts1194.c:13. +[value] using specification for function input +[value] Done for function input +tests/pdg/bts1194.c:17:[value] Assertion got status unknown. +[value] Recording results for f_slice_1 +[value] Done for function f_slice_1 +[value] Recording results for main +[value] done for function main +[pdg] computing for function input +[from] Computing for function input +[from] Done for function input +[pdg] done for function input +[pdg] computing for function f_slice_1 +[pdg] done for function f_slice_1 +[pdg] computing for function main +[from] Computing for function f_slice_1 +[from] Done for function f_slice_1 +[pdg] done for function main +[pdg] ====== PDG GRAPH COMPUTED ====== +/* Generated by Frama-C */ +int Y; +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int input(); + +void f_slice_1(void) +{ + Y = input(); + /*@ assert Y > 0; */ ; + return; +} + +int main(void) +{ + f_slice_1(); + return Y; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/call.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/call.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/call.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/call.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,106 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/call.c (with preprocessing) +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + A ∈ [--..--] + B ∈ [--..--] +tests/pdg/call.c:18:[kernel] warning: signed overflow. assert -2147483648 ≤ x+y ≤ 2147483647; +[value] computing for function f <- g. + Called from tests/pdg/call.c:18. +tests/pdg/call.c:14:[kernel] warning: signed overflow. assert -2147483648 ≤ a+G.a ≤ 2147483647; +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[pdg] computing for function f +[pdg] done for function f +[pdg] dot file generated in tests/pdg/call.f.dot +[pdg] computing for function g +[from] Computing for function f +[from] Done for function f +[pdg] done for function g +[pdg] dot file generated in tests/pdg/call.g.dot +[pdg] ====== PDG GRAPH COMPUTED ====== +[pdg] PDG for f + {n1}: InCtrl + {n2}: VarDecl : a + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : b + -[a--]-> 5 + {n5}: In2 + -[a--]-> 4 + {n6}: VarDecl : __retres + {n7}: G.b = b; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 5 + {n8}: __retres = a + G.a; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[a--]-> 6 + -[--d]-> 11 + {n9}: return __retres; + -[-c-]-> 1 + -[--d]-> 6 + -[--d]-> 8 + {n10}: OutRet + -[--d]-> 9 + {n11}: In(G.a) +[pdg] PDG for g + {n12}: InCtrl + {n13}: VarDecl : x + -[a--]-> 14 + {n14}: In1 + -[a--]-> 13 + {n15}: VarDecl : y + -[a--]-> 16 + {n16}: In2 + -[a--]-> 15 + {n17}: VarDecl : z + -[a--]-> 18 + {n18}: In3 + -[a--]-> 17 + {n19}: VarDecl : r + {n20}: Call5-InCtrl : r = f(x + y,z); + -[-c-]-> 12 + {n21}: Call5-In1 : r = f(x + y,z); + -[-c-]-> 12 + -[--d]-> 13 + -[--d]-> 14 + -[--d]-> 15 + -[--d]-> 16 + -[-c-]-> 20 + {n22}: Call5-In2 : r = f(x + y,z); + -[-c-]-> 12 + -[--d]-> 17 + -[--d]-> 18 + -[-c-]-> 20 + {n23}: Call5-Out(G.b) : r = f(x + y,z); + -[-c-]-> 12 + -[-c-]-> 20 + -[--d]-> 22 + {n24}: Call5-OutRet : r = f(x + y,z); + -[-c-]-> 12 + -[a--]-> 19 + -[-c-]-> 20 + -[--d]-> 21 + -[--d]-> 29 + {n25}: A = G.a; + -[-c-]-> 12 + -[--d]-> 29 + {n26}: B = G.b; + -[-c-]-> 12 + -[--d](G.b)-> 23 + {n27}: return r; + -[-c-]-> 12 + -[--d]-> 19 + -[--d]-> 24 + {n28}: OutRet + -[--d]-> 27 + {n29}: In(G.a) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/calls_and_implicits.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/calls_and_implicits.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/calls_and_implicits.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/calls_and_implicits.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,187 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/calls_and_implicits.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..4] ∈ {0} + G ∈ {0} + G2 ∈ {0} +[value] computing for function f <- main. + Called from tests/pdg/calls_and_implicits.c:28. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/pdg/calls_and_implicits.c:29. +[value] Recording results for f +[value] Done for function f +[value] computing for function f2 <- main. + Called from tests/pdg/calls_and_implicits.c:30. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function print <- main. + Called from tests/pdg/calls_and_implicits.c:31. +tests/pdg/calls_and_implicits.c:21:[value] entering loop for the first time +[value] computing for function printf <- print <- main. + Called from tests/pdg/calls_and_implicits.c:22. +tests/pdg/calls_and_implicits.c:22:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] using specification for function printf +[value] Done for function printf +[value] computing for function printf <- print <- main. + Called from tests/pdg/calls_and_implicits.c:22. +[value] Done for function printf +[value] computing for function printf <- print <- main. + Called from tests/pdg/calls_and_implicits.c:22. +[value] Done for function printf +[value] computing for function printf <- print <- main. + Called from tests/pdg/calls_and_implicits.c:22. +[value] Done for function printf +[value] computing for function printf <- print <- main. + Called from tests/pdg/calls_and_implicits.c:22. +[value] Done for function printf +[value] computing for function printf <- print <- main. + Called from tests/pdg/calls_and_implicits.c:23. +[value] Done for function printf +[value] Recording results for print +[value] Done for function print +[value] computing for function swap <- main. + Called from tests/pdg/calls_and_implicits.c:32. +[value] Recording results for swap +[value] Done for function swap +[value] computing for function print <- main. + Called from tests/pdg/calls_and_implicits.c:33. +[value] computing for function printf <- print <- main. + Called from tests/pdg/calls_and_implicits.c:22. +[value] Done for function printf +[value] computing for function printf <- print <- main. + Called from tests/pdg/calls_and_implicits.c:22. +[value] Done for function printf +[value] computing for function printf <- print <- main. + Called from tests/pdg/calls_and_implicits.c:22. +[value] Done for function printf +[value] computing for function printf <- print <- main. + Called from tests/pdg/calls_and_implicits.c:22. +[value] Done for function printf +[value] computing for function printf <- print <- main. + Called from tests/pdg/calls_and_implicits.c:22. +[value] Done for function printf +[value] computing for function printf <- print <- main. + Called from tests/pdg/calls_and_implicits.c:23. +[value] Done for function printf +[value] Recording results for print +[value] Done for function print +[value] Recording results for main +[value] done for function main +[inout] InOut (internal) for function f: + Operational inputs: + G + Operational inputs on termination: + G + Sure outputs: + G; __retres +[inout] InOut (internal) for function f2: + Operational inputs: + G + Operational inputs on termination: + G + Sure outputs: + G2; __retres +[inout] InOut (internal) for function print: + Operational inputs: + t[0..4]; G; G2; "t[%d] = %d\n"[bits 0 to 95]; + "G = %d ; G2 = %d\n\n"[bits 0 to 151] + Operational inputs on termination: + t[0..4]; G; G2; "t[%d] = %d\n"[bits 0 to 95]; + "G = %d ; G2 = %d\n\n"[bits 0 to 151] + Sure outputs: + i +[inout] InOut (internal) for function swap: + Operational inputs: + G; G2 + Operational inputs on termination: + G; G2 + Sure outputs: + G; G2; tmp +[inout] InOut (internal) for function main: + Operational inputs: + t{[1]; [3..4]}; "t[%d] = %d\n"[bits 0 to 95]; + "G = %d ; G2 = %d\n\n"[bits 0 to 151] + Operational inputs on termination: + t{[1]; [3..4]}; "t[%d] = %d\n"[bits 0 to 95]; + "G = %d ; G2 = %d\n\n"[bits 0 to 151] + Sure outputs: + t{[0]; [2]}; G; G2; __retres +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function print +[from] Computing for function printf <-print +[from] Done for function printf +tests/pdg/calls_and_implicits.c:21:[from] warning: variadic call detected. Using only 1 argument(s). +tests/pdg/calls_and_implicits.c:23:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function print +[from] Computing for function swap +[from] Done for function swap +[pdg] done for function main +[pdg] PDG for main + {n1}: InCtrl + {n2}: VarDecl : __retres + {n3}: G = 0; + -[-c-]-> 1 + {n4}: G2 = 0; + -[-c-]-> 1 + {n5}: Call26-InCtrl : t[G] = f(); + -[-c-]-> 1 + {n6}: Call26-Out(G) : t[G] = f(); + -[-c-]-> 1 + -[--d]-> 3 + -[-c-]-> 5 + {n7}: Call26-OutRet : t[G] = f(); + -[-c-]-> 1 + -[-c-]-> 5 + -[a--](G)-> 6 + {n8}: Call27-InCtrl : t[G] = f(); + -[-c-]-> 1 + {n9}: Call27-Out(G) : t[G] = f(); + -[-c-]-> 1 + -[--d](G)-> 6 + -[-c-]-> 8 + {n10}: Call27-OutRet : t[G] = f(); + -[-c-]-> 1 + -[-c-]-> 8 + -[a--](G)-> 9 + {n11}: Call28-InCtrl : G = f2(); + -[-c-]-> 1 + {n12}: Call28-Out(G2) : G = f2(); + -[-c-]-> 1 + -[--d](G)-> 9 + -[-c-]-> 11 + {n13}: Call28-OutRet : G = f2(); + -[-c-]-> 1 + -[--d](G)-> 9 + -[-c-]-> 11 + {n14}: Call29-InCtrl : print(); + -[-c-]-> 1 + {n15}: Call30-InCtrl : swap(); + -[-c-]-> 1 + {n16}: Call30-Out(G) : swap(); + -[-c-]-> 1 + -[--d](G2)-> 12 + -[-c-]-> 15 + {n17}: Call30-Out(G2) : swap(); + -[-c-]-> 1 + -[--d]-> 13 + -[-c-]-> 15 + {n18}: Call31-InCtrl : print(); + -[-c-]-> 1 + {n19}: __retres = 0; + -[-c-]-> 1 + -[a--]-> 2 + {n20}: return __retres; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 19 + {n21}: OutRet + -[--d]-> 20 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/calls_and_struct.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/calls_and_struct.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/calls_and_struct.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/calls_and_struct.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,176 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/calls_and_struct.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ {0} + A ∈ {0} + B ∈ {0} + C ∈ {0} +[value] computing for function asgn_struct <- main. + Called from tests/pdg/calls_and_struct.c:23. +[value] Recording results for asgn_struct +[value] Done for function asgn_struct +[value] computing for function f <- main. + Called from tests/pdg/calls_and_struct.c:27. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[from] Computing for function asgn_struct +[from] Done for function asgn_struct +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function asgn_struct: + \result FROM S +[from] Function f: + S.a FROM S.b + A FROM A; s.a + \result FROM s.b +[from] Function main: + S.a FROM S.b + A FROM S + B FROM \nothing + C FROM \nothing + \result FROM S +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function asgn_struct: + s; __retres +[inout] Inputs for function asgn_struct: + S +[inout] InOut (internal) for function asgn_struct: + Operational inputs: + S + Operational inputs on termination: + S + Sure outputs: + s; __retres +[inout] Out (internal) for function f: + S.a; A; __retres +[inout] Inputs for function f: + S.b; A +[inout] InOut (internal) for function f: + Operational inputs: + S.b; A; s{.a; .b} + Operational inputs on termination: + S.b; A; s{.a; .b} + Sure outputs: + S.a; A; __retres +[inout] Out (internal) for function main: + S.a; A; B; C; a; tmp_0 +[inout] Inputs for function main: + S; A +[inout] InOut (internal) for function main: + Operational inputs: + S + Operational inputs on termination: + S + Sure outputs: + S.a; A; B; C; a; tmp_0 +[pdg] computing for function asgn_struct +[pdg] done for function asgn_struct +[pdg] computing for function f +[pdg] done for function f +[pdg] computing for function main +[pdg] done for function main +[pdg] ====== PDG GRAPH COMPUTED ====== +[pdg] PDG for asgn_struct + {n1}: InCtrl + {n2}: VarDecl : s + {n3}: VarDecl : __retres + {n4}: s = S; + -[-c-]-> 1 + -[a--]-> 2 + -[--d]-> 8 + {n5}: __retres = s.a; + -[-c-]-> 1 + -[--d]-> 2 + -[a--]-> 3 + -[--d]-> 4 + {n6}: return __retres; + -[-c-]-> 1 + -[--d]-> 3 + -[--d]-> 5 + {n7}: OutRet + -[--d]-> 6 + {n8}: In(S) +[pdg] PDG for f + {n9}: InCtrl + {n10}: VarDecl : s + -[a--]-> 11 + {n11}: In1 + -[a--]-> 10 + {n12}: VarDecl : __retres + {n13}: A += s.a; + -[-c-]-> 9 + -[--d]-> 10 + -[--d]-> 11 + -[--d]-> 19 + {n14}: S.a = S.b; + -[-c-]-> 9 + -[--d]-> 18 + {n15}: __retres = s.b; + -[-c-]-> 9 + -[--d]-> 10 + -[--d]-> 11 + -[a--]-> 12 + {n16}: return __retres; + -[-c-]-> 9 + -[--d]-> 12 + -[--d]-> 15 + {n17}: OutRet + -[--d]-> 16 + {n18}: In(S.b) + {n19}: In(A) +[pdg] PDG for main + {n20}: InCtrl + {n21}: VarDecl : a + {n22}: VarDecl : tmp_0 + {n23}: Call11-InCtrl : a = asgn_struct(); + -[-c-]-> 20 + {n24}: Call11-OutRet : a = asgn_struct(); + -[-c-]-> 20 + -[a--]-> 21 + -[-c-]-> 23 + -[--d]-> 36 + {n25}: A = a; + -[-c-]-> 20 + -[--d]-> 21 + -[--d]-> 24 + {n26}: B = 2; + -[-c-]-> 20 + {n27}: C = 3; + -[-c-]-> 20 + {n28}: Call15-InCtrl : tmp_0 = f(S); + -[-c-]-> 20 + {n29}: Call15-In1 : tmp_0 = f(S); + -[-c-]-> 20 + -[-c-]-> 28 + -[--d]-> 36 + {n30}: Call15-Out(S.a) : tmp_0 = f(S); + -[-c-]-> 20 + -[-c-]-> 28 + -[--d]-> 35 + {n31}: Call15-Out(A) : tmp_0 = f(S); + -[-c-]-> 20 + -[--d]-> 25 + -[-c-]-> 28 + -[--d]-> 29 + {n32}: Call15-OutRet : tmp_0 = f(S); + -[-c-]-> 20 + -[a--]-> 22 + -[-c-]-> 28 + -[--d]-> 29 + {n33}: return tmp_0; + -[-c-]-> 20 + -[--d]-> 22 + -[--d]-> 32 + {n34}: OutRet + -[--d]-> 33 + {n35}: In(S.b) + {n36}: In(S) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/const.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/const.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/const.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/const.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,164 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/const.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G1 ∈ {0} + G2 ∈ {0} + G3 ∈ {0} + G4.M5 ∈ {{ &G1 }} + G5.M3 ∈ {{ &G2 }} + .M4 ∈ {{ &G3 }} +[value] computing for function F2 <- main. + Called from tests/pdg/const.i:39. +[value] Recording results for F2 +[from] Computing for function F2 +[from] Done for function F2 +[value] Done for function F2 +[value] computing for function F1 <- main. + Called from tests/pdg/const.i:41. +[value] Recording results for F1 +[from] Computing for function F1 +[from] Done for function F1 +[value] Done for function F1 +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function F1: + G3 ∈ {0} +[value] Values at end of function F2: + G1 ∈ {0} +[value] Values at end of function main: + G1 ∈ {0} + G2 ∈ {0} + G3 ∈ {0} + V2 ∈ {0} +[from] Computing for function F1 +[from] Done for function F1 +[from] Computing for function F2 +[from] Done for function F2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function F1: + G3.M2 FROM G2.M2; f1; G5 +[from] Function F2: + G1.M1 FROM G4; f2 + \result FROM \nothing +[from] Function main: + G1.M1 FROM G4 + G2 FROM G1.M2; G4 + G3.M2 FROM G1.M2; G4; G5 + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to F2 at tests/pdg/const.i:39 (by main): + G1.M1 FROM G4; f2 + \result FROM \nothing +[from] call to F1 at tests/pdg/const.i:41 (by main): + G3.M2 FROM G2.M2; f1; G5 +[from] entry point: + G1.M1 FROM G4 + G2 FROM G1.M2; G4 + G3.M2 FROM G1.M2; G4; G5 + \result FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[inout] Out (internal) for function F1: + G3.M2 +[inout] Inputs for function F1: + G2.M2; G5 +[inout] Out (internal) for function F2: + G1.M1 +[inout] Inputs for function F2: + G4 +[inout] Out (internal) for function main: + G1.M1; G2; G3.M2; V2 +[inout] Inputs for function main: + G1; G2.M2; G4; G5 +[pdg] computing for function F1 +[pdg] done for function F1 +[pdg] computing for function F2 +[pdg] done for function F2 +[pdg] computing for function main +[pdg] done for function main +[pdg] ====== PDG GRAPH COMPUTED ====== +[pdg] PDG for F1 + {n1}: InCtrl + {n2}: VarDecl : f1 + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: (f1->M4)->M2 = (f1->M3)->M2; + -[-c-]-> 1 + -[a-d]-> 2 + -[a-d]-> 3 + -[--d]-> 6 + -[--d]-> 7 + -[a--]-> 8 + {n5}: return; + -[-c-]-> 1 + {n6}: In(G2.M2) + {n7}: In(G5.M3) + {n8}: In(G5.M4) +[pdg] PDG for F2 + {n9}: InCtrl + {n10}: VarDecl : f2 + -[a--]-> 11 + {n11}: In1 + -[a--]-> 10 + {n12}: VarDecl : V1 + {n13}: (f2->M5)->M1 = 0; + -[-c-]-> 9 + -[a--]-> 10 + -[a--]-> 11 + -[a--]-> 16 + {n14}: return V1; + -[-c-]-> 9 + -[--d]-> 12 + {n15}: OutRet + -[--d]-> 14 + {n16}: In(G4) +[pdg] PDG for main + {n17}: InCtrl + {n18}: VarDecl : V2 + {n19}: Call8-InCtrl : F2((T5 *)(& G4)); + -[-c-]-> 17 + {n20}: Call8-In1 : F2((T5 *)(& G4)); + -[-c-]-> 17 + -[-c-]-> 19 + {n21}: Call8-Out(G1.M1) : F2((T5 *)(& G4)); + -[-c-]-> 17 + -[-c-]-> 19 + -[--d]-> 20 + -[--d]-> 31 + {n22}: G2 = G1; + -[-c-]-> 17 + -[--d](G1.M1)-> 21 + -[--d]-> 30 + {n23}: Call10-InCtrl : F1((T3 *)(& G5)); + -[-c-]-> 17 + {n24}: Call10-In1 : F1((T3 *)(& G5)); + -[-c-]-> 17 + -[-c-]-> 23 + {n25}: Call10-Out(G3.M2) : F1((T3 *)(& G5)); + -[-c-]-> 17 + -[--d]-> 22 + -[-c-]-> 23 + -[--d]-> 24 + -[--d]-> 29 + {n26}: V2 = 0; + -[-c-]-> 17 + -[a--]-> 18 + {n27}: return V2; + -[-c-]-> 17 + -[--d]-> 18 + -[--d]-> 26 + {n28}: OutRet + -[--d]-> 27 + {n29}: In(G5) + {n30}: In(G1.M2) + {n31}: In(G4) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/decl_dpds.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/decl_dpds.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/decl_dpds.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/decl_dpds.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,120 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/decl_dpds.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + S ∈ [--..--] +tests/pdg/decl_dpds.c:16:[kernel] warning: signed overflow. assert argc+1 ≤ 2147483647; +tests/pdg/decl_dpds.c:18:[kernel] warning: out of bounds read. assert \valid_read(argv+(int)(argc-1)); +tests/pdg/decl_dpds.c:18:[kernel] warning: out of bounds read. assert \valid_read(*(argv+(int)(argc-1))+0); +tests/pdg/decl_dpds.c:19:[kernel] warning: out of bounds read. assert \valid_read(argv+(int)(argc-1)); +tests/pdg/decl_dpds.c:19:[kernel] warning: out of bounds write. assert \valid(*(argv+(int)(argc-1))+0); +tests/pdg/decl_dpds.c:23:[kernel] warning: signed overflow. assert *p+1 ≤ 2147483647; +tests/pdg/decl_dpds.c:25:[kernel] warning: signed overflow. assert -2147483648 ≤ argc0+argc1 ≤ 2147483647; +tests/pdg/decl_dpds.c:25:[kernel] warning: signed overflow. assert -2147483648 ≤ (int)(argc0+argc1)+G ≤ 2147483647; +tests/pdg/decl_dpds.c:25:[kernel] warning: signed overflow. + assert -2147483648 ≤ (int)((int)(argc0+argc1)+G)+S.a ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[pdg] done for function main +[pdg] PDG for main + {n1}: InCtrl + {n2}: VarDecl : argc + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : argv + -[a--]-> 5 + {n5}: In2 + -[a--]-> 4 + {n6}: VarDecl : argc0 + {n7}: VarDecl : tmp + {n8}: VarDecl : argc1 + {n9}: VarDecl : c + {n10}: VarDecl : p + {n11}: VarDecl : __retres + {n12}: unspecified sequence + -[-c-]-> 1 + {n13}: tmp = argc; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[a--]-> 7 + -[-c-]-> 12 + {n14}: argc ++; + -[-c-]-> 1 + -[a-d]-> 2 + -[--d]-> 3 + -[-c-]-> 12 + {n15}: ; + -[-c-]-> 1 + -[-c-]-> 12 + {n16}: argc0 = tmp; + -[-c-]-> 1 + -[a--]-> 6 + -[--d]-> 7 + -[--d]-> 13 + {n17}: argc1 = argc; + -[-c-]-> 1 + -[--d]-> 2 + -[a--]-> 8 + -[--d]-> 14 + {n18}: c = *(*(argv + (argc - 1)) + 0); + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 4 + -[--d]-> 5 + -[a--]-> 9 + -[--d]-> 14 + -[--d]-> 29 + -[--d]-> 30 + -[--d]-> 31 + {n19}: *(*(argv + (argc - 1)) + 0) = (char)'a'; + -[-c-]-> 1 + -[a--]-> 2 + -[a--]-> 4 + -[a--]-> 5 + -[a--]-> 14 + -[a--]-> 29 + {n20}: argc = 0; + -[-c-]-> 1 + -[a--]-> 2 + {n21}: argc0 + -[-c-]-> 1 + -[--d]-> 6 + -[--d]-> 16 + {n22}: p = & argc0; + -[-c-]-> 1 + -[--d]-> 6 + -[a--]-> 10 + -[-c-]-> 21 + {n23}: (*p) ++; + -[-c-]-> 1 + -[a-d]-> 10 + -[--d]-> 16 + -[-c-]-> 21 + -[a-d]-> 22 + {n24}: __retres = ((argc0 + argc1) + G) + S.a; + -[-c-]-> 1 + -[--d]-> 6 + -[--d]-> 8 + -[a--]-> 11 + -[--d]-> 16 + -[--d]-> 17 + -[--d]-> 23 + -[--d]-> 27 + -[--d]-> 28 + {n25}: return __retres; + -[-c-]-> 1 + -[--d]-> 11 + -[--d]-> 24 + {n26}: OutRet + -[--d]-> 25 + {n27}: In(G) + {n28}: In(S.a) + {n29}: In(S_argv[0..3]) + {n30}: In(S_0_S_argv[0]) + {n31}: In(S_1_S_argv[0]) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/doc_dot.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/doc_dot.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/doc_dot.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/doc_dot.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,65 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/doc_dot.c (with preprocessing) +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G1 ∈ [--..--] + G2 ∈ [--..--] + T[0..9] ∈ [--..--] +[value] computing for function f <- g. + Called from tests/pdg/doc_dot.c:14. +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[pdg] computing for function g +[from] Computing for function f +[from] Done for function f +[pdg] done for function g +[pdg] dot file generated in tests/pdg/doc.g.dot +[pdg] PDG for g + {n1}: InCtrl + {n2}: VarDecl : x + {n3}: Call4-InCtrl : x = f(G1,G2,0); + -[-c-]-> 1 + {n4}: Call4-In1 : x = f(G1,G2,0); + -[-c-]-> 1 + -[-c-]-> 3 + -[--d]-> 14 + {n5}: Call4-In2 : x = f(G1,G2,0); + -[-c-]-> 1 + -[-c-]-> 3 + -[--d]-> 13 + {n6}: Call4-In3 : x = f(G1,G2,0); + -[-c-]-> 1 + -[-c-]-> 3 + {n7}: Call4-OutRet : x = f(G1,G2,0); + -[-c-]-> 1 + -[a--]-> 2 + -[-c-]-> 3 + -[--d]-> 4 + -[--d]-> 6 + {n8}: 0 < x + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 7 + {n9}: x < 10 + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 7 + -[-c-]-> 8 + {n10}: T[x] = 0; + -[-c-]-> 1 + -[a--]-> 2 + -[a--]-> 7 + -[-c-]-> 8 + -[-c-]-> 9 + {n11}: return x; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 7 + {n12}: OutRet + -[--d]-> 11 + {n13}: In(G2) + {n14}: In(G1) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.1.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,150 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/dpds_intra.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + S ∈ [--..--] +tests/pdg/dpds_intra.c:113:[kernel] warning: signed overflow. assert b+1 ≤ 2147483647; +tests/pdg/dpds_intra.c:113:[kernel] warning: signed overflow. assert tmp+s.a ≤ 2147483647; + (tmp from b++) +tests/pdg/dpds_intra.c:114:[kernel] warning: signed overflow. assert -2147483648 ≤ 2*a ≤ 2147483647; +tests/pdg/dpds_intra.c:124:[kernel] warning: signed overflow. assert *p+1 ≤ 2147483647; +[value] computing for function test_struct <- main. + Called from tests/pdg/dpds_intra.c:126. +[value] Recording results for test_struct +[value] Done for function test_struct +[value] computing for function test_if_simple <- main. + Called from tests/pdg/dpds_intra.c:127. +[value] Recording results for test_if_simple +[value] Done for function test_if_simple +tests/pdg/dpds_intra.c:127:[kernel] warning: accessing uninitialized left-value: + assert \initialized(&tmp_1); + (tmp_1 from test_if_simple()) +[value] computing for function test_goto_simple <- main. + Called from tests/pdg/dpds_intra.c:128. +[value] Recording results for test_goto_simple +[value] Done for function test_goto_simple +[value] computing for function test_goto_arriere <- main. + Called from tests/pdg/dpds_intra.c:129. +tests/pdg/dpds_intra.c:66:[kernel] warning: signed overflow. assert -2147483648 ≤ G-1; +tests/pdg/dpds_intra.c:65:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for test_goto_arriere +[value] Done for function test_goto_arriere +tests/pdg/dpds_intra.c:129:[kernel] warning: signed overflow. + assert res+tmp_3 ≤ 2147483647; + (tmp_3 from test_goto_arriere()) +[value] computing for function test_goto_else <- main. + Called from tests/pdg/dpds_intra.c:130. +[value] Recording results for test_goto_else +[value] Done for function test_goto_else +tests/pdg/dpds_intra.c:130:[kernel] warning: signed overflow. + assert res+tmp_4 ≤ 2147483647; + (tmp_4 from test_goto_else()) +[value] computing for function test_simple_loop <- main. + Called from tests/pdg/dpds_intra.c:131. +tests/pdg/dpds_intra.c:99:[value] entering loop for the first time +tests/pdg/dpds_intra.c:100:[kernel] warning: signed overflow. assert s+1 ≤ 2147483647; +[value] Recording results for test_simple_loop +[value] Done for function test_simple_loop +tests/pdg/dpds_intra.c:131:[kernel] warning: signed overflow. + assert res+tmp_5 ≤ 2147483647; + (tmp_5 from test_simple_loop(G)) +[value] computing for function multiple_global_inputs <- main. + Called from tests/pdg/dpds_intra.c:132. +tests/pdg/dpds_intra.c:35:[kernel] warning: signed overflow. assert -2147483648 ≤ S.a+G ≤ 2147483647; +[value] Recording results for multiple_global_inputs +[value] Done for function multiple_global_inputs +tests/pdg/dpds_intra.c:132:[kernel] warning: signed overflow. + assert res+tmp_6 ≤ 2147483647; + (tmp_6 from multiple_global_inputs()) +tests/pdg/dpds_intra.c:134:[kernel] warning: signed overflow. assert -2147483648 ≤ *p+res ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[pdg] computing for function test_if_simple +[pdg] done for function test_if_simple +[pdg] PDG for test_if_simple + {n1}: InCtrl + {n2}: VarDecl : x0 + {n3}: VarDecl : x1 + {n4}: VarDecl : x2 + {n5}: VarDecl : x3 + {n6}: VarDecl : x + {n7}: x0 = 0; + -[-c-]-> 1 + -[a--]-> 2 + {n8}: x1 = 1; + -[-c-]-> 1 + -[a--]-> 3 + {n9}: x2 = 2; + -[-c-]-> 1 + -[a--]-> 4 + {n10}: x3 = 10; + -[-c-]-> 1 + -[a--]-> 5 + {n11}: G < x0 + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 7 + -[--d]-> 21 + {n12}: x = x0; + -[-c-]-> 1 + -[--d]-> 2 + -[a--]-> 6 + -[--d]-> 7 + -[-c-]-> 11 + {n13}: G < x1 + -[-c-]-> 1 + -[--d]-> 3 + -[--d]-> 8 + -[-c-]-> 11 + -[--d]-> 21 + {n14}: x = x1; + -[-c-]-> 1 + -[--d]-> 3 + -[a--]-> 6 + -[--d]-> 8 + -[-c-]-> 11 + -[-c-]-> 13 + {n15}: G > x2 + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 9 + -[-c-]-> 11 + -[-c-]-> 13 + -[--d]-> 21 + {n16}: G < x3 + -[-c-]-> 1 + -[--d]-> 5 + -[--d]-> 10 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 15 + -[--d]-> 21 + {n17}: x = x3; + -[-c-]-> 1 + -[--d]-> 5 + -[a--]-> 6 + -[--d]-> 10 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 15 + -[-c-]-> 16 + {n18}: x = -1; + -[-c-]-> 1 + -[a--]-> 6 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 15 + -[-c-]-> 16 + {n19}: return x; + -[-c-]-> 1 + -[--d]-> 6 + -[--d]-> 12 + -[--d]-> 14 + -[--d]-> 17 + -[--d]-> 18 + {n20}: OutRet + -[--d]-> 19 + {n21}: In(G) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.2.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,109 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/dpds_intra.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + S ∈ [--..--] +tests/pdg/dpds_intra.c:113:[kernel] warning: signed overflow. assert b+1 ≤ 2147483647; +tests/pdg/dpds_intra.c:113:[kernel] warning: signed overflow. assert tmp+s.a ≤ 2147483647; + (tmp from b++) +tests/pdg/dpds_intra.c:114:[kernel] warning: signed overflow. assert -2147483648 ≤ 2*a ≤ 2147483647; +tests/pdg/dpds_intra.c:124:[kernel] warning: signed overflow. assert *p+1 ≤ 2147483647; +[value] computing for function test_struct <- main. + Called from tests/pdg/dpds_intra.c:126. +[value] Recording results for test_struct +[value] Done for function test_struct +[value] computing for function test_if_simple <- main. + Called from tests/pdg/dpds_intra.c:127. +[value] Recording results for test_if_simple +[value] Done for function test_if_simple +tests/pdg/dpds_intra.c:127:[kernel] warning: accessing uninitialized left-value: + assert \initialized(&tmp_1); + (tmp_1 from test_if_simple()) +[value] computing for function test_goto_simple <- main. + Called from tests/pdg/dpds_intra.c:128. +[value] Recording results for test_goto_simple +[value] Done for function test_goto_simple +[value] computing for function test_goto_arriere <- main. + Called from tests/pdg/dpds_intra.c:129. +tests/pdg/dpds_intra.c:66:[kernel] warning: signed overflow. assert -2147483648 ≤ G-1; +tests/pdg/dpds_intra.c:65:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for test_goto_arriere +[value] Done for function test_goto_arriere +tests/pdg/dpds_intra.c:129:[kernel] warning: signed overflow. + assert res+tmp_3 ≤ 2147483647; + (tmp_3 from test_goto_arriere()) +[value] computing for function test_goto_else <- main. + Called from tests/pdg/dpds_intra.c:130. +[value] Recording results for test_goto_else +[value] Done for function test_goto_else +tests/pdg/dpds_intra.c:130:[kernel] warning: signed overflow. + assert res+tmp_4 ≤ 2147483647; + (tmp_4 from test_goto_else()) +[value] computing for function test_simple_loop <- main. + Called from tests/pdg/dpds_intra.c:131. +tests/pdg/dpds_intra.c:99:[value] entering loop for the first time +tests/pdg/dpds_intra.c:100:[kernel] warning: signed overflow. assert s+1 ≤ 2147483647; +[value] Recording results for test_simple_loop +[value] Done for function test_simple_loop +tests/pdg/dpds_intra.c:131:[kernel] warning: signed overflow. + assert res+tmp_5 ≤ 2147483647; + (tmp_5 from test_simple_loop(G)) +[value] computing for function multiple_global_inputs <- main. + Called from tests/pdg/dpds_intra.c:132. +tests/pdg/dpds_intra.c:35:[kernel] warning: signed overflow. assert -2147483648 ≤ S.a+G ≤ 2147483647; +[value] Recording results for multiple_global_inputs +[value] Done for function multiple_global_inputs +tests/pdg/dpds_intra.c:132:[kernel] warning: signed overflow. + assert res+tmp_6 ≤ 2147483647; + (tmp_6 from multiple_global_inputs()) +tests/pdg/dpds_intra.c:134:[kernel] warning: signed overflow. assert -2147483648 ≤ *p+res ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[pdg] computing for function test_goto_simple +[pdg] done for function test_goto_simple +[pdg] PDG for test_goto_simple + {n1}: InCtrl + {n2}: VarDecl : r + {n3}: G > 0 + -[-c-]-> 1 + -[--d]-> 13 + {n4}: goto Lelse; + -[-c-]-> 1 + -[-c-]-> 3 + -[-c-]-> 5 + {n5}: Lelse: + -[-c-]-> 1 + -[-c-]-> 3 + -[-c-]-> 4 + -[-c-]-> 8 + {n6}: r = -1; + -[-c-]-> 1 + -[a--]-> 2 + -[-c-]-> 3 + -[-c-]-> 4 + {n7}: Lelse: r = 1; + -[-c-]-> 1 + -[a--]-> 2 + -[-c-]-> 3 + -[-c-]-> 4 + -[-c-]-> 8 + {n8}: goto Lfin; + -[-c-]-> 1 + -[-c-]-> 3 + -[-c-]-> 4 + -[-c-]-> 9 + {n9}: Lfin: + -[-c-]-> 1 + {n10}: Lfin: ; + -[-c-]-> 1 + {n11}: return r; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 6 + -[--d]-> 7 + {n12}: OutRet + -[--d]-> 11 + {n13}: In(G) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.3.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.3.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,126 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/dpds_intra.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + S ∈ [--..--] +tests/pdg/dpds_intra.c:113:[kernel] warning: signed overflow. assert b+1 ≤ 2147483647; +tests/pdg/dpds_intra.c:113:[kernel] warning: signed overflow. assert tmp+s.a ≤ 2147483647; + (tmp from b++) +tests/pdg/dpds_intra.c:114:[kernel] warning: signed overflow. assert -2147483648 ≤ 2*a ≤ 2147483647; +tests/pdg/dpds_intra.c:124:[kernel] warning: signed overflow. assert *p+1 ≤ 2147483647; +[value] computing for function test_struct <- main. + Called from tests/pdg/dpds_intra.c:126. +[value] Recording results for test_struct +[value] Done for function test_struct +[value] computing for function test_if_simple <- main. + Called from tests/pdg/dpds_intra.c:127. +[value] Recording results for test_if_simple +[value] Done for function test_if_simple +tests/pdg/dpds_intra.c:127:[kernel] warning: accessing uninitialized left-value: + assert \initialized(&tmp_1); + (tmp_1 from test_if_simple()) +[value] computing for function test_goto_simple <- main. + Called from tests/pdg/dpds_intra.c:128. +[value] Recording results for test_goto_simple +[value] Done for function test_goto_simple +[value] computing for function test_goto_arriere <- main. + Called from tests/pdg/dpds_intra.c:129. +tests/pdg/dpds_intra.c:66:[kernel] warning: signed overflow. assert -2147483648 ≤ G-1; +tests/pdg/dpds_intra.c:65:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for test_goto_arriere +[value] Done for function test_goto_arriere +tests/pdg/dpds_intra.c:129:[kernel] warning: signed overflow. + assert res+tmp_3 ≤ 2147483647; + (tmp_3 from test_goto_arriere()) +[value] computing for function test_goto_else <- main. + Called from tests/pdg/dpds_intra.c:130. +[value] Recording results for test_goto_else +[value] Done for function test_goto_else +tests/pdg/dpds_intra.c:130:[kernel] warning: signed overflow. + assert res+tmp_4 ≤ 2147483647; + (tmp_4 from test_goto_else()) +[value] computing for function test_simple_loop <- main. + Called from tests/pdg/dpds_intra.c:131. +tests/pdg/dpds_intra.c:99:[value] entering loop for the first time +tests/pdg/dpds_intra.c:100:[kernel] warning: signed overflow. assert s+1 ≤ 2147483647; +[value] Recording results for test_simple_loop +[value] Done for function test_simple_loop +tests/pdg/dpds_intra.c:131:[kernel] warning: signed overflow. + assert res+tmp_5 ≤ 2147483647; + (tmp_5 from test_simple_loop(G)) +[value] computing for function multiple_global_inputs <- main. + Called from tests/pdg/dpds_intra.c:132. +tests/pdg/dpds_intra.c:35:[kernel] warning: signed overflow. assert -2147483648 ≤ S.a+G ≤ 2147483647; +[value] Recording results for multiple_global_inputs +[value] Done for function multiple_global_inputs +tests/pdg/dpds_intra.c:132:[kernel] warning: signed overflow. + assert res+tmp_6 ≤ 2147483647; + (tmp_6 from multiple_global_inputs()) +tests/pdg/dpds_intra.c:134:[kernel] warning: signed overflow. assert -2147483648 ≤ *p+res ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[pdg] computing for function test_goto_arriere +[pdg] done for function test_goto_arriere +[pdg] PDG for test_goto_arriere + {n1}: InCtrl + {n2}: VarDecl : x + {n3}: VarDecl : tmp + {n4}: x = 1; + -[-c-]-> 1 + -[a--]-> 2 + {n5}: L: + -[-c-]-> 1 + -[-c-]-> 11 + -[-c-]-> 12 + {n6}: L: x ++; + -[-c-]-> 1 + -[a-d]-> 2 + -[--d]-> 4 + -[--d]-> 6 + -[-c-]-> 11 + -[-c-]-> 12 + {n7}: unspecified sequence + -[-c-]-> 1 + -[-c-]-> 11 + -[-c-]-> 12 + {n8}: tmp = G; + -[-c-]-> 1 + -[a--]-> 3 + -[-c-]-> 7 + -[--d]-> 9 + -[-c-]-> 11 + -[-c-]-> 12 + -[--d]-> 15 + {n9}: G --; + -[-c-]-> 1 + -[-c-]-> 7 + -[--d]-> 9 + -[-c-]-> 11 + -[-c-]-> 12 + -[--d]-> 15 + {n10}: ; + -[-c-]-> 1 + -[-c-]-> 7 + -[-c-]-> 11 + -[-c-]-> 12 + {n11}: tmp > 0 + -[-c-]-> 1 + -[--d]-> 3 + -[--d]-> 8 + -[-c-]-> 11 + -[-c-]-> 12 + {n12}: goto L; + -[-c-]-> 1 + -[-c-]-> 5 + -[-c-]-> 11 + -[-c-]-> 12 + {n13}: return x; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 6 + {n14}: OutRet + -[--d]-> 13 + {n15}: In(G) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.4.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.4.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,105 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/dpds_intra.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + S ∈ [--..--] +tests/pdg/dpds_intra.c:113:[kernel] warning: signed overflow. assert b+1 ≤ 2147483647; +tests/pdg/dpds_intra.c:113:[kernel] warning: signed overflow. assert tmp+s.a ≤ 2147483647; + (tmp from b++) +tests/pdg/dpds_intra.c:114:[kernel] warning: signed overflow. assert -2147483648 ≤ 2*a ≤ 2147483647; +tests/pdg/dpds_intra.c:124:[kernel] warning: signed overflow. assert *p+1 ≤ 2147483647; +[value] computing for function test_struct <- main. + Called from tests/pdg/dpds_intra.c:126. +[value] Recording results for test_struct +[value] Done for function test_struct +[value] computing for function test_if_simple <- main. + Called from tests/pdg/dpds_intra.c:127. +[value] Recording results for test_if_simple +[value] Done for function test_if_simple +tests/pdg/dpds_intra.c:127:[kernel] warning: accessing uninitialized left-value: + assert \initialized(&tmp_1); + (tmp_1 from test_if_simple()) +[value] computing for function test_goto_simple <- main. + Called from tests/pdg/dpds_intra.c:128. +[value] Recording results for test_goto_simple +[value] Done for function test_goto_simple +[value] computing for function test_goto_arriere <- main. + Called from tests/pdg/dpds_intra.c:129. +tests/pdg/dpds_intra.c:66:[kernel] warning: signed overflow. assert -2147483648 ≤ G-1; +tests/pdg/dpds_intra.c:65:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for test_goto_arriere +[value] Done for function test_goto_arriere +tests/pdg/dpds_intra.c:129:[kernel] warning: signed overflow. + assert res+tmp_3 ≤ 2147483647; + (tmp_3 from test_goto_arriere()) +[value] computing for function test_goto_else <- main. + Called from tests/pdg/dpds_intra.c:130. +[value] Recording results for test_goto_else +[value] Done for function test_goto_else +tests/pdg/dpds_intra.c:130:[kernel] warning: signed overflow. + assert res+tmp_4 ≤ 2147483647; + (tmp_4 from test_goto_else()) +[value] computing for function test_simple_loop <- main. + Called from tests/pdg/dpds_intra.c:131. +tests/pdg/dpds_intra.c:99:[value] entering loop for the first time +tests/pdg/dpds_intra.c:100:[kernel] warning: signed overflow. assert s+1 ≤ 2147483647; +[value] Recording results for test_simple_loop +[value] Done for function test_simple_loop +tests/pdg/dpds_intra.c:131:[kernel] warning: signed overflow. + assert res+tmp_5 ≤ 2147483647; + (tmp_5 from test_simple_loop(G)) +[value] computing for function multiple_global_inputs <- main. + Called from tests/pdg/dpds_intra.c:132. +tests/pdg/dpds_intra.c:35:[kernel] warning: signed overflow. assert -2147483648 ≤ S.a+G ≤ 2147483647; +[value] Recording results for multiple_global_inputs +[value] Done for function multiple_global_inputs +tests/pdg/dpds_intra.c:132:[kernel] warning: signed overflow. + assert res+tmp_6 ≤ 2147483647; + (tmp_6 from multiple_global_inputs()) +tests/pdg/dpds_intra.c:134:[kernel] warning: signed overflow. assert -2147483648 ≤ *p+res ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[pdg] computing for function test_goto_else +[pdg] done for function test_goto_else +[pdg] PDG for test_goto_else + {n1}: InCtrl + {n2}: VarDecl : x + {n3}: VarDecl : a + {n4}: VarDecl : b + {n5}: b = 0; + -[-c-]-> 1 + -[a--]-> 4 + {n6}: G + -[-c-]-> 1 + -[--d]-> 14 + {n7}: x = 1; + -[-c-]-> 1 + -[a--]-> 2 + -[-c-]-> 6 + {n8}: a = 1; + -[-c-]-> 1 + -[a--]-> 3 + -[-c-]-> 6 + {n9}: goto L; + -[-c-]-> 1 + -[-c-]-> 6 + -[-c-]-> 10 + {n10}: L: + -[-c-]-> 1 + -[-c-]-> 6 + -[-c-]-> 9 + {n11}: L: b = 1; + -[-c-]-> 1 + -[a--]-> 4 + -[-c-]-> 6 + -[-c-]-> 9 + {n12}: return b; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 11 + {n13}: OutRet + -[--d]-> 12 + {n14}: In(G) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.5.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.5.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.5.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,2 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/dpds_intra.c (with preprocessing) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.6.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.6.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.6.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.6.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,129 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/dpds_intra.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + S ∈ [--..--] +tests/pdg/dpds_intra.c:113:[kernel] warning: signed overflow. assert b+1 ≤ 2147483647; +tests/pdg/dpds_intra.c:113:[kernel] warning: signed overflow. assert tmp+s.a ≤ 2147483647; + (tmp from b++) +tests/pdg/dpds_intra.c:114:[kernel] warning: signed overflow. assert -2147483648 ≤ 2*a ≤ 2147483647; +tests/pdg/dpds_intra.c:124:[kernel] warning: signed overflow. assert *p+1 ≤ 2147483647; +[value] computing for function test_struct <- main. + Called from tests/pdg/dpds_intra.c:126. +[value] Recording results for test_struct +[value] Done for function test_struct +[value] computing for function test_if_simple <- main. + Called from tests/pdg/dpds_intra.c:127. +[value] Recording results for test_if_simple +[value] Done for function test_if_simple +tests/pdg/dpds_intra.c:127:[kernel] warning: accessing uninitialized left-value: + assert \initialized(&tmp_1); + (tmp_1 from test_if_simple()) +[value] computing for function test_goto_simple <- main. + Called from tests/pdg/dpds_intra.c:128. +[value] Recording results for test_goto_simple +[value] Done for function test_goto_simple +[value] computing for function test_goto_arriere <- main. + Called from tests/pdg/dpds_intra.c:129. +tests/pdg/dpds_intra.c:66:[kernel] warning: signed overflow. assert -2147483648 ≤ G-1; +tests/pdg/dpds_intra.c:65:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for test_goto_arriere +[value] Done for function test_goto_arriere +tests/pdg/dpds_intra.c:129:[kernel] warning: signed overflow. + assert res+tmp_3 ≤ 2147483647; + (tmp_3 from test_goto_arriere()) +[value] computing for function test_goto_else <- main. + Called from tests/pdg/dpds_intra.c:130. +[value] Recording results for test_goto_else +[value] Done for function test_goto_else +tests/pdg/dpds_intra.c:130:[kernel] warning: signed overflow. + assert res+tmp_4 ≤ 2147483647; + (tmp_4 from test_goto_else()) +[value] computing for function test_simple_loop <- main. + Called from tests/pdg/dpds_intra.c:131. +tests/pdg/dpds_intra.c:99:[value] entering loop for the first time +tests/pdg/dpds_intra.c:100:[kernel] warning: signed overflow. assert s+1 ≤ 2147483647; +[value] Recording results for test_simple_loop +[value] Done for function test_simple_loop +tests/pdg/dpds_intra.c:131:[kernel] warning: signed overflow. + assert res+tmp_5 ≤ 2147483647; + (tmp_5 from test_simple_loop(G)) +[value] computing for function multiple_global_inputs <- main. + Called from tests/pdg/dpds_intra.c:132. +tests/pdg/dpds_intra.c:35:[kernel] warning: signed overflow. assert -2147483648 ≤ S.a+G ≤ 2147483647; +[value] Recording results for multiple_global_inputs +[value] Done for function multiple_global_inputs +tests/pdg/dpds_intra.c:132:[kernel] warning: signed overflow. + assert res+tmp_6 ≤ 2147483647; + (tmp_6 from multiple_global_inputs()) +tests/pdg/dpds_intra.c:134:[kernel] warning: signed overflow. assert -2147483648 ≤ *p+res ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[pdg] computing for function test_simple_loop +[pdg] done for function test_simple_loop +[pdg] PDG for test_simple_loop + {n1}: InCtrl + {n2}: VarDecl : n + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : i + {n5}: VarDecl : s + {n6}: s = 0; + -[-c-]-> 1 + -[a--]-> 5 + {n7}: i = 0; + -[-c-]-> 1 + -[a--]-> 4 + {n8}: while(1) + -[-c-]-> 1 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 13 + {n9}: i < n + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[--d]-> 4 + -[--d]-> 7 + -[-c-]-> 8 + -[-c-]-> 9 + -[--d]-> 12 + -[-c-]-> 13 + {n10}: block + -[-c-]-> 1 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 13 + {n11}: s ++; + -[-c-]-> 1 + -[a-d]-> 5 + -[--d]-> 6 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 10 + -[--d]-> 11 + -[-c-]-> 13 + {n12}: i ++; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 7 + -[-c-]-> 8 + -[-c-]-> 9 + -[--d]-> 12 + -[-c-]-> 13 + {n13}: break; + -[-c-]-> 1 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 13 + {n14}: return s; + -[-c-]-> 1 + -[--d]-> 5 + -[--d]-> 6 + -[--d]-> 11 + {n15}: OutRet + -[--d]-> 14 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.7.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.7.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.7.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.7.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,321 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/dpds_intra.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + S ∈ [--..--] +tests/pdg/dpds_intra.c:113:[kernel] warning: signed overflow. assert b+1 ≤ 2147483647; +tests/pdg/dpds_intra.c:113:[kernel] warning: signed overflow. assert tmp+s.a ≤ 2147483647; + (tmp from b++) +tests/pdg/dpds_intra.c:114:[kernel] warning: signed overflow. assert -2147483648 ≤ 2*a ≤ 2147483647; +tests/pdg/dpds_intra.c:124:[kernel] warning: signed overflow. assert *p+1 ≤ 2147483647; +[value] computing for function test_struct <- main. + Called from tests/pdg/dpds_intra.c:126. +[value] Recording results for test_struct +[value] Done for function test_struct +[value] computing for function test_if_simple <- main. + Called from tests/pdg/dpds_intra.c:127. +[value] Recording results for test_if_simple +[value] Done for function test_if_simple +tests/pdg/dpds_intra.c:127:[kernel] warning: accessing uninitialized left-value: + assert \initialized(&tmp_1); + (tmp_1 from test_if_simple()) +[value] computing for function test_goto_simple <- main. + Called from tests/pdg/dpds_intra.c:128. +[value] Recording results for test_goto_simple +[value] Done for function test_goto_simple +[value] computing for function test_goto_arriere <- main. + Called from tests/pdg/dpds_intra.c:129. +tests/pdg/dpds_intra.c:66:[kernel] warning: signed overflow. assert -2147483648 ≤ G-1; +tests/pdg/dpds_intra.c:65:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for test_goto_arriere +[value] Done for function test_goto_arriere +tests/pdg/dpds_intra.c:129:[kernel] warning: signed overflow. + assert res+tmp_3 ≤ 2147483647; + (tmp_3 from test_goto_arriere()) +[value] computing for function test_goto_else <- main. + Called from tests/pdg/dpds_intra.c:130. +[value] Recording results for test_goto_else +[value] Done for function test_goto_else +tests/pdg/dpds_intra.c:130:[kernel] warning: signed overflow. + assert res+tmp_4 ≤ 2147483647; + (tmp_4 from test_goto_else()) +[value] computing for function test_simple_loop <- main. + Called from tests/pdg/dpds_intra.c:131. +tests/pdg/dpds_intra.c:99:[value] entering loop for the first time +tests/pdg/dpds_intra.c:100:[kernel] warning: signed overflow. assert s+1 ≤ 2147483647; +[value] Recording results for test_simple_loop +[value] Done for function test_simple_loop +tests/pdg/dpds_intra.c:131:[kernel] warning: signed overflow. + assert res+tmp_5 ≤ 2147483647; + (tmp_5 from test_simple_loop(G)) +[value] computing for function multiple_global_inputs <- main. + Called from tests/pdg/dpds_intra.c:132. +tests/pdg/dpds_intra.c:35:[kernel] warning: signed overflow. assert -2147483648 ≤ S.a+G ≤ 2147483647; +[value] Recording results for multiple_global_inputs +[value] Done for function multiple_global_inputs +tests/pdg/dpds_intra.c:132:[kernel] warning: signed overflow. + assert res+tmp_6 ≤ 2147483647; + (tmp_6 from multiple_global_inputs()) +tests/pdg/dpds_intra.c:134:[kernel] warning: signed overflow. assert -2147483648 ≤ *p+res ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function test_struct +[from] Done for function test_struct +[from] Computing for function test_if_simple +[from] Done for function test_if_simple +[from] Computing for function test_goto_simple +[from] Done for function test_goto_simple +[from] Computing for function test_goto_arriere +[from] Done for function test_goto_arriere +[from] Computing for function test_goto_else +[from] Done for function test_goto_else +[from] Computing for function test_simple_loop +[from] Done for function test_simple_loop +[from] Computing for function multiple_global_inputs +[from] Done for function multiple_global_inputs +[pdg] done for function main +[pdg] PDG for main + {n1}: InCtrl + {n2}: VarDecl : a + {n3}: VarDecl : b + {n4}: VarDecl : res + {n5}: VarDecl : s + {n6}: VarDecl : p + {n7}: VarDecl : tmp + {n8}: VarDecl : a_0 + {n9}: VarDecl : tmp_0 + {n10}: VarDecl : tmp_1 + {n11}: VarDecl : tmp_2 + {n12}: VarDecl : tmp_3 + {n13}: VarDecl : tmp_4 + {n14}: VarDecl : tmp_5 + {n15}: VarDecl : tmp_6 + {n16}: VarDecl : __retres + {n17}: b = G; + -[-c-]-> 1 + -[a--]-> 3 + -[--d]-> 66 + {n18}: res = 0; + -[-c-]-> 1 + -[a--]-> 4 + {n19}: s.a = 1; + -[-c-]-> 1 + -[a--]-> 5 + {n20}: s.b = 2; + -[-c-]-> 1 + -[a--]-> 5 + {n21}: unspecified sequence + -[-c-]-> 1 + {n22}: tmp = b; + -[-c-]-> 1 + -[--d]-> 3 + -[a--]-> 7 + -[--d]-> 17 + -[-c-]-> 21 + {n23}: b ++; + -[-c-]-> 1 + -[a-d]-> 3 + -[--d]-> 17 + -[-c-]-> 21 + {n24}: a = tmp + s.a; + -[-c-]-> 1 + -[a--]-> 2 + -[--d]-> 5 + -[--d]-> 7 + -[--d]-> 19 + -[-c-]-> 21 + -[--d]-> 22 + {n25}: b = 2 * a; + -[-c-]-> 1 + -[--d]-> 2 + -[a--]-> 3 + -[--d]-> 24 + {n26}: b > G + -[-c-]-> 1 + -[--d]-> 3 + -[--d]-> 25 + -[--d]-> 66 + {n27}: p = & a; + -[-c-]-> 1 + -[--d]-> 2 + -[a--]-> 6 + -[-c-]-> 26 + {n28}: a_0 = 1; + -[-c-]-> 1 + -[a--]-> 8 + -[-c-]-> 26 + {n29}: p = & b; + -[-c-]-> 1 + -[--d]-> 3 + -[a--]-> 6 + -[-c-]-> 26 + {n30}: a_0 ++; + -[-c-]-> 1 + -[a-d]-> 8 + -[-c-]-> 26 + -[--d]-> 28 + {n31}: (*p) ++; + -[-c-]-> 1 + -[a-d]-> 6 + -[--d]-> 24 + -[--d]-> 25 + -[a-d]-> 27 + -[a-d]-> 29 + {n32}: unspecified sequence + -[-c-]-> 1 + {n33}: Call103-InCtrl : tmp_0 = test_struct(); + -[-c-]-> 1 + -[-c-]-> 32 + {n34}: Call103-OutRet : tmp_0 = test_struct(); + -[-c-]-> 1 + -[a--]-> 9 + -[-c-]-> 32 + -[-c-]-> 33 + {n35}: res += tmp_0; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 9 + -[--d]-> 18 + -[-c-]-> 32 + -[--d]-> 34 + {n36}: unspecified sequence + -[-c-]-> 1 + {n37}: Call106-InCtrl : tmp_1 = test_if_simple(); + -[-c-]-> 1 + -[-c-]-> 36 + {n38}: Call106-OutRet : tmp_1 = test_if_simple(); + -[-c-]-> 1 + -[a--]-> 10 + -[-c-]-> 36 + -[-c-]-> 37 + -[--d]-> 66 + {n39}: res += tmp_1; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 10 + -[--d]-> 35 + -[-c-]-> 36 + -[--d]-> 38 + {n40}: unspecified sequence + -[-c-]-> 1 + {n41}: Call109-InCtrl : tmp_2 = test_goto_simple(); + -[-c-]-> 1 + -[-c-]-> 40 + {n42}: Call109-OutRet : tmp_2 = test_goto_simple(); + -[-c-]-> 1 + -[a--]-> 11 + -[-c-]-> 40 + -[-c-]-> 41 + -[--d]-> 66 + {n43}: res += tmp_2; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 11 + -[--d]-> 39 + -[-c-]-> 40 + -[--d]-> 42 + {n44}: unspecified sequence + -[-c-]-> 1 + {n45}: Call112-InCtrl : tmp_3 = test_goto_arriere(); + -[-c-]-> 1 + -[-c-]-> 44 + {n46}: Call112-Out(G) : tmp_3 = test_goto_arriere(); + -[-c-]-> 1 + -[-c-]-> 44 + -[-c-]-> 45 + -[--d]-> 66 + {n47}: Call112-OutRet : tmp_3 = test_goto_arriere(); + -[-c-]-> 1 + -[a--]-> 12 + -[-c-]-> 44 + -[-c-]-> 45 + -[--d]-> 66 + {n48}: res += tmp_3; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 12 + -[--d]-> 43 + -[-c-]-> 44 + -[--d]-> 47 + {n49}: unspecified sequence + -[-c-]-> 1 + {n50}: Call115-InCtrl : tmp_4 = test_goto_else(); + -[-c-]-> 1 + -[-c-]-> 49 + {n51}: Call115-OutRet : tmp_4 = test_goto_else(); + -[-c-]-> 1 + -[a--]-> 13 + -[-c-]-> 49 + -[-c-]-> 50 + {n52}: res += tmp_4; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 13 + -[--d]-> 48 + -[-c-]-> 49 + -[--d]-> 51 + {n53}: unspecified sequence + -[-c-]-> 1 + {n54}: Call118-InCtrl : tmp_5 = test_simple_loop(G); + -[-c-]-> 1 + -[-c-]-> 53 + {n55}: Call118-In1 : tmp_5 = test_simple_loop(G); + -[-c-]-> 1 + -[--d](G)-> 46 + -[-c-]-> 53 + -[-c-]-> 54 + {n56}: Call118-OutRet : tmp_5 = test_simple_loop(G); + -[-c-]-> 1 + -[a--]-> 14 + -[-c-]-> 53 + -[-c-]-> 54 + -[--d]-> 55 + {n57}: res += tmp_5; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 14 + -[--d]-> 52 + -[-c-]-> 53 + -[--d]-> 56 + {n58}: unspecified sequence + -[-c-]-> 1 + {n59}: Call121-InCtrl : tmp_6 = multiple_global_inputs(); + -[-c-]-> 1 + -[-c-]-> 58 + {n60}: Call121-OutRet : tmp_6 = multiple_global_inputs(); + -[-c-]-> 1 + -[a--]-> 15 + -[--d](G)-> 46 + -[-c-]-> 58 + -[-c-]-> 59 + -[--d]-> 65 + {n61}: res += tmp_6; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 15 + -[--d]-> 57 + -[-c-]-> 58 + -[--d]-> 60 + {n62}: __retres = *p + res; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 6 + -[a--]-> 16 + -[--d]-> 24 + -[--d]-> 25 + -[--d]-> 27 + -[--d]-> 29 + -[--d]-> 31 + -[--d]-> 61 + {n63}: return __retres; + -[-c-]-> 1 + -[--d]-> 16 + -[--d]-> 62 + {n64}: OutRet + -[--d]-> 63 + {n65}: In(S.a) + {n66}: In(G) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.8.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.8.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.8.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.8.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,82 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/dpds_intra.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + S ∈ [--..--] +tests/pdg/dpds_intra.c:113:[kernel] warning: signed overflow. assert b+1 ≤ 2147483647; +tests/pdg/dpds_intra.c:113:[kernel] warning: signed overflow. assert tmp+s.a ≤ 2147483647; + (tmp from b++) +tests/pdg/dpds_intra.c:114:[kernel] warning: signed overflow. assert -2147483648 ≤ 2*a ≤ 2147483647; +tests/pdg/dpds_intra.c:124:[kernel] warning: signed overflow. assert *p+1 ≤ 2147483647; +[value] computing for function test_struct <- main. + Called from tests/pdg/dpds_intra.c:126. +[value] Recording results for test_struct +[value] Done for function test_struct +[value] computing for function test_if_simple <- main. + Called from tests/pdg/dpds_intra.c:127. +[value] Recording results for test_if_simple +[value] Done for function test_if_simple +tests/pdg/dpds_intra.c:127:[kernel] warning: accessing uninitialized left-value: + assert \initialized(&tmp_1); + (tmp_1 from test_if_simple()) +[value] computing for function test_goto_simple <- main. + Called from tests/pdg/dpds_intra.c:128. +[value] Recording results for test_goto_simple +[value] Done for function test_goto_simple +[value] computing for function test_goto_arriere <- main. + Called from tests/pdg/dpds_intra.c:129. +tests/pdg/dpds_intra.c:66:[kernel] warning: signed overflow. assert -2147483648 ≤ G-1; +tests/pdg/dpds_intra.c:65:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for test_goto_arriere +[value] Done for function test_goto_arriere +tests/pdg/dpds_intra.c:129:[kernel] warning: signed overflow. + assert res+tmp_3 ≤ 2147483647; + (tmp_3 from test_goto_arriere()) +[value] computing for function test_goto_else <- main. + Called from tests/pdg/dpds_intra.c:130. +[value] Recording results for test_goto_else +[value] Done for function test_goto_else +tests/pdg/dpds_intra.c:130:[kernel] warning: signed overflow. + assert res+tmp_4 ≤ 2147483647; + (tmp_4 from test_goto_else()) +[value] computing for function test_simple_loop <- main. + Called from tests/pdg/dpds_intra.c:131. +tests/pdg/dpds_intra.c:99:[value] entering loop for the first time +tests/pdg/dpds_intra.c:100:[kernel] warning: signed overflow. assert s+1 ≤ 2147483647; +[value] Recording results for test_simple_loop +[value] Done for function test_simple_loop +tests/pdg/dpds_intra.c:131:[kernel] warning: signed overflow. + assert res+tmp_5 ≤ 2147483647; + (tmp_5 from test_simple_loop(G)) +[value] computing for function multiple_global_inputs <- main. + Called from tests/pdg/dpds_intra.c:132. +tests/pdg/dpds_intra.c:35:[kernel] warning: signed overflow. assert -2147483648 ≤ S.a+G ≤ 2147483647; +[value] Recording results for multiple_global_inputs +[value] Done for function multiple_global_inputs +tests/pdg/dpds_intra.c:132:[kernel] warning: signed overflow. + assert res+tmp_6 ≤ 2147483647; + (tmp_6 from multiple_global_inputs()) +tests/pdg/dpds_intra.c:134:[kernel] warning: signed overflow. assert -2147483648 ≤ *p+res ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[pdg] computing for function multiple_global_inputs +[pdg] done for function multiple_global_inputs +[pdg] PDG for multiple_global_inputs + {n1}: InCtrl + {n2}: VarDecl : __retres + {n3}: __retres = S.a + G; + -[-c-]-> 1 + -[a--]-> 2 + -[--d]-> 6 + -[--d]-> 7 + {n4}: return __retres; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + {n5}: OutRet + -[--d]-> 4 + {n6}: In(G) + {n7}: In(S.a) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/dpds_intra.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dpds_intra.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,90 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/dpds_intra.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + S ∈ [--..--] +tests/pdg/dpds_intra.c:113:[kernel] warning: signed overflow. assert b+1 ≤ 2147483647; +tests/pdg/dpds_intra.c:113:[kernel] warning: signed overflow. assert tmp+s.a ≤ 2147483647; + (tmp from b++) +tests/pdg/dpds_intra.c:114:[kernel] warning: signed overflow. assert -2147483648 ≤ 2*a ≤ 2147483647; +tests/pdg/dpds_intra.c:124:[kernel] warning: signed overflow. assert *p+1 ≤ 2147483647; +[value] computing for function test_struct <- main. + Called from tests/pdg/dpds_intra.c:126. +[value] Recording results for test_struct +[value] Done for function test_struct +[value] computing for function test_if_simple <- main. + Called from tests/pdg/dpds_intra.c:127. +[value] Recording results for test_if_simple +[value] Done for function test_if_simple +tests/pdg/dpds_intra.c:127:[kernel] warning: accessing uninitialized left-value: + assert \initialized(&tmp_1); + (tmp_1 from test_if_simple()) +[value] computing for function test_goto_simple <- main. + Called from tests/pdg/dpds_intra.c:128. +[value] Recording results for test_goto_simple +[value] Done for function test_goto_simple +[value] computing for function test_goto_arriere <- main. + Called from tests/pdg/dpds_intra.c:129. +tests/pdg/dpds_intra.c:66:[kernel] warning: signed overflow. assert -2147483648 ≤ G-1; +tests/pdg/dpds_intra.c:65:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for test_goto_arriere +[value] Done for function test_goto_arriere +tests/pdg/dpds_intra.c:129:[kernel] warning: signed overflow. + assert res+tmp_3 ≤ 2147483647; + (tmp_3 from test_goto_arriere()) +[value] computing for function test_goto_else <- main. + Called from tests/pdg/dpds_intra.c:130. +[value] Recording results for test_goto_else +[value] Done for function test_goto_else +tests/pdg/dpds_intra.c:130:[kernel] warning: signed overflow. + assert res+tmp_4 ≤ 2147483647; + (tmp_4 from test_goto_else()) +[value] computing for function test_simple_loop <- main. + Called from tests/pdg/dpds_intra.c:131. +tests/pdg/dpds_intra.c:99:[value] entering loop for the first time +tests/pdg/dpds_intra.c:100:[kernel] warning: signed overflow. assert s+1 ≤ 2147483647; +[value] Recording results for test_simple_loop +[value] Done for function test_simple_loop +tests/pdg/dpds_intra.c:131:[kernel] warning: signed overflow. + assert res+tmp_5 ≤ 2147483647; + (tmp_5 from test_simple_loop(G)) +[value] computing for function multiple_global_inputs <- main. + Called from tests/pdg/dpds_intra.c:132. +tests/pdg/dpds_intra.c:35:[kernel] warning: signed overflow. assert -2147483648 ≤ S.a+G ≤ 2147483647; +[value] Recording results for multiple_global_inputs +[value] Done for function multiple_global_inputs +tests/pdg/dpds_intra.c:132:[kernel] warning: signed overflow. + assert res+tmp_6 ≤ 2147483647; + (tmp_6 from multiple_global_inputs()) +tests/pdg/dpds_intra.c:134:[kernel] warning: signed overflow. assert -2147483648 ≤ *p+res ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[pdg] computing for function test_struct +[pdg] done for function test_struct +[pdg] PDG for test_struct + {n1}: InCtrl + {n2}: VarDecl : s1 + {n3}: VarDecl : s2 + {n4}: VarDecl : __retres + {n5}: s1.a = 1; + -[-c-]-> 1 + -[a--]-> 2 + {n6}: s2 = s1; + -[-c-]-> 1 + -[--d]-> 2 + -[a--]-> 3 + -[--d]-> 5 + {n7}: __retres = s2.a; + -[-c-]-> 1 + -[--d]-> 3 + -[a--]-> 4 + -[--d]-> 6 + {n8}: return __retres; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 7 + {n9}: OutRet + -[--d]-> 8 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/dyn_dpds.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dyn_dpds.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/dyn_dpds.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/dyn_dpds.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,142 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/dyn_dpds.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} +tests/pdg/dyn_dpds.c:20:[kernel] warning: signed overflow. assert -2147483648 ≤ a+b ≤ 2147483647; +tests/pdg/dyn_dpds.c:23:[kernel] warning: signed overflow. assert -x ≤ 2147483647; +tests/pdg/dyn_dpds.c:24:[value] Assertion got status unknown. +[value] Recording results for main +[value] done for function main +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM a; b; c +[from] ====== END OF DEPENDENCIES ====== +/* Generated by Frama-C */ +int G; +int main(int a, int b, int c) +{ + /* Locals: x, p */ + int x; + int *p; + /* sid:1 */ + /*@ assert Value: signed_overflow: a+b ≤ 2147483647; */ + /*@ assert Value: signed_overflow: -2147483648 ≤ a+b; */ + x = a + b; + /* sid:2 */ + p = & x; + /* sid:4 */ + if (c < 0) { + /* sid:5 */ + /*@ assert Value: signed_overflow: -x ≤ 2147483647; */ + x = - x; + /* sid:6 */ + /*@ assert *p > G; */ ; + } + /* sid:9 */ + return x; +} + + +[pdg] computing for function main +[pdg] done for function main +RESULT for main: + {n1}: InCtrl + {n2}: VarDecl : a + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : b + -[a--]-> 5 + {n5}: In2 + -[a--]-> 4 + {n6}: VarDecl : c + -[a--]-> 7 + {n7}: In3 + -[a--]-> 6 + {n8}: VarDecl : x + {n9}: VarDecl : p + {n10}: x = a + b; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[--d]-> 4 + -[--d]-> 5 + -[a--]-> 8 + {n11}: p = & x; + -[-c-]-> 1 + -[--d]-> 8 + -[a--]-> 9 + {n12}: c < 0 + -[-c-]-> 1 + -[--d]-> 6 + -[--d]-> 7 + {n13}: x = - x; + -[-c-]-> 1 + -[a-d]-> 8 + -[--d]-> 10 + -[-c-]-> 12 + {n14}: ; + -[-c-]-> 1 + -[-c-]-> 12 + {n15}: return x; + -[-c-]-> 1 + -[--d]-> 8 + -[--d]-> 10 + -[--d]-> 13 + {n16}: OutRet + -[--d]-> 15 +[pdg] dot file generated in tests/pdg/dyn_dpds_0.dot +Warning : cannot select G in this function... +RESULT for main: + {n1}: InCtrl + {n2}: VarDecl : a + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : b + -[a--]-> 5 + {n5}: In2 + -[a--]-> 4 + {n6}: VarDecl : c + -[a--]-> 7 + {n7}: In3 + -[a--]-> 6 + {n8}: VarDecl : x + {n9}: VarDecl : p + {n10}: x = a + b; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[--d]-> 4 + -[--d]-> 5 + -[a--]-> 8 + {n11}: p = & x; + -[-c-]-> 1 + -[--d]-> 8 + -[a--]-> 9 + {n12}: c < 0 + -[-c-]-> 1 + -[--d]-> 6 + -[--d]-> 7 + {n13}: x = - x; + -[-c-]-> 1 + -[a-d]-> 8 + -[--d]-> 10 + -[-c-]-> 12 + {n14}: ; + -[-c-]-> 1 + -[-c-]-> 12 + {n15}: return x; + -[-c-]-> 1 + -[--d]-> 8 + -[--d]-> 10 + -[--d]-> 13 + {n16}: OutRet + -[--d]-> 15 +[pdg] dot file generated in tests/pdg/dyn_dpds_1.dot diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/globals.1.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/globals.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/globals.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/globals.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/globals.c (with preprocessing) +[value] Analyzing a complete application starting at h +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {3} + S ∈ [--..--] + P ∈ {{ &X }} +tests/pdg/globals.c:28:[kernel] warning: signed overflow. assert s2.a2+s2.b2 ≤ 2147483647; +[value] Recording results for h +[value] done for function h +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function h: + s2.a2 ∈ [--..--] + .b2 ∈ {3} + .s2 ∈ UNINITIALIZED + __retres ∈ [-2147483645..2147483647] +[from] Computing for function h +[from] Done for function h +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function h: + \result FROM X; P; x +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function h: + s2{.a2; .b2}; __retres +[inout] Inputs for function h: + X; P diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/globals.2.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/globals.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/globals.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/globals.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/globals.c (with preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {3} + S ∈ [--..--] + P ∈ {{ &X }} +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + +[from] Computing for function f +[from] Done for function f +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM X; p +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + tmp +[inout] Inputs for function f: + X diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/globals.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/globals.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/globals.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/globals.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/globals.c (with preprocessing) +[value] Analyzing a complete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {3} + S ∈ [--..--] + P ∈ {{ &X }} +[value] computing for function f <- g. + Called from tests/pdg/globals.c:15. +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + +[value] Values at end of function g: + +[from] Computing for function f +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM X; p +[from] Function g: + \result FROM X +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + tmp +[inout] Inputs for function f: + X +[inout] Out (internal) for function g: + tmp +[inout] Inputs for function g: + X diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/inter_alias2.1.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/inter_alias2.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/inter_alias2.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/inter_alias2.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,67 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/inter_alias2.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f1 <- main. + Called from tests/pdg/inter_alias2.c:23. +[value] computing for function incr_ptr <- f1 <- main. + Called from tests/pdg/inter_alias2.c:14. +tests/pdg/inter_alias2.c:9:[kernel] warning: signed overflow. assert *p+1 ≤ 2147483647; +[value] Recording results for incr_ptr +[from] Computing for function incr_ptr +[from] Done for function incr_ptr +[value] Done for function incr_ptr +[value] Recording results for f1 +[from] Computing for function f1 +[from] Done for function f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/pdg/inter_alias2.c:24. +[value] computing for function incr_ptr <- f2 <- main. + Called from tests/pdg/inter_alias2.c:19. +[value] Recording results for incr_ptr +[from] Computing for function incr_ptr +[from] Done for function incr_ptr +[value] Done for function incr_ptr +[value] Recording results for f2 +[from] Computing for function f2 +[from] Done for function f2 +[value] Done for function f2 +tests/pdg/inter_alias2.c:26:[kernel] warning: signed overflow. assert -2147483648 ≤ v1+v2 ≤ 2147483647; +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to incr_ptr at tests/pdg/inter_alias2.c:14 (by f1): + x1 FROM p; x1 +[from] call to incr_ptr at tests/pdg/inter_alias2.c:19 (by f2): + x2 FROM p; x2 +[from] call to f1 at tests/pdg/inter_alias2.c:23 (by main): + \result FROM a +[from] call to f2 at tests/pdg/inter_alias2.c:24 (by main): + \result FROM b +[from] entry point: + \result FROM i1; i2 +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[pdg] computing for function incr_ptr +[pdg] done for function incr_ptr +[pdg] PDG for incr_ptr + {n1}: InCtrl + {n2}: VarDecl : p + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: (*p) ++; + -[-c-]-> 1 + -[a-d]-> 2 + -[a-d]-> 3 + -[--d]-> 6 + -[--d]-> 7 + {n5}: return; + -[-c-]-> 1 + {n6}: In(x1) + {n7}: In(x2) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/inter_alias2.2.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/inter_alias2.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/inter_alias2.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/inter_alias2.2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,80 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/inter_alias2.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f1 <- main. + Called from tests/pdg/inter_alias2.c:23. +[value] computing for function incr_ptr <- f1 <- main. + Called from tests/pdg/inter_alias2.c:14. +tests/pdg/inter_alias2.c:9:[kernel] warning: signed overflow. assert *p+1 ≤ 2147483647; +[value] Recording results for incr_ptr +[from] Computing for function incr_ptr +[from] Done for function incr_ptr +[value] Done for function incr_ptr +[value] Recording results for f1 +[from] Computing for function f1 +[from] Done for function f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/pdg/inter_alias2.c:24. +[value] computing for function incr_ptr <- f2 <- main. + Called from tests/pdg/inter_alias2.c:19. +[value] Recording results for incr_ptr +[from] Computing for function incr_ptr +[from] Done for function incr_ptr +[value] Done for function incr_ptr +[value] Recording results for f2 +[from] Computing for function f2 +[from] Done for function f2 +[value] Done for function f2 +tests/pdg/inter_alias2.c:26:[kernel] warning: signed overflow. assert -2147483648 ≤ v1+v2 ≤ 2147483647; +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to incr_ptr at tests/pdg/inter_alias2.c:14 (by f1): + x1 FROM p; x1 +[from] call to incr_ptr at tests/pdg/inter_alias2.c:19 (by f2): + x2 FROM p; x2 +[from] call to f1 at tests/pdg/inter_alias2.c:23 (by main): + \result FROM a +[from] call to f2 at tests/pdg/inter_alias2.c:24 (by main): + \result FROM b +[from] entry point: + \result FROM i1; i2 +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[pdg] computing for function f1 +[pdg] done for function f1 +[pdg] PDG for f1 + {n1}: InCtrl + {n2}: VarDecl : a + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : x1 + {n5}: x1 = a; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[a--]-> 4 + {n6}: Call6-InCtrl : incr_ptr(& x1); + -[-c-]-> 1 + {n7}: Call6-In1 : incr_ptr(& x1); + -[-c-]-> 1 + -[--d]-> 4 + -[-c-]-> 6 + {n8}: Call6-Out(x1) : incr_ptr(& x1); + -[-c-]-> 1 + -[--d]-> 5 + -[-c-]-> 6 + -[--d]-> 7 + {n9}: return x1; + -[-c-]-> 1 + -[--d]-> 4 + -[--d](x1)-> 8 + {n10}: OutRet + -[--d]-> 9 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/inter_alias2.3.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/inter_alias2.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/inter_alias2.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/inter_alias2.3.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,80 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/inter_alias2.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f1 <- main. + Called from tests/pdg/inter_alias2.c:23. +[value] computing for function incr_ptr <- f1 <- main. + Called from tests/pdg/inter_alias2.c:14. +tests/pdg/inter_alias2.c:9:[kernel] warning: signed overflow. assert *p+1 ≤ 2147483647; +[value] Recording results for incr_ptr +[from] Computing for function incr_ptr +[from] Done for function incr_ptr +[value] Done for function incr_ptr +[value] Recording results for f1 +[from] Computing for function f1 +[from] Done for function f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/pdg/inter_alias2.c:24. +[value] computing for function incr_ptr <- f2 <- main. + Called from tests/pdg/inter_alias2.c:19. +[value] Recording results for incr_ptr +[from] Computing for function incr_ptr +[from] Done for function incr_ptr +[value] Done for function incr_ptr +[value] Recording results for f2 +[from] Computing for function f2 +[from] Done for function f2 +[value] Done for function f2 +tests/pdg/inter_alias2.c:26:[kernel] warning: signed overflow. assert -2147483648 ≤ v1+v2 ≤ 2147483647; +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to incr_ptr at tests/pdg/inter_alias2.c:14 (by f1): + x1 FROM p; x1 +[from] call to incr_ptr at tests/pdg/inter_alias2.c:19 (by f2): + x2 FROM p; x2 +[from] call to f1 at tests/pdg/inter_alias2.c:23 (by main): + \result FROM a +[from] call to f2 at tests/pdg/inter_alias2.c:24 (by main): + \result FROM b +[from] entry point: + \result FROM i1; i2 +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[pdg] computing for function f2 +[pdg] done for function f2 +[pdg] PDG for f2 + {n1}: InCtrl + {n2}: VarDecl : b + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : x2 + {n5}: x2 = b; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[a--]-> 4 + {n6}: Call12-InCtrl : incr_ptr(& x2); + -[-c-]-> 1 + {n7}: Call12-In1 : incr_ptr(& x2); + -[-c-]-> 1 + -[--d]-> 4 + -[-c-]-> 6 + {n8}: Call12-Out(x2) : incr_ptr(& x2); + -[-c-]-> 1 + -[--d]-> 5 + -[-c-]-> 6 + -[--d]-> 7 + {n9}: return x2; + -[-c-]-> 1 + -[--d]-> 4 + -[--d](x2)-> 8 + {n10}: OutRet + -[--d]-> 9 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/inter_alias2.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/inter_alias2.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/inter_alias2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/inter_alias2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/inter_alias2.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f1 <- main. + Called from tests/pdg/inter_alias2.c:23. +[value] computing for function incr_ptr <- f1 <- main. + Called from tests/pdg/inter_alias2.c:14. +tests/pdg/inter_alias2.c:9:[kernel] warning: signed overflow. assert *p+1 ≤ 2147483647; +[value] Recording results for incr_ptr +[value] Done for function incr_ptr +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/pdg/inter_alias2.c:24. +[value] computing for function incr_ptr <- f2 <- main. + Called from tests/pdg/inter_alias2.c:19. +[value] Recording results for incr_ptr +[value] Done for function incr_ptr +[value] Recording results for f2 +[value] Done for function f2 +tests/pdg/inter_alias2.c:26:[kernel] warning: signed overflow. assert -2147483648 ≤ v1+v2 ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function incr_ptr: + x1 ∈ [-2147483647..2147483647] or UNINITIALIZED + x2 ∈ [-2147483647..2147483647] or UNINITIALIZED +[value] Values at end of function f1: + x1 ∈ [-2147483647..2147483647] +[value] Values at end of function f2: + x2 ∈ [-2147483647..2147483647] +[value] Values at end of function main: + v1 ∈ [-2147483647..2147483647] + v2 ∈ [-2147483647..2147483647] + __retres ∈ [--..--] diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/inter_alias.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/inter_alias.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/inter_alias.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/inter_alias.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,149 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/inter_alias.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} +[value] computing for function f1 <- main. + Called from tests/pdg/inter_alias.c:15. +[value] Recording results for f1 +[from] Computing for function f1 +[from] Done for function f1 +[value] Done for function f1 +[value] computing for function f1 <- main. + Called from tests/pdg/inter_alias.c:16. +[value] Recording results for f1 +[from] Computing for function f1 +[from] Done for function f1 +[value] Done for function f1 +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f1: + a ∈ {3} + b ∈ {0; 4} + __retres ∈ {3; 4} +[value] Values at end of function main: + a ∈ {3} + b ∈ {4} + __retres ∈ {7} +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f1 at tests/pdg/inter_alias.c:15 (by main): + a FROM G; p1; x1; a + \result FROM G; p1; x1; a +[from] call to f1 at tests/pdg/inter_alias.c:16 (by main): + b FROM G; p1; x1; b + \result FROM G; p1; x1; b +[from] entry point: + \result FROM G +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[inout] Out (internal) for function f1: + a; b; __retres +[inout] Inputs for function f1: + G; a; b +[inout] Out (internal) for function main: + a; b; __retres +[inout] Inputs for function main: + G +[pdg] computing for function f1 +[pdg] done for function f1 +[pdg] computing for function main +[pdg] done for function main +[pdg] ====== PDG GRAPH COMPUTED ====== +[pdg] PDG for f1 + {n1}: InCtrl + {n2}: VarDecl : p1 + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : x1 + -[a--]-> 5 + {n5}: In2 + -[a--]-> 4 + {n6}: VarDecl : __retres + {n7}: *p1 += G + x1; + -[-c-]-> 1 + -[a-d]-> 2 + -[a-d]-> 3 + -[--d]-> 4 + -[--d]-> 5 + -[--d]-> 11 + -[--d]-> 12 + -[--d]-> 13 + {n8}: __retres = *p1; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[a--]-> 6 + -[--d]-> 7 + -[--d]-> 11 + -[--d]-> 12 + {n9}: return __retres; + -[-c-]-> 1 + -[--d]-> 6 + -[--d]-> 8 + {n10}: OutRet + -[--d]-> 9 + {n11}: In(a) + {n12}: In(b) + {n13}: In(G) +[pdg] PDG for main + {n14}: InCtrl + {n15}: VarDecl : a + {n16}: VarDecl : b + {n17}: VarDecl : __retres + {n18}: a = 0; + -[-c-]-> 14 + -[a--]-> 15 + {n19}: b = 0; + -[-c-]-> 14 + -[a--]-> 16 + {n20}: Call7-InCtrl : f1(& a,3); + -[-c-]-> 14 + {n21}: Call7-In1 : f1(& a,3); + -[-c-]-> 14 + -[--d]-> 15 + -[-c-]-> 20 + {n22}: Call7-In2 : f1(& a,3); + -[-c-]-> 14 + -[-c-]-> 20 + {n23}: Call7-Out(a) : f1(& a,3); + -[-c-]-> 14 + -[--d]-> 18 + -[-c-]-> 20 + -[--d]-> 21 + -[--d]-> 22 + -[--d]-> 31 + {n24}: Call8-InCtrl : f1(& b,4); + -[-c-]-> 14 + {n25}: Call8-In1 : f1(& b,4); + -[-c-]-> 14 + -[--d]-> 16 + -[-c-]-> 24 + {n26}: Call8-In2 : f1(& b,4); + -[-c-]-> 14 + -[-c-]-> 24 + {n27}: Call8-Out(b) : f1(& b,4); + -[-c-]-> 14 + -[--d]-> 19 + -[-c-]-> 24 + -[--d]-> 25 + -[--d]-> 26 + -[--d]-> 31 + {n28}: __retres = a + b; + -[-c-]-> 14 + -[--d]-> 15 + -[--d]-> 16 + -[a--]-> 17 + -[--d](a)-> 23 + -[--d](b)-> 27 + {n29}: return __retres; + -[-c-]-> 14 + -[--d]-> 17 + -[--d]-> 28 + {n30}: OutRet + -[--d]-> 29 + {n31}: In(G) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.1.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,83 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at simple_with_break +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + after ∈ [--..--] +tests/pdg/loops.c:51:[value] entering loop for the first time +tests/pdg/loops.c:53:[kernel] warning: signed overflow. assert s+2 ≤ 2147483647; +[value] Recording results for simple_with_break +[value] done for function simple_with_break +[pdg] computing for function simple_with_break +[pdg] done for function simple_with_break +[pdg] PDG for simple_with_break + {n1}: InCtrl + {n2}: VarDecl : n + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : s + {n5}: VarDecl : i + {n6}: s = 0; + -[-c-]-> 1 + -[a--]-> 4 + {n7}: i = 0; + -[-c-]-> 1 + -[a--]-> 5 + {n8}: while(1) + -[-c-]-> 1 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 10 + -[-c-]-> 13 + {n9}: block + -[-c-]-> 1 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 10 + -[-c-]-> 13 + {n10}: i < n + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[--d]-> 5 + -[--d]-> 7 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 10 + -[--d]-> 12 + -[-c-]-> 13 + {n11}: s += 2; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 6 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 10 + -[--d]-> 11 + -[-c-]-> 13 + {n12}: i ++; + -[-c-]-> 1 + -[a-d]-> 5 + -[--d]-> 7 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 10 + -[--d]-> 12 + -[-c-]-> 13 + {n13}: break; + -[-c-]-> 1 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 10 + -[-c-]-> 13 + {n14}: after = 0; + -[-c-]-> 1 + {n15}: return s; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 6 + -[--d]-> 11 + {n16}: OutRet + -[--d]-> 15 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.2.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,53 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at infinite +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + after ∈ [--..--] +tests/pdg/loops.c:65:[value] entering loop for the first time +tests/pdg/loops.c:66:[kernel] warning: signed overflow. assert s+2 ≤ 2147483647; +tests/pdg/loops.c:67:[kernel] warning: signed overflow. assert i+1 ≤ 2147483647; +[value] Recording results for infinite +[value] done for function infinite +[pdg] computing for function infinite +tests/pdg/loops.c:70:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function infinite +[pdg] PDG for infinite + {n1}: InCtrl + {n2}: VarDecl : n + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : s + {n5}: VarDecl : i + {n6}: s = 0; + -[-c-]-> 1 + -[a--]-> 4 + {n7}: i = 0; + -[-c-]-> 1 + -[a--]-> 5 + {n8}: return s; + -[-c-]-> 1 + -[--d]-> 4 + {n9}: OutRet + {n10}: while(1) + -[-c-]-> 1 + -[-c-]-> 10 + {n11}: block + -[-c-]-> 1 + -[-c-]-> 10 + {n12}: s += 2; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 6 + -[-c-]-> 10 + -[-c-]-> 11 + -[--d]-> 12 + {n13}: i ++; + -[-c-]-> 1 + -[a-d]-> 5 + -[--d]-> 7 + -[-c-]-> 10 + -[-c-]-> 11 + -[--d]-> 13 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.3.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,53 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at infinite2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + after ∈ [--..--] +tests/pdg/loops.c:75:[value] entering loop for the first time +tests/pdg/loops.c:76:[kernel] warning: signed overflow. assert s+2 ≤ 2147483647; +[value] Recording results for infinite2 +[value] done for function infinite2 +[pdg] computing for function infinite2 +tests/pdg/loops.c:79:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function infinite2 +[pdg] PDG for infinite2 + {n1}: InCtrl + {n2}: VarDecl : n + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : s + {n5}: VarDecl : i + {n6}: s = 0; + -[-c-]-> 1 + -[a--]-> 4 + {n7}: i = 1; + -[-c-]-> 1 + -[a--]-> 5 + {n8}: while(1) + -[-c-]-> 1 + -[-c-]-> 8 + {n9}: i + -[-c-]-> 1 + -[--d]-> 5 + -[--d]-> 7 + -[-c-]-> 8 + {n10}: block + -[-c-]-> 1 + -[-c-]-> 8 + {n11}: s += 2; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 6 + -[-c-]-> 8 + -[-c-]-> 10 + -[--d]-> 11 + {n12}: break; + -[-c-]-> 1 + -[-c-]-> 8 + {n13}: return s; + -[-c-]-> 1 + -[--d]-> 4 + {n14}: OutRet diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.4.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,81 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at maybe_infinite +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + after ∈ [--..--] +tests/pdg/loops.c:84:[value] entering loop for the first time +tests/pdg/loops.c:88:[kernel] warning: signed overflow. assert i+2 ≤ 2147483647; +[value] Recording results for maybe_infinite +[value] done for function maybe_infinite +[pdg] computing for function maybe_infinite +[pdg] done for function maybe_infinite +[pdg] PDG for maybe_infinite + {n1}: InCtrl + {n2}: VarDecl : n + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : s + {n5}: VarDecl : i + {n6}: s = 0; + -[-c-]-> 1 + -[a--]-> 4 + {n7}: i = 0; + -[-c-]-> 1 + -[a--]-> 5 + {n8}: n > 0 + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + {n9}: while(1) + -[-c-]-> 1 + -[-c-]-> 8 + -[-c-]-> 9 + {n10}: block + -[-c-]-> 1 + -[-c-]-> 8 + -[-c-]-> 9 + {n11}: i ++; + -[-c-]-> 1 + -[a-d]-> 5 + -[--d]-> 7 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 10 + -[--d]-> 14 + {n12}: s < 10 + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 6 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 10 + -[--d]-> 13 + {n13}: s += 2; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 6 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 10 + -[-c-]-> 12 + -[--d]-> 13 + {n14}: i += 2; + -[-c-]-> 1 + -[a-d]-> 5 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 10 + -[--d]-> 11 + {n15}: s = 1; + -[a--]-> 4 + {n16}: after = 0; + -[-c-]-> 1 + {n17}: return s; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 15 + {n18}: OutRet + -[--d]-> 17 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.5.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.5.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.5.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,133 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at two_infinite_loops +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + after ∈ [--..--] +tests/pdg/loops.c:99:[value] entering loop for the first time +tests/pdg/loops.c:110:[kernel] warning: signed overflow. assert i1+2 ≤ 2147483647; +tests/pdg/loops.c:105:[value] entering loop for the first time +tests/pdg/loops.c:106:[kernel] warning: signed overflow. assert i2+1 ≤ 2147483647; +[value] Recording results for two_infinite_loops +[value] done for function two_infinite_loops +[pdg] computing for function two_infinite_loops +[pdg] done for function two_infinite_loops +[pdg] PDG for two_infinite_loops + {n1}: InCtrl + {n2}: VarDecl : n + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : s + {n5}: VarDecl : i1 + {n6}: VarDecl : i2 + {n7}: s = 0; + -[-c-]-> 1 + -[a--]-> 4 + {n8}: i1 = 0; + -[-c-]-> 1 + -[a--]-> 5 + {n9}: i2 = 0; + -[-c-]-> 1 + -[a--]-> 6 + {n10}: n > 0 + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + {n11}: while(1) + -[-c-]-> 1 + -[-c-]-> 10 + -[-c-]-> 11 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 20 + {n12}: block + -[-c-]-> 1 + -[-c-]-> 10 + -[-c-]-> 11 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 20 + {n13}: i1 ++; + -[-c-]-> 1 + -[a-d]-> 5 + -[--d]-> 8 + -[-c-]-> 10 + -[-c-]-> 11 + -[-c-]-> 12 + -[-c-]-> 14 + -[--d]-> 16 + -[-c-]-> 20 + {n14}: s < 10 + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 7 + -[-c-]-> 10 + -[-c-]-> 11 + -[-c-]-> 12 + -[-c-]-> 14 + -[--d]-> 15 + -[-c-]-> 20 + {n15}: s += 2; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 7 + -[-c-]-> 10 + -[-c-]-> 11 + -[-c-]-> 12 + -[-c-]-> 14 + -[--d]-> 15 + -[-c-]-> 20 + {n16}: i1 += 2; + -[-c-]-> 1 + -[a-d]-> 5 + -[-c-]-> 10 + -[-c-]-> 11 + -[-c-]-> 12 + -[--d]-> 13 + -[-c-]-> 14 + -[-c-]-> 20 + {n17}: s = 1; + -[a--]-> 4 + {n18}: i2 = 0; + -[-c-]-> 1 + -[a--]-> 6 + -[-c-]-> 10 + -[-c-]-> 11 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 20 + {n19}: after = 0; + -[-c-]-> 1 + {n20}: while(1) + -[-c-]-> 1 + -[-c-]-> 10 + -[-c-]-> 11 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 20 + {n21}: block + -[-c-]-> 1 + -[-c-]-> 10 + -[-c-]-> 11 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 20 + {n22}: i2 ++; + -[-c-]-> 1 + -[a-d]-> 6 + -[-c-]-> 10 + -[-c-]-> 11 + -[-c-]-> 12 + -[-c-]-> 14 + -[--d]-> 18 + -[-c-]-> 20 + -[-c-]-> 21 + -[--d]-> 22 + {n23}: return s; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 17 + {n24}: OutRet + -[--d]-> 23 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.6.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.6.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.6.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.6.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at loop_with_goto +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + after ∈ [--..--] +tests/pdg/loops.c:120:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +[value] Recording results for loop_with_goto +[value] done for function loop_with_goto +[pdg] computing for function loop_with_goto +[pdg] done for function loop_with_goto +[pdg] PDG for loop_with_goto + {n1}: InCtrl + {n2}: VarDecl : n + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: n > 0 + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + {n5}: L: + -[-c-]-> 1 + -[-c-]-> 4 + -[-c-]-> 7 + {n6}: L: n --; + -[-c-]-> 1 + -[a-d]-> 2 + -[--d]-> 3 + -[-c-]-> 4 + -[--d]-> 6 + -[-c-]-> 7 + {n7}: goto L; + -[-c-]-> 1 + -[-c-]-> 4 + -[-c-]-> 5 + -[-c-]-> 7 + {n8}: return n; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + {n9}: OutRet + -[--d]-> 8 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.7.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.7.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.7.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.7.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,74 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at non_natural_loop +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + after ∈ [--..--] +tests/pdg/loops.c:139:[kernel] warning: Non-natural loop detected. +[value] Recording results for non_natural_loop +[value] done for function non_natural_loop +[pdg] computing for function non_natural_loop +[pdg] done for function non_natural_loop +[pdg] PDG for non_natural_loop + {n1}: InCtrl + {n2}: VarDecl : n + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : x + {n5}: x = 1; + -[-c-]-> 1 + -[a--]-> 4 + {n6}: n < 0 + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + {n7}: x = 0; + -[-c-]-> 1 + -[a--]-> 4 + -[-c-]-> 6 + {n8}: n = 20; + -[-c-]-> 1 + -[a--]-> 2 + -[-c-]-> 6 + {n9}: n = 10; + -[-c-]-> 1 + -[a--]-> 2 + -[-c-]-> 6 + {n10}: L: + -[-c-]-> 1 + -[-c-]-> 6 + -[-c-]-> 12 + -[-c-]-> 13 + {n11}: L: x += 2; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 5 + -[-c-]-> 6 + -[--d]-> 7 + -[--d]-> 11 + -[-c-]-> 12 + -[-c-]-> 13 + {n12}: x < n + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 4 + -[--d]-> 7 + -[--d]-> 8 + -[--d]-> 9 + -[--d]-> 11 + -[-c-]-> 12 + -[-c-]-> 13 + {n13}: goto L; + -[-c-]-> 1 + -[-c-]-> 10 + -[-c-]-> 12 + -[-c-]-> 13 + {n14}: return x; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 7 + -[--d]-> 11 + {n15}: OutRet + -[--d]-> 14 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.8.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.8.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.8.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.8.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at dead_code +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + after ∈ [--..--] +[value] Recording results for dead_code +[value] done for function dead_code +[pdg] computing for function dead_code +[pdg] done for function dead_code +[pdg] PDG for dead_code + {n1}: InCtrl + {n2}: VarDecl : n + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : x + {n5}: x = 0; + -[-c-]-> 1 + -[a--]-> 4 + {n6}: W: + -[-c-]-> 1 + -[-c-]-> 9 + {n7}: n > 0 + -[-c-]-> 1 + -[--d]-> 2 + -[-c-]-> 9 + {n8}: goto W; + -[-c-]-> 1 + -[-c-]-> 6 + -[-c-]-> 9 + {n9}: goto L; + -[-c-]-> 1 + -[-c-]-> 10 + {n10}: L: + -[-c-]-> 1 + {n11}: L: x += n; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[a-d]-> 4 + -[--d]-> 5 + {n12}: return x; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 11 + {n13}: OutRet + -[--d]-> 12 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/loops.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/loops.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,79 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at simple +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + after ∈ [--..--] +tests/pdg/loops.c:41:[value] entering loop for the first time +tests/pdg/loops.c:42:[kernel] warning: signed overflow. assert s+2 ≤ 2147483647; +[value] Recording results for simple +[value] done for function simple +[pdg] computing for function simple +[pdg] done for function simple +[pdg] PDG for simple + {n1}: InCtrl + {n2}: VarDecl : n + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : s + {n5}: VarDecl : i + {n6}: s = 0; + -[-c-]-> 1 + -[a--]-> 4 + {n7}: i = 0; + -[-c-]-> 1 + -[a--]-> 5 + {n8}: while(1) + -[-c-]-> 1 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 13 + {n9}: i < n + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[--d]-> 5 + -[--d]-> 7 + -[-c-]-> 8 + -[-c-]-> 9 + -[--d]-> 12 + -[-c-]-> 13 + {n10}: block + -[-c-]-> 1 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 13 + {n11}: s += 2; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 6 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 10 + -[--d]-> 11 + -[-c-]-> 13 + {n12}: i ++; + -[-c-]-> 1 + -[a-d]-> 5 + -[--d]-> 7 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 10 + -[--d]-> 12 + -[-c-]-> 13 + {n13}: break; + -[-c-]-> 1 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 13 + {n14}: after = 0; + -[-c-]-> 1 + {n15}: return s; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 6 + -[--d]-> 11 + {n16}: OutRet + -[--d]-> 15 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/multiple_calls.1.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/multiple_calls.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/multiple_calls.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/multiple_calls.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,154 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/multiple_calls.c (with preprocessing) +[value] Analyzing a complete application starting at appel_ptr_fct_bis +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G1 ∈ [--..--] + G2 ∈ [--..--] + G3 ∈ [--..--] + G4 ∈ [--..--] +[value] computing for function fct1 <- appel_ptr_fct_bis. + Called from tests/pdg/multiple_calls.c:28. +[value] Recording results for fct1 +[value] Done for function fct1 +[value] computing for function fct2 <- appel_ptr_fct_bis. + Called from tests/pdg/multiple_calls.c:28. +[value] Recording results for fct2 +[value] Done for function fct2 +[value] Recording results for appel_ptr_fct_bis +[value] done for function appel_ptr_fct_bis +[from] Computing for function fct1 +[from] Done for function fct1 +[from] Computing for function fct2 +[from] Done for function fct2 +[from] Computing for function appel_ptr_fct_bis +[from] Done for function appel_ptr_fct_bis +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function fct1: + G1 FROM z + G3 FROM y + G4 FROM z + \result FROM x +[from] Function fct2: + G2 FROM z + G3 FROM x + \result FROM y +[from] Function appel_ptr_fct_bis: + G1 FROM c; d (and SELF) + G2 FROM c; d (and SELF) + G3 FROM c; a; b + G4 FROM c; a; b + \result FROM c; a; b +[from] ====== END OF DEPENDENCIES ====== +[inout] InOut (internal) for function fct1: + Operational inputs: + x; y; z + Operational inputs on termination: + x; y; z + Sure outputs: + G1; G3; G4 +[inout] InOut (internal) for function fct2: + Operational inputs: + x; y; z + Operational inputs on termination: + x; y; z + Sure outputs: + G2; G3 +[inout] InOut (internal) for function appel_ptr_fct_bis: + Operational inputs: + c; a; b; d + Operational inputs on termination: + c; a; b; d + Sure outputs: + G3; G4; pf; tmp +[pdg] computing for function appel_ptr_fct_bis +[pdg] done for function appel_ptr_fct_bis +[pdg] PDG for appel_ptr_fct_bis + {n1}: InCtrl + {n2}: VarDecl : c + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : a + -[a--]-> 5 + {n5}: In2 + -[a--]-> 4 + {n6}: VarDecl : b + -[a--]-> 7 + {n7}: In3 + -[a--]-> 6 + {n8}: VarDecl : d + -[a--]-> 9 + {n9}: In4 + -[a--]-> 8 + {n10}: VarDecl : pf + {n11}: VarDecl : tmp + {n12}: c + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + {n13}: tmp = & fct1; + -[-c-]-> 1 + -[a--]-> 11 + -[-c-]-> 12 + {n14}: tmp = & fct2; + -[-c-]-> 1 + -[a--]-> 11 + -[-c-]-> 12 + {n15}: pf = tmp; + -[-c-]-> 1 + -[a--]-> 10 + -[--d]-> 11 + -[--d]-> 13 + -[--d]-> 14 + {n16}: Call28-InCtrl : G4 = (*pf)(a,b,d); + -[-c-]-> 1 + {n17}: Call28-In1 : G4 = (*pf)(a,b,d); + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 5 + -[-c-]-> 16 + {n18}: Call28-In2 : G4 = (*pf)(a,b,d); + -[-c-]-> 1 + -[--d]-> 6 + -[--d]-> 7 + -[-c-]-> 16 + {n19}: Call28-In3 : G4 = (*pf)(a,b,d); + -[-c-]-> 1 + -[--d]-> 8 + -[--d]-> 9 + -[-c-]-> 16 + {n20}: Call28-Out(G1) : G4 = (*pf)(a,b,d); + -[-c-]-> 1 + -[-c-]-> 15 + -[-c-]-> 16 + -[--d]-> 19 + {n21}: Call28-Out(G3) : G4 = (*pf)(a,b,d); + -[-c-]-> 1 + -[-c-]-> 15 + -[-c-]-> 16 + -[--d]-> 17 + -[--d]-> 18 + {n22}: Call28-Out(G4) : G4 = (*pf)(a,b,d); + -[-c-]-> 1 + -[-c-]-> 15 + -[-c-]-> 16 + -[--d]-> 19 + {n23}: Call28-OutRet : G4 = (*pf)(a,b,d); + -[-c-]-> 1 + -[-c-]-> 15 + -[-c-]-> 16 + -[--d]-> 17 + -[--d]-> 18 + {n24}: Call28-Out(G2) : G4 = (*pf)(a,b,d); + -[-c-]-> 1 + -[-c-]-> 15 + -[-c-]-> 16 + -[--d]-> 19 + {n25}: return G4; + -[-c-]-> 1 + -[--d]-> 23 + {n26}: OutRet + -[--d]-> 25 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/multiple_calls.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/multiple_calls.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/multiple_calls.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/multiple_calls.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,171 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/multiple_calls.c (with preprocessing) +[value] Analyzing a complete application starting at appel_ptr_fct +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G1 ∈ [--..--] + G2 ∈ [--..--] + G3 ∈ [--..--] + G4 ∈ [--..--] +[value] computing for function fct1 <- appel_ptr_fct. + Called from tests/pdg/multiple_calls.c:23. +[value] Recording results for fct1 +[value] Done for function fct1 +[value] computing for function fct2 <- appel_ptr_fct. + Called from tests/pdg/multiple_calls.c:23. +[value] Recording results for fct2 +[value] Done for function fct2 +tests/pdg/multiple_calls.c:24:[kernel] warning: signed overflow. assert x+G1 ≤ 2147483647; +tests/pdg/multiple_calls.c:24:[kernel] warning: signed overflow. assert -2147483648 ≤ (int)(x+G1)+G2 ≤ 2147483647; +[value] Recording results for appel_ptr_fct +[value] done for function appel_ptr_fct +[from] Computing for function fct1 +[from] Done for function fct1 +[from] Computing for function fct2 +[from] Done for function fct2 +[from] Computing for function appel_ptr_fct +[from] Done for function appel_ptr_fct +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function fct1: + G1 FROM z + G3 FROM y + G4 FROM z + \result FROM x +[from] Function fct2: + G2 FROM z + G3 FROM x + \result FROM y +[from] Function appel_ptr_fct: + G1 FROM c; d (and SELF) + G2 FROM c; d (and SELF) + G3 FROM c + G4 FROM c; d (and SELF) + \result FROM G1; G2; c; d +[from] ====== END OF DEPENDENCIES ====== +[inout] InOut (internal) for function fct1: + Operational inputs: + x; y; z + Operational inputs on termination: + x; y; z + Sure outputs: + G1; G3; G4 +[inout] InOut (internal) for function fct2: + Operational inputs: + x; y; z + Operational inputs on termination: + x; y; z + Sure outputs: + G2; G3 +[inout] InOut (internal) for function appel_ptr_fct: + Operational inputs: + G1; G2; c; d + Operational inputs on termination: + G1; G2; c; d + Sure outputs: + G3; a; b; pf; tmp; x; __retres +[pdg] computing for function appel_ptr_fct +[pdg] done for function appel_ptr_fct +[pdg] PDG for appel_ptr_fct + {n1}: InCtrl + {n2}: VarDecl : c + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : d + -[a--]-> 5 + {n5}: In2 + -[a--]-> 4 + {n6}: VarDecl : a + {n7}: VarDecl : b + {n8}: VarDecl : pf + {n9}: VarDecl : tmp + {n10}: VarDecl : x + {n11}: VarDecl : __retres + {n12}: a = 1; + -[-c-]-> 1 + -[a--]-> 6 + {n13}: b = 2; + -[-c-]-> 1 + -[a--]-> 7 + {n14}: c + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + {n15}: tmp = & fct1; + -[-c-]-> 1 + -[a--]-> 9 + -[-c-]-> 14 + {n16}: tmp = & fct2; + -[-c-]-> 1 + -[a--]-> 9 + -[-c-]-> 14 + {n17}: pf = tmp; + -[-c-]-> 1 + -[a--]-> 8 + -[--d]-> 9 + -[--d]-> 15 + -[--d]-> 16 + {n18}: Call19-InCtrl : x = (*pf)(a,b,d); + -[-c-]-> 1 + {n19}: Call19-In1 : x = (*pf)(a,b,d); + -[-c-]-> 1 + -[--d]-> 6 + -[--d]-> 12 + -[-c-]-> 18 + {n20}: Call19-In2 : x = (*pf)(a,b,d); + -[-c-]-> 1 + -[--d]-> 7 + -[--d]-> 13 + -[-c-]-> 18 + {n21}: Call19-In3 : x = (*pf)(a,b,d); + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 5 + -[-c-]-> 18 + {n22}: Call19-Out(G1) : x = (*pf)(a,b,d); + -[-c-]-> 1 + -[-c-]-> 17 + -[-c-]-> 18 + -[--d]-> 21 + {n23}: Call19-Out(G3) : x = (*pf)(a,b,d); + -[-c-]-> 1 + -[-c-]-> 17 + -[-c-]-> 18 + -[--d]-> 19 + -[--d]-> 20 + {n24}: Call19-Out(G4) : x = (*pf)(a,b,d); + -[-c-]-> 1 + -[-c-]-> 17 + -[-c-]-> 18 + -[--d]-> 21 + {n25}: Call19-OutRet : x = (*pf)(a,b,d); + -[-c-]-> 1 + -[a--]-> 10 + -[-c-]-> 17 + -[-c-]-> 18 + -[--d]-> 19 + -[--d]-> 20 + {n26}: Call19-Out(G2) : x = (*pf)(a,b,d); + -[-c-]-> 1 + -[-c-]-> 17 + -[-c-]-> 18 + -[--d]-> 21 + {n27}: __retres = (x + G1) + G2; + -[-c-]-> 1 + -[--d]-> 10 + -[a--]-> 11 + -[--d](G1)-> 22 + -[--d]-> 25 + -[--d](G2)-> 26 + -[--d]-> 30 + -[--d]-> 31 + {n28}: return __retres; + -[-c-]-> 1 + -[--d]-> 11 + -[--d]-> 27 + {n29}: OutRet + -[--d]-> 28 + {n30}: In(G1) + {n31}: In(G2) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/no_body.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/no_body.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/no_body.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/no_body.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,108 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/no_body.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} +[value] computing for function f <- main. + Called from tests/pdg/no_body.c:24. +tests/pdg/no_body.c:24:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] using specification for function f +[value] Done for function f +[value] computing for function loop <- main. + Called from tests/pdg/no_body.c:25. +tests/pdg/no_body.c:16:[value] entering loop for the first time +[value] computing for function f <- loop <- main. + Called from tests/pdg/no_body.c:16. +[value] Done for function f +tests/pdg/no_body.c:18:[kernel] warning: signed overflow. assert G+1 ≤ 2147483647; +[value] computing for function f <- loop <- main. + Called from tests/pdg/no_body.c:16. +[value] Done for function f +[value] computing for function f <- loop <- main. + Called from tests/pdg/no_body.c:16. +[value] Done for function f +[value] computing for function f <- loop <- main. + Called from tests/pdg/no_body.c:16. +[value] Done for function f +[value] computing for function f <- loop <- main. + Called from tests/pdg/no_body.c:16. +[value] Done for function f +[value] computing for function f <- loop <- main. + Called from tests/pdg/no_body.c:16. +[value] Done for function f +[value] computing for function f <- loop <- main. + Called from tests/pdg/no_body.c:16. +[value] Done for function f +[value] computing for function f <- loop <- main. + Called from tests/pdg/no_body.c:16. +[value] Done for function f +[value] computing for function f <- loop <- main. + Called from tests/pdg/no_body.c:16. +[value] Done for function f +[value] computing for function f <- loop <- main. + Called from tests/pdg/no_body.c:16. +[value] Done for function f +[value] computing for function f <- loop <- main. + Called from tests/pdg/no_body.c:16. +[value] Done for function f +[value] computing for function f <- loop <- main. + Called from tests/pdg/no_body.c:16. +[value] Done for function f +tests/pdg/no_body.c:17:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for loop +[value] Done for function loop +[value] Recording results for main +[value] done for function main +[inout] InOut (internal) for function loop: + Operational inputs: + G; x + Operational inputs on termination: + G; x + Sure outputs: + tmp +[inout] InOut (internal) for function main: + Operational inputs: + \nothing + Operational inputs on termination: + \nothing + Sure outputs: + G; x +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[from] Computing for function loop +[from] Done for function loop +[pdg] done for function main +[pdg] PDG for main + {n1}: InCtrl + {n2}: VarDecl : x + {n3}: x = 1; + -[-c-]-> 1 + -[a--]-> 2 + {n4}: Call11-InCtrl : G = f(x); + -[-c-]-> 1 + {n5}: Call11-In1 : G = f(x); + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[-c-]-> 4 + {n6}: Call11-OutRet : G = f(x); + -[-c-]-> 1 + -[-c-]-> 4 + -[--d]-> 5 + {n7}: Call12-InCtrl : loop(x); + -[-c-]-> 1 + {n8}: Call12-In1 : loop(x); + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[-c-]-> 7 + {n9}: Call12-Out(G) : loop(x); + -[-c-]-> 1 + -[--d]-> 6 + -[-c-]-> 7 + -[--d]-> 8 + {n10}: return; + -[-c-]-> 1 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/pb_infinite_loop.1.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/pb_infinite_loop.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/pb_infinite_loop.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/pb_infinite_loop.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,52 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/pb_infinite_loop.c (with preprocessing) +[value] Analyzing a complete application starting at test_infinite_loop_2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] +tests/pdg/pb_infinite_loop.c:32:[value] entering loop for the first time +tests/pdg/pb_infinite_loop.c:34:[kernel] warning: signed overflow. assert G+1 ≤ 2147483647; +tests/pdg/pb_infinite_loop.c:35:[kernel] warning: signed overflow. assert i+1 ≤ 2147483647; +[value] Recording results for test_infinite_loop_2 +[value] done for function test_infinite_loop_2 +[pdg] computing for function test_infinite_loop_2 +tests/pdg/pb_infinite_loop.c:37:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function test_infinite_loop_2 +[pdg] PDG for test_infinite_loop_2 + {n1}: InCtrl + {n2}: VarDecl : i + {n3}: i = 0; + -[-c-]-> 1 + -[a--]-> 2 + {n4}: return G; + -[-c-]-> 1 + {n5}: OutRet + {n6}: while(1) + -[-c-]-> 1 + -[-c-]-> 6 + {n7}: block + -[-c-]-> 1 + -[-c-]-> 6 + {n8}: i % 2 + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[-c-]-> 6 + -[-c-]-> 7 + -[--d]-> 10 + {n9}: G ++; + -[-c-]-> 1 + -[-c-]-> 6 + -[-c-]-> 7 + -[-c-]-> 8 + -[--d]-> 9 + -[--d]-> 11 + {n10}: i ++; + -[-c-]-> 1 + -[a-d]-> 2 + -[--d]-> 3 + -[-c-]-> 6 + -[-c-]-> 7 + -[--d]-> 10 + {n11}: In(G) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/pb_infinite_loop.2.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/pb_infinite_loop.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/pb_infinite_loop.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/pb_infinite_loop.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,61 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/pb_infinite_loop.c (with preprocessing) +[value] Analyzing a complete application starting at test_exit +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] +[value] computing for function exit <- test_exit. + Called from tests/pdg/pb_infinite_loop.c:48. +tests/pdg/pb_infinite_loop.c:48:[kernel] warning: Neither code nor specification for function exit, generating default assigns from the prototype +[value] using specification for function exit +[value] Done for function exit +[value] Recording results for test_exit +[value] done for function test_exit +[pdg] computing for function test_exit +[from] Computing for function exit +[from] Done for function exit +[pdg] done for function test_exit +[pdg] PDG for test_exit + {n1}: InCtrl + {n2}: VarDecl : c + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : __retres + {n5}: c + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + {n6}: __retres = 1; + -[-c-]-> 1 + -[a--]-> 4 + -[-c-]-> 5 + {n7}: Call30-InCtrl : exit(1); + -[-c-]-> 1 + -[-c-]-> 5 + {n8}: Call30-In1 : exit(1); + -[-c-]-> 1 + -[-c-]-> 5 + -[-c-]-> 7 + {n9}: goto return_label; + -[-c-]-> 1 + -[-c-]-> 5 + -[-c-]-> 10 + {n10}: return_label: + -[-c-]-> 1 + {n11}: __retres = 0; + -[-c-]-> 1 + -[a--]-> 4 + -[-c-]-> 5 + {n12}: goto return_label; + -[-c-]-> 1 + -[-c-]-> 5 + -[-c-]-> 10 + {n13}: return_label: return __retres; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 6 + -[--d]-> 11 + {n14}: OutRet + -[--d]-> 13 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/pb_infinite_loop.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/pb_infinite_loop.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/pb_infinite_loop.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/pb_infinite_loop.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,62 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/pb_infinite_loop.c (with preprocessing) +[value] Analyzing a complete application starting at test_infinite_loop +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] +tests/pdg/pb_infinite_loop.c:20:[value] entering loop for the first time +tests/pdg/pb_infinite_loop.c:23:[kernel] warning: signed overflow. assert i+1 ≤ 2147483647; +tests/pdg/pb_infinite_loop.c:22:[kernel] warning: signed overflow. assert G+1 ≤ 2147483647; +[value] Recording results for test_infinite_loop +[value] done for function test_infinite_loop +[pdg] computing for function test_infinite_loop +[pdg] done for function test_infinite_loop +[pdg] PDG for test_infinite_loop + {n1}: InCtrl + {n2}: VarDecl : i + {n3}: G < 0 + -[-c-]-> 1 + -[--d]-> 12 + {n4}: i = 0; + -[-c-]-> 1 + -[a--]-> 2 + -[-c-]-> 3 + {n5}: return G; + -[-c-]-> 1 + -[--d]-> 12 + {n6}: OutRet + -[--d]-> 5 + {n7}: while(1) + -[-c-]-> 1 + -[-c-]-> 3 + -[-c-]-> 7 + {n8}: block + -[-c-]-> 1 + -[-c-]-> 3 + -[-c-]-> 7 + {n9}: i % 2 + -[-c-]-> 1 + -[--d]-> 2 + -[-c-]-> 3 + -[--d]-> 4 + -[-c-]-> 7 + -[-c-]-> 8 + -[--d]-> 11 + {n10}: G ++; + -[-c-]-> 1 + -[-c-]-> 3 + -[-c-]-> 7 + -[-c-]-> 8 + -[-c-]-> 9 + -[--d]-> 10 + -[--d]-> 12 + {n11}: i ++; + -[-c-]-> 1 + -[a-d]-> 2 + -[-c-]-> 3 + -[--d]-> 4 + -[-c-]-> 7 + -[-c-]-> 8 + -[--d]-> 11 + {n12}: In(G) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/postdom.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/postdom.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/postdom.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/postdom.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,187 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/postdom.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/pdg/postdom.c:20:[value] entering loop for the first time +[value] computing for function __VERIFIER_assert <- main. + Called from tests/pdg/postdom.c:23. +[value] Recording results for __VERIFIER_assert +[value] Done for function __VERIFIER_assert +[value] computing for function __VERIFIER_assert <- main. + Called from tests/pdg/postdom.c:23. +[value] Recording results for __VERIFIER_assert +[value] Done for function __VERIFIER_assert +[value] computing for function __VERIFIER_assert <- main. + Called from tests/pdg/postdom.c:23. +[value] Recording results for __VERIFIER_assert +[value] Done for function __VERIFIER_assert +[value] computing for function __VERIFIER_assert <- main. + Called from tests/pdg/postdom.c:23. +[value] Recording results for __VERIFIER_assert +[value] Done for function __VERIFIER_assert +[value] computing for function __VERIFIER_assert <- main. + Called from tests/pdg/postdom.c:23. +[value] Recording results for __VERIFIER_assert +[value] Done for function __VERIFIER_assert +[value] computing for function __VERIFIER_assert <- main. + Called from tests/pdg/postdom.c:23. +[value] Recording results for __VERIFIER_assert +[value] Done for function __VERIFIER_assert +[value] computing for function __VERIFIER_assert <- main. + Called from tests/pdg/postdom.c:23. +[value] Recording results for __VERIFIER_assert +[value] Done for function __VERIFIER_assert +[value] computing for function __VERIFIER_assert <- main. + Called from tests/pdg/postdom.c:23. +[value] Recording results for __VERIFIER_assert +[value] Done for function __VERIFIER_assert +[value] computing for function __VERIFIER_assert <- main. + Called from tests/pdg/postdom.c:23. +[value] Recording results for __VERIFIER_assert +[value] Done for function __VERIFIER_assert +[value] computing for function __VERIFIER_assert <- main. + Called from tests/pdg/postdom.c:23. +[value] Recording results for __VERIFIER_assert +[value] Done for function __VERIFIER_assert +[value] computing for function __VERIFIER_assert <- main. + Called from tests/pdg/postdom.c:23. +[value] Recording results for __VERIFIER_assert +[value] Done for function __VERIFIER_assert +tests/pdg/postdom.c:21:[kernel] warning: signed overflow. assert sn+2 ≤ 2147483647; +[value] computing for function __VERIFIER_assert <- main. + Called from tests/pdg/postdom.c:23. +[value] Recording results for __VERIFIER_assert +[value] Done for function __VERIFIER_assert +[value] computing for function __VERIFIER_assert <- main. + Called from tests/pdg/postdom.c:23. +[value] Recording results for __VERIFIER_assert +[value] Done for function __VERIFIER_assert +[value] computing for function __VERIFIER_assert <- main. + Called from tests/pdg/postdom.c:23. +[value] Recording results for __VERIFIER_assert +[value] Done for function __VERIFIER_assert +[value] computing for function __VERIFIER_assert <- main. + Called from tests/pdg/postdom.c:23. +[value] Recording results for __VERIFIER_assert +[value] Done for function __VERIFIER_assert +[value] computing for function __VERIFIER_assert <- main. + Called from tests/pdg/postdom.c:23. +[value] Recording results for __VERIFIER_assert +[value] Done for function __VERIFIER_assert +[value] Recording results for main +[value] done for function main +[pdg] computing for function __VERIFIER_assert +[pdg] done for function __VERIFIER_assert +[pdg] computing for function main +[from] Computing for function __VERIFIER_assert +[from] Done for function __VERIFIER_assert +tests/pdg/postdom.c:20:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main +[pdg] ====== PDG GRAPH COMPUTED ====== +[pdg] PDG for __VERIFIER_assert + {n1}: InCtrl + {n2}: VarDecl : cond + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: ! cond + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + {n5}: ERROR: + -[-c-]-> 1 + -[-c-]-> 4 + -[-c-]-> 6 + {n6}: ERROR: goto ERROR; + -[-c-]-> 1 + -[-c-]-> 4 + -[-c-]-> 5 + -[-c-]-> 6 + {n7}: return; + -[-c-]-> 1 +[pdg] PDG for main + {n8}: InCtrl + {n9}: VarDecl : loop1 + -[a--]-> 10 + {n10}: In1 + -[a--]-> 9 + {n11}: VarDecl : m1 + -[a--]-> 12 + {n12}: In2 + -[a--]-> 11 + {n13}: VarDecl : sn + {n14}: VarDecl : x + {n15}: VarDecl : tmp + {n16}: VarDecl : __retres + {n17}: sn = 0; + -[-c-]-> 8 + -[a--]-> 13 + {n18}: return __retres; + -[-c-]-> 8 + -[--d]-> 16 + {n19}: OutRet + {n20}: x = (unsigned int)0; + -[-c-]-> 8 + -[a--]-> 14 + {n21}: while(1) + -[-c-]-> 8 + -[-c-]-> 21 + {n22}: block + -[-c-]-> 8 + -[-c-]-> 21 + {n23}: sn += 2; + -[-c-]-> 8 + -[a-d]-> 13 + -[--d]-> 17 + -[-c-]-> 21 + -[-c-]-> 22 + -[--d]-> 23 + {n24}: x ++; + -[-c-]-> 8 + -[a-d]-> 14 + -[--d]-> 20 + -[-c-]-> 21 + -[-c-]-> 22 + -[--d]-> 24 + {n25}: (unsigned int)sn == x * (unsigned int)2 + -[-c-]-> 8 + -[--d]-> 13 + -[--d]-> 14 + -[-c-]-> 21 + -[-c-]-> 22 + -[--d]-> 23 + -[--d]-> 24 + {n26}: tmp = 1; + -[-c-]-> 8 + -[a--]-> 15 + -[-c-]-> 21 + -[-c-]-> 22 + -[-c-]-> 25 + {n27}: sn == 0 + -[-c-]-> 8 + -[--d]-> 13 + -[-c-]-> 21 + -[-c-]-> 22 + -[--d]-> 23 + -[-c-]-> 25 + {n28}: tmp = 0; + -[-c-]-> 8 + -[a--]-> 15 + -[-c-]-> 21 + -[-c-]-> 22 + -[-c-]-> 25 + {n29}: Call19-InCtrl : __VERIFIER_assert(tmp); + -[-c-]-> 8 + -[-c-]-> 21 + -[-c-]-> 22 + {n30}: Call19-In1 : __VERIFIER_assert(tmp); + -[-c-]-> 8 + -[--d]-> 15 + -[-c-]-> 21 + -[-c-]-> 22 + -[--d]-> 26 + -[--d]-> 28 + -[-c-]-> 29 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/sets.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/sets.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/sets.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/sets.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,78 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/sets.c (with preprocessing) +[value] Analyzing an incomplete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + b ∈ [--..--] + c ∈ [--..--] + x ∈ [--..--] + y ∈ [--..--] + z ∈ [--..--] + t ∈ [--..--] +tests/pdg/sets.c:15:[kernel] warning: signed overflow. assert b+y ≤ 2147483647; +[value] Recording results for f +[value] done for function f +[inout] InOut (internal) for function f: + Operational inputs: + a + Operational inputs on termination: + a + Sure outputs: + b; c; x; y; z; t +[pdg] computing for function f +[pdg] done for function f +[pdg] ====== PDG GRAPH COMPUTED ====== +[pdg] PDG for f + {n1}: InCtrl + {n2}: VarDecl : a + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: y = 0; + -[-c-]-> 1 + {n5}: a + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + {n6}: y = 1; + -[-c-]-> 1 + -[-c-]-> 5 + {n7}: z = y; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 6 + {n8}: y ++; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 6 + {n9}: x = z; + -[-c-]-> 1 + -[--d]-> 7 + {n10}: b = a; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + {n11}: t = b + y; + -[-c-]-> 1 + -[--d]-> 8 + -[--d]-> 10 + {n12}: y = 5; + -[-c-]-> 1 + {n13}: c = 8; + -[-c-]-> 1 + {n14}: return; + -[-c-]-> 1 +[kernel] Test [all_uses] stmt1 +[kernel] {n9}: x = z; +[kernel] {n7}: z = y; +[kernel] {n11}: t = b + y; +[kernel] {n8}: y ++; +[kernel] Test [find_location_nodes_at_stmt] y@11 +[kernel] {n12}: y = 5; +[kernel] Test [all_dpds] y@11 +[kernel] {n1}: InCtrl +[kernel] Test [all_uses] y@11 +[kernel] Test [all_related_nodes] y@11 +[kernel] {n1}: InCtrl +[kernel] {n12}: y = 5; diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/simple_call.1.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/simple_call.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/simple_call.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/simple_call.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,191 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/simple_call.c (with preprocessing) +[value] Analyzing a complete application starting at call_in_loop +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + G1 ∈ [--..--] + G2 ∈ [--..--] + S ∈ [--..--] +tests/pdg/simple_call.c:51:[value] entering loop for the first time +[value] computing for function call <- call_in_loop. + Called from tests/pdg/simple_call.c:52. +tests/pdg/simple_call.c:45:[kernel] warning: signed overflow. assert G+y ≤ 2147483647; +[value] Recording results for call +[value] Done for function call +[value] computing for function call <- call_in_loop. + Called from tests/pdg/simple_call.c:52. +[value] Recording results for call +[value] Done for function call +[value] computing for function call <- call_in_loop. + Called from tests/pdg/simple_call.c:52. +[value] Recording results for call +[value] Done for function call +[value] computing for function call <- call_in_loop. + Called from tests/pdg/simple_call.c:52. +[value] Recording results for call +[value] Done for function call +[value] computing for function call <- call_in_loop. + Called from tests/pdg/simple_call.c:52. +[value] Recording results for call +[value] Done for function call +[value] computing for function call <- call_in_loop. + Called from tests/pdg/simple_call.c:52. +[value] Recording results for call +[value] Done for function call +[value] computing for function call <- call_in_loop. + Called from tests/pdg/simple_call.c:52. +[value] Recording results for call +[value] Done for function call +[value] computing for function call <- call_in_loop. + Called from tests/pdg/simple_call.c:52. +[value] Recording results for call +[value] Done for function call +[value] computing for function call <- call_in_loop. + Called from tests/pdg/simple_call.c:52. +[value] Recording results for call +[value] Done for function call +[value] computing for function call <- call_in_loop. + Called from tests/pdg/simple_call.c:52. +[value] Recording results for call +[value] Done for function call +[value] computing for function call <- call_in_loop. + Called from tests/pdg/simple_call.c:52. +[value] Recording results for call +[value] Done for function call +[value] computing for function call <- call_in_loop. + Called from tests/pdg/simple_call.c:52. +[value] Recording results for call +[value] Done for function call +[value] computing for function call <- call_in_loop. + Called from tests/pdg/simple_call.c:52. +[value] Recording results for call +[value] Done for function call +[value] computing for function call <- call_in_loop. + Called from tests/pdg/simple_call.c:52. +[value] Recording results for call +[value] Done for function call +tests/pdg/simple_call.c:52:[kernel] warning: signed overflow. assert a+tmp ≤ 2147483647; + (tmp from call(i, c)) +[value] computing for function call <- call_in_loop. + Called from tests/pdg/simple_call.c:52. +[value] Recording results for call +[value] Done for function call +[value] Recording results for call_in_loop +[value] done for function call_in_loop +[pdg] computing for function call_in_loop +[from] Computing for function call +[from] Done for function call +[pdg] done for function call_in_loop +[pdg] PDG for call_in_loop + {n1}: InCtrl + {n2}: VarDecl : c + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : i + {n5}: VarDecl : a + {n6}: VarDecl : tmp + {n7}: a = 0; + -[-c-]-> 1 + -[a--]-> 5 + {n8}: i = 0; + -[-c-]-> 1 + -[a--]-> 4 + {n9}: while(1) + -[-c-]-> 1 + -[-c-]-> 9 + -[-c-]-> 10 + -[-c-]-> 19 + {n10}: i < G + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 8 + -[-c-]-> 9 + -[-c-]-> 10 + -[--d](G)-> 15 + -[--d]-> 18 + -[-c-]-> 19 + -[--d]-> 22 + {n11}: unspecified sequence + -[-c-]-> 1 + -[-c-]-> 9 + -[-c-]-> 10 + -[-c-]-> 19 + {n12}: Call31-InCtrl : tmp = call(i,c); + -[-c-]-> 1 + -[-c-]-> 9 + -[-c-]-> 10 + -[-c-]-> 11 + -[-c-]-> 19 + {n13}: Call31-In1 : tmp = call(i,c); + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 8 + -[-c-]-> 9 + -[-c-]-> 10 + -[-c-]-> 11 + -[-c-]-> 12 + -[--d]-> 18 + -[-c-]-> 19 + {n14}: Call31-In2 : tmp = call(i,c); + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[-c-]-> 9 + -[-c-]-> 10 + -[-c-]-> 11 + -[-c-]-> 12 + -[-c-]-> 19 + {n15}: Call31-Out(G) : tmp = call(i,c); + -[-c-]-> 1 + -[-c-]-> 9 + -[-c-]-> 10 + -[-c-]-> 11 + -[-c-]-> 12 + -[--d]-> 14 + -[--d](G)-> 15 + -[-c-]-> 19 + -[--d]-> 22 + {n16}: Call31-OutRet : tmp = call(i,c); + -[-c-]-> 1 + -[a--]-> 6 + -[-c-]-> 9 + -[-c-]-> 10 + -[-c-]-> 11 + -[-c-]-> 12 + -[--d]-> 13 + -[-c-]-> 19 + {n17}: a += tmp; + -[-c-]-> 1 + -[a-d]-> 5 + -[--d]-> 6 + -[--d]-> 7 + -[-c-]-> 9 + -[-c-]-> 10 + -[-c-]-> 11 + -[--d]-> 16 + -[--d]-> 17 + -[-c-]-> 19 + {n18}: i ++; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 8 + -[-c-]-> 9 + -[-c-]-> 10 + -[--d]-> 18 + -[-c-]-> 19 + {n19}: break; + -[-c-]-> 1 + -[-c-]-> 9 + -[-c-]-> 10 + -[-c-]-> 19 + {n20}: return a; + -[-c-]-> 1 + -[--d]-> 5 + -[--d]-> 7 + -[--d]-> 17 + {n21}: OutRet + -[--d]-> 20 + {n22}: In(G) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/simple_call.2.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/simple_call.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/simple_call.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/simple_call.2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,59 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/simple_call.c (with preprocessing) +[value] Analyzing a complete application starting at call_mix_G1_G2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + G1 ∈ [--..--] + G2 ∈ [--..--] + S ∈ [--..--] +[value] computing for function mix_G1_G2 <- call_mix_G1_G2. + Called from tests/pdg/simple_call.c:28. +[value] Recording results for mix_G1_G2 +[value] Done for function mix_G1_G2 +tests/pdg/simple_call.c:31:[kernel] warning: signed overflow. assert -2147483648 ≤ x1+x2 ≤ 2147483647; +[value] Recording results for call_mix_G1_G2 +[value] done for function call_mix_G1_G2 +[pdg] computing for function call_mix_G1_G2 +[from] Computing for function mix_G1_G2 +[from] Done for function mix_G1_G2 +[pdg] done for function call_mix_G1_G2 +[pdg] PDG for call_mix_G1_G2 + {n1}: InCtrl + {n2}: VarDecl : x1 + {n3}: VarDecl : x2 + {n4}: VarDecl : __retres + {n5}: Call7-InCtrl : mix_G1_G2(); + -[-c-]-> 1 + {n6}: Call7-Out(G1) : mix_G1_G2(); + -[-c-]-> 1 + -[-c-]-> 5 + -[--d]-> 14 + {n7}: Call7-Out(G2) : mix_G1_G2(); + -[-c-]-> 1 + -[-c-]-> 5 + -[--d]-> 13 + {n8}: x1 = G1; + -[-c-]-> 1 + -[a--]-> 2 + -[--d](G1)-> 6 + {n9}: x2 = G2; + -[-c-]-> 1 + -[a--]-> 3 + -[--d](G2)-> 7 + {n10}: __retres = x1 + x2; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[a--]-> 4 + -[--d]-> 8 + -[--d]-> 9 + {n11}: return __retres; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 10 + {n12}: OutRet + -[--d]-> 11 + {n13}: In(G1) + {n14}: In(G2) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/simple_call.3.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/simple_call.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/simple_call.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/simple_call.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,53 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/simple_call.c (with preprocessing) +[value] Analyzing a complete application starting at call_multiple_global_outputs +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + G1 ∈ [--..--] + G2 ∈ [--..--] + S ∈ [--..--] +[value] computing for function multiple_global_outputs <- + call_multiple_global_outputs. + Called from tests/pdg/simple_call.c:39. +[value] Recording results for multiple_global_outputs +[value] Done for function multiple_global_outputs +[value] Recording results for call_multiple_global_outputs +[value] done for function call_multiple_global_outputs +[pdg] computing for function call_multiple_global_outputs +[from] Computing for function multiple_global_outputs +[from] Done for function multiple_global_outputs +[pdg] done for function call_multiple_global_outputs +[pdg] PDG for call_multiple_global_outputs + {n1}: InCtrl + {n2}: VarDecl : x + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : y + -[a--]-> 5 + {n5}: In2 + -[a--]-> 4 + {n6}: Call17-InCtrl : multiple_global_outputs(x,y); + -[-c-]-> 1 + {n7}: Call17-In1 : multiple_global_outputs(x,y); + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[-c-]-> 6 + {n8}: Call17-In2 : multiple_global_outputs(x,y); + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 5 + -[-c-]-> 6 + {n9}: Call17-Out(G) : multiple_global_outputs(x,y); + -[-c-]-> 1 + -[-c-]-> 6 + -[--d]-> 8 + {n10}: Call17-Out(S.a) : multiple_global_outputs(x,y); + -[-c-]-> 1 + -[-c-]-> 6 + -[--d]-> 7 + {n11}: return; + -[-c-]-> 1 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/simple_call.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/simple_call.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/simple_call.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/simple_call.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,68 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/simple_call.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + G1 ∈ [--..--] + G2 ∈ [--..--] + S ∈ [--..--] +[value] computing for function call <- main. + Called from tests/pdg/simple_call.c:59. +tests/pdg/simple_call.c:45:[kernel] warning: signed overflow. assert G+y ≤ 2147483647; +[value] Recording results for call +[value] Done for function call +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function call +[from] Done for function call +[pdg] done for function main +[pdg] PDG for main + {n1}: InCtrl + {n2}: VarDecl : a + {n3}: VarDecl : b + {n4}: VarDecl : c + {n5}: a = 0; + -[-c-]-> 1 + -[a--]-> 2 + {n6}: b = 1; + -[-c-]-> 1 + -[a--]-> 3 + {n7}: c = 3; + -[-c-]-> 1 + -[a--]-> 4 + {n8}: Call40-InCtrl : a = call(a + b,b + c); + -[-c-]-> 1 + {n9}: Call40-In1 : a = call(a + b,b + c); + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[--d]-> 5 + -[--d]-> 6 + -[-c-]-> 8 + {n10}: Call40-In2 : a = call(a + b,b + c); + -[-c-]-> 1 + -[--d]-> 3 + -[--d]-> 4 + -[--d]-> 6 + -[--d]-> 7 + -[-c-]-> 8 + {n11}: Call40-Out(G) : a = call(a + b,b + c); + -[-c-]-> 1 + -[-c-]-> 8 + -[--d]-> 10 + -[--d]-> 15 + {n12}: Call40-OutRet : a = call(a + b,b + c); + -[-c-]-> 1 + -[a--]-> 2 + -[-c-]-> 8 + -[--d]-> 9 + {n13}: return a; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 12 + {n14}: OutRet + -[--d]-> 13 + {n15}: In(G) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/simple_intra_slice.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/simple_intra_slice.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/simple_intra_slice.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/simple_intra_slice.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,900 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/simple_intra_slice.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Unknown ∈ {0} + G ∈ {0} + S ∈ {0} + S1 ∈ {0} + S2 ∈ {0} +tests/pdg/simple_intra_slice.c:98:[value] entering loop for the first time +tests/pdg/simple_intra_slice.c:99:[kernel] warning: signed overflow. assert -2147483648 ≤ uninit-1; +tests/pdg/simple_intra_slice.c:99:[kernel] warning: signed overflow. assert Unknown+1 ≤ 2147483647; +tests/pdg/simple_intra_slice.c:99:[kernel] warning: signed overflow. assert -2147483648 ≤ Unknown-1; +tests/pdg/simple_intra_slice.c:100:[value] entering loop for the first time +tests/pdg/simple_intra_slice.c:101:[kernel] warning: signed overflow. assert -2147483648 ≤ uninit2-1; +tests/pdg/simple_intra_slice.c:101:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +tests/pdg/simple_intra_slice.c:101:[kernel] warning: signed overflow. assert -2147483648 ≤ S.a-1; +[value] computing for function f2 <- main. + Called from tests/pdg/simple_intra_slice.c:103. +[value] computing for function f1 <- f2 <- main. + Called from tests/pdg/simple_intra_slice.c:23. +[value] Recording results for f1 +[value] Done for function f1 +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/pdg/simple_intra_slice.c:104. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/pdg/simple_intra_slice.c:105. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/pdg/simple_intra_slice.c:106. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/pdg/simple_intra_slice.c:107. +tests/pdg/simple_intra_slice.c:59:[value] entering loop for the first time +tests/pdg/simple_intra_slice.c:71:[kernel] warning: signed overflow. assert -2147483648 ≤ 10*n ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +tests/pdg/simple_intra_slice.c:107:[kernel] warning: signed overflow. assert res+tmp_3 ≤ 2147483647; + (tmp_3 from f6(Unknown)) +[value] computing for function f7 <- main. + Called from tests/pdg/simple_intra_slice.c:108. +tests/pdg/simple_intra_slice.c:79:[kernel] warning: signed overflow. assert S.a+3 ≤ 2147483647; +tests/pdg/simple_intra_slice.c:82:[kernel] warning: signed overflow. assert s0.a+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/pdg/simple_intra_slice.c:110. +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f8 <- main. + Called from tests/pdg/simple_intra_slice.c:112. +[value] Recording results for f8 +[value] Done for function f8 +[value] Recording results for main +[value] done for function main +[pdg] computing for function f1 +[pdg] done for function f1 +[pdg] computing for function f2 +[from] Computing for function f1 +[from] Done for function f1 +[pdg] done for function f2 +[pdg] computing for function f3 +[pdg] done for function f3 +[pdg] computing for function f4 +[pdg] done for function f4 +[pdg] computing for function f5 +[pdg] done for function f5 +[pdg] computing for function f6 +[pdg] done for function f6 +[pdg] computing for function f7 +[pdg] done for function f7 +[pdg] computing for function f8 +[pdg] done for function f8 +[pdg] computing for function main +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[pdg] done for function main +[pdg] ====== PDG GRAPH COMPUTED ====== +[pdg] PDG for f1 + {n1}: InCtrl + {n2}: VarDecl : x + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : y + -[a--]-> 5 + {n5}: In2 + -[a--]-> 4 + {n6}: VarDecl : a + {n7}: VarDecl : b + {n8}: VarDecl : __retres + {n9}: a = 1; + -[-c-]-> 1 + -[a--]-> 6 + {n10}: b = 2; + -[-c-]-> 1 + -[a--]-> 7 + {n11}: G = x + a; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[--d]-> 6 + -[--d]-> 9 + {n12}: __retres = y + b; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 5 + -[--d]-> 7 + -[a--]-> 8 + -[--d]-> 10 + {n13}: return __retres; + -[-c-]-> 1 + -[--d]-> 8 + -[--d]-> 12 + {n14}: OutRet + -[--d]-> 13 +[pdg] PDG for f2 + {n15}: InCtrl + {n16}: VarDecl : a + {n17}: VarDecl : b + {n18}: VarDecl : c + {n19}: VarDecl : tmp + {n20}: a = 1; + -[-c-]-> 15 + -[a--]-> 16 + {n21}: b = a + 1; + -[-c-]-> 15 + -[--d]-> 16 + -[a--]-> 17 + -[--d]-> 20 + {n22}: c = 3; + -[-c-]-> 15 + -[a--]-> 18 + {n23}: Call11-InCtrl : tmp = f1(b,c); + -[-c-]-> 15 + {n24}: Call11-In1 : tmp = f1(b,c); + -[-c-]-> 15 + -[--d]-> 17 + -[--d]-> 21 + -[-c-]-> 23 + {n25}: Call11-In2 : tmp = f1(b,c); + -[-c-]-> 15 + -[--d]-> 18 + -[--d]-> 22 + -[-c-]-> 23 + {n26}: Call11-Out(G) : tmp = f1(b,c); + -[-c-]-> 15 + -[-c-]-> 23 + -[--d]-> 24 + {n27}: Call11-OutRet : tmp = f1(b,c); + -[-c-]-> 15 + -[a--]-> 19 + -[-c-]-> 23 + -[--d]-> 25 + {n28}: return tmp; + -[-c-]-> 15 + -[--d]-> 19 + -[--d]-> 27 + {n29}: OutRet + -[--d]-> 28 +[pdg] PDG for f3 + {n30}: InCtrl + {n31}: VarDecl : c + -[a--]-> 32 + {n32}: In1 + -[a--]-> 31 + {n33}: VarDecl : a + {n34}: VarDecl : b + {n35}: VarDecl : x + {n36}: a = 1; + -[-c-]-> 30 + -[a--]-> 33 + {n37}: b = 2; + -[-c-]-> 30 + -[a--]-> 34 + {n38}: x = 0; + -[-c-]-> 30 + -[a--]-> 35 + {n39}: c > Unknown + -[-c-]-> 30 + -[--d]-> 31 + -[--d]-> 32 + -[--d]-> 44 + {n40}: x = b; + -[-c-]-> 30 + -[--d]-> 34 + -[a--]-> 35 + -[--d]-> 37 + -[-c-]-> 39 + {n41}: G = a; + -[-c-]-> 30 + -[--d]-> 33 + -[--d]-> 36 + -[-c-]-> 39 + {n42}: return x; + -[-c-]-> 30 + -[--d]-> 35 + -[--d]-> 38 + -[--d]-> 40 + {n43}: OutRet + -[--d]-> 42 + {n44}: In(Unknown) +[pdg] PDG for f4 + {n45}: InCtrl + {n46}: VarDecl : c + -[a--]-> 47 + {n47}: In1 + -[a--]-> 46 + {n48}: VarDecl : a + {n49}: VarDecl : b + {n50}: VarDecl : x + {n51}: a = 1; + -[-c-]-> 45 + -[a--]-> 48 + {n52}: b = 2; + -[-c-]-> 45 + -[a--]-> 49 + {n53}: x = 0; + -[-c-]-> 45 + -[a--]-> 50 + {n54}: c > Unknown + -[-c-]-> 45 + -[--d]-> 46 + -[--d]-> 47 + -[--d]-> 59 + {n55}: G = a; + -[-c-]-> 45 + -[--d]-> 48 + -[--d]-> 51 + -[-c-]-> 54 + {n56}: x = b; + -[-c-]-> 45 + -[--d]-> 49 + -[a--]-> 50 + -[--d]-> 52 + -[-c-]-> 54 + {n57}: return x; + -[-c-]-> 45 + -[--d]-> 50 + -[--d]-> 53 + -[--d]-> 56 + {n58}: OutRet + -[--d]-> 57 + {n59}: In(Unknown) +[pdg] PDG for f5 + {n60}: InCtrl + {n61}: VarDecl : c + -[a--]-> 62 + {n62}: In1 + -[a--]-> 61 + {n63}: VarDecl : x + {n64}: x = 0; + -[-c-]-> 60 + -[a--]-> 63 + {n65}: c > Unknown + -[-c-]-> 60 + -[--d]-> 61 + -[--d]-> 62 + -[--d]-> 78 + {n66}: goto Lsuite; + -[-c-]-> 60 + -[-c-]-> 65 + -[-c-]-> 67 + {n67}: Lsuite: + -[-c-]-> 60 + {n68}: x ++; + -[-c-]-> 60 + -[a-d]-> 63 + -[--d]-> 64 + -[-c-]-> 65 + -[-c-]-> 66 + {n69}: Lsuite: ; + -[-c-]-> 60 + {n70}: c < Unknown + -[-c-]-> 60 + -[--d]-> 61 + -[--d]-> 62 + -[--d]-> 78 + {n71}: goto L2; + -[-c-]-> 60 + -[-c-]-> 70 + -[-c-]-> 72 + {n72}: L2: + -[-c-]-> 60 + {n73}: G ++; + -[-c-]-> 60 + -[-c-]-> 70 + -[-c-]-> 71 + -[--d]-> 77 + {n74}: L2: x ++; + -[-c-]-> 60 + -[a-d]-> 63 + -[--d]-> 64 + -[--d]-> 68 + {n75}: return x; + -[-c-]-> 60 + -[--d]-> 63 + -[--d]-> 74 + {n76}: OutRet + -[--d]-> 75 + {n77}: In(G) + {n78}: In(Unknown) +[pdg] PDG for f6 + {n79}: InCtrl + {n80}: VarDecl : n + -[a--]-> 81 + {n81}: In1 + -[a--]-> 80 + {n82}: VarDecl : i + {n83}: VarDecl : __retres + {n84}: i = 0; + -[-c-]-> 79 + -[a--]-> 82 + {n85}: while(1) + -[-c-]-> 79 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[-c-]-> 93 + -[-c-]-> 94 + {n86}: n < 10 + -[-c-]-> 79 + -[--d]-> 80 + -[--d]-> 81 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[--d]-> 91 + -[-c-]-> 93 + -[-c-]-> 94 + {n87}: block + -[-c-]-> 79 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[-c-]-> 93 + -[-c-]-> 94 + {n88}: Unknown > 3 + -[-c-]-> 79 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[-c-]-> 93 + -[-c-]-> 94 + -[--d]-> 103 + {n89}: n % 2 + -[-c-]-> 79 + -[--d]-> 80 + -[--d]-> 81 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[--d]-> 91 + -[-c-]-> 93 + -[-c-]-> 94 + {n90}: continue; + -[-c-]-> 79 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[-c-]-> 89 + -[-c-]-> 93 + -[-c-]-> 94 + {n91}: n ++; + -[-c-]-> 79 + -[a-d]-> 80 + -[--d]-> 81 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[-c-]-> 89 + -[-c-]-> 90 + -[--d]-> 91 + -[-c-]-> 93 + -[-c-]-> 94 + {n92}: i = 1; + -[-c-]-> 79 + -[a--]-> 82 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[-c-]-> 93 + -[-c-]-> 94 + {n93}: break; + -[-c-]-> 79 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[-c-]-> 93 + -[-c-]-> 94 + {n94}: break; + -[-c-]-> 79 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[-c-]-> 93 + -[-c-]-> 94 + {n95}: i + -[-c-]-> 79 + -[--d]-> 82 + -[--d]-> 84 + -[--d]-> 92 + {n96}: __retres = 0; + -[-c-]-> 79 + -[a--]-> 83 + -[-c-]-> 95 + {n97}: __retres = 10 * n; + -[-c-]-> 79 + -[--d]-> 80 + -[--d]-> 81 + -[a--]-> 83 + -[--d]-> 91 + -[-c-]-> 95 + {n98}: goto return_label; + -[-c-]-> 79 + -[-c-]-> 95 + -[-c-]-> 99 + {n99}: return_label: + -[-c-]-> 79 + {n100}: goto return_label; + -[-c-]-> 79 + -[-c-]-> 95 + -[-c-]-> 99 + {n101}: return_label: return __retres; + -[-c-]-> 79 + -[--d]-> 83 + -[--d]-> 96 + -[--d]-> 97 + {n102}: OutRet + -[--d]-> 101 + {n103}: In(Unknown) +[pdg] PDG for f7 + {n104}: InCtrl + {n105}: VarDecl : s0 + -[a--]-> 106 + {n106}: In1 + -[a--]-> 105 + {n107}: VarDecl : x + {n108}: x = S.a; + -[-c-]-> 104 + -[a--]-> 107 + -[--d]-> 114 + {n109}: x > 0 + -[-c-]-> 104 + -[--d]-> 107 + -[--d]-> 108 + {n110}: S.a += 3; + -[-c-]-> 104 + -[-c-]-> 109 + -[--d]-> 114 + {n111}: (s0.a) ++; + -[-c-]-> 104 + -[a-d]-> 105 + -[--d]-> 106 + -[-c-]-> 109 + {n112}: S = s0; + -[-c-]-> 104 + -[--d]-> 105 + -[--d]-> 106 + -[-c-]-> 109 + -[--d]-> 111 + {n113}: return; + -[-c-]-> 104 + {n114}: In(S.a) +[pdg] PDG for f8 + {n115}: InCtrl + {n116}: VarDecl : ps + -[a--]-> 117 + {n117}: In1 + -[a--]-> 116 + {n118}: (ps->a) ++; + -[-c-]-> 115 + -[a-d]-> 116 + -[a-d]-> 117 + -[--d]-> 123 + -[--d]-> 124 + {n119}: (ps->b) ++; + -[-c-]-> 115 + -[a-d]-> 116 + -[a-d]-> 117 + -[--d]-> 121 + -[--d]-> 122 + {n120}: return; + -[-c-]-> 115 + {n121}: In(S1.b) + {n122}: In(S2.b) + {n123}: In(S1.a) + {n124}: In(S2.a) +[pdg] PDG for main + {n125}: InCtrl + {n126}: VarDecl : res + {n127}: VarDecl : uninit + {n128}: VarDecl : uninit2 + {n129}: VarDecl : tmp + {n130}: VarDecl : tmp_0 + {n131}: VarDecl : tmp_1 + {n132}: VarDecl : tmp_2 + {n133}: VarDecl : tmp_3 + {n134}: res = 0; + -[-c-]-> 125 + -[a--]-> 126 + {n135}: uninit = 0; + -[-c-]-> 125 + -[a--]-> 127 + {n136}: uninit2 = 0; + -[-c-]-> 125 + -[a--]-> 128 + {n137}: while(1) + -[-c-]-> 125 + -[-c-]-> 137 + -[-c-]-> 138 + -[-c-]-> 142 + {n138}: uninit + -[-c-]-> 125 + -[--d]-> 127 + -[--d]-> 135 + -[-c-]-> 137 + -[-c-]-> 138 + -[-c-]-> 142 + {n139}: uninit - 1 + -[-c-]-> 125 + -[--d]-> 127 + -[--d]-> 135 + -[-c-]-> 137 + -[-c-]-> 138 + -[-c-]-> 142 + {n140}: Unknown ++; + -[-c-]-> 125 + -[-c-]-> 137 + -[-c-]-> 138 + -[-c-]-> 139 + -[--d]-> 140 + -[--d]-> 141 + -[-c-]-> 142 + -[--d]-> 200 + {n141}: Unknown --; + -[-c-]-> 125 + -[-c-]-> 137 + -[-c-]-> 138 + -[-c-]-> 139 + -[--d]-> 140 + -[--d]-> 141 + -[-c-]-> 142 + -[--d]-> 200 + {n142}: break; + -[-c-]-> 125 + -[-c-]-> 137 + -[-c-]-> 138 + -[-c-]-> 142 + {n143}: while(1) + -[-c-]-> 125 + -[-c-]-> 137 + -[-c-]-> 138 + -[-c-]-> 142 + -[-c-]-> 143 + -[-c-]-> 144 + -[-c-]-> 148 + {n144}: uninit2 + -[-c-]-> 125 + -[--d]-> 128 + -[--d]-> 136 + -[-c-]-> 137 + -[-c-]-> 138 + -[-c-]-> 142 + -[-c-]-> 143 + -[-c-]-> 144 + -[-c-]-> 148 + {n145}: uninit2 - 1 + -[-c-]-> 125 + -[--d]-> 128 + -[--d]-> 136 + -[-c-]-> 137 + -[-c-]-> 138 + -[-c-]-> 142 + -[-c-]-> 143 + -[-c-]-> 144 + -[-c-]-> 148 + {n146}: (S.a) ++; + -[-c-]-> 125 + -[-c-]-> 137 + -[-c-]-> 138 + -[-c-]-> 142 + -[-c-]-> 143 + -[-c-]-> 144 + -[-c-]-> 145 + -[--d]-> 146 + -[--d]-> 147 + -[-c-]-> 148 + -[--d]-> 201 + {n147}: (S.a) --; + -[-c-]-> 125 + -[-c-]-> 137 + -[-c-]-> 138 + -[-c-]-> 142 + -[-c-]-> 143 + -[-c-]-> 144 + -[-c-]-> 145 + -[--d]-> 146 + -[--d]-> 147 + -[-c-]-> 148 + -[--d]-> 201 + {n148}: break; + -[-c-]-> 125 + -[-c-]-> 137 + -[-c-]-> 138 + -[-c-]-> 142 + -[-c-]-> 143 + -[-c-]-> 144 + -[-c-]-> 148 + {n149}: unspecified sequence + -[-c-]-> 125 + {n150}: Call104-InCtrl : tmp = f2(); + -[-c-]-> 125 + -[-c-]-> 149 + {n151}: Call104-Out(G) : tmp = f2(); + -[-c-]-> 125 + -[-c-]-> 149 + -[-c-]-> 150 + {n152}: Call104-OutRet : tmp = f2(); + -[-c-]-> 125 + -[a--]-> 129 + -[-c-]-> 149 + -[-c-]-> 150 + {n153}: res += tmp; + -[-c-]-> 125 + -[a-d]-> 126 + -[--d]-> 129 + -[--d]-> 134 + -[-c-]-> 149 + -[--d]-> 152 + {n154}: unspecified sequence + -[-c-]-> 125 + {n155}: Call107-InCtrl : tmp_0 = f3(1); + -[-c-]-> 125 + -[-c-]-> 154 + {n156}: Call107-In1 : tmp_0 = f3(1); + -[-c-]-> 125 + -[-c-]-> 154 + -[-c-]-> 155 + {n157}: Call107-Out(G) : tmp_0 = f3(1); + -[-c-]-> 125 + -[--d]-> 140 + -[--d]-> 141 + -[-c-]-> 154 + -[-c-]-> 155 + -[--d]-> 156 + -[--d]-> 200 + {n158}: Call107-OutRet : tmp_0 = f3(1); + -[-c-]-> 125 + -[a--]-> 130 + -[--d]-> 140 + -[--d]-> 141 + -[-c-]-> 154 + -[-c-]-> 155 + -[--d]-> 156 + -[--d]-> 200 + {n159}: res += tmp_0; + -[-c-]-> 125 + -[a-d]-> 126 + -[--d]-> 130 + -[--d]-> 153 + -[-c-]-> 154 + -[--d]-> 158 + {n160}: unspecified sequence + -[-c-]-> 125 + {n161}: Call110-InCtrl : tmp_1 = f4(1); + -[-c-]-> 125 + -[-c-]-> 160 + {n162}: Call110-In1 : tmp_1 = f4(1); + -[-c-]-> 125 + -[-c-]-> 160 + -[-c-]-> 161 + {n163}: Call110-Out(G) : tmp_1 = f4(1); + -[-c-]-> 125 + -[--d]-> 140 + -[--d]-> 141 + -[-c-]-> 160 + -[-c-]-> 161 + -[--d]-> 162 + -[--d]-> 200 + {n164}: Call110-OutRet : tmp_1 = f4(1); + -[-c-]-> 125 + -[a--]-> 131 + -[--d]-> 140 + -[--d]-> 141 + -[-c-]-> 160 + -[-c-]-> 161 + -[--d]-> 162 + -[--d]-> 200 + {n165}: res += tmp_1; + -[-c-]-> 125 + -[a-d]-> 126 + -[--d]-> 131 + -[--d]-> 159 + -[-c-]-> 160 + -[--d]-> 164 + {n166}: unspecified sequence + -[-c-]-> 125 + {n167}: Call113-InCtrl : tmp_2 = f5(1); + -[-c-]-> 125 + -[-c-]-> 166 + {n168}: Call113-In1 : tmp_2 = f5(1); + -[-c-]-> 125 + -[-c-]-> 166 + -[-c-]-> 167 + {n169}: Call113-Out(G) : tmp_2 = f5(1); + -[-c-]-> 125 + -[--d]-> 140 + -[--d]-> 141 + -[--d](G)-> 151 + -[--d](G)-> 157 + -[--d](G)-> 163 + -[-c-]-> 166 + -[-c-]-> 167 + -[--d]-> 168 + -[--d]-> 200 + {n170}: Call113-OutRet : tmp_2 = f5(1); + -[-c-]-> 125 + -[a--]-> 132 + -[--d]-> 140 + -[--d]-> 141 + -[-c-]-> 166 + -[-c-]-> 167 + -[--d]-> 168 + -[--d]-> 200 + {n171}: res += tmp_2; + -[-c-]-> 125 + -[a-d]-> 126 + -[--d]-> 132 + -[--d]-> 165 + -[-c-]-> 166 + -[--d]-> 170 + {n172}: unspecified sequence + -[-c-]-> 125 + {n173}: Call116-InCtrl : tmp_3 = f6(Unknown); + -[-c-]-> 125 + -[-c-]-> 172 + {n174}: Call116-In1 : tmp_3 = f6(Unknown); + -[-c-]-> 125 + -[--d]-> 140 + -[--d]-> 141 + -[-c-]-> 172 + -[-c-]-> 173 + -[--d]-> 200 + {n175}: Call116-OutRet : tmp_3 = f6(Unknown); + -[-c-]-> 125 + -[a--]-> 133 + -[--d]-> 140 + -[--d]-> 141 + -[-c-]-> 172 + -[-c-]-> 173 + -[--d]-> 174 + -[--d]-> 200 + {n176}: res += tmp_3; + -[-c-]-> 125 + -[a-d]-> 126 + -[--d]-> 133 + -[--d]-> 171 + -[-c-]-> 172 + -[--d]-> 175 + {n177}: Call118-InCtrl : f7(S); + -[-c-]-> 125 + {n178}: Call118-In1 : f7(S); + -[-c-]-> 125 + -[--d]-> 146 + -[--d]-> 147 + -[-c-]-> 177 + -[--d]-> 202 + {n179}: Call118-Out(S.a) : f7(S); + -[-c-]-> 125 + -[--d]-> 146 + -[--d]-> 147 + -[-c-]-> 177 + -[--d]-> 178 + -[--d]-> 201 + {n180}: Call118-Out(S{.b; .c}) : f7(S); + -[-c-]-> 125 + -[--d]-> 146 + -[--d]-> 147 + -[-c-]-> 177 + -[--d]-> 178 + -[--d]-> 201 + {n181}: Unknown + -[-c-]-> 125 + -[--d]-> 140 + -[--d]-> 141 + -[--d]-> 200 + {n182}: Call121-InCtrl : f8(& S1); + -[-c-]-> 125 + -[-c-]-> 181 + {n183}: Call121-In1 : f8(& S1); + -[-c-]-> 125 + -[-c-]-> 181 + -[-c-]-> 182 + {n184}: Call121-Out(S1.a) : f8(& S1); + -[-c-]-> 125 + -[-c-]-> 181 + -[-c-]-> 182 + -[--d]-> 183 + -[--d]-> 198 + -[--d]-> 199 + {n185}: Call121-Out(S1.b) : f8(& S1); + -[-c-]-> 125 + -[-c-]-> 181 + -[-c-]-> 182 + -[--d]-> 183 + -[--d]-> 196 + -[--d]-> 197 + {n186}: Call121-Out(S2.a) : f8(& S1); + -[-c-]-> 125 + -[-c-]-> 181 + -[-c-]-> 182 + -[--d]-> 183 + -[--d]-> 198 + -[--d]-> 199 + {n187}: Call121-Out(S2.b) : f8(& S1); + -[-c-]-> 125 + -[-c-]-> 181 + -[-c-]-> 182 + -[--d]-> 183 + -[--d]-> 196 + -[--d]-> 197 + {n188}: Call122-InCtrl : f8(& S2); + -[-c-]-> 125 + -[-c-]-> 181 + {n189}: Call122-In1 : f8(& S2); + -[-c-]-> 125 + -[-c-]-> 181 + -[-c-]-> 188 + {n190}: Call122-Out(S1.a) : f8(& S2); + -[-c-]-> 125 + -[-c-]-> 181 + -[-c-]-> 188 + -[--d]-> 189 + -[--d]-> 198 + -[--d]-> 199 + {n191}: Call122-Out(S1.b) : f8(& S2); + -[-c-]-> 125 + -[-c-]-> 181 + -[-c-]-> 188 + -[--d]-> 189 + -[--d]-> 196 + -[--d]-> 197 + {n192}: Call122-Out(S2.a) : f8(& S2); + -[-c-]-> 125 + -[-c-]-> 181 + -[-c-]-> 188 + -[--d]-> 189 + -[--d]-> 198 + -[--d]-> 199 + {n193}: Call122-Out(S2.b) : f8(& S2); + -[-c-]-> 125 + -[-c-]-> 181 + -[-c-]-> 188 + -[--d]-> 189 + -[--d]-> 196 + -[--d]-> 197 + {n194}: return res; + -[-c-]-> 125 + -[--d]-> 126 + -[--d]-> 176 + {n195}: OutRet + -[--d]-> 194 + {n196}: In(S1.b) + {n197}: In(S2.b) + {n198}: In(S1.a) + {n199}: In(S2.a) + {n200}: In(Unknown) + {n201}: In(S.a) + {n202}: In(S) diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/top_pdg_input.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/top_pdg_input.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/top_pdg_input.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/top_pdg_input.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,513 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/top_pdg_input.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + tab[0] ∈ {0} + [1] ∈ {7} + S ∈ {0} + G ∈ {0} +[value] computing for function f1 <- main. + Called from tests/pdg/top_pdg_input.c:38. +[value] computing for function top_input <- f1 <- main. + Called from tests/pdg/top_pdg_input.c:13. +tests/pdg/top_pdg_input.c:13:[kernel] warning: Neither code nor specification for function top_input, generating default assigns from the prototype +[value] using specification for function top_input +[value] Done for function top_input +tests/pdg/top_pdg_input.c:13:[kernel] warning: out of bounds read. assert \valid_read(tmp); + (tmp from top_input()) +tests/pdg/top_pdg_input.c:13:[value] Reading left-value *tmp. + The location is {{ alloced_return_top_input -> [0..17179868928],0%256 }}. + It contains a garbled mix of {alloced_return_top_input} because of + Library function {tests/pdg/top_pdg_input.c:13}. +tests/pdg/top_pdg_input.c:13:[kernel] warning: out of bounds read. assert \valid_read(*tmp); + (tmp from top_input()) +tests/pdg/top_pdg_input.c:13:[value] Assigning imprecise value to i. + The imprecision originates from Library function + {tests/pdg/top_pdg_input.c:13} +tests/pdg/top_pdg_input.c:14:[value] Reading left-value i. + It contains a garbled mix of {alloced_return_top_input} because of + Library function {tests/pdg/top_pdg_input.c:13}. +tests/pdg/top_pdg_input.c:14:[kernel] warning: out of bounds read. assert \valid_read(&tab[i]); +tests/pdg/top_pdg_input.c:14:[value] Assigning imprecise value to v. + The imprecision originates from Library function + {tests/pdg/top_pdg_input.c:13} +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/pdg/top_pdg_input.c:39. +[value] computing for function top_input <- f2 <- main. + Called from tests/pdg/top_pdg_input.c:20. +[value] Done for function top_input +tests/pdg/top_pdg_input.c:20:[kernel] warning: out of bounds read. assert \valid_read(tmp); + (tmp from top_input()) +tests/pdg/top_pdg_input.c:20:[value] Reading left-value *tmp. + The location is {{ alloced_return_top_input -> [0..17179868928],0%256 }}. + It contains a garbled mix of {alloced_return_top_input} because of + Library function {tests/pdg/top_pdg_input.c:20}. +tests/pdg/top_pdg_input.c:20:[kernel] warning: out of bounds read. assert \valid_read(*tmp); + (tmp from top_input()) +tests/pdg/top_pdg_input.c:20:[value] Assigning imprecise value to i. + The imprecision originates from Library function + {tests/pdg/top_pdg_input.c:20} +tests/pdg/top_pdg_input.c:24:[value] Reading left-value i. + It contains a garbled mix of {alloced_return_top_input} because of + Library function {tests/pdg/top_pdg_input.c:20}. +tests/pdg/top_pdg_input.c:24:[kernel] warning: out of bounds read. assert \valid_read(&s.t[i]); +tests/pdg/top_pdg_input.c:24:[value] Reading left-value s.t[i]. + It contains a garbled mix of {alloced_return_top_input} because of + Library function {tests/pdg/top_pdg_input.c:20}. +tests/pdg/top_pdg_input.c:24:[kernel] warning: signed overflow. assert -2147483648 ≤ s.a+s.t[i] ≤ 2147483647; +tests/pdg/top_pdg_input.c:24:[value] Assigning imprecise value to __retres. + The imprecision originates from Library function + {tests/pdg/top_pdg_input.c:20} +[value] Recording results for f2 +[value] Done for function f2 +tests/pdg/top_pdg_input.c:39:[value] Reading left-value i. + It contains a garbled mix of {alloced_return_top_input} because of + Library function {tests/pdg/top_pdg_input.c:13}. +tests/pdg/top_pdg_input.c:39:[value] Reading left-value tmp_0. + It contains a garbled mix of {alloced_return_top_input} because of + Library function {tests/pdg/top_pdg_input.c:20}. +tests/pdg/top_pdg_input.c:39:[kernel] warning: signed overflow. + assert -2147483648 ≤ i+tmp_0 ≤ 2147483647; + (tmp_0 from f2()) +tests/pdg/top_pdg_input.c:39:[value] Assigning imprecise value to i. + The imprecision originates from Library function + {tests/pdg/top_pdg_input.c:13; tests/pdg/top_pdg_input.c:20} +tests/pdg/top_pdg_input.c:40:[value] Reading left-value i. + It contains a garbled mix of {alloced_return_top_input} because of + Library function {tests/pdg/top_pdg_input.c:13; + tests/pdg/top_pdg_input.c:20}. +tests/pdg/top_pdg_input.c:40:[kernel] warning: out of bounds read. assert \valid_read(p_str+i); +tests/pdg/top_pdg_input.c:40:[value] Reading left-value *(p_str + i). + The location is a garbled mix of {S_p_str; alloced_return_top_input} + because of Library function {tests/pdg/top_pdg_input.c:13; + tests/pdg/top_pdg_input.c:20}. + It contains a garbled mix of + {S_0_S_p_str; S_1_S_p_str; alloced_return_top_input} because of Misaligned + {tests/pdg/top_pdg_input.c:40}. +[value] computing for function strlen <- main. + Called from tests/pdg/top_pdg_input.c:40. +tests/pdg/top_pdg_input.c:31:[value] Assigning imprecise value to q. + The imprecision originates from Misaligned {tests/pdg/top_pdg_input.c:40} +tests/pdg/top_pdg_input.c:31:[value] entering loop for the first time +tests/pdg/top_pdg_input.c:31:[value] Reading left-value q. + It contains a garbled mix of + {S_0_S_p_str; S_1_S_p_str; alloced_return_top_input} because of Misaligned + {tests/pdg/top_pdg_input.c:40}. +tests/pdg/top_pdg_input.c:31:[kernel] warning: out of bounds read. assert \valid_read(q); +tests/pdg/top_pdg_input.c:31:[value] Reading left-value *q. + The location is {{ S_0_S_p_str -> [0..8]; + S_1_S_p_str -> [0..8]; + alloced_return_top_input -> [0..34359738360] }}. + It contains a garbled mix of {alloced_return_top_input} because of + Library function {tests/pdg/top_pdg_input.c:20}. +tests/pdg/top_pdg_input.c:31:[kernel] warning: pointer comparison: assert \pointer_comparable((void *)0, (void *)*q); +tests/pdg/top_pdg_input.c:31:[kernel] warning: signed overflow. assert k+1 ≤ 2147483647; +[value] Recording results for strlen +[value] Done for function strlen +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function strlen: + q ∈ + {{ &S_0_S_p_str{[0], [1]} ; &S_1_S_p_str{[0], [1]} ; + &alloced_return_top_input + [0..4294967295] }} + k ∈ [0..2147483647] +[value] Values at end of function f1: + G ∈ {1} + i ∈ + {{ garbled mix of &{alloced_return_top_input} + (origin: Library function {tests/pdg/top_pdg_input.c:13}) }} + v ∈ + {{ garbled mix of &{alloced_return_top_input} + (origin: Library function {tests/pdg/top_pdg_input.c:13}) }} +[value] Values at end of function f2: + S.a ∈ {2} + .t[0..4] ∈ {0} + i ∈ + {{ garbled mix of &{alloced_return_top_input} + (origin: Library function {tests/pdg/top_pdg_input.c:20}) }} + s.a ∈ {2} + .t[0..4] ∈ {0} + __retres ∈ + {{ garbled mix of &{alloced_return_top_input} + (origin: Library function {tests/pdg/top_pdg_input.c:20}) }} +tests/pdg/top_pdg_input.c:13:[kernel] more than 200(67108864) elements to enumerate. Approximating. +[value] Values at end of function main: + S.a ∈ {2} + .t[0..4] ∈ {0} + G ∈ {1} + i ∈ + {{ garbled mix of &{alloced_return_top_input} + (origin: Library function {tests/pdg/top_pdg_input.c:13; + tests/pdg/top_pdg_input.c:20}) }} +[from] Computing for function strlen +[from] Done for function strlen +[from] Computing for function f1 +[from] Computing for function top_input <-f1 +[from] Done for function top_input +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function strlen: + \result FROM p; S_0_S_p_str[0..1]; S_1_S_p_str[0..1]; + alloced_return_top_input[bits 0 to ..] +[from] Function top_input: + \result FROM \nothing +[from] Function f1: + G FROM G + \result FROM tab[0..1]; alloced_return_top_input[bits 0 to ..] +[from] Function f2: + S.a FROM \nothing + \result FROM S.t[0..4]; alloced_return_top_input[bits 0 to ..] +[from] Function main: + S.a FROM \nothing + G FROM G + \result FROM tab[0..1]; S.t[0..4]; p_str; S_p_str[0..1]; S_0_S_p_str[0..1]; + S_1_S_p_str[0..1]; alloced_return_top_input[bits 0 to ..] +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function strlen: + q; k +[inout] Inputs for function strlen: + S_0_S_p_str[0..1]; S_1_S_p_str[0..1]; + alloced_return_top_input[bits 0 to ..] +[inout] Out (internal) for function f1: + G; i; tmp; v +[inout] Inputs for function f1: + tab[0..1]; G; alloced_return_top_input[bits 0 to ..] +[inout] Out (internal) for function f2: + S.a; i; tmp; s; __retres +[inout] Inputs for function f2: + S; alloced_return_top_input[bits 0 to ..] +[inout] Out (internal) for function main: + S.a; G; i; tmp_0; tmp_1 +[inout] Inputs for function main: + tab[0..1]; S; G; S_p_str[0..1]; S_0_S_p_str[0..1]; S_1_S_p_str[0..1]; + alloced_return_top_input[bits 0 to ..] +[pdg] computing for function strlen +[pdg] done for function strlen +[pdg] computing for function top_input +[pdg] done for function top_input +[pdg] computing for function f1 +[pdg] done for function f1 +[pdg] computing for function f2 +[pdg] done for function f2 +[pdg] computing for function main +[pdg] done for function main +[pdg] ====== PDG GRAPH COMPUTED ====== +[pdg] PDG for strlen + {n1}: InCtrl + {n2}: VarDecl : p + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : q + {n5}: VarDecl : k + {n6}: k = 0; + -[-c-]-> 1 + -[a--]-> 5 + {n7}: q = p; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[a--]-> 4 + {n8}: while(1) + -[-c-]-> 1 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 12 + {n9}: *q + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 7 + -[-c-]-> 8 + -[-c-]-> 9 + -[--d]-> 11 + -[-c-]-> 12 + -[--d]-> 15 + -[--d]-> 16 + -[--d]-> 17 + {n10}: k ++; + -[-c-]-> 1 + -[a-d]-> 5 + -[--d]-> 6 + -[-c-]-> 8 + -[-c-]-> 9 + -[--d]-> 10 + -[-c-]-> 12 + {n11}: q ++; + -[-c-]-> 1 + -[a-d]-> 4 + -[--d]-> 7 + -[-c-]-> 8 + -[-c-]-> 9 + -[--d]-> 11 + -[-c-]-> 12 + {n12}: break; + -[-c-]-> 1 + -[-c-]-> 8 + -[-c-]-> 9 + -[-c-]-> 12 + {n13}: return k; + -[-c-]-> 1 + -[--d]-> 5 + -[--d]-> 6 + -[--d]-> 10 + {n14}: OutRet + -[--d]-> 13 + {n15}: In(S_0_S_p_str[0..1]) + {n16}: In(S_1_S_p_str[0..1]) + {n17}: In(alloced_return_top_input[bits 0 to ..]) +[pdg] PDG for top_input + {n18}: InCtrl + {n19}: OutRet +[pdg] PDG for f1 + {n20}: InCtrl + {n21}: VarDecl : i + {n22}: VarDecl : tmp + {n23}: VarDecl : v + {n24}: Call1-InCtrl : tmp = top_input(); + -[-c-]-> 20 + {n25}: Call1-OutRet : tmp = top_input(); + -[-c-]-> 20 + -[a--]-> 22 + -[-c-]-> 24 + {n26}: i = *(*tmp); + -[-c-]-> 20 + -[a--]-> 21 + -[--d]-> 22 + -[--d]-> 25 + -[--d]-> 33 + {n27}: v = tab[i]; + -[-c-]-> 20 + -[--d]-> 21 + -[a--]-> 23 + -[--d]-> 26 + -[--d]-> 32 + -[--d]-> 33 + {n28}: G ++; + -[-c-]-> 20 + -[--d]-> 31 + {n29}: return v; + -[-c-]-> 20 + -[--d]-> 23 + -[--d]-> 27 + {n30}: OutRet + -[--d]-> 29 + {n31}: In(G) + {n32}: In(tab[0..1]) + {n33}: In(alloced_return_top_input[bits 0 to ..]) +[pdg] PDG for f2 + {n34}: InCtrl + {n35}: VarDecl : i + {n36}: VarDecl : tmp + {n37}: VarDecl : s + {n38}: VarDecl : __retres + {n39}: Call10-InCtrl : tmp = top_input(); + -[-c-]-> 34 + {n40}: Call10-OutRet : tmp = top_input(); + -[-c-]-> 34 + -[a--]-> 36 + -[-c-]-> 39 + {n41}: i = *(*tmp); + -[-c-]-> 34 + -[a--]-> 35 + -[--d]-> 36 + -[--d]-> 40 + -[--d]-> 47 + {n42}: S.a = 2; + -[-c-]-> 34 + {n43}: s = S; + -[-c-]-> 34 + -[a--]-> 37 + -[--d]-> 42 + -[--d]-> 48 + {n44}: __retres = s.a + s.t[i]; + -[-c-]-> 34 + -[--d]-> 35 + -[--d]-> 37 + -[a--]-> 38 + -[--d]-> 41 + -[--d]-> 43 + -[--d]-> 47 + {n45}: return __retres; + -[-c-]-> 34 + -[--d]-> 38 + -[--d]-> 44 + {n46}: OutRet + -[--d]-> 45 + {n47}: In(alloced_return_top_input[bits 0 to ..]) + {n48}: In(S.t[0..4]) +[pdg] PDG for main + {n49}: InCtrl + {n50}: VarDecl : p_str + -[a--]-> 51 + {n51}: In1 + -[a--]-> 50 + {n52}: VarDecl : i + {n53}: VarDecl : tmp_0 + {n54}: VarDecl : tmp_1 + {n55}: Call30-InCtrl : i = f1(); + -[-c-]-> 49 + {n56}: Call30-Out(G) : i = f1(); + -[-c-]-> 49 + -[-c-]-> 55 + -[--d]-> 74 + {n57}: Call30-OutRet : i = f1(); + -[-c-]-> 49 + -[a--]-> 52 + -[-c-]-> 55 + -[--d]-> 70 + -[--d]-> 73 + {n58}: unspecified sequence + -[-c-]-> 49 + {n59}: Call32-InCtrl : tmp_0 = f2(); + -[-c-]-> 49 + -[-c-]-> 58 + {n60}: Call32-Out(S.a) : tmp_0 = f2(); + -[-c-]-> 49 + -[-c-]-> 58 + -[-c-]-> 59 + {n61}: Call32-OutRet : tmp_0 = f2(); + -[-c-]-> 49 + -[a--]-> 53 + -[-c-]-> 58 + -[-c-]-> 59 + -[--d]-> 70 + -[--d]-> 72 + {n62}: i += tmp_0; + -[-c-]-> 49 + -[a-d]-> 52 + -[--d]-> 53 + -[--d]-> 57 + -[-c-]-> 58 + -[--d]-> 61 + {n63}: Call34-InCtrl : tmp_1 = strlen(*(p_str + i)); + -[-c-]-> 49 + {n64}: Call34-In1 : tmp_1 = strlen(*(p_str + i)); + -[-c-]-> 49 + -[--d]-> 50 + -[--d]-> 51 + -[--d]-> 52 + -[--d]-> 62 + -[-c-]-> 63 + -[--d]-> 70 + -[--d]-> 71 + {n65}: Call34-OutRet : tmp_1 = strlen(*(p_str + i)); + -[-c-]-> 49 + -[a--]-> 54 + -[-c-]-> 63 + -[--d]-> 64 + -[--d]-> 68 + -[--d]-> 69 + -[--d]-> 70 + {n66}: return tmp_1; + -[-c-]-> 49 + -[--d]-> 54 + -[--d]-> 65 + {n67}: OutRet + -[--d]-> 66 + {n68}: In(S_0_S_p_str[0..1]) + {n69}: In(S_1_S_p_str[0..1]) + {n70}: In(alloced_return_top_input[bits 0 to ..]) + {n71}: In(S_p_str[0..1]) + {n72}: In(S.t[0..4]) + {n73}: In(tab[0..1]) + {n74}: In(G) +[value] Analyzing a complete application starting at main_asm +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + tab[0] ∈ {0} + [1] ∈ {7} + S ∈ {0} + G ∈ {0} +[value] computing for function fun_asm <- main_asm. + Called from tests/pdg/top_pdg_input.c:51. +tests/pdg/top_pdg_input.c:45:[value] warning: assuming assembly code has no effects in function fun_asm +[value] Recording results for fun_asm +[value] Done for function fun_asm +[value] Recording results for main_asm +[value] done for function main_asm +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function fun_asm: + __retres ∈ {4} +[value] Values at end of function main_asm: + j ∈ {3} +[from] Computing for function fun_asm +[from] Done for function fun_asm +[from] Computing for function main_asm +[from] Done for function main_asm +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function fun_asm: + \result FROM i +[from] Function main_asm: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function fun_asm: + __retres +[inout] Inputs for function fun_asm: + \nothing +[inout] Out (internal) for function main_asm: + j; tmp +[inout] Inputs for function main_asm: + \nothing +[pdg] computing for function fun_asm +tests/pdg/top_pdg_input.c:45:[pdg] warning: Ignoring inline assembly code +[pdg] done for function fun_asm +[pdg] computing for function main_asm +[pdg] done for function main_asm +[pdg] ====== PDG GRAPH COMPUTED ====== +[pdg] PDG for fun_asm + {n75}: InCtrl + {n76}: VarDecl : i + -[a--]-> 77 + {n77}: In1 + -[a--]-> 76 + {n78}: VarDecl : __retres + {n79}: __asm__ ("BLA":); + -[-c-]-> 75 + {n80}: __retres = i + 1; + -[-c-]-> 75 + -[--d]-> 76 + -[--d]-> 77 + -[a--]-> 78 + {n81}: return __retres; + -[-c-]-> 75 + -[--d]-> 78 + -[--d]-> 80 + {n82}: OutRet + -[--d]-> 81 +[pdg] PDG for main_asm + {n83}: InCtrl + {n84}: VarDecl : j + {n85}: VarDecl : tmp + {n86}: j = 3; + -[-c-]-> 83 + -[a--]-> 84 + {n87}: Call42-InCtrl : tmp = fun_asm(j); + -[-c-]-> 83 + {n88}: Call42-In1 : tmp = fun_asm(j); + -[-c-]-> 83 + -[--d]-> 84 + -[--d]-> 86 + -[-c-]-> 87 + {n89}: Call42-OutRet : tmp = fun_asm(j); + -[-c-]-> 83 + -[a--]-> 85 + -[-c-]-> 87 + -[--d]-> 88 + {n90}: return tmp; + -[-c-]-> 83 + -[--d]-> 85 + -[--d]-> 89 + {n91}: OutRet + -[--d]-> 90 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/oracle/variadic.res.oracle frama-c-20150201+sodium+dfsg/tests/pdg/oracle/variadic.res.oracle --- frama-c-20140301+neon+dfsg/tests/pdg/oracle/variadic.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/oracle/variadic.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,269 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pdg/variadic.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f1 <- main. + Called from tests/pdg/variadic.c:37. +[value] computing for function lib_f <- f1 <- main. + Called from tests/pdg/variadic.c:23. +tests/pdg/variadic.c:23:[kernel] warning: Neither code nor specification for function lib_f, generating default assigns from the prototype +[value] using specification for function lib_f +[value] Done for function lib_f +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/pdg/variadic.c:38. +[value] computing for function lib_f <- f2 <- main. + Called from tests/pdg/variadic.c:27. +[value] Done for function lib_f +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/pdg/variadic.c:39. +[value] computing for function lib_f <- f3 <- main. + Called from tests/pdg/variadic.c:31. +[value] Done for function lib_f +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f2 <- main. + Called from tests/pdg/variadic.c:40. +[value] computing for function lib_f <- f2 <- main. + Called from tests/pdg/variadic.c:27. +[value] Done for function lib_f +[value] Recording results for f2 +[value] Done for function f2 +[value] Recording results for main +[value] done for function main +[pdg] computing for function lib_f +[pdg] warning: not implemented by pdg yet: variadic function +[pdg] Top for function lib_f +[pdg] computing for function f1 +[from] Computing for function lib_f +[from] Done for function lib_f +[pdg] done for function f1 +[pdg] computing for function f2 +[pdg] done for function f2 +[pdg] computing for function f3 +[pdg] done for function f3 +[pdg] computing for function main +[from] Computing for function f1 +tests/pdg/variadic.c:23:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function f1 +[from] Computing for function f2 +tests/pdg/variadic.c:27:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function f2 +[from] Computing for function f3 +tests/pdg/variadic.c:31:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function f3 +[pdg] done for function main +[pdg] ====== PDG GRAPH COMPUTED ====== +[pdg] PDG for lib_f + Top PDG +[pdg] PDG for f1 + {n1}: InCtrl + {n2}: VarDecl : a + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : tmp + {n5}: Call17-InCtrl : tmp = lib_f(1,a); + -[-c-]-> 1 + {n6}: Call17-In1 : tmp = lib_f(1,a); + -[-c-]-> 1 + -[-c-]-> 5 + {n7}: Call17-In2 : tmp = lib_f(1,a); + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + {n8}: Call17-OutRet : tmp = lib_f(1,a); + -[-c-]-> 1 + -[a--]-> 4 + -[-c-]-> 5 + -[--d]-> 6 + {n9}: return tmp; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 8 + {n10}: OutRet + -[--d]-> 9 +[pdg] PDG for f2 + {n11}: InCtrl + {n12}: VarDecl : a + -[a--]-> 13 + {n13}: In1 + -[a--]-> 12 + {n14}: VarDecl : b + -[a--]-> 15 + {n15}: In2 + -[a--]-> 14 + {n16}: VarDecl : tmp + {n17}: Call20-InCtrl : tmp = lib_f(2,a,b); + -[-c-]-> 11 + {n18}: Call20-In1 : tmp = lib_f(2,a,b); + -[-c-]-> 11 + -[-c-]-> 17 + {n19}: Call20-In2 : tmp = lib_f(2,a,b); + -[-c-]-> 11 + -[--d]-> 12 + -[--d]-> 13 + {n20}: Call20-In3 : tmp = lib_f(2,a,b); + -[-c-]-> 11 + -[--d]-> 14 + -[--d]-> 15 + {n21}: Call20-OutRet : tmp = lib_f(2,a,b); + -[-c-]-> 11 + -[a--]-> 16 + -[-c-]-> 17 + -[--d]-> 18 + {n22}: return tmp; + -[-c-]-> 11 + -[--d]-> 16 + -[--d]-> 21 + {n23}: OutRet + -[--d]-> 22 +[pdg] PDG for f3 + {n24}: InCtrl + {n25}: VarDecl : a + -[a--]-> 26 + {n26}: In1 + -[a--]-> 25 + {n27}: VarDecl : b + -[a--]-> 28 + {n28}: In2 + -[a--]-> 27 + {n29}: VarDecl : c + -[a--]-> 30 + {n30}: In3 + -[a--]-> 29 + {n31}: VarDecl : tmp + {n32}: Call23-InCtrl : tmp = lib_f(3,a,b,c); + -[-c-]-> 24 + {n33}: Call23-In1 : tmp = lib_f(3,a,b,c); + -[-c-]-> 24 + -[-c-]-> 32 + {n34}: Call23-In2 : tmp = lib_f(3,a,b,c); + -[-c-]-> 24 + -[--d]-> 25 + -[--d]-> 26 + {n35}: Call23-In3 : tmp = lib_f(3,a,b,c); + -[-c-]-> 24 + -[--d]-> 27 + -[--d]-> 28 + {n36}: Call23-In4 : tmp = lib_f(3,a,b,c); + -[-c-]-> 24 + -[--d]-> 29 + -[--d]-> 30 + {n37}: Call23-OutRet : tmp = lib_f(3,a,b,c); + -[-c-]-> 24 + -[a--]-> 31 + -[-c-]-> 32 + -[--d]-> 33 + {n38}: return tmp; + -[-c-]-> 24 + -[--d]-> 31 + -[--d]-> 37 + {n39}: OutRet + -[--d]-> 38 +[pdg] PDG for main + {n40}: InCtrl + {n41}: VarDecl : a1 + {n42}: VarDecl : a2 + {n43}: VarDecl : a3 + {n44}: VarDecl : a4 + {n45}: VarDecl : a5 + {n46}: VarDecl : a6 + {n47}: VarDecl : s + {n48}: VarDecl : s1 + {n49}: VarDecl : s2 + {n50}: VarDecl : s3 + {n51}: a1 = 1; + -[-c-]-> 40 + -[a--]-> 41 + {n52}: a2 = 2; + -[-c-]-> 40 + -[a--]-> 42 + {n53}: a3 = 3; + -[-c-]-> 40 + -[a--]-> 43 + {n54}: a4 = 4; + -[-c-]-> 40 + -[a--]-> 44 + {n55}: a5 = 5; + -[-c-]-> 40 + -[a--]-> 45 + {n56}: a6 = 6; + -[-c-]-> 40 + -[a--]-> 46 + {n57}: Call32-InCtrl : s1 = f1(a1); + -[-c-]-> 40 + {n58}: Call32-In1 : s1 = f1(a1); + -[-c-]-> 40 + -[--d]-> 41 + -[--d]-> 51 + -[-c-]-> 57 + {n59}: Call32-OutRet : s1 = f1(a1); + -[-c-]-> 40 + -[a--]-> 48 + -[-c-]-> 57 + {n60}: Call33-InCtrl : s2 = f2(a2,a3); + -[-c-]-> 40 + {n61}: Call33-In1 : s2 = f2(a2,a3); + -[-c-]-> 40 + -[--d]-> 42 + -[--d]-> 52 + -[-c-]-> 60 + {n62}: Call33-In2 : s2 = f2(a2,a3); + -[-c-]-> 40 + -[--d]-> 43 + -[--d]-> 53 + -[-c-]-> 60 + {n63}: Call33-OutRet : s2 = f2(a2,a3); + -[-c-]-> 40 + -[a--]-> 49 + -[-c-]-> 60 + {n64}: Call34-InCtrl : s3 = f3(a4,a5,a6); + -[-c-]-> 40 + {n65}: Call34-In1 : s3 = f3(a4,a5,a6); + -[-c-]-> 40 + -[--d]-> 44 + -[--d]-> 54 + -[-c-]-> 64 + {n66}: Call34-In2 : s3 = f3(a4,a5,a6); + -[-c-]-> 40 + -[--d]-> 45 + -[--d]-> 55 + -[-c-]-> 64 + {n67}: Call34-In3 : s3 = f3(a4,a5,a6); + -[-c-]-> 40 + -[--d]-> 46 + -[--d]-> 56 + -[-c-]-> 64 + {n68}: Call34-OutRet : s3 = f3(a4,a5,a6); + -[-c-]-> 40 + -[a--]-> 50 + -[-c-]-> 64 + {n69}: Call35-InCtrl : s = f2(s1,s2); + -[-c-]-> 40 + {n70}: Call35-In1 : s = f2(s1,s2); + -[-c-]-> 40 + -[--d]-> 48 + -[--d]-> 59 + -[-c-]-> 69 + {n71}: Call35-In2 : s = f2(s1,s2); + -[-c-]-> 40 + -[--d]-> 49 + -[--d]-> 63 + -[-c-]-> 69 + {n72}: Call35-OutRet : s = f2(s1,s2); + -[-c-]-> 40 + -[a--]-> 47 + -[-c-]-> 69 + {n73}: return s; + -[-c-]-> 40 + -[--d]-> 47 + -[--d]-> 72 + {n74}: OutRet + -[--d]-> 73 diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/README frama-c-20150201+sodium+dfsg/tests/pdg/README --- frama-c-20140301+neon+dfsg/tests/pdg/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,62 @@ +This file present the tests in ppc/test/pdg that deal with the +Program Dependence Graph computation. + +** tests/pdg/dpds_intra.c + many small tests for the PDG. + The function "test_ctrl_dpd_multiple" is a case where some + PDG nodes should have more than one control dependencies, + but it cannot be tested because the value analysis doesn't work on that case. + +** tests/pdg/simple_call.c + tests for the PDG of function calls. + +** tests/pdg/calls_and_implicits.c + test the PDG for dependencies between global variables in calls. + Check if inputs and outputs are not mixed up. + +** tests/pdg/calls_and_struct.c + test the PDG for dependencies with structures. + In the function 'asgn_struct' we see that the precision could be better. + +** tests/pdg/decl_dpds.c + test the PDG with pointers and global variables. + +** tests/pdg/globals.c + Some tests to have more information about value analysis results. + Some of the results seem strange... + +** tests/pdg/inter_alias2.c + Test the PDG with pointers. + Show that the alias analysis merge the contexts and the precison problem. + +** tests/pdg/inter_alias.c + Test the PDG with pointers. + +** tests/pdg/multiple_calls.c + Test the PDG for call through function pointer. + +** tests/pdg/no_body.c + Test the PDG for call to a function that has no body. + It is strange that the result of the function doesn't depend on the inputs, + but it is the behaviour of the whole tool. + +** tests/pdg/pb_infinite_loop.c + Infinite loop => no post-dominator computation (not defined in this case). + Not-Implemented-Yet ! + We should over-approximate the control dependencies in the loop + so that every statement depend on every test. + +** tests/pdg/variadic.c + Test a call to a function with a variable number of arguments. + The PDG of the variadic function is not computed -> TOP. + +** tests/pdg/dyn_dpds.c + tests/pdg/dyn_dpds.ml + Test for the dynamic dependencies. + +** tests/pdg/call.c + A very simple example to generate graph for the documentation. + +** tests/pdg/doc_dot.c + A very simple example to show the different kinds of nodes and link + in a .dot file (also for the documentation). + diff -Nru frama-c-20140301+neon+dfsg/tests/pdg/test_config frama-c-20150201+sodium+dfsg/tests/pdg/test_config --- frama-c-20140301+neon+dfsg/tests/pdg/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pdg/test_config 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1 @@ +CMD: FRAMAC_PLUGIN=tests/.empty @frama-c@ \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/tests/pretty_printing/binary_logic_op.c frama-c-20150201+sodium+dfsg/tests/pretty_printing/binary_logic_op.c --- frama-c-20140301+neon+dfsg/tests/pretty_printing/binary_logic_op.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pretty_printing/binary_logic_op.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,12 @@ +/*@ predicate foo (integer x) = + x <= 0 && (x <= 1 && x<= 3) ==> + x<=4 || ((x<=5 && x<=6) || x<=7) && x<=8; + */ + +/*@ predicate bar(integer x, integer y, integer z, integer t) = + x == 0 || (y == 0 || (z == 0 || t == 0)); +*/ + +/*@ predicate mixed(integer x, integer y, integer z, integer t) = + x == 0 || ((y == 0 || z == 0) || t == 0); +*/ diff -Nru frama-c-20140301+neon+dfsg/tests/pretty_printing/oracle/binary_logic_op.res.oracle frama-c-20150201+sodium+dfsg/tests/pretty_printing/oracle/binary_logic_op.res.oracle --- frama-c-20140301+neon+dfsg/tests/pretty_printing/oracle/binary_logic_op.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pretty_printing/oracle/binary_logic_op.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,35 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pretty_printing/binary_logic_op.c (with preprocessing) +/* Generated by Frama-C */ +/*@ +predicate foo(ℤ x) = + x ≤ 0 ∧ x ≤ 1 ∧ x ≤ 3 ⇒ + x ≤ 4 ∨ (((x ≤ 5 ∧ x ≤ 6) ∨ x ≤ 7) ∧ x ≤ 8); + */ +/*@ +predicate bar(ℤ x, ℤ y, ℤ z, ℤ t) = + x ≡ 0 ∨ y ≡ 0 ∨ z ≡ 0 ∨ t ≡ 0; + */ +/*@ +predicate mixed(ℤ x, ℤ y, ℤ z, ℤ t) = + x ≡ 0 ∨ y ≡ 0 ∨ z ≡ 0 ∨ t ≡ 0; + */ + +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pretty_printing/result/binary_logic_op.c (with preprocessing) +[kernel] Parsing tests/pretty_printing/binary_logic_op.c (with preprocessing) +/* Generated by Frama-C */ +/*@ +predicate foo(ℤ x) = + x ≤ 0 ∧ x ≤ 1 ∧ x ≤ 3 ⇒ + x ≤ 4 ∨ (((x ≤ 5 ∧ x ≤ 6) ∨ x ≤ 7) ∧ x ≤ 8); + */ +/*@ +predicate bar(ℤ x, ℤ y, ℤ z, ℤ t) = + x ≡ 0 ∨ y ≡ 0 ∨ z ≡ 0 ∨ t ≡ 0; + */ +/*@ +predicate mixed(ℤ x, ℤ y, ℤ z, ℤ t) = + x ≡ 0 ∨ y ≡ 0 ∨ z ≡ 0 ∨ t ≡ 0; + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/pretty_printing/oracle/parenthesis.res.oracle frama-c-20150201+sodium+dfsg/tests/pretty_printing/oracle/parenthesis.res.oracle --- frama-c-20140301+neon+dfsg/tests/pretty_printing/oracle/parenthesis.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pretty_printing/oracle/parenthesis.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,8 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pretty_printing/parenthesis.c (with preprocessing) +/* Generated by Frama-C */ +/*@ +predicate implies(ℤ x, ℤ y) = + (x ≡ 0 ⇒ y ≡ 0) ⇒ x ≡ 1 ⇒ y ≡ 1; + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/pretty_printing/oracle/relations.res.oracle frama-c-20150201+sodium+dfsg/tests/pretty_printing/oracle/relations.res.oracle --- frama-c-20140301+neon+dfsg/tests/pretty_printing/oracle/relations.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pretty_printing/oracle/relations.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,17 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pretty_printing/relations.c (with preprocessing) +/* Generated by Frama-C */ +/*@ predicate rel1(ℤ x, ℤ y, ℤ z, ℤ t) = x ≤ y ≤ z ∧ z ≥ t; + */ +/*@ predicate rel2(ℤ x, ℤ y, ℤ z, ℤ t) = x ≤ y ≡ z ∧ z ≥ t; + */ + +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/pretty_printing/result/relations.c (with preprocessing) +[kernel] Parsing tests/pretty_printing/relations.c (with preprocessing) +/* Generated by Frama-C */ +/*@ predicate rel1(ℤ x, ℤ y, ℤ z, ℤ t) = x ≤ y ≤ z ∧ z ≥ t; + */ +/*@ predicate rel2(ℤ x, ℤ y, ℤ z, ℤ t) = x ≤ y ≡ z ∧ z ≥ t; + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/pretty_printing/parenthesis.c frama-c-20150201+sodium+dfsg/tests/pretty_printing/parenthesis.c --- frama-c-20140301+neon+dfsg/tests/pretty_printing/parenthesis.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pretty_printing/parenthesis.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,8 @@ +/* run.config + OPT: -print + */ + +/*@ + predicate implies(integer x,integer y) = + (x == 0 ==> y == 0) ==> (x == 1 ==> y == 1); + @*/ diff -Nru frama-c-20140301+neon+dfsg/tests/pretty_printing/relations.c frama-c-20150201+sodium+dfsg/tests/pretty_printing/relations.c --- frama-c-20140301+neon+dfsg/tests/pretty_printing/relations.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pretty_printing/relations.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,7 @@ +/*@ predicate rel1(integer x, integer y, integer z, integer t) = + x <= y <= z && z >= t; + */ + +/*@ predicate rel2(integer x, integer y, integer z, integer t) = + x <= y == z && z >= t; + */ diff -Nru frama-c-20140301+neon+dfsg/tests/pretty_printing/test_config frama-c-20150201+sodium+dfsg/tests/pretty_printing/test_config --- frama-c-20140301+neon+dfsg/tests/pretty_printing/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/pretty_printing/test_config 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,5 @@ +COMMENT: this directory is meant to test the parser and pretty-printer +COMMENT: the default option checks that pretty-printed code can be merged +COMMENT: with the original one +CMD: FRAMAC_PLUGIN=tests/.empty @frama-c@ +OPT: @PTEST_FILE@ -print -journal-disable -check -then -ocode @PTEST_DIR@/result/@PTEST_NAME@.c -print -then @PTEST_DIR@/result/@PTEST_NAME@.c @PTEST_FILE@ -ocode="" -print diff -Nru frama-c-20140301+neon+dfsg/tests/rte/compute_annot/compute_annot.ml frama-c-20150201+sodium+dfsg/tests/rte/compute_annot/compute_annot.ml --- frama-c-20140301+neon+dfsg/tests/rte/compute_annot/compute_annot.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/compute_annot/compute_annot.ml 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,45 @@ +let print () = + File.pretty_ast (); + Kernel.log "================================" + +let print_status () = + Kernel.log "printing status"; + let _, _, get_signedOv_status = !Db.RteGen.get_signedOv_status () in + let _, _, get_precond_status = !Db.RteGen.get_precond_status () in + Globals.Functions.iter + (fun kf -> + Kernel.log "kf = %s rte_gen_status = %b precond_status = %b\n" + (Kernel_function.get_name kf) + (get_signedOv_status kf) + (get_precond_status kf)) + +let main () = + Dynamic.Parameter.Bool.set "-rte-all" false; + Dynamic.Parameter.Bool.set "-rte-precond" true; + print (); + print_status (); + + Kernel.log "computing -rte-precond annotations" ; + !Db.RteGen.compute () ; + + print (); + print_status (); + + Kernel.log "computing rte-div annotations" ; + Dynamic.Parameter.Bool.set "-rte-div" true ; + !Db.RteGen.compute () ; + print (); + print_status (); + + Kernel.log "removing rte-div alarms" ; + let emitter = Dynamic.get ~plugin:"RteGen" "emitter" Emitter.ty in + let filter = function + | Alarms.Division_by_zero _ -> true + | _ -> false + in + Alarms.remove ~filter emitter; + !Db.RteGen.compute () ; + print (); + print_status () + +let () = Db.Main.extend main diff -Nru frama-c-20140301+neon+dfsg/tests/rte/my_annotation/my_annotation.ml frama-c-20150201+sodium+dfsg/tests/rte/my_annotation/my_annotation.ml --- frama-c-20140301+neon+dfsg/tests/rte/my_annotation/my_annotation.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/my_annotation/my_annotation.ml 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,51 @@ +let print () = + File.pretty_ast (); + Kernel.log "================================" + +let print_status () = + Kernel.log "printing status"; + let _, _, get_signedOv_status = !Db.RteGen.get_signedOv_status () in + let _, _, get_precond_status = !Db.RteGen.get_precond_status () in + Globals.Functions.iter + (fun kf -> + Kernel.log "kf = %s rte_gen_status = %b precond_status = %b\n" + (Kernel_function.get_name kf) + (get_signedOv_status kf) + (get_precond_status kf)) + +let main () = + Dynamic.Parameter.Bool.set "-rte-all" true; + Dynamic.Parameter.Bool.set "-rte-precond" true; + Kernel.SignedOverflow.on (); + + if not(Ast.is_computed ()) then Ast.compute () ; + print (); + + Globals.Functions.iter (fun kf -> !Db.RteGen.annotate_kf kf); + print () ; + print_status (); + + Kernel.log "Removing some rte annotations" ; + let _, set_signed, _ = !Db.RteGen.get_signedOv_status () in + let emitter = Dynamic.get ~plugin:"RteGen" "emitter" Emitter.ty in + let filter = function + | Alarms.Overflow _ -> true + | _ -> false + in + Alarms.remove ~filter emitter; + print (); + print_status (); + +(* Dynamic.Parameter.Bool.set "-rte-all" true;*) + let one_on_two = ref true in + Globals.Functions.iter + (fun kf -> + if !one_on_two then begin + set_signed kf false; + !Db.RteGen.annotate_kf kf + end; + one_on_two := not !one_on_two); + print () ; + print_status () + +let () = Db.Main.extend main diff -Nru frama-c-20140301+neon+dfsg/tests/rte/my_annot_proxy/my_annot_proxy.ml frama-c-20150201+sodium+dfsg/tests/rte/my_annot_proxy/my_annot_proxy.ml --- frama-c-20140301+neon+dfsg/tests/rte/my_annot_proxy/my_annot_proxy.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/my_annot_proxy/my_annot_proxy.ml 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,36 @@ +let print () = + File.pretty_ast (); + Kernel.log "================================" + +let print_status () = + Kernel.log "printing status"; + let rte_state_getter_list = !Db.RteGen.get_all_status () in + Globals.Functions.iter + (fun kf -> + Kernel.log "kf = %s" (Kernel_function.get_name kf) ; + List.iter + (fun (s, _, getter) -> Kernel.log "%s = %b" s (getter kf)) + rte_state_getter_list); + Kernel.log "================================" + +let main () = + Dynamic.Parameter.Bool.set "-rte-all" true; + Dynamic.Parameter.Bool.set "-rte-precond" true; + Kernel.SignedOverflow.on (); + if not(Ast.is_computed ()) then Ast.compute () ; + print (); + + Globals.Functions.iter (fun kf -> !Db.RteGen.annotate_kf kf); + print () ; + print_status (); + + let emitter = Dynamic.get ~plugin:"RteGen" "emitter" Emitter.ty in + let filter = function + | Alarms.Overflow _ | Alarms.Division_by_zero _ -> true + | _ -> false + in + Alarms.remove ~filter emitter; + print (); + print_status () + +let () = Db.Main.extend main diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/addsub.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/addsub.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/addsub.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/addsub.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/addsub.c (with preprocessing) +[rte] annotating function main +tests/rte/addsub.c:9:[rte] warning: signed overflow assert broken: 0x7fffffff+0x7fffffff ≤ 2147483647 +tests/rte/addsub.c:10:[rte] warning: signed overflow assert broken: -2147483648 ≤ (int)(-0x7fffffff)-0x7fffffff +tests/rte/addsub.c:11:[rte] warning: signed overflow assert broken: -2147483648 ≤ + (int)(-((int)((int)(-0x7fffffff)-1)))-1 +tests/rte/addsub.c:11:[rte] warning: unary minus assert broken: -2147483647 ≤ (int)(-0x7fffffff)-1 +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int x; + int y; + int z; + x = 0; + y = 0; + z = 0; + /*@ assert rte: signed_overflow: 0x7fffffff+0x7fffffff ≤ 2147483647; */ + z = 0x7fffffff + 0x7fffffff; + /*@ assert + rte: signed_overflow: -2147483648 ≤ (int)(-0x7fffffff)-0x7fffffff; + */ + z = -0x7fffffff - 0x7fffffff; + /*@ assert + rte: signed_overflow: + -2147483648 ≤ (int)(-((int)((int)(-0x7fffffff)-1)))-1; + */ + /*@ assert rte: signed_overflow: -2147483647 ≤ (int)(-0x7fffffff)-1; */ + z = - (-0x7fffffff - 1) - 1; + z = 0x7fffffff + 0; + z = -0x7fffffff - 1; + /*@ assert rte: signed_overflow: -2147483648 ≤ x+y; */ + /*@ assert rte: signed_overflow: x+y ≤ 2147483647; */ + z = x + y; + /*@ assert rte: signed_overflow: -2147483648 ≤ (int)(-0x7ffffffc)-y; */ + z = -0x7ffffffc - y; + /*@ assert rte: signed_overflow: -2147483648 ≤ (int)(-x)-0x7ffffffc; */ + /*@ assert rte: signed_overflow: -2147483647 ≤ x; */ + z = - x - 0x7ffffffc; + /*@ assert rte: signed_overflow: 0x7ffffffc+y ≤ 2147483647; */ + z = 0x7ffffffc + y; + /*@ assert rte: signed_overflow: x+0x7ffffffc ≤ 2147483647; */ + z = x + 0x7ffffffc; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/addsub_typedef.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/addsub_typedef.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/addsub_typedef.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/addsub_typedef.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,50 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/addsub_typedef.c (with preprocessing) +[rte] annotating function main +tests/rte/addsub_typedef.c:11:[rte] warning: signed overflow assert broken: 0x7fffffff+0x7fffffff ≤ 2147483647 +tests/rte/addsub_typedef.c:12:[rte] warning: signed overflow assert broken: -2147483648 ≤ (int)(-0x7fffffff)-0x7fffffff +tests/rte/addsub_typedef.c:13:[rte] warning: signed overflow assert broken: -2147483648 ≤ + (int)(-((int)((int)(-0x7fffffff)-1)))-1 +tests/rte/addsub_typedef.c:13:[rte] warning: unary minus assert broken: -2147483647 ≤ (int)(-0x7fffffff)-1 +/* Generated by Frama-C */ +typedef int tint; +int main(void) +{ + int __retres; + tint x; + tint y; + tint z; + x = 0; + y = 0; + z = 0; + /*@ assert rte: signed_overflow: 0x7fffffff+0x7fffffff ≤ 2147483647; */ + z = 0x7fffffff + 0x7fffffff; + /*@ assert + rte: signed_overflow: -2147483648 ≤ (int)(-0x7fffffff)-0x7fffffff; + */ + z = -0x7fffffff - 0x7fffffff; + /*@ assert + rte: signed_overflow: + -2147483648 ≤ (int)(-((int)((int)(-0x7fffffff)-1)))-1; + */ + /*@ assert rte: signed_overflow: -2147483647 ≤ (int)(-0x7fffffff)-1; */ + z = - (-0x7fffffff - 1) - 1; + z = 0x7fffffff + 0; + z = -0x7fffffff - 1; + /*@ assert rte: signed_overflow: -2147483648 ≤ x+y; */ + /*@ assert rte: signed_overflow: x+y ≤ 2147483647; */ + z = x + y; + /*@ assert rte: signed_overflow: -2147483648 ≤ (int)(-0x7ffffffc)-y; */ + z = -0x7ffffffc - y; + /*@ assert rte: signed_overflow: -2147483648 ≤ (int)(-x)-0x7ffffffc; */ + /*@ assert rte: signed_overflow: -2147483647 ≤ x; */ + z = - x - 0x7ffffffc; + /*@ assert rte: signed_overflow: 0x7ffffffc+y ≤ 2147483647; */ + z = 0x7ffffffc + y; + /*@ assert rte: signed_overflow: x+0x7ffffffc ≤ 2147483647; */ + z = x + 0x7ffffffc; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/addsub_unsigned.1.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/addsub_unsigned.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/addsub_unsigned.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/addsub_unsigned.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/addsub_unsigned.c (with preprocessing) +[rte] annotating function main +tests/rte/addsub_unsigned.c:12:[rte] warning: unsigned overflow assert broken: 0x80000000U+0x80000000U ≤ 4294967295 +tests/rte/addsub_unsigned.c:14:[rte] warning: unsigned overflow assert broken: 2U*0x80000000U ≤ 4294967295 +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + unsigned int ux; + unsigned int uy; + unsigned int uz; + ux = 0x7FFFFFFFU * (unsigned int)2; + /*@ assert rte: unsigned_overflow: 0x80000000U+0x80000000U ≤ 4294967295; + */ + uy = 0x80000000U + 0x80000000U; + /*@ assert rte: unsigned_overflow: 2U*0x80000000U ≤ 4294967295; */ + uy = 2U * 0x80000000U; + /*@ assert rte: unsigned_overflow: ux+(unsigned int)2 ≤ 4294967295; */ + uz = ux + (unsigned int)2; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/addsub_unsigned.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/addsub_unsigned.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/addsub_unsigned.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/addsub_unsigned.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,19 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/addsub_unsigned.c (with preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + unsigned int ux; + unsigned int uy; + unsigned int uz; + ux = 0x7FFFFFFFU * (unsigned int)2; + uy = 0x80000000U + 0x80000000U; + uy = 2U * 0x80000000U; + uz = ux + (unsigned int)2; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/addsub_unsigned_typedef.1.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/addsub_unsigned_typedef.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/addsub_unsigned_typedef.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/addsub_unsigned_typedef.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/addsub_unsigned_typedef.c (with preprocessing) +[rte] annotating function main +tests/rte/addsub_unsigned_typedef.c:14:[rte] warning: unsigned overflow assert broken: 0x80000000U+0x80000000U ≤ 4294967295 +tests/rte/addsub_unsigned_typedef.c:16:[rte] warning: unsigned overflow assert broken: 2U*0x80000000U ≤ 4294967295 +/* Generated by Frama-C */ +typedef unsigned int uint; +int main(void) +{ + int __retres; + uint ux; + uint uy; + uint uz; + ux = 0x7FFFFFFFU * (unsigned int)2; + /*@ assert rte: unsigned_overflow: 0x80000000U+0x80000000U ≤ 4294967295; + */ + uy = 0x80000000U + 0x80000000U; + /*@ assert rte: unsigned_overflow: 2U*0x80000000U ≤ 4294967295; */ + uy = 2U * 0x80000000U; + /*@ assert rte: unsigned_overflow: ux+(unsigned int)2 ≤ 4294967295; */ + uz = ux + (uint)2; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/addsub_unsigned_typedef.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/addsub_unsigned_typedef.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/addsub_unsigned_typedef.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/addsub_unsigned_typedef.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,20 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/addsub_unsigned_typedef.c (with preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +typedef unsigned int uint; +int main(void) +{ + int __retres; + uint ux; + uint uy; + uint uz; + ux = 0x7FFFFFFFU * (unsigned int)2; + uy = 0x80000000U + 0x80000000U; + uy = 2U * 0x80000000U; + uz = ux + (uint)2; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/array_index.1.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/array_index.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/array_index.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/array_index.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,65 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/array_index.c (with preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +struct __anonstruct_s_1 { + int u[12] ; +}; +struct _s { + int t[15] ; + struct __anonstruct_s_1 s ; + struct _s v[12] ; +}; +typedef struct _s ts; +int t[10]; +int u[8 + 3]; +int v[16][17]; +ts s; +unsigned int c[10]; +void main(int i, int j, unsigned int k) +{ + t[0] = 0; + u[1] = 0; + v[2][3] = 0; + /*@ assert rte: mem_access: \valid(&s.t[1]); */ + s.t[1] = 0; + /*@ assert rte: mem_access: \valid(&s.s.u[2]); */ + s.s.u[2] = 0; + /*@ assert rte: mem_access: \valid(&s.v[3].t[4]); */ + s.v[3].t[4] = 0; + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < 10; */ + t[i] = 0; + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < (int)(8+3); */ + u[i] = 0; + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < 16; */ + /*@ assert rte: index_bound: 0 ≤ j; */ + /*@ assert rte: index_bound: j < 17; */ + v[i][j] = 0; + /*@ assert rte: mem_access: \valid(&s.t[i]); */ + s.t[i] = 0; + /*@ assert rte: mem_access: \valid(&s.s.u[i]); */ + s.s.u[i] = 0; + /*@ assert rte: mem_access: \valid(&s.v[i].t[j]); */ + s.v[i].t[j] = 0; + /*@ assert rte: index_bound: k < 10; */ + t[k] = 0; + /*@ assert rte: index_bound: k < (int)(8+3); */ + u[k] = 0; + /*@ assert rte: index_bound: k < 16; */ + /*@ assert rte: index_bound: c[k] < 17; */ + /*@ assert rte: index_bound: k < 10; */ + v[k][c[k]] = 0; + /*@ assert rte: mem_access: \valid(&s.t[k]); */ + s.t[k] = 0; + /*@ assert rte: mem_access: \valid(&s.s.u[k]); */ + s.s.u[k] = 0; + /*@ assert rte: mem_access: \valid(&s.v[k].t[c[k]]); */ + /*@ assert rte: index_bound: k < 10; */ + s.v[k].t[c[k]] = 0; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/array_index.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/array_index.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/array_index.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/array_index.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,160 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/array_index.c (with preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +struct __anonstruct_s_1 { + int u[12] ; +}; +struct _s { + int t[15] ; + struct __anonstruct_s_1 s ; + struct _s v[12] ; +}; +typedef struct _s ts; +int t[10]; +int u[8 + 3]; +int v[16][17]; +ts s; +unsigned int c[10]; +void main(int i, int j, unsigned int k) +{ + t[0] = 0; + u[1] = 0; + v[2][3] = 0; + s.t[1] = 0; + s.s.u[2] = 0; + s.v[3].t[4] = 0; + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < 10; */ + t[i] = 0; + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < (int)(8+3); */ + u[i] = 0; + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < 16; */ + /*@ assert rte: index_bound: 0 ≤ j; */ + /*@ assert rte: index_bound: j < 17; */ + v[i][j] = 0; + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < 15; */ + s.t[i] = 0; + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < 12; */ + s.s.u[i] = 0; + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < 12; */ + /*@ assert rte: index_bound: 0 ≤ j; */ + /*@ assert rte: index_bound: j < 15; */ + s.v[i].t[j] = 0; + /*@ assert rte: index_bound: k < 10; */ + t[k] = 0; + /*@ assert rte: index_bound: k < (int)(8+3); */ + u[k] = 0; + /*@ assert rte: index_bound: k < 16; */ + /*@ assert rte: index_bound: c[k] < 17; */ + /*@ assert rte: index_bound: k < 10; */ + v[k][c[k]] = 0; + /*@ assert rte: index_bound: k < 15; */ + s.t[k] = 0; + /*@ assert rte: index_bound: k < 12; */ + s.s.u[k] = 0; + /*@ assert rte: index_bound: k < 12; */ + /*@ assert rte: index_bound: c[k] < 15; */ + /*@ assert rte: index_bound: k < 10; */ + s.v[k].t[c[k]] = 0; + return; +} + + +[rte] annotating function main +/* Generated by Frama-C */ +struct __anonstruct_s_1 { + int u[12] ; +}; +struct _s { + int t[15] ; + struct __anonstruct_s_1 s ; + struct _s v[12] ; +}; +typedef struct _s ts; +int t[10]; +int u[8 + 3]; +int v[16][17]; +ts s; +unsigned int c[10]; +void main(int i, int j, unsigned int k) +{ + /*@ assert rte: index_bound: 0 ≤ 0; */ + /*@ assert rte: index_bound: 0 < 10; */ + t[0] = 0; + /*@ assert rte: index_bound: 0 ≤ 1; */ + /*@ assert rte: index_bound: 1 < (int)(8+3); */ + u[1] = 0; + /*@ assert rte: index_bound: 0 ≤ 2; */ + /*@ assert rte: index_bound: 2 < 16; */ + /*@ assert rte: index_bound: 0 ≤ 3; */ + /*@ assert rte: index_bound: 3 < 17; */ + v[2][3] = 0; + /*@ assert rte: index_bound: 0 ≤ 1; */ + /*@ assert rte: index_bound: 1 < 15; */ + s.t[1] = 0; + /*@ assert rte: index_bound: 0 ≤ 2; */ + /*@ assert rte: index_bound: 2 < 12; */ + s.s.u[2] = 0; + /*@ assert rte: index_bound: 0 ≤ 3; */ + /*@ assert rte: index_bound: 3 < 12; */ + /*@ assert rte: index_bound: 0 ≤ 4; */ + /*@ assert rte: index_bound: 4 < 15; */ + s.v[3].t[4] = 0; + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < 10; */ + t[i] = 0; + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < (int)(8+3); */ + u[i] = 0; + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < 16; */ + /*@ assert rte: index_bound: 0 ≤ j; */ + /*@ assert rte: index_bound: j < 17; */ + v[i][j] = 0; + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < 15; */ + s.t[i] = 0; + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < 12; */ + s.s.u[i] = 0; + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < 12; */ + /*@ assert rte: index_bound: 0 ≤ j; */ + /*@ assert rte: index_bound: j < 15; */ + s.v[i].t[j] = 0; + /*@ assert rte: index_bound: k < 10; */ + /*@ assert rte: index_bound: 0 ≤ k; */ + t[k] = 0; + /*@ assert rte: index_bound: k < (int)(8+3); */ + /*@ assert rte: index_bound: 0 ≤ k; */ + u[k] = 0; + /*@ assert rte: index_bound: k < 16; */ + /*@ assert rte: index_bound: c[k] < 17; */ + /*@ assert rte: index_bound: k < 10; */ + /*@ assert rte: index_bound: 0 ≤ k; */ + /*@ assert rte: index_bound: 0 ≤ c[k]; */ + /*@ assert rte: index_bound: 0 ≤ k; */ + v[k][c[k]] = 0; + /*@ assert rte: index_bound: k < 15; */ + /*@ assert rte: index_bound: 0 ≤ k; */ + s.t[k] = 0; + /*@ assert rte: index_bound: k < 12; */ + /*@ assert rte: index_bound: 0 ≤ k; */ + s.s.u[k] = 0; + /*@ assert rte: index_bound: k < 12; */ + /*@ assert rte: index_bound: c[k] < 15; */ + /*@ assert rte: index_bound: k < 10; */ + /*@ assert rte: index_bound: 0 ≤ k; */ + /*@ assert rte: index_bound: 0 ≤ c[k]; */ + /*@ assert rte: index_bound: 0 ≤ k; */ + s.v[k].t[c[k]] = 0; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/assign2.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/assign2.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/assign2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/assign2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/assign2.c (with preprocessing) +tests/rte/assign2.c:22:[kernel] warning: Return statement with a value in function returning void +[rte] annotating function f +tests/rte/assign2.c:16:[kernel] warning: No code nor implicit assigns clause for function any, generating default assigns from the prototype +[rte] annotating function main +/* Generated by Frama-C */ +int i; +int t[10]; +/*@ ensures 0 ≤ \result ≤ 0; + assigns \result; + assigns \result \from \nothing; + */ +extern int any(); + +/*@ ensures t[i] ≡ \old(t[\at(i,Here)])+1; + ensures \let j = i; t[j] ≡ \old(t[j])+1; + assigns i, t[\at(i,Post)]; + */ +void f(void) +{ + /*@ behavior pre_any: + ensures 0 ≤ i ≤ 0; + assigns i; + assigns i \from \nothing; + */ + i = any(); + (t[i]) ++; + return; +} + +void main(void) +{ + /*@ behavior pre_f: + ensures t[i] ≡ \old(t[\at(i,Here)])+1; + ensures \let j = i; t[j] ≡ \old(t[j])+1; + assigns i, t[\at(i,Post)]; + */ + f(); + /*@ behavior pre_f_2: + ensures t[i] ≡ \old(t[\at(i,Here)])+1; + ensures \let j = i; t[j] ≡ \old(t[j])+1; + assigns i, t[\at(i,Post)]; + */ + f(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/assign3.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/assign3.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/assign3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/assign3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,21 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/assign3.c (with preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +/*@ assigns \nothing; */ +extern int f(); + +int main(void) +{ + int __retres; + int i; + int t[10]; + i = 0; + /*@ behavior pre_f: + assigns t[i]; */ + t[i] = f(); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/assign4.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/assign4.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/assign4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/assign4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,34 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/assign4.c (with preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +/*@ assigns \result; + assigns \result \from min, max; */ +extern int choose1(int min, int max); + +/*@ assigns \result, \result; + assigns \result \from min, max, min, max; + assigns \result \from min, max, min, max; + */ +extern int choose2(int min, int max); + +int main(void) +{ + int __retres; + int c1; + int c2; + /*@ behavior pre_choose1: + assigns c1; + assigns c1 \from \nothing; */ + c1 = choose1(5,10); + /*@ behavior pre_choose2: + assigns c2, c2; + assigns c2 \from c1, c1; + assigns c2 \from c1, c1; + */ + c2 = choose2(0,c1); + __retres = c1 + c2; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/assign5.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/assign5.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/assign5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/assign5.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/assign5.c (with preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +/*@ assigns *p, *p; + assigns *p \from x; + assigns *p \from \nothing; */ +extern int f(int *p, int x); + +/*@ assigns *p, *p; + assigns *p \from \nothing; + assigns *p \from x; */ +extern int g(int *p, int x); + +int main(void) +{ + int __retres; + int i; + int a; + int t[10]; + i = 0; + a = 0; + /*@ behavior pre_f: + assigns t[0], i, i; + assigns i \from a; + assigns i \from \nothing; + */ + t[0] = f(& i,a); + /*@ behavior pre_g: + assigns t[1], i, i; + assigns i \from \nothing; + assigns i \from a; + */ + t[1] = g(& i,a); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/assign6.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/assign6.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/assign6.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/assign6.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,35 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/assign6.c (with preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +int z; +/*@ assigns z, \result; + assigns z \from y; + assigns \result \from x, y; */ +extern int f(int x, int y); + +int main(void) +{ + int a; + int b; + /*@ behavior pre_f: + assigns z, a; + assigns z \from \nothing; + assigns a \from \nothing; + */ + a = f(0,0); + /*@ behavior pre_f_2: + assigns z, a; + assigns z \from b; + assigns a \from b; */ + a = f(0,b); + /*@ behavior pre_f_3: + assigns z, a; + assigns z \from \nothing; + assigns a \from b; + */ + a = f(b,0); + return a; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/assign7.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/assign7.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/assign7.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/assign7.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,61 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/assign7.c (with preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +/*@ assigns *p; + assigns *p \from \union(*((char *)p), *q); */ +extern void f(int *p, int *q); + +/*@ assigns *p; + assigns *p \from \union(*p, \union(*r, *q)); */ +extern void ff(int *p, int *q, int *r); + +/*@ assigns *p; + assigns *p \from \inter(*((char *)p), *q); */ +extern void h(int *p, int *q); + +/*@ assigns \union(*p, *q); */ +extern void g(int *p, int *q); + +/*@ assigns \at(*\old(p),Post), \at(*p,Pre), *p; */ +extern void gg(int *p); + +int X; +int Y; +/*@ assigns \union(X, Y); */ +extern void hh(); + +int main(void) +{ + int __retres; + int x; + int y; + int z; + /*@ behavior pre_f: + assigns x; + assigns x \from \union(*((char *)(&x)), y); + */ + f(& x,& y); + /*@ behavior pre_ff: + assigns x; + assigns x \from \union(x, \union(z, y)); */ + ff(& x,& y,& z); + /*@ behavior pre_g: + assigns \union(x, y); */ + g(& x,& y); + /*@ behavior pre_h: + assigns x; + assigns x \from \inter(*((char *)(&x)), y); + */ + h(& x,& y); + /*@ behavior pre_gg: + assigns \at(x,Post), \old(x), x; */ + gg(& x); + /*@ behavior pre_hh: + assigns \union(X, Y); */ + hh(); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/assign.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/assign.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/assign.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/assign.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,138 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/assign.c (with preprocessing) +[rte] annotating function rte +tests/rte/assign.c:37:[kernel] warning: Neither code nor specification for function fnd4, generating default assigns from the prototype +/* Generated by Frama-C */ +int global_x; +int global_y; +/*@ assigns \nothing; */ +extern void g(); + +/*@ assigns \nothing; */ +extern int fnd1(); + +/*@ assigns global_x; */ +extern int fnd2(); + +/*@ assigns global_x, global_y; */ +extern int fnd3(); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int fnd4(); + +/*@ assigns global_x; + + behavior normal: + assumes cond ≢ 0; + assigns \nothing; + + behavior other: + assumes cond ≡ 0; + assigns global_x; + */ +extern int fnd5(int cond); + +/*@ assigns \nothing; */ +extern int fnd6(); + +/*@ assigns *x; + assigns *x \from *y; */ +extern int fnd7(int *x, int *y); + +int rte(int cond) +{ + int __retres; + int a; + int b; + int tmp; + /*@ behavior pre_g: + assigns \nothing; */ + g(); + /*@ behavior pre_fnd1: + assigns tmp; */ + tmp = fnd1(); + if (tmp) { + int tmp_0; + /*@ behavior pre_fnd2: + assigns tmp_0, global_x; */ + tmp_0 = fnd2(); + if (tmp_0) { + int tmp_1; + /*@ behavior pre_fnd3: + assigns tmp_1, global_x, global_y; */ + tmp_1 = fnd3(); + if (tmp_1) { + int tmp_2; + /*@ behavior pre_fnd4: + assigns tmp_2; + assigns tmp_2 \from \nothing; + */ + tmp_2 = fnd4(); + if (tmp_2) { + int tmp_3; + /*@ behavior pre_fnd5: + assigns tmp_3, global_x; + + behavior pre_fnd5_normal: + assumes cond ≢ 0; + assigns tmp_3; + + behavior pre_fnd5_other: + assumes cond ≡ 0; + assigns tmp_3, global_x; + */ + tmp_3 = fnd5(cond); + if (tmp_3) { + int tmp_4; + /*@ behavior pre_fnd6: + assigns tmp_4; */ + tmp_4 = fnd6(); + if (tmp_4) { + int tmp_5; + /*@ behavior pre_fnd7: + assigns tmp_5, a; + assigns a \from b; */ + tmp_5 = fnd7(& a,& b); + if (tmp_5) { + __retres = 1; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + } + else { + __retres = 0; + goto return_label; + } + } + else { + __retres = 0; + goto return_label; + } + } + else { + __retres = 0; + goto return_label; + } + } + else { + __retres = 0; + goto return_label; + } + } + else { + __retres = 0; + goto return_label; + } + } + else { + __retres = 0; + goto return_label; + } + return_label: return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/bts0567.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/bts0567.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/bts0567.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/bts0567.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/bts0567.c (with preprocessing) +[rte] annotating function g +tests/rte/bts0567.c:11:[kernel] warning: No code nor implicit assigns clause for function f, generating default assigns from the prototype +/* Generated by Frama-C */ +int tab[2]; +/*@ requires \valid(p+1); + assigns *p; + assigns *p \from *p; */ +extern void f(int *p); + +void g(void) +{ + /*@ behavior pre_f: + requires \valid((int *)tab+1); + assigns tab[0]; + assigns tab[0] \from tab[0]; + */ + f(tab); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/bts0576.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/bts0576.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/bts0576.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/bts0576.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,37 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/bts0576.c (with preprocessing) +tests/rte/bts0576.c:6:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/rte/bts0576.c:6:[kernel] 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 +/* Generated by Frama-C */ +typedef double typetab[2]; +/*@ requires + \valid(t) ∧ \valid(t+(0 .. 0)) ∧ \valid((double *)t+(0 .. 1)); + */ +double g4(typetab *t) +{ + double y; + /*@ assert rte: mem_access: \valid_read((double *)*t); */ + /*@ assert rte: mem_access: \valid_read(&(*t)[1]); */ + y = (*t)[0] + (*t)[1]; + return y; +} + +/*@ assigns \nothing; */ +double f4(void) +{ + double tab[2]; + double r; + tab[0] = 1.0; + tab[1] = 2.0; + /*@ behavior pre_g4: + requires + \valid(&tab) ∧ \valid(&tab+(0 .. 0)) ∧ + \valid((double *)(&tab)+(0 .. 1)); + */ + r = g4(& tab); + return r; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/bts0580_2.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/bts0580_2.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/bts0580_2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/bts0580_2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,45 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/bts0580_2.c (with preprocessing) +[rte] annotating function main +tests/rte/bts0580_2.c:32:[rte] warning: no predicate available yet to check validity of function pointer dereferencing *(buff.data[c[2]].f) +tests/rte/bts0580_2.c:33:[rte] warning: no predicate available yet to check validity of function pointer dereferencing *f +/* Generated by Frama-C */ +struct S { + int val ; + struct S *next ; +}; +struct C { + struct S cell[5] ; + int (*f)(int ) ; +}; +struct ArrayStruct { + struct C data[10] ; +}; +struct ArrayStruct buff; +int main(int i) +{ + int __retres; + int a; + int b; + int d; + int c[3]; + int *p; + int (*f)(int ); + /*@ assert rte: mem_access: \valid_read(p); */ + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < 10; */ + /*@ assert rte: index_bound: 0 ≤ *p; */ + /*@ assert rte: index_bound: *p < 5; */ + /*@ assert + rte: mem_access: \valid_read(&(buff.data[i].cell[*p].next)->val); + */ + a = (buff.data[i].cell[*p].next)->val; + /*@ assert rte: index_bound: 0 ≤ c[2]; */ + /*@ assert rte: index_bound: c[2] < 10; */ + b = (*(buff.data[c[2]].f))(c[1]); + d = (*f)(buff.data[0].cell[0].val); + __retres = a > b; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/bts0580.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/bts0580.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/bts0580.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/bts0580.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,18 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/bts0580.i (no preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +struct ArrayStruct { + int data[10] ; +}; +struct ArrayStruct buff; +int main(int i) +{ + int __retres; + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < 10; */ + __retres = buff.data[i]; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/bts1052.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/bts1052.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/bts1052.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/bts1052.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/bts1052.c (with preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +/*@ ensures \let count = \old(d); \result ≡ count; + assigns \nothing; */ +extern int op(int d); + +int x; +int y; +void main(void) +{ + /*@ behavior pre_op: + ensures \let count = \old(33); x ≡ count; + assigns x; + */ + x = op(33); + /*@ behavior pre_op_2: + ensures \let count = \old(31); y ≡ count; + assigns y; + */ + y = op(31); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/bts621.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/bts621.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/bts621.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/bts621.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/bts621.c (with preprocessing) +/* Generated by Frama-C */ +/*@ assigns *p; */ +extern float g(float *p); + +void f(float a) +{ + /*@ ghost float x; */ + /*@ ghost x = g(& a); */ + return; +} + + +[rte] annotating function f +/* Generated by Frama-C */ +/*@ assigns *p; */ +extern float g(float *p); + +void f(float a) +{ + /*@ ghost float x; */ + /*@ behavior pre_g: + assigns x, a; */ + /*@ ghost x = g(& a); */ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/castoncall.1.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/castoncall.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/castoncall.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/castoncall.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,48 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/castoncall.c (with preprocessing) +[rte] annotating function g +[rte] annotating function nondet_ptr +/* Generated by Frama-C */ +/*@ ensures \result ≡ \old(a) ∨ \result ≡ \old(b); + assigns \result; + assigns \result \from a, b; + */ +extern int nondet(int a, int b); + +/*@ ensures \result ≡ \old(a) ∨ \result ≡ \old(b); + assigns \result; + assigns \result \from a, b; + */ +void *nondet_ptr(void *a, void *b) +{ + void *__retres; + int tmp; + /*@ behavior pre_nondet: + ensures tmp ≡ \old((int)a) ∨ tmp ≡ \old((int)b); + assigns tmp; + assigns tmp \from b, a; + */ + tmp = nondet((int)a,(int)b); + __retres = (void *)tmp; + return __retres; +} + +/*@ ensures \result ≡ 1; + assigns \nothing; */ +extern int f(); + +void g(void) +{ + char c; + int tmp; + /*@ behavior pre_f: + ensures tmp ≡ 1; + assigns tmp; */ + tmp = f(); + /*@ assert rte: signed_downcast: tmp ≤ 127; */ + /*@ assert rte: signed_downcast: -128 ≤ tmp; */ + c = (char)tmp; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/castoncall.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/castoncall.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/castoncall.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/castoncall.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,48 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/castoncall.c (with preprocessing) +[rte] annotating function g +[rte] annotating function nondet_ptr +/* Generated by Frama-C */ +/*@ ensures \result ≡ \old(a) ∨ \result ≡ \old(b); + assigns \result; + assigns \result \from a, b; + */ +extern int nondet(int a, int b); + +/*@ ensures \result ≡ \old(a) ∨ \result ≡ \old(b); + assigns \result; + assigns \result \from a, b; + */ +void *nondet_ptr(void *a, void *b) +{ + void *__retres; + int tmp; + /*@ behavior pre_nondet: + ensures tmp ≡ \old((int)a) ∨ tmp ≡ \old((int)b); + assigns tmp; + assigns tmp \from b, a; + */ + tmp = nondet((int)a,(int)b); + __retres = (void *)tmp; + return __retres; +} + +/*@ ensures \result ≡ 1; + assigns \nothing; */ +extern int f(); + +void g(void) +{ + char c; + int tmp; + /*@ behavior pre_f: + ensures tmp ≡ 1; + assigns tmp; */ + tmp = f(); + /*@ assert rte: signed_downcast: tmp ≤ 127; */ + /*@ assert rte: signed_downcast: -128 ≤ tmp; */ + c = (char)tmp; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/divmod.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/divmod.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/divmod.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/divmod.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,82 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/divmod.c (with preprocessing) +[rte] annotating function main +tests/rte/divmod.c:13:[rte] warning: signed overflow assert broken: (int)((int)(-2147483647)-1)/(int)(-1) ≤ + 2147483647 +tests/rte/divmod.c:16:[rte] warning: divisor assert broken: 0 ≢ 0 +tests/rte/divmod.c:17:[rte] warning: divisor assert broken: (unsigned int)(0xffffffff+(unsigned int)1) ≢ 0 +tests/rte/divmod.c:24:[rte] warning: divisor assert broken: (unsigned int)(0xffffffff+(unsigned int)1) ≢ 0 +tests/rte/divmod.c:25:[rte] warning: signed overflow assert broken: (int)((int)(-0x7fffffff)-1)/(int)(-1) ≤ + 2147483647 +tests/rte/divmod.c:36:[rte] warning: signed downcast assert broken: (long long)(-2147483648L)/(long long)((long) + (-1L)) + ≤ 2147483647 +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int x; + int y; + int z; + unsigned int ux; + unsigned int uy; + unsigned int uz; + x = 0; + y = 0; + z = 0; + ux = (unsigned int)0; + uy = (unsigned int)0; + uz = (unsigned int)0; + /*@ assert + rte: signed_overflow: + (int)((int)(-2147483647)-1)/(int)(-1) ≤ 2147483647; + */ + z = (-2147483647 - 1) / -1; + z = (-2147483647 - 1) % -1; + /*@ assert rte: division_by_zero: 0 ≢ 0; */ + uz = (unsigned int)(1 / 0); + /*@ assert + rte: division_by_zero: (unsigned int)(0xffffffff+(unsigned int)1) ≢ 0; + */ + uz = (unsigned int)1 / (0xffffffff + (unsigned int)1); + ux = 0x80000000; + uy = 0xffffffff; + /*@ assert rte: division_by_zero: (int)uy ≢ 0; */ + /*@ assert rte: signed_overflow: (int)ux/(int)uy ≤ 2147483647; */ + /*@ assert rte: signed_downcast: ux ≤ 2147483647; */ + /*@ assert rte: signed_downcast: uy ≤ 2147483647; */ + uz = (unsigned int)((int)ux / (int)uy); + /*@ assert rte: division_by_zero: uy ≢ 0; */ + uz = ux / uy; + /*@ assert + rte: division_by_zero: (unsigned int)(0xffffffff+(unsigned int)1) ≢ 0; + */ + uz = 0x80000000 / (0xffffffff + (unsigned int)1); + /*@ assert + rte: signed_overflow: + (int)((int)(-0x7fffffff)-1)/(int)(-1) ≤ 2147483647; + */ + uz = (unsigned int)((-0x7fffffff - 1) / -1); + uz = (unsigned int)(-0x7fffffff - 1) / 0xffffffff; + uz = 0x80000000 / (unsigned int)(-1); + uz = (unsigned int)((int)(0x80000000 / 0xffffffff)); + /*@ assert rte: division_by_zero: (int)(x+y) ≢ 0; */ + /*@ assert rte: signed_overflow: -2147483648 ≤ x+y; */ + /*@ assert rte: signed_overflow: x+y ≤ 2147483647; */ + z = 1 / (x + y); + /*@ assert rte: signed_overflow: x/(int)(-1) ≤ 2147483647; */ + z = x / -1; + /*@ assert rte: division_by_zero: y ≢ 0; */ + z = (-0x7ffffff - 1) / y; + /*@ assert + rte: signed_downcast: + (long long)(-2147483648L)/(long long)((long)(-1L)) ≤ 2147483647; + */ + z = (int)(-2147483648L / (long long)(-1L)); + z = (int)(0x80000000 / (unsigned int)(-1)); + z = (int)(0x80000000 / 0xffffffff); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/divmod_typedef.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/divmod_typedef.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/divmod_typedef.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/divmod_typedef.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,84 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/divmod_typedef.c (with preprocessing) +[rte] annotating function main +tests/rte/divmod_typedef.c:15:[rte] warning: signed overflow assert broken: (int)((int)(-2147483647)-1)/(int)(-1) ≤ + 2147483647 +tests/rte/divmod_typedef.c:18:[rte] warning: divisor assert broken: 0 ≢ 0 +tests/rte/divmod_typedef.c:19:[rte] warning: divisor assert broken: (unsigned int)(0xffffffff+(unsigned int)1) ≢ 0 +tests/rte/divmod_typedef.c:26:[rte] warning: divisor assert broken: (unsigned int)(0xffffffff+(unsigned int)1) ≢ 0 +tests/rte/divmod_typedef.c:27:[rte] warning: signed overflow assert broken: (int)((int)(-0x7fffffff)-1)/(int)(-1) ≤ + 2147483647 +tests/rte/divmod_typedef.c:38:[rte] warning: signed downcast assert broken: (long long)(-2147483648L)/(long long)((long) + (-1L)) + ≤ 2147483647 +/* Generated by Frama-C */ +typedef int tint; +typedef unsigned int tuint; +int main(void) +{ + int __retres; + tint x; + tint y; + tint z; + tuint ux; + tuint uy; + tuint uz; + x = 0; + y = 0; + z = 0; + ux = (unsigned int)0; + uy = (unsigned int)0; + uz = (unsigned int)0; + /*@ assert + rte: signed_overflow: + (int)((int)(-2147483647)-1)/(int)(-1) ≤ 2147483647; + */ + z = (-2147483647 - 1) / -1; + z = (-2147483647 - 1) % -1; + /*@ assert rte: division_by_zero: 0 ≢ 0; */ + uz = (unsigned int)(1 / 0); + /*@ assert + rte: division_by_zero: (unsigned int)(0xffffffff+(unsigned int)1) ≢ 0; + */ + uz = (unsigned int)1 / (0xffffffff + (unsigned int)1); + ux = 0x80000000; + uy = 0xffffffff; + /*@ assert rte: division_by_zero: (int)uy ≢ 0; */ + /*@ assert rte: signed_overflow: (int)ux/(int)uy ≤ 2147483647; */ + /*@ assert rte: signed_downcast: ux ≤ 2147483647; */ + /*@ assert rte: signed_downcast: uy ≤ 2147483647; */ + uz = (unsigned int)((int)ux / (int)uy); + /*@ assert rte: division_by_zero: uy ≢ 0; */ + uz = ux / uy; + /*@ assert + rte: division_by_zero: (unsigned int)(0xffffffff+(unsigned int)1) ≢ 0; + */ + uz = 0x80000000 / (0xffffffff + (unsigned int)1); + /*@ assert + rte: signed_overflow: + (int)((int)(-0x7fffffff)-1)/(int)(-1) ≤ 2147483647; + */ + uz = (unsigned int)((-0x7fffffff - 1) / -1); + uz = (unsigned int)(-0x7fffffff - 1) / 0xffffffff; + uz = 0x80000000 / (unsigned int)(-1); + uz = (unsigned int)((int)(0x80000000 / 0xffffffff)); + /*@ assert rte: division_by_zero: (int)(x+y) ≢ 0; */ + /*@ assert rte: signed_overflow: -2147483648 ≤ x+y; */ + /*@ assert rte: signed_overflow: x+y ≤ 2147483647; */ + z = 1 / (x + y); + /*@ assert rte: signed_overflow: x/(int)(-1) ≤ 2147483647; */ + z = x / -1; + /*@ assert rte: division_by_zero: y ≢ 0; */ + z = (-0x7ffffff - 1) / y; + /*@ assert + rte: signed_downcast: + (long long)(-2147483648L)/(long long)((long)(-1L)) ≤ 2147483647; + */ + z = (int)(-2147483648L / (long long)(-1L)); + z = (int)(0x80000000 / (unsigned int)(-1)); + z = (int)(0x80000000 / 0xffffffff); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/downcast.1.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/downcast.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/downcast.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/downcast.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,31 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/downcast.c (with preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + signed char sx; + signed char sy; + signed char sz; + unsigned char uc; + int x; + unsigned int ux; + unsigned int uy; + unsigned int uz; + unsigned short s; + /*@ assert rte: signed_overflow: -2147483648 ≤ (int)sx+(int)sy; */ + /*@ assert rte: signed_overflow: (int)sx+(int)sy ≤ 2147483647; */ + sz = (signed char)((int)sx + (int)sy); + /*@ assert rte: signed_overflow: -2147483648 ≤ (int)sx+(int)sy; */ + /*@ assert rte: signed_overflow: (int)sx+(int)sy ≤ 2147483647; */ + uc = (unsigned char)((int)sx + (int)sy); + uc = (unsigned char)x; + x = (int)(uy + uz); + ux = uy + uz; + s = (unsigned short)(uy + uz); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/downcast.2.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/downcast.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/downcast.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/downcast.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,35 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/downcast.c (with preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + signed char sx; + signed char sy; + signed char sz; + unsigned char uc; + int x; + unsigned int ux; + unsigned int uy; + unsigned int uz; + unsigned short s; + /*@ assert rte: signed_downcast: (int)sx+(int)sy ≤ 127; */ + /*@ assert rte: signed_downcast: -128 ≤ (int)sx+(int)sy; */ + sz = (signed char)((int)sx + (int)sy); + /*@ assert rte: unsigned_downcast: (int)sx+(int)sy ≤ 255; */ + /*@ assert rte: unsigned_downcast: 0 ≤ (int)sx+(int)sy; */ + uc = (unsigned char)((int)sx + (int)sy); + /*@ assert rte: unsigned_downcast: x ≤ 255; */ + /*@ assert rte: unsigned_downcast: 0 ≤ x; */ + uc = (unsigned char)x; + /*@ assert rte: signed_downcast: uy+uz ≤ 2147483647; */ + x = (int)(uy + uz); + ux = uy + uz; + /*@ assert rte: unsigned_downcast: uy+uz ≤ 65535; */ + s = (unsigned short)(uy + uz); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/downcast.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/downcast.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/downcast.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/downcast.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/downcast.c (with preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + signed char sx; + signed char sy; + signed char sz; + unsigned char uc; + int x; + unsigned int ux; + unsigned int uy; + unsigned int uz; + unsigned short s; + /*@ assert rte: signed_downcast: (int)sx+(int)sy ≤ 127; */ + /*@ assert rte: signed_downcast: -128 ≤ (int)sx+(int)sy; */ + sz = (signed char)((int)sx + (int)sy); + /*@ assert rte: signed_overflow: -2147483648 ≤ (int)sx+(int)sy; */ + /*@ assert rte: signed_overflow: (int)sx+(int)sy ≤ 2147483647; */ + uc = (unsigned char)((int)sx + (int)sy); + uc = (unsigned char)x; + /*@ assert rte: signed_downcast: uy+uz ≤ 2147483647; */ + x = (int)(uy + uz); + ux = uy + uz; + s = (unsigned short)(uy + uz); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/float_to_int.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/float_to_int.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/float_to_int.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/float_to_int.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,40 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/float_to_int.c (with preprocessing) +tests/rte/float_to_int.c:13:[kernel] warning: Floating-point constant 1.5e255 is not represented exactly. Will use 0x1.99309cc247f15p847. See documentation for option -warn-decimal-float +[rte] annotating function main +tests/rte/float_to_int.c:14:[rte] warning: float to int assert broken: 258. < 128 +tests/rte/float_to_int.c:16:[rte] warning: float to int assert broken: -2147483649 < -2147483649.5 +/* Generated by Frama-C */ +void main(void) +{ + float f; + int i; + long long l; + unsigned short s; + int ci1; + int ci2; + char ci3; + int ci4; + int ci5; + f = (float)0.; + /*@ assert rte: float_to_int: f < 2147483648; */ + /*@ assert rte: float_to_int: -2147483649 < f; */ + i = (int)f; + /*@ assert rte: float_to_int: f < 9223372036854775808; */ + /*@ assert rte: float_to_int: -9223372036854775809 < f; */ + l = (long long)f; + /*@ assert rte: float_to_int: f < 65536; */ + /*@ assert rte: float_to_int: -1 < f; */ + s = (unsigned short)f; + ci1 = (int)1.5; + /*@ assert rte: float_to_int: 1.5e255 < 2147483648; */ + ci2 = (int)1.5e255; + /*@ assert rte: float_to_int: 258. < 128; */ + ci3 = (char)258.; + ci4 = (int)2147483647.5; + /*@ assert rte: float_to_int: -2147483649 < -2147483649.5; */ + ci5 = (int)(- 2147483649.5); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/fptr_assert.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/fptr_assert.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/fptr_assert.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/fptr_assert.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,57 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/fptr_assert.c (with preprocessing) +[rte] annotating function f +[rte] annotating function g +[rte] annotating function h +[rte] annotating function main +tests/rte/fptr_assert.c:21:[rte] warning: ((*fp1)();) function called through a pointer: not treated +tests/rte/fptr_assert.c:21:[rte] warning: no predicate available yet to check validity of function pointer dereferencing *fp1 +tests/rte/fptr_assert.c:22:[rte] warning: ((*fp2)(3);) function called through a pointer: not treated +tests/rte/fptr_assert.c:22:[rte] warning: no predicate available yet to check validity of function pointer dereferencing *fp2 +tests/rte/fptr_assert.c:23:[rte] warning: ((*(ma[1]))(5);) function called through a pointer: not treated +tests/rte/fptr_assert.c:23:[rte] warning: no predicate available yet to check validity of function pointer dereferencing *(ma[1]) +tests/rte/fptr_assert.c:24:[rte] warning: ((*(ma[i]))(5);) function called through a pointer: not treated +tests/rte/fptr_assert.c:24:[rte] warning: no predicate available yet to check validity of function pointer dereferencing *(ma[i]) +/* Generated by Frama-C */ +typedef int (*fptr)(int ); +void g(void) +{ + return; +} + +int f(int x) +{ + return x; +} + +int h(int x) +{ + return x; +} + +int main(int i) +{ + int __retres; + void (*fp1)(); + int (*fp2)(int ); + fptr ma[2]; + { + /*sequence*/ + ; + ; + } + ma[0] = & f; + ma[1] = & h; + fp1 = (void (*)())(& g); + fp2 = & f; + (*fp1)(); + (*fp2)(3); + (*(ma[1]))(5); + /*@ assert rte: index_bound: 0 ≤ i; */ + /*@ assert rte: index_bound: i < 2; */ + (*(ma[i]))(5); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/malloc.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/malloc.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/malloc.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/malloc.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,34 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/malloc.c (with preprocessing) +[rte] annotating function main +tests/rte/malloc.c:13:[kernel] warning: No code nor implicit assigns clause for function my_malloc, generating default assigns from the prototype +/* Generated by Frama-C */ +/*@ ensures \result ≡ \null ∨ \fresh{Old, Here}(\result,10); + assigns \result; + assigns \result \from n; + allocates \result; + */ +extern char *my_malloc(unsigned int n); + +int main(void) +{ + int __retres; + char *p; + /*@ requires \true; */ + /*@ allocates p; + + behavior pre_my_malloc: + ensures p ≡ \null ∨ \fresh{Old, Here}(p,10); + assigns p; + assigns p \from \nothing; + */ + p = my_malloc((unsigned int)10); + if (p) { + __retres = 1; + goto return_label; + } + __retres = 0; + return_label: return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/memaccess.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/memaccess.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/memaccess.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/memaccess.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/memaccess.c (with preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +int main(int x) +{ + int __retres; + int *p; + int *q; + int tab[10]; + /*@ assert rte: mem_access: \valid(p); */ + *p = 3; + q = p; + /*@ assert rte: mem_access: \valid(q); */ + /*@ assert rte: signed_overflow: *p+5 ≤ 2147483647; */ + /*@ assert rte: mem_access: \valid_read(p); */ + *q = *p + 5; + /*@ assert rte: mem_access: \valid_read(q); */ + tab[3] = *q; + /*@ assert rte: index_bound: 0 ≤ x; */ + /*@ assert rte: index_bound: x < 10; */ + /*@ assert rte: mem_access: \valid_read(q); */ + tab[x] = *q; + p = & tab[2]; + p = & tab[x]; + /*@ assert rte: mem_access: \valid(p+1); */ + *(p + 1) = tab[0]; + /*@ assert rte: mem_access: \valid(p+1); */ + /*@ assert rte: index_bound: 0 ≤ x; */ + /*@ assert rte: index_bound: x < 10; */ + *(p + 1) = tab[x]; + /*@ assert rte: mem_access: \valid(q); */ + /*@ assert rte: mem_access: \valid_read(p+2); */ + *q = *(p + 2); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/minus.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/minus.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/minus.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/minus.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,58 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/minus.c (with preprocessing) +[rte] annotating function main +tests/rte/minus.c:11:[rte] warning: unary minus assert broken: -2147483647 ≤ (int)(-0x7fffffff)-1 +tests/rte/minus.c:18:[rte] warning: signed overflow assert broken: -2147483648 ≤ (int)((int)(-2147483647)-1)-1 +tests/rte/minus.c:19:[rte] warning: signed overflow assert broken: -2147483648 ≤ + (int)(-((int)((int)(-0x7fffffff)-1)))-1 +tests/rte/minus.c:19:[rte] warning: unary minus assert broken: -2147483647 ≤ (int)(-0x7fffffff)-1 +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int x; + int y; + int z; + unsigned int ux; + unsigned int uy; + unsigned int uz; + short sz; + x = 0; + y = 0; + z = 0; + ux = (unsigned int)0; + uy = (unsigned int)0; + uz = (unsigned int)0; + sz = (short)0; + /*@ assert rte: signed_overflow: -2147483647 ≤ x; */ + z = - x; + /*@ assert rte: signed_overflow: -2147483647 ≤ (int)(-0x7fffffff)-1; */ + z = - (-0x7fffffff - 1); + /*@ assert rte: signed_downcast: -ux ≤ 2147483647; */ + z = (int)(- ux); + /*@ assert + rte: signed_downcast: + (int)((unsigned short)((int)(65535+3)))+x ≤ 32767; + */ + /*@ assert + rte: signed_downcast: + -32768 ≤ (int)((unsigned short)((int)(65535+3)))+x; + */ + sz = (short)((int)((unsigned short)(65535 + 3)) + x); + z = (int)(-0x80000000 - (unsigned int)1); + z = (int)(-2147483648 - (unsigned int)1); + /*@ assert + rte: signed_overflow: -2147483648 ≤ (int)((int)(-2147483647)-1)-1; + */ + z = (-2147483647 - 1) - 1; + /*@ assert + rte: signed_overflow: + -2147483648 ≤ (int)(-((int)((int)(-0x7fffffff)-1)))-1; + */ + /*@ assert rte: signed_overflow: -2147483647 ≤ (int)(-0x7fffffff)-1; */ + z = - (-0x7fffffff - 1) - 1; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/mul.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/mul.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/mul.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/mul.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,55 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/mul.c (with preprocessing) +[rte] annotating function main +tests/rte/mul.c:22:[rte] warning: signed overflow assert broken: 0xffff*0xffff ≤ 2147483647 +tests/rte/mul.c:25:[rte] warning: signed overflow assert broken: 0xffff*0x8001 ≤ 2147483647 +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int x; + int y; + int z; + unsigned int ux; + unsigned int uy; + unsigned int uz; + x = 0; + y = 0; + z = 0; + ux = (unsigned int)0; + uy = (unsigned int)0; + uz = (unsigned int)0; + uz = ux * uy; + /*@ assert rte: signed_overflow: -2147483648 ≤ x*y; */ + /*@ assert rte: signed_overflow: x*y ≤ 2147483647; */ + z = x * y; + /*@ assert rte: signed_overflow: -2147483648 ≤ 0x1000*y; */ + /*@ assert rte: signed_overflow: 0x1000*y ≤ 2147483647; */ + z = 0x1000 * y; + /*@ assert rte: signed_overflow: -2147483648 ≤ x*0x1000; */ + /*@ assert rte: signed_overflow: x*0x1000 ≤ 2147483647; */ + z = x * 0x1000; + /*@ assert rte: signed_overflow: -2147483648 ≤ (int)(-0x1000)*y; */ + /*@ assert rte: signed_overflow: (int)(-0x1000)*y ≤ 2147483647; */ + z = -0x1000 * y; + /*@ assert rte: signed_overflow: -2147483648 ≤ x*(int)(-0x1000); */ + /*@ assert rte: signed_overflow: x*(int)(-0x1000) ≤ 2147483647; */ + z = x * -0x1000; + /*@ assert rte: signed_overflow: -2147483648 ≤ (int)(-1)*y; */ + z = -1 * y; + z = x * 1; + z = 1 * y; + /*@ assert rte: signed_downcast: (unsigned int)x*0xffffffff ≤ 2147483647; + */ + z = (int)((unsigned int)x * 0xffffffff); + /*@ assert rte: signed_overflow: 0xffff*0xffff ≤ 2147483647; */ + z = 0xffff * 0xffff; + z = 0xffff * 0x7fff; + z = 0xffff * 0x8000; + /*@ assert rte: signed_overflow: 0xffff*0x8001 ≤ 2147483647; */ + z = 0xffff * 0x8001; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/noresult.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/noresult.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/noresult.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/noresult.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,37 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/noresult.c (with preprocessing) +[rte] annotating function job +/* Generated by Frama-C */ +int x; +/*@ ensures \result > 0; + assigns x; */ +extern int f(void); + +/*@ ensures \result > 0; + assigns \nothing; */ +extern int g(); + +/*@ requires p > 0; + ensures \result > 0; + assigns \nothing; */ +extern int h(int p); + +void job(void) +{ + /*@ behavior pre_f: + ensures \true; + assigns x; */ + f(); + /*@ behavior pre_g: + ensures \true; + assigns \nothing; */ + g(); + /*@ behavior pre_h: + requires 2 > 0; + ensures \true; + assigns \nothing; */ + h(2); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/postcond2.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/postcond2.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/postcond2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/postcond2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,46 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/postcond2.c (with preprocessing) +tests/rte/postcond2.c:7:[kernel] 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 +/* Generated by Frama-C */ +/*@ requires \valid(x); + requires \valid(x+(0 .. 10)); + assigns *x, \result; + assigns *x \from y; + assigns \result \from *x; + */ +extern int g(int *x, int y); + +/*@ requires \valid(tab+0); + assigns \nothing; */ +int f(int *tab) +{ + int __retres; + __retres = 0; + return __retres; +} + +int main(void) +{ + int tab[2]; + int a; + int tmp_0; + tab[0] = 3; + tab[1] = 4; + /*@ behavior pre_f: + requires \valid((int *)tab+0); + assigns a; */ + a = f(tab); + /*@ behavior pre_g: + requires \valid(&tab[(int)(3-tab[0])]+a); + requires \valid((&tab[(int)(3-tab[0])]+a)+(0 .. 10)); + assigns *(&tab[(int)(3-tab[0])]+a), tmp_0; + assigns *(&tab[(int)(3-tab[0])]+a) \from a; + assigns tmp_0 \from *(&tab[(int)(3-tab[0])]+a); + */ + tmp_0 = g(& tab[3 - tab[0]] + a,a); + return tmp_0; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/postcond.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/postcond.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/postcond.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/postcond.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,85 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/postcond.c (with preprocessing) +[rte] annotating function f +[rte] annotating function g +tests/rte/postcond.c:33:[kernel] warning: keeping only assigns from behaviors: pos, neg +[rte] annotating function main +tests/rte/postcond.c:40:[kernel] warning: keeping only assigns from behaviors: pos, neg +/* Generated by Frama-C */ +/*@ ensures \result ≡ -\old(x); + + behavior pos: + assumes first_bhv: x ≥ 0; + ensures \result ≤ 0; + assigns *y; + + behavior neg: + assumes second_bhv: x < 0; + ensures \result > 0; + assigns \nothing; + + complete behaviors pos, neg; + disjoint behaviors pos, neg; + */ +int f(int x, int *y) +{ + int __retres; + if (x >= 0) *y = x; + __retres = - x; + return __retres; +} + +/*@ ensures *\old(x) ≡ \old(y); + assigns *x; */ +void g(int y, int *x) +{ + /*@ assigns *x, y; + + behavior pre_f: + ensures *x ≡ -\old(y); + + behavior pre_f_pos: + assumes first_bhv: y ≥ 0; + ensures *x ≤ 0; + assigns *x, y; + + behavior pre_f_neg: + assumes second_bhv: y < 0; + ensures *x > 0; + assigns *x; + */ + *x = f(y,& y); + return; +} + +int main(void) +{ + int a; + int c; + int b; + a = 5; + /*@ assigns b, c; + + behavior pre_f: + ensures b ≡ -\old(a); + + behavior pre_f_pos: + assumes first_bhv: a ≥ 0; + ensures b ≤ 0; + assigns b, c; + + behavior pre_f_neg: + assumes second_bhv: a < 0; + ensures b > 0; + assigns b; + */ + b = f(a,& c); + /*@ behavior pre_g: + ensures a ≡ \old(b); + assigns a; */ + g(b,& a); + b += a; + return b; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/precond2.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/precond2.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/precond2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/precond2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,196 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/precond2.c (with preprocessing) +/* Generated by Frama-C */ +int global = 15; +/*@ requires x > 0; + requires (int)(x+y) ≢ 0; */ +int f(int x, int y, float z) +{ + int __retres; + __retres = (x + y) - (int)z; + return __retres; +} + +int g(int a, int b) +{ + int __retres; + __retres = a / b; + return __retres; +} + +int main(void) +{ + int a; + int b; + int tmp_0; + int tmp; + a = 2; + b = 3; + { + /*sequence*/ + tmp = g(a,b); + ; + } + tmp_0 = f(b - a,tmp,(float)1.0); + return tmp_0; +} + + +[kernel] ================================ +[kernel] printing status +[kernel] kf = Frama_C_bzero rte_gen_status = true precond_status = true +[kernel] kf = Frama_C_copy_block rte_gen_status = true precond_status = true +[kernel] kf = f rte_gen_status = false precond_status = false +[kernel] kf = g rte_gen_status = false precond_status = false +[kernel] kf = main rte_gen_status = false precond_status = false +[kernel] computing -rte-precond annotations +[rte] annotating function f +[rte] annotating function g +[rte] annotating function main +/* Generated by Frama-C */ +int global = 15; +/*@ requires x > 0; + requires (int)(x+y) ≢ 0; */ +int f(int x, int y, float z) +{ + int __retres; + __retres = (x + y) - (int)z; + return __retres; +} + +int g(int a, int b) +{ + int __retres; + __retres = a / b; + return __retres; +} + +int main(void) +{ + int a; + int b; + int tmp_0; + int tmp; + a = 2; + b = 3; + { + /*sequence*/ + tmp = g(a,b); + ; + } + /*@ behavior pre_f: + requires (int)(b-a) > 0; + requires (int)((int)(b-a)+tmp) ≢ 0; + */ + tmp_0 = f(b - a,tmp,(float)1.0); + return tmp_0; +} + + +[kernel] ================================ +[kernel] printing status +[kernel] kf = Frama_C_bzero rte_gen_status = true precond_status = true +[kernel] kf = Frama_C_copy_block rte_gen_status = true precond_status = true +[kernel] kf = f rte_gen_status = false precond_status = true +[kernel] kf = g rte_gen_status = false precond_status = true +[kernel] kf = main rte_gen_status = false precond_status = true +[kernel] computing rte-div annotations +[rte] annotating function f +[rte] annotating function g +[rte] annotating function main +/* Generated by Frama-C */ +int global = 15; +/*@ requires x > 0; + requires (int)(x+y) ≢ 0; */ +int f(int x, int y, float z) +{ + int __retres; + __retres = (x + y) - (int)z; + return __retres; +} + +int g(int a, int b) +{ + int __retres; + /*@ assert rte: division_by_zero: b ≢ 0; */ + __retres = a / b; + return __retres; +} + +int main(void) +{ + int a; + int b; + int tmp_0; + int tmp; + a = 2; + b = 3; + { + /*sequence*/ + tmp = g(a,b); + ; + } + /*@ behavior pre_f: + requires (int)(b-a) > 0; + requires (int)((int)(b-a)+tmp) ≢ 0; + */ + tmp_0 = f(b - a,tmp,(float)1.0); + return tmp_0; +} + + +[kernel] ================================ +[kernel] printing status +[kernel] kf = Frama_C_bzero rte_gen_status = true precond_status = true +[kernel] kf = Frama_C_copy_block rte_gen_status = true precond_status = true +[kernel] kf = f rte_gen_status = false precond_status = true +[kernel] kf = g rte_gen_status = false precond_status = true +[kernel] kf = main rte_gen_status = false precond_status = true +[kernel] removing rte-div alarms +/* Generated by Frama-C */ +int global = 15; +/*@ requires x > 0; + requires (int)(x+y) ≢ 0; */ +int f(int x, int y, float z) +{ + int __retres; + __retres = (x + y) - (int)z; + return __retres; +} + +int g(int a, int b) +{ + int __retres; + __retres = a / b; + return __retres; +} + +int main(void) +{ + int a; + int b; + int tmp_0; + int tmp; + a = 2; + b = 3; + { + /*sequence*/ + tmp = g(a,b); + ; + } + /*@ behavior pre_f: + requires (int)(b-a) > 0; + requires (int)((int)(b-a)+tmp) ≢ 0; + */ + tmp_0 = f(b - a,tmp,(float)1.0); + return tmp_0; +} + + +[kernel] ================================ +[kernel] printing status +[kernel] kf = Frama_C_bzero rte_gen_status = true precond_status = true +[kernel] kf = Frama_C_copy_block rte_gen_status = true precond_status = true +[kernel] kf = f rte_gen_status = false precond_status = true +[kernel] kf = g rte_gen_status = false precond_status = true +[kernel] kf = main rte_gen_status = false precond_status = true diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/precond.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/precond.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/precond.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/precond.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,347 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/precond.c (with preprocessing) +tests/rte/precond.c:27:[kernel] 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 +/* Generated by Frama-C */ +struct cell { + int val ; + struct cell *next ; +}; +typedef struct cell cell; +struct other { + cell c ; +}; +typedef struct other other; +struct top { + int topv ; + cell *next ; + cell *pred ; +}; +typedef struct top top; +int global = 15; +/*@ requires x > 0; + requires (int)(x+y) ≢ 0; */ +int f(int x, int y, float z) +{ + int __retres; + /*@ assert rte: signed_overflow: -2147483648 ≤ (int)(x+y)-(int)z; */ + /*@ assert rte: signed_overflow: (int)(x+y)-(int)z ≤ 2147483647; */ + /*@ assert rte: signed_overflow: -2147483648 ≤ x+y; */ + /*@ assert rte: signed_overflow: x+y ≤ 2147483647; */ + /*@ assert rte: float_to_int: z < 2147483648; */ + /*@ assert rte: float_to_int: -2147483649 < z; */ + __retres = (x + y) - (int)z; + return __retres; +} + +/*@ +predicate is_valid_int_range{L}(int *p, int n) = + \at(0 ≤ n ∧ \valid{L}(p+(0 .. n-1)),L); + +*/ +/*@ requires is_valid_int_range(p, i); */ +int g(int *p, int i) +{ + int __retres; + if (i >= 1) { + /*@ assert rte: signed_overflow: -2147483648 ≤ i-1; */ + /*@ assert rte: mem_access: \valid_read(p+(int)(i-1)); */ + __retres = *(p + (i - 1)); + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + return_label: return __retres; +} + +/*@ requires \valid((p+1)+3); */ +int h(int *p) +{ + int __retres; + /*@ assert rte: mem_access: \valid_read(p+3); */ + __retres = *(p + 3); + return __retres; +} + +/*@ requires \valid(p->next); + requires \valid(p); */ +cell *set(cell *p, int v) +{ + cell *__retres; + /*@ assert rte: mem_access: \valid(&p->val); */ + p->val = v; + /*@ assert rte: mem_access: \valid_read(&p->next); */ + __retres = p->next; + return __retres; +} + +/*@ requires \valid(cIn.next); + requires global > 0; */ +int next_val(cell cIn) +{ + int __retres; + /*@ assert rte: mem_access: \valid_read(&(cIn.next)->val); */ + __retres = (cIn.next)->val; + return __retres; +} + +/*@ requires \valid(ptop->next); */ +cell *top_set(top *ptop, int v) +{ + cell *tmp; + /*@ assert rte: mem_access: \valid_read(&ptop->next); */ + /*@ behavior pre_set: + requires \valid((ptop->next)->next); + requires \valid(ptop->next); + */ + tmp = set(ptop->next,v); + return tmp; +} + +/*@ requires \valid(tIn.next); */ +int top_next(top tIn) +{ + int tmp; + /*@ assert rte: mem_access: \valid_read(tIn.next); */ + /*@ behavior pre_next_val: + requires \valid((tIn.next)->next); + requires global > 0; + */ + tmp = next_val(*(tIn.next)); + return tmp; +} + +/*@ requires \valid(tab_top); + requires \valid(&tab_top); + requires \valid((*(tab_top+i))->next); + */ +cell *tabtop_set(top **tab_top, int i, int v) +{ + cell *tmp; + /*@ assert rte: mem_access: \valid_read(tab_top+i); */ + /*@ behavior pre_top_set: + requires \valid((*(tab_top+i))->next); */ + tmp = top_set(*(tab_top + i),v); + return tmp; +} + +int main(void) +{ + int a; + int b; + cell c; + cell *pc; + top T; + top tabT[2]; + top *ptabT[3]; + top **pptop; + other ot; + void *V; + int k; + int l; + int z; + int y; + int w; + int tab[4]; + int *r; + int **rr; + a = 2; + b = 3; + c.val = 20; + c.next = (struct cell *)0; + { + /*sequence*/ + ; + ; + ; + } + ptabT[0] = & T; + ptabT[1] = & T; + ptabT[2] = & T; + ot.c = c; + k = 1; + l = 1; + /*@ behavior pre_f: + requires 2 > 0; + requires (int)(2+3) ≢ 0; */ + z = f(2,3,(float)1.0); + /*@ assert rte: signed_overflow: -2147483648 ≤ b-a; */ + /*@ assert rte: signed_overflow: b-a ≤ 2147483647; */ + /*@ behavior pre_f_2: + requires (int)(b-a) > 0; + requires (int)((int)(b-a)+a) ≢ 0; + */ + y = f(b - a,a,(float)2.0); + tab[0] = 1; + tab[1] = 2; + tab[2] = 3; + tab[3] = 4; + /*@ assert rte: signed_overflow: -2147483648 ≤ a+b; */ + /*@ assert rte: signed_overflow: a+b ≤ 2147483647; */ + /*@ behavior pre_f_3: + requires y > 0; + requires (int)(y+(int)(a+b)) ≢ 0; */ + z = f(y,a + b,(float)(- 0.0)); + /*@ behavior pre_g: + requires is_valid_int_range(&z, 1); */ + w = g(& z,1); + /*@ behavior pre_g_2: + requires is_valid_int_range(&tab[1], 2); */ + w = g(& tab[1],2); + /*@ behavior pre_g_3: + requires is_valid_int_range(&tab[k], l); */ + w = g(& tab[k],l); + r = tab; + rr = & r; + /*@ behavior pre_g_4: + requires is_valid_int_range(r+2, 0); */ + w = g(r + 2,0); + /*@ behavior pre_h: + requires \valid(((int *)tab+1)+3); */ + w = h(tab); + /*@ behavior pre_h_2: + requires \valid((r+1)+3); */ + w = h(r); + /*@ assert rte: mem_access: \valid_read(rr); */ + /*@ behavior pre_h_3: + requires \valid((*rr+1)+3); */ + w = h(*rr); + pc = & c; + c.next = & c; + /*@ behavior pre_set: + requires \valid(pc->next); + requires \valid(pc); */ + set(pc,15); + /*@ behavior pre_set_2: + requires \valid(c.next); + requires \valid(&c); */ + set(& c,10); + /*@ behavior pre_set_3: + requires \valid(c.next); + requires \valid(&c); */ + set(& c,20); + V = (void *)(& c); + /*@ behavior pre_set_4: + requires \valid(((cell *)V)->next); + requires \valid((cell *)V); + */ + set((cell *)V,20); + /*@ behavior pre_next_val: + requires \valid(c.next); + requires global > 0; */ + next_val(c); + /*@ assert rte: mem_access: \valid_read(pc); */ + /*@ behavior pre_next_val_2: + requires \valid(pc->next); + requires global > 0; + */ + next_val(*pc); + /*@ assert rte: mem_access: \valid_read((cell *)V); */ + /*@ behavior pre_next_val_3: + requires \valid(((cell *)V)->next); + requires global > 0; + */ + next_val(*((cell *)V)); + T.pred = & c; + T.next = & c; + tabT[0] = T; + tabT[1] = T; + /*@ behavior pre_set_5: + requires \valid((T.pred)->next); + requires \valid(T.pred); + */ + set(T.pred,10); + /*@ behavior pre_set_6: + requires \valid((tabT[1].next)->next); + requires \valid(tabT[1].next); + */ + set(tabT[1].next,20); + /*@ assert rte: mem_access: \valid_read(T.next); */ + /*@ behavior pre_next_val_4: + requires \valid((T.next)->next); + requires global > 0; + */ + next_val(*(T.next)); + /*@ assert rte: mem_access: \valid_read(tabT[0].pred); */ + /*@ behavior pre_next_val_5: + requires \valid((tabT[0].pred)->next); + requires global > 0; + */ + next_val(*(tabT[0].pred)); + /*@ assert rte: mem_access: \valid_read(&(ptabT[2])->pred); */ + /*@ behavior pre_set_7: + requires \valid(((ptabT[2])->pred)->next); + requires \valid((ptabT[2])->pred); + */ + set((ptabT[2])->pred,15); + /*@ behavior pre_set_8: + requires \valid((tabT[1].pred)->next); + requires \valid(tabT[1].pred); + */ + set(tabT[1].pred,10); + /*@ assert rte: mem_access: \valid_read(&(ptabT[1])->next); */ + /*@ assert rte: mem_access: \valid_read((ptabT[1])->next); */ + /*@ behavior pre_next_val_6: + requires \valid(((ptabT[1])->next)->next); + requires global > 0; + */ + next_val(*((ptabT[1])->next)); + /*@ behavior pre_top_set: + requires \valid(T.next); */ + top_set(& T,3); + /*@ behavior pre_top_set_2: + requires \valid(tabT[1].next); */ + top_set(& tabT[1],2); + /*@ behavior pre_top_set_3: + requires \valid((ptabT[1])->next); */ + top_set(ptabT[1],4); + /*@ behavior pre_top_set_4: + requires \valid(((top *)c.next)->next); */ + top_set((top *)c.next,5); + /*@ behavior pre_top_next: + requires \valid(T.next); */ + top_next(T); + /*@ assert rte: mem_access: \valid_read(ptabT[0]); */ + /*@ behavior pre_top_next_2: + requires \valid((ptabT[0])->next); */ + top_next(*(ptabT[0])); + /*@ behavior pre_tabtop_set: + requires \valid((top **)ptabT); + requires \valid(&ptabT); + requires \valid((*((top **)ptabT+2))->next); + */ + tabtop_set(ptabT,2,10); + pptop = ptabT; + /*@ behavior pre_tabtop_set_2: + requires \valid(pptop); + requires \valid(&pptop); + requires \valid((*(pptop+2))->next); + */ + tabtop_set(pptop,2,15); + /*@ behavior pre_tabtop_set_3: + requires \valid((top **)ptabT); + requires \valid(&ptabT); + requires \valid((*((top **)ptabT+1))->next); + */ + tabtop_set(ptabT,1,20); + /*@ assert rte: mem_access: \valid_read(&pc->next); */ + /*@ behavior pre_tabtop_set_4: + requires \valid((top **)pc->next); + requires \valid((top ***)(&pc->next)); + requires \valid((*((top **)pc->next+1))->next); + */ + tabtop_set((top **)pc->next,1,10); + return z; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/reqlabl2.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/reqlabl2.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/reqlabl2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/reqlabl2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,30 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/reqlabl2.c (with preprocessing) +[rte] annotating function g +tests/rte/reqlabl2.c:16:[kernel] warning: No code nor implicit assigns clause for function f, generating default assigns from the prototype +/* Generated by Frama-C */ +/*@ requires PROP_SUR_982: x > 0; + requires PROP_SUR_982: x+1 > 1; + ensures PROP_SUR_982: \old(x) > 0; + ensures PROP_SUR_982: \old(x)+1 > 1; + assigns \result; + assigns \result \from x; + */ +extern int f(int x); + +void g(int a) +{ + int c; + /*@ behavior pre_f: + requires PROP_SUR_982: a > 0; + requires PROP_SUR_982: a+1 > 1; + ensures PROP_SUR_982: \old(a) > 0; + ensures PROP_SUR_982: \old(a)+1 > 1; + assigns c; + assigns c \from a; + */ + c = f(a); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/reqlabl.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/reqlabl.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/reqlabl.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/reqlabl.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/reqlabl.c (with preprocessing) +[rte] annotating function g +tests/rte/reqlabl.c:11:[kernel] warning: No code nor implicit assigns clause for function f, generating default assigns from the prototype +/* Generated by Frama-C */ +/*@ requires PROP_SUR_982: x > 0; + assigns \result; + assigns \result \from x; */ +extern int f(int x); + +void g(int a) +{ + int c; + /*@ behavior pre_f: + requires PROP_SUR_982: a > 0; + assigns c; + assigns c \from a; + */ + c = f(a); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/s64.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/s64.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/s64.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/s64.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/s64.c (with preprocessing) +[rte] annotating function main +tests/rte/s64.c:9:[rte] warning: shift assert broken (signed overflow): 5LL<<63 ≤ 9223372036854775807 +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + long long z; + /*@ assert rte: signed_overflow: 5LL<<63 ≤ 9223372036854775807; */ + z = 5LL << 63; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/shift_machdep.1.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/shift_machdep.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/shift_machdep.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/shift_machdep.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,18 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/shift_machdep.c (with preprocessing) +[rte] annotating function main +tests/rte/shift_machdep.c:9:[rte] warning: shift assert broken (signed overflow): 5<<30 ≤ 2147483647 +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int x; + long y; + /*@ assert rte: signed_overflow: 5<<30 ≤ 2147483647; */ + x = 5 << 30; + y = 5L << 30; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/shift_machdep.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/shift_machdep.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/shift_machdep.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/shift_machdep.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,20 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/shift_machdep.c (with preprocessing) +[rte] annotating function main +tests/rte/shift_machdep.c:9:[rte] warning: shift assert broken (signed overflow): 5<<30 ≤ 2147483647 +tests/rte/shift_machdep.c:10:[rte] warning: shift assert broken (signed overflow): 5L<<30 ≤ 2147483647 +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int x; + long y; + /*@ assert rte: signed_overflow: 5<<30 ≤ 2147483647; */ + x = 5 << 30; + /*@ assert rte: signed_overflow: 5L<<30 ≤ 2147483647; */ + y = 5L << 30; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/shift.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/shift.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/shift.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/shift.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,96 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/shift.c (with preprocessing) +[rte] annotating function main +tests/rte/shift.c:13:[rte] warning: shift assert broken (signed overflow): 5<<30 ≤ 2147483647 +tests/rte/shift.c:14:[rte] warning: shift assert broken (signed overflow): 5<<30 ≤ 2147483647 +tests/rte/shift.c:16:[rte] warning: shift assert broken (bad operand): 0 ≤ (int)(-3) +tests/rte/shift.c:18:[rte] warning: shift assert broken (signed overflow): 5<<30 ≤ 2147483647 +tests/rte/shift.c:19:[rte] warning: shift assert broken (signed overflow): 5<<30 ≤ 2147483647 +tests/rte/shift.c:20:[rte] warning: shift assert broken (bad operand): 0 ≤ 60 < 32 +tests/rte/shift.c:20:[rte] warning: shift assert broken (signed overflow): 5<<60 ≤ 2147483647 +tests/rte/shift.c:22:[rte] warning: shift assert broken (signed overflow): 5<<29 ≤ 2147483647 +tests/rte/shift.c:36:[rte] warning: shift assert broken (bad operand): 0 ≤ (int)(-2) < 32 +tests/rte/shift.c:38:[rte] warning: shift assert broken (bad operand): 0 ≤ 32 < 32 +tests/rte/shift.c:41:[rte] warning: shift assert broken (bad operand): 0 ≤ (int)(-5) +tests/rte/shift.c:46:[rte] warning: shift assert broken (bad operand): 0 ≤ (int)(-2) +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int i; + int x; + int y; + int z; + unsigned int ux; + unsigned int uy; + unsigned int uz; + long lx; + long ly; + long lz; + i = 0; + x = 0; + y = 0; + z = 0; + ux = (unsigned int)0; + uy = (unsigned int)0; + uz = (unsigned int)0; + lx = (long)0; + ly = (long)0; + lz = (long)0; + z = (int)(5u << 30); + /*@ assert rte: signed_overflow: 5<<30 ≤ 2147483647; */ + uz = (unsigned int)(5 << 30); + /*@ assert rte: signed_overflow: 5<<30 ≤ 2147483647; */ + z = 5 << 30; + /*@ assert rte: shift: 0 ≤ (int)(-3); */ + z = -3 << 2; + /*@ assert rte: signed_overflow: 5<<30 ≤ 2147483647; */ + z = 5 << 30; + /*@ assert rte: signed_overflow: 5<<30 ≤ 2147483647; */ + lz = (long)(5 << 30); + /*@ assert rte: shift: 0 ≤ 60 < 32; */ + /*@ assert rte: signed_overflow: 5<<60 ≤ 2147483647; */ + lz = (long)(5 << 60); + /*@ assert rte: signed_overflow: 5<<29 ≤ 2147483647; */ + z = 5 << 29; + z = 5 << 28; + z = 5 << 3; + z = 5 << 1; + i = 0; + while (i < 10) { + /*@ assert rte: shift: 0 ≤ i < 32; */ + /*@ assert rte: signed_overflow: 1<> -2; + z = 3 >> 5; + /*@ assert rte: shift: 0 ≤ 32 < 32; */ + z = 3 >> 32; + z = 3 >> 31; + /*@ assert rte: shift: 0 ≤ (int)(-5); */ + z = -5 >> 1; + /*@ assert rte: shift: 0 ≤ y < 32; */ + /*@ assert rte: shift: 0 ≤ x; */ + z = x >> y; + /*@ assert rte: shift: 0 ≤ y < 32; */ + uz = (unsigned int)x >> y; + /*@ assert rte: shift: 0 ≤ (int)(-2); */ + z = -2 >> 1; + uz = (unsigned int)(-2) >> 1; + z = 0 << 10; + z = 0 >> 10; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/shift_unsigned.1.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/shift_unsigned.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/shift_unsigned.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/shift_unsigned.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/shift_unsigned.c (with preprocessing) +[rte] annotating function main +tests/rte/shift_unsigned.c:11:[rte] warning: shift assert broken (bad operand): 0 ≤ (int)(-3) < 32 +tests/rte/shift_unsigned.c:12:[rte] warning: shift assert broken (bad operand): 0 ≤ (int)(-4) +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + unsigned int x; + unsigned int y; + x = 0x10000000U; + y = x << 4; + y = 0x10000000U << 4; + /*@ assert rte: shift: 0 ≤ (int)(-3) < 32; */ + y = 1U << -3; + /*@ assert rte: shift: 0 ≤ (int)(-4); */ + y = (unsigned int)(-4 << 2); + __retres = (int)y; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/shift_unsigned.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/shift_unsigned.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/shift_unsigned.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/shift_unsigned.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/shift_unsigned.c (with preprocessing) +[rte] annotating function main +tests/rte/shift_unsigned.c:11:[rte] warning: shift assert broken (bad operand): 0 ≤ (int)(-3) < 32 +tests/rte/shift_unsigned.c:12:[rte] warning: shift assert broken (bad operand): 0 ≤ (int)(-4) +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + unsigned int x; + unsigned int y; + x = 0x10000000U; + y = x << 4; + y = 0x10000000U << 4; + /*@ assert rte: shift: 0 ≤ (int)(-3) < 32; */ + y = 1U << -3; + /*@ assert rte: shift: 0 ≤ (int)(-4); */ + y = (unsigned int)(-4 << 2); + __retres = (int)y; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/sizeof.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/sizeof.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/sizeof.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/sizeof.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,20 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/sizeof.c (with preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int x; + int y; + int z; + int *p; + int tab[10]; + x = (int)sizeof(*p); + y = (int)sizeof((double)*p); + z = (int)sizeof(tab[3]); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/tab.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/tab.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/tab.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/tab.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,55 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/tab.c (with preprocessing) +[rte] annotating function f4 +[rte] annotating function g4 +[rte] annotating function h4 +[rte] annotating function i4 +/* Generated by Frama-C */ +typedef double typetab[2]; +double g4(typetab *t) +{ + double y; + /*@ assert rte: mem_access: \valid_read((double *)*t); */ + /*@ assert rte: mem_access: \valid_read(&(*t)[1]); */ + y = (*t)[0] + (*t)[1]; + return y; +} + +double h4(double * /*[2]*/ t) +{ + double __retres; + /*@ assert rte: mem_access: \valid_read(t+0); */ + /*@ assert rte: mem_access: \valid_read(t+1); */ + __retres = *(t + 0) + *(t + 1); + return __retres; +} + +double i4(double *t) +{ + double __retres; + /*@ assert rte: mem_access: \valid_read(t+0); */ + /*@ assert rte: mem_access: \valid_read(t+1); */ + __retres = *(t + 0) + *(t + 1); + return __retres; +} + +/*@ assigns \nothing; */ +double f4(void) +{ + double __retres; + double tab[2]; + double r; + double tmp; + tab[0] = 1.0; + tab[1] = 2.0; + r = g4(& tab); + { + /*sequence*/ + tmp = h4(tab); + ; + } + __retres = r + tmp; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/threefunc.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/threefunc.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/threefunc.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/threefunc.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,348 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/threefunc.c (with preprocessing) +/* Generated by Frama-C */ +int g(int x, int y) +{ + int __retres; + __retres = x / y; + return __retres; +} + +int f(int x, int y) +{ + int __retres; + if (x + y != 0) + if (x == 2147483647) + if (y == 1) { + __retres = -1; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 1; + goto return_label; + } + return_label: return __retres; +} + +int main(void) +{ + int __retres; + int x; + int y; + int i; + x = 1; + y = 2; + i = 0; + while (i < 20) { + { + int tmp; + tmp = x + y; + y = x - y; + x = tmp; + } + i ++; + } + if (x > 0) + if (y > 0) { + int tmp_0; + int tmp_1; + { + /*sequence*/ + tmp_0 = f(x,y); + tmp_1 = g(x,y); + } + __retres = tmp_0 + tmp_1; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + return_label: return __retres; +} + + +[kernel] ================================ +[rte] annotating function f +[rte] annotating function g +[rte] annotating function main +/* Generated by Frama-C */ +int g(int x, int y) +{ + int __retres; + /*@ assert rte: division_by_zero: y ≢ 0; */ + /*@ assert rte: signed_overflow: x/y ≤ 2147483647; */ + __retres = x / y; + return __retres; +} + +int f(int x, int y) +{ + int __retres; + /*@ assert rte: signed_overflow: -2147483648 ≤ x+y; */ + /*@ assert rte: signed_overflow: x+y ≤ 2147483647; */ + if (x + y != 0) + if (x == 2147483647) + if (y == 1) { + __retres = -1; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 1; + goto return_label; + } + return_label: return __retres; +} + +int main(void) +{ + int __retres; + int x; + int y; + int i; + x = 1; + y = 2; + i = 0; + while (i < 20) { + { + int tmp; + /*@ assert rte: signed_overflow: -2147483648 ≤ x+y; */ + /*@ assert rte: signed_overflow: x+y ≤ 2147483647; */ + tmp = x + y; + /*@ assert rte: signed_overflow: -2147483648 ≤ x-y; */ + /*@ assert rte: signed_overflow: x-y ≤ 2147483647; */ + y = x - y; + x = tmp; + } + /*@ assert rte: signed_overflow: i+1 ≤ 2147483647; */ + i ++; + } + if (x > 0) + if (y > 0) { + int tmp_0; + int tmp_1; + { + /*sequence*/ + tmp_0 = f(x,y); + tmp_1 = g(x,y); + } + /*@ assert rte: signed_overflow: -2147483648 ≤ tmp_0+tmp_1; */ + /*@ assert rte: signed_overflow: tmp_0+tmp_1 ≤ 2147483647; */ + __retres = tmp_0 + tmp_1; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + return_label: return __retres; +} + + +[kernel] ================================ +[kernel] printing status +[kernel] kf = Frama_C_bzero rte_gen_status = true precond_status = true +[kernel] kf = Frama_C_copy_block rte_gen_status = true precond_status = true +[kernel] kf = f rte_gen_status = true precond_status = true +[kernel] kf = g rte_gen_status = true precond_status = true +[kernel] kf = main rte_gen_status = true precond_status = true +[kernel] Removing some rte annotations +/* Generated by Frama-C */ +int g(int x, int y) +{ + int __retres; + /*@ assert rte: division_by_zero: y ≢ 0; */ + __retres = x / y; + return __retres; +} + +int f(int x, int y) +{ + int __retres; + if (x + y != 0) + if (x == 2147483647) + if (y == 1) { + __retres = -1; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 1; + goto return_label; + } + return_label: return __retres; +} + +int main(void) +{ + int __retres; + int x; + int y; + int i; + x = 1; + y = 2; + i = 0; + while (i < 20) { + { + int tmp; + tmp = x + y; + y = x - y; + x = tmp; + } + i ++; + } + if (x > 0) + if (y > 0) { + int tmp_0; + int tmp_1; + { + /*sequence*/ + tmp_0 = f(x,y); + tmp_1 = g(x,y); + } + __retres = tmp_0 + tmp_1; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + return_label: return __retres; +} + + +[kernel] ================================ +[kernel] printing status +[kernel] kf = Frama_C_bzero rte_gen_status = true precond_status = true +[kernel] kf = Frama_C_copy_block rte_gen_status = true precond_status = true +[kernel] kf = f rte_gen_status = true precond_status = true +[kernel] kf = g rte_gen_status = true precond_status = true +[kernel] kf = main rte_gen_status = true precond_status = true +[rte] annotating function f +[rte] annotating function main +/* Generated by Frama-C */ +int g(int x, int y) +{ + int __retres; + /*@ assert rte: division_by_zero: y ≢ 0; */ + __retres = x / y; + return __retres; +} + +int f(int x, int y) +{ + int __retres; + /*@ assert rte: signed_overflow: -2147483648 ≤ x+y; */ + /*@ assert rte: signed_overflow: x+y ≤ 2147483647; */ + if (x + y != 0) + if (x == 2147483647) + if (y == 1) { + __retres = -1; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 1; + goto return_label; + } + return_label: return __retres; +} + +int main(void) +{ + int __retres; + int x; + int y; + int i; + x = 1; + y = 2; + i = 0; + while (i < 20) { + { + int tmp; + /*@ assert rte: signed_overflow: -2147483648 ≤ x+y; */ + /*@ assert rte: signed_overflow: x+y ≤ 2147483647; */ + tmp = x + y; + /*@ assert rte: signed_overflow: -2147483648 ≤ x-y; */ + /*@ assert rte: signed_overflow: x-y ≤ 2147483647; */ + y = x - y; + x = tmp; + } + /*@ assert rte: signed_overflow: i+1 ≤ 2147483647; */ + i ++; + } + if (x > 0) + if (y > 0) { + int tmp_0; + int tmp_1; + { + /*sequence*/ + tmp_0 = f(x,y); + tmp_1 = g(x,y); + } + /*@ assert rte: signed_overflow: -2147483648 ≤ tmp_0+tmp_1; */ + /*@ assert rte: signed_overflow: tmp_0+tmp_1 ≤ 2147483647; */ + __retres = tmp_0 + tmp_1; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + return_label: return __retres; +} + + +[kernel] ================================ +[kernel] printing status +[kernel] kf = Frama_C_bzero rte_gen_status = false precond_status = true +[kernel] kf = Frama_C_copy_block rte_gen_status = true precond_status = true +[kernel] kf = f rte_gen_status = true precond_status = true +[kernel] kf = g rte_gen_status = true precond_status = true +[kernel] kf = main rte_gen_status = true precond_status = true diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/twofunc3.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/twofunc3.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/twofunc3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/twofunc3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,86 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/twofunc3.c (with preprocessing) +[rte] annotating function f +[rte] annotating function main +/* Generated by Frama-C */ +int f(int x, int y) +{ + int __retres; + /*@ assert rte: signed_overflow: -2147483648 ≤ x+y; */ + /*@ assert rte: signed_overflow: x+y ≤ 2147483647; */ + if (x + y != 0) { + if (x == 2147483647) + if (y == 1) { + __retres = -1; + goto return_label; + } + __retres = 0; + goto return_label; + } + __retres = 1; + return_label: return __retres; +} + +int main(void) +{ + int __retres; + int x; + int y; + int i; + x = 1; + y = 2; + /*@ assert y > x; */ ; + i = 0; + while (i < 20) { + { + int tmp; + /*@ assert rte: signed_overflow: -2147483648 ≤ x+y; */ + /*@ assert rte: signed_overflow: x+y ≤ 2147483647; */ + tmp = x + y; + /*@ assert rte: signed_overflow: -2147483648 ≤ x-y; */ + /*@ assert rte: signed_overflow: x-y ≤ 2147483647; */ + y = x - y; + x = tmp; + } + /*@ assert rte: signed_overflow: i+1 ≤ 2147483647; */ + i ++; + } + /*@ assert i > 0; */ ; + if (x > 0) + if (y > 0) { + int tmp_0; + tmp_0 = f(x,y); + __retres = tmp_0; + goto return_label; + } + __retres = 0; + return_label: return __retres; +} + + +[kernel] ================================ +[kernel] Rte-generated annotations for function Frama_C_bzero +[kernel] None +[kernel] Rte-generated annotations for function Frama_C_copy_block +[kernel] None +[kernel] Rte-generated annotations for function f +[kernel] For Statement if (x + y != 0) { + if (x == 2147483647) + if (y == 1) { + __retres = -1; + goto return_label; + } + __retres = 0; + goto return_label; + } +[kernel] assert rte: signed_overflow: -2147483648 ≤ x+y; +[kernel] assert rte: signed_overflow: x+y ≤ 2147483647; +[kernel] Rte-generated annotations for function main +[kernel] For Statement tmp = x + y; +[kernel] assert rte: signed_overflow: -2147483648 ≤ x+y; +[kernel] assert rte: signed_overflow: x+y ≤ 2147483647; +[kernel] For Statement y = x - y; +[kernel] assert rte: signed_overflow: -2147483648 ≤ x-y; +[kernel] assert rte: signed_overflow: x-y ≤ 2147483647; +[kernel] For Statement i ++; +[kernel] assert rte: signed_overflow: i+1 ≤ 2147483647; diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/twofunc.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/twofunc.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/twofunc.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/twofunc.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,284 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/twofunc.c (with preprocessing) +/* Generated by Frama-C */ +int f(int x, int y) +{ + int __retres; + if (x + y != 0) + if (x == 2147483647) + if (y == 1) { + __retres = -1; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 1; + goto return_label; + } + return_label: return __retres; +} + +int main(void) +{ + int __retres; + int x; + int y; + int i; + x = 1; + y = 2; + i = 0; + while (i < 20) { + { + int tmp; + tmp = x + y; + y = x - y; + x = tmp; + } + i ++; + } + if (x > 0) + if (y > 0) { + int tmp_0; + tmp_0 = f(x,y); + __retres = tmp_0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + return_label: return __retres; +} + + +[kernel] ================================ +[rte] annotating function f +[rte] annotating function main +/* Generated by Frama-C */ +int f(int x, int y) +{ + int __retres; + /*@ assert rte: signed_overflow: -2147483648 ≤ x+y; */ + /*@ assert rte: signed_overflow: x+y ≤ 2147483647; */ + if (x + y != 0) + if (x == 2147483647) + if (y == 1) { + __retres = -1; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 1; + goto return_label; + } + return_label: return __retres; +} + +int main(void) +{ + int __retres; + int x; + int y; + int i; + x = 1; + y = 2; + i = 0; + while (i < 20) { + { + int tmp; + /*@ assert rte: signed_overflow: -2147483648 ≤ x+y; */ + /*@ assert rte: signed_overflow: x+y ≤ 2147483647; */ + tmp = x + y; + /*@ assert rte: signed_overflow: -2147483648 ≤ x-y; */ + /*@ assert rte: signed_overflow: x-y ≤ 2147483647; */ + y = x - y; + x = tmp; + } + /*@ assert rte: signed_overflow: i+1 ≤ 2147483647; */ + i ++; + } + if (x > 0) + if (y > 0) { + int tmp_0; + tmp_0 = f(x,y); + __retres = tmp_0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + return_label: return __retres; +} + + +[kernel] ================================ +[kernel] printing status +[kernel] kf = Frama_C_bzero +[kernel] precondition = true +[kernel] signed_overflow = true +[kernel] mem_access = true +[kernel] division_by_zero = true +[kernel] shift_value_out_of_bounds = true +[kernel] downcast = true +[kernel] float_to_int = true +[kernel] unsigned_overflow = true +[kernel] unsigned_downcast = true +[kernel] kf = Frama_C_copy_block +[kernel] precondition = true +[kernel] signed_overflow = true +[kernel] mem_access = true +[kernel] division_by_zero = true +[kernel] shift_value_out_of_bounds = true +[kernel] downcast = true +[kernel] float_to_int = true +[kernel] unsigned_overflow = true +[kernel] unsigned_downcast = true +[kernel] kf = f +[kernel] precondition = true +[kernel] signed_overflow = true +[kernel] mem_access = true +[kernel] division_by_zero = true +[kernel] shift_value_out_of_bounds = true +[kernel] downcast = false +[kernel] float_to_int = true +[kernel] unsigned_overflow = false +[kernel] unsigned_downcast = false +[kernel] kf = main +[kernel] precondition = true +[kernel] signed_overflow = true +[kernel] mem_access = true +[kernel] division_by_zero = true +[kernel] shift_value_out_of_bounds = true +[kernel] downcast = false +[kernel] float_to_int = true +[kernel] unsigned_overflow = false +[kernel] unsigned_downcast = false +[kernel] ================================ +/* Generated by Frama-C */ +int f(int x, int y) +{ + int __retres; + if (x + y != 0) + if (x == 2147483647) + if (y == 1) { + __retres = -1; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 1; + goto return_label; + } + return_label: return __retres; +} + +int main(void) +{ + int __retres; + int x; + int y; + int i; + x = 1; + y = 2; + i = 0; + while (i < 20) { + { + int tmp; + tmp = x + y; + y = x - y; + x = tmp; + } + i ++; + } + if (x > 0) + if (y > 0) { + int tmp_0; + tmp_0 = f(x,y); + __retres = tmp_0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + return_label: return __retres; +} + + +[kernel] ================================ +[kernel] printing status +[kernel] kf = Frama_C_bzero +[kernel] precondition = true +[kernel] signed_overflow = true +[kernel] mem_access = true +[kernel] division_by_zero = true +[kernel] shift_value_out_of_bounds = true +[kernel] downcast = true +[kernel] float_to_int = true +[kernel] unsigned_overflow = true +[kernel] unsigned_downcast = true +[kernel] kf = Frama_C_copy_block +[kernel] precondition = true +[kernel] signed_overflow = true +[kernel] mem_access = true +[kernel] division_by_zero = true +[kernel] shift_value_out_of_bounds = true +[kernel] downcast = true +[kernel] float_to_int = true +[kernel] unsigned_overflow = true +[kernel] unsigned_downcast = true +[kernel] kf = f +[kernel] precondition = true +[kernel] signed_overflow = true +[kernel] mem_access = true +[kernel] division_by_zero = true +[kernel] shift_value_out_of_bounds = true +[kernel] downcast = false +[kernel] float_to_int = true +[kernel] unsigned_overflow = false +[kernel] unsigned_downcast = false +[kernel] kf = main +[kernel] precondition = true +[kernel] signed_overflow = true +[kernel] mem_access = true +[kernel] division_by_zero = true +[kernel] shift_value_out_of_bounds = true +[kernel] downcast = false +[kernel] float_to_int = true +[kernel] unsigned_overflow = false +[kernel] unsigned_downcast = false +[kernel] ================================ diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/u64.1.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/u64.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/u64.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/u64.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/u64.i (no preprocessing) +[rte] annotating function f +/* Generated by Frama-C */ +unsigned long f(unsigned int n) +{ + unsigned long __retres; + /*@ assert + rte: unsigned_overflow: 0 ≤ (unsigned long)n*sizeof(unsigned long); + */ + /*@ assert + rte: unsigned_overflow: + (unsigned long)n*sizeof(unsigned long) ≤ 18446744073709551615; + */ + __retres = (unsigned long)n * sizeof(unsigned long); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/u64.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/u64.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/u64.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/u64.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,15 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/u64.i (no preprocessing) +[rte] annotating function f +/* Generated by Frama-C */ +unsigned long f(unsigned int n) +{ + unsigned long __retres; + /*@ assert rte: unsigned_overflow: 0 ≤ n*sizeof(unsigned long); */ + /*@ assert rte: unsigned_overflow: n*sizeof(unsigned long) ≤ 4294967295; + */ + __retres = (unsigned long)(n * sizeof(unsigned long)); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/unspecified_sequence.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/unspecified_sequence.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/unspecified_sequence.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/unspecified_sequence.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,47 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/unspecified_sequence.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..9] ∈ {0} +tests/rte/unspecified_sequence.i:7:[value] Function main: precondition got status unknown. +[value] computing for function f <- main. + Called from tests/rte/unspecified_sequence.i:10. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/rte/unspecified_sequence.i:11. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/rte/unspecified_sequence.i:11. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {0} +[value] Values at end of function main: + y ∈ {0} + z ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM \nothing +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main: + y; tmp; z; tmp_0; tmp_1 +[inout] Inputs for function main: + t[0] diff -Nru frama-c-20140301+neon+dfsg/tests/rte/oracle/valid.res.oracle frama-c-20150201+sodium+dfsg/tests/rte/oracle/valid.res.oracle --- frama-c-20140301+neon+dfsg/tests/rte/oracle/valid.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/oracle/valid.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,355 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/rte/valid.c (with preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +struct R { + int v ; +}; +struct P; +struct Q { + int v ; + int id[12] ; + struct P *next ; + struct R tr[13] ; +}; +struct P { + int val ; + struct P *next ; + int id[5] ; + int oth[6][7] ; + struct P *nexts[8][9] ; + struct Q q ; + struct Q tq[10][11] ; + struct P ***znexts ; +}; +int main(void) +{ + struct P ***pppp; + struct P **ppp; + struct P *pp; + struct P p; + int v; + struct Q q; + int *i; + int j; + int i0; + int i1; + int i2; + int i3; + int i4; + struct P *tmp; + struct P np; + struct P *npp; + struct P *z; + i0 = 0; + i1 = 1; + i2 = 2; + i3 = 3; + i4 = 4; + j = 0; + i = & j; + pp = & p; + ppp = & pp; + pppp = & ppp; + p.next = pp; + p.znexts = pppp; + { + /*sequence*/ + tmp = pp; + /*@ assert rte: index_bound: 0 ≤ i2; */ + /*@ assert rte: index_bound: i2 < 8; */ + /*@ assert rte: index_bound: 0 ≤ i3; */ + /*@ assert rte: index_bound: i3 < 9; */ + p.nexts[i2][i3] = tmp; + /*@ assert rte: index_bound: 0 ≤ i0; */ + /*@ assert rte: index_bound: i0 < 8; */ + /*@ assert rte: index_bound: 0 ≤ i1; */ + /*@ assert rte: index_bound: i1 < 9; */ + p.nexts[i0][i1] = tmp; + } + q.next = pp; + /*@ assert rte: index_bound: 0 ≤ i0; */ + /*@ assert rte: index_bound: i0 < 12; */ + q.id[i0] = 0; + p.q = q; + /*@ assert rte: index_bound: 0 ≤ i0; */ + /*@ assert rte: index_bound: i0 < 10; */ + /*@ assert rte: index_bound: 0 ≤ i1; */ + /*@ assert rte: index_bound: i1 < 11; */ + p.tq[i0][i1] = q; + /*@ assert rte: index_bound: 0 ≤ i1; */ + /*@ assert rte: index_bound: i1 < 5; */ + /*@ assert rte: index_bound: 0 ≤ i2; */ + /*@ assert rte: index_bound: i2 < 5; */ + p.id[i1] = p.id[i2]; + /*@ assert rte: index_bound: 0 ≤ i1; */ + /*@ assert rte: index_bound: i1 < 5; */ + /*@ assert rte: index_bound: 0 ≤ i3; */ + /*@ assert rte: index_bound: i3 < 5; */ + p.id[i1] = p.id[i3]; + /*@ assert rte: mem_access: \valid_read(p.next); */ + np = *(p.next); + npp = p.next; + v = p.id[3]; + /*@ assert rte: mem_access: \valid_read(&pp->id[3]); */ + v = pp->id[3]; + /*@ assert rte: mem_access: \valid_read(i); */ + v = *i; + /*@ assert rte: mem_access: \valid_read(&pp->val); */ + v = pp->val; + /*@ assert rte: mem_access: \valid_read(&pp->id[3]); */ + v = pp->id[3]; + /*@ assert rte: index_bound: 0 ≤ i0; */ + /*@ assert rte: index_bound: i0 < 8; */ + /*@ assert rte: index_bound: 0 ≤ i1; */ + /*@ assert rte: index_bound: i1 < 9; */ + /*@ assert rte: mem_access: \valid_read(&pp->nexts[i0][i1]); */ + z = pp->nexts[i0][i1]; + /*@ assert rte: index_bound: 0 ≤ i0; */ + /*@ assert rte: index_bound: i0 < 8; */ + /*@ assert rte: index_bound: 0 ≤ i1; */ + /*@ assert rte: index_bound: i1 < 9; */ + /*@ assert rte: mem_access: \valid_read(&pp->nexts[i0][i1]); */ + /*@ assert rte: mem_access: \valid_read(&(pp->nexts[i0][i1])->val); */ + v = (pp->nexts[i0][i1])->val; + /*@ assert rte: mem_access: \valid_read(&pp->next); */ + /*@ assert rte: mem_access: \valid_read(&(pp->next)->val); */ + v = (pp->next)->val; + /*@ assert rte: mem_access: \valid_read(&pp->next); */ + /*@ assert rte: mem_access: \valid_read(&(pp->next)->next); */ + /*@ assert rte: mem_access: \valid_read(&((pp->next)->next)->val); */ + v = ((pp->next)->next)->val; + /*@ assert rte: index_bound: 0 ≤ i0; */ + /*@ assert rte: index_bound: i0 < 8; */ + /*@ assert rte: index_bound: 0 ≤ i1; */ + /*@ assert rte: index_bound: i1 < 9; */ + /*@ assert rte: mem_access: \valid_read(&(p.nexts[i0][i1])->val); */ + v = (p.nexts[i0][i1])->val; + /*@ assert rte: index_bound: 0 ≤ i2; */ + /*@ assert rte: index_bound: i2 < 5; */ + /*@ assert rte: mem_access: \valid_read(&pp->id[i2]); */ + v = pp->id[i2]; + /*@ assert rte: index_bound: 0 ≤ i0; */ + /*@ assert rte: index_bound: i0 < 6; */ + /*@ assert rte: index_bound: 0 ≤ i1; */ + /*@ assert rte: index_bound: i1 < 7; */ + /*@ assert rte: mem_access: \valid_read(&pp->oth[i0][i1]); */ + v = pp->oth[i0][i1]; + /*@ assert rte: index_bound: 0 ≤ i1; */ + /*@ assert rte: index_bound: i1 < 8; */ + /*@ assert rte: index_bound: 0 ≤ i2; */ + /*@ assert rte: index_bound: i2 < 9; */ + /*@ assert rte: mem_access: \valid_read(i); */ + /*@ assert rte: index_bound: 0 ≤ i3; */ + /*@ assert rte: index_bound: i3 < 8; */ + /*@ assert rte: index_bound: 0 ≤ *i; */ + /*@ assert rte: index_bound: *i < 9; */ + /*@ assert rte: mem_access: \valid_read(&(p.nexts[i1][i2])->nexts[i3][*i]); + */ + /*@ assert rte: index_bound: 0 ≤ i4; */ + /*@ assert rte: index_bound: i4 < 5; */ + /*@ assert + rte: mem_access: + \valid_read(&((p.nexts[i1][i2])->nexts[i3][*i])->id[i4]); + */ + v = ((p.nexts[i1][i2])->nexts[i3][*i])->id[i4]; + v = p.q.v; + /*@ assert rte: index_bound: 0 ≤ i4; */ + /*@ assert rte: index_bound: i4 < 12; */ + v = p.q.id[i4]; + /*@ assert rte: index_bound: 0 ≤ i3; */ + /*@ assert rte: index_bound: i3 < 10; */ + /*@ assert rte: index_bound: 0 ≤ i1; */ + /*@ assert rte: index_bound: i1 < 11; */ + v = p.tq[i3][i1].v; + /*@ assert rte: index_bound: 0 ≤ i1; */ + /*@ assert rte: index_bound: i1 < 10; */ + /*@ assert rte: index_bound: 0 ≤ i2; */ + /*@ assert rte: index_bound: i2 < 11; */ + /*@ assert rte: index_bound: 0 ≤ i3; */ + /*@ assert rte: index_bound: i3 < 10; */ + /*@ assert rte: index_bound: 0 ≤ i4; */ + /*@ assert rte: index_bound: i4 < 11; */ + /*@ assert + rte: mem_access: \valid_read(&(p.tq[i1][i2].next)->tq[i3][i4].v); + */ + v = (p.tq[i1][i2].next)->tq[i3][i4].v; + /*@ assert rte: index_bound: 0 ≤ i3; */ + /*@ assert rte: index_bound: i3 < 10; */ + /*@ assert rte: index_bound: 0 ≤ i1; */ + /*@ assert rte: index_bound: i1 < 11; */ + /*@ assert rte: mem_access: \valid_read(&pp->tq[i3][i1].v); */ + v = pp->tq[i3][i1].v; + /*@ assert rte: mem_access: \valid_read(p.znexts+i0); */ + /*@ assert rte: mem_access: \valid_read(*(p.znexts+i0)+i1); */ + /*@ assert rte: mem_access: \valid_read(&(*(*(p.znexts+i0)+i1)+i2)->val); + */ + v = (*(*(p.znexts + i0) + i1) + i2)->val; + /*@ assert rte: index_bound: 0 ≤ i0; */ + /*@ assert rte: index_bound: i0 < 10; */ + /*@ assert rte: index_bound: 0 ≤ i1; */ + /*@ assert rte: index_bound: i1 < 11; */ + q = p.tq[i0][i1]; + /*@ assert rte: index_bound: 0 ≤ i0; */ + /*@ assert rte: index_bound: i0 < 10; */ + /*@ assert rte: index_bound: 0 ≤ i1; */ + /*@ assert rte: index_bound: i1 < 11; */ + /*@ assert rte: index_bound: 0 ≤ i2; */ + /*@ assert rte: index_bound: i2 < 13; */ + v = p.tq[i0][i1].tr[i2].v; + /*@ assert rte: mem_access: \valid_read(&pp->val); */ + v = pp->val; + v = p.val; + /*@ assert rte: index_bound: 0 ≤ i0; */ + /*@ assert rte: index_bound: i0 < 10; */ + /*@ assert rte: index_bound: 0 ≤ i1; */ + /*@ assert rte: index_bound: i1 < 11; */ + v = p.tq[i0][i1].v; + return v; +} + + +[rte] annotating function main +/* Generated by Frama-C */ +struct R { + int v ; +}; +struct P; +struct Q { + int v ; + int id[12] ; + struct P *next ; + struct R tr[13] ; +}; +struct P { + int val ; + struct P *next ; + int id[5] ; + int oth[6][7] ; + struct P *nexts[8][9] ; + struct Q q ; + struct Q tq[10][11] ; + struct P ***znexts ; +}; +int main(void) +{ + struct P ***pppp; + struct P **ppp; + struct P *pp; + struct P p; + int v; + struct Q q; + int *i; + int j; + int i0; + int i1; + int i2; + int i3; + int i4; + struct P *tmp; + struct P np; + struct P *npp; + struct P *z; + i0 = 0; + i1 = 1; + i2 = 2; + i3 = 3; + i4 = 4; + j = 0; + i = & j; + pp = & p; + ppp = & pp; + pppp = & ppp; + p.next = pp; + p.znexts = pppp; + { + /*sequence*/ + tmp = pp; + /*@ assert rte: mem_access: \valid(&p.nexts[i2][i3]); */ + p.nexts[i2][i3] = tmp; + /*@ assert rte: mem_access: \valid(&p.nexts[i0][i1]); */ + p.nexts[i0][i1] = tmp; + } + q.next = pp; + /*@ assert rte: mem_access: \valid(&q.id[i0]); */ + q.id[i0] = 0; + p.q = q; + /*@ assert rte: mem_access: \valid(&p.tq[i0][i1]); */ + p.tq[i0][i1] = q; + /*@ assert rte: mem_access: \valid(&p.id[i1]); */ + /*@ assert rte: mem_access: \valid_read(&p.id[i2]); */ + p.id[i1] = p.id[i2]; + /*@ assert rte: mem_access: \valid(&p.id[i1]); */ + /*@ assert rte: mem_access: \valid_read(&p.id[i3]); */ + p.id[i1] = p.id[i3]; + /*@ assert rte: mem_access: \valid_read(p.next); */ + np = *(p.next); + npp = p.next; + /*@ assert rte: mem_access: \valid_read(&p.id[3]); */ + v = p.id[3]; + /*@ assert rte: mem_access: \valid_read(&pp->id[3]); */ + v = pp->id[3]; + /*@ assert rte: mem_access: \valid_read(i); */ + v = *i; + /*@ assert rte: mem_access: \valid_read(&pp->val); */ + v = pp->val; + /*@ assert rte: mem_access: \valid_read(&pp->id[3]); */ + v = pp->id[3]; + /*@ assert rte: mem_access: \valid_read(&pp->nexts[i0][i1]); */ + z = pp->nexts[i0][i1]; + /*@ assert rte: mem_access: \valid_read(&pp->nexts[i0][i1]); */ + /*@ assert rte: mem_access: \valid_read(&(pp->nexts[i0][i1])->val); */ + v = (pp->nexts[i0][i1])->val; + /*@ assert rte: mem_access: \valid_read(&pp->next); */ + /*@ assert rte: mem_access: \valid_read(&(pp->next)->val); */ + v = (pp->next)->val; + /*@ assert rte: mem_access: \valid_read(&pp->next); */ + /*@ assert rte: mem_access: \valid_read(&(pp->next)->next); */ + /*@ assert rte: mem_access: \valid_read(&((pp->next)->next)->val); */ + v = ((pp->next)->next)->val; + /*@ assert rte: mem_access: \valid_read(&p.nexts[i0][i1]); */ + /*@ assert rte: mem_access: \valid_read(&(p.nexts[i0][i1])->val); */ + v = (p.nexts[i0][i1])->val; + /*@ assert rte: mem_access: \valid_read(&pp->id[i2]); */ + v = pp->id[i2]; + /*@ assert rte: mem_access: \valid_read(&pp->oth[i0][i1]); */ + v = pp->oth[i0][i1]; + /*@ assert rte: mem_access: \valid_read(&p.nexts[i1][i2]); */ + /*@ assert rte: mem_access: \valid_read(i); */ + /*@ assert rte: mem_access: \valid_read(&(p.nexts[i1][i2])->nexts[i3][*i]); + */ + /*@ assert + rte: mem_access: + \valid_read(&((p.nexts[i1][i2])->nexts[i3][*i])->id[i4]); + */ + v = ((p.nexts[i1][i2])->nexts[i3][*i])->id[i4]; + v = p.q.v; + /*@ assert rte: mem_access: \valid_read(&p.q.id[i4]); */ + v = p.q.id[i4]; + /*@ assert rte: mem_access: \valid_read(&p.tq[i3][i1].v); */ + v = p.tq[i3][i1].v; + /*@ assert rte: mem_access: \valid_read(&p.tq[i1][i2].next); */ + /*@ assert + rte: mem_access: \valid_read(&(p.tq[i1][i2].next)->tq[i3][i4].v); + */ + v = (p.tq[i1][i2].next)->tq[i3][i4].v; + /*@ assert rte: mem_access: \valid_read(&pp->tq[i3][i1].v); */ + v = pp->tq[i3][i1].v; + /*@ assert rte: mem_access: \valid_read(p.znexts+i0); */ + /*@ assert rte: mem_access: \valid_read(*(p.znexts+i0)+i1); */ + /*@ assert rte: mem_access: \valid_read(&(*(*(p.znexts+i0)+i1)+i2)->val); + */ + v = (*(*(p.znexts + i0) + i1) + i2)->val; + /*@ assert rte: mem_access: \valid_read(&p.tq[i0][i1]); */ + q = p.tq[i0][i1]; + /*@ assert rte: mem_access: \valid_read(&p.tq[i0][i1].tr[i2].v); */ + v = p.tq[i0][i1].tr[i2].v; + /*@ assert rte: mem_access: \valid_read(&pp->val); */ + v = pp->val; + v = p.val; + /*@ assert rte: mem_access: \valid_read(&p.tq[i0][i1].v); */ + v = p.tq[i0][i1].v; + return v; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/rte/precond2.c frama-c-20150201+sodium+dfsg/tests/rte/precond2.c --- frama-c-20140301+neon+dfsg/tests/rte/precond2.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/precond2.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,10 +1,5 @@ /* run.config - - - OPT: -load-script tests/rte/compute_annot/compute_annot.ml -journal-disable - - OPT: -load-script tests/rte/rte_api/rte_api.ml -journal-disable */ int global = 15; diff -Nru frama-c-20140301+neon+dfsg/tests/rte/rte_api/rte_get_annot.ml frama-c-20150201+sodium+dfsg/tests/rte/rte_api/rte_get_annot.ml --- frama-c-20140301+neon+dfsg/tests/rte/rte_api/rte_get_annot.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/rte/rte_api/rte_get_annot.ml 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,56 @@ +open Cil +open Cil_types + +let print () = + File.pretty_ast (); + Kernel.log "================================" + +let get_rte_annotations = + Dynamic.get ~plugin:"RteGen" "get_rte_annotations" + (Datatype.func + Cil_datatype.Stmt.ty + (let module L = Datatype.List(Cil_datatype.Code_annotation) in L.ty)) + +let fetch_stmts_visitor () = object + inherit nopCilVisitor + val mutable stmts : stmt list = [] + method fetch_stmts () = List.rev stmts + method vstmt stmt = stmts <- stmt :: stmts ; DoChildren +end + +let get_stmts kf = + match kf.fundec with + | Definition (f,_) -> + let vis = fetch_stmts_visitor () in + let _ = visitCilFunction (vis :> cilVisitor) f in + vis#fetch_stmts () + | _ -> [] + +let show_rte_of_kf kf = + let is_annot = ref false in + Kernel.log "Rte-generated annotations for function %a" + Kernel_function.pretty kf ; + List.iter + (fun stmt -> + let lannot = get_rte_annotations stmt in + match lannot with + | [] -> () + | lannot -> + is_annot := true; + Kernel.log "For Statement %a" + (Printer.without_annot Printer.pp_stmt) stmt; + List.iter + (fun a -> Kernel.log "%a" Printer.pp_code_annotation a) + lannot) + (get_stmts kf); + if not !is_annot then Kernel.log "None" + +let main () = + Ast.compute () ; + Kernel.SignedOverflow.on (); + let do_rte = !Db.RteGen.do_rte in + Globals.Functions.iter (fun kf -> do_rte kf); + print () ; + Globals.Functions.iter show_rte_of_kf + +let () = Db.Main.extend main diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/load_one.ml frama-c-20150201+sodium+dfsg/tests/saveload/load_one.ml --- frama-c-20140301+neon+dfsg/tests/saveload/load_one.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/load_one.ml 2015-05-28 08:53:24.000000000 +0000 @@ -15,7 +15,7 @@ (* testing Project.create_by_copy *) let main2 () = !Db.Value.compute (); - let prj = Project.create_by_copy "copy" in + let prj = Project.create_by_copy ~last:false "copy" in Format.printf "INIT AST@."; File.pretty_ast (); Format.printf "COPY AST@."; diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/multi_project.ml frama-c-20150201+sodium+dfsg/tests/saveload/multi_project.ml --- frama-c-20140301+neon+dfsg/tests/saveload/multi_project.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/multi_project.ml 2015-05-28 08:53:24.000000000 +0000 @@ -5,7 +5,7 @@ (fun () -> assert (test (Kernel.Files.get ()) [])) () let main () = - ignore (Project.create_by_copy "foo"); + ignore (Project.create_by_copy ~last:false "foo"); ignore (Project.create "foobar"); Project.save_all "foo.sav"; check "foo" (<>); @@ -14,7 +14,7 @@ Kernel.Files.set []; Project.load_all "foo.sav"; Extlib.safe_remove "foo.sav"; - ignore (Project.create_by_copy "bar"); + ignore (Project.create_by_copy ~last:false "bar"); assert (Project.equal (Project.current ()) (Project.from_unique_name "default")); check "foo" (<>); diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/basic.1.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/basic.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/basic.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/basic.1.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] warning: ignoring source files specified on the command line while loading a global initial context. +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int i; + int j; + i = 10; + /*@ assert i ≡ 10; */ ; + while (1) { + int tmp; + { + /*sequence*/ + tmp = i; + /*@ assert Value: signed_overflow: -2147483648 ≤ i-1; */ + i --; + ; + } + if (! tmp) break; + } + j = 5; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/basic.2.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/basic.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/basic.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/basic.2.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1 @@ +[kernel] warning: ignoring source files specified on the command line while loading a global initial context. diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/basic.3.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/basic.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/basic.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/basic.3.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,2 @@ +[kernel] warning: ignoring source files specified on the command line while loading a global initial context. +unknown (Test tried to verify but could not decide) diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/basic.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/basic.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/basic.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/basic.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,2 @@ +[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 -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/basic_sav.1.res frama-c-20150201+sodium+dfsg/tests/saveload/oracle/basic_sav.1.res --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/basic_sav.1.res 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/basic_sav.1.res 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/saveload/basic.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/saveload/basic.i:18:[value] Assertion got status valid. +tests/saveload/basic.i:19:[value] entering loop for the first time +tests/saveload/basic.i:19:[kernel] warning: signed overflow. assert -2147483648 ≤ i-1; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ [-2147483648..2147483646] + j ∈ {5} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; j; tmp; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/basic_sav.res frama-c-20150201+sodium+dfsg/tests/saveload/oracle/basic_sav.res --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/basic_sav.res 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/basic_sav.res 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/saveload/basic.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/saveload/basic.i:18:[value] Assertion got status valid. +tests/saveload/basic.i:19:[value] entering loop for the first time +tests/saveload/basic.i:19:[kernel] warning: signed overflow. assert -2147483648 ≤ i-1; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ [-2147483648..2147483646] + j ∈ {5} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; j; tmp; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/bool.1.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/bool.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/bool.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/bool.1.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1 @@ +[kernel] warning: ignoring source files specified on the command line while loading a global initial context. diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/bool.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/bool.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/bool.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/bool.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,37 @@ +[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 +[from] Computing for function printf <-main +[from] Done for function printf +tests/saveload/bool.c:27:[from] warning: variadic call detected. Using only 1 argument(s). +tests/saveload/bool.c:29:[from] warning: variadic call detected. Using only 1 argument(s). +tests/saveload/bool.c:31:[from] warning: variadic call detected. Using only 1 argument(s). +tests/saveload/bool.c:33:[from] warning: variadic call detected. Using only 1 argument(s). +tests/saveload/bool.c:35:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM \nothing +[from] Function printf: + S___fc_stdout[0] + FROM "%d\n"; "%d\n"; "%d,%d\n"[bits 0 to 55]; "%d\n"; + "%d\n" (and SELF) + \result FROM ANYTHING(origin:Unknown) +[from] Function main: + x FROM \nothing + y FROM \nothing + S___fc_stdout[0] + FROM "%d\n"; "%d\n"; "%d,%d\n"[bits 0 to 55]; "%d\n"; + "%d\n" (and SELF) + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function f: + i; j; tmp; __retres +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function main: + x; y; S___fc_stdout[0] +[inout] Inputs for function main: + x; y; "%d\n"; "%d\n"; "%d,%d\n"[bits 0 to 55]; "%d\n"; "%d\n" diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/bool_sav.res frama-c-20150201+sodium+dfsg/tests/saveload/oracle/bool_sav.res --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/bool_sav.res 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/bool_sav.res 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,103 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/saveload/bool.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + __FC_errno ∈ [--..--] + __fc_stdin ∈ {{ NULL ; &S___fc_stdin[0] }} + __fc_stdout ∈ {{ NULL ; &S___fc_stdout[0] }} + __fc_fopen[0..511] ∈ {0} + _p__fc_fopen ∈ {{ &__fc_fopen[0] }} + x ∈ {0} + y ∈ {0} + S___fc_stdin[0]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof} ∈ + [--..--] + [0].[bits 80 to 95] ∈ UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ {{ NULL ; &S___fc_inode_0_S___fc_stdin[0] }} + [0].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_0_S___fc_stdin[0] }} + {[0].__fc_real_data_max_size; [1]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof}} ∈ + [--..--] + [1].[bits 80 to 95] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ {{ NULL ; &S___fc_inode_1_S___fc_stdin[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdin[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + S___fc_inode_0_S___fc_stdin[0..1] ∈ [--..--] + S___fc_real_data_0_S___fc_stdin[0..1] ∈ [--..--] + S___fc_inode_1_S___fc_stdin[0..1] ∈ [--..--] + S___fc_real_data_1_S___fc_stdin[0..1] ∈ [--..--] + S___fc_stdout[0]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof} ∈ + [--..--] + [0].[bits 80 to 95] ∈ UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL ; &S___fc_inode_0_S___fc_stdout[0] }} + [0].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_0_S___fc_stdout[0] }} + {[0].__fc_real_data_max_size; [1]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof}} ∈ + [--..--] + [1].[bits 80 to 95] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stdout[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdout[0] }} + [1].__fc_real_data_max_size ∈ [--..--] + S___fc_inode_0_S___fc_stdout[0..1] ∈ [--..--] + S___fc_real_data_0_S___fc_stdout[0..1] ∈ [--..--] + S___fc_inode_1_S___fc_stdout[0..1] ∈ [--..--] + S___fc_real_data_1_S___fc_stdout[0..1] ∈ [--..--] +[value] computing for function f <- main. + Called from tests/saveload/bool.c:25. +tests/saveload/bool.c:17:[value] Assertion got status valid. +tests/saveload/bool.c:18:[value] entering loop for the first time +tests/saveload/bool.c:18:[kernel] warning: signed overflow. assert -2147483648 ≤ i-1; +[value] Recording results for f +[value] Done for function f +[value] computing for function printf <- main. + Called from tests/saveload/bool.c:27. +[value] using specification for function printf +[value] Done for function printf +[value] computing for function printf <- main. + Called from tests/saveload/bool.c:29. +[value] Done for function printf +[value] computing for function printf <- main. + Called from tests/saveload/bool.c:31. +[value] Done for function printf +[value] computing for function printf <- main. + Called from tests/saveload/bool.c:33. +[value] Done for function printf +[value] computing for function printf <- main. + Called from tests/saveload/bool.c:35. +[value] Done for function printf +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + i ∈ [-2147483648..2147483646] + j ∈ {5} + __retres ∈ {0} +[value] Values at end of function main: + x ∈ {1} + y ∈ {2} + S___fc_stdout[0]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof} ∈ + [--..--] + [0].[bits 80 to 95] ∈ [--..--] or UNINITIALIZED + [0].__fc_flags ∈ [--..--] + [0].__fc_inode ∈ + {{ NULL + [--..--] ; &S___fc_inode_0_S___fc_stdout[0] }} + [0].__fc_real_data ∈ + {{ NULL + [--..--] ; &S___fc_real_data_0_S___fc_stdout[0] }} + {[0].__fc_real_data_max_size; [1]{.__fc_stdio_id; .__fc_position; .__fc_error; .__fc_eof}} ∈ + [--..--] + [1].[bits 80 to 95] ∈ UNINITIALIZED + [1].__fc_flags ∈ [--..--] + [1].__fc_inode ∈ + {{ NULL ; &S___fc_inode_1_S___fc_stdout[0] }} + [1].__fc_real_data ∈ + {{ NULL ; &S___fc_real_data_1_S___fc_stdout[0] }} + [1].__fc_real_data_max_size ∈ [--..--] diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/callbacks_initial.res frama-c-20150201+sodium+dfsg/tests/saveload/oracle/callbacks_initial.res --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/callbacks_initial.res 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/callbacks_initial.res 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,57 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/saveload/callbacks.i (no preprocessing) +[value] Analyzing a complete application starting at main1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] computing for function g1 <- main1. + Called from tests/saveload/callbacks.i:25. +[value] computing for function f <- g1 <- main1. + Called from tests/saveload/callbacks.i:16. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for g1 +[from] Computing for function g1 +[from] Done for function g1 +[value] Done for function g1 +[value] computing for function g2 <- main1. + Called from tests/saveload/callbacks.i:26. +[value] computing for function f <- g2 <- main1. + Called from tests/saveload/callbacks.i:21. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for g2 +[from] Computing for function g2 +[from] Done for function g2 +[value] Done for function g2 +[value] Recording results for main1 +[from] Computing for function main1 +[from] Done for function main1 +[value] done for function main1 +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f at tests/saveload/callbacks.i:16 (by g1): + x FROM p +[from] call to f at tests/saveload/callbacks.i:21 (by g2): + y FROM p +[from] call to g1 at tests/saveload/callbacks.i:25 (by main1): + x FROM \nothing +[from] call to g2 at tests/saveload/callbacks.i:26 (by main1): + y FROM \nothing +[from] entry point: + x FROM \nothing + y FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[inout] Out (internal) for function f: + x; y +[inout] Out (internal) for function g1: + x +[inout] Out (internal) for function g2: + y +[inout] Out (internal) for function main1: + x; y diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/callbacks.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/callbacks.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/callbacks.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/callbacks.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,111 @@ +[kernel] warning: ignoring source files specified on the command line while loading a global initial context. +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] computing for function g1 <- main2. + Called from tests/saveload/callbacks.i:30. +[value] computing for function f <- g1 <- main2. + Called from tests/saveload/callbacks.i:16. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for g1 +[from] Computing for function g1 +[from] Done for function g1 +[value] Done for function g1 +[value] computing for function g2 <- main2. + Called from tests/saveload/callbacks.i:31. +[value] computing for function f <- g2 <- main2. + Called from tests/saveload/callbacks.i:21. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for g2 +[from] Computing for function g2 +[from] Done for function g2 +[value] Done for function g2 +[value] Recording results for main2 +[from] Computing for function main2 +[from] Done for function main2 +[value] done for function main2 +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f at tests/saveload/callbacks.i:16 (by g1): + x FROM p +[from] call to f at tests/saveload/callbacks.i:21 (by g2): + y FROM p +[from] call to g1 at tests/saveload/callbacks.i:30 (by main2): + x FROM \nothing +[from] call to g2 at tests/saveload/callbacks.i:31 (by main2): + y FROM \nothing +[from] entry point: + x FROM \nothing + y FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[inout] Out (internal) for function f: + x; y +[inout] Out (internal) for function g1: + x +[inout] Out (internal) for function g2: + y +[inout] Out (internal) for function main2: + x; y +[value] Analyzing a complete application starting at main3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] computing for function g1 <- main3. + Called from tests/saveload/callbacks.i:35. +[value] computing for function f <- g1 <- main3. + Called from tests/saveload/callbacks.i:16. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for g1 +[from] Computing for function g1 +[from] Done for function g1 +[value] Done for function g1 +[value] computing for function g2 <- main3. + Called from tests/saveload/callbacks.i:36. +[value] computing for function f <- g2 <- main3. + Called from tests/saveload/callbacks.i:21. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for g2 +[from] Computing for function g2 +[from] Done for function g2 +[value] Done for function g2 +[value] Recording results for main3 +[from] Computing for function main3 +[from] Done for function main3 +[value] done for function main3 +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f at tests/saveload/callbacks.i:16 (by g1): + x FROM p +[from] call to f at tests/saveload/callbacks.i:21 (by g2): + y FROM p +[from] call to g1 at tests/saveload/callbacks.i:35 (by main3): + x FROM \nothing +[from] call to g2 at tests/saveload/callbacks.i:36 (by main3): + y FROM \nothing +[from] entry point: + x FROM \nothing + y FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[inout] Out (internal) for function f: + x; y +[inout] Out (internal) for function g1: + x +[inout] Out (internal) for function g2: + y +[inout] Out (internal) for function main3: + x; y diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/deps.1.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/deps.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/deps.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/deps.1.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,2 @@ +[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 -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/deps.2.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/deps.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/deps.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/deps.2.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,2 @@ +[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 -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/deps.3.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/deps.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/deps.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/deps.3.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1 @@ +[kernel] warning: ignoring source files specified on the command line while loading a global initial context. diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/deps.4.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/deps.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/deps.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/deps.4.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,3 @@ +[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 -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/deps.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/deps.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/deps.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/deps.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1 @@ +[kernel] warning: ignoring source files specified on the command line while loading a global initial context. diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/deps_sav.res frama-c-20150201+sodium+dfsg/tests/saveload/oracle/deps_sav.res --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/deps_sav.res 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/deps_sav.res 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/saveload/deps.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/saveload/deps.i:20:[value] entering loop for the first time +tests/saveload/deps.i:20:[kernel] warning: signed overflow. assert -2147483648 ≤ i-1; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ [-2147483648..2147483646] + j ∈ {5} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; j; tmp; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/isset.1.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/isset.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/isset.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/isset.1.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1 @@ +[kernel] warning: ignoring source files specified on the command line while loading a global initial context. diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/isset.2.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/isset.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/isset.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/isset.2.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1 @@ +[kernel] warning: ignoring source files specified on the command line while loading a global initial context. diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/isset.3.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/isset.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/isset.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/isset.3.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1 @@ +[kernel] warning: ignoring source files specified on the command line while loading a global initial context. diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/isset.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/isset.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/isset.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/isset.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1 @@ +[kernel] warning: ignoring source files specified on the command line while loading a global initial context. diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/isset_sav.res frama-c-20150201+sodium+dfsg/tests/saveload/oracle/isset_sav.res --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/isset_sav.res 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/isset_sav.res 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1 @@ +tests/saveload/isset.c:13:[kernel] warning: signed overflow. assert -2147483648 ≤ i-1; diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/load_one.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/load_one.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/load_one.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/load_one.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,84 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/saveload/load_one.i (no preprocessing) +[sparecode] remove unused code... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} +tests/saveload/load_one.i:20:[value] Assertion got status valid. +[value] computing for function f <- main. + Called from tests/saveload/load_one.i:22. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/saveload/load_one.i:23. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/saveload/load_one.i:24. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[pdg] done for function main +[pdg] computing for function f +[pdg] done for function f +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +[kernel] warning: clearing dangling project pointers in project "default" +[kernel] warning: clearing dangling project pointers in project "default 2" +[sparecode] remove unused code... +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +INIT AST +/* Generated by Frama-C */ +int G; +int f(int x, int y) +{ + G = y; + return x; +} + +int main(void) +{ + int a; + int b; + a = 1; + b = 1; + /*@ assert a ≡ 1; */ ; + f(0,0); + a = f(a,b); + a = f(G + 1,b); + G = 0; + return a; +} + + +COPY AST +/* Generated by Frama-C */ +int G; +int f(int x, int y) +{ + G = y; + return x; +} + +int main(void) +{ + int a; + int b; + a = 1; + b = 1; + /*@ assert a ≡ 1; */ ; + f(0,0); + a = f(a,b); + a = f(G + 1,b); + G = 0; + return a; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/multi_project.1.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/multi_project.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/multi_project.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/multi_project.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/saveload/multi_project.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/saveload/multi_project.i:14. +[value] Recording results for f +[value] Done for function f +tests/saveload/multi_project.i:15:[value] Assertion got status valid. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + __retres ∈ {4} +[value] Values at end of function main: + x ∈ {2} + y ∈ {4} + __retres ∈ {8} +[kernel] Checking "foo" +[kernel] Checking "foobar" +[kernel] Checking "default" +[kernel] Checking "foo" +[kernel] Checking "foobar" +[kernel] Checking "default" +[kernel] Checking "bar" diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/multi_project.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/multi_project.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/multi_project.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/multi_project.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1 @@ +[kernel] warning: ignoring source files specified on the command line while loading a global initial context. diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/multi_project_sav.res frama-c-20150201+sodium+dfsg/tests/saveload/oracle/multi_project_sav.res --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/multi_project_sav.res 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/multi_project_sav.res 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,37 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/saveload/multi_project.i (no preprocessing) +[scf] beginning constant propagation +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/saveload/multi_project.i:14. +[value] Recording results for f +[value] Done for function f +tests/saveload/multi_project.i:15:[value] Assertion got status valid. +[value] Recording results for main +[value] done for function main +/* Generated by Frama-C */ +int f(int x) +{ + int __retres; + __retres = 4; + return __retres; +} + +int main(void) +{ + int __retres; + int x; + int y; + x = 2; + y = f(2); + /*@ assert y ≡ 4; */ ; + __retres = 8; + return __retres; +} + + +[scf] constant propagation done diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/segfault_datatypes.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/segfault_datatypes.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/segfault_datatypes.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/segfault_datatypes.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,2 @@ +[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 -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/segfault_datatypes_sav.res frama-c-20150201+sodium+dfsg/tests/saveload/oracle/segfault_datatypes_sav.res --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/segfault_datatypes_sav.res 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/segfault_datatypes_sav.res 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/saveload/segfault_datatypes.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/saveload/segfault_datatypes.i:13:[value] entering loop for the first time +tests/saveload/segfault_datatypes.i:13:[kernel] warning: signed overflow. assert -2147483648 ≤ i-1; +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ [-2147483648..2147483646] + j ∈ {5} + __retres ∈ {0} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i; j; tmp; __retres +[inout] Inputs for function main: + \nothing diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/sparecode.res.oracle frama-c-20150201+sodium+dfsg/tests/saveload/oracle/sparecode.res.oracle --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/sparecode.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/sparecode.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1 @@ +[kernel] warning: ignoring source files specified on the command line while loading a global initial context. diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/sparecode_sav.res frama-c-20150201+sodium+dfsg/tests/saveload/oracle/sparecode_sav.res --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/sparecode_sav.res 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/sparecode_sav.res 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,60 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/saveload/sparecode.i (no preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} +[value] computing for function f <- main. + Called from tests/saveload/sparecode.i:16. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/saveload/sparecode.i:17. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/saveload/sparecode.i:18. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f +[pdg] done for function f +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int f_slice_1(int x, int y) +{ + G = y; + return x; +} + +int main(void) +{ + int a; + int b; + a = 1; + b = 1; + f_slice_1(a,b); + a = f_slice_1(G + 1,b); + return a; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/saveload/oracle/status_sav.res frama-c-20150201+sodium+dfsg/tests/saveload/oracle/status_sav.res --- frama-c-20140301+neon+dfsg/tests/saveload/oracle/status_sav.res 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/saveload/oracle/status_sav.res 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,3 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/saveload/basic.i (no preprocessing) +unknown (Test tried to verify but could not decide) diff -Nru frama-c-20140301+neon+dfsg/tests/scope/oracle/bts383.res.oracle frama-c-20150201+sodium+dfsg/tests/scope/oracle/bts383.res.oracle --- frama-c-20140301+neon+dfsg/tests/scope/oracle/bts383.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/scope/oracle/bts383.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,223 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/scope/bts383.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + v ∈ {0} +tests/scope/bts383.c:56:[kernel] warning: out of bounds read. assert \valid_read(p+1); +tests/scope/bts383.c:57:[kernel] warning: out of bounds read. assert \valid_read(p+1); +[value] computing for function if1 <- main. + Called from tests/scope/bts383.c:58. +tests/scope/bts383.c:10:[kernel] warning: out of bounds read. assert \valid_read(p); +tests/scope/bts383.c:11:[kernel] warning: out of bounds read. assert \valid_read(p); +[value] Recording results for if1 +[value] Done for function if1 +[value] computing for function if2 <- main. + Called from tests/scope/bts383.c:59. +tests/scope/bts383.c:15:[kernel] warning: out of bounds read. assert \valid_read(p); +tests/scope/bts383.c:16:[kernel] warning: out of bounds read. assert \valid_read(p); +[value] Recording results for if2 +[value] Done for function if2 +[value] computing for function loop1 <- main. + Called from tests/scope/bts383.c:60. +tests/scope/bts383.c:20:[kernel] warning: out of bounds read. assert \valid_read(p); +tests/scope/bts383.c:21:[value] entering loop for the first time +tests/scope/bts383.c:22:[kernel] warning: out of bounds read. assert \valid_read(p); +[value] Recording results for loop1 +[value] Done for function loop1 +[value] computing for function loop2 <- main. + Called from tests/scope/bts383.c:61. +tests/scope/bts383.c:27:[value] entering loop for the first time +tests/scope/bts383.c:28:[kernel] warning: out of bounds read. assert \valid_read(p); +tests/scope/bts383.c:30:[kernel] warning: out of bounds read. assert \valid_read(p); +[value] Recording results for loop2 +[value] Done for function loop2 +[value] computing for function out_string <- main. + Called from tests/scope/bts383.c:62. +tests/scope/bts383.c:35:[value] entering loop for the first time +tests/scope/bts383.c:35:[kernel] warning: out of bounds read. assert \valid_read(value); +tests/scope/bts383.c:36:[kernel] warning: out of bounds read. assert \valid_read(value); +[value] computing for function out_char <- out_string <- main. + Called from tests/scope/bts383.c:36. +tests/scope/bts383.c:36:[kernel] warning: Neither code nor specification for function out_char, generating default assigns from the prototype +[value] using specification for function out_char +[value] Done for function out_char +[value] computing for function out_char <- out_string <- main. + Called from tests/scope/bts383.c:36. +[value] Done for function out_char +[value] computing for function out_char <- out_string <- main. + Called from tests/scope/bts383.c:36. +[value] Done for function out_char +[value] computing for function out_char <- out_string <- main. + Called from tests/scope/bts383.c:36. +[value] Done for function out_char +[value] Recording results for out_string +[value] Done for function out_string +[value] computing for function fstruct <- main. + Called from tests/scope/bts383.c:63. +tests/scope/bts383.c:41:[kernel] warning: out of bounds write. assert \valid(&ps->a); +tests/scope/bts383.c:42:[kernel] warning: out of bounds write. assert \valid(&ps->b); +tests/scope/bts383.c:43:[kernel] warning: out of bounds write. assert \valid(&ps->a); +tests/scope/bts383.c:43:[kernel] warning: out of bounds read. assert \valid_read(&ps->b); +tests/scope/bts383.c:44:[kernel] warning: out of bounds write. assert \valid(&ps->b); +tests/scope/bts383.c:44:[kernel] warning: out of bounds read. assert \valid_read(&ps->a); +tests/scope/bts383.c:45:[kernel] warning: out of bounds read. assert \valid_read(&ps->a); +tests/scope/bts383.c:45:[kernel] warning: out of bounds read. assert \valid_read(&ps->b); +tests/scope/bts383.c:47:[kernel] warning: out of bounds write. assert \valid(&ps->a); +tests/scope/bts383.c:48:[kernel] warning: out of bounds write. assert \valid(&ps->b); +tests/scope/bts383.c:49:[kernel] warning: out of bounds write. assert \valid(&ps->a); +tests/scope/bts383.c:49:[kernel] warning: out of bounds read. assert \valid_read(&ps->b); +tests/scope/bts383.c:50:[kernel] warning: out of bounds write. assert \valid(&ps->b); +tests/scope/bts383.c:50:[kernel] warning: out of bounds read. assert \valid_read(&ps->a); +tests/scope/bts383.c:51:[kernel] warning: out of bounds read. assert \valid_read(&ps->a); +tests/scope/bts383.c:51:[kernel] warning: out of bounds read. assert \valid_read(&ps->b); +[value] Recording results for fstruct +[value] Done for function fstruct +tests/scope/bts383.c:63:[kernel] warning: signed overflow. assert x+tmp ≤ 2147483647; + (tmp from fstruct(ps + 1)) +[value] Recording results for main +[value] done for function main +[scope:rm_asserts] removing 12 assertion(s) +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function fstruct: + ps ∈ {{ &S_ps[2] }} + x ∈ {20} + S_ps[0] ∈ [--..--] + [1..2]{.a; .b} ∈ {5} +[value] Values at end of function if1: + v ∈ [--..--] +[value] Values at end of function if2: + v ∈ [--..--] + __retres ∈ [--..--] +[value] Values at end of function loop1: + v ∈ [--..--] + i ∈ [0..2147483647] + n ∈ [--..--] +[value] Values at end of function loop2: + v ∈ [--..--] + i ∈ [0..2147483647] + __retres ∈ [--..--] +[value] Values at end of function out_string: + value ∈ {{ &S_p + {4; 5; 6; 7; 8; 9; 10; 11} }} +[value] Values at end of function main: + v ∈ [--..--] + x ∈ [-2147483628..2147483647] + S_ps[0] ∈ [--..--] + [1..2]{.a; .b} ∈ {5} +/* Generated by Frama-C */ +struct __anonstruct_Tstruct_1 { + int a ; + int b ; +}; +typedef struct __anonstruct_Tstruct_1 Tstruct; +int v; +void if1(int *p) +{ + /*@ assert Value: mem_access: \valid_read(p); */ + if (*p > 0) + v = *p; + return; +} + +int if2(int c, int *p) +{ + int __retres; + if (c) + /*@ assert Value: mem_access: \valid_read(p); */ + v = *p; + /*@ assert Value: mem_access: \valid_read(p); */ + __retres = *p; + return __retres; +} + +void loop1(int *p) +{ + int i; + int n; + /*@ assert Value: mem_access: \valid_read(p); */ + n = *p; + i = 0; + while (i < n) { + v = *p; + i ++; + } + return; +} + +int loop2(int n, int *p) +{ + int __retres; + int i; + i = 0; + while (i < n) { + /*@ assert Value: mem_access: \valid_read(p); */ + v = *p; + i ++; + } + /*@ assert Value: mem_access: \valid_read(p); */ + __retres = *p; + return __retres; +} + +/*@ assigns \nothing; */ +extern void out_char(char c); + +void out_string(char const *value) +{ + while (1) { + /*@ assert Value: mem_access: \valid_read(value); */ + if (! *value) break; + out_char(*value); + value ++; + } + return; +} + +int fstruct(Tstruct *ps) +{ + int x; + /*@ assert Value: mem_access: \valid(&ps->a); */ + ps->a = 3; + /*@ assert Value: mem_access: \valid(&ps->b); */ + ps->b = 5; + /*@ assert Value: mem_access: \valid_read(&ps->b); */ + ps->a = ps->b; + /*@ assert Value: mem_access: \valid_read(&ps->a); */ + ps->b = ps->a; + x = ps->a + ps->b; + ps ++; + /*@ assert Value: mem_access: \valid(&ps->a); */ + ps->a = 3; + /*@ assert Value: mem_access: \valid(&ps->b); */ + ps->b = 5; + /*@ assert Value: mem_access: \valid_read(&ps->b); */ + ps->a = ps->b; + /*@ assert Value: mem_access: \valid_read(&ps->a); */ + ps->b = ps->a; + x += ps->a + ps->b; + return x; +} + +int main(int *p, Tstruct *ps) +{ + int x; + int tmp; + /*@ assert Value: mem_access: \valid_read(p+1); */ + x = *(p + 1); + v = *(p + 1); + if1(p + 1); + if2(x,p + 1); + loop1(p + 1); + loop2(x,p + 1); + out_string((char const *)(p + 1)); + { + /*sequence*/ + tmp = fstruct(ps + 1); + /*@ assert Value: signed_overflow: x+tmp ≤ 2147483647; */ + x += tmp; + } + return x; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/scope/oracle/bts971.res.oracle frama-c-20150201+sodium+dfsg/tests/scope/oracle/bts971.res.oracle --- frama-c-20140301+neon+dfsg/tests/scope/oracle/bts971.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/scope/oracle/bts971.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,68 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/scope/bts971.c (with preprocessing) +=== Tests for Scope.Defs +--- Intraprocedural mode (-scope-no-defs-interproc) +tests/scope/bts971.c:10:[kernel] warning: signed overflow. assert v+1 ≤ 2147483647; +tests/scope/bts971.c:18:[kernel] warning: signed overflow. assert v+2 ≤ 2147483647; +tests/scope/bts971.c:19:[kernel] warning: signed overflow. assert v+3 ≤ 2147483647; +Current program point = first one in function 'f1' +* Defs for (v) at current program point= +no Defs found + +Current program point = first one in function 'g1' +* Defs for (v) at current program point= +no Defs found + +Current program point = 2d one in function 'g1' +* Defs for (v) at current program point= +tests/scope/bts971.c:18: v += 2; + +Current program point = first one in function 'f' +* Defs for (v) at current program point= +no Defs found + +--- Interprocedural mode (-scope-defs-interproc) +Current program point = first one in function 'f1' +* Defs for (v) at current program point= +tests/scope/bts971.c:10: v ++; +tests/scope/bts971.c:14: f1(); +tests/scope/bts971.c:19: v += 3; +tests/scope/bts971.c:23: g1(); +tests/scope/bts971.c:27: v += 0; +tests/scope/bts971.c:29: f(); +tests/scope/bts971.c:30: g(); + +Current program point = first one in function 'g1' +* Defs for (v) at current program point= +tests/scope/bts971.c:10: v ++; +tests/scope/bts971.c:14: f1(); +tests/scope/bts971.c:19: v += 3; +tests/scope/bts971.c:23: g1(); +tests/scope/bts971.c:27: v += 0; +tests/scope/bts971.c:29: f(); +tests/scope/bts971.c:30: g(); + +Current program point = 2d one in function 'g1' +* Defs for (v) at current program point= +tests/scope/bts971.c:18: v += 2; + +Current program point = first one in function 'f' +* Defs for (v) at current program point= +tests/scope/bts971.c:10: v ++; +tests/scope/bts971.c:14: f1(); +tests/scope/bts971.c:19: v += 3; +tests/scope/bts971.c:23: g1(); +tests/scope/bts971.c:27: v += 0; +tests/scope/bts971.c:29: f(); +tests/scope/bts971.c:30: g(); + +=== Tests for Scope.Defs +--- Intraprocedural mode (-scope-no-defs-interproc) +* Defs for (t[1].a) at current program point= +tests/scope/bts971.c:48: init(); + +--- Interprocedural mode (-scope-defs-interproc) +* Defs for (t[1].a) at current program point= +tests/scope/bts971.c:43: t[1].a = 1; +tests/scope/bts971.c:48: init(); + diff -Nru frama-c-20140301+neon+dfsg/tests/scope/oracle/no-effect.res.oracle frama-c-20150201+sodium+dfsg/tests/scope/oracle/no-effect.res.oracle --- frama-c-20140301+neon+dfsg/tests/scope/oracle/no-effect.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/scope/oracle/no-effect.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,34 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/scope/no-effect.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/scope/no-effect.i:12:[value] entering loop for the first time +tests/scope/no-effect.i:13:[kernel] warning: out of bounds read. assert \valid_read(&(p1+1)->v); +tests/scope/no-effect.i:18:[kernel] warning: out of bounds read. assert \valid_read(&(p1+1)->v); +[value] Recording results for main +[value] done for function main +[scope:rm_asserts] removing 1 assertion(s) +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + NON TERMINATING FUNCTION +/* Generated by Frama-C */ +struct __anonstruct_tt_1 { + int v ; +}; +typedef struct __anonstruct_tt_1 tt; +void main(tt const *p1) +{ + while (1) + /*@ assert Value: mem_access: \valid_read(&(p1+1)->v); */ + switch ((p1 + 1)->v) { + case 1: case 2: case 3: case 4: ; + if ((p1 + 1)->v) ; + break; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/scope/oracle/scope.1.res.oracle frama-c-20150201+sodium+dfsg/tests/scope/oracle/scope.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/scope/oracle/scope.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/scope/oracle/scope.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/scope/scope.c (with preprocessing) +[value] Analyzing a complete application starting at f2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ [--..--] + S1 ∈ {0} + S2 ∈ {0} + T[0..99] ∈ {0} +[value] Recording results for f2 +[value] done for function f2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f2: + x ∈ {1; 2} + y ∈ {3; 4} diff -Nru frama-c-20140301+neon+dfsg/tests/scope/oracle/scope.2.res.oracle frama-c-20150201+sodium+dfsg/tests/scope/oracle/scope.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/scope/oracle/scope.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/scope/oracle/scope.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/scope/scope.c (with preprocessing) +[value] Analyzing a complete application starting at loop +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ [--..--] + S1 ∈ {0} + S2 ∈ {0} + T[0..99] ∈ {0} +tests/scope/scope.c:67:[value] entering loop for the first time +tests/scope/scope.c:68:[kernel] warning: signed overflow. assert a+1 ≤ 2147483647; +tests/scope/scope.c:69:[kernel] warning: signed overflow. assert b+1 ≤ 2147483647; +tests/scope/scope.c:70:[kernel] warning: signed overflow. assert s+1 ≤ 2147483647; +tests/scope/scope.c:75:[kernel] warning: signed overflow. assert a+1 ≤ 2147483647; +tests/scope/scope.c:76:[kernel] warning: signed overflow. assert b+1 ≤ 2147483647; +tests/scope/scope.c:77:[kernel] warning: signed overflow. assert i+1 ≤ 2147483647; +[value] Recording results for loop +[value] done for function loop +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function loop: + a ∈ [1..2147483647] + b ∈ [1..2147483647] + i ∈ [1..2147483647] + s ∈ [0..2147483647] diff -Nru frama-c-20140301+neon+dfsg/tests/scope/oracle/scope.res.oracle frama-c-20150201+sodium+dfsg/tests/scope/oracle/scope.res.oracle --- frama-c-20140301+neon+dfsg/tests/scope/oracle/scope.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/scope/oracle/scope.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,50 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/scope/scope.c (with preprocessing) +[kernel] Parsing share/builtin.c (with preprocessing) +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Frama_C_entropy_source ∈ {0} + S1 ∈ {0} + S2 ∈ {0} + T[0..99] ∈ {0} +[value] computing for function Frama_C_interval <- f. + Called from tests/scope/scope.c:32. +share/builtin.h:46:[value] Function Frama_C_interval: precondition got status valid. +[value] computing for function Frama_C_update_entropy <- Frama_C_interval <- f. + Called from share/builtin.c:44. +[value] using specification for function Frama_C_update_entropy +[value] Done for function Frama_C_update_entropy +share/builtin.h:47:[value] Function Frama_C_interval: postcondition got status valid. +[value] Recording results for Frama_C_interval +[value] Done for function Frama_C_interval +[value] computing for function Frama_C_interval <- f. + Called from tests/scope/scope.c:26. +[value] computing for function Frama_C_update_entropy <- Frama_C_interval <- f. + Called from share/builtin.c:44. +[value] Done for function Frama_C_update_entropy +[value] Recording results for Frama_C_interval +[value] Done for function Frama_C_interval +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function Frama_C_interval: + Frama_C_entropy_source ∈ [--..--] + r ∈ [5..20] + aux ∈ [--..--] +[value] Values at end of function f: + Frama_C_entropy_source ∈ [--..--] + T[0..4] ∈ {0} + [5..9] ∈ {0; 1} + [10..15] ∈ {0; 1; 2} + [16..20] ∈ {0; 2} + [21..99] ∈ {0} + x ∈ {4} + y ∈ {0; 10} + s ∈ [--..--] + a ∈ {0} or UNINITIALIZED + b ∈ {0} or UNINITIALIZED + p ∈ {{ &x ; &y }} + i ∈ {0} + __retres ∈ {0; 4; 10} diff -Nru frama-c-20140301+neon+dfsg/tests/scope/oracle/zones.res.oracle frama-c-20150201+sodium+dfsg/tests/scope/oracle/zones.res.oracle --- frama-c-20140301+neon+dfsg/tests/scope/oracle/zones.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/scope/oracle/zones.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,208 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/scope/zones.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..9] ∈ {0} + S ∈ {0} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} + Xf ∈ {0} + Xg ∈ {0} + Yf ∈ {0} + Yg ∈ {0} +[value] computing for function simple <- main. + Called from tests/scope/zones.c:73. +tests/scope/zones.c:15:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +tests/scope/zones.c:16:[kernel] warning: signed overflow. assert y+z ≤ 2147483647; +[value] Recording results for simple +[value] Done for function simple +[value] computing for function array1 <- main. + Called from tests/scope/zones.c:74. +tests/scope/zones.c:21:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. assert 0 ≤ x < 10; +tests/scope/zones.c:22:[kernel] warning: signed overflow. assert T[0]+y ≤ 2147483647; +[value] Recording results for array1 +[value] Done for function array1 +[value] computing for function struct1 <- main. + Called from tests/scope/zones.c:75. +[value] Recording results for struct1 +[value] Done for function struct1 +[value] computing for function ctrl1 <- main. + Called from tests/scope/zones.c:76. +[value] Recording results for ctrl1 +[value] Done for function ctrl1 +[value] computing for function caller <- main. + Called from tests/scope/zones.c:78. +[value] computing for function f <- caller <- main. + Called from tests/scope/zones.c:66. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- caller <- main. + Called from tests/scope/zones.c:67. +[value] Recording results for g +[value] Done for function g +[value] computing for function f <- caller <- main. + Called from tests/scope/zones.c:68. +tests/scope/zones.c:54:[kernel] warning: signed overflow. assert x+y ≤ 2147483647; +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- caller <- main. + Called from tests/scope/zones.c:68. +tests/scope/zones.c:60:[kernel] warning: signed overflow. assert a+b ≤ 2147483647; +[value] Recording results for g +[value] Done for function g +[value] Recording results for caller +[value] Done for function caller +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function array1: + T[0] ∈ [--..--] + [1..9] ∈ {0; 3} + __retres ∈ [--..--] +[value] Values at end of function ctrl1: + a ∈ [--..--] +[value] Values at end of function f: + Xf ∈ [0..9] + Yf ∈ [--..--] + __retres ∈ [--..--] +[value] Values at end of function g: + Xg ∈ [--..--] + Yg ∈ [--..--] + __retres ∈ [--..--] +[value] Values at end of function caller: + Xf ∈ [0..9] + Xg ∈ [--..--] + Yf ∈ [--..--] + Yg ∈ [--..--] + x1 ∈ {0} + y1 ∈ {0} + z1 ∈ {0} + a1 ∈ {0} + b1 ∈ {0} + c1 ∈ {0} + pf ∈ {{ &f ; &g }} +[value] Values at end of function simple: + x ∈ [-2147483645..2147483647] + y ∈ {3} +[value] Values at end of function struct1: + s.a ∈ [0..9] + .b ∈ [--..--] + __retres ∈ [0..9] +[value] Values at end of function main: + T[0] ∈ [--..--] + [1..9] ∈ {0; 3} + Xf ∈ [0..9] + Xg ∈ [--..--] + Yf ∈ [--..--] + Yg ∈ [--..--] + __retres ∈ {0} +[pdg] computing for function simple +[pdg] done for function simple +Current program point = return in function simple +Zones for x at current program point = +Stmt:1 -> z +Stmt:2 -> y; z +Stmt:3 -> y; z +Stmt:5 -> x +[pdg] computing for function array1 +[pdg] done for function array1 + + +Current program point = return in function array1 +Zones for T[0] at current program point = +Stmt:7 -> T[0]; x; y +Stmt:8 -> T[0]; y +Stmt:10 -> T[0] +Stmt:61 -> T[0] + + +Zones for T[1] at current program point = +Stmt:7 -> T[1]; x +Stmt:8 -> T[1] +Stmt:10 -> T[1] +Stmt:61 -> T[1] + + +Zones for T[x] at current program point = +Stmt:7 -> T[0..9]; x; y +Stmt:8 -> T[0..9]; x; y +Stmt:10 -> T[0..9]; x +Stmt:61 -> T[0..9]; x +[pdg] computing for function struct1 +[pdg] done for function struct1 + + +Current program point = return in function struct1 +Zones for s.a at current program point = +Stmt:12 -> x +Stmt:13 -> x +Stmt:14 -> s.a +Stmt:16 -> s.a +Stmt:63 -> s.a + + +Zones for s.b at current program point = +Stmt:12 -> S; y +Stmt:13 -> y; s.b +Stmt:14 -> y; s.b +Stmt:16 -> s.b +Stmt:63 -> s.b + + +Zones for s at current program point = +Stmt:12 -> S; x; y +Stmt:13 -> x; y; s.b +Stmt:14 -> y; s +Stmt:16 -> s +Stmt:63 -> s +[pdg] computing for function ctrl1 +[pdg] done for function ctrl1 + + +Current program point = return in function ctrl1 +Zones for a at current program point = +Stmt:19 -> x; y; z +Stmt:20 -> y +Stmt:21 -> a +Stmt:22 -> a +Stmt:23 -> z +Stmt:25 -> a + + +Current program point = label Lt2 in function ctrl1 +Zones for a at current program point = +Stmt:19 -> x; y +Stmt:20 -> y +Stmt:21 -> a +Stmt:22 -> a +Stmt:23 -> \nothing +Stmt:25 -> \nothing +[from] Computing for function f +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[pdg] computing for function caller +[pdg] done for function caller + + +Current program point = return in function caller +Zones for Yf at current program point = +Stmt:37 -> cond; v +Stmt:38 -> cond; v +Stmt:39 -> cond; v +Stmt:40 -> cond; v; z1 +Stmt:41 -> cond; v; z1 +Stmt:42 -> cond; v; z1 +Stmt:44 -> cond; v; z1 +Stmt:45 -> v; z1 +Stmt:46 -> v; z1 +Stmt:47 -> v; z1; tmp +Stmt:48 -> v; z1; pf +Stmt:49 -> Yf; v; pf +Stmt:50 -> Yf; v; pf +Stmt:51 -> Yf + + diff -Nru frama-c-20140301+neon+dfsg/tests/scope/test_config frama-c-20150201+sodium+dfsg/tests/scope/test_config --- frama-c-20140301+neon+dfsg/tests/scope/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/scope/test_config 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1 @@ +CMD: FRAMAC_PLUGIN=tests/.empty @frama-c@ \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/bts1684.i frama-c-20150201+sodium+dfsg/tests/slicing/bts1684.i --- frama-c-20140301+neon+dfsg/tests/slicing/bts1684.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/bts1684.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,15 @@ +/* run.config + OPT: -check -slice-calls main -journal-enable -then-on 'Slicing export' -print +*/ +// one bug about JOURNALIZATION and another one about slicing CALLS TO MAIN function. +double d1, d2, d3; +int x1, x2, x3; +int main2 (void) { + d1 = d2 * d3; + x1 = x2 * x3; + return 1; +} + +int main (void) { + return main2(); +} diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/bts1768.i frama-c-20150201+sodium+dfsg/tests/slicing/bts1768.i --- frama-c-20140301+neon+dfsg/tests/slicing/bts1768.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/bts1768.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,54 @@ +/* run.config + OPT: -check -main main -slice-pragma main -ulevel 10 -journal-disable -then-on 'Slicing export' -print +*/ +int choix ; +int state = 1; +int cumul =0 ; +int step =0; + +//initialisation + + +/*@ +ensures \result==0 || \result==1 || \result==2 ; + */ +int choisir() ; + +void lecture() { +choix = choisir() ; +} + +void fsm_transition() { + switch (state) { + case 1: + if (choix == 2) { + cumul = cumul +2 ; + state = 2 ; + } + else + cumul++; + break ; + case 2: + if ((step==50) && (choix==1)) + state = 3 ; + else + cumul++ ; + break ; + case 3: if ((choix==0) && (cumul==10)) state = 1; + default: break ; + } +} + +int main() { + + while (step>=0){ + lecture() ; + fsm_transition() ; + if (state == 3) { + /*@ slice pragma ctrl ;*/ + break ; + } + step ++ ; + } + return 0 ; +} diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/combine.ml frama-c-20150201+sodium+dfsg/tests/slicing/combine.ml --- frama-c-20140301+neon+dfsg/tests/slicing/combine.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/combine.ml 2015-05-28 08:53:24.000000000 +0000 @@ -64,7 +64,7 @@ *) !Db.Value.compute (); - let all = Datatype.String.Set.empty in + let all = Cil_datatype.Fundec.Set.empty in let proj3 = !Db.Constant_Propagation.get all ~cast_intro:true in Project.set_current proj3; Format.printf "After Constant propagation :@."; diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/annot.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/annot.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/annot.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/annot.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,40 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/annot.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at f2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ [--..--] + z ∈ [--..--] + t[0..9] ∈ {0} +tests/slicing/annot.c:23:[value] Assertion got status valid. +[value] Recording results for f2 +[value] done for function f2 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f2 +[pdg] done for function f2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int x; + +int t[10]; +void f2(void) +{ + t[6] = 4; + x = 3; + /*@ assert \initialized(&t[x .. 9]); */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/annot.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/annot.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/annot.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/annot.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,42 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/annot.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at f1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ [--..--] + z ∈ [--..--] + t[0..9] ∈ {0} +tests/slicing/annot.c:11:[kernel] warning: signed overflow. assert -2147483648 ≤ x+x ≤ 2147483647; +tests/slicing/annot.c:11:[kernel] warning: signed overflow. assert -2147483648 ≤ (int)(x+x)-x ≤ 2147483647; +tests/slicing/annot.c:15:[value] Assertion got status unknown. +[value] Recording results for f1 +[value] done for function f1 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f1 +[pdg] done for function f1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int x; + +void f1(void) +{ + int v; + v = 3; + x = 3; + /*@ assert x ≡ \at(x,Pre); */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts0184.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts0184.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts0184.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts0184.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts0184.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[slicing] Nothing to select for an unreachable stmt of x +[pdg] computing for function x +[pdg] warning: unreachable entry point (sid:1, function x) +[pdg] Bottom for function x +[slicing] bottom PDG for function 'x': ignore selection +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts0190.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts0190.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts0190.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts0190.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts0190.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function x <- main. + Called from tests/slicing/bts0190.c:15. +tests/slicing/bts0190.c:8:[value] Assertion got status valid. +tests/slicing/bts0190.c:9:[value] Assertion got status valid. +[value] computing for function z1 <- x <- main. + Called from tests/slicing/bts0190.c:10. +[value] Recording results for z1 +[value] Done for function z1 +[value] Recording results for x +[value] Done for function x +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[slicing] user error: Unbound variable y. Slicing requests from the command line are ignored. +[slicing] warning: No internal slicing request from the command line. +[slicing] warning: Adding an extra request on the entry point of function: main. +[pdg] computing for function main +[from] Computing for function x +[from] Computing for function z1 <-x +[from] Done for function z1 +[from] Done for function x +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts0950_annot.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts0950_annot.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts0950_annot.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts0950_annot.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,58 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts0950_annot.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {1} + b ∈ {2} +[value] computing for function cpy <- main. + Called from tests/slicing/bts0950_annot.i:14. +tests/slicing/bts0950_annot.i:4:[value] Function cpy: precondition got status valid. +[value] Recording results for cpy +[value] Done for function cpy +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function cpy: + a ∈ {2} +[value] Values at end of function main: + a ∈ {2} +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function cpy +[from] Done for function cpy +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function cpy +[pdg] done for function cpy +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void cpy_slice_1(int *region1, int const *region2); + +/*@ requires \valid(region1); */ +void cpy_slice_1(int *region1, int const *region2) +{ + *region1 = *region2; + return; +} + +int a = 1; +int b = 2; +void main(void) +{ + cpy_slice_1(& a,(int const *)(& b)); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts1248.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts1248.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts1248.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts1248.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,36 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts1248.i (no preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for f +[value] done for function f +[slicing] making slicing project 'p'... +[slicing] interpreting slicing requests from the command line... +[slicing] warning: No internal slicing request from the command line. +[slicing] warning: Adding an extra request on the entry point of function: f. +[pdg] computing for function f +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'p export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'p export tmp' +[sparecode] removed unused global declarations in new project 'p export' +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for f +[value] done for function f +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts1445.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts1445.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts1445.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts1445.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,34 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts1445.i (no preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} +tests/slicing/bts1445.i:14:[value] entering loop for the first time +[value] Recording results for f +[value] done for function f +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +tests/slicing/bts1445.i:16:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function f +[slicing] Nothing to select for unreachable return stmt of f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void f(void) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts1445.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts1445.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts1445.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts1445.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,34 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts1445.i (no preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} +tests/slicing/bts1445.i:8:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +tests/slicing/bts1445.i:10:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main +[slicing] Nothing to select for unreachable return stmt of main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void main(void) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts1684.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts1684.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts1684.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts1684.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,62 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts1684.i (no preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + d1 ∈ {0} + d2 ∈ {0} + d3 ∈ {0} + x1 ∈ {0} + x2 ∈ {0} + x3 ∈ {0} +[value] computing for function main2 <- main. + Called from tests/slicing/bts1684.i:14. +[value] Recording results for main2 +[value] Done for function main2 +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function main2 +[from] Done for function main2 +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main2 +[pdg] done for function main2 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +double d1; +double d2; +double d3; +int x1; +int x2; +int x3; +int main2_slice_1(void) +{ + int __retres; + d1 = d2 * d3; + x1 = x2 * x3; + __retres = 1; + return __retres; +} + +int main(void) +{ + int tmp; + tmp = main2_slice_1(); + return tmp; +} + + +[kernel] writing journal in file `./frama_c_journal.ml'. diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts1768.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts1768.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts1768.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts1768.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,460 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts1768.i (no preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + choix ∈ {0} + state ∈ {1} + cumul ∈ {0} + step ∈ {0} +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +tests/slicing/bts1768.i:18:[kernel] warning: No code nor implicit assigns clause for function choisir, generating default assigns from the prototype +[value] using specification for function choisir +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +tests/slicing/bts1768.i:44:[value] entering loop for the first time +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +tests/slicing/bts1768.i:51:[kernel] warning: signed overflow. assert step+1 ≤ 2147483647; +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] computing for function lecture <- main. + Called from tests/slicing/bts1768.i:45. +[value] computing for function choisir <- lecture <- main. + Called from tests/slicing/bts1768.i:18. +[value] Done for function choisir +[value] Recording results for lecture +[value] Done for function lecture +[value] computing for function fsm_transition <- main. + Called from tests/slicing/bts1768.i:46. +tests/slicing/bts1768.i:25:[kernel] warning: signed overflow. assert cumul+2 ≤ 2147483647; +tests/slicing/bts1768.i:29:[kernel] warning: signed overflow. assert cumul+1 ≤ 2147483647; +tests/slicing/bts1768.i:35:[kernel] warning: signed overflow. assert cumul+1 ≤ 2147483647; +tests/slicing/bts1768.i:35:[kernel] warning: signed overflow. assert cumul+1 ≤ 2147483647; +[value] Recording results for fsm_transition +[value] Done for function fsm_transition +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function lecture +[from] Computing for function choisir <-lecture +[from] Done for function choisir +[from] Done for function lecture +[from] Computing for function fsm_transition +[from] Done for function fsm_transition +[pdg] done for function main +[slicing] Nothing to select for an unreachable stmt of main +[slicing] Nothing to select for an unreachable stmt of main +[slicing] Nothing to select for an unreachable stmt of main +[slicing] Nothing to select for an unreachable stmt of main +[slicing] Nothing to select for an unreachable stmt of main +[slicing] Nothing to select for an unreachable stmt of main +[slicing] Nothing to select for an unreachable stmt of main +[slicing] Nothing to select for an unreachable stmt of main +[slicing] Nothing to select for an unreachable stmt of main +[slicing] Nothing to select for an unreachable stmt of main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function fsm_transition +[pdg] done for function fsm_transition +[pdg] computing for function lecture +[pdg] done for function lecture +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int choix; +int state = 1; +int step = 0; +/*@ ensures \result ≡ 0 ∨ \result ≡ 1 ∨ \result ≡ 2; */ +extern int choisir(); + +void lecture_slice_1(void) +{ + choix = choisir(); + return; +} + +void fsm_transition_slice_1(void) +{ + switch (state) { + case 1: ; + if (choix == 2) state = 2; + break; + case 2: ; + if (step == 50) + if (choix == 1) state = 3; + break; + case 3: ; + default: ; + } + return; +} + +void main(void) +{ + lecture_slice_1(); + fsm_transition_slice_1(); + step ++; + lecture_slice_1(); + fsm_transition_slice_1(); + step ++; + lecture_slice_1(); + fsm_transition_slice_1(); + step ++; + lecture_slice_1(); + fsm_transition_slice_1(); + step ++; + lecture_slice_1(); + fsm_transition_slice_1(); + step ++; + lecture_slice_1(); + fsm_transition_slice_1(); + step ++; + lecture_slice_1(); + fsm_transition_slice_1(); + step ++; + lecture_slice_1(); + fsm_transition_slice_1(); + step ++; + lecture_slice_1(); + fsm_transition_slice_1(); + step ++; + lecture_slice_1(); + fsm_transition_slice_1(); + step ++; + /*@ loop pragma UNROLL "done", 10; */ + while (1) { + lecture_slice_1(); + fsm_transition_slice_1(); + if (state == 3) { + /*@ slice pragma ctrl; */ ; + break; + } + step ++; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts179.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts179.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts179.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts179.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,57 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts179.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ {0} + X ∈ {0} + Y ∈ {0} +[value] computing for function g <- main. + Called from tests/slicing/bts179.c:16. +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function g +[from] Done for function g +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function g +[pdg] done for function g +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct __anonstruct_S_1 { + int a ; + int ab ; + int b ; + int c ; + int d ; +}; +struct __anonstruct_S_1 S; +void g_slice_1(void) +{ + S.b = 2; + return; +} + +void main(void) +{ + g_slice_1(); + /*@ slice pragma expr S.b; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts179.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts179.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts179.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts179.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,60 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts179.c (with preprocessing) +[sparecode] remove unused code... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ {0} + X ∈ {0} + Y ∈ {0} +[value] computing for function g <- main. + Called from tests/slicing/bts179.c:16. +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function g +[from] Done for function g +[pdg] done for function main +[pdg] computing for function g +[pdg] done for function g +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +struct __anonstruct_S_1 { + int a ; + int ab ; + int b ; + int c ; + int d ; +}; +struct __anonstruct_S_1 S; +void g(void) +{ + S.a = 1; + S.b = 2; + S.d = 4; + return; +} + +int main(void) +{ + int __retres; + g(); + /*@ slice pragma expr S.b; */ ; + S.ab = 1; + __retres = S.a; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts179.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts179.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts179.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts179.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,58 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts179.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ {0} + X ∈ {0} + Y ∈ {0} +[value] computing for function g <- main. + Called from tests/slicing/bts179.c:16. +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function g +[from] Done for function g +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function g +[pdg] done for function g +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct __anonstruct_S_1 { + int a ; + int ab ; + int b ; + int c ; + int d ; +}; +struct __anonstruct_S_1 S; +void g_slice_1(void) +{ + S.a = 1; + return; +} + +int main(void) +{ + int __retres; + g_slice_1(); + __retres = S.a; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts283.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts283.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts283.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts283.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,102 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts283.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + z ∈ {0} + X ∈ {0} + Y ∈ {0} +[value] computing for function f <- main. + Called from tests/slicing/bts283.c:33. +tests/slicing/bts283.c:9:[value] Function f: precondition got status valid. +tests/slicing/bts283.c:10:[value] Function f: postcondition got status valid. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/slicing/bts283.c:34. +[value] using specification for function g +tests/slicing/bts283.c:14:[value] Function g: precondition got status valid. +tests/slicing/bts283.c:15:[value] Function g: precondition got status valid. +[value] Done for function g +tests/slicing/bts283.c:34:[kernel] warning: signed overflow. assert z+tmp ≤ 2147483647; + (tmp from g(1, 2)) +[value] computing for function k <- main. + Called from tests/slicing/bts283.c:35. +tests/slicing/bts283.c:21:[value] Function k: precondition got status valid. +tests/slicing/bts283.c:27:[kernel] warning: signed overflow. assert Y+1 ≤ 2147483647; +tests/slicing/bts283.c:22:[value] Function k: postcondition got status valid. +tests/slicing/bts283.c:23:[value] Function k: postcondition got status unknown. +[value] Recording results for k +[value] Done for function k +tests/slicing/bts283.c:36:[kernel] warning: signed overflow. assert X+z ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] Computing for function k +[from] Done for function k +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function k +[pdg] done for function k +[pdg] computing for function g +[pdg] done for function g +[pdg] computing for function f +[pdg] done for function f +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int x; +int z; +int X; +int Y; +int f_slice_1(void) +{ + return x; +} + +/*@ requires a > 0; */ +extern int g_slice_1(int a); + +/*@ requires x_0 > 0; + ensures X > \old(X); + ensures Y ≡ \old(Y)+1; */ +void k_slice_1(int x_0) +{ + X += x_0; + return; +} + +int main(void) +{ + int __retres; + int tmp; + x = 1; + z = f_slice_1(); + { + /*sequence*/ + tmp = g_slice_1(1); + z += tmp; + } + k_slice_1(3); + __retres = X + z; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts326.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts326.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts326.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts326.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,84 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts326.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..1] ∈ {0} + r ∈ {0} +[value] computing for function g <- main. + Called from tests/slicing/bts326.c:17. +[value] computing for function f <- g <- main. + Called from tests/slicing/bts326.c:12. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- g <- main. + Called from tests/slicing/bts326.c:13. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for g +[from] Computing for function g +[from] Done for function g +[value] Done for function g +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f at tests/slicing/bts326.c:12 (by g): + t[0] FROM i +[from] call to f at tests/slicing/bts326.c:13 (by g): + t[1] FROM i +[from] call to g at tests/slicing/bts326.c:17 (by main): + t[0..1] FROM \nothing +[from] entry point: + t[0..1] FROM \nothing + r FROM \nothing + \result FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function g +[pdg] done for function g +[pdg] computing for function f +[pdg] done for function f +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int t[2]; +int r; +void f_slice_1(int i) +{ + t[i] = i; + return; +} + +void g_slice_1(void) +{ + f_slice_1(0); + return; +} + +int main(void) +{ + g_slice_1(); + r = t[0]; + return r; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts335b.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts335b.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts335b.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts335b.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,128 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts335b.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {0} + Y ∈ {0} +[value] computing for function f <- main. + Called from tests/slicing/bts335b.c:20. +tests/slicing/bts335b.c:16:[kernel] warning: signed overflow. assert z+1 ≤ 2147483647; +[value] computing for function g <- f <- main. + Called from tests/slicing/bts335b.c:17. +[value] Recording results for g +[from] Computing for function g +[from] Done for function g +[value] Done for function g +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +tests/slicing/bts335b.c:21:[kernel] warning: signed overflow. assert j+1 ≤ 2147483647; +[value] computing for function g <- main. + Called from tests/slicing/bts335b.c:22. +[value] Recording results for g +[from] Computing for function g +[from] Done for function g +[value] Done for function g +tests/slicing/bts335b.c:22:[kernel] warning: signed overflow. + assert -2147483648 ≤ r+tmp_0 ≤ 2147483647; + (tmp_0 from g(2, w, b, j)) +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to g at tests/slicing/bts335b.c:17 (by f): + X FROM c; x + Y FROM c; x + \result FROM c; x +[from] call to f at tests/slicing/bts335b.c:20 (by main): + X FROM c; x + Y FROM c; x + \result FROM c; x +[from] call to g at tests/slicing/bts335b.c:22 (by main): + X FROM c; y + Y FROM c; y + \result FROM c; y +[from] entry point: + X FROM b + Y FROM b + \result FROM v; b +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] done (making slicing project 'Slicing'). +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] done (applying all slicing requests). +[slicing] done (interpreting slicing requests from the command line). +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] applying sub action... +[pdg] computing for function g +[pdg] done for function g +[slicing] applying sub action... +[slicing] applying sub action... +[slicing] applying sub action... +[slicing] applying sub action... +[slicing] applying sub action... +[pdg] computing for function f +[pdg] done for function f +[slicing] applying sub action... +[slicing] applying sub action... +[slicing] applying sub action... +[slicing] applying sub action... +[slicing] applying sub action... +[slicing] applying sub action... +[slicing] applying sub action... +[slicing] applying sub action... +[slicing] applying sub action... +[slicing] done (applying 1 actions. +[slicing] done (applying all slicing requests). +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] done (applying all slicing requests). +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +[slicing] done (exporting project to 'Slicing export'). +[slicing] done (slicing requests in progress). +/* Generated by Frama-C */ +int X; +int g_slice_1(int c, int x, int y, int z) +{ + X = z; + if (c == 1) X = x; + if (c == 2) X = y; + return X; +} + +int f_slice_1(int c, int x, int y, int z) +{ + int tmp; + z ++; + tmp = g_slice_1(c,x,y,z); + return tmp; +} + +int main(int v, int w, int a, int b, int i, int j) +{ + int r; + int tmp_0; + r = f_slice_1(1,v,a,i); + j ++; + { + /*sequence*/ + tmp_0 = g_slice_1(2,w,b,j); + r += tmp_0; + } + return r; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts335.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts335.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts335.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts335.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,59 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts335.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..1] ∈ {0} +[value] computing for function g <- main. + Called from tests/slicing/bts335.c:12. +[value] computing for function f <- g <- main. + Called from tests/slicing/bts335.c:11. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for g +[from] Computing for function g +[from] Done for function g +[value] Done for function g +[value] computing for function f <- main. + Called from tests/slicing/bts335.c:12. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f at tests/slicing/bts335.c:11 (by g): + T[0] FROM T[0]; i +[from] call to g at tests/slicing/bts335.c:12 (by main): + T[0] FROM T[0] +[from] call to f at tests/slicing/bts335.c:12 (by main): + T[1] FROM T[1]; i +[from] entry point: + T[0] FROM T[0]; c (and SELF) + [1] FROM T[1]; c (and SELF) +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function g +[pdg] done for function g +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[pdg] done for function main +[pdg] computing for function f +[pdg] done for function f +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts336.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts336.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts336.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts336.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,67 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts336.c (with preprocessing) +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..9] ∈ {0} + x5 ∈ {0} +[value] computing for function f2 <- main2. + Called from tests/slicing/bts336.c:35. +[value] Recording results for f2 +[from] Computing for function f2 +[from] Done for function f2 +[value] Done for function f2 +[value] computing for function f2 <- main2. + Called from tests/slicing/bts336.c:36. +[value] Recording results for f2 +[from] Computing for function f2 +[from] Done for function f2 +[value] Done for function f2 +[value] Recording results for main2 +[from] Computing for function main2 +[from] Done for function main2 +[value] done for function main2 +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f2 at tests/slicing/bts336.c:35 (by main2): + T[1] FROM i +[from] call to f2 at tests/slicing/bts336.c:36 (by main2): + T[2] FROM i +[from] entry point: + T[1..2] FROM \nothing + \result FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main2 +[pdg] done for function main2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f2 +[pdg] done for function f2 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int T[10]; +void f2_slice_1(int i) +{ + T[i] = i; + return; +} + +int main2(void) +{ + int __retres; + f2_slice_1(2); + __retres = T[2]; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts336.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts336.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts336.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts336.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,63 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts336.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..9] ∈ {0} + x5 ∈ {0} +[value] computing for function f3 <- main3. + Called from tests/slicing/bts336.c:53. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f3 <- main3. + Called from tests/slicing/bts336.c:54. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f3 <- main3. + Called from tests/slicing/bts336.c:55. +[value] Recording results for f3 +[value] Done for function f3 +[value] Recording results for main3 +[value] done for function main3 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main3 +[from] Computing for function f3 +[from] Done for function f3 +[pdg] done for function main3 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f3 +[pdg] done for function f3 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void f3_slice_1(int *p) +{ + (*p) ++; + return; +} + +int main3(void) +{ + int a; + int b; + int c; + a = 1; + b = 2; + c = 3; + f3_slice_1(& a); + f3_slice_1(& b); + f3_slice_1(& c); + return b; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts336.3.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts336.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts336.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts336.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,87 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts336.c (with preprocessing) +[value] Analyzing a complete application starting at main3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..9] ∈ {0} + x5 ∈ {0} +[value] computing for function f3 <- main3. + Called from tests/slicing/bts336.c:53. +[value] Recording results for f3 +[from] Computing for function f3 +[from] Done for function f3 +[value] Done for function f3 +[value] computing for function f3 <- main3. + Called from tests/slicing/bts336.c:54. +[value] Recording results for f3 +[from] Computing for function f3 +[from] Done for function f3 +[value] Done for function f3 +[value] computing for function f3 <- main3. + Called from tests/slicing/bts336.c:55. +[value] Recording results for f3 +[from] Computing for function f3 +[from] Done for function f3 +[value] Done for function f3 +[value] Recording results for main3 +[from] Computing for function main3 +[from] Done for function main3 +[value] done for function main3 +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f3 at tests/slicing/bts336.c:53 (by main3): + a FROM p; a +[from] call to f3 at tests/slicing/bts336.c:54 (by main3): + b FROM p; b +[from] call to f3 at tests/slicing/bts336.c:55 (by main3): + c FROM p; c +[from] entry point: + \result FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[inout] InOut (internal) for function f3: + Operational inputs: + p; a; b; c + Operational inputs on termination: + p; a; b; c + Sure outputs: + \nothing +[inout] InOut (internal) for function main3: + Operational inputs: + \nothing + Operational inputs on termination: + \nothing + Sure outputs: + a; b; c +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main3 +[pdg] done for function main3 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f3 +[pdg] done for function f3 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void f3_slice_1(int *p) +{ + (*p) ++; + return; +} + +int main3(void) +{ + int b; + b = 2; + f3_slice_1(& b); + return b; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts336.4.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts336.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts336.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts336.4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,71 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts336.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..9] ∈ {0} + x5 ∈ {0} +[value] computing for function f <- main. + Called from tests/slicing/bts336.c:20. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/slicing/bts336.c:21. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f at tests/slicing/bts336.c:20 (by main): + T[1] FROM T[1]; i + \result FROM T[1]; i +[from] call to f at tests/slicing/bts336.c:21 (by main): + T[2] FROM T[2]; i + \result FROM T[2]; i +[from] entry point: + T[1] FROM T[1] + [2] FROM T[2] + \result FROM T[2] +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f +[pdg] done for function f +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int T[10]; +int f_slice_1(int i) +{ + int __retres; + (T[i]) ++; + __retres = T[i]; + return __retres; +} + +int main(void) +{ + int x2; + x2 = f_slice_1(2); + return x2; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts336.5.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts336.5.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts336.5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts336.5.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,440 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts336.c (with preprocessing) +[value] Analyzing a complete application starting at main4 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..9] ∈ {0} + x5 ∈ {0} +tests/slicing/bts336.c:77:[value] entering loop for the first time +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +tests/slicing/bts336.c:62:[kernel] warning: signed overflow. assert *p+1 ≤ 2147483647; +tests/slicing/bts336.c:63:[kernel] warning: signed overflow. assert *q+1 ≤ 2147483647; +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +tests/slicing/bts336.c:84:[kernel] warning: signed overflow. assert a2+b4 ≤ 2147483647; +[value] Recording results for main4 +[from] Computing for function main4 +[from] Done for function main4 +[value] done for function main4 +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f4 at tests/slicing/bts336.c:78 (by main4): + a1 FROM p; a1 + b1 FROM q; b1 +[from] call to f4 at tests/slicing/bts336.c:79 (by main4): + a2 FROM p; a2 + b2 FROM q; b2 +[from] call to f4 at tests/slicing/bts336.c:80 (by main4): + a3 FROM p; a3 + b3 FROM q; b3 +[from] call to f4 at tests/slicing/bts336.c:81 (by main4): + a4 FROM p; a4 + b4 FROM q; b4 +[from] call to f4 at tests/slicing/bts336.c:82 (by main4): + a5 FROM p; a5 + b5 FROM q; b5 +[from] entry point: + \result FROM c +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main4 +[pdg] done for function main4 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f4 +[pdg] done for function f4 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void f4_slice_1(int *p, int *q) +{ + (*p) ++; + (*q) ++; + return; +} + +int main4(int volatile c) +{ + int __retres; + int a2; + int b2; + int a4; + int b4; + a2 = 3; + b2 = 4; + a4 = 7; + b4 = 8; + while (c) { + f4_slice_1(& a2,& b2); + f4_slice_1(& a4,& b4); + } + __retres = a2 + b4; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts336.6.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts336.6.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts336.6.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts336.6.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,441 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts336.c (with preprocessing) +[value] Analyzing a complete application starting at main4 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..9] ∈ {0} + x5 ∈ {0} +tests/slicing/bts336.c:77:[value] entering loop for the first time +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:78. +tests/slicing/bts336.c:62:[kernel] warning: signed overflow. assert *p+1 ≤ 2147483647; +tests/slicing/bts336.c:63:[kernel] warning: signed overflow. assert *q+1 ≤ 2147483647; +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:79. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:80. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:81. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +[value] computing for function f4 <- main4. + Called from tests/slicing/bts336.c:82. +[value] Recording results for f4 +[from] Computing for function f4 +[from] Done for function f4 +[value] Done for function f4 +tests/slicing/bts336.c:84:[kernel] warning: signed overflow. assert a2+b4 ≤ 2147483647; +[value] Recording results for main4 +[from] Computing for function main4 +[from] Done for function main4 +[value] done for function main4 +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f4 at tests/slicing/bts336.c:78 (by main4): + a1 FROM p; a1 + b1 FROM q; b1 +[from] call to f4 at tests/slicing/bts336.c:79 (by main4): + a2 FROM p; a2 + b2 FROM q; b2 +[from] call to f4 at tests/slicing/bts336.c:80 (by main4): + a3 FROM p; a3 + b3 FROM q; b3 +[from] call to f4 at tests/slicing/bts336.c:81 (by main4): + a4 FROM p; a4 + b4 FROM q; b4 +[from] call to f4 at tests/slicing/bts336.c:82 (by main4): + a5 FROM p; a5 + b5 FROM q; b5 +[from] entry point: + \result FROM c +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main4 +[pdg] done for function main4 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f4 +[pdg] done for function f4 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void f4_slice_2(int *p) +{ + (*p) ++; + return; +} + +void f4_slice_1(int *q) +{ + (*q) ++; + return; +} + +int main4(int volatile c) +{ + int __retres; + int a2; + int b4; + a2 = 3; + b4 = 8; + while (c) { + f4_slice_2(& a2); + f4_slice_1(& b4); + } + __retres = a2 + b4; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts336.7.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts336.7.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts336.7.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts336.7.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,133 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts336.c (with preprocessing) +[value] Analyzing a complete application starting at main5 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..9] ∈ {0} + x5 ∈ {0} +[value] computing for function f5 <- main5. + Called from tests/slicing/bts336.c:98. +[value] Recording results for f5 +[from] Computing for function f5 +[from] Done for function f5 +[value] Done for function f5 +[value] computing for function f5 <- main5. + Called from tests/slicing/bts336.c:99. +[value] Recording results for f5 +[from] Computing for function f5 +[from] Done for function f5 +[value] Done for function f5 +[value] Recording results for main5 +[from] Computing for function main5 +[from] Done for function main5 +[value] done for function main5 +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f5 at tests/slicing/bts336.c:98 (by main5): + x5 FROM q; b1 + a1 FROM p; a1 +[from] call to f5 at tests/slicing/bts336.c:99 (by main5): + x5 FROM q; a1 + a2 FROM p; a2 +[from] entry point: + x5 FROM \nothing + \result FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main5 +[pdg] done for function main5 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f5 +[pdg] done for function f5 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +[value] Analyzing a complete application starting at main5 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f5_slice_1 <- main5. + Called from tests/slicing/bts336.c:98. +[value] Recording results for f5_slice_1 +[from] Computing for function f5_slice_1 +[from] Done for function f5_slice_1 +[value] Done for function f5_slice_1 +[value] computing for function f5_slice_1 <- main5. + Called from tests/slicing/bts336.c:99. +[value] Recording results for f5_slice_1 +[from] Computing for function f5_slice_1 +[from] Done for function f5_slice_1 +[value] Done for function f5_slice_1 +[value] Recording results for main5 +[from] Computing for function main5 +[from] Done for function main5 +[value] done for function main5 +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f5_slice_1 at tests/slicing/bts336.c:98 (by main5): + a1 FROM p; a1 +[from] call to f5_slice_1 at tests/slicing/bts336.c:99 (by main5): + a2 FROM p; a2 +[from] entry point: + \result FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main5 +[pdg] done for function main5 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f5_slice_1 +[pdg] done for function f5_slice_1 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void f5_slice_1(int *p) +{ + (*p) ++; + return; +} + +int main5(void) +{ + int a1; + int a2; + a1 = 1; + a2 = 2; + f5_slice_1(& a1); + f5_slice_1(& a2); + return a2; +} + + +/* Generated by Frama-C */ +void f5_slice_1_slice_1(int *p) +{ + (*p) ++; + return; +} + +int main5(void) +{ + int a2; + a2 = 2; + f5_slice_1_slice_1(& a2); + return a2; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts336.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts336.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts336.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts336.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,72 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts336.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..9] ∈ {0} + x5 ∈ {0} +[value] computing for function f <- main. + Called from tests/slicing/bts336.c:20. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/slicing/bts336.c:21. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f at tests/slicing/bts336.c:20 (by main): + T[1] FROM T[1]; i + \result FROM T[1]; i +[from] call to f at tests/slicing/bts336.c:21 (by main): + T[2] FROM T[2]; i + \result FROM T[2]; i +[from] entry point: + T[1] FROM T[1] + [2] FROM T[2] + \result FROM T[2] +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f +[pdg] done for function f +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int T[10]; +int f_slice_1(int i) +{ + int __retres; + (T[i]) ++; + __retres = T[i]; + return __retres; +} + +int main(void) +{ + int x2; + f_slice_1(1); + x2 = f_slice_1(2); + return x2; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts341.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts341.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts341.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts341.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,34 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts341.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/bts341.c:6:[value] entering loop for the first time +tests/slicing/bts341.c:7:[value] Assertion got status valid. +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void main(int c) +{ + /*@ assert c ≡ 0; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts344.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts344.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts344.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts344.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,55 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts344.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main_bis +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {0} + Y ∈ {0} +[value] computing for function k <- main_bis. + Called from tests/slicing/bts344.c:32. +tests/slicing/bts344.c:9:[value] Function k: postcondition got status valid. +[value] Recording results for k +[value] Done for function k +[value] Recording results for main_bis +[value] done for function main_bis +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main_bis +[from] Computing for function k +[from] Done for function k +[pdg] done for function main_bis +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function k +[pdg] done for function k +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int X; +int Y; +/*@ ensures X ≡ \old(X)+\old(x); */ +void k(int x); + +void k_slice_1(void) +{ + Y ++; + return; +} + +int main_bis(void) +{ + void (*p)(int ); + p = & k; + k_slice_1(); + return Y; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts344.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts344.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts344.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts344.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,101 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts344.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {0} + Y ∈ {0} +[value] computing for function f <- main. + Called from tests/slicing/bts344.c:24. +[value] computing for function h <- f <- main. + Called from tests/slicing/bts344.c:21. +[value] Recording results for h +[value] Done for function h +[value] Recording results for f +[value] Done for function f +[value] computing for function h <- main. + Called from tests/slicing/bts344.c:25. +[value] Recording results for h +[value] Done for function h +[value] computing for function k <- main. + Called from tests/slicing/bts344.c:26. +tests/slicing/bts344.c:9:[value] Function k: postcondition got status valid. +[value] Recording results for k +[value] Done for function k +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function f +[from] Computing for function h <-f +[from] Done for function h +[from] Done for function f +[from] Computing for function k +[from] Done for function k +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function k +[pdg] done for function k +[pdg] computing for function h +[pdg] done for function h +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int X; +int Y; +void h(int x); + +void h_slice_1(int x); + +/*@ ensures X ≡ \old(X)+\old(x); */ +void k(int x); + +/*@ ensures X ≡ \old(X)+\old(x); */ +void k_slice_1(int x) +{ + X += x; + return; +} + +void h(int x) +{ + X += x; + Y ++; + return; +} + +void h_slice_1(int x) +{ + X += x; + return; +} + +void f(int x , ...) +{ + void (*q)(int ); + void (*p)(int ); + q = & h; + p = & k; + h(x); + return; +} + +int main(void) +{ + f(1); + h_slice_1(2); + k_slice_1(3); + return X; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts345.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts345.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts345.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts345.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,61 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts345.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at top +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/bts345.c:21:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] computing for function called_by_top <- top. + Called from tests/slicing/bts345.c:22. +tests/slicing/bts345.c:15:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] computing for function called_indirectly_by_top <- called_by_top <- top. + Called from tests/slicing/bts345.c:16. +tests/slicing/bts345.c:10:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for called_indirectly_by_top +[value] Done for function called_indirectly_by_top +[value] Recording results for called_by_top +[value] Done for function called_by_top +[value] Recording results for top +[value] done for function top +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function top +[pdg] warning: not implemented by pdg yet: variadic function +[pdg] Top for function top +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] unable to slice top (-> TOP) +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int called_indirectly_by_top(int x) +{ + x ++; + return x; +} + +int called_by_top(int x) +{ + int z; + x ++; + z = called_indirectly_by_top(x); + return z; +} + +int top_orig(int x , ...) +{ + int z; + x ++; + z = called_by_top(x); + return z; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts345.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts345.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts345.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts345.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,83 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts345.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at call_top +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/bts345.c:27:[kernel] warning: signed overflow. assert y+1 ≤ 2147483647; +[value] computing for function top <- call_top. + Called from tests/slicing/bts345.c:28. +tests/slicing/bts345.c:21:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] computing for function called_by_top <- top <- call_top. + Called from tests/slicing/bts345.c:22. +tests/slicing/bts345.c:15:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] computing for function called_indirectly_by_top <- called_by_top <- top <- + call_top. + Called from tests/slicing/bts345.c:16. +tests/slicing/bts345.c:10:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for called_indirectly_by_top +[value] Done for function called_indirectly_by_top +[value] Recording results for called_by_top +[value] Done for function called_by_top +[value] Recording results for top +[value] Done for function top +[value] Recording results for call_top +[value] done for function call_top +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function top +[pdg] warning: not implemented by pdg yet: variadic function +[pdg] Top for function top +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] unable to slice top (-> TOP) +[pdg] computing for function call_top +[from] Computing for function top +[from] Computing for function called_by_top <-top +[from] Computing for function called_indirectly_by_top <-called_by_top <-top +[from] Done for function called_indirectly_by_top +[from] Done for function called_by_top +[from] Done for function top +[pdg] done for function call_top +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int called_indirectly_by_top(int x) +{ + x ++; + return x; +} + +int called_by_top(int x) +{ + int z; + x ++; + z = called_indirectly_by_top(x); + return z; +} + +int top(int x , ...) +{ + int z; + x ++; + z = called_by_top(x); + return z; +} + +void call_top(int y) +{ + int z; + y ++; + z = top(y); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts345.3.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts345.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts345.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts345.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts345.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at top +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/bts345.c:21:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] computing for function called_by_top <- top. + Called from tests/slicing/bts345.c:22. +tests/slicing/bts345.c:15:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] computing for function called_indirectly_by_top <- called_by_top <- top. + Called from tests/slicing/bts345.c:16. +tests/slicing/bts345.c:10:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for called_indirectly_by_top +[value] Done for function called_indirectly_by_top +[value] Recording results for called_by_top +[value] Done for function called_by_top +[value] Recording results for top +[value] done for function top +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function called_by_top +[from] Computing for function called_indirectly_by_top +[from] Done for function called_indirectly_by_top +[pdg] done for function called_by_top +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function top +[pdg] warning: not implemented by pdg yet: variadic function +[pdg] Top for function top +[pdg] computing for function called_indirectly_by_top +[pdg] done for function called_indirectly_by_top +[slicing] unable to slice top (-> TOP) +[slicing] unable to slice top (-> TOP) +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts345.4.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts345.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts345.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts345.4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,56 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts345.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at call_top +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/bts345.c:27:[kernel] warning: signed overflow. assert y+1 ≤ 2147483647; +[value] computing for function top <- call_top. + Called from tests/slicing/bts345.c:28. +tests/slicing/bts345.c:21:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] computing for function called_by_top <- top <- call_top. + Called from tests/slicing/bts345.c:22. +tests/slicing/bts345.c:15:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] computing for function called_indirectly_by_top <- called_by_top <- top <- + call_top. + Called from tests/slicing/bts345.c:16. +tests/slicing/bts345.c:10:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for called_indirectly_by_top +[value] Done for function called_indirectly_by_top +[value] Recording results for called_by_top +[value] Done for function called_by_top +[value] Recording results for top +[value] Done for function top +[value] Recording results for call_top +[value] done for function call_top +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function called_by_top +[from] Computing for function called_indirectly_by_top +[from] Done for function called_indirectly_by_top +[pdg] done for function called_by_top +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function top +[pdg] warning: not implemented by pdg yet: variadic function +[pdg] Top for function top +[pdg] computing for function called_indirectly_by_top +[pdg] done for function called_indirectly_by_top +[slicing] unable to slice top (-> TOP) +[pdg] computing for function call_top +[from] Computing for function top +[from] Computing for function called_by_top <-top +[from] Done for function called_by_top +[from] Done for function top +[pdg] done for function call_top +[slicing] unable to slice top (-> TOP) +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts345.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts345.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts345.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts345.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,79 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts345.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at call_top +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/bts345.c:27:[kernel] warning: signed overflow. assert y+1 ≤ 2147483647; +[value] computing for function top <- call_top. + Called from tests/slicing/bts345.c:28. +tests/slicing/bts345.c:21:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] computing for function called_by_top <- top <- call_top. + Called from tests/slicing/bts345.c:22. +tests/slicing/bts345.c:15:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] computing for function called_indirectly_by_top <- called_by_top <- top <- + call_top. + Called from tests/slicing/bts345.c:16. +tests/slicing/bts345.c:10:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for called_indirectly_by_top +[value] Done for function called_indirectly_by_top +[value] Recording results for called_by_top +[value] Done for function called_by_top +[value] Recording results for top +[value] Done for function top +[value] Recording results for call_top +[value] done for function call_top +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function call_top +[from] Computing for function top +[from] Computing for function called_by_top <-top +[from] Computing for function called_indirectly_by_top <-called_by_top <-top +[from] Done for function called_indirectly_by_top +[from] Done for function called_by_top +[from] Done for function top +[pdg] done for function call_top +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int called_indirectly_by_top(int x) +{ + x ++; + return x; +} + +int called_by_top(int x) +{ + int z; + x ++; + z = called_indirectly_by_top(x); + return z; +} + +int top(int x , ...) +{ + int z; + x ++; + z = called_by_top(x); + return z; +} + +int call_top(int y) +{ + int z; + y ++; + z = top(y); + return z; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts679b.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts679b.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts679b.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts679b.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,38 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts679b.i (no preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {1} +tests/slicing/bts679b.i:11:[value] cannot evaluate ACSL term, \at() on a C label is unsupported +tests/slicing/bts679b.i:11:[value] Assertion got status unknown. +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int X = 1; +void main(void) +{ + int y; + L: y = 0; + X ++; + /*@ assert X > \at(X,L); */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts679.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts679.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts679.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts679.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,40 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts679.i (no preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {1} +[value] computing for function f <- main. + Called from tests/slicing/bts679.i:7. +[value] Recording results for f +[value] Done for function f +tests/slicing/bts679.i:8:[value] cannot evaluate ACSL term, \at() on a C label is unsupported +tests/slicing/bts679.i:8:[value] Assertion got status unknown. +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int X = 1; +int main(void) +{ + return X; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts709.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts709.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts709.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts709.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,129 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts709.c (with preprocessing) +tests/slicing/bts709.c:36:[kernel] warning: Calling undeclared function assert. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + inp1 IN {0} + var1 IN {0} + var2 IN {0} +tests/slicing/bts709.c:44:[value] entering loop for the first time +[value] computing for function inputsOf_testcase_func <- main. + Called from tests/slicing/bts709.c:45. +[value] computing for function nondet_int <- inputsOf_testcase_func <- main. + Called from tests/slicing/bts709.c:53. +tests/slicing/bts709.c:53:[kernel] warning: Neither code nor specification for function nondet_int, generating default assigns from the prototype +[value] using specification for function nondet_int +[value] Done for function nondet_int +[value] computing for function nondet_int <- inputsOf_testcase_func <- main. + Called from tests/slicing/bts709.c:54. +[value] Done for function nondet_int +[value] computing for function nondet_int <- inputsOf_testcase_func <- main. + Called from tests/slicing/bts709.c:55. +[value] Done for function nondet_int +[value] Recording results for inputsOf_testcase_func +[value] Done for function inputsOf_testcase_func +[value] computing for function func <- main. + Called from tests/slicing/bts709.c:46. +[value] computing for function assert <- func <- main. + Called from tests/slicing/bts709.c:36. +tests/slicing/bts709.c:36:[kernel] warning: Neither code nor specification for function assert, generating default assigns from the prototype +[value] using specification for function assert +[value] Done for function assert +[value] Recording results for func +[value] Done for function func +[value] computing for function inputsOf_testcase_func <- main. + Called from tests/slicing/bts709.c:45. +[value] computing for function nondet_int <- inputsOf_testcase_func <- main. + Called from tests/slicing/bts709.c:53. +[value] Done for function nondet_int +[value] computing for function nondet_int <- inputsOf_testcase_func <- main. + Called from tests/slicing/bts709.c:54. +[value] Done for function nondet_int +[value] computing for function nondet_int <- inputsOf_testcase_func <- main. + Called from tests/slicing/bts709.c:55. +[value] Done for function nondet_int +[value] Recording results for inputsOf_testcase_func +[value] Done for function inputsOf_testcase_func +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function func +[from] Computing for function assert +[from] Done for function assert +[pdg] done for function func +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[from] Computing for function inputsOf_testcase_func +[from] Computing for function nondet_int <-inputsOf_testcase_func +[from] Done for function nondet_int +[from] Done for function inputsOf_testcase_func +[from] Computing for function func +[from] Done for function func +[pdg] done for function main +[pdg] computing for function inputsOf_testcase_func +[pdg] done for function inputsOf_testcase_func +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void inputsOf_testcase_func_slice_1(void); + +int inp1; +int var1; +int var2; +extern int ( /* missing proto */ assert)(int x_0); + +void func_slice_1(void) +{ + if (1 == inp1) { + var1 = 1; + var2 = 1; + } + else + if (2 == inp1) { + var1 = 2; + var2 = 2; + } + else + if (3 == inp1) { + var1 = 3; + var2 = 3; + } + /*@ slice pragma stmt; */ + if (65 != var2) assert(5 != var1); + return; +} + +void main(void) +{ + int _noOfIter_; + _noOfIter_ = 0; + while (_noOfIter_ < 1) { + inputsOf_testcase_func_slice_1(); + func_slice_1(); + _noOfIter_ ++; + } + return; +} + +extern int nondet_int(); + +void inputsOf_testcase_func_slice_1(void) +{ + inp1 = nondet_int(); + var1 = nondet_int(); + var2 = nondet_int(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts808.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts808.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts808.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts808.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,78 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts808.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f0 <- main. + Called from tests/slicing/bts808.c:21. +[value] Recording results for f0 +[value] Done for function f0 +[value] computing for function f1 <- main. + Called from tests/slicing/bts808.c:21. +[value] Recording results for f1 +[value] Done for function f1 +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function f0 +[from] Done for function f0 +[from] Computing for function f1 +[from] Done for function f1 +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f1 +[pdg] done for function f1 +[pdg] computing for function f0 +[pdg] done for function f0 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int f0_slice_1(void) +{ + int x; + if (0) L: x ++; + else { + x = 0; + goto L; + } + return x; +} + +int f1_slice_1(void) +{ + int x; + if (1) { + x = 1; + goto L; + } + else L: x ++; + return x; +} + +int main(void) +{ + int __retres; + int tmp; + int tmp_0; + { + /*sequence*/ + tmp = f0_slice_1(); + tmp_0 = f1_slice_1(); + } + __retres = tmp + tmp_0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts827.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts827.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/bts827.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/bts827.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,54 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/bts827.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} +[value] computing for function f <- main. + Called from tests/slicing/bts827.c:16. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f +[pdg] done for function f +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int f_slice_1(void) +{ + int __retres; + G = 3; + __retres = 5; + return __retres; +} + +int main(void) +{ + int tmp; + { + /*sequence*/ + tmp = f_slice_1(); + G += tmp; + } + return G; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/call_accuracy.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/call_accuracy.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/call_accuracy.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/call_accuracy.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,309 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/call_accuracy.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S1 ∈ {0} + S2 ∈ {0} + S3 ∈ {0} + S4 ∈ {0} +[value] computing for function test_struct <- main. + Called from tests/slicing/call_accuracy.c:62. +[value] Recording results for test_struct +[from] Computing for function test_struct +[from] Done for function test_struct +[value] Done for function test_struct +[value] computing for function test_cond <- main. + Called from tests/slicing/call_accuracy.c:63. +tests/slicing/call_accuracy.c:11:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +tests/slicing/call_accuracy.c:12:[kernel] warning: signed overflow. assert y+1 ≤ 2147483647; +tests/slicing/call_accuracy.c:13:[kernel] warning: signed overflow. assert z+1 ≤ 2147483647; +[value] computing for function f_cond <- test_cond <- main. + Called from tests/slicing/call_accuracy.c:14. +tests/slicing/call_accuracy.c:5:[kernel] warning: signed overflow. assert a+1 ≤ 2147483647; +tests/slicing/call_accuracy.c:6:[kernel] warning: signed overflow. assert b+1 ≤ 2147483647; +[value] Recording results for f_cond +[from] Computing for function f_cond +[from] Done for function f_cond +[value] Done for function f_cond +tests/slicing/call_accuracy.c:15:[kernel] warning: signed overflow. assert y+1 ≤ 2147483647; +tests/slicing/call_accuracy.c:16:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +tests/slicing/call_accuracy.c:17:[kernel] warning: signed overflow. assert z+1 ≤ 2147483647; +[value] computing for function f_cond <- test_cond <- main. + Called from tests/slicing/call_accuracy.c:18. +[value] Recording results for f_cond +[from] Computing for function f_cond +[from] Done for function f_cond +[value] Done for function f_cond +[value] Recording results for test_cond +[from] Computing for function test_cond +[from] Done for function test_cond +[value] Done for function test_cond +[value] computing for function test_set <- main. + Called from tests/slicing/call_accuracy.c:64. +[value] computing for function f_set <- test_set <- main. + Called from tests/slicing/call_accuracy.c:32. +[value] Recording results for f_set +[from] Computing for function f_set +[from] Done for function f_set +[value] Done for function f_set +[value] computing for function f_set <- test_set <- main. + Called from tests/slicing/call_accuracy.c:33. +[value] Recording results for f_set +[from] Computing for function f_set +[from] Done for function f_set +[value] Done for function f_set +[value] computing for function f_set <- test_set <- main. + Called from tests/slicing/call_accuracy.c:34. +[value] Recording results for f_set +[from] Computing for function f_set +[from] Done for function f_set +[value] Done for function f_set +[value] computing for function f_set <- test_set <- main. + Called from tests/slicing/call_accuracy.c:35. +[value] Recording results for f_set +[from] Computing for function f_set +[from] Done for function f_set +[value] Done for function f_set +[value] computing for function f_set <- test_set <- main. + Called from tests/slicing/call_accuracy.c:36. +[value] Recording results for f_set +[from] Computing for function f_set +[from] Done for function f_set +[value] Done for function f_set +[value] computing for function f_set <- test_set <- main. + Called from tests/slicing/call_accuracy.c:37. +[value] Recording results for f_set +[from] Computing for function f_set +[from] Done for function f_set +[value] Done for function f_set +[value] computing for function f_set <- test_set <- main. + Called from tests/slicing/call_accuracy.c:38. +[value] Recording results for f_set +[from] Computing for function f_set +[from] Done for function f_set +[value] Done for function f_set +[value] computing for function f_set <- test_set <- main. + Called from tests/slicing/call_accuracy.c:39. +[value] Recording results for f_set +[from] Computing for function f_set +[from] Done for function f_set +[value] Done for function f_set +[value] computing for function f_set <- test_set <- main. + Called from tests/slicing/call_accuracy.c:40. +[value] Recording results for f_set +[from] Computing for function f_set +[from] Done for function f_set +[value] Done for function f_set +[value] computing for function f_set <- test_set <- main. + Called from tests/slicing/call_accuracy.c:41. +[value] Recording results for f_set +[from] Computing for function f_set +[from] Done for function f_set +[value] Done for function f_set +[value] computing for function f_set <- test_set <- main. + Called from tests/slicing/call_accuracy.c:42. +[value] Recording results for f_set +[from] Computing for function f_set +[from] Done for function f_set +[value] Done for function f_set +[value] computing for function f_set <- test_set <- main. + Called from tests/slicing/call_accuracy.c:43. +[value] Recording results for f_set +[from] Computing for function f_set +[from] Done for function f_set +[value] Done for function f_set +[value] computing for function f_set <- test_set <- main. + Called from tests/slicing/call_accuracy.c:44. +[value] Recording results for f_set +[from] Computing for function f_set +[from] Done for function f_set +[value] Done for function f_set +[value] computing for function f_set <- test_set <- main. + Called from tests/slicing/call_accuracy.c:45. +[value] Recording results for f_set +[from] Computing for function f_set +[from] Done for function f_set +[value] Done for function f_set +tests/slicing/call_accuracy.c:49:[kernel] warning: signed overflow. assert -2147483648 ≤ b+s1.b ≤ 2147483647; +tests/slicing/call_accuracy.c:49:[kernel] warning: signed overflow. assert (int)(b+s1.b)+s3.b ≤ 2147483647; +tests/slicing/call_accuracy.c:49:[kernel] warning: signed overflow. + assert -2147483648 ≤ (int)((int)(b+s1.b)+s3.b)+tab[1] ≤ 2147483647; +tests/slicing/call_accuracy.c:49:[kernel] warning: signed overflow. + assert + -2147483648 ≤ (int)((int)((int)(b+s1.b)+s3.b)+tab[1])+S1.b ≤ 2147483647; +tests/slicing/call_accuracy.c:49:[kernel] warning: signed overflow. + assert + -2147483648 ≤ (int)((int)((int)((int)(b+s1.b)+s3.b)+tab[1])+S1.b)+S2.b ≤ + 2147483647; +[value] Recording results for test_set +[from] Computing for function test_set +[from] Done for function test_set +[value] Done for function test_set +tests/slicing/call_accuracy.c:65:[kernel] warning: signed overflow. assert r1+r2 ≤ 2147483647; +tests/slicing/call_accuracy.c:65:[kernel] warning: signed overflow. assert -2147483648 ≤ (int)(r1+r2)+r3 ≤ 2147483647; +tests/slicing/call_accuracy.c:65:[kernel] warning: signed overflow. assert (int)((int)(r1+r2)+r3)+S3.b ≤ 2147483647; +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f_cond at tests/slicing/call_accuracy.c:14 (by test_cond): + \result FROM c; a +[from] call to f_cond at tests/slicing/call_accuracy.c:18 (by test_cond): + \result FROM c; b +[from] call to f_set at tests/slicing/call_accuracy.c:32 (by test_set): + a FROM p; v +[from] call to f_set at tests/slicing/call_accuracy.c:33 (by test_set): + b FROM p; v +[from] call to f_set at tests/slicing/call_accuracy.c:34 (by test_set): + s1.a FROM p; v +[from] call to f_set at tests/slicing/call_accuracy.c:35 (by test_set): + s1.b FROM p; v +[from] call to f_set at tests/slicing/call_accuracy.c:36 (by test_set): + s2.a FROM p; v +[from] call to f_set at tests/slicing/call_accuracy.c:37 (by test_set): + s2.b FROM p; v +[from] call to f_set at tests/slicing/call_accuracy.c:38 (by test_set): + s3.a FROM p; v +[from] call to f_set at tests/slicing/call_accuracy.c:39 (by test_set): + tab[0] FROM p; v +[from] call to f_set at tests/slicing/call_accuracy.c:40 (by test_set): + tab[1] FROM p; v +[from] call to f_set at tests/slicing/call_accuracy.c:41 (by test_set): + tab[2] FROM p; v +[from] call to f_set at tests/slicing/call_accuracy.c:42 (by test_set): + S1.a FROM p; v +[from] call to f_set at tests/slicing/call_accuracy.c:43 (by test_set): + S1.b FROM p; v +[from] call to f_set at tests/slicing/call_accuracy.c:44 (by test_set): + S2.a FROM p; v +[from] call to f_set at tests/slicing/call_accuracy.c:45 (by test_set): + S2.b FROM p; v +[from] call to test_struct at tests/slicing/call_accuracy.c:62 (by main): + S1 FROM \nothing + S2 FROM \nothing + \result FROM \nothing +[from] call to test_cond at tests/slicing/call_accuracy.c:63 (by main): + \result FROM x +[from] call to test_set at tests/slicing/call_accuracy.c:64 (by main): + S1.a FROM x + .b FROM y + S2.a FROM x + .b FROM y + S3 FROM \nothing + S4.a FROM \nothing + \result FROM y +[from] entry point: + S1.a FROM x + .b FROM y + S2.a FROM x + .b FROM y + S3 FROM \nothing + S4.a FROM \nothing + \result FROM S4.b; x; y +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function test_set +[pdg] done for function test_set +[pdg] computing for function f_set +[pdg] done for function f_set +[pdg] computing for function test_cond +[pdg] done for function test_cond +[pdg] computing for function f_cond +[pdg] done for function f_cond +[pdg] computing for function test_struct +[pdg] done for function test_struct +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct st { + int a ; + int b ; +}; +int f_cond_slice_1(int c, int a, int b) +{ + int tmp; + a ++; + b ++; + if (c) tmp = a; else tmp = b; + return tmp; +} + +int test_cond_slice_1(int x, int y, int z) +{ + int tmp; + x ++; + y ++; + z = f_cond_slice_1(1,x,y); + y ++; + z ++; + tmp = f_cond_slice_1(0,y,z); + return tmp; +} + +void f_set_slice_1(int *p, int v) +{ + *p = v; + return; +} + +struct st S1; +struct st S2; +struct st S3; +struct st S4; +int test_set_slice_1(int y) +{ + int __retres; + int b; + struct st s1; + struct st s3; + int tab[5]; + s3.b = 2; + f_set_slice_1(& b,y); + f_set_slice_1(& s1.b,y); + f_set_slice_1(& tab[1],y); + f_set_slice_1(& S1.b,y); + f_set_slice_1(& S2.b,y); + S3.b = 2; + __retres = ((((b + s1.b) + s3.b) + tab[1]) + S1.b) + S2.b; + return __retres; +} + +int test_struct_slice_1(void) +{ + int __retres; + S1.a = 1; + S1.b = 2; + S2 = S1; + __retres = S2.b; + return __retres; +} + +int main(int x, int y, int z) +{ + int __retres; + int r1; + int r2; + int r3; + r1 = test_struct_slice_1(); + r2 = test_cond_slice_1(x,y,z); + r3 = test_set_slice_1(y); + __retres = (((r1 + r2) + r3) + S3.b) + S4.b; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/call_demo.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/call_demo.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/call_demo.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/call_demo.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,127 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/call_demo.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/call_demo.c:22:[value] entering loop for the first time +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +tests/slicing/call_demo.c:14:[kernel] warning: signed overflow. assert *p*i ≤ 2147483647; +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +tests/slicing/call_demo.c:13:[kernel] warning: signed overflow. assert *s+i ≤ 2147483647; +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function call1 <- main. + Called from tests/slicing/call_demo.c:25. +[value] using specification for function call1 +[value] Done for function call1 +[value] computing for function call2 <- main. + Called from tests/slicing/call_demo.c:26. +[value] using specification for function call2 +[value] Done for function call2 +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function oper +[from] Done for function oper +[from] Computing for function call1 +[from] Done for function call1 +[from] Computing for function call2 +[from] Done for function call2 +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function oper +[pdg] done for function oper +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int call2(int v); + +void oper_slice_1(int *p, int i) +{ + *p *= i; + return; +} + +void main(int n) +{ + int i; + int product; + product = 1; + i = 0; + while (i < n) { + oper_slice_1(& product,i); + i ++; + } + call2(product); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/call_demo.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/call_demo.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/call_demo.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/call_demo.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,127 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/call_demo.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/call_demo.c:22:[value] entering loop for the first time +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +tests/slicing/call_demo.c:14:[kernel] warning: signed overflow. assert *p*i ≤ 2147483647; +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +tests/slicing/call_demo.c:13:[kernel] warning: signed overflow. assert *s+i ≤ 2147483647; +[value] Recording results for oper +[value] Done for function oper +[value] computing for function oper <- main. + Called from tests/slicing/call_demo.c:23. +[value] Recording results for oper +[value] Done for function oper +[value] computing for function call1 <- main. + Called from tests/slicing/call_demo.c:25. +[value] using specification for function call1 +[value] Done for function call1 +[value] computing for function call2 <- main. + Called from tests/slicing/call_demo.c:26. +[value] using specification for function call2 +[value] Done for function call2 +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function oper +[from] Done for function oper +[from] Computing for function call1 +[from] Done for function call1 +[from] Computing for function call2 +[from] Done for function call2 +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function oper +[pdg] done for function oper +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int call1(int v); + +void oper_slice_1(int *s, int i) +{ + *s += i; + return; +} + +void main(int n) +{ + int i; + int sum; + sum = 0; + i = 0; + while (i < n) { + oper_slice_1(& sum,i); + i ++; + } + call1(sum); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/callwise.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/callwise.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/callwise.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/callwise.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,228 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/callwise.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + a ∈ {1} + b ∈ {1} + c ∈ {1} + d ∈ {1} + p ∈ {0} +[value] computing for function f <- main. + Called from tests/slicing/callwise.c:39. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/slicing/callwise.c:40. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function choose <- main. + Called from tests/slicing/callwise.c:42. +[value] Recording results for choose +[from] Computing for function choose +[from] Done for function choose +[value] Done for function choose +[value] computing for function choose <- main. + Called from tests/slicing/callwise.c:43. +[value] Recording results for choose +[from] Computing for function choose +[from] Done for function choose +[value] Done for function choose +[value] computing for function fs163_main <- main. + Called from tests/slicing/callwise.c:45. +[value] computing for function fs163_f <- fs163_main <- main. + Called from tests/slicing/callwise.c:24. +[value] Recording results for fs163_f +[from] Computing for function fs163_f +[from] Done for function fs163_f +[value] Done for function fs163_f +[value] computing for function fs163_f <- fs163_main <- main. + Called from tests/slicing/callwise.c:25. +[value] Recording results for fs163_f +[from] Computing for function fs163_f +[from] Done for function fs163_f +[value] Done for function fs163_f +[value] computing for function fs163_f <- fs163_main <- main. + Called from tests/slicing/callwise.c:26. +[value] Recording results for fs163_f +[from] Computing for function fs163_f +[from] Done for function fs163_f +[value] Done for function fs163_f +[value] computing for function fs163_f <- fs163_main <- main. + Called from tests/slicing/callwise.c:27. +[value] Recording results for fs163_f +[from] Computing for function fs163_f +[from] Done for function fs163_f +[value] Done for function fs163_f +[value] computing for function fs163_f <- fs163_main <- main. + Called from tests/slicing/callwise.c:28. +[value] Recording results for fs163_f +[from] Computing for function fs163_f +[from] Done for function fs163_f +[value] Done for function fs163_f +tests/slicing/callwise.c:29:[value] entering loop for the first time +[value] computing for function fs163_f <- fs163_main <- main. + Called from tests/slicing/callwise.c:30. +[value] Recording results for fs163_f +[from] Computing for function fs163_f +[from] Done for function fs163_f +[value] Done for function fs163_f +[value] computing for function fs163_f <- fs163_main <- main. + Called from tests/slicing/callwise.c:30. +[value] Recording results for fs163_f +[from] Computing for function fs163_f +[from] Done for function fs163_f +[value] Done for function fs163_f +[value] computing for function fs163_f <- fs163_main <- main. + Called from tests/slicing/callwise.c:30. +[value] Recording results for fs163_f +[from] Computing for function fs163_f +[from] Done for function fs163_f +[value] Done for function fs163_f +[value] computing for function fs163_f <- fs163_main <- main. + Called from tests/slicing/callwise.c:30. +[value] Recording results for fs163_f +[from] Computing for function fs163_f +[from] Done for function fs163_f +[value] Done for function fs163_f +[value] computing for function fs163_f <- fs163_main <- main. + Called from tests/slicing/callwise.c:30. +[value] Recording results for fs163_f +[from] Computing for function fs163_f +[from] Done for function fs163_f +[value] Done for function fs163_f +[value] computing for function fs163_f <- fs163_main <- main. + Called from tests/slicing/callwise.c:30. +[value] Recording results for fs163_f +[from] Computing for function fs163_f +[from] Done for function fs163_f +[value] Done for function fs163_f +[value] Recording results for fs163_main +[from] Computing for function fs163_main +[from] Done for function fs163_main +[value] Done for function fs163_main +tests/slicing/callwise.c:45:[kernel] warning: accessing uninitialized left-value: + assert \initialized(&tmp_0); + (tmp_0 from fs163_main(10)) +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to fs163_f at tests/slicing/callwise.c:24 (by fs163_main): + A FROM p_0; n +[from] call to fs163_f at tests/slicing/callwise.c:25 (by fs163_main): + B FROM p_0; n +[from] call to fs163_f at tests/slicing/callwise.c:26 (by fs163_main): + C FROM p_0; n +[from] call to fs163_f at tests/slicing/callwise.c:27 (by fs163_main): + T[0] FROM p_0; n +[from] call to fs163_f at tests/slicing/callwise.c:28 (by fs163_main): + T[1] FROM p_0; n +[from] call to fs163_f at tests/slicing/callwise.c:30 (by fs163_main): + T[0..4] FROM p_0; n (and SELF) +[from] call to f at tests/slicing/callwise.c:39 (by main): + a FROM a; b; p_0; q +[from] call to f at tests/slicing/callwise.c:40 (by main): + c FROM c; d; p_0; q +[from] call to choose at tests/slicing/callwise.c:42 (by main): + \result FROM cond; y +[from] call to choose at tests/slicing/callwise.c:43 (by main): + \result FROM cond; x +[from] call to fs163_main at tests/slicing/callwise.c:45 (by main): + \result FROM \nothing +[from] entry point: + a FROM a; b + b FROM \nothing + c FROM c; d + \result FROM a; b +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function fs163_main +[pdg] done for function fs163_main +[pdg] computing for function fs163_f +[pdg] done for function fs163_f +[pdg] computing for function choose +[pdg] done for function choose +[pdg] computing for function f +[pdg] done for function f +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int a = 1; +int b = 1; +void f_slice_1(int *p_0, int *q) +{ + *p_0 += *q; + return; +} + +int choose_slice_1(int cond, int x, int y) +{ + int tmp; + if (cond) tmp = x; else tmp = y; + return tmp; +} + +void fs163_f_slice_1(int *p_0, int n) +{ + *p_0 = n; + return; +} + +int fs163_main_slice_1(void) +{ + int __retres; + int T[5]; + { + int i; + i = 0; + while (i < 5) { + fs163_f_slice_1(& T[i],i); + i ++; + } + } + __retres = T[3]; + return __retres; +} + +int main(void) +{ + int n; + int m; + int tmp; + int tmp_0; + n = 2; + m = 3; + f_slice_1(& a,& b); + { + /*sequence*/ + tmp = choose_slice_1(1,n,m); + a += tmp; + } + { + /*sequence*/ + tmp_0 = fs163_main_slice_1(); + a += tmp_0; + } + return a; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/combine.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/combine.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/combine.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/combine.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,249 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/combine.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/slicing/combine.c:24. +[value] computing for function g <- f <- main. + Called from tests/slicing/combine.c:17. +[value] using specification for function g +[value] Done for function g +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/slicing/combine.c:26. +[value] computing for function g <- f <- main. + Called from tests/slicing/combine.c:17. +[value] Done for function g +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[from] Computing for function f +[from] Computing for function g <-f +[from] Done for function g +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function g: + \result FROM x +[from] Function f: + \result FROM c; x +[from] Function main: + \result FROM x +[from] ====== END OF DEPENDENCIES ====== +[slicing] making slicing project 'slicing_1'... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f +[pdg] done for function f +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +extern int g(int x); + +int f_slice_1(int c, int x) +{ + int y; + int tmp; + int r; + if (c) tmp = 1; else tmp = -1; + y = tmp; + if (y < 0) r = x + y; else r = 0; + r = g(r); + return r; +} + +int main(int x) +{ + int r; + if (x > 0) r = f_slice_1(0,x); else r = f_slice_1(1,x); + return r; +} + + +Let's split 'f': +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'slicing_result'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'slicing_result tmp' +[sparecode] removed unused global declarations in new project 'slicing_result' +After Slicing : +/* Generated by Frama-C */ +extern int g(int x); + +int f_s_2(int c, int x) +{ + int y; + int tmp; + int r; + if (c) tmp = 1; else tmp = -1; + y = tmp; + if (y < 0) r = x + y; else r = 0; + r = g(r); + return r; +} + +int f(int c, int x) +{ + int y; + int tmp; + int r; + if (c) tmp = 1; else tmp = -1; + y = tmp; + if (y < 0) r = x + y; else r = 0; + r = g(r); + return r; +} + +int main(int x) +{ + int r; + if (x > 0) r = f(0,x); else r = f_s_2(1,x); + return r; +} + + +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/slicing/combine.c:24. +[value] computing for function g <- f <- main. + Called from tests/slicing/combine.c:17. +tests/slicing/combine.c:17:[kernel] warning: Neither code nor specification for function g, generating default assigns from the prototype +[value] using specification for function g +[value] Done for function g +[value] Recording results for f +[value] Done for function f +[value] computing for function f_s_2 <- main. + Called from tests/slicing/combine.c:26. +[value] computing for function g <- f_s_2 <- main. + Called from tests/slicing/combine.c:17. +[value] Done for function g +[value] Recording results for f_s_2 +[value] Done for function f_s_2 +[value] Recording results for main +[value] done for function main +After Constant propagation : +/* Generated by Frama-C */ +/*@ assigns \result; + assigns \result \from x; */ +extern int g(int x); + +int f_s_2(int c, int x) +{ + int y; + int tmp; + int r; + if (1) tmp = 1; else tmp = -1; + y = 1; + if (0) r = x + y; else r = 0; + r = g(0); + return r; +} + +int f(int c, int x) +{ + int y; + int tmp; + int r; + if (0) tmp = 1; else tmp = -1; + y = -1; + if (1) r = x + -1; else r = 0; + r = g(r); + return r; +} + +int main(int x) +{ + int r; + if (x > 0) r = f(0,x); else r = f_s_2(1,x); + return r; +} + + +[sparecode] remove unused code... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/slicing/combine.c:24. +[value] computing for function g <- f <- main. + Called from tests/slicing/combine.c:17. +[value] using specification for function g +[value] Done for function g +[value] Recording results for f +[value] Done for function f +[value] computing for function f_s_2 <- main. + Called from tests/slicing/combine.c:26. +[value] computing for function g <- f_s_2 <- main. + Called from tests/slicing/combine.c:17. +[value] Done for function g +[value] Recording results for f_s_2 +[value] Done for function f_s_2 +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function f +[from] Computing for function g <-f +[from] Done for function g +[from] Done for function f +[from] Computing for function f_s_2 +[from] Done for function f_s_2 +[pdg] done for function main +[pdg] computing for function f_s_2 +[pdg] done for function f_s_2 +[pdg] computing for function f +[pdg] done for function f +[pdg] computing for function g +[pdg] done for function g +[sparecode] remove unused global declarations... +[sparecode] result in new project 'propagated without sparecode'. +After Sparecode : +/* Generated by Frama-C */ +/*@ assigns \result; + assigns \result \from x; */ +extern int g(int x); + +int f_s_2(void) +{ + int r; + r = g(0); + return r; +} + +int f(int x) +{ + int r; + r = x + -1; + r = g(r); + return r; +} + +int main(int x) +{ + int r; + if (x > 0) r = f(x); else r = f_s_2(); + return r; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/csmith.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/csmith.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/csmith.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/csmith.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,172 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/csmith.c (with preprocessing) +[value] Analyzing a complete application starting at bts906b +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G1 ∈ {0} + G1b ∈ {0} + G2 ∈ {0} +tests/slicing/csmith.c:168:[value] entering loop for the first time +tests/slicing/csmith.c:169:[value] entering loop for the first time +[value] Recording results for bts906b +[value] done for function bts906b +[pdg] computing for function bts906b +[pdg] done for function bts906b +[pdg] PDG for bts906b + {n1}: InCtrl + {n2}: VarDecl : x + {n3}: VarDecl : i + {n4}: VarDecl : __retres + {n5}: x = 0; + -[-c-]-> 1 + -[a--]-> 2 + {n6}: i = 2; + -[-c-]-> 1 + -[a--]-> 3 + {n7}: x + -[-c-]-> 1 + -[--d]-> 2 + -[-c-]-> 10 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 16 + -[-c-]-> 21 + {n8}: goto B; + -[-c-]-> 1 + -[-c-]-> 9 + -[-c-]-> 10 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 16 + -[-c-]-> 21 + {n9}: B: + -[-c-]-> 1 + -[-c-]-> 10 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 16 + -[-c-]-> 21 + {n10}: while(1) + -[-c-]-> 1 + -[-c-]-> 10 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 16 + -[-c-]-> 21 + {n11}: i >= 0 + -[-c-]-> 1 + -[--d]-> 3 + -[--d]-> 6 + -[-c-]-> 10 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 16 + -[--d]-> 17 + -[-c-]-> 21 + {n12}: block + -[-c-]-> 1 + -[-c-]-> 10 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 16 + -[-c-]-> 21 + {n13}: while(1) + -[-c-]-> 1 + -[-c-]-> 10 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 16 + -[-c-]-> 21 + {n14}: block + -[-c-]-> 1 + -[-c-]-> 10 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 16 + -[-c-]-> 21 + {n15}: i + -[-c-]-> 1 + -[--d]-> 3 + -[--d]-> 6 + -[-c-]-> 10 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 16 + -[--d]-> 17 + -[-c-]-> 21 + {n16}: goto B; + -[-c-]-> 1 + -[-c-]-> 9 + -[-c-]-> 10 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 16 + -[-c-]-> 21 + {n17}: B: i --; + -[-c-]-> 1 + -[a-d]-> 3 + -[--d]-> 6 + -[-c-]-> 10 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 16 + -[--d]-> 17 + -[-c-]-> 21 + {n18}: x ++; + -[-c-]-> 1 + -[a-d]-> 2 + -[--d]-> 5 + -[-c-]-> 10 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 16 + -[-c-]-> 21 + {n19}: break; + -[-c-]-> 1 + -[-c-]-> 10 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 16 + -[-c-]-> 21 + {n20}: __retres = x; + -[-c-]-> 1 + -[--d]-> 2 + -[a--]-> 4 + -[-c-]-> 10 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 16 + -[--d]-> 18 + -[-c-]-> 21 + {n21}: goto return_label; + -[-c-]-> 1 + -[-c-]-> 10 + -[-c-]-> 12 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 16 + -[-c-]-> 21 + -[-c-]-> 22 + {n22}: return_label: + -[-c-]-> 1 + {n23}: return_label: return __retres; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 20 + {n24}: OutRet + -[--d]-> 23 diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/csmith.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/csmith.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/csmith.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/csmith.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,158 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/csmith.c (with preprocessing) +[value] Analyzing a complete application starting at bts906c +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G1 ∈ {0} + G1b ∈ {0} + G2 ∈ {0} +tests/slicing/csmith.c:189:[value] entering loop for the first time +tests/slicing/csmith.c:190:[value] entering loop for the first time +[value] Recording results for bts906c +[value] done for function bts906c +[pdg] computing for function bts906c +[pdg] done for function bts906c +[pdg] PDG for bts906c + {n1}: InCtrl + {n2}: VarDecl : x + {n3}: VarDecl : i + {n4}: VarDecl : __retres + {n5}: x = 0; + -[-c-]-> 1 + -[a--]-> 2 + {n6}: W: + -[-c-]-> 1 + -[-c-]-> 9 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 21 + {n7}: goto W; + -[-c-]-> 1 + -[-c-]-> 6 + -[-c-]-> 9 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 21 + {n8}: i = 2; + -[-c-]-> 1 + -[a--]-> 3 + {n9}: while(1) + -[-c-]-> 1 + -[-c-]-> 9 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 14 + -[-c-]-> 15 + {n10}: i >= 0 + -[-c-]-> 1 + -[--d]-> 3 + -[--d]-> 8 + -[-c-]-> 9 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 14 + -[-c-]-> 15 + -[--d]-> 17 + {n11}: block + -[-c-]-> 1 + -[-c-]-> 9 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 14 + -[-c-]-> 15 + {n12}: while(1) + -[-c-]-> 1 + -[-c-]-> 9 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 14 + -[-c-]-> 15 + {n13}: block + -[-c-]-> 1 + -[-c-]-> 9 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 14 + -[-c-]-> 15 + {n14}: i + -[-c-]-> 1 + -[--d]-> 3 + -[--d]-> 8 + -[-c-]-> 9 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 14 + -[-c-]-> 15 + -[--d]-> 17 + {n15}: goto B; + -[-c-]-> 1 + -[-c-]-> 9 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 16 + {n16}: B: + -[-c-]-> 1 + -[-c-]-> 9 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 14 + -[-c-]-> 15 + {n17}: B: i --; + -[-c-]-> 1 + -[a-d]-> 3 + -[--d]-> 8 + -[-c-]-> 9 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 14 + -[-c-]-> 15 + -[--d]-> 17 + {n18}: x ++; + -[-c-]-> 1 + -[a-d]-> 2 + -[--d]-> 5 + -[-c-]-> 9 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 14 + -[-c-]-> 15 + {n19}: break; + -[-c-]-> 1 + -[-c-]-> 9 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 14 + -[-c-]-> 15 + {n20}: __retres = x; + -[-c-]-> 1 + -[--d]-> 2 + -[a--]-> 4 + -[-c-]-> 9 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 14 + -[-c-]-> 15 + -[--d]-> 18 + {n21}: goto return_label; + -[-c-]-> 1 + -[-c-]-> 9 + -[-c-]-> 11 + -[-c-]-> 13 + -[-c-]-> 14 + -[-c-]-> 15 + -[-c-]-> 22 + {n22}: return_label: + -[-c-]-> 1 + {n23}: return_label: return __retres; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 20 + {n24}: OutRet + -[--d]-> 23 diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/csmith.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/csmith.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/csmith.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/csmith.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,424 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/csmith.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G1 ∈ {0} + G1b ∈ {0} + G2 ∈ {0} +[value] computing for function f1 <- main. + Called from tests/slicing/csmith.c:234. +tests/slicing/csmith.c:15:[value] entering loop for the first time +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f1b <- main. + Called from tests/slicing/csmith.c:235. +[value] Recording results for f1b +[value] Done for function f1b +[value] computing for function f2 <- main. + Called from tests/slicing/csmith.c:236. +tests/slicing/csmith.c:36:[value] entering loop for the first time +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function bts181 <- main. + Called from tests/slicing/csmith.c:237. +[value] Recording results for bts181 +[value] Done for function bts181 +[value] computing for function bts181b <- main. + Called from tests/slicing/csmith.c:238. +[value] Recording results for bts181b +[value] Done for function bts181b +[value] computing for function bts807 <- main. + Called from tests/slicing/csmith.c:239. +tests/slicing/csmith.c:68:[value] entering loop for the first time +[value] Recording results for bts807 +[value] Done for function bts807 +[value] computing for function bts809 <- main. + Called from tests/slicing/csmith.c:240. +tests/slicing/csmith.c:78:[value] entering loop for the first time +[value] Recording results for bts809 +[value] Done for function bts809 +[value] computing for function bts879 <- main. + Called from tests/slicing/csmith.c:241. +[value] Recording results for bts879 +[value] Done for function bts879 +[value] computing for function bts879b <- main. + Called from tests/slicing/csmith.c:242. +[value] Recording results for bts879b +[value] Done for function bts879b +[value] computing for function bts899 <- main. + Called from tests/slicing/csmith.c:243. +tests/slicing/csmith.c:135:[value] entering loop for the first time +tests/slicing/csmith.c:141:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for bts899 +[value] Done for function bts899 +tests/slicing/csmith.c:243:[kernel] warning: signed overflow. assert x+tmp_5 ≤ 2147483647; + (tmp_5 from bts899()) +[value] computing for function bts906 <- main. + Called from tests/slicing/csmith.c:244. +tests/slicing/csmith.c:149:[value] entering loop for the first time +tests/slicing/csmith.c:150:[value] entering loop for the first time +[value] Recording results for bts906 +[value] Done for function bts906 +tests/slicing/csmith.c:244:[kernel] warning: signed overflow. assert x+tmp_6 ≤ 2147483647; + (tmp_6 from bts906()) +[value] computing for function bts906b <- main. + Called from tests/slicing/csmith.c:245. +tests/slicing/csmith.c:168:[value] entering loop for the first time +tests/slicing/csmith.c:169:[value] entering loop for the first time +[value] Recording results for bts906b +[value] Done for function bts906b +tests/slicing/csmith.c:245:[kernel] warning: signed overflow. assert x+tmp_7 ≤ 2147483647; + (tmp_7 from bts906b()) +[value] computing for function bts963 <- main. + Called from tests/slicing/csmith.c:247. +tests/slicing/csmith.c:211:[value] entering loop for the first time +[value] Recording results for bts963 +[value] Done for function bts963 +tests/slicing/csmith.c:247:[kernel] warning: signed overflow. assert x+tmp_8 ≤ 2147483647; + (tmp_8 from bts963()) +[value] computing for function bts963b <- main. + Called from tests/slicing/csmith.c:248. +tests/slicing/csmith.c:223:[value] entering loop for the first time +[value] Recording results for bts963b +[value] Done for function bts963b +tests/slicing/csmith.c:248:[kernel] warning: signed overflow. assert x+tmp_9 ≤ 2147483647; + (tmp_9 from bts963b()) +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f1b +[from] Done for function f1b +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function bts181 +[from] Done for function bts181 +[from] Computing for function bts181b +[from] Done for function bts181b +[from] Computing for function bts807 +[from] Done for function bts807 +[from] Computing for function bts809 +[from] Done for function bts809 +[from] Computing for function bts879 +[from] Done for function bts879 +[from] Computing for function bts879b +[from] Done for function bts879b +[from] Computing for function bts899 +[from] Done for function bts899 +[from] Computing for function bts906 +[from] Done for function bts906 +[from] Computing for function bts906b +[from] Done for function bts906b +[from] Computing for function bts963 +[from] Done for function bts963 +[from] Computing for function bts963b +[from] Done for function bts963b +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function bts963b +[pdg] done for function bts963b +[pdg] computing for function bts963 +[pdg] done for function bts963 +[pdg] computing for function bts906b +[pdg] done for function bts906b +[pdg] computing for function bts906 +[pdg] done for function bts906 +[pdg] computing for function bts899 +[pdg] done for function bts899 +[pdg] computing for function bts879b +[pdg] done for function bts879b +[pdg] computing for function bts879 +[pdg] done for function bts879 +[pdg] computing for function bts809 +[pdg] done for function bts809 +[pdg] computing for function bts807 +[pdg] done for function bts807 +[pdg] computing for function bts181b +[pdg] done for function bts181b +[pdg] computing for function bts181 +[pdg] done for function bts181 +[pdg] computing for function f2 +[pdg] done for function f2 +[pdg] computing for function f1b +[pdg] done for function f1b +[pdg] computing for function f1 +[pdg] done for function f1 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G1; +void f1_slice_1(void) +{ + G1 = 3; + goto break_cont_1; + break_cont_1: return; +} + +int G1b; +void f1b_slice_1(void) +{ + G1b = 3; + goto B; + B: ; + return; +} + +int G2; +void f2_slice_1(void) +{ + while (1) { + G2 = 3; + break; + } + return; +} + +int bts181_slice_1(int c) +{ + int y; + y = 0; + if (c) y = 3; + return y; +} + +int bts181b_slice_1(int c) +{ + int y; + y = 0; + if (c) y = 3; + return y; +} + +int bts807_slice_1(void) +{ + int __retres; + int g; + if (1) goto _LOR; + else { + _LOR: ; + g = 21; + __retres = g; + goto return_label; + } + return_label: return __retres; +} + +int bts809_slice_1(void) +{ + int __retres; + int x; + x = 10; + goto L; + L: ; + __retres = x; + goto return_label; + return_label: return __retres; +} + +int bts879_slice_1(int c) +{ + int __retres; + int p; + int tmp; + if (c) tmp = 0; else tmp = 10; + p = tmp; + if (p) goto _LOR; + else + if (0) { + _LOR: __retres = 1; + goto return_label; + } + __retres = 0; + return_label: return __retres; +} + +int bts879b_slice_1(int c) +{ + int __retres; + int p; + int tmp; + if (c) tmp = 0; else tmp = 10; + p = tmp; + if (p) { + __retres = 1; + goto return_label; + } + __retres = 0; + return_label: return __retres; +} + +int bts899_slice_1(void) +{ + int x; + x = 254; + { + int i; + i = 17; + while (i != -9) { + if (! i) goto __Cont; + x ++; + __Cont: i --; + } + } + return x; +} + +int bts906_slice_1(void) +{ + int __retres; + int x; + int i; + x = 0; + i = 2; + while (1) { + if (! i) { + x ++; + __retres = x; + goto return_label; + } + B: i --; + } + return_label: return __retres; +} + +int bts906b_slice_1(void) +{ + int __retres; + int x; + int i; + x = 0; + i = 2; + while (1) { + if (! i) { + x ++; + __retres = x; + goto return_label; + } + B: i --; + } + return_label: return __retres; +} + +int bts963_slice_1(void) +{ + int __retres; + int x; + x = 0; + L: ; + x ++; + if (x < 3) goto L; + else { + __retres = x; + goto return_label; + } + return_label: return __retres; +} + +int bts963b_slice_1(void) +{ + int __retres; + int x; + x = 0; + L: ; + x ++; + if (x < 3) goto L; + else { + __retres = x; + goto return_label; + } + return_label: return __retres; +} + +int main(int n) +{ + int x; + int tmp; + int tmp_0; + int tmp_1; + int tmp_2; + int tmp_3; + int tmp_4; + int tmp_5; + int tmp_6; + int tmp_7; + int tmp_8; + int tmp_9; + x = 0; + f1_slice_1(); + x += G1; + f1b_slice_1(); + x += G1b; + f2_slice_1(); + x += G2; + { + /*sequence*/ + tmp = bts181_slice_1(n); + x += tmp; + } + { + /*sequence*/ + tmp_0 = bts181b_slice_1(n); + x += tmp_0; + } + { + /*sequence*/ + tmp_1 = bts807_slice_1(); + x += tmp_1; + } + { + /*sequence*/ + tmp_2 = bts809_slice_1(); + x += tmp_2; + } + { + /*sequence*/ + tmp_3 = bts879_slice_1(n); + x += tmp_3; + } + { + /*sequence*/ + tmp_4 = bts879b_slice_1(n); + x += tmp_4; + } + { + /*sequence*/ + tmp_5 = bts899_slice_1(); + x += tmp_5; + } + { + /*sequence*/ + tmp_6 = bts906_slice_1(); + x += tmp_6; + } + { + /*sequence*/ + tmp_7 = bts906b_slice_1(); + x += tmp_7; + } + { + /*sequence*/ + tmp_8 = bts963_slice_1(); + x += tmp_8; + } + { + /*sequence*/ + tmp_9 = bts963b_slice_1(); + x += tmp_9; + } + return x; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/ex_spec_interproc.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/ex_spec_interproc.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/ex_spec_interproc.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/ex_spec_interproc.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,1013 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/ex_spec_interproc.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {0} + Y ∈ {0} + Z ∈ {0} + I ∈ {0} + J ∈ {0} + K ∈ {0} + L ∈ {0} + M ∈ {0} +[value] computing for function f <- main. + Called from tests/slicing/ex_spec_interproc.c:35. +[value] computing for function g <- f <- main. + Called from tests/slicing/ex_spec_interproc.c:21. +[value] Recording results for g +[value] Done for function g +[value] computing for function g <- f <- main. + Called from tests/slicing/ex_spec_interproc.c:22. +[value] Recording results for g +[value] Done for function g +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[from] Computing for function g +[from] Done for function g +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function g: + X FROM u + Y FROM u; v + \result FROM w +[from] Function f: + X FROM c + Y FROM c; d + Z FROM e + \result FROM c +[from] Function main: + X FROM \nothing + Y FROM \nothing + Z FROM \nothing + I FROM \nothing + J FROM \nothing + K FROM \nothing + L FROM \nothing + M FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] making slicing project 'slicing_1'... +[pdg] computing for function f +[pdg] done for function f +Slicing project worklist [default/slicing_1] = +[f_slice_1 = (n:32(restrict to X) ,<[--d], [---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +int X; +int Y; +int Z; +Print slice = +f_slice_1: +(InCtrl: <[--d], [ S ]>) +(In1: <[---], [ S ]>) +(In2: <[---], [ S ]>) +(In3: <[--d], [ S ]>) +(In4: <[---], [ S ]>) +(In5: <[---], [ S ]>) +(OutRet: <[--d], [---]>) + +/**/int f(/* <[---], [ S ]> */ int a, /* <[---], [ S ]> */ int b, + /* <[--d], [ S ]> */ int c, /* <[---], [ S ]> */ int d, + /* <[---], [ S ]> */ int e) +{ + /* <[--d], [ S ]> */ int r; + /* <[---], [ S ]> */ + a ++; + /* <[---], [ S ]> */ + b ++; + /* <[--d], [ S ]> */ + c ++; + /* <[---], [ S ]> */ + d ++; + /* <[---], [ S ]> */ + e ++; + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In1: <[---], [ S ]>) + (In2: <[---], [ S ]>) + (In3: <[--d], [ S ]>) + (OutRet: <[--d], [ S ]>) + (Out(Y): <[---], [ S ]>) + (Out(X): <[---], [ S ]>) */ + /* call to source function */ + /* <[--d], [ S ]> */ + r = g(a,b,c); + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In1: <[--d], [ S ]>) + (In2: <[---], [ S ]>) + (In3: <[---], [ S ]>) + (OutRet: <[---], [ S ]>) + (Out(X): <[--d], [ S ]>) + (Out(Y): <[---], [ S ]>) */ + /* call to source function */ + /* <[--d], [ S ]> */ + Z = g(r,d,e); + /* <[--d], [---]> */ + return X; +} + +int I; +int J; +int K; +int L; +int M; +Slicing project worklist [default/slicing_1] = + + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int X; +int Y; +int g(int u, int v, int w) +{ + u ++; + v ++; + w ++; + X = u; + Y = u + v; + return w; +} + +int Z; +int f_slice_1(int a, int b, int c, int d, int e) +{ + int r; + a ++; + b ++; + c ++; + d ++; + e ++; + r = g(a,b,c); + Z = g(r,d,e); + return X; +} + + +[slicing] making slicing project 'slicing_2'... +Slicing project worklist [default/slicing_2] = +[f_slice_1 = (n:32(restrict to X) ,<[--d], [---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function g +[pdg] done for function g +int X; +int Y; +Print slice = +g_slice_1: +(InCtrl: <[---], [--d]>) +(In1: <[---], [--d]>) +(In2: <[---], [ S ]>) +(In3: <[---], [--d]>) +(OutRet: <[---], [--d]>) + +/**/int g(/* <[---], [--d]> */ int u, /* <[---], [ S ]> */ int v, + /* <[---], [--d]> */ int w) +{ + /* <[---], [--d]> */ + u ++; + /* <[---], [ S ]> */ + v ++; + /* <[---], [--d]> */ + w ++; + /* <[---], [--d]> */ + X = u; + /* <[---], [ S ]> */ + Y = u + v; + /* <[---], [--d]> */ + return w; +} + +int Z; +Print slice = +f_slice_1: +(InCtrl: <[--d], [ S ]>) +(In1: <[---], [ S ]>) +(In2: <[---], [ S ]>) +(In3: <[--d], [ S ]>) +(In4: <[---], [ S ]>) +(In5: <[---], [ S ]>) +(OutRet: <[--d], [---]>) + +/**/int f(/* <[---], [ S ]> */ int a, /* <[---], [ S ]> */ int b, + /* <[--d], [ S ]> */ int c, /* <[---], [ S ]> */ int d, + /* <[---], [ S ]> */ int e) +{ + /* <[--d], [ S ]> */ int r; + /* <[---], [ S ]> */ + a ++; + /* <[---], [ S ]> */ + b ++; + /* <[--d], [ S ]> */ + c ++; + /* <[---], [ S ]> */ + d ++; + /* <[---], [ S ]> */ + e ++; + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In1: <[---], [ S ]>) + (In2: <[---], [ S ]>) + (In3: <[--d], [ S ]>) + (OutRet: <[--d], [ S ]>) */ + /* call to g_slice_1: + (InCtrl: <[---], [--d]>) + (In1: <[---], [--d]>) + (In2: <[---], [ S ]>) + (In3: <[---], [--d]>) + (OutRet: <[---], [--d]>) */ + /* <[--d], [ S ]> */ + r = g(a,b,c); + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In1: <[--d], [ S ]>) + (In2: <[---], [ S ]>) + (In3: <[---], [ S ]>) + (Out(X): <[--d], [---]>) */ + /* call to g_slice_1: + (InCtrl: <[---], [--d]>) + (In1: <[---], [--d]>) + (In2: <[---], [ S ]>) + (In3: <[---], [--d]>) + (OutRet: <[---], [--d]>) */ + /* <[--d], [ S ]> */ + Z = g(r,d,e); + /* <[--d], [---]> */ + return X; +} + +int I; +int J; +int K; +int L; +int M; +Slicing project worklist [default/slicing_2] = + + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int X; +int Y; +int g_slice_1(int u, int v, int w) +{ + u ++; + v ++; + w ++; + X = u; + Y = u + v; + return w; +} + +int f_slice_1(int a, int b, int c, int d, int e) +{ + int r; + a ++; + b ++; + c ++; + d ++; + e ++; + r = g_slice_1(a,b,c); + g_slice_1(r,d,e); + return X; +} + + +[slicing] making slicing project 'slicing_3'... +Slicing project worklist [default/slicing_3] = +[f_slice_1 = (n:32(restrict to X) ,<[--d], [---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +int X; +int Y; +Print slice = +g_slice_1: +(InCtrl: <[---], [--d]>) +(In1: <[---], [--d]>) +(In3: <[---], [--d]>) +(OutRet: <[---], [--d]>) + +/**/int g(/* <[---], [--d]> */ int u, /* <[---], [---]> */ int v, + /* <[---], [--d]> */ int w) +{ + /* <[---], [--d]> */ + u ++; + /* <[---], [---]> */ + v ++; + /* <[---], [--d]> */ + w ++; + /* <[---], [--d]> */ + X = u; + /* <[---], [---]> */ + Y = u + v; + /* <[---], [--d]> */ + return w; +} + +int Z; +Print slice = +f_slice_1: +(InCtrl: <[--d], [ S ]>) +(In1: <[---], [ S ]>) +(In3: <[--d], [ S ]>) +(In5: <[---], [ S ]>) +(OutRet: <[--d], [---]>) + +/**/int f(/* <[---], [ S ]> */ int a, /* <[---], [---]> */ int b, + /* <[--d], [ S ]> */ int c, /* <[---], [---]> */ int d, + /* <[---], [ S ]> */ int e) +{ + /* <[--d], [ S ]> */ int r; + /* <[---], [ S ]> */ + a ++; + /* <[---], [---]> */ + b ++; + /* <[--d], [ S ]> */ + c ++; + /* <[---], [---]> */ + d ++; + /* <[---], [ S ]> */ + e ++; + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In1: <[---], [ S ]>) + (In3: <[--d], [ S ]>) + (OutRet: <[--d], [ S ]>) */ + /* call to g_slice_1: + (InCtrl: <[---], [--d]>) + (In1: <[---], [--d]>) + (In3: <[---], [--d]>) + (OutRet: <[---], [--d]>) */ + /* <[--d], [ S ]> */ + r = g(a,b,c); + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In1: <[--d], [ S ]>) + (In3: <[---], [ S ]>) + (Out(X): <[--d], [---]>) */ + /* call to g_slice_1: + (InCtrl: <[---], [--d]>) + (In1: <[---], [--d]>) + (In3: <[---], [--d]>) + (OutRet: <[---], [--d]>) */ + /* <[--d], [ S ]> */ + Z = g(r,d,e); + /* <[--d], [---]> */ + return X; +} + +int I; +int J; +int K; +int L; +int M; +Slicing project worklist [default/slicing_3] = + + +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +int X; +int Y; +Print slice = +g_slice_1: +(InCtrl: <[---], [--d]>) +(In1: <[---], [--d]>) +(In3: <[---], [--d]>) +(OutRet: <[---], [--d]>) + +/**/int g(/* <[---], [--d]> */ int u, /* <[---], [---]> */ int v, + /* <[---], [--d]> */ int w) +{ + /* <[---], [--d]> */ + u ++; + /* <[---], [---]> */ + v ++; + /* <[---], [--d]> */ + w ++; + /* <[---], [--d]> */ + X = u; + /* <[---], [---]> */ + Y = u + v; + /* <[---], [--d]> */ + return w; +} + +int Z; +Print slice = +f_slice_1: +(InCtrl: <[--d], [ S ]>) +(In1: <[---], [ S ]>) +(In3: <[--d], [ S ]>) +(In5: <[---], [ S ]>) +(OutRet: <[--d], [---]>) + +/**/int f(/* <[---], [ S ]> */ int a, /* <[---], [---]> */ int b, + /* <[--d], [ S ]> */ int c, /* <[---], [---]> */ int d, + /* <[---], [ S ]> */ int e) +{ + /* <[--d], [ S ]> */ int r; + /* <[---], [ S ]> */ + a ++; + /* <[---], [---]> */ + b ++; + /* <[--d], [ S ]> */ + c ++; + /* <[---], [---]> */ + d ++; + /* <[---], [ S ]> */ + e ++; + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In1: <[---], [ S ]>) + (In3: <[--d], [ S ]>) + (OutRet: <[--d], [ S ]>) */ + /* call to g_slice_1: + (InCtrl: <[---], [--d]>) + (In1: <[---], [--d]>) + (In3: <[---], [--d]>) + (OutRet: <[---], [--d]>) */ + /* <[--d], [ S ]> */ + r = g(a,b,c); + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In1: <[--d], [ S ]>) + (In3: <[---], [ S ]>) + (Out(X): <[--d], [---]>) */ + /* call to g_slice_1: + (InCtrl: <[---], [--d]>) + (In1: <[---], [--d]>) + (In3: <[---], [--d]>) + (OutRet: <[---], [--d]>) */ + /* <[--d], [ S ]> */ + Z = g(r,d,e); + /* <[--d], [---]> */ + return X; +} + +int I; +int J; +int K; +int L; +int M; +Print slice = main_slice_1: (InCtrl: <[--d], [ S ]>) + +/**/int main(void) +{ + /* <[---], [---]> */ int res; + /* <[---], [ S ]> */ + I = 0; + /* <[---], [---]> */ + J = 0; + /* <[--d], [ S ]> */ + K = 0; + /* <[---], [---]> */ + L = 0; + /* <[---], [ S ]> */ + M = 0; + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In1: <[---], [ S ]>) + (In3: <[--d], [ S ]>) + (In5: <[---], [ S ]>) */ + /* call to f_slice_1: + (InCtrl: <[--d], [ S ]>) + (In1: <[---], [ S ]>) + (In3: <[--d], [ S ]>) + (In5: <[---], [ S ]>) + (OutRet: <[--d], [---]>) */ + /* <[--d], [ S ]> */ + res = f(I,J,K,L,M); + /* <[---], [---]> */ + return res; +} + +Slicing project worklist [default/slicing_3] = + + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int X; +int g_slice_1(int u, int w) +{ + u ++; + w ++; + X = u; + return w; +} + +int f_slice_1(int a, int c, int e) +{ + int r; + a ++; + c ++; + e ++; + r = g_slice_1(a,c); + g_slice_1(r,e); + return X; +} + +int I; +int K; +int M; +void main(void) +{ + I = 0; + K = 0; + M = 0; + f_slice_1(I,K,M); + return; +} + + +int X; +int Y; +Print slice = +g_slice_1: +(InCtrl: <[---], [--d]>) +(In1: <[---], [--d]>) +(In3: <[---], [--d]>) +(OutRet: <[---], [--d]>) + +/**/int g(/* <[---], [--d]> */ int u, /* <[---], [---]> */ int v, + /* <[---], [--d]> */ int w) +{ + /* <[---], [--d]> */ + u ++; + /* <[---], [---]> */ + v ++; + /* <[---], [--d]> */ + w ++; + /* <[---], [--d]> */ + X = u; + /* <[---], [---]> */ + Y = u + v; + /* <[---], [--d]> */ + return w; +} + +int Z; +Print slice = +f_slice_1: +(InCtrl: <[--d], [ S ]>) +(In1: <[---], [ S ]>) +(In3: <[--d], [ S ]>) +(In5: <[---], [ S ]>) +(OutRet: <[--d], [---]>) + +/**/int f(/* <[---], [ S ]> */ int a, /* <[---], [---]> */ int b, + /* <[--d], [ S ]> */ int c, /* <[---], [---]> */ int d, + /* <[---], [ S ]> */ int e) +{ + /* <[--d], [ S ]> */ int r; + /* <[---], [ S ]> */ + a ++; + /* <[---], [---]> */ + b ++; + /* <[--d], [ S ]> */ + c ++; + /* <[---], [---]> */ + d ++; + /* <[---], [ S ]> */ + e ++; + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In1: <[---], [ S ]>) + (In3: <[--d], [ S ]>) + (OutRet: <[--d], [ S ]>) */ + /* call to g_slice_1: + (InCtrl: <[---], [--d]>) + (In1: <[---], [--d]>) + (In3: <[---], [--d]>) + (OutRet: <[---], [--d]>) */ + /* <[--d], [ S ]> */ + r = g(a,b,c); + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In1: <[--d], [ S ]>) + (In3: <[---], [ S ]>) + (Out(X): <[--d], [---]>) */ + /* call to g_slice_1: + (InCtrl: <[---], [--d]>) + (In1: <[---], [--d]>) + (In3: <[---], [--d]>) + (OutRet: <[---], [--d]>) */ + /* <[--d], [ S ]> */ + Z = g(r,d,e); + /* <[--d], [---]> */ + return X; +} + +int I; +int J; +int K; +int L; +int M; +Slicing project worklist [default/slicing_3] = + + +int f(int a, int b, int c, int d, int e) +{ + int r; + /* 9 */ + a ++; + /* 10 */ + b ++; + /* 11 */ + c ++; + /* 12 */ + d ++; + /* 13 */ + e ++; + /* 14 */ + r = g(a,b,c); + /* 15 */ + Z = g(r,d,e); + /* 17 */ + return X; +} + +Slicing project worklist [default/slicing_3] = +[f_slice_1 = (n:13(restrict to a) ,<[--d], [---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +int X; +int Y; +Print slice = +g_slice_1: +(InCtrl: <[---], [--d]>) +(In1: <[---], [--d]>) +(In3: <[---], [--d]>) +(OutRet: <[---], [--d]>) + +/**/int g(/* <[---], [--d]> */ int u, /* <[---], [---]> */ int v, + /* <[---], [--d]> */ int w) +{ + /* <[---], [--d]> */ + u ++; + /* <[---], [---]> */ + v ++; + /* <[---], [--d]> */ + w ++; + /* <[---], [--d]> */ + X = u; + /* <[---], [---]> */ + Y = u + v; + /* <[---], [--d]> */ + return w; +} + +int Z; +Print slice = +f_slice_1: +(InCtrl: <[--d], [ S ]>) +(In1: <[--d], [ S ]>) +(In3: <[--d], [ S ]>) +(In5: <[---], [ S ]>) +(OutRet: <[--d], [---]>) + +/**/int f(/* <[--d], [ S ]> */ int a, /* <[---], [---]> */ int b, + /* <[--d], [ S ]> */ int c, /* <[---], [---]> */ int d, + /* <[---], [ S ]> */ int e) +{ + /* <[--d], [ S ]> */ int r; + /* <[--d], [ S ]> */ + a ++; + /* <[---], [---]> */ + b ++; + /* <[--d], [ S ]> */ + c ++; + /* <[---], [---]> */ + d ++; + /* <[---], [ S ]> */ + e ++; + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In1: <[---], [ S ]>) + (In3: <[--d], [ S ]>) + (OutRet: <[--d], [ S ]>) */ + /* call to g_slice_1: + (InCtrl: <[---], [--d]>) + (In1: <[---], [--d]>) + (In3: <[---], [--d]>) + (OutRet: <[---], [--d]>) */ + /* <[--d], [ S ]> */ + r = g(a,b,c); + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In1: <[--d], [ S ]>) + (In3: <[---], [ S ]>) + (Out(X): <[--d], [---]>) */ + /* call to g_slice_1: + (InCtrl: <[---], [--d]>) + (In1: <[---], [--d]>) + (In3: <[---], [--d]>) + (OutRet: <[---], [--d]>) */ + /* <[--d], [ S ]> */ + Z = g(r,d,e); + /* <[--d], [---]> */ + return X; +} + +int I; +int J; +int K; +int L; +int M; +Slicing project worklist [default/slicing_3] = + + +[slicing] making slicing project 'slicing_4'... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[slicing] applying actions: 2/2... +Print slice = +f_slice_2: +(InCtrl: <[--d], [ S ]>) +(In1: <[---], [ S ]>) +(In3: <[---], [ S ]>) +(In5: <[--d], [ S ]>) + +/**/int f(/* <[---], [ S ]> */ int a, /* <[---], [---]> */ int b, + /* <[---], [ S ]> */ int c, /* <[---], [---]> */ int d, + /* <[--d], [ S ]> */ int e) +{ + /* <[---], [ S ]> */ int r; + /* <[---], [ S ]> */ + a ++; + /* <[---], [---]> */ + b ++; + /* <[---], [ S ]> */ + c ++; + /* <[---], [---]> */ + d ++; + /* <[--d], [ S ]> */ + e ++; + /* sig call: + (InCtrl: <[---], [ S ]>) + (In1: <[---], [ S ]>) + (In3: <[---], [ S ]>) + (OutRet: <[---], [ S ]>) */ + /* call to g_slice_1: + (InCtrl: <[---], [--d]>) + (In1: <[---], [--d]>) + (In3: <[---], [--d]>) + (OutRet: <[---], [--d]>) */ + /* <[---], [ S ]> */ + r = g(a,b,c); + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In1: <[---], [ S ]>) + (In3: <[--d], [ S ]>) + (OutRet: <[--d], [---]>) */ + /* call to g_slice_1: + (InCtrl: <[---], [--d]>) + (In1: <[---], [--d]>) + (In3: <[---], [--d]>) + (OutRet: <[---], [--d]>) */ + /* <[--d], [ S ]> */ + Z = g(r,d,e); + /* <[---], [---]> */ + return X; +} + + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int X; +int g_slice_1(int u, int w) +{ + u ++; + w ++; + X = u; + return w; +} + +int Z; +void f_slice_2(int a, int c, int e) +{ + int r; + a ++; + c ++; + e ++; + r = g_slice_1(a,c); + Z = g_slice_1(r,e); + return; +} + +int f_slice_1(int a, int c, int e) +{ + int r; + a ++; + c ++; + e ++; + r = g_slice_1(a,c); + g_slice_1(r,e); + return X; +} + + +[slicing] making slicing project 'slicing_5'... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +Slicing project worklist [default/slicing_5] = +[main_slice_1 = change_call for call 24 -> f_slice_1] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int X; +int g_slice_2(int w) +{ + w ++; + return w; +} + +void g_slice_1(int u) +{ + u ++; + X = u; + return; +} + +int f_slice_1(int c) +{ + int r; + c ++; + r = g_slice_2(c); + g_slice_1(r); + return X; +} + +int K; +void main(void) +{ + K = 0; + f_slice_1(K); + return; +} + + +int X; +int Y; +Print slice = +g_slice_2: +(InCtrl: <[---], [--d]>) +(In3: <[---], [--d]>) +(OutRet: <[---], [--d]>) + +/**/int g(/* <[---], [---]> */ int u, /* <[---], [---]> */ int v, + /* <[---], [--d]> */ int w) +{ + /* <[---], [---]> */ + u ++; + /* <[---], [---]> */ + v ++; + /* <[---], [--d]> */ + w ++; + /* <[---], [---]> */ + X = u; + /* <[---], [---]> */ + Y = u + v; + /* <[---], [--d]> */ + return w; +} + +Print slice = g_slice_1: (InCtrl: <[---], [--d]>) + (In1: <[---], [--d]>) + +/**/int g(/* <[---], [--d]> */ int u, /* <[---], [---]> */ int v, + /* <[---], [---]> */ int w) +{ + /* <[---], [--d]> */ + u ++; + /* <[---], [---]> */ + v ++; + /* <[---], [---]> */ + w ++; + /* <[---], [--d]> */ + X = u; + /* <[---], [---]> */ + Y = u + v; + /* <[---], [---]> */ + return w; +} + +int Z; +Print slice = +f_slice_1: +(InCtrl: <[--d], [ S ]>) +(In3: <[--d], [ S ]>) +(OutRet: <[--d], [---]>) + +/**/int f(/* <[---], [---]> */ int a, /* <[---], [---]> */ int b, + /* <[--d], [ S ]> */ int c, /* <[---], [---]> */ int d, + /* <[---], [---]> */ int e) +{ + /* <[--d], [ S ]> */ int r; + /* <[---], [---]> */ + a ++; + /* <[---], [---]> */ + b ++; + /* <[--d], [ S ]> */ + c ++; + /* <[---], [---]> */ + d ++; + /* <[---], [---]> */ + e ++; + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In3: <[--d], [ S ]>) + (OutRet: <[--d], [ S ]>) */ + /* call to g_slice_2: + (InCtrl: <[---], [--d]>) + (In3: <[---], [--d]>) + (OutRet: <[---], [--d]>) */ + /* <[--d], [ S ]> */ + r = g(a,b,c); + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In1: <[--d], [ S ]>) + (Out(X): <[--d], [---]>) */ + /* call to g_slice_1: (InCtrl: <[---], [--d]>) + (In1: <[---], [--d]>) */ + /* <[--d], [ S ]> */ + Z = g(r,d,e); + /* <[--d], [---]> */ + return X; +} + +int I; +int J; +int K; +int L; +int M; +Print slice = main_slice_1: (InCtrl: <[--d], [ S ]>) + +/**/int main(void) +{ + /* <[---], [---]> */ int res; + /* <[---], [---]> */ + I = 0; + /* <[---], [---]> */ + J = 0; + /* <[--d], [ S ]> */ + K = 0; + /* <[---], [---]> */ + L = 0; + /* <[---], [---]> */ + M = 0; + /* sig call: (InCtrl: <[--d], [ S ]>) + (In3: <[--d], [ S ]>) */ + /* call to f_slice_1: + (InCtrl: <[--d], [ S ]>) + (In3: <[--d], [ S ]>) + (OutRet: <[--d], [---]>) */ + /* <[--d], [ S ]> */ + res = f(I,J,K,L,M); + /* <[---], [---]> */ + return res; +} + +Slicing project worklist [default/slicing_5] = + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/filter.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/filter.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/filter.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/filter.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,100 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/filter.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + T[0..9] ∈ {0} +[value] computing for function bts806 <- main. + Called from tests/slicing/filter.c:42. +[value] Recording results for bts806 +[value] Done for function bts806 +[value] computing for function unspec <- main. + Called from tests/slicing/filter.c:43. +[value] computing for function f <- unspec <- main. + Called from tests/slicing/filter.c:36. +tests/slicing/filter.c:36:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] using specification for function f +[value] Done for function f +[value] Recording results for unspec +[value] Done for function unspec +tests/slicing/filter.c:43:[kernel] warning: signed overflow. assert r+tmp_0 ≤ 2147483647; + (tmp_0 from unspec()) +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function bts806 +[from] Done for function bts806 +[from] Computing for function unspec +[from] Computing for function f <-unspec +[from] Done for function f +[from] Done for function unspec +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function unspec +[pdg] done for function unspec +[pdg] computing for function bts806 +[pdg] done for function bts806 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int f(int); + +int T[10]; +int bts806_slice_1(void) +{ + int x; + x = 0; + { + int z; + z = x + 1; + x = z; + } + return x; +} + +int unspec_slice_1(void) +{ + int __retres; + { + int tmp_0; + { + /*sequence*/ + tmp_0 = f(T[2]); + T[2] += tmp_0; + } + } + __retres = T[1] + T[2]; + return __retres; +} + +int main(void) +{ + int r; + int tmp; + int tmp_0; + r = 0; + { + /*sequence*/ + tmp = bts806_slice_1(); + r += tmp; + } + { + /*sequence*/ + tmp_0 = unspec_slice_1(); + r += tmp_0; + } + return r; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/forall_loop_invariant.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/forall_loop_invariant.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/forall_loop_invariant.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/forall_loop_invariant.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,91 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/forall_loop_invariant.i (no preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..9] ∈ {0} + u[0..9] ∈ {0} +tests/slicing/forall_loop_invariant.i:10:[value] Loop invariant got status valid. +tests/slicing/forall_loop_invariant.i:11:[value] Loop invariant got status valid. +tests/slicing/forall_loop_invariant.i:12:[value] Loop invariant got status valid. +tests/slicing/forall_loop_invariant.i:14:[value] entering loop for the first time +tests/slicing/forall_loop_invariant.i:11:[value] Loop invariant got status unknown. +tests/slicing/forall_loop_invariant.i:12:[value] Loop invariant got status unknown. +tests/slicing/forall_loop_invariant.i:18:[value] Assertion got status unknown. +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int t[10]; +int u[10]; +void main(void) +{ + { + int i; + i = 0; + /*@ loop invariant 0 ≤ i ≤ 10; + loop invariant ∀ int k; 0 ≤ k < i ⇒ t[k] ≡ 1; + loop invariant ∀ int k; 0 ≤ k < i ⇒ u[k] ≡ 2; + */ + while (i < 10) { + t[i] = 1; + i ++; + } + } + /*@ assert t[2] ≡ 1; */ ; + return; +} + + +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int t[10]; +int u[10]; +int main(void) +{ + int __retres; + { + int i; + i = 0; + /*@ loop invariant 0 ≤ i ≤ 10; + loop invariant ∀ int k; 0 ≤ k < i ⇒ t[k] ≡ 1; + loop invariant ∀ int k; 0 ≤ k < i ⇒ u[k] ≡ 2; + */ + while (i < 10) { + t[i] = 1; + i ++; + } + } + /*@ assert t[2] ≡ 1; */ ; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/horwitz.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/horwitz.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/horwitz.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/horwitz.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,277 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/horwitz.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/horwitz.c:26:[value] entering loop for the first time +[value] computing for function A <- main. + Called from tests/slicing/horwitz.c:27. +[value] computing for function add <- A <- main. + Called from tests/slicing/horwitz.c:18. +[value] Recording results for add +[value] Done for function add +[value] computing for function incr <- A <- main. + Called from tests/slicing/horwitz.c:19. +[value] computing for function add <- incr <- A <- main. + Called from tests/slicing/horwitz.c:15. +[value] Recording results for add +[value] Done for function add +[value] Recording results for incr +[value] Done for function incr +[value] Recording results for A +[value] Done for function A +[value] computing for function A <- main. + Called from tests/slicing/horwitz.c:27. +[value] computing for function add <- A <- main. + Called from tests/slicing/horwitz.c:18. +[value] Recording results for add +[value] Done for function add +[value] computing for function incr <- A <- main. + Called from tests/slicing/horwitz.c:19. +[value] computing for function add <- incr <- A <- main. + Called from tests/slicing/horwitz.c:15. +[value] Recording results for add +[value] Done for function add +[value] Recording results for incr +[value] Done for function incr +[value] Recording results for A +[value] Done for function A +[value] computing for function A <- main. + Called from tests/slicing/horwitz.c:27. +[value] computing for function add <- A <- main. + Called from tests/slicing/horwitz.c:18. +[value] Recording results for add +[value] Done for function add +[value] computing for function incr <- A <- main. + Called from tests/slicing/horwitz.c:19. +[value] computing for function add <- incr <- A <- main. + Called from tests/slicing/horwitz.c:15. +[value] Recording results for add +[value] Done for function add +[value] Recording results for incr +[value] Done for function incr +[value] Recording results for A +[value] Done for function A +[value] computing for function A <- main. + Called from tests/slicing/horwitz.c:27. +[value] computing for function add <- A <- main. + Called from tests/slicing/horwitz.c:18. +[value] Recording results for add +[value] Done for function add +[value] computing for function incr <- A <- main. + Called from tests/slicing/horwitz.c:19. +[value] computing for function add <- incr <- A <- main. + Called from tests/slicing/horwitz.c:15. +[value] Recording results for add +[value] Done for function add +[value] Recording results for incr +[value] Done for function incr +[value] Recording results for A +[value] Done for function A +[value] computing for function A <- main. + Called from tests/slicing/horwitz.c:27. +[value] computing for function add <- A <- main. + Called from tests/slicing/horwitz.c:18. +[value] Recording results for add +[value] Done for function add +[value] computing for function incr <- A <- main. + Called from tests/slicing/horwitz.c:19. +[value] computing for function add <- incr <- A <- main. + Called from tests/slicing/horwitz.c:15. +[value] Recording results for add +[value] Done for function add +[value] Recording results for incr +[value] Done for function incr +[value] Recording results for A +[value] Done for function A +[value] computing for function A <- main. + Called from tests/slicing/horwitz.c:27. +[value] computing for function add <- A <- main. + Called from tests/slicing/horwitz.c:18. +[value] Recording results for add +[value] Done for function add +[value] computing for function incr <- A <- main. + Called from tests/slicing/horwitz.c:19. +[value] computing for function add <- incr <- A <- main. + Called from tests/slicing/horwitz.c:15. +[value] Recording results for add +[value] Done for function add +[value] Recording results for incr +[value] Done for function incr +[value] Recording results for A +[value] Done for function A +[value] computing for function A <- main. + Called from tests/slicing/horwitz.c:27. +[value] computing for function add <- A <- main. + Called from tests/slicing/horwitz.c:18. +[value] Recording results for add +[value] Done for function add +[value] computing for function incr <- A <- main. + Called from tests/slicing/horwitz.c:19. +[value] computing for function add <- incr <- A <- main. + Called from tests/slicing/horwitz.c:15. +[value] Recording results for add +[value] Done for function add +[value] Recording results for incr +[value] Done for function incr +[value] Recording results for A +[value] Done for function A +[value] computing for function A <- main. + Called from tests/slicing/horwitz.c:27. +[value] computing for function add <- A <- main. + Called from tests/slicing/horwitz.c:18. +[value] Recording results for add +[value] Done for function add +[value] computing for function incr <- A <- main. + Called from tests/slicing/horwitz.c:19. +[value] computing for function add <- incr <- A <- main. + Called from tests/slicing/horwitz.c:15. +[value] Recording results for add +[value] Done for function add +[value] Recording results for incr +[value] Done for function incr +[value] Recording results for A +[value] Done for function A +[value] computing for function A <- main. + Called from tests/slicing/horwitz.c:27. +[value] computing for function add <- A <- main. + Called from tests/slicing/horwitz.c:18. +[value] Recording results for add +[value] Done for function add +[value] computing for function incr <- A <- main. + Called from tests/slicing/horwitz.c:19. +[value] computing for function add <- incr <- A <- main. + Called from tests/slicing/horwitz.c:15. +[value] Recording results for add +[value] Done for function add +[value] Recording results for incr +[value] Done for function incr +[value] Recording results for A +[value] Done for function A +[value] computing for function A <- main. + Called from tests/slicing/horwitz.c:27. +[value] computing for function add <- A <- main. + Called from tests/slicing/horwitz.c:18. +[value] Recording results for add +[value] Done for function add +[value] computing for function incr <- A <- main. + Called from tests/slicing/horwitz.c:19. +[value] computing for function add <- incr <- A <- main. + Called from tests/slicing/horwitz.c:15. +[value] Recording results for add +[value] Done for function add +[value] Recording results for incr +[value] Done for function incr +[value] Recording results for A +[value] Done for function A +[value] computing for function A <- main. + Called from tests/slicing/horwitz.c:27. +[value] computing for function add <- A <- main. + Called from tests/slicing/horwitz.c:18. +[value] Recording results for add +[value] Done for function add +[value] computing for function incr <- A <- main. + Called from tests/slicing/horwitz.c:19. +[value] computing for function add <- incr <- A <- main. + Called from tests/slicing/horwitz.c:15. +[value] Recording results for add +[value] Done for function add +[value] Recording results for incr +[value] Done for function incr +[value] Recording results for A +[value] Done for function A +[value] computing for function A <- main. + Called from tests/slicing/horwitz.c:27. +[value] computing for function add <- A <- main. + Called from tests/slicing/horwitz.c:18. +tests/slicing/horwitz.c:12:[kernel] warning: signed overflow. assert a+b ≤ 2147483647; +[value] Recording results for add +[value] Done for function add +[value] computing for function incr <- A <- main. + Called from tests/slicing/horwitz.c:19. +[value] computing for function add <- incr <- A <- main. + Called from tests/slicing/horwitz.c:15. +[value] Recording results for add +[value] Done for function add +[value] Recording results for incr +[value] Done for function incr +[value] Recording results for A +[value] Done for function A +[value] Recording results for main +[value] done for function main +[from] Computing for function add +[from] Done for function add +[from] Computing for function incr +[from] Done for function incr +[from] Computing for function A +[from] Done for function A +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function add: + \result FROM a; b +[from] Function incr: + i FROM pi; i +[from] Function A: + i FROM py; i + \result FROM x; py; i +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] making slicing project 'slicing_1'... +[pdg] computing for function incr +[pdg] done for function incr +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function A +[pdg] done for function A +[pdg] computing for function main +[pdg] done for function main +Slicing project worklist [default/slicing_1] = +[main_slice_1 = change_call for call 23 -> A_slice_1][A_slice_1 = change_call for call 10 -> incr_slice_1] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[slicing] applying actions: 2/2... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int add(int a, int b) +{ + int __retres; + __retres = a + b; + return __retres; +} + +void incr_slice_1(char *pi) +{ + int tmp; + { + /*sequence*/ + tmp = add((int)*pi,1); + *pi = (char)tmp; + } + return; +} + +void A_slice_1(char *py) +{ + incr_slice_1(py); + return; +} + +void main(void) +{ + char i; + i = (char)1; + while ((int)i < 11) A_slice_1(& i); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/if_many_values.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/if_many_values.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/if_many_values.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/if_many_values.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,43 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/if_many_values.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + r ∈ {1} +[value] Semantic level unrolling superposing up to 100 states +tests/slicing/if_many_values.c:8:[value] entering loop for the first time +tests/slicing/if_many_values.c:11:[kernel] warning: signed overflow. assert r+1 ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int r = 1; +int main(void) +{ + { + int i; + i = -100; + while (i < 100) { + if (i != 0) r ++; + i ++; + } + } + return r; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/initialized.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/initialized.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/initialized.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/initialized.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,35 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/initialized.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/initialized.c:12:[value] Assertion got status valid. +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void main(void) +{ + int x; + x = 3; + /*@ assert \initialized(&x); */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/keep_annot.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/keep_annot.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/keep_annot.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/keep_annot.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,66 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/keep_annot.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function g <- f. + Called from tests/slicing/keep_annot.c:26. +tests/slicing/keep_annot.c:15:[value] entering loop for the first time +tests/slicing/keep_annot.c:20:[value] Assertion got status unknown. +tests/slicing/keep_annot.c:21:[value] Assertion got status unknown. +[value] Recording results for g +[value] Done for function g +tests/slicing/keep_annot.c:27:[value] Assertion got status valid. +tests/slicing/keep_annot.c:28:[value] Assertion got status unknown. +[value] Recording results for f +[value] done for function f +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function g +[from] Done for function g +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function g +[pdg] done for function g +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct __anonstruct_las_1 { + int a ; + double b ; +}; +typedef struct __anonstruct_las_1 las; +void g_slice_1(las *p) +{ + int i; + i = 0; + while (i < 5) { + p->b = (double)i / (double)(i + 1); + i ++; + } + /*@ assert 1 ≤ p->a ≤ 6; */ ; + /*@ assert 0.0 ≤ p->b ≤ 1.0; */ ; + return; +} + +/*@ assigns *p; */ +void f(las *p, int n, int m) +{ + g_slice_1(p); + /*@ assert 0.0 ≤ p->b ≤ 1.0; */ ; + /*@ assert ∀ ℤ k; k < n ⇒ k < m; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/keep_annot.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/keep_annot.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/keep_annot.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/keep_annot.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,48 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/keep_annot.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at L +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/keep_annot.c:40:[kernel] warning: signed overflow. assert -2147483648 ≤ nn-2; +tests/slicing/keep_annot.c:39:[value] Loop invariant got status unknown. +tests/slicing/keep_annot.c:40:[value] entering loop for the first time +tests/slicing/keep_annot.c:41:[kernel] warning: out of bounds read. assert \valid_read(dabs+(int)(ii+1)); +tests/slicing/keep_annot.c:41:[kernel] warning: non-finite float value ([-1.02084703992e+39 .. 1.02084703992e+39]): + assert + \is_finite((float)((double)((double)u-(double)((double)*(dabs+(int)(ii+1))*2.0)))); +tests/slicing/keep_annot.c:42:[value] Assertion got status unknown. +[value] Recording results for L +[value] done for function L +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function L +[pdg] done for function L +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void L(float u, int nn, float *dabs, float *y) +{ + int ii; + ii = nn - 2; + /*@ loop invariant ∀ ℤ k; u ≤ *(dabs+k); */ + while (ii >= 0) { + *y = (float)((double)u - (double)*(dabs + (ii + 1)) * 2.0); + /*@ assert ∀ ℤ k; u ≤ *(dabs+k); */ ; + ii --; + } + /*@ slice pragma expr *y; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/keep_annot.3.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/keep_annot.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/keep_annot.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/keep_annot.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,46 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/keep_annot.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at L +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/keep_annot.c:40:[kernel] warning: signed overflow. assert -2147483648 ≤ nn-2; +tests/slicing/keep_annot.c:39:[value] Loop invariant got status unknown. +tests/slicing/keep_annot.c:40:[value] entering loop for the first time +tests/slicing/keep_annot.c:41:[kernel] warning: out of bounds read. assert \valid_read(dabs+(int)(ii+1)); +tests/slicing/keep_annot.c:41:[kernel] warning: non-finite float value ([-1.02084703992e+39 .. 1.02084703992e+39]): + assert + \is_finite((float)((double)((double)u-(double)((double)*(dabs+(int)(ii+1))*2.0)))); +tests/slicing/keep_annot.c:42:[value] Assertion got status unknown. +[value] Recording results for L +[value] done for function L +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function L +[pdg] done for function L +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void L(float u, int nn, float *dabs, float *y) +{ + int ii; + ii = nn - 2; + while (ii >= 0) { + *y = (float)((double)u - (double)*(dabs + (ii + 1)) * 2.0); + ii --; + } + /*@ slice pragma expr *y; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/keep_annot.4.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/keep_annot.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/keep_annot.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/keep_annot.4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,35 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/keep_annot.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at bts1110 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/keep_annot.c:50:[value] Assertion got status valid. +tests/slicing/keep_annot.c:52:[value] Assertion got status unknown. +[value] Recording results for bts1110 +[value] done for function bts1110 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function bts1110 +[pdg] done for function bts1110 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int bts1110(int x) +{ + /*@ assert x ≡ 5; */ ; + x ++; + return x; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/keep_annot.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/keep_annot.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/keep_annot.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/keep_annot.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,63 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/keep_annot.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function g <- f. + Called from tests/slicing/keep_annot.c:26. +tests/slicing/keep_annot.c:15:[value] entering loop for the first time +tests/slicing/keep_annot.c:20:[value] Assertion got status unknown. +tests/slicing/keep_annot.c:21:[value] Assertion got status unknown. +[value] Recording results for g +[value] Done for function g +tests/slicing/keep_annot.c:27:[value] Assertion got status valid. +tests/slicing/keep_annot.c:28:[value] Assertion got status unknown. +[value] Recording results for f +[value] done for function f +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function g +[from] Done for function g +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function g +[pdg] done for function g +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct __anonstruct_las_1 { + int a ; + double b ; +}; +typedef struct __anonstruct_las_1 las; +void g_slice_1(las *p) +{ + int i; + i = 0; + while (i < 5) { + p->b = (double)i / (double)(i + 1); + i ++; + } + return; +} + +void f(las *p, int n, int m) +{ + g_slice_1(p); + /*@ assert 0.0 ≤ p->b ≤ 1.0; */ ; + /*@ assert ∀ ℤ k; k < n ⇒ k < m; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loop_infinite.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loop_infinite.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loop_infinite.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loop_infinite.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,42 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loop_infinite.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/loop_infinite.c:9:[value] entering loop for the first time +tests/slicing/loop_infinite.c:10:[kernel] warning: signed overflow. assert a+1 ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.10.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.10.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.10.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.10.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,84 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + C1 ∈ {1} + C2 ∈ {1} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} +[value] computing for function may_write_Y_from_Z <- main. + Called from tests/slicing/loops.c:199. +[value] using specification for function may_write_Y_from_Z +[value] Done for function may_write_Y_from_Z +[value] computing for function loop <- main. + Called from tests/slicing/loops.c:202. +tests/slicing/loops.c:176:[value] entering loop for the first time +tests/slicing/loops.c:183:[value] Assertion got status valid. +tests/slicing/loops.c:179:[kernel] warning: signed overflow. assert X+1 ≤ 2147483647; +[value] Recording results for loop +[value] Done for function loop +[value] Recording results for main +[value] done for function main +[from] Computing for function loop +[from] Non-terminating function loop (no dependencies) +[from] Done for function loop +[from] Computing for function main +[from] Computing for function may_write_Y_from_Z <-main +[from] Done for function may_write_Y_from_Z +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function loop: + NON TERMINATING - NO EFFECTS +[from] Function may_write_Y_from_Z: + Y FROM Z; p; y +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function loop +tests/slicing/loops.c:187:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function loop +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +tests/slicing/loops.c:204:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int X; +void loop_slice_1(void) +{ + { + int c; + /*@ loop pragma WIDEN_HINTS X, 10, 100; */ + while (1) { + /*@ slice pragma ctrl; */ ; + c = 1; + /*@ assert c ≡ 1; */ ; + } + } + return; +} + +void main(void) +{ + loop_slice_1(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.11.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.11.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.11.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.11.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing a complete application starting at loop +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + C1 ∈ {1} + C2 ∈ {1} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} +tests/slicing/loops.c:176:[value] entering loop for the first time +tests/slicing/loops.c:183:[value] Assertion got status valid. +tests/slicing/loops.c:179:[kernel] warning: signed overflow. assert X+1 ≤ 2147483647; +[value] Recording results for loop +[value] done for function loop +[from] Computing for function loop +[from] Done for function loop +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function loop: + Z FROM Y +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function loop +[pdg] done for function loop +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int Y; +int Z; +void loop(void) +{ + Z = Y; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.12.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.12.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.12.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.12.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,60 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing a complete application starting at loop +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + C1 ∈ {1} + C2 ∈ {1} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} +tests/slicing/loops.c:176:[value] entering loop for the first time +tests/slicing/loops.c:183:[value] Assertion got status valid. +tests/slicing/loops.c:179:[kernel] warning: signed overflow. assert X+1 ≤ 2147483647; +[value] Recording results for loop +[value] done for function loop +[from] Computing for function loop +[from] Done for function loop +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function loop: + Z FROM Y +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function loop +[pdg] done for function loop +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int X; +int Y; +int Z; +void loop(int cond) +{ + if (cond) { + int c; + c = 0; + /*@ loop pragma WIDEN_HINTS X, 10, 100; */ + while (1) { + /*@ slice pragma ctrl; */ ; + if (c) Y = Z; + c = 1; + /*@ assert c ≡ 1; */ ; + } + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.13.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.13.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.13.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.13.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,60 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing a complete application starting at loop +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + C1 ∈ {1} + C2 ∈ {1} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} +tests/slicing/loops.c:176:[value] entering loop for the first time +tests/slicing/loops.c:183:[value] Assertion got status valid. +tests/slicing/loops.c:179:[kernel] warning: signed overflow. assert X+1 ≤ 2147483647; +[value] Recording results for loop +[value] done for function loop +[from] Computing for function loop +[from] Done for function loop +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function loop: + Z FROM Y +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function loop +[pdg] done for function loop +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int X; +int Y; +int Z; +void loop(int cond) +{ + if (cond) { + int c; + c = 0; + /*@ loop pragma WIDEN_HINTS X, 10, 100; */ + while (1) { + /*@ slice pragma ctrl; */ ; + if (c) Y = Z; + c = 1; + /*@ assert c ≡ 1; */ ; + } + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.14.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.14.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.14.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.14.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing a complete application starting at loop +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + C1 ∈ {1} + C2 ∈ {1} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} +tests/slicing/loops.c:176:[value] entering loop for the first time +tests/slicing/loops.c:183:[value] Assertion got status valid. +tests/slicing/loops.c:179:[kernel] warning: signed overflow. assert X+1 ≤ 2147483647; +[value] Recording results for loop +[value] done for function loop +[from] Computing for function loop +[from] Done for function loop +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function loop: + Z FROM Y +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function loop +[pdg] done for function loop +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int Y; +int Z; +void loop(void) +{ + Z = Y; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.15.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.15.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.15.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.15.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,58 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at stop_f1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + C1 ∈ [--..--] + C2 ∈ [--..--] + X ∈ [--..--] + Y ∈ [--..--] + Z ∈ [--..--] +tests/slicing/loops.c:66:[value] entering loop for the first time +tests/slicing/loops.c:68:[value] Assertion got status valid. +[value] computing for function stop <- stop_f1. + Called from tests/slicing/loops.c:70. +tests/slicing/loops.c:70:[kernel] warning: Neither code nor specification for function stop, generating default assigns from the prototype +[value] using specification for function stop +[value] Done for function stop +[value] Recording results for stop_f1 +[value] done for function stop_f1 +[from] Computing for function stop_f1 +[from] Computing for function stop <-stop_f1 +[from] Done for function stop +[from] Done for function stop_f1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function stop: + NO EFFECTS +[from] Function stop_f1: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function stop_f1 +[pdg] done for function stop_f1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void stop_f1(void) +{ + int x; + x = 1; + /*@ slice pragma stmt; */ + x ++; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.16.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.16.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.16.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.16.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,61 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at stop_f1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + C1 ∈ [--..--] + C2 ∈ [--..--] + X ∈ [--..--] + Y ∈ [--..--] + Z ∈ [--..--] +tests/slicing/loops.c:66:[value] entering loop for the first time +tests/slicing/loops.c:68:[value] Assertion got status valid. +[value] computing for function stop <- stop_f1. + Called from tests/slicing/loops.c:70. +tests/slicing/loops.c:70:[kernel] warning: Neither code nor specification for function stop, generating default assigns from the prototype +[value] using specification for function stop +[value] Done for function stop +[value] Recording results for stop_f1 +[value] done for function stop_f1 +[from] Computing for function stop_f1 +[from] Computing for function stop <-stop_f1 +[from] Done for function stop +[from] Done for function stop_f1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function stop: + NO EFFECTS +[from] Function stop_f1: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function stop_f1 +[pdg] done for function stop_f1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void stop_f1(int c) +{ + int s; + s = 0; + if (c) + while (s < c) { + s ++; + /*@ assert s > 0; */ ; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.17.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.17.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.17.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.17.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,62 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at stop_f2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + C1 ∈ [--..--] + C2 ∈ [--..--] + X ∈ [--..--] + Y ∈ [--..--] + Z ∈ [--..--] +tests/slicing/loops.c:82:[value] entering loop for the first time +tests/slicing/loops.c:82:[kernel] warning: signed overflow. assert c+10 ≤ 2147483647; +tests/slicing/loops.c:88:[value] Assertion got status unknown. +[value] computing for function stop <- stop_f2. + Called from tests/slicing/loops.c:89. +tests/slicing/loops.c:89:[kernel] warning: Neither code nor specification for function stop, generating default assigns from the prototype +[value] using specification for function stop +[value] Done for function stop +[value] Recording results for stop_f2 +[value] done for function stop_f2 +[from] Computing for function stop_f2 +[from] Computing for function stop <-stop_f2 +[from] Done for function stop +[from] Done for function stop_f2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function stop: + NO EFFECTS +[from] Function stop_f2: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function stop_f2 +[pdg] done for function stop_f2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void stop_f2(int c) +{ + int x1; + int x2; + x1 = 0; + x2 = 0; + if (! (x1 + x2 < c + 10)) goto break_cont_1; + if (c) x1 ++; + /*@ slice pragma expr x1; */ ; + break_cont_1: return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.18.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.18.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.18.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.18.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,62 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at stop_f2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + C1 ∈ [--..--] + C2 ∈ [--..--] + X ∈ [--..--] + Y ∈ [--..--] + Z ∈ [--..--] +tests/slicing/loops.c:82:[value] entering loop for the first time +tests/slicing/loops.c:82:[kernel] warning: signed overflow. assert c+10 ≤ 2147483647; +tests/slicing/loops.c:88:[value] Assertion got status unknown. +[value] computing for function stop <- stop_f2. + Called from tests/slicing/loops.c:89. +tests/slicing/loops.c:89:[kernel] warning: Neither code nor specification for function stop, generating default assigns from the prototype +[value] using specification for function stop +[value] Done for function stop +[value] Recording results for stop_f2 +[value] done for function stop_f2 +[from] Computing for function stop_f2 +[from] Computing for function stop <-stop_f2 +[from] Done for function stop +[from] Done for function stop_f2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function stop: + NO EFFECTS +[from] Function stop_f2: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function stop_f2 +[pdg] done for function stop_f2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void stop_f2(int c) +{ + int x1; + int x2; + x1 = 0; + x2 = 0; + if (! (x1 + x2 < c + 10)) goto break_cont_1; + if (! c) x2 ++; + /*@ assert x2 > 0; */ ; + break_cont_1: return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.19.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.19.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.19.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.19.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,67 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + C1 ∈ {1} + C2 ∈ {1} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} +[value] computing for function may_write_Y_from_Z <- main. + Called from tests/slicing/loops.c:199. +[value] using specification for function may_write_Y_from_Z +[value] Done for function may_write_Y_from_Z +[value] computing for function loop <- main. + Called from tests/slicing/loops.c:202. +tests/slicing/loops.c:176:[value] entering loop for the first time +tests/slicing/loops.c:183:[value] Assertion got status valid. +tests/slicing/loops.c:179:[kernel] warning: signed overflow. assert X+1 ≤ 2147483647; +[value] Recording results for loop +[value] Done for function loop +[value] Recording results for main +[value] done for function main +[from] Computing for function loop +[from] Non-terminating function loop (no dependencies) +[from] Done for function loop +[from] Computing for function main +[from] Computing for function may_write_Y_from_Z <-main +[from] Done for function may_write_Y_from_Z +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function loop: + NON TERMINATING - NO EFFECTS +[from] Function may_write_Y_from_Z: + Y FROM Z; p; y +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[slicing] Nothing to select for Z after unreachable stmt of main +[slicing] Nothing to select for an unreachable stmt of main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +tests/slicing/loops.c:204:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void main(void) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,53 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at f1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + C1 ∈ [--..--] + C2 ∈ [--..--] + X ∈ [--..--] + Y ∈ [--..--] + Z ∈ [--..--] +tests/slicing/loops.c:34:[value] entering loop for the first time +tests/slicing/loops.c:36:[value] Assertion got status valid. +tests/slicing/loops.c:35:[kernel] warning: signed overflow. assert s+1 ≤ 2147483647; +[value] Recording results for f1 +[value] done for function f1 +[from] Computing for function f1 +[from] Done for function f1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f1 +[pdg] done for function f1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void f1(int c) +{ + int s; + s = 0; + if (c) + while (1) { + s ++; + /*@ assert s > 0; */ ; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.20.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.20.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.20.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.20.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,67 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + C1 ∈ {1} + C2 ∈ {1} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} +[value] computing for function may_write_Y_from_Z <- main. + Called from tests/slicing/loops.c:199. +[value] using specification for function may_write_Y_from_Z +[value] Done for function may_write_Y_from_Z +[value] computing for function loop <- main. + Called from tests/slicing/loops.c:202. +tests/slicing/loops.c:176:[value] entering loop for the first time +tests/slicing/loops.c:183:[value] Assertion got status valid. +tests/slicing/loops.c:179:[kernel] warning: signed overflow. assert X+1 ≤ 2147483647; +[value] Recording results for loop +[value] Done for function loop +[value] Recording results for main +[value] done for function main +[from] Computing for function loop +[from] Non-terminating function loop (no dependencies) +[from] Done for function loop +[from] Computing for function main +[from] Computing for function may_write_Y_from_Z <-main +[from] Done for function may_write_Y_from_Z +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function loop: + NON TERMINATING - NO EFFECTS +[from] Function may_write_Y_from_Z: + Y FROM Z; p; y +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[slicing] warning: No internal slicing request from the command line. +[slicing] warning: Adding an extra request on the entry point of function: main. +[pdg] computing for function main +tests/slicing/loops.c:204:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void main(void) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.21.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.21.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.21.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.21.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,96 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + C1 ∈ {1} + C2 ∈ {1} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} +[value] computing for function may_write_Y_from_Z <- main. + Called from tests/slicing/loops.c:199. +[value] using specification for function may_write_Y_from_Z +[value] Done for function may_write_Y_from_Z +[value] computing for function loop <- main. + Called from tests/slicing/loops.c:202. +tests/slicing/loops.c:176:[value] entering loop for the first time +tests/slicing/loops.c:183:[value] Assertion got status valid. +tests/slicing/loops.c:179:[kernel] warning: signed overflow. assert X+1 ≤ 2147483647; +[value] Recording results for loop +[value] Done for function loop +[value] Recording results for main +[value] done for function main +[from] Computing for function loop +[from] Non-terminating function loop (no dependencies) +[from] Done for function loop +[from] Computing for function main +[from] Computing for function may_write_Y_from_Z <-main +[from] Done for function may_write_Y_from_Z +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function loop: + NON TERMINATING - NO EFFECTS +[from] Function may_write_Y_from_Z: + Y FROM Z; p; y +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function loop +tests/slicing/loops.c:187:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function loop +[pdg] computing for function may_write_Y_from_Z +[pdg] done for function may_write_Y_from_Z +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[pdg] computing for function main +tests/slicing/loops.c:204:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int X; +int Y; +int Z; +void loop_slice_1(void) +{ + { + int c; + c = 0; + /*@ loop pragma WIDEN_HINTS X, 10, 100; */ + while (1) { + /*@ slice pragma ctrl; */ ; + if (c) Y = Z; + c = 1; + /*@ assert c ≡ 1; */ ; + } + } + return; +} + +extern void may_write_Y_from_Z_slice_1(void); + +void main(void) +{ + Z = 0; + Z = X; + may_write_Y_from_Z_slice_1(); + loop_slice_1(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.22.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.22.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.22.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.22.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,96 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + C1 ∈ {1} + C2 ∈ {1} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} +[value] computing for function may_write_Y_from_Z <- main. + Called from tests/slicing/loops.c:199. +[value] using specification for function may_write_Y_from_Z +[value] Done for function may_write_Y_from_Z +[value] computing for function loop <- main. + Called from tests/slicing/loops.c:202. +tests/slicing/loops.c:176:[value] entering loop for the first time +tests/slicing/loops.c:183:[value] Assertion got status valid. +tests/slicing/loops.c:179:[kernel] warning: signed overflow. assert X+1 ≤ 2147483647; +[value] Recording results for loop +[value] Done for function loop +[value] Recording results for main +[value] done for function main +[from] Computing for function loop +[from] Non-terminating function loop (no dependencies) +[from] Done for function loop +[from] Computing for function main +[from] Computing for function may_write_Y_from_Z <-main +[from] Done for function may_write_Y_from_Z +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function loop: + NON TERMINATING - NO EFFECTS +[from] Function may_write_Y_from_Z: + Y FROM Z; p; y +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function loop +tests/slicing/loops.c:187:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function loop +[pdg] computing for function may_write_Y_from_Z +[pdg] done for function may_write_Y_from_Z +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[pdg] computing for function main +tests/slicing/loops.c:204:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int X; +int Y; +int Z; +void loop_slice_1(void) +{ + { + int c; + c = 0; + /*@ loop pragma WIDEN_HINTS X, 10, 100; */ + while (1) { + /*@ slice pragma ctrl; */ ; + if (c) Y = Z; + c = 1; + /*@ assert c ≡ 1; */ ; + } + } + return; +} + +extern void may_write_Y_from_Z_slice_1(int *p, int y); + +void main(int y) +{ + Z = 0; + Z = X; + may_write_Y_from_Z_slice_1(& Y,y); + loop_slice_1(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.23.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.23.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.23.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.23.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,69 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + C1 ∈ {1} + C2 ∈ {1} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} +[value] computing for function may_write_Y_from_Z <- main. + Called from tests/slicing/loops.c:199. +[value] using specification for function may_write_Y_from_Z +[value] Done for function may_write_Y_from_Z +[value] computing for function loop <- main. + Called from tests/slicing/loops.c:202. +tests/slicing/loops.c:176:[value] entering loop for the first time +tests/slicing/loops.c:183:[value] Assertion got status valid. +tests/slicing/loops.c:179:[kernel] warning: signed overflow. assert X+1 ≤ 2147483647; +[value] Recording results for loop +[value] Done for function loop +[value] Recording results for main +[value] done for function main +[from] Computing for function loop +[from] Non-terminating function loop (no dependencies) +[from] Done for function loop +[from] Computing for function main +[from] Computing for function may_write_Y_from_Z <-main +[from] Done for function may_write_Y_from_Z +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function loop: + NON TERMINATING - NO EFFECTS +[from] Function may_write_Y_from_Z: + Y FROM Z; p; y +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +tests/slicing/loops.c:204:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int X; +int Z; +void main(void) +{ + Z = 0; + Z = X; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.24.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.24.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.24.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.24.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,48 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at alarm +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + C1 ∈ [--..--] + C2 ∈ [--..--] + X ∈ [--..--] + Y ∈ [--..--] + Z ∈ [--..--] +tests/slicing/loops.c:210:[value] Assertion got status valid. +tests/slicing/loops.c:211:[kernel] warning: signed overflow. assert j+1 ≤ 2147483647; +[value] Recording results for alarm +[value] done for function alarm +[from] Computing for function alarm +[from] Done for function alarm +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function alarm: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function alarm +[pdg] done for function alarm +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void alarm(void) +{ + int volatile j; + j = 3; + j ++; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,55 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at f2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + C1 ∈ [--..--] + C2 ∈ [--..--] + X ∈ [--..--] + Y ∈ [--..--] + Z ∈ [--..--] +tests/slicing/loops.c:50:[value] entering loop for the first time +tests/slicing/loops.c:56:[value] Assertion got status unknown. +tests/slicing/loops.c:52:[kernel] warning: signed overflow. assert x1+1 ≤ 2147483647; +tests/slicing/loops.c:54:[kernel] warning: signed overflow. assert x2+1 ≤ 2147483647; +[value] Recording results for f2 +[value] done for function f2 +[from] Computing for function f2 +[from] Non-terminating function f2 (no dependencies) +[from] Done for function f2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f2: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f2 +tests/slicing/loops.c:50:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function f2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void f2(int c) +{ + int x1; + x1 = 0; + while (1) { + if (c) x1 ++; + /*@ slice pragma expr x1; */ ; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.3.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,55 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at f2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + C1 ∈ [--..--] + C2 ∈ [--..--] + X ∈ [--..--] + Y ∈ [--..--] + Z ∈ [--..--] +tests/slicing/loops.c:50:[value] entering loop for the first time +tests/slicing/loops.c:56:[value] Assertion got status unknown. +tests/slicing/loops.c:52:[kernel] warning: signed overflow. assert x1+1 ≤ 2147483647; +tests/slicing/loops.c:54:[kernel] warning: signed overflow. assert x2+1 ≤ 2147483647; +[value] Recording results for f2 +[value] done for function f2 +[from] Computing for function f2 +[from] Non-terminating function f2 (no dependencies) +[from] Done for function f2 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f2: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f2 +tests/slicing/loops.c:50:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function f2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void f2(int c) +{ + int x2; + x2 = 0; + while (1) { + if (! c) x2 ++; + /*@ assert x2 > 0; */ ; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.4.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,50 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing a complete application starting at test_infinite_loop_3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + C1 ∈ {1} + C2 ∈ {1} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} +tests/slicing/loops.c:108:[value] entering loop for the first time +[value] Recording results for test_infinite_loop_3 +[value] done for function test_infinite_loop_3 +[from] Computing for function test_infinite_loop_3 +[from] Done for function test_infinite_loop_3 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function test_infinite_loop_3: + G FROM ctrl1; ctrl2; data1; data2 +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function test_infinite_loop_3 +[pdg] done for function test_infinite_loop_3 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +void test_infinite_loop_3(int ctrl1, int ctrl2, int data1, int data2) +{ + G = 0; + if (ctrl1) { + G = data1; + if (ctrl2) G = data2; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.5.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.5.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.5.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,55 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing a complete application starting at test_infinite_loop_4 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + C1 ∈ {1} + C2 ∈ {1} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} +tests/slicing/loops.c:125:[value] entering loop for the first time +tests/slicing/loops.c:141:[kernel] warning: signed overflow. assert -2147483648 ≤ G+data2 ≤ 2147483647; +tests/slicing/loops.c:126:[kernel] warning: signed overflow. assert -2147483648 ≤ G+data1 ≤ 2147483647; +tests/slicing/loops.c:129:[kernel] warning: signed overflow. assert -2147483648 ≤ G+no_data ≤ 2147483647; +tests/slicing/loops.c:132:[value] entering loop for the first time +tests/slicing/loops.c:133:[kernel] warning: signed overflow. assert -2147483648 ≤ G+no_data ≤ 2147483647; +[value] Recording results for test_infinite_loop_4 +[value] done for function test_infinite_loop_4 +[from] Computing for function test_infinite_loop_4 +[from] Done for function test_infinite_loop_4 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function test_infinite_loop_4: + G FROM ctrl1; ctrl2; data1; data2 +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function test_infinite_loop_4 +[pdg] done for function test_infinite_loop_4 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +void test_infinite_loop_4(int ctrl1, int ctrl2, int data1, int data2) +{ + G = 0; + while (ctrl1) { + G += data1; + if (ctrl2) G += data2; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.6.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.6.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.6.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.6.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,55 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing a complete application starting at test_infinite_loop_5 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + C1 ∈ {1} + C2 ∈ {1} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} +tests/slicing/loops.c:149:[value] entering loop for the first time +tests/slicing/loops.c:165:[kernel] warning: signed overflow. assert -2147483648 ≤ G+data2 ≤ 2147483647; +tests/slicing/loops.c:150:[kernel] warning: signed overflow. assert -2147483648 ≤ G+data1 ≤ 2147483647; +tests/slicing/loops.c:154:[kernel] warning: signed overflow. assert -2147483648 ≤ G+no_data ≤ 2147483647; +tests/slicing/loops.c:155:[value] entering loop for the first time +tests/slicing/loops.c:156:[kernel] warning: signed overflow. assert -2147483648 ≤ G+no_data ≤ 2147483647; +[value] Recording results for test_infinite_loop_5 +[value] done for function test_infinite_loop_5 +[from] Computing for function test_infinite_loop_5 +[from] Done for function test_infinite_loop_5 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function test_infinite_loop_5: + G FROM ctrl1; ctrl2; data1; data2 +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function test_infinite_loop_5 +[pdg] done for function test_infinite_loop_5 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +void test_infinite_loop_5(int ctrl1, int ctrl2, int data1, int data2) +{ + G = 0; + while (ctrl1) { + G += data1; + if (ctrl2) G += data2; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.7.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.7.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.7.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.7.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing a complete application starting at loop +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + C1 ∈ {1} + C2 ∈ {1} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} +tests/slicing/loops.c:176:[value] entering loop for the first time +tests/slicing/loops.c:183:[value] Assertion got status valid. +tests/slicing/loops.c:179:[kernel] warning: signed overflow. assert X+1 ≤ 2147483647; +[value] Recording results for loop +[value] done for function loop +[from] Computing for function loop +[from] Done for function loop +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function loop: + Z FROM Y +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function loop +[pdg] done for function loop +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int Y; +int Z; +void loop(void) +{ + Z = Y; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.8.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.8.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.8.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.8.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,79 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + C1 ∈ {1} + C2 ∈ {1} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} +[value] computing for function may_write_Y_from_Z <- main. + Called from tests/slicing/loops.c:199. +[value] using specification for function may_write_Y_from_Z +[value] Done for function may_write_Y_from_Z +[value] computing for function loop <- main. + Called from tests/slicing/loops.c:202. +tests/slicing/loops.c:176:[value] entering loop for the first time +tests/slicing/loops.c:183:[value] Assertion got status valid. +tests/slicing/loops.c:179:[kernel] warning: signed overflow. assert X+1 ≤ 2147483647; +[value] Recording results for loop +[value] Done for function loop +[value] Recording results for main +[value] done for function main +[from] Computing for function loop +[from] Non-terminating function loop (no dependencies) +[from] Done for function loop +[from] Computing for function main +[from] Computing for function may_write_Y_from_Z <-main +[from] Done for function may_write_Y_from_Z +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function loop: + NON TERMINATING - NO EFFECTS +[from] Function may_write_Y_from_Z: + Y FROM Z; p; y +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +tests/slicing/loops.c:204:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function loop +tests/slicing/loops.c:187:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function loop +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int C2 = 1; +void loop_slice_1(void) +{ + return; +} + +void main(void) +{ + { + int cond; + cond = C2; + loop_slice_1(); + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.9.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.9.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.9.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.9.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,79 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + C1 ∈ {1} + C2 ∈ {1} + X ∈ {0} + Y ∈ {0} + Z ∈ {0} +[value] computing for function may_write_Y_from_Z <- main. + Called from tests/slicing/loops.c:199. +[value] using specification for function may_write_Y_from_Z +[value] Done for function may_write_Y_from_Z +[value] computing for function loop <- main. + Called from tests/slicing/loops.c:202. +tests/slicing/loops.c:176:[value] entering loop for the first time +tests/slicing/loops.c:183:[value] Assertion got status valid. +tests/slicing/loops.c:179:[kernel] warning: signed overflow. assert X+1 ≤ 2147483647; +[value] Recording results for loop +[value] Done for function loop +[value] Recording results for main +[value] done for function main +[from] Computing for function loop +[from] Non-terminating function loop (no dependencies) +[from] Done for function loop +[from] Computing for function main +[from] Computing for function may_write_Y_from_Z <-main +[from] Done for function may_write_Y_from_Z +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function loop: + NON TERMINATING - NO EFFECTS +[from] Function may_write_Y_from_Z: + Y FROM Z; p; y +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function loop +tests/slicing/loops.c:187:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function loop +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +tests/slicing/loops.c:204:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int X; +void loop_slice_1(void) +{ + /*@ loop pragma WIDEN_HINTS X, 10, 100; */ + while (1) { + /*@ slice pragma ctrl; */ ; + } + return; +} + +void main(void) +{ + loop_slice_1(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loop_simple.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loop_simple.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loop_simple.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loop_simple.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,58 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loop_simple.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/loop_simple.c:8:[value] entering loop for the first time +tests/slicing/loop_simple.c:10:[value] entering loop for the first time +tests/slicing/loop_simple.c:12:[value] entering loop for the first time +tests/slicing/loop_simple.c:16:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int main(void) +{ + int a; + int c; + int volatile b; + b = 0; + a = 1; + c = 0; + /*@ loop assigns c, a; */ + while (c <= 5) { + a = 2; + c ++; + } + if (b) goto L; + a += 2; + L: a += 3; + goto H; + H: ; + return a; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/loops.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/loops.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,50 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/loops.c (with preprocessing) +[value] Analyzing an incomplete application starting at f1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + C1 ∈ [--..--] + C2 ∈ [--..--] + X ∈ [--..--] + Y ∈ [--..--] + Z ∈ [--..--] +tests/slicing/loops.c:34:[value] entering loop for the first time +tests/slicing/loops.c:36:[value] Assertion got status valid. +tests/slicing/loops.c:35:[kernel] warning: signed overflow. assert s+1 ≤ 2147483647; +[value] Recording results for f1 +[value] done for function f1 +[from] Computing for function f1 +[from] Done for function f1 +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f1 +[pdg] done for function f1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void f1(void) +{ + int x; + x = 1; + /*@ slice pragma stmt; */ + x ++; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/mark_all_slices.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/mark_all_slices.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/mark_all_slices.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/mark_all_slices.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,292 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/mark_all_slices.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + A ∈ {0} + B ∈ {0} + C ∈ {0} + D ∈ {0} + A2 ∈ {0} + B2 ∈ {0} + C2 ∈ {0} + D2 ∈ {0} +[value] computing for function fA <- main. + Called from tests/slicing/mark_all_slices.c:23. +[value] computing for function all <- fA <- main. + Called from tests/slicing/mark_all_slices.c:17. +[value] Recording results for all +[value] Done for function all +[value] Recording results for fA +[value] Done for function fA +[value] computing for function fB <- main. + Called from tests/slicing/mark_all_slices.c:24. +[value] computing for function all <- fB <- main. + Called from tests/slicing/mark_all_slices.c:18. +[value] Recording results for all +[value] Done for function all +[value] Recording results for fB +[value] Done for function fB +[value] computing for function fC <- main. + Called from tests/slicing/mark_all_slices.c:25. +[value] computing for function all <- fC <- main. + Called from tests/slicing/mark_all_slices.c:19. +[value] Recording results for all +[value] Done for function all +[value] Recording results for fC +[value] Done for function fC +[value] computing for function fD <- main. + Called from tests/slicing/mark_all_slices.c:26. +[value] computing for function all <- fD <- main. + Called from tests/slicing/mark_all_slices.c:20. +[value] Recording results for all +[value] Done for function all +[value] Recording results for fD +[value] Done for function fD +[value] computing for function all <- main. + Called from tests/slicing/mark_all_slices.c:27. +[value] Recording results for all +[value] Done for function all +[value] Recording results for main +[value] done for function main +[from] Computing for function all +[from] Done for function all +[from] Computing for function fA +[from] Done for function fA +[from] Computing for function fB +[from] Done for function fB +[from] Computing for function fC +[from] Done for function fC +[from] Computing for function fD +[from] Done for function fD +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function all: + A FROM x + B FROM x + C FROM x + D FROM x + \result FROM x +[from] Function fA: + A FROM \nothing + B FROM \nothing + C FROM \nothing + D FROM \nothing + \result FROM \nothing +[from] Function fB: + A FROM \nothing + B FROM \nothing + C FROM \nothing + D FROM \nothing + \result FROM \nothing +[from] Function fC: + A FROM \nothing + B FROM \nothing + C FROM \nothing + D FROM \nothing + \result FROM \nothing +[from] Function fD: + A FROM \nothing + B FROM \nothing + C FROM \nothing + D FROM \nothing + \result FROM \nothing +[from] Function main: + A FROM \nothing + B FROM \nothing + C FROM \nothing + D FROM \nothing + A2 FROM \nothing + B2 FROM \nothing + C2 FROM \nothing + D2 FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] making slicing project 'slicing_1'... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function fA +[pdg] done for function fA +[pdg] computing for function all +[pdg] done for function all +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int A; +int A2; +void all_slice_1(int x) +{ + A = x; + return; +} + +int fA_slice_1(void) +{ + all_slice_1(1); + return A; +} + +void main(void) +{ + A2 = fA_slice_1(); + return; +} + + +Slicing project worklist [default/slicing_1] = +[all_slice_1 = (n:54(restrict to __retres) ,<[--d], [---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int A; +int A2; +int all_slice_1(int x) +{ + int __retres; + A = x; + __retres = x + 1; + return __retres; +} + +int fA_slice_1(void) +{ + all_slice_1(1); + return A; +} + +void main(void) +{ + A2 = fA_slice_1(); + return; +} + + +Slicing project worklist [default/slicing_1] = +[main_slice_1 = examine_calls] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function fB +[pdg] done for function fB +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int A; +int B; +int A2; +int B2; +int all_slice_2(int x) +{ + int __retres; + B = x; + __retres = x + 1; + return __retres; +} + +int all_slice_1(int x) +{ + int __retres; + A = x; + __retres = x + 1; + return __retres; +} + +int fA_slice_1(void) +{ + all_slice_1(1); + return A; +} + +int fB_slice_1(void) +{ + all_slice_2(1); + return B; +} + +void main(void) +{ + A2 = fA_slice_1(); + B2 = fB_slice_1(); + return; +} + + +[slicing] making slicing project 'slicing_2'... +Slicing project worklist [default/slicing_2] = + + +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int all_slice_1(int x) +{ + int __retres; + __retres = x + 1; + return __retres; +} + + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int A; +int A2; +int all_slice_2(int x) +{ + int __retres; + A = x; + __retres = x + 1; + return __retres; +} + +int all_slice_1(int x) +{ + int __retres; + __retres = x + 1; + return __retres; +} + +int fA_slice_1(void) +{ + all_slice_2(1); + return A; +} + +void main(void) +{ + A2 = fA_slice_1(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/merge.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/merge.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/merge.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/merge.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,161 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/merge.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G1 ∈ {0} + G2 ∈ {0} + G3 ∈ {0} +[value] computing for function g <- main. + Called from tests/slicing/merge.c:26. +[value] computing for function init <- g <- main. + Called from tests/slicing/merge.c:21. +[value] Recording results for init +[value] Done for function init +[value] computing for function add <- g <- main. + Called from tests/slicing/merge.c:22. +tests/slicing/merge.c:17:[kernel] warning: signed overflow. assert -2147483648 ≤ G1+a1 ≤ 2147483647; +tests/slicing/merge.c:17:[kernel] warning: signed overflow. assert -2147483648 ≤ G2+a2 ≤ 2147483647; +tests/slicing/merge.c:17:[kernel] warning: signed overflow. assert -2147483648 ≤ G3+a3 ≤ 2147483647; +[value] Recording results for add +[value] Done for function add +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +[from] Computing for function add +[from] Done for function add +[from] Computing for function init +[from] Done for function init +[from] Computing for function g +[from] Done for function g +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function add: + G1 FROM G1; a1 + G2 FROM G2; a2 + G3 FROM G3; a3 +[from] Function init: + G1 FROM a1 + G2 FROM a2 + G3 FROM a3 +[from] Function g: + G1 FROM a1 + G2 FROM a2 + G3 FROM a3 +[from] Function main: + G1 FROM x + G2 FROM y + G3 FROM z +[from] ====== END OF DEPENDENCIES ====== +[slicing] making slicing project 'slicing_1'... +[pdg] computing for function init +[pdg] done for function init +Processing slicing_merge : ... +[pdg] computing for function g +[pdg] done for function g +Processing slicing_merge : ...[pdg] computing for function add +[pdg] done for function add +......... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[slicing] applying actions: 2/2... +Processing slicing_merge : ...... +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int G1; +int G2; +int G3; +void init_slice_4(int a1, int a2); + +void init_slice_3(int a3); + +void add_slice_3(int a2); + +void add_slice_2(int a3); + +void add_slice_1(int a1); + +void g_slice_4(int a3); + +void g_slice_3(int a3); + +void g_slice_2(int a1, int a2); + +void g_slice_1(int a1, int a2); + +void init_slice_4(int a1, int a2) +{ + G1 = a1; + G2 = a2; + return; +} + +void init_slice_3(int a3) +{ + G3 = a3; + return; +} + +void add_slice_3(int a2) +{ + G2 += a2; + return; +} + +void add_slice_2(int a3) +{ + G3 += a3; + return; +} + +void add_slice_1(int a1) +{ + G1 += a1; + return; +} + +void g_slice_4(int a3) +{ + init_slice_3(a3); + add_slice_2(a3); + return; +} + +void g_slice_3(int a3) +{ + init_slice_3(a3); + add_slice_2(a3); + return; +} + +void g_slice_2(int a1, int a2) +{ + init_slice_4(a1,a2); + add_slice_3(a2); + return; +} + +void g_slice_1(int a1, int a2) +{ + init_slice_4(a1,a2); + add_slice_1(a1); + return; +} + + +removing generated .jpg files diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/min_call.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/min_call.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/min_call.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/min_call.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,599 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/min_call.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function f +[from] Computing for function send <-f +[from] Done for function send +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function get: + \result FROM y +[from] Function send: + NO EFFECTS +[from] Function send_bis: + NO EFFECTS +[from] Function k: + G FROM b + H FROM c + \result FROM a +[from] Function f: + G FROM \nothing + H FROM \nothing + \result FROM y +[from] Function g: + G FROM \nothing + H FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] making slicing project 'slicing_1'... +[pdg] computing for function k +[pdg] done for function k +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f +[pdg] done for function f +[pdg] computing for function g +[pdg] done for function g +Project1 - result1 : +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +void k_slice_1(int d) +{ + int cond; + cond = get(d); + if (cond) send_bis(d); + return; +} + +void f_slice_1(void); + +void g(void) +{ + k_slice_1(0); + f_slice_1(); + return; +} + +void f_slice_1(void) +{ + k_slice_1(0); + k_slice_1(0); + k_slice_1(0); + return; +} + + +Project1 - result2 : +int G; +int H; +int I; +/*@ assigns \result; + assigns \result \from y; */ +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +Print slice = k_slice_2: (InCtrl: <[ S ], [---]>) + (In4: <[--d], [---]>) + +/**/int k(/* <[---], [---]> */ int a, /* <[---], [---]> */ int b, + /* <[---], [---]> */ int c, /* <[--d], [---]> */ int d) +{ + /* <[ S ], [---]> */ int cond; + /* sig call: + (InCtrl: <[ S ], [---]>) + (In1: <[ S ], [---]>) + (OutRet: <[ S ], [---]>) */ + /* undetermined call */ + /* <[ S ], [---]> */ + cond = get(d); + /* <[---], [---]> */ + G = b; + /* <[---], [---]> */ + H = c; + /* <[ S ], [---]> */ + if (cond) { + /* sig call: (InCtrl: <[ S ], [---]>) + (In1: <[ S ], [---]>) */ + /* undetermined call */ + /* <[ S ], [---]> */ + send_bis(d); + } + /* <[---], [---]> */ + return a; +} + +Print slice = k_slice_1: (InCtrl: <[ S ], [ S ]>) + (In4: <[--d], [ S ]>) + +/**/int k(/* <[---], [---]> */ int a, /* <[---], [---]> */ int b, + /* <[---], [---]> */ int c, /* <[--d], [ S ]> */ int d) +{ + /* <[ S ], [ S ]> */ int cond; + /* sig call: + (InCtrl: <[ S ], [ S ]>) + (In1: <[ S ], [ S ]>) + (OutRet: <[ S ], [ S ]>) */ + /* call to source function */ + /* <[ S ], [ S ]> */ + cond = get(d); + /* <[---], [---]> */ + G = b; + /* <[---], [---]> */ + H = c; + /* <[ S ], [ S ]> */ + if (cond) { + /* sig call: (InCtrl: <[ S ], [ S ]>) + (In1: <[ S ], [ S ]>) */ + /* call to source function */ + /* <[ S ], [ S ]> */ + send_bis(d); + } + /* <[---], [---]> */ + return a; +} + +int f(int y); + +Print slice = g_slice_1: (InCtrl: <[--d], [ S ]>) + +/**/void g(/* <[---], [---]> */ int b, /* <[---], [---]> */ int c) +{ + /* <[---], [---]> */ int r; + /* sig call: (InCtrl: <[--d], [ S ]>) + (In4: <[--d], [ S ]>) */ + /* call to k_slice_1: (InCtrl: <[ S ], [ S ]>) + (In4: <[--d], [ S ]>) */ + /* <[--d], [ S ]> */ + r = k(0,0,c,0); + /* sig call: (InCtrl: <[--d], [ S ]>) */ + /* call to f_slice_1: (InCtrl: <[--d], [ S ]>) */ + /* <[--d], [ S ]> */ + f(b); + /* <[---], [---]> */ + return; +} + +Print slice = f_slice_1: (InCtrl: <[--d], [ S ]>) + +/**/int f(/* <[---], [---]> */ int y) +{ + /* <[---], [---]> */ int r; + /* <[---], [---]> */ int z; + /* sig call: (InCtrl: <[--d], [ S ]>) + (In4: <[--d], [ S ]>) */ + /* call to k_slice_1: (InCtrl: <[ S ], [ S ]>) + (In4: <[--d], [ S ]>) */ + /* <[--d], [ S ]> */ + k(0,0,0,0); + /* sig call: (InCtrl: <[--d], [ S ]>) + (In4: <[--d], [ S ]>) */ + /* call to k_slice_1: (InCtrl: <[ S ], [ S ]>) + (In4: <[--d], [ S ]>) */ + /* <[--d], [ S ]> */ + r = k(0,y,0,0); + /* sig call: (InCtrl: <[--d], [ S ]>) + (In4: <[--d], [ S ]>) */ + /* call to k_slice_1: (InCtrl: <[ S ], [ S ]>) + (In4: <[--d], [ S ]>) */ + /* <[--d], [ S ]> */ + z = k(G,0,0,0); + /*@ slice pragma expr z; */ /* <[---], [---]> */ + ; + /* invisible call */ /* <[---], [---]> */ + send(z); + /* <[---], [---]> */ + return z; +} + +Slicing project worklist [default/slicing_1] = +[k_slice_2 = choose_call for call 6][k_slice_2 = choose_call for call 1] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[slicing] applying actions: 2/2... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +void k_slice_2(int d) +{ + int cond; + cond = get(d); + if (cond) send_bis(d); + return; +} + +void k_slice_1(int d) +{ + int cond; + cond = get(d); + if (cond) send_bis(d); + return; +} + +void f_slice_1(void); + +void g(void) +{ + k_slice_1(0); + f_slice_1(); + return; +} + +void f_slice_1(void) +{ + k_slice_1(0); + k_slice_1(0); + k_slice_1(0); + return; +} + + +[slicing] making slicing project 'slicing_2'... +Slicing project worklist [default/slicing_2] = +[k = (n:17 ,<[--d], [---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +Project3 - result : +int G; +int H; +int I; +/*@ assigns \result; + assigns \result \from y; */ +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +Print slice = k_slice_1: (InCtrl: <[--d], [ S ]>) + (In4: <[--d], [ S ]>) + +/**/int k(/* <[---], [---]> */ int a, /* <[---], [---]> */ int b, + /* <[---], [---]> */ int c, /* <[--d], [ S ]> */ int d) +{ + /* <[--d], [ S ]> */ int cond; + /* sig call: + (InCtrl: <[--d], [ S ]>) + (In1: <[--d], [ S ]>) + (OutRet: <[--d], [ S ]>) */ + /* call to source function */ + /* <[--d], [ S ]> */ + cond = get(d); + /* <[---], [---]> */ + G = b; + /* <[---], [---]> */ + H = c; + /* <[--d], [ S ]> */ + if (cond) { + /* sig call: (InCtrl: <[--d], [ S ]>) + (In1: <[---], [ S ]>) */ + /* call to source function */ + /* <[--d], [ S ]> */ + send_bis(d); + } + /* <[---], [---]> */ + return a; +} + +int f(int y); + +Print slice = g_slice_1: (InCtrl: <[--d], [ S ]>) + +/**/void g(/* <[---], [---]> */ int b, /* <[---], [---]> */ int c) +{ + /* <[---], [---]> */ int r; + /* sig call: (InCtrl: <[--d], [ S ]>) + (In4: <[--d], [ S ]>) */ + /* call to k_slice_1: (InCtrl: <[--d], [ S ]>) + (In4: <[--d], [ S ]>) */ + /* <[--d], [ S ]> */ + r = k(0,0,c,0); + /* sig call: (InCtrl: <[--d], [ S ]>) */ + /* call to f_slice_1: (InCtrl: <[--d], [ S ]>) */ + /* <[--d], [ S ]> */ + f(b); + /* <[---], [---]> */ + return; +} + +Print slice = f_slice_1: (InCtrl: <[--d], [ S ]>) + +/**/int f(/* <[---], [---]> */ int y) +{ + /* <[---], [---]> */ int r; + /* <[---], [---]> */ int z; + /* sig call: (InCtrl: <[--d], [ S ]>) + (In4: <[--d], [ S ]>) */ + /* call to k_slice_1: (InCtrl: <[--d], [ S ]>) + (In4: <[--d], [ S ]>) */ + /* <[--d], [ S ]> */ + k(0,0,0,0); + /* sig call: (InCtrl: <[--d], [ S ]>) + (In4: <[--d], [ S ]>) */ + /* call to k_slice_1: (InCtrl: <[--d], [ S ]>) + (In4: <[--d], [ S ]>) */ + /* <[--d], [ S ]> */ + r = k(0,y,0,0); + /* sig call: (InCtrl: <[--d], [ S ]>) + (In4: <[--d], [ S ]>) */ + /* call to k_slice_1: (InCtrl: <[--d], [ S ]>) + (In4: <[--d], [ S ]>) */ + /* <[--d], [ S ]> */ + z = k(G,0,0,0); + /*@ slice pragma expr z; */ /* <[---], [---]> */ + ; + /* invisible call */ /* <[---], [---]> */ + send(z); + /* <[---], [---]> */ + return z; +} + +Slicing project worklist [default/slicing_2] = + + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +void k_slice_1(int d) +{ + int cond; + cond = get(d); + if (cond) send_bis(d); + return; +} + +void f_slice_1(void); + +void g(void) +{ + k_slice_1(0); + f_slice_1(); + return; +} + +void f_slice_1(void) +{ + k_slice_1(0); + k_slice_1(0); + k_slice_1(0); + return; +} + + +[slicing] making slicing project 'slicing_3'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +Slicing project worklist [default/slicing_3] = +[f = (n:26 ,<[acd], [---]>)(n:33 ,<[acd], [---]>)(n:41 ,<[acd], [---]>)][g = (n:60 , +<[acd], +[---]>)] + +Slicing project worklist [default/slicing_3] = +[f_slice_1 = choose_call for call 17][f_slice_1 = choose_call for call 16][f_slice_1 = choose_call for call 15][g = propagate (n:68 , +<[acd], +[---]>)][Appli : calls to f][g = (n:60 ,<[acd], [---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 6 actions... +[slicing] applying actions: 1/6... +[slicing] applying actions: 2/6... +[slicing] applying actions: 3/6... +[slicing] applying actions: 4/6... +[slicing] applying actions: 5/6... +[slicing] applying actions: 6/6... +Project3 - result : +int G; +int H; +int I; +/*@ assigns \result; + assigns \result \from y; */ +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +Print slice = k_slice_1: + +/**/int k(/* <[---], [---]> */ int a, /* <[---], [---]> */ int b, + /* <[---], [---]> */ int c, /* <[---], [---]> */ int d) +{ + /* <[---], [---]> */ int cond; + /* invisible call */ /* <[---], [---]> */ + cond = get(d); + /* <[---], [---]> */ + G = b; + /* <[---], [---]> */ + H = c; + /* <[---], [---]> */ + if (cond) { + /* invisible call */ /* <[---], [---]> */ + send_bis(d); + } + /* <[---], [---]> */ + return a; +} + +int f(int y); + +Print slice = g_slice_1: (InCtrl: <[acd], [---]>) + +/**/void g(/* <[---], [---]> */ int b, /* <[---], [---]> */ int c) +{ + /* <[---], [---]> */ int r; + /* sig call: (InCtrl: <[acd], [---]>) */ + /* call to k_slice_1: */ + /* <[acd], [---]> */ + r = k(0,0,c,0); + /* sig call: (InCtrl: <[acd], [---]>) */ + /* call to f_slice_1: (InCtrl: <[acd], [---]>) */ + /* <[acd], [---]> */ + f(b); + /* <[---], [---]> */ + return; +} + +Print slice = f_slice_1: (InCtrl: <[acd], [---]>) + +/**/int f(/* <[---], [---]> */ int y) +{ + /* <[---], [---]> */ int r; + /* <[---], [---]> */ int z; + /* sig call: (InCtrl: <[acd], [---]>) */ + /* call to k_slice_1: */ + /* <[acd], [---]> */ + k(0,0,0,0); + /* sig call: (InCtrl: <[acd], [---]>) */ + /* call to k_slice_1: */ + /* <[acd], [---]> */ + r = k(0,y,0,0); + /* sig call: (InCtrl: <[acd], [---]>) */ + /* call to k_slice_1: */ + /* <[acd], [---]> */ + z = k(G,0,0,0); + /*@ slice pragma expr z; */ /* <[---], [---]> */ + ; + /* invisible call */ /* <[---], [---]> */ + send(z); + /* <[---], [---]> */ + return z; +} + +Slicing project worklist [default/slicing_3] = + + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +void k_slice_1(void) +{ + return; +} + +void f_slice_1(void); + +void g(void) +{ + k_slice_1(); + f_slice_1(); + return; +} + +void f_slice_1(void) +{ + k_slice_1(); + k_slice_1(); + k_slice_1(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/ptr_fct.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/ptr_fct.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/ptr_fct.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/ptr_fct.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,78 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/ptr_fct.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at h +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {0} + ptf ∈ {0} +[value] computing for function g <- h. + Called from tests/slicing/ptr_fct.c:23. +[value] computing for function f1 <- g <- h. + Called from tests/slicing/ptr_fct.c:17. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- g <- h. + Called from tests/slicing/ptr_fct.c:17. +tests/slicing/ptr_fct.c:17:[kernel] warning: Neither code nor specification for function f2, generating default assigns from the prototype +[value] using specification for function f2 +[value] Done for function f2 +[value] Recording results for g +[value] Done for function g +[value] Recording results for h +[value] done for function h +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function h +[from] Computing for function g +[from] Computing for function f1 <-g +[from] Done for function f1 +[from] Computing for function f2 <-g +[from] Done for function f2 +[from] Done for function g +[pdg] done for function h +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function g +[pdg] done for function g +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +typedef void (*PTF)(int ); +int X; +void f1(int x) +{ + X = x; + return; +} + +/*@ assigns \nothing; */ +extern void f2(int y); + +void (*ptf)(int ) = (void (*)(int ))0; +void g(int arg); + +void g_slice_1(int arg) +{ + if (arg > 0) ptf = & f1; else ptf = & f2; + (*ptf)(arg); + return; +} + +PTF h(int a, int b) +{ + if (b) { + ptf = & g; + g_slice_1(a); + } + return ptf; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/same_sliced_name_bts1422.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/same_sliced_name_bts1422.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/same_sliced_name_bts1422.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/same_sliced_name_bts1422.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,37 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/same_sliced_name_bts1422.i (no preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at foo +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + y ∈ {0} + ptr ∈ {{ &foo }} +tests/slicing/same_sliced_name_bts1422.i:9:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +[value] Recording results for foo +[value] done for function foo +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function foo +[pdg] done for function foo +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int y; +void foo(void); + +void foo(void) +{ + y ++; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.10.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.10.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.10.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.10.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,177 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_by_annot.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ [--..--] + Sa ∈ [--..--] + X9 ∈ [--..--] + Y9 ∈ [--..--] + Z9 ∈ [--..--] + d ∈ [--..--] +tests/slicing/select_by_annot.c:133:[value] Assertion got status valid. +tests/slicing/select_by_annot.c:137:[kernel] warning: signed overflow. assert (int)((int)(a+b)+c)+d ≤ 2147483647; +[value] computing for function modifS <- main. + Called from tests/slicing/select_by_annot.c:138. +tests/slicing/select_by_annot.c:122:[kernel] warning: signed overflow. assert S.a+a ≤ 2147483647; +[value] Recording results for modifS +[value] Done for function modifS +[value] computing for function new_int <- main. + Called from tests/slicing/select_by_annot.c:140. +tests/slicing/select_by_annot.c:140:[kernel] warning: Neither code nor specification for function new_int, generating default assigns from the prototype +[value] using specification for function new_int +[value] Done for function new_int +[value] computing for function f1 <- main. + Called from tests/slicing/select_by_annot.c:141. +tests/slicing/select_by_annot.c:29:[value] Assertion got status unknown. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/select_by_annot.c:142. +tests/slicing/select_by_annot.c:39:[value] Assertion got status unknown. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/select_by_annot.c:143. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/select_by_annot.c:144. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/select_by_annot.c:145. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/select_by_annot.c:146. +tests/slicing/select_by_annot.c:77:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/slicing/select_by_annot.c:147. +tests/slicing/select_by_annot.c:88:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/select_by_annot.c:148. +tests/slicing/select_by_annot.c:97:[value] Loop invariant got status unknown. +tests/slicing/select_by_annot.c:99:[value] entering loop for the first time +tests/slicing/select_by_annot.c:100:[value] Assertion got status unknown. +tests/slicing/select_by_annot.c:104:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f9 <- main. + Called from tests/slicing/select_by_annot.c:149. +[value] Recording results for f9 +[value] Done for function f9 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function f9 +[from] Done for function f9 +[from] Computing for function modifS +[from] Done for function modifS +[from] Computing for function main +[from] Computing for function new_int <-main +[from] Done for function new_int +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f2: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f3: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f4: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f5: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f6: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f7: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f8: + S.a FROM S.a; cond (and SELF) + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f9: + X9 FROM c1; c2 + Y9 FROM Z9 + Z9 FROM c2 +[from] Function modifS: + S.a FROM S.a; a + .b FROM S.b; b +[from] Function new_int: + \result FROM \nothing +[from] Function main: + S.a FROM S.a; d + .b FROM S.b + Sa FROM S.a; d (and SELF) + X9 FROM d + Y9 FROM Z9 + Z9 FROM d + d FROM \nothing + \result FROM d +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f7 +[pdg] done for function f7 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct Tstr { + int a ; + int b ; +}; +struct Tstr S; +int Sa; +void f7_slice_1(int cond) +{ + int *p; + p = & S.a; + if (cond) { + /*@ slice pragma stmt; */ + { + Sa = *p; + Sa ++; + } + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.11.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.11.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.11.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.11.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,168 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_by_annot.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ [--..--] + Sa ∈ [--..--] + X9 ∈ [--..--] + Y9 ∈ [--..--] + Z9 ∈ [--..--] + d ∈ [--..--] +tests/slicing/select_by_annot.c:133:[value] Assertion got status valid. +tests/slicing/select_by_annot.c:137:[kernel] warning: signed overflow. assert (int)((int)(a+b)+c)+d ≤ 2147483647; +[value] computing for function modifS <- main. + Called from tests/slicing/select_by_annot.c:138. +tests/slicing/select_by_annot.c:122:[kernel] warning: signed overflow. assert S.a+a ≤ 2147483647; +[value] Recording results for modifS +[value] Done for function modifS +[value] computing for function new_int <- main. + Called from tests/slicing/select_by_annot.c:140. +tests/slicing/select_by_annot.c:140:[kernel] warning: Neither code nor specification for function new_int, generating default assigns from the prototype +[value] using specification for function new_int +[value] Done for function new_int +[value] computing for function f1 <- main. + Called from tests/slicing/select_by_annot.c:141. +tests/slicing/select_by_annot.c:29:[value] Assertion got status unknown. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/select_by_annot.c:142. +tests/slicing/select_by_annot.c:39:[value] Assertion got status unknown. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/select_by_annot.c:143. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/select_by_annot.c:144. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/select_by_annot.c:145. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/select_by_annot.c:146. +tests/slicing/select_by_annot.c:77:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/slicing/select_by_annot.c:147. +tests/slicing/select_by_annot.c:88:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/select_by_annot.c:148. +tests/slicing/select_by_annot.c:97:[value] Loop invariant got status unknown. +tests/slicing/select_by_annot.c:99:[value] entering loop for the first time +tests/slicing/select_by_annot.c:100:[value] Assertion got status unknown. +tests/slicing/select_by_annot.c:104:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f9 <- main. + Called from tests/slicing/select_by_annot.c:149. +[value] Recording results for f9 +[value] Done for function f9 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function f9 +[from] Done for function f9 +[from] Computing for function modifS +[from] Done for function modifS +[from] Computing for function main +[from] Computing for function new_int <-main +[from] Done for function new_int +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f2: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f3: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f4: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f5: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f6: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f7: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f8: + S.a FROM S.a; cond (and SELF) + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f9: + X9 FROM c1; c2 + Y9 FROM Z9 + Z9 FROM c2 +[from] Function modifS: + S.a FROM S.a; a + .b FROM S.b; b +[from] Function new_int: + \result FROM \nothing +[from] Function main: + S.a FROM S.a; d + .b FROM S.b + Sa FROM S.a; d (and SELF) + X9 FROM d + Y9 FROM Z9 + Z9 FROM d + d FROM \nothing + \result FROM d +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f8 +[pdg] done for function f8 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void f8_slice_1(int cond) +{ + /*@ loop invariant cond ≥ 0; + loop variant cond; */ + while (cond) { + /*@ assert cond ≤ \at(cond,Pre); */ ; + cond --; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.12.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.12.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.12.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.12.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,175 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_by_annot.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ [--..--] + Sa ∈ [--..--] + X9 ∈ [--..--] + Y9 ∈ [--..--] + Z9 ∈ [--..--] + d ∈ [--..--] +tests/slicing/select_by_annot.c:133:[value] Assertion got status valid. +tests/slicing/select_by_annot.c:137:[kernel] warning: signed overflow. assert (int)((int)(a+b)+c)+d ≤ 2147483647; +[value] computing for function modifS <- main. + Called from tests/slicing/select_by_annot.c:138. +tests/slicing/select_by_annot.c:122:[kernel] warning: signed overflow. assert S.a+a ≤ 2147483647; +[value] Recording results for modifS +[value] Done for function modifS +[value] computing for function new_int <- main. + Called from tests/slicing/select_by_annot.c:140. +tests/slicing/select_by_annot.c:140:[kernel] warning: Neither code nor specification for function new_int, generating default assigns from the prototype +[value] using specification for function new_int +[value] Done for function new_int +[value] computing for function f1 <- main. + Called from tests/slicing/select_by_annot.c:141. +tests/slicing/select_by_annot.c:29:[value] Assertion got status unknown. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/select_by_annot.c:142. +tests/slicing/select_by_annot.c:39:[value] Assertion got status unknown. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/select_by_annot.c:143. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/select_by_annot.c:144. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/select_by_annot.c:145. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/select_by_annot.c:146. +tests/slicing/select_by_annot.c:77:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/slicing/select_by_annot.c:147. +tests/slicing/select_by_annot.c:88:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/select_by_annot.c:148. +tests/slicing/select_by_annot.c:97:[value] Loop invariant got status unknown. +tests/slicing/select_by_annot.c:99:[value] entering loop for the first time +tests/slicing/select_by_annot.c:100:[value] Assertion got status unknown. +tests/slicing/select_by_annot.c:104:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f9 <- main. + Called from tests/slicing/select_by_annot.c:149. +[value] Recording results for f9 +[value] Done for function f9 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function f9 +[from] Done for function f9 +[from] Computing for function modifS +[from] Done for function modifS +[from] Computing for function main +[from] Computing for function new_int <-main +[from] Done for function new_int +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f2: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f3: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f4: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f5: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f6: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f7: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f8: + S.a FROM S.a; cond (and SELF) + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f9: + X9 FROM c1; c2 + Y9 FROM Z9 + Z9 FROM c2 +[from] Function modifS: + S.a FROM S.a; a + .b FROM S.b; b +[from] Function new_int: + \result FROM \nothing +[from] Function main: + S.a FROM S.a; d + .b FROM S.b + Sa FROM S.a; d (and SELF) + X9 FROM d + Y9 FROM Z9 + Z9 FROM d + d FROM \nothing + \result FROM d +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f8 +[pdg] done for function f8 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct Tstr { + int a ; + int b ; +}; +struct Tstr S; +void f8_slice_1(int cond) +{ + /*@ loop invariant cond ≥ 0; + loop variant cond; */ + while (cond) { + /*@ assert cond ≤ \at(cond,Pre); */ ; + /*@ slice pragma stmt; */ + (S.a) ++; + cond --; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.13.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.13.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.13.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.13.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,175 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_by_annot.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ [--..--] + Sa ∈ [--..--] + X9 ∈ [--..--] + Y9 ∈ [--..--] + Z9 ∈ [--..--] + d ∈ [--..--] +tests/slicing/select_by_annot.c:133:[value] Assertion got status valid. +tests/slicing/select_by_annot.c:137:[kernel] warning: signed overflow. assert (int)((int)(a+b)+c)+d ≤ 2147483647; +[value] computing for function modifS <- main. + Called from tests/slicing/select_by_annot.c:138. +tests/slicing/select_by_annot.c:122:[kernel] warning: signed overflow. assert S.a+a ≤ 2147483647; +[value] Recording results for modifS +[value] Done for function modifS +[value] computing for function new_int <- main. + Called from tests/slicing/select_by_annot.c:140. +tests/slicing/select_by_annot.c:140:[kernel] warning: Neither code nor specification for function new_int, generating default assigns from the prototype +[value] using specification for function new_int +[value] Done for function new_int +[value] computing for function f1 <- main. + Called from tests/slicing/select_by_annot.c:141. +tests/slicing/select_by_annot.c:29:[value] Assertion got status unknown. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/select_by_annot.c:142. +tests/slicing/select_by_annot.c:39:[value] Assertion got status unknown. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/select_by_annot.c:143. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/select_by_annot.c:144. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/select_by_annot.c:145. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/select_by_annot.c:146. +tests/slicing/select_by_annot.c:77:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/slicing/select_by_annot.c:147. +tests/slicing/select_by_annot.c:88:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/select_by_annot.c:148. +tests/slicing/select_by_annot.c:97:[value] Loop invariant got status unknown. +tests/slicing/select_by_annot.c:99:[value] entering loop for the first time +tests/slicing/select_by_annot.c:100:[value] Assertion got status unknown. +tests/slicing/select_by_annot.c:104:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f9 <- main. + Called from tests/slicing/select_by_annot.c:149. +[value] Recording results for f9 +[value] Done for function f9 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function f9 +[from] Done for function f9 +[from] Computing for function modifS +[from] Done for function modifS +[from] Computing for function main +[from] Computing for function new_int <-main +[from] Done for function new_int +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f2: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f3: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f4: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f5: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f6: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f7: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f8: + S.a FROM S.a; cond (and SELF) + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f9: + X9 FROM c1; c2 + Y9 FROM Z9 + Z9 FROM c2 +[from] Function modifS: + S.a FROM S.a; a + .b FROM S.b; b +[from] Function new_int: + \result FROM \nothing +[from] Function main: + S.a FROM S.a; d + .b FROM S.b + Sa FROM S.a; d (and SELF) + X9 FROM d + Y9 FROM Z9 + Z9 FROM d + d FROM \nothing + \result FROM d +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f8 +[pdg] done for function f8 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct Tstr { + int a ; + int b ; +}; +struct Tstr S; +void f8_slice_1(int cond) +{ + int *p; + p = & S.a; + /*@ loop invariant cond ≥ 0; + loop variant cond; */ + while (cond) { + /*@ assert cond ≤ \at(cond,Pre); */ ; + cond --; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.14.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.14.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.14.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.14.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,167 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_by_annot.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ [--..--] + Sa ∈ [--..--] + X9 ∈ [--..--] + Y9 ∈ [--..--] + Z9 ∈ [--..--] + d ∈ [--..--] +tests/slicing/select_by_annot.c:133:[value] Assertion got status valid. +tests/slicing/select_by_annot.c:137:[kernel] warning: signed overflow. assert (int)((int)(a+b)+c)+d ≤ 2147483647; +[value] computing for function modifS <- main. + Called from tests/slicing/select_by_annot.c:138. +tests/slicing/select_by_annot.c:122:[kernel] warning: signed overflow. assert S.a+a ≤ 2147483647; +[value] Recording results for modifS +[value] Done for function modifS +[value] computing for function new_int <- main. + Called from tests/slicing/select_by_annot.c:140. +tests/slicing/select_by_annot.c:140:[kernel] warning: Neither code nor specification for function new_int, generating default assigns from the prototype +[value] using specification for function new_int +[value] Done for function new_int +[value] computing for function f1 <- main. + Called from tests/slicing/select_by_annot.c:141. +tests/slicing/select_by_annot.c:29:[value] Assertion got status unknown. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/select_by_annot.c:142. +tests/slicing/select_by_annot.c:39:[value] Assertion got status unknown. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/select_by_annot.c:143. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/select_by_annot.c:144. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/select_by_annot.c:145. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/select_by_annot.c:146. +tests/slicing/select_by_annot.c:77:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/slicing/select_by_annot.c:147. +tests/slicing/select_by_annot.c:88:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/select_by_annot.c:148. +tests/slicing/select_by_annot.c:97:[value] Loop invariant got status unknown. +tests/slicing/select_by_annot.c:99:[value] entering loop for the first time +tests/slicing/select_by_annot.c:100:[value] Assertion got status unknown. +tests/slicing/select_by_annot.c:104:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f9 <- main. + Called from tests/slicing/select_by_annot.c:149. +[value] Recording results for f9 +[value] Done for function f9 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function f9 +[from] Done for function f9 +[from] Computing for function modifS +[from] Done for function modifS +[from] Computing for function main +[from] Computing for function new_int <-main +[from] Done for function new_int +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f2: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f3: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f4: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f5: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f6: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f7: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f8: + S.a FROM S.a; cond (and SELF) + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f9: + X9 FROM c1; c2 + Y9 FROM Z9 + Z9 FROM c2 +[from] Function modifS: + S.a FROM S.a; a + .b FROM S.b; b +[from] Function new_int: + \result FROM \nothing +[from] Function main: + S.a FROM S.a; d + .b FROM S.b + Sa FROM S.a; d (and SELF) + X9 FROM d + Y9 FROM Z9 + Z9 FROM d + d FROM \nothing + \result FROM d +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f9 +[pdg] done for function f9 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int X9; +void f9_slice_1(int c1, int c2) +{ + if (c1 > c2) goto L; + c1 = c2; + /*@ slice pragma stmt; */ + L: X9 = c1; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,172 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_by_annot.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ [--..--] + Sa ∈ [--..--] + X9 ∈ [--..--] + Y9 ∈ [--..--] + Z9 ∈ [--..--] + d ∈ [--..--] +tests/slicing/select_by_annot.c:133:[value] Assertion got status valid. +tests/slicing/select_by_annot.c:137:[kernel] warning: signed overflow. assert (int)((int)(a+b)+c)+d ≤ 2147483647; +[value] computing for function modifS <- main. + Called from tests/slicing/select_by_annot.c:138. +tests/slicing/select_by_annot.c:122:[kernel] warning: signed overflow. assert S.a+a ≤ 2147483647; +[value] Recording results for modifS +[value] Done for function modifS +[value] computing for function new_int <- main. + Called from tests/slicing/select_by_annot.c:140. +tests/slicing/select_by_annot.c:140:[kernel] warning: Neither code nor specification for function new_int, generating default assigns from the prototype +[value] using specification for function new_int +[value] Done for function new_int +[value] computing for function f1 <- main. + Called from tests/slicing/select_by_annot.c:141. +tests/slicing/select_by_annot.c:29:[value] Assertion got status unknown. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/select_by_annot.c:142. +tests/slicing/select_by_annot.c:39:[value] Assertion got status unknown. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/select_by_annot.c:143. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/select_by_annot.c:144. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/select_by_annot.c:145. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/select_by_annot.c:146. +tests/slicing/select_by_annot.c:77:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/slicing/select_by_annot.c:147. +tests/slicing/select_by_annot.c:88:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/select_by_annot.c:148. +tests/slicing/select_by_annot.c:97:[value] Loop invariant got status unknown. +tests/slicing/select_by_annot.c:99:[value] entering loop for the first time +tests/slicing/select_by_annot.c:100:[value] Assertion got status unknown. +tests/slicing/select_by_annot.c:104:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f9 <- main. + Called from tests/slicing/select_by_annot.c:149. +[value] Recording results for f9 +[value] Done for function f9 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function f9 +[from] Done for function f9 +[from] Computing for function modifS +[from] Done for function modifS +[from] Computing for function main +[from] Computing for function new_int <-main +[from] Done for function new_int +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f2: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f3: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f4: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f5: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f6: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f7: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f8: + S.a FROM S.a; cond (and SELF) + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f9: + X9 FROM c1; c2 + Y9 FROM Z9 + Z9 FROM c2 +[from] Function modifS: + S.a FROM S.a; a + .b FROM S.b; b +[from] Function new_int: + \result FROM \nothing +[from] Function main: + S.a FROM S.a; d + .b FROM S.b + Sa FROM S.a; d (and SELF) + X9 FROM d + Y9 FROM Z9 + Z9 FROM d + d FROM \nothing + \result FROM d +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int d; +void main(void) +{ + int a; + int b; + a = 0; + b = 0; + if (d > 0) { + /*@ assert b ≡ 0; */ ; + a = 1; + } + /*@ slice pragma expr a+b; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,167 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_by_annot.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ [--..--] + Sa ∈ [--..--] + X9 ∈ [--..--] + Y9 ∈ [--..--] + Z9 ∈ [--..--] + d ∈ [--..--] +tests/slicing/select_by_annot.c:133:[value] Assertion got status valid. +tests/slicing/select_by_annot.c:137:[kernel] warning: signed overflow. assert (int)((int)(a+b)+c)+d ≤ 2147483647; +[value] computing for function modifS <- main. + Called from tests/slicing/select_by_annot.c:138. +tests/slicing/select_by_annot.c:122:[kernel] warning: signed overflow. assert S.a+a ≤ 2147483647; +[value] Recording results for modifS +[value] Done for function modifS +[value] computing for function new_int <- main. + Called from tests/slicing/select_by_annot.c:140. +tests/slicing/select_by_annot.c:140:[kernel] warning: Neither code nor specification for function new_int, generating default assigns from the prototype +[value] using specification for function new_int +[value] Done for function new_int +[value] computing for function f1 <- main. + Called from tests/slicing/select_by_annot.c:141. +tests/slicing/select_by_annot.c:29:[value] Assertion got status unknown. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/select_by_annot.c:142. +tests/slicing/select_by_annot.c:39:[value] Assertion got status unknown. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/select_by_annot.c:143. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/select_by_annot.c:144. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/select_by_annot.c:145. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/select_by_annot.c:146. +tests/slicing/select_by_annot.c:77:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/slicing/select_by_annot.c:147. +tests/slicing/select_by_annot.c:88:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/select_by_annot.c:148. +tests/slicing/select_by_annot.c:97:[value] Loop invariant got status unknown. +tests/slicing/select_by_annot.c:99:[value] entering loop for the first time +tests/slicing/select_by_annot.c:100:[value] Assertion got status unknown. +tests/slicing/select_by_annot.c:104:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f9 <- main. + Called from tests/slicing/select_by_annot.c:149. +[value] Recording results for f9 +[value] Done for function f9 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function f9 +[from] Done for function f9 +[from] Computing for function modifS +[from] Done for function modifS +[from] Computing for function main +[from] Computing for function new_int <-main +[from] Done for function new_int +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f2: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f3: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f4: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f5: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f6: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f7: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f8: + S.a FROM S.a; cond (and SELF) + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f9: + X9 FROM c1; c2 + Y9 FROM Z9 + Z9 FROM c2 +[from] Function modifS: + S.a FROM S.a; a + .b FROM S.b; b +[from] Function new_int: + \result FROM \nothing +[from] Function main: + S.a FROM S.a; d + .b FROM S.b + Sa FROM S.a; d (and SELF) + X9 FROM d + Y9 FROM Z9 + Z9 FROM d + d FROM \nothing + \result FROM d +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int d; +void main(void) +{ + int b; + b = 0; + if (d > 0) + /*@ assert b ≡ 0; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.3.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,169 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_by_annot.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ [--..--] + Sa ∈ [--..--] + X9 ∈ [--..--] + Y9 ∈ [--..--] + Z9 ∈ [--..--] + d ∈ [--..--] +tests/slicing/select_by_annot.c:133:[value] Assertion got status valid. +tests/slicing/select_by_annot.c:137:[kernel] warning: signed overflow. assert (int)((int)(a+b)+c)+d ≤ 2147483647; +[value] computing for function modifS <- main. + Called from tests/slicing/select_by_annot.c:138. +tests/slicing/select_by_annot.c:122:[kernel] warning: signed overflow. assert S.a+a ≤ 2147483647; +[value] Recording results for modifS +[value] Done for function modifS +[value] computing for function new_int <- main. + Called from tests/slicing/select_by_annot.c:140. +tests/slicing/select_by_annot.c:140:[kernel] warning: Neither code nor specification for function new_int, generating default assigns from the prototype +[value] using specification for function new_int +[value] Done for function new_int +[value] computing for function f1 <- main. + Called from tests/slicing/select_by_annot.c:141. +tests/slicing/select_by_annot.c:29:[value] Assertion got status unknown. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/select_by_annot.c:142. +tests/slicing/select_by_annot.c:39:[value] Assertion got status unknown. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/select_by_annot.c:143. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/select_by_annot.c:144. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/select_by_annot.c:145. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/select_by_annot.c:146. +tests/slicing/select_by_annot.c:77:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/slicing/select_by_annot.c:147. +tests/slicing/select_by_annot.c:88:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/select_by_annot.c:148. +tests/slicing/select_by_annot.c:97:[value] Loop invariant got status unknown. +tests/slicing/select_by_annot.c:99:[value] entering loop for the first time +tests/slicing/select_by_annot.c:100:[value] Assertion got status unknown. +tests/slicing/select_by_annot.c:104:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f9 <- main. + Called from tests/slicing/select_by_annot.c:149. +[value] Recording results for f9 +[value] Done for function f9 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function f9 +[from] Done for function f9 +[from] Computing for function modifS +[from] Done for function modifS +[from] Computing for function main +[from] Computing for function new_int <-main +[from] Done for function new_int +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f2: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f3: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f4: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f5: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f6: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f7: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f8: + S.a FROM S.a; cond (and SELF) + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f9: + X9 FROM c1; c2 + Y9 FROM Z9 + Z9 FROM c2 +[from] Function modifS: + S.a FROM S.a; a + .b FROM S.b; b +[from] Function new_int: + \result FROM \nothing +[from] Function main: + S.a FROM S.a; d + .b FROM S.b + Sa FROM S.a; d (and SELF) + X9 FROM d + Y9 FROM Z9 + Z9 FROM d + d FROM \nothing + \result FROM d +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function modifS +[pdg] done for function modifS +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct Tstr { + int a ; + int b ; +}; +struct Tstr S; +void modifS_slice_1(int a) +{ + S.a += a; + /*@ slice pragma expr S.a; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.4.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,170 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_by_annot.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ [--..--] + Sa ∈ [--..--] + X9 ∈ [--..--] + Y9 ∈ [--..--] + Z9 ∈ [--..--] + d ∈ [--..--] +tests/slicing/select_by_annot.c:133:[value] Assertion got status valid. +tests/slicing/select_by_annot.c:137:[kernel] warning: signed overflow. assert (int)((int)(a+b)+c)+d ≤ 2147483647; +[value] computing for function modifS <- main. + Called from tests/slicing/select_by_annot.c:138. +tests/slicing/select_by_annot.c:122:[kernel] warning: signed overflow. assert S.a+a ≤ 2147483647; +[value] Recording results for modifS +[value] Done for function modifS +[value] computing for function new_int <- main. + Called from tests/slicing/select_by_annot.c:140. +tests/slicing/select_by_annot.c:140:[kernel] warning: Neither code nor specification for function new_int, generating default assigns from the prototype +[value] using specification for function new_int +[value] Done for function new_int +[value] computing for function f1 <- main. + Called from tests/slicing/select_by_annot.c:141. +tests/slicing/select_by_annot.c:29:[value] Assertion got status unknown. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/select_by_annot.c:142. +tests/slicing/select_by_annot.c:39:[value] Assertion got status unknown. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/select_by_annot.c:143. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/select_by_annot.c:144. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/select_by_annot.c:145. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/select_by_annot.c:146. +tests/slicing/select_by_annot.c:77:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/slicing/select_by_annot.c:147. +tests/slicing/select_by_annot.c:88:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/select_by_annot.c:148. +tests/slicing/select_by_annot.c:97:[value] Loop invariant got status unknown. +tests/slicing/select_by_annot.c:99:[value] entering loop for the first time +tests/slicing/select_by_annot.c:100:[value] Assertion got status unknown. +tests/slicing/select_by_annot.c:104:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f9 <- main. + Called from tests/slicing/select_by_annot.c:149. +[value] Recording results for f9 +[value] Done for function f9 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function f9 +[from] Done for function f9 +[from] Computing for function modifS +[from] Done for function modifS +[from] Computing for function main +[from] Computing for function new_int <-main +[from] Done for function new_int +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f2: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f3: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f4: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f5: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f6: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f7: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f8: + S.a FROM S.a; cond (and SELF) + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f9: + X9 FROM c1; c2 + Y9 FROM Z9 + Z9 FROM c2 +[from] Function modifS: + S.a FROM S.a; a + .b FROM S.b; b +[from] Function new_int: + \result FROM \nothing +[from] Function main: + S.a FROM S.a; d + .b FROM S.b + Sa FROM S.a; d (and SELF) + X9 FROM d + Y9 FROM Z9 + Z9 FROM d + d FROM \nothing + \result FROM d +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f1 +[pdg] done for function f1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct Tstr { + int a ; + int b ; +}; +struct Tstr S; +void f1_slice_1(void) +{ + int *p; + p = & S.a; + /*@ slice pragma expr *p; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.5.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.5.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.5.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,168 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_by_annot.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ [--..--] + Sa ∈ [--..--] + X9 ∈ [--..--] + Y9 ∈ [--..--] + Z9 ∈ [--..--] + d ∈ [--..--] +tests/slicing/select_by_annot.c:133:[value] Assertion got status valid. +tests/slicing/select_by_annot.c:137:[kernel] warning: signed overflow. assert (int)((int)(a+b)+c)+d ≤ 2147483647; +[value] computing for function modifS <- main. + Called from tests/slicing/select_by_annot.c:138. +tests/slicing/select_by_annot.c:122:[kernel] warning: signed overflow. assert S.a+a ≤ 2147483647; +[value] Recording results for modifS +[value] Done for function modifS +[value] computing for function new_int <- main. + Called from tests/slicing/select_by_annot.c:140. +tests/slicing/select_by_annot.c:140:[kernel] warning: Neither code nor specification for function new_int, generating default assigns from the prototype +[value] using specification for function new_int +[value] Done for function new_int +[value] computing for function f1 <- main. + Called from tests/slicing/select_by_annot.c:141. +tests/slicing/select_by_annot.c:29:[value] Assertion got status unknown. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/select_by_annot.c:142. +tests/slicing/select_by_annot.c:39:[value] Assertion got status unknown. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/select_by_annot.c:143. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/select_by_annot.c:144. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/select_by_annot.c:145. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/select_by_annot.c:146. +tests/slicing/select_by_annot.c:77:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/slicing/select_by_annot.c:147. +tests/slicing/select_by_annot.c:88:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/select_by_annot.c:148. +tests/slicing/select_by_annot.c:97:[value] Loop invariant got status unknown. +tests/slicing/select_by_annot.c:99:[value] entering loop for the first time +tests/slicing/select_by_annot.c:100:[value] Assertion got status unknown. +tests/slicing/select_by_annot.c:104:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f9 <- main. + Called from tests/slicing/select_by_annot.c:149. +[value] Recording results for f9 +[value] Done for function f9 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function f9 +[from] Done for function f9 +[from] Computing for function modifS +[from] Done for function modifS +[from] Computing for function main +[from] Computing for function new_int <-main +[from] Done for function new_int +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f2: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f3: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f4: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f5: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f6: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f7: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f8: + S.a FROM S.a; cond (and SELF) + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f9: + X9 FROM c1; c2 + Y9 FROM Z9 + Z9 FROM c2 +[from] Function modifS: + S.a FROM S.a; a + .b FROM S.b; b +[from] Function new_int: + \result FROM \nothing +[from] Function main: + S.a FROM S.a; d + .b FROM S.b + Sa FROM S.a; d (and SELF) + X9 FROM d + Y9 FROM Z9 + Z9 FROM d + d FROM \nothing + \result FROM d +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f2 +[pdg] done for function f2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct Tstr { + int a ; + int b ; +}; +struct Tstr S; +void f2_slice_1(void) +{ + /*@ slice pragma expr S.a; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.6.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.6.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.6.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.6.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,164 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_by_annot.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ [--..--] + Sa ∈ [--..--] + X9 ∈ [--..--] + Y9 ∈ [--..--] + Z9 ∈ [--..--] + d ∈ [--..--] +tests/slicing/select_by_annot.c:133:[value] Assertion got status valid. +tests/slicing/select_by_annot.c:137:[kernel] warning: signed overflow. assert (int)((int)(a+b)+c)+d ≤ 2147483647; +[value] computing for function modifS <- main. + Called from tests/slicing/select_by_annot.c:138. +tests/slicing/select_by_annot.c:122:[kernel] warning: signed overflow. assert S.a+a ≤ 2147483647; +[value] Recording results for modifS +[value] Done for function modifS +[value] computing for function new_int <- main. + Called from tests/slicing/select_by_annot.c:140. +tests/slicing/select_by_annot.c:140:[kernel] warning: Neither code nor specification for function new_int, generating default assigns from the prototype +[value] using specification for function new_int +[value] Done for function new_int +[value] computing for function f1 <- main. + Called from tests/slicing/select_by_annot.c:141. +tests/slicing/select_by_annot.c:29:[value] Assertion got status unknown. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/select_by_annot.c:142. +tests/slicing/select_by_annot.c:39:[value] Assertion got status unknown. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/select_by_annot.c:143. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/select_by_annot.c:144. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/select_by_annot.c:145. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/select_by_annot.c:146. +tests/slicing/select_by_annot.c:77:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/slicing/select_by_annot.c:147. +tests/slicing/select_by_annot.c:88:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/select_by_annot.c:148. +tests/slicing/select_by_annot.c:97:[value] Loop invariant got status unknown. +tests/slicing/select_by_annot.c:99:[value] entering loop for the first time +tests/slicing/select_by_annot.c:100:[value] Assertion got status unknown. +tests/slicing/select_by_annot.c:104:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f9 <- main. + Called from tests/slicing/select_by_annot.c:149. +[value] Recording results for f9 +[value] Done for function f9 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function f9 +[from] Done for function f9 +[from] Computing for function modifS +[from] Done for function modifS +[from] Computing for function main +[from] Computing for function new_int <-main +[from] Done for function new_int +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f2: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f3: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f4: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f5: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f6: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f7: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f8: + S.a FROM S.a; cond (and SELF) + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f9: + X9 FROM c1; c2 + Y9 FROM Z9 + Z9 FROM c2 +[from] Function modifS: + S.a FROM S.a; a + .b FROM S.b; b +[from] Function new_int: + \result FROM \nothing +[from] Function main: + S.a FROM S.a; d + .b FROM S.b + Sa FROM S.a; d (and SELF) + X9 FROM d + Y9 FROM Z9 + Z9 FROM d + d FROM \nothing + \result FROM d +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f3 +[pdg] done for function f3 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void f3_slice_1(int cond) +{ + if (cond) + /*@ slice pragma ctrl; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.7.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.7.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.7.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.7.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,173 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_by_annot.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ [--..--] + Sa ∈ [--..--] + X9 ∈ [--..--] + Y9 ∈ [--..--] + Z9 ∈ [--..--] + d ∈ [--..--] +tests/slicing/select_by_annot.c:133:[value] Assertion got status valid. +tests/slicing/select_by_annot.c:137:[kernel] warning: signed overflow. assert (int)((int)(a+b)+c)+d ≤ 2147483647; +[value] computing for function modifS <- main. + Called from tests/slicing/select_by_annot.c:138. +tests/slicing/select_by_annot.c:122:[kernel] warning: signed overflow. assert S.a+a ≤ 2147483647; +[value] Recording results for modifS +[value] Done for function modifS +[value] computing for function new_int <- main. + Called from tests/slicing/select_by_annot.c:140. +tests/slicing/select_by_annot.c:140:[kernel] warning: Neither code nor specification for function new_int, generating default assigns from the prototype +[value] using specification for function new_int +[value] Done for function new_int +[value] computing for function f1 <- main. + Called from tests/slicing/select_by_annot.c:141. +tests/slicing/select_by_annot.c:29:[value] Assertion got status unknown. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/select_by_annot.c:142. +tests/slicing/select_by_annot.c:39:[value] Assertion got status unknown. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/select_by_annot.c:143. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/select_by_annot.c:144. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/select_by_annot.c:145. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/select_by_annot.c:146. +tests/slicing/select_by_annot.c:77:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/slicing/select_by_annot.c:147. +tests/slicing/select_by_annot.c:88:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/select_by_annot.c:148. +tests/slicing/select_by_annot.c:97:[value] Loop invariant got status unknown. +tests/slicing/select_by_annot.c:99:[value] entering loop for the first time +tests/slicing/select_by_annot.c:100:[value] Assertion got status unknown. +tests/slicing/select_by_annot.c:104:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f9 <- main. + Called from tests/slicing/select_by_annot.c:149. +[value] Recording results for f9 +[value] Done for function f9 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function f9 +[from] Done for function f9 +[from] Computing for function modifS +[from] Done for function modifS +[from] Computing for function main +[from] Computing for function new_int <-main +[from] Done for function new_int +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f2: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f3: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f4: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f5: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f6: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f7: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f8: + S.a FROM S.a; cond (and SELF) + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f9: + X9 FROM c1; c2 + Y9 FROM Z9 + Z9 FROM c2 +[from] Function modifS: + S.a FROM S.a; a + .b FROM S.b; b +[from] Function new_int: + \result FROM \nothing +[from] Function main: + S.a FROM S.a; d + .b FROM S.b + Sa FROM S.a; d (and SELF) + X9 FROM d + Y9 FROM Z9 + Z9 FROM d + d FROM \nothing + \result FROM d +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f4 +[pdg] done for function f4 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct Tstr { + int a ; + int b ; +}; +struct Tstr S; +int Sa; +void f4_slice_1(int cond) +{ + int *p; + p = & S.a; + if (cond) + /*@ slice pragma stmt; */ + Sa = *p; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.8.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.8.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.8.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.8.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,164 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_by_annot.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ [--..--] + Sa ∈ [--..--] + X9 ∈ [--..--] + Y9 ∈ [--..--] + Z9 ∈ [--..--] + d ∈ [--..--] +tests/slicing/select_by_annot.c:133:[value] Assertion got status valid. +tests/slicing/select_by_annot.c:137:[kernel] warning: signed overflow. assert (int)((int)(a+b)+c)+d ≤ 2147483647; +[value] computing for function modifS <- main. + Called from tests/slicing/select_by_annot.c:138. +tests/slicing/select_by_annot.c:122:[kernel] warning: signed overflow. assert S.a+a ≤ 2147483647; +[value] Recording results for modifS +[value] Done for function modifS +[value] computing for function new_int <- main. + Called from tests/slicing/select_by_annot.c:140. +tests/slicing/select_by_annot.c:140:[kernel] warning: Neither code nor specification for function new_int, generating default assigns from the prototype +[value] using specification for function new_int +[value] Done for function new_int +[value] computing for function f1 <- main. + Called from tests/slicing/select_by_annot.c:141. +tests/slicing/select_by_annot.c:29:[value] Assertion got status unknown. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/select_by_annot.c:142. +tests/slicing/select_by_annot.c:39:[value] Assertion got status unknown. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/select_by_annot.c:143. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/select_by_annot.c:144. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/select_by_annot.c:145. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/select_by_annot.c:146. +tests/slicing/select_by_annot.c:77:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/slicing/select_by_annot.c:147. +tests/slicing/select_by_annot.c:88:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/select_by_annot.c:148. +tests/slicing/select_by_annot.c:97:[value] Loop invariant got status unknown. +tests/slicing/select_by_annot.c:99:[value] entering loop for the first time +tests/slicing/select_by_annot.c:100:[value] Assertion got status unknown. +tests/slicing/select_by_annot.c:104:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f9 <- main. + Called from tests/slicing/select_by_annot.c:149. +[value] Recording results for f9 +[value] Done for function f9 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function f9 +[from] Done for function f9 +[from] Computing for function modifS +[from] Done for function modifS +[from] Computing for function main +[from] Computing for function new_int <-main +[from] Done for function new_int +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f2: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f3: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f4: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f5: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f6: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f7: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f8: + S.a FROM S.a; cond (and SELF) + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f9: + X9 FROM c1; c2 + Y9 FROM Z9 + Z9 FROM c2 +[from] Function modifS: + S.a FROM S.a; a + .b FROM S.b; b +[from] Function new_int: + \result FROM \nothing +[from] Function main: + S.a FROM S.a; d + .b FROM S.b + Sa FROM S.a; d (and SELF) + X9 FROM d + Y9 FROM Z9 + Z9 FROM d + d FROM \nothing + \result FROM d +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f5 +[pdg] done for function f5 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void f5_slice_1(int cond) +{ + if (cond) + /*@ slice pragma expr 1; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.9.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.9.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.9.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.9.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,175 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_by_annot.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ [--..--] + Sa ∈ [--..--] + X9 ∈ [--..--] + Y9 ∈ [--..--] + Z9 ∈ [--..--] + d ∈ [--..--] +tests/slicing/select_by_annot.c:133:[value] Assertion got status valid. +tests/slicing/select_by_annot.c:137:[kernel] warning: signed overflow. assert (int)((int)(a+b)+c)+d ≤ 2147483647; +[value] computing for function modifS <- main. + Called from tests/slicing/select_by_annot.c:138. +tests/slicing/select_by_annot.c:122:[kernel] warning: signed overflow. assert S.a+a ≤ 2147483647; +[value] Recording results for modifS +[value] Done for function modifS +[value] computing for function new_int <- main. + Called from tests/slicing/select_by_annot.c:140. +tests/slicing/select_by_annot.c:140:[kernel] warning: Neither code nor specification for function new_int, generating default assigns from the prototype +[value] using specification for function new_int +[value] Done for function new_int +[value] computing for function f1 <- main. + Called from tests/slicing/select_by_annot.c:141. +tests/slicing/select_by_annot.c:29:[value] Assertion got status unknown. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/select_by_annot.c:142. +tests/slicing/select_by_annot.c:39:[value] Assertion got status unknown. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/select_by_annot.c:143. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/select_by_annot.c:144. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/select_by_annot.c:145. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/select_by_annot.c:146. +tests/slicing/select_by_annot.c:77:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/slicing/select_by_annot.c:147. +tests/slicing/select_by_annot.c:88:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/select_by_annot.c:148. +tests/slicing/select_by_annot.c:97:[value] Loop invariant got status unknown. +tests/slicing/select_by_annot.c:99:[value] entering loop for the first time +tests/slicing/select_by_annot.c:100:[value] Assertion got status unknown. +tests/slicing/select_by_annot.c:104:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f9 <- main. + Called from tests/slicing/select_by_annot.c:149. +[value] Recording results for f9 +[value] Done for function f9 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function f9 +[from] Done for function f9 +[from] Computing for function modifS +[from] Done for function modifS +[from] Computing for function main +[from] Computing for function new_int <-main +[from] Done for function new_int +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f2: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f3: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f4: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f5: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f6: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f7: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f8: + S.a FROM S.a; cond (and SELF) + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f9: + X9 FROM c1; c2 + Y9 FROM Z9 + Z9 FROM c2 +[from] Function modifS: + S.a FROM S.a; a + .b FROM S.b; b +[from] Function new_int: + \result FROM \nothing +[from] Function main: + S.a FROM S.a; d + .b FROM S.b + Sa FROM S.a; d (and SELF) + X9 FROM d + Y9 FROM Z9 + Z9 FROM d + d FROM \nothing + \result FROM d +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f6 +[pdg] done for function f6 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct Tstr { + int a ; + int b ; +}; +struct Tstr S; +int Sa; +void f6_slice_1(int cond) +{ + int *p; + p = & S.a; + /*@ slice pragma stmt; */ + if (cond) { + Sa = *p; + Sa ++; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_by_annot.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_by_annot.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,652 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_by_annot.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + S ∈ [--..--] + Sa ∈ [--..--] + X9 ∈ [--..--] + Y9 ∈ [--..--] + Z9 ∈ [--..--] + d ∈ [--..--] +tests/slicing/select_by_annot.c:133:[value] Assertion got status valid. +tests/slicing/select_by_annot.c:137:[kernel] warning: signed overflow. assert (int)((int)(a+b)+c)+d ≤ 2147483647; +[value] computing for function modifS <- main. + Called from tests/slicing/select_by_annot.c:138. +tests/slicing/select_by_annot.c:122:[kernel] warning: signed overflow. assert S.a+a ≤ 2147483647; +[value] Recording results for modifS +[value] Done for function modifS +[value] computing for function new_int <- main. + Called from tests/slicing/select_by_annot.c:140. +tests/slicing/select_by_annot.c:140:[kernel] warning: Neither code nor specification for function new_int, generating default assigns from the prototype +[value] using specification for function new_int +[value] Done for function new_int +[value] computing for function f1 <- main. + Called from tests/slicing/select_by_annot.c:141. +tests/slicing/select_by_annot.c:29:[value] Assertion got status unknown. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/select_by_annot.c:142. +tests/slicing/select_by_annot.c:39:[value] Assertion got status unknown. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/select_by_annot.c:143. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/select_by_annot.c:144. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/select_by_annot.c:145. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/select_by_annot.c:146. +tests/slicing/select_by_annot.c:77:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +[value] computing for function f7 <- main. + Called from tests/slicing/select_by_annot.c:147. +tests/slicing/select_by_annot.c:88:[kernel] warning: signed overflow. assert Sa+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/select_by_annot.c:148. +tests/slicing/select_by_annot.c:97:[value] Loop invariant got status unknown. +tests/slicing/select_by_annot.c:99:[value] entering loop for the first time +tests/slicing/select_by_annot.c:100:[value] Assertion got status unknown. +tests/slicing/select_by_annot.c:104:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f9 <- main. + Called from tests/slicing/select_by_annot.c:149. +[value] Recording results for f9 +[value] Done for function f9 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function f9 +[from] Done for function f9 +[from] Computing for function modifS +[from] Done for function modifS +[from] Computing for function main +[from] Computing for function new_int <-main +[from] Done for function new_int +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f2: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f3: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f4: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f5: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f6: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f7: + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f8: + S.a FROM S.a; cond (and SELF) + Sa FROM S.a; cond (and SELF) + \result FROM S.a; Sa; cond +[from] Function f9: + X9 FROM c1; c2 + Y9 FROM Z9 + Z9 FROM c2 +[from] Function modifS: + S.a FROM S.a; a + .b FROM S.b; b +[from] Function new_int: + \result FROM \nothing +[from] Function main: + S.a FROM S.a; d + .b FROM S.b + Sa FROM S.a; d (and SELF) + X9 FROM d + Y9 FROM Z9 + Z9 FROM d + d FROM \nothing + \result FROM d +[from] ====== END OF DEPENDENCIES ====== +[slicing] making slicing project 'slicing_1'... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +RESULT for main: + {n1}: InCtrl + {n2}: VarDecl : a + {n3}: VarDecl : b + {n4}: VarDecl : c + {n5}: VarDecl : x + {n6}: a = 0; + -[-c-]-> 1 + -[a--]-> 2 + {n7}: b = 0; + -[-c-]-> 1 + -[a--]-> 3 + {n8}: c = 0; + -[-c-]-> 1 + -[a--]-> 4 + {n9}: d > 0 + -[-c-]-> 1 + -[--d]-> 58 + {n10}: ; + -[-c-]-> 1 + -[-c-]-> 9 + {n11}: a = 1; + -[-c-]-> 1 + -[a--]-> 2 + -[-c-]-> 9 + {n12}: ; + -[-c-]-> 1 + {n13}: block + -[-c-]-> 1 + {n14}: x = ((a + b) + c) + d; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[--d]-> 4 + -[a--]-> 5 + -[--d]-> 6 + -[--d]-> 7 + -[--d]-> 8 + -[--d]-> 11 + -[-c-]-> 13 + -[--d]-> 58 + {n15}: Call123-InCtrl : modifS(a,b); + -[-c-]-> 1 + {n16}: Call123-In1 : modifS(a,b); + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 6 + -[--d]-> 11 + -[-c-]-> 15 + {n17}: Call123-In2 : modifS(a,b); + -[-c-]-> 1 + -[--d]-> 3 + -[--d]-> 7 + -[-c-]-> 15 + {n18}: Call123-Out(S.a) : modifS(a,b); + -[-c-]-> 1 + -[-c-]-> 15 + -[--d]-> 16 + -[--d]-> 57 + {n19}: Call123-Out(S.b) : modifS(a,b); + -[-c-]-> 1 + -[-c-]-> 15 + -[--d]-> 17 + -[--d]-> 56 + {n20}: Call124-InCtrl : d = new_int(); + -[-c-]-> 1 + {n21}: Call124-OutRet : d = new_int(); + -[-c-]-> 1 + -[-c-]-> 20 + {n22}: Call125-InCtrl : f1(d); + -[-c-]-> 1 + {n23}: Call125-In1 : f1(d); + -[-c-]-> 1 + -[--d]-> 21 + -[-c-]-> 22 + {n24}: Call125-Out(Sa) : f1(d); + -[-c-]-> 1 + -[--d](S.a)-> 18 + -[-c-]-> 22 + -[--d]-> 23 + {n25}: Call126-InCtrl : f2(d); + -[-c-]-> 1 + {n26}: Call126-In1 : f2(d); + -[-c-]-> 1 + -[--d]-> 21 + -[-c-]-> 25 + {n27}: Call126-Out(Sa) : f2(d); + -[-c-]-> 1 + -[--d](S.a)-> 18 + -[-c-]-> 25 + -[--d]-> 26 + {n28}: Call127-InCtrl : f3(d); + -[-c-]-> 1 + {n29}: Call127-In1 : f3(d); + -[-c-]-> 1 + -[--d]-> 21 + -[-c-]-> 28 + {n30}: Call127-Out(Sa) : f3(d); + -[-c-]-> 1 + -[--d](S.a)-> 18 + -[-c-]-> 28 + -[--d]-> 29 + {n31}: Call128-InCtrl : f4(d); + -[-c-]-> 1 + {n32}: Call128-In1 : f4(d); + -[-c-]-> 1 + -[--d]-> 21 + -[-c-]-> 31 + {n33}: Call128-Out(Sa) : f4(d); + -[-c-]-> 1 + -[--d](S.a)-> 18 + -[-c-]-> 31 + -[--d]-> 32 + {n34}: Call129-InCtrl : f5(d); + -[-c-]-> 1 + {n35}: Call129-In1 : f5(d); + -[-c-]-> 1 + -[--d]-> 21 + -[-c-]-> 34 + {n36}: Call129-Out(Sa) : f5(d); + -[-c-]-> 1 + -[--d](S.a)-> 18 + -[-c-]-> 34 + -[--d]-> 35 + {n37}: Call130-InCtrl : f6(d); + -[-c-]-> 1 + {n38}: Call130-In1 : f6(d); + -[-c-]-> 1 + -[--d]-> 21 + -[-c-]-> 37 + {n39}: Call130-Out(Sa) : f6(d); + -[-c-]-> 1 + -[--d](S.a)-> 18 + -[-c-]-> 37 + -[--d]-> 38 + {n40}: Call131-InCtrl : f7(d); + -[-c-]-> 1 + {n41}: Call131-In1 : f7(d); + -[-c-]-> 1 + -[--d]-> 21 + -[-c-]-> 40 + {n42}: Call131-Out(Sa) : f7(d); + -[-c-]-> 1 + -[--d](S.a)-> 18 + -[-c-]-> 40 + -[--d]-> 41 + {n43}: Call132-InCtrl : f8(d); + -[-c-]-> 1 + {n44}: Call132-In1 : f8(d); + -[-c-]-> 1 + -[--d]-> 21 + -[-c-]-> 43 + {n45}: Call132-Out(S.a) : f8(d); + -[-c-]-> 1 + -[--d](S.a)-> 18 + -[-c-]-> 43 + -[--d]-> 44 + {n46}: Call132-Out(Sa) : f8(d); + -[-c-]-> 1 + -[--d](S.a)-> 18 + -[-c-]-> 43 + -[--d]-> 44 + {n47}: Call133-InCtrl : f9(d,a); + -[-c-]-> 1 + {n48}: Call133-In1 : f9(d,a); + -[-c-]-> 1 + -[--d]-> 21 + -[-c-]-> 47 + {n49}: Call133-In2 : f9(d,a); + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 6 + -[--d]-> 11 + -[-c-]-> 47 + {n50}: Call133-Out(X9) : f9(d,a); + -[-c-]-> 1 + -[-c-]-> 47 + -[--d]-> 48 + -[--d]-> 49 + {n51}: Call133-Out(Y9) : f9(d,a); + -[-c-]-> 1 + -[-c-]-> 47 + -[--d]-> 55 + {n52}: Call133-Out(Z9) : f9(d,a); + -[-c-]-> 1 + -[-c-]-> 47 + -[--d]-> 49 + {n53}: return x; + -[-c-]-> 1 + -[--d]-> 5 + -[--d]-> 14 + {n54}: OutRet + -[--d]-> 53 + {n55}: In(Z9) + {n56}: In(S.b) + {n57}: In(S.a) + {n58}: In(d) +[pdg] computing for function modifS +[pdg] done for function modifS +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +RESULT for modifS: + {n59}: InCtrl + {n60}: VarDecl : a + -[a--]-> 61 + {n61}: In1 + -[a--]-> 60 + {n62}: VarDecl : b + -[a--]-> 63 + {n63}: In2 + -[a--]-> 62 + {n64}: S.a += a; + -[-c-]-> 59 + -[--d]-> 60 + -[--d]-> 61 + -[--d]-> 69 + {n65}: S.b -= b; + -[-c-]-> 59 + -[--d]-> 62 + -[--d]-> 63 + -[--d]-> 68 + {n66}: ; + -[-c-]-> 59 + {n67}: return; + -[-c-]-> 59 + {n68}: In(S.b) + {n69}: In(S.a) +Slicing project worklist [default/slicing_1] = +[modifS = (n:66 ,<[ S ], [---]>)(n:64(restrict to S.a) ,<[--d], [---]>)(n:66 , +<[ S ], +[---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +struct Tstr { + int a ; + int b ; +}; +struct Tstr S; +int Sa; +int X9; +int Y9; +int Z9; +Print slice = +modifS_slice_1: +(InCtrl: <[--d], [---]>) +(In1: <[--d], [---]>) +(In(S.a): <[--d], [---]>) + +/**/void modifS(/* <[--d], [---]> */ int a, /* <[---], [---]> */ int b) +{ + /*@ assert Value: signed_overflow: S.a+a ≤ 2147483647; */ + /* <[--d], [---]> */ + S.a += a; + /* <[---], [---]> */ + S.b -= b; + /*@ slice pragma expr S.a; */ /* <[ S ], [---]> */ + ; + /* <[---], [---]> */ + return; +} + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int new_int(void); + +int d; +Print slice = +main_slice_1: +(InCtrl: <[--d], [---]>) +(In(d): <[--d], [---]>) +(In(S.a): <[--d], [---]>) + +/**/int main(void) +{ + /* <[--d], [---]> */ int a; + /* <[--d], [---]> */ int b; + /* <[---], [---]> */ int c; + /* <[---], [---]> */ int x; + /* <[--d], [---]> */ + a = 0; + /* <[--d], [---]> */ + b = 0; + /* <[---], [---]> */ + c = 0; + /* <[--d], [---]> */ + if (d > 0) { + /*@ assert b ≡ 0; */ /* <[---], [---]> */ + ; + /* <[--d], [---]> */ + a = 1; + } + /*@ slice pragma expr a+b; */ /* <[ S ], [---]> */ + ; + /* <[---], [ S ]> */ + /*@ assert Value: signed_overflow: (int)((int)(a+b)+c)+d ≤ 2147483647; */ + /* <[---], [---]> */ + x = ((a + b) + c) + d; + /* sig call: (InCtrl: <[--d], [---]>) + (In1: <[--d], [---]>) */ + /* call to modifS_slice_1: + (InCtrl: <[--d], [---]>) + (In1: <[--d], [---]>) + (In(S.a): <[--d], [---]>) */ + /* <[--d], [---]> */ + modifS(a,b); + /* invisible call */ /* <[---], [---]> */ + d = new_int(); + /* invisible call */ /* <[---], [---]> */ + f1(d); + /* invisible call */ /* <[---], [---]> */ + f2(d); + /* invisible call */ /* <[---], [---]> */ + f3(d); + /* invisible call */ /* <[---], [---]> */ + f4(d); + /* invisible call */ /* <[---], [---]> */ + f5(d); + /* invisible call */ /* <[---], [---]> */ + f6(d); + /* invisible call */ /* <[---], [---]> */ + f7(d); + /* invisible call */ /* <[---], [---]> */ + f8(d); + /* invisible call */ /* <[---], [---]> */ + f9(d,a); + /* <[---], [---]> */ + return x; +} + +Slicing project worklist [default/slicing_1] = + + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +struct Tstr { + int a ; + int b ; +}; +struct Tstr S; +void modifS_slice_1(int a) +{ + S.a += a; + /*@ slice pragma expr S.a; */ ; + return; +} + +int d; +void main(void) +{ + int a; + int b; + a = 0; + b = 0; + if (d > 0) { + /*@ assert b ≡ 0; */ ; + a = 1; + } + /*@ slice pragma expr a+b; */ ; + modifS_slice_1(a); + return; +} + + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +struct Tstr { + int a ; + int b ; +}; +struct Tstr S; +int Sa; +int X9; +int Y9; +int Z9; +Print slice = +modifS_slice_1: +(InCtrl: <[--d], [---]>) +(In1: <[--d], [---]>) +(In(S.a): <[--d], [---]>) + +/**/void modifS(/* <[--d], [---]> */ int a, /* <[---], [---]> */ int b) +{ + /*@ assert Value: signed_overflow: S.a+a ≤ 2147483647; */ + /* <[--d], [---]> */ + S.a += a; + /* <[---], [---]> */ + S.b -= b; + /*@ slice pragma expr S.a; */ /* <[ S ], [---]> */ + ; + /* <[---], [---]> */ + return; +} + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int new_int(void); + +int d; +Print slice = +main_slice_1: +(InCtrl: <[--d], [---]>) +(In(d): <[--d], [---]>) +(In(S.a): <[--d], [---]>) + +/**/int main(void) +{ + /* <[--d], [---]> */ int a; + /* <[--d], [---]> */ int b; + /* <[---], [---]> */ int c; + /* <[---], [---]> */ int x; + /* <[--d], [---]> */ + a = 0; + /* <[--d], [---]> */ + b = 0; + /* <[---], [---]> */ + c = 0; + /* <[--d], [---]> */ + if (d > 0) { + /*@ assert b ≡ 0; */ /* <[---], [---]> */ + ; + /* <[--d], [---]> */ + a = 1; + } + /*@ slice pragma expr a+b; */ /* <[ S ], [---]> */ + ; + /* <[---], [ S ]> */ + /*@ assert Value: signed_overflow: (int)((int)(a+b)+c)+d ≤ 2147483647; */ + /* <[---], [---]> */ + x = ((a + b) + c) + d; + /* sig call: (InCtrl: <[--d], [---]>) + (In1: <[--d], [---]>) */ + /* call to modifS_slice_1: + (InCtrl: <[--d], [---]>) + (In1: <[--d], [---]>) + (In(S.a): <[--d], [---]>) */ + /* <[--d], [---]> */ + modifS(a,b); + /* invisible call */ /* <[---], [---]> */ + d = new_int(); + /* invisible call */ /* <[---], [---]> */ + f1(d); + /* invisible call */ /* <[---], [---]> */ + f2(d); + /* invisible call */ /* <[---], [---]> */ + f3(d); + /* invisible call */ /* <[---], [---]> */ + f4(d); + /* invisible call */ /* <[---], [---]> */ + f5(d); + /* invisible call */ /* <[---], [---]> */ + f6(d); + /* invisible call */ /* <[---], [---]> */ + f7(d); + /* invisible call */ /* <[---], [---]> */ + f8(d); + /* invisible call */ /* <[---], [---]> */ + f9(d,a); + /* <[---], [---]> */ + return x; +} + +Slicing project worklist [default/slicing_1] = + + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +struct Tstr { + int a ; + int b ; +}; +struct Tstr S; +void modifS_slice_1(int a) +{ + S.a += a; + /*@ slice pragma expr S.a; */ ; + return; +} + +int d; +void main(void) +{ + int a; + int b; + a = 0; + b = 0; + if (d > 0) { + /*@ assert b ≡ 0; */ ; + a = 1; + } + /*@ slice pragma expr a+b; */ ; + modifS_slice_1(a); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_calls.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_calls.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_calls.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_calls.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,43 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_calls.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + c ∈ [--..--] + d ∈ [--..--] +[value] computing for function nothing <- g. + Called from tests/slicing/select_calls.c:42. +tests/slicing/select_calls.c:42:[kernel] warning: Neither code nor specification for function nothing, generating default assigns from the prototype +[value] using specification for function nothing +[value] Done for function nothing +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function g +[from] Computing for function nothing +[from] Done for function nothing +[pdg] done for function g +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +/*@ assigns \nothing; */ +extern void nothing(void); + +void g(void) +{ + nothing(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_calls.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_calls.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_calls.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_calls.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,96 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_calls.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at f +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + c ∈ [--..--] + d ∈ [--..--] +[value] computing for function send <- f. + Called from tests/slicing/select_calls.c:22. +tests/slicing/select_calls.c:22:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] computing for function send <- f. + Called from tests/slicing/select_calls.c:23. +[value] Done for function send +[value] computing for function crypt <- f. + Called from tests/slicing/select_calls.c:24. +tests/slicing/select_calls.c:24:[kernel] warning: Neither code nor specification for function crypt, generating default assigns from the prototype +[value] using specification for function crypt +[value] Done for function crypt +[value] computing for function send <- f. + Called from tests/slicing/select_calls.c:25. +[value] Done for function send +[value] computing for function send <- f. + Called from tests/slicing/select_calls.c:28. +[value] Done for function send +[value] computing for function uncrypt <- f. + Called from tests/slicing/select_calls.c:30. +tests/slicing/select_calls.c:30:[kernel] warning: Neither code nor specification for function uncrypt, generating default assigns from the prototype +[value] using specification for function uncrypt +[value] Done for function uncrypt +[value] computing for function send <- f. + Called from tests/slicing/select_calls.c:31. +[value] Done for function send +[value] computing for function crypt <- f. + Called from tests/slicing/select_calls.c:33. +[value] Done for function crypt +[value] computing for function send <- f. + Called from tests/slicing/select_calls.c:35. +[value] Done for function send +[value] Recording results for f +[value] done for function f +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function send +[from] Done for function send +[from] Computing for function crypt +[from] Done for function crypt +[from] Computing for function uncrypt +[from] Done for function uncrypt +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +/*@ assigns \nothing; */ +extern void send(int x); + +extern void crypt(int *x); + +extern void uncrypt(int *x); + +int c; +int d; +void f(void) +{ + int x; + int y; + int z; + x = 0; + y = 1; + z = x; + send(y); + send(z); + crypt(& y); + send(y); + if (y) send(y); + if (d) uncrypt(& y); + send(y); + crypt(& y); + if (c) y = z; + send(y); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.10.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.10.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.10.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.10.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,143 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[pdg] computing for function k +[pdg] done for function k +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[pdg] computing for function g +[from] Computing for function f +[from] Done for function f +[pdg] done for function g +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +void k_slice_2(int b, int d) +{ + int cond; + cond = get(d); + G = b; + if (cond) send_bis(d); + return; +} + +int k_slice_1(int a, int d) +{ + int cond; + cond = get(d); + if (cond) send_bis(d); + return a; +} + +void f_slice_1(int y); + +void g(int b) +{ + k_slice_2(0,0); + f_slice_1(b); + return; +} + +void f_slice_1(int y) +{ + int z; + k_slice_2(0,0); + k_slice_2(y,0); + z = k_slice_1(G,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.11.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.11.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.11.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.11.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,119 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int H; +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +int k(int a, int b, int c, int d) +{ + int cond; + cond = get(d); + G = b; + H = c; + if (cond) send_bis(d); + return a; +} + +int f_slice_1(int y); + +int f_slice_1(int y) +{ + int r; + int z; + r = k(0,y,0,0); + z = k(G,0,0,0); + /*@ slice pragma expr z; */ ; + return z; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.12.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.12.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.12.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.12.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,112 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function k +[pdg] done for function k +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int H; +int k_slice_1(int a, int b, int c) +{ + G = b; + H = c; + return a; +} + +int f_slice_1(int y); + +int f_slice_1(int y) +{ + int z; + k_slice_1(0,y,0); + z = k_slice_1(G,0,0); + /*@ slice pragma expr z; */ ; + return z; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.13.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.13.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.13.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.13.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,110 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function k +[pdg] done for function k +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int k_slice_1(int a, int b) +{ + G = b; + return a; +} + +int f_slice_1(int y); + +int f_slice_1(int y) +{ + int z; + k_slice_1(0,y); + z = k_slice_1(G,0); + /*@ slice pragma expr z; */ ; + return z; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.14.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.14.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.14.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.14.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,115 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function k +[pdg] done for function k +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +void k_slice_2(int b) +{ + G = b; + return; +} + +int k_slice_1(int a) +{ + return a; +} + +int f_slice_1(int y); + +int f_slice_1(int y) +{ + int z; + k_slice_2(y); + z = k_slice_1(G); + /*@ slice pragma expr z; */ ; + return z; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.15.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.15.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.15.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.15.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,119 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int H; +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +int k(int a, int b, int c, int d) +{ + int cond; + cond = get(d); + G = b; + H = c; + if (cond) send_bis(d); + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int r; + int z; + r = k(0,y,0,0); + z = k(G,0,0,0); + /*@ slice pragma expr z; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.16.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.16.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.16.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.16.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,112 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function k +[pdg] done for function k +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int H; +int k_slice_1(int a, int b, int c) +{ + G = b; + H = c; + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int z; + k_slice_1(0,y,0); + z = k_slice_1(G,0,0); + /*@ slice pragma expr z; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.17.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.17.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.17.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.17.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,110 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function k +[pdg] done for function k +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int k_slice_1(int a, int b) +{ + G = b; + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int z; + k_slice_1(0,y); + z = k_slice_1(G,0); + /*@ slice pragma expr z; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.18.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.18.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.18.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.18.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,115 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function k +[pdg] done for function k +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +void k_slice_2(int b) +{ + G = b; + return; +} + +int k_slice_1(int a) +{ + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int z; + k_slice_2(y); + z = k_slice_1(G); + /*@ slice pragma expr z; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.19.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.19.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.19.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.19.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,120 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function g +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function f +[from] Computing for function send <-f +[from] Done for function send +[from] Done for function f +[pdg] done for function g +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f +[pdg] done for function f +[pdg] computing for function k +[pdg] done for function k +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int H; +int k_slice_1(int a, int b, int c) +{ + G = b; + H = c; + return a; +} + +void f_slice_1(int y); + +void g(int b) +{ + f_slice_1(b); + return; +} + +void f_slice_1(int y) +{ + k_slice_1(0,y,0); + k_slice_1(G,0,0); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,116 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function k +[pdg] done for function k +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int H; +/*@ assigns \nothing; */ +extern void send(int x); + +int k_slice_1(int a, int b, int c) +{ + G = b; + H = c; + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int z; + k_slice_1(0,y,0); + z = k_slice_1(G,0,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.20.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.20.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.20.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.20.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,117 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function g +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function f +[from] Computing for function send <-f +[from] Done for function send +[from] Done for function f +[pdg] done for function g +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f +[pdg] done for function f +[pdg] computing for function k +[pdg] done for function k +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int H; +void k_slice_1(int c) +{ + H = c; + return; +} + +void f_slice_1(void); + +void g(void) +{ + f_slice_1(); + return; +} + +void f_slice_1(void) +{ + k_slice_1(0); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.21.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.21.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.21.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.21.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,117 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function g +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function f +[from] Computing for function send <-f +[from] Done for function send +[from] Done for function f +[pdg] done for function g +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f +[pdg] done for function f +[pdg] computing for function k +[pdg] done for function k +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int H; +void k_slice_1(int c) +{ + H = c; + return; +} + +void f_slice_1(void); + +void g(void) +{ + f_slice_1(); + return; +} + +void f_slice_1(void) +{ + k_slice_1(0); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,114 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function k +[pdg] done for function k +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +/*@ assigns \nothing; */ +extern void send(int x); + +int k_slice_1(int a, int b) +{ + G = b; + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int z; + k_slice_1(0,y); + z = k_slice_1(G,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.3.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,119 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function k +[pdg] done for function k +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +/*@ assigns \nothing; */ +extern void send(int x); + +void k_slice_2(int b) +{ + G = b; + return; +} + +int k_slice_1(int a) +{ + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int z; + k_slice_2(y); + z = k_slice_1(G); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.4.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,123 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[pdg] computing for function k +[pdg] done for function k +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +int k_slice_1(int a, int b, int d) +{ + int cond; + cond = get(d); + G = b; + if (cond) send_bis(d); + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int z; + k_slice_1(0,y,0); + z = k_slice_1(G,0,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.5.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.5.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.5.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,123 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[pdg] computing for function k +[pdg] done for function k +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +int k_slice_1(int a, int b, int d) +{ + int cond; + cond = get(d); + G = b; + if (cond) send_bis(d); + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int z; + k_slice_1(0,y,0); + z = k_slice_1(G,0,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.6.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.6.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.6.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.6.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,123 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[pdg] computing for function k +[pdg] done for function k +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +int k_slice_1(int a, int b, int d) +{ + int cond; + cond = get(d); + G = b; + if (cond) send_bis(d); + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int z; + k_slice_1(0,y,0); + z = k_slice_1(G,0,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.7.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.7.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.7.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.7.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,131 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[pdg] computing for function k +[pdg] done for function k +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +void k_slice_2(int b, int d) +{ + int cond; + cond = get(d); + G = b; + if (cond) send_bis(d); + return; +} + +int k_slice_1(int a, int d) +{ + int cond; + cond = get(d); + if (cond) send_bis(d); + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int z; + k_slice_2(y,0); + z = k_slice_1(G,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.8.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.8.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.8.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.8.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,135 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[pdg] computing for function k +[pdg] done for function k +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[pdg] computing for function g +[from] Computing for function f +[from] Done for function f +[pdg] done for function g +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +int k_slice_1(int a, int b, int d) +{ + int cond; + cond = get(d); + G = b; + if (cond) send_bis(d); + return a; +} + +void f_slice_1(int y); + +void g(int b) +{ + k_slice_1(0,0,0); + f_slice_1(b); + return; +} + +void f_slice_1(int y) +{ + int z; + k_slice_1(0,0,0); + k_slice_1(0,y,0); + z = k_slice_1(G,0,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.9.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.9.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.9.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.9.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,135 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[pdg] computing for function k +[pdg] done for function k +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[pdg] computing for function g +[from] Computing for function f +[from] Done for function f +[pdg] done for function g +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +int k_slice_1(int a, int b, int d) +{ + int cond; + cond = get(d); + G = b; + if (cond) send_bis(d); + return a; +} + +void f_slice_1(int y); + +void g(int b) +{ + k_slice_1(0,0,0); + f_slice_1(b); + return; +} + +void f_slice_1(int y) +{ + int z; + k_slice_1(0,0,0); + k_slice_1(0,y,0); + z = k_slice_1(G,0,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.10.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.10.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.10.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.10.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,169 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return_bis.c (with preprocessing) +tests/slicing/select_return_bis.c:36:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return_bis.c:35. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return_bis.c:28. +tests/slicing/select_return_bis.c:28:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:24. +tests/slicing/select_return_bis.c:24:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return_bis.c:36. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:40. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:41. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:42. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return_bis.c:44. +tests/slicing/select_return_bis.c:44:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function k_bis <-k +[from] Computing for function send_bis <-k_bis <-k +[from] Done for function send_bis +[from] Done for function k_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[pdg] computing for function k_bis +[pdg] done for function k_bis +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[pdg] computing for function g +[from] Computing for function f +[from] Done for function f +[pdg] done for function g +[pdg] computing for function k +[pdg] done for function k +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +void k_bis_slice_1(int ab, int d) +{ + if (ab) send_bis(d); + return; +} + +void k_slice_2(int b, int d) +{ + int cond; + cond = get(d); + G = b; + k_bis_slice_1(cond,d); + return; +} + +int k_slice_1(int a, int d) +{ + int cond; + cond = get(d); + k_bis_slice_1(cond,d); + return a; +} + +void f_slice_1(int y); + +void g(int b) +{ + k_slice_2(0,0); + f_slice_1(b); + return; +} + +void f_slice_1(int y) +{ + int z; + k_slice_2(0,0); + k_slice_2(y,0); + z = k_slice_1(G,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,142 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return_bis.c (with preprocessing) +tests/slicing/select_return_bis.c:36:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return_bis.c:35. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return_bis.c:28. +tests/slicing/select_return_bis.c:28:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:24. +tests/slicing/select_return_bis.c:24:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return_bis.c:36. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:40. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:41. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:42. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return_bis.c:44. +tests/slicing/select_return_bis.c:44:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function k_bis <-k +[from] Computing for function send_bis <-k_bis <-k +[from] Done for function send_bis +[from] Done for function k_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function k +[pdg] done for function k +[pdg] computing for function k_bis +[pdg] done for function k_bis +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int H; +/*@ assigns \nothing; */ +extern void send(int x); + +void k_bis_slice_1(int c) +{ + H = c; + return; +} + +int k_slice_1(int a, int b, int c) +{ + G = b; + k_bis_slice_1(c); + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int z; + k_slice_1(0,y,0); + z = k_slice_1(G,0,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,132 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return_bis.c (with preprocessing) +tests/slicing/select_return_bis.c:36:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return_bis.c:35. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return_bis.c:28. +tests/slicing/select_return_bis.c:28:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:24. +tests/slicing/select_return_bis.c:24:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return_bis.c:36. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:40. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:41. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:42. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return_bis.c:44. +tests/slicing/select_return_bis.c:44:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function k_bis <-k +[from] Computing for function send_bis <-k_bis <-k +[from] Done for function send_bis +[from] Done for function k_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function k +[pdg] done for function k +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +/*@ assigns \nothing; */ +extern void send(int x); + +int k_slice_1(int a, int b) +{ + G = b; + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int z; + k_slice_1(0,y); + z = k_slice_1(G,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.3.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,137 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return_bis.c (with preprocessing) +tests/slicing/select_return_bis.c:36:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return_bis.c:35. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return_bis.c:28. +tests/slicing/select_return_bis.c:28:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:24. +tests/slicing/select_return_bis.c:24:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return_bis.c:36. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:40. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:41. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:42. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return_bis.c:44. +tests/slicing/select_return_bis.c:44:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function k_bis <-k +[from] Computing for function send_bis <-k_bis <-k +[from] Done for function send_bis +[from] Done for function k_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function k +[pdg] done for function k +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +/*@ assigns \nothing; */ +extern void send(int x); + +void k_slice_2(int b) +{ + G = b; + return; +} + +int k_slice_1(int a) +{ + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int z; + k_slice_2(y); + z = k_slice_1(G); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.4.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,156 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return_bis.c (with preprocessing) +tests/slicing/select_return_bis.c:36:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return_bis.c:35. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return_bis.c:28. +tests/slicing/select_return_bis.c:28:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:24. +tests/slicing/select_return_bis.c:24:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return_bis.c:36. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:40. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:41. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:42. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return_bis.c:44. +tests/slicing/select_return_bis.c:44:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function k_bis <-k +[from] Computing for function send_bis <-k_bis <-k +[from] Done for function send_bis +[from] Done for function k_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[pdg] computing for function k_bis +[pdg] done for function k_bis +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int H; +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +void k_bis(int ab, int c, int d) +{ + H = c; + if (ab) send_bis(d); + return; +} + +void k_bis_slice_1(int ab, int d) +{ + if (ab) send_bis(d); + return; +} + +int k(int a, int b, int c, int d) +{ + int cond; + cond = get(d); + G = b; + k_bis(cond,c,d); + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int r; + int z; + r = k(0,y,0,0); + z = k(G,0,0,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.5.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.5.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.5.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,151 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return_bis.c (with preprocessing) +tests/slicing/select_return_bis.c:36:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return_bis.c:35. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return_bis.c:28. +tests/slicing/select_return_bis.c:28:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:24. +tests/slicing/select_return_bis.c:24:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return_bis.c:36. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:40. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:41. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:42. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return_bis.c:44. +tests/slicing/select_return_bis.c:44:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function k_bis <-k +[from] Computing for function send_bis <-k_bis <-k +[from] Done for function send_bis +[from] Done for function k_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[pdg] computing for function k_bis +[pdg] done for function k_bis +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[pdg] computing for function k +[pdg] done for function k +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int H; +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +void k_bis_slice_1(int ab, int c, int d) +{ + H = c; + if (ab) send_bis(d); + return; +} + +int k_slice_1(int a, int b, int c, int d) +{ + int cond; + cond = get(d); + G = b; + k_bis_slice_1(cond,c,d); + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int z; + k_slice_1(0,y,0,0); + z = k_slice_1(G,0,0,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.6.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.6.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.6.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.6.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,144 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return_bis.c (with preprocessing) +tests/slicing/select_return_bis.c:36:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return_bis.c:35. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return_bis.c:28. +tests/slicing/select_return_bis.c:28:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:24. +tests/slicing/select_return_bis.c:24:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return_bis.c:36. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:40. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:41. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:42. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return_bis.c:44. +tests/slicing/select_return_bis.c:44:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function k_bis <-k +[from] Computing for function send_bis <-k_bis <-k +[from] Done for function send_bis +[from] Done for function k_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[pdg] computing for function k_bis +[pdg] done for function k_bis +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[pdg] computing for function k +[pdg] done for function k +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +void k_bis_slice_1(int ab, int d) +{ + if (ab) send_bis(d); + return; +} + +int k_slice_1(int a, int b) +{ + G = b; + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int z; + k_slice_1(0,y); + z = k_slice_1(G,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.7.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.7.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.7.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.7.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,149 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return_bis.c (with preprocessing) +tests/slicing/select_return_bis.c:36:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return_bis.c:35. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return_bis.c:28. +tests/slicing/select_return_bis.c:28:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:24. +tests/slicing/select_return_bis.c:24:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return_bis.c:36. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:40. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:41. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:42. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return_bis.c:44. +tests/slicing/select_return_bis.c:44:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function k_bis <-k +[from] Computing for function send_bis <-k_bis <-k +[from] Done for function send_bis +[from] Done for function k_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[pdg] computing for function k_bis +[pdg] done for function k_bis +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[pdg] computing for function k +[pdg] done for function k +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +void k_bis_slice_1(int ab, int d) +{ + if (ab) send_bis(d); + return; +} + +void k_slice_2(int b) +{ + G = b; + return; +} + +int k_slice_1(int a) +{ + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int z; + k_slice_2(y); + z = k_slice_1(G); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.8.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.8.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.8.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.8.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,163 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return_bis.c (with preprocessing) +tests/slicing/select_return_bis.c:36:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return_bis.c:35. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return_bis.c:28. +tests/slicing/select_return_bis.c:28:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:24. +tests/slicing/select_return_bis.c:24:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return_bis.c:36. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:40. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:41. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:42. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return_bis.c:44. +tests/slicing/select_return_bis.c:44:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function k_bis <-k +[from] Computing for function send_bis <-k_bis <-k +[from] Done for function send_bis +[from] Done for function k_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[pdg] computing for function k_bis +[pdg] done for function k_bis +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[pdg] computing for function g +[from] Computing for function f +[from] Done for function f +[pdg] done for function g +[pdg] computing for function k +[pdg] done for function k +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int H; +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +void k_bis_slice_1(int ab, int c, int d) +{ + H = c; + if (ab) send_bis(d); + return; +} + +int k_slice_1(int a, int b, int c, int d) +{ + int cond; + cond = get(d); + G = b; + k_bis_slice_1(cond,c,d); + return a; +} + +void f_slice_1(int y); + +void g(int b, int c) +{ + k_slice_1(0,0,c,0); + f_slice_1(b); + return; +} + +void f_slice_1(int y) +{ + int z; + k_slice_1(0,0,0,0); + k_slice_1(0,y,0,0); + z = k_slice_1(G,0,0,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.9.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.9.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.9.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.9.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,161 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return_bis.c (with preprocessing) +tests/slicing/select_return_bis.c:36:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return_bis.c:35. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return_bis.c:28. +tests/slicing/select_return_bis.c:28:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:24. +tests/slicing/select_return_bis.c:24:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return_bis.c:36. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:40. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:41. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:42. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return_bis.c:44. +tests/slicing/select_return_bis.c:44:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function k_bis <-k +[from] Computing for function send_bis <-k_bis <-k +[from] Done for function send_bis +[from] Done for function k_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[pdg] computing for function k_bis +[pdg] done for function k_bis +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[pdg] computing for function g +[from] Computing for function f +[from] Done for function f +[pdg] done for function g +[pdg] computing for function k +[pdg] done for function k +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +void k_bis_slice_1(int ab, int d) +{ + if (ab) send_bis(d); + return; +} + +int k_slice_1(int a, int b, int d) +{ + int cond; + cond = get(d); + G = b; + k_bis_slice_1(cond,d); + return a; +} + +void f_slice_1(int y); + +void g(int b) +{ + k_slice_1(0,0,0); + f_slice_1(b); + return; +} + +void f_slice_1(int y) +{ + int z; + k_slice_1(0,0,0); + k_slice_1(0,y,0); + z = k_slice_1(G,0,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return_bis.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return_bis.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,147 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return_bis.c (with preprocessing) +tests/slicing/select_return_bis.c:36:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return_bis.c:35. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return_bis.c:28. +tests/slicing/select_return_bis.c:28:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- g. + Called from tests/slicing/select_return_bis.c:24. +tests/slicing/select_return_bis.c:24:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return_bis.c:36. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:40. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:41. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return_bis.c:42. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:28. +[value] Done for function get +[value] computing for function k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:30. +[value] computing for function send_bis <- k_bis <- k <- f <- g. + Called from tests/slicing/select_return_bis.c:24. +[value] Done for function send_bis +[value] Recording results for k_bis +[value] Done for function k_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return_bis.c:44. +tests/slicing/select_return_bis.c:44:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function k_bis <-k +[from] Computing for function send_bis <-k_bis <-k +[from] Done for function send_bis +[from] Done for function k_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int H; +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +void k_bis(int ab, int c, int d) +{ + H = c; + if (ab) send_bis(d); + return; +} + +int k(int a, int b, int c, int d) +{ + int cond; + cond = get(d); + G = b; + k_bis(cond,c,d); + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int r; + int z; + r = k(0,y,0,0); + z = k(G,0,0,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_return.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_return.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,123 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_return.c (with preprocessing) +tests/slicing/select_return.c:45:[kernel] warning: Calling undeclared function f. Old style K&R code? +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] + H ∈ [--..--] + I ∈ [--..--] +[value] computing for function k <- g. + Called from tests/slicing/select_return.c:44. +[value] computing for function get <- k <- g. + Called from tests/slicing/select_return.c:35. +tests/slicing/select_return.c:35:[kernel] warning: Neither code nor specification for function get, generating default assigns from the prototype +[value] using specification for function get +[value] Done for function get +[value] computing for function send_bis <- k <- g. + Called from tests/slicing/select_return.c:39. +tests/slicing/select_return.c:39:[kernel] warning: Neither code nor specification for function send_bis, generating default assigns from the prototype +[value] using specification for function send_bis +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function f <- g. + Called from tests/slicing/select_return.c:45. +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:49. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:50. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function k <- f <- g. + Called from tests/slicing/select_return.c:51. +[value] computing for function get <- k <- f <- g. + Called from tests/slicing/select_return.c:35. +[value] Done for function get +[value] computing for function send_bis <- k <- f <- g. + Called from tests/slicing/select_return.c:39. +[value] Done for function send_bis +[value] Recording results for k +[value] Done for function k +[value] computing for function send <- f <- g. + Called from tests/slicing/select_return.c:53. +tests/slicing/select_return.c:53:[kernel] warning: Neither code nor specification for function send, generating default assigns from the prototype +[value] using specification for function send +[value] Done for function send +[value] Recording results for f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function k +[from] Computing for function get <-k +[from] Done for function get +[from] Computing for function send_bis <-k +[from] Done for function send_bis +[from] Done for function k +[from] Computing for function send +[from] Done for function send +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int H; +extern int get(int y); + +/*@ assigns \nothing; */ +extern void send(int x); + +/*@ assigns \nothing; */ +extern void send_bis(int x); + +int k(int a, int b, int c, int d) +{ + int cond; + cond = get(d); + G = b; + H = c; + if (cond) send_bis(d); + return a; +} + +void f_slice_1(int y); + +void f_slice_1(int y) +{ + int r; + int z; + r = k(0,y,0,0); + z = k(G,0,0,0); + /*@ slice pragma expr z; */ ; + send(z); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_simple.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_simple.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/select_simple.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/select_simple.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,427 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/select_simple.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Unknown ∈ {0} + G ∈ {0} + S ∈ {0} + S1 ∈ {0} + S2 ∈ {0} +tests/slicing/simple_intra_slice.c:98:[value] entering loop for the first time +tests/slicing/simple_intra_slice.c:99:[kernel] warning: signed overflow. assert -2147483648 ≤ uninit-1; +tests/slicing/simple_intra_slice.c:99:[kernel] warning: signed overflow. assert Unknown+1 ≤ 2147483647; +tests/slicing/simple_intra_slice.c:99:[kernel] warning: signed overflow. assert -2147483648 ≤ Unknown-1; +tests/slicing/simple_intra_slice.c:100:[value] entering loop for the first time +tests/slicing/simple_intra_slice.c:101:[kernel] warning: signed overflow. assert -2147483648 ≤ uninit2-1; +tests/slicing/simple_intra_slice.c:101:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +tests/slicing/simple_intra_slice.c:101:[kernel] warning: signed overflow. assert -2147483648 ≤ S.a-1; +[value] computing for function f2 <- main. + Called from tests/slicing/simple_intra_slice.c:103. +[value] computing for function f1 <- f2 <- main. + Called from tests/slicing/simple_intra_slice.c:23. +[value] Recording results for f1 +[value] Done for function f1 +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/simple_intra_slice.c:104. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/simple_intra_slice.c:105. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/simple_intra_slice.c:106. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/simple_intra_slice.c:107. +tests/slicing/simple_intra_slice.c:59:[value] entering loop for the first time +tests/slicing/simple_intra_slice.c:71:[kernel] warning: signed overflow. assert -2147483648 ≤ 10*n ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +tests/slicing/simple_intra_slice.c:107:[kernel] warning: signed overflow. assert res+tmp_3 ≤ 2147483647; + (tmp_3 from f6(Unknown)) +[value] computing for function f7 <- main. + Called from tests/slicing/simple_intra_slice.c:108. +tests/slicing/simple_intra_slice.c:79:[kernel] warning: signed overflow. assert S.a+3 ≤ 2147483647; +tests/slicing/simple_intra_slice.c:82:[kernel] warning: signed overflow. assert s0.a+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/simple_intra_slice.c:110. +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f8 <- main. + Called from tests/slicing/simple_intra_slice.c:112. +[value] Recording results for f8 +[value] Done for function f8 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + G FROM x + \result FROM y +[from] Function f2: + G FROM \nothing + \result FROM \nothing +[from] Function f3: + G FROM Unknown; c (and SELF) + \result FROM Unknown; c +[from] Function f4: + G FROM Unknown; c (and SELF) + \result FROM Unknown; c +[from] Function f5: + G FROM Unknown; G; c (and SELF) + \result FROM Unknown; c +[from] Function f6: + \result FROM Unknown; n +[from] Function f7: + S.a FROM S.a; s0 + {.b; .c} FROM S.a; s0 (and SELF) +[from] Function f8: + S1.a FROM S1.a; S2.a; ps (and SELF) + .b FROM S1.b; S2.b; ps (and SELF) + S2.a FROM S1.a; S2.a; ps (and SELF) + .b FROM S1.b; S2.b; ps (and SELF) +[from] Function main: + Unknown FROM Unknown (and SELF) + G FROM Unknown + S.a FROM S + {.b; .c} FROM S (and SELF) + S1.a FROM Unknown; S1.a; S2.a (and SELF) + .b FROM Unknown; S1.b; S2.b (and SELF) + S2.a FROM Unknown; S1.a; S2.a (and SELF) + .b FROM Unknown; S1.b; S2.b (and SELF) + \result FROM Unknown +[from] ====== END OF DEPENDENCIES ====== +[slicing] making slicing project 'slicing_1'... +[pdg] computing for function f1 +[pdg] done for function f1 +Slicing project worklist [default/slicing_1] = +[f1_slice_1 = (n:11(restrict to G) ,<[--d], [---]>)] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int G; +void f1_slice_1(int x) +{ + int a; + a = 1; + G = x + a; + return; +} + + +[slicing] making slicing project 'slicing_2'... +Slicing project worklist [default/slicing_2] = +[f1_slice_1 = (n:13(restrict to __retres) ,<[--d], [---]>)] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int f1_slice_1(int y) +{ + int __retres; + int b; + b = 2; + __retres = y + b; + return __retres; +} + + +[slicing] making slicing project 'slicing_3'... +[pdg] computing for function f2 +[pdg] done for function f2 +Slicing project worklist [default/slicing_3] = +[f2_slice_1 = (n:28(restrict to tmp) ,<[--d], [---]>)] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int f1_slice_1(int y) +{ + int __retres; + int b; + b = 2; + __retres = y + b; + return __retres; +} + +int f2_slice_1(void) +{ + int c; + int tmp; + c = 3; + tmp = f1_slice_1(c); + return tmp; +} + + +[slicing] making slicing project 'slicing_4'... +[pdg] computing for function f6 +[pdg] done for function f6 +Slicing project worklist [default/slicing_4] = +[f6_slice_1 = (n:32(restrict to n) ,<[--d], [---]>)(n:42(restrict to +n) ,<[--d], [---]>)] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int Unknown; +void f6_slice_1(int n) +{ + while (n < 10) { + if (Unknown > 3) break; + if (n % 2) continue; + n ++; + } + return; +} + + +[slicing] making slicing project 'slicing_5'... +[pdg] computing for function f7 +[pdg] done for function f7 +[slicing] making slicing project 'slicing_6'... +Impossible to select 'retres' for a void function (f7) +Slicing project worklist [default/slicing_6] = +[f7_slice_1 = (n:61(restrict to S.a) ,<[--d], [---]>)(n:63(restrict to +S.a) ,<[--d], [---]>)] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +struct __anonstruct_Tstr_1 { + int a ; + int b ; + int c ; +}; +typedef struct __anonstruct_Tstr_1 Tstr; +Tstr S; +void f7_slice_1(Tstr s0) +{ + int x; + x = S.a; + if (x > 0) S.a += 3; + else { + (s0.a) ++; + S = s0; + } + return; +} + + +[slicing] making slicing project 'slicing_7'... +Slicing project worklist [default/slicing_7] = +[f7_slice_1 = (UndefIn S.b:<[--d], [---]>)(n:63(restrict to S.b) ,<[--d], + [---]>)] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +struct __anonstruct_Tstr_1 { + int a ; + int b ; + int c ; +}; +typedef struct __anonstruct_Tstr_1 Tstr; +Tstr S; +void f7_slice_1(Tstr s0) +{ + int x; + x = S.a; + if (! (x > 0)) { + (s0.a) ++; + S = s0; + } + return; +} + + +[slicing] making slicing project 'slicing_8'... +Slicing project worklist [default/slicing_8] = +[f7_slice_1 = (UndefIn S{.b; .c}:<[--d], [---]>)(n:61(restrict to S.a) , +<[--d], +[---]>)(n:63(restrict to S.a) ,<[--d], [---]>)(n:63(restrict to S{.b; .c}) , +<[--d], +[---]>)] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +struct __anonstruct_Tstr_1 { + int a ; + int b ; + int c ; +}; +typedef struct __anonstruct_Tstr_1 Tstr; +Tstr S; +void f7_slice_1(Tstr s0) +{ + int x; + x = S.a; + if (x > 0) S.a += 3; + else { + (s0.a) ++; + S = s0; + } + return; +} + + +[slicing] making slicing project 'slicing_9'... +[slicing] making slicing project 'slicing_10'... +[pdg] computing for function f8 +[pdg] done for function f8 +Impossible to select this data : XXX in f7 +Slicing project worklist [default/slicing_10] = +[f8_slice_1 = (n:69(restrict to S1.a) ,<[--d], [---]>)(n:69(restrict to +S2.a) ,<[--d], [---]>)(n:75(restrict to S2.a) ,<[--d], [---]>)(n:74(restrict to +S1.a) ,<[--d], [---]>)] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +struct __anonstruct_Tstr_1 { + int a ; + int b ; + int c ; +}; +typedef struct __anonstruct_Tstr_1 Tstr; +void f8_slice_1(Tstr *ps) +{ + (ps->a) ++; + return; +} + + +[slicing] making slicing project 'slicing_11'... +Slicing project worklist [default/slicing_11] = +[f8_slice_1 = (n:70(restrict to S1.b) ,<[--d], [---]>)(n:70(restrict to +S2.b) ,<[--d], [---]>)(n:73(restrict to S2.b) ,<[--d], [---]>)(n:72(restrict to +S1.b) ,<[--d], [---]>)] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +struct __anonstruct_Tstr_1 { + int a ; + int b ; + int c ; +}; +typedef struct __anonstruct_Tstr_1 Tstr; +void f8_slice_1(Tstr *ps) +{ + (ps->b) ++; + return; +} + + +[slicing] making slicing project 'slicing_12'... +Slicing project worklist [default/slicing_12] = +[f8_slice_1 = (UndefIn S1.c; +S2.c:<[--d], [---]>)] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +void f8_slice_1(void) +{ + return; +} + + +[slicing] making slicing project 'slicing_13'... +Slicing project worklist [default/slicing_13] = +[f8_slice_1 = (UndefIn S1.c; +S2.c:<[--d], [---]>)(n:69(restrict to S1.a) ,<[--d], [---]>)(n:70(restrict to +S1.b) ,<[--d], [---]>)(n:69(restrict to S2.a) ,<[--d], [---]>)(n:70(restrict to +S2.b) ,<[--d], [---]>)(n:73(restrict to S2.b) ,<[--d], [---]>)(n:75(restrict to +S2.a) ,<[--d], [---]>)(n:72(restrict to S1.b) ,<[--d], [---]>)(n:74(restrict to +S1.a) ,<[--d], [---]>)] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +struct __anonstruct_Tstr_1 { + int a ; + int b ; + int c ; +}; +typedef struct __anonstruct_Tstr_1 Tstr; +void f8_slice_1(Tstr *ps) +{ + (ps->a) ++; + (ps->b) ++; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/simple_intra_slice.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/simple_intra_slice.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/simple_intra_slice.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/simple_intra_slice.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,1286 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/simple_intra_slice.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + Unknown ∈ {0} + G ∈ {0} + S ∈ {0} + S1 ∈ {0} + S2 ∈ {0} +tests/slicing/simple_intra_slice.c:98:[value] entering loop for the first time +tests/slicing/simple_intra_slice.c:99:[kernel] warning: signed overflow. assert -2147483648 ≤ uninit-1; +tests/slicing/simple_intra_slice.c:99:[kernel] warning: signed overflow. assert Unknown+1 ≤ 2147483647; +tests/slicing/simple_intra_slice.c:99:[kernel] warning: signed overflow. assert -2147483648 ≤ Unknown-1; +tests/slicing/simple_intra_slice.c:100:[value] entering loop for the first time +tests/slicing/simple_intra_slice.c:101:[kernel] warning: signed overflow. assert -2147483648 ≤ uninit2-1; +tests/slicing/simple_intra_slice.c:101:[kernel] warning: signed overflow. assert S.a+1 ≤ 2147483647; +tests/slicing/simple_intra_slice.c:101:[kernel] warning: signed overflow. assert -2147483648 ≤ S.a-1; +[value] computing for function f2 <- main. + Called from tests/slicing/simple_intra_slice.c:103. +[value] computing for function f1 <- f2 <- main. + Called from tests/slicing/simple_intra_slice.c:23. +[value] Recording results for f1 +[value] Done for function f1 +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/slicing/simple_intra_slice.c:104. +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f4 <- main. + Called from tests/slicing/simple_intra_slice.c:105. +[value] Recording results for f4 +[value] Done for function f4 +[value] computing for function f5 <- main. + Called from tests/slicing/simple_intra_slice.c:106. +[value] Recording results for f5 +[value] Done for function f5 +[value] computing for function f6 <- main. + Called from tests/slicing/simple_intra_slice.c:107. +tests/slicing/simple_intra_slice.c:59:[value] entering loop for the first time +tests/slicing/simple_intra_slice.c:71:[kernel] warning: signed overflow. assert -2147483648 ≤ 10*n ≤ 2147483647; +[value] Recording results for f6 +[value] Done for function f6 +tests/slicing/simple_intra_slice.c:107:[kernel] warning: signed overflow. assert res+tmp_3 ≤ 2147483647; + (tmp_3 from f6(Unknown)) +[value] computing for function f7 <- main. + Called from tests/slicing/simple_intra_slice.c:108. +tests/slicing/simple_intra_slice.c:79:[kernel] warning: signed overflow. assert S.a+3 ≤ 2147483647; +tests/slicing/simple_intra_slice.c:82:[kernel] warning: signed overflow. assert s0.a+1 ≤ 2147483647; +[value] Recording results for f7 +[value] Done for function f7 +[value] computing for function f8 <- main. + Called from tests/slicing/simple_intra_slice.c:110. +[value] Recording results for f8 +[value] Done for function f8 +[value] computing for function f8 <- main. + Called from tests/slicing/simple_intra_slice.c:112. +[value] Recording results for f8 +[value] Done for function f8 +[value] Recording results for main +[value] done for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function f3 +[from] Done for function f3 +[from] Computing for function f4 +[from] Done for function f4 +[from] Computing for function f5 +[from] Done for function f5 +[from] Computing for function f6 +[from] Done for function f6 +[from] Computing for function f7 +[from] Done for function f7 +[from] Computing for function f8 +[from] Done for function f8 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f1: + G FROM x + \result FROM y +[from] Function f2: + G FROM \nothing + \result FROM \nothing +[from] Function f3: + G FROM Unknown; c (and SELF) + \result FROM Unknown; c +[from] Function f4: + G FROM Unknown; c (and SELF) + \result FROM Unknown; c +[from] Function f5: + G FROM Unknown; G; c (and SELF) + \result FROM Unknown; c +[from] Function f6: + \result FROM Unknown; n +[from] Function f7: + S.a FROM S.a; s0 + {.b; .c} FROM S.a; s0 (and SELF) +[from] Function f8: + S1.a FROM S1.a; S2.a; ps (and SELF) + .b FROM S1.b; S2.b; ps (and SELF) + S2.a FROM S1.a; S2.a; ps (and SELF) + .b FROM S1.b; S2.b; ps (and SELF) +[from] Function main: + Unknown FROM Unknown (and SELF) + G FROM Unknown + S.a FROM S + {.b; .c} FROM S (and SELF) + S1.a FROM Unknown; S1.a; S2.a (and SELF) + .b FROM Unknown; S1.b; S2.b (and SELF) + S2.a FROM Unknown; S1.a; S2.a (and SELF) + .b FROM Unknown; S1.b; S2.b (and SELF) + \result FROM Unknown +[from] ====== END OF DEPENDENCIES ====== +[slicing] making slicing project 'slicing_1'... +[pdg] computing for function f1 +[pdg] done for function f1 +RESULT for f1: + {n1}: InCtrl + {n2}: VarDecl : x + -[a--]-> 3 + {n3}: In1 + -[a--]-> 2 + {n4}: VarDecl : y + -[a--]-> 5 + {n5}: In2 + -[a--]-> 4 + {n6}: VarDecl : a + {n7}: VarDecl : b + {n8}: VarDecl : __retres + {n9}: a = 1; + -[-c-]-> 1 + -[a--]-> 6 + {n10}: b = 2; + -[-c-]-> 1 + -[a--]-> 7 + {n11}: G = x + a; + -[-c-]-> 1 + -[--d]-> 2 + -[--d]-> 3 + -[--d]-> 6 + -[--d]-> 9 + {n12}: __retres = y + b; + -[-c-]-> 1 + -[--d]-> 4 + -[--d]-> 5 + -[--d]-> 7 + -[a--]-> 8 + -[--d]-> 10 + {n13}: return __retres; + -[-c-]-> 1 + -[--d]-> 8 + -[--d]-> 12 + {n14}: OutRet + -[--d]-> 13 +int f1(int x, int y) +{ + int __retres; + int a; + int b; + /* 1 */ + a = 1; + /* 2 */ + b = 2; + /* 3 */ + G = x + a; + /* 5 */ + __retres = y + b; + /* 126 */ + return __retres; +} + +Slicing project worklist [default/slicing_1] = +[f1_slice_1 = (n:11 ,<[ S ], [---]>)(n:1 ,<[-c-], [---]>)(n:2 ,<[--d], [---]>)(n:3 , +<[--d], +[---]>)(n:6 ,<[--d], [---]>)(n:9 ,<[--d], [---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +Print slice = f1_slice_1: (InCtrl: <[-cd], [---]>) + (In1: <[--d], [---]>) + +/**/int f1(/* <[--d], [---]> */ int x, /* <[---], [---]> */ int y) +{ + /* <[---], [---]> */ int __retres; + /* <[--d], [---]> */ int a; + /* <[---], [---]> */ int b; + /* <[--d], [---]> */ + a = 1; + /* <[---], [---]> */ + b = 2; + /* <[ S ], [---]> */ + G = x + a; + /* <[---], [---]> */ + __retres = y + b; + /* <[---], [---]> */ + return __retres; +} + + +[pdg] computing for function f2 +[pdg] done for function f2 +RESULT for f2: + {n15}: InCtrl + {n16}: VarDecl : a + {n17}: VarDecl : b + {n18}: VarDecl : c + {n19}: VarDecl : tmp + {n20}: a = 1; + -[-c-]-> 15 + -[a--]-> 16 + {n21}: b = a + 1; + -[-c-]-> 15 + -[--d]-> 16 + -[a--]-> 17 + -[--d]-> 20 + {n22}: c = 3; + -[-c-]-> 15 + -[a--]-> 18 + {n23}: Call11-InCtrl : tmp = f1(b,c); + -[-c-]-> 15 + {n24}: Call11-In1 : tmp = f1(b,c); + -[-c-]-> 15 + -[--d]-> 17 + -[--d]-> 21 + -[-c-]-> 23 + {n25}: Call11-In2 : tmp = f1(b,c); + -[-c-]-> 15 + -[--d]-> 18 + -[--d]-> 22 + -[-c-]-> 23 + {n26}: Call11-Out(G) : tmp = f1(b,c); + -[-c-]-> 15 + -[-c-]-> 23 + -[--d]-> 24 + {n27}: Call11-OutRet : tmp = f1(b,c); + -[-c-]-> 15 + -[a--]-> 19 + -[-c-]-> 23 + -[--d]-> 25 + {n28}: return tmp; + -[-c-]-> 15 + -[--d]-> 19 + -[--d]-> 27 + {n29}: OutRet + -[--d]-> 28 +int f2(void) +{ + int a; + int b; + int c; + int tmp; + /* 7 */ + a = 1; + /* 9 */ + b = a + 1; + /* 10 */ + c = 3; + /* 11 */ + tmp = f1(b,c); + /* 12 */ + return tmp; +} + +Slicing project worklist [default/slicing_1] = +[f2_slice_1 = (n:22 ,<[ S ], [---]>)(n:15 ,<[-c-], [---]>)(n:18 ,<[a--], + [---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +Print slice = f2_slice_1: (InCtrl: <[-c-], [---]>) + +/**/int f2(void) +{ + /* <[---], [---]> */ int a; + /* <[---], [---]> */ int b; + /* <[a--], [---]> */ int c; + /* <[---], [---]> */ int tmp; + /* <[---], [---]> */ + a = 1; + /* <[---], [---]> */ + b = a + 1; + /* <[ S ], [---]> */ + c = 3; + /* invisible call */ /* <[---], [---]> */ + tmp = f1(b,c); + /* <[---], [---]> */ + return tmp; +} + + +[pdg] computing for function f3 +[pdg] done for function f3 +RESULT for f3: + {n30}: InCtrl + {n31}: VarDecl : c + -[a--]-> 32 + {n32}: In1 + -[a--]-> 31 + {n33}: VarDecl : a + {n34}: VarDecl : b + {n35}: VarDecl : x + {n36}: a = 1; + -[-c-]-> 30 + -[a--]-> 33 + {n37}: b = 2; + -[-c-]-> 30 + -[a--]-> 34 + {n38}: x = 0; + -[-c-]-> 30 + -[a--]-> 35 + {n39}: c > Unknown + -[-c-]-> 30 + -[--d]-> 31 + -[--d]-> 32 + -[--d]-> 44 + {n40}: x = b; + -[-c-]-> 30 + -[--d]-> 34 + -[a--]-> 35 + -[--d]-> 37 + -[-c-]-> 39 + {n41}: G = a; + -[-c-]-> 30 + -[--d]-> 33 + -[--d]-> 36 + -[-c-]-> 39 + {n42}: return x; + -[-c-]-> 30 + -[--d]-> 35 + -[--d]-> 38 + -[--d]-> 40 + {n43}: OutRet + -[--d]-> 42 + {n44}: In(Unknown) +int f3(int c) +{ + int a; + int b; + int x; + /* 14 */ + a = 1; + /* 15 */ + b = 2; + /* 16 */ + x = 0; + /* 18 */ + if (c > Unknown) { + /* 19 */ + x = b; + } + else { + /* 20 */ + G = a; + } + /* 22 */ + return x; +} + +Slicing project worklist [default/slicing_1] = +[f3_slice_1 = (n:42(restrict to x) ,<[--d], [---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +Print slice = +f3_slice_1: +(InCtrl: <[--d], [---]>) +(In1: <[--d], [---]>) +(In(Unknown): <[--d], [---]>) +(OutRet: <[--d], [---]>) + +/**/int f3(/* <[--d], [---]> */ int c) +{ + /* <[---], [---]> */ int a; + /* <[--d], [---]> */ int b; + /* <[--d], [---]> */ int x; + /* <[---], [---]> */ + a = 1; + /* <[--d], [---]> */ + b = 2; + /* <[--d], [---]> */ + x = 0; + /* <[--d], [---]> */ + if (c > Unknown) { + /* <[--d], [---]> */ + x = b; + } + else { + /* <[---], [---]> */ + G = a; + } + /* <[--d], [---]> */ + return x; +} + + +[pdg] computing for function f4 +[pdg] done for function f4 +RESULT for f4: + {n45}: InCtrl + {n46}: VarDecl : c + -[a--]-> 47 + {n47}: In1 + -[a--]-> 46 + {n48}: VarDecl : a + {n49}: VarDecl : b + {n50}: VarDecl : x + {n51}: a = 1; + -[-c-]-> 45 + -[a--]-> 48 + {n52}: b = 2; + -[-c-]-> 45 + -[a--]-> 49 + {n53}: x = 0; + -[-c-]-> 45 + -[a--]-> 50 + {n54}: c > Unknown + -[-c-]-> 45 + -[--d]-> 46 + -[--d]-> 47 + -[--d]-> 59 + {n55}: G = a; + -[-c-]-> 45 + -[--d]-> 48 + -[--d]-> 51 + -[-c-]-> 54 + {n56}: x = b; + -[-c-]-> 45 + -[--d]-> 49 + -[a--]-> 50 + -[--d]-> 52 + -[-c-]-> 54 + {n57}: return x; + -[-c-]-> 45 + -[--d]-> 50 + -[--d]-> 53 + -[--d]-> 56 + {n58}: OutRet + -[--d]-> 57 + {n59}: In(Unknown) +int f4(int c) +{ + int a; + int b; + int x; + /* 24 */ + a = 1; + /* 25 */ + b = 2; + /* 26 */ + x = 0; + /* 28 */ + if (c > Unknown) { + /* 29 */ + G = a; + } + else { + /* 30 */ + x = b; + } + /* 32 */ + return x; +} + +Slicing project worklist [default/slicing_1] = +[f4_slice_1 = (n:57(restrict to x) ,<[--d], [---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +Print slice = +f4_slice_1: +(InCtrl: <[--d], [---]>) +(In1: <[--d], [---]>) +(In(Unknown): <[--d], [---]>) +(OutRet: <[--d], [---]>) + +/**/int f4(/* <[--d], [---]> */ int c) +{ + /* <[---], [---]> */ int a; + /* <[--d], [---]> */ int b; + /* <[--d], [---]> */ int x; + /* <[---], [---]> */ + a = 1; + /* <[--d], [---]> */ + b = 2; + /* <[--d], [---]> */ + x = 0; + /* <[--d], [---]> */ + if (c > Unknown) { + /* <[---], [---]> */ + G = a; + } + else { + /* <[--d], [---]> */ + x = b; + } + /* <[--d], [---]> */ + return x; +} + + +Slicing project worklist [default/slicing_1] = +[f4_slice_2 = (n:55 ,<[ S ], [---]>)(n:45 ,<[-c-], [---]>)(n:54 ,<[-c-], + [---]>)(n:48 , +<[--d], +[---]>)(n:51 ,<[--d], [---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +Print slice = +f4_slice_2: +(InCtrl: <[-cd], [---]>) +(In1: <[-c-], [---]>) +(In(Unknown): <[-c-], [---]>) + +/**/int f4(/* <[-c-], [---]> */ int c) +{ + /* <[--d], [---]> */ int a; + /* <[---], [---]> */ int b; + /* <[---], [---]> */ int x; + /* <[--d], [---]> */ + a = 1; + /* <[---], [---]> */ + b = 2; + /* <[---], [---]> */ + x = 0; + /* <[-c-], [---]> */ + if (c > Unknown) { + /* <[ S ], [---]> */ + G = a; + } + else { + /* <[---], [---]> */ + x = b; + } + /* <[---], [---]> */ + return x; +} + + +[pdg] computing for function f5 +[pdg] done for function f5 +Sorties de la fonction f5 = G +Slicing project worklist [default/slicing_1] = +[f5_slice_1 = (n:73(restrict to G) ,<[--d], [---]>)(n:77(restrict to +G) ,<[--d], [---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +Print slice = +f5_slice_1: +(InCtrl: <[--d], [---]>) +(In1: <[--d], [---]>) +(In(G): <[--d], [---]>) +(In(Unknown): <[--d], [---]>) + +/**/int f5(/* <[--d], [---]> */ int c) +{ + /* <[---], [---]> */ int x; + /* <[---], [---]> */ + x = 0; + /* <[---], [---]> */ + if (c > Unknown) { + /* <[---], [---]> */ + goto Lsuite; + } + /* <[---], [---]> */ + x ++; + /* <[---], [---]> */ Lsuite: /* <[---], [---]> */ + ; + /* <[--d], [---]> */ + if (c < Unknown) { + /* <[--d], [---]> */ + goto L2; + } + /* <[--d], [---]> */ + G ++; + /* <[--d], [---]> */ L2: /* <[---], [---]> */ + x ++; + /* <[---], [---]> */ + return x; +} + + +RESULT for f5: + {n60}: InCtrl + {n61}: VarDecl : c + -[a--]-> 62 + {n62}: In1 + -[a--]-> 61 + {n63}: VarDecl : x + {n64}: x = 0; + -[-c-]-> 60 + -[a--]-> 63 + {n65}: c > Unknown + -[-c-]-> 60 + -[--d]-> 61 + -[--d]-> 62 + -[--d]-> 78 + {n66}: goto Lsuite; + -[-c-]-> 60 + -[-c-]-> 65 + -[-c-]-> 67 + {n67}: Lsuite: + -[-c-]-> 60 + {n68}: x ++; + -[-c-]-> 60 + -[a-d]-> 63 + -[--d]-> 64 + -[-c-]-> 65 + -[-c-]-> 66 + {n69}: Lsuite: ; + -[-c-]-> 60 + {n70}: c < Unknown + -[-c-]-> 60 + -[--d]-> 61 + -[--d]-> 62 + -[--d]-> 78 + {n71}: goto L2; + -[-c-]-> 60 + -[-c-]-> 70 + -[-c-]-> 72 + {n72}: L2: + -[-c-]-> 60 + {n73}: G ++; + -[-c-]-> 60 + -[-c-]-> 70 + -[-c-]-> 71 + -[--d]-> 77 + {n74}: L2: x ++; + -[-c-]-> 60 + -[a-d]-> 63 + -[--d]-> 64 + -[--d]-> 68 + {n75}: return x; + -[-c-]-> 60 + -[--d]-> 63 + -[--d]-> 74 + {n76}: OutRet + -[--d]-> 75 + {n77}: In(G) + {n78}: In(Unknown) +int f5(int c) +{ + int x; + /* 34 */ + x = 0; + /* 36 */ + if (c > Unknown) { + /* 37 */ + goto Lsuite; + } + /* 39 */ + x ++; + /* label */ Lsuite: /* 40 */ + ; + /* 41 */ + if (c < Unknown) { + /* 42 */ + goto L2; + } + /* 44 */ + G ++; + /* label */ L2: /* 45 */ + x ++; + /* 47 */ + return x; +} + +Slicing project worklist [default/slicing_1] = +[f5_slice_2 = (n:75(restrict to x) ,<[--d], [---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +Print slice = +f5_slice_2: +(InCtrl: <[--d], [---]>) +(In1: <[--d], [---]>) +(In(Unknown): <[--d], [---]>) +(OutRet: <[--d], [---]>) + +/**/int f5(/* <[--d], [---]> */ int c) +{ + /* <[--d], [---]> */ int x; + /* <[--d], [---]> */ + x = 0; + /* <[--d], [---]> */ + if (c > Unknown) { + /* <[--d], [---]> */ + goto Lsuite; + } + /* <[--d], [---]> */ + x ++; + /* <[--d], [---]> */ Lsuite: /* <[---], [---]> */ + ; + /* <[---], [---]> */ + if (c < Unknown) { + /* <[---], [---]> */ + goto L2; + } + /* <[---], [---]> */ + G ++; + /* <[---], [---]> */ L2: /* <[--d], [---]> */ + x ++; + /* <[--d], [---]> */ + return x; +} + + +Slicing project worklist [default/slicing_1] = +[f5_slice_3 = (n:60 ,<[-c-], [---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +Print slice = f5_slice_3: (InCtrl: <[-c-], [---]>) + +/**/int f5(/* <[---], [---]> */ int c) +{ + /* <[---], [---]> */ int x; + /* <[---], [---]> */ + x = 0; + /* <[---], [---]> */ + if (c > Unknown) { + /* <[---], [---]> */ + goto Lsuite; + } + /* <[---], [---]> */ + x ++; + /* <[---], [---]> */ Lsuite: /* <[---], [---]> */ + ; + /* <[---], [---]> */ + if (c < Unknown) { + /* <[---], [---]> */ + goto L2; + } + /* <[---], [---]> */ + G ++; + /* <[---], [---]> */ L2: /* <[---], [---]> */ + x ++; + /* <[---], [---]> */ + return x; +} + + +[pdg] computing for function f6 +[pdg] done for function f6 +RESULT for f6: + {n79}: InCtrl + {n80}: VarDecl : n + -[a--]-> 81 + {n81}: In1 + -[a--]-> 80 + {n82}: VarDecl : i + {n83}: VarDecl : __retres + {n84}: i = 0; + -[-c-]-> 79 + -[a--]-> 82 + {n85}: while(1) + -[-c-]-> 79 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[-c-]-> 93 + -[-c-]-> 94 + {n86}: n < 10 + -[-c-]-> 79 + -[--d]-> 80 + -[--d]-> 81 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[--d]-> 91 + -[-c-]-> 93 + -[-c-]-> 94 + {n87}: block + -[-c-]-> 79 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[-c-]-> 93 + -[-c-]-> 94 + {n88}: Unknown > 3 + -[-c-]-> 79 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[-c-]-> 93 + -[-c-]-> 94 + -[--d]-> 103 + {n89}: n % 2 + -[-c-]-> 79 + -[--d]-> 80 + -[--d]-> 81 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[--d]-> 91 + -[-c-]-> 93 + -[-c-]-> 94 + {n90}: continue; + -[-c-]-> 79 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[-c-]-> 89 + -[-c-]-> 93 + -[-c-]-> 94 + {n91}: n ++; + -[-c-]-> 79 + -[a-d]-> 80 + -[--d]-> 81 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[-c-]-> 89 + -[-c-]-> 90 + -[--d]-> 91 + -[-c-]-> 93 + -[-c-]-> 94 + {n92}: i = 1; + -[-c-]-> 79 + -[a--]-> 82 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[-c-]-> 93 + -[-c-]-> 94 + {n93}: break; + -[-c-]-> 79 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[-c-]-> 93 + -[-c-]-> 94 + {n94}: break; + -[-c-]-> 79 + -[-c-]-> 85 + -[-c-]-> 86 + -[-c-]-> 87 + -[-c-]-> 88 + -[-c-]-> 93 + -[-c-]-> 94 + {n95}: i + -[-c-]-> 79 + -[--d]-> 82 + -[--d]-> 84 + -[--d]-> 92 + {n96}: __retres = 0; + -[-c-]-> 79 + -[a--]-> 83 + -[-c-]-> 95 + {n97}: __retres = 10 * n; + -[-c-]-> 79 + -[--d]-> 80 + -[--d]-> 81 + -[a--]-> 83 + -[--d]-> 91 + -[-c-]-> 95 + {n98}: goto return_label; + -[-c-]-> 79 + -[-c-]-> 95 + -[-c-]-> 99 + {n99}: return_label: + -[-c-]-> 79 + {n100}: goto return_label; + -[-c-]-> 79 + -[-c-]-> 95 + -[-c-]-> 99 + {n101}: return_label: return __retres; + -[-c-]-> 79 + -[--d]-> 83 + -[--d]-> 96 + -[--d]-> 97 + {n102}: OutRet + -[--d]-> 101 + {n103}: In(Unknown) +int f6(int n) +{ + int __retres; + int i; + /* 49 */ + i = 0; + /* 50 */ + while (n < 10) { + /* 56 */ + if (Unknown > 3) { + /* 57 */ + i = 1; + /* 58 */ + break; + } + /* 61 */ + if (n % 2) { + /* 62 */ + continue; + } + /* 64 */ + n ++; + } + /* 66 */ + if (i) { + /* 67 */ + __retres = 0; + /* 132 */ + goto return_label; + } + else { + /*@ assert Value: signed_overflow: 10*n ≤ 2147483647; */ + /*@ assert Value: signed_overflow: -2147483648 ≤ 10*n; */ + /* 69 */ + __retres = 10 * n; + /* 133 */ + goto return_label; + } + /* label */ return_label: /* 134 */ + return __retres; +} + +Slicing project worklist [default/slicing_1] = +[f6_slice_1 = (n:79 ,<[-c-], [---]>)(n:95 ,<[-c-], [---]>)] + +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +Print slice = +f6_slice_1: +(InCtrl: <[-c-], [---]>) +(In1: <[-c-], [---]>) +(In(Unknown): <[-c-], [---]>) + +/**/int f6(/* <[-c-], [---]> */ int n) +{ + /* <[---], [---]> */ int __retres; + /* <[-c-], [---]> */ int i; + /* <[-c-], [---]> */ + i = 0; + /* <[-c-], [---]> */ + while (n < 10) { + /* <[-c-], [---]> */ + if (Unknown > 3) { + /* <[-c-], [---]> */ + i = 1; + /* <[-c-], [---]> */ + break; + } + /* <[-c-], [---]> */ + if (n % 2) { + /* <[-c-], [---]> */ + continue; + } + /* <[-c-], [---]> */ + n ++; + } + /* <[-c-], [---]> */ + if (i) { + /* <[---], [---]> */ + __retres = 0; + /* <[---], [---]> */ + goto return_label; + } + else { + /*@ assert Value: signed_overflow: 10*n ≤ 2147483647; */ + /*@ assert Value: signed_overflow: -2147483648 ≤ 10*n; */ + /* <[---], [---]> */ + __retres = 10 * n; + /* <[---], [---]> */ + goto return_label; + } + /* <[---], [---]> */ return_label: /* <[---], [---]> */ + return __retres; +} + + +struct __anonstruct_Tstr_1 { + int a ; + int b ; + int c ; +}; +typedef struct __anonstruct_Tstr_1 Tstr; +int Unknown; +int G; +Print slice = f1_slice_1: (InCtrl: <[-cd], [---]>) + (In1: <[--d], [---]>) + +/**/int f1(/* <[--d], [---]> */ int x, /* <[---], [---]> */ int y) +{ + /* <[---], [---]> */ int __retres; + /* <[--d], [---]> */ int a; + /* <[---], [---]> */ int b; + /* <[--d], [---]> */ + a = 1; + /* <[---], [---]> */ + b = 2; + /* <[ S ], [---]> */ + G = x + a; + /* <[---], [---]> */ + __retres = y + b; + /* <[---], [---]> */ + return __retres; +} + +Print slice = f2_slice_1: (InCtrl: <[-c-], [---]>) + +/**/int f2(void) +{ + /* <[---], [---]> */ int a; + /* <[---], [---]> */ int b; + /* <[a--], [---]> */ int c; + /* <[---], [---]> */ int tmp; + /* <[---], [---]> */ + a = 1; + /* <[---], [---]> */ + b = a + 1; + /* <[ S ], [---]> */ + c = 3; + /* invisible call */ /* <[---], [---]> */ + tmp = f1(b,c); + /* <[---], [---]> */ + return tmp; +} + +Print slice = +f3_slice_1: +(InCtrl: <[--d], [---]>) +(In1: <[--d], [---]>) +(In(Unknown): <[--d], [---]>) +(OutRet: <[--d], [---]>) + +/**/int f3(/* <[--d], [---]> */ int c) +{ + /* <[---], [---]> */ int a; + /* <[--d], [---]> */ int b; + /* <[--d], [---]> */ int x; + /* <[---], [---]> */ + a = 1; + /* <[--d], [---]> */ + b = 2; + /* <[--d], [---]> */ + x = 0; + /* <[--d], [---]> */ + if (c > Unknown) { + /* <[--d], [---]> */ + x = b; + } + else { + /* <[---], [---]> */ + G = a; + } + /* <[--d], [---]> */ + return x; +} + +Print slice = +f4_slice_2: +(InCtrl: <[-cd], [---]>) +(In1: <[-c-], [---]>) +(In(Unknown): <[-c-], [---]>) + +/**/int f4(/* <[-c-], [---]> */ int c) +{ + /* <[--d], [---]> */ int a; + /* <[---], [---]> */ int b; + /* <[---], [---]> */ int x; + /* <[--d], [---]> */ + a = 1; + /* <[---], [---]> */ + b = 2; + /* <[---], [---]> */ + x = 0; + /* <[-c-], [---]> */ + if (c > Unknown) { + /* <[ S ], [---]> */ + G = a; + } + else { + /* <[---], [---]> */ + x = b; + } + /* <[---], [---]> */ + return x; +} + +Print slice = +f4_slice_1: +(InCtrl: <[--d], [---]>) +(In1: <[--d], [---]>) +(In(Unknown): <[--d], [---]>) +(OutRet: <[--d], [---]>) + +/**/int f4(/* <[--d], [---]> */ int c) +{ + /* <[---], [---]> */ int a; + /* <[--d], [---]> */ int b; + /* <[--d], [---]> */ int x; + /* <[---], [---]> */ + a = 1; + /* <[--d], [---]> */ + b = 2; + /* <[--d], [---]> */ + x = 0; + /* <[--d], [---]> */ + if (c > Unknown) { + /* <[---], [---]> */ + G = a; + } + else { + /* <[--d], [---]> */ + x = b; + } + /* <[--d], [---]> */ + return x; +} + +Print slice = f5_slice_3: (InCtrl: <[-c-], [---]>) + +/**/int f5(/* <[---], [---]> */ int c) +{ + /* <[---], [---]> */ int x; + /* <[---], [---]> */ + x = 0; + /* <[---], [---]> */ + if (c > Unknown) { + /* <[---], [---]> */ + goto Lsuite; + } + /* <[---], [---]> */ + x ++; + /* <[---], [---]> */ Lsuite: /* <[---], [---]> */ + ; + /* <[---], [---]> */ + if (c < Unknown) { + /* <[---], [---]> */ + goto L2; + } + /* <[---], [---]> */ + G ++; + /* <[---], [---]> */ L2: /* <[---], [---]> */ + x ++; + /* <[---], [---]> */ + return x; +} + +Print slice = +f5_slice_2: +(InCtrl: <[--d], [---]>) +(In1: <[--d], [---]>) +(In(Unknown): <[--d], [---]>) +(OutRet: <[--d], [---]>) + +/**/int f5(/* <[--d], [---]> */ int c) +{ + /* <[--d], [---]> */ int x; + /* <[--d], [---]> */ + x = 0; + /* <[--d], [---]> */ + if (c > Unknown) { + /* <[--d], [---]> */ + goto Lsuite; + } + /* <[--d], [---]> */ + x ++; + /* <[--d], [---]> */ Lsuite: /* <[---], [---]> */ + ; + /* <[---], [---]> */ + if (c < Unknown) { + /* <[---], [---]> */ + goto L2; + } + /* <[---], [---]> */ + G ++; + /* <[---], [---]> */ L2: /* <[--d], [---]> */ + x ++; + /* <[--d], [---]> */ + return x; +} + +Print slice = +f5_slice_1: +(InCtrl: <[--d], [---]>) +(In1: <[--d], [---]>) +(In(G): <[--d], [---]>) +(In(Unknown): <[--d], [---]>) + +/**/int f5(/* <[--d], [---]> */ int c) +{ + /* <[---], [---]> */ int x; + /* <[---], [---]> */ + x = 0; + /* <[---], [---]> */ + if (c > Unknown) { + /* <[---], [---]> */ + goto Lsuite; + } + /* <[---], [---]> */ + x ++; + /* <[---], [---]> */ Lsuite: /* <[---], [---]> */ + ; + /* <[--d], [---]> */ + if (c < Unknown) { + /* <[--d], [---]> */ + goto L2; + } + /* <[--d], [---]> */ + G ++; + /* <[--d], [---]> */ L2: /* <[---], [---]> */ + x ++; + /* <[---], [---]> */ + return x; +} + +Print slice = +f6_slice_1: +(InCtrl: <[-c-], [---]>) +(In1: <[-c-], [---]>) +(In(Unknown): <[-c-], [---]>) + +/**/int f6(/* <[-c-], [---]> */ int n) +{ + /* <[---], [---]> */ int __retres; + /* <[-c-], [---]> */ int i; + /* <[-c-], [---]> */ + i = 0; + /* <[-c-], [---]> */ + while (n < 10) { + /* <[-c-], [---]> */ + if (Unknown > 3) { + /* <[-c-], [---]> */ + i = 1; + /* <[-c-], [---]> */ + break; + } + /* <[-c-], [---]> */ + if (n % 2) { + /* <[-c-], [---]> */ + continue; + } + /* <[-c-], [---]> */ + n ++; + } + /* <[-c-], [---]> */ + if (i) { + /* <[---], [---]> */ + __retres = 0; + /* <[---], [---]> */ + goto return_label; + } + else { + /*@ assert Value: signed_overflow: 10*n ≤ 2147483647; */ + /*@ assert Value: signed_overflow: -2147483648 ≤ 10*n; */ + /* <[---], [---]> */ + __retres = 10 * n; + /* <[---], [---]> */ + goto return_label; + } + /* <[---], [---]> */ return_label: /* <[---], [---]> */ + return __retres; +} + +Tstr S; +Tstr S1; +Tstr S2; +Slicing project worklist [default/slicing_1] = + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.10.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.10.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.10.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.10.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,123 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/sizeof.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + st ∈ {0} +tests/slicing/sizeof.c:93:[value] Assertion got status valid. +[value] computing for function SizeOf_1 <- main. + Called from tests/slicing/sizeof.c:94. +[value] Recording results for SizeOf_1 +[value] Done for function SizeOf_1 +[value] computing for function SizeOf_2 <- main. + Called from tests/slicing/sizeof.c:95. +[value] Recording results for SizeOf_2 +[value] Done for function SizeOf_2 +[value] computing for function SizeOfE_pt1 <- main. + Called from tests/slicing/sizeof.c:96. +[value] Recording results for SizeOfE_pt1 +[value] Done for function SizeOfE_pt1 +[value] computing for function SizeOfE_pt2 <- main. + Called from tests/slicing/sizeof.c:97. +[value] Recording results for SizeOfE_pt2 +[value] Done for function SizeOfE_pt2 +[value] computing for function SizeOfE_pt3 <- main. + Called from tests/slicing/sizeof.c:98. +[value] Recording results for SizeOfE_pt3 +[value] Done for function SizeOfE_pt3 +[value] computing for function SizeOfE_pt_deref_1 <- main. + Called from tests/slicing/sizeof.c:99. +[value] Recording results for SizeOfE_pt_deref_1 +[value] Done for function SizeOfE_pt_deref_1 +[value] computing for function SizeOfE_tab_1 <- main. + Called from tests/slicing/sizeof.c:100. +[value] Recording results for SizeOfE_tab_1 +[value] Done for function SizeOfE_tab_1 +[value] computing for function SizeOfE_pt_tab_1 <- main. + Called from tests/slicing/sizeof.c:101. +[value] Recording results for SizeOfE_pt_tab_1 +[value] Done for function SizeOfE_pt_tab_1 +[value] computing for function SizeOfE_pt_tab_2 <- main. + Called from tests/slicing/sizeof.c:102. +[value] Recording results for SizeOfE_pt_tab_2 +[value] Done for function SizeOfE_pt_tab_2 +[value] computing for function SizeOfE_tab_acces_1 <- main. + Called from tests/slicing/sizeof.c:103. +[value] Recording results for SizeOfE_tab_acces_1 +[value] Done for function SizeOfE_tab_acces_1 +[value] Recording results for main +[value] done for function main +[from] Computing for function SizeOfE_pt1 +[from] Done for function SizeOfE_pt1 +[from] Computing for function SizeOfE_pt2 +[from] Done for function SizeOfE_pt2 +[from] Computing for function SizeOfE_pt3 +[from] Done for function SizeOfE_pt3 +[from] Computing for function SizeOfE_pt_deref_1 +[from] Done for function SizeOfE_pt_deref_1 +[from] Computing for function SizeOfE_pt_tab_1 +[from] Done for function SizeOfE_pt_tab_1 +[from] Computing for function SizeOfE_pt_tab_2 +[from] Done for function SizeOfE_pt_tab_2 +[from] Computing for function SizeOfE_tab_1 +[from] Done for function SizeOfE_tab_1 +[from] Computing for function SizeOfE_tab_acces_1 +[from] Done for function SizeOfE_tab_acces_1 +[from] Computing for function SizeOf_1 +[from] Done for function SizeOf_1 +[from] Computing for function SizeOf_2 +[from] Done for function SizeOf_2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function SizeOfE_pt1: + \result FROM \nothing +[from] Function SizeOfE_pt2: + \result FROM \nothing +[from] Function SizeOfE_pt3: + \result FROM \nothing +[from] Function SizeOfE_pt_deref_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_2: + \result FROM \nothing +[from] Function SizeOfE_tab_1: + \result FROM \nothing +[from] Function SizeOfE_tab_acces_1: + \result FROM \nothing +[from] Function SizeOf_1: + \result FROM \nothing +[from] Function SizeOf_2: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function SizeOfE_tab_acces_1 +[pdg] done for function SizeOfE_tab_acces_1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +unsigned int SizeOfE_tab_acces_1_slice_1(void) +{ + unsigned int __retres; + int i; + int tab[5]; + __retres = sizeof(tab[i]); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.11.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.11.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.11.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.11.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,292 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/sizeof.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + st ∈ {0} +tests/slicing/sizeof.c:93:[value] Assertion got status valid. +[value] computing for function SizeOf_1 <- main. + Called from tests/slicing/sizeof.c:94. +[value] Recording results for SizeOf_1 +[value] Done for function SizeOf_1 +[value] computing for function SizeOf_2 <- main. + Called from tests/slicing/sizeof.c:95. +[value] Recording results for SizeOf_2 +[value] Done for function SizeOf_2 +[value] computing for function SizeOfE_pt1 <- main. + Called from tests/slicing/sizeof.c:96. +[value] Recording results for SizeOfE_pt1 +[value] Done for function SizeOfE_pt1 +[value] computing for function SizeOfE_pt2 <- main. + Called from tests/slicing/sizeof.c:97. +[value] Recording results for SizeOfE_pt2 +[value] Done for function SizeOfE_pt2 +[value] computing for function SizeOfE_pt3 <- main. + Called from tests/slicing/sizeof.c:98. +[value] Recording results for SizeOfE_pt3 +[value] Done for function SizeOfE_pt3 +[value] computing for function SizeOfE_pt_deref_1 <- main. + Called from tests/slicing/sizeof.c:99. +[value] Recording results for SizeOfE_pt_deref_1 +[value] Done for function SizeOfE_pt_deref_1 +[value] computing for function SizeOfE_tab_1 <- main. + Called from tests/slicing/sizeof.c:100. +[value] Recording results for SizeOfE_tab_1 +[value] Done for function SizeOfE_tab_1 +[value] computing for function SizeOfE_pt_tab_1 <- main. + Called from tests/slicing/sizeof.c:101. +[value] Recording results for SizeOfE_pt_tab_1 +[value] Done for function SizeOfE_pt_tab_1 +[value] computing for function SizeOfE_pt_tab_2 <- main. + Called from tests/slicing/sizeof.c:102. +[value] Recording results for SizeOfE_pt_tab_2 +[value] Done for function SizeOfE_pt_tab_2 +[value] computing for function SizeOfE_tab_acces_1 <- main. + Called from tests/slicing/sizeof.c:103. +[value] Recording results for SizeOfE_tab_acces_1 +[value] Done for function SizeOfE_tab_acces_1 +[value] Recording results for main +[value] done for function main +[from] Computing for function SizeOfE_pt1 +[from] Done for function SizeOfE_pt1 +[from] Computing for function SizeOfE_pt2 +[from] Done for function SizeOfE_pt2 +[from] Computing for function SizeOfE_pt3 +[from] Done for function SizeOfE_pt3 +[from] Computing for function SizeOfE_pt_deref_1 +[from] Done for function SizeOfE_pt_deref_1 +[from] Computing for function SizeOfE_pt_tab_1 +[from] Done for function SizeOfE_pt_tab_1 +[from] Computing for function SizeOfE_pt_tab_2 +[from] Done for function SizeOfE_pt_tab_2 +[from] Computing for function SizeOfE_tab_1 +[from] Done for function SizeOfE_tab_1 +[from] Computing for function SizeOfE_tab_acces_1 +[from] Done for function SizeOfE_tab_acces_1 +[from] Computing for function SizeOf_1 +[from] Done for function SizeOf_1 +[from] Computing for function SizeOf_2 +[from] Done for function SizeOf_2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function SizeOfE_pt1: + \result FROM \nothing +[from] Function SizeOfE_pt2: + \result FROM \nothing +[from] Function SizeOfE_pt3: + \result FROM \nothing +[from] Function SizeOfE_pt_deref_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_2: + \result FROM \nothing +[from] Function SizeOfE_tab_1: + \result FROM \nothing +[from] Function SizeOfE_tab_acces_1: + \result FROM \nothing +[from] Function SizeOf_1: + \result FROM \nothing +[from] Function SizeOf_2: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function SizeOfE_tab_acces_1 +[pdg] done for function SizeOfE_tab_acces_1 +[pdg] computing for function SizeOfE_pt_tab_2 +[pdg] done for function SizeOfE_pt_tab_2 +[pdg] computing for function SizeOfE_pt_tab_1 +[pdg] done for function SizeOfE_pt_tab_1 +[pdg] computing for function SizeOfE_tab_1 +[pdg] done for function SizeOfE_tab_1 +[pdg] computing for function SizeOfE_pt_deref_1 +[pdg] done for function SizeOfE_pt_deref_1 +[pdg] computing for function SizeOfE_pt3 +[pdg] done for function SizeOfE_pt3 +[pdg] computing for function SizeOfE_pt2 +[pdg] done for function SizeOfE_pt2 +[pdg] computing for function SizeOfE_pt1 +[pdg] done for function SizeOfE_pt1 +[pdg] computing for function SizeOf_2 +[pdg] done for function SizeOf_2 +[pdg] computing for function SizeOf_1 +[pdg] done for function SizeOf_1 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct St { + int i ; + int *p ; + int tab[5] ; +}; +unsigned int SizeOf_1_slice_1(void) +{ + unsigned int __retres; + __retres = sizeof(int *); + return __retres; +} + +unsigned int SizeOf_2_slice_1(void) +{ + unsigned int __retres; + __retres = sizeof(struct St); + return __retres; +} + +unsigned int SizeOfE_pt1_slice_1(void) +{ + unsigned int __retres; + int x; + __retres = sizeof(& x); + return __retres; +} + +unsigned int SizeOfE_pt2_slice_1(void) +{ + unsigned int __retres; + int *p; + __retres = sizeof(p); + return __retres; +} + +unsigned int SizeOfE_pt3_slice_1(void) +{ + unsigned int __retres; + int i; + int *p; + __retres = sizeof(p + i); + return __retres; +} + +unsigned int SizeOfE_pt_deref_1_slice_1(void) +{ + unsigned int __retres; + int i; + int *p; + __retres = sizeof(*(p + i)); + return __retres; +} + +unsigned int SizeOfE_tab_1_slice_1(void) +{ + unsigned int __retres; + int tab[5]; + __retres = sizeof(tab); + return __retres; +} + +unsigned int SizeOfE_pt_tab_1_slice_1(void) +{ + unsigned int __retres; + int i; + int tab[5]; + __retres = sizeof(& tab[i]); + return __retres; +} + +unsigned int SizeOfE_pt_tab_2_slice_1(void) +{ + unsigned int __retres; + int i; + int tab[5]; + __retres = sizeof(& tab[i]); + return __retres; +} + +unsigned int SizeOfE_tab_acces_1_slice_1(void) +{ + unsigned int __retres; + int i; + int tab[5]; + __retres = sizeof(tab[i]); + return __retres; +} + +void main(void) +{ + int r; + unsigned int tmp; + unsigned int tmp_0; + unsigned int tmp_1; + unsigned int tmp_2; + unsigned int tmp_3; + unsigned int tmp_4; + unsigned int tmp_5; + unsigned int tmp_6; + unsigned int tmp_7; + unsigned int tmp_8; + r = 0; + r = (int)((unsigned int)r + sizeof(struct St)); + /*@ assert r ≢ 0; */ ; + { + /*sequence*/ + tmp = SizeOf_1_slice_1(); + r = (int)((unsigned int)r + tmp); + } + { + /*sequence*/ + tmp_0 = SizeOf_2_slice_1(); + r = (int)((unsigned int)r + tmp_0); + } + { + /*sequence*/ + tmp_1 = SizeOfE_pt1_slice_1(); + r = (int)((unsigned int)r + tmp_1); + } + { + /*sequence*/ + tmp_2 = SizeOfE_pt2_slice_1(); + r = (int)((unsigned int)r + tmp_2); + } + { + /*sequence*/ + tmp_3 = SizeOfE_pt3_slice_1(); + r = (int)((unsigned int)r + tmp_3); + } + { + /*sequence*/ + tmp_4 = SizeOfE_pt_deref_1_slice_1(); + r = (int)((unsigned int)r + tmp_4); + } + { + /*sequence*/ + tmp_5 = SizeOfE_tab_1_slice_1(); + r = (int)((unsigned int)r + tmp_5); + } + { + /*sequence*/ + tmp_6 = SizeOfE_pt_tab_1_slice_1(); + r = (int)((unsigned int)r + tmp_6); + } + { + /*sequence*/ + tmp_7 = SizeOfE_pt_tab_2_slice_1(); + r = (int)((unsigned int)r + tmp_7); + } + { + /*sequence*/ + tmp_8 = SizeOfE_tab_acces_1_slice_1(); + r = (int)((unsigned int)r + tmp_8); + } + /*@ slice pragma expr r; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.12.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.12.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.12.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.12.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,128 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/sizeof.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + st ∈ {0} +tests/slicing/sizeof.c:93:[value] Assertion got status valid. +[value] computing for function SizeOf_1 <- main. + Called from tests/slicing/sizeof.c:94. +[value] Recording results for SizeOf_1 +[value] Done for function SizeOf_1 +[value] computing for function SizeOf_2 <- main. + Called from tests/slicing/sizeof.c:95. +[value] Recording results for SizeOf_2 +[value] Done for function SizeOf_2 +[value] computing for function SizeOfE_pt1 <- main. + Called from tests/slicing/sizeof.c:96. +[value] Recording results for SizeOfE_pt1 +[value] Done for function SizeOfE_pt1 +[value] computing for function SizeOfE_pt2 <- main. + Called from tests/slicing/sizeof.c:97. +[value] Recording results for SizeOfE_pt2 +[value] Done for function SizeOfE_pt2 +[value] computing for function SizeOfE_pt3 <- main. + Called from tests/slicing/sizeof.c:98. +[value] Recording results for SizeOfE_pt3 +[value] Done for function SizeOfE_pt3 +[value] computing for function SizeOfE_pt_deref_1 <- main. + Called from tests/slicing/sizeof.c:99. +[value] Recording results for SizeOfE_pt_deref_1 +[value] Done for function SizeOfE_pt_deref_1 +[value] computing for function SizeOfE_tab_1 <- main. + Called from tests/slicing/sizeof.c:100. +[value] Recording results for SizeOfE_tab_1 +[value] Done for function SizeOfE_tab_1 +[value] computing for function SizeOfE_pt_tab_1 <- main. + Called from tests/slicing/sizeof.c:101. +[value] Recording results for SizeOfE_pt_tab_1 +[value] Done for function SizeOfE_pt_tab_1 +[value] computing for function SizeOfE_pt_tab_2 <- main. + Called from tests/slicing/sizeof.c:102. +[value] Recording results for SizeOfE_pt_tab_2 +[value] Done for function SizeOfE_pt_tab_2 +[value] computing for function SizeOfE_tab_acces_1 <- main. + Called from tests/slicing/sizeof.c:103. +[value] Recording results for SizeOfE_tab_acces_1 +[value] Done for function SizeOfE_tab_acces_1 +[value] Recording results for main +[value] done for function main +[from] Computing for function SizeOfE_pt1 +[from] Done for function SizeOfE_pt1 +[from] Computing for function SizeOfE_pt2 +[from] Done for function SizeOfE_pt2 +[from] Computing for function SizeOfE_pt3 +[from] Done for function SizeOfE_pt3 +[from] Computing for function SizeOfE_pt_deref_1 +[from] Done for function SizeOfE_pt_deref_1 +[from] Computing for function SizeOfE_pt_tab_1 +[from] Done for function SizeOfE_pt_tab_1 +[from] Computing for function SizeOfE_pt_tab_2 +[from] Done for function SizeOfE_pt_tab_2 +[from] Computing for function SizeOfE_tab_1 +[from] Done for function SizeOfE_tab_1 +[from] Computing for function SizeOfE_tab_acces_1 +[from] Done for function SizeOfE_tab_acces_1 +[from] Computing for function SizeOf_1 +[from] Done for function SizeOf_1 +[from] Computing for function SizeOf_2 +[from] Done for function SizeOf_2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function SizeOfE_pt1: + \result FROM \nothing +[from] Function SizeOfE_pt2: + \result FROM \nothing +[from] Function SizeOfE_pt3: + \result FROM \nothing +[from] Function SizeOfE_pt_deref_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_2: + \result FROM \nothing +[from] Function SizeOfE_tab_1: + \result FROM \nothing +[from] Function SizeOfE_tab_acces_1: + \result FROM \nothing +[from] Function SizeOf_1: + \result FROM \nothing +[from] Function SizeOf_2: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct St { + int i ; + int *p ; + int tab[5] ; +}; +void main(void) +{ + int r; + r = 0; + r = (int)((unsigned int)r + sizeof(struct St)); + /*@ assert r ≢ 0; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,121 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/sizeof.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + st ∈ {0} +tests/slicing/sizeof.c:93:[value] Assertion got status valid. +[value] computing for function SizeOf_1 <- main. + Called from tests/slicing/sizeof.c:94. +[value] Recording results for SizeOf_1 +[value] Done for function SizeOf_1 +[value] computing for function SizeOf_2 <- main. + Called from tests/slicing/sizeof.c:95. +[value] Recording results for SizeOf_2 +[value] Done for function SizeOf_2 +[value] computing for function SizeOfE_pt1 <- main. + Called from tests/slicing/sizeof.c:96. +[value] Recording results for SizeOfE_pt1 +[value] Done for function SizeOfE_pt1 +[value] computing for function SizeOfE_pt2 <- main. + Called from tests/slicing/sizeof.c:97. +[value] Recording results for SizeOfE_pt2 +[value] Done for function SizeOfE_pt2 +[value] computing for function SizeOfE_pt3 <- main. + Called from tests/slicing/sizeof.c:98. +[value] Recording results for SizeOfE_pt3 +[value] Done for function SizeOfE_pt3 +[value] computing for function SizeOfE_pt_deref_1 <- main. + Called from tests/slicing/sizeof.c:99. +[value] Recording results for SizeOfE_pt_deref_1 +[value] Done for function SizeOfE_pt_deref_1 +[value] computing for function SizeOfE_tab_1 <- main. + Called from tests/slicing/sizeof.c:100. +[value] Recording results for SizeOfE_tab_1 +[value] Done for function SizeOfE_tab_1 +[value] computing for function SizeOfE_pt_tab_1 <- main. + Called from tests/slicing/sizeof.c:101. +[value] Recording results for SizeOfE_pt_tab_1 +[value] Done for function SizeOfE_pt_tab_1 +[value] computing for function SizeOfE_pt_tab_2 <- main. + Called from tests/slicing/sizeof.c:102. +[value] Recording results for SizeOfE_pt_tab_2 +[value] Done for function SizeOfE_pt_tab_2 +[value] computing for function SizeOfE_tab_acces_1 <- main. + Called from tests/slicing/sizeof.c:103. +[value] Recording results for SizeOfE_tab_acces_1 +[value] Done for function SizeOfE_tab_acces_1 +[value] Recording results for main +[value] done for function main +[from] Computing for function SizeOfE_pt1 +[from] Done for function SizeOfE_pt1 +[from] Computing for function SizeOfE_pt2 +[from] Done for function SizeOfE_pt2 +[from] Computing for function SizeOfE_pt3 +[from] Done for function SizeOfE_pt3 +[from] Computing for function SizeOfE_pt_deref_1 +[from] Done for function SizeOfE_pt_deref_1 +[from] Computing for function SizeOfE_pt_tab_1 +[from] Done for function SizeOfE_pt_tab_1 +[from] Computing for function SizeOfE_pt_tab_2 +[from] Done for function SizeOfE_pt_tab_2 +[from] Computing for function SizeOfE_tab_1 +[from] Done for function SizeOfE_tab_1 +[from] Computing for function SizeOfE_tab_acces_1 +[from] Done for function SizeOfE_tab_acces_1 +[from] Computing for function SizeOf_1 +[from] Done for function SizeOf_1 +[from] Computing for function SizeOf_2 +[from] Done for function SizeOf_2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function SizeOfE_pt1: + \result FROM \nothing +[from] Function SizeOfE_pt2: + \result FROM \nothing +[from] Function SizeOfE_pt3: + \result FROM \nothing +[from] Function SizeOfE_pt_deref_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_2: + \result FROM \nothing +[from] Function SizeOfE_tab_1: + \result FROM \nothing +[from] Function SizeOfE_tab_acces_1: + \result FROM \nothing +[from] Function SizeOf_1: + \result FROM \nothing +[from] Function SizeOf_2: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function SizeOf_1 +[pdg] done for function SizeOf_1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +unsigned int SizeOf_1_slice_1(void) +{ + unsigned int __retres; + __retres = sizeof(int *); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,126 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/sizeof.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + st ∈ {0} +tests/slicing/sizeof.c:93:[value] Assertion got status valid. +[value] computing for function SizeOf_1 <- main. + Called from tests/slicing/sizeof.c:94. +[value] Recording results for SizeOf_1 +[value] Done for function SizeOf_1 +[value] computing for function SizeOf_2 <- main. + Called from tests/slicing/sizeof.c:95. +[value] Recording results for SizeOf_2 +[value] Done for function SizeOf_2 +[value] computing for function SizeOfE_pt1 <- main. + Called from tests/slicing/sizeof.c:96. +[value] Recording results for SizeOfE_pt1 +[value] Done for function SizeOfE_pt1 +[value] computing for function SizeOfE_pt2 <- main. + Called from tests/slicing/sizeof.c:97. +[value] Recording results for SizeOfE_pt2 +[value] Done for function SizeOfE_pt2 +[value] computing for function SizeOfE_pt3 <- main. + Called from tests/slicing/sizeof.c:98. +[value] Recording results for SizeOfE_pt3 +[value] Done for function SizeOfE_pt3 +[value] computing for function SizeOfE_pt_deref_1 <- main. + Called from tests/slicing/sizeof.c:99. +[value] Recording results for SizeOfE_pt_deref_1 +[value] Done for function SizeOfE_pt_deref_1 +[value] computing for function SizeOfE_tab_1 <- main. + Called from tests/slicing/sizeof.c:100. +[value] Recording results for SizeOfE_tab_1 +[value] Done for function SizeOfE_tab_1 +[value] computing for function SizeOfE_pt_tab_1 <- main. + Called from tests/slicing/sizeof.c:101. +[value] Recording results for SizeOfE_pt_tab_1 +[value] Done for function SizeOfE_pt_tab_1 +[value] computing for function SizeOfE_pt_tab_2 <- main. + Called from tests/slicing/sizeof.c:102. +[value] Recording results for SizeOfE_pt_tab_2 +[value] Done for function SizeOfE_pt_tab_2 +[value] computing for function SizeOfE_tab_acces_1 <- main. + Called from tests/slicing/sizeof.c:103. +[value] Recording results for SizeOfE_tab_acces_1 +[value] Done for function SizeOfE_tab_acces_1 +[value] Recording results for main +[value] done for function main +[from] Computing for function SizeOfE_pt1 +[from] Done for function SizeOfE_pt1 +[from] Computing for function SizeOfE_pt2 +[from] Done for function SizeOfE_pt2 +[from] Computing for function SizeOfE_pt3 +[from] Done for function SizeOfE_pt3 +[from] Computing for function SizeOfE_pt_deref_1 +[from] Done for function SizeOfE_pt_deref_1 +[from] Computing for function SizeOfE_pt_tab_1 +[from] Done for function SizeOfE_pt_tab_1 +[from] Computing for function SizeOfE_pt_tab_2 +[from] Done for function SizeOfE_pt_tab_2 +[from] Computing for function SizeOfE_tab_1 +[from] Done for function SizeOfE_tab_1 +[from] Computing for function SizeOfE_tab_acces_1 +[from] Done for function SizeOfE_tab_acces_1 +[from] Computing for function SizeOf_1 +[from] Done for function SizeOf_1 +[from] Computing for function SizeOf_2 +[from] Done for function SizeOf_2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function SizeOfE_pt1: + \result FROM \nothing +[from] Function SizeOfE_pt2: + \result FROM \nothing +[from] Function SizeOfE_pt3: + \result FROM \nothing +[from] Function SizeOfE_pt_deref_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_2: + \result FROM \nothing +[from] Function SizeOfE_tab_1: + \result FROM \nothing +[from] Function SizeOfE_tab_acces_1: + \result FROM \nothing +[from] Function SizeOf_1: + \result FROM \nothing +[from] Function SizeOf_2: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function SizeOf_2 +[pdg] done for function SizeOf_2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct St { + int i ; + int *p ; + int tab[5] ; +}; +unsigned int SizeOf_2_slice_1(void) +{ + unsigned int __retres; + __retres = sizeof(struct St); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.3.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,122 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/sizeof.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + st ∈ {0} +tests/slicing/sizeof.c:93:[value] Assertion got status valid. +[value] computing for function SizeOf_1 <- main. + Called from tests/slicing/sizeof.c:94. +[value] Recording results for SizeOf_1 +[value] Done for function SizeOf_1 +[value] computing for function SizeOf_2 <- main. + Called from tests/slicing/sizeof.c:95. +[value] Recording results for SizeOf_2 +[value] Done for function SizeOf_2 +[value] computing for function SizeOfE_pt1 <- main. + Called from tests/slicing/sizeof.c:96. +[value] Recording results for SizeOfE_pt1 +[value] Done for function SizeOfE_pt1 +[value] computing for function SizeOfE_pt2 <- main. + Called from tests/slicing/sizeof.c:97. +[value] Recording results for SizeOfE_pt2 +[value] Done for function SizeOfE_pt2 +[value] computing for function SizeOfE_pt3 <- main. + Called from tests/slicing/sizeof.c:98. +[value] Recording results for SizeOfE_pt3 +[value] Done for function SizeOfE_pt3 +[value] computing for function SizeOfE_pt_deref_1 <- main. + Called from tests/slicing/sizeof.c:99. +[value] Recording results for SizeOfE_pt_deref_1 +[value] Done for function SizeOfE_pt_deref_1 +[value] computing for function SizeOfE_tab_1 <- main. + Called from tests/slicing/sizeof.c:100. +[value] Recording results for SizeOfE_tab_1 +[value] Done for function SizeOfE_tab_1 +[value] computing for function SizeOfE_pt_tab_1 <- main. + Called from tests/slicing/sizeof.c:101. +[value] Recording results for SizeOfE_pt_tab_1 +[value] Done for function SizeOfE_pt_tab_1 +[value] computing for function SizeOfE_pt_tab_2 <- main. + Called from tests/slicing/sizeof.c:102. +[value] Recording results for SizeOfE_pt_tab_2 +[value] Done for function SizeOfE_pt_tab_2 +[value] computing for function SizeOfE_tab_acces_1 <- main. + Called from tests/slicing/sizeof.c:103. +[value] Recording results for SizeOfE_tab_acces_1 +[value] Done for function SizeOfE_tab_acces_1 +[value] Recording results for main +[value] done for function main +[from] Computing for function SizeOfE_pt1 +[from] Done for function SizeOfE_pt1 +[from] Computing for function SizeOfE_pt2 +[from] Done for function SizeOfE_pt2 +[from] Computing for function SizeOfE_pt3 +[from] Done for function SizeOfE_pt3 +[from] Computing for function SizeOfE_pt_deref_1 +[from] Done for function SizeOfE_pt_deref_1 +[from] Computing for function SizeOfE_pt_tab_1 +[from] Done for function SizeOfE_pt_tab_1 +[from] Computing for function SizeOfE_pt_tab_2 +[from] Done for function SizeOfE_pt_tab_2 +[from] Computing for function SizeOfE_tab_1 +[from] Done for function SizeOfE_tab_1 +[from] Computing for function SizeOfE_tab_acces_1 +[from] Done for function SizeOfE_tab_acces_1 +[from] Computing for function SizeOf_1 +[from] Done for function SizeOf_1 +[from] Computing for function SizeOf_2 +[from] Done for function SizeOf_2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function SizeOfE_pt1: + \result FROM \nothing +[from] Function SizeOfE_pt2: + \result FROM \nothing +[from] Function SizeOfE_pt3: + \result FROM \nothing +[from] Function SizeOfE_pt_deref_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_2: + \result FROM \nothing +[from] Function SizeOfE_tab_1: + \result FROM \nothing +[from] Function SizeOfE_tab_acces_1: + \result FROM \nothing +[from] Function SizeOf_1: + \result FROM \nothing +[from] Function SizeOf_2: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function SizeOfE_pt1 +[pdg] done for function SizeOfE_pt1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +unsigned int SizeOfE_pt1_slice_1(void) +{ + unsigned int __retres; + int x; + __retres = sizeof(& x); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.4.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,122 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/sizeof.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + st ∈ {0} +tests/slicing/sizeof.c:93:[value] Assertion got status valid. +[value] computing for function SizeOf_1 <- main. + Called from tests/slicing/sizeof.c:94. +[value] Recording results for SizeOf_1 +[value] Done for function SizeOf_1 +[value] computing for function SizeOf_2 <- main. + Called from tests/slicing/sizeof.c:95. +[value] Recording results for SizeOf_2 +[value] Done for function SizeOf_2 +[value] computing for function SizeOfE_pt1 <- main. + Called from tests/slicing/sizeof.c:96. +[value] Recording results for SizeOfE_pt1 +[value] Done for function SizeOfE_pt1 +[value] computing for function SizeOfE_pt2 <- main. + Called from tests/slicing/sizeof.c:97. +[value] Recording results for SizeOfE_pt2 +[value] Done for function SizeOfE_pt2 +[value] computing for function SizeOfE_pt3 <- main. + Called from tests/slicing/sizeof.c:98. +[value] Recording results for SizeOfE_pt3 +[value] Done for function SizeOfE_pt3 +[value] computing for function SizeOfE_pt_deref_1 <- main. + Called from tests/slicing/sizeof.c:99. +[value] Recording results for SizeOfE_pt_deref_1 +[value] Done for function SizeOfE_pt_deref_1 +[value] computing for function SizeOfE_tab_1 <- main. + Called from tests/slicing/sizeof.c:100. +[value] Recording results for SizeOfE_tab_1 +[value] Done for function SizeOfE_tab_1 +[value] computing for function SizeOfE_pt_tab_1 <- main. + Called from tests/slicing/sizeof.c:101. +[value] Recording results for SizeOfE_pt_tab_1 +[value] Done for function SizeOfE_pt_tab_1 +[value] computing for function SizeOfE_pt_tab_2 <- main. + Called from tests/slicing/sizeof.c:102. +[value] Recording results for SizeOfE_pt_tab_2 +[value] Done for function SizeOfE_pt_tab_2 +[value] computing for function SizeOfE_tab_acces_1 <- main. + Called from tests/slicing/sizeof.c:103. +[value] Recording results for SizeOfE_tab_acces_1 +[value] Done for function SizeOfE_tab_acces_1 +[value] Recording results for main +[value] done for function main +[from] Computing for function SizeOfE_pt1 +[from] Done for function SizeOfE_pt1 +[from] Computing for function SizeOfE_pt2 +[from] Done for function SizeOfE_pt2 +[from] Computing for function SizeOfE_pt3 +[from] Done for function SizeOfE_pt3 +[from] Computing for function SizeOfE_pt_deref_1 +[from] Done for function SizeOfE_pt_deref_1 +[from] Computing for function SizeOfE_pt_tab_1 +[from] Done for function SizeOfE_pt_tab_1 +[from] Computing for function SizeOfE_pt_tab_2 +[from] Done for function SizeOfE_pt_tab_2 +[from] Computing for function SizeOfE_tab_1 +[from] Done for function SizeOfE_tab_1 +[from] Computing for function SizeOfE_tab_acces_1 +[from] Done for function SizeOfE_tab_acces_1 +[from] Computing for function SizeOf_1 +[from] Done for function SizeOf_1 +[from] Computing for function SizeOf_2 +[from] Done for function SizeOf_2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function SizeOfE_pt1: + \result FROM \nothing +[from] Function SizeOfE_pt2: + \result FROM \nothing +[from] Function SizeOfE_pt3: + \result FROM \nothing +[from] Function SizeOfE_pt_deref_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_2: + \result FROM \nothing +[from] Function SizeOfE_tab_1: + \result FROM \nothing +[from] Function SizeOfE_tab_acces_1: + \result FROM \nothing +[from] Function SizeOf_1: + \result FROM \nothing +[from] Function SizeOf_2: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function SizeOfE_pt2 +[pdg] done for function SizeOfE_pt2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +unsigned int SizeOfE_pt2_slice_1(void) +{ + unsigned int __retres; + int *p; + __retres = sizeof(p); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.5.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.5.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.5.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,123 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/sizeof.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + st ∈ {0} +tests/slicing/sizeof.c:93:[value] Assertion got status valid. +[value] computing for function SizeOf_1 <- main. + Called from tests/slicing/sizeof.c:94. +[value] Recording results for SizeOf_1 +[value] Done for function SizeOf_1 +[value] computing for function SizeOf_2 <- main. + Called from tests/slicing/sizeof.c:95. +[value] Recording results for SizeOf_2 +[value] Done for function SizeOf_2 +[value] computing for function SizeOfE_pt1 <- main. + Called from tests/slicing/sizeof.c:96. +[value] Recording results for SizeOfE_pt1 +[value] Done for function SizeOfE_pt1 +[value] computing for function SizeOfE_pt2 <- main. + Called from tests/slicing/sizeof.c:97. +[value] Recording results for SizeOfE_pt2 +[value] Done for function SizeOfE_pt2 +[value] computing for function SizeOfE_pt3 <- main. + Called from tests/slicing/sizeof.c:98. +[value] Recording results for SizeOfE_pt3 +[value] Done for function SizeOfE_pt3 +[value] computing for function SizeOfE_pt_deref_1 <- main. + Called from tests/slicing/sizeof.c:99. +[value] Recording results for SizeOfE_pt_deref_1 +[value] Done for function SizeOfE_pt_deref_1 +[value] computing for function SizeOfE_tab_1 <- main. + Called from tests/slicing/sizeof.c:100. +[value] Recording results for SizeOfE_tab_1 +[value] Done for function SizeOfE_tab_1 +[value] computing for function SizeOfE_pt_tab_1 <- main. + Called from tests/slicing/sizeof.c:101. +[value] Recording results for SizeOfE_pt_tab_1 +[value] Done for function SizeOfE_pt_tab_1 +[value] computing for function SizeOfE_pt_tab_2 <- main. + Called from tests/slicing/sizeof.c:102. +[value] Recording results for SizeOfE_pt_tab_2 +[value] Done for function SizeOfE_pt_tab_2 +[value] computing for function SizeOfE_tab_acces_1 <- main. + Called from tests/slicing/sizeof.c:103. +[value] Recording results for SizeOfE_tab_acces_1 +[value] Done for function SizeOfE_tab_acces_1 +[value] Recording results for main +[value] done for function main +[from] Computing for function SizeOfE_pt1 +[from] Done for function SizeOfE_pt1 +[from] Computing for function SizeOfE_pt2 +[from] Done for function SizeOfE_pt2 +[from] Computing for function SizeOfE_pt3 +[from] Done for function SizeOfE_pt3 +[from] Computing for function SizeOfE_pt_deref_1 +[from] Done for function SizeOfE_pt_deref_1 +[from] Computing for function SizeOfE_pt_tab_1 +[from] Done for function SizeOfE_pt_tab_1 +[from] Computing for function SizeOfE_pt_tab_2 +[from] Done for function SizeOfE_pt_tab_2 +[from] Computing for function SizeOfE_tab_1 +[from] Done for function SizeOfE_tab_1 +[from] Computing for function SizeOfE_tab_acces_1 +[from] Done for function SizeOfE_tab_acces_1 +[from] Computing for function SizeOf_1 +[from] Done for function SizeOf_1 +[from] Computing for function SizeOf_2 +[from] Done for function SizeOf_2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function SizeOfE_pt1: + \result FROM \nothing +[from] Function SizeOfE_pt2: + \result FROM \nothing +[from] Function SizeOfE_pt3: + \result FROM \nothing +[from] Function SizeOfE_pt_deref_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_2: + \result FROM \nothing +[from] Function SizeOfE_tab_1: + \result FROM \nothing +[from] Function SizeOfE_tab_acces_1: + \result FROM \nothing +[from] Function SizeOf_1: + \result FROM \nothing +[from] Function SizeOf_2: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function SizeOfE_pt3 +[pdg] done for function SizeOfE_pt3 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +unsigned int SizeOfE_pt3_slice_1(void) +{ + unsigned int __retres; + int i; + int *p; + __retres = sizeof(p + i); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.6.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.6.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.6.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.6.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,123 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/sizeof.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + st ∈ {0} +tests/slicing/sizeof.c:93:[value] Assertion got status valid. +[value] computing for function SizeOf_1 <- main. + Called from tests/slicing/sizeof.c:94. +[value] Recording results for SizeOf_1 +[value] Done for function SizeOf_1 +[value] computing for function SizeOf_2 <- main. + Called from tests/slicing/sizeof.c:95. +[value] Recording results for SizeOf_2 +[value] Done for function SizeOf_2 +[value] computing for function SizeOfE_pt1 <- main. + Called from tests/slicing/sizeof.c:96. +[value] Recording results for SizeOfE_pt1 +[value] Done for function SizeOfE_pt1 +[value] computing for function SizeOfE_pt2 <- main. + Called from tests/slicing/sizeof.c:97. +[value] Recording results for SizeOfE_pt2 +[value] Done for function SizeOfE_pt2 +[value] computing for function SizeOfE_pt3 <- main. + Called from tests/slicing/sizeof.c:98. +[value] Recording results for SizeOfE_pt3 +[value] Done for function SizeOfE_pt3 +[value] computing for function SizeOfE_pt_deref_1 <- main. + Called from tests/slicing/sizeof.c:99. +[value] Recording results for SizeOfE_pt_deref_1 +[value] Done for function SizeOfE_pt_deref_1 +[value] computing for function SizeOfE_tab_1 <- main. + Called from tests/slicing/sizeof.c:100. +[value] Recording results for SizeOfE_tab_1 +[value] Done for function SizeOfE_tab_1 +[value] computing for function SizeOfE_pt_tab_1 <- main. + Called from tests/slicing/sizeof.c:101. +[value] Recording results for SizeOfE_pt_tab_1 +[value] Done for function SizeOfE_pt_tab_1 +[value] computing for function SizeOfE_pt_tab_2 <- main. + Called from tests/slicing/sizeof.c:102. +[value] Recording results for SizeOfE_pt_tab_2 +[value] Done for function SizeOfE_pt_tab_2 +[value] computing for function SizeOfE_tab_acces_1 <- main. + Called from tests/slicing/sizeof.c:103. +[value] Recording results for SizeOfE_tab_acces_1 +[value] Done for function SizeOfE_tab_acces_1 +[value] Recording results for main +[value] done for function main +[from] Computing for function SizeOfE_pt1 +[from] Done for function SizeOfE_pt1 +[from] Computing for function SizeOfE_pt2 +[from] Done for function SizeOfE_pt2 +[from] Computing for function SizeOfE_pt3 +[from] Done for function SizeOfE_pt3 +[from] Computing for function SizeOfE_pt_deref_1 +[from] Done for function SizeOfE_pt_deref_1 +[from] Computing for function SizeOfE_pt_tab_1 +[from] Done for function SizeOfE_pt_tab_1 +[from] Computing for function SizeOfE_pt_tab_2 +[from] Done for function SizeOfE_pt_tab_2 +[from] Computing for function SizeOfE_tab_1 +[from] Done for function SizeOfE_tab_1 +[from] Computing for function SizeOfE_tab_acces_1 +[from] Done for function SizeOfE_tab_acces_1 +[from] Computing for function SizeOf_1 +[from] Done for function SizeOf_1 +[from] Computing for function SizeOf_2 +[from] Done for function SizeOf_2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function SizeOfE_pt1: + \result FROM \nothing +[from] Function SizeOfE_pt2: + \result FROM \nothing +[from] Function SizeOfE_pt3: + \result FROM \nothing +[from] Function SizeOfE_pt_deref_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_2: + \result FROM \nothing +[from] Function SizeOfE_tab_1: + \result FROM \nothing +[from] Function SizeOfE_tab_acces_1: + \result FROM \nothing +[from] Function SizeOf_1: + \result FROM \nothing +[from] Function SizeOf_2: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function SizeOfE_pt_deref_1 +[pdg] done for function SizeOfE_pt_deref_1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +unsigned int SizeOfE_pt_deref_1_slice_1(void) +{ + unsigned int __retres; + int i; + int *p; + __retres = sizeof(*(p + i)); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.7.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.7.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.7.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.7.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,122 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/sizeof.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + st ∈ {0} +tests/slicing/sizeof.c:93:[value] Assertion got status valid. +[value] computing for function SizeOf_1 <- main. + Called from tests/slicing/sizeof.c:94. +[value] Recording results for SizeOf_1 +[value] Done for function SizeOf_1 +[value] computing for function SizeOf_2 <- main. + Called from tests/slicing/sizeof.c:95. +[value] Recording results for SizeOf_2 +[value] Done for function SizeOf_2 +[value] computing for function SizeOfE_pt1 <- main. + Called from tests/slicing/sizeof.c:96. +[value] Recording results for SizeOfE_pt1 +[value] Done for function SizeOfE_pt1 +[value] computing for function SizeOfE_pt2 <- main. + Called from tests/slicing/sizeof.c:97. +[value] Recording results for SizeOfE_pt2 +[value] Done for function SizeOfE_pt2 +[value] computing for function SizeOfE_pt3 <- main. + Called from tests/slicing/sizeof.c:98. +[value] Recording results for SizeOfE_pt3 +[value] Done for function SizeOfE_pt3 +[value] computing for function SizeOfE_pt_deref_1 <- main. + Called from tests/slicing/sizeof.c:99. +[value] Recording results for SizeOfE_pt_deref_1 +[value] Done for function SizeOfE_pt_deref_1 +[value] computing for function SizeOfE_tab_1 <- main. + Called from tests/slicing/sizeof.c:100. +[value] Recording results for SizeOfE_tab_1 +[value] Done for function SizeOfE_tab_1 +[value] computing for function SizeOfE_pt_tab_1 <- main. + Called from tests/slicing/sizeof.c:101. +[value] Recording results for SizeOfE_pt_tab_1 +[value] Done for function SizeOfE_pt_tab_1 +[value] computing for function SizeOfE_pt_tab_2 <- main. + Called from tests/slicing/sizeof.c:102. +[value] Recording results for SizeOfE_pt_tab_2 +[value] Done for function SizeOfE_pt_tab_2 +[value] computing for function SizeOfE_tab_acces_1 <- main. + Called from tests/slicing/sizeof.c:103. +[value] Recording results for SizeOfE_tab_acces_1 +[value] Done for function SizeOfE_tab_acces_1 +[value] Recording results for main +[value] done for function main +[from] Computing for function SizeOfE_pt1 +[from] Done for function SizeOfE_pt1 +[from] Computing for function SizeOfE_pt2 +[from] Done for function SizeOfE_pt2 +[from] Computing for function SizeOfE_pt3 +[from] Done for function SizeOfE_pt3 +[from] Computing for function SizeOfE_pt_deref_1 +[from] Done for function SizeOfE_pt_deref_1 +[from] Computing for function SizeOfE_pt_tab_1 +[from] Done for function SizeOfE_pt_tab_1 +[from] Computing for function SizeOfE_pt_tab_2 +[from] Done for function SizeOfE_pt_tab_2 +[from] Computing for function SizeOfE_tab_1 +[from] Done for function SizeOfE_tab_1 +[from] Computing for function SizeOfE_tab_acces_1 +[from] Done for function SizeOfE_tab_acces_1 +[from] Computing for function SizeOf_1 +[from] Done for function SizeOf_1 +[from] Computing for function SizeOf_2 +[from] Done for function SizeOf_2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function SizeOfE_pt1: + \result FROM \nothing +[from] Function SizeOfE_pt2: + \result FROM \nothing +[from] Function SizeOfE_pt3: + \result FROM \nothing +[from] Function SizeOfE_pt_deref_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_2: + \result FROM \nothing +[from] Function SizeOfE_tab_1: + \result FROM \nothing +[from] Function SizeOfE_tab_acces_1: + \result FROM \nothing +[from] Function SizeOf_1: + \result FROM \nothing +[from] Function SizeOf_2: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function SizeOfE_tab_1 +[pdg] done for function SizeOfE_tab_1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +unsigned int SizeOfE_tab_1_slice_1(void) +{ + unsigned int __retres; + int tab[5]; + __retres = sizeof(tab); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.8.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.8.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.8.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.8.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,123 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/sizeof.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + st ∈ {0} +tests/slicing/sizeof.c:93:[value] Assertion got status valid. +[value] computing for function SizeOf_1 <- main. + Called from tests/slicing/sizeof.c:94. +[value] Recording results for SizeOf_1 +[value] Done for function SizeOf_1 +[value] computing for function SizeOf_2 <- main. + Called from tests/slicing/sizeof.c:95. +[value] Recording results for SizeOf_2 +[value] Done for function SizeOf_2 +[value] computing for function SizeOfE_pt1 <- main. + Called from tests/slicing/sizeof.c:96. +[value] Recording results for SizeOfE_pt1 +[value] Done for function SizeOfE_pt1 +[value] computing for function SizeOfE_pt2 <- main. + Called from tests/slicing/sizeof.c:97. +[value] Recording results for SizeOfE_pt2 +[value] Done for function SizeOfE_pt2 +[value] computing for function SizeOfE_pt3 <- main. + Called from tests/slicing/sizeof.c:98. +[value] Recording results for SizeOfE_pt3 +[value] Done for function SizeOfE_pt3 +[value] computing for function SizeOfE_pt_deref_1 <- main. + Called from tests/slicing/sizeof.c:99. +[value] Recording results for SizeOfE_pt_deref_1 +[value] Done for function SizeOfE_pt_deref_1 +[value] computing for function SizeOfE_tab_1 <- main. + Called from tests/slicing/sizeof.c:100. +[value] Recording results for SizeOfE_tab_1 +[value] Done for function SizeOfE_tab_1 +[value] computing for function SizeOfE_pt_tab_1 <- main. + Called from tests/slicing/sizeof.c:101. +[value] Recording results for SizeOfE_pt_tab_1 +[value] Done for function SizeOfE_pt_tab_1 +[value] computing for function SizeOfE_pt_tab_2 <- main. + Called from tests/slicing/sizeof.c:102. +[value] Recording results for SizeOfE_pt_tab_2 +[value] Done for function SizeOfE_pt_tab_2 +[value] computing for function SizeOfE_tab_acces_1 <- main. + Called from tests/slicing/sizeof.c:103. +[value] Recording results for SizeOfE_tab_acces_1 +[value] Done for function SizeOfE_tab_acces_1 +[value] Recording results for main +[value] done for function main +[from] Computing for function SizeOfE_pt1 +[from] Done for function SizeOfE_pt1 +[from] Computing for function SizeOfE_pt2 +[from] Done for function SizeOfE_pt2 +[from] Computing for function SizeOfE_pt3 +[from] Done for function SizeOfE_pt3 +[from] Computing for function SizeOfE_pt_deref_1 +[from] Done for function SizeOfE_pt_deref_1 +[from] Computing for function SizeOfE_pt_tab_1 +[from] Done for function SizeOfE_pt_tab_1 +[from] Computing for function SizeOfE_pt_tab_2 +[from] Done for function SizeOfE_pt_tab_2 +[from] Computing for function SizeOfE_tab_1 +[from] Done for function SizeOfE_tab_1 +[from] Computing for function SizeOfE_tab_acces_1 +[from] Done for function SizeOfE_tab_acces_1 +[from] Computing for function SizeOf_1 +[from] Done for function SizeOf_1 +[from] Computing for function SizeOf_2 +[from] Done for function SizeOf_2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function SizeOfE_pt1: + \result FROM \nothing +[from] Function SizeOfE_pt2: + \result FROM \nothing +[from] Function SizeOfE_pt3: + \result FROM \nothing +[from] Function SizeOfE_pt_deref_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_2: + \result FROM \nothing +[from] Function SizeOfE_tab_1: + \result FROM \nothing +[from] Function SizeOfE_tab_acces_1: + \result FROM \nothing +[from] Function SizeOf_1: + \result FROM \nothing +[from] Function SizeOf_2: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function SizeOfE_pt_tab_1 +[pdg] done for function SizeOfE_pt_tab_1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +unsigned int SizeOfE_pt_tab_1_slice_1(void) +{ + unsigned int __retres; + int i; + int tab[5]; + __retres = sizeof(& tab[i]); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.9.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.9.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.9.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.9.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,123 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/sizeof.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + st ∈ {0} +tests/slicing/sizeof.c:93:[value] Assertion got status valid. +[value] computing for function SizeOf_1 <- main. + Called from tests/slicing/sizeof.c:94. +[value] Recording results for SizeOf_1 +[value] Done for function SizeOf_1 +[value] computing for function SizeOf_2 <- main. + Called from tests/slicing/sizeof.c:95. +[value] Recording results for SizeOf_2 +[value] Done for function SizeOf_2 +[value] computing for function SizeOfE_pt1 <- main. + Called from tests/slicing/sizeof.c:96. +[value] Recording results for SizeOfE_pt1 +[value] Done for function SizeOfE_pt1 +[value] computing for function SizeOfE_pt2 <- main. + Called from tests/slicing/sizeof.c:97. +[value] Recording results for SizeOfE_pt2 +[value] Done for function SizeOfE_pt2 +[value] computing for function SizeOfE_pt3 <- main. + Called from tests/slicing/sizeof.c:98. +[value] Recording results for SizeOfE_pt3 +[value] Done for function SizeOfE_pt3 +[value] computing for function SizeOfE_pt_deref_1 <- main. + Called from tests/slicing/sizeof.c:99. +[value] Recording results for SizeOfE_pt_deref_1 +[value] Done for function SizeOfE_pt_deref_1 +[value] computing for function SizeOfE_tab_1 <- main. + Called from tests/slicing/sizeof.c:100. +[value] Recording results for SizeOfE_tab_1 +[value] Done for function SizeOfE_tab_1 +[value] computing for function SizeOfE_pt_tab_1 <- main. + Called from tests/slicing/sizeof.c:101. +[value] Recording results for SizeOfE_pt_tab_1 +[value] Done for function SizeOfE_pt_tab_1 +[value] computing for function SizeOfE_pt_tab_2 <- main. + Called from tests/slicing/sizeof.c:102. +[value] Recording results for SizeOfE_pt_tab_2 +[value] Done for function SizeOfE_pt_tab_2 +[value] computing for function SizeOfE_tab_acces_1 <- main. + Called from tests/slicing/sizeof.c:103. +[value] Recording results for SizeOfE_tab_acces_1 +[value] Done for function SizeOfE_tab_acces_1 +[value] Recording results for main +[value] done for function main +[from] Computing for function SizeOfE_pt1 +[from] Done for function SizeOfE_pt1 +[from] Computing for function SizeOfE_pt2 +[from] Done for function SizeOfE_pt2 +[from] Computing for function SizeOfE_pt3 +[from] Done for function SizeOfE_pt3 +[from] Computing for function SizeOfE_pt_deref_1 +[from] Done for function SizeOfE_pt_deref_1 +[from] Computing for function SizeOfE_pt_tab_1 +[from] Done for function SizeOfE_pt_tab_1 +[from] Computing for function SizeOfE_pt_tab_2 +[from] Done for function SizeOfE_pt_tab_2 +[from] Computing for function SizeOfE_tab_1 +[from] Done for function SizeOfE_tab_1 +[from] Computing for function SizeOfE_tab_acces_1 +[from] Done for function SizeOfE_tab_acces_1 +[from] Computing for function SizeOf_1 +[from] Done for function SizeOf_1 +[from] Computing for function SizeOf_2 +[from] Done for function SizeOf_2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function SizeOfE_pt1: + \result FROM \nothing +[from] Function SizeOfE_pt2: + \result FROM \nothing +[from] Function SizeOfE_pt3: + \result FROM \nothing +[from] Function SizeOfE_pt_deref_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_2: + \result FROM \nothing +[from] Function SizeOfE_tab_1: + \result FROM \nothing +[from] Function SizeOfE_tab_acces_1: + \result FROM \nothing +[from] Function SizeOf_1: + \result FROM \nothing +[from] Function SizeOf_2: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function SizeOfE_pt_tab_2 +[pdg] done for function SizeOfE_pt_tab_2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +unsigned int SizeOfE_pt_tab_2_slice_1(void) +{ + unsigned int __retres; + int i; + int tab[5]; + __retres = sizeof(& tab[i]); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/sizeof.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/sizeof.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,292 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/sizeof.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + st ∈ {0} +tests/slicing/sizeof.c:93:[value] Assertion got status valid. +[value] computing for function SizeOf_1 <- main. + Called from tests/slicing/sizeof.c:94. +[value] Recording results for SizeOf_1 +[value] Done for function SizeOf_1 +[value] computing for function SizeOf_2 <- main. + Called from tests/slicing/sizeof.c:95. +[value] Recording results for SizeOf_2 +[value] Done for function SizeOf_2 +[value] computing for function SizeOfE_pt1 <- main. + Called from tests/slicing/sizeof.c:96. +[value] Recording results for SizeOfE_pt1 +[value] Done for function SizeOfE_pt1 +[value] computing for function SizeOfE_pt2 <- main. + Called from tests/slicing/sizeof.c:97. +[value] Recording results for SizeOfE_pt2 +[value] Done for function SizeOfE_pt2 +[value] computing for function SizeOfE_pt3 <- main. + Called from tests/slicing/sizeof.c:98. +[value] Recording results for SizeOfE_pt3 +[value] Done for function SizeOfE_pt3 +[value] computing for function SizeOfE_pt_deref_1 <- main. + Called from tests/slicing/sizeof.c:99. +[value] Recording results for SizeOfE_pt_deref_1 +[value] Done for function SizeOfE_pt_deref_1 +[value] computing for function SizeOfE_tab_1 <- main. + Called from tests/slicing/sizeof.c:100. +[value] Recording results for SizeOfE_tab_1 +[value] Done for function SizeOfE_tab_1 +[value] computing for function SizeOfE_pt_tab_1 <- main. + Called from tests/slicing/sizeof.c:101. +[value] Recording results for SizeOfE_pt_tab_1 +[value] Done for function SizeOfE_pt_tab_1 +[value] computing for function SizeOfE_pt_tab_2 <- main. + Called from tests/slicing/sizeof.c:102. +[value] Recording results for SizeOfE_pt_tab_2 +[value] Done for function SizeOfE_pt_tab_2 +[value] computing for function SizeOfE_tab_acces_1 <- main. + Called from tests/slicing/sizeof.c:103. +[value] Recording results for SizeOfE_tab_acces_1 +[value] Done for function SizeOfE_tab_acces_1 +[value] Recording results for main +[value] done for function main +[from] Computing for function SizeOfE_pt1 +[from] Done for function SizeOfE_pt1 +[from] Computing for function SizeOfE_pt2 +[from] Done for function SizeOfE_pt2 +[from] Computing for function SizeOfE_pt3 +[from] Done for function SizeOfE_pt3 +[from] Computing for function SizeOfE_pt_deref_1 +[from] Done for function SizeOfE_pt_deref_1 +[from] Computing for function SizeOfE_pt_tab_1 +[from] Done for function SizeOfE_pt_tab_1 +[from] Computing for function SizeOfE_pt_tab_2 +[from] Done for function SizeOfE_pt_tab_2 +[from] Computing for function SizeOfE_tab_1 +[from] Done for function SizeOfE_tab_1 +[from] Computing for function SizeOfE_tab_acces_1 +[from] Done for function SizeOfE_tab_acces_1 +[from] Computing for function SizeOf_1 +[from] Done for function SizeOf_1 +[from] Computing for function SizeOf_2 +[from] Done for function SizeOf_2 +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function SizeOfE_pt1: + \result FROM \nothing +[from] Function SizeOfE_pt2: + \result FROM \nothing +[from] Function SizeOfE_pt3: + \result FROM \nothing +[from] Function SizeOfE_pt_deref_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_1: + \result FROM \nothing +[from] Function SizeOfE_pt_tab_2: + \result FROM \nothing +[from] Function SizeOfE_tab_1: + \result FROM \nothing +[from] Function SizeOfE_tab_acces_1: + \result FROM \nothing +[from] Function SizeOf_1: + \result FROM \nothing +[from] Function SizeOf_2: + \result FROM \nothing +[from] Function main: + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function SizeOfE_tab_acces_1 +[pdg] done for function SizeOfE_tab_acces_1 +[pdg] computing for function SizeOfE_pt_tab_2 +[pdg] done for function SizeOfE_pt_tab_2 +[pdg] computing for function SizeOfE_pt_tab_1 +[pdg] done for function SizeOfE_pt_tab_1 +[pdg] computing for function SizeOfE_tab_1 +[pdg] done for function SizeOfE_tab_1 +[pdg] computing for function SizeOfE_pt_deref_1 +[pdg] done for function SizeOfE_pt_deref_1 +[pdg] computing for function SizeOfE_pt3 +[pdg] done for function SizeOfE_pt3 +[pdg] computing for function SizeOfE_pt2 +[pdg] done for function SizeOfE_pt2 +[pdg] computing for function SizeOfE_pt1 +[pdg] done for function SizeOfE_pt1 +[pdg] computing for function SizeOf_2 +[pdg] done for function SizeOf_2 +[pdg] computing for function SizeOf_1 +[pdg] done for function SizeOf_1 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct St { + int i ; + int *p ; + int tab[5] ; +}; +unsigned int SizeOf_1_slice_1(void) +{ + unsigned int __retres; + __retres = sizeof(int *); + return __retres; +} + +unsigned int SizeOf_2_slice_1(void) +{ + unsigned int __retres; + __retres = sizeof(struct St); + return __retres; +} + +unsigned int SizeOfE_pt1_slice_1(void) +{ + unsigned int __retres; + int x; + __retres = sizeof(& x); + return __retres; +} + +unsigned int SizeOfE_pt2_slice_1(void) +{ + unsigned int __retres; + int *p; + __retres = sizeof(p); + return __retres; +} + +unsigned int SizeOfE_pt3_slice_1(void) +{ + unsigned int __retres; + int i; + int *p; + __retres = sizeof(p + i); + return __retres; +} + +unsigned int SizeOfE_pt_deref_1_slice_1(void) +{ + unsigned int __retres; + int i; + int *p; + __retres = sizeof(*(p + i)); + return __retres; +} + +unsigned int SizeOfE_tab_1_slice_1(void) +{ + unsigned int __retres; + int tab[5]; + __retres = sizeof(tab); + return __retres; +} + +unsigned int SizeOfE_pt_tab_1_slice_1(void) +{ + unsigned int __retres; + int i; + int tab[5]; + __retres = sizeof(& tab[i]); + return __retres; +} + +unsigned int SizeOfE_pt_tab_2_slice_1(void) +{ + unsigned int __retres; + int i; + int tab[5]; + __retres = sizeof(& tab[i]); + return __retres; +} + +unsigned int SizeOfE_tab_acces_1_slice_1(void) +{ + unsigned int __retres; + int i; + int tab[5]; + __retres = sizeof(tab[i]); + return __retres; +} + +int main(void) +{ + int r; + unsigned int tmp; + unsigned int tmp_0; + unsigned int tmp_1; + unsigned int tmp_2; + unsigned int tmp_3; + unsigned int tmp_4; + unsigned int tmp_5; + unsigned int tmp_6; + unsigned int tmp_7; + unsigned int tmp_8; + r = 0; + r = (int)((unsigned int)r + sizeof(struct St)); + /*@ assert r ≢ 0; */ ; + { + /*sequence*/ + tmp = SizeOf_1_slice_1(); + r = (int)((unsigned int)r + tmp); + } + { + /*sequence*/ + tmp_0 = SizeOf_2_slice_1(); + r = (int)((unsigned int)r + tmp_0); + } + { + /*sequence*/ + tmp_1 = SizeOfE_pt1_slice_1(); + r = (int)((unsigned int)r + tmp_1); + } + { + /*sequence*/ + tmp_2 = SizeOfE_pt2_slice_1(); + r = (int)((unsigned int)r + tmp_2); + } + { + /*sequence*/ + tmp_3 = SizeOfE_pt3_slice_1(); + r = (int)((unsigned int)r + tmp_3); + } + { + /*sequence*/ + tmp_4 = SizeOfE_pt_deref_1_slice_1(); + r = (int)((unsigned int)r + tmp_4); + } + { + /*sequence*/ + tmp_5 = SizeOfE_tab_1_slice_1(); + r = (int)((unsigned int)r + tmp_5); + } + { + /*sequence*/ + tmp_6 = SizeOfE_pt_tab_1_slice_1(); + r = (int)((unsigned int)r + tmp_6); + } + { + /*sequence*/ + tmp_7 = SizeOfE_pt_tab_2_slice_1(); + r = (int)((unsigned int)r + tmp_7); + } + { + /*sequence*/ + tmp_8 = SizeOfE_tab_acces_1_slice_1(); + r = (int)((unsigned int)r + tmp_8); + } + /*@ slice pragma expr r; */ ; + return r; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_behavior.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_behavior.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_behavior.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_behavior.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,57 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_behavior.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main. + Called from tests/slicing/slice_behavior.c:12. +tests/slicing/slice_behavior.c:4:[value] Function f: precondition got status valid. +tests/slicing/slice_behavior.c:7:[value] Assertion got status valid. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + b ∈ {20} + __retres ∈ {42} +[value] Values at end of function main: + __retres ∈ {0} +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[pdg] done for function main +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +/*@ requires a > 0; */ +void f_slice_1(int a) +{ + int b; + b = 2 * a; + /*@ assert a < b; */ ; + return; +} + +void main(void) +{ + f_slice_1(10); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_no_body.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_no_body.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_no_body.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_no_body.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,304 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_no_body.c (with preprocessing) +[value] Analyzing an incomplete application starting at h +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ [--..--] +[value] computing for function f <- h. + Called from tests/slicing/slice_no_body.c:21. +tests/slicing/slice_no_body.c:21:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] using specification for function f +[value] Done for function f +[value] computing for function f <- h. + Called from tests/slicing/slice_no_body.c:22. +[value] Done for function f +[value] computing for function f <- h. + Called from tests/slicing/slice_no_body.c:23. +[value] Done for function f +[value] computing for function f <- h. + Called from tests/slicing/slice_no_body.c:24. +[value] Done for function f +[value] computing for function g <- h. + Called from tests/slicing/slice_no_body.c:26. +tests/slicing/slice_no_body.c:12:[kernel] warning: signed overflow. assert c+1 ≤ 2147483647; +tests/slicing/slice_no_body.c:13:[kernel] warning: signed overflow. assert -2147483648 ≤ c*2 ≤ 2147483647; +[value] computing for function f <- g <- h. + Called from tests/slicing/slice_no_body.c:15. +[value] Done for function f +[value] Recording results for g +[value] Done for function g +[value] Recording results for h +[value] done for function h +[from] Computing for function g +[from] Computing for function f <-g +[from] Done for function f +[from] Done for function g +[from] Computing for function h +[from] Done for function h +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM a +[from] Function g: + \result FROM c +[from] Function h: + G FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[slicing] making slicing project 'slicing_1'... +[pdg] computing for function h +[pdg] done for function h +[pdg] computing for function g +[pdg] done for function g +int G; +/*@ assigns \result; + assigns \result \from a; */ +extern int f(int a); + +Print slice = g_slice_1: + +/**/int g(/* <[---], [---]> */ int c) +{ + /* <[---], [---]> */ int __retres; + /* <[---], [---]> */ int x; + /* <[---], [---]> */ int y; + /*@ assert Value: signed_overflow: c+1 ≤ 2147483647; */ + /* <[---], [---]> */ + x = c + 1; + /*@ assert Value: signed_overflow: c*2 ≤ 2147483647; */ + /*@ assert Value: signed_overflow: -2147483648 ≤ c*2; */ + /* <[---], [---]> */ + y = c * 2; + /* <[---], [---]> */ + if (c == 0) { + /* <[---], [---]> */ int tmp; + /* invisible call */ /* <[---], [---]> */ + tmp = f(x); + /* <[---], [---]> */ + __retres = tmp; + /* <[---], [---]> */ + goto return_label; + } + else { + /* <[---], [---]> */ + __retres = y; + /* <[---], [---]> */ + goto return_label; + } + /* <[---], [---]> */ return_label: /* <[---], [---]> */ + return __retres; +} + +Print slice = h_slice_1: + +/**/int h(void) +{ + /* <[---], [---]> */ int __retres; + /* <[---], [---]> */ int a; + /* <[---], [---]> */ int b; + /* <[---], [---]> */ int c; + /* invisible call */ /* <[---], [---]> */ + a = f(1); + /* invisible call */ /* <[---], [---]> */ + b = f(2); + /* invisible call */ /* <[---], [---]> */ + c = f(3); + /* invisible call */ /* <[---], [---]> */ + G = f(4); + /* <[---], [---]> */ + if (G > 0) { + /* invisible call */ /* <[---], [---]> */ + G = g(c); + } + /* <[---], [---]> */ + __retres = (int)(& g); + /* <[---], [---]> */ + return __retres; +} + +Slicing project worklist [default/slicing_1] = +[h_slice_1 = change_call for call 18 -> g_slice_1][g_slice_1 = change_call for call 7 -> (src:f)][h_slice_1 = change_call for call 15 -> (src:f)][h_slice_1 = change_call for call 14 -> (src:f)][h_slice_1 = change_call for call 13 -> (src:f)][h_slice_1 = change_call for call 12 -> (src:f)] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 6 actions... +[slicing] applying actions: 1/6... +[slicing] applying actions: 2/6... +[slicing] applying actions: 3/6... +[slicing] applying actions: 4/6... +[slicing] applying actions: 5/6... +[slicing] applying actions: 6/6... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int G; +extern int f(int a); + +void g_slice_1(int c) +{ + int x; + x = c + 1; + if (c == 0) { + int tmp; + tmp = f(x); + } + return; +} + +void h(void) +{ + int a; + int b; + int c; + a = f(1); + b = f(2); + c = f(3); + G = f(4); + if (G > 0) g_slice_1(c); + return; +} + + +[slicing] making slicing project 'slicing_2'... +[slicing] applying all slicing requests... +[slicing] applying 6 actions... +[slicing] applying actions: 1/6... +[slicing] applying actions: 2/6... +[slicing] applying actions: 3/6... +[slicing] applying actions: 4/6... +[slicing] applying actions: 5/6... +[slicing] applying actions: 6/6... +int G; +/*@ assigns \result; + assigns \result \from a; */ +extern int f(int a); + +Print slice = g_slice_1: (InCtrl: <[---], [ S ]>) + (In1: <[---], [ S ]>) + +/**/int g(/* <[---], [ S ]> */ int c) +{ + /* <[---], [---]> */ int __retres; + /* <[---], [ S ]> */ int x; + /* <[---], [---]> */ int y; + /*@ assert Value: signed_overflow: c+1 ≤ 2147483647; */ + /* <[---], [ S ]> */ + x = c + 1; + /*@ assert Value: signed_overflow: c*2 ≤ 2147483647; */ + /*@ assert Value: signed_overflow: -2147483648 ≤ c*2; */ + /* <[---], [---]> */ + y = c * 2; + /* <[---], [ S ]> */ + if (c == 0) { + /* <[---], [ S ]> */ int tmp; + /* sig call: + (InCtrl: <[---], [ S ]>) + (In1: <[---], [ S ]>) + (OutRet: <[---], [ S ]>) */ + /* call to source function */ + /* <[---], [ S ]> */ + tmp = f(x); + /* <[---], [---]> */ + __retres = tmp; + /* <[---], [---]> */ + goto return_label; + } + else { + /* <[---], [---]> */ + __retres = y; + /* <[---], [---]> */ + goto return_label; + } + /* <[---], [---]> */ return_label: /* <[---], [---]> */ + return __retres; +} + +Print slice = h_slice_1: (InCtrl: <[---], [ S ]>) + +/**/int h(void) +{ + /* <[---], [---]> */ int __retres; + /* <[---], [ S ]> */ int a; + /* <[---], [ S ]> */ int b; + /* <[---], [ S ]> */ int c; + /* sig call: + (InCtrl: <[---], [ S ]>) + (In1: <[---], [ S ]>) + (OutRet: <[---], [ S ]>) */ + /* call to source function */ + /* <[---], [ S ]> */ + a = f(1); + /* sig call: + (InCtrl: <[---], [ S ]>) + (In1: <[---], [ S ]>) + (OutRet: <[---], [ S ]>) */ + /* call to source function */ + /* <[---], [ S ]> */ + b = f(2); + /* sig call: + (InCtrl: <[---], [ S ]>) + (In1: <[---], [ S ]>) + (OutRet: <[---], [ S ]>) */ + /* call to source function */ + /* <[---], [ S ]> */ + c = f(3); + /* sig call: + (InCtrl: <[---], [ S ]>) + (In1: <[---], [ S ]>) + (OutRet: <[---], [ S ]>) */ + /* call to source function */ + /* <[---], [ S ]> */ + G = f(4); + /* <[---], [ S ]> */ + if (G > 0) { + /* sig call: (InCtrl: <[---], [ S ]>) + (In1: <[---], [ S ]>) */ + /* call to g_slice_1: (InCtrl: <[---], [ S ]>) + (In1: <[---], [ S ]>) */ + /* <[---], [ S ]> */ + G = g(c); + } + /* <[---], [---]> */ + __retres = (int)(& g); + /* <[---], [---]> */ + return __retres; +} + +Slicing project worklist [default/slicing_2] = + + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +int G; +extern int f(int a); + +void g_slice_1(int c) +{ + int x; + x = c + 1; + if (c == 0) { + int tmp; + tmp = f(x); + } + return; +} + +void h(void) +{ + int a; + int b; + int c; + a = f(1); + b = f(2); + c = f(3); + G = f(4); + if (G > 0) g_slice_1(c); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.10.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.10.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.10.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.10.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at double_effect2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for double_effect2 +[value] done for function double_effect2 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function double_effect2 +[pdg] done for function double_effect2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int x; +int y; +void double_effect2(void) +{ + /*@ slice pragma stmt; */ + { + int tmp; + { + /*sequence*/ + tmp = y; + y ++; + x += tmp; + } + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.11.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.11.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.11.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.11.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,42 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at double_effect3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for double_effect3 +[value] done for function double_effect3 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function double_effect3 +[pdg] done for function double_effect3 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int x; +int y; +void double_effect3(void) +{ + int tmp; + /*@ slice pragma stmt; */ + { + /*sequence*/ + tmp = y; + y ++; + x += tmp; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.12.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.12.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.12.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.12.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at double_effect4 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for double_effect4 +[value] done for function double_effect4 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function double_effect4 +[pdg] done for function double_effect4 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int x; +int y; +void double_effect4(void) +{ + /*@ slice pragma stmt; */ + { + int tmp; + { + /*sequence*/ + tmp = y; + y ++; + x += tmp; + } + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.13.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.13.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.13.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.13.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,46 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at double_effect5 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for double_effect5 +[value] done for function double_effect5 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function double_effect5 +[pdg] done for function double_effect5 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int x; +int y; +void double_effect5(int c2) +{ + if (c2) { + /*@ slice pragma stmt; */ + { + int tmp; + { + /*sequence*/ + tmp = y; + y ++; + x += tmp; + } + } + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.14.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.14.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.14.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.14.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,36 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at test1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for test1 +[value] done for function test1 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function test1 +[pdg] done for function test1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int x; +void test1(int c1, int c2) +{ + if (c1 < c2) c1 = c2; + /*@ slice pragma stmt; */ + x = c1; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.15.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.15.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.15.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.15.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,36 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at test2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for test2 +[value] done for function test2 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function test2 +[pdg] done for function test2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int x; +void test2(int c1, int c2) +{ + if (c1 < c2) c1 = c2; + /*@ slice pragma stmt; */ + x = c1; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.16.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.16.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.16.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.16.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,36 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at test3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for test3 +[value] done for function test3 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function test3 +[pdg] done for function test3 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int x; +void test3(int c1, int c2) +{ + if (c1 < c2) c1 = c2; + /*@ slice pragma stmt; */ + x = c1; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.17.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.17.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.17.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.17.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,40 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at test4 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +tests/slicing/slice_pragma_stmt.c:120:[kernel] warning: signed overflow. assert c2+1 ≤ 2147483647; +[value] Recording results for test4 +[value] done for function test4 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function test4 +[pdg] done for function test4 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int x; +void test4(int c1, int c2) +{ + if (c1 < c2) c1 = c2; + /*@ slice pragma stmt; */ + { + x = c1; + c2 ++; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.18.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.18.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.18.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.18.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,37 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at test5 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for test5 +[value] done for function test5 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function test5 +[pdg] done for function test5 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int x; +void test5(int c1, int c2) +{ + if (c1 < c2) goto L; + c1 = c2; + L: /*@ slice pragma stmt; */ + x = c1; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.19.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.19.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.19.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.19.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at test6 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +tests/slicing/slice_pragma_stmt.c:136:[kernel] warning: signed overflow. assert c1+1 ≤ 2147483647; +[value] Recording results for test6 +[value] done for function test6 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function test6 +[pdg] done for function test6 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int x; +void test6(int c1, int c2) +{ + int tmp; + if (c1 < c2) goto L; + c1 = c2; + L: /*@ slice pragma stmt; */ + { + /*sequence*/ + tmp = c1; + c1 ++; + x = tmp; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at nop1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for nop1 +[value] done for function nop1 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function nop1 +[pdg] done for function nop1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void nop1(void) +{ + /*@ slice pragma stmt; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.20.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.20.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.20.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.20.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at test7 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +tests/slicing/slice_pragma_stmt.c:144:[kernel] warning: signed overflow. assert c1+1 ≤ 2147483647; +tests/slicing/slice_pragma_stmt.c:144:[kernel] warning: signed overflow. assert c2+1 ≤ 2147483647; +[value] Recording results for test7 +[value] done for function test7 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function test7 +[pdg] done for function test7 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int x; +void test7(int c1, int c2) +{ + if (c1 < c2) goto L; + c1 = c2; + L: + /*@ slice pragma stmt; */ + { + int tmp; + { + /*sequence*/ + tmp = c1; + c1 ++; + x = tmp; + } + c2 ++; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.21.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.21.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.21.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.21.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,48 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at test8 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +tests/slicing/slice_pragma_stmt.c:152:[kernel] warning: signed overflow. assert c1+1 ≤ 2147483647; +tests/slicing/slice_pragma_stmt.c:152:[kernel] warning: signed overflow. assert c2+1 ≤ 2147483647; +[value] Recording results for test8 +[value] done for function test8 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function test8 +[pdg] done for function test8 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int x; +void test8(int c1, int c2) +{ + if (c1 < c2) goto L; + c1 = c2; + /*@ slice pragma stmt; */ + { + int tmp; + L: { + /*sequence*/ + tmp = c1; + c1 ++; + x = tmp; + } + c2 ++; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.22.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.22.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.22.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.22.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at test9 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +tests/slicing/slice_pragma_stmt.c:160:[kernel] warning: signed overflow. assert c2+1 ≤ 2147483647; +[value] Recording results for test9 +[value] done for function test9 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function test9 +[pdg] done for function test9 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int x; +void test9(int c1, int c2) +{ + if (c1 < c2) goto L; + c1 = c2; + /*@ slice pragma stmt; */ + { + x = c1; + L: c2 ++; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at nop2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for nop2 +[value] done for function nop2 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function nop2 +[pdg] done for function nop2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void nop2(void) +{ + /*@ slice pragma stmt; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.3.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at nop3 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for nop3 +[value] done for function nop3 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function nop3 +[pdg] done for function nop3 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void nop3(void) +{ + /*@ slice pragma stmt; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.4.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at nop4 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for nop4 +[value] done for function nop4 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function nop4 +[pdg] done for function nop4 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void nop4(int c1) +{ + /*@ slice pragma stmt; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.5.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.5.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.5.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.5.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at nop5 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for nop5 +[value] done for function nop5 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function nop5 +[pdg] done for function nop5 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void nop5(void) +{ + /*@ slice pragma stmt; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.6.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.6.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.6.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.6.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at nop6 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for nop6 +[value] done for function nop6 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function nop6 +[pdg] done for function nop6 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void nop6(void) +{ + /*@ slice pragma stmt; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.7.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.7.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.7.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.7.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at nop7 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for nop7 +[value] done for function nop7 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function nop7 +[pdg] done for function nop7 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void nop7(void) +{ + /*@ slice pragma stmt; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.8.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.8.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.8.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.8.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at nop8 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for nop8 +[value] done for function nop8 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function nop8 +[pdg] done for function nop8 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void nop8(void) +{ + /*@ slice pragma stmt; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.9.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.9.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.9.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.9.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,42 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at double_effect1 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} +[value] Recording results for double_effect1 +[value] done for function double_effect1 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function double_effect1 +[pdg] done for function double_effect1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int x; +int y; +void double_effect1(void) +{ + int tmp; + /*@ slice pragma stmt; */ + { + /*sequence*/ + tmp = y; + y ++; + x += tmp; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/slice_pragma_stmt.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/slice_pragma_stmt.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,257 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/slice_pragma_stmt.c (with preprocessing) +/* Generated by Frama-C */ +int x; +int y; +void nop1(int c1, int c2) +{ + /*@ slice pragma stmt; */ ; + x = 1; + return; +} + +void nop2(int c1, int c2) +{ + /*@ slice pragma stmt; */ ; + x = 1; + return; +} + +void nop3(int c1, int c2) +{ + /*@ slice pragma stmt; */ ; + x = 1; + return; +} + +void nop4(int c1, int c2) +{ + /*@ slice pragma stmt; */ + if (c1) ; + x = 1; + return; +} + +void nop5(int c1, int c2) +{ + if (c2) goto L; + L: /*@ slice pragma stmt; */ ; + x = 1; + return; +} + +void nop6(int c1, int c2) +{ + L: /*@ slice pragma stmt; */ ; + x = 1; + return; +} + +void nop7(int c1, int c2) +{ + L: /*@ slice pragma stmt; */ ; + x = 1; + return; +} + +void nop8(int c1, int c2) +{ + /*@ slice pragma stmt; */ + L: ; + x = 1; + return; +} + +void double_effect1(int c1, int c2) +{ + int tmp; + /*@ slice pragma stmt; */ + { + /*sequence*/ + tmp = y; + y ++; + x += tmp; + } + return; +} + +void double_effect2(int c1, int c2) +{ + /*@ slice pragma stmt; */ + { + int tmp; + { + /*sequence*/ + tmp = y; + y ++; + x += tmp; + } + } + return; +} + +void double_effect3(int c1, int c2) +{ + int tmp; + if (c2) goto L; + L: /*@ slice pragma stmt; */ + { + /*sequence*/ + tmp = y; + y ++; + x += tmp; + } + return; +} + +void double_effect4(int c1, int c2) +{ + if (c2) goto L; + L: + /*@ slice pragma stmt; */ + { + int tmp; + { + /*sequence*/ + tmp = y; + y ++; + x += tmp; + } + } + return; +} + +void double_effect5(int c1, int c2) +{ + if (c2) { + /*@ slice pragma stmt; */ + { + int tmp; + { + /*sequence*/ + tmp = y; + y ++; + x += tmp; + } + } + } + return; +} + +void test1(int c1, int c2) +{ + if (c1 < c2) c1 = c2; + /*@ slice pragma stmt; */ + x = c1; + return; +} + +void test2(int c1, int c2) +{ + if (c1 < c2) c1 = c2; + /*@ slice pragma stmt; */ + x = c1; + y = c2; + return; +} + +void test3(int c1, int c2) +{ + if (c1 < c2) c1 = c2; + /*@ slice pragma stmt; */ + x = c1; + y = c2; + return; +} + +void test4(int c1, int c2) +{ + if (c1 < c2) c1 = c2; + /*@ slice pragma stmt; */ + { + x = c1; + c2 ++; + } + y = c2; + return; +} + +void test5(int c1, int c2) +{ + if (c1 < c2) goto L; + c1 = c2; + L: /*@ slice pragma stmt; */ + x = c1; + y = c2; + return; +} + +void test6(int c1, int c2) +{ + int tmp; + if (c1 < c2) goto L; + c1 = c2; + L: /*@ slice pragma stmt; */ + { + /*sequence*/ + tmp = c1; + c1 ++; + x = tmp; + } + y = c2; + return; +} + +void test7(int c1, int c2) +{ + if (c1 < c2) goto L; + c1 = c2; + L: + /*@ slice pragma stmt; */ + { + int tmp; + { + /*sequence*/ + tmp = c1; + c1 ++; + x = tmp; + } + c2 ++; + } + y = c2; + return; +} + +void test8(int c1, int c2) +{ + if (c1 < c2) goto L; + c1 = c2; + /*@ slice pragma stmt; */ + { + int tmp; + L: { + /*sequence*/ + tmp = c1; + c1 ++; + x = tmp; + } + c2 ++; + } + y = c2; + return; +} + +void test9(int c1, int c2) +{ + if (c1 < c2) goto L; + c1 = c2; + /*@ slice pragma stmt; */ + { + x = c1; + L: c2 ++; + } + y = c2; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/switch.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/switch.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/switch.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/switch.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,93 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/switch.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + \result FROM choix +[from] ====== END OF DEPENDENCIES ====== +[slicing] making slicing project 'slicing_1'... +[pdg] computing for function main +[pdg] done for function main +Slicing project worklist [default/slicing_1] = +[main_slice_1 = (n:7(restrict to x) ,<[--d], [---]>)(n:14(restrict to +x) ,<[--d], [---]>)(n:15(restrict to x) ,<[--d], [---]>)] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +void main(char choix) +{ + int x; + x = 0; + switch ((int)choix) { + case 'a': x = 1; + break; + case 'b': x = 2; + break; + case 'c': case 'd': ; + } + return; +} + + +[slicing] making slicing project 'slicing_2'... +Slicing project worklist [default/slicing_2] = +[main_slice_1 = (n:8(restrict to y) ,<[--d], [---]>)(n:16(restrict to +y) ,<[--d], [---]>)(n:18(restrict to y) ,<[--d], [---]>)] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +void main(char choix) +{ + int y; + y = 0; + switch ((int)choix) { + case 'a': ; + break; + case 'b': ; + y = 1; + break; + case 'c': case 'd': y = 2; + } + return; +} + + +[slicing] making slicing project 'slicing_3'... +Slicing project worklist [default/slicing_3] = +[main_slice_1 = (n:21(restrict to z) ,<[--d], [---]>)] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +void main(void) +{ + int z; + z = 0; + z ++; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/top.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/top.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/top.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/top.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,58 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/top.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/top.c:27:[kernel] warning: out of bounds read. assert \valid_read(p_str+i); +[value] computing for function strlen <- main. + Called from tests/slicing/top.c:27. +tests/slicing/top.c:21:[value] entering loop for the first time +tests/slicing/top.c:21:[kernel] warning: out of bounds read. assert \valid_read(q); +tests/slicing/top.c:21:[kernel] warning: signed overflow. assert k+1 ≤ 2147483647; +[value] Recording results for strlen +[value] Done for function strlen +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function strlen +[from] Done for function strlen +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function strlen +[pdg] done for function strlen +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int strlen_slice_1(char *p) +{ + char *q; + int k; + k = 0; + q = p; + while (*q) { + k ++; + q ++; + } + return k; +} + +int main(char **p_str, int i) +{ + int tmp; + tmp = strlen_slice_1(*(p_str + i)); + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/top2.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/top2.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/top2.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/top2.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,56 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/top2.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + tab[0] ∈ {0} + [1] ∈ {7} + G ∈ {0} + X ∈ {0} + S ∈ {0} +[value] computing for function f <- main. + Called from tests/slicing/top2.c:24. +tests/slicing/top2.c:16:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. assert 0 ≤ i < 2; +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f +[pdg] done for function f +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int tab[2] = {0, 7}; +int f_slice_1(void) +{ + int volatile i; + int v; + i = 0; + v = tab[i]; + return v; +} + +int main(void) +{ + int x; + x = f_slice_1(); + return x; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/top.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/top.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/top.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/top.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,57 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/top.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/top.c:27:[kernel] warning: out of bounds read. assert \valid_read(p_str+i); +[value] computing for function strlen <- main. + Called from tests/slicing/top.c:27. +tests/slicing/top.c:21:[value] entering loop for the first time +tests/slicing/top.c:21:[kernel] warning: out of bounds read. assert \valid_read(q); +tests/slicing/top.c:21:[kernel] warning: signed overflow. assert k+1 ≤ 2147483647; +[value] Recording results for strlen +[value] Done for function strlen +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function strlen +[pdg] done for function strlen +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[from] Computing for function strlen +[from] Done for function strlen +[pdg] done for function main +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int strlen_slice_1(char *p) +{ + char *q; + int k; + k = 0; + q = p; + while (*q) { + k ++; + q ++; + } + return k; +} + +void main(char **p_str, int i) +{ + strlen_slice_1(*(p_str + i)); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/top2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/top2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/top2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/top2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,55 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/top2.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + tab[0] ∈ {0} + [1] ∈ {7} + G ∈ {0} + X ∈ {0} + S ∈ {0} +[value] computing for function f <- main. + Called from tests/slicing/top2.c:24. +tests/slicing/top2.c:16:[kernel] warning: accessing out of bounds index [-2147483648..2147483647]. assert 0 ≤ i < 2; +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f +[pdg] done for function f +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int X; +void f_slice_1(void) +{ + G = X; + return; +} + +void main(void) +{ + f_slice_1(); + G ++; + /*@ slice pragma expr G; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/top.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/top.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/top.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/top.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,36 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/top.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/top.c:27:[kernel] warning: out of bounds read. assert \valid_read(p_str+i); +[value] computing for function strlen <- main. + Called from tests/slicing/top.c:27. +tests/slicing/top.c:21:[value] entering loop for the first time +tests/slicing/top.c:21:[kernel] warning: out of bounds read. assert \valid_read(q); +tests/slicing/top.c:21:[kernel] warning: signed overflow. assert k+1 ≤ 2147483647; +[value] Recording results for strlen +[value] Done for function strlen +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[slicing] Nothing to select for an unreachable stmt of uncalled +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function uncalled +[pdg] warning: unreachable entry point (sid:2, function uncalled) +[pdg] Bottom for function uncalled +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/undef-fun.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/undef-fun.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/undef-fun.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/undef-fun.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,45 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/undef-fun.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} +tests/slicing/undef-fun.c:16:[kernel] warning: signed overflow. assert x+1 ≤ 2147483647; +tests/slicing/undef-fun.c:17:[kernel] warning: signed overflow. assert y+2 ≤ 2147483647; +[value] computing for function f <- main. + Called from tests/slicing/undef-fun.c:18. +[value] using specification for function f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f +[from] Computing for function f +[from] Done for function f +[pdg] done for function f +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[pdg] done for function main +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int f_slice_1(int a); + +void main(int x) +{ + x ++; + f_slice_1(x); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unitialized.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unitialized.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unitialized.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unitialized.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,69 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unitialized.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X1 ∈ {0} + X2 ∈ {0} +[value] computing for function f1 <- main. + Called from tests/slicing/unitialized.c:35. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/unitialized.c:36. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function g <- main. + Called from tests/slicing/unitialized.c:37. +tests/slicing/unitialized.c:27:[kernel] warning: accessing uninitialized left-value: assert \initialized(&y); +tests/slicing/unitialized.c:27:[value] completely invalid value in evaluation of + argument y +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +tests/slicing/unitialized.c:27:[value] Assertion 'Value,initialisation' got final status invalid. +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function g +[from] Computing for function printf +[from] Done for function printf +tests/slicing/unitialized.c:30:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function g +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function g +tests/slicing/unitialized.c:27:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Non-terminating function g (no dependencies) +[from] Done for function g +tests/slicing/unitialized.c:40:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void g_slice_1(void) +{ + int y; + return; +} + +void main(void) +{ + g_slice_1(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unitialized.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unitialized.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unitialized.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unitialized.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,60 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unitialized.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X1 ∈ {0} + X2 ∈ {0} +[value] computing for function f1 <- main. + Called from tests/slicing/unitialized.c:35. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/unitialized.c:36. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function g <- main. + Called from tests/slicing/unitialized.c:37. +tests/slicing/unitialized.c:27:[kernel] warning: accessing uninitialized left-value: assert \initialized(&y); +tests/slicing/unitialized.c:27:[value] completely invalid value in evaluation of + argument y +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +tests/slicing/unitialized.c:27:[value] Assertion 'Value,initialisation' got final status invalid. +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function g +[from] Computing for function printf <-g +[from] Done for function printf +tests/slicing/unitialized.c:27:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Non-terminating function g (no dependencies) +[from] Done for function g +tests/slicing/unitialized.c:40:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void main(void) +{ + int r; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unitialized.3.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unitialized.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unitialized.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unitialized.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,69 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unitialized.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X1 ∈ {0} + X2 ∈ {0} +[value] computing for function f1 <- main. + Called from tests/slicing/unitialized.c:35. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/unitialized.c:36. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function g <- main. + Called from tests/slicing/unitialized.c:37. +tests/slicing/unitialized.c:27:[kernel] warning: accessing uninitialized left-value: assert \initialized(&y); +tests/slicing/unitialized.c:27:[value] completely invalid value in evaluation of + argument y +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +tests/slicing/unitialized.c:27:[value] Assertion 'Value,initialisation' got final status invalid. +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[slicing] Nothing to select for an unreachable stmt of g +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function g +[from] Computing for function printf +[from] Done for function printf +tests/slicing/unitialized.c:30:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function g +[pdg] computing for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function g +tests/slicing/unitialized.c:27:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Non-terminating function g (no dependencies) +[from] Done for function g +tests/slicing/unitialized.c:40:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void g_slice_1(void) +{ + return; +} + +void main(void) +{ + g_slice_1(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unitialized.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unitialized.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unitialized.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unitialized.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,70 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unitialized.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X1 ∈ {0} + X2 ∈ {0} +[value] computing for function f1 <- main. + Called from tests/slicing/unitialized.c:35. +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/slicing/unitialized.c:36. +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function g <- main. + Called from tests/slicing/unitialized.c:37. +tests/slicing/unitialized.c:27:[kernel] warning: accessing uninitialized left-value: assert \initialized(&y); +tests/slicing/unitialized.c:27:[value] completely invalid value in evaluation of + argument y +[value] Recording results for g +[value] Done for function g +[value] Recording results for main +[value] done for function main +tests/slicing/unitialized.c:27:[value] Assertion 'Value,initialisation' got final status invalid. +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[slicing] Nothing to select for an unreachable stmt of g +[pdg] computing for function g +[from] Computing for function printf +[from] Done for function printf +tests/slicing/unitialized.c:30:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function g +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[from] Computing for function f1 +[from] Done for function f1 +[from] Computing for function f2 +[from] Done for function f2 +[from] Computing for function g +tests/slicing/unitialized.c:27:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Non-terminating function g (no dependencies) +[from] Done for function g +tests/slicing/unitialized.c:40:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +void g_slice_1(void) +{ + int y; + return; +} + +void main(void) +{ + g_slice_1(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-flavors.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-flavors.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-flavors.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-flavors.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,149 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unravel-flavors.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + nb_fetch ∈ {0} +[value] computing for function fetch <- main. + Called from tests/slicing/unravel-flavors.c:46. +[value] computing for function scanf <- fetch <- main. + Called from tests/slicing/unravel-flavors.c:37. +[value] using specification for function scanf +[value] Done for function scanf +[value] Recording results for fetch +[value] Done for function fetch +[value] computing for function fetch <- main. + Called from tests/slicing/unravel-flavors.c:47. +[value] computing for function scanf <- fetch <- main. + Called from tests/slicing/unravel-flavors.c:37. +[value] Done for function scanf +[value] Recording results for fetch +[value] Done for function fetch +[value] computing for function fetch <- main. + Called from tests/slicing/unravel-flavors.c:48. +[value] computing for function scanf <- fetch <- main. + Called from tests/slicing/unravel-flavors.c:37. +[value] Done for function scanf +[value] Recording results for fetch +[value] Done for function fetch +[value] computing for function fetch <- main. + Called from tests/slicing/unravel-flavors.c:49. +[value] computing for function scanf <- fetch <- main. + Called from tests/slicing/unravel-flavors.c:37. +[value] Done for function scanf +[value] Recording results for fetch +[value] Done for function fetch +tests/slicing/unravel-flavors.c:51:[kernel] warning: accessing uninitialized left-value: assert \initialized(&red); +tests/slicing/unravel-flavors.c:51:[kernel] warning: signed overflow. assert -2147483648 ≤ 2*red ≤ 2147483647; +tests/slicing/unravel-flavors.c:52:[kernel] warning: accessing uninitialized left-value: assert \initialized(&green); +tests/slicing/unravel-flavors.c:52:[kernel] warning: signed overflow. assert -2147483648 ≤ red*green ≤ 2147483647; +tests/slicing/unravel-flavors.c:54:[value] entering loop for the first time +tests/slicing/unravel-flavors.c:55:[kernel] warning: signed overflow. assert -2147483648 ≤ sour+green ≤ 2147483647; +tests/slicing/unravel-flavors.c:56:[kernel] warning: accessing uninitialized left-value: assert \initialized(&blue); +tests/slicing/unravel-flavors.c:56:[kernel] warning: accessing uninitialized left-value: assert \initialized(&yellow); +tests/slicing/unravel-flavors.c:56:[kernel] warning: signed overflow. assert -2147483648 ≤ blue+yellow ≤ 2147483647; +tests/slicing/unravel-flavors.c:57:[kernel] warning: signed overflow. assert green+1 ≤ 2147483647; +tests/slicing/unravel-flavors.c:58:[kernel] warning: signed overflow. assert -2147483648 ≤ yellow+green ≤ 2147483647; +[value] computing for function send1 <- main. + Called from tests/slicing/unravel-flavors.c:60. +[value] computing for function printf <- send1 <- main. + Called from tests/slicing/unravel-flavors.c:19. +tests/slicing/unravel-flavors.c:19:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for send1 +[value] Done for function send1 +[value] computing for function send2 <- main. + Called from tests/slicing/unravel-flavors.c:61. +[value] computing for function printf <- send2 <- main. + Called from tests/slicing/unravel-flavors.c:23. +[value] Done for function printf +[value] Recording results for send2 +[value] Done for function send2 +[value] computing for function send3 <- main. + Called from tests/slicing/unravel-flavors.c:62. +[value] computing for function printf <- send3 <- main. + Called from tests/slicing/unravel-flavors.c:27. +[value] Done for function printf +[value] Recording results for send3 +[value] Done for function send3 +[value] computing for function send4 <- main. + Called from tests/slicing/unravel-flavors.c:63. +[value] computing for function printf <- send4 <- main. + Called from tests/slicing/unravel-flavors.c:31. +[value] Done for function printf +[value] Recording results for send4 +[value] Done for function send4 +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function send2 +[from] Computing for function printf +[from] Done for function printf +[pdg] done for function send2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[from] Computing for function fetch +[from] Computing for function scanf <-fetch +[from] Done for function scanf +[from] Done for function fetch +[from] Computing for function send1 +[from] Done for function send1 +[from] Computing for function send2 +[from] Done for function send2 +[from] Computing for function send3 +[from] Done for function send3 +[from] Computing for function send4 +[from] Done for function send4 +[pdg] done for function main +[pdg] computing for function fetch +[pdg] done for function fetch +[pdg] computing for function scanf +[pdg] done for function scanf +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern void scanf_slice_1(void); + +int send2_slice_1(int x) +{ + return x; +} + +int fetch_slice_1(void) +{ + int value; + scanf_slice_1(); + return value; +} + +void main(void) +{ + int red; + int green; + int sour; + int i; + red = fetch_slice_1(); + green = fetch_slice_1(); + red = 2 * red; + sour = 0; + i = 0; + while (i < red) { + sour += green; + i ++; + } + send2_slice_1(sour); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-flavors.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-flavors.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-flavors.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-flavors.2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,142 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unravel-flavors.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + nb_fetch ∈ {0} +[value] computing for function fetch <- main. + Called from tests/slicing/unravel-flavors.c:46. +[value] computing for function scanf <- fetch <- main. + Called from tests/slicing/unravel-flavors.c:37. +[value] using specification for function scanf +[value] Done for function scanf +[value] Recording results for fetch +[value] Done for function fetch +[value] computing for function fetch <- main. + Called from tests/slicing/unravel-flavors.c:47. +[value] computing for function scanf <- fetch <- main. + Called from tests/slicing/unravel-flavors.c:37. +[value] Done for function scanf +[value] Recording results for fetch +[value] Done for function fetch +[value] computing for function fetch <- main. + Called from tests/slicing/unravel-flavors.c:48. +[value] computing for function scanf <- fetch <- main. + Called from tests/slicing/unravel-flavors.c:37. +[value] Done for function scanf +[value] Recording results for fetch +[value] Done for function fetch +[value] computing for function fetch <- main. + Called from tests/slicing/unravel-flavors.c:49. +[value] computing for function scanf <- fetch <- main. + Called from tests/slicing/unravel-flavors.c:37. +[value] Done for function scanf +[value] Recording results for fetch +[value] Done for function fetch +tests/slicing/unravel-flavors.c:51:[kernel] warning: accessing uninitialized left-value: assert \initialized(&red); +tests/slicing/unravel-flavors.c:51:[kernel] warning: signed overflow. assert -2147483648 ≤ 2*red ≤ 2147483647; +tests/slicing/unravel-flavors.c:52:[kernel] warning: accessing uninitialized left-value: assert \initialized(&green); +tests/slicing/unravel-flavors.c:52:[kernel] warning: signed overflow. assert -2147483648 ≤ red*green ≤ 2147483647; +tests/slicing/unravel-flavors.c:54:[value] entering loop for the first time +tests/slicing/unravel-flavors.c:55:[kernel] warning: signed overflow. assert -2147483648 ≤ sour+green ≤ 2147483647; +tests/slicing/unravel-flavors.c:56:[kernel] warning: accessing uninitialized left-value: assert \initialized(&blue); +tests/slicing/unravel-flavors.c:56:[kernel] warning: accessing uninitialized left-value: assert \initialized(&yellow); +tests/slicing/unravel-flavors.c:56:[kernel] warning: signed overflow. assert -2147483648 ≤ blue+yellow ≤ 2147483647; +tests/slicing/unravel-flavors.c:57:[kernel] warning: signed overflow. assert green+1 ≤ 2147483647; +tests/slicing/unravel-flavors.c:58:[kernel] warning: signed overflow. assert -2147483648 ≤ yellow+green ≤ 2147483647; +[value] computing for function send1 <- main. + Called from tests/slicing/unravel-flavors.c:60. +[value] computing for function printf <- send1 <- main. + Called from tests/slicing/unravel-flavors.c:19. +tests/slicing/unravel-flavors.c:19:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for send1 +[value] Done for function send1 +[value] computing for function send2 <- main. + Called from tests/slicing/unravel-flavors.c:61. +[value] computing for function printf <- send2 <- main. + Called from tests/slicing/unravel-flavors.c:23. +[value] Done for function printf +[value] Recording results for send2 +[value] Done for function send2 +[value] computing for function send3 <- main. + Called from tests/slicing/unravel-flavors.c:62. +[value] computing for function printf <- send3 <- main. + Called from tests/slicing/unravel-flavors.c:27. +[value] Done for function printf +[value] Recording results for send3 +[value] Done for function send3 +[value] computing for function send4 <- main. + Called from tests/slicing/unravel-flavors.c:63. +[value] computing for function printf <- send4 <- main. + Called from tests/slicing/unravel-flavors.c:31. +[value] Done for function printf +[value] Recording results for send4 +[value] Done for function send4 +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function send3 +[from] Computing for function printf +[from] Done for function printf +[pdg] done for function send3 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[from] Computing for function fetch +[from] Computing for function scanf <-fetch +[from] Done for function scanf +[from] Done for function fetch +[from] Computing for function send1 +[from] Done for function send1 +[from] Computing for function send2 +[from] Done for function send2 +[from] Computing for function send3 +[from] Done for function send3 +[from] Computing for function send4 +[from] Done for function send4 +[pdg] done for function main +[pdg] computing for function fetch +[pdg] done for function fetch +[pdg] computing for function scanf +[pdg] done for function scanf +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern void scanf_slice_1(void); + +int send3_slice_1(int x) +{ + return x; +} + +int fetch_slice_1(void) +{ + int value; + scanf_slice_1(); + return value; +} + +void main(void) +{ + int blue; + int yellow; + int salty; + blue = fetch_slice_1(); + yellow = fetch_slice_1(); + salty = blue + yellow; + send3_slice_1(salty); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-flavors.3.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-flavors.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-flavors.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-flavors.3.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,143 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unravel-flavors.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + nb_fetch ∈ {0} +[value] computing for function fetch <- main. + Called from tests/slicing/unravel-flavors.c:46. +[value] computing for function scanf <- fetch <- main. + Called from tests/slicing/unravel-flavors.c:37. +[value] using specification for function scanf +[value] Done for function scanf +[value] Recording results for fetch +[value] Done for function fetch +[value] computing for function fetch <- main. + Called from tests/slicing/unravel-flavors.c:47. +[value] computing for function scanf <- fetch <- main. + Called from tests/slicing/unravel-flavors.c:37. +[value] Done for function scanf +[value] Recording results for fetch +[value] Done for function fetch +[value] computing for function fetch <- main. + Called from tests/slicing/unravel-flavors.c:48. +[value] computing for function scanf <- fetch <- main. + Called from tests/slicing/unravel-flavors.c:37. +[value] Done for function scanf +[value] Recording results for fetch +[value] Done for function fetch +[value] computing for function fetch <- main. + Called from tests/slicing/unravel-flavors.c:49. +[value] computing for function scanf <- fetch <- main. + Called from tests/slicing/unravel-flavors.c:37. +[value] Done for function scanf +[value] Recording results for fetch +[value] Done for function fetch +tests/slicing/unravel-flavors.c:51:[kernel] warning: accessing uninitialized left-value: assert \initialized(&red); +tests/slicing/unravel-flavors.c:51:[kernel] warning: signed overflow. assert -2147483648 ≤ 2*red ≤ 2147483647; +tests/slicing/unravel-flavors.c:52:[kernel] warning: accessing uninitialized left-value: assert \initialized(&green); +tests/slicing/unravel-flavors.c:52:[kernel] warning: signed overflow. assert -2147483648 ≤ red*green ≤ 2147483647; +tests/slicing/unravel-flavors.c:54:[value] entering loop for the first time +tests/slicing/unravel-flavors.c:55:[kernel] warning: signed overflow. assert -2147483648 ≤ sour+green ≤ 2147483647; +tests/slicing/unravel-flavors.c:56:[kernel] warning: accessing uninitialized left-value: assert \initialized(&blue); +tests/slicing/unravel-flavors.c:56:[kernel] warning: accessing uninitialized left-value: assert \initialized(&yellow); +tests/slicing/unravel-flavors.c:56:[kernel] warning: signed overflow. assert -2147483648 ≤ blue+yellow ≤ 2147483647; +tests/slicing/unravel-flavors.c:57:[kernel] warning: signed overflow. assert green+1 ≤ 2147483647; +tests/slicing/unravel-flavors.c:58:[kernel] warning: signed overflow. assert -2147483648 ≤ yellow+green ≤ 2147483647; +[value] computing for function send1 <- main. + Called from tests/slicing/unravel-flavors.c:60. +[value] computing for function printf <- send1 <- main. + Called from tests/slicing/unravel-flavors.c:19. +tests/slicing/unravel-flavors.c:19:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for send1 +[value] Done for function send1 +[value] computing for function send2 <- main. + Called from tests/slicing/unravel-flavors.c:61. +[value] computing for function printf <- send2 <- main. + Called from tests/slicing/unravel-flavors.c:23. +[value] Done for function printf +[value] Recording results for send2 +[value] Done for function send2 +[value] computing for function send3 <- main. + Called from tests/slicing/unravel-flavors.c:62. +[value] computing for function printf <- send3 <- main. + Called from tests/slicing/unravel-flavors.c:27. +[value] Done for function printf +[value] Recording results for send3 +[value] Done for function send3 +[value] computing for function send4 <- main. + Called from tests/slicing/unravel-flavors.c:63. +[value] computing for function printf <- send4 <- main. + Called from tests/slicing/unravel-flavors.c:31. +[value] Done for function printf +[value] Recording results for send4 +[value] Done for function send4 +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function send4 +[from] Computing for function printf +[from] Done for function printf +[pdg] done for function send4 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[from] Computing for function fetch +[from] Computing for function scanf <-fetch +[from] Done for function scanf +[from] Done for function fetch +[from] Computing for function send1 +[from] Done for function send1 +[from] Computing for function send2 +[from] Done for function send2 +[from] Computing for function send3 +[from] Done for function send3 +[from] Computing for function send4 +[from] Done for function send4 +[pdg] done for function main +[pdg] computing for function fetch +[pdg] done for function fetch +[pdg] computing for function scanf +[pdg] done for function scanf +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern void scanf_slice_1(void); + +int send4_slice_1(int x) +{ + return x; +} + +int fetch_slice_1(void) +{ + int value; + scanf_slice_1(); + return value; +} + +void main(void) +{ + int green; + int yellow; + int bitter; + green = fetch_slice_1(); + yellow = fetch_slice_1(); + green ++; + bitter = yellow + green; + send4_slice_1(bitter); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-flavors.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-flavors.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-flavors.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-flavors.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,143 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unravel-flavors.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + nb_fetch ∈ {0} +[value] computing for function fetch <- main. + Called from tests/slicing/unravel-flavors.c:46. +[value] computing for function scanf <- fetch <- main. + Called from tests/slicing/unravel-flavors.c:37. +[value] using specification for function scanf +[value] Done for function scanf +[value] Recording results for fetch +[value] Done for function fetch +[value] computing for function fetch <- main. + Called from tests/slicing/unravel-flavors.c:47. +[value] computing for function scanf <- fetch <- main. + Called from tests/slicing/unravel-flavors.c:37. +[value] Done for function scanf +[value] Recording results for fetch +[value] Done for function fetch +[value] computing for function fetch <- main. + Called from tests/slicing/unravel-flavors.c:48. +[value] computing for function scanf <- fetch <- main. + Called from tests/slicing/unravel-flavors.c:37. +[value] Done for function scanf +[value] Recording results for fetch +[value] Done for function fetch +[value] computing for function fetch <- main. + Called from tests/slicing/unravel-flavors.c:49. +[value] computing for function scanf <- fetch <- main. + Called from tests/slicing/unravel-flavors.c:37. +[value] Done for function scanf +[value] Recording results for fetch +[value] Done for function fetch +tests/slicing/unravel-flavors.c:51:[kernel] warning: accessing uninitialized left-value: assert \initialized(&red); +tests/slicing/unravel-flavors.c:51:[kernel] warning: signed overflow. assert -2147483648 ≤ 2*red ≤ 2147483647; +tests/slicing/unravel-flavors.c:52:[kernel] warning: accessing uninitialized left-value: assert \initialized(&green); +tests/slicing/unravel-flavors.c:52:[kernel] warning: signed overflow. assert -2147483648 ≤ red*green ≤ 2147483647; +tests/slicing/unravel-flavors.c:54:[value] entering loop for the first time +tests/slicing/unravel-flavors.c:55:[kernel] warning: signed overflow. assert -2147483648 ≤ sour+green ≤ 2147483647; +tests/slicing/unravel-flavors.c:56:[kernel] warning: accessing uninitialized left-value: assert \initialized(&blue); +tests/slicing/unravel-flavors.c:56:[kernel] warning: accessing uninitialized left-value: assert \initialized(&yellow); +tests/slicing/unravel-flavors.c:56:[kernel] warning: signed overflow. assert -2147483648 ≤ blue+yellow ≤ 2147483647; +tests/slicing/unravel-flavors.c:57:[kernel] warning: signed overflow. assert green+1 ≤ 2147483647; +tests/slicing/unravel-flavors.c:58:[kernel] warning: signed overflow. assert -2147483648 ≤ yellow+green ≤ 2147483647; +[value] computing for function send1 <- main. + Called from tests/slicing/unravel-flavors.c:60. +[value] computing for function printf <- send1 <- main. + Called from tests/slicing/unravel-flavors.c:19. +tests/slicing/unravel-flavors.c:19:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for send1 +[value] Done for function send1 +[value] computing for function send2 <- main. + Called from tests/slicing/unravel-flavors.c:61. +[value] computing for function printf <- send2 <- main. + Called from tests/slicing/unravel-flavors.c:23. +[value] Done for function printf +[value] Recording results for send2 +[value] Done for function send2 +[value] computing for function send3 <- main. + Called from tests/slicing/unravel-flavors.c:62. +[value] computing for function printf <- send3 <- main. + Called from tests/slicing/unravel-flavors.c:27. +[value] Done for function printf +[value] Recording results for send3 +[value] Done for function send3 +[value] computing for function send4 <- main. + Called from tests/slicing/unravel-flavors.c:63. +[value] computing for function printf <- send4 <- main. + Called from tests/slicing/unravel-flavors.c:31. +[value] Done for function printf +[value] Recording results for send4 +[value] Done for function send4 +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function send1 +[from] Computing for function printf +[from] Done for function printf +[pdg] done for function send1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[from] Computing for function fetch +[from] Computing for function scanf <-fetch +[from] Done for function scanf +[from] Done for function fetch +[from] Computing for function send1 +[from] Done for function send1 +[from] Computing for function send2 +[from] Done for function send2 +[from] Computing for function send3 +[from] Done for function send3 +[from] Computing for function send4 +[from] Done for function send4 +[pdg] done for function main +[pdg] computing for function fetch +[pdg] done for function fetch +[pdg] computing for function scanf +[pdg] done for function scanf +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern void scanf_slice_1(void); + +int send1_slice_1(int x) +{ + return x; +} + +int fetch_slice_1(void) +{ + int value; + scanf_slice_1(); + return value; +} + +void main(void) +{ + int red; + int green; + int sweet; + red = fetch_slice_1(); + green = fetch_slice_1(); + red = 2 * red; + sweet = red * green; + send1_slice_1(sweet); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-point.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-point.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-point.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-point.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,148 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unravel-point.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:59. +[value] using specification for function scanf +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:61. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:63. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:65. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:66. +[value] Done for function scanf +tests/slicing/unravel-point.c:68:[kernel] warning: accessing uninitialized left-value: assert \initialized(&cond1); +tests/slicing/unravel-point.c:71:[kernel] warning: accessing uninitialized left-value: assert \initialized(z); +tests/slicing/unravel-point.c:71:[kernel] warning: signed overflow. assert *z+1 ≤ 2147483647; +tests/slicing/unravel-point.c:72:[kernel] warning: accessing uninitialized left-value: assert \initialized(y); +tests/slicing/unravel-point.c:72:[kernel] warning: accessing uninitialized left-value: assert \initialized(x); +tests/slicing/unravel-point.c:72:[kernel] warning: signed overflow. assert -2147483648 ≤ *y+*x ≤ 2147483647; +[value] computing for function send1 <- main. + Called from tests/slicing/unravel-point.c:75. +tests/slicing/unravel-point.c:36:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] computing for function printf <- send1 <- main. + Called from tests/slicing/unravel-point.c:36. +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for send1 +[from] Computing for function send1 +[from] Done for function send1 +[value] Done for function send1 +[value] computing for function send2 <- main. + Called from tests/slicing/unravel-point.c:76. +[value] computing for function printf <- send2 <- main. + Called from tests/slicing/unravel-point.c:40. +[value] Done for function printf +[value] Recording results for send2 +[from] Computing for function send2 +[from] Done for function send2 +[value] Done for function send2 +[value] computing for function send3 <- main. + Called from tests/slicing/unravel-point.c:77. +tests/slicing/unravel-point.c:44:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x); +[value] computing for function printf <- send3 <- main. + Called from tests/slicing/unravel-point.c:44. +[value] Done for function printf +[value] Recording results for send3 +[from] Computing for function send3 +[from] Done for function send3 +[value] Done for function send3 +[value] computing for function send4 <- main. + Called from tests/slicing/unravel-point.c:78. +tests/slicing/unravel-point.c:48:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x); +[value] computing for function printf <- send4 <- main. + Called from tests/slicing/unravel-point.c:48. +[value] Done for function printf +[value] Recording results for send4 +[from] Computing for function send4 +[from] Done for function send4 +[value] Done for function send4 +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to printf at tests/slicing/unravel-point.c:36 (by send1): + \result FROM \nothing +[from] call to printf at tests/slicing/unravel-point.c:40 (by send2): + \result FROM \nothing +[from] call to printf at tests/slicing/unravel-point.c:44 (by send3): + \result FROM \nothing +[from] call to printf at tests/slicing/unravel-point.c:48 (by send4): + \result FROM \nothing +[from] call to scanf at tests/slicing/unravel-point.c:59 (by main): + input1 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:61 (by main): + input2 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:63 (by main): + input3 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:65 (by main): + cond1 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:66 (by main): + cond2 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to send1 at tests/slicing/unravel-point.c:75 (by main): + \result FROM x +[from] call to send2 at tests/slicing/unravel-point.c:76 (by main): + \result FROM x +[from] call to send3 at tests/slicing/unravel-point.c:77 (by main): + \result FROM x +[from] call to send4 at tests/slicing/unravel-point.c:78 (by main): + \result FROM x +[from] entry point: + \result FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function send2 +[pdg] done for function send2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[pdg] done for function main +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int scanf(char const *, int *p); + +int send2_slice_1(int x) +{ + return x; +} + +void main(void) +{ + int input2; + int b; + int *z; + int output2; + scanf("%d",& input2); + b = input2; + z = & b; + output2 = *z + 1; + send2_slice_1(output2); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-point.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-point.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-point.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-point.2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,164 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unravel-point.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:59. +[value] using specification for function scanf +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:61. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:63. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:65. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:66. +[value] Done for function scanf +tests/slicing/unravel-point.c:68:[kernel] warning: accessing uninitialized left-value: assert \initialized(&cond1); +tests/slicing/unravel-point.c:71:[kernel] warning: accessing uninitialized left-value: assert \initialized(z); +tests/slicing/unravel-point.c:71:[kernel] warning: signed overflow. assert *z+1 ≤ 2147483647; +tests/slicing/unravel-point.c:72:[kernel] warning: accessing uninitialized left-value: assert \initialized(y); +tests/slicing/unravel-point.c:72:[kernel] warning: accessing uninitialized left-value: assert \initialized(x); +tests/slicing/unravel-point.c:72:[kernel] warning: signed overflow. assert -2147483648 ≤ *y+*x ≤ 2147483647; +[value] computing for function send1 <- main. + Called from tests/slicing/unravel-point.c:75. +tests/slicing/unravel-point.c:36:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] computing for function printf <- send1 <- main. + Called from tests/slicing/unravel-point.c:36. +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for send1 +[from] Computing for function send1 +[from] Done for function send1 +[value] Done for function send1 +[value] computing for function send2 <- main. + Called from tests/slicing/unravel-point.c:76. +[value] computing for function printf <- send2 <- main. + Called from tests/slicing/unravel-point.c:40. +[value] Done for function printf +[value] Recording results for send2 +[from] Computing for function send2 +[from] Done for function send2 +[value] Done for function send2 +[value] computing for function send3 <- main. + Called from tests/slicing/unravel-point.c:77. +tests/slicing/unravel-point.c:44:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x); +[value] computing for function printf <- send3 <- main. + Called from tests/slicing/unravel-point.c:44. +[value] Done for function printf +[value] Recording results for send3 +[from] Computing for function send3 +[from] Done for function send3 +[value] Done for function send3 +[value] computing for function send4 <- main. + Called from tests/slicing/unravel-point.c:78. +tests/slicing/unravel-point.c:48:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x); +[value] computing for function printf <- send4 <- main. + Called from tests/slicing/unravel-point.c:48. +[value] Done for function printf +[value] Recording results for send4 +[from] Computing for function send4 +[from] Done for function send4 +[value] Done for function send4 +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to printf at tests/slicing/unravel-point.c:36 (by send1): + \result FROM \nothing +[from] call to printf at tests/slicing/unravel-point.c:40 (by send2): + \result FROM \nothing +[from] call to printf at tests/slicing/unravel-point.c:44 (by send3): + \result FROM \nothing +[from] call to printf at tests/slicing/unravel-point.c:48 (by send4): + \result FROM \nothing +[from] call to scanf at tests/slicing/unravel-point.c:59 (by main): + input1 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:61 (by main): + input2 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:63 (by main): + input3 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:65 (by main): + cond1 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:66 (by main): + cond2 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to send1 at tests/slicing/unravel-point.c:75 (by main): + \result FROM x +[from] call to send2 at tests/slicing/unravel-point.c:76 (by main): + \result FROM x +[from] call to send3 at tests/slicing/unravel-point.c:77 (by main): + \result FROM x +[from] call to send4 at tests/slicing/unravel-point.c:78 (by main): + \result FROM x +[from] entry point: + \result FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function send3 +[pdg] done for function send3 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[pdg] done for function main +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int scanf(char const *, int *p); + +int send3_slice_1(int x) +{ + return x; +} + +void main(void) +{ + int input1; + int input2; + int input3; + int cond1; + int a; + int b; + int c; + int *x; + int *y; + int *z; + int output3; + scanf("%d",& input1); + a = input1; + scanf("%d",& input2); + b = input2; + scanf("%d",& input3); + c = input3; + scanf("%d",& cond1); + x = & a; + if (cond1) x = & b; + y = & c; + z = & b; + *z = *y + *x; + output3 = *x; + send3_slice_1(output3); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-point.3.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-point.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-point.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-point.3.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,142 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unravel-point.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:59. +[value] using specification for function scanf +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:61. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:63. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:65. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:66. +[value] Done for function scanf +tests/slicing/unravel-point.c:68:[kernel] warning: accessing uninitialized left-value: assert \initialized(&cond1); +tests/slicing/unravel-point.c:71:[kernel] warning: accessing uninitialized left-value: assert \initialized(z); +tests/slicing/unravel-point.c:71:[kernel] warning: signed overflow. assert *z+1 ≤ 2147483647; +tests/slicing/unravel-point.c:72:[kernel] warning: accessing uninitialized left-value: assert \initialized(y); +tests/slicing/unravel-point.c:72:[kernel] warning: accessing uninitialized left-value: assert \initialized(x); +tests/slicing/unravel-point.c:72:[kernel] warning: signed overflow. assert -2147483648 ≤ *y+*x ≤ 2147483647; +[value] computing for function send1 <- main. + Called from tests/slicing/unravel-point.c:75. +tests/slicing/unravel-point.c:36:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] computing for function printf <- send1 <- main. + Called from tests/slicing/unravel-point.c:36. +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for send1 +[from] Computing for function send1 +[from] Done for function send1 +[value] Done for function send1 +[value] computing for function send2 <- main. + Called from tests/slicing/unravel-point.c:76. +[value] computing for function printf <- send2 <- main. + Called from tests/slicing/unravel-point.c:40. +[value] Done for function printf +[value] Recording results for send2 +[from] Computing for function send2 +[from] Done for function send2 +[value] Done for function send2 +[value] computing for function send3 <- main. + Called from tests/slicing/unravel-point.c:77. +tests/slicing/unravel-point.c:44:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x); +[value] computing for function printf <- send3 <- main. + Called from tests/slicing/unravel-point.c:44. +[value] Done for function printf +[value] Recording results for send3 +[from] Computing for function send3 +[from] Done for function send3 +[value] Done for function send3 +[value] computing for function send4 <- main. + Called from tests/slicing/unravel-point.c:78. +tests/slicing/unravel-point.c:48:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x); +[value] computing for function printf <- send4 <- main. + Called from tests/slicing/unravel-point.c:48. +[value] Done for function printf +[value] Recording results for send4 +[from] Computing for function send4 +[from] Done for function send4 +[value] Done for function send4 +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to printf at tests/slicing/unravel-point.c:36 (by send1): + \result FROM \nothing +[from] call to printf at tests/slicing/unravel-point.c:40 (by send2): + \result FROM \nothing +[from] call to printf at tests/slicing/unravel-point.c:44 (by send3): + \result FROM \nothing +[from] call to printf at tests/slicing/unravel-point.c:48 (by send4): + \result FROM \nothing +[from] call to scanf at tests/slicing/unravel-point.c:59 (by main): + input1 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:61 (by main): + input2 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:63 (by main): + input3 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:65 (by main): + cond1 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:66 (by main): + cond2 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to send1 at tests/slicing/unravel-point.c:75 (by main): + \result FROM x +[from] call to send2 at tests/slicing/unravel-point.c:76 (by main): + \result FROM x +[from] call to send3 at tests/slicing/unravel-point.c:77 (by main): + \result FROM x +[from] call to send4 at tests/slicing/unravel-point.c:78 (by main): + \result FROM x +[from] entry point: + \result FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function send4 +[pdg] done for function send4 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[pdg] done for function main +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int scanf(char const *, int *p); + +int send4_slice_1(int x) +{ + return x; +} + +void main(void) +{ + int cond2; + scanf("%d",& cond2); + send4_slice_1(cond2); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-point.4.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-point.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-point.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-point.4.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,304 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unravel-point.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:59. +[value] using specification for function scanf +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:61. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:63. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:65. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:66. +[value] Done for function scanf +tests/slicing/unravel-point.c:68:[kernel] warning: accessing uninitialized left-value: assert \initialized(&cond1); +tests/slicing/unravel-point.c:71:[kernel] warning: accessing uninitialized left-value: assert \initialized(z); +tests/slicing/unravel-point.c:71:[kernel] warning: signed overflow. assert *z+1 ≤ 2147483647; +tests/slicing/unravel-point.c:72:[kernel] warning: accessing uninitialized left-value: assert \initialized(y); +tests/slicing/unravel-point.c:72:[kernel] warning: accessing uninitialized left-value: assert \initialized(x); +tests/slicing/unravel-point.c:72:[kernel] warning: signed overflow. assert -2147483648 ≤ *y+*x ≤ 2147483647; +[value] computing for function send1 <- main. + Called from tests/slicing/unravel-point.c:75. +tests/slicing/unravel-point.c:36:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] computing for function printf <- send1 <- main. + Called from tests/slicing/unravel-point.c:36. +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for send1 +[from] Computing for function send1 +[from] Done for function send1 +[value] Done for function send1 +[value] computing for function send2 <- main. + Called from tests/slicing/unravel-point.c:76. +[value] computing for function printf <- send2 <- main. + Called from tests/slicing/unravel-point.c:40. +[value] Done for function printf +[value] Recording results for send2 +[from] Computing for function send2 +[from] Done for function send2 +[value] Done for function send2 +[value] computing for function send3 <- main. + Called from tests/slicing/unravel-point.c:77. +tests/slicing/unravel-point.c:44:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x); +[value] computing for function printf <- send3 <- main. + Called from tests/slicing/unravel-point.c:44. +[value] Done for function printf +[value] Recording results for send3 +[from] Computing for function send3 +[from] Done for function send3 +[value] Done for function send3 +[value] computing for function send4 <- main. + Called from tests/slicing/unravel-point.c:78. +tests/slicing/unravel-point.c:48:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x); +[value] computing for function printf <- send4 <- main. + Called from tests/slicing/unravel-point.c:48. +[value] Done for function printf +[value] Recording results for send4 +[from] Computing for function send4 +[from] Done for function send4 +[value] Done for function send4 +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to printf at tests/slicing/unravel-point.c:36 (by send1): + \result FROM \nothing +[from] call to printf at tests/slicing/unravel-point.c:40 (by send2): + \result FROM \nothing +[from] call to printf at tests/slicing/unravel-point.c:44 (by send3): + \result FROM \nothing +[from] call to printf at tests/slicing/unravel-point.c:48 (by send4): + \result FROM \nothing +[from] call to scanf at tests/slicing/unravel-point.c:59 (by main): + input1 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:61 (by main): + input2 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:63 (by main): + input3 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:65 (by main): + cond1 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:66 (by main): + cond2 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to send1 at tests/slicing/unravel-point.c:75 (by main): + \result FROM x +[from] call to send2 at tests/slicing/unravel-point.c:76 (by main): + \result FROM x +[from] call to send3 at tests/slicing/unravel-point.c:77 (by main): + \result FROM x +[from] call to send4 at tests/slicing/unravel-point.c:78 (by main): + \result FROM x +[from] entry point: + \result FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function send1 +[pdg] done for function send1 +[pdg] computing for function send4 +[pdg] done for function send4 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/slicing/unravel-point.c:59:[kernel] warning: Neither code nor specification for function scanf, generating default assigns from the prototype +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:59. +[value] using specification for function scanf +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:61. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:63. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:65. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:66. +[value] Done for function scanf +tests/slicing/unravel-point.c:68:[kernel] warning: accessing uninitialized left-value: assert \initialized(&cond1); +tests/slicing/unravel-point.c:72:[kernel] warning: accessing uninitialized left-value: assert \initialized(y); +tests/slicing/unravel-point.c:72:[kernel] warning: accessing uninitialized left-value: assert \initialized(x); +tests/slicing/unravel-point.c:72:[kernel] warning: signed overflow. assert -2147483648 ≤ *y+*x ≤ 2147483647; +[value] computing for function send1_slice_1 <- main. + Called from tests/slicing/unravel-point.c:75. +[value] Recording results for send1_slice_1 +[from] Computing for function send1_slice_1 +[from] Done for function send1_slice_1 +[value] Done for function send1_slice_1 +[value] computing for function send4_slice_1 <- main. + Called from tests/slicing/unravel-point.c:78. +[value] Recording results for send4_slice_1 +[from] Computing for function send4_slice_1 +[from] Done for function send4_slice_1 +[value] Done for function send4_slice_1 +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to scanf at tests/slicing/unravel-point.c:59 (by main): + input1 FROM input1 (and SELF) + \result FROM input1 +[from] call to scanf at tests/slicing/unravel-point.c:61 (by main): + input2 FROM input2 (and SELF) + \result FROM input2 +[from] call to scanf at tests/slicing/unravel-point.c:63 (by main): + input3 FROM input3 (and SELF) + \result FROM input3 +[from] call to scanf at tests/slicing/unravel-point.c:65 (by main): + cond1 FROM cond1 (and SELF) + \result FROM cond1 +[from] call to scanf at tests/slicing/unravel-point.c:66 (by main): + cond2 FROM cond2 (and SELF) + \result FROM cond2 +[from] call to send1_slice_1 at tests/slicing/unravel-point.c:75 (by main): + \result FROM x +[from] call to send4_slice_1 at tests/slicing/unravel-point.c:78 (by main): + \result FROM x +[from] entry point: + NO EFFECTS +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function send1_slice_1 +[pdg] done for function send1_slice_1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[pdg] done for function main +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +/*@ assigns \result, *p; + assigns \result \from *p; + assigns *p \from *p; */ +extern int scanf(char const *, int *p); + +int send1_slice_1(int x) +{ + return x; +} + +int send4_slice_1(int x) +{ + return x; +} + +void main(void) +{ + int input1; + int input2; + int input3; + int cond1; + int cond2; + int a; + int b; + int c; + int *x; + int *y; + int *z; + int output1; + scanf("%d",& input1); + a = input1; + scanf("%d",& input2); + b = input2; + scanf("%d",& input3); + c = input3; + scanf("%d",& cond1); + scanf("%d",& cond2); + x = & a; + /*@ assert Value: initialisation: \initialized(&cond1); */ + if (cond1) x = & b; + y = & c; + z = & b; + /*@ assert Value: initialisation: \initialized(y); */ + /*@ assert Value: initialisation: \initialized(x); */ + /*@ assert Value: signed_overflow: *y+*x ≤ 2147483647; */ + /*@ assert Value: signed_overflow: -2147483648 ≤ *y+*x; */ + *z = *y + *x; + output1 = *z; + send1_slice_1(output1); + send4_slice_1(cond2); + return; +} + + +/* Generated by Frama-C */ +extern int scanf(char const *, int *p); + +int send1_slice_1_slice_1(int x) +{ + return x; +} + +void main(void) +{ + int input1; + int input2; + int input3; + int cond1; + int a; + int b; + int c; + int *x; + int *y; + int *z; + int output1; + scanf("%d",& input1); + a = input1; + scanf("%d",& input2); + b = input2; + scanf("%d",& input3); + c = input3; + scanf("%d",& cond1); + x = & a; + if (cond1) x = & b; + y = & c; + z = & b; + *z = *y + *x; + output1 = *z; + send1_slice_1_slice_1(output1); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-point.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-point.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-point.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-point.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,164 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unravel-point.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:59. +[value] using specification for function scanf +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:61. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:63. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:65. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-point.c:66. +[value] Done for function scanf +tests/slicing/unravel-point.c:68:[kernel] warning: accessing uninitialized left-value: assert \initialized(&cond1); +tests/slicing/unravel-point.c:71:[kernel] warning: accessing uninitialized left-value: assert \initialized(z); +tests/slicing/unravel-point.c:71:[kernel] warning: signed overflow. assert *z+1 ≤ 2147483647; +tests/slicing/unravel-point.c:72:[kernel] warning: accessing uninitialized left-value: assert \initialized(y); +tests/slicing/unravel-point.c:72:[kernel] warning: accessing uninitialized left-value: assert \initialized(x); +tests/slicing/unravel-point.c:72:[kernel] warning: signed overflow. assert -2147483648 ≤ *y+*x ≤ 2147483647; +[value] computing for function send1 <- main. + Called from tests/slicing/unravel-point.c:75. +tests/slicing/unravel-point.c:36:[kernel] warning: Neither code nor specification for function printf, generating default assigns from the prototype +[value] computing for function printf <- send1 <- main. + Called from tests/slicing/unravel-point.c:36. +[value] using specification for function printf +[value] Done for function printf +[value] Recording results for send1 +[from] Computing for function send1 +[from] Done for function send1 +[value] Done for function send1 +[value] computing for function send2 <- main. + Called from tests/slicing/unravel-point.c:76. +[value] computing for function printf <- send2 <- main. + Called from tests/slicing/unravel-point.c:40. +[value] Done for function printf +[value] Recording results for send2 +[from] Computing for function send2 +[from] Done for function send2 +[value] Done for function send2 +[value] computing for function send3 <- main. + Called from tests/slicing/unravel-point.c:77. +tests/slicing/unravel-point.c:44:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x); +[value] computing for function printf <- send3 <- main. + Called from tests/slicing/unravel-point.c:44. +[value] Done for function printf +[value] Recording results for send3 +[from] Computing for function send3 +[from] Done for function send3 +[value] Done for function send3 +[value] computing for function send4 <- main. + Called from tests/slicing/unravel-point.c:78. +tests/slicing/unravel-point.c:48:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x); +[value] computing for function printf <- send4 <- main. + Called from tests/slicing/unravel-point.c:48. +[value] Done for function printf +[value] Recording results for send4 +[from] Computing for function send4 +[from] Done for function send4 +[value] Done for function send4 +[value] Recording results for main +[from] Computing for function main +[from] Done for function main +[value] done for function main +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to printf at tests/slicing/unravel-point.c:36 (by send1): + \result FROM \nothing +[from] call to printf at tests/slicing/unravel-point.c:40 (by send2): + \result FROM \nothing +[from] call to printf at tests/slicing/unravel-point.c:44 (by send3): + \result FROM \nothing +[from] call to printf at tests/slicing/unravel-point.c:48 (by send4): + \result FROM \nothing +[from] call to scanf at tests/slicing/unravel-point.c:59 (by main): + input1 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:61 (by main): + input2 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:63 (by main): + input3 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:65 (by main): + cond1 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to scanf at tests/slicing/unravel-point.c:66 (by main): + cond2 FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to send1 at tests/slicing/unravel-point.c:75 (by main): + \result FROM x +[from] call to send2 at tests/slicing/unravel-point.c:76 (by main): + \result FROM x +[from] call to send3 at tests/slicing/unravel-point.c:77 (by main): + \result FROM x +[from] call to send4 at tests/slicing/unravel-point.c:78 (by main): + \result FROM x +[from] entry point: + \result FROM \nothing +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function send1 +[pdg] done for function send1 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[pdg] done for function main +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int scanf(char const *, int *p); + +int send1_slice_1(int x) +{ + return x; +} + +void main(void) +{ + int input1; + int input2; + int input3; + int cond1; + int a; + int b; + int c; + int *x; + int *y; + int *z; + int output1; + scanf("%d",& input1); + a = input1; + scanf("%d",& input2); + b = input2; + scanf("%d",& input3); + c = input3; + scanf("%d",& cond1); + x = & a; + if (cond1) x = & b; + y = & c; + z = & b; + *z = *y + *x; + output1 = *z; + send1_slice_1(output1); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-variance.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-variance.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-variance.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-variance.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,235 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unravel-variance.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:32. +tests/slicing/unravel-variance.c:32:[kernel] warning: Neither code nor specification for function scanf, generating default assigns from the prototype +[value] using specification for function scanf +[value] Done for function scanf +tests/slicing/unravel-variance.c:33:[value] entering loop for the first time +tests/slicing/unravel-variance.c:33:[kernel] warning: accessing uninitialized left-value: assert \initialized(&n); +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +tests/slicing/unravel-variance.c:36:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:36:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(x[i]*x[i])); +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +tests/slicing/unravel-variance.c:36:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t1+x[i])); +tests/slicing/unravel-variance.c:37:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq+(float)(x[i]*x[i]))); +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +tests/slicing/unravel-variance.c:36:[kernel] warning: accessing out of bounds index [0..1024]. assert i < 1024; +tests/slicing/unravel-variance.c:39:[kernel] warning: non-finite float value ([--..--]): assert \is_finite((float)(t1/(float)n)); +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^158 .. 1.9999998807907104*2^158]): + assert \is_finite((float)((float)n*avg)); +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)((float)((float)n*avg)*avg)); +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq-(float)((float)((float)n*avg)*avg))); +tests/slicing/unravel-variance.c:40:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value ([--..--]): + assert + \is_finite((float)((float)(ssq-(float)((float)((float)n*avg)*avg))/(float) + ((int)(n-1)))); +tests/slicing/unravel-variance.c:41:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(t1*avg)); +tests/slicing/unravel-variance.c:41:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq-(float)(t1*avg))); +tests/slicing/unravel-variance.c:41:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:41:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(ssq-(float)(t1*avg))/(float)((int)(n-1)))); +tests/slicing/unravel-variance.c:42:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(t1*t1)); +tests/slicing/unravel-variance.c:42:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(t1*t1)/(float)n)); +tests/slicing/unravel-variance.c:43:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq-t1)); +tests/slicing/unravel-variance.c:43:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:43:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(ssq-t1)/(float)((int)(n-1)))); +tests/slicing/unravel-variance.c:45:[value] entering loop for the first time +tests/slicing/unravel-variance.c:47:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:47:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(x[i]); +tests/slicing/unravel-variance.c:47:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(x[i]-avg)); +tests/slicing/unravel-variance.c:49:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(dev*dev)); +tests/slicing/unravel-variance.c:48:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t2+dev)); +tests/slicing/unravel-variance.c:49:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t1+(float)(dev*dev))); +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(t2*t2)); +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(t2*t2)/(float)n)); +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t1-(float)((float)(t2*t2)/(float)n))); +tests/slicing/unravel-variance.c:51:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value ([--..--]): + assert + \is_finite((float)((float)(t1-(float)((float)(t2*t2)/(float)n))/(float) + ((int)(n-1)))); +tests/slicing/unravel-variance.c:52:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:52:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)(t1/(float)((int)(n-1)))); +tests/slicing/unravel-variance.c:53:[kernel] warning: overflow in conversion + of var2 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var2 < 2147483648; +[value] computing for function printf1 <- main. + Called from tests/slicing/unravel-variance.c:53. +tests/slicing/unravel-variance.c:53:[kernel] warning: Neither code nor specification for function printf1, generating default assigns from the prototype +[value] using specification for function printf1 +[value] Done for function printf1 +tests/slicing/unravel-variance.c:54:[kernel] warning: overflow in conversion + of var3 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var3 < 2147483648; +[value] computing for function printf2 <- main. + Called from tests/slicing/unravel-variance.c:54. +tests/slicing/unravel-variance.c:54:[kernel] warning: Neither code nor specification for function printf2, generating default assigns from the prototype +[value] using specification for function printf2 +[value] Done for function printf2 +tests/slicing/unravel-variance.c:55:[kernel] warning: overflow in conversion + of var4 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var4 < 2147483648; +[value] computing for function printf3 <- main. + Called from tests/slicing/unravel-variance.c:55. +tests/slicing/unravel-variance.c:55:[kernel] warning: Neither code nor specification for function printf3, generating default assigns from the prototype +[value] using specification for function printf3 +[value] Done for function printf3 +tests/slicing/unravel-variance.c:56:[kernel] warning: overflow in conversion + of var5 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var5 < 2147483648; +[value] computing for function printf4 <- main. + Called from tests/slicing/unravel-variance.c:56. +tests/slicing/unravel-variance.c:56:[kernel] warning: Neither code nor specification for function printf4, generating default assigns from the prototype +[value] using specification for function printf4 +[value] Done for function printf4 +tests/slicing/unravel-variance.c:57:[kernel] warning: overflow in conversion + of var1 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var1 < 2147483648; +[value] computing for function printf5 <- main. + Called from tests/slicing/unravel-variance.c:57. +tests/slicing/unravel-variance.c:57:[kernel] warning: Neither code nor specification for function printf5, generating default assigns from the prototype +[value] using specification for function printf5 +[value] Done for function printf5 +[value] Recording results for main +[value] done for function main +[scope:rm_asserts] removing 8 assertion(s) +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function scanf +[from] Done for function scanf +[from] Computing for function printf1 +[from] Done for function printf1 +[from] Computing for function printf2 +[from] Done for function printf2 +[from] Computing for function printf3 +[from] Done for function printf3 +[from] Computing for function printf4 +[from] Done for function printf4 +[from] Computing for function printf5 +[from] Done for function printf5 +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int scanf(char const *, int *p); + +extern int printf2(char const *, int); + +void main(void) +{ + float x[1024]; + float var3; + float t1; + float ssq; + float avg; + int i; + int n; + t1 = (float)0; + ssq = (float)0; + scanf("%d",& n); + i = 0; + while (i < n) { + scanf("%f",(int *)(& x[i])); + t1 += x[i]; + ssq += x[i] * x[i]; + i ++; + } + avg = t1 / (float)n; + var3 = (ssq - ((float)n * avg) * avg) / (float)(n - 1); + printf2("variance (one pass, using average): %f \n",(int)var3); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-variance.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-variance.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-variance.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-variance.2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,235 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unravel-variance.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:32. +tests/slicing/unravel-variance.c:32:[kernel] warning: Neither code nor specification for function scanf, generating default assigns from the prototype +[value] using specification for function scanf +[value] Done for function scanf +tests/slicing/unravel-variance.c:33:[value] entering loop for the first time +tests/slicing/unravel-variance.c:33:[kernel] warning: accessing uninitialized left-value: assert \initialized(&n); +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +tests/slicing/unravel-variance.c:36:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:36:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(x[i]*x[i])); +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +tests/slicing/unravel-variance.c:36:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t1+x[i])); +tests/slicing/unravel-variance.c:37:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq+(float)(x[i]*x[i]))); +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +tests/slicing/unravel-variance.c:36:[kernel] warning: accessing out of bounds index [0..1024]. assert i < 1024; +tests/slicing/unravel-variance.c:39:[kernel] warning: non-finite float value ([--..--]): assert \is_finite((float)(t1/(float)n)); +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^158 .. 1.9999998807907104*2^158]): + assert \is_finite((float)((float)n*avg)); +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)((float)((float)n*avg)*avg)); +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq-(float)((float)((float)n*avg)*avg))); +tests/slicing/unravel-variance.c:40:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value ([--..--]): + assert + \is_finite((float)((float)(ssq-(float)((float)((float)n*avg)*avg))/(float) + ((int)(n-1)))); +tests/slicing/unravel-variance.c:41:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(t1*avg)); +tests/slicing/unravel-variance.c:41:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq-(float)(t1*avg))); +tests/slicing/unravel-variance.c:41:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:41:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(ssq-(float)(t1*avg))/(float)((int)(n-1)))); +tests/slicing/unravel-variance.c:42:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(t1*t1)); +tests/slicing/unravel-variance.c:42:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(t1*t1)/(float)n)); +tests/slicing/unravel-variance.c:43:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq-t1)); +tests/slicing/unravel-variance.c:43:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:43:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(ssq-t1)/(float)((int)(n-1)))); +tests/slicing/unravel-variance.c:45:[value] entering loop for the first time +tests/slicing/unravel-variance.c:47:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:47:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(x[i]); +tests/slicing/unravel-variance.c:47:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(x[i]-avg)); +tests/slicing/unravel-variance.c:49:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(dev*dev)); +tests/slicing/unravel-variance.c:48:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t2+dev)); +tests/slicing/unravel-variance.c:49:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t1+(float)(dev*dev))); +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(t2*t2)); +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(t2*t2)/(float)n)); +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t1-(float)((float)(t2*t2)/(float)n))); +tests/slicing/unravel-variance.c:51:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value ([--..--]): + assert + \is_finite((float)((float)(t1-(float)((float)(t2*t2)/(float)n))/(float) + ((int)(n-1)))); +tests/slicing/unravel-variance.c:52:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:52:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)(t1/(float)((int)(n-1)))); +tests/slicing/unravel-variance.c:53:[kernel] warning: overflow in conversion + of var2 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var2 < 2147483648; +[value] computing for function printf1 <- main. + Called from tests/slicing/unravel-variance.c:53. +tests/slicing/unravel-variance.c:53:[kernel] warning: Neither code nor specification for function printf1, generating default assigns from the prototype +[value] using specification for function printf1 +[value] Done for function printf1 +tests/slicing/unravel-variance.c:54:[kernel] warning: overflow in conversion + of var3 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var3 < 2147483648; +[value] computing for function printf2 <- main. + Called from tests/slicing/unravel-variance.c:54. +tests/slicing/unravel-variance.c:54:[kernel] warning: Neither code nor specification for function printf2, generating default assigns from the prototype +[value] using specification for function printf2 +[value] Done for function printf2 +tests/slicing/unravel-variance.c:55:[kernel] warning: overflow in conversion + of var4 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var4 < 2147483648; +[value] computing for function printf3 <- main. + Called from tests/slicing/unravel-variance.c:55. +tests/slicing/unravel-variance.c:55:[kernel] warning: Neither code nor specification for function printf3, generating default assigns from the prototype +[value] using specification for function printf3 +[value] Done for function printf3 +tests/slicing/unravel-variance.c:56:[kernel] warning: overflow in conversion + of var5 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var5 < 2147483648; +[value] computing for function printf4 <- main. + Called from tests/slicing/unravel-variance.c:56. +tests/slicing/unravel-variance.c:56:[kernel] warning: Neither code nor specification for function printf4, generating default assigns from the prototype +[value] using specification for function printf4 +[value] Done for function printf4 +tests/slicing/unravel-variance.c:57:[kernel] warning: overflow in conversion + of var1 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var1 < 2147483648; +[value] computing for function printf5 <- main. + Called from tests/slicing/unravel-variance.c:57. +tests/slicing/unravel-variance.c:57:[kernel] warning: Neither code nor specification for function printf5, generating default assigns from the prototype +[value] using specification for function printf5 +[value] Done for function printf5 +[value] Recording results for main +[value] done for function main +[scope:rm_asserts] removing 8 assertion(s) +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function scanf +[from] Done for function scanf +[from] Computing for function printf1 +[from] Done for function printf1 +[from] Computing for function printf2 +[from] Done for function printf2 +[from] Computing for function printf3 +[from] Done for function printf3 +[from] Computing for function printf4 +[from] Done for function printf4 +[from] Computing for function printf5 +[from] Done for function printf5 +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int scanf(char const *, int *p); + +extern int printf3(char const *, int); + +void main(void) +{ + float x[1024]; + float var4; + float t1; + float ssq; + float avg; + int i; + int n; + t1 = (float)0; + ssq = (float)0; + scanf("%d",& n); + i = 0; + while (i < n) { + scanf("%f",(int *)(& x[i])); + t1 += x[i]; + ssq += x[i] * x[i]; + i ++; + } + avg = t1 / (float)n; + var4 = (ssq - t1 * avg) / (float)(n - 1); + printf3("variance (one pass, using average, sum): %f \n",(int)var4); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-variance.3.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-variance.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-variance.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-variance.3.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,243 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unravel-variance.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:32. +tests/slicing/unravel-variance.c:32:[kernel] warning: Neither code nor specification for function scanf, generating default assigns from the prototype +[value] using specification for function scanf +[value] Done for function scanf +tests/slicing/unravel-variance.c:33:[value] entering loop for the first time +tests/slicing/unravel-variance.c:33:[kernel] warning: accessing uninitialized left-value: assert \initialized(&n); +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +tests/slicing/unravel-variance.c:36:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:36:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(x[i]*x[i])); +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +tests/slicing/unravel-variance.c:36:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t1+x[i])); +tests/slicing/unravel-variance.c:37:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq+(float)(x[i]*x[i]))); +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +tests/slicing/unravel-variance.c:36:[kernel] warning: accessing out of bounds index [0..1024]. assert i < 1024; +tests/slicing/unravel-variance.c:39:[kernel] warning: non-finite float value ([--..--]): assert \is_finite((float)(t1/(float)n)); +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^158 .. 1.9999998807907104*2^158]): + assert \is_finite((float)((float)n*avg)); +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)((float)((float)n*avg)*avg)); +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq-(float)((float)((float)n*avg)*avg))); +tests/slicing/unravel-variance.c:40:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value ([--..--]): + assert + \is_finite((float)((float)(ssq-(float)((float)((float)n*avg)*avg))/(float) + ((int)(n-1)))); +tests/slicing/unravel-variance.c:41:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(t1*avg)); +tests/slicing/unravel-variance.c:41:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq-(float)(t1*avg))); +tests/slicing/unravel-variance.c:41:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:41:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(ssq-(float)(t1*avg))/(float)((int)(n-1)))); +tests/slicing/unravel-variance.c:42:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(t1*t1)); +tests/slicing/unravel-variance.c:42:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(t1*t1)/(float)n)); +tests/slicing/unravel-variance.c:43:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq-t1)); +tests/slicing/unravel-variance.c:43:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:43:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(ssq-t1)/(float)((int)(n-1)))); +tests/slicing/unravel-variance.c:45:[value] entering loop for the first time +tests/slicing/unravel-variance.c:47:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:47:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(x[i]); +tests/slicing/unravel-variance.c:47:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(x[i]-avg)); +tests/slicing/unravel-variance.c:49:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(dev*dev)); +tests/slicing/unravel-variance.c:48:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t2+dev)); +tests/slicing/unravel-variance.c:49:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t1+(float)(dev*dev))); +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(t2*t2)); +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(t2*t2)/(float)n)); +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t1-(float)((float)(t2*t2)/(float)n))); +tests/slicing/unravel-variance.c:51:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value ([--..--]): + assert + \is_finite((float)((float)(t1-(float)((float)(t2*t2)/(float)n))/(float) + ((int)(n-1)))); +tests/slicing/unravel-variance.c:52:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:52:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)(t1/(float)((int)(n-1)))); +tests/slicing/unravel-variance.c:53:[kernel] warning: overflow in conversion + of var2 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var2 < 2147483648; +[value] computing for function printf1 <- main. + Called from tests/slicing/unravel-variance.c:53. +tests/slicing/unravel-variance.c:53:[kernel] warning: Neither code nor specification for function printf1, generating default assigns from the prototype +[value] using specification for function printf1 +[value] Done for function printf1 +tests/slicing/unravel-variance.c:54:[kernel] warning: overflow in conversion + of var3 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var3 < 2147483648; +[value] computing for function printf2 <- main. + Called from tests/slicing/unravel-variance.c:54. +tests/slicing/unravel-variance.c:54:[kernel] warning: Neither code nor specification for function printf2, generating default assigns from the prototype +[value] using specification for function printf2 +[value] Done for function printf2 +tests/slicing/unravel-variance.c:55:[kernel] warning: overflow in conversion + of var4 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var4 < 2147483648; +[value] computing for function printf3 <- main. + Called from tests/slicing/unravel-variance.c:55. +tests/slicing/unravel-variance.c:55:[kernel] warning: Neither code nor specification for function printf3, generating default assigns from the prototype +[value] using specification for function printf3 +[value] Done for function printf3 +tests/slicing/unravel-variance.c:56:[kernel] warning: overflow in conversion + of var5 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var5 < 2147483648; +[value] computing for function printf4 <- main. + Called from tests/slicing/unravel-variance.c:56. +tests/slicing/unravel-variance.c:56:[kernel] warning: Neither code nor specification for function printf4, generating default assigns from the prototype +[value] using specification for function printf4 +[value] Done for function printf4 +tests/slicing/unravel-variance.c:57:[kernel] warning: overflow in conversion + of var1 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var1 < 2147483648; +[value] computing for function printf5 <- main. + Called from tests/slicing/unravel-variance.c:57. +tests/slicing/unravel-variance.c:57:[kernel] warning: Neither code nor specification for function printf5, generating default assigns from the prototype +[value] using specification for function printf5 +[value] Done for function printf5 +[value] Recording results for main +[value] done for function main +[scope:rm_asserts] removing 8 assertion(s) +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function scanf +[from] Done for function scanf +[from] Computing for function printf1 +[from] Done for function printf1 +[from] Computing for function printf2 +[from] Done for function printf2 +[from] Computing for function printf3 +[from] Done for function printf3 +[from] Computing for function printf4 +[from] Done for function printf4 +[from] Computing for function printf5 +[from] Done for function printf5 +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int scanf(char const *, int *p); + +extern int printf4(char const *, int); + +void main(void) +{ + float x[1024]; + float var5; + float t1; + float t2; + float avg; + float dev; + int i; + int n; + t2 = (float)0; + t1 = (float)0; + scanf("%d",& n); + i = 0; + while (i < n) { + scanf("%f",(int *)(& x[i])); + t1 += x[i]; + i ++; + } + avg = t1 / (float)n; + t1 = (float)0; + i = 0; + while (i < n) { + dev = x[i] - avg; + t2 += dev; + t1 += dev * dev; + i ++; + } + var5 = (t1 - (t2 * t2) / (float)n) / (float)(n - 1); + printf4("variance (two pass, corrected): %f \n",(int)var5); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-variance.4.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-variance.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-variance.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-variance.4.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,240 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unravel-variance.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:32. +tests/slicing/unravel-variance.c:32:[kernel] warning: Neither code nor specification for function scanf, generating default assigns from the prototype +[value] using specification for function scanf +[value] Done for function scanf +tests/slicing/unravel-variance.c:33:[value] entering loop for the first time +tests/slicing/unravel-variance.c:33:[kernel] warning: accessing uninitialized left-value: assert \initialized(&n); +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +tests/slicing/unravel-variance.c:36:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:36:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(x[i]*x[i])); +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +tests/slicing/unravel-variance.c:36:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t1+x[i])); +tests/slicing/unravel-variance.c:37:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq+(float)(x[i]*x[i]))); +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +tests/slicing/unravel-variance.c:36:[kernel] warning: accessing out of bounds index [0..1024]. assert i < 1024; +tests/slicing/unravel-variance.c:39:[kernel] warning: non-finite float value ([--..--]): assert \is_finite((float)(t1/(float)n)); +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^158 .. 1.9999998807907104*2^158]): + assert \is_finite((float)((float)n*avg)); +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)((float)((float)n*avg)*avg)); +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq-(float)((float)((float)n*avg)*avg))); +tests/slicing/unravel-variance.c:40:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value ([--..--]): + assert + \is_finite((float)((float)(ssq-(float)((float)((float)n*avg)*avg))/(float) + ((int)(n-1)))); +tests/slicing/unravel-variance.c:41:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(t1*avg)); +tests/slicing/unravel-variance.c:41:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq-(float)(t1*avg))); +tests/slicing/unravel-variance.c:41:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:41:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(ssq-(float)(t1*avg))/(float)((int)(n-1)))); +tests/slicing/unravel-variance.c:42:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(t1*t1)); +tests/slicing/unravel-variance.c:42:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(t1*t1)/(float)n)); +tests/slicing/unravel-variance.c:43:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq-t1)); +tests/slicing/unravel-variance.c:43:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:43:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(ssq-t1)/(float)((int)(n-1)))); +tests/slicing/unravel-variance.c:45:[value] entering loop for the first time +tests/slicing/unravel-variance.c:47:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:47:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(x[i]); +tests/slicing/unravel-variance.c:47:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(x[i]-avg)); +tests/slicing/unravel-variance.c:49:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(dev*dev)); +tests/slicing/unravel-variance.c:48:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t2+dev)); +tests/slicing/unravel-variance.c:49:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t1+(float)(dev*dev))); +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(t2*t2)); +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(t2*t2)/(float)n)); +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t1-(float)((float)(t2*t2)/(float)n))); +tests/slicing/unravel-variance.c:51:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value ([--..--]): + assert + \is_finite((float)((float)(t1-(float)((float)(t2*t2)/(float)n))/(float) + ((int)(n-1)))); +tests/slicing/unravel-variance.c:52:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:52:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)(t1/(float)((int)(n-1)))); +tests/slicing/unravel-variance.c:53:[kernel] warning: overflow in conversion + of var2 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var2 < 2147483648; +[value] computing for function printf1 <- main. + Called from tests/slicing/unravel-variance.c:53. +tests/slicing/unravel-variance.c:53:[kernel] warning: Neither code nor specification for function printf1, generating default assigns from the prototype +[value] using specification for function printf1 +[value] Done for function printf1 +tests/slicing/unravel-variance.c:54:[kernel] warning: overflow in conversion + of var3 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var3 < 2147483648; +[value] computing for function printf2 <- main. + Called from tests/slicing/unravel-variance.c:54. +tests/slicing/unravel-variance.c:54:[kernel] warning: Neither code nor specification for function printf2, generating default assigns from the prototype +[value] using specification for function printf2 +[value] Done for function printf2 +tests/slicing/unravel-variance.c:55:[kernel] warning: overflow in conversion + of var4 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var4 < 2147483648; +[value] computing for function printf3 <- main. + Called from tests/slicing/unravel-variance.c:55. +tests/slicing/unravel-variance.c:55:[kernel] warning: Neither code nor specification for function printf3, generating default assigns from the prototype +[value] using specification for function printf3 +[value] Done for function printf3 +tests/slicing/unravel-variance.c:56:[kernel] warning: overflow in conversion + of var5 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var5 < 2147483648; +[value] computing for function printf4 <- main. + Called from tests/slicing/unravel-variance.c:56. +tests/slicing/unravel-variance.c:56:[kernel] warning: Neither code nor specification for function printf4, generating default assigns from the prototype +[value] using specification for function printf4 +[value] Done for function printf4 +tests/slicing/unravel-variance.c:57:[kernel] warning: overflow in conversion + of var1 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var1 < 2147483648; +[value] computing for function printf5 <- main. + Called from tests/slicing/unravel-variance.c:57. +tests/slicing/unravel-variance.c:57:[kernel] warning: Neither code nor specification for function printf5, generating default assigns from the prototype +[value] using specification for function printf5 +[value] Done for function printf5 +[value] Recording results for main +[value] done for function main +[scope:rm_asserts] removing 8 assertion(s) +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function scanf +[from] Done for function scanf +[from] Computing for function printf1 +[from] Done for function printf1 +[from] Computing for function printf2 +[from] Done for function printf2 +[from] Computing for function printf3 +[from] Done for function printf3 +[from] Computing for function printf4 +[from] Done for function printf4 +[from] Computing for function printf5 +[from] Done for function printf5 +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int scanf(char const *, int *p); + +extern int printf5(char const *, int); + +void main(void) +{ + float x[1024]; + float var1; + float t1; + float avg; + float dev; + int i; + int n; + t1 = (float)0; + scanf("%d",& n); + i = 0; + while (i < n) { + scanf("%f",(int *)(& x[i])); + t1 += x[i]; + i ++; + } + avg = t1 / (float)n; + t1 = (float)0; + i = 0; + while (i < n) { + dev = x[i] - avg; + t1 += dev * dev; + i ++; + } + var1 = t1 / (float)(n - 1); + printf5("variance (two pass): %f \n",(int)var1); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-variance.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-variance.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unravel-variance.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unravel-variance.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,234 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unravel-variance.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:32. +tests/slicing/unravel-variance.c:32:[kernel] warning: Neither code nor specification for function scanf, generating default assigns from the prototype +[value] using specification for function scanf +[value] Done for function scanf +tests/slicing/unravel-variance.c:33:[value] entering loop for the first time +tests/slicing/unravel-variance.c:33:[kernel] warning: accessing uninitialized left-value: assert \initialized(&n); +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +tests/slicing/unravel-variance.c:36:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:36:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(x[i]*x[i])); +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +tests/slicing/unravel-variance.c:36:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t1+x[i])); +tests/slicing/unravel-variance.c:37:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:37:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq+(float)(x[i]*x[i]))); +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +[value] computing for function scanf <- main. + Called from tests/slicing/unravel-variance.c:35. +[value] Done for function scanf +tests/slicing/unravel-variance.c:36:[kernel] warning: accessing out of bounds index [0..1024]. assert i < 1024; +tests/slicing/unravel-variance.c:39:[kernel] warning: non-finite float value ([--..--]): assert \is_finite((float)(t1/(float)n)); +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^158 .. 1.9999998807907104*2^158]): + assert \is_finite((float)((float)n*avg)); +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)((float)((float)n*avg)*avg)); +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq-(float)((float)((float)n*avg)*avg))); +tests/slicing/unravel-variance.c:40:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:40:[kernel] warning: non-finite float value ([--..--]): + assert + \is_finite((float)((float)(ssq-(float)((float)((float)n*avg)*avg))/(float) + ((int)(n-1)))); +tests/slicing/unravel-variance.c:41:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(t1*avg)); +tests/slicing/unravel-variance.c:41:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq-(float)(t1*avg))); +tests/slicing/unravel-variance.c:41:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:41:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(ssq-(float)(t1*avg))/(float)((int)(n-1)))); +tests/slicing/unravel-variance.c:42:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(t1*t1)); +tests/slicing/unravel-variance.c:42:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(t1*t1)/(float)n)); +tests/slicing/unravel-variance.c:43:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(ssq-t1)); +tests/slicing/unravel-variance.c:43:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:43:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(ssq-t1)/(float)((int)(n-1)))); +tests/slicing/unravel-variance.c:45:[value] entering loop for the first time +tests/slicing/unravel-variance.c:47:[kernel] warning: accessing uninitialized left-value: assert \initialized(&x[i]); +tests/slicing/unravel-variance.c:47:[kernel] warning: non-finite float value ([--..--]): assert \is_finite(x[i]); +tests/slicing/unravel-variance.c:47:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(x[i]-avg)); +tests/slicing/unravel-variance.c:49:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(dev*dev)); +tests/slicing/unravel-variance.c:48:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t2+dev)); +tests/slicing/unravel-variance.c:49:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t1+(float)(dev*dev))); +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value + ([-1.9999997615814280*2^255 .. 1.9999997615814280*2^255]): + assert \is_finite((float)(t2*t2)); +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)((float)(t2*t2)/(float)n)); +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value + ([-1.9999998807907104*2^128 .. 1.9999998807907104*2^128]): + assert \is_finite((float)(t1-(float)((float)(t2*t2)/(float)n))); +tests/slicing/unravel-variance.c:51:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:51:[kernel] warning: non-finite float value ([--..--]): + assert + \is_finite((float)((float)(t1-(float)((float)(t2*t2)/(float)n))/(float) + ((int)(n-1)))); +tests/slicing/unravel-variance.c:52:[kernel] warning: signed overflow. assert -2147483648 ≤ n-1; +tests/slicing/unravel-variance.c:52:[kernel] warning: non-finite float value ([--..--]): + assert \is_finite((float)(t1/(float)((int)(n-1)))); +tests/slicing/unravel-variance.c:53:[kernel] warning: overflow in conversion + of var2 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var2 < 2147483648; +[value] computing for function printf1 <- main. + Called from tests/slicing/unravel-variance.c:53. +tests/slicing/unravel-variance.c:53:[kernel] warning: Neither code nor specification for function printf1, generating default assigns from the prototype +[value] using specification for function printf1 +[value] Done for function printf1 +tests/slicing/unravel-variance.c:54:[kernel] warning: overflow in conversion + of var3 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var3 < 2147483648; +[value] computing for function printf2 <- main. + Called from tests/slicing/unravel-variance.c:54. +tests/slicing/unravel-variance.c:54:[kernel] warning: Neither code nor specification for function printf2, generating default assigns from the prototype +[value] using specification for function printf2 +[value] Done for function printf2 +tests/slicing/unravel-variance.c:55:[kernel] warning: overflow in conversion + of var4 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var4 < 2147483648; +[value] computing for function printf3 <- main. + Called from tests/slicing/unravel-variance.c:55. +tests/slicing/unravel-variance.c:55:[kernel] warning: Neither code nor specification for function printf3, generating default assigns from the prototype +[value] using specification for function printf3 +[value] Done for function printf3 +tests/slicing/unravel-variance.c:56:[kernel] warning: overflow in conversion + of var5 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var5 < 2147483648; +[value] computing for function printf4 <- main. + Called from tests/slicing/unravel-variance.c:56. +tests/slicing/unravel-variance.c:56:[kernel] warning: Neither code nor specification for function printf4, generating default assigns from the prototype +[value] using specification for function printf4 +[value] Done for function printf4 +tests/slicing/unravel-variance.c:57:[kernel] warning: overflow in conversion + of var1 ([-1.9999998807907104*2^127 .. 1.9999998807907104*2^127]) from + floating-point to integer. assert -2147483649 < var1 < 2147483648; +[value] computing for function printf5 <- main. + Called from tests/slicing/unravel-variance.c:57. +tests/slicing/unravel-variance.c:57:[kernel] warning: Neither code nor specification for function printf5, generating default assigns from the prototype +[value] using specification for function printf5 +[value] Done for function printf5 +[value] Recording results for main +[value] done for function main +[scope:rm_asserts] removing 8 assertion(s) +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function scanf +[from] Done for function scanf +[from] Computing for function printf1 +[from] Done for function printf1 +[from] Computing for function printf2 +[from] Done for function printf2 +[from] Computing for function printf3 +[from] Done for function printf3 +[from] Computing for function printf4 +[from] Done for function printf4 +[from] Computing for function printf5 +[from] Done for function printf5 +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int scanf(char const *, int *p); + +extern int printf1(char const *, int); + +void main(void) +{ + float x[1024]; + float var2; + float t1; + float ssq; + int i; + int n; + t1 = (float)0; + ssq = (float)0; + scanf("%d",& n); + i = 0; + while (i < n) { + scanf("%f",(int *)(& x[i])); + t1 += x[i]; + ssq += x[i] * x[i]; + i ++; + } + t1 = (t1 * t1) / (float)n; + var2 = (ssq - t1) / (float)(n - 1); + printf1("variance (one pass, using square of sum): %f \n",(int)var2); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unsupported.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unsupported.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unsupported.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unsupported.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,43 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unsupported.i (no preprocessing) +[sparecode] remove unused code... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Call to builtin bzero(({{ (unsigned char *)&t }},{40})) +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function main +[pdg] computing for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +tests/slicing/unsupported.i:6:[sparecode] warning: Dropping annotation +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +/*@ assigns \nothing; */ +extern __attribute__((__FC_BUILTIN__)) void Frama_C_bzero(void); + +int main(void) +{ + int __retres; + int t[10]; + /*@ behavior Frama_C_implicit_init: + assigns t[0 .. 10-1]; */ + { + Frama_C_bzero(); + t[2] = 2; + } + __retres = t[5] + t[2]; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/unsupported.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unsupported.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/unsupported.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/unsupported.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,46 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/unsupported.i (no preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Call to builtin bzero(({{ (unsigned char *)&t }},{40})) +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +tests/slicing/unsupported.i:6:[slicing] warning: Dropping unsupported ACSL annotation +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +/*@ requires \valid(dest+(0 .. n-1)); + ensures ∀ ℤ i; 0 ≤ i < \old(n) ⇒ *(\old(dest)+i) ≡ 0; + */ +extern __attribute__((__FC_BUILTIN__)) void Frama_C_bzero(unsigned char *dest, + unsigned long n); + +int main(void) +{ + int __retres; + int t[10]; + Frama_C_bzero((unsigned char *)(t),(unsigned long)sizeof(int [10])); + t[2] = 2; + __retres = t[5] + t[2]; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/use_spec.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/use_spec.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/use_spec.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/use_spec.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,94 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/use_spec.i (no preprocessing) +tests/slicing/use_spec.i:18:[kernel] warning: Body of function f falls-through. Adding a return statement +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + z ∈ {0} + t ∈ {0} + G1 ∈ {0} + G2 ∈ {0} +[value] computing for function h <- main2. + Called from tests/slicing/use_spec.i:38. +[value] using specification for function h +[value] Done for function h +[value] computing for function h <- main2. + Called from tests/slicing/use_spec.i:40. +[value] Done for function h +tests/slicing/use_spec.i:41:[kernel] warning: signed overflow. assert -2147483648 ≤ tmp+G2 ≤ 2147483647; +[value] Recording results for main2 +[value] done for function main2 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main2 +[from] Computing for function h +[from] Done for function h +[pdg] done for function main2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function h +[pdg] done for function h +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G1 ∈ {0} + G2 ∈ {0} +[value] computing for function h_slice_2 <- main2. + Called from tests/slicing/use_spec.i:38. +[value] using specification for function h_slice_2 +[value] Done for function h_slice_2 +[value] computing for function h_slice_1 <- main2. + Called from tests/slicing/use_spec.i:40. +[value] using specification for function h_slice_1 +[value] Done for function h_slice_1 +tests/slicing/use_spec.i:41:[kernel] warning: signed overflow. assert -2147483648 ≤ tmp+G2 ≤ 2147483647; +[value] Recording results for main2 +[value] done for function main2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main2: + G1 ∈ [--..--] + G2 ∈ [--..--] + tmp ∈ [--..--] + __retres ∈ [--..--] +/* Generated by Frama-C */ +int G1; +int G2; +/*@ ensures G1 ≡ \old(a); + assigns G1, G2; + assigns G1 \from a; + assigns G2 \from \nothing; + */ +void h_slice_2(int a); + +/*@ assigns G1, G2; + assigns G1 \from \nothing; + assigns G2 \from b; */ +void h_slice_1(int b); + +int main2(int v1, int v4) +{ + int __retres; + int tmp; + h_slice_2(v1); + tmp = G1; + h_slice_1(v4); + /*@ assert Value: signed_overflow: tmp+G2 ≤ 2147483647; */ + /*@ assert Value: signed_overflow: -2147483648 ≤ tmp+G2; */ + __retres = tmp + G2; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/use_spec.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/use_spec.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/use_spec.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/use_spec.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,47 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/use_spec.i (no preprocessing) +tests/slicing/use_spec.i:18:[kernel] warning: Body of function f falls-through. Adding a return statement +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + z ∈ {0} + t ∈ {0} + G1 ∈ {0} + G2 ∈ {0} +[value] computing for function f <- main. + Called from tests/slicing/use_spec.i:25. +[value] using specification for function f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int x; +int f(void); + +int main(void) +{ + f(); + return x; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/variadic.1.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/variadic.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/variadic.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/variadic.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,90 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/variadic.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f1 <- main. + Called from tests/pdg/variadic.c:37. +[value] computing for function lib_f <- f1 <- main. + Called from tests/pdg/variadic.c:23. +tests/pdg/variadic.c:23:[kernel] warning: Neither code nor specification for function lib_f, generating default assigns from the prototype +[value] using specification for function lib_f +[value] Done for function lib_f +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/pdg/variadic.c:38. +[value] computing for function lib_f <- f2 <- main. + Called from tests/pdg/variadic.c:27. +[value] Done for function lib_f +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/pdg/variadic.c:39. +[value] computing for function lib_f <- f3 <- main. + Called from tests/pdg/variadic.c:31. +[value] Done for function lib_f +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f2 <- main. + Called from tests/pdg/variadic.c:40. +[value] computing for function lib_f <- f2 <- main. + Called from tests/pdg/variadic.c:27. +[value] Done for function lib_f +[value] Recording results for f2 +[value] Done for function f2 +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f3 +[from] Computing for function lib_f +[from] Done for function lib_f +[pdg] done for function f3 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main +[from] Computing for function f1 +tests/pdg/variadic.c:23:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function f1 +[from] Computing for function f2 +tests/pdg/variadic.c:27:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function f2 +[from] Computing for function f3 +tests/pdg/variadic.c:31:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function f3 +[pdg] done for function main +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int lib_f(int n , ...); + +int f3_slice_1(int a, int b, int c) +{ + int tmp; + tmp = lib_f(3,a,b,c); + return tmp; +} + +void main(void) +{ + int a4; + int a5; + int a6; + a4 = 4; + a5 = 5; + a6 = 6; + f3_slice_1(a4,a5,a6); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/variadic.2.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/variadic.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/variadic.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/variadic.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,104 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/variadic.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f1 <- main. + Called from tests/pdg/variadic.c:37. +[value] computing for function lib_f <- f1 <- main. + Called from tests/pdg/variadic.c:23. +tests/pdg/variadic.c:23:[kernel] warning: Neither code nor specification for function lib_f, generating default assigns from the prototype +[value] using specification for function lib_f +[value] Done for function lib_f +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/pdg/variadic.c:38. +[value] computing for function lib_f <- f2 <- main. + Called from tests/pdg/variadic.c:27. +[value] Done for function lib_f +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/pdg/variadic.c:39. +[value] computing for function lib_f <- f3 <- main. + Called from tests/pdg/variadic.c:31. +[value] Done for function lib_f +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f2 <- main. + Called from tests/pdg/variadic.c:40. +[value] computing for function lib_f <- f2 <- main. + Called from tests/pdg/variadic.c:27. +[value] Done for function lib_f +[value] Recording results for f2 +[value] Done for function f2 +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function f1 +[from] Computing for function lib_f <-f1 +[from] Done for function lib_f +tests/pdg/variadic.c:23:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function f1 +[from] Computing for function f2 +tests/pdg/variadic.c:27:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function f2 +[from] Computing for function f3 +tests/pdg/variadic.c:31:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function f3 +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f2 +[pdg] done for function f2 +[pdg] computing for function f1 +[pdg] done for function f1 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int lib_f(int n , ...); + +int f1_slice_1(int a) +{ + int tmp; + tmp = lib_f(1,a); + return tmp; +} + +int f2_slice_1(int a, int b) +{ + int tmp; + tmp = lib_f(2,a,b); + return tmp; +} + +int main(void) +{ + int a1; + int a2; + int a3; + int s; + int s1; + int s2; + a1 = 1; + a2 = 2; + a3 = 3; + s1 = f1_slice_1(a1); + s2 = f2_slice_1(a2,a3); + s = f2_slice_1(s1,s2); + return s; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/variadic.3.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/variadic.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/variadic.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/variadic.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,104 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/variadic.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f1 <- main. + Called from tests/pdg/variadic.c:37. +[value] computing for function lib_f <- f1 <- main. + Called from tests/pdg/variadic.c:23. +tests/pdg/variadic.c:23:[kernel] warning: Neither code nor specification for function lib_f, generating default assigns from the prototype +[value] using specification for function lib_f +[value] Done for function lib_f +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/pdg/variadic.c:38. +[value] computing for function lib_f <- f2 <- main. + Called from tests/pdg/variadic.c:27. +[value] Done for function lib_f +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/pdg/variadic.c:39. +[value] computing for function lib_f <- f3 <- main. + Called from tests/pdg/variadic.c:31. +[value] Done for function lib_f +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f2 <- main. + Called from tests/pdg/variadic.c:40. +[value] computing for function lib_f <- f2 <- main. + Called from tests/pdg/variadic.c:27. +[value] Done for function lib_f +[value] Recording results for f2 +[value] Done for function f2 +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function f1 +[from] Computing for function lib_f <-f1 +[from] Done for function lib_f +tests/pdg/variadic.c:23:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function f1 +[from] Computing for function f2 +tests/pdg/variadic.c:27:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function f2 +[from] Computing for function f3 +tests/pdg/variadic.c:31:[from] warning: variadic call detected. Using only 1 argument(s). +[from] Done for function f3 +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f2 +[pdg] done for function f2 +[pdg] computing for function f1 +[pdg] done for function f1 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int lib_f(int n , ...); + +int f1_slice_1(int a) +{ + int tmp; + tmp = lib_f(1,a); + return tmp; +} + +int f2_slice_1(int a, int b) +{ + int tmp; + tmp = lib_f(2,a,b); + return tmp; +} + +int main(void) +{ + int a1; + int a2; + int a3; + int s; + int s1; + int s2; + a1 = 1; + a2 = 2; + a3 = 3; + s1 = f1_slice_1(a1); + s2 = f2_slice_1(a2,a3); + s = f2_slice_1(s1,s2); + return s; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/oracle/variadic.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing/oracle/variadic.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing/oracle/variadic.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/oracle/variadic.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,67 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing/variadic.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f1 <- main. + Called from tests/pdg/variadic.c:37. +[value] computing for function lib_f <- f1 <- main. + Called from tests/pdg/variadic.c:23. +tests/pdg/variadic.c:23:[kernel] warning: Neither code nor specification for function lib_f, generating default assigns from the prototype +[value] using specification for function lib_f +[value] Done for function lib_f +[value] Recording results for f1 +[value] Done for function f1 +[value] computing for function f2 <- main. + Called from tests/pdg/variadic.c:38. +[value] computing for function lib_f <- f2 <- main. + Called from tests/pdg/variadic.c:27. +[value] Done for function lib_f +[value] Recording results for f2 +[value] Done for function f2 +[value] computing for function f3 <- main. + Called from tests/pdg/variadic.c:39. +[value] computing for function lib_f <- f3 <- main. + Called from tests/pdg/variadic.c:31. +[value] Done for function lib_f +[value] Recording results for f3 +[value] Done for function f3 +[value] computing for function f2 <- main. + Called from tests/pdg/variadic.c:40. +[value] computing for function lib_f <- f2 <- main. + Called from tests/pdg/variadic.c:27. +[value] Done for function lib_f +[value] Recording results for f2 +[value] Done for function f2 +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f3 +[from] Computing for function lib_f +[from] Done for function lib_f +[pdg] done for function f3 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +extern int lib_f(int n , ...); + +int f3_slice_1(int a, int b, int c) +{ + int tmp; + tmp = lib_f(3,a,b,c); + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/README frama-c-20150201+sodium+dfsg/tests/slicing/README --- frama-c-20140301+neon+dfsg/tests/slicing/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,93 @@ +This file present the tests in ppc/tests/slicing. +For the Program Dependence Graph tests, see ppc/tests/pdg. + +** tests/slicing/simple_intra_slice.c & tests/slicing/simple_intra_slice.ml + First slicing test. Still use internal functions of the Slicing module + to test internal features (select with a statement number for instance). + Many small tests for intra-procedural slicing. + +** tests/slicing/select_by_annot.c & tests/slicing/select_by_annot.ml + At first, there were no internal means to build a location for a data at a + given program point, so test the slicing on a data using annotation in the + source code. + +** tests/slicing/libSelect.ml + Library used in other tests to have higher level functions. + Also includes a try to have a 'load_source_file' function in order to be + able to change the project without exiting the tool, but it doesn't work + at the moment because of CIL problems. + +** tests/slicing/select_simple.c & tests/slicing/select_simple.ml + Same source code than simple_intra_slice.c but test it with a user + point of view using Select module (above) functions. + +** tests/slicing/switch.c & tests/slicing/switch.ml + One very small test on a switch. Should do more... + +** tests/slicing/ex_spec_interproc.c & tests/slicing/ex_spec_interproc.ml + Example given by Patrick for the specification of the inter-procedural + slicing. Test the example using different slicing modes. + See the documentation for more information. + +** tests/slicing/horwitz.c & tests/slicing/horwitz.ml + Example from a paper of Horwitz about inter-procedural slicing. + Check if we have the same result than her with her System Dependence Graph. + +** tests/slicing/adpcm.c & tests/slicing/adpcm.ml + source code from tests/test/adpcm.c. To have a bigger example... + +** tests/slicing/ptr_fct.c + Example given by Patrick for the specification/documentation + of Db.Slicing.Project.is_directly_called_internal. + +** tests/slicing/sizeof.c + Example given by Patrick. + Tests the slicing + different slicing modes with and without propagation to the callers. + This is done using options of the command line: + -slice-print, -slicing-return. + +** tests/slicing/select_return.c +** tests/slicing/select_return_bis.c + Example given by Patrick for the specification of the inter-procedural + slicing including the propagation to the callers. Tests the example using + different slicing modes with and without propagation to the callers. + This is done using options of the command line: + -slice-print, -slicing-level, -slicing-return and -slice-calls, + with/without -slice-callers. + Some tests for -slice-value have been added. + +** tests/slicing/select_call.c + Example given by Julien for the specification of property analysis about + data confidentiality. Test -slice-calls option. + +** tests/slicing/mark_all_slices.c + tests for the newly created (04/2007) persistant selection. + +** tests/slicing/min_call.c + the source code is included from tests/slicing/select_return.c, + but le .ml command file is to test the propagation to the callers. + It use the new (04/2007) [select_min_call] + function that can be used to select a call to be visible without choosing + the version of the function to call. + +** tests/slicing/libAnim.ml + Usefull functions to view graphically the building process of a slicing + project. + +** tests/slicing/anim.ml + Small example to see how to use tests/slicing/libAnim.ml + (see the header lines to launch it) + +** tests/slicing/merge.c + Basic test for merging slices (to be enhance...) + +** tests/slicing/variadic.c + Same source file than tests/pdg/variadic.c (#include). + Slicing variadic functions and calls to variadic functions. + +** tests/slicing/unravel-flavors.c +** tests/slicing/unravel-point.c +** tests/slicing/unravel-variance.c + Small example derived from examples given for UNRAVEL slicing tool. + diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/select_return.c frama-c-20150201+sodium+dfsg/tests/slicing/select_return.c --- frama-c-20140301+neon+dfsg/tests/slicing/select_return.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/select_return.c 2015-05-28 08:53:24.000000000 +0000 @@ -7,9 +7,9 @@ OPT: -check -slice-calls send,send_bis -lib-entry -main g -slicing-level 1 -no-slice-callers -journal-disable -then-on 'Slicing export' -print OPT: -check -slice-calls send,send_bis -lib-entry -main g -slicing-level 2 -no-slice-callers -journal-disable -then-on 'Slicing export' -print OPT: -check -slice-calls send,send_bis -lib-entry -main g -slicing-level 3 -no-slice-callers -journal-disable -then-on 'Slicing export' -print - OPT: -check -slice-calls "send , send_bis" -lib-entry -main g -slicing-level 1 -journal-disable -then-on 'Slicing export' -print + OPT: -check -slice-calls "send, send_bis" -lib-entry -main g -slicing-level 1 -journal-disable -then-on 'Slicing export' -print OPT: -check -slice-calls "send, send_bis" -lib-entry -main g -slicing-level 2 -journal-disable -then-on 'Slicing export' -print - OPT: -check -slice-calls "send ,send_bis" -lib-entry -main g -slicing-level 3 -journal-disable -then-on 'Slicing export' -print + OPT: -check -slice-calls "send,send_bis" -lib-entry -main g -slicing-level 3 -journal-disable -then-on 'Slicing export' -print OPT: -check -slice-return f -lib-entry -main g -slicing-level 0 -no-slice-callers -journal-disable -then-on 'Slicing export' -print OPT: -check -slice-return f -lib-entry -main g -slicing-level 1 -no-slice-callers -journal-disable -then-on 'Slicing export' -print OPT: -check -slice-return f -lib-entry -main g -slicing-level 2 -no-slice-callers -journal-disable -then-on 'Slicing export' -print diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/test_config frama-c-20150201+sodium+dfsg/tests/slicing/test_config --- frama-c-20140301+neon+dfsg/tests/slicing/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/test_config 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1 @@ +CMD: FRAMAC_PLUGIN=tests/.empty @frama-c@ \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/tests.ex_spec_interproc.sh frama-c-20150201+sodium+dfsg/tests/slicing/tests.ex_spec_interproc.sh --- frama-c-20140301+neon+dfsg/tests/slicing/tests.ex_spec_interproc.sh 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/tests.ex_spec_interproc.sh 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,4 @@ +#!/bin/sh + + +`dirname $0`/tests.sh ex_spec_interproc diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/tests.horwitz.sh frama-c-20150201+sodium+dfsg/tests/slicing/tests.horwitz.sh --- frama-c-20140301+neon+dfsg/tests/slicing/tests.horwitz.sh 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/tests.horwitz.sh 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,4 @@ +#!/bin/sh + + +`dirname $0`/tests.sh horwitz diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/tests.select_by_annot.sh frama-c-20150201+sodium+dfsg/tests/slicing/tests.select_by_annot.sh --- frama-c-20140301+neon+dfsg/tests/slicing/tests.select_by_annot.sh 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/tests.select_by_annot.sh 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,3 @@ +#!/bin/sh + +`dirname $0`/tests.sh select_by_annot diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/tests.select_simple.sh frama-c-20150201+sodium+dfsg/tests/slicing/tests.select_simple.sh --- frama-c-20140301+neon+dfsg/tests/slicing/tests.select_simple.sh 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/tests.select_simple.sh 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,3 @@ +#!/bin/sh + +`dirname $0`/tests.sh select_simple diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/tests.sh frama-c-20150201+sodium+dfsg/tests/slicing/tests.sh --- frama-c-20140301+neon+dfsg/tests/slicing/tests.sh 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/tests.sh 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh + +BASE=$1 + +EXE_FILE=tests/slicing/$BASE.byte +RES_FILE=tests/slicing/result/$BASE.res.log +ERR_FILE=tests/slicing/result/$BASE.err.log + +make -s $EXE_FILE + +CMD="$EXE_FILE -deps tests/slicing/$BASE.c" + +echo "$CMD" +#echo "RES = $RES_FILE" +#echo "ERR = $ERR_FILE" + +$CMD > $RES_FILE 2> $ERR_FILE diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/tests.simple_intra_slice.sh frama-c-20150201+sodium+dfsg/tests/slicing/tests.simple_intra_slice.sh --- frama-c-20140301+neon+dfsg/tests/slicing/tests.simple_intra_slice.sh 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/tests.simple_intra_slice.sh 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,3 @@ +#!/bin/sh + +`dirname $0`/tests.sh simple_intra_slice diff -Nru frama-c-20140301+neon+dfsg/tests/slicing/use_spec.i frama-c-20150201+sodium+dfsg/tests/slicing/use_spec.i --- frama-c-20140301+neon+dfsg/tests/slicing/use_spec.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing/use_spec.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,6 +1,6 @@ /* run.config OPT: -val-use-spec f -slice-return main -journal-disable -then-on 'Slicing export' -print -check - OPT: -main main2 -slicing-level 3 -slice-undef-functions -val-use-spec h -slice-return main2 -journal-disable -slicing-keep-annotations -then-on 'Slicing export' -print -check -val + OPT: -main main2 -slicing-level 3 -slice-undef-functions -val-use-spec h -slice-return main2 -journal-disable -slicing-keep-annotations -then-on 'Slicing export' -print -check -val -val-use-spec='-@all' diff -Nru frama-c-20140301+neon+dfsg/tests/slicing2/oracle/adpcm.res.oracle frama-c-20150201+sodium+dfsg/tests/slicing2/oracle/adpcm.res.oracle --- frama-c-20140301+neon+dfsg/tests/slicing2/oracle/adpcm.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/slicing2/oracle/adpcm.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,2077 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/slicing2/adpcm.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + tqmf[0..23] ∈ {0} + h[0] ∈ {12} + [1..2] ∈ {-44} + [3] ∈ {212} + [4] ∈ {48} + [5] ∈ {-624} + [6] ∈ {128} + [7] ∈ {1448} + [8] ∈ {-840} + [9] ∈ {-3220} + [10] ∈ {3804} + [11..12] ∈ {15504} + [13] ∈ {3804} + [14] ∈ {-3220} + [15] ∈ {-840} + [16] ∈ {1448} + [17] ∈ {128} + [18] ∈ {-624} + [19] ∈ {48} + [20] ∈ {212} + [21..22] ∈ {-44} + [23] ∈ {12} + xl ∈ {0} + xh ∈ {0} + accumc[0..10] ∈ {0} + accumd[0..10] ∈ {0} + xout1 ∈ {0} + xout2 ∈ {0} + xs ∈ {0} + xd ∈ {0} + il ∈ {0} + szl ∈ {0} + spl ∈ {0} + sl ∈ {0} + el ∈ {0} + qq4_code4_table[0] ∈ {0} + [1] ∈ {-20456} + [2] ∈ {-12896} + [3] ∈ {-8968} + [4] ∈ {-6288} + [5] ∈ {-4240} + [6] ∈ {-2584} + [7] ∈ {-1200} + [8] ∈ {20456} + [9] ∈ {12896} + [10] ∈ {8968} + [11] ∈ {6288} + [12] ∈ {4240} + [13] ∈ {2584} + [14] ∈ {1200} + [15] ∈ {0} + qq5_code5_table[0..1] ∈ {-280} + [2] ∈ {-23352} + [3] ∈ {-17560} + [4] ∈ {-14120} + [5] ∈ {-11664} + [6] ∈ {-9752} + [7] ∈ {-8184} + [8] ∈ {-6864} + [9] ∈ {-5712} + [10] ∈ {-4696} + [11] ∈ {-3784} + [12] ∈ {-2960} + [13] ∈ {-2208} + [14] ∈ {-1520} + [15] ∈ {-880} + [16] ∈ {23352} + [17] ∈ {17560} + [18] ∈ {14120} + [19] ∈ {11664} + [20] ∈ {9752} + [21] ∈ {8184} + [22] ∈ {6864} + [23] ∈ {5712} + [24] ∈ {4696} + [25] ∈ {3784} + [26] ∈ {2960} + [27] ∈ {2208} + [28] ∈ {1520} + [29] ∈ {880} + [30] ∈ {280} + [31] ∈ {-280} + qq6_code6_table[0..3] ∈ {-136} + [4] ∈ {-24808} + [5] ∈ {-21904} + [6] ∈ {-19008} + [7] ∈ {-16704} + [8] ∈ {-14984} + [9] ∈ {-13512} + [10] ∈ {-12280} + [11] ∈ {-11192} + [12] ∈ {-10232} + [13] ∈ {-9360} + [14] ∈ {-8576} + [15] ∈ {-7856} + [16] ∈ {-7192} + [17] ∈ {-6576} + [18] ∈ {-6000} + [19] ∈ {-5456} + [20] ∈ {-4944} + [21] ∈ {-4464} + [22] ∈ {-4008} + [23] ∈ {-3576} + [24] ∈ {-3168} + [25] ∈ {-2776} + [26] ∈ {-2400} + [27] ∈ {-2032} + [28] ∈ {-1688} + [29] ∈ {-1360} + [30] ∈ {-1040} + [31] ∈ {-728} + [32] ∈ {24808} + [33] ∈ {21904} + [34] ∈ {19008} + [35] ∈ {16704} + [36] ∈ {14984} + [37] ∈ {13512} + [38] ∈ {12280} + [39] ∈ {11192} + [40] ∈ {10232} + [41] ∈ {9360} + [42] ∈ {8576} + [43] ∈ {7856} + [44] ∈ {7192} + [45] ∈ {6576} + [46] ∈ {6000} + [47] ∈ {5456} + [48] ∈ {4944} + [49] ∈ {4464} + [50] ∈ {4008} + [51] ∈ {3576} + [52] ∈ {3168} + [53] ∈ {2776} + [54] ∈ {2400} + [55] ∈ {2032} + [56] ∈ {1688} + [57] ∈ {1360} + [58] ∈ {1040} + [59] ∈ {728} + [60] ∈ {432} + [61] ∈ {136} + [62] ∈ {-432} + [63] ∈ {-136} + delay_bpl[0..5] ∈ {0} + delay_dltx[0..5] ∈ {0} + wl_code_table[0] ∈ {-60} + [1] ∈ {3042} + [2] ∈ {1198} + [3] ∈ {538} + [4] ∈ {334} + [5] ∈ {172} + [6] ∈ {58} + [7] ∈ {-30} + [8] ∈ {3042} + [9] ∈ {1198} + [10] ∈ {538} + [11] ∈ {334} + [12] ∈ {172} + [13] ∈ {58} + [14] ∈ {-30} + [15] ∈ {-60} + wl_table[0] ∈ {-60} + [1] ∈ {-30} + [2] ∈ {58} + [3] ∈ {172} + [4] ∈ {334} + [5] ∈ {538} + [6] ∈ {1198} + [7] ∈ {3042} + ilb_table[0] ∈ {2048} + [1] ∈ {2093} + [2] ∈ {2139} + [3] ∈ {2186} + [4] ∈ {2233} + [5] ∈ {2282} + [6] ∈ {2332} + [7] ∈ {2383} + [8] ∈ {2435} + [9] ∈ {2489} + [10] ∈ {2543} + [11] ∈ {2599} + [12] ∈ {2656} + [13] ∈ {2714} + [14] ∈ {2774} + [15] ∈ {2834} + [16] ∈ {2896} + [17] ∈ {2960} + [18] ∈ {3025} + [19] ∈ {3091} + [20] ∈ {3158} + [21] ∈ {3228} + [22] ∈ {3298} + [23] ∈ {3371} + [24] ∈ {3444} + [25] ∈ {3520} + [26] ∈ {3597} + [27] ∈ {3676} + [28] ∈ {3756} + [29] ∈ {3838} + [30] ∈ {3922} + [31] ∈ {4008} + nbl ∈ {0} + al1 ∈ {0} + al2 ∈ {0} + plt ∈ {0} + plt1 ∈ {0} + plt2 ∈ {0} + rs ∈ {0} + dlt ∈ {0} + rlt ∈ {0} + rlt1 ∈ {0} + rlt2 ∈ {0} + decis_levl[0] ∈ {280} + [1] ∈ {576} + [2] ∈ {880} + [3] ∈ {1200} + [4] ∈ {1520} + [5] ∈ {1864} + [6] ∈ {2208} + [7] ∈ {2584} + [8] ∈ {2960} + [9] ∈ {3376} + [10] ∈ {3784} + [11] ∈ {4240} + [12] ∈ {4696} + [13] ∈ {5200} + [14] ∈ {5712} + [15] ∈ {6288} + [16] ∈ {6864} + [17] ∈ {7520} + [18] ∈ {8184} + [19] ∈ {8968} + [20] ∈ {9752} + [21] ∈ {10712} + [22] ∈ {11664} + [23] ∈ {12896} + [24] ∈ {14120} + [25] ∈ {15840} + [26] ∈ {17560} + [27] ∈ {20456} + [28] ∈ {23352} + [29] ∈ {32767} + detl ∈ {0} + quant26bt_pos[0] ∈ {61} + [1] ∈ {60} + [2] ∈ {59} + [3] ∈ {58} + [4] ∈ {57} + [5] ∈ {56} + [6] ∈ {55} + [7] ∈ {54} + [8] ∈ {53} + [9] ∈ {52} + [10] ∈ {51} + [11] ∈ {50} + [12] ∈ {49} + [13] ∈ {48} + [14] ∈ {47} + [15] ∈ {46} + [16] ∈ {45} + [17] ∈ {44} + [18] ∈ {43} + [19] ∈ {42} + [20] ∈ {41} + [21] ∈ {40} + [22] ∈ {39} + [23] ∈ {38} + [24] ∈ {37} + [25] ∈ {36} + [26] ∈ {35} + [27] ∈ {34} + [28] ∈ {33} + [29..30] ∈ {32} + quant26bt_neg[0] ∈ {63} + [1] ∈ {62} + [2] ∈ {31} + [3] ∈ {30} + [4] ∈ {29} + [5] ∈ {28} + [6] ∈ {27} + [7] ∈ {26} + [8] ∈ {25} + [9] ∈ {24} + [10] ∈ {23} + [11] ∈ {22} + [12] ∈ {21} + [13] ∈ {20} + [14] ∈ {19} + [15] ∈ {18} + [16] ∈ {17} + [17] ∈ {16} + [18] ∈ {15} + [19] ∈ {14} + [20] ∈ {13} + [21] ∈ {12} + [22] ∈ {11} + [23] ∈ {10} + [24] ∈ {9} + [25] ∈ {8} + [26] ∈ {7} + [27] ∈ {6} + [28] ∈ {5} + [29..30] ∈ {4} + deth ∈ {0} + sh ∈ {0} + eh ∈ {0} + qq2_code2_table[0] ∈ {-7408} + [1] ∈ {-1616} + [2] ∈ {7408} + [3] ∈ {1616} + wh_code_table[0] ∈ {798} + [1] ∈ {-214} + [2] ∈ {798} + [3] ∈ {-214} + dh ∈ {0} + ih ∈ {0} + nbh ∈ {0} + szh ∈ {0} + sph ∈ {0} + ph ∈ {0} + yh ∈ {0} + rh ∈ {0} + delay_dhx[0..5] ∈ {0} + delay_bph[0..5] ∈ {0} + ah1 ∈ {0} + ah2 ∈ {0} + ph1 ∈ {0} + ph2 ∈ {0} + rh1 ∈ {0} + rh2 ∈ {0} + ilr ∈ {0} + yl ∈ {0} + rl ∈ {0} + dec_deth ∈ {0} + dec_detl ∈ {0} + dec_dlt ∈ {0} + dec_del_bpl[0..5] ∈ {0} + dec_del_dltx[0..5] ∈ {0} + dec_plt ∈ {0} + dec_plt1 ∈ {0} + dec_plt2 ∈ {0} + dec_szl ∈ {0} + dec_spl ∈ {0} + dec_sl ∈ {0} + dec_rlt1 ∈ {0} + dec_rlt2 ∈ {0} + dec_rlt ∈ {0} + dec_al1 ∈ {0} + dec_al2 ∈ {0} + dl ∈ {0} + dec_nbl ∈ {0} + dec_yh ∈ {0} + dec_dh ∈ {0} + dec_nbh ∈ {0} + dec_del_bph[0..5] ∈ {0} + dec_del_dhx[0..5] ∈ {0} + dec_szh ∈ {0} + dec_rh1 ∈ {0} + dec_rh2 ∈ {0} + dec_ah1 ∈ {0} + dec_ah2 ∈ {0} + dec_ph ∈ {0} + dec_sph ∈ {0} + dec_sh ∈ {0} + dec_rh ∈ {0} + dec_ph1 ∈ {0} + dec_ph2 ∈ {0} + test_data[0] ∈ {1} + [1] ∈ {0} + [2] ∈ {1} + [3] ∈ {0} + [4..9] ∈ {1} + compressed[0..9] ∈ {0} +tests/test/adpcm.c:607:[value] entering loop for the first time +[value] computing for function encode <- main. + Called from tests/test/adpcm.c:608. +tests/test/adpcm.c:277:[value] entering loop for the first time +tests/test/adpcm.c:278:[kernel] warning: out of bounds read. assert \valid_read(tmp_3); + (tmp_3 from tqmf_ptr++) +tests/test/adpcm.c:278:[kernel] warning: out of bounds read. assert \valid_read(tmp_4); + (tmp_4 from h_ptr++) +tests/test/adpcm.c:279:[kernel] warning: out of bounds read. assert \valid_read(tmp_5); + (tmp_5 from tqmf_ptr++) +tests/test/adpcm.c:279:[kernel] warning: out of bounds read. assert \valid_read(tmp_6); + (tmp_6 from h_ptr++) +tests/test/adpcm.c:282:[kernel] warning: out of bounds read. assert \valid_read(tmp_7); + (tmp_7 from tqmf_ptr++) +tests/test/adpcm.c:282:[kernel] warning: out of bounds read. assert \valid_read(tmp_8); + (tmp_8 from h_ptr++) +tests/test/adpcm.c:283:[kernel] warning: out of bounds read. assert \valid_read(tqmf_ptr); +tests/test/adpcm.c:283:[kernel] warning: out of bounds read. assert \valid_read(tmp_9); + (tmp_9 from h_ptr++) +tests/test/adpcm.c:288:[value] entering loop for the first time +tests/test/adpcm.c:288:[kernel] warning: out of bounds read. assert \valid_read(tmp_11); + (tmp_11 from tqmf_ptr1--) +tests/test/adpcm.c:288:[kernel] warning: out of bounds write. assert \valid(tmp_10); + (tmp_10 from tqmf_ptr--) +tests/test/adpcm.c:289:[kernel] warning: out of bounds write. assert \valid(tmp_12); + (tmp_12 from tqmf_ptr--) +tests/test/adpcm.c:290:[kernel] warning: out of bounds write. assert \valid(tqmf_ptr); +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:301. +tests/test/adpcm.c:418:[value] entering loop for the first time +tests/test/adpcm.c:419:[kernel] warning: out of bounds read. assert \valid_read(tmp_1); + (tmp_1 from bpl++) +tests/test/adpcm.c:419:[kernel] warning: out of bounds read. assert \valid_read(tmp_2); + (tmp_2 from dlt_0++) +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:304. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function quantl <- encode <- main. + Called from tests/test/adpcm.c:311. +[value] computing for function abs <- quantl <- encode <- main. + Called from tests/test/adpcm.c:444. +[value] Recording results for abs +[value] Done for function abs +tests/test/adpcm.c:453:[value] entering loop for the first time +[value] Recording results for quantl +[value] Done for function quantl +[value] computing for function logscl <- encode <- main. + Called from tests/test/adpcm.c:318. +[value] Recording results for logscl +[value] Done for function logscl +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:322. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:331. +tests/test/adpcm.c:506:[value] entering loop for the first time +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:335. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:339. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:352. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:354. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function abs <- encode <- main. + Called from tests/test/adpcm.c:370. +[value] Recording results for abs +[value] Done for function abs +[value] computing for function logsch <- encode <- main. + Called from tests/test/adpcm.c:376. +[value] Recording results for logsch +[value] Done for function logsch +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:379. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:387. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:391. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:394. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] Recording results for encode +[value] Done for function encode +[value] computing for function encode <- main. + Called from tests/test/adpcm.c:608. +tests/test/adpcm.c:278:[kernel] warning: signed overflow. + assert -2147483648 ≤ xa+(long)((long)*tmp_3*(long)*tmp_4) ≤ 2147483647; + (tmp_3 from tqmf_ptr++, tmp_4 from h_ptr++) +tests/test/adpcm.c:279:[kernel] warning: signed overflow. + assert -2147483648 ≤ xb+(long)((long)*tmp_5*(long)*tmp_6) ≤ 2147483647; + (tmp_5 from tqmf_ptr++, tmp_6 from h_ptr++) +tests/test/adpcm.c:282:[kernel] warning: signed overflow. + assert -2147483648 ≤ xa+(long)((long)*tmp_7*(long)*tmp_8) ≤ 2147483647; + (tmp_7 from tqmf_ptr++, tmp_8 from h_ptr++) +tests/test/adpcm.c:283:[kernel] warning: signed overflow. + assert + -2147483648 ≤ xb+(long)((long)*tqmf_ptr*(long)*tmp_9) ≤ 2147483647; + (tmp_9 from h_ptr++) +tests/test/adpcm.c:293:[kernel] warning: signed overflow. assert -2147483648 ≤ xa+xb ≤ 2147483647; +tests/test/adpcm.c:294:[kernel] warning: signed overflow. assert -2147483648 ≤ xa-xb ≤ 2147483647; +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:301. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:304. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function quantl <- encode <- main. + Called from tests/test/adpcm.c:311. +[value] computing for function abs <- quantl <- encode <- main. + Called from tests/test/adpcm.c:444. +[value] Recording results for abs +[value] Done for function abs +[value] Recording results for quantl +[value] Done for function quantl +[value] computing for function logscl <- encode <- main. + Called from tests/test/adpcm.c:318. +[value] Recording results for logscl +[value] Done for function logscl +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:322. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:331. +tests/test/adpcm.c:512:[value] entering loop for the first time +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:335. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:339. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:352. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:354. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function abs <- encode <- main. + Called from tests/test/adpcm.c:370. +[value] Recording results for abs +[value] Done for function abs +[value] computing for function logsch <- encode <- main. + Called from tests/test/adpcm.c:376. +[value] Recording results for logsch +[value] Done for function logsch +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:379. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:387. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:391. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:394. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] Recording results for encode +[value] Done for function encode +[value] computing for function encode <- main. + Called from tests/test/adpcm.c:608. +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:301. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:304. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function quantl <- encode <- main. + Called from tests/test/adpcm.c:311. +[value] computing for function abs <- quantl <- encode <- main. + Called from tests/test/adpcm.c:444. +[value] Recording results for abs +[value] Done for function abs +[value] Recording results for quantl +[value] Done for function quantl +[value] computing for function logscl <- encode <- main. + Called from tests/test/adpcm.c:318. +[value] Recording results for logscl +[value] Done for function logscl +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:322. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:331. +tests/test/adpcm.c:514:[kernel] warning: signed overflow. assert -2147483648 ≤ 255L*(long)*(bli+i) ≤ 2147483647; +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:335. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:339. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:352. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:354. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function abs <- encode <- main. + Called from tests/test/adpcm.c:370. +[value] Recording results for abs +[value] Done for function abs +[value] computing for function logsch <- encode <- main. + Called from tests/test/adpcm.c:376. +[value] Recording results for logsch +[value] Done for function logsch +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:379. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:387. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:391. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:394. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] Recording results for encode +[value] Done for function encode +[value] computing for function encode <- main. + Called from tests/test/adpcm.c:608. +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:301. +tests/test/adpcm.c:416:[kernel] warning: signed overflow. + assert -2147483648 ≤ (long)*tmp*(long)*tmp_0 ≤ 2147483647; + (tmp from bpl++, tmp_0 from dlt_0++) +tests/test/adpcm.c:419:[kernel] warning: signed overflow. + assert -2147483648 ≤ (long)*tmp_1*(long)*tmp_2 ≤ 2147483647; + (tmp_1 from bpl++, tmp_2 from dlt_0++) +tests/test/adpcm.c:419:[kernel] warning: signed overflow. + assert -2147483648 ≤ zl+(long)((long)*tmp_1*(long)*tmp_2) ≤ 2147483647; + (tmp_1 from bpl++, tmp_2 from dlt_0++) +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:304. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function quantl <- encode <- main. + Called from tests/test/adpcm.c:311. +[value] computing for function abs <- quantl <- encode <- main. + Called from tests/test/adpcm.c:444. +[value] Recording results for abs +[value] Done for function abs +[value] Recording results for quantl +[value] Done for function quantl +[value] computing for function logscl <- encode <- main. + Called from tests/test/adpcm.c:318. +[value] Recording results for logscl +[value] Done for function logscl +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:322. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:331. +tests/test/adpcm.c:507:[kernel] warning: signed overflow. assert -2147483648 ≤ 255L*(long)*(bli+i) ≤ 2147483647; +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:335. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:339. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:352. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:354. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function abs <- encode <- main. + Called from tests/test/adpcm.c:370. +[value] Recording results for abs +[value] Done for function abs +[value] computing for function logsch <- encode <- main. + Called from tests/test/adpcm.c:376. +[value] Recording results for logsch +[value] Done for function logsch +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:379. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:387. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:391. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:394. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] Recording results for encode +[value] Done for function encode +[value] computing for function encode <- main. + Called from tests/test/adpcm.c:608. +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:301. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:304. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function quantl <- encode <- main. + Called from tests/test/adpcm.c:311. +[value] computing for function abs <- quantl <- encode <- main. + Called from tests/test/adpcm.c:444. +[value] Recording results for abs +[value] Done for function abs +[value] Recording results for quantl +[value] Done for function quantl +[value] computing for function logscl <- encode <- main. + Called from tests/test/adpcm.c:318. +[value] Recording results for logscl +[value] Done for function logscl +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:322. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:331. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:335. +tests/test/adpcm.c:534:[kernel] warning: signed overflow. + assert -2147483648 ≤ (long)plt_0*(long)plt1_0 ≤ 2147483647; +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:339. +tests/test/adpcm.c:558:[kernel] warning: signed overflow. + assert -2147483648 ≤ (long)plt_0*(long)plt1_0 ≤ 2147483647; +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:352. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:354. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function abs <- encode <- main. + Called from tests/test/adpcm.c:370. +[value] Recording results for abs +[value] Done for function abs +[value] computing for function logsch <- encode <- main. + Called from tests/test/adpcm.c:376. +[value] Recording results for logsch +[value] Done for function logsch +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:379. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:387. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:391. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:394. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] Recording results for encode +[value] Done for function encode +[value] computing for function encode <- main. + Called from tests/test/adpcm.c:608. +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:301. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:304. +tests/test/adpcm.c:430:[kernel] warning: signed overflow. assert -2147483648 ≤ 2*rlt1_0 ≤ 2147483647; +tests/test/adpcm.c:431:[kernel] warning: signed overflow. assert -2147483648 ≤ (long)al1_0*pl ≤ 2147483647; +tests/test/adpcm.c:432:[kernel] warning: signed overflow. assert -2147483648 ≤ 2*rlt2_0 ≤ 2147483647; +tests/test/adpcm.c:433:[kernel] warning: signed overflow. assert -2147483648 ≤ (long)al2_0*pl2 ≤ 2147483647; +tests/test/adpcm.c:433:[kernel] warning: signed overflow. + assert -2147483648 ≤ pl+(long)((long)al2_0*pl2) ≤ 2147483647; +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function quantl <- encode <- main. + Called from tests/test/adpcm.c:311. +[value] computing for function abs <- quantl <- encode <- main. + Called from tests/test/adpcm.c:444. +[value] Recording results for abs +[value] Done for function abs +[value] Recording results for quantl +[value] Done for function quantl +[value] computing for function logscl <- encode <- main. + Called from tests/test/adpcm.c:318. +[value] Recording results for logscl +[value] Done for function logscl +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:322. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:331. +tests/test/adpcm.c:513:[kernel] warning: signed overflow. + assert -2147483648 ≤ (long)dlt_0*(long)*(dlti+i) ≤ 2147483647; +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:335. +tests/test/adpcm.c:533:[kernel] warning: signed overflow. assert -2147483648 ≤ 4L*(long)al1_0 ≤ 2147483647; +tests/test/adpcm.c:534:[kernel] warning: signed overflow. assert -wd2 ≤ 2147483647; +tests/test/adpcm.c:536:[kernel] warning: signed overflow. + assert -2147483648 ≤ (long)plt_0*(long)plt2_0 ≤ 2147483647; +tests/test/adpcm.c:542:[kernel] warning: signed overflow. assert -2147483648 ≤ 127L*(long)al2_0 ≤ 2147483647; +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:339. +tests/test/adpcm.c:557:[kernel] warning: signed overflow. assert -2147483648 ≤ (long)al1_0*255L ≤ 2147483647; +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:352. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:354. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function abs <- encode <- main. + Called from tests/test/adpcm.c:370. +[value] Recording results for abs +[value] Done for function abs +[value] computing for function logsch <- encode <- main. + Called from tests/test/adpcm.c:376. +[value] Recording results for logsch +[value] Done for function logsch +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:379. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:387. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:391. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:394. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] Recording results for encode +[value] Done for function encode +[value] computing for function encode <- main. + Called from tests/test/adpcm.c:608. +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:301. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:304. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function quantl <- encode <- main. + Called from tests/test/adpcm.c:311. +[value] computing for function abs <- quantl <- encode <- main. + Called from tests/test/adpcm.c:444. +[value] Recording results for abs +[value] Done for function abs +[value] Recording results for quantl +[value] Done for function quantl +[value] computing for function logscl <- encode <- main. + Called from tests/test/adpcm.c:318. +[value] Recording results for logscl +[value] Done for function logscl +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:322. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:331. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:335. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:339. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:352. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:354. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function abs <- encode <- main. + Called from tests/test/adpcm.c:370. +[value] Recording results for abs +[value] Done for function abs +[value] computing for function logsch <- encode <- main. + Called from tests/test/adpcm.c:376. +[value] Recording results for logsch +[value] Done for function logsch +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:379. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:387. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:391. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:394. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] Recording results for encode +[value] Done for function encode +[value] computing for function encode <- main. + Called from tests/test/adpcm.c:608. +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:301. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:304. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function quantl <- encode <- main. + Called from tests/test/adpcm.c:311. +[value] computing for function abs <- quantl <- encode <- main. + Called from tests/test/adpcm.c:444. +[value] Recording results for abs +[value] Done for function abs +[value] Recording results for quantl +[value] Done for function quantl +[value] computing for function logscl <- encode <- main. + Called from tests/test/adpcm.c:318. +[value] Recording results for logscl +[value] Done for function logscl +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:322. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:331. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:335. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:339. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:352. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:354. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function abs <- encode <- main. + Called from tests/test/adpcm.c:370. +[value] Recording results for abs +[value] Done for function abs +[value] computing for function logsch <- encode <- main. + Called from tests/test/adpcm.c:376. +[value] Recording results for logsch +[value] Done for function logsch +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:379. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:387. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:391. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:394. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] Recording results for encode +[value] Done for function encode +[value] computing for function encode <- main. + Called from tests/test/adpcm.c:608. +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:301. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:304. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function quantl <- encode <- main. + Called from tests/test/adpcm.c:311. +[value] computing for function abs <- quantl <- encode <- main. + Called from tests/test/adpcm.c:444. +[value] Recording results for abs +[value] Done for function abs +[value] Recording results for quantl +[value] Done for function quantl +[value] computing for function logscl <- encode <- main. + Called from tests/test/adpcm.c:318. +[value] Recording results for logscl +[value] Done for function logscl +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:322. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:331. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:335. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:339. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:352. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:354. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function abs <- encode <- main. + Called from tests/test/adpcm.c:370. +[value] Recording results for abs +[value] Done for function abs +[value] computing for function logsch <- encode <- main. + Called from tests/test/adpcm.c:376. +[value] Recording results for logsch +[value] Done for function logsch +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:379. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:387. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:391. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:394. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] Recording results for encode +[value] Done for function encode +[value] Recording results for main +[value] done for function main +[from] Computing for function abs +[from] Done for function abs +[from] Computing for function filtep +[from] Done for function filtep +[from] Computing for function filtez +[from] Done for function filtez +[from] Computing for function logsch +[from] Done for function logsch +[from] Computing for function logscl +[from] Done for function logscl +[from] Computing for function quantl +[from] Done for function quantl +[from] Computing for function scalel +[from] Done for function scalel +[from] Computing for function uppol1 +[from] Done for function uppol1 +[from] Computing for function uppol2 +[from] Done for function uppol2 +[from] Computing for function upzero +[from] Done for function upzero +[from] Computing for function encode +[from] Done for function encode +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function abs: + \result FROM x +[from] Function filtep: + \result FROM rlt1_0; al1_0; rlt2_0; al2_0 +[from] Function filtez: + \result FROM delay_bpl[0..5]; delay_dltx[0..5]; delay_dhx[0..5]; + delay_bph[0..5]; bpl; dlt_0 +[from] Function logsch: + \result FROM wh_code_table[0..3]; ih_0; nbh_0 +[from] Function logscl: + \result FROM wl_code_table[1..15]; il_0; nbl_0 +[from] Function quantl: + \result FROM decis_levl[0..29]; quant26bt_pos[0..29]; quant26bt_neg[0..29]; + el_0; detl_0 +[from] Function scalel: + \result FROM ilb_table[0..31]; nbl_0; shift_constant +[from] Function uppol1: + \result FROM al1_0; apl2; plt_0; plt1_0 +[from] Function uppol2: + \result FROM al1_0; al2_0; plt_0; plt1_0; plt2_0 +[from] Function upzero: + delay_bpl[0..5] FROM delay_bpl[0..5]; delay_dltx[0..5]; delay_dhx[0..5]; + delay_bph[0..5]; dlt_0; dlti; bli (and SELF) + delay_dltx[0] FROM dlt_0; dlti (and SELF) + [1] FROM delay_dltx[0]; delay_dhx[0]; dlti (and SELF) + [3] FROM delay_dltx[2]; delay_dhx[2]; dlti (and SELF) + [4] FROM delay_dltx[3]; delay_dhx[3]; dlti (and SELF) + [5] FROM delay_dltx[4]; delay_dhx[4]; dlti (and SELF) + delay_dhx[0] FROM dlt_0; dlti (and SELF) + [1] FROM delay_dltx[0]; delay_dhx[0]; dlti (and SELF) + [3] FROM delay_dltx[2]; delay_dhx[2]; dlti (and SELF) + [4] FROM delay_dltx[3]; delay_dhx[3]; dlti (and SELF) + [5] FROM delay_dltx[4]; delay_dhx[4]; dlti (and SELF) + delay_bph[0..5] FROM delay_bpl[0..5]; delay_dltx[0..5]; delay_dhx[0..5]; + delay_bph[0..5]; dlt_0; dlti; bli (and SELF) +[from] Function encode: + tqmf[0..22] FROM tqmf[0..21]; xin1; xin2 (and SELF) + [23] FROM tqmf[0..21]; xin1 (and SELF) + xl FROM tqmf[0..23]; h[0..23] + xh FROM tqmf[0..23]; h[0..23] + il FROM tqmf[0..23]; h[0..23]; delay_bpl[0..5]; delay_dltx[0..5]; al1; + al2; rlt1; rlt2; decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; delay_dhx[0..5]; delay_bph[0..5] + szl FROM delay_bpl[0..5]; delay_dltx[0..5]; delay_dhx[0..5]; + delay_bph[0..5] + spl FROM al1; al2; rlt1; rlt2 + sl FROM delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + delay_dhx[0..5]; delay_bph[0..5] + el FROM tqmf[0..23]; h[0..23]; delay_bpl[0..5]; delay_dltx[0..5]; al1; + al2; rlt1; rlt2; delay_dhx[0..5]; delay_bph[0..5] + delay_bpl[0..5] FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; + rlt2; decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; deth; qq2_code2_table[0..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + delay_dltx[0] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; deth; qq2_code2_table[0..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + [1] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; delay_dhx[0..5]; + delay_bph[0..5] (and SELF) + [3] FROM delay_dltx[2]; delay_dhx[2] (and SELF) + [4] FROM delay_dltx[2..3]; delay_dhx[2..3] (and SELF) + [5] FROM delay_dltx[3..4]; delay_dhx[3..4] (and SELF) + nbl FROM tqmf[0..23]; h[0..23]; delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table[1..15]; nbl; al1; al2; rlt1; rlt2; + decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; delay_dhx[0..5]; delay_bph[0..5] + al1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; plt1; plt2; rlt1; rlt2; + decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; delay_dhx[0..5]; delay_bph[0..5] + al2 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; plt1; plt2; rlt1; rlt2; + decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; delay_dhx[0..5]; delay_bph[0..5] + plt FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; delay_dhx[0..5]; + delay_bph[0..5] + plt1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; + delay_dhx[0..5]; delay_bph[0..5] + plt2 FROM plt1 + dlt FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; delay_dhx[0..5]; + delay_bph[0..5] + rlt FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; delay_dhx[0..5]; + delay_bph[0..5] + rlt1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; + delay_dhx[0..5]; delay_bph[0..5] + rlt2 FROM rlt1 + detl FROM tqmf[0..23]; h[0..23]; delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table[1..15]; ilb_table[0..31]; nbl; al1; al2; rlt1; + rlt2; decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; delay_dhx[0..5]; delay_bph[0..5] + deth FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; ilb_table[0..31]; al1; al2; rlt1; rlt2; + decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; deth; wh_code_table[0..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; rh2 + sh FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; rh1; rh2 + eh FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; rh1; rh2 + dh FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; delay_dhx[0..5]; delay_bph[0..5]; ah1; + ah2; rh1; rh2 + ih FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; rh2 + nbh FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + wh_code_table[0..3]; nbh; delay_dhx[0..5]; delay_bph[0..5]; + ah1; ah2; rh1; rh2 + szh FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; delay_dhx[0..5]; + delay_bph[0..5] + sph FROM ah1; ah2; rh1; rh2 + ph FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; delay_dhx[0..5]; delay_bph[0..5]; ah1; + ah2; rh1; rh2 + yh FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; delay_dhx[0..5]; delay_bph[0..5]; ah1; + ah2; rh1; rh2 + delay_dhx[0] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; deth; qq2_code2_table[0..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + [1] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; delay_dhx[0..5]; + delay_bph[0..5] (and SELF) + [3] FROM delay_dltx[2]; delay_dhx[2] (and SELF) + [4] FROM delay_dltx[2..3]; delay_dhx[2..3] (and SELF) + [5] FROM delay_dltx[3..4]; delay_dhx[3..4] (and SELF) + delay_bph[0..5] FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; + rlt2; decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; deth; qq2_code2_table[0..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + ah1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; delay_dhx[0..5]; delay_bph[0..5]; ah1; + ah2; ph1; ph2; rh1; rh2 + ah2 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; delay_dhx[0..5]; delay_bph[0..5]; ah1; + ah2; ph1; ph2; rh1; rh2 + ph1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; delay_dhx[0..5]; delay_bph[0..5]; ah1; + ah2; rh1; rh2 + ph2 FROM ph1 + rh1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; al1; al2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; delay_dhx[0..5]; delay_bph[0..5]; ah1; + ah2; rh1; rh2 + rh2 FROM rh1 + \result FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; deth; delay_dhx[0..5]; delay_bph[0..5]; + ah1; ah2; rh1; rh2 +[from] Function main: + tqmf[0..23] FROM tqmf[0..21]; test_data[0..9] (and SELF) + xl FROM tqmf[0..23]; h[0..23]; test_data[0..9] (and SELF) + xh FROM tqmf[0..23]; h[0..23]; test_data[0..9] (and SELF) + il FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; detl; + quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + szl FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + spl FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + sl FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; detl; + quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + el FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; detl; + quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + delay_bpl[0..5] FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table[1..15]; ilb_table[0..31]; nbl; al1; + al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; + deth; qq2_code2_table[0..3]; wh_code_table[0..3]; + nbh; delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; + ph1; ph2; rh1; rh2; test_data[0..9] (and SELF) + delay_dltx[0] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table[1..15]; + ilb_table[0..31]; nbl; al1; al2; plt1; plt2; rlt1; rlt2; + decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; deth; qq2_code2_table[0..3]; + wh_code_table[0..3]; nbh; delay_dhx[0..5]; delay_bph[0..5]; + ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..9] (and SELF) + [1] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table[1..15]; + ilb_table[0..31]; nbl; al1; al2; plt1; plt2; rlt1; rlt2; + decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; deth; qq2_code2_table[0..3]; + wh_code_table[0..3]; nbh; delay_dhx[0..5]; delay_bph[0..5]; + ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..9] (and SELF) + [3] FROM delay_dltx[2]; delay_dhx[2] (and SELF) + [4] FROM delay_dltx[2..3]; delay_dhx[2..3] (and SELF) + [5] FROM delay_dltx[2..4]; delay_dhx[2..4] (and SELF) + nbl FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + al1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + al2 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + plt FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + plt1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + plt2 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + dlt FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + rlt FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + rlt1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + rlt2 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + detl FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + deth FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + sh FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; detl; + quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + eh FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; detl; + quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + dh FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; detl; + quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + ih FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; detl; + quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + nbh FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + szh FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + sph FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + ph FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; detl; + quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + yh FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; detl; + quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + delay_dhx[0] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table[1..15]; + ilb_table[0..31]; nbl; al1; al2; plt1; plt2; rlt1; rlt2; + decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; deth; qq2_code2_table[0..3]; + wh_code_table[0..3]; nbh; delay_dhx[0..5]; delay_bph[0..5]; + ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..9] (and SELF) + [1] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table[1..15]; + ilb_table[0..31]; nbl; al1; al2; plt1; plt2; rlt1; rlt2; + decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; deth; qq2_code2_table[0..3]; + wh_code_table[0..3]; nbh; delay_dhx[0..5]; delay_bph[0..5]; + ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..9] (and SELF) + [3] FROM delay_dltx[2]; delay_dhx[2] (and SELF) + [4] FROM delay_dltx[2..3]; delay_dhx[2..3] (and SELF) + [5] FROM delay_dltx[2..4]; delay_dhx[2..4] (and SELF) + delay_bph[0..5] FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table[1..15]; ilb_table[0..31]; nbl; al1; + al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; + deth; qq2_code2_table[0..3]; wh_code_table[0..3]; + nbh; delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; + ph1; ph2; rh1; rh2; test_data[0..9] (and SELF) + ah1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + ah2 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + ph1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + ph2 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + rh1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + rh2 FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; delay_bpl[0..5]; + delay_dltx[0..5]; wl_code_table[1..15]; ilb_table[0..31]; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..29]; + detl; quant26bt_pos[0..29]; quant26bt_neg[0..29]; deth; + qq2_code2_table[0..3]; wh_code_table[0..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; + test_data[0..9] (and SELF) + compressed[0..4] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table[1..15]; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table[1..15]; + ilb_table[0..31]; nbl; al1; al2; plt1; plt2; rlt1; rlt2; + decis_levl[0..29]; detl; quant26bt_pos[0..29]; + quant26bt_neg[0..29]; deth; qq2_code2_table[0..3]; + wh_code_table[0..3]; nbh; delay_dhx[0..5]; delay_bph[0..5]; + ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..9] (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[slicing] making slicing project 'slicing_1'... +[pdg] computing for function uppol2 +[pdg] done for function uppol2 +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function encode +[pdg] done for function encode +[pdg] computing for function main +[pdg] done for function main +Slicing project worklist [default/slicing_1] = +[main_slice_1 = change_call for call 280 -> encode_slice_1][encode_slice_1 = change_call for call 108 -> uppol2_slice_1][encode_slice_1 = change_call for call 81 -> uppol2_slice_1] + +[slicing] exporting project to 'Sliced code'... +[slicing] applying all slicing requests... +[slicing] applying 3 actions... +[slicing] applying actions: 1/3... +[slicing] applying actions: 2/3... +[pdg] computing for function abs +[pdg] done for function abs +[pdg] computing for function filtep +[pdg] done for function filtep +[pdg] computing for function filtez +[pdg] done for function filtez +[pdg] computing for function upzero +[pdg] done for function upzero +[pdg] computing for function quantl +[pdg] done for function quantl +[pdg] computing for function uppol1 +[pdg] done for function uppol1 +[pdg] computing for function scalel +[pdg] done for function scalel +[pdg] computing for function logsch +[pdg] done for function logsch +[pdg] computing for function logscl +[pdg] done for function logscl +[slicing] applying actions: 3/3... +[sparecode] remove unused global declarations from project 'Sliced code tmp' +[sparecode] removed unused global declarations in new project 'Sliced code' +/* Generated by Frama-C */ +void encode_slice_1(int xin1, int xin2); + +int filtez_slice_1(int *bpl, int *dlt_0); + +void upzero_slice_1(int dlt_0, int *dlti, int *bli); + +int filtep_slice_1(int rlt1_0, int al1_0, int rlt2_0, int al2_0); + +int quantl_slice_1(int el_0, int detl_0); + +int logscl_slice_1(int il_0, int nbl_0); + +int scalel_slice_1(int nbl_0, int shift_constant); + +int uppol2_slice_1(int al1_0, int al2_0, int plt_0, int plt1_0, int plt2_0); + +int uppol1_slice_1(int al1_0, int apl2, int plt_0, int plt1_0); + +int logsch_slice_1(int ih_0, int nbh_0); + +int tqmf[24]; +int h[24] = + {12, -44, -44, 212, 48, -624, 128, 1448, -840, -3220, 3804, + 15504, 15504, 3804, -3220, -840, 1448, 128, -624, 48, 212, + -44, -44, 12}; +int xl; +int xh; +int il; +int szl; +int spl; +int sl; +int el; +int qq4_code4_table[16] = + {0, -20456, -12896, -8968, -6288, -4240, -2584, + -1200, 20456, 12896, 8968, 6288, 4240, 2584, + 1200, 0}; +int delay_bpl[6]; +int delay_dltx[6]; +int wl_code_table[16] = + {-60, 3042, 1198, 538, 334, 172, 58, -30, 3042, + 1198, 538, 334, 172, 58, -30, -60}; +int ilb_table[32] = + {2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383, 2435, + 2489, 2543, 2599, 2656, 2714, 2774, 2834, 2896, 2960, + 3025, 3091, 3158, 3228, 3298, 3371, 3444, 3520, 3597, + 3676, 3756, 3838, 3922, 4008}; +int nbl; +int al1; +int al2; +int plt; +int plt1; +int plt2; +int dlt; +int rlt; +int rlt1; +int rlt2; +int decis_levl[30] = + {280, 576, 880, 1200, 1520, 1864, 2208, 2584, 2960, + 3376, 3784, 4240, 4696, 5200, 5712, 6288, 6864, 7520, + 8184, 8968, 9752, 10712, 11664, 12896, 14120, 15840, + 17560, 20456, 23352, 32767}; +int detl; +int quant26bt_pos[31] = + {61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, + 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, + 37, 36, 35, 34, 33, 32, 32}; +int quant26bt_neg[31] = + {63, 62, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, + 8, 7, 6, 5, 4, 4}; +int deth; +int sh; +int eh; +int qq2_code2_table[4] = {-7408, -1616, 7408, 1616}; +int wh_code_table[4] = {798, -214, 798, -214}; +int dh; +int ih; +int nbh; +int szh; +int sph; +int ph; +int yh; +int delay_dhx[6]; +int delay_bph[6]; +int ah1; +int ah2; +int ph1; +int ph2; +int rh1; +int rh2; +int abs_slice_1(int x) +{ + int m; + if (x >= 0) m = x; else m = - x; + return m; +} + +void encode_slice_1(int xin1, int xin2) +{ + int i; + int *h_ptr; + int *tqmf_ptr; + int *tqmf_ptr1; + long xa; + long xb; + int decis; + int *tmp; + int *tmp_0; + int *tmp_1; + int *tmp_2; + int *tmp_7; + int *tmp_8; + int *tmp_9; + int *tmp_12; + int tmp_13; + h_ptr = h; + tqmf_ptr = tqmf; + { + /*sequence*/ + tmp = tqmf_ptr; + tqmf_ptr ++; + tmp_0 = h_ptr; + h_ptr ++; + xa = (long)*tmp * (long)*tmp_0; + } + { + /*sequence*/ + tmp_1 = tqmf_ptr; + tqmf_ptr ++; + tmp_2 = h_ptr; + h_ptr ++; + xb = (long)*tmp_1 * (long)*tmp_2; + } + i = 0; + while (i < 10) { + { + int *tmp_3; + int *tmp_4; + int *tmp_5; + int *tmp_6; + { + /*sequence*/ + tmp_3 = tqmf_ptr; + tqmf_ptr ++; + tmp_4 = h_ptr; + h_ptr ++; + xa += (long)*tmp_3 * (long)*tmp_4; + } + { + /*sequence*/ + tmp_5 = tqmf_ptr; + tqmf_ptr ++; + tmp_6 = h_ptr; + h_ptr ++; + xb += (long)*tmp_5 * (long)*tmp_6; + } + } + i ++; + } + { + /*sequence*/ + tmp_7 = tqmf_ptr; + tqmf_ptr ++; + tmp_8 = h_ptr; + h_ptr ++; + xa += (long)*tmp_7 * (long)*tmp_8; + } + { + /*sequence*/ + tmp_9 = h_ptr; + xb += (long)*tqmf_ptr * (long)*tmp_9; + } + tqmf_ptr1 = tqmf_ptr - 2; + i = 0; + while (i < 22) { + int *tmp_10; + int *tmp_11; + { + /*sequence*/ + tmp_10 = tqmf_ptr; + tqmf_ptr --; + tmp_11 = tqmf_ptr1; + tqmf_ptr1 --; + *tmp_10 = *tmp_11; + } + i ++; + } + { + /*sequence*/ + tmp_12 = tqmf_ptr; + tqmf_ptr --; + *tmp_12 = xin1; + } + *tqmf_ptr = xin2; + xl = (int)((xa + xb) >> 15); + xh = (int)((xa - xb) >> 15); + szl = filtez_slice_1(delay_bpl,delay_dltx); + spl = filtep_slice_1(rlt1,al1,rlt2,al2); + sl = szl + spl; + el = xl - sl; + il = quantl_slice_1(el,detl); + dlt = (int)((long)detl * (long)qq4_code4_table[il >> 2] >> 15); + nbl = logscl_slice_1(il,nbl); + detl = scalel_slice_1(nbl,8); + plt = dlt + szl; + upzero_slice_1(dlt,delay_dltx,delay_bpl); + al2 = uppol2_slice_1(al1,al2,plt,plt1,plt2); + al1 = uppol1_slice_1(al1,al2,plt,plt1); + rlt = sl + dlt; + rlt2 = rlt1; + rlt1 = rlt; + plt2 = plt1; + plt1 = plt; + szh = filtez_slice_1(delay_bph,delay_dhx); + sph = filtep_slice_1(rh1,ah1,rh2,ah2); + sh = sph + szh; + eh = xh - sh; + if (eh >= 0) ih = 3; else ih = 1; + decis = (int)(564L * (long)deth >> 12L); + { + /*sequence*/ + tmp_13 = abs_slice_1(eh); + } + if (tmp_13 > decis) ih --; + dh = (int)((long)deth * (long)qq2_code2_table[ih] >> 15L); + nbh = logsch_slice_1(ih,nbh); + deth = scalel_slice_1(nbh,10); + ph = dh + szh; + upzero_slice_1(dh,delay_dhx,delay_bph); + ah2 = uppol2_slice_1(ah1,ah2,ph,ph1,ph2); + ah1 = uppol1_slice_1(ah1,ah2,ph,ph1); + yh = sh + dh; + rh2 = rh1; + rh1 = yh; + ph2 = ph1; + ph1 = ph; + return; +} + +int filtez_slice_1(int *bpl, int *dlt_0) +{ + int __retres; + int i; + long zl; + int *tmp; + int *tmp_0; + { + /*sequence*/ + tmp = bpl; + bpl ++; + tmp_0 = dlt_0; + dlt_0 ++; + zl = (long)*tmp * (long)*tmp_0; + } + i = 1; + while (i < 6) { + int *tmp_1; + int *tmp_2; + { + /*sequence*/ + tmp_1 = bpl; + bpl ++; + tmp_2 = dlt_0; + dlt_0 ++; + zl += (long)*tmp_1 * (long)*tmp_2; + } + i ++; + } + __retres = (int)(zl >> 14); + return __retres; +} + +int filtep_slice_1(int rlt1_0, int al1_0, int rlt2_0, int al2_0) +{ + int __retres; + long pl; + long pl2; + pl = (long)(2 * rlt1_0); + pl = (long)al1_0 * pl; + pl2 = (long)(2 * rlt2_0); + pl += (long)al2_0 * pl2; + __retres = (int)(pl >> 15); + return __retres; +} + +int quantl_slice_1(int el_0, int detl_0) +{ + int ril; + int mil; + long wd; + long decis; + wd = (long)abs_slice_1(el_0); + mil = 0; + decis = (long)decis_levl[mil] * (long)detl_0 >> 15L; + while (1) { + if (wd <= decis) { + if (! (mil < 29)) break; + } + else break; + mil ++; + decis = (long)decis_levl[mil] * (long)detl_0 >> 15L; + } + if (el_0 >= 0) ril = quant26bt_pos[mil]; else ril = quant26bt_neg[mil]; + return ril; +} + +int logscl_slice_1(int il_0, int nbl_0) +{ + long wd; + wd = (long)nbl_0 * 127L >> 7L; + nbl_0 = (int)wd + wl_code_table[il_0 >> 2]; + if (nbl_0 < 0) nbl_0 = 0; + if (nbl_0 > 18432) nbl_0 = 18432; + return nbl_0; +} + +int scalel_slice_1(int nbl_0, int shift_constant) +{ + int __retres; + int wd1; + int wd2; + int wd3; + wd1 = (nbl_0 >> 6) & 31; + wd2 = nbl_0 >> 11; + wd3 = ilb_table[wd1] >> ((shift_constant + 1) - wd2); + __retres = wd3 << 3; + return __retres; +} + +void upzero_slice_1(int dlt_0, int *dlti, int *bli) +{ + int i; + int wd2; + int wd3; + if (dlt_0 == 0) { + i = 0; + while (i < 6) { + *(bli + i) = (int)(255L * (long)*(bli + i) >> 8L); + i ++; + } + } + else { + i = 0; + while (i < 6) { + if ((long)dlt_0 * (long)*(dlti + i) >= (long)0) wd2 = 128; + else wd2 = -128; + wd3 = (int)(255L * (long)*(bli + i) >> 8L); + *(bli + i) = wd2 + wd3; + i ++; + } + } + *(dlti + 5) = *(dlti + 4); + *(dlti + 4) = *(dlti + 3); + *(dlti + 3) = *(dlti + 2); + *(dlti + 1) = *(dlti + 0); + *(dlti + 0) = dlt_0; + return; +} + +int uppol2_slice_1(int al1_0, int al2_0, int plt_0, int plt1_0, int plt2_0) +{ + long wd2; + long wd4; + int apl2; + wd2 = 4L * (long)al1_0; + if ((long)plt_0 * (long)plt1_0 >= 0L) wd2 = - wd2; + wd2 >>= 7; + if ((long)plt_0 * (long)plt2_0 >= 0L) wd4 = wd2 + (long)128; + else wd4 = wd2 - (long)128; + apl2 = (int)(wd4 + (127L * (long)al2_0 >> 7L)); + if (apl2 > 12288) apl2 = 12288; + if (apl2 < -12288) apl2 = -12288; + return apl2; +} + +int uppol1_slice_1(int al1_0, int apl2, int plt_0, int plt1_0) +{ + long wd2; + int wd3; + int apl1; + wd2 = (long)al1_0 * 255L >> 8L; + if ((long)plt_0 * (long)plt1_0 >= 0L) apl1 = (int)wd2 + 192; + else apl1 = (int)wd2 - 192; + wd3 = 15360 - apl2; + if (apl1 > wd3) apl1 = wd3; + if (apl1 < - wd3) apl1 = - wd3; + return apl1; +} + +int logsch_slice_1(int ih_0, int nbh_0) +{ + int wd; + wd = (int)((long)nbh_0 * 127L >> 7L); + nbh_0 = wd + wh_code_table[ih_0]; + if (nbh_0 < 0) nbh_0 = 0; + if (nbh_0 > 22528) nbh_0 = 22528; + return nbh_0; +} + +int test_data[10] = + {1, 0, 1, 0, 1, 1, 1, 1, 1, 1}; +void main(void) +{ + int i; + i = 0; + while (i < 10) { + encode_slice_1(test_data[i],test_data[i + 1]); + i += 2; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/intra.c frama-c-20150201+sodium+dfsg/tests/sparecode/intra.c --- frama-c-20140301+neon+dfsg/tests/sparecode/intra.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/intra.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,9 +1,9 @@ /* run.config OPT: -sparecode-debug 1 -sparecode-analysis -journal-disable - OPT: -slicing-level 2 -slice-return main -journal-disable -then-on 'Slicing export' -print + OPT: -slicing-level 2 -slice-return main -journal-disable -then-last -print OPT: -main main2 -sparecode-analysis -journal-disable - OPT: -main main2 -slice-return main2 -journal-disable -then-on 'Slicing export' -print - OPT: -main main2 -slice-return main2 -slice-assert f10 -journal-disable -then-on 'Slicing export' -print + OPT: -main main2 -slice-return main2 -journal-disable -then-last -print + OPT: -main main2 -slice-return main2 -slice-assert f10 -journal-disable -then-last -print */ /* Waiting for results such as: diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts324.1.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts324.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts324.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts324.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,92 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/bts324.c (with preprocessing) +[sparecode] remove unused code... +[sparecode] selecting function main_bis outputs and entry point +[value] Analyzing a complete application starting at main_bis +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i0 ∈ {0} + o0 ∈ {0} + is_ko ∈ {-1} +[value] computing for function init <- main_bis. + Called from tests/sparecode/bts324.c:26. +[value] using specification for function init +tests/sparecode/bts324.c:14:[value] warning: no \from part for clause 'assigns *p_res;' of function init +[value] Done for function init +tests/sparecode/bts324.c:28:[value] entering loop for the first time +[value] computing for function loop_body <- main_bis. + Called from tests/sparecode/bts324.c:29. +[value] using specification for function loop_body +tests/sparecode/bts324.c:11:[value] warning: no \from part for clause 'assigns i0, o0;' of function loop_body +[value] Done for function loop_body +[value] computing for function loop_body <- main_bis. + Called from tests/sparecode/bts324.c:29. +[value] Done for function loop_body +[value] Recording results for main_bis +[value] done for function main_bis +[pdg] computing for function main_bis +[from] Computing for function init +[from] Done for function init +[from] Computing for function loop_body +[from] Done for function loop_body +[pdg] done for function main_bis +[sparecode] add selection in function 'main_bis' +[sparecode] selecting output zones i0; o0; +[sparecode] is_ko +[sparecode] add selection in function 'main_bis' +[pdg] computing for function init +[pdg] done for function init +[sparecode] look for annotations in function Frama_C_bzero +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[sparecode] look for annotations in function Frama_C_copy_block +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] look for annotations in function init +[sparecode] look for annotations in function loop_body +[pdg] computing for function loop_body +[pdg] done for function loop_body +[sparecode] look for annotations in function main +[pdg] computing for function main +[pdg] warning: unreachable entry point (sid:1, function main) +[pdg] Bottom for function main +[sparecode] pdg bottom: skip annotations +[sparecode] look for annotations in function main_bis +[sparecode] selecting annotation : slice pragma expr o0; +[sparecode] add selection in function 'main_bis' +[sparecode] look for annotations in function main_ter +[pdg] computing for function main_ter +[pdg] warning: unreachable entry point (sid:19, function main_ter) +[pdg] Bottom for function main_ter +[sparecode] pdg bottom: skip annotations +[sparecode] finalize call input propagation +[sparecode] add selection in function 'main_bis' +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +int i0; +int o0; +/*@ assigns i0, o0; */ +extern void loop_body(); + +/*@ assigns *p_res; */ +extern void init(int *p_res); + +int is_ko = -1; +void main_bis(void) +{ + init(& is_ko); + if (is_ko) + while (1) { + loop_body(); + /*@ slice pragma expr o0; */ ; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts324.2.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts324.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts324.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts324.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,91 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/bts324.c (with preprocessing) +[sparecode] remove unused code... +[sparecode] selecting function main_ter outputs and entry point +[value] Analyzing a complete application starting at main_ter +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i0 ∈ {0} + o0 ∈ {0} + is_ko ∈ {-1} +[value] computing for function init <- main_ter. + Called from tests/sparecode/bts324.c:35. +[value] using specification for function init +tests/sparecode/bts324.c:14:[value] warning: no \from part for clause 'assigns *p_res;' of function init +[value] Done for function init +tests/sparecode/bts324.c:37:[value] entering loop for the first time +[value] computing for function loop_body <- main_ter. + Called from tests/sparecode/bts324.c:39. +[value] using specification for function loop_body +tests/sparecode/bts324.c:11:[value] warning: no \from part for clause 'assigns i0, o0;' of function loop_body +[value] Done for function loop_body +[value] computing for function loop_body <- main_ter. + Called from tests/sparecode/bts324.c:39. +[value] Done for function loop_body +[value] Recording results for main_ter +[value] done for function main_ter +[pdg] computing for function main_ter +[from] Computing for function init +[from] Done for function init +[from] Computing for function loop_body +[from] Done for function loop_body +[pdg] done for function main_ter +[sparecode] add selection in function 'main_ter' +[sparecode] selecting output zones i0; o0; +[sparecode] is_ko +[sparecode] add selection in function 'main_ter' +[pdg] computing for function init +[pdg] done for function init +[sparecode] look for annotations in function Frama_C_bzero +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[sparecode] look for annotations in function Frama_C_copy_block +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] look for annotations in function init +[sparecode] look for annotations in function loop_body +[pdg] computing for function loop_body +[pdg] done for function loop_body +[sparecode] look for annotations in function main +[pdg] computing for function main +[pdg] warning: unreachable entry point (sid:1, function main) +[pdg] Bottom for function main +[sparecode] pdg bottom: skip annotations +[sparecode] look for annotations in function main_bis +[pdg] computing for function main_bis +[pdg] warning: unreachable entry point (sid:9, function main_bis) +[pdg] Bottom for function main_bis +[sparecode] pdg bottom: skip annotations +[sparecode] look for annotations in function main_ter +[sparecode] selecting annotation : slice pragma stmt; +[sparecode] add selection in function 'main_ter' +[sparecode] finalize call input propagation +[sparecode] add selection in function 'main_ter' +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +int i0; +int o0; +/*@ assigns i0, o0; */ +extern void loop_body(); + +/*@ assigns *p_res; */ +extern void init(int *p_res); + +int is_ko = -1; +void main_ter(void) +{ + init(& is_ko); + if (is_ko) + while (1) + /*@ slice pragma stmt; */ + loop_body(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts324_bis.1.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts324_bis.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts324_bis.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts324_bis.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,112 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/bts324_bis.c (with preprocessing) +[sparecode] remove unused code... +[sparecode] selecting function main_bis outputs and entry point +[value] Analyzing a complete application starting at main_bis +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + ki[0..1] ∈ {0} + k ∈ {0} + e0 ∈ [--..--] + e1 ∈ [--..--] + s0 ∈ {0} + s1 ∈ {0} + is_ok ∈ {0} + si[0..1] ∈ {0} + so[0..1] ∈ {0} +[value] computing for function init <- main_bis. + Called from tests/sparecode/bts324_bis.c:51. +[value] Recording results for init +[value] Done for function init +tests/sparecode/bts324_bis.c:53:[value] entering loop for the first time +[value] computing for function loop_body <- main_bis. + Called from tests/sparecode/bts324_bis.c:54. +[value] computing for function f <- loop_body <- main_bis. + Called from tests/sparecode/bts324_bis.c:22. +tests/sparecode/bts324_bis.c:10:[kernel] warning: signed overflow. assert -2147483648 ≤ ki[i]*(int)(vi-si[i]) ≤ 2147483647; +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- loop_body <- main_bis. + Called from tests/sparecode/bts324_bis.c:23. +[value] Recording results for f +[value] Done for function f +[value] Recording results for loop_body +[value] Done for function loop_body +[value] computing for function loop_body <- main_bis. + Called from tests/sparecode/bts324_bis.c:54. +[value] computing for function f <- loop_body <- main_bis. + Called from tests/sparecode/bts324_bis.c:22. +tests/sparecode/bts324_bis.c:10:[kernel] warning: signed overflow. assert -2147483648 ≤ vi-si[i] ≤ 2147483647; +tests/sparecode/bts324_bis.c:10:[kernel] warning: signed overflow. + assert + -2147483648 ≤ (int)(so[i]/k)+(int)(ki[i]*(int)(vi-si[i])) ≤ 2147483647; +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- loop_body <- main_bis. + Called from tests/sparecode/bts324_bis.c:23. +[value] Recording results for f +[value] Done for function f +[value] Recording results for loop_body +[value] Done for function loop_body +[value] computing for function loop_body <- main_bis. + Called from tests/sparecode/bts324_bis.c:54. +[value] computing for function f <- loop_body <- main_bis. + Called from tests/sparecode/bts324_bis.c:22. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- loop_body <- main_bis. + Called from tests/sparecode/bts324_bis.c:23. +[value] Recording results for f +[value] Done for function f +[value] Recording results for loop_body +[value] Done for function loop_body +[value] Recording results for main_bis +[value] done for function main_bis +[pdg] computing for function main_bis +[from] Computing for function init +[from] Done for function init +[from] Computing for function loop_body +[from] Computing for function f <-loop_body +[from] Done for function f +[from] Done for function loop_body +tests/sparecode/bts324_bis.c:57:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main_bis +[sparecode] add selection in function 'main_bis' +[sparecode] selecting output zones ki[0..1]; k; s0; s1; is_ok; si[0..1]; +[sparecode] so[0..1] +[sparecode] look for annotations in function Frama_C_bzero +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[sparecode] look for annotations in function Frama_C_copy_block +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] look for annotations in function f +[pdg] computing for function f +[pdg] done for function f +[sparecode] look for annotations in function init +[pdg] computing for function init +[pdg] done for function init +[sparecode] look for annotations in function loop_body +[pdg] computing for function loop_body +[pdg] done for function loop_body +[sparecode] look for annotations in function main +[pdg] computing for function main +[pdg] warning: unreachable entry point (sid:24, function main) +[pdg] Bottom for function main +[sparecode] pdg bottom: skip annotations +[sparecode] look for annotations in function main_bis +[sparecode] finalize call input propagation +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +void main_bis(void) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts324_bis.2.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts324_bis.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts324_bis.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts324_bis.2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,162 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/bts324_bis.c (with preprocessing) +[sparecode] remove unused code... +[sparecode] selecting function main outputs and entry point +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + ki[0..1] ∈ {0} + k ∈ {0} + e0 ∈ [--..--] + e1 ∈ [--..--] + s0 ∈ {0} + s1 ∈ {0} + is_ok ∈ {0} + si[0..1] ∈ {0} + so[0..1] ∈ {0} +[value] computing for function init <- main. + Called from tests/sparecode/bts324_bis.c:37. +[value] Recording results for init +[value] Done for function init +tests/sparecode/bts324_bis.c:39:[value] entering loop for the first time +[value] computing for function loop_body <- main. + Called from tests/sparecode/bts324_bis.c:40. +[value] computing for function f <- loop_body <- main. + Called from tests/sparecode/bts324_bis.c:22. +tests/sparecode/bts324_bis.c:10:[kernel] warning: signed overflow. assert -2147483648 ≤ ki[i]*(int)(vi-si[i]) ≤ 2147483647; +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- loop_body <- main. + Called from tests/sparecode/bts324_bis.c:23. +[value] Recording results for f +[value] Done for function f +[value] Recording results for loop_body +[value] Done for function loop_body +[value] computing for function loop_body <- main. + Called from tests/sparecode/bts324_bis.c:40. +[value] computing for function f <- loop_body <- main. + Called from tests/sparecode/bts324_bis.c:22. +tests/sparecode/bts324_bis.c:10:[kernel] warning: signed overflow. assert -2147483648 ≤ vi-si[i] ≤ 2147483647; +tests/sparecode/bts324_bis.c:10:[kernel] warning: signed overflow. + assert + -2147483648 ≤ (int)(so[i]/k)+(int)(ki[i]*(int)(vi-si[i])) ≤ 2147483647; +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- loop_body <- main. + Called from tests/sparecode/bts324_bis.c:23. +[value] Recording results for f +[value] Done for function f +[value] Recording results for loop_body +[value] Done for function loop_body +[value] computing for function loop_body <- main. + Called from tests/sparecode/bts324_bis.c:40. +[value] computing for function f <- loop_body <- main. + Called from tests/sparecode/bts324_bis.c:22. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- loop_body <- main. + Called from tests/sparecode/bts324_bis.c:23. +[value] Recording results for f +[value] Done for function f +[value] Recording results for loop_body +[value] Done for function loop_body +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function init +[from] Done for function init +[from] Computing for function loop_body +[from] Computing for function f <-loop_body +[from] Done for function f +[from] Done for function loop_body +tests/sparecode/bts324_bis.c:47:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main +[sparecode] add selection in function 'main' +[sparecode] selecting output zones ki[0..1]; k; s0; s1; is_ok; si[0..1]; +[sparecode] so[0..1] +[sparecode] look for annotations in function Frama_C_bzero +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[sparecode] look for annotations in function Frama_C_copy_block +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] look for annotations in function f +[pdg] computing for function f +[pdg] done for function f +[sparecode] look for annotations in function init +[pdg] computing for function init +[pdg] done for function init +[sparecode] look for annotations in function loop_body +[pdg] computing for function loop_body +[pdg] done for function loop_body +[sparecode] look for annotations in function main +[sparecode] selecting annotation : slice pragma expr s1; +[sparecode] add selection in function 'main' +[sparecode] look for annotations in function main_bis +[pdg] computing for function main_bis +[pdg] warning: unreachable entry point (sid:35, function main_bis) +[pdg] Bottom for function main_bis +[sparecode] pdg bottom: skip annotations +[sparecode] finalize call input propagation +[sparecode] add selection in function 'loop_body' +[sparecode] add selection in function 'main' +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +int ki[2]; +int k; +int f(int vi, int i); + +static int si[2] = {0}; +static int so[2] = {0}; +int f(int vi, int i) +{ + int vo; + vo = so[i] / k + ki[i] * (vi - si[i]); + so[i] = vo; + si[i] = vi; + return vo; +} + +int volatile e0; +int volatile e1; +int s0; +int s1; +void loop_body(void) +{ + int acq0; + int acq1; + int val1; + acq0 = e0; + acq1 = e1; + f(acq0,0); + val1 = f(acq1,1); + s1 = val1; + return; +} + +void init(void) +{ + ki[0] = 2; + ki[1] = 4; + k = 8; + return; +} + +void main(void) +{ + init(); + while (1) { + loop_body(); + /*@ impact pragma expr s0; */ ; + /*@ slice pragma expr s1; */ ; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts324_bis.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts324_bis.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts324_bis.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts324_bis.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,165 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/bts324_bis.c (with preprocessing) +[sparecode] remove unused code... +[sparecode] selecting function main outputs and entry point +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + ki[0..1] ∈ {0} + k ∈ {0} + e0 ∈ [--..--] + e1 ∈ [--..--] + s0 ∈ {0} + s1 ∈ {0} + is_ok ∈ {0} + si[0..1] ∈ {0} + so[0..1] ∈ {0} +[value] computing for function init <- main. + Called from tests/sparecode/bts324_bis.c:37. +[value] Recording results for init +[value] Done for function init +tests/sparecode/bts324_bis.c:39:[value] entering loop for the first time +[value] computing for function loop_body <- main. + Called from tests/sparecode/bts324_bis.c:40. +[value] computing for function f <- loop_body <- main. + Called from tests/sparecode/bts324_bis.c:22. +tests/sparecode/bts324_bis.c:10:[kernel] warning: signed overflow. assert -2147483648 ≤ ki[i]*(int)(vi-si[i]) ≤ 2147483647; +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- loop_body <- main. + Called from tests/sparecode/bts324_bis.c:23. +[value] Recording results for f +[value] Done for function f +[value] Recording results for loop_body +[value] Done for function loop_body +[value] computing for function loop_body <- main. + Called from tests/sparecode/bts324_bis.c:40. +[value] computing for function f <- loop_body <- main. + Called from tests/sparecode/bts324_bis.c:22. +tests/sparecode/bts324_bis.c:10:[kernel] warning: signed overflow. assert -2147483648 ≤ vi-si[i] ≤ 2147483647; +tests/sparecode/bts324_bis.c:10:[kernel] warning: signed overflow. + assert + -2147483648 ≤ (int)(so[i]/k)+(int)(ki[i]*(int)(vi-si[i])) ≤ 2147483647; +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- loop_body <- main. + Called from tests/sparecode/bts324_bis.c:23. +[value] Recording results for f +[value] Done for function f +[value] Recording results for loop_body +[value] Done for function loop_body +[value] computing for function loop_body <- main. + Called from tests/sparecode/bts324_bis.c:40. +[value] computing for function f <- loop_body <- main. + Called from tests/sparecode/bts324_bis.c:22. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- loop_body <- main. + Called from tests/sparecode/bts324_bis.c:23. +[value] Recording results for f +[value] Done for function f +[value] Recording results for loop_body +[value] Done for function loop_body +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function init +[from] Done for function init +[from] Computing for function loop_body +[from] Computing for function f <-loop_body +[from] Done for function f +[from] Done for function loop_body +tests/sparecode/bts324_bis.c:47:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function main +[sparecode] add selection in function 'main' +[sparecode] selecting output zones ki[0..1]; k; s0; s1; is_ok; si[0..1]; +[sparecode] so[0..1] +[sparecode] look for annotations in function Frama_C_bzero +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[sparecode] look for annotations in function Frama_C_copy_block +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] look for annotations in function f +[pdg] computing for function f +[pdg] done for function f +[sparecode] look for annotations in function init +[pdg] computing for function init +[pdg] done for function init +[sparecode] look for annotations in function loop_body +[pdg] computing for function loop_body +[pdg] done for function loop_body +[sparecode] look for annotations in function main +[sparecode] selecting annotation : impact pragma expr s0; +[sparecode] selecting annotation : slice pragma expr s1; +[sparecode] add selection in function 'main' +[sparecode] look for annotations in function main_bis +[pdg] computing for function main_bis +[pdg] warning: unreachable entry point (sid:35, function main_bis) +[pdg] Bottom for function main_bis +[sparecode] pdg bottom: skip annotations +[sparecode] finalize call input propagation +[sparecode] add selection in function 'loop_body' +[sparecode] add selection in function 'main' +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +int ki[2]; +int k; +int f(int vi, int i); + +static int si[2] = {0}; +static int so[2] = {0}; +int f(int vi, int i) +{ + int vo; + vo = so[i] / k + ki[i] * (vi - si[i]); + so[i] = vo; + si[i] = vi; + return vo; +} + +int volatile e0; +int volatile e1; +int s0; +int s1; +void loop_body(void) +{ + int acq0; + int acq1; + int val0; + int val1; + acq0 = e0; + acq1 = e1; + val0 = f(acq0,0); + val1 = f(acq1,1); + s0 = val0; + s1 = val1; + return; +} + +void init(void) +{ + ki[0] = 2; + ki[1] = 4; + k = 8; + return; +} + +void main(void) +{ + init(); + while (1) { + loop_body(); + /*@ impact pragma expr s0; */ ; + /*@ slice pragma expr s1; */ ; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts324.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts324.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts324.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts324.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,80 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/bts324.c (with preprocessing) +[sparecode] remove unused code... +[sparecode] selecting function main outputs and entry point +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + i0 ∈ {0} + o0 ∈ {0} + is_ko ∈ {-1} +[value] computing for function init <- main. + Called from tests/sparecode/bts324.c:19. +[value] using specification for function init +tests/sparecode/bts324.c:14:[value] warning: no \from part for clause 'assigns *p_res;' of function init +[value] Done for function init +tests/sparecode/bts324.c:21:[value] entering loop for the first time +[value] computing for function loop_body <- main. + Called from tests/sparecode/bts324.c:22. +[value] using specification for function loop_body +tests/sparecode/bts324.c:11:[value] warning: no \from part for clause 'assigns i0, o0;' of function loop_body +[value] Done for function loop_body +[value] computing for function loop_body <- main. + Called from tests/sparecode/bts324.c:22. +[value] Done for function loop_body +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function init +[from] Done for function init +[from] Computing for function loop_body +[from] Done for function loop_body +[pdg] done for function main +[sparecode] add selection in function 'main' +[sparecode] selecting output zones i0; o0; +[sparecode] is_ko +[sparecode] add selection in function 'main' +[pdg] computing for function init +[pdg] done for function init +[sparecode] look for annotations in function Frama_C_bzero +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[sparecode] look for annotations in function Frama_C_copy_block +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] look for annotations in function init +[sparecode] look for annotations in function loop_body +[pdg] computing for function loop_body +[pdg] done for function loop_body +[sparecode] look for annotations in function main +[sparecode] look for annotations in function main_bis +[pdg] computing for function main_bis +[pdg] warning: unreachable entry point (sid:9, function main_bis) +[pdg] Bottom for function main_bis +[sparecode] pdg bottom: skip annotations +[sparecode] look for annotations in function main_ter +[pdg] computing for function main_ter +[pdg] warning: unreachable entry point (sid:19, function main_ter) +[pdg] Bottom for function main_ter +[sparecode] pdg bottom: skip annotations +[sparecode] finalize call input propagation +[sparecode] add selection in function 'main' +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +/*@ assigns *p_res; */ +extern void init(int *p_res); + +int is_ko = -1; +void main(void) +{ + init(& is_ko); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts334.1.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts334.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts334.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts334.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,156 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/bts334.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main_init +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + kf ∈ {0} + k[0..1] ∈ {0} + e0 ∈ [--..--] + e1 ∈ [--..--] + s0 ∈ {0} + s1 ∈ {0} + si[0..1] ∈ {0} + so[0..1] ∈ {0} +[value] computing for function init <- main_init. + Called from tests/sparecode/bts334.c:66. +tests/sparecode/bts334.c:66:[kernel] warning: No code nor explicit assigns clause for function init, generating default assigns from the specification +[value] using specification for function init +tests/sparecode/bts334.c:61:[value] warning: no 'assigns \result \from ...' clause specified for function init +[value] Done for function init +tests/sparecode/bts334.c:67:[kernel] warning: accessing uninitialized left-value: assert \initialized(&is_ok); +[value] computing for function process <- main_init. + Called from tests/sparecode/bts334.c:67. +tests/sparecode/bts334.c:53:[value] entering loop for the first time +[value] computing for function loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:53. +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:38. +tests/sparecode/bts334.c:14:[kernel] warning: division by zero: assert kf ≢ 0; +tests/sparecode/bts334.c:14:[kernel] warning: signed overflow. assert -2147483648 ≤ k[i]*(int)(vi-si[i]) ≤ 2147483647; +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:39. +[value] Recording results for f +[value] Done for function f +[value] Recording results for loop_body +[value] Done for function loop_body +[value] computing for function loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:53. +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:38. +tests/sparecode/bts334.c:14:[kernel] warning: signed overflow. assert -2147483648 ≤ vi-si[i] ≤ 2147483647; +tests/sparecode/bts334.c:14:[kernel] warning: signed overflow. + assert + -2147483648 ≤ (int)(so[i]/kf)+(int)(k[i]*(int)(vi-si[i])) ≤ 2147483647; +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:39. +[value] Recording results for f +[value] Done for function f +[value] Recording results for loop_body +[value] Done for function loop_body +[value] computing for function loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:53. +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:38. +tests/sparecode/bts334.c:14:[kernel] warning: signed overflow. assert so[i]/kf ≤ 2147483647; +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:39. +[value] Recording results for f +[value] Done for function f +[value] Recording results for loop_body +[value] Done for function loop_body +[value] Recording results for process +[value] Done for function process +[value] Recording results for main_init +[value] done for function main_init +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function loop_body +[from] Computing for function f +[from] Done for function f +[pdg] done for function loop_body +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function process +[from] Computing for function loop_body +[from] Done for function loop_body +tests/sparecode/bts334.c:55:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function process +[pdg] computing for function main_init +[from] Computing for function init +[from] Done for function init +[from] Computing for function process +[from] Non-terminating function process (no dependencies) +[from] Done for function process +[pdg] done for function main_init +[pdg] computing for function f +[pdg] done for function f +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int kf; +int k[2]; +int f_slice_1(int vi, int i); + +static int si[2] = {0, 0}; +static int so[2] = {0, 0}; +int f_slice_1(int vi, int i) +{ + int vo; + vo = so[i] / kf + k[i] * (vi - si[i]); + so[i] = vo; + si[i] = vi; + return vo; +} + +int volatile e0; +int volatile e1; +int s0; +void loop_body_slice_1(void) +{ + int acq0; + int acq1; + int val0; + /*@ slice pragma expr s0; */ ; + acq0 = e0; + acq1 = e1; + val0 = f_slice_1(acq0,0); + f_slice_1(acq1,1); + s0 = val0; + return; +} + +void process_slice_1(int conf) +{ + kf = conf; + k[0] = 3; + k[1] = 14; + while (1) loop_body_slice_1(); + return; +} + +extern int init(int *p); + +void main_init(void) +{ + int is_ok; + int config; + config = init(& is_ok); + if (is_ok) process_slice_1(config); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts334.2.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts334.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts334.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts334.2.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,194 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/bts334.c (with preprocessing) +[value] Analyzing a complete application starting at main_init +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + kf ∈ {0} + k[0..1] ∈ {0} + e0 ∈ [--..--] + e1 ∈ [--..--] + s0 ∈ {0} + s1 ∈ {0} + si[0..1] ∈ {0} + so[0..1] ∈ {0} +tests/sparecode/bts334.c:66:[kernel] warning: No code nor explicit assigns clause for function init, generating default assigns from the specification +[value] computing for function init <- main_init. + Called from tests/sparecode/bts334.c:66. +[value] using specification for function init +tests/sparecode/bts334.c:61:[value] warning: no 'assigns \result \from ...' clause specified for function init +[value] Done for function init +tests/sparecode/bts334.c:67:[kernel] warning: accessing uninitialized left-value: assert \initialized(&is_ok); +[value] computing for function process <- main_init. + Called from tests/sparecode/bts334.c:67. +tests/sparecode/bts334.c:53:[value] entering loop for the first time +[value] computing for function loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:53. +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:38. +tests/sparecode/bts334.c:14:[kernel] warning: division by zero: assert kf ≢ 0; +tests/sparecode/bts334.c:14:[kernel] warning: signed overflow. assert -2147483648 ≤ k[i]*(int)(vi-si[i]) ≤ 2147483647; +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:39. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for loop_body +[from] Computing for function loop_body +[from] Done for function loop_body +[value] Done for function loop_body +[value] computing for function loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:53. +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:38. +tests/sparecode/bts334.c:14:[kernel] warning: signed overflow. assert -2147483648 ≤ vi-si[i] ≤ 2147483647; +tests/sparecode/bts334.c:14:[kernel] warning: signed overflow. + assert + -2147483648 ≤ (int)(so[i]/kf)+(int)(k[i]*(int)(vi-si[i])) ≤ 2147483647; +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:39. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for loop_body +[from] Computing for function loop_body +[from] Done for function loop_body +[value] Done for function loop_body +[value] computing for function loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:53. +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:38. +tests/sparecode/bts334.c:14:[kernel] warning: signed overflow. assert so[i]/kf ≤ 2147483647; +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:39. +[value] Recording results for f +[from] Computing for function f +[from] Done for function f +[value] Done for function f +[value] Recording results for loop_body +[from] Computing for function loop_body +[from] Done for function loop_body +[value] Done for function loop_body +[value] Recording results for process +[from] Computing for function process +[from] Non-terminating function process (no dependencies) +[from] Done for function process +[value] Done for function process +[value] Recording results for main_init +[from] Computing for function main_init +[from] Done for function main_init +[value] done for function main_init +[from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== +[from] call to f at tests/sparecode/bts334.c:38 (by loop_body): + si[0] FROM vi; i + so[0] FROM kf; k[0]; vi; i; si[0]; so[0] + \result FROM kf; k[0]; vi; i; si[0]; so[0] +[from] call to f at tests/sparecode/bts334.c:39 (by loop_body): + si[1] FROM vi; i + so[1] FROM kf; k[1]; vi; i; si[1]; so[1] + \result FROM kf; k[1]; vi; i; si[1]; so[1] +[from] call to loop_body at tests/sparecode/bts334.c:53 (by process): + s0 FROM kf; k[0]; e0; si[0]; so[0] + s1 FROM kf; k[1]; e1; si[1]; so[1] + si[0] FROM e0 + [1] FROM e1 + so[0] FROM kf; k[0]; e0; si[0]; so[0] + [1] FROM kf; k[1]; e1; si[1]; so[1] +[from] call to init at tests/sparecode/bts334.c:66 (by main_init): + is_ok FROM \nothing + \result FROM ANYTHING(origin:Unknown) +[from] call to process at tests/sparecode/bts334.c:67 (by main_init): + NON TERMINATING - NO EFFECTS +[from] entry point: + NO EFFECTS +[from] ====== END OF CALLWISE DEPENDENCIES ====== +[slicing] slicing requests in progress... +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function loop_body +[pdg] done for function loop_body +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function process +tests/sparecode/bts334.c:55:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function process +[pdg] computing for function main_init +[pdg] done for function main_init +[pdg] computing for function f +[pdg] done for function f +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int kf; +int k[2]; +int f_slice_1(int vi, int i); + +static int si[2] = {0, 0}; +static int so[2] = {0, 0}; +int f_slice_1(int vi, int i) +{ + int vo; + vo = so[i] / kf + k[i] * (vi - si[i]); + so[i] = vo; + si[i] = vi; + return vo; +} + +int volatile e0; +int volatile e1; +int s0; +void loop_body_slice_1(void) +{ + int acq0; + int acq1; + int val0; + /*@ slice pragma expr s0; */ ; + acq0 = e0; + acq1 = e1; + val0 = f_slice_1(acq0,0); + f_slice_1(acq1,1); + s0 = val0; + return; +} + +void process_slice_1(int conf) +{ + kf = conf; + k[0] = 3; + k[1] = 14; + while (1) loop_body_slice_1(); + return; +} + +extern int init(int *p); + +void main_init(void) +{ + int is_ok; + int config; + config = init(& is_ok); + if (is_ok) process_slice_1(config); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts334.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts334.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts334.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts334.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,163 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/bts334.c (with preprocessing) +[sparecode] remove unused code... +[value] Analyzing a complete application starting at main_init +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + kf ∈ {0} + k[0..1] ∈ {0} + e0 ∈ [--..--] + e1 ∈ [--..--] + s0 ∈ {0} + s1 ∈ {0} + si[0..1] ∈ {0} + so[0..1] ∈ {0} +[value] computing for function init <- main_init. + Called from tests/sparecode/bts334.c:66. +tests/sparecode/bts334.c:66:[kernel] warning: No code nor explicit assigns clause for function init, generating default assigns from the specification +[value] using specification for function init +tests/sparecode/bts334.c:61:[value] warning: no 'assigns \result \from ...' clause specified for function init +[value] Done for function init +tests/sparecode/bts334.c:67:[kernel] warning: accessing uninitialized left-value: assert \initialized(&is_ok); +[value] computing for function process <- main_init. + Called from tests/sparecode/bts334.c:67. +tests/sparecode/bts334.c:53:[value] entering loop for the first time +[value] computing for function loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:53. +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:38. +tests/sparecode/bts334.c:14:[kernel] warning: division by zero: assert kf ≢ 0; +tests/sparecode/bts334.c:14:[kernel] warning: signed overflow. assert -2147483648 ≤ k[i]*(int)(vi-si[i]) ≤ 2147483647; +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:39. +[value] Recording results for f +[value] Done for function f +[value] Recording results for loop_body +[value] Done for function loop_body +[value] computing for function loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:53. +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:38. +tests/sparecode/bts334.c:14:[kernel] warning: signed overflow. assert -2147483648 ≤ vi-si[i] ≤ 2147483647; +tests/sparecode/bts334.c:14:[kernel] warning: signed overflow. + assert + -2147483648 ≤ (int)(so[i]/kf)+(int)(k[i]*(int)(vi-si[i])) ≤ 2147483647; +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:39. +[value] Recording results for f +[value] Done for function f +[value] Recording results for loop_body +[value] Done for function loop_body +[value] computing for function loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:53. +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:38. +tests/sparecode/bts334.c:14:[kernel] warning: signed overflow. assert so[i]/kf ≤ 2147483647; +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- loop_body <- process <- main_init. + Called from tests/sparecode/bts334.c:39. +[value] Recording results for f +[value] Done for function f +[value] Recording results for loop_body +[value] Done for function loop_body +[value] Recording results for process +[value] Done for function process +[value] Recording results for main_init +[value] done for function main_init +[pdg] computing for function main_init +[from] Computing for function init +[from] Done for function init +[from] Computing for function process +[from] Computing for function loop_body <-process +[from] Computing for function f <-loop_body <-process +[from] Done for function f +[from] Done for function loop_body +[from] Non-terminating function process (no dependencies) +[from] Done for function process +[pdg] done for function main_init +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[pdg] computing for function f +[pdg] done for function f +[pdg] computing for function init +[pdg] done for function init +[pdg] computing for function loop_body +[pdg] done for function loop_body +[pdg] computing for function process +tests/sparecode/bts334.c:55:[pdg] warning: no final state. Probably unreachable... +[pdg] done for function process +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +int kf; +int k[2]; +int f(int vi, int i); + +static int si[2] = {0, 0}; +static int so[2] = {0, 0}; +int f(int vi, int i) +{ + int vo; + vo = so[i] / kf + k[i] * (vi - si[i]); + so[i] = vo; + si[i] = vi; + return vo; +} + +int volatile e0; +int volatile e1; +int s0; +void loop_body(void) +{ + int acq0; + int acq1; + int val0; + /*@ slice pragma expr s0; */ ; + acq0 = e0; + acq1 = e1; + val0 = f(acq0,0); + f(acq1,1); + s0 = val0; + return; +} + +void process(int conf) +{ + kf = conf; + k[0] = 3; + k[1] = 14; + while (1) loop_body(); + return; +} + +/*@ assigns *p; + assigns *p \from \nothing; + + behavior default: + assigns *p; + assigns *p \from \nothing; + */ +extern int init(int *p); + +void main_init(void) +{ + int is_ok; + int config; + config = init(& is_ok); + if (is_ok) process(config); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts927.1.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts927.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts927.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts927.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,57 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/bts927.c (with preprocessing) +[sparecode] remove unused code... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/sparecode/bts927.c:15:[value] Assertion got status unknown. +[value] computing for function f <- main. + Called from tests/sparecode/bts927.c:17. +tests/sparecode/bts927.c:10:[kernel] warning: signed overflow. assert a+1 ≤ 2147483647; +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/sparecode/bts927.c:19. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[pdg] done for function main +[pdg] computing for function f +[pdg] done for function f +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +int f(void) +{ + int tmp; + tmp = 1; + return tmp; +} + +int main(int x) +{ + int __retres; + /*@ assert x > 5; */ ; + { + int tmp_0; + tmp_0 = f(); + __retres = tmp_0; + } + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts927.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts927.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/bts927.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/bts927.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,59 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/bts927.c (with preprocessing) +[sparecode] remove unused code... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/sparecode/bts927.c:15:[value] Assertion got status unknown. +[value] computing for function f <- main. + Called from tests/sparecode/bts927.c:17. +tests/sparecode/bts927.c:10:[value] warning: 2's complement assumed for overflow +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/sparecode/bts927.c:19. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[pdg] done for function main +[pdg] computing for function f +[pdg] done for function f +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +int f(int a) +{ + int c; + int tmp; + c = a + 1; + if (c > 0) tmp = 1; else tmp = 0; + return tmp; +} + +int main(int x) +{ + int __retres; + /*@ assert x > 5; */ ; + { + int tmp_0; + tmp_0 = f(x); + __retres = tmp_0; + } + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/calls.1.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/calls.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/calls.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/calls.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,60 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/calls.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} +[value] computing for function f <- main. + Called from tests/sparecode/calls.c:16. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/sparecode/calls.c:17. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/sparecode/calls.c:18. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f +[pdg] done for function f +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int f_slice_1(int x, int y) +{ + G = y; + return x; +} + +int main(void) +{ + int a; + int b; + a = 1; + b = 1; + f_slice_1(a,b); + a = f_slice_1(G + 1,b); + return a; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/calls.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/calls.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/calls.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/calls.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,69 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/calls.c (with preprocessing) +[sparecode] remove unused code... +[sparecode] selecting function main outputs and entry point +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} +[value] computing for function f <- main. + Called from tests/sparecode/calls.c:16. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/sparecode/calls.c:17. +[value] Recording results for f +[value] Done for function f +[value] computing for function f <- main. + Called from tests/sparecode/calls.c:18. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function f +[from] Done for function f +[pdg] done for function main +[sparecode] add selection in function 'main' +[sparecode] selecting output zones G +[sparecode] add selection in function 'main' +[pdg] computing for function f +[pdg] done for function f +[sparecode] look for annotations in function Frama_C_bzero +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[sparecode] look for annotations in function Frama_C_copy_block +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] look for annotations in function f +[sparecode] look for annotations in function main +[sparecode] finalize call input propagation +[sparecode] add selection in function 'main' +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +int G; +int f(int x, int y) +{ + G = y; + return x; +} + +int main(void) +{ + int a; + int b; + a = 1; + b = 1; + f(a,b); + a = f(G + 1,b); + G = 0; + return a; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/dead_code.1.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/dead_code.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/dead_code.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/dead_code.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/dead_code.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int main(void) +{ + int x; + x = 1; + return x; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/dead_code.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/dead_code.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/dead_code.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/dead_code.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/dead_code.c (with preprocessing) +[sparecode] remove unused code... +[sparecode] selecting function main outputs and entry point +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[pdg] done for function main +[sparecode] add selection in function 'main' +[sparecode] selecting output zones \nothing +[sparecode] add selection in function 'main' +[sparecode] look for annotations in function Frama_C_bzero +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[sparecode] look for annotations in function Frama_C_copy_block +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] look for annotations in function main +[sparecode] finalize call input propagation +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +int main(void) +{ + int x; + x = 1; + return x; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/glob_decls.1.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/glob_decls.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/glob_decls.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/glob_decls.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,68 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/glob_decls.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G1 ∈ [--..--] + G2 ∈ [--..--] + PG1 ∈ {{ NULL ; &S_PG1[0] }} + Gts ∈ [--..--] + GPs ∈ {{ NULL ; &S_GPs[0] }} + S2 ∈ [--..--] + C ∈ [--..--] + S3 ∈ [--..--] + Size ∈ [--..--] + X ∈ [--..--] + Y ∈ [--..--] + use_in_PX_init ∈ [--..--] + PX ∈ {{ NULL ; &S_PX_0[0] }} + S_PG1[0..1] ∈ [--..--] + S_GPs[0..1] ∈ [--..--] + S_PX[0..1] ∈ [--..--] + S_PX_0[0..1] ∈ [--..--] +tests/sparecode/glob_decls.c:42:[value] Function main: precondition got status unknown. +tests/sparecode/glob_decls.c:46:[kernel] warning: signed overflow. assert y+Y ≤ 2147483647; +tests/sparecode/glob_decls.c:47:[kernel] warning: out of bounds read. assert \valid_read(PX); +tests/sparecode/glob_decls.c:47:[kernel] warning: signed overflow. assert -2147483648 ≤ y+*PX ≤ 2147483647; +tests/sparecode/glob_decls.c:48:[value] Assertion got status unknown. +tests/sparecode/glob_decls.c:49:[kernel] warning: signed overflow. assert X+x ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct __anonstruct_Ts2_2 { + int a ; + int b ; +}; +typedef struct __anonstruct_Ts2_2 Ts2; +typedef int Int; +typedef Int Tx; +Ts2 S2; +char Size; +Tx X = (int)sizeof(Size); +/*@ requires S2.a > S2.b; */ +int main(int x) +{ + int __retres; + /*@ slice pragma expr S2; */ ; + /*@ assert X > 0; */ ; + __retres = X + x; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/glob_decls.2.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/glob_decls.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/glob_decls.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/glob_decls.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,53 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/glob_decls.c (with preprocessing) +[sparecode] remove unused global declarations from project 'default' +[sparecode] removed unused global declarations in new project 'default (without unused globals)' +/* Generated by Frama-C */ +struct __anonstruct_Ts_1 { + int a ; +}; +typedef struct __anonstruct_Ts_1 Ts; +struct __anonstruct_Ts2_2 { + int a ; + int b ; +}; +typedef struct __anonstruct_Ts2_2 Ts2; +struct __anonstruct_Ts3_3 { + int a ; + int b ; + int c ; +}; +typedef struct __anonstruct_Ts3_3 Ts3; +typedef int Int; +typedef Int Tx; +Ts2 S2; +Ts3 S3; +int f(void) +{ + int __retres; + __retres = (S3.a + S3.b) + S3.c; + return __retres; +} + +char Size; +Tx X = (int)sizeof(Size); +int Y; +int use_in_PX_init; +int *PX; + +/*@ requires S2.a > S2.b; */ +int main(int x, Ts s) +{ + int __retres; + int y; + /*@ slice pragma expr S2; */ ; + y = 3; + y += Y; + y += *PX; + /*@ assert X > 0; */ ; + __retres = X + x; + return __retres; +} + +int *PX = & use_in_PX_init; + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/glob_decls.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/glob_decls.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/glob_decls.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/glob_decls.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,81 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/glob_decls.c (with preprocessing) +[sparecode] remove unused code... +[sparecode] selecting function main outputs and entry point +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G1 ∈ [--..--] + G2 ∈ [--..--] + PG1 ∈ {{ NULL ; &S_PG1[0] }} + Gts ∈ [--..--] + GPs ∈ {{ NULL ; &S_GPs[0] }} + S2 ∈ [--..--] + C ∈ [--..--] + S3 ∈ [--..--] + Size ∈ [--..--] + X ∈ [--..--] + Y ∈ [--..--] + use_in_PX_init ∈ [--..--] + PX ∈ {{ NULL ; &S_PX_0[0] }} + S_PG1[0..1] ∈ [--..--] + S_GPs[0..1] ∈ [--..--] + S_PX[0..1] ∈ [--..--] + S_PX_0[0..1] ∈ [--..--] +tests/sparecode/glob_decls.c:42:[value] Function main: precondition got status unknown. +tests/sparecode/glob_decls.c:46:[kernel] warning: signed overflow. assert y+Y ≤ 2147483647; +tests/sparecode/glob_decls.c:47:[kernel] warning: out of bounds read. assert \valid_read(PX); +tests/sparecode/glob_decls.c:47:[kernel] warning: signed overflow. assert -2147483648 ≤ y+*PX ≤ 2147483647; +tests/sparecode/glob_decls.c:48:[value] Assertion got status unknown. +tests/sparecode/glob_decls.c:49:[kernel] warning: signed overflow. assert X+x ≤ 2147483647; +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[pdg] done for function main +[sparecode] add selection in function 'main' +[sparecode] selecting output zones \nothing +[sparecode] add selection in function 'main' +[sparecode] look for annotations in function Frama_C_bzero +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[sparecode] look for annotations in function Frama_C_copy_block +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] look for annotations in function f +[pdg] computing for function f +[pdg] warning: unreachable entry point (sid:2, function f) +[pdg] Bottom for function f +[sparecode] pdg bottom: skip annotations +[sparecode] look for annotations in function main +[sparecode] selecting annotation : slice pragma expr S2; +[sparecode] selecting annotation : assert X > 0; +[sparecode] add selection in function 'main' +[sparecode] finalize call input propagation +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +struct __anonstruct_Ts2_2 { + int a ; + int b ; +}; +typedef struct __anonstruct_Ts2_2 Ts2; +typedef int Int; +typedef Int Tx; +Ts2 S2; +char Size; +Tx X = (int)sizeof(Size); +int main(int x) +{ + int __retres; + /*@ slice pragma expr S2; */ ; + /*@ assert X > 0; */ ; + __retres = X + x; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/intra.1.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/intra.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/intra.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/intra.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,195 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/intra.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + X10 ∈ {0} + Y10 ∈ {0} +[value] computing for function param <- main. + Called from tests/sparecode/intra.c:82. +[value] Recording results for param +[value] Done for function param +[value] computing for function tmp <- main. + Called from tests/sparecode/intra.c:83. +tests/sparecode/intra.c:21:[value] Assertion got status valid. +tests/sparecode/intra.c:23:[value] Assertion got status valid. +[value] Recording results for tmp +[value] Done for function tmp +[value] computing for function spare_called_fct <- main. + Called from tests/sparecode/intra.c:84. +[value] Recording results for spare_called_fct +[value] Done for function spare_called_fct +[value] computing for function call_two_outputs <- main. + Called from tests/sparecode/intra.c:85. +[value] computing for function two_outputs <- call_two_outputs <- main. + Called from tests/sparecode/intra.c:49. +[value] Recording results for two_outputs +[value] Done for function two_outputs +[value] computing for function two_outputs <- call_two_outputs <- main. + Called from tests/sparecode/intra.c:53. +[value] Recording results for two_outputs +[value] Done for function two_outputs +[value] Recording results for call_two_outputs +[value] Done for function call_two_outputs +[value] computing for function loop <- main. + Called from tests/sparecode/intra.c:86. +tests/sparecode/intra.c:64:[value] Assertion got status valid. +tests/sparecode/intra.c:65:[value] Loop invariant got status valid. +tests/sparecode/intra.c:67:[value] entering loop for the first time +[value] Recording results for loop +[value] Done for function loop +[value] computing for function assign <- main. + Called from tests/sparecode/intra.c:87. +[value] Recording results for assign +[value] Done for function assign +[value] computing for function assign <- main. + Called from tests/sparecode/intra.c:88. +[value] Recording results for assign +[value] Done for function assign +[value] computing for function stop <- main. + Called from tests/sparecode/intra.c:91. +tests/sparecode/intra.c:91:[kernel] warning: Neither code nor specification for function stop, generating default assigns from the prototype +[value] using specification for function stop +[value] Done for function stop +tests/sparecode/intra.c:93:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function param +[from] Done for function param +[from] Computing for function tmp +[from] Done for function tmp +[from] Computing for function spare_called_fct +[from] Done for function spare_called_fct +[from] Computing for function call_two_outputs +[from] Computing for function two_outputs <-call_two_outputs +[from] Done for function two_outputs +[from] Done for function call_two_outputs +[from] Computing for function loop +[from] Done for function loop +[from] Computing for function assign +[from] Done for function assign +[from] Computing for function stop +[from] Done for function stop +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function assign +[pdg] done for function assign +[pdg] computing for function loop +[pdg] done for function loop +[pdg] computing for function call_two_outputs +[pdg] done for function call_two_outputs +[pdg] computing for function two_outputs +[pdg] done for function two_outputs +[pdg] computing for function tmp +[pdg] done for function tmp +[pdg] computing for function param +[pdg] done for function param +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int G; +int tmp_slice_1(int a) +{ + int x; + x = a; + /*@ assert x ≡ a; */ ; + return x; +} + +int param_slice_1(int a) +{ + return a; +} + +int two_outputs_slice_1(int a, int b) +{ + G += b; + return a; +} + +int call_two_outputs_slice_1(void) +{ + int x; + int any_b; + int any_a; + int a; + int b; + any_b = 1; + any_a = 2; + a = 1; + b = any_b; + x = two_outputs_slice_1(a,b); + G = 1; + b = 2; + a = any_a; + two_outputs_slice_1(a,b); + return x; +} + +void assign_slice_1(int *p, int *q) +{ + *p = *q; + return; +} + +int loop_slice_1(int x) +{ + int i; + i = 0; + while (i < x) i ++; + return i; +} + +int main(void) +{ + int __retres; + int res; + int spare_ref; + int x; + int y; + int tmp_0; + int tmp_1; + int tmp_2; + int tmp_3; + res = 0; + spare_ref = 3; + y = 2; + { + /*sequence*/ + tmp_0 = param_slice_1(2); + res += tmp_0; + } + { + /*sequence*/ + tmp_1 = tmp_slice_1(4); + res += tmp_1; + } + { + /*sequence*/ + tmp_2 = call_two_outputs_slice_1(); + res += tmp_2; + } + { + /*sequence*/ + tmp_3 = loop_slice_1(10); + res += tmp_3; + } + assign_slice_1(& x,& y); + __retres = (res + G) + x; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/intra.2.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/intra.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/intra.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/intra.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,99 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/intra.c (with preprocessing) +[sparecode] remove unused code... +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + X10 ∈ {0} + Y10 ∈ {0} +[value] computing for function f10 <- main2. + Called from tests/sparecode/intra.c:115. +tests/sparecode/intra.c:109:[value] Assertion got status valid. +[value] Recording results for f10 +[value] Done for function f10 +[value] Recording results for main2 +[value] done for function main2 +[pdg] computing for function main2 +[from] Computing for function f10 +[from] Done for function f10 +[pdg] done for function main2 +[pdg] computing for function f10 +[pdg] done for function f10 +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[pdg] computing for function assign +[pdg] warning: unreachable entry point (sid:35, function assign) +[pdg] Bottom for function assign +[pdg] computing for function call_two_outputs +[pdg] warning: unreachable entry point (sid:22, function call_two_outputs) +[pdg] Bottom for function call_two_outputs +[pdg] computing for function loop +[pdg] warning: unreachable entry point (sid:38, function loop) +[pdg] Bottom for function loop +[pdg] computing for function main +[pdg] warning: unreachable entry point (sid:49, function main) +[pdg] Bottom for function main +[pdg] computing for function param +[pdg] warning: unreachable entry point (sid:13, function param) +[pdg] Bottom for function param +[pdg] computing for function spare_called_fct +[pdg] warning: unreachable entry point (sid:16, function spare_called_fct) +[pdg] Bottom for function spare_called_fct +[pdg] computing for function stop +[from] Computing for function stop +tests/sparecode/intra.c:35:[kernel] warning: Neither code nor specification for function stop, generating default assigns from the prototype +[from] Done for function stop +[pdg] done for function stop +[pdg] computing for function tmp +[pdg] warning: unreachable entry point (sid:2, function tmp) +[pdg] Bottom for function tmp +[pdg] computing for function two_outputs +[pdg] warning: unreachable entry point (sid:18, function two_outputs) +[pdg] Bottom for function two_outputs +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +struct __anonstruct_a_2 { + int x ; + int y ; +}; +struct __anonstruct_X10_1 { + struct __anonstruct_a_2 a ; + int b ; +}; +struct __anonstruct_X10_1 X10; +int Y10; +int f10(int x) +{ + /*@ slice pragma expr X10; */ ; + /*@ slice pragma expr X10.a; */ ; + /*@ slice pragma expr X10.a.x; */ ; + /*@ slice pragma expr Y10; */ ; + /*@ assert X10.a.x ≥ 0; */ ; + return x; +} + +int main2(void) +{ + int __retres; + int tmp_0; + Y10 = 0; + X10.b = 0; + { + /*sequence*/ + tmp_0 = f10(3); + X10.a.y += tmp_0; + } + __retres = X10.a.x + X10.a.y; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/intra.3.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/intra.3.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/intra.3.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/intra.3.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,64 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/intra.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + X10 ∈ {0} + Y10 ∈ {0} +[value] computing for function f10 <- main2. + Called from tests/sparecode/intra.c:115. +tests/sparecode/intra.c:109:[value] Assertion got status valid. +[value] Recording results for f10 +[value] Done for function f10 +[value] Recording results for main2 +[value] done for function main2 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main2 +[from] Computing for function f10 +[from] Done for function f10 +[pdg] done for function main2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function f10 +[pdg] done for function f10 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct __anonstruct_a_2 { + int x ; + int y ; +}; +struct __anonstruct_X10_1 { + struct __anonstruct_a_2 a ; + int b ; +}; +struct __anonstruct_X10_1 X10; +int f10_slice_1(int x) +{ + return x; +} + +int main2(void) +{ + int __retres; + int tmp_0; + { + /*sequence*/ + tmp_0 = f10_slice_1(3); + X10.a.y += tmp_0; + } + __retres = X10.a.x + X10.a.y; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/intra.4.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/intra.4.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/intra.4.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/intra.4.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,67 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/intra.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + X10 ∈ {0} + Y10 ∈ {0} +[value] computing for function f10 <- main2. + Called from tests/sparecode/intra.c:115. +tests/sparecode/intra.c:109:[value] Assertion got status valid. +[value] Recording results for f10 +[value] Done for function f10 +[value] Recording results for main2 +[value] done for function main2 +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function f10 +[pdg] done for function f10 +[pdg] computing for function main2 +[from] Computing for function f10 +[from] Done for function f10 +[pdg] done for function main2 +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 2 actions... +[slicing] applying actions: 1/2... +[slicing] applying actions: 2/2... +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +struct __anonstruct_a_2 { + int x ; + int y ; +}; +struct __anonstruct_X10_1 { + struct __anonstruct_a_2 a ; + int b ; +}; +struct __anonstruct_X10_1 X10; +int f10_slice_1(int x) +{ + /*@ slice pragma expr X10.a.x; */ ; + /*@ assert X10.a.x ≥ 0; */ ; + return x; +} + +int main2(void) +{ + int __retres; + int tmp_0; + { + /*sequence*/ + tmp_0 = f10_slice_1(3); + X10.a.y += tmp_0; + } + __retres = X10.a.x + X10.a.y; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/intra.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/intra.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/intra.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/intra.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,238 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/intra.c (with preprocessing) +[sparecode] remove unused code... +[sparecode] selecting function main outputs and entry point +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + G ∈ {0} + X10 ∈ {0} + Y10 ∈ {0} +[value] computing for function param <- main. + Called from tests/sparecode/intra.c:82. +[value] Recording results for param +[value] Done for function param +[value] computing for function tmp <- main. + Called from tests/sparecode/intra.c:83. +tests/sparecode/intra.c:21:[value] Assertion got status valid. +tests/sparecode/intra.c:23:[value] Assertion got status valid. +[value] Recording results for tmp +[value] Done for function tmp +[value] computing for function spare_called_fct <- main. + Called from tests/sparecode/intra.c:84. +[value] Recording results for spare_called_fct +[value] Done for function spare_called_fct +[value] computing for function call_two_outputs <- main. + Called from tests/sparecode/intra.c:85. +[value] computing for function two_outputs <- call_two_outputs <- main. + Called from tests/sparecode/intra.c:49. +[value] Recording results for two_outputs +[value] Done for function two_outputs +[value] computing for function two_outputs <- call_two_outputs <- main. + Called from tests/sparecode/intra.c:53. +[value] Recording results for two_outputs +[value] Done for function two_outputs +[value] Recording results for call_two_outputs +[value] Done for function call_two_outputs +[value] computing for function loop <- main. + Called from tests/sparecode/intra.c:86. +tests/sparecode/intra.c:64:[value] Assertion got status valid. +tests/sparecode/intra.c:65:[value] Loop invariant got status valid. +tests/sparecode/intra.c:67:[value] entering loop for the first time +[value] Recording results for loop +[value] Done for function loop +[value] computing for function assign <- main. + Called from tests/sparecode/intra.c:87. +[value] Recording results for assign +[value] Done for function assign +[value] computing for function assign <- main. + Called from tests/sparecode/intra.c:88. +[value] Recording results for assign +[value] Done for function assign +[value] computing for function stop <- main. + Called from tests/sparecode/intra.c:91. +tests/sparecode/intra.c:91:[kernel] warning: Neither code nor specification for function stop, generating default assigns from the prototype +[value] using specification for function stop +[value] Done for function stop +tests/sparecode/intra.c:93:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function param +[from] Done for function param +[from] Computing for function tmp +[from] Done for function tmp +[from] Computing for function spare_called_fct +[from] Done for function spare_called_fct +[from] Computing for function call_two_outputs +[from] Computing for function two_outputs <-call_two_outputs +[from] Done for function two_outputs +[from] Done for function call_two_outputs +[from] Computing for function loop +[from] Done for function loop +[from] Computing for function assign +[from] Done for function assign +[from] Computing for function stop +[from] Done for function stop +[pdg] done for function main +[sparecode] add selection in function 'main' +[sparecode] selecting output zones G +[sparecode] add selection in function 'main' +[pdg] computing for function call_two_outputs +[pdg] done for function call_two_outputs +[pdg] computing for function assign +[pdg] done for function assign +[pdg] computing for function loop +[pdg] done for function loop +[pdg] computing for function tmp +[pdg] done for function tmp +[pdg] computing for function param +[pdg] done for function param +[pdg] computing for function two_outputs +[pdg] done for function two_outputs +[sparecode] look for annotations in function Frama_C_bzero +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[sparecode] look for annotations in function Frama_C_copy_block +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] look for annotations in function assign +[sparecode] look for annotations in function call_two_outputs +[sparecode] look for annotations in function f10 +[pdg] computing for function f10 +[pdg] warning: unreachable entry point (sid:83, function f10) +[pdg] Bottom for function f10 +[sparecode] pdg bottom: skip annotations +[sparecode] look for annotations in function loop +[sparecode] selecting annotation : assert i < z; +[sparecode] selecting annotation : loop invariant i < y; +[sparecode] add selection in function 'loop' +[sparecode] look for annotations in function main +[sparecode] selecting annotation : assert \false; +[sparecode] look for annotations in function main2 +[pdg] computing for function main2 +[pdg] warning: unreachable entry point (sid:92, function main2) +[pdg] Bottom for function main2 +[sparecode] pdg bottom: skip annotations +[sparecode] look for annotations in function param +[sparecode] look for annotations in function spare_called_fct +[pdg] computing for function spare_called_fct +[pdg] done for function spare_called_fct +[sparecode] look for annotations in function stop +[pdg] computing for function stop +[pdg] done for function stop +[sparecode] look for annotations in function tmp +[sparecode] selecting annotation : assert x ≡ a; +[sparecode] selecting annotation : assert w ≡ 1; +[sparecode] add selection in function 'tmp' +[sparecode] look for annotations in function two_outputs +[sparecode] finalize call input propagation +[sparecode] add selection in function 'call_two_outputs' +[sparecode] add selection in function 'main' +[sparecode] add selection in function 'main' +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +int G; +int tmp(int a) +{ + int x; + int w; + x = a; + /*@ assert x ≡ a; */ ; + w = 1; + /*@ assert w ≡ 1; */ ; + return x; +} + +int param(int a) +{ + return a; +} + +int two_outputs(int a, int b) +{ + G += b; + return a; +} + +int call_two_outputs(void) +{ + int x; + int any_b; + int any_a; + int a; + int b; + any_b = 1; + any_a = 2; + a = 1; + b = any_b; + x = two_outputs(a,b); + G = 1; + b = 2; + a = any_a; + two_outputs(a,b); + return x; +} + +void assign(int *p, int *q) +{ + *p = *q; + return; +} + +int loop(int x, int y, int z) +{ + int i; + i = 0; + /*@ assert i < z; */ ; + /*@ loop invariant i < y; */ + while (i < x) i ++; + return i; +} + +int main(void) +{ + int __retres; + int res; + int spare_ref; + int x; + int y; + int tmp_0; + int tmp_1; + int tmp_2; + int tmp_3; + res = 0; + spare_ref = 3; + y = 2; + { + /*sequence*/ + tmp_0 = param(2); + res += tmp_0; + } + { + /*sequence*/ + tmp_1 = tmp(4); + res += tmp_1; + } + { + /*sequence*/ + tmp_2 = call_two_outputs(); + res += tmp_2; + } + { + /*sequence*/ + tmp_3 = loop(10,15,20); + res += tmp_3; + } + assign(& x,& y); + __retres = (res + G) + x; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/params.1.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/params.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/params.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/params.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/params.c (with preprocessing) +[slicing] slicing requests in progress... +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function main1 <- main. + Called from tests/sparecode/params.c:17. +[value] Recording results for main1 +[value] Done for function main1 +[value] Recording results for main +[value] done for function main +[slicing] making slicing project 'Slicing'... +[slicing] interpreting slicing requests from the command line... +[pdg] computing for function main +[from] Computing for function main1 +[from] Done for function main1 +[pdg] done for function main +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[slicing] applying all slicing requests... +[slicing] applying 1 actions... +[slicing] applying actions: 1/1... +[pdg] computing for function main1 +[pdg] done for function main1 +[slicing] exporting project to 'Slicing export'... +[slicing] applying all slicing requests... +[slicing] applying 0 actions... +[sparecode] remove unused global declarations from project 'Slicing export tmp' +[sparecode] removed unused global declarations in new project 'Slicing export' +/* Generated by Frama-C */ +int main1_slice_1(int y) +{ + y = 3; + return y; +} + +int main(void) +{ + int b; + int tmp; + b = 1; + tmp = main1_slice_1(b); + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/params.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/params.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/params.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/params.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,57 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/params.c (with preprocessing) +[sparecode] remove unused code... +[sparecode] selecting function main outputs and entry point +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function main1 <- main. + Called from tests/sparecode/params.c:17. +[value] Recording results for main1 +[value] Done for function main1 +[value] Recording results for main +[value] done for function main +[pdg] computing for function main +[from] Computing for function main1 +[from] Done for function main1 +[pdg] done for function main +[sparecode] add selection in function 'main' +[sparecode] selecting output zones \nothing +[sparecode] add selection in function 'main' +[pdg] computing for function main1 +[pdg] done for function main1 +[sparecode] look for annotations in function Frama_C_bzero +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[sparecode] look for annotations in function Frama_C_copy_block +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] look for annotations in function main +[sparecode] look for annotations in function main1 +[sparecode] finalize call input propagation +[sparecode] add selection in function 'main' +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +int main1(int y) +{ + y = 3; + return y; +} + +int main(void) +{ + int b; + int tmp; + b = 1; + tmp = main1(b); + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/se.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/se.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/se.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/se.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,46 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/se.c (with preprocessing) +[sparecode] remove unused code... +[sparecode] selecting function Se outputs and entry point +[value] Analyzing an incomplete application starting at Se +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + glob ∈ [--..--] +tests/sparecode/se.c:8:[kernel] warning: out of bounds write. assert \valid(s1); +tests/sparecode/se.c:12:[kernel] warning: out of bounds write. assert \valid(tab+e1); +tests/sparecode/se.c:14:[kernel] warning: out of bounds read. assert \valid_read(es); +[value] Recording results for Se +[value] done for function Se +[pdg] computing for function Se +[pdg] done for function Se +[sparecode] add selection in function 'Se' +[sparecode] selecting output zones glob; S_tab[0..1]; S_s1[0]; +[sparecode] S_es[0] +[sparecode] add selection in function 'Se' +[sparecode] look for annotations in function Frama_C_bzero +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[sparecode] look for annotations in function Frama_C_copy_block +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] look for annotations in function Se +[sparecode] finalize call input propagation +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +int glob; +void Se(int e1, int *es, int *s1, int *tab) +{ + *s1 = 0; + glob = 10; + if (e1 == 0) *s1 = 1; else *(tab + e1) = 5; + if (*es == 1) *es = 0; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/top.1.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/top.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/top.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/top.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,149 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/top.c (with preprocessing) +[sparecode] remove unused code... +[sparecode] selecting function main_call_top outputs and entry point +[value] Analyzing a complete application starting at main_call_top +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function main_top <- main_call_top. + Called from tests/sparecode/top.c:26. +[value] computing for function f <- main_top <- main_call_top. + Called from tests/sparecode/top.c:21. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main_top +[value] Done for function main_top +[value] computing for function not_used_in_main_top <- main_call_top. + Called from tests/sparecode/top.c:27. +[value] computing for function print <- not_used_in_main_top <- main_call_top. + Called from tests/sparecode/top.c:10. +tests/sparecode/top.c:10:[kernel] warning: Neither code nor specification for function print, generating default assigns from the prototype +[value] using specification for function print +[value] Done for function print +[value] Recording results for not_used_in_main_top +[value] Done for function not_used_in_main_top +[value] Recording results for main_call_top +[value] done for function main_call_top +[pdg] computing for function main_call_top +[from] Computing for function main_top +[from] Computing for function f <-main_top +[from] Done for function f +[from] Done for function main_top +[from] Computing for function not_used_in_main_top +[from] Computing for function print <-not_used_in_main_top +[from] Done for function print +[from] Done for function not_used_in_main_top +[pdg] done for function main_call_top +[sparecode] add selection in function 'main_call_top' +[sparecode] selecting output zones \nothing +[sparecode] add selection in function 'main_call_top' +[pdg] computing for function not_used_in_main_top +[pdg] done for function not_used_in_main_top +[pdg] computing for function main_top +[pdg] warning: not implemented by pdg yet: variadic function +[pdg] Top for function main_top +[sparecode] memo call to TOP 'main_top' +[sparecode] select 'main_top' as fully visible (top or called by top) +[users] requiring again the computation of the value analysis +[value] Analyzing a complete application starting at main_call_top +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function main_top <- main_call_top. + Called from tests/sparecode/top.c:26. +[value] computing for function f <- main_top <- main_call_top. + Called from tests/sparecode/top.c:21. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main_top +[value] Done for function main_top +[value] computing for function not_used_in_main_top <- main_call_top. + Called from tests/sparecode/top.c:27. +[value] computing for function print <- not_used_in_main_top <- main_call_top. + Called from tests/sparecode/top.c:10. +[value] Done for function print +[value] Recording results for not_used_in_main_top +[value] Done for function not_used_in_main_top +[value] Recording results for main_call_top +[value] done for function main_call_top +[sparecode] select 'f' as fully visible (top or called by top) +[sparecode] look for annotations in function Frama_C_bzero +[pdg] computing for function Frama_C_bzero +[from] Computing for function Frama_C_bzero +[from] Done for function Frama_C_bzero +[pdg] done for function Frama_C_bzero +[sparecode] look for annotations in function Frama_C_copy_block +[pdg] computing for function Frama_C_copy_block +[from] Computing for function Frama_C_copy_block +[from] Done for function Frama_C_copy_block +[pdg] done for function Frama_C_copy_block +[sparecode] look for annotations in function f +[pdg] computing for function f +[pdg] done for function f +[sparecode] look for annotations in function main_call_top +[pdg] computing for function main_call_top +[from] Computing for function main_top +[from] Computing for function f <-main_top +[from] Done for function f +[from] Done for function main_top +[from] Computing for function not_used_in_main_top +[from] Computing for function print <-not_used_in_main_top +[from] Done for function print +[from] Done for function not_used_in_main_top +[pdg] done for function main_call_top +[sparecode] look for annotations in function main_top +[pdg] computing for function main_top +[pdg] warning: not implemented by pdg yet: variadic function +[pdg] Top for function main_top +[sparecode] pdg top: skip annotations +[sparecode] look for annotations in function main_top_not_used +[pdg] computing for function main_top_not_used +[pdg] warning: unreachable entry point (sid:18, function main_top_not_used) +[pdg] Bottom for function main_top_not_used +[sparecode] pdg bottom: skip annotations +[sparecode] look for annotations in function not_used_in_main_top +[pdg] computing for function not_used_in_main_top +[pdg] done for function not_used_in_main_top +[sparecode] look for annotations in function print +[pdg] computing for function print +[pdg] done for function print +[sparecode] finalize call input propagation +[sparecode] add selection in function 'main_call_top' +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +int not_used_in_main_top(int x) +{ + int __retres; + __retres = x + 2; + return __retres; +} + +int f(int a) +{ + int __retres; + __retres = a + 1; + return __retres; +} + +int main_top(int nb , ...) +{ + int x; + int y; + x = 3; + y = f(2); + return x; +} + +int main_call_top(void) +{ + int x; + x = main_top(2,0,1); + x = not_used_in_main_top(x); + return x; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/top.2.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/top.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/top.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/top.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,40 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/top.c (with preprocessing) +[sparecode] remove unused code... +[sparecode] selecting function main_top_not_used outputs and entry point +[value] Analyzing a complete application starting at main_top_not_used +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function main_top <- main_top_not_used. + Called from tests/sparecode/top.c:32. +[value] computing for function f <- main_top <- main_top_not_used. + Called from tests/sparecode/top.c:21. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main_top +[value] Done for function main_top +[value] computing for function f <- main_top_not_used. + Called from tests/sparecode/top.c:33. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main_top_not_used +[value] done for function main_top_not_used +[pdg] computing for function main_top_not_used +[from] Computing for function main_top +[from] Computing for function f <-main_top +[from] Done for function f +[from] Done for function main_top +[pdg] done for function main_top_not_used +[sparecode] add selection in function 'main_top_not_used' +[sparecode] selecting output zones \nothing +[sparecode] add selection in function 'main_top_not_used' +[pdg] computing for function f +[pdg] done for function f +[pdg] computing for function main_top +[pdg] warning: not implemented by pdg yet: variadic function +[pdg] Top for function main_top +[kernel] Plug-in pdg aborted: unimplemented feature. + You may send a feature request at http://bts.frama-c.com with: + '[Plug-in pdg] mark propagation in Top PDG'. diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/oracle/top.res.oracle frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/top.res.oracle --- frama-c-20140301+neon+dfsg/tests/sparecode/oracle/top.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/oracle/top.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,52 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/sparecode/top.c (with preprocessing) +[sparecode] remove unused code... +[sparecode] selecting function main_top outputs and entry point +[value] Analyzing a complete application starting at main_top +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main_top. + Called from tests/sparecode/top.c:21. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main_top +[value] done for function main_top +[pdg] computing for function main_top +[pdg] warning: not implemented by pdg yet: variadic function +[pdg] Top for function main_top +[sparecode] select 'main_top' as fully visible (top or called by top) +[users] requiring again the computation of the value analysis +[value] Analyzing a complete application starting at main_top +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- main_top. + Called from tests/sparecode/top.c:21. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main_top +[value] done for function main_top +[sparecode] select 'f' as fully visible (top or called by top) +[sparecode] remove unused global declarations... +[sparecode] result in new project 'default without sparecode'. +/* Generated by Frama-C */ +int f(int a) +{ + int __retres; + __retres = a + 1; + return __retres; +} + +int main_top(int nb , ...) +{ + int x; + int y; + x = 3; + y = f(2); + return x; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/sparecode/test_config frama-c-20150201+sodium+dfsg/tests/sparecode/test_config --- frama-c-20140301+neon+dfsg/tests/sparecode/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/sparecode/test_config 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1 @@ +CMD: FRAMAC_PLUGIN=tests/.empty @frama-c@ \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/tests/spec/acsl_basic_allocator.c frama-c-20150201+sodium+dfsg/tests/spec/acsl_basic_allocator.c --- frama-c-20140301+neon+dfsg/tests/spec/acsl_basic_allocator.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/acsl_basic_allocator.c 2015-05-28 08:53:24.000000000 +0000 @@ -8,10 +8,7 @@ /* This file presents the basic version of the allocator. */ /*****************************************************************************/ -//#include -//#include "../../share/libc.h" -#define FRAMA_C_MALLOC_POSITION -#include "share/libc/stdlib.c" +#include "share/libc/stdlib.h" #define DEFAULT_BLOCK_SIZE 1000 diff -Nru frama-c-20140301+neon+dfsg/tests/spec/const_ptr_bts1729.i frama-c-20150201+sodium+dfsg/tests/spec/const_ptr_bts1729.i --- frama-c-20140301+neon+dfsg/tests/spec/const_ptr_bts1729.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/const_ptr_bts1729.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,4 @@ + +static void elem_size(void) { + //@ assert \valid_read((char const * const *)0); +} diff -Nru frama-c-20140301+neon+dfsg/tests/spec/doxygen.c frama-c-20150201+sodium+dfsg/tests/spec/doxygen.c --- frama-c-20140301+neon+dfsg/tests/spec/doxygen.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/doxygen.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +/* run.config + OPT: -keep-comments -print -then -pp-annot +*/ + +/*@{*/ + +/*@{ Bla */ + +//@{ + +//@{ Blu + +void doxygen_group () { +} + +/*@} Bli */ + +/*@} */ + +//@} + +//@} Bly + + +void main(); diff -Nru frama-c-20140301+neon+dfsg/tests/spec/Extend.i frama-c-20150201+sodium+dfsg/tests/spec/Extend.i --- frama-c-20140301+neon+dfsg/tests/spec/Extend.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/Extend.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,15 @@ +/* run.config +EXECNOW: make @PTEST_DIR@/@PTEST_NAME@.cmxs +OPT: -load-module @PTEST_DIR@/@PTEST_NAME@ -print -copy -check +*/ + +/*@ foo x == 0; + bar \result == 0; + */ +int f(int x); + +/*@ behavior test: + foo y == 1; + bar y + \result == 0; +*/ +int g(int y); diff -Nru frama-c-20140301+neon+dfsg/tests/spec/Extend.ml frama-c-20150201+sodium+dfsg/tests/spec/Extend.ml --- frama-c-20140301+neon+dfsg/tests/spec/Extend.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/Extend.ml 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,58 @@ +open Extlib +open Cil_types +open Logic_typing + +let type_foo ~typing_context ~loc bhv l = + let _loc = loc in + let preds = + List.map + (Logic_const.new_predicate $ + (typing_context.type_predicate typing_context.pre_state)) + l + in + bhv.b_extended <- ("foo", 0, preds) :: bhv.b_extended + +module Count = State_builder.Counter(struct let name = "Count" end) + +module Bar_table = + State_builder.Hashtbl + (Datatype.Int.Hashtbl) + (Datatype.List(Cil_datatype.Predicate_named)) + (struct + let name = "Bar_table" + let dependencies = [ Ast.self; Count.self ] + let size = 3 + end) + +let type_bar ~typing_context ~loc bhv l = + let _loc = loc in + let i = Count.next() in + let p = + List.map + (typing_context.type_predicate (typing_context.post_state [Normal])) l + in + Bar_table.add i p; + bhv.b_extended <- ("bar", i, []) :: bhv.b_extended + +let print_bar prt fmt (idx, _) = + let l = Bar_table.find idx in + Pretty_utils.pp_list + ~pre:"@[" ~sep:",@ " ~suf:"@]" prt#predicate_named fmt l + +let visit_bar vis (idx, _) = + let l = Bar_table.find idx in + let l' = Cil.mapNoCopy (Cil.visitCilPredicateNamed vis) l in + if Cil.is_copy_behavior vis#behavior then begin + let idx' = Count.next () in + Queue.add (fun () -> Bar_table.add idx' l') vis#get_filling_actions; + Cil.ChangeTo(idx',[]) + end else begin + Bar_table.replace idx l'; + Cil.SkipChildren + end + +let () = + Logic_typing.register_behavior_extension "foo" type_foo; + Logic_typing.register_behavior_extension "bar" type_bar; + Cil_printer.register_behavior_extension "bar" print_bar; + Cil.register_behavior_extension "bar" visit_bar diff -Nru frama-c-20140301+neon+dfsg/tests/spec/fct_ptr.c frama-c-20150201+sodium+dfsg/tests/spec/fct_ptr.c --- frama-c-20140301+neon+dfsg/tests/spec/fct_ptr.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/fct_ptr.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,14 @@ +typedef void(*proc)(void); + +int x; + +void inc() { x++; } + +void dec() { x--; } + +proc f = dec; +proc g = inc; + +void call(proc x) { x(); } + +/*@ predicate foo = f == dec || f == &inc; */ diff -Nru frama-c-20140301+neon+dfsg/tests/spec/lib.c frama-c-20150201+sodium+dfsg/tests/spec/lib.c --- frama-c-20140301+neon+dfsg/tests/spec/lib.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/lib.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,5 +1,5 @@ /* run.config - OPT: -pp-annot -cpp-command="gcc -C -E -I tests/spec" -cpp-extra-args="-include lib.h" -print -journal-disable + OPT: -cpp-extra-args="-Itests/spec" -cpp-extra-args="-include lib.h" -print -journal-disable */ /*@ ensures f((int)0) == (int)0; */ diff -Nru frama-c-20140301+neon+dfsg/tests/spec/merge_logic_globals_1.c frama-c-20150201+sodium+dfsg/tests/spec/merge_logic_globals_1.c --- frama-c-20140301+neon+dfsg/tests/spec/merge_logic_globals_1.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/merge_logic_globals_1.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,6 @@ +/* run.config +OPT: -print @PTEST_DIR@/merge_logic_globals_2.c -cpp-extra-args="-I@PTEST_DIR@" +*/ +#include "merge_logic_globals.h" + +int main() { test(); /*@ assert p((int)li); */ } diff -Nru frama-c-20140301+neon+dfsg/tests/spec/merge_logic_globals_2.c frama-c-20150201+sodium+dfsg/tests/spec/merge_logic_globals_2.c --- frama-c-20140301+neon+dfsg/tests/spec/merge_logic_globals_2.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/merge_logic_globals_2.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,7 @@ +/* run.config +DONTRUN: main test is merge_logic_globals_1.c +*/ + +#include "merge_logic_globals.h" + +int f() { t x; x.n = i; i--; /*@ assert p(x.n); */ return x.n; } diff -Nru frama-c-20140301+neon+dfsg/tests/spec/merge_logic_globals.h frama-c-20150201+sodium+dfsg/tests/spec/merge_logic_globals.h --- frama-c-20140301+neon+dfsg/tests/spec/merge_logic_globals.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/merge_logic_globals.h 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,21 @@ +/* a.h */ +typedef struct s_t { int n; } t; +/*@ type invariant inv_t(t x) = x.n > 0; */ + +/* @ predicate p(int x) reads x; */ + +int i = 42; + +/*@ predicate p{Here}(int x) = x >= i; */ + +/*@ axiomatic Bar { logic integer li; } */ + +/*@ ensures i == li; */ +void test() { } + +/*@ axiomatic Foo { + type foo; + logic foo ff(foo x,char * y); + predicate fp(foo x, foo y); + axiom fffp: \forall foo x, char* y; fp(x,ff(x,y)) && *y == 0; + } */ diff -Nru frama-c-20140301+neon+dfsg/tests/spec/multiple_include_2.c frama-c-20150201+sodium+dfsg/tests/spec/multiple_include_2.c --- frama-c-20140301+neon+dfsg/tests/spec/multiple_include_2.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/multiple_include_2.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,5 +1,5 @@ /* run.config - OPT: -print tests/spec/multiple_include_1.c -journal-disable + OPT: -continue-annot-error -print tests/spec/multiple_include_1.c -journal-disable */ #include "multiple_include.h" diff -Nru frama-c-20140301+neon+dfsg/tests/spec/multiple_include.h frama-c-20150201+sodium+dfsg/tests/spec/multiple_include.h --- frama-c-20140301+neon+dfsg/tests/spec/multiple_include.h 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/multiple_include.h 2015-05-28 08:53:24.000000000 +0000 @@ -8,15 +8,3 @@ static int i = 42; /*@ predicate p{Here}(int x) = x >= i; */ - -/*@ axiomatic Bar { logic integer li; } */ - -/*@ ensures i == li; */ -void test() { } - -/*@ axiomatic Foo { - type foo; - logic foo ff(foo x,char * y); - predicate fp(foo x, foo y); - axiom fffp: \forall foo x, char* y; fp(x,ff(x,y)) && *y == 0; - } */ diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/abrupt.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/abrupt.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/abrupt.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/abrupt.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,62 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/abrupt.i (no preprocessing) +/* Generated by Frama-C */ +int f(int c) +{ + int x; + x = 0; + /*@ breaks x ≡ 1; */ + if (! c) goto switch_0_0; + else + if (c == 1) goto switch_0_1; + else + if (c == 2) goto switch_0_2; + else { + goto switch_0_default; + goto switch_0_break; + } + switch_0_0: x = 1; + /*@ assert x ≡ 1; */ ; + goto switch_0_break; + switch_0_1: x = 3; + switch_0_2: x ++; + switch_0_default: ; + x ++; + switch_0_break: ; + while (1) { + while_1_continue: ; + __sid_14_label: ; + /*@ breaks x ≡ \old(x); + continues x ≡ \old(x)+1; */ + { + if (x < c) { + x ++; + /*@ assert x ≡ \at(x,__sid_14_label)+1; */ ; + goto while_1_continue; + } + /*@ assert x ≡ \at(x,__sid_14_label); */ ; + goto while_1_break; + } + } + while_1_break: ; + return x; +} + +/*@ ensures \old(x) ≡ 1 ⇒ \result ≡ 1; */ +int f5(int x) +{ + int y; + y = 0; + if (! (x == 1)) goto switch_0_break; + switch_0_1: + while (x > 0) + /*@ breaks x > 0; */ + /*@ assert x > 0; */ + goto while_1_break; + while_1_break: ; + y = 1; + switch_0_break: ; + return y; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/acsl_basic_allocator.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/acsl_basic_allocator.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/acsl_basic_allocator.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/acsl_basic_allocator.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,347 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/acsl_basic_allocator.c (with preprocessing) +/* Generated by Frama-C */ +typedef unsigned int size_t; +typedef int wchar_t; +struct __fc_div_t { + int quot ; + int rem ; +}; +typedef struct __fc_div_t div_t; +struct __fc_ldiv_t { + long quot ; + long rem ; +}; +typedef struct __fc_ldiv_t ldiv_t; +struct __fc_lldiv_t { + long long quot ; + long long rem ; +}; +typedef struct __fc_lldiv_t lldiv_t; +enum _bool { + false = 0, + true = 1 +}; +typedef enum _bool bool; +struct _memory_block { + size_t size ; + bool free ; + char *data ; +}; +typedef struct _memory_block memory_block; +struct _memory_block_list { + memory_block *block ; + struct _memory_block_list *next ; +}; +typedef struct _memory_block_list memory_block_list; +typedef memory_block_list *memory_pool; +/*@ assigns \result; + assigns \result \from *(nptr+(..)); */ +extern double atof(char const *nptr); + +/*@ assigns \result; + assigns \result \from *(nptr+(..)); */ +extern int atoi(char const *nptr); + +/*@ assigns \result; + assigns \result \from *(nptr+(..)); */ +extern long atol(char const *nptr); + +/*@ assigns \result; + assigns \result \from *(nptr+(..)); */ +extern long long atoll(char const *nptr); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)); + assigns *endptr \from nptr, *(nptr+(0 ..)); + */ +extern double strtod(char const *nptr, char **endptr); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)); + assigns *endptr \from nptr, *(nptr+(0 ..)); + */ +extern float strtof(char const *nptr, char **endptr); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)); + assigns *endptr \from nptr, *(nptr+(0 ..)); + */ +extern long double strtold(char const *nptr, char **endptr); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)), base; + assigns *endptr \from nptr, *(nptr+(0 ..)), base; + */ +extern long strtol(char const *nptr, char **endptr, int base); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)), base; + assigns *endptr \from nptr, *(nptr+(0 ..)), base; + */ +extern long long strtoll(char const *nptr, char **endptr, int base); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)), base; + assigns *endptr \from nptr, *(nptr+(0 ..)), base; + */ +extern unsigned long strtoul(char const *nptr, char **endptr, int base); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)), base; + assigns *endptr \from nptr, *(nptr+(0 ..)), base; + */ +extern unsigned long long strtoull(char const *nptr, char **endptr, int base); + +int __fc_random_counter __attribute__((__unused__, __FRAMA_C_MODEL__)); +unsigned long const __fc_rand_max = (unsigned long)32767; +/*@ ensures 0 ≤ \result ≤ __fc_rand_max; + assigns \result, __fc_random_counter; + assigns \result \from __fc_random_counter; + assigns __fc_random_counter \from __fc_random_counter; + */ +extern int rand(void); + +/*@ assigns __fc_random_counter; + assigns __fc_random_counter \from seed; */ +extern void srand(unsigned int seed); + +/*@ ghost extern int __fc_heap_status __attribute__((__FRAMA_C_MODEL__)); */ + +/*@ +axiomatic dynamic_allocation { + predicate is_allocable{L}(size_t n) + reads __fc_heap_status; + + } + */ +/*@ assigns __fc_heap_status, \result; + assigns __fc_heap_status \from size, __fc_heap_status; + assigns \result \from size, __fc_heap_status; + allocates \result; + + behavior allocation: + assumes is_allocable(size); + ensures \fresh{Old, Here}(\result,\old(size)); + assigns __fc_heap_status, \result; + assigns __fc_heap_status \from size, __fc_heap_status; + assigns \result \from size, __fc_heap_status; + + behavior no_allocation: + assumes ¬is_allocable(size); + ensures \result ≡ \null; + assigns \result; + assigns \result \from \nothing; + allocates \nothing; + + complete behaviors no_allocation, allocation; + disjoint behaviors no_allocation, allocation; + */ +extern void *malloc(size_t size); + +/*@ assigns __fc_heap_status; + assigns __fc_heap_status \from __fc_heap_status; + frees p; + + behavior deallocation: + assumes p ≢ \null; + requires freeable: \freeable(p); + ensures \allocable(\old(p)); + assigns __fc_heap_status; + assigns __fc_heap_status \from __fc_heap_status; + + behavior no_deallocation: + assumes p ≡ \null; + assigns \nothing; + allocates \nothing; + + complete behaviors no_deallocation, deallocation; + disjoint behaviors no_deallocation, deallocation; + */ +extern void free(void *p); + +/*@ ensures \false; + assigns \nothing; */ +extern void abort(void); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int atexit(void (*func)(void)); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int at_quick_exit(void (*func)(void)); + +/*@ ensures \false; + assigns \nothing; */ +extern void exit(int status); + +/*@ ensures \false; + assigns \nothing; */ +extern void _Exit(int status); + +/*@ ensures \result ≡ \null ∨ \valid(\result); + assigns \result; + assigns \result \from name; + */ +extern char *getenv(char const *name); + +/*@ ensures \false; + assigns \nothing; */ +extern void quick_exit(int status); + +/*@ assigns \result; + assigns \result \from *(string+(..)); */ +extern int system(char const *string); + +/*@ assigns *((char *)\result+(..)); + assigns *((char *)\result+(..)) + \from *((char *)key+(..)), *((char *)base+(..)), nmemb, size, *compar; + */ +extern void *bsearch(void const *key, void const *base, size_t nmemb, + size_t size, int (*compar)(void const *, void const *)); + +/*@ assigns *((char *)base+(..)); + assigns *((char *)base+(..)) + \from *((char *)base+(..)), nmemb, size, *compar; + */ +extern void qsort(void *base, size_t nmemb, size_t size, + int (*compar)(void const *, void const *)); + +/*@ requires abs_representable: (int)(-j) ≡ -j; + assigns \result; + assigns \result \from j; + */ +extern int abs(int j); + +/*@ requires abs_representable: (long)(-j) ≡ -j; + assigns \result; + assigns \result \from j; + */ +extern long labs(long j); + +/*@ requires abs_representable: (long long)(-j) ≡ -j; + assigns \result; + assigns \result \from j; + */ +extern long long llabs(long long j); + +/*@ assigns \result; + assigns \result \from numer, denom; */ +extern div_t div(int numer, int denom); + +/*@ assigns \result; + assigns \result \from numer, denom; */ +extern ldiv_t ldiv(long numer, long denom); + +/*@ assigns \result; + assigns \result \from numer, denom; */ +extern lldiv_t lldiv(long long numer, long long denom); + +/*@ assigns \result; + assigns \result \from *(s+(0 ..)), n; */ +extern int mblen(char const *s, size_t n); + +/*@ assigns \result, *(pwc+(0 .. n-1)); + assigns \result \from *(s+(0 .. n-1)), n; + assigns *(pwc+(0 .. n-1)) \from *(s+(0 .. n-1)), n; + */ +extern int mbtowc(wchar_t *pwc, char const *s, size_t n); + +/*@ assigns \result, *(s+(0 ..)); + assigns \result \from wc; + assigns *(s+(0 ..)) \from wc; + */ +extern int wctomb(char *s, wchar_t wc); + +/*@ assigns \result, *(pwcs+(0 .. n-1)); + assigns \result \from *(s+(0 .. n-1)), n; + assigns *(pwcs+(0 .. n-1)) \from *(s+(0 .. n-1)), n; + */ +extern size_t mbstowcs(wchar_t *pwcs, char const *s, size_t n); + +/*@ assigns \result, *(s+(0 .. n-1)); + assigns \result \from *(pwcs+(0 .. n-1)), n; + assigns *(s+(0 .. n-1)) \from *(pwcs+(0 .. n-1)), n; + */ +extern size_t wcstombs(char *s, wchar_t const *pwcs, size_t n); + +/*@ +type invariant inv_memory_block(memory_block mb) = + 0 < mb.size ∧ \offset(mb.data) ≡ 0 ∧ + \block_length(mb.data) ≡ mb.size; + */ +/*@ +predicate used_memory_block{L}(memory_block mb) = + mb.free ≡ false ∧ inv_memory_block{L}(mb); + */ +/*@ +predicate freed_memory_block{L}(memory_block mb) = + mb.free ≡ true ∧ inv_memory_block{L}(mb); + */ +/*@ +predicate valid_memory_block{L}(memory_block *mb) = + \valid{L}(mb) ∧ inv_memory_block{L}(*mb); + */ +/*@ +predicate valid_used_memory_block{L}(memory_block *mb) = + \valid{L}(mb) ∧ used_memory_block{L}(*mb); + */ +/*@ +predicate valid_freed_memory_block{L}(memory_block *mb) = + \valid{L}(mb) ∧ freed_memory_block{L}(*mb); + */ +/*@ +predicate valid_memory_block_list{L}(memory_block_list *mbl) = + \valid{L}(mbl) ∧ valid_memory_block{L}(mbl->block) ∧ + (mbl->next ≡ \null ∨ valid_memory_block_list{L}(mbl->next)); + */ +/*@ +predicate valid_memory_pool{L}(memory_pool *mp) = + \valid{L}(mp) ∧ valid_memory_block_list{L}(*mp); + */ +/*@ requires valid_memory_pool(arena) ∧ 0 < s; + ensures valid_used_memory_block(\result); + */ +memory_block *memory_alloc(memory_pool *arena, size_t s) +{ + memory_block *__retres; + memory_block_list *mbl; + memory_block *mb; + size_t mb_size; + char *mb_data; + mbl = *arena; + while (mbl != (memory_block_list *)0) { + mb = mbl->block; + if (mb->free) + if (s <= mb->size) { + mb->free = false; + __retres = mb; + goto return_label; + } + mbl = mbl->next; + } + if ((size_t)1000 < s) mb_size = s; else mb_size = (unsigned int)1000; + mb_data = (char *)malloc(mb_size); + mb = (memory_block *)malloc(sizeof(memory_block)); + mb->size = mb_size; + mb->free = false; + mb->data = mb_data; + mbl = (memory_block_list *)malloc(sizeof(memory_block_list)); + mbl->block = mb; + mbl->next = *arena; + *arena = mbl; + __retres = mb; + return_label: return __retres; +} + +/*@ requires valid_memory_pool(arena) ∧ valid_used_memory_block(block); + ensures valid_freed_memory_block(\old(block)); + */ +void memory_free(memory_pool *arena, memory_block *block) +{ + block->free = true; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/acsl_by_example.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/acsl_by_example.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/acsl_by_example.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/acsl_by_example.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,557 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/acsl_by_example.c (with preprocessing) +tests/spec/acsl_by_example.c:3:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/spec/acsl_by_example.c:5:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +/* Generated by Frama-C */ +/*@ +predicate is_valid_int_range{L}(int *p, int n) = + \at(0 ≤ n ∧ \valid{L}(p+(0 .. n-1)),L); + */ +/*@ +lemma foo{L}: + ∀ int *p, int n; is_valid_int_range{L}(p, n) ⇔ \valid{L}(p+(0 .. n-1)); + */ +/*@ requires is_valid_int_range(a, n); + requires is_valid_int_range(b, n); + assigns \nothing; + + behavior all_equal: + assumes ∀ int i; 0 ≤ i < n ⇒ *(a+i) ≡ *(b+i); + ensures \result ≡ 1; + + behavior some_not_equal: + assumes ∃ int i; 0 ≤ i < n ∧ *(a+i) ≢ *(b+i); + ensures \result ≡ 0; + + complete behaviors all_equal, some_not_equal; + disjoint behaviors all_equal, some_not_equal; + */ +int equal(int const *a, int n, int const *b) +{ + int __retres; + { + int i; + i = 0; + /*@ loop invariant 0 ≤ i ≤ n; + loop invariant ∀ int k; 0 ≤ k < i ⇒ *(a+k) ≡ *(b+k); + loop variant n-i; + */ + while (i < n) { + if (*(a + i) != *(b + i)) { + __retres = 0; + goto return_label; + } + i ++; + } + } + __retres = 1; + return_label: return __retres; +} + +/*@ requires is_valid_int_range(a, n); + assigns \nothing; + + behavior some: + assumes ∃ int i; 0 ≤ i < n ∧ *(a+i) ≡ val; + ensures 0 ≤ \result < \old(n); + ensures *(\old(a)+\result) ≡ \old(val); + ensures ∀ int i; 0 ≤ i < \result ⇒ *(\old(a)+i) ≢ \old(val); + + behavior none: + assumes ∀ int i; 0 ≤ i < n ⇒ *(a+i) ≢ val; + ensures \result ≡ \old(n); + + complete behaviors some, none; + disjoint behaviors some, none; + */ +int find(int const *a, int n, int val) +{ + int __retres; + { + int i; + i = 0; + /*@ loop invariant 0 ≤ i ≤ n; + loop invariant ∀ int k; 0 ≤ k < i ⇒ *(a+k) ≢ val; + loop variant n-i; + */ + while (i < n) { + if (*(a + i) == val) { + __retres = i; + goto return_label; + } + i ++; + } + } + __retres = n; + return_label: return __retres; +} + +/*@ +predicate found{A}(int *a, int n, int val) = + ∃ int i; 0 ≤ i < n ∧ *(a+i) ≡ val; + +*/ +/*@ requires is_valid_int_range(a, n); + assigns \nothing; + + behavior some: + assumes found(a, n, val); + ensures 0 ≤ \result < \old(n); + ensures *(\old(a)+\result) ≡ \old(val); + ensures ¬found(\old(a), \result, \old(val)); + + behavior none: + assumes ¬found(a, n, val); + ensures \result ≡ \old(n); + + complete behaviors some, none; + disjoint behaviors some, none; + */ +int find2(int const *a, int n, int val) +{ + int __retres; + { + int i; + i = 0; + /*@ loop invariant 0 ≤ i ≤ n; + loop invariant ¬found(a, i, val); + loop variant n-i; + */ + while (i < n) { + if (*(a + i) == val) { + __retres = i; + goto return_label; + } + i ++; + } + } + __retres = n; + return_label: return __retres; +} + +/*@ +predicate found_first_of{A}(int *a, int m, int *b, int n) = + ∃ int i; 0 ≤ i < m ∧ found{A}(b, n, \at(*(a+i),A)); + +*/ +/*@ requires is_valid_int_range(a, m); + requires is_valid_int_range(b, n); + assigns \nothing; + + behavior found: + assumes found_first_of(a, m, b, n); + ensures 0 ≤ \result < \old(m); + ensures found(\old(b), \old(n), *(\old(a)+\result)); + ensures ¬found_first_of(\old(a), \result, \old(b), \old(n)); + + behavior not_found: + assumes ¬found_first_of(a, m, b, n); + ensures \result ≡ \old(m); + + complete behaviors found, not_found; + disjoint behaviors found, not_found; + */ +int find_first_of(int const *a, int m, int const *b, int n) +{ + int __retres; + { + int i; + i = 0; + /*@ loop invariant 0 ≤ i ≤ m; + loop invariant ¬found_first_of(a, i, b, n); + loop variant m-i; + */ + while (i < m) { + int tmp; + { + /*sequence*/ + tmp = find(b,n,*(a + i)); + ; + } + if (tmp < n) { + __retres = i; + goto return_label; + } + i ++; + } + } + __retres = m; + return_label: return __retres; +} + +/*@ requires is_valid_int_range(a, n); + assigns \nothing; + + behavior empty: + assumes n ≡ 0; + ensures \result ≡ 0; + + behavior not_empty: + assumes 0 < n; + ensures 0 ≤ \result < \old(n); + ensures + ∀ int i; 0 ≤ i < \old(n) ⇒ *(\old(a)+i) ≤ *(\old(a)+\result); + ensures + ∀ int i; 0 ≤ i < \result ⇒ *(\old(a)+i) < *(\old(a)+\result); + + complete behaviors empty, not_empty; + disjoint behaviors empty, not_empty; + */ +int max_element(int const *a, int n) +{ + int __retres; + int max; + if (n == 0) { + __retres = 0; + goto return_label; + } + max = 0; + { + int i; + i = 0; + /*@ loop invariant 0 ≤ i ≤ n; + loop invariant 0 ≤ max < n; + loop invariant ∀ int k; 0 ≤ k < i ⇒ *(a+k) ≤ *(a+max); + loop invariant ∀ int k; 0 ≤ k < max ⇒ *(a+k) < *(a+max); + loop variant n-i; + */ + while (i < n) { + if (*(a + max) < *(a + i)) max = i; + i ++; + } + } + __retres = max; + return_label: return __retres; +} + +/*@ requires n > 0; + requires \valid(p+(0 .. n-1)); + ensures ∀ int i; 0 ≤ i ≤ \old(n)-1 ⇒ \result ≥ *(\old(p)+i); + ensures ∃ int e; 0 ≤ e ≤ \old(n)-1 ∧ \result ≡ *(\old(p)+e); + assigns \nothing; + */ +int max_seq(int const *p, int n) +{ + int __retres; + int tmp; + { + /*sequence*/ + tmp = max_element(p,n); + ; + } + __retres = *(p + tmp); + return __retres; +} + +/*@ +axiomatic counting_axioms { + logic ℤ counting{L}(int *a, ℤ n, int val) + reads *(a+(0 .. n-1)); + + axiom counting_empty{L}: + ∀ int *a, ℤ n, int val; n ≤ 0 ⇒ counting{L}(a, n, val) ≡ 0; + + axiom counting_hit{L}: + ∀ int *a, ℤ n, int val; + n ≥ 0 ∧ *(a+n) ≡ val ⇒ + counting{L}(a, n+1, val) ≡ counting{L}(a, n, val)+1; + + axiom counting_miss{L}: + ∀ int *a, ℤ n, int val; + n ≥ 0 ∧ *(a+n) ≢ val ⇒ + counting{L}(a, n+1, val) ≡ counting{L}(a, n, val); + + } + +*/ +/*@ requires is_valid_int_range(a, n); + ensures \result ≡ counting(\old(a), \old(n), \old(val)); + assigns \nothing; + */ +int count(int const *a, int n, int val) +{ + int cnt; + cnt = 0; + { + int i; + i = 0; + /*@ loop invariant 0 ≤ i ≤ n; + loop invariant 0 ≤ cnt ≤ i; + loop invariant cnt ≡ counting(a, i, val); + loop variant n-i; + */ + while (i < n) { + if (*(a + i) == val) cnt ++; + i ++; + } + } + return cnt; +} + +/*@ requires \valid(p); + requires \valid(q); + ensures *\old(p) ≡ \old(*q); + ensures *\old(q) ≡ \old(*p); + assigns *p, *q; + */ +void swap(int *p, int *q) +{ + int save; + save = *p; + *p = *q; + *q = save; + return; +} + +/*@ requires is_valid_int_range(a, n); + requires is_valid_int_range(b, n); + ensures ∀ int k; 0 ≤ k < \old(n) ⇒ *(\old(a)+k) ≡ \old(*(b+k)); + ensures ∀ int k; 0 ≤ k < \old(n) ⇒ *(\old(b)+k) ≡ \old(*(a+k)); + assigns *(a+(0 .. n-1)), *(b+(0 .. n-1)); + */ +void swap_ranges(int *a, int n, int *b) +{ + int i; + i = 0; + /*@ loop invariant 0 ≤ i ≤ n; + loop invariant ∀ int k; 0 ≤ k < i ⇒ *(a+k) ≡ \at(*(b+k),Pre); + loop invariant ∀ int k; 0 ≤ k < i ⇒ *(b+k) ≡ \at(*(a+k),Pre); + loop assigns *(a+(0 .. i-1)), *(b+(0 .. i-1)); + loop variant n-i; + */ + while (i < n) { + swap(a + i,b + i); + i ++; + } + return; +} + +/*@ requires is_valid_int_range(a, n); + ensures ∀ int i; 0 ≤ i < \old(n) ⇒ *(\old(a)+i) ≡ \old(val); + assigns *(a+(0 .. n-1)); + */ +void fill(int *a, int n, int val) +{ + int i; + i = 0; + /*@ loop invariant 0 ≤ i ≤ n; + loop invariant ∀ int k; 0 ≤ k < i ⇒ *(a+k) ≡ val; + loop variant n-i; + */ + while (i < n) { + *(a + i) = val; + i ++; + } + return; +} + +/*@ requires is_valid_int_range(a, n); + requires is_valid_int_range(b, n); + ensures ∀ int i; 0 ≤ i < \old(n) ⇒ *(\old(b)+i) ≡ *(\old(a)+i); + assigns *(b+(0 .. n-1)); + */ +void copy(int const *a, int n, int *b) +{ + int i; + i = 0; + /*@ loop invariant 0 ≤ i ≤ n; + loop invariant ∀ int k; 0 ≤ k < i ⇒ *(a+k) ≡ *(b+k); + loop assigns *(b+(0 .. i-1)); + loop variant n-i; + */ + while (i < n) { + *(b + i) = *(a + i); + i ++; + } + return; +} + +/*@ requires is_valid_int_range(a, n); + requires is_valid_int_range(b, n); + ensures + ∀ int j; + 0 ≤ j < \old(n) ⇒ + (*(\old(a)+j) ≡ \old(old_val) ∧ *(\old(b)+j) ≡ \old(new_val)) ∨ + (*(\old(a)+j) ≢ \old(old_val) ∧ *(\old(b)+j) ≡ *(\old(a)+j)); + ensures \result ≡ \old(n); + assigns *(b+(0 .. n-1)); + */ +int replace_copy(int const *a, int n, int *b, int old_val, int new_val) +{ + { + int i; + i = 0; + /*@ loop invariant 0 ≤ i ≤ n; + loop invariant + ∀ int j; + 0 ≤ j < i ⇒ + (*(a+j) ≡ old_val ∧ *(b+j) ≡ new_val) ∨ + (*(a+j) ≢ old_val ∧ *(b+j) ≡ *(a+j)); + loop assigns *(b+(0 .. i-1)); + loop variant n-i; + */ + while (i < n) { + if (*(a + i) == old_val) *(b + i) = new_val; else *(b + i) = *(a + i); + i ++; + } + } + return n; +} + +/*@ requires is_valid_int_range(a, n); + requires is_valid_int_range(b, n); + ensures + ∀ int k; \result ≤ k < \old(n) ⇒ *(\old(b)+k) ≡ \old(*(b+k)); + ensures ∀ int k; 0 ≤ k < \result ⇒ *(\old(b)+k) ≢ \old(val); + ensures + ∀ int x; + x ≢ \old(val) ⇒ + counting(\old(a), \old(n), x) ≡ counting(\old(b), \result, x); + ensures \result ≡ \old(n)-counting(\old(a), \old(n), \old(val)); + ensures 0 ≤ \result ≤ \old(n); + assigns *(b+(0 .. n-1)); + */ +int remove_copy(int const *a, int n, int *b, int val) +{ + int j; + j = 0; + { + int i; + i = 0; + /*@ loop invariant 0 ≤ j ≤ i ≤ n; + loop invariant ∀ int k; j ≤ k < n ⇒ *(b+k) ≡ \at(*(b+k),Pre); + loop invariant ∀ int k; 0 ≤ k < j ⇒ *(b+k) ≢ val; + loop invariant + ∀ int x; x ≢ val ⇒ counting(a, i, x) ≡ counting(b, j, x); + loop invariant j ≡ i-counting(a, i, val); + loop assigns *(b+(0 .. j-1)); + loop variant n-i; + */ + while (i < n) { + if (*(a + i) != val) { + int tmp; + { + /*sequence*/ + tmp = j; + j ++; + *(b + tmp) = *(a + i); + } + } + i ++; + } + } + return j; +} + +/*@ requires is_valid_int_range(a, n); + requires val+n < (1<<31)-1; + ensures ∀ int k; 0 ≤ k < \old(n) ⇒ *(\old(a)+k) ≡ \old(val)+k; + assigns *(a+(0 .. n-1)); + */ +void iota(int *a, int n, int val) +{ + int i; + i = 0; + /*@ loop invariant 0 ≤ i ≤ n; + loop invariant ∀ int k; 0 ≤ k < i ⇒ *(a+k) ≡ val+k; + loop assigns *(a+(0 .. i-1)); + loop variant n-i; + */ + while (i < n) { + *(a + i) = val + i; + i ++; + } + return; +} + +/*@ +predicate adjacent_found{Label}(int *a, int n) = + ∃ int i; 0 ≤ i < n-1 ∧ *(a+i) ≡ *(a+(i+1)); + +*/ +/*@ requires is_valid_int_range(a, n); + assigns \nothing; + + behavior some: + assumes adjacent_found(a, n); + ensures 0 ≤ \result < \old(n)-1; + ensures *(\old(a)+\result) ≡ *(\old(a)+(\result+1)); + ensures ¬adjacent_found(\old(a), \result); + + behavior none: + assumes ¬adjacent_found(a, n); + ensures \result ≡ \old(n); + + complete behaviors some, none; + disjoint behaviors some, none; + */ +int adjacent_find(int *a, int n) +{ + int __retres; + if (0 == n) { + __retres = n; + goto return_label; + } + { + int i; + i = 0; + /*@ loop invariant 0 ≤ i < n; + loop invariant ¬adjacent_found(a, i); + loop invariant 0 < i ⇒ *(a+(i-1)) ≢ *(a+i); + loop variant n-i; + */ + while (i < n - 1) { + if (*(a + i) == *(a + (i + 1))) { + __retres = i; + goto return_label; + } + i ++; + } + } + __retres = n; + return_label: return __retres; +} + +/*@ requires is_valid_int_range(a, n); + assigns \nothing; + + behavior empty: + assumes n ≡ 0; + ensures \result ≡ 0; + + behavior not_empty: + assumes 0 < n; + ensures 0 ≤ \result < \old(n); + ensures + ∀ int i; 0 ≤ i < \old(n) ⇒ *(\old(a)+\result) ≤ *(\old(a)+i); + ensures + ∀ int i; 0 ≤ i < \result ⇒ *(\old(a)+\result) < *(\old(a)+i); + */ +int min_element(int *a, int n) +{ + int __retres; + int min; + if (0 == n) { + __retres = n; + goto return_label; + } + min = 0; + { + int i; + i = 0; + /*@ loop invariant 0 ≤ i ≤ n; + loop invariant 0 ≤ min < n; + loop invariant ∀ int k; 0 ≤ k < i ⇒ *(a+min) ≤ *(a+k); + loop invariant ∀ int k; 0 ≤ k < min ⇒ *(a+min) < *(a+k); + loop variant n-i; + */ + while (i < n) { + if (*(a + i) < *(a + min)) min = i; + i ++; + } + } + __retres = min; + return_label: return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/allocates.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/allocates.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/allocates.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/allocates.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/allocates.i (no preprocessing) +/* Generated by Frama-C */ +int *p; +int *q; +int *r; +/*@ behavior a: + requires *p ≡ 0; */ +void f1(void) +{ + return; +} + +/*@ requires ¬(q ≢ \null); + + behavior a: + requires p ≢ \null; + frees p; */ +void f2(void) +{ + return; +} + +/*@ requires i < 0; + + behavior a: + requires p ≢ \null; + frees r, p; + allocates q, \old(r); + */ +void f3(int i) +{ + /*@ for a: loop invariant i < 0; */ + while (i) { + i --; + p ++; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/all.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/all.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/all.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/all.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,123 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/all.c (with preprocessing) +tests/spec/all.c:32:[kernel] warning: Inconsistent relation chain. +tests/spec/all.c:50:[kernel] warning: Assignment operators not allowed in annotations. +tests/spec/all.c:54:[kernel] warning: reference to unknown behavior ZZZ_INEXISTENT_BEHAVIOR in annotation. +tests/spec/all.c:83:[kernel] warning: Global variable x is not a function. It cannot have a contract (ignoring). +/* Generated by Frama-C */ +struct st { + int a ; + int b ; +}; +/*@ lemma z: ∀ int x; (x&x) ≡ x; + */ +/*@ lemma a: ∀ int x; (~x|x) ≡ -1; + */ +/*@ lemma b: ∀ int x; (~x^x) ≡ -1; + */ +/*@ lemma c: (\let x = 0; x+1) ≡ 1; + */ +/*@ lemma d: (name: 77) ≡ 76+1; + */ +/*@ +axiomatic Test { + predicate P; + + predicate Q; + + axiom e: P ⊻ Q; + + axiom f: 0≢0? P: Q; + + axiom g: (P ⇒ P) ∧ (¬P ⇒ Q); + + axiom h: \let x = 0; x+1 ≡ 1; + + axiom i: name: 77 ≡ 76+1; + + } + */ +/*@ predicate R(ℤ i, ℤ j) = (1≢0? i+j: (j: j)) ≡ i+j; + */ +/*@ predicate S(ℤ i, ℤ j) = (1≢0? (i: j): j) ≡ j; + */ +/*@ predicate T(ℤ i, ℤ j) = (1≢0? i: j) ≡ i; + */ +/*@ lemma tauto: 0≢0? T(0, 0): R(1, 2); + */ +/*@ lemma tauto2: (R(0, 1) ⇒ S(3, 4)) ∧ (¬R(0, 1) ⇒ T(5, 6)); + */ +/*@ lemma hex_oct: 0xFFFFUl ≢ 06666uL; + */ +/*@ requires \offset(p) ≡ 0; + + behavior b: + assumes \true; + requires \valid(p); + ensures 0 ≡ 1; + assigns *p; + assigns *p \from G; + */ +extern void h(int G, int *p); + +void f(int G, int *p) +{ + /*@ assert \false; */ ; + /*@ assert \base_addr(&G) ≡ \base_addr(&G); */ ; + /*@ assert \block_length(&G) ≡ 4; */ ; + /*@ assert \block_length(&G) ≡ sizeof(G); */ ; + /*@ assert \base_addr(&G)+\offset(&G+4) ≡ (char *)(&G+4); */ ; + /*@ assert \null ≢ &G; */ ; + /*@ loop invariant &G ≢ \null; */ + while (1) { + G ++; + break; + } + *p = G + 76; + return; +} + +/*@ axiomatic St { + logic struct st fl(struct st s) ; + + } + +*/ +/*@ ensures (\let tmp = fl(\old(s)); tmp.a) ≡ \result.a; */ +struct st fc(struct st s) +{ + return s; +} + +void fd(char *x_0) +{ + /*@ assert x_0 ≡ x_0; */ ; + x_0 = (char *)"abcdef"; + /*@ assert ¬\valid(x_0) ∧ \valid_read(x_0); */ ; + return; +} + +int x = 0; +/*@ logic ℤ x= 1; + */ +/*@ axiomatic Test2 { + logic ℤ y; + + } + */ +/*@ logic ℤ z= \let f = \lambda ℤ a; a+1; f(12); + */ +/*@ logic a id(a x) = x; + */ +/*@ logic ℤ z1= \max(5, 10, id); + */ +/*@ logic ℤ z2= \min(5, 10, id); + */ +/*@ logic ℤ z3= \sum(5, 10, id); + */ +/*@ logic ℤ z4= \product(5, 10, id); + */ +/*@ logic ℤ z5= \numof(0, 10, \lambda ℤ i; 3 ≤ i ≤ 5); + +*/ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/annot_decl_bts1009.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/annot_decl_bts1009.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/annot_decl_bts1009.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/annot_decl_bts1009.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/annot_decl_bts1009.i (no preprocessing) +/* Generated by Frama-C */ +void f(void) +{ + int x; + int y; + /*@ assert 0 ≡ 0; */ ; + /*@ ensures x ≡ 3; */ + { + x = 3; + y = x; + } + x = 0; + y = 1; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/annot_main.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/annot_main.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/annot_main.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/annot_main.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,15 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/annot_main.c (with preprocessing) +/* Generated by Frama-C */ +extern int ( /* missing proto */ CEA_DUMP)(); + +/*@ requires \valid(p); + ensures *\old(p) ≡ 0; */ +void main(int *p) +{ + *p = 0; + CEA_DUMP(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/array_conversion.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/array_conversion.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/array_conversion.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/array_conversion.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,48 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/array_conversion.c (with preprocessing) +tests/spec/array_conversion.c:5:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/spec/array_conversion.c:21:[kernel] warning: In ACSL, there is no implicit conversion between a C array and a pointer. Either introduce an explicit cast or take the address of the first element of X in annotation. +tests/spec/array_conversion.c:34:[kernel] warning: In ACSL, there is no implicit conversion between a C array and a pointer. Either introduce an explicit cast or take the address of the first element of a in annotation. +/* Generated by Frama-C */ +typedef int foo[4]; +foo X = {0, 1, 2, 3}; +/*@ predicate p1{L}(int *a) = \at(\valid{L}(a+(0 .. 3)),L); + */ +/*@ predicate q1{L}(int *a) = \at(\valid{L}(a+(0 .. 3)),L); + */ +/*@ lemma vaddrof{L}: \valid{L}(&X); + */ +/*@ lemma vaddrof2{L}: \valid{L}((int *)X); + */ +/*@ requires p1(x); */ +int f1(int * /*[4]*/ x) +{ + int __retres; + __retres = *(x + 3); + return __retres; +} + +int g1(void) +{ + int tmp; + tmp = f1(X); + return tmp; +} + +/*@ axiomatic ax { + logic 𝔹 p{L}(int *b) ; + + } + +*/ +int a[10]; +void ftest(void) +{ + /*@ assert p((int *)a) ≡ \true; */ ; + return; +} + +/*@ lemma array_not_null{L}: (int *)a ≢ \null; + +*/ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/array_prm.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/array_prm.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/array_prm.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/array_prm.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/array_prm.c (with preprocessing) +tests/spec/array_prm.c:5:[kernel] warning: parsing obsolete ACSL construct '\valid_index(addr,idx)'. '\valid(addr+idx)' should be used instead. +/* Generated by Frama-C */ +extern void g(int *a); + +/*@ predicate p{L}(int *a) = \at(\valid{L}(a+0),L); + */ +/*@ requires p(a); */ +void f(int *a) +{ + g(a); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/array_typedef.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/array_typedef.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/array_typedef.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/array_typedef.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,113 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/array_typedef.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function create_msg <- main. + Called from tests/spec/array_typedef.c:35. +[value] computing for function host_address <- create_msg <- main. + Called from tests/spec/array_typedef.c:25. +[value] Recording results for host_address +[value] Done for function host_address +[value] computing for function host_address <- create_msg <- main. + Called from tests/spec/array_typedef.c:26. +[value] Recording results for host_address +[value] Done for function host_address +tests/spec/array_typedef.c:27:[value] Assertion got status valid. +tests/spec/array_typedef.c:28:[value] Assertion got status valid. +tests/spec/array_typedef.c:29:[value] Assertion got status valid. +[value] Recording results for create_msg +[value] Done for function create_msg +[value] computing for function send_msg <- main. + Called from tests/spec/array_typedef.c:36. +[value] computing for function send_addr <- send_msg <- main. + Called from tests/spec/array_typedef.c:15. +[value] using specification for function send_addr +tests/spec/array_typedef.c:12:[value] warning: no \from part for clause 'assigns \empty;' of function send_addr +[value] Done for function send_addr +[value] Recording results for send_msg +[value] Done for function send_msg +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function host_address: + i ∈ {4} + msg1.src[0] ∈ {192} + .src[1] ∈ {100} + .src[2] ∈ {200} + .src[3] ∈ {101} + .dst[0] ∈ {192} or UNINITIALIZED + .dst[1] ∈ {100} or UNINITIALIZED + .dst[2] ∈ {200} or UNINITIALIZED + .dst[3] ∈ {101} or UNINITIALIZED +[value] Values at end of function create_msg: + msg1.src[0] ∈ {192} + .src[1] ∈ {100} + .src[2] ∈ {200} + .src[3] ∈ {101} + .dst[0] ∈ {192} + .dst[1] ∈ {100} + .dst[2] ∈ {200} + .dst[3] ∈ {101} +[value] Values at end of function send_msg: + +[value] Values at end of function main: + msg1.src[0] ∈ {192} + .src[1] ∈ {100} + .src[2] ∈ {200} + .src[3] ∈ {101} + .dst[0] ∈ {192} + .dst[1] ∈ {100} + .dst[2] ∈ {200} + .dst[3] ∈ {101} + __retres ∈ {0} +/* Generated by Frama-C */ +typedef int ip_address[4]; +struct __anonstruct_msg_1 { + ip_address src ; + int dst[4] ; +}; +typedef struct __anonstruct_msg_1 msg; +/*@ assigns \empty; */ +extern void send_addr(int const * /*[4]*/ addr); + +void send_msg(msg const *msg_0) +{ + send_addr(msg_0->src); + return; +} + +void host_address(int * /*[4]*/ ip) +{ + unsigned int i; + i = sizeof(int [4]) / sizeof(int); + *(ip + 0) = 192; + *(ip + 1) = 100; + *(ip + 2) = 200; + *(ip + (i - (unsigned int)1)) = 101; + return; +} + +void create_msg(msg *msg_0) +{ + host_address(msg_0->src); + host_address(msg_0->dst); + /*@ assert msg_0->dst[0] ≡ 192; */ ; + /*@ assert msg_0->src[0] ≡ 192; */ ; + /*@ assert msg_0->dst[sizeof(ip_address)/sizeof(int)-1] ≡ 101; */ ; + return; +} + +int main(void) +{ + int __retres; + msg msg1; + create_msg(& msg1); + send_msg((msg const *)(& msg1)); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/assert_label.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/assert_label.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/assert_label.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/assert_label.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/assert_label.i (no preprocessing) +/* Generated by Frama-C */ +void bar(void) +{ + /*@ assert bli: \true; */ ; + return; +} + +void f(void) +{ + L: /*@ assert lab: \true; */ ; + return; +} + +void foo(int n) +{ + switch (n) { + case 4: /*@ assert "foo + bar=foobar": \true; */ ; + break; + case 5: /*@ assert foo: \true; */ ; + break; + case 6: /*@ assert bar: \true; */ ; + case 7: /*@ assert bla: \true; */ ; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/assign_in_spec.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/assign_in_spec.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/assign_in_spec.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/assign_in_spec.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,5 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/assign_in_spec.c (with preprocessing) +tests/spec/assign_in_spec.c:3:[kernel] warning: Assignment operators not allowed in annotations. +/* Generated by Frama-C */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/assigns_array.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/assigns_array.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/assigns_array.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/assigns_array.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,51 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/assigns_array.c (with preprocessing) +tests/spec/assigns_array.c:9:[kernel] warning: not an assignable left value: ghost_loctable in annotation. +/* Generated by Frama-C */ +/*@ ghost int ghost_loctable[100]; +*/ +void acquire_lock(int m) +{ + (ghost_loctable[m]) ++; + return; +} + +/*@ requires \valid(&ghost_loctable[m]); + requires ghost_loctable[m] ≡ 1; + ensures ghost_loctable[\old(m)] ≡ 0; + assigns ghost_loctable[..]; + */ +void release_lock(int m) +{ + (ghost_loctable[m]) --; + return; +} + +int Tab[10]; +/*@ requires n < 10; + + behavior foo: + assumes reset ≢ 0; + assigns Tab[0 .. n-1]; + + behavior bar: + assumes reset ≡ 0; + assigns \nothing; + */ +int h(int reset, int n) +{ + int i; + int r; + r = 0; + i = 0; + /*@ for foo: loop assigns Tab[0 .. i]; + for bar: loop assigns \nothing; */ + while (i < n) { + r += Tab[i]; + if (reset) Tab[i] = 0; + i ++; + } + return r; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/assigns.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/assigns.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/assigns.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/assigns.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,69 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/assigns.c (with preprocessing) +/* Generated by Frama-C */ +struct list { + int hd ; + struct list *next ; +}; +/*@ +predicate reachable{L}(struct list *root, struct list *to) = + root ≡ to ∨ (root ≢ \null ∧ reachable{L}(root->next, to)); + */ +int *q; +/*@ assigns *p, q; */ +void reset(int *p) +{ + *p = 0; + return; +} + +/*@ assigns *(t+(0 .. n-1)); */ +void reset_array1(int *t, int n) +{ + int i; + i = 0; + while (i < n) { + *(t + i) = 0; + i ++; + } + return; +} + +/*@ assigns *(t+(0 .. n-1)); */ +void reset_array2(int *t, int n) +{ + int i; + i = 0; + while (i < n) { + *(t + i) = 0; + i ++; + } + return; +} + +/*@ assigns *(t+{i | int i; 0 ≤ i < n}); */ +void reset_array3(int *t, int n) +{ + int i; + i = 0; + while (i < n) { + *(t + i) = 0; + i ++; + } + return; +} + +/*@ assigns {q->hd | struct list *q; reachable{Old}(p, q)}; */ +void incr_list(struct list *p) +{ + while (p) { + (p->hd) ++; + p = p->next; + } + return; +} + +/*@ predicate is_empty(set s) = s ≡ \empty; + +*/ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/assigns_result.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/assigns_result.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/assigns_result.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/assigns_result.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,55 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/assigns_result.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + X ∈ {0} + Y ∈ {0} +[value] computing for function f <- main. + Called from tests/spec/assigns_result.i:16. +[value] using specification for function f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/spec/assigns_result.i:16. +[value] using specification for function g +tests/spec/assigns_result.i:16:[value] warning: cannot interpret assigns \exit_status in function g + (unsupported logic var \exit_status); effects will be ignored +[value] Done for function g +[value] Recording results for main +[value] done for function main +[from] Computing for function main +[from] Computing for function f <-main +[from] Done for function f +[from] Computing for function g <-main +tests/spec/assigns_result.i:16:[from] Unable to extract assigns in g +[from] Done for function g +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + \result FROM ANYTHING(origin:Unknown) +[from] Function g: + \result FROM X +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +/* Generated by Frama-C */ +int X; +int Y; +/*@ assigns \nothing; */ +extern int f(void); + +/*@ assigns \result; + assigns \result \from X; + assigns \exit_status \from Y; */ +extern int g(void); + +void main(void) +{ + f(); + g(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/assigns_void.1.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/assigns_void.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/assigns_void.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/assigns_void.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,34 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/assigns_void.c (with preprocessing) +[value] Analyzing a complete application starting at g +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function f <- g. + Called from tests/spec/assigns_void.c:11. +tests/spec/assigns_void.c:11:[kernel] warning: Neither code nor specification for function f, generating default assigns from the prototype +[value] using specification for function f +[value] Done for function f +[value] Recording results for g +[value] done for function g +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function g: + y ∈ [--..--] or UNINITIALIZED + x ∈ {{ &y }} +/* Generated by Frama-C */ +/*@ assigns *((char *)x+(0 ..)); + assigns *((char *)x+(0 ..)) \from *((char *)x+(0 ..)); + */ +extern void f(void *x); + +void g(void) +{ + int y; + int *x; + x = & y; + f((void *)x); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/assigns_void.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/assigns_void.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/assigns_void.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/assigns_void.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,16 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/assigns_void.c (with preprocessing) +tests/spec/assigns_void.c:5:[kernel] warning: expecting a non-void pointer in annotation. +/* Generated by Frama-C */ +extern void f(void *x); + +void g(void) +{ + int y; + int *x; + x = & y; + f((void *)x); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/assume.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/assume.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/assume.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/assume.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/assume.c (with preprocessing) +/* Generated by Frama-C */ +void f(int x); + +/*@ behavior b1: + assumes x ≥ 0; + + behavior b2: + assumes x ≤ 0; + + disjoint behaviors b1, b2; + */ +void f(int x) +{ + int *p; + int *q; + /*@ for b1, b2: behavior default: + assumes \valid(p); */ + q = p; + /*@ assert \valid(q); */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/at_exit.err.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/at_exit.err.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/at_exit.err.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/at_exit.err.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1 @@ +[preprocessing] running gcc -C -E -I. tests/spec/at_exit.c diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/at_exit.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/at_exit.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/at_exit.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/at_exit.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,33 @@ +Parsing +Cleaning unused parts +Symbolic link +Starting semantical analysis +/* Generated by CIL v. 1.3.6 */ +/* print_CIL_Input is false */ + +extern int printf(char const * __restrict __format , ...) ; +extern __attribute__((__nothrow__)) int atexit(void (*__func)(void) ) __attribute__((__nonnull__(1))) ; +extern __attribute__((__nothrow__, +__noreturn__)) void exit(int __status ) ; +char *glob ; +int res ; +void test(void) +{ + + {printf((char const *)"%s (%d);\n", glob, res); + return;} + +} +int main(int argc , char **argv ) +{ + + {atexit(& test); + res = argc - 2; + if (res > 1) {glob = (char *)"exit"; + exit(res);} + + glob = (char *)"return"; + return (res);} + +} + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/at.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/at.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/at.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/at.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/at.c (with preprocessing) +/* Generated by Frama-C */ +int x; +/*@ +axiomatic A { + predicate E{L}(ℤ v) = \at(x ≡ v,L); + + predicate P{L1, L2}(ℤ i) = \at(x,L1) ≡ \at(x,L2)+i; + + predicate Q{L1, L2}(ℤ i) = \at(x ≡ \at(x,L2)+i,L1); + + axiom idem{L1, L2}: ∀ ℤ i; P{L1, L2}(i) ⇔ Q{L1, L2}(i); + + } + */ +/*@ ensures x ≡ (2+\old(x))+\old(y); + ensures \at(E{Pre}(\at((x-2)-y,Here)),Pre); + */ +int f(int y) +{ + x += y; + L1: x ++; + L2: /*@ ghost ; */ + x ++; + /*@ assert \at(x,L1) ≡ \at(x,Pre)+y; */ ; + /*@ assert \at(x,L2) ≡ (1+\at(x,Pre))+y; */ ; + /*@ assert P{Here, Pre}(2+y); */ ; + return x; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/axiom_ignored_bts1116.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/axiom_ignored_bts1116.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/axiom_ignored_bts1116.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/axiom_ignored_bts1116.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,11 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/axiom_ignored_bts1116.i (no preprocessing) +tests/spec/axiom_ignored_bts1116.i:2:[kernel] warning: Axiom l is declared outside of an axiomatic. +/* Generated by Frama-C */ +/*@ ensures \result < 0; */ +int ftest(int i) +{ + return i; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/axiom_included.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/axiom_included.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/axiom_included.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/axiom_included.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,10 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/axiom_included.c (with preprocessing) +[kernel] Parsing tests/spec/axiom_included_1.c (with preprocessing) +/* Generated by Frama-C */ +/*@ axiomatic foo { + axiom foo: \true; + + } + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/axiom_redef_bts1005.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/axiom_redef_bts1005.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/axiom_redef_bts1005.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/axiom_redef_bts1005.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,5 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/axiom_redef_bts1005.i (no preprocessing) +tests/spec/axiom_redef_bts1005.i:5:[kernel] warning: inj1 is already registered as axiom (tests/spec/axiom_redef_bts1005.i:4) in annotation. +/* Generated by Frama-C */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/base_addr_offset_block_length.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/base_addr_offset_block_length.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/base_addr_offset_block_length.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/base_addr_offset_block_length.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,51 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/base_addr_offset_block_length.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + z ∈ {0} +tests/spec/base_addr_offset_block_length.i:9:[value] Function main: precondition got status unknown. +tests/spec/base_addr_offset_block_length.i:17:[value] Assertion got status valid. +tests/spec/base_addr_offset_block_length.i:18:[value] Assertion got status valid. +tests/spec/base_addr_offset_block_length.i:19:[value] Assertion got status valid. +tests/spec/base_addr_offset_block_length.i:20:[value] Assertion got status unknown. +tests/spec/base_addr_offset_block_length.i:21:[value] Assertion got status valid. +tests/spec/base_addr_offset_block_length.i:22:[value] Assertion got status valid. +tests/spec/base_addr_offset_block_length.i:23:[value] Assertion got status unknown. +tests/spec/base_addr_offset_block_length.i:24:[value] Assertion got status valid. +tests/spec/base_addr_offset_block_length.i:25:[value] Assertion got status valid. +tests/spec/base_addr_offset_block_length.i:26:[value] Assertion got status valid. +tests/spec/base_addr_offset_block_length.i:27:[value] Assertion got status valid. +tests/spec/base_addr_offset_block_length.i:28:[value] Assertion got status valid. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + px ∈ {{ &x + {4} }} + px2 ∈ {{ &x + {12} }} + py ∈ {{ &y + {8} }} + pz ∈ {{ &z + {4} }} + p ∈ {{ &x + {4} ; &y }} + q ∈ {{ &x + {8} ; &y + {4} }} +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + x ∈ {0} + y ∈ {0} + z ∈ {0} +tests/spec/base_addr_offset_block_length.i:20:[value] Assertion got status valid. +tests/spec/base_addr_offset_block_length.i:23:[value] Assertion got status valid. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + px ∈ {{ &x + {4} }} + px2 ∈ {{ &x + {12} }} + py ∈ {{ &y + {8} }} + pz ∈ {{ &z + {4} }} + p ∈ {{ &x + {4} ; &y }} + q ∈ {{ &x + {8} ; &y + {4} }} diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/behavior_assert.1.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/behavior_assert.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/behavior_assert.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/behavior_assert.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,126 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/behavior_assert.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + e ∈ {0} + G ∈ {0} + c ∈ [--..--] +[value] computing for function f <- main. + Called from tests/spec/behavior_assert.c:90. +tests/spec/behavior_assert.c:14:[value] Assertion got status invalid (stopping propagation). +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/spec/behavior_assert.c:91. +tests/spec/behavior_assert.c:28:[value] entering loop for the first time +tests/spec/behavior_assert.c:30:[value] Assertion got status valid. +tests/spec/behavior_assert.c:24:[value] Function g, behavior be: postcondition got status valid. +[value] Recording results for g +[value] Done for function g +[value] computing for function h2 <- main. + Called from tests/spec/behavior_assert.c:92. +tests/spec/behavior_assert.c:64:[kernel] warning: signed overflow. assert c+1 ≤ 2147483647; +tests/spec/behavior_assert.c:65:[kernel] warning: signed overflow. assert c+2 ≤ 2147483647; +[value] computing for function h1 <- h2 <- main. + Called from tests/spec/behavior_assert.c:73. +[value] computing for function abs <- h1 <- h2 <- main. + Called from tests/spec/behavior_assert.c:52. +[value] Recording results for abs +[value] Done for function abs +tests/spec/behavior_assert.c:55:[value] Assertion got status unknown. +tests/spec/behavior_assert.c:45:[value] Function h1, behavior not_null: postcondition got status valid. +tests/spec/behavior_assert.c:48:[value] Function h1, behavior null: assumes got status invalid; postcondition not evaluated. +[value] Recording results for h1 +[value] Done for function h1 +tests/spec/behavior_assert.c:74:[value] Assertion got status valid. +[value] Recording results for h2 +[value] Done for function h2 +[value] computing for function k <- main. + Called from tests/spec/behavior_assert.c:93. +tests/spec/behavior_assert.c:86:[value] Assertion got status invalid (stopping propagation). +[value] Recording results for k +[value] Done for function k +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function abs: + __retres ∈ [0..11] +[value] Values at end of function f: + NON TERMINATING FUNCTION +[value] Values at end of function g: + G ∈ {3} + i ∈ {3} +[value] Values at end of function h1: + r ∈ [1..11] + r2 ∈ [0..11] +[value] Values at end of function h2: + a ∈ {-4; -2; -1; 3} + b ∈ [1..11] +[value] Values at end of function k: + NON TERMINATING FUNCTION +[value] Values at end of function main: + NON TERMINATING FUNCTION +[from] Computing for function abs +[from] Done for function abs +[from] Computing for function f +[from] Non-terminating function f (no dependencies) +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] Computing for function h1 +[from] Done for function h1 +[from] Computing for function h2 +[from] Done for function h2 +[from] Computing for function k +[from] Non-terminating function k (no dependencies) +[from] Done for function k +[from] Computing for function main +[from] Non-terminating function main (no dependencies) +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function abs: + \result FROM x +[from] Function f: + NON TERMINATING - NO EFFECTS +[from] Function g: + G FROM \nothing +[from] Function h1: + \result FROM a +[from] Function h2: + NO EFFECTS +[from] Function k: + NON TERMINATING - NO EFFECTS +[from] Function main: + NON TERMINATING - NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function abs: + __retres +[inout] Inputs for function abs: + \nothing +[inout] Out (internal) for function f: + x +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function g: + G; i +[inout] Inputs for function g: + \nothing +[inout] Out (internal) for function h1: + r; r2 +[inout] Inputs for function h1: + \nothing +[inout] Out (internal) for function h2: + a; b +[inout] Inputs for function h2: + c +[inout] Out (internal) for function k: + \nothing +[inout] Inputs for function k: + \nothing +[inout] Out (internal) for function main: + G +[inout] Inputs for function main: + c diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/behavior_assert.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/behavior_assert.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/behavior_assert.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/behavior_assert.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,125 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/behavior_assert.c (with preprocessing) +[value] Analyzing an incomplete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + e ∈ [--..--] + G ∈ [--..--] + c ∈ [--..--] +[value] computing for function f <- main. + Called from tests/spec/behavior_assert.c:90. +tests/spec/behavior_assert.c:14:[value] Assertion got status invalid. +tests/spec/behavior_assert.c:16:[value] Assertion got status valid. +[value] Recording results for f +[value] Done for function f +[value] computing for function g <- main. + Called from tests/spec/behavior_assert.c:91. +tests/spec/behavior_assert.c:28:[value] entering loop for the first time +tests/spec/behavior_assert.c:30:[value] Assertion got status valid. +tests/spec/behavior_assert.c:24:[value] Function g, behavior be: postcondition got status valid. (Behavior may be inactive, no reduction performed.) +[value] Recording results for g +[value] Done for function g +[value] computing for function h2 <- main. + Called from tests/spec/behavior_assert.c:92. +tests/spec/behavior_assert.c:64:[kernel] warning: signed overflow. assert c+1 ≤ 2147483647; +tests/spec/behavior_assert.c:65:[kernel] warning: signed overflow. assert c+2 ≤ 2147483647; +[value] computing for function h1 <- h2 <- main. + Called from tests/spec/behavior_assert.c:73. +[value] computing for function abs <- h1 <- h2 <- main. + Called from tests/spec/behavior_assert.c:52. +[value] Recording results for abs +[value] Done for function abs +tests/spec/behavior_assert.c:55:[value] Assertion got status unknown. +tests/spec/behavior_assert.c:45:[value] Function h1, behavior not_null: postcondition got status valid. +tests/spec/behavior_assert.c:48:[value] Function h1, behavior null: assumes got status invalid; postcondition not evaluated. +[value] Recording results for h1 +[value] Done for function h1 +tests/spec/behavior_assert.c:74:[value] Assertion got status valid. +[value] Recording results for h2 +[value] Done for function h2 +[value] computing for function k <- main. + Called from tests/spec/behavior_assert.c:93. +tests/spec/behavior_assert.c:85:[value] Assertion got status valid. +tests/spec/behavior_assert.c:86:[value] Assertion got status invalid. +[value] Recording results for k +[value] Done for function k +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function abs: + __retres ∈ [0..11] +[value] Values at end of function f: + x ∈ {3} +[value] Values at end of function g: + G ∈ {3} + i ∈ {3} +[value] Values at end of function h1: + r ∈ [1..11] + r2 ∈ [0..11] +[value] Values at end of function h2: + a ∈ {-4; -2; -1; 3} + b ∈ [1..11] +[value] Values at end of function k: + +[value] Values at end of function main: + G ∈ {3} +[from] Computing for function abs +[from] Done for function abs +[from] Computing for function f +[from] Done for function f +[from] Computing for function g +[from] Done for function g +[from] Computing for function h1 +[from] Done for function h1 +[from] Computing for function h2 +[from] Done for function h2 +[from] Computing for function k +[from] Done for function k +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function abs: + \result FROM x +[from] Function f: + NO EFFECTS +[from] Function g: + G FROM \nothing +[from] Function h1: + \result FROM a +[from] Function h2: + NO EFFECTS +[from] Function k: + NO EFFECTS +[from] Function main: + G FROM \nothing +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function abs: + __retres +[inout] Inputs for function abs: + \nothing +[inout] Out (internal) for function f: + x +[inout] Inputs for function f: + \nothing +[inout] Out (internal) for function g: + G; i +[inout] Inputs for function g: + \nothing +[inout] Out (internal) for function h1: + r; r2 +[inout] Inputs for function h1: + \nothing +[inout] Out (internal) for function h2: + a; b +[inout] Inputs for function h2: + c +[inout] Out (internal) for function k: + \nothing +[inout] Inputs for function k: + \nothing +[inout] Out (internal) for function main: + G +[inout] Inputs for function main: + c diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/behavior_names.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/behavior_names.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/behavior_names.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/behavior_names.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,88 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/behavior_names.c (with preprocessing) +tests/spec/behavior_names.c:7:[kernel] warning: reference to unknown behavior UNEXISTENT_BEHAVIOR in annotation. +tests/spec/behavior_names.c:19:[kernel] warning: reference to unknown behavior UNEXISTENT_BEHAVIOR in annotation. +tests/spec/behavior_names.c:27:[kernel] warning: reference to unknown behavior foo in annotation. +tests/spec/behavior_names.c:34:[kernel] warning: behavior foo already defined in annotation. +tests/spec/behavior_names.c:38:[kernel] warning: behavior foo already defined in annotation. +tests/spec/behavior_names.c:47:[kernel] warning: behavior foo already defined in annotation. +/* Generated by Frama-C */ +void f(void) +{ + return; +} + +/*@ predicate should_be_rejected= \true; + */ +/*@ predicate should_be_kept= \true; + +*/ +void g(void) +{ + /*@ behavior foo: + ensures \true; */ + { + /*@ for foo: assert should_be_kept; */ ; + f(); + /*@ for foo: assert should_be_kept; */ ; + f(); + } + return; +} + +void h(void) +{ + return; +} + +/*@ behavior foo: + ensures \true; */ +void i(void) +{ + return; +} + +void j(void) +{ + int x; + x = 0; + /*@ behavior foo: + ensures \true; */ + { + x ++; + if (x) + /*@ behavior bar: + ensures \true; */ + x ++; + else + /*@ behavior bar: + ensures should_be_kept; */ + x ++; + } + return; +} + +/*@ behavior boolean: + ensures boolean: \true; + + behavior char: + ensures char: \true; + + behavior for: + ensures for: \true; + + behavior while: + ensures while: \true; + + behavior normal: + ensures ensures: \true; + + behavior logic: + ensures logic: \true; + */ +void keyword_as_behavior_and_term_names(void) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/behaviors_decl_def.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/behaviors_decl_def.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/behaviors_decl_def.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/behaviors_decl_def.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,46 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/behaviors_decl_def.c (with preprocessing) +/* Generated by Frama-C */ +int G; +void f(int c); + +/*@ behavior b1: + assumes c > 0; + + behavior b2: + assumes c < 1; + + complete behaviors b1, b2; + */ +void f(int c) +{ + /*@ for b1: assert \true; */ ; + return; +} + +/*@ requires \true; + ensures \result ≡ 0 ∨ \result ≡ 1; + assigns G; + + behavior no: + assumes c < 1; + ensures \result ≡ 0; + assigns \nothing; + + behavior at_least_one: + assumes c > 0; + ensures \result ≡ 1; + assigns G; + + complete behaviors at_least_one, no; + disjoint behaviors at_least_one, no; + */ +int main(int c) +{ + int __retres; + f(c); + __retres = c > 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/boolean_ops.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/boolean_ops.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/boolean_ops.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/boolean_ops.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/boolean_ops.c (with preprocessing) +/* Generated by Frama-C */ +/*@ ensures \old(x)≡0∨\old(y)≡1? \result ≡ 0: \result ≡ 1; */ +int f(int x, int y) +{ + int tmp; + if (x == 0) tmp = 1; + else + if (y == 1) tmp = 1; else tmp = 0; + return tmp; +} + +int main(void) +{ + int __retres; + int x; + int y; + x = f(42,1); + y = f(0,36); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/bool.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/bool.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/bool.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/bool.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,10 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/bool.c (with preprocessing) +/* Generated by Frama-C */ +/*@ logic 𝔹 f(int x) = x≡0; + */ +/*@ predicate f_pred(int x, int y) = f(x) ≡ \true ∧ f(y) ≡ \true; + */ +/*@ predicate foo(𝔹 x, 𝔹 y) = x ≡ \false ∨ y ≡ \true; + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/_Bool.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/_Bool.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/_Bool.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/_Bool.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/_Bool.i (no preprocessing) +/* Generated by Frama-C */ +struct _Z6Point2 { + int x ; + int y ; +}; +/*@ +logic _Bool _ZN6Point2Eeq{L}(struct _Z6Point2 *this, struct _Z6Point2 b) = + \at((_Bool)(this->x≡b.x ∧ this->y≡b.y),L); + */ +void _ZN6Point2EC1(struct _Z6Point2 *this) +{ + this->x = 0; + this->y = 0; + return; +} + +/*@ ensures _ZN6Point2Eeq(\old(this), *\old(p)) ≢ 0; + assigns this->x, this->y; + */ +void _ZN6Point2EC1RK6Point2(struct _Z6Point2 *this, struct _Z6Point2 const *p) +{ + this->x = p->x; + this->y = p->y; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/breaks_continues_unroll.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/breaks_continues_unroll.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/breaks_continues_unroll.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/breaks_continues_unroll.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,53 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/breaks_continues_unroll.i (no preprocessing) +/* Generated by Frama-C */ +int unroll(int c) +{ + int x; + x = 0; + switch (x) { + /*@ breaks x ≡ 13; */ + { + case 11: x ++; + goto unrolling_3_loop; + case 12: x ++; + case 13: break; + default: ; + } + } + if (x < c) { + x ++; + goto unrolling_3_loop; + } + goto unrolling_2_loop; + unrolling_3_loop: ; + /*@ loop pragma UNROLL 1; + loop pragma UNROLL "done", 1; */ + while (1) { + /*@ breaks \false; + continues x ≡ \old(x)+1; */ + switch (x) { + /*@ breaks x ≡ 13; */ + { + case 11: x ++; + continue; + case 12: x ++; + case 13: break; + default: ; + } + } + /*@ breaks x ≡ \old(x); + continues x ≡ \old(x)+1; */ + { + if (x < c) { + x ++; + continue; + } + break; + } + } + unrolling_2_loop: ; + return x; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/bsearch.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/bsearch.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/bsearch.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/bsearch.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,48 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/bsearch.c (with preprocessing) +tests/spec/bsearch.c:17:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +/* Generated by Frama-C */ +/*@ lemma mean_1: ∀ ℤ x, ℤ y; x ≤ y ⇒ x ≤ (x+y)/2 ≤ y; + */ +/*@ +predicate sorted{L}(int t[], ℤ n) = + ∀ ℤ i, ℤ j; 0 ≤ i ≤ j ≤ n ⇒ t[i] ≤ t[j]; + */ +/*@ requires n ≥ 0 ∧ \valid(t+(0 .. n-1)) ∧ sorted((int [])t, n-1); + + behavior search_success: + ensures \result ≥ 0 ⇒ *(\old(t)+\result) ≡ \old(v); + + behavior search_failure: + ensures + \result < 0 ⇒ + (∀ ℤ k; 0 ≤ k < \old(n) ⇒ *(\old(t)+k) ≢ \old(v)); + */ +int bsearch(int *t, int n, int v) +{ + int __retres; + int l; + int u; + l = 0; + u = n - 1; + /*@ loop invariant + 0 ≤ l ∧ u ≤ n-1 ∧ + (∀ int k; 0 ≤ k < n ⇒ *(t+k) ≡ v ⇒ l ≤ k ≤ u); + loop variant u-l; + */ + while (l <= u) { + int m; + m = (l + u) / 2; + if (*(t + m) < v) l = m + 1; + else + if (*(t + m) > v) u = m - 1; + else { + __retres = m; + goto return_label; + } + } + __retres = -1; + return_label: return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0254.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0254.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0254.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0254.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,67 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/bts0254.i (no preprocessing) +/* Generated by Frama-C */ +/*@ behavior d: + assumes \true; + assumes \false; + requires \true; + ensures + \old(x) ≢ 0 ∧ \old(x) ≢ 0 ∧ \old(x) ≢ 0 ∧ + \old(x) ≢ 0 ∧ \old(x) ≢ 0; + */ +int f(int x) +{ + int __retres; + __retres = 0; + return __retres; +} + +/*@ requires \true; + ensures \false; + assigns \nothing; */ +int g(void) +{ + int __retres; + __retres = 0; + return __retres; +} + +/*@ requires \true; + terminates \false; + decreases x; + ensures \false; + assigns \nothing; + + behavior b1: + assumes \true; + + behavior b2: + assumes \false; + + disjoint behaviors b1, b2; + */ +int h(int x) +{ + int __retres; + __retres = 0; + return __retres; +} + +/*@ requires \true; */ +int a(void) +{ + int __retres; + __retres = 0; + return __retres; +} + +/*@ behavior d: + ensures \true; */ +int bts(void) +{ + int __retres; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0283.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0283.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0283.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0283.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,18 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/bts0283.c (with preprocessing) +tests/spec/bts0283.c:5:[kernel] warning: incompatible types ℤ and int * in annotation. +tests/spec/bts0283.c:7:[kernel] warning: incompatible types int and int * + in annotation. +/* Generated by Frama-C */ +int b; +int *p; +/*@ requires p ≢ (int *)0; */ +int main(void) +{ + int __retres; + if (b) p = (int *)4; else p = (int *)7; + __retres = 1; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0440.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0440.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0440.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0440.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,22 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/bts0440.i (no preprocessing) +/* Generated by Frama-C */ +int fact(int n) +{ + int r; + r = 1; + while (n > 0) { + int tmp; + before: /*@ ensures n ≥ 0; */ + { + /*sequence*/ + tmp = n; + n --; + r *= tmp; + } + /*@ assert r ≡ \at(r*n,before); */ ; + } + return r; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0549.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0549.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0549.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0549.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,40 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/bts0549.i (no preprocessing) +tests/spec/bts0549.i:6:[kernel] warning: In ACSL, there is no implicit conversion between a C array and a pointer. Either introduce an explicit cast or take the address of the first element of t1 in annotation. +tests/spec/bts0549.i:11:[kernel] warning: \let x = t1; x is a logic array. Only C arrays can be converted to pointers, and this conversion must be explicit (cast or take the address of the first element) in annotation. +/* Generated by Frama-C */ +int t1[10]; +int t2[10]; +/*@ logic int * a1{L}= \at(&t1[0],L); + */ +/*@ logic int * a2{L}= \at((int *)t1,L); + */ +/*@ logic int * a3{L}= \at((int *)t1,L); + */ +/*@ logic int * a5{L}= \at((int *)t1,L); + */ +/*@ logic int * b1{L}= \at(\let x = &t1[0]; x,L); + */ +/*@ logic int * b2{L}= \at(\let x = (int *)t1; x,L); + */ +/*@ logic int * b3{L}= \at(\let x = (int *)t1; x,L); + */ +int main(void) +{ + int __retres; + int i; + i = 0; + while (i < 10) { + t1[i] = 0; + t2[i] = 0; + i ++; + } + if (t1 == t2) + /*@ assert \false; */ ; + else + /*@ assert t1 ≡ t2; */ ; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0570.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0570.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0570.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0570.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,12 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/bts0570.i (no preprocessing) +/* Generated by Frama-C */ +int main(char *data) +{ + int __retres; + /*@ assert \pointer_comparable((void *)data, (void *)0); */ ; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0578.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0578.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0578.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0578.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/bts0578.i (no preprocessing) +/* Generated by Frama-C */ +/*@ behavior foo: + ensures \true; */ +void main(void) +{ + int i; + int t[10]; + i = 0; + /*@ loop assigns t[0 .. i]; + loop invariant \true; + for foo: loop assigns t[0 .. i]; + for foo: loop invariant \true; + for foo: loop invariant \true; + loop variant 0; + */ + while (i < 10) { + t[i] = 0; + i ++; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0589.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0589.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0589.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0589.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/bts0589.i (no preprocessing) +/* Generated by Frama-C */ +int x; +int g(void) +{ + int a; + int tmp; + /*@ assigns a, x; */ + { + /*sequence*/ + tmp = x; + x ++; + a = tmp; + } + return a; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0655.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0655.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0655.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0655.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,145 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/bts0655.i (no preprocessing) +[bts0655] term dest+(0 .. n-1) has type set +[bts0655] term dest has type unsigned char * +[bts0655] term 0 .. n-1 has type set<ℤ> +[bts0655] term 0 has type ℤ +[bts0655] term n-1 has type ℤ +[bts0655] term n has type ℤ +[bts0655] term n has type unsigned long +[bts0655] term 1 has type ℤ +[bts0655] term 0 has type ℤ +[bts0655] term i has type ℤ +[bts0655] term i has type ℤ +[bts0655] term \old(n) has type ℤ +[bts0655] term \old(n) has type unsigned long +[bts0655] term n has type unsigned long +[bts0655] term *(\old(dest)+i) has type ℤ +[bts0655] term *(\old(dest)+i) has type unsigned char +[bts0655] term \old(dest)+i has type unsigned char * +[bts0655] term \old(dest) has type unsigned char * +[bts0655] term dest has type unsigned char * +[bts0655] term i has type ℤ +[bts0655] term 0 has type ℤ +[bts0655] term *(dest+(0 .. n-1)) has type set +[bts0655] term dest+(0 .. n-1) has type set +[bts0655] term dest has type unsigned char * +[bts0655] term 0 .. n-1 has type set<ℤ> +[bts0655] term 0 has type ℤ +[bts0655] term n-1 has type ℤ +[bts0655] term n has type ℤ +[bts0655] term n has type unsigned long +[bts0655] term 1 has type ℤ +[bts0655] term dest+(0 .. size*n-1) has type set +[bts0655] term dest has type unsigned char * +[bts0655] term 0 .. size*n-1 has type set<ℤ> +[bts0655] term 0 has type ℤ +[bts0655] term size*n-1 has type ℤ +[bts0655] term size*n has type ℤ +[bts0655] term size has type ℤ +[bts0655] term size has type unsigned long +[bts0655] term n has type ℤ +[bts0655] term n has type unsigned long +[bts0655] term 1 has type ℤ +[bts0655] term n has type ℤ +[bts0655] term n has type unsigned long +[bts0655] term 1 has type ℤ +[bts0655] term 0 has type ℤ +[bts0655] term i has type ℤ +[bts0655] term i has type ℤ +[bts0655] term \old(size) has type ℤ +[bts0655] term \old(size) has type unsigned long +[bts0655] term size has type unsigned long +[bts0655] term 1 has type ℤ +[bts0655] term j has type ℤ +[bts0655] term j has type ℤ +[bts0655] term \old(n) has type ℤ +[bts0655] term \old(n) has type unsigned long +[bts0655] term n has type unsigned long +[bts0655] term *(\old(dest)+(i+j*\old(size))) has type unsigned char +[bts0655] term \old(dest)+(i+j*\old(size)) has type unsigned char * +[bts0655] term \old(dest) has type unsigned char * +[bts0655] term dest has type unsigned char * +[bts0655] term i+j*\old(size) has type ℤ +[bts0655] term i has type ℤ +[bts0655] term j*\old(size) has type ℤ +[bts0655] term j has type ℤ +[bts0655] term \old(size) has type ℤ +[bts0655] term \old(size) has type unsigned long +[bts0655] term size has type unsigned long +[bts0655] term *(\old(dest)+i) has type unsigned char +[bts0655] term \old(dest)+i has type unsigned char * +[bts0655] term \old(dest) has type unsigned char * +[bts0655] term dest has type unsigned char * +[bts0655] term i has type ℤ +[bts0655] term *(dest+(size .. size*n-1)) has type set +[bts0655] term dest+(size .. size*n-1) has type set +[bts0655] term dest has type unsigned char * +[bts0655] term size .. size*n-1 has type set<ℤ> +[bts0655] term size has type unsigned long +[bts0655] term size*n-1 has type ℤ +[bts0655] term size*n has type ℤ +[bts0655] term size has type ℤ +[bts0655] term size has type unsigned long +[bts0655] term n has type ℤ +[bts0655] term n has type unsigned long +[bts0655] term 1 has type ℤ +[bts0655] term *(dest+(0 .. size-1)) has type set +[bts0655] term dest+(0 .. size-1) has type set +[bts0655] term dest has type unsigned char * +[bts0655] term 0 .. size-1 has type set<ℤ> +[bts0655] term 0 has type ℤ +[bts0655] term size-1 has type ℤ +[bts0655] term size has type ℤ +[bts0655] term size has type unsigned long +[bts0655] term 1 has type ℤ +[bts0655] term i has type ℤ +[bts0655] term i has type int +[bts0655] term \max(\at(a,Pre), \at(b,Pre)) has type ℤ +[bts0655] term \at(a,Pre) has type ℤ +[bts0655] term \at(a,Pre) has type unsigned int +[bts0655] term a has type unsigned int +[bts0655] term \at(b,Pre) has type ℤ +[bts0655] term \at(b,Pre) has type unsigned int +[bts0655] term b has type unsigned int +[bts0655] term \result has type ℤ +[bts0655] term \result has type unsigned int +[bts0655] term \max(\old(a), \old(b)) has type ℤ +[bts0655] term \old(a) has type ℤ +[bts0655] term \old(a) has type unsigned int +[bts0655] term a has type unsigned int +[bts0655] term \old(b) has type ℤ +[bts0655] term \old(b) has type unsigned int +[bts0655] term b has type unsigned int +[bts0655] term \result has type ℤ +[bts0655] term \result has type unsigned int +[bts0655] term \min(\old(a), \old(b)) has type ℤ +[bts0655] term \old(a) has type ℤ +[bts0655] term \old(a) has type unsigned int +[bts0655] term a has type unsigned int +[bts0655] term \old(b) has type ℤ +[bts0655] term \old(b) has type unsigned int +[bts0655] term b has type unsigned int +[bts0655] term \max(\old(a), \old(b)) has type ℤ +[bts0655] term \old(a) has type ℤ +[bts0655] term \old(a) has type unsigned int +[bts0655] term a has type unsigned int +[bts0655] term \old(b) has type ℤ +[bts0655] term \old(b) has type unsigned int +[bts0655] term b has type unsigned int +[bts0655] term \min(\old(a)+1, \old(b)) has type ℤ +[bts0655] term \old(a)+1 has type ℤ +[bts0655] term \old(a) has type ℤ +[bts0655] term \old(a) has type unsigned int +[bts0655] term a has type unsigned int +[bts0655] term 1 has type ℤ +[bts0655] term \old(b) has type ℤ +[bts0655] term \old(b) has type unsigned int +[bts0655] term b has type unsigned int +[bts0655] term \old(a) has type ℤ +[bts0655] term \old(a) has type unsigned int +[bts0655] term a has type unsigned int +[bts0655] term \abs(\old(a)) has type ℤ +[bts0655] term \old(a) has type ℤ +[bts0655] term \old(a) has type unsigned int +[bts0655] term a has type unsigned int diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0698.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0698.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0698.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0698.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/bts0698.i (no preprocessing) +tests/spec/bts0698.i:11:[kernel] warning: cannot cast logic array to pointer type in annotation. +/* Generated by Frama-C */ +/*@ predicate P(int x[2]) = x[0] < x[1]; + */ +/*@ predicate Q{L}(int *x) = *(x+0) < *(x+1); + */ +/*@ predicate Correct{L}(int *x) = P((int [2])x); + */ +int t[2]; +int *a; +void f(void) +{ + t[0] = 10; + t[1] = 20; + /*@ assert P(t); */ ; + /*@ assert Q((int *)t); */ ; + return; +} + +/*@ requires \valid(a+(0 .. 1)); */ +void g(void) +{ + *(a + 0) = 10; + *(a + 1) = 20; + /*@ assert P((int [2])a); */ ; + /*@ assert Q(a); */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0812.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0812.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/bts0812.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts0812.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,14 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/bts0812.c (with preprocessing) +/* Generated by Frama-C */ +/*@ lemma fib_3: \true; + */ +/*@ lemma fib_46: \true; + */ +/*@ assigns \nothing; */ +void main(void) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/bts1068.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts1068.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/bts1068.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts1068.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,178 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/bts1068.i (no preprocessing) +tests/spec/bts1068.i:53:[kernel] warning: parsing obsolete ACSL construct '\valid_index(addr,idx)'. '\valid(addr+idx)' should be used instead. +tests/spec/bts1068.i:54:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/spec/bts1068.i:87:[kernel] warning: inductive predicate model_2 needs a label in annotation. +tests/spec/bts1068.i:111:[kernel] warning: inductive predicate model_6 needs a label in annotation. +/* Generated by Frama-C */ +struct __anonstruct_S_1 { + int a ; + unsigned char *b ; +}; +typedef struct __anonstruct_S_1 S; +struct __anonstruct_T_2 { + int a ; + unsigned char b[10] ; +}; +typedef struct __anonstruct_T_2 T; +struct _list { + int element ; + struct _list *next ; +}; +typedef struct _list list; +int *P; +int V; +int Tab[10]; +/*@ +axiomatic A { + logic T t + reads \nothing; + + logic ℤ ft(T x) = x.b[1]; + + logic ℤ ft2(T x) + reads x.b[1]; + + predicate PT(T x) = x.b[1] > 1; + + predicate PT2(T x) + reads x.b[1]; + + axiom T1: t.a ≡ 0; + + axiom T2: t.b[0] ≡ 0; + + axiom T3: PT(t) ⇒ PT2(t); + + logic S s + reads \nothing; + + logic ℤ fs{L}(S x) = \at(*(x.b+1),L); + + logic ℤ fs2{L}(S x) + reads \at(*(x.b+1),L); + + predicate PS{L}(S x) = \at(*(x.b+1) > 1,L); + + predicate PS2{L}(S x) + reads \at(*(x.b+1),L); + + axiom S1: s.a ≡ 0; + + axiom S2{L}: *(s.b+0) ≡ 0; + + axiom S3{L}: PS{L}(s) ⇒ PS2{L}(s); + + logic ℤ p{L} + reads \at(*P,L); + + logic int * va{L} + reads \at(&V,L); + + logic ℤ v{L} + reads V; + + logic int * fa(int *q) = q; + + logic int fa2{L}(int *q) = \at(*q,L); + + logic char * fa3{L}(ℤ i) = \at((char *)(&P)+i,L); + + logic ℤ fa4{L}(T *q) + reads \at(q->a,L); + + predicate Initialized{L}(int *q) = \at(\initialized{L}(q),L); + + predicate Valid{L}(int *q) = \at(\valid{L}(q),L); + + predicate ValidIndex{L}(int *q) = \at(\valid{L}(q+1),L); + + predicate ValidRange{L}(int *q) = \at(\valid{L}(q+(0 .. 2)),L); + + predicate Separated(int *a, int *b) = \separated(a, b); + + logic ℤ BlockLength{L}(int *q) = \at(\block_length(q),L); + + logic char * Base_addr{L}(int *q) = \at(\base_addr(q),L); + + logic ℤ fi{L}(T *t) = \at(t->a+t->a,L); + + } + */ +/*@ type List = Nil | Cons(A, List ); + */ +/*@ +inductive model_0{L1, L2}(list *root, List logic_list) { + case nil{L1, L2}: model_0{L1, L2}(\null, Nil); + case cons{L1, L2}: ∀ list *l1, List ll1; + \at(\valid{L1}(l1),L1) ⇒ + model_0{L1, L2}(\at(l1->next,L1), ll1) ⇒ + model_0{L1, L2}(l1, Cons(\at(l1->element,L1), ll1)); + } + */ +/*@ +inductive model_1{L}(list *root, List logic_list) { + case nil{L}: \at(model_1{L}(\null, Nil),L); + case cons{L}: \at(∀ list *l1, List ll1; + \valid{L}(l1) ⇒ + model_1{L}(\at(l1->next,L), ll1) ⇒ + model_1{L}(l1, Cons(\at(l1->element,L), ll1)), + L); + } + */ +/*@ +inductive model_3{L}(list *root, List logic_list) { + case nil{L}: \at(model_3{L}(\null, Nil),L); + case cons{L}: \at(∀ list *l1, List ll1; + \valid{L}(l1) ⇒ + model_3{L}(l1->next, ll1) ⇒ + model_3{L}(l1, Cons(l1->element, ll1)), + L); + } + */ +/*@ +inductive model_4{L1}(list *root, List logic_list) { + case nil{L}: \at(model_4{L}(\null, Nil),L); + case cons{L1}: \at(∀ list *l1, List ll1; + \valid{L1}(l1) ⇒ + model_4{L1}(l1->next, ll1) ⇒ + model_4{L1}(l1, Cons(l1->element, ll1)), + L1); + } + */ +/*@ +inductive model_5{L}(list *root, List logic_list) { + case nil{L}: \at(model_5{L}(\null, Nil),L); + case cons{L1}: \at(∀ list *l1, List ll1; + \valid{L1}(l1) ⇒ + model_5{L1}(l1->next, ll1) ⇒ + model_5{L1}(l1, Cons(l1->element, ll1)), + L1); + } + */ +/*@ +inductive model_7{L1}(list *root, List logic_list) { + case nil{L1}: \at(model_7{L1}(\null, Nil),L1); + case cons{L}: \at(∀ list *l1, List ll1; + \valid{L}(l1) ⇒ + model_7{L}(l1->next, ll1) ⇒ + model_7{L}(l1, Cons(l1->element, ll1)), + L); + } + */ +/*@ +inductive model_8{L1}(list *root, List logic_list) { + case nil{L}: \at(model_8{L}(\null, Nil),L); + case cons{L}: \at(∀ list *l1, List ll1; + \valid{L}(l1) ⇒ + model_8{L}(l1->next, ll1) ⇒ + model_8{L}(l1, Cons(l1->element, ll1)), + L); + } + */ +/*@ +inductive model_9{L1, L2}(list *root, List logic_list) { + case nil{L}: \at(\valid{L}(P),L); + } + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/bts1262.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts1262.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/bts1262.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/bts1262.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,15 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/bts1262.c (with preprocessing) +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + char *s; + s = (char *)"\\\\.\\"; + /*@ assert *(s+0) ≡ '\\'; */ ; + *(s + 2) = (char)'\\'; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/bug96.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/bug96.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/bug96.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/bug96.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,11 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/bug96.c (with preprocessing) +/* Generated by Frama-C */ +struct list; +struct node { + int hd ; + struct list *next ; +}; +/*@ logic set tata(struct node *p) = \empty; + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/builtins.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/builtins.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/builtins.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/builtins.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,6 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/builtins.c (with preprocessing) +/* Generated by Frama-C */ +/*@ lemma cos_pi: \cos(\pi) ≡ -1.0; + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/cast_enum_bts1546.1.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/cast_enum_bts1546.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/cast_enum_bts1546.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/cast_enum_bts1546.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,182 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/cast_enum_bts1546.i (no preprocessing) +/* Generated by Frama-C */ +enum e { + E0 = 0, + E1 = 1 +}; +enum e_v1 { + V1 = 0 +}; +enum e_v2 { + V2 = 0 +}; +enum e_u1 { + U1 = 0xFFFFFFFFU +}; +enum e_u2 { + U2 = 0xFFFFFFFFU +}; +enum e_s1 { + S1 = -1 +}; +enum e_s2 { + S2 = -1 +}; +enum e_h1 { + H1 = 0xFFFFFFFFFFFFFFFFULL +}; +enum e X; +/*@ ensures + P: + X ≡ E0 ∧ \old(x) ≡ E1 ∧ X < \old(x) ∧ E0 ≤ E1 ⇒ + \result ≡ E0; + */ +enum e f(enum e x) +{ + enum e __retres; + X = E0; + __retres = E0; + return __retres; +} + +/*@ ensures P: (unsigned int)\result ≡ (unsigned int)E0; */ +enum e g(enum e x) +{ + enum e __retres; + __retres = (unsigned int)E0; + return __retres; +} + +int s; +unsigned int u; +long long hs; +unsigned long long hu; +enum e_v1 v1; +enum e_v1 vv1; +enum e_v2 v2; +enum e_u1 u1; +enum e_u1 uu1; +enum e_u2 u2; +enum e_s1 s1; +enum e_s1 ss1; +enum e_s2 s2; +enum e_h1 h1; +void us(void) +{ + u = (unsigned int)s; + s = (int)u; + u = U1; + s = (int)U1; + u = (unsigned int)S1; + s = S1; + u = (unsigned int)V1; + s = V1; + u = (unsigned int)H1; + s = (int)H1; + return; +} + +void uu(void) +{ + uu1 = u; + uu1 = u1; + uu1 = U1; + uu1 = (enum e_u1)u2; + uu1 = U2; + uu1 = (enum e_u1)s; + uu1 = (enum e_u1)s1; + uu1 = (enum e_u1)S1; + uu1 = (enum e_u1)v1; + uu1 = (enum e_u1)V1; + uu1 = (enum e_u1)H1; + return; +} + +void ss(void) +{ + ss1 = (enum e_s1)u; + ss1 = (enum e_s1)u1; + ss1 = (enum e_s1)U1; + ss1 = s; + ss1 = s1; + ss1 = S1; + ss1 = (enum e_s1)s2; + ss1 = S2; + ss1 = (enum e_s1)v1; + ss1 = V1; + return; +} + +void u_signed(void) +{ + u1 = (enum e_u1)((int)u); + u1 = (enum e_u1)((int)u1); + u1 = (enum e_u1)((int)U1); + u1 = (enum e_u1)((int)u2); + u1 = (enum e_u1)((int)U2); + u1 = (enum e_u1)s; + u1 = (enum e_u1)((int)s1); + u1 = (enum e_u1)S1; + u1 = (enum e_u1)((int)s2); + u1 = (enum e_u1)S2; + u1 = (enum e_u1)((int)v1); + u1 = (enum e_u1)V1; + return; +} + +void u_unsigned(void) +{ + u1 = u; + u1 = (unsigned int)u1; + u1 = U1; + u1 = (unsigned int)u2; + u1 = U2; + u1 = (unsigned int)s; + u1 = (unsigned int)s1; + u1 = (unsigned int)S1; + u1 = (unsigned int)s2; + u1 = (unsigned int)S2; + u1 = (unsigned int)v1; + u1 = (unsigned int)V1; + u1 = (unsigned int)H1; + return; +} + +void s_signed(void) +{ + s1 = (int)u; + s1 = (int)u1; + s1 = (int)U1; + s1 = (int)u2; + s1 = (int)U2; + s1 = s; + s1 = (int)s1; + s1 = S1; + s1 = (int)s2; + s1 = S2; + s1 = (int)v1; + s1 = V1; + s1 = (int)H1; + return; +} + +void s_unsigned(void) +{ + s1 = (enum e_s1)u; + s1 = (enum e_s1)((unsigned int)u1); + s1 = (enum e_s1)U1; + s1 = (enum e_s1)((unsigned int)u2); + s1 = (enum e_s1)U2; + s1 = (enum e_s1)((unsigned int)s); + s1 = (enum e_s1)((unsigned int)s1); + s1 = (enum e_s1)((unsigned int)S1); + s1 = (enum e_s1)((unsigned int)s2); + s1 = (enum e_s1)((unsigned int)S2); + s1 = (enum e_s1)((unsigned int)v1); + s1 = (enum e_s1)((unsigned int)V1); + s1 = (enum e_s1)((unsigned int)H1); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/cast_enum_bts1546.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/cast_enum_bts1546.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/cast_enum_bts1546.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/cast_enum_bts1546.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,182 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/cast_enum_bts1546.i (no preprocessing) +/* Generated by Frama-C */ +enum e { + E0 = 0, + E1 = 1 +}; +enum e_v1 { + V1 = 0 +}; +enum e_v2 { + V2 = 0 +}; +enum e_u1 { + U1 = 0xFFFFFFFFU +}; +enum e_u2 { + U2 = 0xFFFFFFFFU +}; +enum e_s1 { + S1 = -1 +}; +enum e_s2 { + S2 = -1 +}; +enum e_h1 { + H1 = 0xFFFFFFFFFFFFFFFFULL +}; +enum e X; +/*@ ensures + P: + X ≡ E0 ∧ \old(x) ≡ E1 ∧ X < \old(x) ∧ E0 ≤ E1 ⇒ + \result ≡ E0; + */ +enum e f(enum e x) +{ + enum e __retres; + X = E0; + __retres = E0; + return __retres; +} + +/*@ ensures P: \result ≡ (unsigned int)E0; */ +enum e g(enum e x) +{ + enum e __retres; + __retres = (enum e)((unsigned int)E0); + return __retres; +} + +int s; +unsigned int u; +long long hs; +unsigned long long hu; +enum e_v1 v1; +enum e_v1 vv1; +enum e_v2 v2; +enum e_u1 u1; +enum e_u1 uu1; +enum e_u2 u2; +enum e_s1 s1; +enum e_s1 ss1; +enum e_s2 s2; +enum e_h1 h1; +void us(void) +{ + u = (unsigned int)s; + s = (int)u; + u = U1; + s = (int)U1; + u = (unsigned int)S1; + s = S1; + u = (unsigned int)V1; + s = V1; + u = (unsigned int)H1; + s = (int)H1; + return; +} + +void uu(void) +{ + uu1 = (enum e_u1)u; + uu1 = u1; + uu1 = U1; + uu1 = (enum e_u1)u2; + uu1 = (enum e_u1)U2; + uu1 = s; + uu1 = (enum e_u1)s1; + uu1 = S1; + uu1 = (enum e_u1)v1; + uu1 = V1; + uu1 = (enum e_u1)H1; + return; +} + +void ss(void) +{ + ss1 = (enum e_s1)u; + ss1 = (enum e_s1)u1; + ss1 = (enum e_s1)U1; + ss1 = s; + ss1 = s1; + ss1 = S1; + ss1 = (enum e_s1)s2; + ss1 = S2; + ss1 = (enum e_s1)v1; + ss1 = V1; + return; +} + +void u_signed(void) +{ + u1 = (int)u; + u1 = (int)u1; + u1 = (int)U1; + u1 = (int)u2; + u1 = (int)U2; + u1 = s; + u1 = (int)s1; + u1 = S1; + u1 = (int)s2; + u1 = S2; + u1 = (int)v1; + u1 = V1; + return; +} + +void u_unsigned(void) +{ + u1 = (enum e_u1)u; + u1 = (enum e_u1)((unsigned int)u1); + u1 = U1; + u1 = (enum e_u1)((unsigned int)u2); + u1 = (enum e_u1)U2; + u1 = (enum e_u1)((unsigned int)s); + u1 = (enum e_u1)((unsigned int)s1); + u1 = (enum e_u1)((unsigned int)S1); + u1 = (enum e_u1)((unsigned int)s2); + u1 = (enum e_u1)((unsigned int)S2); + u1 = (enum e_u1)((unsigned int)v1); + u1 = (enum e_u1)((unsigned int)V1); + u1 = (enum e_u1)((unsigned int)H1); + return; +} + +void s_signed(void) +{ + s1 = (int)u; + s1 = (int)u1; + s1 = (int)U1; + s1 = (int)u2; + s1 = (int)U2; + s1 = s; + s1 = (int)s1; + s1 = S1; + s1 = (int)s2; + s1 = S2; + s1 = (int)v1; + s1 = V1; + s1 = (int)H1; + return; +} + +void s_unsigned(void) +{ + s1 = (enum e_s1)u; + s1 = (enum e_s1)((unsigned int)u1); + s1 = (enum e_s1)U1; + s1 = (enum e_s1)((unsigned int)u2); + s1 = (enum e_s1)U2; + s1 = (enum e_s1)((unsigned int)s); + s1 = (enum e_s1)((unsigned int)s1); + s1 = (enum e_s1)((unsigned int)S1); + s1 = (enum e_s1)((unsigned int)s2); + s1 = (enum e_s1)((unsigned int)S2); + s1 = (enum e_s1)((unsigned int)v1); + s1 = (enum e_s1)((unsigned int)V1); + s1 = (enum e_s1)((unsigned int)H1); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/char_cst.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/char_cst.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/char_cst.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/char_cst.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/char_cst.c (with preprocessing) +/* Generated by Frama-C */ +/*@ requires c ≢ '0'; + + behavior quote: + assumes c ≡ '\''; + + behavior default: + assumes c ≢ '\'' ∧ c ≢ 'a'; + + behavior slash: + assumes c ≡ '\\'; + + behavior other: + assumes c ≢ '\\' ∧ c ≢ 'a'; + + behavior hexa: + assumes c ≢ '\253'; + + behavior oct: + assumes c ≢ 'S'; + + behavior string: + assumes "" ≢ "\"" ∧ "" ≡ ""; + */ +void f(char c) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/clash_double_file_bts1598.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/clash_double_file_bts1598.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/clash_double_file_bts1598.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/clash_double_file_bts1598.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,3339 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/clash_double_file_bts1598.c (with preprocessing) +/* Generated by Frama-C */ +typedef unsigned int size_t; +struct option { + char const *name ; + int has_arg ; + int *flag ; + int val ; +}; +typedef long long intmax_t; +struct __anonstruct_imaxdiv_t_1 { + long long quot ; + long long rem ; +}; +typedef struct __anonstruct_imaxdiv_t_1 imaxdiv_t; +typedef int wchar_t; +struct lconv { + char *decimal_point ; + char *thousands_sep ; + char *grouping ; + char *int_curr_symbol ; + char *currency_symbol ; + char *mon_decimal_point ; + char *mon_thousands_sep ; + char *mon_grouping ; + char *positive_sign ; + char *negative_sign ; + char int_frac_digits ; + char frac_digits ; + char p_cs_precedes ; + char p_sep_by_space ; + char n_cs_precedes ; + char n_sep_by_space ; + char p_sign_posn ; + char n_sign_posn ; + char int_p_cs_precedes ; + char int_p_sep_by_space ; + char int_n_cs_precedes ; + char int_n_sep_by_space ; + char int_p_sign_posn ; + char int_n_sign_posn ; +}; +typedef unsigned int gid_t; +typedef unsigned int uid_t; +typedef __builtin_va_list va_list; +typedef unsigned int ino_t; +typedef long time_t; +typedef unsigned int blkcnt_t; +typedef unsigned int blksize_t; +typedef unsigned int dev_t; +typedef unsigned int mode_t; +typedef unsigned int nlink_t; +typedef long off_t; +struct stat { + dev_t st_dev ; + ino_t st_ino ; + mode_t st_mode ; + nlink_t st_nlink ; + uid_t st_uid ; + gid_t st_gid ; + dev_t st_rdev ; + off_t st_size ; + time_t st_atime ; + time_t st_mtime ; + time_t st_ctime ; + blksize_t st_blksize ; + blkcnt_t st_blocks ; +}; +struct __fc_pos_t { + unsigned long __fc_stdio_position ; +}; +typedef struct __fc_pos_t fpos_t; +struct __fc_FILE { + unsigned int __fc_stdio_id ; + fpos_t __fc_position ; + char __fc_error ; + char __fc_eof ; + int __fc_flags ; + struct stat *__fc_inode ; + unsigned char *__fc_real_data ; + int __fc_real_data_max_size ; +}; +typedef struct __fc_FILE FILE; +struct __fc_div_t { + int quot ; + int rem ; +}; +typedef struct __fc_div_t div_t; +struct __fc_ldiv_t { + long quot ; + long rem ; +}; +typedef struct __fc_ldiv_t ldiv_t; +struct __fc_lldiv_t { + long long quot ; + long long rem ; +}; +typedef struct __fc_lldiv_t lldiv_t; +typedef unsigned int clock_t; +struct tm { + int tm_sec ; + int tm_min ; + int tm_hour ; + int tm_mday ; + int tm_mon ; + int tm_year ; + int tm_wday ; + int tm_yday ; + int tm_isdst ; +}; +extern int Frama_C_entropy_source; + +/*@ requires \valid(p+(0 .. l-1)); + ensures \initialized(\old(p)+(0 .. \old(l)-1)); + assigns *(p+(0 .. l-1)), Frama_C_entropy_source; + assigns *(p+(0 .. l-1)) \from Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern void Frama_C_make_unknown(char *p, size_t l); + +/*@ ensures \result ≡ \old(a) ∨ \result ≡ \old(b); + assigns \result, Frama_C_entropy_source; + assigns \result \from a, b, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern int Frama_C_nondet(int a, int b); + +/*@ ensures \result ≡ \old(a) ∨ \result ≡ \old(b); + assigns \result, Frama_C_entropy_source; + assigns \result \from a, b, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern void *Frama_C_nondet_ptr(void *a, void *b); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern int Frama_C_interval(int min, int max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern int Frama_C_interval_split(int min, int max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern unsigned char Frama_C_unsigned_char_interval(unsigned char min, + unsigned char max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern char Frama_C_char_interval(char min, char max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern unsigned short Frama_C_unsigned_short_interval(unsigned short min, + unsigned short max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern short Frama_C_short_interval(short min, short max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern unsigned int Frama_C_unsigned_int_interval(unsigned int min, + unsigned int max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern int Frama_C_int_interval(int min, int max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern unsigned long Frama_C_unsigned_long_interval(unsigned long min, + unsigned long max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern long Frama_C_long_interval(long min, long max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern unsigned long long Frama_C_unsigned_long_long_interval(unsigned long long min, + unsigned long long max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern long long Frama_C_long_long_interval(long long min, long long max); + +/*@ ensures \is_finite(\result) ∧ \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern float Frama_C_float_interval(float min, float max); + +/*@ ensures \is_finite(\result) ∧ \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern double Frama_C_double_interval(double min, double max); + +/*@ ensures *(\old(dest)+(0 .. \old(n))) ≡ *(\old(src)+(0 .. \old(n))); + assigns *(dest+(0 .. n-1)), \result; + assigns *(dest+(0 .. n-1)) \from *(src+(0 .. n-1)); + assigns \result \from dest; + */ +extern void *Frama_C_memcpy(char *dest, char const *src, unsigned long n); + +/*@ ensures \false; + assigns \nothing; */ +extern __attribute__((__noreturn__)) void Frama_C_abort(void); + +/*@ assigns *((char *)p+(0 .. s-1)); + assigns *((char *)p+(0 .. s-1)) \from c; + */ +extern void Frama_C_memset(void *p, int c, size_t s); + +/*@ terminates \false; + assigns \nothing; */ +extern void __FC_assert(char const *file, int line, char const *expr); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isalnum(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isalpha(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isblank(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int iscntrl(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isdigit(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isgraph(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int islower(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isprint(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int ispunct(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isspace(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isupper(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isxdigit(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int tolower(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int toupper(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isascii(int c); + +extern int __FC_errno; + +extern char *optarg; + +extern int optind; + +extern int opterr; + +extern int optopt; + +/*@ assigns \result, *optarg, optind, opterr, optopt; + assigns \result \from argc, *(argv+(0 .. argc-1)), *(optstring+(0 ..)); + assigns *optarg \from argc, *(argv+(0 .. argc-1)), *(optstring+(0 ..)); + assigns optind \from argc, *(argv+(0 .. argc-1)), *(optstring+(0 ..)); + assigns opterr \from argc, *(argv+(0 .. argc-1)), *(optstring+(0 ..)); + assigns optopt \from argc, *(argv+(0 .. argc-1)), *(optstring+(0 ..)); + */ +extern int getopt(int argc, char * const *argv, char const *optstring); + +/*@ assigns \result, *optarg, optind, opterr, optopt, + *((longopts+(0 ..))->flag); + assigns \result + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns *optarg + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns optind + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns opterr + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns optopt + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns *((longopts+(0 ..))->flag) + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + */ +extern int getopt_long(int argc, char * const *argv, char const *shortopts, + struct option const *longopts, int *longind); + +/*@ assigns \result, *optarg, optind, opterr, optopt, + *((longopts+(0 ..))->flag); + assigns \result + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns *optarg + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns optind + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns opterr + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns optopt + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns *((longopts+(0 ..))->flag) + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + */ +extern int getopt_long_only(int argc, char * const *argv, + char const *shortopts, + struct option const *longopts, int *longind); + +/*@ requires (intmax_t)(-c) ≢ c; + assigns \result; + assigns \result \from c; + */ +extern intmax_t imaxabs(intmax_t c); + +/*@ requires denom ≢ 0; + ensures \result.quot ≡ \old(numer)/\old(denom); + ensures \result.rem ≡ \old(numer)%\old(denom); + assigns \result; + assigns \result \from numer, denom; + */ +extern imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom); + +/*@ assigns \result, *(endptr+(..)), __FC_errno; + assigns \result \from *(nptr+(..)), base; + assigns *(endptr+(..)) \from *(nptr+(..)), base; + assigns __FC_errno \from *(nptr+(..)), base; + */ +extern intmax_t strtoimax(char const *nptr, char **endptr, int base); + +/*@ +axiomatic MemCmp { + logic ℤ memcmp{L1, L2}(char *s1, char *s2, ℤ n) + reads \at(*(s1+(0 .. n-1)),L1), \at(*(s2+(0 .. n-1)),L2); + + axiom memcmp_zero{L1, L2}: + ∀ char *s1, char *s2; + ∀ ℤ n; + memcmp{L1, L2}(s1, s2, n) ≡ 0 ⇔ + (∀ ℤ i; 0 ≤ i < n ⇒ \at(*(s1+i),L1) ≡ \at(*(s2+i),L2)); + + } + */ +/*@ +axiomatic MemChr { + logic 𝔹 memchr{L}(char *s, ℤ c, ℤ n) ; + + axiom memchr_def{L}: + ∀ char *s; + ∀ ℤ c; + ∀ ℤ n; + memchr{L}(s, c, n) ≡ \true ⇔ + (∃ int i; 0 ≤ i < n ∧ *(s+i) ≡ c); + + } + */ +/*@ +axiomatic MemSet { + logic 𝔹 memset{L}(char *s, ℤ c, ℤ n) ; + + axiom memset_def{L}: + ∀ char *s; + ∀ ℤ c; + ∀ ℤ n; + memset{L}(s, c, n) ≡ \true ⇔ + (∀ ℤ i; 0 ≤ i < n ⇒ *(s+i) ≡ c); + + } + */ +/*@ +axiomatic StrLen { + logic ℤ strlen{L}(char *s) ; + + axiom strlen_pos_or_null{L}: + ∀ char *s; + ∀ ℤ i; + 0 ≤ i ∧ (∀ ℤ j; 0 ≤ j < i ⇒ *(s+j) ≢ '\000') ∧ + *(s+i) ≡ '\000' ⇒ strlen{L}(s) ≡ i; + + axiom strlen_neg{L}: + ∀ char *s; + (∀ ℤ i; 0 ≤ i ⇒ *(s+i) ≢ '\000') ⇒ strlen{L}(s) < 0; + + axiom strlen_before_null{L}: + ∀ char *s; + ∀ ℤ i; 0 ≤ i < strlen{L}(s) ⇒ *(s+i) ≢ '\000'; + + axiom strlen_at_null{L}: + ∀ char *s; 0 ≤ strlen{L}(s) ⇒ *(s+strlen{L}(s)) ≡ '\000'; + + axiom strlen_not_zero{L}: + ∀ char *s; + ∀ ℤ i; + 0 ≤ i ≤ strlen{L}(s) ∧ *(s+i) ≢ '\000' ⇒ i < strlen{L}(s); + + axiom strlen_zero{L}: + ∀ char *s; + ∀ ℤ i; + 0 ≤ i ≤ strlen{L}(s) ∧ *(s+i) ≡ '\000' ⇒ i ≡ strlen{L}(s); + + axiom strlen_sup{L}: + ∀ char *s; + ∀ ℤ i; 0 ≤ i ∧ *(s+i) ≡ '\000' ⇒ 0 ≤ strlen{L}(s) ≤ i; + + axiom strlen_shift{L}: + ∀ char *s; + ∀ ℤ i; 0 ≤ i ≤ strlen{L}(s) ⇒ strlen{L}(s+i) ≡ strlen{L}(s)-i; + + axiom strlen_create{L}: + ∀ char *s; + ∀ ℤ i; 0 ≤ i ∧ *(s+i) ≡ '\000' ⇒ 0 ≤ strlen{L}(s) ≤ i; + + axiom strlen_create_shift{L}: + ∀ char *s; + ∀ ℤ i; + ∀ ℤ k; + 0 ≤ k ≤ i ∧ *(s+i) ≡ '\000' ⇒ 0 ≤ strlen{L}(s+k) ≤ i-k; + + axiom memcmp_strlen_left{L}: + ∀ char *s1, char *s2; + ∀ ℤ n; + memcmp{L, L}(s1, s2, n) ≡ 0 ∧ strlen{L}(s1) < n ⇒ + strlen{L}(s1) ≡ strlen{L}(s2); + + axiom memcmp_strlen_right{L}: + ∀ char *s1, char *s2; + ∀ ℤ n; + memcmp{L, L}(s1, s2, n) ≡ 0 ∧ strlen{L}(s2) < n ⇒ + strlen{L}(s1) ≡ strlen{L}(s2); + + axiom memcmp_strlen_shift_left{L}: + ∀ char *s1, char *s2; + ∀ ℤ k, ℤ n; + memcmp{L, L}(s1, s2+k, n) ≡ 0 ≤ k ∧ strlen{L}(s1) < n ⇒ + 0 ≤ strlen{L}(s2) ≤ k+strlen{L}(s1); + + axiom memcmp_strlen_shift_right{L}: + ∀ char *s1, char *s2; + ∀ ℤ k, ℤ n; + memcmp{L, L}(s1+k, s2, n) ≡ 0 ≤ k ∧ strlen{L}(s2) < n ⇒ + 0 ≤ strlen{L}(s1) ≤ k+strlen{L}(s2); + + } + */ +/*@ +axiomatic StrCmp { + logic ℤ strcmp{L}(char *s1, char *s2) ; + + axiom strcmp_zero{L}: + ∀ char *s1, char *s2; + strcmp{L}(s1, s2) ≡ 0 ⇔ + strlen{L}(s1) ≡ strlen{L}(s2) ∧ + (∀ ℤ i; 0 ≤ i ≤ strlen{L}(s1) ⇒ *(s1+i) ≡ *(s2+i)); + + } + */ +/*@ +axiomatic StrNCmp { + logic ℤ strncmp{L}(char *s1, char *s2, ℤ n) ; + + axiom strncmp_zero{L}: + ∀ char *s1, char *s2; + ∀ ℤ n; + strncmp{L}(s1, s2, n) ≡ 0 ⇔ + (strlen{L}(s1) < n ∧ strcmp{L}(s1, s2) ≡ 0) ∨ + (∀ ℤ i; 0 ≤ i < n ⇒ *(s1+i) ≡ *(s2+i)); + + } + */ +/*@ +axiomatic StrChr { + logic 𝔹 strchr{L}(char *s, ℤ c) ; + + axiom strchr_def{L}: + ∀ char *s; + ∀ ℤ c; + strchr{L}(s, c) ≡ \true ⇔ + (∃ ℤ i; 0 ≤ i ≤ strlen{L}(s) ∧ *(s+i) ≡ c); + + } + */ +/*@ +axiomatic WcsLen { + logic ℤ wcslen{L}(wchar_t *s) ; + + axiom wcslen_pos_or_null{L}: + ∀ wchar_t *s; + ∀ ℤ i; + 0 ≤ i ∧ (∀ ℤ j; 0 ≤ j < i ⇒ *(s+j) ≢ 0) ∧ *(s+i) ≡ 0 ⇒ + wcslen{L}(s) ≡ i; + + axiom wcslen_neg{L}: + ∀ wchar_t *s; + (∀ ℤ i; 0 ≤ i ⇒ *(s+i) ≢ 0) ⇒ wcslen{L}(s) < 0; + + axiom wcslen_before_null{L}: + ∀ wchar_t *s; + ∀ int i; 0 ≤ i < wcslen{L}(s) ⇒ *(s+i) ≢ 0; + + axiom wcslen_at_null{L}: + ∀ wchar_t *s; 0 ≤ wcslen{L}(s) ⇒ *(s+wcslen{L}(s)) ≡ 0; + + axiom wcslen_not_zero{L}: + ∀ wchar_t *s; + ∀ int i; 0 ≤ i ≤ wcslen{L}(s) ∧ *(s+i) ≢ 0 ⇒ i < wcslen{L}(s); + + axiom wcslen_zero{L}: + ∀ wchar_t *s; + ∀ int i; + 0 ≤ i ≤ wcslen{L}(s) ∧ *(s+i) ≡ 0 ⇒ i ≡ wcslen{L}(s); + + axiom wcslen_sup{L}: + ∀ wchar_t *s; + ∀ int i; 0 ≤ i ∧ *(s+i) ≡ 0 ⇒ 0 ≤ wcslen{L}(s) ≤ i; + + axiom wcslen_shift{L}: + ∀ wchar_t *s; + ∀ int i; 0 ≤ i ≤ wcslen{L}(s) ⇒ wcslen{L}(s+i) ≡ wcslen{L}(s)-i; + + axiom wcslen_create{L}: + ∀ wchar_t *s; + ∀ int i; 0 ≤ i ∧ *(s+i) ≡ 0 ⇒ 0 ≤ wcslen{L}(s) ≤ i; + + axiom wcslen_create_shift{L}: + ∀ wchar_t *s; + ∀ int i; + ∀ int k; + 0 ≤ k ≤ i ∧ *(s+i) ≡ 0 ⇒ 0 ≤ wcslen{L}(s+k) ≤ i-k; + + } + */ +/*@ +axiomatic WcsCmp { + logic ℤ wcscmp{L}(wchar_t *s1, wchar_t *s2) ; + + axiom wcscmp_zero{L}: + ∀ wchar_t *s1, wchar_t *s2; + wcscmp{L}(s1, s2) ≡ 0 ⇔ + wcslen{L}(s1) ≡ wcslen{L}(s2) ∧ + (∀ ℤ i; 0 ≤ i ≤ wcslen{L}(s1) ⇒ *(s1+i) ≡ *(s2+i)); + + } + */ +/*@ +axiomatic WcsNCmp { + logic ℤ wcsncmp{L}(wchar_t *s1, wchar_t *s2, ℤ n) ; + + axiom wcsncmp_zero{L}: + ∀ wchar_t *s1, wchar_t *s2; + ∀ ℤ n; + wcsncmp{L}(s1, s2, n) ≡ 0 ⇔ + (wcslen{L}(s1) < n ∧ wcscmp{L}(s1, s2) ≡ 0) ∨ + (∀ ℤ i; 0 ≤ i < n ⇒ *(s1+i) ≡ *(s2+i)); + + } + */ +/*@ logic ℤ minimum(ℤ i, ℤ j) = i 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, edom; + */ +extern double acos(double x); + +/*@ behavior normal: + assumes \is_finite(x) ∧ \abs(x) ≤ 1; + ensures \is_finite(\result) ∧ \result ≥ 0; + assigns \nothing; + + behavior edom: + assumes \is_infinite(x) ∨ (\is_finite(x) ∧ \abs(x) > 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, edom; + */ +extern float acosf(float x); + +/*@ behavior normal: + assumes \is_finite(x) ∧ \abs(x) ≤ 1; + ensures \is_finite(\result) ∧ \result ≥ 0; + assigns \nothing; + + behavior edom: + assumes \is_infinite(x) ∨ (\is_finite(x) ∧ \abs(x) > 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, edom; + */ +extern long double acosl(long double x); + +/*@ behavior normal: + assumes \is_finite(x) ∧ \abs(x) ≤ 1; + ensures \is_finite(\result); + assigns \nothing; + + behavior edom: + assumes \is_infinite(x) ∨ (\is_finite(x) ∧ \abs(x) > 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, edom; + */ +extern double asin(double x); + +/*@ behavior normal: + assumes \is_finite(x) ∧ \abs(x) ≤ 1; + ensures \is_finite(\result); + assigns \nothing; + + behavior edom: + assumes \is_infinite(x) ∨ (\is_finite(x) ∧ \abs(x) > 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, edom; + */ +extern float asinf(float x); + +/*@ behavior normal: + assumes \is_finite(x) ∧ \abs(x) ≤ 1; + ensures \is_finite(\result); + assigns \nothing; + + behavior edom: + assumes \is_infinite(x) ∨ (\is_finite(x) ∧ \abs(x) > 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, edom; + */ +extern long double asinl(long double x); + +/*@ behavior normal: + assumes \is_finite(x) ∧ x ≥ 1; + ensures \is_finite(\result) ∧ \result ≥ 0; + assigns \nothing; + + behavior infinite: + assumes \is_plus_infinity(x); + ensures \is_plus_infinity(\result); + assigns \nothing; + + behavior edom: + assumes \is_minus_infinity(x) ∨ (\is_finite(x) ∧ x < 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, infinite, edom; + */ +extern double acosh(double x); + +/*@ behavior normal: + assumes \is_finite(x) ∧ x ≥ 1; + ensures \is_finite(\result) ∧ \result ≥ 0; + assigns \nothing; + + behavior infinite: + assumes \is_plus_infinity(x); + ensures \is_plus_infinity(\result); + assigns \nothing; + + behavior edom: + assumes \is_minus_infinity(x) ∨ (\is_finite(x) ∧ x < 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, infinite, edom; + */ +extern float acoshf(float x); + +/*@ behavior normal: + assumes \is_finite(x) ∧ x ≥ 1; + ensures \is_finite(\result) ∧ \result ≥ 0; + assigns \nothing; + + behavior infinite: + assumes \is_plus_infinity(x); + ensures \is_plus_infinity(\result); + assigns \nothing; + + behavior edom: + assumes \is_minus_infinity(x) ∨ (\is_finite(x) ∧ x < 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, infinite, edom; + */ +extern long double acoshl(long double x); + +/*@ requires valid_string(tagp); + ensures \is_NaN(\result); + assigns \nothing; */ +extern double nan(char const *tagp); + +/*@ requires valid_string(tagp); + ensures \is_NaN(\result); + assigns \nothing; */ +extern float nanf(char const *tagp); + +/*@ requires valid_string(tagp); + ensures \is_NaN(\result); + assigns \nothing; */ +extern long double nanl(char const *tagp); + +/*@ assigns *(env+(0 .. 5)); */ +extern int setjmp(char * /*[5]*/ env); + +/*@ terminates \false; + assigns \nothing; */ +extern void longjmp(char * /*[5]*/ env, int val); + +/*@ assigns \nothing; */ +extern void (*signal(int sig, void (*func)(int )))(int ); + +/*@ ensures \false; + assigns \nothing; */ +extern int raise(int sig); + +extern FILE *__fc_stdin; + +extern FILE *__fc_stdout; + +/*@ assigns \nothing; */ +extern int remove(char const *filename); + +/*@ assigns \nothing; */ +extern int rename(char const *old, char const *new); + +/*@ ensures + \result ≡ \null ∨ + (\valid(\result) ∧ \fresh{Old, Here}(\result,sizeof(FILE))); + assigns \nothing; + */ +extern FILE *tmpfile(void); + +/*@ assigns \result, *(s+(..)); + assigns \result \from *(s+(..)); + assigns *(s+(..)) \from \nothing; + */ +extern char *tmpnam(char *s); + +/*@ ensures \result ≡ 0 ∨ \result ≡ -1; + assigns *stream; + assigns *stream \from \nothing; + */ +extern int fclose(FILE *stream); + +/*@ ensures \result ≡ 0 ∨ \result ≡ -1; + assigns *stream; + assigns *stream \from \nothing; + */ +extern int fflush(FILE *stream); + +FILE __fc_fopen[512]; +FILE const *_p__fc_fopen = (FILE const *)(__fc_fopen); +/*@ ensures + \result ≡ \null ∨ + (\valid(\result) ∧ \subset(\result, &__fc_fopen[0 ..])); + assigns \result; + assigns \result \from *(filename+(..)), *(mode+(..)), _p__fc_fopen; + */ +extern FILE *fopen(char const *filename, char const *mode); + +/*@ ensures + \result ≡ \null ∨ + (\valid(\result) ∧ \fresh{Old, Here}(\result,sizeof(FILE))); + assigns \result; + assigns \result \from fildes, *(mode+(..)); + */ +extern FILE *fdopen(int fildes, char const *mode); + +/*@ ensures \result ≡ \null ∨ \result ≡ \old(stream); + assigns *stream; + */ +extern FILE *freopen(char const *filename, char const *mode, FILE *stream); + +/*@ assigns *stream; + assigns *stream \from buf; */ +extern void setbuf(FILE *stream, char *buf); + +/*@ assigns *stream; + assigns *stream \from buf, mode, size; */ +extern int setvbuf(FILE *stream, char *buf, int mode, size_t size); + +/*@ assigns *stream; */ +extern int fprintf(FILE *stream, char const *format , ...); + +/*@ assigns *stream; */ +extern int fscanf(FILE *stream, char const *format , ...); + +/*@ assigns *__fc_stdout; + assigns *__fc_stdout \from *(format+(..)); */ +extern int printf(char const *format , ...); + +/*@ assigns *__fc_stdin; */ +extern int scanf(char const *format , ...); + +/*@ assigns *(s+(0 .. n-1)); */ +extern int snprintf(char *s, size_t n, char const *format , ...); + +/*@ assigns *(s+(0 ..)); */ +extern int sprintf(char *s, char const *format , ...); + +/*@ assigns *stream; + assigns *stream \from *(format+(..)), arg; */ +extern int vfprintf(FILE *stream, char const *format, va_list arg); + +/*@ assigns *stream; + assigns *stream \from *(format+(..)), *stream; */ +extern int vfscanf(FILE *stream, char const *format, va_list arg); + +/*@ assigns *__fc_stdout; + assigns *__fc_stdout \from arg; */ +extern int vprintf(char const *format, va_list arg); + +/*@ assigns *__fc_stdin; + assigns *__fc_stdin \from *(format+(..)); */ +extern int vscanf(char const *format, va_list arg); + +/*@ assigns *(s+(0 .. n-1)); + assigns *(s+(0 .. n-1)) \from *(format+(..)), arg; + */ +extern int vsnprintf(char *s, size_t n, char const *format, va_list arg); + +/*@ assigns *(s+(0 ..)); + assigns *(s+(0 ..)) \from *(format+(..)), arg; */ +extern int vsprintf(char *s, char const *format, va_list arg); + +/*@ assigns *stream; */ +extern int fgetc(FILE *stream); + +/*@ ensures \result ≡ \null ∨ \result ≡ \old(s); + assigns *(s+(0 .. n-1)), *stream, \result; + assigns *(s+(0 .. n-1)) \from *stream; + assigns *stream \from *stream; + assigns \result \from s, n, *stream; + */ +extern char *fgets(char *s, int n, FILE *stream); + +/*@ assigns *stream; */ +extern int fputc(int c, FILE *stream); + +/*@ assigns *stream; + assigns *stream \from *(s+(..)); */ +extern int fputs(char const *s, FILE *stream); + +/*@ assigns \result, *stream; + assigns \result \from *stream; + assigns *stream \from *stream; + */ +extern int getc(FILE *stream); + +/*@ assigns \result; + assigns \result \from *__fc_stdin; */ +extern int getchar(void); + +/*@ ensures \result ≡ \old(s) ∨ \result ≡ \null; + assigns *(s+(..)), \result; + assigns *(s+(..)) \from *__fc_stdin; + assigns \result \from s, __fc_stdin; + */ +extern char *gets(char *s); + +/*@ assigns *stream; + assigns *stream \from c; */ +extern int putc(int c, FILE *stream); + +/*@ assigns *__fc_stdout; + assigns *__fc_stdout \from c; */ +extern int putchar(int c); + +/*@ assigns *__fc_stdout; + assigns *__fc_stdout \from *(s+(..)); */ +extern int puts(char const *s); + +/*@ assigns *stream; + assigns *stream \from c; */ +extern int ungetc(int c, FILE *stream); + +/*@ assigns *((char *)ptr+(0 .. nmemb*size-1)); + assigns *((char *)ptr+(0 .. nmemb*size-1)) \from *stream; + */ +extern size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); + +/*@ assigns *stream; + assigns *stream \from *((char *)ptr+(0 .. nmemb*size-1)); + */ +extern size_t fwrite(void const *ptr, size_t size, size_t nmemb, FILE *stream); + +/*@ assigns *pos; + assigns *pos \from *stream; */ +extern int fgetpos(FILE *stream, fpos_t *pos); + +/*@ assigns *stream, __FC_errno; + assigns *stream \from offset, whence; */ +extern int fseek(FILE *stream, long offset, int whence); + +/*@ assigns *stream; + assigns *stream \from *pos; */ +extern int fsetpos(FILE *stream, fpos_t const *pos); + +/*@ assigns \result, __FC_errno; + assigns \result \from *stream; + assigns __FC_errno \from *stream; + */ +extern long ftell(FILE *stream); + +/*@ assigns *stream; + assigns *stream \from \nothing; */ +extern void rewind(FILE *stream); + +/*@ assigns *stream; + assigns *stream \from \nothing; */ +extern void clearerr(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int feof(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int fileno(FILE *stream); + +/*@ assigns *stream; + assigns *stream \from \nothing; */ +extern void flockfile(FILE *stream); + +/*@ assigns *stream; + assigns *stream \from \nothing; */ +extern void funlockfile(FILE *stream); + +/*@ assigns \result, *stream; + assigns \result \from \nothing; + assigns *stream \from \nothing; + */ +extern int ftrylockfile(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int ferror(FILE *stream); + +/*@ assigns __fc_stdout; + assigns __fc_stdout \from __FC_errno, *(s+(..)); */ +extern void perror(char const *s); + +/*@ assigns \result, *stream; + assigns \result \from *stream; + assigns *stream \from *stream; + */ +extern int getc_unlocked(FILE *stream); + +/*@ assigns \result; + assigns \result \from *__fc_stdin; */ +extern int getchar_unlocked(void); + +/*@ assigns *stream; + assigns *stream \from c; */ +extern int putc_unlocked(int c, FILE *stream); + +/*@ assigns *__fc_stdout; + assigns *__fc_stdout \from c; */ +extern int putchar_unlocked(int c); + +/*@ assigns *stream; + assigns *stream \from \nothing; */ +extern void clearerr_unlocked(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int feof_unlocked(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int ferror_unlocked(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int fileno_unlocked(FILE *stream); + +/*@ assigns \result; + assigns \result \from *(nptr+(..)); */ +extern double atof(char const *nptr); + +/*@ assigns \result; + assigns \result \from *(nptr+(..)); */ +extern int atoi(char const *nptr); + +/*@ assigns \result; + assigns \result \from *(nptr+(..)); */ +extern long atol(char const *nptr); + +/*@ assigns \result; + assigns \result \from *(nptr+(..)); */ +extern long long atoll(char const *nptr); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)); + assigns *endptr \from nptr, *(nptr+(0 ..)); + */ +extern double strtod(char const *nptr, char **endptr); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)); + assigns *endptr \from nptr, *(nptr+(0 ..)); + */ +extern float strtof(char const *nptr, char **endptr); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)); + assigns *endptr \from nptr, *(nptr+(0 ..)); + */ +extern long double strtold(char const *nptr, char **endptr); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)), base; + assigns *endptr \from nptr, *(nptr+(0 ..)), base; + */ +extern long strtol(char const *nptr, char **endptr, int base); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)), base; + assigns *endptr \from nptr, *(nptr+(0 ..)), base; + */ +extern long long strtoll(char const *nptr, char **endptr, int base); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)), base; + assigns *endptr \from nptr, *(nptr+(0 ..)), base; + */ +extern unsigned long strtoul(char const *nptr, char **endptr, int base); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)), base; + assigns *endptr \from nptr, *(nptr+(0 ..)), base; + */ +extern unsigned long long strtoull(char const *nptr, char **endptr, int base); + +int __fc_random_counter __attribute__((__unused__, __FRAMA_C_MODEL__)); +unsigned long const __fc_rand_max = (unsigned long)32767; +/*@ ensures 0 ≤ \result ≤ __fc_rand_max; + assigns \result, __fc_random_counter; + assigns \result \from __fc_random_counter; + assigns __fc_random_counter \from __fc_random_counter; + */ +extern int rand(void); + +/*@ assigns __fc_random_counter; + assigns __fc_random_counter \from seed; */ +extern void srand(unsigned int seed); + +/*@ ghost extern int __fc_heap_status __attribute__((__FRAMA_C_MODEL__)); */ + +/*@ +axiomatic dynamic_allocation { + predicate is_allocable{L}(size_t n) + reads __fc_heap_status; + + } + */ +/*@ assigns __fc_heap_status, \result; + assigns __fc_heap_status \from size, __fc_heap_status; + assigns \result \from size, __fc_heap_status; + allocates \result; + + behavior allocation: + assumes is_allocable(size); + ensures \fresh{Old, Here}(\result,\old(size)); + assigns __fc_heap_status, \result; + assigns __fc_heap_status \from size, __fc_heap_status; + assigns \result \from size, __fc_heap_status; + + behavior no_allocation: + assumes ¬is_allocable(size); + ensures \result ≡ \null; + assigns \result; + assigns \result \from \nothing; + allocates \nothing; + + complete behaviors no_allocation, allocation; + disjoint behaviors no_allocation, allocation; + */ +extern void *malloc(size_t size); + +/*@ assigns __fc_heap_status; + assigns __fc_heap_status \from __fc_heap_status; + frees p; + + behavior deallocation: + assumes p ≢ \null; + requires freeable: \freeable(p); + ensures \allocable(\old(p)); + assigns __fc_heap_status; + assigns __fc_heap_status \from __fc_heap_status; + + behavior no_deallocation: + assumes p ≡ \null; + assigns \nothing; + allocates \nothing; + + complete behaviors no_deallocation, deallocation; + disjoint behaviors no_deallocation, deallocation; + */ +extern void free(void *p); + +/*@ ensures \false; + assigns \nothing; */ +extern void abort(void); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int atexit(void (*func)(void)); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int at_quick_exit(void (*func)(void)); + +/*@ ensures \false; + assigns \nothing; */ +extern void exit(int status); + +/*@ ensures \false; + assigns \nothing; */ +extern void _Exit(int status); + +/*@ ensures \result ≡ \null ∨ \valid(\result); + assigns \result; + assigns \result \from name; + */ +extern char *getenv(char const *name); + +/*@ ensures \false; + assigns \nothing; */ +extern void quick_exit(int status); + +/*@ assigns \result; + assigns \result \from *(string+(..)); */ +extern int system(char const *string); + +/*@ assigns *((char *)\result+(..)); + assigns *((char *)\result+(..)) + \from *((char *)key+(..)), *((char *)base+(..)), nmemb, size, *compar; + */ +extern void *bsearch(void const *key, void const *base, size_t nmemb, + size_t size, int (*compar)(void const *, void const *)); + +/*@ assigns *((char *)base+(..)); + assigns *((char *)base+(..)) + \from *((char *)base+(..)), nmemb, size, *compar; + */ +extern void qsort(void *base, size_t nmemb, size_t size, + int (*compar)(void const *, void const *)); + +/*@ requires abs_representable: (int)(-j) ≡ -j; + assigns \result; + assigns \result \from j; + */ +extern int abs(int j); + +/*@ requires abs_representable: (long)(-j) ≡ -j; + assigns \result; + assigns \result \from j; + */ +extern long labs(long j); + +/*@ requires abs_representable: (long long)(-j) ≡ -j; + assigns \result; + assigns \result \from j; + */ +extern long long llabs(long long j); + +/*@ assigns \result; + assigns \result \from numer, denom; */ +extern div_t div(int numer, int denom); + +/*@ assigns \result; + assigns \result \from numer, denom; */ +extern ldiv_t ldiv(long numer, long denom); + +/*@ assigns \result; + assigns \result \from numer, denom; */ +extern lldiv_t lldiv(long long numer, long long denom); + +/*@ assigns \result; + assigns \result \from *(s+(0 ..)), n; */ +extern int mblen(char const *s, size_t n); + +/*@ assigns \result, *(pwc+(0 .. n-1)); + assigns \result \from *(s+(0 .. n-1)), n; + assigns *(pwc+(0 .. n-1)) \from *(s+(0 .. n-1)), n; + */ +extern int mbtowc(wchar_t *pwc, char const *s, size_t n); + +/*@ assigns \result, *(s+(0 ..)); + assigns \result \from wc; + assigns *(s+(0 ..)) \from wc; + */ +extern int wctomb(char *s, wchar_t wc); + +/*@ assigns \result, *(pwcs+(0 .. n-1)); + assigns \result \from *(s+(0 .. n-1)), n; + assigns *(pwcs+(0 .. n-1)) \from *(s+(0 .. n-1)), n; + */ +extern size_t mbstowcs(wchar_t *pwcs, char const *s, size_t n); + +/*@ assigns \result, *(s+(0 .. n-1)); + assigns \result \from *(pwcs+(0 .. n-1)), n; + assigns *(s+(0 .. n-1)) \from *(pwcs+(0 .. n-1)), n; + */ +extern size_t wcstombs(char *s, wchar_t const *pwcs, size_t n); + +/*@ requires \valid_read((char *)s1+(0 .. n-1)); + requires \valid_read((char *)s2+(0 .. n-1)); + ensures + \result ≡ + memcmp{Pre, Pre}((char *)\old(s1), (char *)\old(s2), \old(n)); + assigns \result; + assigns \result \from *((char *)s1+(0 .. n-1)), *((char *)s2+(0 .. n-1)); + */ +extern int memcmp(void const *s1, void const *s2, size_t n); + +/*@ requires \valid_read((char *)s+(0 .. n-1)); + assigns \result; + assigns \result \from s, c, *((char *)s+(0 .. n-1)); + + behavior found: + assumes memchr((char *)s, c, n) ≡ \true; + ensures \base_addr(\result) ≡ \base_addr(\old(s)); + ensures (int)*((char *)\result) ≡ \old(c); + + behavior not_found: + assumes ¬(memchr((char *)s, c, n) ≡ \true); + ensures \result ≡ \null; + */ +extern void *memchr(void const *s, int c, size_t n); + +/*@ requires valid_dst: \valid((char *)dest+(0 .. n-1)); + requires valid_src: \valid_read((char *)src+(0 .. n-1)); + requires \separated((char *)dest+(0 .. n-1), (char *)src+(0 .. n-1)); + ensures + memcmp{Post, Pre}((char *)\old(dest), (char *)\old(src), \old(n)) ≡ 0; + ensures \result ≡ \old(dest); + assigns *((char *)dest+(0 .. n-1)), \result; + assigns *((char *)dest+(0 .. n-1)) \from *((char *)src+(0 .. n-1)); + assigns \result \from dest; + */ +extern void *memcpy(void *dest, void const *src, size_t n); + +/*@ requires valid_dst: \valid((char *)dest+(0 .. n-1)); + requires valid_src: \valid_read((char *)src+(0 .. n-1)); + ensures + memcmp{Post, Pre}((char *)\old(dest), (char *)\old(src), \old(n)) ≡ 0; + ensures \result ≡ \old(dest); + assigns *((char *)dest+(0 .. n-1)), \result; + assigns *((char *)dest+(0 .. n-1)) \from *((char *)src+(0 .. n-1)); + assigns \result \from dest; + */ +extern void *memmove(void *dest, void const *src, size_t n); + +/*@ requires \valid((char *)s+(0 .. n-1)); + ensures memset((char *)\old(s), \old(c), \old(n)) ≡ \true; + ensures \result ≡ \old(s); + assigns *((char *)s+(0 .. n-1)), \result; + assigns *((char *)s+(0 .. n-1)) \from c; + assigns \result \from s; + */ +extern void *memset(void *s, int c, size_t n); + +/*@ requires valid_string_src: valid_string(s); + ensures \result ≡ strlen(\old(s)); + assigns \result; + assigns \result \from *(s+(0 ..)); + */ +extern size_t strlen(char const *s); + +/*@ requires valid_string_src: valid_string(s); + ensures \result ≡ strlen(\old(s)) ∨ \result ≡ \old(n); + assigns \result; + assigns \result \from *(s+(0 ..)); + */ +extern size_t strnlen(char const *s, size_t n); + +/*@ requires valid_string_s1: valid_string(s1); + requires valid_string_s2: valid_string(s2); + ensures \result ≡ strcmp(\old(s1), \old(s2)); + assigns \result; + assigns \result \from *(s1+(0 ..)), *(s2+(0 ..)); + */ +extern int strcmp(char const *s1, char const *s2); + +/*@ requires valid_string_s1: valid_string(s1); + requires valid_string_s2: valid_string(s2); + ensures \result ≡ strncmp(\old(s1), \old(s2), \old(n)); + assigns \result; + assigns \result \from *(s1+(0 .. n-1)), *(s2+(0 .. n-1)); + */ +extern int strncmp(char const *s1, char const *s2, size_t n); + +/*@ requires valid_string_s1: valid_string(s1); + requires valid_string_s2: valid_string(s2); + assigns \result; + assigns \result \from *(s1+(0 ..)), *(s2+(0 ..)); + */ +extern int strcoll(char const *s1, char const *s2); + +/*@ requires valid_string_src: valid_string(s); + assigns \result; + assigns \result \from s, *(s+(0 ..)), c; + + behavior found: + assumes strchr(s, c) ≡ \true; + ensures (int)*\result ≡ \old(c); + ensures \base_addr(\result) ≡ \base_addr(\old(s)); + ensures \old(s) ≤ \result < \old(s)+strlen(\old(s)); + ensures valid_string(\result); + ensures ∀ char *p; \old(s) ≤ p < \result ⇒ (int)*p ≢ \old(c); + + behavior not_found: + assumes ¬(strchr(s, c) ≡ \true); + ensures \result ≡ \null; + + behavior default: + ensures + \result ≡ \null ∨ \base_addr(\result) ≡ \base_addr(\old(s)); + */ +extern char *strchr(char const *s, int c); + +/*@ requires valid_string_src: valid_string(s); + assigns \result; + assigns \result \from s, *(s+(0 ..)), c; + + behavior found: + assumes strchr(s, c) ≡ \true; + ensures (int)*\result ≡ \old(c); + ensures \base_addr(\result) ≡ \base_addr(\old(s)); + ensures valid_string(\result); + + behavior not_found: + assumes ¬(strchr(s, c) ≡ \true); + ensures \result ≡ \null; + + behavior default: + ensures + \result ≡ \null ∨ \base_addr(\result) ≡ \base_addr(\old(s)); + */ +extern char *strrchr(char const *s, int c); + +/*@ requires valid_string_src: valid_string(s); + requires valid_string_reject: valid_string(reject); + ensures 0 ≤ \result ≤ strlen(\old(s)); + assigns \result; + assigns \result \from *(s+(0 ..)), *(reject+(0 ..)); + */ +extern size_t strcspn(char const *s, char const *reject); + +/*@ requires valid_string_src: valid_string(s); + requires valid_string_accept: valid_string(accept); + ensures 0 ≤ \result ≤ strlen(\old(s)); + assigns \result; + assigns \result \from *(s+(0 ..)), *(accept+(0 ..)); + */ +extern size_t strspn(char const *s, char const *accept); + +/*@ requires valid_string_src: valid_string(s); + requires valid_string_accept: valid_string(accept); + ensures + \result ≡ (char *)0 ∨ \base_addr(\result) ≡ \base_addr(\old(s)); + assigns \result; + assigns \result \from s, *(s+(0 ..)), *(accept+(0 ..)); + */ +extern char *strpbrk(char const *s, char const *accept); + +/*@ requires valid_string_haystack: valid_string(haystack); + requires valid_string_needle: valid_string(needle); + ensures + \result ≡ (char *)0 ∨ + (\base_addr(\result) ≡ \base_addr(\old(haystack)) ∧ + memcmp{Pre, Pre}(\result, \old(needle), strlen(\old(needle))) ≡ 0); + assigns \result; + assigns \result + \from haystack, *(haystack+(0 ..)), needle, *(needle+(0 ..)); + */ +extern char *strstr(char const *haystack, char const *needle); + +/*@ requires valid_string_src: valid_string_or_null(s); + requires valid_string_delim: valid_string(delim); + ensures + \result ≡ \null ∨ \base_addr(\result) ≡ \base_addr(\old(s)); + assigns \result; + assigns \result \from s, *(s+(0 ..)), *(delim+(0 ..)); + */ +extern char *strtok(char *s, char const *delim); + +/*@ requires + \valid(stringp) ∧ valid_string(*stringp) ∧ valid_string(delim); + assigns *stringp, \result; + assigns *stringp \from *(delim+(..)), *(*(stringp+(..))); + assigns \result \from *(delim+(..)), *(*(stringp+(..))); + */ +extern char *strsep(char **stringp, char const *delim); + +/*@ ensures valid_string(\result); + assigns \result; + assigns \result \from errnum; + */ +extern char *strerror(int errnum); + +/*@ requires valid_string_src: valid_string(src); + requires room_string: \valid(dest+(0 .. strlen(src))); + ensures strcmp(\old(dest), \old(src)) ≡ 0; + ensures \result ≡ \old(dest); + assigns *(dest+(0 .. strlen{Old}(src))), \result; + assigns *(dest+(0 .. strlen{Old}(src))) + \from *(src+(0 .. strlen{Old}(src))); + assigns \result \from dest; + */ +extern char *strcpy(char *dest, char const *src); + +/*@ requires valid_string_src: valid_string(src); + ensures \result ≡ \old(dest); + assigns *(dest+(0 .. n-1)), \result; + assigns *(dest+(0 .. n-1)) \from *(src+(0 .. n-1)); + assigns \result \from dest; + + behavior complete: + assumes strlen(src) < n; + ensures strcmp(\old(dest), \old(src)) ≡ 0; + + behavior partial: + assumes n ≤ strlen(src); + ensures memcmp{Post, Post}(\old(dest), \old(src), \old(n)) ≡ 0; + assigns *(dest+(0 .. n-1)); + */ +extern char *strncpy(char *dest, char const *src, size_t n); + +/*@ requires valid_string_src: valid_string(src); + requires valid_string_dst: valid_string(dest); + requires room_string: \valid(dest+(0 .. strlen(dest)+strlen(src))); + ensures strlen(\old(dest)) ≡ \old(strlen(dest)+strlen(src)); + ensures \result ≡ \old(dest); + assigns *(dest+(strlen{Old}(dest) .. strlen{Old}(dest)+strlen{Old}(src))), + \result; + assigns *(dest+(strlen{Old}(dest) .. strlen{Old}(dest)+strlen{Old}(src))) + \from *(src+(0 .. strlen{Old}(src))); + assigns \result \from dest; + */ +extern char *strcat(char *dest, char const *src); + +/*@ requires valid_string_src: valid_string(src) ∨ \valid(src+(0 .. n-1)); + requires valid_string_dst: valid_string(dest); + requires room_string: \valid(dest+(strlen(dest) .. strlen(dest)+n)); + ensures \result ≡ \old(dest); + assigns *(dest+(strlen{Old}(dest) .. strlen{Old}(dest)+n)), \result; + assigns *(dest+(strlen{Old}(dest) .. strlen{Old}(dest)+n)) + \from *(src+(0 .. n)); + assigns \result \from dest; + + behavior complete: + assumes valid_string(src) ∧ strlen(src) ≤ n; + ensures strlen(\old(dest)) ≡ \old(strlen(dest)+strlen(src)); + assigns *(dest+(strlen{Old}(dest) .. strlen{Old}(dest)+strlen{Old}(src))), + \result; + assigns + *(dest+(strlen{Old}(dest) .. strlen{Old}(dest)+strlen{Old}(src))) + \from *(src+(0 .. strlen{Old}(src))); + assigns \result \from dest; + + behavior partial: + assumes ¬(valid_string(src) ∧ strlen(src) ≤ n); + ensures strlen(\old(dest)) ≡ \old(strlen(dest))+\old(n); + assigns *(dest+(strlen{Old}(dest) .. strlen{Old}(dest)+n)), \result; + assigns *(dest+(strlen{Old}(dest) .. strlen{Old}(dest)+n)) + \from *(src+(0 .. strlen{Old}(src))); + assigns \result \from dest; + */ +extern char *strncat(char *dest, char const *src, size_t n); + +/*@ requires valid_dest: \valid(dest+(0 .. n-1)); + requires valid_string_src: valid_string(src); + assigns *(dest+(0 .. n-1)), \result; + assigns *(dest+(0 .. n-1)) \from *(src+(0 ..)), n; + assigns \result \from dest; + */ +extern size_t strxfrm(char *dest, char const *src, size_t n); + +/*@ requires valid_string_src: valid_string(s); + ensures + \valid(\result+(0 .. strlen(\old(s)))) ∧ + strcmp(\result, \old(s)) ≡ 0; + assigns \nothing; + */ +extern char *strdup(char const *s); + +/*@ requires valid_string_src: valid_string(s); + ensures + \valid(\result+(0 .. minimum(strlen(\old(s)), \old(n)))) ∧ + valid_string(\result) ∧ strlen(\result) ≤ \old(n) ∧ + strncmp(\result, \old(s), \old(n)) ≡ 0; + assigns \nothing; + */ +extern char *strndup(char const *s, size_t n); + +/*@ requires \valid((char *)s+(0 .. n-1)); + assigns *((char *)s+(0 .. n-1)); */ +extern void bzero(void *s, size_t n); + +unsigned int __fc_time_model __attribute__((__FRAMA_C_MODEL__)); +/*@ assigns __fc_time_model, \result; + assigns __fc_time_model \from __fc_time_model; + assigns \result \from __fc_time_model; + */ +extern clock_t clock(void); + +/*@ assigns \result; + assigns \result \from time1, time0; */ +extern double difftime(time_t time1, time_t time0); + +/*@ assigns *timeptr, \result; + assigns *timeptr \from *timeptr; + assigns \result \from *timeptr; + */ +extern time_t mktime(struct tm *timeptr); + +/*@ assigns __fc_time_model, *timer, \result; + assigns __fc_time_model \from __fc_time_model; + assigns *timer \from __fc_time_model; + assigns \result \from __fc_time_model; + */ +extern time_t time(time_t *timer); + +struct tm __fc_time_tm; +struct tm * const __fc_time_tm_ptr = & __fc_time_tm; +/*@ ensures \result ≡ &__fc_time_tm ∨ \result ≡ \null; + assigns \result, __fc_time_tm; + assigns \result \from __fc_time_tm_ptr; + assigns __fc_time_tm \from *timer; + */ +extern struct tm *gmtime(time_t const *timer); + +/*@ ensures \result ≡ &__fc_time_tm ∨ \result ≡ \null; + assigns \result, __fc_time_tm; + assigns \result \from __fc_time_tm_ptr; + assigns __fc_time_tm \from *timer; + */ +extern struct tm *localtime(time_t const *timer); + + +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/clash_double_file_bts1598.c (with preprocessing) +[kernel] Parsing tests/spec/result/foo.c (with preprocessing) +/* Generated by Frama-C */ +typedef unsigned int size_t; +struct option { + char const *name ; + int has_arg ; + int *flag ; + int val ; +}; +typedef long long intmax_t; +struct __anonstruct_imaxdiv_t_1 { + long long quot ; + long long rem ; +}; +typedef struct __anonstruct_imaxdiv_t_1 imaxdiv_t; +typedef int wchar_t; +struct lconv { + char *decimal_point ; + char *thousands_sep ; + char *grouping ; + char *int_curr_symbol ; + char *currency_symbol ; + char *mon_decimal_point ; + char *mon_thousands_sep ; + char *mon_grouping ; + char *positive_sign ; + char *negative_sign ; + char int_frac_digits ; + char frac_digits ; + char p_cs_precedes ; + char p_sep_by_space ; + char n_cs_precedes ; + char n_sep_by_space ; + char p_sign_posn ; + char n_sign_posn ; + char int_p_cs_precedes ; + char int_p_sep_by_space ; + char int_n_cs_precedes ; + char int_n_sep_by_space ; + char int_p_sign_posn ; + char int_n_sign_posn ; +}; +typedef unsigned int gid_t; +typedef unsigned int uid_t; +typedef __builtin_va_list va_list; +typedef unsigned int ino_t; +typedef long time_t; +typedef unsigned int blkcnt_t; +typedef unsigned int blksize_t; +typedef unsigned int dev_t; +typedef unsigned int mode_t; +typedef unsigned int nlink_t; +typedef long off_t; +struct stat { + dev_t st_dev ; + ino_t st_ino ; + mode_t st_mode ; + nlink_t st_nlink ; + uid_t st_uid ; + gid_t st_gid ; + dev_t st_rdev ; + off_t st_size ; + time_t st_atime ; + time_t st_mtime ; + time_t st_ctime ; + blksize_t st_blksize ; + blkcnt_t st_blocks ; +}; +struct __fc_pos_t { + unsigned long __fc_stdio_position ; +}; +typedef struct __fc_pos_t fpos_t; +struct __fc_FILE { + unsigned int __fc_stdio_id ; + fpos_t __fc_position ; + char __fc_error ; + char __fc_eof ; + int __fc_flags ; + struct stat *__fc_inode ; + unsigned char *__fc_real_data ; + int __fc_real_data_max_size ; +}; +typedef struct __fc_FILE FILE; +struct __fc_div_t { + int quot ; + int rem ; +}; +typedef struct __fc_div_t div_t; +struct __fc_ldiv_t { + long quot ; + long rem ; +}; +typedef struct __fc_ldiv_t ldiv_t; +struct __fc_lldiv_t { + long long quot ; + long long rem ; +}; +typedef struct __fc_lldiv_t lldiv_t; +typedef unsigned int clock_t; +struct tm { + int tm_sec ; + int tm_min ; + int tm_hour ; + int tm_mday ; + int tm_mon ; + int tm_year ; + int tm_wday ; + int tm_yday ; + int tm_isdst ; +}; +extern int Frama_C_entropy_source; + +/*@ requires \valid(p+(0 .. l-1)); + ensures \initialized(\old(p)+(0 .. \old(l)-1)); + assigns *(p+(0 .. l-1)), Frama_C_entropy_source; + assigns *(p+(0 .. l-1)) \from Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern void Frama_C_make_unknown(char *p, size_t l); + +/*@ ensures \result ≡ \old(a) ∨ \result ≡ \old(b); + assigns \result, Frama_C_entropy_source; + assigns \result \from a, b, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern int Frama_C_nondet(int a, int b); + +/*@ ensures \result ≡ \old(a) ∨ \result ≡ \old(b); + assigns \result, Frama_C_entropy_source; + assigns \result \from a, b, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern void *Frama_C_nondet_ptr(void *a, void *b); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern int Frama_C_interval(int min, int max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern int Frama_C_interval_split(int min, int max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern unsigned char Frama_C_unsigned_char_interval(unsigned char min, + unsigned char max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern char Frama_C_char_interval(char min, char max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern unsigned short Frama_C_unsigned_short_interval(unsigned short min, + unsigned short max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern short Frama_C_short_interval(short min, short max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern unsigned int Frama_C_unsigned_int_interval(unsigned int min, + unsigned int max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern int Frama_C_int_interval(int min, int max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern unsigned long Frama_C_unsigned_long_interval(unsigned long min, + unsigned long max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern long Frama_C_long_interval(long min, long max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern unsigned long long Frama_C_unsigned_long_long_interval(unsigned long long min, + unsigned long long max); + +/*@ ensures \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern long long Frama_C_long_long_interval(long long min, long long max); + +/*@ ensures \is_finite(\result) ∧ \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern float Frama_C_float_interval(float min, float max); + +/*@ ensures \is_finite(\result) ∧ \old(min) ≤ \result ≤ \old(max); + assigns \result, Frama_C_entropy_source; + assigns \result \from min, max, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern double Frama_C_double_interval(double min, double max); + +/*@ ensures *(\old(dest)+(0 .. \old(n))) ≡ *(\old(src)+(0 .. \old(n))); + assigns *(dest+(0 .. n-1)), \result; + assigns *(dest+(0 .. n-1)) \from *(src+(0 .. n-1)); + assigns \result \from dest; + */ +extern void *Frama_C_memcpy(char *dest, char const *src, unsigned long n); + +/*@ ensures \false; + assigns \nothing; */ +extern __attribute__((__noreturn__)) void Frama_C_abort(void); + +/*@ assigns *((char *)p+(0 .. s-1)); + assigns *((char *)p+(0 .. s-1)) \from c; + */ +extern void Frama_C_memset(void *p, int c, size_t s); + +/*@ terminates \false; + assigns \nothing; */ +extern void __FC_assert(char const *file, int line, char const *expr); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isalnum(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isalpha(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isblank(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int iscntrl(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isdigit(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isgraph(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int islower(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isprint(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int ispunct(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isspace(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isupper(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isxdigit(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int tolower(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int toupper(int c); + +/*@ assigns \result; + assigns \result \from c; */ +extern int isascii(int c); + +extern int __FC_errno; + +extern char *optarg; + +extern int optind; + +extern int opterr; + +extern int optopt; + +/*@ assigns \result, *optarg, optind, opterr, optopt; + assigns \result \from argc, *(argv+(0 .. argc-1)), *(optstring+(0 ..)); + assigns *optarg \from argc, *(argv+(0 .. argc-1)), *(optstring+(0 ..)); + assigns optind \from argc, *(argv+(0 .. argc-1)), *(optstring+(0 ..)); + assigns opterr \from argc, *(argv+(0 .. argc-1)), *(optstring+(0 ..)); + assigns optopt \from argc, *(argv+(0 .. argc-1)), *(optstring+(0 ..)); + */ +extern int getopt(int argc, char * const *argv, char const *optstring); + +/*@ assigns \result, *optarg, optind, opterr, optopt, + *((longopts+(0 ..))->flag); + assigns \result + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns *optarg + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns optind + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns opterr + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns optopt + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns *((longopts+(0 ..))->flag) + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + */ +extern int getopt_long(int argc, char * const *argv, char const *shortopts, + struct option const *longopts, int *longind); + +/*@ assigns \result, *optarg, optind, opterr, optopt, + *((longopts+(0 ..))->flag); + assigns \result + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns *optarg + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns optind + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns opterr + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns optopt + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + assigns *((longopts+(0 ..))->flag) + \from argc, *(argv+(0 .. argc-1)), *(shortopts+(0 ..)), + *(longopts+(0 ..)); + */ +extern int getopt_long_only(int argc, char * const *argv, + char const *shortopts, + struct option const *longopts, int *longind); + +/*@ requires (intmax_t)(-c) ≢ c; + assigns \result; + assigns \result \from c; + */ +extern intmax_t imaxabs(intmax_t c); + +/*@ requires denom ≢ 0; + ensures \result.quot ≡ \old(numer)/\old(denom); + ensures \result.rem ≡ \old(numer)%\old(denom); + assigns \result; + assigns \result \from numer, denom; + */ +extern imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom); + +/*@ assigns \result, *(endptr+(..)), __FC_errno; + assigns \result \from *(nptr+(..)), base; + assigns *(endptr+(..)) \from *(nptr+(..)), base; + assigns __FC_errno \from *(nptr+(..)), base; + */ +extern intmax_t strtoimax(char const *nptr, char **endptr, int base); + +/*@ +axiomatic MemCmp { + logic ℤ memcmp{L1, L2}(char *s1, char *s2, ℤ n) + reads \at(*(s1+(0 .. n-1)),L1), \at(*(s2+(0 .. n-1)),L2); + + axiom memcmp_zero{L1, L2}: + ∀ char *s1, char *s2; + ∀ ℤ n; + memcmp{L1, L2}(s1, s2, n) ≡ 0 ⇔ + (∀ ℤ i; 0 ≤ i < n ⇒ \at(*(s1+i),L1) ≡ \at(*(s2+i),L2)); + + } + */ +/*@ +axiomatic MemChr { + logic 𝔹 memchr{L}(char *s, ℤ c, ℤ n) ; + + axiom memchr_def{L}: + ∀ char *s; + ∀ ℤ c; + ∀ ℤ n; + memchr{L}(s, c, n) ≡ \true ⇔ + (∃ int i; 0 ≤ i < n ∧ *(s+i) ≡ c); + + } + */ +/*@ +axiomatic MemSet { + logic 𝔹 memset{L}(char *s, ℤ c, ℤ n) ; + + axiom memset_def{L}: + ∀ char *s; + ∀ ℤ c; + ∀ ℤ n; + memset{L}(s, c, n) ≡ \true ⇔ + (∀ ℤ i; 0 ≤ i < n ⇒ *(s+i) ≡ c); + + } + */ +/*@ +axiomatic StrLen { + logic ℤ strlen{L}(char *s) ; + + axiom strlen_pos_or_null{L}: + ∀ char *s; + ∀ ℤ i; + 0 ≤ i ∧ (∀ ℤ j; 0 ≤ j < i ⇒ *(s+j) ≢ '\000') ∧ + *(s+i) ≡ '\000' ⇒ strlen{L}(s) ≡ i; + + axiom strlen_neg{L}: + ∀ char *s; + (∀ ℤ i; 0 ≤ i ⇒ *(s+i) ≢ '\000') ⇒ strlen{L}(s) < 0; + + axiom strlen_before_null{L}: + ∀ char *s; + ∀ ℤ i; 0 ≤ i < strlen{L}(s) ⇒ *(s+i) ≢ '\000'; + + axiom strlen_at_null{L}: + ∀ char *s; 0 ≤ strlen{L}(s) ⇒ *(s+strlen{L}(s)) ≡ '\000'; + + axiom strlen_not_zero{L}: + ∀ char *s; + ∀ ℤ i; + 0 ≤ i ≤ strlen{L}(s) ∧ *(s+i) ≢ '\000' ⇒ i < strlen{L}(s); + + axiom strlen_zero{L}: + ∀ char *s; + ∀ ℤ i; + 0 ≤ i ≤ strlen{L}(s) ∧ *(s+i) ≡ '\000' ⇒ i ≡ strlen{L}(s); + + axiom strlen_sup{L}: + ∀ char *s; + ∀ ℤ i; 0 ≤ i ∧ *(s+i) ≡ '\000' ⇒ 0 ≤ strlen{L}(s) ≤ i; + + axiom strlen_shift{L}: + ∀ char *s; + ∀ ℤ i; 0 ≤ i ≤ strlen{L}(s) ⇒ strlen{L}(s+i) ≡ strlen{L}(s)-i; + + axiom strlen_create{L}: + ∀ char *s; + ∀ ℤ i; 0 ≤ i ∧ *(s+i) ≡ '\000' ⇒ 0 ≤ strlen{L}(s) ≤ i; + + axiom strlen_create_shift{L}: + ∀ char *s; + ∀ ℤ i; + ∀ ℤ k; + 0 ≤ k ≤ i ∧ *(s+i) ≡ '\000' ⇒ 0 ≤ strlen{L}(s+k) ≤ i-k; + + axiom memcmp_strlen_left{L}: + ∀ char *s1, char *s2; + ∀ ℤ n; + memcmp{L, L}(s1, s2, n) ≡ 0 ∧ strlen{L}(s1) < n ⇒ + strlen{L}(s1) ≡ strlen{L}(s2); + + axiom memcmp_strlen_right{L}: + ∀ char *s1, char *s2; + ∀ ℤ n; + memcmp{L, L}(s1, s2, n) ≡ 0 ∧ strlen{L}(s2) < n ⇒ + strlen{L}(s1) ≡ strlen{L}(s2); + + axiom memcmp_strlen_shift_left{L}: + ∀ char *s1, char *s2; + ∀ ℤ k, ℤ n; + memcmp{L, L}(s1, s2+k, n) ≡ 0 ≤ k ∧ strlen{L}(s1) < n ⇒ + 0 ≤ strlen{L}(s2) ≤ k+strlen{L}(s1); + + axiom memcmp_strlen_shift_right{L}: + ∀ char *s1, char *s2; + ∀ ℤ k, ℤ n; + memcmp{L, L}(s1+k, s2, n) ≡ 0 ≤ k ∧ strlen{L}(s2) < n ⇒ + 0 ≤ strlen{L}(s1) ≤ k+strlen{L}(s2); + + } + */ +/*@ +axiomatic StrCmp { + logic ℤ strcmp{L}(char *s1, char *s2) ; + + axiom strcmp_zero{L}: + ∀ char *s1, char *s2; + strcmp{L}(s1, s2) ≡ 0 ⇔ + strlen{L}(s1) ≡ strlen{L}(s2) ∧ + (∀ ℤ i; 0 ≤ i ≤ strlen{L}(s1) ⇒ *(s1+i) ≡ *(s2+i)); + + } + */ +/*@ +axiomatic StrNCmp { + logic ℤ strncmp{L}(char *s1, char *s2, ℤ n) ; + + axiom strncmp_zero{L}: + ∀ char *s1, char *s2; + ∀ ℤ n; + strncmp{L}(s1, s2, n) ≡ 0 ⇔ + (strlen{L}(s1) < n ∧ strcmp{L}(s1, s2) ≡ 0) ∨ + (∀ ℤ i; 0 ≤ i < n ⇒ *(s1+i) ≡ *(s2+i)); + + } + */ +/*@ +axiomatic StrChr { + logic 𝔹 strchr{L}(char *s, ℤ c) ; + + axiom strchr_def{L}: + ∀ char *s; + ∀ ℤ c; + strchr{L}(s, c) ≡ \true ⇔ + (∃ ℤ i; 0 ≤ i ≤ strlen{L}(s) ∧ *(s+i) ≡ c); + + } + */ +/*@ +axiomatic WcsLen { + logic ℤ wcslen{L}(wchar_t *s) ; + + axiom wcslen_pos_or_null{L}: + ∀ wchar_t *s; + ∀ ℤ i; + 0 ≤ i ∧ (∀ ℤ j; 0 ≤ j < i ⇒ *(s+j) ≢ 0) ∧ *(s+i) ≡ 0 ⇒ + wcslen{L}(s) ≡ i; + + axiom wcslen_neg{L}: + ∀ wchar_t *s; + (∀ ℤ i; 0 ≤ i ⇒ *(s+i) ≢ 0) ⇒ wcslen{L}(s) < 0; + + axiom wcslen_before_null{L}: + ∀ wchar_t *s; + ∀ int i; 0 ≤ i < wcslen{L}(s) ⇒ *(s+i) ≢ 0; + + axiom wcslen_at_null{L}: + ∀ wchar_t *s; 0 ≤ wcslen{L}(s) ⇒ *(s+wcslen{L}(s)) ≡ 0; + + axiom wcslen_not_zero{L}: + ∀ wchar_t *s; + ∀ int i; 0 ≤ i ≤ wcslen{L}(s) ∧ *(s+i) ≢ 0 ⇒ i < wcslen{L}(s); + + axiom wcslen_zero{L}: + ∀ wchar_t *s; + ∀ int i; + 0 ≤ i ≤ wcslen{L}(s) ∧ *(s+i) ≡ 0 ⇒ i ≡ wcslen{L}(s); + + axiom wcslen_sup{L}: + ∀ wchar_t *s; + ∀ int i; 0 ≤ i ∧ *(s+i) ≡ 0 ⇒ 0 ≤ wcslen{L}(s) ≤ i; + + axiom wcslen_shift{L}: + ∀ wchar_t *s; + ∀ int i; 0 ≤ i ≤ wcslen{L}(s) ⇒ wcslen{L}(s+i) ≡ wcslen{L}(s)-i; + + axiom wcslen_create{L}: + ∀ wchar_t *s; + ∀ int i; 0 ≤ i ∧ *(s+i) ≡ 0 ⇒ 0 ≤ wcslen{L}(s) ≤ i; + + axiom wcslen_create_shift{L}: + ∀ wchar_t *s; + ∀ int i; + ∀ int k; + 0 ≤ k ≤ i ∧ *(s+i) ≡ 0 ⇒ 0 ≤ wcslen{L}(s+k) ≤ i-k; + + } + */ +/*@ +axiomatic WcsCmp { + logic ℤ wcscmp{L}(wchar_t *s1, wchar_t *s2) ; + + axiom wcscmp_zero{L}: + ∀ wchar_t *s1, wchar_t *s2; + wcscmp{L}(s1, s2) ≡ 0 ⇔ + wcslen{L}(s1) ≡ wcslen{L}(s2) ∧ + (∀ ℤ i; 0 ≤ i ≤ wcslen{L}(s1) ⇒ *(s1+i) ≡ *(s2+i)); + + } + */ +/*@ +axiomatic WcsNCmp { + logic ℤ wcsncmp{L}(wchar_t *s1, wchar_t *s2, ℤ n) ; + + axiom wcsncmp_zero{L}: + ∀ wchar_t *s1, wchar_t *s2; + ∀ ℤ n; + wcsncmp{L}(s1, s2, n) ≡ 0 ⇔ + (wcslen{L}(s1) < n ∧ wcscmp{L}(s1, s2) ≡ 0) ∨ + (∀ ℤ i; 0 ≤ i < n ⇒ *(s1+i) ≡ *(s2+i)); + + } + */ +/*@ logic ℤ minimum(ℤ i, ℤ j) = i 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, edom; + */ +extern double acos(double x); + +/*@ behavior normal: + assumes \is_finite(x) ∧ \abs(x) ≤ 1; + ensures \is_finite(\result) ∧ \result ≥ 0; + assigns \nothing; + + behavior edom: + assumes \is_infinite(x) ∨ (\is_finite(x) ∧ \abs(x) > 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, edom; + */ +extern float acosf(float x); + +/*@ behavior normal: + assumes \is_finite(x) ∧ \abs(x) ≤ 1; + ensures \is_finite(\result) ∧ \result ≥ 0; + assigns \nothing; + + behavior edom: + assumes \is_infinite(x) ∨ (\is_finite(x) ∧ \abs(x) > 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, edom; + */ +extern long double acosl(long double x); + +/*@ behavior normal: + assumes \is_finite(x) ∧ \abs(x) ≤ 1; + ensures \is_finite(\result); + assigns \nothing; + + behavior edom: + assumes \is_infinite(x) ∨ (\is_finite(x) ∧ \abs(x) > 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, edom; + */ +extern double asin(double x); + +/*@ behavior normal: + assumes \is_finite(x) ∧ \abs(x) ≤ 1; + ensures \is_finite(\result); + assigns \nothing; + + behavior edom: + assumes \is_infinite(x) ∨ (\is_finite(x) ∧ \abs(x) > 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, edom; + */ +extern float asinf(float x); + +/*@ behavior normal: + assumes \is_finite(x) ∧ \abs(x) ≤ 1; + ensures \is_finite(\result); + assigns \nothing; + + behavior edom: + assumes \is_infinite(x) ∨ (\is_finite(x) ∧ \abs(x) > 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, edom; + */ +extern long double asinl(long double x); + +/*@ behavior normal: + assumes \is_finite(x) ∧ x ≥ 1; + ensures \is_finite(\result) ∧ \result ≥ 0; + assigns \nothing; + + behavior infinite: + assumes \is_plus_infinity(x); + ensures \is_plus_infinity(\result); + assigns \nothing; + + behavior edom: + assumes \is_minus_infinity(x) ∨ (\is_finite(x) ∧ x < 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, infinite, edom; + */ +extern double acosh(double x); + +/*@ behavior normal: + assumes \is_finite(x) ∧ x ≥ 1; + ensures \is_finite(\result) ∧ \result ≥ 0; + assigns \nothing; + + behavior infinite: + assumes \is_plus_infinity(x); + ensures \is_plus_infinity(\result); + assigns \nothing; + + behavior edom: + assumes \is_minus_infinity(x) ∨ (\is_finite(x) ∧ x < 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, infinite, edom; + */ +extern float acoshf(float x); + +/*@ behavior normal: + assumes \is_finite(x) ∧ x ≥ 1; + ensures \is_finite(\result) ∧ \result ≥ 0; + assigns \nothing; + + behavior infinite: + assumes \is_plus_infinity(x); + ensures \is_plus_infinity(\result); + assigns \nothing; + + behavior edom: + assumes \is_minus_infinity(x) ∨ (\is_finite(x) ∧ x < 1); + ensures __FC_errno ≡ 1; + assigns __FC_errno; + + disjoint behaviors normal, infinite, edom; + */ +extern long double acoshl(long double x); + +/*@ requires valid_string(tagp); + ensures \is_NaN(\result); + assigns \nothing; */ +extern double nan(char const *tagp); + +/*@ requires valid_string(tagp); + ensures \is_NaN(\result); + assigns \nothing; */ +extern float nanf(char const *tagp); + +/*@ requires valid_string(tagp); + ensures \is_NaN(\result); + assigns \nothing; */ +extern long double nanl(char const *tagp); + +/*@ assigns *(env+(0 .. 5)); */ +extern int setjmp(char * /*[5]*/ env); + +/*@ terminates \false; + assigns \nothing; */ +extern void longjmp(char * /*[5]*/ env, int val); + +/*@ assigns \nothing; */ +extern void (*signal(int sig, void (*func)(int )))(int ); + +/*@ ensures \false; + assigns \nothing; */ +extern int raise(int sig); + +extern FILE *__fc_stdin; + +extern FILE *__fc_stdout; + +/*@ assigns \nothing; */ +extern int remove(char const *filename); + +/*@ assigns \nothing; */ +extern int rename(char const *old, char const *new); + +/*@ ensures + \result ≡ \null ∨ + (\valid(\result) ∧ \fresh{Old, Here}(\result,sizeof(FILE))); + assigns \nothing; + */ +extern FILE *tmpfile(void); + +/*@ assigns \result, *(s+(..)); + assigns \result \from *(s+(..)); + assigns *(s+(..)) \from \nothing; + */ +extern char *tmpnam(char *s); + +/*@ ensures \result ≡ 0 ∨ \result ≡ -1; + assigns *stream; + assigns *stream \from \nothing; + */ +extern int fclose(FILE *stream); + +/*@ ensures \result ≡ 0 ∨ \result ≡ -1; + assigns *stream; + assigns *stream \from \nothing; + */ +extern int fflush(FILE *stream); + +FILE __fc_fopen[512]; +FILE const *_p__fc_fopen = (FILE const *)(__fc_fopen); +/*@ ensures + \result ≡ \null ∨ + (\valid(\result) ∧ \subset(\result, &__fc_fopen[0 ..])); + assigns \result; + assigns \result \from *(filename+(..)), *(mode+(..)), _p__fc_fopen; + */ +extern FILE *fopen(char const *filename, char const *mode); + +/*@ ensures + \result ≡ \null ∨ + (\valid(\result) ∧ \fresh{Old, Here}(\result,sizeof(FILE))); + assigns \result; + assigns \result \from fildes, *(mode+(..)); + */ +extern FILE *fdopen(int fildes, char const *mode); + +/*@ ensures \result ≡ \null ∨ \result ≡ \old(stream); + assigns *stream; + */ +extern FILE *freopen(char const *filename, char const *mode, FILE *stream); + +/*@ assigns *stream; + assigns *stream \from buf; */ +extern void setbuf(FILE *stream, char *buf); + +/*@ assigns *stream; + assigns *stream \from buf, mode, size; */ +extern int setvbuf(FILE *stream, char *buf, int mode, size_t size); + +/*@ assigns *stream; */ +extern int fprintf(FILE *stream, char const *format , ...); + +/*@ assigns *stream; */ +extern int fscanf(FILE *stream, char const *format , ...); + +/*@ assigns *__fc_stdout; + assigns *__fc_stdout \from *(format+(..)); */ +extern int printf(char const *format , ...); + +/*@ assigns *__fc_stdin; */ +extern int scanf(char const *format , ...); + +/*@ assigns *(s+(0 .. n-1)); */ +extern int snprintf(char *s, size_t n, char const *format , ...); + +/*@ assigns *(s+(0 ..)); */ +extern int sprintf(char *s, char const *format , ...); + +/*@ assigns *stream; + assigns *stream \from *(format+(..)), arg; */ +extern int vfprintf(FILE *stream, char const *format, va_list arg); + +/*@ assigns *stream; + assigns *stream \from *(format+(..)), *stream; */ +extern int vfscanf(FILE *stream, char const *format, va_list arg); + +/*@ assigns *__fc_stdout; + assigns *__fc_stdout \from arg; */ +extern int vprintf(char const *format, va_list arg); + +/*@ assigns *__fc_stdin; + assigns *__fc_stdin \from *(format+(..)); */ +extern int vscanf(char const *format, va_list arg); + +/*@ assigns *(s+(0 .. n-1)); + assigns *(s+(0 .. n-1)) \from *(format+(..)), arg; + */ +extern int vsnprintf(char *s, size_t n, char const *format, va_list arg); + +/*@ assigns *(s+(0 ..)); + assigns *(s+(0 ..)) \from *(format+(..)), arg; */ +extern int vsprintf(char *s, char const *format, va_list arg); + +/*@ assigns *stream; */ +extern int fgetc(FILE *stream); + +/*@ ensures \result ≡ \null ∨ \result ≡ \old(s); + assigns *(s+(0 .. n-1)), *stream, \result; + assigns *(s+(0 .. n-1)) \from *stream; + assigns *stream \from *stream; + assigns \result \from s, n, *stream; + */ +extern char *fgets(char *s, int n, FILE *stream); + +/*@ assigns *stream; */ +extern int fputc(int c, FILE *stream); + +/*@ assigns *stream; + assigns *stream \from *(s+(..)); */ +extern int fputs(char const *s, FILE *stream); + +/*@ assigns \result, *stream; + assigns \result \from *stream; + assigns *stream \from *stream; + */ +extern int getc(FILE *stream); + +/*@ assigns \result; + assigns \result \from *__fc_stdin; */ +extern int getchar(void); + +/*@ ensures \result ≡ \old(s) ∨ \result ≡ \null; + assigns *(s+(..)), \result; + assigns *(s+(..)) \from *__fc_stdin; + assigns \result \from s, __fc_stdin; + */ +extern char *gets(char *s); + +/*@ assigns *stream; + assigns *stream \from c; */ +extern int putc(int c, FILE *stream); + +/*@ assigns *__fc_stdout; + assigns *__fc_stdout \from c; */ +extern int putchar(int c); + +/*@ assigns *__fc_stdout; + assigns *__fc_stdout \from *(s+(..)); */ +extern int puts(char const *s); + +/*@ assigns *stream; + assigns *stream \from c; */ +extern int ungetc(int c, FILE *stream); + +/*@ assigns *((char *)ptr+(0 .. nmemb*size-1)); + assigns *((char *)ptr+(0 .. nmemb*size-1)) \from *stream; + */ +extern size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); + +/*@ assigns *stream; + assigns *stream \from *((char *)ptr+(0 .. nmemb*size-1)); + */ +extern size_t fwrite(void const *ptr, size_t size, size_t nmemb, FILE *stream); + +/*@ assigns *pos; + assigns *pos \from *stream; */ +extern int fgetpos(FILE *stream, fpos_t *pos); + +/*@ assigns *stream, __FC_errno; + assigns *stream \from offset, whence; */ +extern int fseek(FILE *stream, long offset, int whence); + +/*@ assigns *stream; + assigns *stream \from *pos; */ +extern int fsetpos(FILE *stream, fpos_t const *pos); + +/*@ assigns \result, __FC_errno; + assigns \result \from *stream; + assigns __FC_errno \from *stream; + */ +extern long ftell(FILE *stream); + +/*@ assigns *stream; + assigns *stream \from \nothing; */ +extern void rewind(FILE *stream); + +/*@ assigns *stream; + assigns *stream \from \nothing; */ +extern void clearerr(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int feof(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int fileno(FILE *stream); + +/*@ assigns *stream; + assigns *stream \from \nothing; */ +extern void flockfile(FILE *stream); + +/*@ assigns *stream; + assigns *stream \from \nothing; */ +extern void funlockfile(FILE *stream); + +/*@ assigns \result, *stream; + assigns \result \from \nothing; + assigns *stream \from \nothing; + */ +extern int ftrylockfile(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int ferror(FILE *stream); + +/*@ assigns __fc_stdout; + assigns __fc_stdout \from __FC_errno, *(s+(..)); */ +extern void perror(char const *s); + +/*@ assigns \result, *stream; + assigns \result \from *stream; + assigns *stream \from *stream; + */ +extern int getc_unlocked(FILE *stream); + +/*@ assigns \result; + assigns \result \from *__fc_stdin; */ +extern int getchar_unlocked(void); + +/*@ assigns *stream; + assigns *stream \from c; */ +extern int putc_unlocked(int c, FILE *stream); + +/*@ assigns *__fc_stdout; + assigns *__fc_stdout \from c; */ +extern int putchar_unlocked(int c); + +/*@ assigns *stream; + assigns *stream \from \nothing; */ +extern void clearerr_unlocked(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int feof_unlocked(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int ferror_unlocked(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int fileno_unlocked(FILE *stream); + +/*@ assigns \result; + assigns \result \from *(nptr+(..)); */ +extern double atof(char const *nptr); + +/*@ assigns \result; + assigns \result \from *(nptr+(..)); */ +extern int atoi(char const *nptr); + +/*@ assigns \result; + assigns \result \from *(nptr+(..)); */ +extern long atol(char const *nptr); + +/*@ assigns \result; + assigns \result \from *(nptr+(..)); */ +extern long long atoll(char const *nptr); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)); + assigns *endptr \from nptr, *(nptr+(0 ..)); + */ +extern double strtod(char const *nptr, char **endptr); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)); + assigns *endptr \from nptr, *(nptr+(0 ..)); + */ +extern float strtof(char const *nptr, char **endptr); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)); + assigns *endptr \from nptr, *(nptr+(0 ..)); + */ +extern long double strtold(char const *nptr, char **endptr); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)), base; + assigns *endptr \from nptr, *(nptr+(0 ..)), base; + */ +extern long strtol(char const *nptr, char **endptr, int base); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)), base; + assigns *endptr \from nptr, *(nptr+(0 ..)), base; + */ +extern long long strtoll(char const *nptr, char **endptr, int base); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)), base; + assigns *endptr \from nptr, *(nptr+(0 ..)), base; + */ +extern unsigned long strtoul(char const *nptr, char **endptr, int base); + +/*@ assigns \result, *endptr; + assigns \result \from *(nptr+(0 ..)), base; + assigns *endptr \from nptr, *(nptr+(0 ..)), base; + */ +extern unsigned long long strtoull(char const *nptr, char **endptr, int base); + +int __fc_random_counter __attribute__((__unused__, __FRAMA_C_MODEL__)); +unsigned long const __fc_rand_max = (unsigned long)32767; +/*@ ensures 0 ≤ \result ≤ __fc_rand_max; + assigns \result, __fc_random_counter; + assigns \result \from __fc_random_counter; + assigns __fc_random_counter \from __fc_random_counter; + */ +extern int rand(void); + +/*@ assigns __fc_random_counter; + assigns __fc_random_counter \from seed; */ +extern void srand(unsigned int seed); + +/*@ ghost extern int __fc_heap_status __attribute__((__FRAMA_C_MODEL__)); */ + +/*@ +axiomatic dynamic_allocation { + predicate is_allocable{L}(size_t n) + reads __fc_heap_status; + + } + */ +/*@ assigns __fc_heap_status, \result; + assigns __fc_heap_status \from size, __fc_heap_status; + assigns \result \from size, __fc_heap_status; + allocates \result; + + behavior allocation: + assumes is_allocable(size); + ensures \fresh{Old, Here}(\result,\old(size)); + assigns __fc_heap_status, \result; + assigns __fc_heap_status \from size, __fc_heap_status; + assigns \result \from size, __fc_heap_status; + + behavior no_allocation: + assumes ¬is_allocable(size); + ensures \result ≡ \null; + assigns \result; + assigns \result \from \nothing; + allocates \nothing; + + complete behaviors no_allocation, allocation; + disjoint behaviors no_allocation, allocation; + */ +extern void *malloc(size_t size); + +/*@ assigns __fc_heap_status; + assigns __fc_heap_status \from __fc_heap_status; + frees p; + + behavior deallocation: + assumes p ≢ \null; + requires freeable: \freeable(p); + ensures \allocable(\old(p)); + assigns __fc_heap_status; + assigns __fc_heap_status \from __fc_heap_status; + + behavior no_deallocation: + assumes p ≡ \null; + assigns \nothing; + allocates \nothing; + + complete behaviors no_deallocation, deallocation; + disjoint behaviors no_deallocation, deallocation; + */ +extern void free(void *p); + +/*@ ensures \false; + assigns \nothing; */ +extern void abort(void); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int atexit(void (*func)(void)); + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int at_quick_exit(void (*func)(void)); + +/*@ ensures \false; + assigns \nothing; */ +extern void exit(int status); + +/*@ ensures \false; + assigns \nothing; */ +extern void _Exit(int status); + +/*@ ensures \result ≡ \null ∨ \valid(\result); + assigns \result; + assigns \result \from name; + */ +extern char *getenv(char const *name); + +/*@ ensures \false; + assigns \nothing; */ +extern void quick_exit(int status); + +/*@ assigns \result; + assigns \result \from *(string+(..)); */ +extern int system(char const *string); + +/*@ assigns *((char *)\result+(..)); + assigns *((char *)\result+(..)) + \from *((char *)key+(..)), *((char *)base+(..)), nmemb, size, *compar; + */ +extern void *bsearch(void const *key, void const *base, size_t nmemb, + size_t size, int (*compar)(void const *, void const *)); + +/*@ assigns *((char *)base+(..)); + assigns *((char *)base+(..)) + \from *((char *)base+(..)), nmemb, size, *compar; + */ +extern void qsort(void *base, size_t nmemb, size_t size, + int (*compar)(void const *, void const *)); + +/*@ requires abs_representable: (int)(-j) ≡ -j; + assigns \result; + assigns \result \from j; + */ +extern int abs(int j); + +/*@ requires abs_representable: (long)(-j) ≡ -j; + assigns \result; + assigns \result \from j; + */ +extern long labs(long j); + +/*@ requires abs_representable: (long long)(-j) ≡ -j; + assigns \result; + assigns \result \from j; + */ +extern long long llabs(long long j); + +/*@ assigns \result; + assigns \result \from numer, denom; */ +extern div_t div(int numer, int denom); + +/*@ assigns \result; + assigns \result \from numer, denom; */ +extern ldiv_t ldiv(long numer, long denom); + +/*@ assigns \result; + assigns \result \from numer, denom; */ +extern lldiv_t lldiv(long long numer, long long denom); + +/*@ assigns \result; + assigns \result \from *(s+(0 ..)), n; */ +extern int mblen(char const *s, size_t n); + +/*@ assigns \result, *(pwc+(0 .. n-1)); + assigns \result \from *(s+(0 .. n-1)), n; + assigns *(pwc+(0 .. n-1)) \from *(s+(0 .. n-1)), n; + */ +extern int mbtowc(wchar_t *pwc, char const *s, size_t n); + +/*@ assigns \result, *(s+(0 ..)); + assigns \result \from wc; + assigns *(s+(0 ..)) \from wc; + */ +extern int wctomb(char *s, wchar_t wc); + +/*@ assigns \result, *(pwcs+(0 .. n-1)); + assigns \result \from *(s+(0 .. n-1)), n; + assigns *(pwcs+(0 .. n-1)) \from *(s+(0 .. n-1)), n; + */ +extern size_t mbstowcs(wchar_t *pwcs, char const *s, size_t n); + +/*@ assigns \result, *(s+(0 .. n-1)); + assigns \result \from *(pwcs+(0 .. n-1)), n; + assigns *(s+(0 .. n-1)) \from *(pwcs+(0 .. n-1)), n; + */ +extern size_t wcstombs(char *s, wchar_t const *pwcs, size_t n); + +/*@ requires \valid_read((char *)s1+(0 .. n-1)); + requires \valid_read((char *)s2+(0 .. n-1)); + ensures + \result ≡ + memcmp{Pre, Pre}((char *)\old(s1), (char *)\old(s2), \old(n)); + assigns \result; + assigns \result \from *((char *)s1+(0 .. n-1)), *((char *)s2+(0 .. n-1)); + */ +extern int memcmp(void const *s1, void const *s2, size_t n); + +/*@ requires \valid_read((char *)s+(0 .. n-1)); + assigns \result; + assigns \result \from s, c, *((char *)s+(0 .. n-1)); + + behavior found: + assumes memchr((char *)s, c, n) ≡ \true; + ensures \base_addr(\result) ≡ \base_addr(\old(s)); + ensures (int)*((char *)\result) ≡ \old(c); + + behavior not_found: + assumes ¬(memchr((char *)s, c, n) ≡ \true); + ensures \result ≡ \null; + */ +extern void *memchr(void const *s, int c, size_t n); + +/*@ requires valid_dst: \valid((char *)dest+(0 .. n-1)); + requires valid_src: \valid_read((char *)src+(0 .. n-1)); + requires \separated((char *)dest+(0 .. n-1), (char *)src+(0 .. n-1)); + ensures + memcmp{Post, Pre}((char *)\old(dest), (char *)\old(src), \old(n)) ≡ 0; + ensures \result ≡ \old(dest); + assigns *((char *)dest+(0 .. n-1)), \result; + assigns *((char *)dest+(0 .. n-1)) \from *((char *)src+(0 .. n-1)); + assigns \result \from dest; + */ +extern void *memcpy(void *dest, void const *src, size_t n); + +/*@ requires valid_dst: \valid((char *)dest+(0 .. n-1)); + requires valid_src: \valid_read((char *)src+(0 .. n-1)); + ensures + memcmp{Post, Pre}((char *)\old(dest), (char *)\old(src), \old(n)) ≡ 0; + ensures \result ≡ \old(dest); + assigns *((char *)dest+(0 .. n-1)), \result; + assigns *((char *)dest+(0 .. n-1)) \from *((char *)src+(0 .. n-1)); + assigns \result \from dest; + */ +extern void *memmove(void *dest, void const *src, size_t n); + +/*@ requires \valid((char *)s+(0 .. n-1)); + ensures memset((char *)\old(s), \old(c), \old(n)) ≡ \true; + ensures \result ≡ \old(s); + assigns *((char *)s+(0 .. n-1)), \result; + assigns *((char *)s+(0 .. n-1)) \from c; + assigns \result \from s; + */ +extern void *memset(void *s, int c, size_t n); + +/*@ requires valid_string_src: valid_string(s); + ensures \result ≡ strlen(\old(s)); + assigns \result; + assigns \result \from *(s+(0 ..)); + */ +extern size_t strlen(char const *s); + +/*@ requires valid_string_src: valid_string(s); + ensures \result ≡ strlen(\old(s)) ∨ \result ≡ \old(n); + assigns \result; + assigns \result \from *(s+(0 ..)); + */ +extern size_t strnlen(char const *s, size_t n); + +/*@ requires valid_string_s1: valid_string(s1); + requires valid_string_s2: valid_string(s2); + ensures \result ≡ strcmp(\old(s1), \old(s2)); + assigns \result; + assigns \result \from *(s1+(0 ..)), *(s2+(0 ..)); + */ +extern int strcmp(char const *s1, char const *s2); + +/*@ requires valid_string_s1: valid_string(s1); + requires valid_string_s2: valid_string(s2); + ensures \result ≡ strncmp(\old(s1), \old(s2), \old(n)); + assigns \result; + assigns \result \from *(s1+(0 .. n-1)), *(s2+(0 .. n-1)); + */ +extern int strncmp(char const *s1, char const *s2, size_t n); + +/*@ requires valid_string_s1: valid_string(s1); + requires valid_string_s2: valid_string(s2); + assigns \result; + assigns \result \from *(s1+(0 ..)), *(s2+(0 ..)); + */ +extern int strcoll(char const *s1, char const *s2); + +/*@ requires valid_string_src: valid_string(s); + assigns \result; + assigns \result \from s, *(s+(0 ..)), c; + + behavior found: + assumes strchr(s, c) ≡ \true; + ensures (int)*\result ≡ \old(c); + ensures \base_addr(\result) ≡ \base_addr(\old(s)); + ensures \old(s) ≤ \result < \old(s)+strlen(\old(s)); + ensures valid_string(\result); + ensures ∀ char *p; \old(s) ≤ p < \result ⇒ (int)*p ≢ \old(c); + + behavior not_found: + assumes ¬(strchr(s, c) ≡ \true); + ensures \result ≡ \null; + + behavior default: + ensures + \result ≡ \null ∨ \base_addr(\result) ≡ \base_addr(\old(s)); + */ +extern char *strchr(char const *s, int c); + +/*@ requires valid_string_src: valid_string(s); + assigns \result; + assigns \result \from s, *(s+(0 ..)), c; + + behavior found: + assumes strchr(s, c) ≡ \true; + ensures (int)*\result ≡ \old(c); + ensures \base_addr(\result) ≡ \base_addr(\old(s)); + ensures valid_string(\result); + + behavior not_found: + assumes ¬(strchr(s, c) ≡ \true); + ensures \result ≡ \null; + + behavior default: + ensures + \result ≡ \null ∨ \base_addr(\result) ≡ \base_addr(\old(s)); + */ +extern char *strrchr(char const *s, int c); + +/*@ requires valid_string_src: valid_string(s); + requires valid_string_reject: valid_string(reject); + ensures 0 ≤ \result ≤ strlen(\old(s)); + assigns \result; + assigns \result \from *(s+(0 ..)), *(reject+(0 ..)); + */ +extern size_t strcspn(char const *s, char const *reject); + +/*@ requires valid_string_src: valid_string(s); + requires valid_string_accept: valid_string(accept); + ensures 0 ≤ \result ≤ strlen(\old(s)); + assigns \result; + assigns \result \from *(s+(0 ..)), *(accept+(0 ..)); + */ +extern size_t strspn(char const *s, char const *accept); + +/*@ requires valid_string_src: valid_string(s); + requires valid_string_accept: valid_string(accept); + ensures + \result ≡ (char *)0 ∨ \base_addr(\result) ≡ \base_addr(\old(s)); + assigns \result; + assigns \result \from s, *(s+(0 ..)), *(accept+(0 ..)); + */ +extern char *strpbrk(char const *s, char const *accept); + +/*@ requires valid_string_haystack: valid_string(haystack); + requires valid_string_needle: valid_string(needle); + ensures + \result ≡ (char *)0 ∨ + (\base_addr(\result) ≡ \base_addr(\old(haystack)) ∧ + memcmp{Pre, Pre}(\result, \old(needle), strlen(\old(needle))) ≡ 0); + assigns \result; + assigns \result + \from haystack, *(haystack+(0 ..)), needle, *(needle+(0 ..)); + */ +extern char *strstr(char const *haystack, char const *needle); + +/*@ requires valid_string_src: valid_string_or_null(s); + requires valid_string_delim: valid_string(delim); + ensures + \result ≡ \null ∨ \base_addr(\result) ≡ \base_addr(\old(s)); + assigns \result; + assigns \result \from s, *(s+(0 ..)), *(delim+(0 ..)); + */ +extern char *strtok(char *s, char const *delim); + +/*@ requires + \valid(stringp) ∧ valid_string(*stringp) ∧ valid_string(delim); + assigns *stringp, \result; + assigns *stringp \from *(delim+(..)), *(*(stringp+(..))); + assigns \result \from *(delim+(..)), *(*(stringp+(..))); + */ +extern char *strsep(char **stringp, char const *delim); + +/*@ ensures valid_string(\result); + assigns \result; + assigns \result \from errnum; + */ +extern char *strerror(int errnum); + +/*@ requires valid_string_src: valid_string(src); + requires room_string: \valid(dest+(0 .. strlen(src))); + ensures strcmp(\old(dest), \old(src)) ≡ 0; + ensures \result ≡ \old(dest); + assigns *(dest+(0 .. strlen{Old}(src))), \result; + assigns *(dest+(0 .. strlen{Old}(src))) + \from *(src+(0 .. strlen{Old}(src))); + assigns \result \from dest; + */ +extern char *strcpy(char *dest, char const *src); + +/*@ requires valid_string_src: valid_string(src); + ensures \result ≡ \old(dest); + assigns *(dest+(0 .. n-1)), \result; + assigns *(dest+(0 .. n-1)) \from *(src+(0 .. n-1)); + assigns \result \from dest; + + behavior complete: + assumes strlen(src) < n; + ensures strcmp(\old(dest), \old(src)) ≡ 0; + + behavior partial: + assumes n ≤ strlen(src); + ensures memcmp{Post, Post}(\old(dest), \old(src), \old(n)) ≡ 0; + assigns *(dest+(0 .. n-1)); + */ +extern char *strncpy(char *dest, char const *src, size_t n); + +/*@ requires valid_string_src: valid_string(src); + requires valid_string_dst: valid_string(dest); + requires room_string: \valid(dest+(0 .. strlen(dest)+strlen(src))); + ensures strlen(\old(dest)) ≡ \old(strlen(dest)+strlen(src)); + ensures \result ≡ \old(dest); + assigns *(dest+(strlen{Old}(dest) .. strlen{Old}(dest)+strlen{Old}(src))), + \result; + assigns *(dest+(strlen{Old}(dest) .. strlen{Old}(dest)+strlen{Old}(src))) + \from *(src+(0 .. strlen{Old}(src))); + assigns \result \from dest; + */ +extern char *strcat(char *dest, char const *src); + +/*@ requires valid_string_src: valid_string(src) ∨ \valid(src+(0 .. n-1)); + requires valid_string_dst: valid_string(dest); + requires room_string: \valid(dest+(strlen(dest) .. strlen(dest)+n)); + ensures \result ≡ \old(dest); + assigns *(dest+(strlen{Old}(dest) .. strlen{Old}(dest)+n)), \result; + assigns *(dest+(strlen{Old}(dest) .. strlen{Old}(dest)+n)) + \from *(src+(0 .. n)); + assigns \result \from dest; + + behavior complete: + assumes valid_string(src) ∧ strlen(src) ≤ n; + ensures strlen(\old(dest)) ≡ \old(strlen(dest)+strlen(src)); + assigns *(dest+(strlen{Old}(dest) .. strlen{Old}(dest)+strlen{Old}(src))), + \result; + assigns + *(dest+(strlen{Old}(dest) .. strlen{Old}(dest)+strlen{Old}(src))) + \from *(src+(0 .. strlen{Old}(src))); + assigns \result \from dest; + + behavior partial: + assumes ¬(valid_string(src) ∧ strlen(src) ≤ n); + ensures strlen(\old(dest)) ≡ \old(strlen(dest))+\old(n); + assigns *(dest+(strlen{Old}(dest) .. strlen{Old}(dest)+n)), \result; + assigns *(dest+(strlen{Old}(dest) .. strlen{Old}(dest)+n)) + \from *(src+(0 .. strlen{Old}(src))); + assigns \result \from dest; + */ +extern char *strncat(char *dest, char const *src, size_t n); + +/*@ requires valid_dest: \valid(dest+(0 .. n-1)); + requires valid_string_src: valid_string(src); + assigns *(dest+(0 .. n-1)), \result; + assigns *(dest+(0 .. n-1)) \from *(src+(0 ..)), n; + assigns \result \from dest; + */ +extern size_t strxfrm(char *dest, char const *src, size_t n); + +/*@ requires valid_string_src: valid_string(s); + ensures + \valid(\result+(0 .. strlen(\old(s)))) ∧ + strcmp(\result, \old(s)) ≡ 0; + assigns \nothing; + */ +extern char *strdup(char const *s); + +/*@ requires valid_string_src: valid_string(s); + ensures + \valid(\result+(0 .. minimum(strlen(\old(s)), \old(n)))) ∧ + valid_string(\result) ∧ strlen(\result) ≤ \old(n) ∧ + strncmp(\result, \old(s), \old(n)) ≡ 0; + assigns \nothing; + */ +extern char *strndup(char const *s, size_t n); + +/*@ requires \valid((char *)s+(0 .. n-1)); + assigns *((char *)s+(0 .. n-1)); */ +extern void bzero(void *s, size_t n); + +unsigned int __fc_time_model __attribute__((__FRAMA_C_MODEL__)); +/*@ assigns __fc_time_model, \result; + assigns __fc_time_model \from __fc_time_model; + assigns \result \from __fc_time_model; + */ +extern clock_t clock(void); + +/*@ assigns \result; + assigns \result \from time1, time0; */ +extern double difftime(time_t time1, time_t time0); + +/*@ assigns *timeptr, \result; + assigns *timeptr \from *timeptr; + assigns \result \from *timeptr; + */ +extern time_t mktime(struct tm *timeptr); + +/*@ assigns __fc_time_model, *timer, \result; + assigns __fc_time_model \from __fc_time_model; + assigns *timer \from __fc_time_model; + assigns \result \from __fc_time_model; + */ +extern time_t time(time_t *timer); + +struct tm __fc_time_tm; +struct tm * const __fc_time_tm_ptr = & __fc_time_tm; +/*@ ensures \result ≡ &__fc_time_tm ∨ \result ≡ \null; + assigns \result, __fc_time_tm; + assigns \result \from __fc_time_tm_ptr; + assigns __fc_time_tm \from *timer; + */ +extern struct tm *gmtime(time_t const *timer); + +/*@ ensures \result ≡ &__fc_time_tm ∨ \result ≡ \null; + assigns \result, __fc_time_tm; + assigns \result \from __fc_time_tm_ptr; + assigns __fc_time_tm \from *timer; + */ +extern struct tm *localtime(time_t const *timer); + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/comparison.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/comparison.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/comparison.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/comparison.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,20 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/comparison.i (no preprocessing) +[kernel] Predicate comparison between 0 of type ℤ and i of type ℤ +[kernel] Predicate comparison between i of type ℤ and \old(n) of type ℤ +[kernel] Predicate comparison between *(\old(dest)+i) of type ℤ and 0 of type ℤ +[kernel] Predicate comparison between n of type ℤ and 1 of type ℤ +[kernel] Predicate comparison between 0 of type ℤ and i of type ℤ +[kernel] Predicate comparison between i of type ℤ and \old(size) of type ℤ +[kernel] Predicate comparison between 1 of type ℤ and j of type ℤ +[kernel] Predicate comparison between j of type ℤ and \old(n) of type ℤ +[kernel] Predicate comparison between *(\old(dest)+(i+j*\old(size))) of type unsigned char and * + (\old(dest)+i) of type unsigned char +[kernel] Predicate comparison between a of type 𝔹 and b of type 𝔹 +[kernel] Predicate comparison between x of type int and y of type int +[kernel] Predicate comparison between (long)x of type long and z of type long +[kernel] Predicate comparison between (long)x of type long and z of type long +[kernel] Term comparison between x of type int and y of type int +[kernel] Term comparison between (long)x of type long and z of type long +[kernel] Term comparison between z of type long and (long)y of type long +[kernel] Term comparison between y of type int and x of type int diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/complete_behaviors.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/complete_behaviors.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/complete_behaviors.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/complete_behaviors.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/complete_behaviors.c (with preprocessing) +/* Generated by Frama-C */ +enum __anonenum_kind_1 { + Max = 0, + Min = 1 +}; +typedef enum __anonenum_kind_1 kind; +/*@ requires k ≡ Max ∨ k ≡ Min; + ensures \result ≡ \old(x) ∨ \result ≡ \old(y); + assigns \nothing; + + behavior is_max: + assumes k ≡ Max; + ensures \result ≥ \old(x) ∧ \result ≥ \old(y); + + behavior is_min: + assumes k ≡ Min; + ensures \result ≤ \old(x) ∧ \result ≤ \old(y); + + complete behaviors is_max, is_min; + disjoint behaviors is_max, is_min; + */ +int extremum(kind k, int x, int y) +{ + int tmp_0; + int tmp; + if (k == (unsigned int)Max) tmp = x > y; else tmp = x < y; + if (tmp) tmp_0 = x; else tmp_0 = y; + return tmp_0; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/concrete_type.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/concrete_type.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/concrete_type.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/concrete_type.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/concrete_type.c (with preprocessing) +/* Generated by Frama-C */ +/*@ type list = Nil | Cons(A, list ); + */ +/*@ +axiomatic length { + logic ℤ length(list l) ; + + axiom length_empty: length(Nil) ≡ 0; + + axiom length_cons: + ∀ D a, list l; length(Cons(a, l)) ≡ length(l)+1; + + } + */ +/*@ type my_list = list<ℤ> ; + */ +/*@ logic my_list foo= Cons(1, Nil); + */ +/*@ type other_list = list ; + */ +/*@ logic other_list bar= Cons((int)42, Nil); + */ +/*@ lemma foo: length(bar) ≡ length(foo); + */ +/*@ type my_int = int; + */ +/*@ logic my_int x= (int)42; + */ +/*@ lemma baz: x+1 ≡ 43; + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/constant_predicate.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/constant_predicate.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/constant_predicate.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/constant_predicate.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/constant_predicate.i (no preprocessing) +/* Generated by Frama-C */ +int x; +/*@ predicate P{A}= x ≡ 42; + */ +/*@ logic ℤ f{B}= x+42; + */ +/*@ lemma foo{C}: P{C} ⇒ f{C} ≡ 84; + */ +/*@ ensures f ≡ 84; */ +void g(void) +{ + x = 42; + /*@ assert P; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/const_ptr_bts1729.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/const_ptr_bts1729.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/const_ptr_bts1729.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/const_ptr_bts1729.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,10 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/const_ptr_bts1729.i (no preprocessing) +/* Generated by Frama-C */ +static void elem_size(void) +{ + /*@ assert \valid_read((char **)0); */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/const.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/const.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/const.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/const.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,14 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/const.c (with preprocessing) +tests/spec/const.c:1:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +/* Generated by Frama-C */ +/*@ logic ℤ strlen(char *c) ; + */ +/*@ requires strlen(c) < n; + ensures strlen(\old(a)) ≤ \old(n); */ +void f(char const *c, char * __restrict a, int n) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/contract_assert_bts1470.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/contract_assert_bts1470.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/contract_assert_bts1470.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/contract_assert_bts1470.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,18 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/contract_assert_bts1470.i (no preprocessing) +/* Generated by Frama-C */ +int x; +void main(void) +{ + /*@ ensures \false; */ + /*@ assert \true; */ + x = 1; + /*@ ensures \false; */ + { + /*@ assert \true; */ ; + x = 1; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/conversion.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/conversion.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/conversion.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/conversion.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,50 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/conversion.c (with preprocessing) +/* Generated by Frama-C */ +typedef int T; +typedef int T4[4]; +typedef int *T_PTR; +typedef T_PTR T_PTR_T4[4]; +void f(void); + +/*@ lemma foo: 1.0 ≡ (float)1; + */ +/*@ axiomatic toto { + logic ℤ g; + + predicate foo(ℝ x) ; + + } + */ +/*@ ensures 1.0 ≡ 1; */ +void f(void) +{ + double B; + /*@ assert B ≡ g; */ ; + return; +} + +/*@ ensures foo(\result); */ +int g(void) +{ + int __retres; + __retres = 0; + return __retres; +} + +T const X; +T const Tab[4]; +T_PTR_T4 const Tab_Ptr = {(int *)(& X), (int *)(& X), (int *)(& X), + (int *)(& X)}; +/*@ +axiomatic useless_logic_cast { + logic int vX{L}= X; + + logic int [4] vTab{L}= Tab; + + logic T_PTR_T4 * vTab_Ptr{L}= \at(&Tab_Ptr,L); + + } + +*/ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/declspec.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/declspec.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/declspec.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/declspec.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,17 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/declspec.c (with preprocessing) +/* Generated by Frama-C */ +/*@ axiomatic Foo { + predicate p(char *s) ; + + } + */ +/*@ requires p(b); */ +void f(char const * __attribute__((__whatever__)) a, + char * __attribute__((__p__)) b) +{ + /*@ assert p((char *)b); */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/default_assigns_bts0966.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/default_assigns_bts0966.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/default_assigns_bts0966.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/default_assigns_bts0966.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,57 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/default_assigns_bts0966.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + auto_states[0..3] ∈ {0} +[value] computing for function copy <- main. + Called from tests/spec/default_assigns_bts0966.i:34. +tests/spec/default_assigns_bts0966.i:34:[kernel] warning: No code nor implicit assigns clause for function copy, generating default assigns from the specification +[value] using specification for function copy +tests/spec/default_assigns_bts0966.i:20:[value] warning: no \from part for clause 'assigns auto_states[Init], auto_states[Copy];' of + function copy +[value] Done for function copy +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + auto_states[0] ∈ {0} + [1] ∈ {1} + [2..3] ∈ {0} + __retres ∈ {0} +/* Generated by Frama-C */ +enum states { + Init = 0, + Copy = 1, + Set = 2, + Final = 3 +}; +int auto_states[4]; +/*@ ensures \true; + assigns auto_states[Init], auto_states[Copy]; + + behavior from_init: + assumes auto_states[Init] ≡ 1; + ensures auto_states[Copy] ≡ 1 ∧ auto_states[Init] ≡ 0; + assigns auto_states[Init], auto_states[Copy]; + + behavior from_other: + assumes auto_states[Init] ≡ 0; + assigns \nothing; + */ +extern void copy(int x); + +int main(void) +{ + int __retres; + auto_states[Init] = 1; + auto_states[Copy] = 0; + auto_states[Set] = 0; + auto_states[Final] = 0; + copy(0); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/doxygen.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/doxygen.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/doxygen.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/doxygen.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,98 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/doxygen.c (with preprocessing) +/* Generated by Frama-C */ +/* ************************************************************************ */ +/* */ +/* This file is part of Frama-C. */ +/* */ +/* Copyright (C) 2007-2015 */ +/* 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). */ +/* */ +/* ************************************************************************ */ +/* Functions used internally by the normalization phase. */ +/* This file is systematically included by Frama-C's kernel. */ +/* FC's code normalization can use some of the functions declared here. */ +/* If you add something here, be sure to use the FC_BUILTIN attribute, */ +/* that will ensure that the builtin is printed iff it is actually used */ +/* in the normalized code. */ +/* run.config + OPT: -keep-comments -print -then -pp-annot + */ +/* @{ */ +/* @{ Bla */ +/* @{ */ +/* @{ Blu */ +void doxygen_group(void) +{ + return; +} + +/* @} Bli */ +/* @} */ +/* @} */ +/* @} Bly */ +extern void main(); + + +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/doxygen.c (with preprocessing) +/* Generated by Frama-C */ +/* ************************************************************************ */ +/* */ +/* This file is part of Frama-C. */ +/* */ +/* Copyright (C) 2007-2015 */ +/* 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). */ +/* */ +/* ************************************************************************ */ +/* Functions used internally by the normalization phase. */ +/* This file is systematically included by Frama-C's kernel. */ +/* FC's code normalization can use some of the functions declared here. */ +/* If you add something here, be sure to use the FC_BUILTIN attribute, */ +/* that will ensure that the builtin is printed iff it is actually used */ +/* in the normalized code. */ +/* run.config + OPT: -keep-comments -print -then -pp-annot + */ +/* @{ */ +/* @{ Bla */ +/* @{ */ +/* @{ Blu */ +void doxygen_group(void) +{ + return; +} + +/* @} Bli */ +/* @} */ +/* @} */ +/* @} Bly */ +extern void main(); + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/enum.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/enum.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/enum.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/enum.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/enum.c (with preprocessing) +/* Generated by Frama-C */ +enum __anonenum_T_BOOLEEN_1 { + VRAI = 1, + FALSE = 0 +}; +typedef enum __anonenum_T_BOOLEEN_1 T_BOOLEEN; +/*@ logic T_BOOLEEN test(ℤ b) = b≡1? VRAI: FALSE; + */ +/*@ ensures \result ≡ test(\old(boo)); */ +T_BOOLEEN test(int boo) +{ + T_BOOLEEN b; + if (boo == 1) b = VRAI; else b = FALSE; + return b; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/error_msg.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/error_msg.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/error_msg.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/error_msg.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,6 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/error_msg.i (no preprocessing) +tests/spec/error_msg.i:4:[kernel] warning: expecting ';' before ensures +tests/spec/error_msg.i:8:[kernel] warning: expecting ';' before end of annotation +/* Generated by Frama-C */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/exit_clause.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/exit_clause.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/exit_clause.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/exit_clause.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,52 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/exit_clause.c (with preprocessing) +tests/spec/exit_clause.c:23:[kernel] warning: \result meaningless in annotation. +tests/spec/exit_clause.c:26:[kernel] warning: unbound logic variable \exit_status in annotation. +tests/spec/exit_clause.c:28:[kernel] warning: unbound logic variable \exit_status in annotation. +/* Generated by Frama-C */ +/*@ exits never_exits: \false; */ +int main(void) +{ + int __retres; + __retres = 0; + return __retres; +} + +/*@ ensures never_returns: \false; + exits \exit_status ≡ \old(status); + assigns \nothing; + */ +extern void exit(int status); + +/*@ behavior never_exits: + assumes x ≥ 0; + exits \false; + + behavior never_returns: + assumes x < 0; + ensures never_returns: \false; + exits \exit_status ≡ \old(x); + assigns \nothing; + */ +int may_exit(int x) +{ + int __retres; + if (x) exit(0); + __retres = 0; + return __retres; +} + +int f(void) +{ + int __retres; + __retres = 0; + return __retres; +} + +void g(void) +{ + exit(0); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/Extend.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/Extend.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/Extend.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/Extend.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,13 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/Extend.i (no preprocessing) +/* Generated by Frama-C */ +/*@ bar \result ≡ 0; + foo x ≡ 0; */ +extern int f(int x); + +/*@ behavior test: + bar \old(y)+\result ≡ 0; + foo y ≡ 1; */ +extern int g(int y); + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/fct_ptr.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/fct_ptr.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/fct_ptr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/fct_ptr.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/fct_ptr.c (with preprocessing) +/* Generated by Frama-C */ +int x; +void inc(void) +{ + x ++; + return; +} + +void dec(void) +{ + x --; + return; +} + +void (*f)(void) = & dec; +void (*g)(void) = & inc; +void call(void (*x_0)(void)) +{ + (*x_0)(); + return; +} + +/*@ predicate foo{L}= \at(f ≡ &dec ∨ f ≡ &inc,L); + +*/ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/first.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/first.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/first.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/first.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,31 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/first.c (with preprocessing) +[kernel] Parsing tests/spec/third.c (with preprocessing) +[kernel] Parsing tests/spec/second.c (with preprocessing) +/* Generated by Frama-C */ +int bar(int *third); + +void main(int *c) +{ + bar(c); + return; +} + +/*@ behavior b: + requires \valid(third); + ensures \result ≡ 0; */ +int bar(int *third) +{ + int __retres; + third = (int *)*third; + __retres = 0; + return __retres; +} + +void sub(char *c) +{ + bar((int *)c); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/footprint.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/footprint.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/footprint.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/footprint.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/footprint.c (with preprocessing) +/* Generated by Frama-C */ +struct S { + char *x ; + int *y ; +}; +/*@ +logic set footprint(struct S s) = + \union(s.x, (char *)s.y+(0 .. sizeof(int)-1)); + */ +/*@ requires + \valid(\union((char *)s+(0 .. sizeof(struct S)), footprint(*s))); + assigns footprint(*s); + */ +int f(struct S *s) +{ + int __retres; + __retres = (int)*(s->x) + *(s->y); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/forall_value.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/forall_value.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/forall_value.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/forall_value.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/forall_value.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + t[0..9] ∈ {0} + j ∈ [--..--] +tests/spec/forall_value.i:9:[value] Function main: precondition got status unknown. +tests/spec/forall_value.i:11:[value] Assertion got status valid. +tests/spec/forall_value.i:12:[value] Assertion got status unknown. +tests/spec/forall_value.i:13:[value] Assertion got status valid. +tests/spec/forall_value.i:15:[value] Assertion got status unknown. +tests/spec/forall_value.i:16:[value] Assertion got status unknown. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + t[0] ∈ {0} + [1] ∈ {2} + [2..9] ∈ {0} +[inout] Out (internal) for function main: + t[1] +[inout] Inputs for function main: + \nothing +[inout] InOut (internal) for function main: + Operational inputs: + \nothing + Operational inputs on termination: + \nothing + Sure outputs: + t[1] diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/for_scope.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/for_scope.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/for_scope.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/for_scope.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,13 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/for_scope.c (with preprocessing) +/* Generated by Frama-C */ +void f(void) +{ + int i; + i = 0; + /*@ loop invariant i ≥ 0; */ + while (i < 10) i ++; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/heterogeneous_set_bts1146.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/heterogeneous_set_bts1146.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/heterogeneous_set_bts1146.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/heterogeneous_set_bts1146.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,331 @@ +[type_of_term] Term: dest+(0 .. n-1), type is set +[type_of_term] Term: dest, type is unsigned char * +[type_of_term] Host: dest, type is unsigned char * +[type_of_term] Offset: , type is unsigned char * +[type_of_term] Lval: dest, type is unsigned char * +[type_of_term] Term: 0 .. n-1, type is set<ℤ> +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: n-1, type is ℤ +[type_of_term] Term: n, type is ℤ +[type_of_term] Term: n, type is unsigned long +[type_of_term] Host: n, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: n, type is unsigned long +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: i, type is ℤ +[type_of_term] Host: i, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: i, type is ℤ +[type_of_term] Term: i, type is ℤ +[type_of_term] Host: i, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: i, type is ℤ +[type_of_term] Term: \old(n), type is ℤ +[type_of_term] Term: \old(n), type is unsigned long +[type_of_term] Term: n, type is unsigned long +[type_of_term] Host: n, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: n, type is unsigned long +[type_of_term] Term: *(\old(dest)+i), type is ℤ +[type_of_term] Term: *(\old(dest)+i), type is unsigned char +[type_of_term] Host: *(\old(dest)+i), type is unsigned char +[type_of_term] Offset: , type is unsigned char +[type_of_term] Lval: *(\old(dest)+i), type is unsigned char +[type_of_term] Term: \old(dest)+i, type is unsigned char * +[type_of_term] Term: \old(dest), type is unsigned char * +[type_of_term] Term: dest, type is unsigned char * +[type_of_term] Host: dest, type is unsigned char * +[type_of_term] Offset: , type is unsigned char * +[type_of_term] Lval: dest, type is unsigned char * +[type_of_term] Term: i, type is ℤ +[type_of_term] Host: i, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: i, type is ℤ +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: *(dest+(0 .. n-1)), type is set +[type_of_term] Host: *(dest+(0 .. n-1)), type is set +[type_of_term] Offset: , type is set +[type_of_term] Lval: *(dest+(0 .. n-1)), type is set +[type_of_term] Term: dest+(0 .. n-1), type is set +[type_of_term] Term: dest, type is unsigned char * +[type_of_term] Host: dest, type is unsigned char * +[type_of_term] Offset: , type is unsigned char * +[type_of_term] Lval: dest, type is unsigned char * +[type_of_term] Term: 0 .. n-1, type is set<ℤ> +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: n-1, type is ℤ +[type_of_term] Term: n, type is ℤ +[type_of_term] Term: n, type is unsigned long +[type_of_term] Host: n, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: n, type is unsigned long +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: dest+(0 .. size*n-1), type is set +[type_of_term] Term: dest, type is unsigned char * +[type_of_term] Host: dest, type is unsigned char * +[type_of_term] Offset: , type is unsigned char * +[type_of_term] Lval: dest, type is unsigned char * +[type_of_term] Term: 0 .. size*n-1, type is set<ℤ> +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: size*n-1, type is ℤ +[type_of_term] Term: size*n, type is ℤ +[type_of_term] Term: size, type is ℤ +[type_of_term] Term: size, type is unsigned long +[type_of_term] Host: size, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: size, type is unsigned long +[type_of_term] Term: n, type is ℤ +[type_of_term] Term: n, type is unsigned long +[type_of_term] Host: n, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: n, type is unsigned long +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: n, type is ℤ +[type_of_term] Term: n, type is unsigned long +[type_of_term] Host: n, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: n, type is unsigned long +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: i, type is ℤ +[type_of_term] Host: i, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: i, type is ℤ +[type_of_term] Term: i, type is ℤ +[type_of_term] Host: i, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: i, type is ℤ +[type_of_term] Term: \old(size), type is ℤ +[type_of_term] Term: \old(size), type is unsigned long +[type_of_term] Term: size, type is unsigned long +[type_of_term] Host: size, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: size, type is unsigned long +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: j, type is ℤ +[type_of_term] Host: j, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: j, type is ℤ +[type_of_term] Term: j, type is ℤ +[type_of_term] Host: j, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: j, type is ℤ +[type_of_term] Term: \old(n), type is ℤ +[type_of_term] Term: \old(n), type is unsigned long +[type_of_term] Term: n, type is unsigned long +[type_of_term] Host: n, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: n, type is unsigned long +[type_of_term] Term: *(\old(dest)+(i+j*\old(size))), type is unsigned char +[type_of_term] Host: *(\old(dest)+(i+j*\old(size))), type is unsigned char +[type_of_term] Offset: , type is unsigned char +[type_of_term] Lval: *(\old(dest)+(i+j*\old(size))), type is unsigned char +[type_of_term] Term: \old(dest)+(i+j*\old(size)), type is unsigned char * +[type_of_term] Term: \old(dest), type is unsigned char * +[type_of_term] Term: dest, type is unsigned char * +[type_of_term] Host: dest, type is unsigned char * +[type_of_term] Offset: , type is unsigned char * +[type_of_term] Lval: dest, type is unsigned char * +[type_of_term] Term: i+j*\old(size), type is ℤ +[type_of_term] Term: i, type is ℤ +[type_of_term] Host: i, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: i, type is ℤ +[type_of_term] Term: j*\old(size), type is ℤ +[type_of_term] Term: j, type is ℤ +[type_of_term] Host: j, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: j, type is ℤ +[type_of_term] Term: \old(size), type is ℤ +[type_of_term] Term: \old(size), type is unsigned long +[type_of_term] Term: size, type is unsigned long +[type_of_term] Host: size, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: size, type is unsigned long +[type_of_term] Term: *(\old(dest)+i), type is unsigned char +[type_of_term] Host: *(\old(dest)+i), type is unsigned char +[type_of_term] Offset: , type is unsigned char +[type_of_term] Lval: *(\old(dest)+i), type is unsigned char +[type_of_term] Term: \old(dest)+i, type is unsigned char * +[type_of_term] Term: \old(dest), type is unsigned char * +[type_of_term] Term: dest, type is unsigned char * +[type_of_term] Host: dest, type is unsigned char * +[type_of_term] Offset: , type is unsigned char * +[type_of_term] Lval: dest, type is unsigned char * +[type_of_term] Term: i, type is ℤ +[type_of_term] Host: i, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: i, type is ℤ +[type_of_term] Term: *(dest+(size .. size*n-1)), type is set +[type_of_term] Host: *(dest+(size .. size*n-1)), type is set +[type_of_term] Offset: , type is set +[type_of_term] Lval: *(dest+(size .. size*n-1)), type is set +[type_of_term] Term: dest+(size .. size*n-1), type is set +[type_of_term] Term: dest, type is unsigned char * +[type_of_term] Host: dest, type is unsigned char * +[type_of_term] Offset: , type is unsigned char * +[type_of_term] Lval: dest, type is unsigned char * +[type_of_term] Term: size .. size*n-1, type is set<ℤ> +[type_of_term] Term: size, type is unsigned long +[type_of_term] Host: size, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: size, type is unsigned long +[type_of_term] Term: size*n-1, type is ℤ +[type_of_term] Term: size*n, type is ℤ +[type_of_term] Term: size, type is ℤ +[type_of_term] Term: size, type is unsigned long +[type_of_term] Host: size, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: size, type is unsigned long +[type_of_term] Term: n, type is ℤ +[type_of_term] Term: n, type is unsigned long +[type_of_term] Host: n, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: n, type is unsigned long +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: *(dest+(0 .. size-1)), type is set +[type_of_term] Host: *(dest+(0 .. size-1)), type is set +[type_of_term] Offset: , type is set +[type_of_term] Lval: *(dest+(0 .. size-1)), type is set +[type_of_term] Term: dest+(0 .. size-1), type is set +[type_of_term] Term: dest, type is unsigned char * +[type_of_term] Host: dest, type is unsigned char * +[type_of_term] Offset: , type is unsigned char * +[type_of_term] Lval: dest, type is unsigned char * +[type_of_term] Term: 0 .. size-1, type is set<ℤ> +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: size-1, type is ℤ +[type_of_term] Term: size, type is ℤ +[type_of_term] Term: size, type is unsigned long +[type_of_term] Host: size, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: size, type is unsigned long +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: \union(1), type is set<ℤ> +[type_of_term] Term: 1, type is ℝ +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: \union(1.0), type is set<ℝ> +[type_of_term] Term: 1.0, type is ℝ +[type_of_term] Term: \union(1.0), type is set<ℝ> +[type_of_term] Term: 1.0, type is ℝ +[type_of_term] Term: \union(1), type is set<ℤ> +[type_of_term] Term: 1, type is ℝ +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: \union(1.0, 2), type is set<ℝ> +[type_of_term] Term: 1.0, type is ℝ +[type_of_term] Term: 2, type is ℝ +[type_of_term] Term: 2, type is ℤ +[type_of_term] Term: \union(1, 2.0), type is set<ℝ> +[type_of_term] Term: 1, type is ℝ +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: 2.0, type is ℝ +[type_of_term] Term: 1.0, type is ℝ +[type_of_term] Term: 1, type is ℝ +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: \union(), type is set<ℤ> +[type_of_term] Term: \union(1), type is set<ℤ> +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: \union(1), type is set<ℤ> +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: \union(), type is set<ℤ> +[type_of_term] Term: p, type is char * +[type_of_term] Host: p, type is char * +[type_of_term] Offset: , type is char * +[type_of_term] Lval: p, type is char * +[type_of_term] Term: s, type is set +[type_of_term] Host: s, type is set +[type_of_term] Offset: , type is set +[type_of_term] Lval: s, type is set +[type_of_term] Term: \at(*p,L1), type is char +[type_of_term] Term: *p, type is char +[type_of_term] Host: *p, type is char +[type_of_term] Offset: , type is char +[type_of_term] Lval: *p, type is char +[type_of_term] Term: p, type is char * +[type_of_term] Host: p, type is char * +[type_of_term] Offset: , type is char * +[type_of_term] Lval: p, type is char * +[type_of_term] Term: \at(*p,L2), type is char +[type_of_term] Term: *p, type is char +[type_of_term] Host: *p, type is char +[type_of_term] Offset: , type is char +[type_of_term] Lval: *p, type is char +[type_of_term] Term: p, type is char * +[type_of_term] Host: p, type is char * +[type_of_term] Offset: , type is char * +[type_of_term] Lval: p, type is char * +[type_of_term] Term: (char *)\old(x)+(0 .. sizeof(int)), type is set +[type_of_term] Term: (char *)\old(x), type is char * +[type_of_term] Term: \old(x), type is int * +[type_of_term] Term: x, type is int * +[type_of_term] Host: x, type is int * +[type_of_term] Offset: , type is int * +[type_of_term] Lval: x, type is int * +[type_of_term] Term: 0 .. sizeof(int), type is set<ℤ> +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: sizeof(int), type is ℤ +[type_of_term] Term: \union( + (char *)\old(x)+(0 .. sizeof(int)), + (char *)\old(y)+(0 .. sizeof(int))), type is set +[type_of_term] Term: (char *)\old(x)+(0 .. sizeof(int)), type is set +[type_of_term] Term: (char *)\old(x), type is char * +[type_of_term] Term: \old(x), type is int * +[type_of_term] Term: x, type is int * +[type_of_term] Host: x, type is int * +[type_of_term] Offset: , type is int * +[type_of_term] Lval: x, type is int * +[type_of_term] Term: 0 .. sizeof(int), type is set<ℤ> +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: sizeof(int), type is ℤ +[type_of_term] Term: (char *)\old(y)+(0 .. sizeof(int)), type is set +[type_of_term] Term: (char *)\old(y), type is char * +[type_of_term] Term: \old(y), type is int * +[type_of_term] Term: y, type is int * +[type_of_term] Host: y, type is int * +[type_of_term] Offset: , type is int * +[type_of_term] Lval: y, type is int * +[type_of_term] Term: 0 .. sizeof(int), type is set<ℤ> +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: sizeof(int), type is ℤ +[type_of_term] Term: (char *)(&x)+(0 .. sizeof(int)), type is set +[type_of_term] Term: (char *)(&x), type is char * +[type_of_term] Term: &x, type is int * +[type_of_term] Host: x, type is int +[type_of_term] Offset: , type is int +[type_of_term] Lval: x, type is int +[type_of_term] Term: 0 .. sizeof(int), type is set<ℤ> +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: sizeof(int), type is ℤ +/* Generated by Frama-C */ +/*@ lemma foo: \union(1) ≡ \union(1.0); + */ +/*@ lemma foo2: \union(1.0) ≡ \union(1); + */ +/*@ lemma foo3: \union(1.0, 2) ≡ \union(1, 2.0); + */ +/*@ lemma foo4: 1.0 ≡ 1; + */ +/*@ lemma bar: \union() ≢ \union(1); + */ +/*@ lemma bla: \union(1) ≢ \union(); + */ +/*@ +predicate P{L1, L2}(set s) = + ∀ char *p; \subset(p, s) ⇒ \at(*p,L1) ≡ \at(*p,L2); + */ +/*@ ensures P{Pre, Post}((char *)\old(x)+(0 .. sizeof(int))); */ +extern void f(int *x, double *y); + +/*@ ensures + P{Pre, Post}(\union( + (char *)\old(x)+(0 .. sizeof(int)), + (char *)\old(y)+(0 .. sizeof(int)))); + */ +extern void h(int *x, int *y); + +int x; +/*@ ensures P{Pre, Post}((char *)(&x)+(0 .. sizeof(int))); */ +extern void g(); + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/homax.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/homax.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/homax.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/homax.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/homax.c (with preprocessing) +/* Generated by Frama-C */ +int max_seq(int *p, int n); + +/*@ requires n > 0 ∧ \valid(p+(0 .. n-1)); + ensures \result ≡ \max(0, \old(n)-1, \lambda ℤ i; *(\old(p)+i)); + */ +int max_seq(int *p, int n) +{ + int res; + res = *p; + { + int i; + i = 0; + while (i < n) { + if (res < *p) res = *p; + p ++; + i ++; + } + } + return res; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/hosum.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/hosum.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/hosum.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/hosum.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/hosum.c (with preprocessing) +/* Generated by Frama-C */ +int sqsum(int *p, int n); + +/*@ requires n ≥ 0; + requires \valid(p+(0 .. n-1)); + ensures + \result ≡ + \sum(0, \old(n)-1, \lambda ℤ i; *(\old(p)+i)**(\old(p)+i)); + assigns \nothing; + */ +int sqsum(int *p, int n) +{ + int S; + int tmp; + S = 0; + { + int i; + i = 0; + while (i < n) { + /*@ assert *(p+i)**(p+i) ≤ 1<<(30-1); */ ; + tmp = *(p + i) * *(p + i); + /*@ assert tmp ≥ 0; */ ; + /*@ assert S+tmp ≤ 1<<(30-1); */ ; + S += tmp; + i ++; + } + } + return S; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/if.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/if.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/if.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/if.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/if.c (with preprocessing) +tests/spec/if.c:7:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +tests/spec/if.c:12:[kernel] warning: invalid implicit conversion from 'int' to 'char *' in annotation. +/* Generated by Frama-C */ +int a; +int b; +/*@ requires MyPre: a = Nil | Cons(A, List ); + */ +/*@ +inductive model{L}(List<ℤ> root, List<ℤ> logic_list) { + case nil{L}: \at(model{L}(Nil, Nil),L); + case cons{L}: \at(∀ List<ℤ> l1, List<ℤ> ll1; + model{L}(l1, ll1) ⇒ + model{L}(Cons(0, l1), Cons(0, ll1)), + L); + } + +*/ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/label_scope_bts1536.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/label_scope_bts1536.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/label_scope_bts1536.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/label_scope_bts1536.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,12 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/label_scope_bts1536.i (no preprocessing) +/* Generated by Frama-C */ +void f(void) +{ + int i; + LInit: LLoop: i = 0; + /*@ assert \at(1,LInit) ≡ 1; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/lib.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/lib.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/lib.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/lib.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,15 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/lib.c (with preprocessing) +tests/spec/lib.h:1:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +/* Generated by Frama-C */ +/*@ logic int f(int i) ; + */ +/*@ ensures f((int)0) ≡ (int)0; */ +int main(void) +{ + int __retres; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/liens.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/liens.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/liens.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/liens.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,24 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/liens.c (with preprocessing) +/* Generated by Frama-C */ +int e; +/*@ ensures e ≡ 2; + assigns e; */ +void f(void) +{ + e = 2; + return; +} + +/*@ ensures e ≡ 6; + assigns e; */ +int main(void) +{ + int __retres; + e = 1; + f(); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/localization.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/localization.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/localization.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/localization.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,35 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/localization.c (with preprocessing) +tests/spec/localization.c:6:[kernel] warning: unbound logic variable j in annotation. +tests/spec/localization.c:8:[kernel] warning: unbound logic variable k in annotation. +tests/spec/localization.c:10:[kernel] warning: unbound logic variable l in annotation. +tests/spec/localization.c:15:[kernel] warning: unbound logic variable bar in annotation. +tests/spec/localization.c:16:[kernel] warning: unbound logic variable foo in annotation. +tests/spec/localization.c:23:[kernel] warning: unbound logic variable wrong in annotation. +tests/spec/localization.c:33:[kernel] warning: no such type S1 in annotation. +/* Generated by Frama-C */ +/*@ logic ℤ f(ℤ i) = 1; + */ +void ComposerPage(void) +{ + int x; + x = 0; + x ++; + return; +} + +void f(void) +{ + /*@ ghost int index; */ + int x; + /*@ ghost index = 0; */ + x = 0; + return; +} + +void g(void) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/local.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/local.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/local.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/local.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,36 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/local.c (with preprocessing) +/* Generated by Frama-C */ +/*@ ensures \let i = \old(x)+1; i ≡ \result; + ensures \result ≡ (\let i = \old(x); i+1); + */ +int f(int x) +{ + int __retres; + __retres = x + 1; + return __retres; +} + +/*@ requires (int)((x+y)+1) ≡ (x+y)+1; + ensures \let f = \lambda ℤ x, ℤ y; \let x1 = x+1; x1+y; + \let P = \lambda ℤ x, ℤ y; x≡y; + P(f(\old(x), \old(y)), \result) ≡ \true; + */ +int g(int x, int y) +{ + int __retres; + __retres = (x + y) + 1; + return __retres; +} + +/*@ axiomatic a { + predicate P(ℤ v) ; + + } + */ +/*@ lemma l1: \let p = \lambda ℤ x; P(x); p(1); + */ +/*@ lemma l2: \let p = P(1); p; + +*/ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/logic_coerce.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/logic_coerce.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/logic_coerce.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/logic_coerce.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +/* Generated by Frama-C */ +/*@ logic ℤ f(ℤ x) = x+1; + */ +/*@ logic ℤ g(int x) = /* coercion to:ℤ */x+2; + */ +/*@ logic int h(int x) = x; + */ +/*@ lemma trivial: ∀ int x; f(/* coercion to:ℤ */x) ≡ g(x)-1; + */ +/*@ +lemma trivial2: + ∀ int x; f(/* coercion to:ℤ */x) ≡ /* coercion to:ℤ */h(x)+1; + */ +/*@ logic int o(int x) = (int)(/* coercion to:ℤ */x+2); + */ +/*@ logic ℤ o(ℤ x) = x+1; + */ +/*@ lemma overload1: ∀ int x; /* coercion to:ℤ */o(x) ≤ g(x); + */ +/*@ lemma overload2: ∀ ℤ x; o(x) ≡ f(x); + */ +/*@ type foo_t = Foo(ℤ); + */ +/*@ logic foo_t foo(int x) = Foo(/* coercion to:ℤ */x); + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/logic_compare.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/logic_compare.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/logic_compare.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/logic_compare.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/logic_compare.c (with preprocessing) +/* Generated by Frama-C */ +/*@ +axiomatic Foo { + type foo; + + predicate test(foo x) ; + + axiom foo_eq_refl: ∀ foo x; x ≡ x; + + axiom foo_test: ∀ foo x; test(x); + + } + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/logic_def.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/logic_def.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/logic_def.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/logic_def.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/logic_def.c (with preprocessing) +/* Generated by Frama-C */ +/*@ logic ℤ foo(int x) = x+2; + */ +int main(void) +{ + int __retres; + int x; + x = 42; + /*@ assert foo(x) ≥ x; */ ; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/logic_label.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/logic_label.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/logic_label.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/logic_label.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,74 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/logic_label.c (with preprocessing) +/* Generated by Frama-C */ +void f(void) +{ + int x; + x = 0; + L: x ++; + /*@ ensures \at(\true,Pre); */ + x ++; + /*@ assert \at(x,L) ≡ 0; */ ; + /*@ assert \at(x ≡ 0,L); */ ; + return; +} + +int g(int i) +{ + lab: /*@ assert i ≡ \at(i,lab); */ ; + return i; +} + +/*@ predicate modified{L1, L2}(int x) = \at(x,L1) ≢ \at(x,L2); + */ +/*@ logic ℤ diff{L1, L2}(ℤ x) = \at(x,L1)-\at(x,L2); + +*/ +int h(void) +{ + int __retres; + int x; + x = 0; + l: x ++; + /*@ assert modified{Here, l}(x) ∧ diff{Here, l}(x) ≡ 1; */ ; + __retres = 0; + return __retres; +} + +/*@ logic ℤ foo{L}(ℤ x) = x+1; + +*/ +/*@ assigns *(x+(0 .. foo{Old}(0))); */ +int u(int *x) +{ + int __retres; + int *tmp; + { + /*sequence*/ + tmp = x; + x ++; + *tmp = 0; + } + *x = 1; + /*@ assert \at(\true,Pre); */ ; + __retres = *x; + return __retres; +} + +int X; +void labels_in_stmt_annot(void) +{ + X ++; + /*@ requires X > \at(X,Pre); + ensures X ≡ \old(X)+1; + ensures X ≡ \at(X,Pre)+2; + ensures X ≡ \at(X,Post); + */ + X ++; + /*@ ensures X ≡ \at(X,Here); */ + X ++; + /*@ assert X ≡ \at(X,Pre)+3; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/logic_labels_wrong.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/logic_labels_wrong.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/logic_labels_wrong.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/logic_labels_wrong.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/logic_labels_wrong.c (with preprocessing) +tests/spec/logic_labels_wrong.c:4:[kernel] warning: multiply defined label `L' in annotation. +tests/spec/logic_labels_wrong.c:19:[kernel] warning: \old undefined in this context in annotation. +tests/spec/logic_labels_wrong.c:23:[kernel] warning: logic label `L0' not found in annotation. +tests/spec/logic_labels_wrong.c:26:[kernel] warning: logic label `L1' not found in annotation. +tests/spec/logic_labels_wrong.c:31:[kernel] warning: logic label `L2' not found in annotation. +/* Generated by Frama-C */ +int x; +/*@ predicate p(int t[]) = t[0] ≢ 0; + */ +/*@ +axiomatic Q { + predicate q(int t[]) ; + + axiom q_ax: ∀ int t[]; t[0] ≡ 0 ⇒ q(t); + + } + */ +void f(void) +{ + while (1) ; + while (1) L2: x = 0; + L1: x = 0; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/logic_type.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/logic_type.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/logic_type.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/logic_type.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,16 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/logic_type.c (with preprocessing) +tests/spec/logic_type.c:1:[kernel] warning: parsing obsolete ACSL construct 'logic type declaration'. 'an axiomatic block' should be used instead. +tests/spec/logic_type.c:2:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +tests/spec/logic_type.c:3:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +tests/spec/logic_type.c:7:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +tests/spec/logic_type.c:3:[kernel] warning: no such type t1 in annotation. +tests/spec/logic_type.c:6:[kernel] warning: Definition of t2 is cyclic in annotation. +tests/spec/logic_type.c:7:[kernel] warning: no such type t2 in annotation. +tests/spec/logic_type.c:8:[kernel] warning: no such type t2 in annotation. +/* Generated by Frama-C */ +/*@ type t; + */ +/*@ logic t create(int x) ; + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/loop_labels.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/loop_labels.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/loop_labels.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/loop_labels.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,21 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/loop_labels.i (no preprocessing) +tests/spec/loop_labels.i:14:[kernel] warning: logic label `LoopEntry' not found in annotation. +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int x; + x = 0; + /*@ loop invariant \at(x,LoopEntry) ≡ 0; + loop invariant \at(x,LoopCurrent) ≤ 15; + */ + while (x < 15) { + x ++; + /*@ assert x ≡ \at(x,LoopCurrent)+1; */ ; + } + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/loop_labels_unroll.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/loop_labels_unroll.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/loop_labels_unroll.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/loop_labels_unroll.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,88 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/loop_labels_unroll.i (no preprocessing) +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int x; + x = 0; + unrolling_7_loop: ; + if (! (x < 15)) goto unrolling_2_loop; + { + int i_unroll_32; + x ++; + /*@ assert x ≡ \at(x,unrolling_7_loop)+1; */ ; + i_unroll_32 = 0; + /*@ loop invariant \at(i_unroll_32,LoopEntry) ≡ 0; */ + while (i_unroll_32 < 4) { + i_unroll_32 ++; + /*@ assert \at(i_unroll_32,LoopCurrent) ≡ i_unroll_32-1; */ ; + } + /*@ assert i_unroll_32 > 0; */ ; + } + unrolling_6_loop: ; + if (! (x < 15)) goto unrolling_2_loop; + { + int i_unroll_24; + x ++; + /*@ assert x ≡ \at(x,unrolling_6_loop)+1; */ ; + i_unroll_24 = 0; + /*@ loop invariant \at(i_unroll_24,LoopEntry) ≡ 0; */ + while (i_unroll_24 < 4) { + i_unroll_24 ++; + /*@ assert \at(i_unroll_24,LoopCurrent) ≡ i_unroll_24-1; */ ; + } + /*@ assert i_unroll_24 > 0; */ ; + } + unrolling_5_loop: ; + if (! (x < 15)) goto unrolling_2_loop; + { + int i_unroll_16; + x ++; + /*@ assert x ≡ \at(x,unrolling_5_loop)+1; */ ; + i_unroll_16 = 0; + /*@ loop invariant \at(i_unroll_16,LoopEntry) ≡ 0; */ + while (i_unroll_16 < 4) { + i_unroll_16 ++; + /*@ assert \at(i_unroll_16,LoopCurrent) ≡ i_unroll_16-1; */ ; + } + /*@ assert i_unroll_16 > 0; */ ; + } + unrolling_4_loop: ; + if (! (x < 15)) goto unrolling_2_loop; + { + int i_unroll_8; + x ++; + /*@ assert x ≡ \at(x,unrolling_4_loop)+1; */ ; + i_unroll_8 = 0; + /*@ loop invariant \at(i_unroll_8,LoopEntry) ≡ 0; */ + while (i_unroll_8 < 4) { + i_unroll_8 ++; + /*@ assert \at(i_unroll_8,LoopCurrent) ≡ i_unroll_8-1; */ ; + } + /*@ assert i_unroll_8 > 0; */ ; + } + unrolling_3_loop: ; + /*@ loop invariant \at(x,LoopEntry) ≡ 0; + loop invariant \at(x,LoopCurrent) ≤ 15; + loop pragma UNROLL 4; + loop pragma UNROLL "done", 4; + */ + while (x < 15) { + int i; + x ++; + /*@ assert x ≡ \at(x,LoopCurrent)+1; */ ; + i = 0; + /*@ loop invariant \at(i,LoopEntry) ≡ 0; */ + while (i < 4) { + i ++; + /*@ assert \at(i,LoopCurrent) ≡ i-1; */ ; + } + /*@ assert i > 0; */ ; + } + unrolling_2_loop: ; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/max.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/max.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/max.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/max.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,83 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/max.c (with preprocessing) +tests/spec/max.c:16:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +tests/spec/max.c:46:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +/* Generated by Frama-C */ +/*@ +axiomatic IsMax { + predicate is_max{L}(ℤ max, int t[], ℤ length) ; + + axiom max_gt{L}: + ∀ int t[], ℤ max, ℤ length, ℤ i; + is_max{L}(max, t, length) ⇒ 0 ≤ i < length ⇒ t[i] ≤ max; + + axiom max_eq{L}: + ∀ int t[], ℤ max, ℤ length; + is_max{L}(max, t, length) ⇒ (∃ ℤ i; t[i] ≡ max); + + } + */ +/*@ requires \valid(t+(0 .. n-1)); + + behavior nonempty: + assumes n > 0; + ensures + 0 ≤ \result < \old(n) ∧ + (∀ int i; 0 ≤ i < \old(n) ⇒ *(\old(t)+\result) ≥ *(\old(t)+i)) ∧ + is_max(*(\old(t)+\result), (int [])\old(t), \old(n)); + + behavior empty: + assumes n ≤ 0; + ensures \result ≡ -1; + */ +int max(int *t, int n) +{ + int __retres; + int imax; + int i; + /*@ ghost int max_0; */ + imax = 0; + if (n <= 0) { + __retres = -1; + goto return_label; + } + /*@ ghost max_0 = *(t + 0); */ + i = 1; + /*@ loop invariant + (∀ int j; 0 ≤ j < i ⇒ *(t+imax) ≥ *(t+j)) ∧ + is_max(max_0, (int [])t, i-1); + */ + while (i < n) { + if (*(t + i) > *(t + imax)) { + imax = i; + /*@ ghost max_0 = *(t + i); */ + } + i ++; + } + __retres = imax; + return_label: return __retres; +} + +int main(void) +{ + int __retres; + int test[10]; + int x; + test[0] = 1; + test[1] = 2; + test[2] = 3; + test[3] = 4; + test[4] = 9; + test[5] = 8; + test[6] = 7; + test[7] = 6; + test[8] = 5; + test[9] = 10; + /*@ assert \valid(&test[0 .. 9]); */ ; + x = max(test,10); + /*@ assert test[x] ≥ 10; */ ; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/merge_1.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/merge_1.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/merge_1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/merge_1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/merge_1.i (no preprocessing) +[kernel] Parsing tests/spec/merge_2.i (no preprocessing) +tests/spec/merge_2.i:8:[kernel] warning: found two contracts. Merging them +/* Generated by Frama-C */ +int slen(char const *str); + +int f(int z); + +/*@ requires \valid(str); + ensures \result ≡ 0 ∧ \valid(\old(str)); + assigns \nothing; + */ +int slen(char const *str) +{ + int __retres; + char const *s; + s = str; + while (*s) s ++; + __retres = s - str; + return __retres; +} + +/*@ requires z ≥ 0; */ +int f(int z) +{ + int __retres; + __retres = z - 1; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/merge_assigns_bts1253.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/merge_assigns_bts1253.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/merge_assigns_bts1253.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/merge_assigns_bts1253.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,11 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/merge_assigns_bts1253.i (no preprocessing) +/* Generated by Frama-C */ +/*@ assigns \result; + assigns \result \from *(nptr+(..)); */ +extern double atof(char const *nptr); + +/*@ assigns *(nptr+(..)); */ +extern void f(char const *nptr); + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/merge_bts938.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/merge_bts938.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/merge_bts938.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/merge_bts938.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,24 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/merge_bts938.c (with preprocessing) +tests/spec/merge_bts938.h:3:[kernel] warning: found two contracts. Merging them +[kernel] Parsing tests/spec/merge_bts938_1.c (with preprocessing) +tests/spec/merge_bts938.h:3:[kernel] warning: found two contracts. Merging them +tests/spec/merge_bts938.c:8:[kernel] warning: found two contracts. Merging them +tests/spec/merge_bts938.c:8:[kernel] warning: found two contracts. Merging them +/* Generated by Frama-C */ +extern int tab[10]; + +int main(void); + +/*@ ensures test: \true; + ensures tab ≡ {tab \with [0] = (int)0}; + ensures test1: \true; + */ +int main(void) +{ + int __retres; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/merge_different_assigns.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/merge_different_assigns.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/merge_different_assigns.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/merge_different_assigns.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/merge_different_assigns.i (no preprocessing) +[kernel] Parsing tests/spec/merge_different_assigns_bis.i (no preprocessing) +tests/spec/merge_different_assigns.i:14:[kernel] warning: found two contracts. Merging them +tests/spec/merge_different_assigns.i:8:[kernel] warning: location z is not present in all assigns clauses +tests/spec/merge_different_assigns.i:10:[kernel] warning: incompatible from + clauses (tests/spec/merge_different_assigns.i:10:'assigns t \from \nothing;' + and tests/spec/merge_different_assigns_bis.i:8:'assigns t \from t;'). Keeping + only the first one. +tests/spec/merge_different_assigns_bis.i:10:[kernel] warning: location v is not present in all assigns clauses +/* Generated by Frama-C */ +int x; +int z; +int t; +int u; +int v; +int w; +/*@ assigns x, z, u, t, w, v, \result; + assigns x \from x; + assigns z \from x; + assigns t \from \nothing; + assigns w \from w; + assigns \result \from y; + */ +extern int f(int y); + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/merge_logic_globals_1.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/merge_logic_globals_1.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/merge_logic_globals_1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/merge_logic_globals_1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,59 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/merge_logic_globals_1.c (with preprocessing) +[kernel] Parsing tests/spec/merge_logic_globals_2.c (with preprocessing) +tests/spec/merge_logic_globals.h:14:[kernel] warning: dropping duplicate def'n of func test at tests/spec/merge_logic_globals.h:14 in favor of that at tests/spec/merge_logic_globals.h:14 +/* Generated by Frama-C */ +struct s_t { + int n ; +}; +typedef struct s_t t; +/*@ type invariant inv_t(t x) = x.n > 0; + */ +int i = 42; +/*@ predicate p(int x) = x ≥ i; + */ +/*@ axiomatic Bar { + logic ℤ li; + + } + */ +/*@ ensures i ≡ li; */ +void test(void) +{ + return; +} + +/*@ +axiomatic Foo { + type foo; + + logic foo ff(foo x, char *y) ; + + predicate fp(foo x, foo y) ; + + axiom fffp{L}: ∀ foo x, char *y; fp(x, ff(x, y)) ∧ *y ≡ 0; + + } + +*/ +int main(void) +{ + int __retres; + test(); + /*@ assert p((int)li); */ ; + __retres = 0; + return __retres; +} + +int f(void) +{ + int __retres; + t x; + x.n = i; + i --; + /*@ assert p(x.n); */ ; + __retres = x.n; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/model1.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/model1.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/model1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/model1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,86 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/model1.c (with preprocessing) +[kernel] Parsing tests/spec/model2.c (with preprocessing) +/* Generated by Frama-C */ +struct S { + int bar ; +}; +/*@ +model struct S { ℤ foo }; +*/ +void reset(struct S *s); + +void inc(struct S *s); + +void dec(struct S *s); + +int is_pos(struct S *s); + +void main(void) +{ + struct S s; + reset(& s); + inc(& s); + /*@ assert s.foo > 0; */ ; + /*@ loop variant s.foo; */ + while (1) { + int tmp; + tmp = is_pos(& s); + if (! tmp) break; + dec(& s); + } + /*@ assert s.foo ≤ 0; */ ; + return; +} + +/*@ type invariant foobar(struct S s) = s.bar ≡ s.foo; + +*/ +/*@ requires \valid(s); + ensures (*\old(s)).foo ≡ 0; + assigns *s; */ +void reset(struct S *s) +{ + if (s->bar == 0) ; + return; +} + +/*@ requires \valid(s); + ensures (*\old(s)).foo > \at((*s).foo,Pre); + assigns *s; + */ +void inc(struct S *s) +{ + s->bar += 5; + return; +} + +/*@ requires \valid(s); + ensures (*\old(s)).foo < \at((*s).foo,Pre); + assigns *s; + */ +void dec(struct S *s) +{ + (s->bar) --; + return; +} + +/*@ requires \valid(s); + assigns \nothing; + + behavior is_true: + assumes (*s).foo > 0; + ensures \result ≡ 1; + + behavior is_false: + assumes (*s).foo ≤ 0; + ensures \result ≡ 0; + */ +int is_pos(struct S *s) +{ + int tmp; + if (s->bar > 0) tmp = 1; else tmp = 0; + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/model.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/model.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/model.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/model.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,72 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/model.i (no preprocessing) +tests/spec/model.i:9:[kernel] warning: Cannot add model field x for type struct S: it already exists in annotation. +tests/spec/model.i:13:[kernel] warning: Cannot add model field z for type T: it already exists in annotation. +tests/spec/model.i:14:[kernel] warning: Cannot add model field x for type T: it already exists in annotation. +Model fields for type T: +z, t, +After adding field +Model fields for type T: +z, test_field, t, +After removing field +Model fields for type T: +z, t, +/* Generated by Frama-C */ +struct S { + int x ; + int y ; +}; +typedef struct S T; +/*@ +model struct S { ℤ z }; */ +/*@ +model T { ℤ t }; */ +/*@ type invariant t_invariant(T t) = t.t ≡ t.z*2; + */ +/*@ ensures (*\old(s)).z ≡ \result; + assigns *s; */ +extern int f(struct S *s); + +/*@ type invariant sum(struct S s) = s.z ≡ s.x+s.y; + */ +void main(void) +{ + struct S s; + T t; + int a; + s.x = 0; + s.y = 0; + t.x = 1; + t.y = 2; + /*@ assert t.t ≡ 6 ∧ t.z ≡ 3; */ ; + a = f(& s); + if (a) { + if (! s.x) + /*@ assert s.y ≢ 0; */ ; + else goto _LAND; + } + else + _LAND: if (s.x == 1) ; + /*@ assert s.z ≢ 0; */ ; + return; +} + +/*@ +model double { ℝ exact }; */ +/*@ +model double { ℝ round }; +*/ +/*@ ensures \result ≡ (double)(\old(x)+\old(y)); + ensures \result.exact ≡ \old(x.exact)+\old(y.exact); + ensures \result ≡ \result.exact+\result.round; + */ +extern double add(double x, double y); + +double foo(double x) +{ + double tmp; + tmp = add(x,x); + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/multi_behavior.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/multi_behavior.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/multi_behavior.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/multi_behavior.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/multi_behavior.c (with preprocessing) +/* Generated by Frama-C */ +int a; +int b; +/*@ behavior b: + ensures a ≢ 0; + ensures a ≡ 0; + assigns a; + + behavior c: + ensures a ≡ 0; + ensures a ≡ 0; + assigns a; + + behavior d: + assumes a ≡ 0; + */ +void f(void) +{ + a = 0; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/multidecl.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/multidecl.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/multidecl.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/multidecl.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,15 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/multidecl.c (with preprocessing) +tests/spec/multidecl.c:9:[kernel] warning: term x has type ℤ, but int is expected. in annotation. +/* Generated by Frama-C */ +/*@ predicate p0(ℤ x) = x ≡ 0; + */ +/*@ predicate p1(ℤ x) = x ≡ 1; + */ +/*@ lemma excl: ∀ ℤ x; ¬(p0(x) ∧ p1(x)); + */ +/*@ predicate p2(int x) = x ≡ 0; + */ +/*@ predicate p3(int x) = x ≡ 1; + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/multidim.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/multidim.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/multidim.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/multidim.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,21 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/multidim.c (with preprocessing) +tests/spec/multidim.c:14:[kernel] warning: In ACSL, there is no implicit conversion between a C array and a pointer. Either introduce an explicit cast or take the address of the first element of ttt in annotation. +/* Generated by Frama-C */ +typedef int TT[3][4]; +TT ttt[5]; +int (*pt)[3][4] = ttt; +/*@ axiomatic A { + predicate P(TT *pt) ; + + predicate Q(int (*pt)[3][4]) ; + + } + */ +/*@ requires Q((TT *)ttt); */ +void f(void) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/multi_labels.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/multi_labels.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/multi_labels.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/multi_labels.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,12 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/multi_labels.i (no preprocessing) +/* Generated by Frama-C */ +int labels(void) +{ + int x; + x = 0; + L1: /*@ assert \at(x,L1) ≡ \at(x,L1); */ ; + return x; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/multiple_decl_def_1.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/multiple_decl_def_1.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/multiple_decl_def_1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/multiple_decl_def_1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/multiple_decl_def_1.c (with preprocessing) +[kernel] Parsing tests/spec/multiple_decl_def_2.c (with preprocessing) +tests/spec/multiple_decl_def_2.c:5:[kernel] warning: found two contracts. Merging them +/* Generated by Frama-C */ +int f(int y); + +/*@ requires x ≥ 0; */ +extern int g(int x); + +int main(void) +{ + int tmp; + g(0); + tmp = f(0); + return tmp; +} + +/*@ requires y ≥ 0; + requires y ≤ 0; */ +int f(int y) +{ + return y; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/multiple_file_1.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/multiple_file_1.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/multiple_file_1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/multiple_file_1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,21 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/multiple_file_1.c (with preprocessing) +[kernel] Parsing tests/spec/multiple_file_2.c (with preprocessing) +tests/spec/multiple_file_1.c:11:[kernel] warning: found two contracts. Merging them +/* Generated by Frama-C */ +/*@ requires x ≥ 0; */ +extern int f(int x); + +/*@ requires x ≥ 0; + requires x ≤ 0; */ +extern int g(int x); + +int main(void) +{ + int tmp; + g(0); + tmp = f(0); + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/multiple_include_2.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/multiple_include_2.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/multiple_include_2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/multiple_include_2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,5 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/multiple_include_2.c (with preprocessing) +[kernel] Parsing tests/spec/multiple_include_1.c (with preprocessing) +[kernel] user error: multiple inclusion of logic function p referring to a static variable +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/multiple_spec.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/multiple_spec.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/multiple_spec.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/multiple_spec.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,17 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/multiple_spec.c (with preprocessing) +tests/spec/multiple_spec.c:4:[kernel] warning: found two contracts. Merging them +/* Generated by Frama-C */ +/*@ requires y ≥ 0; + requires y ≤ 0; */ +extern int f(int y); + +int main(void) +{ + int __retres; + f(0); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/nested.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/nested.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/nested.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/nested.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,9 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/nested.c (with preprocessing) +/* Generated by Frama-C */ +void g(void) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/null_ptr.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/null_ptr.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/null_ptr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/null_ptr.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/null_ptr.c (with preprocessing) +tests/spec/null_ptr.c:18:[kernel] warning: invalid implicit conversion from 𝔹 to ℤ in annotation. +/* Generated by Frama-C */ +/*@ predicate null(char *x) = x ≡ (char *)0; + */ +/*@ predicate eq(char *x, char *y) = x ≡ y; + */ +/*@ predicate my_null(char *x) = x ≡ (char *)((void *)0); + */ +void f(char *x) +{ + x = (char *)0; + /*@ assert x ≡ (char *)((void *)0); */ ; + /*@ assert my_null(x); */ ; + /*@ assert null(x); */ ; + /*@ assert eq(x, (char *)0); */ ; + return; +} + +/*@ ensures (\result≢0) ≡ \true; */ +int g(void) +{ + int __retres; + __retres = 1; + return __retres; +} + +/*@ predicate foo(ℤ x) = x ≢ 0; + +*/ +int h(void) +{ + int __retres; + __retres = 1; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/old_prm.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/old_prm.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/old_prm.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/old_prm.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,17 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/old_prm.i (no preprocessing) +/* Generated by Frama-C */ +struct st { + int t[10] ; +}; +struct st S; +int i; +int j; +/*@ ensures S.t[i] ≡ (\let tmp = \old(s.t); tmp[j])+*(\old(y)+\old(x)); */ +void main(struct st s, int x, int *y) +{ + S.t[i] = s.t[j] + *(y + x); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/onelineghost.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/onelineghost.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/onelineghost.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/onelineghost.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,16 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/onelineghost.c (with preprocessing) +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + /*@ ghost int x; */ + /*@ ghost x = 0; */ + /*@ ghost x ++; */ + __retres = 0; + return __retres; +} + +/*@ ghost int G; +*/ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/parsing.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/parsing.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/parsing.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/parsing.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,17 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/parsing.c (with preprocessing) +tests/spec/parsing.c:27:[kernel] warning: unexpected token 'bla' +tests/spec/parsing.c:15:[kernel] warning: comparison of incompatible types: 𝔹 and ℤ in annotation. +tests/spec/parsing.c:19:[kernel] warning: comparison of incompatible types: 𝔹 and ℤ in annotation. +/* Generated by Frama-C */ +/*@ lemma bidon: ∀ int *t; ¬(*(t+0) > 0); + */ +/*@ lemma bidon1: ∀ int *t; !(*(t+0)≢0) ≡ (0≢0); + */ +/*@ lemma bidon2: ∀ int *t; !(*(t+0)≢0) ≡ (0≢0); + */ +/*@ +predicate foo{L}(int *a, int *b, int length) = + ¬(∀ ℤ k; 0 ≤ k < length ⇒ *(a+k) ≡ *(b+k)); + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/permut.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/permut.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/permut.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/permut.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/permut.c (with preprocessing) +/* Generated by Frama-C */ +/*@ +axiomatic Permut { + predicate permut{L1, L2}(double t1[], double t2[], ℤ n) ; + + axiom permut_refl{L}: ∀ double t[], ℤ n; permut{L, L}(t, t, n); + + axiom permut_sym{L1, L2}: + ∀ double t1[], double t2[], ℤ n; + permut{L1, L2}(t1, t2, n) ⇒ permut{L2, L1}(t2, t1, n); + + axiom permut_trans{L1, L2, L3}: + ∀ double t1[], double t2[], double t3[], ℤ n; + permut{L1, L2}(t1, t2, n) ∧ permut{L2, L3}(t2, t3, n) ⇒ + permut{L1, L3}(t1, t3, n); + + axiom permut_exchange{L1, L2}: + ∀ double t1[], double t2[], ℤ i, ℤ j, ℤ n; + \at(t1[i],L1) ≡ \at(t2[j],L2) ∧ \at(t1[j],L1) ≡ \at(t2[i],L2) ∧ + (∀ ℤ k; + 0 ≤ k < n ∧ k ≢ i ∧ k ≢ j ⇒ + \at(t1[k],L1) ≡ \at(t2[k],L2)) ⇒ + permut{L1, L2}(t1, t2, n); + + } + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/pi.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/pi.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/pi.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/pi.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,66 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/pi.c (with preprocessing) +/* Generated by Frama-C */ +/*@ lemma simplify_dumb_1: 2800%14 ≡ 0; + */ +/*@ lemma simplify_dumb_2: ∀ ℤ c; c*2 > 0 ⇒ c*2 > 1; + */ +/*@ lemma simplify_dumb_3: ∀ ℤ c; c%14 ≡ 0 ⇒ (c-14)%14 ≡ 0; + */ +/*@ lemma simplify_dumb_4: ∀ ℤ c; c%14 ≡ 0 ⇒ c > 0 ⇒ c ≥ 14; + */ +extern void print4(int); + +int a = 10000; +int b; +int c = 2800; +int d; +int e; +int f[2801]; +int g; +/*@ requires b ≡ 0 ∧ c ≡ 2800 ∧ a ≡ 10000; */ +void main(void) +{ + /*@ loop invariant 0 ≤ b ≤ 2800; + loop variant c-b; */ + while (b - c) { + f[b] = a / 5; + b ++; + } + /*@ loop invariant 0 ≤ c ≤ 2800 ∧ c%14 ≡ 0; + loop variant c; */ + while (1) { + d = 0; + g = c * 2; + if (! g) break; + b = c; + /*@ loop invariant 1 ≤ b ≤ c ∧ g ≡ b*2; + loop variant b; */ + while (1) { + { + int tmp; + d += f[b] * a; + { + /*sequence*/ + g --; + f[b] = d % g; + } + { + /*sequence*/ + tmp = g; + g --; + d /= tmp; + } + b --; + if (! b) break; + d *= b; + } + } + c -= 14; + print4(e + d / a); + e = d % a; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/pointer_cast.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/pointer_cast.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/pointer_cast.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/pointer_cast.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,14 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/pointer_cast.c (with preprocessing) +tests/spec/pointer_cast.c:3:[kernel] warning: incompatible types int * and int ** + in annotation. +/* Generated by Frama-C */ +void f(int **a) +{ + int *b; + /*@ assert (int *)a ≡ b; */ ; + /*@ assert a ≡ (int **)b; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/pointer_comparable.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/pointer_comparable.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/pointer_comparable.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/pointer_comparable.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,10 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/pointer_comparable.c (with preprocessing) +/* Generated by Frama-C */ +/*@ requires \pointer_comparable((void *)p, (void *)q) ∧ \is_finite(*p); */ +void f(float *p, char const *q) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/polymorph.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/polymorph.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/polymorph.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/polymorph.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/polymorph.c (with preprocessing) +tests/spec/polymorph.c:1:[kernel] warning: parsing obsolete ACSL construct 'logic type declaration'. 'an axiomatic block' should be used instead. +tests/spec/polymorph.c:4:[kernel] warning: unexpected token 'a' +tests/spec/polymorph.c:6:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +tests/spec/polymorph.c:8:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +tests/spec/polymorph.c:10:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +tests/spec/polymorph.c:13:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +tests/spec/polymorph.c:13:[kernel] warning: some type variable appears only in the return type. All type variables need to occur also in the parameters types. in annotation. +tests/spec/polymorph.c:22:[kernel] warning: implicit unification of type variables b and a in annotation. +tests/spec/polymorph.c:29:[kernel] warning: implicit unification of type variables b and a in annotation. +tests/spec/polymorph.c:32:[kernel] warning: implicit unification of type variables b and a in annotation. +/* Generated by Frama-C */ +/*@ type foo; + */ +/*@ logic ℤ f(foo x) ; + */ +/*@ logic ℤ g(foo x, foo y) ; + */ +/*@ logic foo h(foo x) ; + */ +/*@ predicate bla(foo x) = f(x) ≡ 0; + */ +/*@ predicate bli(foo<ℝ> x) = g(x, x) ≡ 42; + */ +/*@ +predicate blu2(foo x, foo y) = + g(x, x) ≡ 36 ∧ g(y, y) ≡ 72; + */ +/*@ predicate bar(foo<ℝ> x) = bli(x) ∧ blu2(x, x); + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/pp_empty_spec.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/pp_empty_spec.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/pp_empty_spec.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/pp_empty_spec.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,120 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/pp_empty_spec.i (no preprocessing) +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int x; + int y; + x = 0; + y = 0; + /*@ loop invariant invmerger: chekofv_invariant_1_1: x ≡ y; */ + while (y < 10) { + x ++; + if (x != 9) y ++; + } + __retres = 0; + return __retres; +} + + +[kernel] warning: Trying to add an assumes clause to default behavior +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int x; + int y; + x = 0; + y = 0; + /*@ loop invariant invmerger: chekofv_invariant_1_1: x ≡ y; */ + while (y < 10) { + x ++; + if (x != 9) y ++; + } + __retres = 0; + return __retres; +} + + +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int x; + int y; + x = 0; + y = 0; + /*@ loop invariant invmerger: chekofv_invariant_1_1: x ≡ y; */ + while (y < 10) { + x ++; + if (x != 9) y ++; + } + __retres = 0; + return __retres; +} + + +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int x; + int y; + x = 0; + y = 0; + /*@ loop invariant invmerger: chekofv_invariant_1_1: x ≡ y; */ + while (y < 10) { + x ++; + if (x != 9) y ++; + } + __retres = 0; + return __retres; +} + + +[kernel] warning: Trying to add a non-existing behavior foo in a complete or disjoint clause +[kernel] warning: Trying to add a non-existing behavior bar in a complete or disjoint clause +[kernel] warning: Trying to add a non-existing behavior foo in a complete or disjoint clause +[kernel] warning: Trying to add a non-existing behavior bar in a complete or disjoint clause +/* Generated by Frama-C */ +int main(void) +{ + int __retres; + int x; + int y; + x = 0; + y = 0; + /*@ loop invariant invmerger: chekofv_invariant_1_1: x ≡ y; */ + while (y < 10) { + x ++; + if (x != 9) y ++; + } + __retres = 0; + return __retres; +} + + +/* Generated by Frama-C */ +/*@ behavior foo: + + + complete behaviors foo; + disjoint behaviors foo; */ +int main(void) +{ + int __retres; + int x; + int y; + x = 0; + y = 0; + /*@ loop invariant invmerger: chekofv_invariant_1_1: x ≡ y; */ + while (y < 10) { + x ++; + if (x != 9) y ++; + } + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/pragma.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/pragma.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/pragma.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/pragma.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/pragma.i (no preprocessing) +tests/spec/pragma.i:12:[kernel] warning: Unexpected attribute in #pragma +tests/spec/pragma.i:14:[kernel] warning: Unexpected attribute in #pragma +tests/spec/pragma.i:15:[kernel] warning: Unexpected attribute in #pragma +/* Generated by Frama-C */ +#pragma +#pragma A +#pragma A() +#pragma A("AA",A,B,2:4) +#pragma B +#pragma B() +#pragma B("AA",A,B,2:4) +#pragma 1:3 +#pragma default:1 +#pragma 1 ? A : B +#pragma "A" +#pragma 1 +#pragma A 0 +#pragma A B "C" +#pragma B A "C" 4 "E" +#pragma 0 A B "C" D 5 + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/precedence.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/precedence.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/precedence.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/precedence.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,13 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/precedence.i (no preprocessing) +/* Generated by Frama-C */ +int x[10]; +/*@ lemma prio_unary_plus: (3-2)+2 ≡ 3; + */ +/*@ lemma prio_unary_minus: (3--2)-2 ≡ 3; + */ +/*@ lemma prio_unary_amp{L}: ((&x[1]-(int *)x)&(&x[2]-&x[2])) ≡ 0; + */ +/*@ lemma prio_unary_star{L}: (0*x[2])*x[2] ≡ 0; + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/pred_def.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/pred_def.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/pred_def.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/pred_def.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,6 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/pred_def.i (no preprocessing) +/* Generated by Frama-C */ +/*@ predicate f(ℤ x) = x+1 ≢ 0; + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/predicates.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/predicates.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/predicates.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/predicates.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/predicates.c (with preprocessing) +tests/spec/predicates.c:3:[kernel] warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. +/* Generated by Frama-C */ +/*@ +predicate is_valid_int_range{L}(int *p, int n) = + \at((pred1: 0 ≤ n) ∧ (pred2: \valid{L}(p+(0 .. n-1))),L); + */ +/*@ predicate P{L}(int *p) = \at(*p ≡ 0,L); + */ +/*@ predicate R{L}(int *p) = \at(\valid{L}(p),L); + */ +/*@ +predicate S{L}(int *p) = + \at(\let z = 0; + *p ≡ (\let x = 0; ((\let y = z; xbalance ≥ 0; + */ +/*@ requires purse_inv(p) ∧ s ≥ 0; + ensures + purse_inv(\old(p)) ∧ \old(p)->balance ≡ \old(p->balance)+\old(s); + assigns p->balance; + */ +void credit(purse *p, int s) +{ + p->balance += s; + return; +} + +/*@ requires purse_inv(p) ∧ s ≥ 0; + ensures + purse_inv(\old(p)) ∧ \old(p)->balance ≡ \old(p->balance)+\old(s); + assigns p->balance; + */ +void f(purse *p, int s) +{ + p->balance += s; + return; +} + +/*@ requires purse_inv(p) ∧ 0 ≤ s ≤ p->balance; + ensures + purse_inv(\old(p)) ∧ \old(p)->balance ≡ \old(p->balance)-\old(s); + assigns p->balance; + */ +void withdraw(purse *p, int s) +{ + p->balance -= s; + return; +} + +/*@ requires purse_inv(p1) ∧ purse_inv(p2); + ensures \result ≡ 0; + assigns p1->balance, p2->balance; + */ +int test1(purse *p1, purse *p2) +{ + int __retres; + p1->balance = 0; + credit(p2,100); + __retres = p1->balance; + return __retres; +} + +/*@ ensures + \fresh{Old, Here}(\result,sizeof(purse)) ∧ purse_inv(\result) ∧ + \result->balance ≡ 0; + assigns \empty; + */ +purse *new_purse(void) +{ + purse *p; + p = (purse *)malloc((unsigned int)1 * sizeof(purse)); + p->balance = 0; + return p; +} + +/*@ ensures \result ≡ 150; */ +int test2(void) +{ + int __retres; + purse *p1; + purse *p2; + p1 = new_purse(); + p2 = new_purse(); + credit(p1,100); + credit(p2,200); + withdraw(p1,50); + withdraw(p2,100); + __retres = p1->balance + p2->balance; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/range.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/range.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/range.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/range.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/range.c (with preprocessing) +/* Generated by Frama-C */ +struct foo { + char bar[4] ; +}; +typedef char baz[4]; +struct bli { + baz bli ; +}; +/*@ assigns x->bar[0 .. 3]; + assigns x->bar[0 .. 3] \from x->bar[0 .. 3]; */ +extern int f(struct foo *x); + +/*@ assigns *(x+(0 .. 3)); + assigns *(x+(0 .. 3)) \from y->bli[0 .. 3]; */ +extern int g(char * /*[4]*/ x, struct bli *y); + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/real_typing_bts1309.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/real_typing_bts1309.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/real_typing_bts1309.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/real_typing_bts1309.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,12 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/real_typing_bts1309.i (no preprocessing) +/* Generated by Frama-C */ +void foo(int c) +{ + float f; + f = (float)1.0; + /*@ assert 0.0 ≤ (c≢0? f: 2.0); */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/regions2.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/regions2.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/regions2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/regions2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/regions2.c (with preprocessing) +/* Generated by Frama-C */ +struct S { + int t1[2] ; + int t2[2] ; +}; +struct T { + struct S *t[2] ; +}; +/*@ requires \valid(s) ∧ \valid(s->t[0]); */ +void f(struct T *s) +{ + (s->t[0])->t1[0] = 1; + return; +} + +int main(struct T s, struct S a) +{ + int __retres; + s.t[0] = & a; + f(& s); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/regions.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/regions.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/regions.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/regions.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,40 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/regions.c (with preprocessing) +/* Generated by Frama-C */ +struct S { + int t1[2] ; + int t2[2] ; +}; +/*@ requires \valid(p); + ensures *\old(p) ≡ \old(n); */ +void g(int *p, int n) +{ + *p = n; + return; +} + +/*@ requires \valid(x) ∧ \valid(y); + ensures *\old(x) ≡ 1 ∧ *\old(y) ≡ 2; + */ +void f(int *x, int *y) +{ + g(x,1); + g(y,2); + return; +} + +/*@ ensures + (\let tmp = \old(s.t1); tmp[0]) ≡ 1 ∧ + (\let tmp = \old(s.t2); tmp[0]) ≡ 2 ∧ + (\let tmp = \old(s.t1); tmp[1]) ≡ 2 ∧ + (\let tmp = \old(s.t2); tmp[1]) ≡ 1; + */ +void main(struct S s) +{ + f(& s.t1[0],& s.t2[1]); + f(& s.t2[0],& s.t1[1]); + f(& s.t1[0],& s.t1[0]); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/returns.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/returns.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/returns.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/returns.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,57 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/returns.i (no preprocessing) +/* Generated by Frama-C */ +/*@ ensures \result ≢ \old(c); */ +int f(int c) +{ + int __retres; + /*@ returns \result ≡ 0; */ + if (c) { + __retres = 0; + /*@ assert __retres ≡ 0; */ ; + goto return_label; + } + __retres = 42; + return_label: return __retres; +} + +/*@ requires \valid(a); + ensures *\old(a) > 0; */ +int g(int *a) +{ + int __retres; + int *tmp; + { + /*sequence*/ + tmp = a; + a ++; + ; + } + __sid_13_label: ; + /*@ behavior neg: + assumes *a < 0; + returns \old(*a) ≡ -*a; */ + if (*a < 0) { + *a = - *a; + __retres = -1; + /*@ assert \at(*a < 0,__sid_13_label) ⇒ \at(*a,__sid_13_label) ≡ -*a; + */ + ; + goto return_label; + } + if (*a != 0) { + int *tmp_0; + { + /*sequence*/ + tmp_0 = a; + a ++; + ; + } + __retres = 0; + goto return_label; + } + __retres = 1; + return_label: return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/separated.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/separated.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/separated.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/separated.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/separated.c (with preprocessing) +/* Generated by Frama-C */ +/*@ requires \base_addr(q) ≢ p; + requires \separated(p, q); + requires \valid(p+(0 .. n-1)); + requires \valid(q+(0 .. n-1)); + assigns *(p+(0 .. n-1)); + */ +void put(char *p, char *q, int n) +{ + int i; + i = 0; + while (i < n) { + { + char *tmp; + char *tmp_0; + /*@ assert \separated(p, q); */ ; + { + /*sequence*/ + tmp = p; + p ++; + tmp_0 = q; + q ++; + *tmp = *tmp_0; + } + } + i ++; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/shifts.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/shifts.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/shifts.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/shifts.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,36 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/shifts.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + e ∈ {0} +[value] computing for function f <- main. + Called from tests/spec/shifts.c:19. +tests/spec/shifts.c:13:[value] Assertion got status valid. +tests/spec/shifts.c:8:[value] Function f, behavior a: postcondition got status valid. +tests/spec/shifts.c:9:[value] Function f, behavior b: postcondition got status valid. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + e ∈ {168} + y ∈ {168} +[value] Values at end of function main: + e ∈ {168} + __retres ∈ {0} +[from] Computing for function f +[from] Done for function f +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function f: + e FROM x + \result FROM x +[from] Function main: + e FROM \nothing + \result FROM \nothing +[from] ====== END OF DEPENDENCIES ====== diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/sizeof_incomplete_bts1538.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/sizeof_incomplete_bts1538.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/sizeof_incomplete_bts1538.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/sizeof_incomplete_bts1538.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/sizeof_incomplete_bts1538.i (no preprocessing) +/* Generated by Frama-C */ +int t[10]; +void main(void) +{ + int v; + v = (int)sizeof(t); + /*@ + assert /* type:ℤ *//* type:int */v ≡ /* type:ℤ */sizeof(int [10]); */ + ; + /*@ assert /* type:ℤ */sizeof(/* type:int [10] */t) ≡ /* type:ℤ */0; + */ + ; + /*@ + assert + /* type:ℤ */sizeof(/* type:int [10] */t) ≡ + /* type:ℤ */sizeof(int [10]); */ + ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/sizeof_logic.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/sizeof_logic.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/sizeof_logic.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/sizeof_logic.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,8 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/sizeof_logic.i (no preprocessing) +tests/spec/sizeof_logic.i:1:[kernel] warning: sizeof can only handle C types in annotation. +tests/spec/sizeof_logic.i:3:[kernel] warning: sizeof can only handle C types in annotation. +/* Generated by Frama-C */ +/*@ lemma good: ∀ short x; sizeof(x) ≤ sizeof(int); + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/sizeof.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/sizeof.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/sizeof.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/sizeof.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,11 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/sizeof.c (with preprocessing) +/* Generated by Frama-C */ +/*@ requires i > sizeof(int); + ensures \result > sizeof(\old(i)); */ +int f(int i) +{ + return i; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/spec_zero_arg.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/spec_zero_arg.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/spec_zero_arg.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/spec_zero_arg.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/spec_zero_arg.c (with preprocessing) +/* Generated by Frama-C */ +int e; +/*@ requires e > 0; */ +extern void f(void); + +/*@ requires e > 0; */ +extern void g(); + +int x; +void i(int b); + +/*@ requires b > 0; */ +void i(int b) +{ + x = b; + return; +} + +void h(void) +{ + f(); + g(); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/statement_behavior.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/statement_behavior.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/statement_behavior.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/statement_behavior.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,37 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/statement_behavior.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +[value] computing for function pfsqopfc <- main. + Called from tests/spec/statement_behavior.c:23. +tests/spec/statement_behavior.c:13:[value] warning: assuming assembly code has no effects in function pfsqopfc +tests/spec/statement_behavior.c:17:[value] Assertion got status unknown. +tests/spec/statement_behavior.c:4:[value] Function pfsqopfc: postcondition got status unknown. +[value] Recording results for pfsqopfc +[value] Done for function pfsqopfc +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function pfsqopfc: + +[value] Values at end of function main: + x ∈ {1} + y ∈ UNINITIALIZED + __retres ∈ {0} +[inout] InOut (internal) for function pfsqopfc: + Operational inputs: + five_times + Operational inputs on termination: + five_times + Sure outputs: + \nothing +[inout] InOut (internal) for function main: + Operational inputs: + \nothing + Operational inputs on termination: + \nothing + Sure outputs: + x; y; __retres diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/stmt_contract.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/stmt_contract.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/stmt_contract.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/stmt_contract.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,46 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/stmt_contract.i (no preprocessing) +tests/spec/stmt_contract.i:18:[kernel] warning: \result meaningless in annotation. +/* Generated by Frama-C */ +int main(int c) +{ + int __retres; + int x; + int y; + x = 5; + y = 2; + /*@ requires x ≡ 5; */ + /*@ requires y ≡ 2; */ + x += y; + /*@ assigns __retres, \result; + assigns __retres \from x, y; + assigns \result \from x, y; + */ + if (c) { + /*@ assigns __retres, \result; + assigns __retres \from x; + assigns \result \from x; + */ + { + __retres = x; + goto return_label; + } + } + else + while (1) { + __retres = y; + goto return_label; + } + /*@ assigns __retres, x; */ + if (c) { + x ++; + __retres = x; + goto return_label; + } + /*@ requires x ≡ 7; */ + /*@ ensures x ≡ 7; */ + __retres = 0; + return_label: return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/string.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/string.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/string.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/string.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,11 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/string.c (with preprocessing) +/* Generated by Frama-C */ +/*@ logic char * foo= "Styfoo"; + */ +/*@ logic unsigned long * bar= (unsigned long *)L"\xABCD" "t" "5" "a" "b" ; + */ +/*@ logic char * split= "abcdef"; + */ +unsigned long *test = (unsigned long *)L"\xABCD" "t" "5" "a" "b" ; + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/struct_invariant.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/struct_invariant.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/struct_invariant.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/struct_invariant.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,21 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/struct_invariant.c (with preprocessing) +tests/spec/struct_invariant.c:18:[kernel] user error: In annotation: already declared logic function or predicate u_inv with same profile +/* Generated by Frama-C */ +struct T { + int ok ; + int *pt ; + int tab[10] ; +}; +struct T u; +/*@ type invariant pt_validity(struct T t) = t.ok ≢ 0 ⇒ \valid(t.pt); + */ +/*@ +type invariant tab_nonnegative(struct T t) = + ∀ int i; 0 ≤ i < 10 ⇒ t.tab[i] ≥ 0; + */ +/*@ type invariant strange(struct T t) = t ≡ u; + */ +/*@ global invariant u_inv: u.ok ≡ 1; + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/tableau_zones.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/tableau_zones.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/tableau_zones.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/tableau_zones.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,42 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/tableau_zones.c (with preprocessing) +/* Generated by Frama-C */ +/*@ requires \valid(p); + ensures *\old(p) ≡ \old(n); + assigns *p; */ +int f(int *p, int n) +{ + int __retres; + *p = n; + __retres = 0; + return __retres; +} + +int t[10]; +/*@ ensures t[0] ≡ 0; */ +int main(void) +{ + int __retres; + int i; + i = 0; + /*@ loop invariant + 0 ≤ i ≤ 5 ∧ (∀ int j; 0 ≤ j < i ⇒ t[j] ≡ 0); + */ + while (i < 5) { + f(& t[i],0); + i ++; + } + i = 5; + /*@ loop invariant + 5 ≤ i ≤ 10 ∧ (∀ int j; 5 ≤ j < i ⇒ t[j] ≡ 1); + loop assigns t[5 .. 9]; + */ + while (i < 10) { + f(& t[i],1); + i ++; + } + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/temporal.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/temporal.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/temporal.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/temporal.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,468 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/temporal.i (no preprocessing) +/* Generated by Frama-C */ +enum aorai_States { + S5 = 4, + S4 = 6, + S3 = 5, + S2 = 3, + S1 = 0, + OK = 2, + S0 = 1 +}; +enum aorai_ListOper { + op_g = 2, + op_f = 1, + op_h = 0 +}; +enum aorai_OpStatusList { + aorai_Terminated = 1, + aorai_Called = 0 +}; +extern int g_calls; + +int g(int x); + +void h(void); + +extern int random(); + +extern int NB; + +extern int G_i; + +int aorai_CurStates[7] = {1, 0, 0, 0, 0, 0, 0}; +int aorai_CurTrans[9] = + {1, 0, 0, 0, 0, 0, 0, 0, 0}; +int aorai_CurStates_old[7] = {0, 1, 0, 0, 0, 0, 0}; +enum aorai_ListOper aorai_CurOperation = op_f; +enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; +int aorai_Loop_Init_38 = 0; +/*@ +axiomatic aorai_Trans_Start { + logic ℤ aorai_Trans_Start(ℤ tr) ; + + axiom aorai_Trans_Start0: aorai_Trans_Start(0) ≡ 1; + + axiom aorai_Trans_Start1: aorai_Trans_Start(1) ≡ 0; + + axiom aorai_Trans_Start2: aorai_Trans_Start(2) ≡ 0; + + axiom aorai_Trans_Start3: aorai_Trans_Start(3) ≡ 3; + + axiom aorai_Trans_Start4: aorai_Trans_Start(4) ≡ 3; + + axiom aorai_Trans_Start5: aorai_Trans_Start(5) ≡ 3; + + axiom aorai_Trans_Start6: aorai_Trans_Start(6) ≡ 5; + + axiom aorai_Trans_Start7: aorai_Trans_Start(7) ≡ 6; + + axiom aorai_Trans_Start8: aorai_Trans_Start(8) ≡ 4; + + } + */ +/*@ +axiomatic aorai_Trans_Stop { + logic ℤ aorai_Trans_Stop(ℤ tr) ; + + axiom aorai_Trans_Stop0: aorai_Trans_Stop(0) ≡ 0; + + axiom aorai_Trans_Stop1: aorai_Trans_Stop(1) ≡ 2; + + axiom aorai_Trans_Stop2: aorai_Trans_Stop(2) ≡ 3; + + axiom aorai_Trans_Stop3: aorai_Trans_Stop(3) ≡ 0; + + axiom aorai_Trans_Stop4: aorai_Trans_Stop(4) ≡ 4; + + axiom aorai_Trans_Stop5: aorai_Trans_Stop(5) ≡ 5; + + axiom aorai_Trans_Stop6: aorai_Trans_Stop(6) ≡ 6; + + axiom aorai_Trans_Stop7: aorai_Trans_Stop(7) ≡ 4; + + axiom aorai_Trans_Stop8: aorai_Trans_Stop(8) ≡ 2; + + } + */ +/*@ +predicate aorai_Trans_Cond_param{L} + (ℤ _aorai_numTrans, ℤ _aorai_op, ℤ _aorai_status) = + (_aorai_numTrans ≡ 0 ⇒ + _aorai_op ≡ op_f ∧ _aorai_status ≡ aorai_Called) ∧ + (_aorai_numTrans ≡ 1 ⇒ + _aorai_op ≡ op_f ∧ _aorai_status ≡ aorai_Terminated ∧ NB ≤ 0) ∧ + (_aorai_numTrans ≡ 2 ⇒ + _aorai_op ≡ op_g ∧ _aorai_status ≡ aorai_Called ∧ NB > 0 ∧ + g_calls < NB ∧ 0 ≤ g_calls) ∧ + (_aorai_numTrans ≡ 3 ⇒ + G_i ≡ 0 ∧ g_calls < NB ∧ _aorai_op ≡ op_g ∧ + _aorai_status ≡ aorai_Terminated) ∧ + (_aorai_numTrans ≡ 4 ⇒ + G_i ≡ 0 ∧ g_calls ≡ NB ∧ _aorai_op ≡ op_g ∧ + _aorai_status ≡ aorai_Terminated) ∧ + (_aorai_numTrans ≡ 5 ⇒ + G_i ≢ 0 ∧ _aorai_op ≡ op_g ∧ _aorai_status ≡ aorai_Terminated) ∧ + (_aorai_numTrans ≡ 6 ⇒ + _aorai_op ≡ op_h ∧ _aorai_status ≡ aorai_Called) ∧ + (_aorai_numTrans ≡ 7 ⇒ + _aorai_op ≡ op_h ∧ _aorai_status ≡ aorai_Terminated) ∧ + (_aorai_numTrans ≡ 8 ⇒ + _aorai_op ≡ op_f ∧ _aorai_status ≡ aorai_Terminated); + */ +/*@ +predicate aorai_Trans_Cond{L}(ℤ _aorai_numTrans) = + aorai_Trans_Cond_param{L}(_aorai_numTrans, aorai_CurOperation, + aorai_CurOpStatus); + */ +/*@ +global invariant _Buch_not_crossable_cond: + ∀ ℤ _buch_tr; + 0 ≤ _buch_tr < 9 ∧ ¬aorai_Trans_Cond(_buch_tr) ⇒ + aorai_CurTrans[_buch_tr] ≡ 0; + */ +/*@ +global invariant _Buch_not_crossable_start: + ∀ ℤ _buch_tr; + 0 ≤ _buch_tr < 9 ∧ + aorai_CurStates_old[aorai_Trans_Start(_buch_tr)] ≡ 0 ⇒ + aorai_CurTrans[_buch_tr] ≡ 0; + */ +/*@ +global invariant _Buch_not_reachable: + ∀ ℤ _buch_st; + 0 ≤ _buch_st < 7 ∧ + (∀ ℤ _buch_tr; + 0 ≤ _buch_tr < 9 ⇒ + aorai_CurTrans[_buch_tr] ≡ 0 ∨ + aorai_Trans_Stop(_buch_tr) ≢ _buch_st) ⇒ + aorai_CurStates[_buch_st] ≡ 0; + */ +/*@ requires + 0 ≡ aorai_CurTrans[0] ∧ 0 ≡ aorai_CurTrans[1] ∧ + 0 ≡ aorai_CurTrans[3] ∧ 0 ≡ aorai_CurTrans[4] ∧ + 0 ≡ aorai_CurTrans[5] ∧ 0 ≡ aorai_CurTrans[6] ∧ + 0 ≡ aorai_CurTrans[7] ∧ 0 ≡ aorai_CurTrans[8]; + requires 0 ≢ aorai_CurTrans[2]; + requires + 0 ≡ aorai_CurStates[S1] ∧ 0 ≡ aorai_CurStates[S0] ∧ + 0 ≡ aorai_CurStates[OK] ∧ 0 ≡ aorai_CurStates[S5] ∧ + 0 ≡ aorai_CurStates[S3] ∧ 0 ≡ aorai_CurStates[S4]; + requires 0 ≢ aorai_CurStates[S2]; + requires + aorai_CurTrans[2] ≢ 0 ⇒ NB > 0 ∧ g_calls < NB ∧ 0 ≤ g_calls; + + behavior Buchi_property_behavior_3: + ensures + (aorai_CurTrans[5] ≢ 0 ⇒ G_i ≢ 0) ∧ + (aorai_CurTrans[4] ≢ 0 ⇒ G_i ≡ 0 ∧ g_calls ≡ NB) ∧ + (aorai_CurTrans[3] ≢ 0 ⇒ G_i ≡ 0 ∧ g_calls < NB); + ensures + 0 ≡ aorai_CurTrans[0] ∧ 0 ≡ aorai_CurTrans[1] ∧ + 0 ≡ aorai_CurTrans[2] ∧ 0 ≡ aorai_CurTrans[6] ∧ + 0 ≡ aorai_CurTrans[7] ∧ 0 ≡ aorai_CurTrans[8]; + ensures + 0 ≢ aorai_CurTrans[3] ∨ 0 ≢ aorai_CurTrans[4] ∨ + 0 ≢ aorai_CurTrans[5]; + ensures + 0 ≡ aorai_CurStates[S0] ∧ 0 ≡ aorai_CurStates[OK] ∧ + 0 ≡ aorai_CurStates[S2] ∧ 0 ≡ aorai_CurStates[S4]; + ensures + 0 ≢ aorai_CurStates[S1] ∨ 0 ≢ aorai_CurStates[S5] ∨ + 0 ≢ aorai_CurStates[S3]; + + behavior default: + ensures g_calls ≡ \old(g_calls)+1; + assigns g_calls; + */ +int g(int x) +{ + int tmp; + int tmp_0; + int tmp_1; + int tmp_2; + g_calls ++; + tmp = random(); + aorai_CurOperation = op_g; + aorai_CurOpStatus = aorai_Terminated; + aorai_CurStates_old[S5] = 0; + aorai_CurStates_old[S4] = 0; + aorai_CurStates_old[S3] = 0; + aorai_CurStates_old[S2] = aorai_CurStates[3]; + aorai_CurStates_old[S1] = 0; + aorai_CurStates_old[OK] = 0; + aorai_CurStates_old[S0] = 0; + aorai_CurTrans[0] = 0; + aorai_CurTrans[1] = 0; + aorai_CurTrans[2] = 0; + { + /*sequence*/ + if (G_i == 0) + if (g_calls < NB) + if (aorai_CurStates_old[3]) tmp_0 = 1; else tmp_0 = 0; + else tmp_0 = 0; + else tmp_0 = 0; + aorai_CurTrans[3] = tmp_0; + } + { + /*sequence*/ + if (G_i == 0) + if (g_calls == NB) + if (aorai_CurStates_old[3]) tmp_1 = 1; else tmp_1 = 0; + else tmp_1 = 0; + else tmp_1 = 0; + aorai_CurTrans[4] = tmp_1; + } + { + /*sequence*/ + if (G_i != 0) + if (aorai_CurStates_old[3]) tmp_2 = 1; else tmp_2 = 0; + else tmp_2 = 0; + aorai_CurTrans[5] = tmp_2; + } + aorai_CurTrans[6] = 0; + aorai_CurTrans[7] = 0; + aorai_CurTrans[8] = 0; + aorai_CurStates[S5] = aorai_CurTrans[4]; + aorai_CurStates[S4] = 0; + aorai_CurStates[S3] = aorai_CurTrans[5]; + aorai_CurStates[S2] = 0; + aorai_CurStates[S1] = aorai_CurTrans[3]; + aorai_CurStates[OK] = 0; + aorai_CurStates[S0] = 0; + return tmp; +} + +/*@ requires + 0 ≡ aorai_CurTrans[0] ∧ 0 ≡ aorai_CurTrans[1] ∧ + 0 ≡ aorai_CurTrans[2] ∧ 0 ≡ aorai_CurTrans[3] ∧ + 0 ≡ aorai_CurTrans[4] ∧ 0 ≡ aorai_CurTrans[5] ∧ + 0 ≡ aorai_CurTrans[7] ∧ 0 ≡ aorai_CurTrans[8]; + requires 0 ≢ aorai_CurTrans[6]; + requires + 0 ≡ aorai_CurStates[S1] ∧ 0 ≡ aorai_CurStates[S0] ∧ + 0 ≡ aorai_CurStates[OK] ∧ 0 ≡ aorai_CurStates[S2] ∧ + 0 ≡ aorai_CurStates[S5] ∧ 0 ≡ aorai_CurStates[S3]; + requires 0 ≢ aorai_CurStates[S4]; + + behavior Buchi_property_behavior_6: + ensures + 0 ≡ aorai_CurTrans[0] ∧ 0 ≡ aorai_CurTrans[1] ∧ + 0 ≡ aorai_CurTrans[2] ∧ 0 ≡ aorai_CurTrans[3] ∧ + 0 ≡ aorai_CurTrans[4] ∧ 0 ≡ aorai_CurTrans[5] ∧ + 0 ≡ aorai_CurTrans[6] ∧ 0 ≡ aorai_CurTrans[8]; + ensures 0 ≢ aorai_CurTrans[7]; + ensures + 0 ≡ aorai_CurStates[S1] ∧ 0 ≡ aorai_CurStates[S0] ∧ + 0 ≡ aorai_CurStates[OK] ∧ 0 ≡ aorai_CurStates[S2] ∧ + 0 ≡ aorai_CurStates[S3] ∧ 0 ≡ aorai_CurStates[S4]; + ensures 0 ≢ aorai_CurStates[S5]; + + behavior default: + assigns \nothing; + */ +void h(void) +{ + aorai_CurOperation = op_h; + aorai_CurOpStatus = aorai_Terminated; + aorai_CurStates_old[S5] = 0; + aorai_CurStates_old[S4] = aorai_CurStates[6]; + aorai_CurStates_old[S3] = 0; + aorai_CurStates_old[S2] = 0; + aorai_CurStates_old[S1] = 0; + aorai_CurStates_old[OK] = 0; + aorai_CurStates_old[S0] = 0; + aorai_CurTrans[0] = 0; + aorai_CurTrans[1] = 0; + aorai_CurTrans[2] = 0; + aorai_CurTrans[3] = 0; + aorai_CurTrans[4] = 0; + aorai_CurTrans[5] = 0; + aorai_CurTrans[6] = 0; + aorai_CurTrans[7] = aorai_CurStates_old[6]; + aorai_CurTrans[8] = 0; + aorai_CurStates[S5] = aorai_CurTrans[7]; + aorai_CurStates[S4] = 0; + aorai_CurStates[S3] = 0; + aorai_CurStates[S2] = 0; + aorai_CurStates[S1] = 0; + aorai_CurStates[OK] = 0; + aorai_CurStates[S0] = 0; + return; +} + +/*@ requires + 0 ≡ aorai_CurTrans[1] ∧ 0 ≡ aorai_CurTrans[2] ∧ + 0 ≡ aorai_CurTrans[3] ∧ 0 ≡ aorai_CurTrans[4] ∧ + 0 ≡ aorai_CurTrans[5] ∧ 0 ≡ aorai_CurTrans[6] ∧ + 0 ≡ aorai_CurTrans[7] ∧ 0 ≡ aorai_CurTrans[8]; + requires 0 ≢ aorai_CurTrans[0]; + requires + 0 ≡ aorai_CurStates[S0] ∧ 0 ≡ aorai_CurStates[OK] ∧ + 0 ≡ aorai_CurStates[S2] ∧ 0 ≡ aorai_CurStates[S5] ∧ + 0 ≡ aorai_CurStates[S3] ∧ 0 ≡ aorai_CurStates[S4]; + requires 0 ≢ aorai_CurStates[S1]; + + behavior Buchi_property_behavior_0: + ensures aorai_CurTrans[1] ≢ 0 ⇒ NB ≤ 0; + ensures + 0 ≡ aorai_CurTrans[0] ∧ 0 ≡ aorai_CurTrans[2] ∧ + 0 ≡ aorai_CurTrans[3] ∧ 0 ≡ aorai_CurTrans[4] ∧ + 0 ≡ aorai_CurTrans[5] ∧ 0 ≡ aorai_CurTrans[6] ∧ + 0 ≡ aorai_CurTrans[7]; + ensures 0 ≢ aorai_CurTrans[1] ∨ 0 ≢ aorai_CurTrans[8]; + ensures + 0 ≡ aorai_CurStates[S1] ∧ 0 ≡ aorai_CurStates[S0] ∧ + 0 ≡ aorai_CurStates[S2] ∧ 0 ≡ aorai_CurStates[S5] ∧ + 0 ≡ aorai_CurStates[S3] ∧ 0 ≡ aorai_CurStates[S4]; + ensures 0 ≢ aorai_CurStates[OK]; + */ +void f(int N) +{ + int i; + int t; + int tmp_0; + int tmp_1; + i = 0; + t = 0; + G_i = 0; + g_calls = G_i; + NB = N; + aorai_Loop_Init_38 = 1; + /*@ loop invariant + (0 ≢ aorai_CurStates[S1] ∨ 0 ≢ aorai_CurStates[S5] ∨ + 0 ≢ aorai_CurStates[S3]) ∧ + 0 ≡ aorai_CurStates[S0] ∧ 0 ≡ aorai_CurStates[OK] ∧ + 0 ≡ aorai_CurStates[S2] ∧ 0 ≡ aorai_CurStates[S4] ∧ + (0 ≢ aorai_CurTrans[0] ∨ 0 ≢ aorai_CurTrans[3] ∨ + 0 ≢ aorai_CurTrans[4] ∨ 0 ≢ aorai_CurTrans[5]) ∧ + 0 ≡ aorai_CurTrans[1] ∧ 0 ≡ aorai_CurTrans[2] ∧ + 0 ≡ aorai_CurTrans[6] ∧ 0 ≡ aorai_CurTrans[7] ∧ + 0 ≡ aorai_CurTrans[8]; + loop invariant + aorai_Loop_Init_38 ≢ 0 ⇒ + aorai_CurStates[4] ≡ 0 ∧ aorai_CurStates[5] ≡ 0 ∧ + aorai_CurTrans[3] ≡ 0 ∧ aorai_CurTrans[4] ≡ 0 ∧ + aorai_CurTrans[5] ≡ 0; + loop invariant aorai_Loop_Init_38 ≡ 0 ⇒ aorai_CurTrans[0] ≡ 0; + */ + while (1) { + { + int tmp; + if (i < N) { + if (! (! t)) goto while_0_break; + } + else goto while_0_break; + aorai_Loop_Init_38 = 0; + aorai_CurOperation = op_g; + aorai_CurOpStatus = aorai_Called; + aorai_CurStates_old[S5] = 0; + aorai_CurStates_old[S4] = 0; + aorai_CurStates_old[S3] = 0; + aorai_CurStates_old[S2] = 0; + aorai_CurStates_old[S1] = aorai_CurStates[0]; + aorai_CurStates_old[OK] = 0; + aorai_CurStates_old[S0] = 0; + aorai_CurTrans[0] = 0; + aorai_CurTrans[1] = 0; + { + /*sequence*/ + if (NB > 0) + if (g_calls < NB) + if (0 <= g_calls) + if (aorai_CurStates_old[0]) tmp = 1; else tmp = 0; + else tmp = 0; + else tmp = 0; + else tmp = 0; + aorai_CurTrans[2] = tmp; + } + aorai_CurTrans[3] = 0; + aorai_CurTrans[4] = 0; + aorai_CurTrans[5] = 0; + aorai_CurTrans[6] = 0; + aorai_CurTrans[7] = 0; + aorai_CurTrans[8] = 0; + aorai_CurStates[S5] = 0; + aorai_CurStates[S4] = 0; + aorai_CurStates[S3] = 0; + aorai_CurStates[S2] = aorai_CurTrans[2]; + aorai_CurStates[S1] = 0; + aorai_CurStates[OK] = 0; + aorai_CurStates[S0] = 0; + t = g(i); + G_i = t; + i ++; + g_calls = i; + } + } + while_0_break: ; + if (t) { + aorai_CurOperation = op_h; + aorai_CurOpStatus = aorai_Called; + aorai_CurStates_old[S5] = 0; + aorai_CurStates_old[S4] = 0; + aorai_CurStates_old[S3] = aorai_CurStates[5]; + aorai_CurStates_old[S2] = 0; + aorai_CurStates_old[S1] = 0; + aorai_CurStates_old[OK] = 0; + aorai_CurStates_old[S0] = 0; + aorai_CurTrans[0] = 0; + aorai_CurTrans[1] = 0; + aorai_CurTrans[2] = 0; + aorai_CurTrans[3] = 0; + aorai_CurTrans[4] = 0; + aorai_CurTrans[5] = 0; + aorai_CurTrans[6] = aorai_CurStates_old[5]; + aorai_CurTrans[7] = 0; + aorai_CurTrans[8] = 0; + aorai_CurStates[S5] = 0; + aorai_CurStates[S4] = aorai_CurTrans[6]; + aorai_CurStates[S3] = 0; + aorai_CurStates[S2] = 0; + aorai_CurStates[S1] = 0; + aorai_CurStates[OK] = 0; + aorai_CurStates[S0] = 0; + h(); + } + aorai_CurOperation = op_f; + aorai_CurOpStatus = aorai_Terminated; + aorai_CurStates_old[S5] = aorai_CurStates[4]; + aorai_CurStates_old[S4] = 0; + aorai_CurStates_old[S3] = 0; + aorai_CurStates_old[S2] = 0; + aorai_CurStates_old[S1] = aorai_CurStates[0]; + aorai_CurStates_old[OK] = 0; + aorai_CurStates_old[S0] = 0; + aorai_CurTrans[0] = 0; + { + /*sequence*/ + if (NB <= 0) + if (aorai_CurStates_old[0]) tmp_0 = 1; else tmp_0 = 0; + else tmp_0 = 0; + aorai_CurTrans[1] = tmp_0; + } + aorai_CurTrans[2] = 0; + aorai_CurTrans[3] = 0; + aorai_CurTrans[4] = 0; + aorai_CurTrans[5] = 0; + aorai_CurTrans[6] = 0; + aorai_CurTrans[7] = 0; + aorai_CurTrans[8] = aorai_CurStates_old[4]; + aorai_CurStates[S5] = 0; + aorai_CurStates[S4] = 0; + aorai_CurStates[S3] = 0; + aorai_CurStates[S2] = 0; + aorai_CurStates[S1] = 0; + { + /*sequence*/ + if (aorai_CurTrans[8]) tmp_1 = 1; + else + if (aorai_CurTrans[1]) tmp_1 = 1; else tmp_1 = 0; + aorai_CurStates[OK] = tmp_1; + } + aorai_CurStates[S0] = 0; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/terminates.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/terminates.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/terminates.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/terminates.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,12 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/terminates.c (with preprocessing) +/* Generated by Frama-C */ +/*@ terminates c > 0; + assigns \nothing; */ +void f(int c) +{ + while (! c) ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/transitive_rel.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/transitive_rel.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/transitive_rel.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/transitive_rel.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,11 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/transitive_rel.c (with preprocessing) +tests/spec/transitive_rel.c:16:[kernel] warning: Inconsistent relation chain. +/* Generated by Frama-C */ +/*@ predicate bound(int x, int y, int z) = x ≤ y < z ∧ z ≥ y > x; + */ +/*@ predicate bound2(int x, int y, int z) = x ≤ y ≡ z; + */ +/*@ predicate test(int x, int y, 𝔹 z) = (x≤y) ≡ z; + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/tsets.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/tsets.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/tsets.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/tsets.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,83 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/tsets.c (with preprocessing) +tests/spec/tsets.c:39:[kernel] warning: comparison of incompatible types: set + and ℤ in annotation. +tests/spec/tsets.c:40:[kernel] warning: comparison of incompatible types: set + and ℤ in annotation. +tests/spec/tsets.c:41:[kernel] warning: comparison of incompatible types: ℤ and set + in annotation. +tests/spec/tsets.c:42:[kernel] warning: comparison of incompatible types: ℤ and set + in annotation. +/* Generated by Frama-C */ +struct foo { + char bar[4] ; +}; +typedef char baz[4]; +struct bli { + baz bli ; +}; +/*@ assigns x->bar[0 .. 3]; + assigns x->bar[0 .. 3] \from x->bar[0 .. 3]; */ +extern int f(struct foo *x); + +/*@ assigns *(x+(0 .. 3)); + assigns *(x+(0 .. 3)) \from y->bli[0 .. 3]; */ +extern int g(char * /*[4]*/ x, struct bli *y); + +int main(void) +{ + int __retres; + struct foo x; + baz y; + struct bli z; + f(& x); + g(y,& z); + /*@ assert \separated(&x, &y[2]); */ ; + __retres = 0; + return __retres; +} + +/*@ +predicate test1(set s1, set s2) = + \subset(s1, \union(s2, {k+1 | int k; constraint: 0 ≤ k < 10})); + */ +/*@ +predicate test2(set s1, set s2) = + \subset(\union({k+1 | int k; constraint: 0 ≤ k < 10}, s2), s1); + +*/ +/*@ ensures \subset(\result, \union(\old(x), \old(x)+1, \old(x)-1)); */ +int h(int x, int c) +{ + int tmp_0; + if (c > 0) tmp_0 = x + 1; + else { + int tmp; + { + /*sequence*/ + if (c < 0) tmp = x - 1; else tmp = x; + tmp_0 = tmp; + } + } + return tmp_0; +} + +/*@ requires \valid(\union(*(a+(0 .. 1)), *(b+(0 .. 1)))); */ +int foo(int **a, int **b) +{ + int __retres; + __retres = 0; + return __retres; +} + +/*@ +predicate test_singleton_1{L}(int *a, int x) = \at(x ≡ *(a+(0 .. 1)),L); + */ +/*@ predicate test_singleton_2{L}(int *a) = \at(*(a+(0 .. 1)) ≡ 0,L); + +*/ +int A[100]; +/*@ ensures \subset(\result, &A[0 ..]); */ +extern int *AA(void); + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/typedef.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/typedef.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/typedef.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/typedef.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,20 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/typedef.c (with preprocessing) +/* Generated by Frama-C */ +struct _list { + int i ; +}; +typedef struct _list *list; +/*@ requires \valid(p); */ +void f(list p) +{ + return; +} + +/*@ requires \valid(p); */ +void g(struct _list *p) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/type_of_term.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/type_of_term.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/type_of_term.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/type_of_term.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,261 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/type_of_term.i (no preprocessing) +[type_of_term] Term: dest+(0 .. n-1), type is set +[type_of_term] Term: dest, type is unsigned char * +[type_of_term] Host: dest, type is unsigned char * +[type_of_term] Offset: , type is unsigned char * +[type_of_term] Lval: dest, type is unsigned char * +[type_of_term] Term: 0 .. n-1, type is set<ℤ> +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: n-1, type is ℤ +[type_of_term] Term: n, type is ℤ +[type_of_term] Term: n, type is unsigned long +[type_of_term] Host: n, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: n, type is unsigned long +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: i, type is ℤ +[type_of_term] Host: i, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: i, type is ℤ +[type_of_term] Term: i, type is ℤ +[type_of_term] Host: i, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: i, type is ℤ +[type_of_term] Term: \old(n), type is ℤ +[type_of_term] Term: \old(n), type is unsigned long +[type_of_term] Term: n, type is unsigned long +[type_of_term] Host: n, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: n, type is unsigned long +[type_of_term] Term: *(\old(dest)+i), type is ℤ +[type_of_term] Term: *(\old(dest)+i), type is unsigned char +[type_of_term] Host: *(\old(dest)+i), type is unsigned char +[type_of_term] Offset: , type is unsigned char +[type_of_term] Lval: *(\old(dest)+i), type is unsigned char +[type_of_term] Term: \old(dest)+i, type is unsigned char * +[type_of_term] Term: \old(dest), type is unsigned char * +[type_of_term] Term: dest, type is unsigned char * +[type_of_term] Host: dest, type is unsigned char * +[type_of_term] Offset: , type is unsigned char * +[type_of_term] Lval: dest, type is unsigned char * +[type_of_term] Term: i, type is ℤ +[type_of_term] Host: i, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: i, type is ℤ +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: *(dest+(0 .. n-1)), type is set +[type_of_term] Host: *(dest+(0 .. n-1)), type is set +[type_of_term] Offset: , type is set +[type_of_term] Lval: *(dest+(0 .. n-1)), type is set +[type_of_term] Term: dest+(0 .. n-1), type is set +[type_of_term] Term: dest, type is unsigned char * +[type_of_term] Host: dest, type is unsigned char * +[type_of_term] Offset: , type is unsigned char * +[type_of_term] Lval: dest, type is unsigned char * +[type_of_term] Term: 0 .. n-1, type is set<ℤ> +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: n-1, type is ℤ +[type_of_term] Term: n, type is ℤ +[type_of_term] Term: n, type is unsigned long +[type_of_term] Host: n, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: n, type is unsigned long +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: dest+(0 .. size*n-1), type is set +[type_of_term] Term: dest, type is unsigned char * +[type_of_term] Host: dest, type is unsigned char * +[type_of_term] Offset: , type is unsigned char * +[type_of_term] Lval: dest, type is unsigned char * +[type_of_term] Term: 0 .. size*n-1, type is set<ℤ> +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: size*n-1, type is ℤ +[type_of_term] Term: size*n, type is ℤ +[type_of_term] Term: size, type is ℤ +[type_of_term] Term: size, type is unsigned long +[type_of_term] Host: size, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: size, type is unsigned long +[type_of_term] Term: n, type is ℤ +[type_of_term] Term: n, type is unsigned long +[type_of_term] Host: n, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: n, type is unsigned long +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: n, type is ℤ +[type_of_term] Term: n, type is unsigned long +[type_of_term] Host: n, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: n, type is unsigned long +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: i, type is ℤ +[type_of_term] Host: i, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: i, type is ℤ +[type_of_term] Term: i, type is ℤ +[type_of_term] Host: i, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: i, type is ℤ +[type_of_term] Term: \old(size), type is ℤ +[type_of_term] Term: \old(size), type is unsigned long +[type_of_term] Term: size, type is unsigned long +[type_of_term] Host: size, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: size, type is unsigned long +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: j, type is ℤ +[type_of_term] Host: j, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: j, type is ℤ +[type_of_term] Term: j, type is ℤ +[type_of_term] Host: j, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: j, type is ℤ +[type_of_term] Term: \old(n), type is ℤ +[type_of_term] Term: \old(n), type is unsigned long +[type_of_term] Term: n, type is unsigned long +[type_of_term] Host: n, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: n, type is unsigned long +[type_of_term] Term: *(\old(dest)+(i+j*\old(size))), type is unsigned char +[type_of_term] Host: *(\old(dest)+(i+j*\old(size))), type is unsigned char +[type_of_term] Offset: , type is unsigned char +[type_of_term] Lval: *(\old(dest)+(i+j*\old(size))), type is unsigned char +[type_of_term] Term: \old(dest)+(i+j*\old(size)), type is unsigned char * +[type_of_term] Term: \old(dest), type is unsigned char * +[type_of_term] Term: dest, type is unsigned char * +[type_of_term] Host: dest, type is unsigned char * +[type_of_term] Offset: , type is unsigned char * +[type_of_term] Lval: dest, type is unsigned char * +[type_of_term] Term: i+j*\old(size), type is ℤ +[type_of_term] Term: i, type is ℤ +[type_of_term] Host: i, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: i, type is ℤ +[type_of_term] Term: j*\old(size), type is ℤ +[type_of_term] Term: j, type is ℤ +[type_of_term] Host: j, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: j, type is ℤ +[type_of_term] Term: \old(size), type is ℤ +[type_of_term] Term: \old(size), type is unsigned long +[type_of_term] Term: size, type is unsigned long +[type_of_term] Host: size, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: size, type is unsigned long +[type_of_term] Term: *(\old(dest)+i), type is unsigned char +[type_of_term] Host: *(\old(dest)+i), type is unsigned char +[type_of_term] Offset: , type is unsigned char +[type_of_term] Lval: *(\old(dest)+i), type is unsigned char +[type_of_term] Term: \old(dest)+i, type is unsigned char * +[type_of_term] Term: \old(dest), type is unsigned char * +[type_of_term] Term: dest, type is unsigned char * +[type_of_term] Host: dest, type is unsigned char * +[type_of_term] Offset: , type is unsigned char * +[type_of_term] Lval: dest, type is unsigned char * +[type_of_term] Term: i, type is ℤ +[type_of_term] Host: i, type is ℤ +[type_of_term] Offset: , type is ℤ +[type_of_term] Lval: i, type is ℤ +[type_of_term] Term: *(dest+(size .. size*n-1)), type is set +[type_of_term] Host: *(dest+(size .. size*n-1)), type is set +[type_of_term] Offset: , type is set +[type_of_term] Lval: *(dest+(size .. size*n-1)), type is set +[type_of_term] Term: dest+(size .. size*n-1), type is set +[type_of_term] Term: dest, type is unsigned char * +[type_of_term] Host: dest, type is unsigned char * +[type_of_term] Offset: , type is unsigned char * +[type_of_term] Lval: dest, type is unsigned char * +[type_of_term] Term: size .. size*n-1, type is set<ℤ> +[type_of_term] Term: size, type is unsigned long +[type_of_term] Host: size, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: size, type is unsigned long +[type_of_term] Term: size*n-1, type is ℤ +[type_of_term] Term: size*n, type is ℤ +[type_of_term] Term: size, type is ℤ +[type_of_term] Term: size, type is unsigned long +[type_of_term] Host: size, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: size, type is unsigned long +[type_of_term] Term: n, type is ℤ +[type_of_term] Term: n, type is unsigned long +[type_of_term] Host: n, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: n, type is unsigned long +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: *(dest+(0 .. size-1)), type is set +[type_of_term] Host: *(dest+(0 .. size-1)), type is set +[type_of_term] Offset: , type is set +[type_of_term] Lval: *(dest+(0 .. size-1)), type is set +[type_of_term] Term: dest+(0 .. size-1), type is set +[type_of_term] Term: dest, type is unsigned char * +[type_of_term] Host: dest, type is unsigned char * +[type_of_term] Offset: , type is unsigned char * +[type_of_term] Lval: dest, type is unsigned char * +[type_of_term] Term: 0 .. size-1, type is set<ℤ> +[type_of_term] Term: 0, type is ℤ +[type_of_term] Term: size-1, type is ℤ +[type_of_term] Term: size, type is ℤ +[type_of_term] Term: size, type is unsigned long +[type_of_term] Host: size, type is unsigned long +[type_of_term] Offset: , type is unsigned long +[type_of_term] Lval: size, type is unsigned long +[type_of_term] Term: 1, type is ℤ +[type_of_term] Term: *(p+(..)), type is set +[type_of_term] Host: *(p+(..)), type is set +[type_of_term] Offset: , type is set +[type_of_term] Lval: *(p+(..)), type is set +[type_of_term] Term: p+(..), type is set +[type_of_term] Term: p, type is int * +[type_of_term] Host: p, type is int * +[type_of_term] Offset: , type is int * +[type_of_term] Lval: p, type is int * +[type_of_term] Term: .., type is set<ℤ> +[type_of_term] Term: t[..], type is set +[type_of_term] Host: t, type is int [42] +[type_of_term] Offset: [..], type is set +[type_of_term] Lval: t[..], type is set +[type_of_term] Term: .., type is set<ℤ> +[type_of_term] Term: (s+(..))->x, type is set +[type_of_term] Host: *(s+(..)), type is set +[type_of_term] Offset: .x, type is set +[type_of_term] Lval: (s+(..))->x, type is set +[type_of_term] Term: s+(..), type is set +[type_of_term] Term: s, type is struct S * +[type_of_term] Host: s, type is struct S * +[type_of_term] Offset: , type is struct S * +[type_of_term] Lval: s, type is struct S * +[type_of_term] Term: .., type is set<ℤ> +[type_of_term] Term: (s+(..))->y[..], type is set +[type_of_term] Host: *(s+(..)), type is set +[type_of_term] Offset: .y[..], type is set +[type_of_term] Lval: (s+(..))->y[..], type is set +[type_of_term] Term: s+(..), type is set +[type_of_term] Term: s, type is struct S * +[type_of_term] Host: s, type is struct S * +[type_of_term] Offset: , type is struct S * +[type_of_term] Lval: s, type is struct S * +[type_of_term] Term: .., type is set<ℤ> +[type_of_term] Term: .., type is set<ℤ> +/* Generated by Frama-C */ +struct S { + int x ; + int y[] ; +}; +int t[42]; +struct S s; +/*@ assigns *(p+(..)), t[..], (s+(..))->x, (s+(..))->y[..]; */ +extern void f(int *p, struct S *s); + +int main(void) +{ + int __retres; + f(t,& s); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/unification.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/unification.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/unification.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/unification.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,21 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/unification.c (with preprocessing) +/* Generated by Frama-C */ +struct _list { + int element ; + struct _list *next ; +}; +typedef struct _list list; +/*@ type List = Nil | Cons(A, List ); + */ +/*@ +inductive logic_model{L}(list *root, List logic_list) { + case nil{L}: \at(logic_model{L}(\null, Nil),L); + case cons{L}: \at(∀ list *l1, List ll1; + \valid{L}(l1) ⇒ + logic_model{L}(l1->next, ll1) ⇒ + logic_model{L}(l1, Cons(l1->element, ll1)), + L); + } + */ + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/unused.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/unused.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/unused.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/unused.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,42 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/unused.c (with preprocessing) +/* Generated by Frama-C */ +struct __anonstruct_T_1 { + int i ; +}; +/*@ requires \valid(dest+(0 .. n-1)); + ensures ∀ ℤ i; 0 ≤ i < \old(n) ⇒ *(\old(dest)+i) ≡ 0; + assigns *(dest+(0 .. n-1)); + assigns *(dest+(0 .. n-1)) \from \nothing; + */ +extern __attribute__((__FC_BUILTIN__)) void Frama_C_bzero(unsigned char *dest, + unsigned long n); + +/*@ requires \valid(dest+(0 .. size*n-1)); + requires n ≥ 1; + ensures + ∀ ℤ i, ℤ j; + 0 ≤ i < \old(size) ∧ 1 ≤ j < \old(n) ⇒ + *(\old(dest)+(i+j*\old(size))) ≡ *(\old(dest)+i); + assigns *(dest+(size .. size*n-1)); + assigns *(dest+(size .. size*n-1)) \from *(dest+(0 .. size-1)); + */ +extern __attribute__((__FC_BUILTIN__)) void Frama_C_copy_block(unsigned char *dest, + unsigned long size, + unsigned long n); + +/*@ lemma toto{L}: ∀ struct __anonstruct_T_1 t; t.i ≡ 0; + */ +extern int G; + +/*@ global invariant G_const: G ≡ 0; + */ +static int i; +/*@ global invariant invi: i ≥ 0; + */ +extern int c; + +/*@ requires c ≡ 0; */ +extern __attribute__((__FC_BUILTIN__)) void foo(int *); + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/updater.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/updater.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/updater.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/updater.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,65 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/updater.c (with preprocessing) +/* Generated by Frama-C */ +struct S { + int v ; + int a[5] ; + int b ; +}; +struct SS { + struct S a[5] ; + struct S b ; +}; +struct S x = {.v = 1, .a = {0, 0, 0, 0, 0}, .b = 2}; +struct SS y; +/*@ +logic struct S foo(struct S x) = + {{x \with .b = (int)(x.b+1)} \with .v = (int)3}; + */ +/*@ lemma foo2{L}: x ≡ {foo(x) \with .b = (int)(x.a[0]+1)}; + */ +/*@ +lemma bar{L}: + (\let tmp = foo(x); + {tmp \with .a = {{tmp.a \with [..] = (int)0} \with [3] = (int)3}}) + ≡ + (\let tmp = + \let tmp = foo(x); {tmp \with .a = {tmp.a \with [..] = (int)0}}; + {tmp \with .a = {tmp.a \with [3] = (int)3}}); + */ +/*@ lemma bar2{L}: x ≡ {x \with .a = {x.a \with [4] = (int)0}}; + */ +/*@ +lemma bar3{L}: + y ≡ + {y \with .a = \let idx = 3+1; + {y.a \with [idx] = {y.a[idx] \with .b = (int)(x.b+1)}}}; + */ +/*@ +lemma bar4{L}: + y ≡ + {y \with .a = {y.a \with [4] = {y.a[4] \with .a = {y.a[4].a \with [ + ..] = (int)(x.b+1)}}}}; + */ +/*@ +lemma bar5{L}: + y ≡ + (\let tmp = + {y \with .a = {y.a \with [4] = {{y.a[4] \with .a = {y.a[4].a \with [ + ..] = (int)(x.b+1)}} \with .v = (int)3}}}; + {tmp \with .b = {tmp.b \with .v = (int)4}}); + */ +/*@ lemma cast{L}: y.a[0].v ≡ (\let tmp = (struct S)y; tmp.v); + */ +int *f(void) +{ + int *__retres; + if (y.a[0].v == y.b.v) { + __retres = (int *)y.a[0].v; + goto return_label; + } + __retres = (int *)x.b; + return_label: return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/used_before_decl_bts0109.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/used_before_decl_bts0109.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/used_before_decl_bts0109.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/used_before_decl_bts0109.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/used_before_decl_bts0109.i (no preprocessing) +tests/spec/used_before_decl_bts0109.i:3:[kernel] warning: Calling undeclared function h. Old style K&R code? +/* Generated by Frama-C */ +/*@ requires a ≥ 0; + assigns \result; + assigns \result \from a; */ +extern int f(int a); + +/*@ ensures \result ≡ \old(b)+1; */ +extern int h(int b); + +int g(void) +{ + int __retres; + int tmp; + int tmp_0; + { + /*sequence*/ + tmp = f(0); + tmp_0 = h(1); + } + __retres = tmp + tmp_0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/use.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/use.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/use.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/use.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/use.c (with preprocessing) +[kernel] Parsing tests/spec/use2.c (with preprocessing) +/* Generated by Frama-C */ +/*@ axiomatic S { + logic ℤ F(ℤ x) ; + + } + */ +/*@ logic ℤ X= 42; + */ +/*@ ensures X > 0; + ensures F(1) > 0; */ +void f(void) +{ + return; +} + +/*@ ensures X > 0; + ensures F(1) > 0; */ +void g(void) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/va.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/va.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/va.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/va.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,320 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/va.c (with preprocessing) +tests/spec/va.c:6:[kernel] warning: The second argument in call to __builtin_va_start should be the last formal argument +/* Generated by Frama-C */ +typedef __builtin_va_list va_list; +typedef unsigned int size_t; +typedef unsigned int ino_t; +typedef unsigned int gid_t; +typedef unsigned int uid_t; +typedef long time_t; +typedef unsigned int blkcnt_t; +typedef unsigned int blksize_t; +typedef unsigned int dev_t; +typedef unsigned int mode_t; +typedef unsigned int nlink_t; +typedef long off_t; +struct stat { + dev_t st_dev ; + ino_t st_ino ; + mode_t st_mode ; + nlink_t st_nlink ; + uid_t st_uid ; + gid_t st_gid ; + dev_t st_rdev ; + off_t st_size ; + time_t st_atime ; + time_t st_mtime ; + time_t st_ctime ; + blksize_t st_blksize ; + blkcnt_t st_blocks ; +}; +struct __fc_pos_t { + unsigned long __fc_stdio_position ; +}; +typedef struct __fc_pos_t fpos_t; +struct __fc_FILE { + unsigned int __fc_stdio_id ; + fpos_t __fc_position ; + char __fc_error ; + char __fc_eof ; + int __fc_flags ; + struct stat *__fc_inode ; + unsigned char *__fc_real_data ; + int __fc_real_data_max_size ; +}; +typedef struct __fc_FILE FILE; +/* compiler builtin: + void __builtin_va_start(__builtin_va_list); */ +extern int __FC_errno; + +extern FILE *__fc_stdin; + +extern FILE *__fc_stdout; + +/*@ assigns \nothing; */ +extern int remove(char const *filename); + +/*@ assigns \nothing; */ +extern int rename(char const *old, char const *new); + +/*@ ensures + \result ≡ \null ∨ + (\valid(\result) ∧ \fresh{Old, Here}(\result,sizeof(FILE))); + assigns \nothing; + */ +extern FILE *tmpfile(void); + +/*@ assigns \result, *(s+(..)); + assigns \result \from *(s+(..)); + assigns *(s+(..)) \from \nothing; + */ +extern char *tmpnam(char *s); + +/*@ ensures \result ≡ 0 ∨ \result ≡ -1; + assigns *stream; + assigns *stream \from \nothing; + */ +extern int fclose(FILE *stream); + +/*@ ensures \result ≡ 0 ∨ \result ≡ -1; + assigns *stream; + assigns *stream \from \nothing; + */ +extern int fflush(FILE *stream); + +FILE __fc_fopen[512]; +FILE const *_p__fc_fopen = (FILE const *)(__fc_fopen); +/*@ ensures + \result ≡ \null ∨ + (\valid(\result) ∧ \subset(\result, &__fc_fopen[0 ..])); + assigns \result; + assigns \result \from *(filename+(..)), *(mode+(..)), _p__fc_fopen; + */ +extern FILE *fopen(char const *filename, char const *mode); + +/*@ ensures + \result ≡ \null ∨ + (\valid(\result) ∧ \fresh{Old, Here}(\result,sizeof(FILE))); + assigns \result; + assigns \result \from fildes, *(mode+(..)); + */ +extern FILE *fdopen(int fildes, char const *mode); + +/*@ ensures \result ≡ \null ∨ \result ≡ \old(stream); + assigns *stream; + */ +extern FILE *freopen(char const *filename, char const *mode, FILE *stream); + +/*@ assigns *stream; + assigns *stream \from buf; */ +extern void setbuf(FILE *stream, char *buf); + +/*@ assigns *stream; + assigns *stream \from buf, mode, size; */ +extern int setvbuf(FILE *stream, char *buf, int mode, size_t size); + +/*@ assigns *stream; */ +extern int fprintf(FILE *stream, char const *format , ...); + +/*@ assigns *stream; */ +extern int fscanf(FILE *stream, char const *format , ...); + +/*@ assigns *__fc_stdout; + assigns *__fc_stdout \from *(format+(..)); */ +extern int printf(char const *format , ...); + +/*@ assigns *__fc_stdin; */ +extern int scanf(char const *format , ...); + +/*@ assigns *(s+(0 .. n-1)); */ +extern int snprintf(char *s, size_t n, char const *format , ...); + +/*@ assigns *(s+(0 ..)); */ +extern int sprintf(char *s, char const *format , ...); + +/*@ assigns *stream; + assigns *stream \from *(format+(..)), arg; */ +extern int vfprintf(FILE *stream, char const *format, va_list arg); + +/*@ assigns *stream; + assigns *stream \from *(format+(..)), *stream; */ +extern int vfscanf(FILE *stream, char const *format, va_list arg); + +/*@ assigns *__fc_stdout; + assigns *__fc_stdout \from arg; */ +extern int vprintf(char const *format, va_list arg); + +/*@ assigns *__fc_stdin; + assigns *__fc_stdin \from *(format+(..)); */ +extern int vscanf(char const *format, va_list arg); + +/*@ assigns *(s+(0 .. n-1)); + assigns *(s+(0 .. n-1)) \from *(format+(..)), arg; + */ +extern int vsnprintf(char *s, size_t n, char const *format, va_list arg); + +/*@ assigns *(s+(0 ..)); + assigns *(s+(0 ..)) \from *(format+(..)), arg; */ +extern int vsprintf(char *s, char const *format, va_list arg); + +/*@ assigns *stream; */ +extern int fgetc(FILE *stream); + +/*@ ensures \result ≡ \null ∨ \result ≡ \old(s); + assigns *(s+(0 .. n-1)), *stream, \result; + assigns *(s+(0 .. n-1)) \from *stream; + assigns *stream \from *stream; + assigns \result \from s, n, *stream; + */ +extern char *fgets(char *s, int n, FILE *stream); + +/*@ assigns *stream; */ +extern int fputc(int c, FILE *stream); + +/*@ assigns *stream; + assigns *stream \from *(s+(..)); */ +extern int fputs(char const *s, FILE *stream); + +/*@ assigns \result, *stream; + assigns \result \from *stream; + assigns *stream \from *stream; + */ +extern int getc(FILE *stream); + +/*@ assigns \result; + assigns \result \from *__fc_stdin; */ +extern int getchar(void); + +/*@ ensures \result ≡ \old(s) ∨ \result ≡ \null; + assigns *(s+(..)), \result; + assigns *(s+(..)) \from *__fc_stdin; + assigns \result \from s, __fc_stdin; + */ +extern char *gets(char *s); + +/*@ assigns *stream; + assigns *stream \from c; */ +extern int putc(int c, FILE *stream); + +/*@ assigns *__fc_stdout; + assigns *__fc_stdout \from c; */ +extern int putchar(int c); + +/*@ assigns *__fc_stdout; + assigns *__fc_stdout \from *(s+(..)); */ +extern int puts(char const *s); + +/*@ assigns *stream; + assigns *stream \from c; */ +extern int ungetc(int c, FILE *stream); + +/*@ assigns *((char *)ptr+(0 .. nmemb*size-1)); + assigns *((char *)ptr+(0 .. nmemb*size-1)) \from *stream; + */ +extern size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); + +/*@ assigns *stream; + assigns *stream \from *((char *)ptr+(0 .. nmemb*size-1)); + */ +extern size_t fwrite(void const *ptr, size_t size, size_t nmemb, FILE *stream); + +/*@ assigns *pos; + assigns *pos \from *stream; */ +extern int fgetpos(FILE *stream, fpos_t *pos); + +/*@ assigns *stream, __FC_errno; + assigns *stream \from offset, whence; */ +extern int fseek(FILE *stream, long offset, int whence); + +/*@ assigns *stream; + assigns *stream \from *pos; */ +extern int fsetpos(FILE *stream, fpos_t const *pos); + +/*@ assigns \result, __FC_errno; + assigns \result \from *stream; + assigns __FC_errno \from *stream; + */ +extern long ftell(FILE *stream); + +/*@ assigns *stream; + assigns *stream \from \nothing; */ +extern void rewind(FILE *stream); + +/*@ assigns *stream; + assigns *stream \from \nothing; */ +extern void clearerr(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int feof(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int fileno(FILE *stream); + +/*@ assigns *stream; + assigns *stream \from \nothing; */ +extern void flockfile(FILE *stream); + +/*@ assigns *stream; + assigns *stream \from \nothing; */ +extern void funlockfile(FILE *stream); + +/*@ assigns \result, *stream; + assigns \result \from \nothing; + assigns *stream \from \nothing; + */ +extern int ftrylockfile(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int ferror(FILE *stream); + +/*@ assigns __fc_stdout; + assigns __fc_stdout \from __FC_errno, *(s+(..)); */ +extern void perror(char const *s); + +/*@ assigns \result, *stream; + assigns \result \from *stream; + assigns *stream \from *stream; + */ +extern int getc_unlocked(FILE *stream); + +/*@ assigns \result; + assigns \result \from *__fc_stdin; */ +extern int getchar_unlocked(void); + +/*@ assigns *stream; + assigns *stream \from c; */ +extern int putc_unlocked(int c, FILE *stream); + +/*@ assigns *__fc_stdout; + assigns *__fc_stdout \from c; */ +extern int putchar_unlocked(int c); + +/*@ assigns *stream; + assigns *stream \from \nothing; */ +extern void clearerr_unlocked(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int feof_unlocked(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int ferror_unlocked(FILE *stream); + +/*@ assigns \result; + assigns \result \from *stream; */ +extern int fileno_unlocked(FILE *stream); + +void main(int x , ...) +{ + va_list p; + __builtin_va_start(p,x); + vscanf("FOO %d %d",p); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/oracle/volatile.res.oracle frama-c-20150201+sodium+dfsg/tests/spec/oracle/volatile.res.oracle --- frama-c-20140301+neon+dfsg/tests/spec/oracle/volatile.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/oracle/volatile.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,73 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/spec/volatile.c (with preprocessing) +[kernel] Parsing tests/spec/volatile_aux.c (with preprocessing) +[kernel] Repeat final merging phase: tests/spec/volatile_aux.c +/* Generated by Frama-C */ +typedef int volatile VINT; +struct st { + int a ; + int volatile v ; +}; +typedef struct st ST; +struct vst { + int b ; + ST v ; +}; +int f(int x); + +__inline int r(VINT *v_0) +{ + int __retres; + __retres = *v_0; + return __retres; +} + +__inline int w(int volatile *v_0, int new) +{ + *v_0 = new; + return new; +} + +int volatile v; +int volatile tab[10]; +VINT *pt; +struct st s; +/*@ volatile v, tab[..] reads r writes w; */ +/*@ volatile *pt writes w; */ +/*@ volatile s.v reads r; +*/ +struct vst vs; +extern struct vst rs(struct vst *p); + +extern struct vst ws(struct vst *p, struct vst v); + +/*@ volatile vs reads rs writes ws; */ +int const c = 1; +int *p; +/*@ lemma comp_const_addr{L}: p ≡ &c; + */ +/*@ lemma comp_volatile_addr{L}: p ≡ &v; + */ +/*@ lemma volatile_in_annot_is_illegal{L}: v ≡ 1 ⇒ v ≡ 1; + +*/ +int main(void) +{ + int __retres; + int x; + x = v; + v = f(x); + __retres = 0; + return __retres; +} + +int f(int x) +{ + int __retres; + x ++; + v = x; + __retres = v + x; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/spec/purse.c frama-c-20150201+sodium+dfsg/tests/spec/purse.c --- frama-c-20140301+neon+dfsg/tests/spec/purse.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/purse.c 2015-05-28 08:53:24.000000000 +0000 @@ -21,8 +21,7 @@ /* (enclosed in the file GPL). */ /* */ /**************************************************************************/ -#define FRAMA_C_MALLOC_INDIVIDUAL -#include "share/libc/stdlib.c" +#include "share/libc/stdlib.h" typedef struct purse { int balance; } purse; diff -Nru frama-c-20140301+neon+dfsg/tests/spec/setjmp.c frama-c-20150201+sodium+dfsg/tests/spec/setjmp.c --- frama-c-20140301+neon+dfsg/tests/spec/setjmp.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/setjmp.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -/* run.config - DONTRUN: syntactically incorrect include + no spec here... -*/ -#ifndef PTEST -#include -#else -extern int printf (__const char *__restrict __format, ...); -#endif - -#ifndef PTEST -#include -#else -typedef int __jmp_buf[6]; -typedef struct { - unsigned long int __val[(1024 / (8 * sizeof (unsigned long int)))]; - } __sigset_t; -typedef struct __jmp_buf_tag { - __jmp_buf __jmpbuf; - int __mask_was_saved; - __sigset_t __saved_mask; - } jmp_buf[1]; - -extern int _setjmp (struct __jmp_buf_tag __env[1]) __attribute__ ((__nothrow__)); -extern void longjmp (struct __jmp_buf_tag __env[1], int __val) - __attribute__ ((__nothrow__)) __attribute__ ((__noreturn__)); -#define setjmp(env) _setjmp(env) -#endif - - -jmp_buf buf; -int previous_setjmp = 0 ; - -void f(void) { - longjmp(buf, 1); -} - -int main(void) { - previous_setjmp = -1 ; - int setjmp_result = setjmp(buf); - if (setjmp_result != 0) { - printf("longjmp: setjmp_result=%d previous_setjmp=%d\n", - setjmp_result, previous_setjmp); - return 0; - } - previous_setjmp = setjmp_result ; - f(); - return 1; -} diff -Nru frama-c-20140301+neon+dfsg/tests/spec/test_config frama-c-20150201+sodium+dfsg/tests/spec/test_config --- frama-c-20140301+neon+dfsg/tests/spec/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/spec/test_config 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,6 @@ +COMMENT: for now, this directory mainly tests the annotations syntax, +COMMENT: no analysis is performed. +COMMENT: we continue on annotation errors, as this allows to put +COMMENT: various variations of the same test in one file. +CMD: FRAMAC_PLUGIN=tests/.empty @frama-c@ +OPT: -pp-annot -print -journal-disable -continue-annot-error -check diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/aggressive_merging_1.i frama-c-20150201+sodium+dfsg/tests/syntax/aggressive_merging_1.i --- frama-c-20140301+neon+dfsg/tests/syntax/aggressive_merging_1.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/aggressive_merging_1.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,11 @@ +/* run.config + STDOPT: +"@PTEST_DIR@/aggressive_merging_2.i -aggressive-merging" +*/ +static inline void f(void) { + return; + } + +void foo (void) +{ + f(); +} diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/aggressive_merging_2.i frama-c-20150201+sodium+dfsg/tests/syntax/aggressive_merging_2.i --- frama-c-20140301+neon+dfsg/tests/syntax/aggressive_merging_2.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/aggressive_merging_2.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,11 @@ +/* run.config + DONTRUN: main test is in aggressive_merging_1.i +*/ +static inline void f(void) { + return; + } + + void bar () + { + f(); + } diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/agressive_merging_1.i frama-c-20150201+sodium+dfsg/tests/syntax/agressive_merging_1.i --- frama-c-20140301+neon+dfsg/tests/syntax/agressive_merging_1.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/agressive_merging_1.i 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -/* run.config - STDOPT: +"tests/syntax/agressive_merging_2.i -agressive-merging" -*/ -static inline void f(void) { - return; - } - -void foo (void) -{ - f(); -} diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/agressive_merging_2.i frama-c-20150201+sodium+dfsg/tests/syntax/agressive_merging_2.i --- frama-c-20140301+neon+dfsg/tests/syntax/agressive_merging_2.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/agressive_merging_2.i 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -/* run.config - DONTRUN: main test is in agressive_merging_1.i -*/ -static inline void f(void) { - return; - } - - void bar () - { - f(); - } diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/arg_type.i frama-c-20150201+sodium+dfsg/tests/syntax/arg_type.i --- frama-c-20140301+neon+dfsg/tests/syntax/arg_type.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/arg_type.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,3 +1,7 @@ +/* run.config +STDOPT: +"-machdep gcc_x86_32" +*/ + // GCC allows such things int f(int); diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/big_local_array.i frama-c-20150201+sodium+dfsg/tests/syntax/big_local_array.i --- frama-c-20140301+neon+dfsg/tests/syntax/big_local_array.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/big_local_array.i 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -/* run.config -STDOPT: +"-load-module lib/plugins/Report" +"-val -report" -OPT: -load-module lib/plugins/Report -load-script tests/syntax/big_local_array_script.ml -then-on prj -print -report -STDOPT: +"-no-initialized-padding-locals -val" -*/ - -struct S { - int a[50]; - int b[32]; -}; - -int main () { - struct S x[32] = - { [0] = { .a = { 1,2,3 }, .b = { [5] = 5, 6, 7 }}, - [3] = { 0,1,2,3,.b = { [17]=17 } } - }; -} diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/big_local_array_script.ml frama-c-20150201+sodium+dfsg/tests/syntax/big_local_array_script.ml --- frama-c-20140301+neon+dfsg/tests/syntax/big_local_array_script.ml 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/big_local_array_script.ml 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -let foo () = - if Project.get_name (Project.current ()) <> "prj" then begin - let prj = Project.create "prj" in - let () = Project.set_current prj in - File.init_from_c_files - [File.from_filename "tests/syntax/big_local_array.i"] - end - -let () = Db.Main.extend foo diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/bts0519.c frama-c-20150201+sodium+dfsg/tests/syntax/bts0519.c --- frama-c-20140301+neon+dfsg/tests/syntax/bts0519.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/bts0519.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,6 +1,6 @@ /* run.config - STDOPT: +"-cpp-command='gcc -C -E -I.'" - STDOPT: +"-cpp-command='gcc -C -E -I. -DERR'" + STDOPT: +"-cpp-command='gcc -C -E -I.'" +"-cpp-gnu-like" + STDOPT: +"-cpp-command='gcc -C -E -I. -DERR'" +"-cpp-gnu-like" */ int t[4]; diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/bts0672_link.c frama-c-20150201+sodium+dfsg/tests/syntax/bts0672_link.c --- frama-c-20140301+neon+dfsg/tests/syntax/bts0672_link.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/bts0672_link.c 2015-05-28 08:53:24.000000000 +0000 @@ -1,6 +1,6 @@ /* run.config STDOPT: +"tests/syntax/bts0672_link_2.c" - STDOPT: +"tests/syntax/bts0672_link_2.c" +"-cpp-command 'gcc -C -E -DPROTO'" + STDOPT: +"tests/syntax/bts0672_link_2.c" +"-cpp-extra-args='-DPROTO'" */ int Frama_C_entropy_source; diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/built.i frama-c-20150201+sodium+dfsg/tests/syntax/built.i --- frama-c-20140301+neon+dfsg/tests/syntax/built.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/built.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,3 +1,7 @@ +/* run.config +STDOPT: +"-machdep gcc_x86_32" +*/ + extern __attribute__((const, noreturn)) int ____ilog2_NaN(void); @@ -19,3 +23,5 @@ } + +int T[__builtin_types_compatible_p(int,int)+__builtin_types_compatible_p(int,float)]; diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/builtin_constant.i frama-c-20150201+sodium+dfsg/tests/syntax/builtin_constant.i --- frama-c-20140301+neon+dfsg/tests/syntax/builtin_constant.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/builtin_constant.i 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -int T[__builtin_types_compatible_p(int,int)+__builtin_types_compatible_p(int,float)]; - - diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/char_is_unsigned.i frama-c-20150201+sodium+dfsg/tests/syntax/char_is_unsigned.i --- frama-c-20140301+neon+dfsg/tests/syntax/char_is_unsigned.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/char_is_unsigned.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,9 @@ +/* run.config + OPT:-print -load-script tests/syntax/machdep_char_unsigned.ml -machdep unsigned_char -then -constfold -rte -rte-all +*/ +char t[10]; + +void main() { + int r = (t[0] == 'a'); + char c = 455; +} diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/check_builtin_bts1440.i frama-c-20150201+sodium+dfsg/tests/syntax/check_builtin_bts1440.i --- frama-c-20140301+neon+dfsg/tests/syntax/check_builtin_bts1440.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/check_builtin_bts1440.i 2015-05-28 08:53:24.000000000 +0000 @@ -1,5 +1,5 @@ /* run.config -STDOPT: +"-kernel-debug 1 -kernel-msg-key file" +STDOPT: +"-machdep gcc_x86_32 -kernel-debug 1 -kernel-msg-key file" */ /*@ ensures \result >= i; diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/clone_test.i frama-c-20150201+sodium+dfsg/tests/syntax/clone_test.i --- frama-c-20140301+neon+dfsg/tests/syntax/clone_test.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/clone_test.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,13 @@ +/* run.config +OPT: -load-script @PTEST_DIR@/@PTEST_NAME@.ml +*/ + +/*@ + requires -3 <= c <= 4; + ensures \result >= c; +*/ +int f(int c) { + if (c>0) return c; + //@ assert c <= 0; + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/clone_test.ml frama-c-20150201+sodium+dfsg/tests/syntax/clone_test.ml --- frama-c-20140301+neon+dfsg/tests/syntax/clone_test.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/clone_test.ml 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,8 @@ +let run () = + Ast.compute (); + let f = Globals.Functions.find_by_name "f" in + let new_f = Clone.clone_defined_kernel_function f in + File.pretty_ast(); + Visitor.visitFramacFileSameGlobals (new File.check_file "clone") (Ast.get()) + +let () = Db.Main.extend run diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/decay.i frama-c-20150201+sodium+dfsg/tests/syntax/decay.i --- frama-c-20140301+neon+dfsg/tests/syntax/decay.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/decay.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +struct P { + int val[2][2]; +}; + +void multi_dim_array_decay() { // BTS 1142 + struct P* pp; + struct P p; + pp = &p; + *(pp->val); + *(p.val); +} + +char t[8]; + +struct { + int A[sizeof(t)]; + int i; +} A = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; //Size of the array is 8 + +struct { + int A[sizeof(0, t)]; + int i; +} S = {1, 2, 3, 4, 5}; // Size of the array is sizeof(char *), not sizeof(t), because in this case there is a decay; BTS 1774 + + +struct { + int A[sizeof(&t[0])]; + int i; +} V = {1, 2, 3, 4, 5}; // Size of the array is again sizeof(char*), not sizeof(t). Note 5077 in bts 1774 diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/gcc_builtins.c frama-c-20150201+sodium+dfsg/tests/syntax/gcc_builtins.c --- frama-c-20140301+neon+dfsg/tests/syntax/gcc_builtins.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/gcc_builtins.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,197 @@ +/* run.config + STDOPT: +"-machdep gcc_x86_32" + */ + +#include "share/libc/stdint.h" + +#define likely(x) __builtin_expect((x),1) +#define unlikely(x) __builtin_expect((x),0) + +int16_t __sync_fetch_and_add_int16_t (int16_t *ptr, int16_t value,...) +{ + int16_t tmp = *ptr; + *ptr += value; + return tmp; +} +int16_t __sync_fetch_and_sub_int16_t (int16_t *ptr, int16_t value,...) +{ + int16_t tmp = *ptr; + *ptr -= value; + return tmp; +} + +int32_t __sync_fetch_and_add_int32_t (int32_t *ptr, int32_t value,...) +{ + int32_t tmp = *ptr; + *ptr += value; + return tmp; +} + +int32_t __sync_fetch_and_sub_int32_t (int32_t *ptr, int32_t value,...) +{ + int32_t tmp = *ptr; + *ptr -= value; + return tmp; +} + +int64_t __sync_fetch_and_add_int64_t (int64_t *ptr, int64_t value,...) +{ + int64_t tmp = *ptr; + *ptr += value; + return tmp; +} + +int64_t __sync_fetch_and_sub_int64_t (int64_t *ptr, int64_t value,...) +{ + int64_t tmp = *ptr; + *ptr -= value; + return tmp; +} + +int16_t __sync_add_and_fetch_int16_t (int16_t *ptr, int16_t value,...) +{ + *ptr += value; + return *ptr; +} + +int16_t __sync_sub_and_fetch_int16_t (int16_t *ptr, int16_t value,...) +{ + *ptr -= value; + return *ptr; +} + +int32_t __sync_add_and_fetch_int32_t (int32_t *ptr, int32_t value,...) +{ + *ptr += value; + return *ptr; +} + +int32_t __sync_sub_and_fetch_int32_t (int32_t *ptr, int32_t value,...) +{ + *ptr -= value; + return *ptr; +} + +int64_t __sync_add_and_fetch_int64_t (int64_t *ptr, int64_t value,...) +{ + *ptr += value; + return *ptr; +} + +int64_t __sync_sub_and_fetch_int64_t (int64_t *ptr, int64_t value,...) +{ + *ptr -= value; + return *ptr; +} + +int __sync_bool_compare_and_swap_uint16_t (uint16_t *ptr, uint16_t oldval, uint16_t newval,...) +{ + if (*ptr == oldval) { + *ptr = newval; + return 1; + } else { + return 0; + } +} + +int __sync_bool_compare_and_swap_uint32_t (uint32_t *ptr, uint32_t oldval, uint32_t newval,...) +{ + if (*ptr == oldval) { + *ptr = newval; + return 1; + } else { + return 0; + } +} + +int __sync_bool_compare_and_swap_uint64_t (uint64_t *ptr, uint64_t oldval, uint64_t newval,...) +{ + if (*ptr == oldval) { + *ptr = newval; + return 1; + } else { + return 0; + } +} + +void main(void) { + { + int16_t content = 100; + int16_t *ptr = &content; + int16_t value = 33; + int16_t result; + result = __sync_fetch_and_add(ptr, value); + /*@ assert result == 100 && content == 133; */ + result = __sync_fetch_and_add(ptr, -11); + /*@ assert result == 133 && content == 122; */ + result = __sync_fetch_and_sub(ptr, value); + /*@ assert result == 122 && content == 89; */ + result = __sync_fetch_and_sub(ptr, -11); + /*@ assert result == 89 && content == 100; */ + } + { + int32_t content = 100; + int32_t *ptr = &content; + int32_t value = 33; + int32_t result; + result = __sync_fetch_and_add(ptr, value); + /*@ assert result == 100 && content == 133; */ + result = __sync_fetch_and_add(ptr, -11); + /*@ assert result == 133 && content == 122; */ + result = __sync_fetch_and_sub(ptr, value); + /*@ assert result == 122 && content == 89; */ + result = __sync_fetch_and_sub(ptr, -11); + /*@ assert result == 89 && content == 100; */ + } + { + int64_t content = 100; + int64_t *ptr = &content; + int64_t value = 33; + int64_t result; + result = __sync_fetch_and_add(ptr, value); + /*@ assert result == 100 && content == 133; */ + result = __sync_fetch_and_add(ptr, -11); + /*@ assert result == 133 && content == 122; */ + result = __sync_fetch_and_sub(ptr, value); + /*@ assert result == 122 && content == 89; */ + result = __sync_fetch_and_sub(ptr, -11); + /*@ assert result == 89 && content == 100; */ + } + { + uint16_t content = 100; + uint16_t *ptr = &content; + uint16_t oldval = 100; + uint16_t newval = 133; + int result; + result = __sync_bool_compare_and_swap(ptr, oldval, newval); + /*@ assert result == 1 && *ptr == newval; */ + } + { + uint32_t content = 100; + uint32_t *ptr = &content; + uint32_t oldval = 100; + uint32_t newval = 133; + int result; + result = __sync_bool_compare_and_swap(ptr, oldval, newval); + /*@ assert result == 1 && *ptr == newval; */ + } + { + uint64_t content = 100; + uint64_t *ptr = &content; + uint64_t oldval = 100; + uint64_t newval = 133; + int result; + result = __sync_bool_compare_and_swap(ptr, oldval, newval); + /*@ assert result == 1 && *ptr == newval; */ + } + if (likely(4 == 4)) { + int x = 1; + } + if (unlikely(3 == 4)) { + int x = 0; + } + int x = 2; + if (__builtin_expect(x++, x)) { + int y = x; + } +} diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/invalid_constant.i frama-c-20150201+sodium+dfsg/tests/syntax/invalid_constant.i --- frama-c-20140301+neon+dfsg/tests/syntax/invalid_constant.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/invalid_constant.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,2 @@ +/* Invalid octal constant */ +int = 0123456789; diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/libc.c frama-c-20150201+sodium+dfsg/tests/syntax/libc.c --- frama-c-20140301+neon+dfsg/tests/syntax/libc.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/libc.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -/* run.config -STDOPT: +"-cpp-extra-args='-nostdinc -Ishare/libc'" -*/ - -#define __FC_REG_TEST -#include "fc_posix_runtime.c" - diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/machdep_char_unsigned.ml frama-c-20150201+sodium+dfsg/tests/syntax/machdep_char_unsigned.ml --- frama-c-20140301+neon+dfsg/tests/syntax/machdep_char_unsigned.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/machdep_char_unsigned.ml 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,40 @@ + +open Cil_types + +let md = { + version = ""; + compiler = "gcc"; + sizeof_short = 2; + sizeof_int = 2; + sizeof_long = 4; + sizeof_longlong = 8; + sizeof_ptr = 4; + sizeof_float = 4; + sizeof_double = 8; + sizeof_longdouble = 8; + sizeof_void = -1; + sizeof_fun = 0; + alignof_short = 2; + alignof_int = 2; + alignof_long = 2; + alignof_longlong = 2; + alignof_ptr = 2; + alignof_float = 2; + alignof_double = 2; + alignof_longdouble = 2; + alignof_str = 0; + alignof_fun = 0; + alignof_aligned= 0; + char_is_unsigned = true; + const_string_literals = true; + little_endian = true; + underscore_name = true ; + size_t = "unsigned int"; + wchar_t = "int"; + ptrdiff_t = "int"; + has__builtin_va_list = true; + __thread_is_keyword = false; + } + +let () = + File.new_machdep "unsigned_char" md diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/merge_inline_1.c frama-c-20150201+sodium+dfsg/tests/syntax/merge_inline_1.c --- frama-c-20140301+neon+dfsg/tests/syntax/merge_inline_1.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/merge_inline_1.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +/* run.config +OPT: @PTEST_DIR@/merge_inline_2.c -aggressive-merging -check -print +*/ + +/* Test that we rename properly inlines even if they have prototypes and + if they are used before they are defined */ +int foo(int x); /* Declare it here. */ + +inline int foo(int x) { return x; } + +extern getfoo2(); + +int main() { + if(getfoo2() != (int)foo) { + return 1; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/merge_inline_2.c frama-c-20150201+sodium+dfsg/tests/syntax/merge_inline_2.c --- frama-c-20140301+neon+dfsg/tests/syntax/merge_inline_2.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/merge_inline_2.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,13 @@ +/* run.config + DONTRUN: main test is in merge_inline_1.c + */ +int bar(int x); /* Declare it here. Name does not matter. */ + + +int getfoo2() { /* Use bar before definition */ + return (int)bar; +} + + +inline int bar(int x) { return x; } + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/multi_dim_array_decay_bts1142.i frama-c-20150201+sodium+dfsg/tests/syntax/multi_dim_array_decay_bts1142.i --- frama-c-20140301+neon+dfsg/tests/syntax/multi_dim_array_decay_bts1142.i 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/multi_dim_array_decay_bts1142.i 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -struct P { - int val[2][2]; -}; - -int main() { - struct P* pp; - struct P p; - pp = &p; - *(pp->val); - *(p.val); -} diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/multiline_macro.c frama-c-20150201+sodium+dfsg/tests/syntax/multiline_macro.c --- frama-c-20140301+neon+dfsg/tests/syntax/multiline_macro.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/multiline_macro.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +/* run.config + OPT: -cpp-extra-args="-CC" -print +*/ +#define X 1 /* multi-line + + comment */ + 2 + /* + bla + */ 3 + +#define Y 5 + \ + 6 + \ + 7 + +/*@ ensures \result == X+Y; */ +int main(void) +{ + return X+Y; +} + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/multiple_decls_contracts.c frama-c-20150201+sodium+dfsg/tests/syntax/multiple_decls_contracts.c --- frama-c-20140301+neon+dfsg/tests/syntax/multiple_decls_contracts.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/multiple_decls_contracts.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +/* run.config +OPT: share/libc/string.h @PTEST_FILE@ @PTEST_FILE@ -cpp-extra-args="-Ishare/libc" -check -print +OPT: @PTEST_FILE@ share/libc/string.h @PTEST_FILE@ -cpp-extra-args="-Ishare/libc" -check -print +OPT: @PTEST_FILE@ @PTEST_FILE@ share/libc/string.h -cpp-extra-args="-Ishare/libc" -check -print +*/ + +#include "string.h" +#include "stdlib.h" + +char * +strdup(const char *str) +{ + if (str != NULL) { + register char *copy = malloc(strlen(str) + 1); + if (copy != NULL) + return strcpy(copy, str); + } + return NULL; +} diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/offset.c frama-c-20150201+sodium+dfsg/tests/syntax/offset.c --- frama-c-20140301+neon+dfsg/tests/syntax/offset.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/offset.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,9 @@ +/* run.config +OPT: -cpp-extra-args="-Ishare/libc" -print +*/ + +#include "__fc_define_off_t.h" + +off_t x = 0; + +off64_t y = 0; diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/offsetof.c frama-c-20150201+sodium+dfsg/tests/syntax/offsetof.c --- frama-c-20140301+neon+dfsg/tests/syntax/offsetof.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/offsetof.c 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,8 @@ +#include "share/libc/stddef.h" + +struct c {char ca;}; +void main(void) { + size_t S;; + S = offsetof(struct c, ca); + return; +} diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/access_volatile_bts1589.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/access_volatile_bts1589.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/access_volatile_bts1589.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/access_volatile_bts1589.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/access_volatile_bts1589.i (no preprocessing) +/* Generated by Frama-C */ +typedef int volatile vi; +struct volatile_struct { + int volatile a ; + vi b ; + int c ; +}; +int volatile x; +int z; +vi y; +struct volatile_struct vs; +int main(void) +{ + int __retres; + if (x) ; + if (y) ; + if (vs.a) ; + if (vs.b) ; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/add_allocates.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/add_allocates.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/add_allocates.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/add_allocates.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,33 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/add_allocates.i (no preprocessing) +/* Generated by Frama-C */ +int x; +/*@ allocates \nothing; */ +extern void f(); + +/*@ allocates x; */ +extern void g(); + +/*@ allocates \nothing; + + behavior b: + requires \false; + allocates x; */ +void main(int c) +{ + f(); + /*@ loop allocates \nothing; */ + while (c) { + /*@ loop allocates x; */ + while (1) { + /*@ loop allocates \nothing; */ + while (! c) ; + } + /*@ loop allocates \nothing; + for b: loop allocates x; */ + while (1) ; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/aggressive_merging_1.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/aggressive_merging_1.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/aggressive_merging_1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/aggressive_merging_1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,20 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/aggressive_merging_1.i (no preprocessing) +[kernel] Parsing tests/syntax/aggressive_merging_2.i (no preprocessing) +/* Generated by Frama-C */ +__inline static void f(void) +{ + return; +} + +void foo(void) +{ + return; +} + +void bar(void) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/arg_type.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/arg_type.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/arg_type.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/arg_type.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,6 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/arg_type.i (no preprocessing) +tests/syntax/arg_type.i:15:[kernel] user error: Declaration of g does not match previous declaration from tests/syntax/arg_type.i:13 (different integer types). +tests/syntax/arg_type.i:15:[kernel] failure: Cannot resolve variable x +[kernel] user error: stopping on file "tests/syntax/arg_type.i" that has errors. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/array_cast_bts1099.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/array_cast_bts1099.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/array_cast_bts1099.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/array_cast_bts1099.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,5 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/array_cast_bts1099.i (no preprocessing) +tests/syntax/array_cast_bts1099.i:7:[kernel] user error: Cast over a non-scalar type int [10] +[kernel] user error: stopping on file "tests/syntax/array_cast_bts1099.i" that has errors. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/asm_goto.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/asm_goto.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/asm_goto.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/asm_goto.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,14 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/asm_goto.i (no preprocessing) +/* Generated by Frama-C */ +int main(unsigned short bit) +{ + int __retres; + __asm__ goto ("1: jmp %l[t_no]\n": : "i"(bit): : t_no); + __retres = 1; + goto return_label; + t_no: __retres = 0; + return_label: return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/bad_return_bts_599.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bad_return_bts_599.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/bad_return_bts_599.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bad_return_bts_599.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,45 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/bad_return_bts_599.i (no preprocessing) +tests/syntax/bad_return_bts_599.i:4:[kernel] warning: Return statement without a value in function returning int +tests/syntax/bad_return_bts_599.i:9:[kernel] warning: Return statement without a value in function returning int +tests/syntax/bad_return_bts_599.i:4:[kernel] user error: Found return without value in function BadReturn1 +tests/syntax/bad_return_bts_599.i:9:[kernel] user error: Found return without value in function BadReturn2 +/* Generated by Frama-C */ +int BadReturn1(int *p) +{ + int __retres; + int *tmp; + { + /*sequence*/ + tmp = p; + p ++; + ; + } + return __retres; +} + +int BadReturn2(int *p) +{ + int __retres; + int *tmp; + { + /*sequence*/ + tmp = p; + p ++; + ; + } + return __retres; +} + +int main(void) +{ + int __retres; + int i; + i = 3; + BadReturn2(& i); + BadReturn1(& i); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0323.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0323.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0323.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0323.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/bts0323.c (with preprocessing) +[kernel] Parsing tests/syntax/bts0323-2.c (with preprocessing) +/* Generated by Frama-C */ +int x; + +void g(void); + +void f(void) +{ + x = 0; + return; +} + +int x = 1; +/*@ ensures x ≢ 0; */ +void g(void) +{ + x = 2; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0442-2.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0442-2.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0442-2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0442-2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,15 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/bts0442-2.i (no preprocessing) +[kernel] Parsing tests/syntax/bts0442.i (no preprocessing) +[kernel] warning: merging definitions of enum E using int type + (different names for enumeration items); items {E1=1, E2=2} and {E0=0, E1=1} +/* Generated by Frama-C */ +int ve1 = 1; +void f(void) +{ + ve1 = 0; + return; +} + +int ve2 = 2; + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0442.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0442.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0442.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0442.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,15 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/bts0442.i (no preprocessing) +[kernel] Parsing tests/syntax/bts0442-2.i (no preprocessing) +[kernel] warning: merging definitions of enum E using int type + (different names for enumeration items); items {E0=0, E1=1} and {E1=1, E2=2} +/* Generated by Frama-C */ +int ve2 = 2; +int ve1 = 1; +void f(void) +{ + ve1 = 0; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0519.1.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0519.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0519.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0519.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,6 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/bts0519.c (with preprocessing) +tests/syntax/bts0519.c:9:[kernel] user error: static specifier inside array argument is allowed only in function argument +[kernel] user error: stopping on file "tests/syntax/bts0519.c" that has errors. Add + '-kernel-msg-key pp' for preprocessing command. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0519.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0519.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0519.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0519.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,19 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/bts0519.c (with preprocessing) +/* Generated by Frama-C */ +int t[4]; +void f(int * /*[3]*/ /* static */ a) +{ + *(a + 2) = 3; + return; +} + +int main(void) +{ + int __retres; + f((int *)(t)); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0577.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0577.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0577.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0577.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,21 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/bts0577.i (no preprocessing) +/* Generated by Frama-C */ +enum __anonenum_E1_1 { + E1_a = 0, + E1_b = 1, + E1_c = 2 +}; +enum __anonenum_E2_2 { + E2_a = E1_a, + E2_b = 1 +}; +typedef enum __anonenum_E2_2 E2; +int f(E2 e) +{ + int __retres; + __retres = (int)e; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0588.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0588.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0588.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0588.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/bts0588.i (no preprocessing) +/* Generated by Frama-C */ +void g(int a); + +/*@ requires a ≥ 0; */ +void g(int a) +{ + return; +} + +/*@ ensures \old(x) > 0; */ +void f(int x) +{ + x = 1; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0672_link.1.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0672_link.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0672_link.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0672_link.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,22 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/bts0672_link.c (with preprocessing) +[kernel] Parsing tests/syntax/bts0672_link_2.c (with preprocessing) +/* Generated by Frama-C */ +int Frama_C_entropy_source; +/*@ predicate foo(ℤ x) = \true; + */ +/*@ ensures foo(\result); + assigns \result, Frama_C_entropy_source; + assigns \result \from a, b, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern int Frama_C_nondet(int a, int b); + +void main(void) +{ + int x; + x = Frama_C_nondet(0,59); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0672_link.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0672_link.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0672_link.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0672_link.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/bts0672_link.c (with preprocessing) +[kernel] Parsing tests/syntax/bts0672_link_2.c (with preprocessing) +tests/syntax/bts0672_link_2.c:10:[kernel] warning: Calling undeclared function Frama_C_nondet. Old style K&R code? +/* Generated by Frama-C */ +int Frama_C_entropy_source; +/*@ predicate foo(ℤ x) = \true; + */ +/*@ ensures foo(\result); + assigns \result, Frama_C_entropy_source; + assigns \result \from a, b, Frama_C_entropy_source; + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +extern int Frama_C_nondet(int a, int b); + +void main(void) +{ + int x; + x = Frama_C_nondet(0,59); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0769.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0769.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0769.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0769.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,22 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/bts0769.i (no preprocessing) +/* Generated by Frama-C */ +struct __anonstruct___1 { + int ui ; +}; +union foo { + int ii ; +}; +struct s { + struct __anonstruct___1 _ ; + union foo __anonCompField1 ; +}; +struct s S; +int main(void) +{ + int __retres; + __retres = S._.ui + S.__anonCompField1.ii; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0916.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0916.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts0916.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts0916.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,62 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/bts0916.i (no preprocessing) +/* Generated by Frama-C */ +/* ************************************************************************ */ +/* */ +/* This file is part of Frama-C. */ +/* */ +/* Copyright (C) 2007-2015 */ +/* 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). */ +/* */ +/* ************************************************************************ */ +/* Functions used internally by the normalization phase. */ +/* This file is systematically included by Frama-C's kernel. */ +/* FC's code normalization can use some of the functions declared here. */ +/* If you add something here, be sure to use the FC_BUILTIN attribute, */ +/* that will ensure that the builtin is printed iff it is actually used */ +/* in the normalized code. */ +/* run.config + STDOPT: +"-keep-comments" + */ +/* Use frama-c with option -keep-comments */ +void main(void) +{ + int port; + port = 10; + /* ( port & 0x80 ) == 0 ) */ + /* wait for pin1 - Compliant */ + /* wait for pin2 */ + /* Not compliant/*, comment before ; */ + /* wait for pin3 - Not compliant, no white-space char after ; */ + while (1) { + int tmp; + { + /*sequence*/ + tmp = port; + port --; + ; + } + if (! (tmp > 0)) /* ( port & 0x80 ) == 0 ) */ + /* wait for pin1 - Compliant */ + /* wait for pin2 */ + /* Not compliant/*, comment before ; */ + /* wait for pin3 - Not compliant, no white-space char after ; */ + break; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts59.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts59.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/bts59.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/bts59.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/bts59.i (no preprocessing) +/* Generated by Frama-C */ +float g(void) +{ + float __retres_5; + double __retres; + int first; + __retres = (double)2; + first = 6; + { + int first_0; + first_0 = 5; + __retres_5 = (float)__retres; + return __retres_5; + } +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/built.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/built.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/built.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/built.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/built.i (no preprocessing) +tests/syntax/built.i:15:[kernel] warning: Call to ____ilog2_NaN in constant. Ignoring this call and returning 0. +tests/syntax/built.i:15:[kernel] warning: Call to ____ilog2_NaN in constant. Ignoring this call and returning 0. +tests/syntax/built.i:15:[kernel] warning: Call to __ilog2_u32 in constant. Ignoring this call and returning 0. +tests/syntax/built.i:15:[kernel] warning: Call to __ilog2_u64 in constant. Ignoring this call and returning 0. +tests/syntax/built.i:21:[kernel] Case label -1 exceeds range of unsigned int for switch expression. Nothing to worry. +/* Generated by Frama-C */ +char ___assert_task_state[1 - 2 * 0]; +int X; +void main(int z) +{ + switch (sizeof(z)) { + case (unsigned int)1: X ++; + break; + case (unsigned int)2: ___assert_task_state[0] = (char)1; + break; + case (unsigned int)(-1): X ++; + break; + } + return; +} + +int T[1 + 0]; + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/char_is_unsigned.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/char_is_unsigned.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/char_is_unsigned.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/char_is_unsigned.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/char_is_unsigned.i (no preprocessing) +/* Generated by Frama-C */ +char t[10]; +void main(void) +{ + int r; + char c; + r = (int)t[0] == 'a'; + c = (char)455; + return; +} + + +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/char_is_unsigned.i (no preprocessing) +[rte] annotating function main +/* Generated by Frama-C */ +char t[10]; +void main(void) +{ + int r; + char c; + r = (int)t[0] == 97; + c = (char)199; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/check_builtin_bts1440.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/check_builtin_bts1440.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/check_builtin_bts1440.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/check_builtin_bts1440.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,1270 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel:file] result of parsing ./share/libc/__fc_builtin_for_normalization.i: +[kernel:file] /* Generated by Frama-C */ +[kernel:file] int __builtin___fprintf_chk(void *, int, char const * , ...); +[kernel:file] +[kernel:file] void *__builtin___memcpy_chk(void *, void const *, unsigned int, unsigned int); +[kernel:file] +[kernel:file] void *__builtin___memmove_chk(void *, void const *, unsigned int, +[kernel:file] unsigned int); +[kernel:file] +[kernel:file] void *__builtin___mempcpy_chk(void *, void const *, unsigned int, +[kernel:file] unsigned int); +[kernel:file] +[kernel:file] void *__builtin___memset_chk(void *, int, unsigned int, unsigned int); +[kernel:file] +[kernel:file] int __builtin___printf_chk(int, char const * , ...); +[kernel:file] +[kernel:file] int __builtin___snprintf_chk(char *, unsigned int, int, unsigned int, +[kernel:file] char const * , ...); +[kernel:file] +[kernel:file] int __builtin___sprintf_chk(char *, int, unsigned int, char const * , ...); +[kernel:file] +[kernel:file] char *__builtin___stpcpy_chk(char *, char const *, unsigned int); +[kernel:file] +[kernel:file] char *__builtin___strcat_chk(char *, char const *, unsigned int); +[kernel:file] +[kernel:file] char *__builtin___strcpy_chk(char *, char const *, unsigned int); +[kernel:file] +[kernel:file] char *__builtin___strncat_chk(char *, char const *, unsigned int, +[kernel:file] unsigned int); +[kernel:file] +[kernel:file] char *__builtin___strncpy_chk(char *, char const *, unsigned int, +[kernel:file] unsigned int); +[kernel:file] +[kernel:file] int __builtin___vfprintf_chk(void *, int, char const *, __builtin_va_list); +[kernel:file] +[kernel:file] int __builtin___vprintf_chk(int, char const *, __builtin_va_list); +[kernel:file] +[kernel:file] int __builtin___vsnprintf_chk(char *, unsigned int, int, unsigned int, +[kernel:file] char const *, __builtin_va_list); +[kernel:file] +[kernel:file] int __builtin___vsprintf_chk(char *, int, unsigned int, char const *, +[kernel:file] __builtin_va_list); +[kernel:file] +[kernel:file] double __builtin_acos(double); +[kernel:file] +[kernel:file] float __builtin_acosf(float); +[kernel:file] +[kernel:file] long double __builtin_acosl(long double); +[kernel:file] +[kernel:file] void *__builtin_alloca(unsigned int); +[kernel:file] +[kernel:file] double __builtin_asin(double); +[kernel:file] +[kernel:file] float __builtin_asinf(float); +[kernel:file] +[kernel:file] long double __builtin_asinl(long double); +[kernel:file] +[kernel:file] double __builtin_atan(double); +[kernel:file] +[kernel:file] double __builtin_atan2(double, double); +[kernel:file] +[kernel:file] float __builtin_atan2f(float, float); +[kernel:file] +[kernel:file] long double __builtin_atan2l(long double, long double); +[kernel:file] +[kernel:file] float __builtin_atanf(float); +[kernel:file] +[kernel:file] long double __builtin_atanl(long double); +[kernel:file] +[kernel:file] unsigned short __builtin_bswap16(unsigned short); +[kernel:file] +[kernel:file] unsigned int __builtin_bswap32(unsigned int); +[kernel:file] +[kernel:file] unsigned long long __builtin_bswap64(unsigned long long); +[kernel:file] +[kernel:file] double __builtin_ceil(double); +[kernel:file] +[kernel:file] float __builtin_ceilf(float); +[kernel:file] +[kernel:file] long double __builtin_ceill(long double); +[kernel:file] +[kernel:file] int __builtin_clz(unsigned int); +[kernel:file] +[kernel:file] int __builtin_clzl(unsigned long); +[kernel:file] +[kernel:file] int __builtin_clzll(unsigned long long); +[kernel:file] +[kernel:file] int __builtin_constant_p(int); +[kernel:file] +[kernel:file] double __builtin_cos(double); +[kernel:file] +[kernel:file] float __builtin_cosf(float); +[kernel:file] +[kernel:file] double __builtin_cosh(double); +[kernel:file] +[kernel:file] float __builtin_coshf(float); +[kernel:file] +[kernel:file] long double __builtin_coshl(long double); +[kernel:file] +[kernel:file] long double __builtin_cosl(long double); +[kernel:file] +[kernel:file] int __builtin_ctz(unsigned int); +[kernel:file] +[kernel:file] int __builtin_ctzl(unsigned long); +[kernel:file] +[kernel:file] int __builtin_ctzll(unsigned long long); +[kernel:file] +[kernel:file] double __builtin_exp(double); +[kernel:file] +[kernel:file] long __builtin_expect(long, long); +[kernel:file] +[kernel:file] float __builtin_expf(float); +[kernel:file] +[kernel:file] long double __builtin_expl(long double); +[kernel:file] +[kernel:file] double __builtin_fabs(double); +[kernel:file] +[kernel:file] float __builtin_fabsf(float); +[kernel:file] +[kernel:file] long double __builtin_fabsl(long double); +[kernel:file] +[kernel:file] int __builtin_ffs(unsigned int); +[kernel:file] +[kernel:file] int __builtin_ffsl(unsigned long); +[kernel:file] +[kernel:file] int __builtin_ffsll(unsigned long long); +[kernel:file] +[kernel:file] double __builtin_floor(double); +[kernel:file] +[kernel:file] float __builtin_floorf(float); +[kernel:file] +[kernel:file] long double __builtin_floorl(long double); +[kernel:file] +[kernel:file] double __builtin_fmod(double); +[kernel:file] +[kernel:file] float __builtin_fmodf(float); +[kernel:file] +[kernel:file] long double __builtin_fmodl(long double); +[kernel:file] +[kernel:file] void *__builtin_frame_address(unsigned int); +[kernel:file] +[kernel:file] double __builtin_frexp(double, int *); +[kernel:file] +[kernel:file] float __builtin_frexpf(float, int *); +[kernel:file] +[kernel:file] long double __builtin_frexpl(long double, int *); +[kernel:file] +[kernel:file] double __builtin_huge_val(void); +[kernel:file] +[kernel:file] float __builtin_huge_valf(void); +[kernel:file] +[kernel:file] long double __builtin_huge_vall(void); +[kernel:file] +[kernel:file] void __builtin_ia32_lfence(void); +[kernel:file] +[kernel:file] void __builtin_ia32_mfence(void); +[kernel:file] +[kernel:file] void __builtin_ia32_sfence(void); +[kernel:file] +[kernel:file] double __builtin_inf(void); +[kernel:file] +[kernel:file] float __builtin_inff(void); +[kernel:file] +[kernel:file] long double __builtin_infl(void); +[kernel:file] +[kernel:file] double __builtin_ldexp(double, int); +[kernel:file] +[kernel:file] float __builtin_ldexpf(float, int); +[kernel:file] +[kernel:file] long double __builtin_ldexpl(long double, int); +[kernel:file] +[kernel:file] double __builtin_log(double); +[kernel:file] +[kernel:file] double __builtin_log10(double); +[kernel:file] +[kernel:file] float __builtin_log10f(float); +[kernel:file] +[kernel:file] long double __builtin_log10l(long double); +[kernel:file] +[kernel:file] float __builtin_logf(float); +[kernel:file] +[kernel:file] long double __builtin_logl(long double); +[kernel:file] +[kernel:file] void *__builtin_memcpy(void *, void const *, unsigned int); +[kernel:file] +[kernel:file] void *__builtin_mempcpy(void *, void const *, unsigned int); +[kernel:file] +[kernel:file] void *__builtin_memset(void *, int, int); +[kernel:file] +[kernel:file] float __builtin_modff(float, float *); +[kernel:file] +[kernel:file] long double __builtin_modfl(long double, long double *); +[kernel:file] +[kernel:file] double __builtin_nan(char const *); +[kernel:file] +[kernel:file] float __builtin_nanf(char const *); +[kernel:file] +[kernel:file] long double __builtin_nanl(char const *); +[kernel:file] +[kernel:file] double __builtin_nans(char const *); +[kernel:file] +[kernel:file] float __builtin_nansf(char const *); +[kernel:file] +[kernel:file] long double __builtin_nansl(char const *); +[kernel:file] +[kernel:file] __builtin_va_list __builtin_next_arg(void); +[kernel:file] +[kernel:file] unsigned int __builtin_object_size(void *, int); +[kernel:file] +[kernel:file] int __builtin_parity(unsigned int); +[kernel:file] +[kernel:file] int __builtin_parityl(unsigned long); +[kernel:file] +[kernel:file] int __builtin_parityll(unsigned long long); +[kernel:file] +[kernel:file] int __builtin_popcount(unsigned int); +[kernel:file] +[kernel:file] int __builtin_popcountl(unsigned long); +[kernel:file] +[kernel:file] int __builtin_popcountll(unsigned long long); +[kernel:file] +[kernel:file] double __builtin_powi(double, int); +[kernel:file] +[kernel:file] float __builtin_powif(float, int); +[kernel:file] +[kernel:file] long double __builtin_powil(long double, int); +[kernel:file] +[kernel:file] void __builtin_prefetch(void const * , ...); +[kernel:file] +[kernel:file] void __builtin_return(void const *); +[kernel:file] +[kernel:file] void *__builtin_return_address(unsigned int); +[kernel:file] +[kernel:file] double __builtin_sin(double); +[kernel:file] +[kernel:file] float __builtin_sinf(float); +[kernel:file] +[kernel:file] double __builtin_sinh(double); +[kernel:file] +[kernel:file] float __builtin_sinhf(float); +[kernel:file] +[kernel:file] long double __builtin_sinhl(long double); +[kernel:file] +[kernel:file] long double __builtin_sinl(long double); +[kernel:file] +[kernel:file] double __builtin_sqrt(double); +[kernel:file] +[kernel:file] float __builtin_sqrtf(float); +[kernel:file] +[kernel:file] long double __builtin_sqrtl(long double); +[kernel:file] +[kernel:file] void __builtin_stdarg_start(__builtin_va_list); +[kernel:file] +[kernel:file] char *__builtin_stpcpy(char *, char const *); +[kernel:file] +[kernel:file] char *__builtin_strchr(char *, int); +[kernel:file] +[kernel:file] int __builtin_strcmp(char const *, char const *); +[kernel:file] +[kernel:file] char *__builtin_strcpy(char *, char const *); +[kernel:file] +[kernel:file] unsigned int __builtin_strcspn(char const *, char const *); +[kernel:file] +[kernel:file] char *__builtin_strncat(char *, char const *, unsigned int); +[kernel:file] +[kernel:file] int __builtin_strncmp(char const *, char const *, unsigned int); +[kernel:file] +[kernel:file] char *__builtin_strncpy(char *, char const *, unsigned int); +[kernel:file] +[kernel:file] char *__builtin_strpbrk(char const *, char const *); +[kernel:file] +[kernel:file] unsigned int __builtin_strspn(char const *, char const *); +[kernel:file] +[kernel:file] double __builtin_tan(double); +[kernel:file] +[kernel:file] float __builtin_tanf(float); +[kernel:file] +[kernel:file] double __builtin_tanh(double); +[kernel:file] +[kernel:file] float __builtin_tanhf(float); +[kernel:file] +[kernel:file] long double __builtin_tanhl(long double); +[kernel:file] +[kernel:file] long double __builtin_tanl(long double); +[kernel:file] +[kernel:file] int __builtin_types_compatible_p(unsigned int, unsigned int); +[kernel:file] +[kernel:file] void __builtin_unreachable(void); +[kernel:file] +[kernel:file] void __builtin_va_arg(__builtin_va_list, unsigned int, void *); +[kernel:file] +[kernel:file] void __builtin_va_copy(__builtin_va_list, __builtin_va_list); +[kernel:file] +[kernel:file] void __builtin_va_end(__builtin_va_list); +[kernel:file] +[kernel:file] void __builtin_va_start(__builtin_va_list); +[kernel:file] +[kernel:file] void __builtin_varargs_start(__builtin_va_list); +[kernel:file] +[kernel:file] short __sync_add_and_fetch_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_add_and_fetch_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_add_and_fetch_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_add_and_fetch_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_add_and_fetch_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_add_and_fetch_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_add_and_fetch_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_add_and_fetch_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_and_and_fetch_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_and_and_fetch_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_and_and_fetch_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_and_and_fetch_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_and_and_fetch_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_and_and_fetch_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_and_and_fetch_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_and_and_fetch_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] int __sync_bool_compare_and_swap_int16_t(short *, short, short , ...); +[kernel:file] +[kernel:file] int __sync_bool_compare_and_swap_int32_t(int *, int, int , ...); +[kernel:file] +[kernel:file] int __sync_bool_compare_and_swap_int64_t(long long *, long long, long long +[kernel:file] , ...); +[kernel:file] +[kernel:file] int __sync_bool_compare_and_swap_int8_t(signed char *, signed char, +[kernel:file] signed char , ...); +[kernel:file] +[kernel:file] int __sync_bool_compare_and_swap_uint16_t(unsigned short *, unsigned short, +[kernel:file] unsigned short , ...); +[kernel:file] +[kernel:file] int __sync_bool_compare_and_swap_uint32_t(unsigned int *, unsigned int, +[kernel:file] unsigned int , ...); +[kernel:file] +[kernel:file] int __sync_bool_compare_and_swap_uint64_t(unsigned long long *, +[kernel:file] unsigned long long, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] int __sync_bool_compare_and_swap_uint8_t(unsigned char *, unsigned char, +[kernel:file] unsigned char , ...); +[kernel:file] +[kernel:file] short __sync_fetch_and_add_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_fetch_and_add_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_fetch_and_add_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_fetch_and_add_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_fetch_and_add_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_fetch_and_add_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_fetch_and_add_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_fetch_and_add_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_fetch_and_and_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_fetch_and_and_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_fetch_and_and_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_fetch_and_and_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_fetch_and_and_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_fetch_and_and_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_fetch_and_and_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_fetch_and_and_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_fetch_and_nand_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_fetch_and_nand_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_fetch_and_nand_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_fetch_and_nand_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_fetch_and_nand_uint16_t(unsigned short *, +[kernel:file] unsigned short , ...); +[kernel:file] +[kernel:file] unsigned int __sync_fetch_and_nand_uint32_t(unsigned int *, unsigned int +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_fetch_and_nand_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_fetch_and_nand_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_fetch_and_or_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_fetch_and_or_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_fetch_and_or_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_fetch_and_or_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_fetch_and_or_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_fetch_and_or_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_fetch_and_or_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_fetch_and_or_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_fetch_and_sub_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_fetch_and_sub_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_fetch_and_sub_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_fetch_and_sub_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_fetch_and_sub_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_fetch_and_sub_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_fetch_and_sub_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_fetch_and_sub_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_fetch_and_xor_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_fetch_and_xor_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_fetch_and_xor_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_fetch_and_xor_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_fetch_and_xor_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_fetch_and_xor_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_fetch_and_xor_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_fetch_and_xor_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] void __sync_lock_release_int16_t(short * , ...); +[kernel:file] +[kernel:file] void __sync_lock_release_int32_t(int * , ...); +[kernel:file] +[kernel:file] void __sync_lock_release_int64_t(long long * , ...); +[kernel:file] +[kernel:file] void __sync_lock_release_int8_t(signed char * , ...); +[kernel:file] +[kernel:file] void __sync_lock_release_uint16_t(unsigned short * , ...); +[kernel:file] +[kernel:file] void __sync_lock_release_uint32_t(unsigned int * , ...); +[kernel:file] +[kernel:file] void __sync_lock_release_uint64_t(unsigned long long * , ...); +[kernel:file] +[kernel:file] void __sync_lock_release_uint8_t(unsigned char * , ...); +[kernel:file] +[kernel:file] short __sync_lock_test_and_set_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_lock_test_and_set_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_lock_test_and_set_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_lock_test_and_set_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_lock_test_and_set_uint16_t(unsigned short *, +[kernel:file] unsigned short , ...); +[kernel:file] +[kernel:file] unsigned int __sync_lock_test_and_set_uint32_t(unsigned int *, unsigned int +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_lock_test_and_set_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_lock_test_and_set_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_nand_and_fetch_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_nand_and_fetch_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_nand_and_fetch_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_nand_and_fetch_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_nand_and_fetch_uint16_t(unsigned short *, +[kernel:file] unsigned short , ...); +[kernel:file] +[kernel:file] unsigned int __sync_nand_and_fetch_uint32_t(unsigned int *, unsigned int +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_nand_and_fetch_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_nand_and_fetch_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_or_and_fetch_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_or_and_fetch_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_or_and_fetch_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_or_and_fetch_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_or_and_fetch_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_or_and_fetch_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_or_and_fetch_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_or_and_fetch_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_sub_and_fetch_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_sub_and_fetch_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_sub_and_fetch_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_sub_and_fetch_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_sub_and_fetch_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_sub_and_fetch_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_sub_and_fetch_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_sub_and_fetch_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] void __sync_synchronize(...); +[kernel:file] +[kernel:file] short __sync_val_compare_and_swap_int16_t(short *, short, short , ...); +[kernel:file] +[kernel:file] int __sync_val_compare_and_swap_int32_t(int *, int, int , ...); +[kernel:file] +[kernel:file] long long __sync_val_compare_and_swap_int64_t(long long *, long long, +[kernel:file] long long , ...); +[kernel:file] +[kernel:file] signed char __sync_val_compare_and_swap_int8_t(signed char *, signed char, +[kernel:file] signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_val_compare_and_swap_uint16_t(unsigned short *, +[kernel:file] unsigned short, +[kernel:file] unsigned short , ...); +[kernel:file] +[kernel:file] unsigned int __sync_val_compare_and_swap_uint32_t(unsigned int *, +[kernel:file] unsigned int, unsigned int +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_val_compare_and_swap_uint64_t(unsigned long long *, +[kernel:file] unsigned long long, +[kernel:file] unsigned long long +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned char __sync_val_compare_and_swap_uint8_t(unsigned char *, +[kernel:file] unsigned char, +[kernel:file] unsigned char , ...); +[kernel:file] +[kernel:file] short __sync_xor_and_fetch_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_xor_and_fetch_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_xor_and_fetch_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_xor_and_fetch_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_xor_and_fetch_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_xor_and_fetch_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_xor_and_fetch_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_xor_and_fetch_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel] Parsing tests/syntax/check_builtin_bts1440.i (no preprocessing) +[kernel:file] result of parsing tests/syntax/check_builtin_bts1440.i: +[kernel:file] /* Generated by Frama-C */ +[kernel:file] int __builtin___fprintf_chk(void *, int, char const * , ...); +[kernel:file] +[kernel:file] void *__builtin___memcpy_chk(void *, void const *, unsigned int, unsigned int); +[kernel:file] +[kernel:file] void *__builtin___memmove_chk(void *, void const *, unsigned int, +[kernel:file] unsigned int); +[kernel:file] +[kernel:file] void *__builtin___mempcpy_chk(void *, void const *, unsigned int, +[kernel:file] unsigned int); +[kernel:file] +[kernel:file] void *__builtin___memset_chk(void *, int, unsigned int, unsigned int); +[kernel:file] +[kernel:file] int __builtin___printf_chk(int, char const * , ...); +[kernel:file] +[kernel:file] int __builtin___snprintf_chk(char *, unsigned int, int, unsigned int, +[kernel:file] char const * , ...); +[kernel:file] +[kernel:file] int __builtin___sprintf_chk(char *, int, unsigned int, char const * , ...); +[kernel:file] +[kernel:file] char *__builtin___stpcpy_chk(char *, char const *, unsigned int); +[kernel:file] +[kernel:file] char *__builtin___strcat_chk(char *, char const *, unsigned int); +[kernel:file] +[kernel:file] char *__builtin___strcpy_chk(char *, char const *, unsigned int); +[kernel:file] +[kernel:file] char *__builtin___strncat_chk(char *, char const *, unsigned int, +[kernel:file] unsigned int); +[kernel:file] +[kernel:file] char *__builtin___strncpy_chk(char *, char const *, unsigned int, +[kernel:file] unsigned int); +[kernel:file] +[kernel:file] int __builtin___vfprintf_chk(void *, int, char const *, __builtin_va_list); +[kernel:file] +[kernel:file] int __builtin___vprintf_chk(int, char const *, __builtin_va_list); +[kernel:file] +[kernel:file] int __builtin___vsnprintf_chk(char *, unsigned int, int, unsigned int, +[kernel:file] char const *, __builtin_va_list); +[kernel:file] +[kernel:file] int __builtin___vsprintf_chk(char *, int, unsigned int, char const *, +[kernel:file] __builtin_va_list); +[kernel:file] +[kernel:file] double __builtin_acos(double); +[kernel:file] +[kernel:file] float __builtin_acosf(float); +[kernel:file] +[kernel:file] long double __builtin_acosl(long double); +[kernel:file] +[kernel:file] void *__builtin_alloca(unsigned int); +[kernel:file] +[kernel:file] double __builtin_asin(double); +[kernel:file] +[kernel:file] float __builtin_asinf(float); +[kernel:file] +[kernel:file] long double __builtin_asinl(long double); +[kernel:file] +[kernel:file] double __builtin_atan(double); +[kernel:file] +[kernel:file] double __builtin_atan2(double, double); +[kernel:file] +[kernel:file] float __builtin_atan2f(float, float); +[kernel:file] +[kernel:file] long double __builtin_atan2l(long double, long double); +[kernel:file] +[kernel:file] float __builtin_atanf(float); +[kernel:file] +[kernel:file] long double __builtin_atanl(long double); +[kernel:file] +[kernel:file] unsigned short __builtin_bswap16(unsigned short); +[kernel:file] +[kernel:file] unsigned int __builtin_bswap32(unsigned int); +[kernel:file] +[kernel:file] unsigned long long __builtin_bswap64(unsigned long long); +[kernel:file] +[kernel:file] double __builtin_ceil(double); +[kernel:file] +[kernel:file] float __builtin_ceilf(float); +[kernel:file] +[kernel:file] long double __builtin_ceill(long double); +[kernel:file] +[kernel:file] int __builtin_clz(unsigned int); +[kernel:file] +[kernel:file] int __builtin_clzl(unsigned long); +[kernel:file] +[kernel:file] int __builtin_clzll(unsigned long long); +[kernel:file] +[kernel:file] int __builtin_constant_p(int); +[kernel:file] +[kernel:file] double __builtin_cos(double); +[kernel:file] +[kernel:file] float __builtin_cosf(float); +[kernel:file] +[kernel:file] double __builtin_cosh(double); +[kernel:file] +[kernel:file] float __builtin_coshf(float); +[kernel:file] +[kernel:file] long double __builtin_coshl(long double); +[kernel:file] +[kernel:file] long double __builtin_cosl(long double); +[kernel:file] +[kernel:file] int __builtin_ctz(unsigned int); +[kernel:file] +[kernel:file] int __builtin_ctzl(unsigned long); +[kernel:file] +[kernel:file] int __builtin_ctzll(unsigned long long); +[kernel:file] +[kernel:file] double __builtin_exp(double); +[kernel:file] +[kernel:file] long __builtin_expect(long, long); +[kernel:file] +[kernel:file] float __builtin_expf(float); +[kernel:file] +[kernel:file] long double __builtin_expl(long double); +[kernel:file] +[kernel:file] double __builtin_fabs(double); +[kernel:file] +[kernel:file] float __builtin_fabsf(float); +[kernel:file] +[kernel:file] long double __builtin_fabsl(long double); +[kernel:file] +[kernel:file] int __builtin_ffs(unsigned int); +[kernel:file] +[kernel:file] int __builtin_ffsl(unsigned long); +[kernel:file] +[kernel:file] int __builtin_ffsll(unsigned long long); +[kernel:file] +[kernel:file] double __builtin_floor(double); +[kernel:file] +[kernel:file] float __builtin_floorf(float); +[kernel:file] +[kernel:file] long double __builtin_floorl(long double); +[kernel:file] +[kernel:file] double __builtin_fmod(double); +[kernel:file] +[kernel:file] float __builtin_fmodf(float); +[kernel:file] +[kernel:file] long double __builtin_fmodl(long double); +[kernel:file] +[kernel:file] void *__builtin_frame_address(unsigned int); +[kernel:file] +[kernel:file] double __builtin_frexp(double, int *); +[kernel:file] +[kernel:file] float __builtin_frexpf(float, int *); +[kernel:file] +[kernel:file] long double __builtin_frexpl(long double, int *); +[kernel:file] +[kernel:file] double __builtin_huge_val(void); +[kernel:file] +[kernel:file] float __builtin_huge_valf(void); +[kernel:file] +[kernel:file] long double __builtin_huge_vall(void); +[kernel:file] +[kernel:file] void __builtin_ia32_lfence(void); +[kernel:file] +[kernel:file] void __builtin_ia32_mfence(void); +[kernel:file] +[kernel:file] void __builtin_ia32_sfence(void); +[kernel:file] +[kernel:file] double __builtin_inf(void); +[kernel:file] +[kernel:file] float __builtin_inff(void); +[kernel:file] +[kernel:file] long double __builtin_infl(void); +[kernel:file] +[kernel:file] double __builtin_ldexp(double, int); +[kernel:file] +[kernel:file] float __builtin_ldexpf(float, int); +[kernel:file] +[kernel:file] long double __builtin_ldexpl(long double, int); +[kernel:file] +[kernel:file] double __builtin_log(double); +[kernel:file] +[kernel:file] double __builtin_log10(double); +[kernel:file] +[kernel:file] float __builtin_log10f(float); +[kernel:file] +[kernel:file] long double __builtin_log10l(long double); +[kernel:file] +[kernel:file] float __builtin_logf(float); +[kernel:file] +[kernel:file] long double __builtin_logl(long double); +[kernel:file] +[kernel:file] void *__builtin_memcpy(void *, void const *, unsigned int); +[kernel:file] +[kernel:file] void *__builtin_mempcpy(void *, void const *, unsigned int); +[kernel:file] +[kernel:file] void *__builtin_memset(void *, int, int); +[kernel:file] +[kernel:file] float __builtin_modff(float, float *); +[kernel:file] +[kernel:file] long double __builtin_modfl(long double, long double *); +[kernel:file] +[kernel:file] double __builtin_nan(char const *); +[kernel:file] +[kernel:file] float __builtin_nanf(char const *); +[kernel:file] +[kernel:file] long double __builtin_nanl(char const *); +[kernel:file] +[kernel:file] double __builtin_nans(char const *); +[kernel:file] +[kernel:file] float __builtin_nansf(char const *); +[kernel:file] +[kernel:file] long double __builtin_nansl(char const *); +[kernel:file] +[kernel:file] __builtin_va_list __builtin_next_arg(void); +[kernel:file] +[kernel:file] unsigned int __builtin_object_size(void *, int); +[kernel:file] +[kernel:file] int __builtin_parity(unsigned int); +[kernel:file] +[kernel:file] int __builtin_parityl(unsigned long); +[kernel:file] +[kernel:file] int __builtin_parityll(unsigned long long); +[kernel:file] +[kernel:file] int __builtin_popcount(unsigned int); +[kernel:file] +[kernel:file] int __builtin_popcountl(unsigned long); +[kernel:file] +[kernel:file] int __builtin_popcountll(unsigned long long); +[kernel:file] +[kernel:file] double __builtin_powi(double, int); +[kernel:file] +[kernel:file] float __builtin_powif(float, int); +[kernel:file] +[kernel:file] long double __builtin_powil(long double, int); +[kernel:file] +[kernel:file] void __builtin_prefetch(void const * , ...); +[kernel:file] +[kernel:file] void __builtin_return(void const *); +[kernel:file] +[kernel:file] void *__builtin_return_address(unsigned int); +[kernel:file] +[kernel:file] double __builtin_sin(double); +[kernel:file] +[kernel:file] float __builtin_sinf(float); +[kernel:file] +[kernel:file] double __builtin_sinh(double); +[kernel:file] +[kernel:file] float __builtin_sinhf(float); +[kernel:file] +[kernel:file] long double __builtin_sinhl(long double); +[kernel:file] +[kernel:file] long double __builtin_sinl(long double); +[kernel:file] +[kernel:file] double __builtin_sqrt(double); +[kernel:file] +[kernel:file] float __builtin_sqrtf(float); +[kernel:file] +[kernel:file] long double __builtin_sqrtl(long double); +[kernel:file] +[kernel:file] void __builtin_stdarg_start(__builtin_va_list); +[kernel:file] +[kernel:file] char *__builtin_stpcpy(char *, char const *); +[kernel:file] +[kernel:file] char *__builtin_strchr(char *, int); +[kernel:file] +[kernel:file] int __builtin_strcmp(char const *, char const *); +[kernel:file] +[kernel:file] char *__builtin_strcpy(char *, char const *); +[kernel:file] +[kernel:file] unsigned int __builtin_strcspn(char const *, char const *); +[kernel:file] +[kernel:file] char *__builtin_strncat(char *, char const *, unsigned int); +[kernel:file] +[kernel:file] int __builtin_strncmp(char const *, char const *, unsigned int); +[kernel:file] +[kernel:file] char *__builtin_strncpy(char *, char const *, unsigned int); +[kernel:file] +[kernel:file] char *__builtin_strpbrk(char const *, char const *); +[kernel:file] +[kernel:file] unsigned int __builtin_strspn(char const *, char const *); +[kernel:file] +[kernel:file] double __builtin_tan(double); +[kernel:file] +[kernel:file] float __builtin_tanf(float); +[kernel:file] +[kernel:file] double __builtin_tanh(double); +[kernel:file] +[kernel:file] float __builtin_tanhf(float); +[kernel:file] +[kernel:file] long double __builtin_tanhl(long double); +[kernel:file] +[kernel:file] long double __builtin_tanl(long double); +[kernel:file] +[kernel:file] int __builtin_types_compatible_p(unsigned int, unsigned int); +[kernel:file] +[kernel:file] void __builtin_unreachable(void); +[kernel:file] +[kernel:file] void __builtin_va_arg(__builtin_va_list, unsigned int, void *); +[kernel:file] +[kernel:file] void __builtin_va_copy(__builtin_va_list, __builtin_va_list); +[kernel:file] +[kernel:file] void __builtin_va_end(__builtin_va_list); +[kernel:file] +[kernel:file] void __builtin_va_start(__builtin_va_list); +[kernel:file] +[kernel:file] void __builtin_varargs_start(__builtin_va_list); +[kernel:file] +[kernel:file] short __sync_add_and_fetch_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_add_and_fetch_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_add_and_fetch_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_add_and_fetch_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_add_and_fetch_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_add_and_fetch_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_add_and_fetch_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_add_and_fetch_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_and_and_fetch_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_and_and_fetch_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_and_and_fetch_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_and_and_fetch_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_and_and_fetch_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_and_and_fetch_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_and_and_fetch_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_and_and_fetch_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] int __sync_bool_compare_and_swap_int16_t(short *, short, short , ...); +[kernel:file] +[kernel:file] int __sync_bool_compare_and_swap_int32_t(int *, int, int , ...); +[kernel:file] +[kernel:file] int __sync_bool_compare_and_swap_int64_t(long long *, long long, long long +[kernel:file] , ...); +[kernel:file] +[kernel:file] int __sync_bool_compare_and_swap_int8_t(signed char *, signed char, +[kernel:file] signed char , ...); +[kernel:file] +[kernel:file] int __sync_bool_compare_and_swap_uint16_t(unsigned short *, unsigned short, +[kernel:file] unsigned short , ...); +[kernel:file] +[kernel:file] int __sync_bool_compare_and_swap_uint32_t(unsigned int *, unsigned int, +[kernel:file] unsigned int , ...); +[kernel:file] +[kernel:file] int __sync_bool_compare_and_swap_uint64_t(unsigned long long *, +[kernel:file] unsigned long long, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] int __sync_bool_compare_and_swap_uint8_t(unsigned char *, unsigned char, +[kernel:file] unsigned char , ...); +[kernel:file] +[kernel:file] short __sync_fetch_and_add_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_fetch_and_add_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_fetch_and_add_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_fetch_and_add_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_fetch_and_add_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_fetch_and_add_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_fetch_and_add_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_fetch_and_add_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_fetch_and_and_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_fetch_and_and_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_fetch_and_and_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_fetch_and_and_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_fetch_and_and_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_fetch_and_and_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_fetch_and_and_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_fetch_and_and_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_fetch_and_nand_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_fetch_and_nand_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_fetch_and_nand_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_fetch_and_nand_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_fetch_and_nand_uint16_t(unsigned short *, +[kernel:file] unsigned short , ...); +[kernel:file] +[kernel:file] unsigned int __sync_fetch_and_nand_uint32_t(unsigned int *, unsigned int +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_fetch_and_nand_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_fetch_and_nand_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_fetch_and_or_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_fetch_and_or_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_fetch_and_or_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_fetch_and_or_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_fetch_and_or_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_fetch_and_or_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_fetch_and_or_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_fetch_and_or_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_fetch_and_sub_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_fetch_and_sub_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_fetch_and_sub_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_fetch_and_sub_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_fetch_and_sub_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_fetch_and_sub_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_fetch_and_sub_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_fetch_and_sub_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_fetch_and_xor_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_fetch_and_xor_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_fetch_and_xor_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_fetch_and_xor_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_fetch_and_xor_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_fetch_and_xor_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_fetch_and_xor_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_fetch_and_xor_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] void __sync_lock_release_int16_t(short * , ...); +[kernel:file] +[kernel:file] void __sync_lock_release_int32_t(int * , ...); +[kernel:file] +[kernel:file] void __sync_lock_release_int64_t(long long * , ...); +[kernel:file] +[kernel:file] void __sync_lock_release_int8_t(signed char * , ...); +[kernel:file] +[kernel:file] void __sync_lock_release_uint16_t(unsigned short * , ...); +[kernel:file] +[kernel:file] void __sync_lock_release_uint32_t(unsigned int * , ...); +[kernel:file] +[kernel:file] void __sync_lock_release_uint64_t(unsigned long long * , ...); +[kernel:file] +[kernel:file] void __sync_lock_release_uint8_t(unsigned char * , ...); +[kernel:file] +[kernel:file] short __sync_lock_test_and_set_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_lock_test_and_set_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_lock_test_and_set_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_lock_test_and_set_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_lock_test_and_set_uint16_t(unsigned short *, +[kernel:file] unsigned short , ...); +[kernel:file] +[kernel:file] unsigned int __sync_lock_test_and_set_uint32_t(unsigned int *, unsigned int +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_lock_test_and_set_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_lock_test_and_set_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_nand_and_fetch_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_nand_and_fetch_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_nand_and_fetch_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_nand_and_fetch_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_nand_and_fetch_uint16_t(unsigned short *, +[kernel:file] unsigned short , ...); +[kernel:file] +[kernel:file] unsigned int __sync_nand_and_fetch_uint32_t(unsigned int *, unsigned int +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_nand_and_fetch_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_nand_and_fetch_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_or_and_fetch_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_or_and_fetch_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_or_and_fetch_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_or_and_fetch_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_or_and_fetch_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_or_and_fetch_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_or_and_fetch_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_or_and_fetch_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] short __sync_sub_and_fetch_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_sub_and_fetch_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_sub_and_fetch_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_sub_and_fetch_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_sub_and_fetch_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_sub_and_fetch_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_sub_and_fetch_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_sub_and_fetch_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] void __sync_synchronize(...); +[kernel:file] +[kernel:file] short __sync_val_compare_and_swap_int16_t(short *, short, short , ...); +[kernel:file] +[kernel:file] int __sync_val_compare_and_swap_int32_t(int *, int, int , ...); +[kernel:file] +[kernel:file] long long __sync_val_compare_and_swap_int64_t(long long *, long long, +[kernel:file] long long , ...); +[kernel:file] +[kernel:file] signed char __sync_val_compare_and_swap_int8_t(signed char *, signed char, +[kernel:file] signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_val_compare_and_swap_uint16_t(unsigned short *, +[kernel:file] unsigned short, +[kernel:file] unsigned short , ...); +[kernel:file] +[kernel:file] unsigned int __sync_val_compare_and_swap_uint32_t(unsigned int *, +[kernel:file] unsigned int, unsigned int +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_val_compare_and_swap_uint64_t(unsigned long long *, +[kernel:file] unsigned long long, +[kernel:file] unsigned long long +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned char __sync_val_compare_and_swap_uint8_t(unsigned char *, +[kernel:file] unsigned char, +[kernel:file] unsigned char , ...); +[kernel:file] +[kernel:file] short __sync_xor_and_fetch_int16_t(short *, short , ...); +[kernel:file] +[kernel:file] int __sync_xor_and_fetch_int32_t(int *, int , ...); +[kernel:file] +[kernel:file] long long __sync_xor_and_fetch_int64_t(long long *, long long , ...); +[kernel:file] +[kernel:file] signed char __sync_xor_and_fetch_int8_t(signed char *, signed char , ...); +[kernel:file] +[kernel:file] unsigned short __sync_xor_and_fetch_uint16_t(unsigned short *, unsigned short +[kernel:file] , ...); +[kernel:file] +[kernel:file] unsigned int __sync_xor_and_fetch_uint32_t(unsigned int *, unsigned int , ...); +[kernel:file] +[kernel:file] unsigned long long __sync_xor_and_fetch_uint64_t(unsigned long long *, +[kernel:file] unsigned long long , ...); +[kernel:file] +[kernel:file] unsigned char __sync_xor_and_fetch_uint8_t(unsigned char *, unsigned char +[kernel:file] , ...); +[kernel:file] +[kernel:file] int max(int i, int j) +[kernel:file] { +[kernel:file] int tmp; +[kernel:file] +[kernel:file] if (i >= j) tmp = i; else tmp = j; +[kernel:file] return tmp; +[kernel:file] } +[kernel:file:annotation] Marking properties +[kernel:file:transformation] applying loop unrolling to file +[kernel:file:transformation] applying lightweight spec to file +[kernel:file:transformation] applying remove_exn to file +[kernel:file:annotation] Marking properties +/* Generated by Frama-C */ +/*@ ensures /* ip:6 */\result ≥ \old(i); + ensures /* ip:7 */\result ≥ \old(j); + ensures /* ip:8 */\result ≡ \old(i) ∨ \result ≡ \old(j); + */ +int max(int i, int j) +{ + /* Locals: tmp */ + int tmp; + /* sid:2 */ + if (i >= j) { + /* sid:3 */ + tmp = i; + } + else { + /* sid:4 */ + tmp = j; + } + /* sid:5 */ + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/clone_test.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/clone_test.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/clone_test.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/clone_test.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,32 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/clone_test.i (no preprocessing) +/* Generated by Frama-C */ +/*@ requires -3 ≤ c ≤ 4; + ensures \result ≥ \old(c); */ +int f(int c) +{ + int __retres; + if (c > 0) { + __retres = c; + goto return_label; + } + /*@ assert c ≤ 0; */ ; + __retres = 0; + return_label: return __retres; +} + +/*@ requires -3 ≤ c ≤ 4; + ensures \result ≥ \old(c); */ +int __fc_clone_1_f(int c) +{ + int __retres; + if (c > 0) { + __retres = c; + goto return_label; + } + /*@ assert c ≤ 0; */ ; + __retres = 0; + return_label: return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/copy_logic.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/copy_logic.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/copy_logic.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/copy_logic.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,45 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/copy_logic.i (no preprocessing) +tests/syntax/copy_logic.i:5:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +tests/syntax/copy_logic.i:7:[kernel] warning: parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead. +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/syntax/copy_logic.i:16:[value] Assertion got status unknown. +tests/syntax/copy_logic.i:17:[kernel] warning: signed overflow. assert y+x ≤ 2147483647; +tests/syntax/copy_logic.i:18:[value] cannot evaluate ACSL term, unsupported ACSL construct: logic functions or predicates +tests/syntax/copy_logic.i:18:[value] Assertion got status unknown. +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + y ∈ [-2147483606..2147483647] + __retres ∈ {0} +/* Generated by Frama-C */ +/*@ predicate p(int x) ; + */ +/*@ predicate q(int x) = x ≡ 42; + */ +/*@ logic int f(int y) ; + */ +/*@ logic ℤ g(int x) = x+42; + */ +/*@ frees x; */ +extern void f(int *x); + +int main(int x) +{ + int __retres; + int y; + y = 42; + /*@ assert q(y) ∧ p(x); */ ; + /*@ assert Value: signed_overflow: y+x ≤ 2147483647; */ + y += x; + /*@ assert g(x) ≡ f(y); */ ; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/copy_visitor_bts_1073.1.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/copy_visitor_bts_1073.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/copy_visitor_bts_1073.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/copy_visitor_bts_1073.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,39 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/copy_visitor_bts_1073.c (with preprocessing) +[test] start compute +[test] exported in new project : filtered +/* Generated by Frama-C */ +int f(int x); + +int f(int x) +{ + return x; +} + +int g(int y) +{ + int tmp; + tmp = f(2 * y); + return tmp; +} + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int printf(char const * , ...); + +int main(int argc, char **argv) +{ + int __retres; + int i; + printf("Hello !\n"); + i = 0; + while (i < argc) { + printf("arg %d : %s\n",i,*(argv + i)); + i ++; + } + printf("Found %d arguments\n",i - 1); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/copy_visitor_bts_1073.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/copy_visitor_bts_1073.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/copy_visitor_bts_1073.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/copy_visitor_bts_1073.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,64 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/copy_visitor_bts_1073.c (with preprocessing) +/* Generated by Frama-C */ +int f(int x); + +int f(int x) +{ + return x; +} + +int f1(int x) +{ + return x; +} + +int g(int y) +{ + int tmp; + tmp = f1(2 * y); + return tmp; +} + +int g1(int y) +{ + int tmp; + tmp = f1(2 * y); + return tmp; +} + +/*@ assigns \result; + assigns \result \from \nothing; */ +extern int printf(char const * , ...); + +int main(int argc, char **argv) +{ + int __retres; + int i; + printf("Hello !\n"); + i = 0; + while (i < argc) { + printf("arg %d : %s\n",i,*(argv + i)); + i ++; + } + printf("Found %d arguments\n",i - 1); + __retres = 0; + return __retres; +} + +int main1(int argc, char **argv) +{ + int __retres; + int i; + printf("Hello !\n"); + i = 0; + while (i < argc) { + printf("arg %d : %s\n",i,*(argv + i)); + i ++; + } + printf("Found %d arguments\n",i - 1); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/copy_visitor.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/copy_visitor.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/copy_visitor.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/copy_visitor.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,60 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/copy_visitor.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + s.a ∈ {1} + .b ∈ {2} +tests/syntax/copy_visitor.i:22:[value] Assertion got status valid. +[value] computing for function f <- main. + Called from tests/syntax/copy_visitor.i:23. +tests/syntax/copy_visitor.i:11:[value] Function f: precondition got status valid. +[value] Recording results for f +[value] Done for function f +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function f: + s{.a; .b} ∈ {2} + __retres ∈ {2} +[value] Values at end of function main: + s{.a; .b} ∈ {2} + __retres ∈ {0} +/* Generated by Frama-C */ +struct S { + int a ; + int b ; +}; +struct S s = {.a = 1, .b = 2}; +/*@ requires \valid(s_0); + assigns s_0->a; */ +int f(struct S *s_0) +{ + int __retres; + s_0->a = 2; + __retres = s_0->b; + return __retres; +} + +/*@ assigns s.a; */ +int main(void) +{ + int __retres; + s.a = 2; + /*@ assert s.a ≡ 2; */ ; + f(& s); + __retres = 0; + return __retres; +} + +int g(int x); + +int g(int x) +{ + int __retres; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/dangling_else.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/dangling_else.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/dangling_else.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/dangling_else.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,42 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/dangling_else.i (no preprocessing) +/* Generated by Frama-C */ +/*@ requires x ≥ 0; */ +extern int g(int x); + +void main(void) +{ + int c; + int x; + if (c) { + if (c) x = 1; + } + else + if (c) { + if (c) x = 1; + } + else x = 2; + return; +} + +int f(int a, int b, int c, int d) +{ + int ret; + ret = 0; + if (a) { + if (b) ret = 1; + else + if (c) ret = 2; + } + else + if (d) ret = 4; + if (a) { + /*@ assert ret ≥ 0; */ ; + ret = 5; + } + else ret = 6; + if (a) g(a); else g(a); + return ret; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/dangling_reference_bts1475.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/dangling_reference_bts1475.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/dangling_reference_bts1475.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/dangling_reference_bts1475.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/dangling_reference_bts1475.i (no preprocessing) +/* Generated by Frama-C */ +/*@ requires \valid(f5); */ +static char F4(int *f5); + +int foo(void) +{ + int __retres; + int x; + F4(& x); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/decay.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/decay.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/decay.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/decay.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/decay.i (no preprocessing) +/* Generated by Frama-C */ +struct P { + int val[2][2] ; +}; +char t[8]; + +struct __anonstruct_A_1 { + int A[sizeof(t)] ; + int i ; +}; +char t[8]; + +struct __anonstruct_S_2 { + int A[sizeof(&(t[0]))] ; + int i ; +}; +char t[8]; + +struct __anonstruct_V_3 { + int A[sizeof(&(t[0]))] ; + int i ; +}; +char t[8]; + +void multi_dim_array_decay(void) +{ + struct P *pp; + struct P p; + pp = & p; + if (pp->val[0]) ; + if (p.val[0]) ; + return; +} + +char t[8]; +struct __anonstruct_A_1 A = {.A = {1, 2, 3, 4, 5, 6, 7, 8}, .i = 9}; +struct __anonstruct_S_2 S = {.A = {1, 2, 3, 4}, .i = 5}; +struct __anonstruct_V_3 V = {.A = {1, 2, 3, 4}, .i = 5}; + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/designated_init_pretty_print_bts1457.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/designated_init_pretty_print_bts1457.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/designated_init_pretty_print_bts1457.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/designated_init_pretty_print_bts1457.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,12 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/designated_init_pretty_print_bts1457.i (no preprocessing) +/* Generated by Frama-C */ +int t[10] = {[4] = 5, 5, 5}; +int u[10] = {[4] = 3}; +int v[10] = {0, [5] = 42, 36, 7, [9] = 9}; +void main(void) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/dowhilezero.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/dowhilezero.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/dowhilezero.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/dowhilezero.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,94 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/dowhilezero.c (with preprocessing) +/* Generated by Frama-C */ +void f1(void) +{ + /*@ loop invariant \true; */ + while (1) { + { + int x; + int y; + x = 1; + y = 2; + } + break; + } + return; +} + +void f2(void) +{ + while (1) { + { + int x; + int y; + x = 1; + y = 2; + break; + } + break; + } + return; +} + +void f3(void) +{ + while (1) { + { + int x; + int y; + x = 1; + y = 2; + goto __Cont; + } + __Cont: break; + } + return; +} + +void f4(int c) +{ + while (1) { + { + int x; + int y; + x = 1; + y = 2; + } + if (! c) break; + } + return; +} + +void f5(void) +{ + int x; + int y; + x = 1; + y = 2; + return; +} + +void f6(void) +{ + int x; + int y; + x = 1; + y = 2; + while (1) { + continue; + break; + } + return; +} + +void f7(void) +{ + int x; + int y; + x = 1; + y = 2; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/duplicated_global_bts1129.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/duplicated_global_bts1129.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/duplicated_global_bts1129.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/duplicated_global_bts1129.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,20 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/duplicated_global_bts1129.i (no preprocessing) +/* Generated by Frama-C */ +void f(int *x); + +int X; +/*@ ensures X ≡ 1; */ +void f(int *x) +{ + int *tmp; + { + /*sequence*/ + tmp = x; + x ++; + ; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/enum1.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/enum1.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/enum1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/enum1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,80 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/enum1.c (with preprocessing) +[kernel] Parsing tests/syntax/enum2.c (with preprocessing) +[kernel] warning: merging definitions of enum f using int type + (different names for enumeration items); items {F21=0, F22=1} and {F11=0, + F12=1} +/* Generated by Frama-C */ +enum e { + E1 = 0, + E2 = 1 +}; +enum __anonenum_1 { + K11 = 0, + K12 = 1 +}; +enum __anonenum_2 { + I1 = 0, + I2 = 1 +}; +enum __anonenum_5 { + K21 = 0, + K22 = 1 +}; +int e1(void) +{ + int __retres; + __retres = E1; + return __retres; +} + +int f1(void) +{ + int __retres; + __retres = 0; + return __retres; +} + +int k1(void) +{ + int __retres; + __retres = K11; + return __retres; +} + +int i1(void) +{ + int __retres; + __retres = I1; + return __retres; +} + +int e2(void) +{ + int __retres; + __retres = E2; + return __retres; +} + +int f2(void) +{ + int __retres; + __retres = 1; + return __retres; +} + +int k2(void) +{ + int __retres; + __retres = K22; + return __retres; +} + +int i2(void) +{ + int __retres; + __retres = I2; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/enum_call.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/enum_call.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/enum_call.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/enum_call.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/enum_call.i (no preprocessing) +/* Generated by Frama-C */ +enum E { + C0 = 0, + C1 = 1, + C2 = 2 +}; +extern void f(enum E const); + +extern void f1(enum E); + +void g(void) +{ + f((enum E)C0); + f1((enum E)C2); + return; +} + +void h(void) +{ + f(C1); + f1(C0); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/enum_repr.1.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/enum_repr.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/enum_repr.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/enum_repr.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,170 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/enum_repr.i (no preprocessing) +tests/syntax/enum_repr.i:37:[kernel] Inserted implicit cast from int to enum __anonenum_foo_1 +tests/syntax/enum_repr.i:38:[kernel] Inserted implicit cast from int to enum __anonenum_bar_2 +tests/syntax/enum_repr.i:39:[kernel] Inserted implicit cast from int to enum __anonenum_bu1_3 +tests/syntax/enum_repr.i:41:[kernel] Inserted implicit cast from long long to enum __anonenum_bu3_5 +tests/syntax/enum_repr.i:43:[kernel] Inserted implicit cast from unsigned int to enum __anonenum_bs2_7 +tests/syntax/enum_repr.i:45:[kernel] Inserted implicit cast from signed char to enum __anonenum_bc1_9 +tests/syntax/enum_repr.i:48:[kernel] Inserted implicit cast from unsigned char to enum __anonenum_bd2_12 +tests/syntax/enum_repr.i:49:[kernel] Inserted implicit cast from foo to int +tests/syntax/enum_repr.i:49:[kernel] Inserted implicit cast from bar to int +tests/syntax/enum_repr.i:63:[kernel] Inserted implicit cast from int to enum __anonenum_foo_1 +tests/syntax/enum_repr.i:66:[kernel] Inserted implicit cast from enum __anonenum_foo_1 to unsigned int +tests/syntax/enum_repr.i:67:[kernel] Inserted implicit cast from unsigned int to enum __anonenum_foo_1 +tests/syntax/enum_repr.i:68:[kernel] Inserted implicit cast from unsigned int to enum __anonenum_foo_1 +[kernel] Enum __anonenum_foo_1 is represented by unsigned char +[kernel] Enum __anonenum_bar_2 is represented by unsigned char +[kernel] Enum __anonenum_bu1_3 is represented by unsigned int +[kernel] Enum __anonenum_bu2_4 is represented by unsigned int +[kernel] Enum __anonenum_bu3_5 is represented by unsigned long long +[kernel] Enum __anonenum_bs1_6 is represented by int +[kernel] Enum __anonenum_bs2_7 is represented by long long +[kernel] Enum __anonenum_bs3_8 is represented by long long +[kernel] Enum __anonenum_bc1_9 is represented by unsigned char +[kernel] Enum __anonenum_bc2_10 is represented by unsigned char +[kernel] Enum __anonenum_bd1_11 is represented by signed char +[kernel] Enum __anonenum_bd2_12 is represented by signed char +/* Generated by Frama-C */ +enum __anonenum_foo_1 { + A = 3 +}; +typedef enum __anonenum_foo_1 foo; +enum __anonenum_bar_2 { + B = 6 +} __attribute__((__packed__)); +typedef enum __anonenum_bar_2 bar; +enum __anonenum_bu1_3 { + Bu1 = 0x7FFFFFFF +}; +typedef enum __anonenum_bu1_3 bu1; +enum __anonenum_bu2_4 { + Bu2 = 0xFFFFFFFF +}; +typedef enum __anonenum_bu2_4 bu2; +enum __anonenum_bu3_5 { + Bu3 = 0x1FFFFFFFF +}; +typedef enum __anonenum_bu3_5 bu3; +enum __anonenum_bs1_6 { + Bs1 = 0x7FFFFFFF, + Ms1 = -1 +}; +typedef enum __anonenum_bs1_6 bs1; +enum __anonenum_bs2_7 { + Bs2 = 0xFFFFFFFF, + Ms2 = -1 +}; +typedef enum __anonenum_bs2_7 bs2; +enum __anonenum_bs3_8 { + Bs3 = 0x1FFFFFFFF, + Ms3 = -1 +}; +typedef enum __anonenum_bs3_8 bs3; +enum __anonenum_bc1_9 { + Bc1 = (signed char)'c' +}; +typedef enum __anonenum_bc1_9 bc1; +enum __anonenum_bc2_10 { + Bc2 = (unsigned char)'c' +}; +typedef enum __anonenum_bc2_10 bc2; +enum __anonenum_bd1_11 { + Bd1 = (signed char)'c', + Md1 = -1 +}; +typedef enum __anonenum_bd1_11 bd1; +enum __anonenum_bd2_12 { + Bd2 = (unsigned char)'c', + Md2 = -1 +}; +typedef enum __anonenum_bd2_12 bd2; +typedef unsigned int bla; +int main(void) +{ + int __retres; + foo x; + bar y; + bu1 u1; + bu2 u2; + bu3 u3; + bs1 s1; + bs2 s2; + bs3 s3; + bc1 c1; + bc2 c2; + bd1 d1; + bd2 d2; + x = (enum __anonenum_foo_1)A; + y = (enum __anonenum_bar_2)B; + u1 = Bu1; + u2 = Bu2; + u3 = Bu3; + s1 = Bs1; + s2 = (enum __anonenum_bs2_7)Bs2; + s3 = Bs3; + c1 = Bc1; + c2 = Bc2; + d1 = Bd1; + d2 = Bd2; + if ((int)x == A) + if ((int)y == B) { + __retres = 0; + goto return_label; + } + __retres = 1; + return_label: return __retres; +} + +extern int f1(bla x); + +extern int f2(bla x); + +extern int f3(bla x); + +extern int h1(foo x); + +extern int h2(foo x); + +extern int h3(foo x); + +int g(void) +{ + foo x; + int res; + int tmp_0; + int tmp_1; + int tmp_2; + int tmp_3; + int tmp_4; + x = (enum __anonenum_foo_1)A; + res = f1((unsigned int)x); + { + /*sequence*/ + tmp_0 = f2((unsigned int)x); + res += tmp_0; + } + { + /*sequence*/ + tmp_1 = f3((unsigned int)x); + res += tmp_1; + } + { + /*sequence*/ + tmp_2 = h1((enum __anonenum_foo_1)((unsigned int)x)); + res += tmp_2; + } + { + /*sequence*/ + tmp_3 = h2((enum __anonenum_foo_1)((unsigned int)x)); + res += tmp_3; + } + { + /*sequence*/ + tmp_4 = h3(x); + res += tmp_4; + } + return res; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/enum_repr.2.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/enum_repr.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/enum_repr.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/enum_repr.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,169 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/enum_repr.i (no preprocessing) +tests/syntax/enum_repr.i:37:[kernel] Inserted implicit cast from int to enum __anonenum_foo_1 +tests/syntax/enum_repr.i:38:[kernel] Inserted implicit cast from int to enum __anonenum_bar_2 +tests/syntax/enum_repr.i:39:[kernel] Inserted implicit cast from int to enum __anonenum_bu1_3 +tests/syntax/enum_repr.i:41:[kernel] Inserted implicit cast from long long to enum __anonenum_bu3_5 +tests/syntax/enum_repr.i:43:[kernel] Inserted implicit cast from unsigned int to enum __anonenum_bs2_7 +tests/syntax/enum_repr.i:45:[kernel] Inserted implicit cast from signed char to enum __anonenum_bc1_9 +tests/syntax/enum_repr.i:46:[kernel] Inserted implicit cast from unsigned char to enum __anonenum_bc2_10 +tests/syntax/enum_repr.i:47:[kernel] Inserted implicit cast from signed char to enum __anonenum_bd1_11 +tests/syntax/enum_repr.i:48:[kernel] Inserted implicit cast from unsigned char to enum __anonenum_bd2_12 +tests/syntax/enum_repr.i:49:[kernel] Inserted implicit cast from int to unsigned int +tests/syntax/enum_repr.i:49:[kernel] Inserted implicit cast from bar to int +tests/syntax/enum_repr.i:63:[kernel] Inserted implicit cast from int to enum __anonenum_foo_1 +[kernel] Enum __anonenum_foo_1 is represented by unsigned int +[kernel] Enum __anonenum_bar_2 is represented by unsigned char +[kernel] Enum __anonenum_bu1_3 is represented by unsigned int +[kernel] Enum __anonenum_bu2_4 is represented by unsigned int +[kernel] Enum __anonenum_bu3_5 is represented by unsigned long long +[kernel] Enum __anonenum_bs1_6 is represented by int +[kernel] Enum __anonenum_bs2_7 is represented by long long +[kernel] Enum __anonenum_bs3_8 is represented by long long +[kernel] Enum __anonenum_bc1_9 is represented by unsigned int +[kernel] Enum __anonenum_bc2_10 is represented by unsigned int +[kernel] Enum __anonenum_bd1_11 is represented by int +[kernel] Enum __anonenum_bd2_12 is represented by int +/* Generated by Frama-C */ +enum __anonenum_foo_1 { + A = 3 +}; +typedef enum __anonenum_foo_1 foo; +enum __anonenum_bar_2 { + B = 6 +} __attribute__((__packed__)); +typedef enum __anonenum_bar_2 bar; +enum __anonenum_bu1_3 { + Bu1 = 0x7FFFFFFF +}; +typedef enum __anonenum_bu1_3 bu1; +enum __anonenum_bu2_4 { + Bu2 = 0xFFFFFFFF +}; +typedef enum __anonenum_bu2_4 bu2; +enum __anonenum_bu3_5 { + Bu3 = 0x1FFFFFFFF +}; +typedef enum __anonenum_bu3_5 bu3; +enum __anonenum_bs1_6 { + Bs1 = 0x7FFFFFFF, + Ms1 = -1 +}; +typedef enum __anonenum_bs1_6 bs1; +enum __anonenum_bs2_7 { + Bs2 = 0xFFFFFFFF, + Ms2 = -1 +}; +typedef enum __anonenum_bs2_7 bs2; +enum __anonenum_bs3_8 { + Bs3 = 0x1FFFFFFFF, + Ms3 = -1 +}; +typedef enum __anonenum_bs3_8 bs3; +enum __anonenum_bc1_9 { + Bc1 = (signed char)'c' +}; +typedef enum __anonenum_bc1_9 bc1; +enum __anonenum_bc2_10 { + Bc2 = (unsigned char)'c' +}; +typedef enum __anonenum_bc2_10 bc2; +enum __anonenum_bd1_11 { + Bd1 = (signed char)'c', + Md1 = -1 +}; +typedef enum __anonenum_bd1_11 bd1; +enum __anonenum_bd2_12 { + Bd2 = (unsigned char)'c', + Md2 = -1 +}; +typedef enum __anonenum_bd2_12 bd2; +typedef unsigned int bla; +int main(void) +{ + int __retres; + foo x; + bar y; + bu1 u1; + bu2 u2; + bu3 u3; + bs1 s1; + bs2 s2; + bs3 s3; + bc1 c1; + bc2 c2; + bd1 d1; + bd2 d2; + x = A; + y = (enum __anonenum_bar_2)B; + u1 = Bu1; + u2 = Bu2; + u3 = Bu3; + s1 = Bs1; + s2 = (enum __anonenum_bs2_7)Bs2; + s3 = Bs3; + c1 = (enum __anonenum_bc1_9)Bc1; + c2 = (enum __anonenum_bc2_10)Bc2; + d1 = (enum __anonenum_bd1_11)Bd1; + d2 = (enum __anonenum_bd2_12)Bd2; + if (x == (unsigned int)A) + if ((int)y == B) { + __retres = 0; + goto return_label; + } + __retres = 1; + return_label: return __retres; +} + +extern int f1(bla x); + +extern int f2(bla x); + +extern int f3(bla x); + +extern int h1(foo x); + +extern int h2(foo x); + +extern int h3(foo x); + +int g(void) +{ + foo x; + int res; + int tmp_0; + int tmp_1; + int tmp_2; + int tmp_3; + int tmp_4; + x = A; + res = f1((unsigned int)x); + { + /*sequence*/ + tmp_0 = f2((unsigned int)x); + res += tmp_0; + } + { + /*sequence*/ + tmp_1 = f3(x); + res += tmp_1; + } + { + /*sequence*/ + tmp_2 = h1((unsigned int)x); + res += tmp_2; + } + { + /*sequence*/ + tmp_3 = h2((unsigned int)x); + res += tmp_3; + } + { + /*sequence*/ + tmp_4 = h3(x); + res += tmp_4; + } + return res; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/enum_repr.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/enum_repr.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/enum_repr.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/enum_repr.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,168 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/enum_repr.i (no preprocessing) +tests/syntax/enum_repr.i:40:[kernel] Inserted implicit cast from unsigned int to enum __anonenum_bu2_4 +tests/syntax/enum_repr.i:41:[kernel] Inserted implicit cast from long long to enum __anonenum_bu3_5 +tests/syntax/enum_repr.i:43:[kernel] Inserted implicit cast from unsigned int to enum __anonenum_bs2_7 +tests/syntax/enum_repr.i:44:[kernel] Inserted implicit cast from long long to enum __anonenum_bs3_8 +tests/syntax/enum_repr.i:45:[kernel] Inserted implicit cast from signed char to enum __anonenum_bc1_9 +tests/syntax/enum_repr.i:46:[kernel] Inserted implicit cast from unsigned char to enum __anonenum_bc2_10 +tests/syntax/enum_repr.i:47:[kernel] Inserted implicit cast from signed char to enum __anonenum_bd1_11 +tests/syntax/enum_repr.i:48:[kernel] Inserted implicit cast from unsigned char to enum __anonenum_bd2_12 +tests/syntax/enum_repr.i:66:[kernel] Inserted implicit cast from enum __anonenum_foo_1 to unsigned int +tests/syntax/enum_repr.i:67:[kernel] Inserted implicit cast from unsigned int to enum __anonenum_foo_1 +tests/syntax/enum_repr.i:68:[kernel] Inserted implicit cast from unsigned int to enum __anonenum_foo_1 +[kernel] Enum __anonenum_foo_1 is represented by int +[kernel] Enum __anonenum_bar_2 is represented by int +[kernel] Enum __anonenum_bu1_3 is represented by int +[kernel] Enum __anonenum_bu2_4 is represented by int +[kernel] Enum __anonenum_bu3_5 is represented by int +[kernel] Enum __anonenum_bs1_6 is represented by int +[kernel] Enum __anonenum_bs2_7 is represented by int +[kernel] Enum __anonenum_bs3_8 is represented by int +[kernel] Enum __anonenum_bc1_9 is represented by int +[kernel] Enum __anonenum_bc2_10 is represented by int +[kernel] Enum __anonenum_bd1_11 is represented by int +[kernel] Enum __anonenum_bd2_12 is represented by int +/* Generated by Frama-C */ +enum __anonenum_foo_1 { + A = 3 +}; +typedef enum __anonenum_foo_1 foo; +enum __anonenum_bar_2 { + B = 6 +} __attribute__((__packed__)); +typedef enum __anonenum_bar_2 bar; +enum __anonenum_bu1_3 { + Bu1 = 0x7FFFFFFF +}; +typedef enum __anonenum_bu1_3 bu1; +enum __anonenum_bu2_4 { + Bu2 = 0xFFFFFFFF +}; +typedef enum __anonenum_bu2_4 bu2; +enum __anonenum_bu3_5 { + Bu3 = 0x1FFFFFFFF +}; +typedef enum __anonenum_bu3_5 bu3; +enum __anonenum_bs1_6 { + Bs1 = 0x7FFFFFFF, + Ms1 = -1 +}; +typedef enum __anonenum_bs1_6 bs1; +enum __anonenum_bs2_7 { + Bs2 = 0xFFFFFFFF, + Ms2 = -1 +}; +typedef enum __anonenum_bs2_7 bs2; +enum __anonenum_bs3_8 { + Bs3 = 0x1FFFFFFFF, + Ms3 = -1 +}; +typedef enum __anonenum_bs3_8 bs3; +enum __anonenum_bc1_9 { + Bc1 = (signed char)'c' +}; +typedef enum __anonenum_bc1_9 bc1; +enum __anonenum_bc2_10 { + Bc2 = (unsigned char)'c' +}; +typedef enum __anonenum_bc2_10 bc2; +enum __anonenum_bd1_11 { + Bd1 = (signed char)'c', + Md1 = -1 +}; +typedef enum __anonenum_bd1_11 bd1; +enum __anonenum_bd2_12 { + Bd2 = (unsigned char)'c', + Md2 = -1 +}; +typedef enum __anonenum_bd2_12 bd2; +typedef unsigned int bla; +int main(void) +{ + int __retres; + foo x; + bar y; + bu1 u1; + bu2 u2; + bu3 u3; + bs1 s1; + bs2 s2; + bs3 s3; + bc1 c1; + bc2 c2; + bd1 d1; + bd2 d2; + x = A; + y = B; + u1 = Bu1; + u2 = Bu2; + u3 = (enum __anonenum_bu3_5)Bu3; + s1 = Bs1; + s2 = Bs2; + s3 = (enum __anonenum_bs3_8)Bs3; + c1 = (enum __anonenum_bc1_9)Bc1; + c2 = (enum __anonenum_bc2_10)Bc2; + d1 = (enum __anonenum_bd1_11)Bd1; + d2 = (enum __anonenum_bd2_12)Bd2; + if (x == A) + if (y == B) { + __retres = 0; + goto return_label; + } + __retres = 1; + return_label: return __retres; +} + +extern int f1(bla x); + +extern int f2(bla x); + +extern int f3(bla x); + +extern int h1(foo x); + +extern int h2(foo x); + +extern int h3(foo x); + +int g(void) +{ + foo x; + int res; + int tmp_0; + int tmp_1; + int tmp_2; + int tmp_3; + int tmp_4; + x = A; + res = f1((unsigned int)x); + { + /*sequence*/ + tmp_0 = f2((unsigned int)x); + res += tmp_0; + } + { + /*sequence*/ + tmp_1 = f3((unsigned int)x); + res += tmp_1; + } + { + /*sequence*/ + tmp_2 = h1((enum __anonenum_foo_1)((unsigned int)x)); + res += tmp_2; + } + { + /*sequence*/ + tmp_3 = h2((enum __anonenum_foo_1)((unsigned int)x)); + res += tmp_3; + } + { + /*sequence*/ + tmp_4 = h3(x); + res += tmp_4; + } + return res; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/enum_size_array.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/enum_size_array.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/enum_size_array.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/enum_size_array.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/enum_size_array.i (no preprocessing) +/* Generated by Frama-C */ +enum __anonenum_T_E_1 { + ONE = 0, + TWO = 1, + EN_NB = 2 +}; +int f_return_last(int * /*[2]*/ tab) +{ + int __retres; + __retres = *(tab + (EN_NB - 1)); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/erased_label_bts1502.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/erased_label_bts1502.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/erased_label_bts1502.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/erased_label_bts1502.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,11 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/erased_label_bts1502.i (no preprocessing) +/* Generated by Frama-C */ +void f(int a) +{ + goto _LOR_0; + if (a) _LOR_0: ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/float.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/float.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/float.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/float.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,11 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/float.i (no preprocessing) +/* Generated by Frama-C */ +/*@ requires f ≡ 0.1f; */ +void main(float f) +{ + /*@ assert 0xfffffffffffffffff ≡ 0xfffffffffffffffff; */ ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/forloophook.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/forloophook.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/forloophook.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/forloophook.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,7 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/forloophook.i (no preprocessing) +Found a for loop +Local declaration +Has a test +Has an increment +No body diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/formals_decl_leak.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/formals_decl_leak.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/formals_decl_leak.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/formals_decl_leak.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/formals_decl_leak.i (no preprocessing) +[kernel] Parsing tests/syntax/formals_decl_leak_1.i (no preprocessing) +/* Generated by Frama-C */ +extern void f(int x); + +void g(void) +{ + f(3); + return; +} + +void h(void) +{ + f(4); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/func_spec_merge.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/func_spec_merge.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/func_spec_merge.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/func_spec_merge.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/func_spec_merge.i (no preprocessing) +/* Generated by Frama-C */ +int f(void) +{ + int __retres; + __retres = 3; + return __retres; +} + +int g(void) +{ + int __retres; + __retres = 4; + return __retres; +} + +/*@ requires p ≡ &f ∨ p ≡ &g; */ +int main(int (*p)(void)) +{ + int tmp; + tmp = (*p)(); + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/gcc_builtins.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/gcc_builtins.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/gcc_builtins.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/gcc_builtins.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,314 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/gcc_builtins.c (with preprocessing) +/* Generated by Frama-C */ +typedef short int16_t; +typedef unsigned short uint16_t; +typedef int int32_t; +typedef unsigned int uint32_t; +typedef long long int64_t; +typedef unsigned long long uint64_t; +/* compiler builtin: + short __sync_add_and_fetch_int16_t(short *ptr, short value , ...); */ +/* compiler builtin: + int __sync_add_and_fetch_int32_t(int *ptr, int value , ...); */ +/* compiler builtin: + long long __sync_add_and_fetch_int64_t(long long *ptr, long long value + , ...); */ +/* compiler builtin: + int __sync_bool_compare_and_swap_uint16_t(unsigned short *ptr, + unsigned short oldval, + unsigned short newval , ...); */ +/* compiler builtin: + int __sync_bool_compare_and_swap_uint32_t(unsigned int *ptr, + unsigned int oldval, + unsigned int newval , ...); */ +/* compiler builtin: + int __sync_bool_compare_and_swap_uint64_t(unsigned long long *ptr, + unsigned long long oldval, + unsigned long long newval , ...); */ +/* compiler builtin: + short __sync_fetch_and_add_int16_t(short *ptr, short value , ...); */ +/* compiler builtin: + int __sync_fetch_and_add_int32_t(int *ptr, int value , ...); */ +/* compiler builtin: + long long __sync_fetch_and_add_int64_t(long long *ptr, long long value + , ...); */ +/* compiler builtin: + short __sync_fetch_and_sub_int16_t(short *ptr, short value , ...); */ +/* compiler builtin: + int __sync_fetch_and_sub_int32_t(int *ptr, int value , ...); */ +/* compiler builtin: + long long __sync_fetch_and_sub_int64_t(long long *ptr, long long value + , ...); */ +/* compiler builtin: + short __sync_sub_and_fetch_int16_t(short *ptr, short value , ...); */ +/* compiler builtin: + int __sync_sub_and_fetch_int32_t(int *ptr, int value , ...); */ +/* compiler builtin: + long long __sync_sub_and_fetch_int64_t(long long *ptr, long long value + , ...); */ +short __sync_fetch_and_add_int16_t(short *ptr, short value , ...) +{ + int16_t tmp; + tmp = *ptr; + *ptr = (short)((int)*ptr + (int)value); + return tmp; +} + +short __sync_fetch_and_sub_int16_t(short *ptr, short value , ...) +{ + int16_t tmp; + tmp = *ptr; + *ptr = (short)((int)*ptr - (int)value); + return tmp; +} + +int __sync_fetch_and_add_int32_t(int *ptr, int value , ...) +{ + int32_t tmp; + tmp = *ptr; + *ptr += value; + return tmp; +} + +int __sync_fetch_and_sub_int32_t(int *ptr, int value , ...) +{ + int32_t tmp; + tmp = *ptr; + *ptr -= value; + return tmp; +} + +long long __sync_fetch_and_add_int64_t(long long *ptr, long long value , ...) +{ + int64_t tmp; + tmp = *ptr; + *ptr += value; + return tmp; +} + +long long __sync_fetch_and_sub_int64_t(long long *ptr, long long value , ...) +{ + int64_t tmp; + tmp = *ptr; + *ptr -= value; + return tmp; +} + +short __sync_add_and_fetch_int16_t(short *ptr, short value , ...) +{ + short __retres; + *ptr = (short)((int)*ptr + (int)value); + __retres = *ptr; + return __retres; +} + +short __sync_sub_and_fetch_int16_t(short *ptr, short value , ...) +{ + short __retres; + *ptr = (short)((int)*ptr - (int)value); + __retres = *ptr; + return __retres; +} + +int __sync_add_and_fetch_int32_t(int *ptr, int value , ...) +{ + int __retres; + *ptr += value; + __retres = *ptr; + return __retres; +} + +int __sync_sub_and_fetch_int32_t(int *ptr, int value , ...) +{ + int __retres; + *ptr -= value; + __retres = *ptr; + return __retres; +} + +long long __sync_add_and_fetch_int64_t(long long *ptr, long long value , ...) +{ + long long __retres; + *ptr += value; + __retres = *ptr; + return __retres; +} + +long long __sync_sub_and_fetch_int64_t(long long *ptr, long long value , ...) +{ + long long __retres; + *ptr -= value; + __retres = *ptr; + return __retres; +} + +int __sync_bool_compare_and_swap_uint16_t(unsigned short *ptr, + unsigned short oldval, + unsigned short newval , ...) +{ + int __retres; + if ((int)*ptr == (int)oldval) { + *ptr = newval; + __retres = 1; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + return_label: return __retres; +} + +int __sync_bool_compare_and_swap_uint32_t(unsigned int *ptr, + unsigned int oldval, + unsigned int newval , ...) +{ + int __retres; + if (*ptr == oldval) { + *ptr = newval; + __retres = 1; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + return_label: return __retres; +} + +int __sync_bool_compare_and_swap_uint64_t(unsigned long long *ptr, + unsigned long long oldval, + unsigned long long newval , ...) +{ + int __retres; + if (*ptr == oldval) { + *ptr = newval; + __retres = 1; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + return_label: return __retres; +} + +void main(void) +{ + int x_1; + int tmp; + { + int16_t content; + int16_t *ptr; + int16_t value; + int16_t result; + content = (short)100; + ptr = & content; + value = (short)33; + result = __sync_fetch_and_add_int16_t(ptr,value); + /*@ assert result ≡ 100 ∧ content ≡ 133; */ ; + result = __sync_fetch_and_add_int16_t(ptr,(short)(-11)); + /*@ assert result ≡ 133 ∧ content ≡ 122; */ ; + result = __sync_fetch_and_sub_int16_t(ptr,value); + /*@ assert result ≡ 122 ∧ content ≡ 89; */ ; + result = __sync_fetch_and_sub_int16_t(ptr,(short)(-11)); + /*@ assert result ≡ 89 ∧ content ≡ 100; */ ; + } + { + int32_t content_0; + int32_t *ptr_0; + int32_t value_0; + int32_t result_0; + content_0 = 100; + ptr_0 = & content_0; + value_0 = 33; + result_0 = __sync_fetch_and_add_int32_t(ptr_0,value_0); + /*@ assert result_0 ≡ 100 ∧ content_0 ≡ 133; */ ; + result_0 = __sync_fetch_and_add_int32_t(ptr_0,-11); + /*@ assert result_0 ≡ 133 ∧ content_0 ≡ 122; */ ; + result_0 = __sync_fetch_and_sub_int32_t(ptr_0,value_0); + /*@ assert result_0 ≡ 122 ∧ content_0 ≡ 89; */ ; + result_0 = __sync_fetch_and_sub_int32_t(ptr_0,-11); + /*@ assert result_0 ≡ 89 ∧ content_0 ≡ 100; */ ; + } + { + int64_t content_1; + int64_t *ptr_1; + int64_t value_1; + int64_t result_1; + content_1 = (long long)100; + ptr_1 = & content_1; + value_1 = (long long)33; + result_1 = __sync_fetch_and_add_int64_t(ptr_1,value_1); + /*@ assert result_1 ≡ 100 ∧ content_1 ≡ 133; */ ; + result_1 = __sync_fetch_and_add_int64_t(ptr_1,(long long)(-11)); + /*@ assert result_1 ≡ 133 ∧ content_1 ≡ 122; */ ; + result_1 = __sync_fetch_and_sub_int64_t(ptr_1,value_1); + /*@ assert result_1 ≡ 122 ∧ content_1 ≡ 89; */ ; + result_1 = __sync_fetch_and_sub_int64_t(ptr_1,(long long)(-11)); + /*@ assert result_1 ≡ 89 ∧ content_1 ≡ 100; */ ; + } + { + uint16_t content_2; + uint16_t *ptr_2; + uint16_t oldval; + uint16_t newval; + int result_2; + content_2 = (unsigned short)100; + ptr_2 = & content_2; + oldval = (unsigned short)100; + newval = (unsigned short)133; + result_2 = __sync_bool_compare_and_swap_uint16_t(ptr_2,oldval,newval); + /*@ assert result_2 ≡ 1 ∧ *ptr_2 ≡ newval; */ ; + } + { + uint32_t content_3; + uint32_t *ptr_3; + uint32_t oldval_0; + uint32_t newval_0; + int result_3; + content_3 = (unsigned int)100; + ptr_3 = & content_3; + oldval_0 = (unsigned int)100; + newval_0 = (unsigned int)133; + result_3 = __sync_bool_compare_and_swap_uint32_t(ptr_3,oldval_0,newval_0); + /*@ assert result_3 ≡ 1 ∧ *ptr_3 ≡ newval_0; */ ; + } + { + uint64_t content_4; + uint64_t *ptr_4; + uint64_t oldval_1; + uint64_t newval_1; + int result_4; + content_4 = (unsigned long long)100; + ptr_4 = & content_4; + oldval_1 = (unsigned long long)100; + newval_1 = (unsigned long long)133; + result_4 = __sync_bool_compare_and_swap_uint64_t(ptr_4,oldval_1,newval_1); + /*@ assert result_4 ≡ 1 ∧ *ptr_4 ≡ newval_1; */ ; + } + if ((long)(4 == 4)) { + int x; + x = 1; + } + if ((long)(3 == 4)) { + int x_0; + x_0 = 0; + } + x_1 = 2; + { + /*sequence*/ + ; + tmp = x_1; + x_1 ++; + ; + } + if ((long)tmp) { + int y; + y = x_1; + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/get_astinfo_bts1136.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/get_astinfo_bts1136.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/get_astinfo_bts1136.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/get_astinfo_bts1136.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,14 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/get_astinfo_bts1136.i (no preprocessing) +found variable vid:69 formal in f +found variable vid:72 formal in g +found variable vid:75 formal in h +found variable vid:77 formal in i +found variable vid:79 formal in j +found variable vid:81 formal in k +[do_v] vid:75 formal in h +[do_v] vid:72 formal in g +[do_v] vid:69 formal in f +[do_v] vid:81 local in k +[do_v] vid:79 local in j +[do_v] vid:77 local in i diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/ghost_lexing.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/ghost_lexing.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/ghost_lexing.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/ghost_lexing.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,18 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/ghost_lexing.i (no preprocessing) +/* Generated by Frama-C */ +int G = 0; +char const *foo = "foo"; +extern void test(char const *); + +void test2(int x) +{ + /*@ ghost int y; */ + /*@ ghost y = 0; */ + /*@ ghost if (x > 0) y = x * x; */ + G = x * x; + test(foo); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/implicit_args_bts1267.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/implicit_args_bts1267.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/implicit_args_bts1267.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/implicit_args_bts1267.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,17 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/implicit_args_bts1267.i (no preprocessing) +/* Generated by Frama-C */ +extern unsigned short t[100000]; + +extern int f(int x_0); + +void main(int i) +{ + unsigned short *p; + int s; + p = & t[i]; + s = f((int)*p); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/inconsistent_decl.1.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/inconsistent_decl.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/inconsistent_decl.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/inconsistent_decl.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,8 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/inconsistent_decl.c (with preprocessing) +[kernel] Parsing tests/syntax/inconsistent_decl_2.i (no preprocessing) +[kernel] user error: Incompatible declaration for f: + different type constructors: int vs. double + First declaration was at tests/syntax/inconsistent_decl.c:7 + Current declaration is at tests/syntax/inconsistent_decl_2.i:5 +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/inconsistent_decl.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/inconsistent_decl.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/inconsistent_decl.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/inconsistent_decl.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,9 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/inconsistent_decl.c (with preprocessing) +tests/syntax/inconsistent_decl.c:11:[kernel] warning: Calling undeclared function f. Old style K&R code? +[kernel] Parsing tests/syntax/inconsistent_decl_2.i (no preprocessing) +[kernel] user error: Incompatible declaration for f: + different type constructors: int vs. double + First declaration was at tests/syntax/inconsistent_decl.c:11 + Current declaration is at tests/syntax/inconsistent_decl_2.i:5 +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/init_bts1352.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/init_bts1352.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/init_bts1352.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/init_bts1352.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,5 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/init_bts1352.i (no preprocessing) +tests/syntax/init_bts1352.i:2:[kernel] user error: scalar value (of type int) initialized by compound initializer +[kernel] user error: stopping on file "tests/syntax/init_bts1352.i" that has errors. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/inserted_casts.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/inserted_casts.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/inserted_casts.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/inserted_casts.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/inserted_casts.c (with preprocessing) +[test] Inserting cast for expression a + 3 of type int to type unsigned int +[test] Inserting cast for expression a of type int to type unsigned int +[test] Inserting cast for expression (unsigned int)a * r of type unsigned int to type int +[test] Inserting cast for expression a of type int to type unsigned int +[test] Inserting cast for expression (unsigned int)a - r of type unsigned int to type int +/* Generated by Frama-C */ +int f(int b) +{ + int r; + if (b * b != 0) r = 0; else r = -1; + return r; +} + +int g(int a) +{ + int __retres; + unsigned int r; + r = (unsigned int)(a + 3); + a = (int)((unsigned int)a * r); + __retres = (int)((unsigned int)a - r); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/invalid_constant.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/invalid_constant.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/invalid_constant.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/invalid_constant.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,5 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/invalid_constant.i (no preprocessing) +tests/syntax/invalid_constant.i:2:[kernel] user error: syntax error +[kernel] user error: stopping on file "tests/syntax/invalid_constant.i" that has errors. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/keep.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/keep.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/keep.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/keep.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,12 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/keep.i (no preprocessing) +/* Generated by Frama-C */ +typedef int __attribute__((__FC_BUILTIN__)) foo; +enum bar { + bla = 0, + bli = 1 +} __attribute__((__FC_BUILTIN__)); +struct __attribute__((__FC_BUILTIN__)) baz { + int x ; +}; + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/line_number.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/line_number.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/line_number.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/line_number.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,6 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/line_number.c (with preprocessing) +tests/syntax/line_number.c:1:[kernel] user error: syntax error +[kernel] user error: stopping on file "tests/syntax/line_number.c" that has errors. Add + '-kernel-msg-key pp' for preprocessing command. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/local_uninitialized_bts_1081.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/local_uninitialized_bts_1081.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/local_uninitialized_bts_1081.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/local_uninitialized_bts_1081.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,29 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/local_uninitialized_bts_1081.i (no preprocessing) +/* Generated by Frama-C */ +int X; +int Y; +int FOO; +int main(void) +{ + int __retres; + int foo; + int x; + int y; + if (foo) { + if (x) ; + } + else + if (y) ; + if (! foo) + if (y) ; + { + /*sequence*/ + if (foo) ; + ; + } + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/logic_env.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/logic_env.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/logic_env.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/logic_env.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,4 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/logic_env.i (no preprocessing) +Check OK +Check OK diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/loop_annot.1.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/loop_annot.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/loop_annot.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/loop_annot.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,17 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/loop_annot.i (no preprocessing) +/* Generated by Frama-C */ +void f(void) +{ + int i; + i = 0; + /*@ loop invariant 0 ≤ i ≤ 10; */ + while (i < 10) { + i ++; + /*@ assert 0 ≤ i ≤ 10; */ ; + } + while_0_break: ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/loop_annot.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/loop_annot.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/loop_annot.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/loop_annot.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,17 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/loop_annot.i (no preprocessing) +/* Generated by Frama-C */ +void f(void) +{ + int i; + i = 0; + /*@ loop invariant 0 ≤ i ≤ 10; */ + while (i < 10) { + i ++; + /*@ assert 0 ≤ i ≤ 10; */ ; + } + while_0_break: ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/lvalvoid.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/lvalvoid.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/lvalvoid.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/lvalvoid.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,5 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/lvalvoid.i (no preprocessing) +tests/syntax/lvalvoid.i:4:[kernel] failure: lvalue of type void: *(src + i) +[kernel] user error: stopping on file "tests/syntax/lvalvoid.i" that has errors. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/merge_bts0948.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/merge_bts0948.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/merge_bts0948.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/merge_bts0948.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,14 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/merge_bts0948.i (no preprocessing) +[kernel] Parsing tests/syntax/merge_bts0948_1.i (no preprocessing) +[kernel] Parsing tests/syntax/merge_bts0948_2.i (no preprocessing) +/* Generated by Frama-C */ +void *memcpy(void *region1); + +/*@ requires \valid((char *)region1); */ +void *memcpy(void *region1) +{ + return region1; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/merge_inline_1.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/merge_inline_1.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/merge_inline_1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/merge_inline_1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/merge_inline_1.c (with preprocessing) +[kernel] Parsing tests/syntax/merge_inline_2.c (with preprocessing) +[kernel] Repeat final merging phase: tests/syntax/merge_inline_2.c +/* Generated by Frama-C */ +__inline int foo(int x); + +__inline int foo(int x) +{ + return x; +} + +int getfoo2(void); + +int main(void) +{ + int __retres; + int tmp; + { + /*sequence*/ + tmp = getfoo2(); + ; + } + if (tmp != (int)(& foo)) { + __retres = 1; + goto return_label; + } + __retres = 0; + return_label: return __retres; +} + +__inline int foo(int x); + +int getfoo2(void) +{ + int __retres; + __retres = (int)(& foo); + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/multiline_macro.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/multiline_macro.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/multiline_macro.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/multiline_macro.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,12 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/multiline_macro.c (with preprocessing) +/* Generated by Frama-C */ +/*@ ensures \result ≡ ((((1+2)+3)+5)+6)+7; */ +int main(void) +{ + int __retres; + __retres = ((((1 + 2) + 3) + 5) + 6) + 7; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/multiple_decls_contracts.1.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/multiple_decls_contracts.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/multiple_decls_contracts.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/multiple_decls_contracts.1.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,817 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/multiple_decls_contracts.c (with preprocessing) +[kernel] Parsing share/libc/string.h (with preprocessing) +[kernel] Parsing tests/syntax/multiple_decls_contracts.c (with preprocessing) +tests/syntax/multiple_decls_contracts.c:10:[kernel] warning: dropping duplicate def'n of func strdup at tests/syntax/multiple_decls_contracts.c:10 in favor of that at tests/syntax/multiple_decls_contracts.c:10 +/* Generated by Frama-C */ +typedef int wchar_t; +typedef unsigned int size_t; +struct __fc_div_t { + int quot ; + int rem ; +}; +typedef struct __fc_div_t div_t; +struct __fc_ldiv_t { + long quot ; + long rem ; +}; +typedef struct __fc_ldiv_t ldiv_t; +struct __fc_lldiv_t { + long long quot ; + long long rem ; +}; +typedef struct __fc_lldiv_t lldiv_t; +/*@ +axiomatic MemCmp { + logic ℤ memcmp{L1, L2}(char *s1, char *s2, ℤ n) + reads \at(*(s1+(0 .. n-1)),L1), \at(*(s2+(0 .. n-1)),L2); + + axiom memcmp_zero{L1, L2}: + ∀ char *s1, char *s2; + ∀ ℤ n; + memcmp{L1, L2}(s1, s2, n) ≡ 0 ⇔ + (∀ ℤ i; 0 ≤ i < n ⇒ \at(*(s1+i),L1) ≡ \at(*(s2+i),L2)); + + } + */ +/*@ +axiomatic MemChr { + logic 𝔹 memchr{L}(char *s, ℤ c, ℤ n) ; + + axiom memchr_def{L}: + ∀ char *s; + ∀ ℤ c; + ∀ ℤ n; + memchr{L}(s, c, n) ≡ \true ⇔ + (∃ int i; 0 ≤ i < n ∧ *(s+i) ≡ c); + + } + */ +/*@ +axiomatic MemSet { + logic 𝔹 memset{L}(char *s, ℤ c, ℤ n) ; + + axiom memset_def{L}: + ∀ char *s; + ∀ ℤ c; + ∀ ℤ n; + memset{L}(s, c, n) ≡ \true ⇔ + (∀ ℤ i; 0 ≤ i < n ⇒ *(s+i) ≡ c); + + } + */ +/*@ +axiomatic StrLen { + logic ℤ strlen{L}(char *s) ; + + axiom strlen_pos_or_null{L}: + ∀ char *s; + ∀ ℤ i; + 0 ≤ i ∧ (∀ ℤ j; 0 ≤ j < i ⇒ *(s+j) ≢ '\000') ∧ + *(s+i) ≡ '\000' ⇒ strlen{L}(s) ≡ i; + + axiom strlen_neg{L}: + ∀ char *s; + (∀ ℤ i; 0 ≤ i ⇒ *(s+i) ≢ '\000') ⇒ strlen{L}(s) < 0; + + axiom strlen_before_null{L}: + ∀ char *s; + ∀ ℤ i; 0 ≤ i < strlen{L}(s) ⇒ *(s+i) ≢ '\000'; + + axiom strlen_at_null{L}: + ∀ char *s; 0 ≤ strlen{L}(s) ⇒ *(s+strlen{L}(s)) ≡ '\000'; + + axiom strlen_not_zero{L}: + ∀ char *s; + ∀ ℤ i; + 0 ≤ i ≤ strlen{L}(s) ∧ *(s+i) ≢ '\000' ⇒ i < strlen{L}(s); + + axiom strlen_zero{L}: + ∀ char *s; + ∀ ℤ i; + 0 ≤ i ≤ strlen{L}(s) ∧ *(s+i) ≡ '\000' ⇒ i ≡ strlen{L}(s); + + axiom strlen_sup{L}: + ∀ char *s; + ∀ ℤ i; 0 ≤ i ∧ *(s+i) ≡ '\000' ⇒ 0 ≤ strlen{L}(s) ≤ i; + + axiom strlen_shift{L}: + ∀ char *s; + ∀ ℤ i; 0 ≤ i ≤ strlen{L}(s) ⇒ strlen{L}(s+i) ≡ strlen{L}(s)-i; + + axiom strlen_create{L}: + ∀ char *s; + ∀ ℤ i; 0 ≤ i ∧ *(s+i) ≡ '\000' ⇒ 0 ≤ strlen{L}(s) ≤ i; + + axiom strlen_create_shift{L}: + ∀ char *s; + ∀ ℤ i; + ∀ ℤ k; + 0 ≤ k ≤ i ∧ *(s+i) ≡ '\000' ⇒ 0 ≤ strlen{L}(s+k) ≤ i-k; + + axiom memcmp_strlen_left{L}: + ∀ char *s1, char *s2; + ∀ ℤ n; + memcmp{L, L}(s1, s2, n) ≡ 0 ∧ strlen{L}(s1) < n ⇒ + strlen{L}(s1) ≡ strlen{L}(s2); + + axiom memcmp_strlen_right{L}: + ∀ char *s1, char *s2; + ∀ ℤ n; + memcmp{L, L}(s1, s2, n) ≡ 0 ∧ strlen{L}(s2) < n ⇒ + strlen{L}(s1) ≡ strlen{L}(s2); + + axiom memcmp_strlen_shift_left{L}: + ∀ char *s1, char *s2; + ∀ ℤ k, ℤ n; + memcmp{L, L}(s1, s2+k, n) ≡ 0 ≤ k ∧ strlen{L}(s1) < n ⇒ + 0 ≤ strlen{L}(s2) ≤ k+strlen{L}(s1); + + axiom memcmp_strlen_shift_right{L}: + ∀ char *s1, char *s2; + ∀ ℤ k, ℤ n; + memcmp{L, L}(s1+k, s2, n) ≡ 0 ≤ k ∧ strlen{L}(s2) < n ⇒ + 0 ≤ strlen{L}(s1) ≤ k+strlen{L}(s2); + + } + */ +/*@ +axiomatic StrCmp { + logic ℤ strcmp{L}(char *s1, char *s2) ; + + axiom strcmp_zero{L}: + ∀ char *s1, char *s2; + strcmp{L}(s1, s2) ≡ 0 ⇔ + strlen{L}(s1) ≡ strlen{L}(s2) ∧ + (∀ ℤ i; 0 ≤ i ≤ strlen{L}(s1) ⇒ *(s1+i) ≡ *(s2+i)); + + } + */ +/*@ +axiomatic StrNCmp { + logic ℤ strncmp{L}(char *s1, char *s2, ℤ n) ; + + axiom strncmp_zero{L}: + ∀ char *s1, char *s2; + ∀ ℤ n; + strncmp{L}(s1, s2, n) ≡ 0 ⇔ + (strlen{L}(s1) < n ∧ strcmp{L}(s1, s2) ≡ 0) ∨ + (∀ ℤ i; 0 ≤ i < n ⇒ *(s1+i) ≡ *(s2+i)); + + } + */ +/*@ +axiomatic StrChr { + logic 𝔹 strchr{L}(char *s, ℤ c) ; + + axiom strchr_def{L}: + ∀ char *s; + ∀ ℤ c; + strchr{L}(s, c) ≡ \true ⇔ + (∃ ℤ i; 0 ≤ i ≤ strlen{L}(s) ∧ *(s+i) ≡ c); + + } + */ +/*@ +axiomatic WcsLen { + logic ℤ wcslen{L}(wchar_t *s) ; + + axiom wcslen_pos_or_null{L}: + ∀ wchar_t *s; + ∀ ℤ i; + 0 ≤ i ∧ (∀ ℤ j; 0 ≤ j < i ⇒ *(s+j) ≢ 0) ∧ *(s+i) ≡ 0 ⇒ + wcslen{L}(s) ≡ i; + + axiom wcslen_neg{L}: + ∀ wchar_t *s; + (∀ ℤ i; 0 ≤ i ⇒ *(s+i) ≢ 0) ⇒ wcslen{L}(s) < 0; + + axiom wcslen_before_null{L}: + ∀ wchar_t *s; + ∀ int i; 0 ≤ i < wcslen{L}(s) ⇒ *(s+i) ≢ 0; + + axiom wcslen_at_null{L}: + ∀ wchar_t *s; 0 ≤ wcslen{L}(s) ⇒ *(s+wcslen{L}(s)) ≡ 0; + + axiom wcslen_not_zero{L}: + ∀ wchar_t *s; + ∀ int i; 0 ≤ i ≤ wcslen{L}(s) ∧ *(s+i) ≢ 0 ⇒ i < wcslen{L}(s); + + axiom wcslen_zero{L}: + ∀ wchar_t *s; + ∀ int i; + 0 ≤ i ≤ wcslen{L}(s) ∧ *(s+i) ≡ 0 ⇒ i ≡ wcslen{L}(s); + + axiom wcslen_sup{L}: + ∀ wchar_t *s; + ∀ int i; 0 ≤ i ∧ *(s+i) ≡ 0 ⇒ 0 ≤ wcslen{L}(s) ≤ i; + + axiom wcslen_shift{L}: + ∀ wchar_t *s; + ∀ int i; 0 ≤ i ≤ wcslen{L}(s) ⇒ wcslen{L}(s+i) ≡ wcslen{L}(s)-i; + + axiom wcslen_create{L}: + ∀ wchar_t *s; + ∀ int i; 0 ≤ i ∧ *(s+i) ≡ 0 ⇒ 0 ≤ wcslen{L}(s) ≤ i; + + axiom wcslen_create_shift{L}: + ∀ wchar_t *s; + ∀ int i; + ∀ int k; + 0 ≤ k ≤ i ∧ *(s+i) ≡ 0 ⇒ 0 ≤ wcslen{L}(s+k) ≤ i-k; + + } + */ +/*@ +axiomatic WcsCmp { + logic ℤ wcscmp{L}(wchar_t *s1, wchar_t *s2) ; + + axiom wcscmp_zero{L}: + ∀ wchar_t *s1, wchar_t *s2; + wcscmp{L}(s1, s2) ≡ 0 ⇔ + wcslen{L}(s1) ≡ wcslen{L}(s2) ∧ + (∀ ℤ i; 0 ≤ i ≤ wcslen{L}(s1) ⇒ *(s1+i) ≡ *(s2+i)); + + } + */ +/*@ +axiomatic WcsNCmp { + logic ℤ wcsncmp{L}(wchar_t *s1, wchar_t *s2, ℤ n) ; + + axiom wcsncmp_zero{L}: + ∀ wchar_t *s1, wchar_t *s2; + ∀ ℤ n; + wcsncmp{L}(s1, s2, n) ≡ 0 ⇔ + (wcslen{L}(s1) < n ∧ wcscmp{L}(s1, s2) ≡ 0) ∨ + (∀ ℤ i; 0 ≤ i < n ⇒ *(s1+i) ≡ *(s2+i)); + + } + */ +/*@ logic ℤ minimum(ℤ i, ℤ j) = ica); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/offset.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/offset.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/offset.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/offset.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,8 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/offset.c (with preprocessing) +/* Generated by Frama-C */ +typedef long off_t; +typedef long long off64_t; +off_t x = (long)0; +off64_t y = (long long)0; + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/one_ret_assert.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/one_ret_assert.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/one_ret_assert.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/one_ret_assert.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,44 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/one_ret_assert.i (no preprocessing) +tests/syntax/one_ret_assert.i:8:[kernel] warning: Body of function g falls-through. Adding a return statement +/* Generated by Frama-C */ +int X; +void f(void) +{ + X ++; + return; +} + +int g(void) +{ + int __retres; + X ++; + /*@ assert missing_return: \false; */ ; + __retres = 0; + return __retres; +} + +int h(void) +{ + int __retres; + if (X) { + __retres = 3; + goto return_label; + } + else { + __retres = 4; + goto return_label; + } + return_label: return __retres; +} + +int main(void) +{ + int tmp; + X = h(); + f(); + tmp = g(); + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/orig_name.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/orig_name.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/orig_name.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/orig_name.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,26 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/orig_name.i (no preprocessing) +tests/syntax/orig_name.i:10:[kernel] Variable x has been renamed to x_1 +tests/syntax/orig_name.i:7:[kernel] Variable x has been renamed to x_0 +/* Generated by Frama-C */ +int x = 1; +int f(int x_0) +{ + int y; + y = 0; + if (x_0 == 0) { + int x_1; + int tmp; + x_1 = 3; + { + /*sequence*/ + tmp = x_1; + x_1 ++; + y = tmp; + } + } + y += x_0; + return y; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/ptr_null_cmp_bts1027.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/ptr_null_cmp_bts1027.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/ptr_null_cmp_bts1027.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/ptr_null_cmp_bts1027.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/ptr_null_cmp_bts1027.i (no preprocessing) +/* Generated by Frama-C */ +/*@ behavior normal: + assumes r ≢ \null ∧ ¬(x ≢ 0.); + ensures \result ≡ 0; + + behavior f: + assumes ¬(r ≢ \null) ∨ x ≢ 0.; + ensures \result ≡ -1; + */ +int max(int *r, double x) +{ + int __retres; + if (! r) { + __retres = -1; + goto return_label; + } + else + if (x) { + __retres = -1; + goto return_label; + } + __retres = 0; + return_label: return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/Refresh_visitor.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/Refresh_visitor.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/Refresh_visitor.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/Refresh_visitor.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/Refresh_visitor.i (no preprocessing) +Start +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/syntax/Refresh_visitor.i:13:[value] Assertion got status unknown. +tests/syntax/Refresh_visitor.i:10:[value] Function main: postcondition got status unknown. +[value] Recording results for main +[value] done for function main +/* Generated by Frama-C */ +struct S { + int i ; +}; +/*@ lemma foo: ∀ struct S x; x.i ≥ 0 ∨ x.i < 0; + */ +/*@ ensures \result ≥ \old(x.i); */ +int main(struct S x) +{ + int y; + y = x.i; + /*@ assert y ≡ x.i; */ ; + return y; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/reject_use_decl_mismatch_bts728.1.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/reject_use_decl_mismatch_bts728.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/reject_use_decl_mismatch_bts728.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/reject_use_decl_mismatch_bts728.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,8 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/reject_use_decl_mismatch_bts728.c (with preprocessing) +tests/syntax/reject_use_decl_mismatch_bts728.c:15:[kernel] warning: Calling undeclared function f. Old style K&R code? +tests/syntax/reject_use_decl_mismatch_bts728.c:19:[kernel] user error: Declaration of f does not match previous declaration from tests/syntax/reject_use_decl_mismatch_bts728.c:15 (different number of arguments). +[kernel] user error: Inconsistent formals +[kernel] user error: stopping on file "tests/syntax/reject_use_decl_mismatch_bts728.c" that has + errors. Add '-kernel-msg-key pp' for preprocessing command. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/reject_use_decl_mismatch_bts728.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/reject_use_decl_mismatch_bts728.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/reject_use_decl_mismatch_bts728.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/reject_use_decl_mismatch_bts728.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,7 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/reject_use_decl_mismatch_bts728.c (with preprocessing) +tests/syntax/reject_use_decl_mismatch_bts728.c:19:[kernel] user error: Declaration of f does not match previous declaration from tests/syntax/reject_use_decl_mismatch_bts728.c:7 (different number of arguments). +[kernel] user error: Inconsistent formals +[kernel] user error: stopping on file "tests/syntax/reject_use_decl_mismatch_bts728.c" that has + errors. Add '-kernel-msg-key pp' for preprocessing command. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/reorder.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/reorder.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/reorder.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/reorder.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,56 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/reorder.i (no preprocessing) +/* Generated by Frama-C */ +int x; +/*@ ensures i ≡ i; */ +void f(void) +{ + x ++; + return; +} + +/*@ axiomatic Ax { + predicate Q(ℤ v) ; + + } + */ +/*@ requires Q: \let v = Q(255); ¬(¬v ∨ v); */ +extern void g(void); + +/*@ logic ℤ i= j+k; + */ +/*@ logic ℤ j= l; + */ +/*@ logic ℤ l= 1; + */ +/*@ logic ℤ k= l; + +*/ + +/* Generated by Frama-C */ +int x; +/*@ logic ℤ l= 1; + */ +/*@ logic ℤ k= l; + */ +/*@ logic ℤ j= l; + */ +/*@ logic ℤ i= j+k; + */ +/*@ ensures i ≡ i; */ +void f(void) +{ + x ++; + return; +} + +/*@ axiomatic Ax { + predicate Q(ℤ v) ; + + } + +*/ +/*@ requires Q: \let v = Q(255); ¬(¬v ∨ v); */ +extern void g(void); + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/rettype.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/rettype.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/rettype.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/rettype.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,6 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/rettype.i (no preprocessing) +tests/syntax/rettype.i:8:[kernel] user error: Declaration of foo does not match previous declaration from tests/syntax/rettype.i:5 (different integer types). +tests/syntax/rettype.i:5:[kernel] warning: found two contracts. Merging them +[kernel] user error: stopping on file "tests/syntax/rettype.i" that has errors. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/simp_switch.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/simp_switch.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/simp_switch.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/simp_switch.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,12 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/simp_switch.i (no preprocessing) +/* Generated by Frama-C */ +void main(void) +{ + if (! (! 0)) goto switch_0_break; + switch_0_0: goto switch_0_break; + switch_0_break: ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/sizeof_bts1414.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/sizeof_bts1414.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/sizeof_bts1414.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/sizeof_bts1414.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,24 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/sizeof_bts1414.i (no preprocessing) +tests/syntax/sizeof_bts1414.i:5:[kernel] Dropping side-effect in sizeof. Nothing to worry, this is by the book. +tests/syntax/sizeof_bts1414.i:7:[kernel] Dropping side-effect in sizeof. Nothing to worry, this is by the book. +/* Generated by Frama-C */ +int g(int *a) +{ + int __retres; + int x; + int tmp; + x = (int)sizeof(tmp); + switch (x) { + int tmp_0; + case (int)sizeof(tmp_0): __retres = 1; + goto return_label; + default: ; + __retres = 0; + goto return_label; + } + __retres = x; + return_label: return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/spurious_brace_bts_1273.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/spurious_brace_bts_1273.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/spurious_brace_bts_1273.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/spurious_brace_bts_1273.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,5 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/spurious_brace_bts_1273.i (no preprocessing) +tests/syntax/spurious_brace_bts_1273.i:3:[kernel] user error: syntax error +[kernel] user error: stopping on file "tests/syntax/spurious_brace_bts_1273.i" that has errors. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/static_formals_1.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/static_formals_1.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/static_formals_1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/static_formals_1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,25 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/static_formals_1.c (with preprocessing) +[kernel] Parsing tests/syntax/static_formals_2.c (with preprocessing) +/* Generated by Frama-C */ +/*@ requires /* vid:70, lvid:70 */x < 10; */ +static int /* vid:99 */f(int /* vid:70, lvid:70 */x); + +int /* vid:73 */g(void) +{ + int /* vid:74 */tmp; + /* vid:74 */tmp = /* vid:99 */f(4); + return /* vid:74 */tmp; +} + +/*@ requires /* vid:94, lvid:94 */x < 10; */ +static int /* vid:100 */f_0(int /* vid:94, lvid:94 */x); + +int /* vid:97 */h(void) +{ + int /* vid:98 */tmp; + /* vid:98 */tmp = /* vid:100 */f_0(6); + return /* vid:98 */tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/syntactic_hook.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/syntactic_hook.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/syntactic_hook.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/syntactic_hook.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,28 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/syntactic_hook.i (no preprocessing) +tests/syntax/syntactic_hook.i:9:[kernel] warning: [SH]: definition of h does not use exactly the same prototype as declared on line 7 +tests/syntax/syntactic_hook.i:17:[kernel] warning: [SH]: definition of local function t +tests/syntax/syntactic_hook.i:21:[kernel] warning: Calling undeclared function g. Old style K&R code? +tests/syntax/syntactic_hook.i:21:[kernel] warning: [SH]: implicit declaration for prototype g +tests/syntax/syntactic_hook.i:22:[kernel] Dropping side-effect in sizeof. Nothing to worry, this is by the book. +tests/syntax/syntactic_hook.i:22:[kernel] warning: [SH]: dropping side effect in sizeof: x++ is converted to tmp +tests/syntax/syntactic_hook.i:24:[kernel] warning: [SH]: side effect of expression x++ occurs in conditional part of expression x + && + x++. It is not always executed +tests/syntax/syntactic_hook.i:25:[kernel] warning: [SH]: side effect of expression x++ occurs in conditional part of expression x + && + (x++ || x). It is not always executed +tests/syntax/syntactic_hook.i:26:[kernel] warning: [SH]: side effect of expression x++ occurs in conditional part of expression x + || + x++. It is not always executed +tests/syntax/syntactic_hook.i:27:[kernel] warning: [SH]: side effect of expression x++ occurs in conditional part of expression x + ? x++ : + x++. It is not always executed +tests/syntax/syntactic_hook.i:27:[kernel] warning: [SH]: side effect of expression x++ occurs in conditional part of expression x + ? x++ : + x++. It is not always executed +tests/syntax/syntactic_hook.i:31:[kernel] user error: Declaration of f does not match previous declaration from tests/syntax/syntactic_hook.i:5 (different number of arguments). +tests/syntax/syntactic_hook.i:31:[kernel] warning: [SH]: conflict with declaration of f at line 5: different number of arguments +[kernel] user error: Inconsistent formals +[kernel] user error: stopping on file "tests/syntax/syntactic_hook.i" that has errors. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/ternary_bts1503.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/ternary_bts1503.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/ternary_bts1503.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/ternary_bts1503.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,9 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/ternary_bts1503.i (no preprocessing) +/* Generated by Frama-C */ +void f(void) +{ + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/type_branch_bts_1081.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/type_branch_bts_1081.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/type_branch_bts_1081.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/type_branch_bts_1081.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,5 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/type_branch_bts_1081.i (no preprocessing) +tests/syntax/type_branch_bts_1081.i:5:[kernel] failure: invalid implicit conversion from void to signed char +[kernel] user error: stopping on file "tests/syntax/type_branch_bts_1081.i" that has errors. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/typedef_incorrect_pretty_print_bts1518_res.i frama-c-20150201+sodium+dfsg/tests/syntax/oracle/typedef_incorrect_pretty_print_bts1518_res.i --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/typedef_incorrect_pretty_print_bts1518_res.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/typedef_incorrect_pretty_print_bts1518_res.i 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,42 @@ +/* Generated by Frama-C */ +struct rr; +typedef struct rr rr; +struct apf; +struct rr { + struct apf *of ; +}; +typedef struct apf apf; +struct apf { + apf *next ; + rr *r ; +}; +/*@ requires r->of ≡ (struct apf *)((void *)0); */ +static apf *f(rr *r) +{ + apf *__retres; + __retres = r->of; + return __retres; +} + + +/* Generated by Frama-C */ +struct rr; +typedef struct rr rr; +struct apf; +struct rr { + struct apf *of ; +}; +typedef struct apf apf; +struct apf { + apf *next ; + rr *r ; +}; +/*@ requires r->of ≡ (struct apf *)((void *)0); */ +static apf *f(rr *r) +{ + apf *__retres; + __retres = r->of; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/typedef_incorrect_pretty_print_bts1518.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/typedef_incorrect_pretty_print_bts1518.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/typedef_incorrect_pretty_print_bts1518.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/typedef_incorrect_pretty_print_bts1518.res.oracle 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,21 @@ +/* Generated by Frama-C */ +struct rr; +typedef struct rr rr; +struct apf; +struct rr { + struct apf *of ; +}; +typedef struct apf apf; +struct apf { + apf *next ; + rr *r ; +}; +/*@ requires r->of ≡ (struct apf *)((void *)0); */ +static apf *f(rr *r) +{ + apf *__retres; + __retres = r->of; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/typedef_multi_1.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/typedef_multi_1.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/typedef_multi_1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/typedef_multi_1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/typedef_multi_1.c (with preprocessing) +[kernel] Parsing tests/syntax/typedef_multi_2.c (with preprocessing) +/* Generated by Frama-C */ +typedef int WORD; +extern WORD x; + +extern WORD y; + +void f(void) +{ + while (x < y) x ++; + return; +} + +void g(void) +{ + /*@ loop invariant x ≤ 3+2; */ + while (x < y) x ++; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/typedef_namespace_bts1500.1.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/typedef_namespace_bts1500.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/typedef_namespace_bts1500.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/typedef_namespace_bts1500.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,6 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/typedef_namespace_bts1500.c (with preprocessing) +tests/syntax/typedef_namespace_bts1500.c:23:[kernel] user error: syntax error +[kernel] user error: stopping on file "tests/syntax/typedef_namespace_bts1500.c" that has errors. + Add '-kernel-msg-key pp' for preprocessing command. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/typedef_namespace_bts1500.2.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/typedef_namespace_bts1500.2.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/typedef_namespace_bts1500.2.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/typedef_namespace_bts1500.2.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,6 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/typedef_namespace_bts1500.c (with preprocessing) +tests/syntax/typedef_namespace_bts1500.c:31:[kernel] user error: redefinition of 'digit' with different kind in the same scope. Previous declaration was at tests/syntax/typedef_namespace_bts1500.c:6 +[kernel] user error: stopping on file "tests/syntax/typedef_namespace_bts1500.c" that has errors. + Add '-kernel-msg-key pp' for preprocessing command. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/typedef_namespace_bts1500.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/typedef_namespace_bts1500.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/typedef_namespace_bts1500.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/typedef_namespace_bts1500.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,21 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/typedef_namespace_bts1500.c (with preprocessing) +/* Generated by Frama-C */ +typedef int digit; +digit const D = 10; +long const L = 10L; +digit A; + +int main(void) +{ + int __retres; + digit x; + int digit_0; + x = 4; + digit_0 = 3; + __retres = (x + digit_0) + A; + return __retres; +} + +digit A = 8; + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/typedef_size_t.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/typedef_size_t.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/typedef_size_t.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/typedef_size_t.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,11 @@ +[kernel] preprocessing with "gcc -E -C -I. -dD -nostdinc -D__FC_MACHDEP_X86_32 -I./share/libc tests/syntax/typedef_size_t.c" +/* Generated by Frama-C */ +typedef unsigned int size_t; +size_t main(int f) +{ + size_t __retres; + __retres = (unsigned int)f; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/typeof.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/typeof.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/typeof.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/typeof.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,23 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/typeof.i (no preprocessing) +/* Generated by Frama-C */ +int f(int x) +{ + return x; +} + +extern int g(int x); + +int A; +int T[5][6]; +int U; +int (*V)[6]; +int V1; +char const S[sizeof("FOO")]; +void h(int x) +{ + g(3); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/type_redef.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/type_redef.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/type_redef.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/type_redef.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,5 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/type_redef.i (no preprocessing) +tests/syntax/type_redef.i:2:[kernel] user error: redefinition of 'ftest_t' in the same scope. Previous declaration was at tests/syntax/type_redef.i:1 +[kernel] user error: stopping on file "tests/syntax/type_redef.i" that has errors. +[kernel] Frama-C aborted: invalid user input. diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/undeclared_local_bts1113.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/undeclared_local_bts1113.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/undeclared_local_bts1113.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/undeclared_local_bts1113.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,41 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/undeclared_local_bts1113.c (with preprocessing) +tests/syntax/undeclared_local_bts1113.c:3:[kernel] warning: Variable-sized local variable k +tests/syntax/undeclared_local_bts1113.c:5:[kernel] warning: Variable-sized local variable kk +/* Generated by Frama-C */ +void *alloca(unsigned int); + +void funk(int rounds) +{ + int *k; + unsigned int __lengthofk; + int i; + int *kk; + unsigned int __lengthofkk; + { + /*sequence*/ + __lengthofk = (unsigned int)(2 * rounds); + k = (int *)alloca(sizeof(*k) * __lengthofk); + } + { + /*sequence*/ + __lengthofkk = (unsigned int)(2 * rounds); + kk = (int *)alloca(sizeof(*kk) * __lengthofkk); + } + i = 0; + while (i < 2 * rounds) { + *(k + i) = i; + i ++; + } + return; +} + +int main(void) +{ + int __retres; + funk(17); + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/undeclared_local_bts1126.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/undeclared_local_bts1126.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/undeclared_local_bts1126.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/undeclared_local_bts1126.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,95 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/undeclared_local_bts1126.c (with preprocessing) +tests/syntax/undeclared_local_bts1126.c:35:[kernel] warning: Calling undeclared function _gnutls_epoch_get. Old style K&R code? +tests/syntax/undeclared_local_bts1126.c:37:[kernel] warning: Calling undeclared function gnutls_assert_val. Old style K&R code? +tests/syntax/undeclared_local_bts1126.c:44:[kernel] warning: Calling undeclared function _gnutls_cipher_suite_get_cipher_algo. Old style K&R code? +tests/syntax/undeclared_local_bts1126.c:45:[kernel] warning: Calling undeclared function _gnutls_cipher_suite_get_mac_algo. Old style K&R code? +tests/syntax/undeclared_local_bts1126.c:47:[kernel] warning: Calling undeclared function _gnutls_cipher_is_ok. Old style K&R code? +tests/syntax/undeclared_local_bts1126.c:48:[kernel] warning: Calling undeclared function _gnutls_mac_is_ok. Old style K&R code? +/* Generated by Frama-C */ +struct gnutls_session_t { + int f ; +}; +typedef struct gnutls_session_t gnutls_session_t; +struct record_parameters_st { + int initialized ; + void (*cipher_algorithm)(int ) ; + void (*mac_algorithm)(int ) ; +}; +typedef struct record_parameters_st record_parameters_st; +struct cipher_suite_st { + int a ; +}; +typedef struct cipher_suite_st cipher_suite_st; +extern int ( /* missing proto */ _gnutls_epoch_get)(struct gnutls_session_t x_0, + int x_1, + record_parameters_st **x_2); + +extern int ( /* missing proto */ gnutls_assert_val)(int x_0); + +extern int ( /* missing proto */ _gnutls_cipher_suite_get_cipher_algo)( +cipher_suite_st *x_0); + +extern int ( /* missing proto */ _gnutls_cipher_suite_get_mac_algo)(cipher_suite_st *x_0); + +extern int ( /* missing proto */ _gnutls_cipher_is_ok)(void (*x_0)(int )); + +extern int ( /* missing proto */ _gnutls_mac_is_ok)(void (*x_0)(int )); + +int _gnutls_epoch_set_cipher_suite(gnutls_session_t session, int epoch_rel, + cipher_suite_st *suite) +{ + int __retres; + void (*cipher_algo)(int ); + void (*mac_algo)(int ); + record_parameters_st *params; + int ret; + int tmp_1; + int tmp_2; + int tmp_4; + ret = _gnutls_epoch_get(session,epoch_rel,& params); + if (ret < 0) { + int tmp; + tmp = gnutls_assert_val(ret); + __retres = tmp; + goto return_label; + } + if (params->initialized) goto _LOR; + else + if (params->cipher_algorithm != (void (*)(int ))0) goto _LOR; + else + if (params->mac_algorithm != (void (*)(int ))0) { + int tmp_0; + _LOR: tmp_0 = gnutls_assert_val(0); + __retres = tmp_0; + goto return_label; + } + { + /*sequence*/ + tmp_1 = _gnutls_cipher_suite_get_cipher_algo(suite); + cipher_algo = (void (*)(int ))tmp_1; + } + { + /*sequence*/ + tmp_2 = _gnutls_cipher_suite_get_mac_algo(suite); + mac_algo = (void (*)(int ))tmp_2; + } + tmp_4 = _gnutls_cipher_is_ok(cipher_algo); + if (tmp_4 != 0) goto _LOR_0; + else { + int tmp_5; + tmp_5 = _gnutls_mac_is_ok(mac_algo); + if (tmp_5 != 0) { + int tmp_3; + _LOR_0: tmp_3 = gnutls_assert_val(0); + __retres = tmp_3; + goto return_label; + } + } + params->cipher_algorithm = cipher_algo; + params->mac_algorithm = mac_algo; + __retres = 0; + return_label: return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/unroll_const.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unroll_const.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/unroll_const.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unroll_const.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,179 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/unroll_const.i (no preprocessing) +/* Generated by Frama-C */ +struct __anonstruct_u_1 { + int i1 ; + int i2 ; +}; +struct v { + int k ; + int l ; +}; +struct s { + int i ; + int j ; + struct v v ; +}; +int const t[4] = {4, 2}; +struct __anonstruct_u_1 const u[3] = {{.i1 = 2, .i2 = 5}, {.i1 = 3, .i2 = 7}}; +struct s const s = {.i = 5, .j = 8, .v = {.k = 3, .l = 0}}; +int volatile c; +void main(void) +{ + unsigned int i; + i = (unsigned int)0; + if (! c) goto unrolling_2_loop; + i ++; + unrolling_6_loop: ; + if (! c) goto unrolling_2_loop; + i ++; + unrolling_5_loop: ; + if (! c) goto unrolling_2_loop; + i ++; + unrolling_4_loop: ; + if (! c) goto unrolling_2_loop; + i ++; + unrolling_3_loop: ; + /*@ loop pragma UNROLL sizeof(t)/sizeof(t[0]); + loop pragma UNROLL "done", 4; + */ + while (c) i ++; + unrolling_2_loop: ; + if (! c) goto unrolling_8_loop; + i ++; + unrolling_20_loop: ; + if (! c) goto unrolling_8_loop; + i ++; + unrolling_19_loop: ; + if (! c) goto unrolling_8_loop; + i ++; + unrolling_18_loop: ; + if (! c) goto unrolling_8_loop; + i ++; + unrolling_17_loop: ; + if (! c) goto unrolling_8_loop; + i ++; + unrolling_16_loop: ; + if (! c) goto unrolling_8_loop; + i ++; + unrolling_15_loop: ; + if (! c) goto unrolling_8_loop; + i ++; + unrolling_14_loop: ; + if (! c) goto unrolling_8_loop; + i ++; + unrolling_13_loop: ; + if (! c) goto unrolling_8_loop; + i ++; + unrolling_12_loop: ; + if (! c) goto unrolling_8_loop; + i ++; + unrolling_11_loop: ; + if (! c) goto unrolling_8_loop; + i ++; + unrolling_10_loop: ; + if (! c) goto unrolling_8_loop; + i ++; + unrolling_9_loop: ; + /*@ loop pragma UNROLL \offset(&s.v.l); + loop pragma UNROLL "done", 12; */ + while (c) i ++; + unrolling_8_loop: ; + if (! c) goto unrolling_22_loop; + i ++; + unrolling_27_loop: ; + if (! c) goto unrolling_22_loop; + i ++; + unrolling_26_loop: ; + if (! c) goto unrolling_22_loop; + i ++; + unrolling_25_loop: ; + if (! c) goto unrolling_22_loop; + i ++; + unrolling_24_loop: ; + if (! c) goto unrolling_22_loop; + i ++; + unrolling_23_loop: ; + /*@ loop pragma UNROLL s.i+s.v.l; + loop pragma UNROLL "done", 5; */ + while (c) i ++; + unrolling_22_loop: ; + if (! c) goto unrolling_29_loop; + i ++; + unrolling_33_loop: ; + if (! c) goto unrolling_29_loop; + i ++; + unrolling_32_loop: ; + if (! c) goto unrolling_29_loop; + i ++; + unrolling_31_loop: ; + if (! c) goto unrolling_29_loop; + i ++; + unrolling_30_loop: ; + /*@ loop pragma UNROLL \max(t[..]); + loop pragma UNROLL "done", 4; */ + while (c) i ++; + unrolling_29_loop: ; + /*@ loop pragma UNROLL \min(t[..]); */ + while (c) i ++; + if (! c) goto unrolling_35_loop; + i ++; + unrolling_41_loop: ; + if (! c) goto unrolling_35_loop; + i ++; + unrolling_40_loop: ; + if (! c) goto unrolling_35_loop; + i ++; + unrolling_39_loop: ; + if (! c) goto unrolling_35_loop; + i ++; + unrolling_38_loop: ; + if (! c) goto unrolling_35_loop; + i ++; + unrolling_37_loop: ; + if (! c) goto unrolling_35_loop; + i ++; + unrolling_36_loop: ; + /*@ loop pragma UNROLL \max(\union(1, 1+s.i)); + loop pragma UNROLL "done", 6; + */ + while (c) i ++; + unrolling_35_loop: ; + if (! c) goto unrolling_43_loop; + i ++; + unrolling_45_loop: ; + if (! c) goto unrolling_43_loop; + i ++; + unrolling_44_loop: ; + /*@ loop pragma UNROLL \min(t[\union(1, 3)])+\max(t[\union(1, 3)]); + loop pragma UNROLL "done", 2; + */ + while (c) i ++; + unrolling_43_loop: ; + if (! c) goto unrolling_47_loop; + i ++; + unrolling_53_loop: ; + if (! c) goto unrolling_47_loop; + i ++; + unrolling_52_loop: ; + if (! c) goto unrolling_47_loop; + i ++; + unrolling_51_loop: ; + if (! c) goto unrolling_47_loop; + i ++; + unrolling_50_loop: ; + if (! c) goto unrolling_47_loop; + i ++; + unrolling_49_loop: ; + if (! c) goto unrolling_47_loop; + i ++; + unrolling_48_loop: ; + /*@ loop pragma UNROLL \min(u[.. 1].i1)*\max(u[.. 1].i1); + loop pragma UNROLL "done", 6; + */ + while (c) i ++; + unrolling_47_loop: ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/unroll_labels.1.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unroll_labels.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/unroll_labels.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unroll_labels.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,505 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/unroll_labels.i (no preprocessing) +[value] Analyzing a complete application starting at main2 +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + foo ∈ [--..--] +[value] Recording results for main2 +[value] done for function main2 +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main2: + i ∈ {3} +/* Generated by Frama-C */ +enum __anonenum_1 { + SIX = 6 +}; +int volatile foo; +void main(void) +{ + int j; + j = 0; + { + int i; + i = 1; + if (! (i < 4)) goto unrolling_2_loop; + switch (i) { + case 1: j ++; + break; + case 2: j += 3; + break; + case 3: j += 5; + break; + case 4: j += 7; + break; + default: ; + j = 0; + } + i ++; + unrolling_6_loop: ; + if (! (i < 4)) goto unrolling_2_loop; + switch (i) { + case 1: j ++; + break; + case 2: j += 3; + break; + case 3: j += 5; + break; + case 4: j += 7; + break; + default: ; + j = 0; + } + i ++; + unrolling_5_loop: ; + if (! (i < 4)) goto unrolling_2_loop; + switch (i) { + case 1: j ++; + break; + case 2: j += 3; + break; + case 3: j += 5; + break; + case 4: j += 7; + break; + default: ; + j = 0; + } + i ++; + unrolling_4_loop: ; + if (! (i < 4)) goto unrolling_2_loop; + switch (i) { + case 1: j ++; + break; + case 2: j += 3; + break; + case 3: j += 5; + break; + case 4: j += 7; + break; + default: ; + j = 0; + } + i ++; + unrolling_3_loop: ; + /*@ loop invariant \false; + loop pragma UNROLL "completely", 4; + loop pragma UNROLL "done", 4; + */ + while (i < 4) { + switch (i) { + case 1: j ++; + break; + case 2: j += 3; + break; + case 3: j += 5; + break; + case 4: j += 7; + break; + default: ; + j = 0; + } + i ++; + } + unrolling_2_loop: ; + } + { + int x; + x = 0; + L: + if (! (x < 5)) goto unrolling_8_loop; + { + int y_unroll_32; + y_unroll_32 = 0; + x ++; + y_unroll_32 ++; + } + unrolling_11_loop: ; + if (! (x < 5)) goto unrolling_8_loop; + { + int y_unroll_28; + y_unroll_28 = 0; + x ++; + y_unroll_28 ++; + } + unrolling_10_loop: ; + if (! (x < 5)) goto unrolling_8_loop; + { + int y_unroll_24; + y_unroll_24 = 0; + x ++; + y_unroll_24 ++; + } + unrolling_9_loop: ; + /*@ loop pragma UNROLL 3; + loop pragma UNROLL "done", 3; */ + while (x < 5) { + int y; + y = 0; + x ++; + y ++; + } + unrolling_8_loop: ; + } + j = 0; + if (! foo) goto unrolling_18_loop; + switch (j) { + case -1: j ++; + break; + case 0: + if (! (j < 5)) goto unrolling_13_loop_unrolling_48_loop; + j ++; + unrolling_16_loop_unrolling_45_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_48_loop; + j ++; + unrolling_15_loop_unrolling_46_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_48_loop; + j ++; + unrolling_14_loop_unrolling_47_loop: ; + /*@ loop pragma UNROLL "done", 3; + loop pragma UNROLL 3; */ + while (j < 5) j ++; + unrolling_13_loop_unrolling_48_loop: ; + break; + case 5: j = -1; + break; + default: ; + goto return_label; + } + unrolling_44_loop: ; + if (! foo) goto unrolling_18_loop; + switch (j) { + case -1: j ++; + break; + case 0: + if (! (j < 5)) goto unrolling_13_loop_unrolling_43_loop; + j ++; + unrolling_16_loop_unrolling_40_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_43_loop; + j ++; + unrolling_15_loop_unrolling_41_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_43_loop; + j ++; + unrolling_14_loop_unrolling_42_loop: ; + /*@ loop pragma UNROLL "done", 3; + loop pragma UNROLL 3; */ + while (j < 5) j ++; + unrolling_13_loop_unrolling_43_loop: ; + break; + case 5: j = -1; + break; + default: ; + goto return_label; + } + unrolling_39_loop: ; + if (! foo) goto unrolling_18_loop; + switch (j) { + case -1: j ++; + break; + case 0: + if (! (j < 5)) goto unrolling_13_loop_unrolling_38_loop; + j ++; + unrolling_16_loop_unrolling_35_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_38_loop; + j ++; + unrolling_15_loop_unrolling_36_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_38_loop; + j ++; + unrolling_14_loop_unrolling_37_loop: ; + /*@ loop pragma UNROLL "done", 3; + loop pragma UNROLL 3; */ + while (j < 5) j ++; + unrolling_13_loop_unrolling_38_loop: ; + break; + case 5: j = -1; + break; + default: ; + goto return_label; + } + unrolling_34_loop: ; + if (! foo) goto unrolling_18_loop; + switch (j) { + case -1: j ++; + break; + case 0: + if (! (j < 5)) goto unrolling_13_loop_unrolling_33_loop; + j ++; + unrolling_16_loop_unrolling_30_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_33_loop; + j ++; + unrolling_15_loop_unrolling_31_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_33_loop; + j ++; + unrolling_14_loop_unrolling_32_loop: ; + /*@ loop pragma UNROLL "done", 3; + loop pragma UNROLL 3; */ + while (j < 5) j ++; + unrolling_13_loop_unrolling_33_loop: ; + break; + case 5: j = -1; + break; + default: ; + goto return_label; + } + unrolling_29_loop: ; + if (! foo) goto unrolling_18_loop; + switch (j) { + case -1: j ++; + break; + case 0: + if (! (j < 5)) goto unrolling_13_loop_unrolling_28_loop; + j ++; + unrolling_16_loop_unrolling_25_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_28_loop; + j ++; + unrolling_15_loop_unrolling_26_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_28_loop; + j ++; + unrolling_14_loop_unrolling_27_loop: ; + /*@ loop pragma UNROLL "done", 3; + loop pragma UNROLL 3; */ + while (j < 5) j ++; + unrolling_13_loop_unrolling_28_loop: ; + break; + case 5: j = -1; + break; + default: ; + goto return_label; + } + unrolling_24_loop: ; + if (! foo) goto unrolling_18_loop; + switch (j) { + case -1: j ++; + break; + case 0: + if (! (j < 5)) goto unrolling_13_loop_unrolling_23_loop; + j ++; + unrolling_16_loop_unrolling_20_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_23_loop; + j ++; + unrolling_15_loop_unrolling_21_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_23_loop; + j ++; + unrolling_14_loop_unrolling_22_loop: ; + /*@ loop pragma UNROLL "done", 3; + loop pragma UNROLL 3; */ + while (j < 5) j ++; + unrolling_13_loop_unrolling_23_loop: ; + break; + case 5: j = -1; + break; + default: ; + goto return_label; + } + unrolling_19_loop: ; + /*@ loop pragma UNROLL SIX; + loop pragma UNROLL "done", 6; */ + while (foo) + switch (j) { + case -1: j ++; + break; + case 0: + if (! (j < 5)) goto unrolling_13_loop; + j ++; + unrolling_16_loop: ; + if (! (j < 5)) goto unrolling_13_loop; + j ++; + unrolling_15_loop: ; + if (! (j < 5)) goto unrolling_13_loop; + j ++; + unrolling_14_loop: ; + /*@ loop pragma UNROLL 3; + loop pragma UNROLL "done", 3; */ + while (j < 5) j ++; + unrolling_13_loop: ; + break; + case 5: j = -1; + break; + default: ; + goto return_label; + } + unrolling_18_loop: ; + if (j == 0) goto zero; + if (j == 1) goto un; + goto return_label; + zero: + if (! (j < 5)) goto unrolling_50_loop; + un_unrolling_56_loop: j ++; + unrolling_55_loop: ; + if (! (j < 5)) goto unrolling_50_loop; + un_unrolling_54_loop: j ++; + unrolling_53_loop: ; + if (! (j < 5)) goto unrolling_50_loop; + un_unrolling_52_loop: j ++; + unrolling_51_loop: ; + /*@ loop pragma UNROLL 3; + loop pragma UNROLL "done", 3; */ + while (j < 5) un: j ++; + unrolling_50_loop: ; + return_label: return; +} + +void main2(void) +{ + int i; + i = 0; + if (! (i < 2)) goto unrolling_58_loop; + { + int j_unroll_186; + j_unroll_186 = 0; + while (j_unroll_186 < 2) { + i ++; + goto foo_unrolling_62_loop; + i ++; + foo_unrolling_62_loop: ; + j_unroll_186 ++; + } + } + i ++; + unrolling_61_loop: ; + if (! (i < 2)) goto unrolling_58_loop; + { + int j_unroll_178; + j_unroll_178 = 0; + while (j_unroll_178 < 2) { + i ++; + goto foo_unrolling_60_loop; + i ++; + foo_unrolling_60_loop: ; + j_unroll_178 ++; + } + } + i ++; + unrolling_59_loop: ; + /*@ loop pragma UNROLL 2; + loop pragma UNROLL "done", 2; */ + while (i < 2) { + { + int j; + j = 0; + while (j < 2) { + i ++; + goto foo; + i ++; + foo: ; + j ++; + } + } + i ++; + } + unrolling_58_loop: ; + return; +} + +void main2_done(void) +{ + int i; + i = 0; + /*@ loop pragma UNROLL 2; + loop pragma UNROLL "done", 2; */ + while (i < 2) { + { + int j; + j = 0; + if (! (j < 2)) goto unrolling_64_loop; + i ++; + goto foo_unrolling_68_loop; + i ++; + foo_unrolling_68_loop: ; + j ++; + unrolling_67_loop: ; + if (! (j < 2)) goto unrolling_64_loop; + i ++; + goto foo_unrolling_66_loop; + i ++; + foo_unrolling_66_loop: ; + j ++; + unrolling_65_loop: ; + /*@ loop pragma UNROLL 2; + loop pragma UNROLL "done", 2; */ + while (j < 2) { + i ++; + goto foo; + i ++; + foo: ; + j ++; + } + unrolling_64_loop: ; + } + i ++; + } + return; +} + +void main3(int c) +{ + int i; + i = 0; + if (c == 0) goto foo; + if (! (i < 5)) goto unrolling_70_loop; + { + int j_unroll_238; + j_unroll_238 = 0; + if (i == j_unroll_238) goto foo_unrolling_77_loop; + if (i == 1) goto unrolling_70_loop; + if (i == 2) goto __Cont_unrolling_80_loop; + while (j_unroll_238 < 5) { + if (i == j_unroll_238) break; + if (i < j_unroll_238) goto foo_unrolling_77_loop; + if (i == j_unroll_238 + 1) goto __Cont_0_unrolling_78_loop; + if (i == j_unroll_238 + 2) goto up_unrolling_79_loop; + i ++; + foo_unrolling_77_loop: i ++; + __Cont_0_unrolling_78_loop: j_unroll_238 ++; + } + up_unrolling_79_loop: ; + } + __Cont_unrolling_80_loop: i ++; + unrolling_76_loop: ; + if (! (i < 5)) goto unrolling_70_loop; + { + int j_unroll_216; + j_unroll_216 = 0; + if (i == j_unroll_216) goto foo_unrolling_72_loop; + if (i == 1) goto unrolling_70_loop; + if (i == 2) goto __Cont_unrolling_75_loop; + while (j_unroll_216 < 5) { + if (i == j_unroll_216) break; + if (i < j_unroll_216) goto foo_unrolling_72_loop; + if (i == j_unroll_216 + 1) goto __Cont_0_unrolling_73_loop; + if (i == j_unroll_216 + 2) goto up_unrolling_74_loop; + i ++; + foo_unrolling_72_loop: i ++; + __Cont_0_unrolling_73_loop: j_unroll_216 ++; + } + up_unrolling_74_loop: ; + } + __Cont_unrolling_75_loop: i ++; + unrolling_71_loop: ; + /*@ loop pragma UNROLL 2; + loop pragma UNROLL "done", 2; */ + while (i < 5) { + { + int j; + j = 0; + if (i == j) goto foo; + if (i == 1) break; + if (i == 2) goto __Cont; + while (j < 5) { + if (i == j) break; + if (i < j) goto foo; + if (i == j + 1) goto __Cont_0; + if (i == j + 2) goto up; + i ++; + foo: i ++; + __Cont_0: j ++; + } + up: ; + } + __Cont: i ++; + } + unrolling_70_loop: ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/unroll_labels.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unroll_labels.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/unroll_labels.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unroll_labels.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,510 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/unroll_labels.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + foo ∈ [--..--] +tests/syntax/unroll_labels.i:53:[kernel] warning: Non-natural loop detected. +tests/syntax/unroll_labels.i:25:[value] entering loop for the first time +tests/syntax/unroll_labels.i:39:[value] entering loop for the first time +tests/syntax/unroll_labels.i:33:[value] entering loop for the first time +tests/syntax/unroll_labels.i:53:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + j ∈ {-1; 5} +/* Generated by Frama-C */ +enum __anonenum_1 { + SIX = 6 +}; +int volatile foo; +void main(void) +{ + int j; + j = 0; + { + int i; + i = 1; + if (! (i < 4)) goto unrolling_2_loop; + switch (i) { + case 1: j ++; + break; + case 2: j += 3; + break; + case 3: j += 5; + break; + case 4: j += 7; + break; + default: ; + j = 0; + } + i ++; + unrolling_6_loop: ; + if (! (i < 4)) goto unrolling_2_loop; + switch (i) { + case 1: j ++; + break; + case 2: j += 3; + break; + case 3: j += 5; + break; + case 4: j += 7; + break; + default: ; + j = 0; + } + i ++; + unrolling_5_loop: ; + if (! (i < 4)) goto unrolling_2_loop; + switch (i) { + case 1: j ++; + break; + case 2: j += 3; + break; + case 3: j += 5; + break; + case 4: j += 7; + break; + default: ; + j = 0; + } + i ++; + unrolling_4_loop: ; + if (! (i < 4)) goto unrolling_2_loop; + switch (i) { + case 1: j ++; + break; + case 2: j += 3; + break; + case 3: j += 5; + break; + case 4: j += 7; + break; + default: ; + j = 0; + } + i ++; + unrolling_3_loop: ; + /*@ loop invariant \false; + loop pragma UNROLL "completely", 4; + loop pragma UNROLL "done", 4; + */ + while (i < 4) { + switch (i) { + case 1: j ++; + break; + case 2: j += 3; + break; + case 3: j += 5; + break; + case 4: j += 7; + break; + default: ; + j = 0; + } + i ++; + } + unrolling_2_loop: ; + } + { + int x; + x = 0; + L: + if (! (x < 5)) goto unrolling_8_loop; + { + int y_unroll_32; + y_unroll_32 = 0; + x ++; + y_unroll_32 ++; + } + unrolling_11_loop: ; + if (! (x < 5)) goto unrolling_8_loop; + { + int y_unroll_28; + y_unroll_28 = 0; + x ++; + y_unroll_28 ++; + } + unrolling_10_loop: ; + if (! (x < 5)) goto unrolling_8_loop; + { + int y_unroll_24; + y_unroll_24 = 0; + x ++; + y_unroll_24 ++; + } + unrolling_9_loop: ; + /*@ loop pragma UNROLL 3; + loop pragma UNROLL "done", 3; */ + while (x < 5) { + int y; + y = 0; + x ++; + y ++; + } + unrolling_8_loop: ; + } + j = 0; + if (! foo) goto unrolling_18_loop; + switch (j) { + case -1: j ++; + break; + case 0: + if (! (j < 5)) goto unrolling_13_loop_unrolling_48_loop; + j ++; + unrolling_16_loop_unrolling_45_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_48_loop; + j ++; + unrolling_15_loop_unrolling_46_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_48_loop; + j ++; + unrolling_14_loop_unrolling_47_loop: ; + /*@ loop pragma UNROLL "done", 3; + loop pragma UNROLL 3; */ + while (j < 5) j ++; + unrolling_13_loop_unrolling_48_loop: ; + break; + case 5: j = -1; + break; + default: ; + goto return_label; + } + unrolling_44_loop: ; + if (! foo) goto unrolling_18_loop; + switch (j) { + case -1: j ++; + break; + case 0: + if (! (j < 5)) goto unrolling_13_loop_unrolling_43_loop; + j ++; + unrolling_16_loop_unrolling_40_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_43_loop; + j ++; + unrolling_15_loop_unrolling_41_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_43_loop; + j ++; + unrolling_14_loop_unrolling_42_loop: ; + /*@ loop pragma UNROLL "done", 3; + loop pragma UNROLL 3; */ + while (j < 5) j ++; + unrolling_13_loop_unrolling_43_loop: ; + break; + case 5: j = -1; + break; + default: ; + goto return_label; + } + unrolling_39_loop: ; + if (! foo) goto unrolling_18_loop; + switch (j) { + case -1: j ++; + break; + case 0: + if (! (j < 5)) goto unrolling_13_loop_unrolling_38_loop; + j ++; + unrolling_16_loop_unrolling_35_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_38_loop; + j ++; + unrolling_15_loop_unrolling_36_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_38_loop; + j ++; + unrolling_14_loop_unrolling_37_loop: ; + /*@ loop pragma UNROLL "done", 3; + loop pragma UNROLL 3; */ + while (j < 5) j ++; + unrolling_13_loop_unrolling_38_loop: ; + break; + case 5: j = -1; + break; + default: ; + goto return_label; + } + unrolling_34_loop: ; + if (! foo) goto unrolling_18_loop; + switch (j) { + case -1: j ++; + break; + case 0: + if (! (j < 5)) goto unrolling_13_loop_unrolling_33_loop; + j ++; + unrolling_16_loop_unrolling_30_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_33_loop; + j ++; + unrolling_15_loop_unrolling_31_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_33_loop; + j ++; + unrolling_14_loop_unrolling_32_loop: ; + /*@ loop pragma UNROLL "done", 3; + loop pragma UNROLL 3; */ + while (j < 5) j ++; + unrolling_13_loop_unrolling_33_loop: ; + break; + case 5: j = -1; + break; + default: ; + goto return_label; + } + unrolling_29_loop: ; + if (! foo) goto unrolling_18_loop; + switch (j) { + case -1: j ++; + break; + case 0: + if (! (j < 5)) goto unrolling_13_loop_unrolling_28_loop; + j ++; + unrolling_16_loop_unrolling_25_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_28_loop; + j ++; + unrolling_15_loop_unrolling_26_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_28_loop; + j ++; + unrolling_14_loop_unrolling_27_loop: ; + /*@ loop pragma UNROLL "done", 3; + loop pragma UNROLL 3; */ + while (j < 5) j ++; + unrolling_13_loop_unrolling_28_loop: ; + break; + case 5: j = -1; + break; + default: ; + goto return_label; + } + unrolling_24_loop: ; + if (! foo) goto unrolling_18_loop; + switch (j) { + case -1: j ++; + break; + case 0: + if (! (j < 5)) goto unrolling_13_loop_unrolling_23_loop; + j ++; + unrolling_16_loop_unrolling_20_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_23_loop; + j ++; + unrolling_15_loop_unrolling_21_loop: ; + if (! (j < 5)) goto unrolling_13_loop_unrolling_23_loop; + j ++; + unrolling_14_loop_unrolling_22_loop: ; + /*@ loop pragma UNROLL "done", 3; + loop pragma UNROLL 3; */ + while (j < 5) j ++; + unrolling_13_loop_unrolling_23_loop: ; + break; + case 5: j = -1; + break; + default: ; + goto return_label; + } + unrolling_19_loop: ; + /*@ loop pragma UNROLL SIX; + loop pragma UNROLL "done", 6; */ + while (foo) + switch (j) { + case -1: j ++; + break; + case 0: + if (! (j < 5)) goto unrolling_13_loop; + j ++; + unrolling_16_loop: ; + if (! (j < 5)) goto unrolling_13_loop; + j ++; + unrolling_15_loop: ; + if (! (j < 5)) goto unrolling_13_loop; + j ++; + unrolling_14_loop: ; + /*@ loop pragma UNROLL 3; + loop pragma UNROLL "done", 3; */ + while (j < 5) j ++; + unrolling_13_loop: ; + break; + case 5: j = -1; + break; + default: ; + goto return_label; + } + unrolling_18_loop: ; + if (j == 0) goto zero; + if (j == 1) goto un; + goto return_label; + zero: + if (! (j < 5)) goto unrolling_50_loop; + un_unrolling_56_loop: j ++; + unrolling_55_loop: ; + if (! (j < 5)) goto unrolling_50_loop; + un_unrolling_54_loop: j ++; + unrolling_53_loop: ; + if (! (j < 5)) goto unrolling_50_loop; + un_unrolling_52_loop: j ++; + unrolling_51_loop: ; + /*@ loop pragma UNROLL 3; + loop pragma UNROLL "done", 3; */ + while (j < 5) un: j ++; + unrolling_50_loop: ; + return_label: return; +} + +void main2(void) +{ + int i; + i = 0; + if (! (i < 2)) goto unrolling_58_loop; + { + int j_unroll_186; + j_unroll_186 = 0; + while (j_unroll_186 < 2) { + i ++; + goto foo_unrolling_62_loop; + i ++; + foo_unrolling_62_loop: ; + j_unroll_186 ++; + } + } + i ++; + unrolling_61_loop: ; + if (! (i < 2)) goto unrolling_58_loop; + { + int j_unroll_178; + j_unroll_178 = 0; + while (j_unroll_178 < 2) { + i ++; + goto foo_unrolling_60_loop; + i ++; + foo_unrolling_60_loop: ; + j_unroll_178 ++; + } + } + i ++; + unrolling_59_loop: ; + /*@ loop pragma UNROLL 2; + loop pragma UNROLL "done", 2; */ + while (i < 2) { + { + int j; + j = 0; + while (j < 2) { + i ++; + goto foo; + i ++; + foo: ; + j ++; + } + } + i ++; + } + unrolling_58_loop: ; + return; +} + +void main2_done(void) +{ + int i; + i = 0; + /*@ loop pragma UNROLL 2; + loop pragma UNROLL "done", 2; */ + while (i < 2) { + { + int j; + j = 0; + if (! (j < 2)) goto unrolling_64_loop; + i ++; + goto foo_unrolling_68_loop; + i ++; + foo_unrolling_68_loop: ; + j ++; + unrolling_67_loop: ; + if (! (j < 2)) goto unrolling_64_loop; + i ++; + goto foo_unrolling_66_loop; + i ++; + foo_unrolling_66_loop: ; + j ++; + unrolling_65_loop: ; + /*@ loop pragma UNROLL 2; + loop pragma UNROLL "done", 2; */ + while (j < 2) { + i ++; + goto foo; + i ++; + foo: ; + j ++; + } + unrolling_64_loop: ; + } + i ++; + } + return; +} + +void main3(int c) +{ + int i; + i = 0; + if (c == 0) goto foo; + if (! (i < 5)) goto unrolling_70_loop; + { + int j_unroll_238; + j_unroll_238 = 0; + if (i == j_unroll_238) goto foo_unrolling_77_loop; + if (i == 1) goto unrolling_70_loop; + if (i == 2) goto __Cont_unrolling_80_loop; + while (j_unroll_238 < 5) { + if (i == j_unroll_238) break; + if (i < j_unroll_238) goto foo_unrolling_77_loop; + if (i == j_unroll_238 + 1) goto __Cont_0_unrolling_78_loop; + if (i == j_unroll_238 + 2) goto up_unrolling_79_loop; + i ++; + foo_unrolling_77_loop: i ++; + __Cont_0_unrolling_78_loop: j_unroll_238 ++; + } + up_unrolling_79_loop: ; + } + __Cont_unrolling_80_loop: i ++; + unrolling_76_loop: ; + if (! (i < 5)) goto unrolling_70_loop; + { + int j_unroll_216; + j_unroll_216 = 0; + if (i == j_unroll_216) goto foo_unrolling_72_loop; + if (i == 1) goto unrolling_70_loop; + if (i == 2) goto __Cont_unrolling_75_loop; + while (j_unroll_216 < 5) { + if (i == j_unroll_216) break; + if (i < j_unroll_216) goto foo_unrolling_72_loop; + if (i == j_unroll_216 + 1) goto __Cont_0_unrolling_73_loop; + if (i == j_unroll_216 + 2) goto up_unrolling_74_loop; + i ++; + foo_unrolling_72_loop: i ++; + __Cont_0_unrolling_73_loop: j_unroll_216 ++; + } + up_unrolling_74_loop: ; + } + __Cont_unrolling_75_loop: i ++; + unrolling_71_loop: ; + /*@ loop pragma UNROLL 2; + loop pragma UNROLL "done", 2; */ + while (i < 5) { + { + int j; + j = 0; + if (i == j) goto foo; + if (i == 1) break; + if (i == 2) goto __Cont; + while (j < 5) { + if (i == j) break; + if (i < j) goto foo; + if (i == j + 1) goto __Cont_0; + if (i == j + 2) goto up; + i ++; + foo: i ++; + __Cont_0: j ++; + } + up: ; + } + __Cont: i ++; + } + unrolling_70_loop: ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/unroll_property_status_bts1442.1.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unroll_property_status_bts1442.1.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/unroll_property_status_bts1442.1.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unroll_property_status_bts1442.1.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/unroll_property_status_bts1442.i (no preprocessing) +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'Frama_C_bzero' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file share/libc/__fc_builtin_for_normalization.i, line 32) + Unverifiable but considered Valid. +[ Extern ] Assigns (file share/libc/__fc_builtin_for_normalization.i, line 31) + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/__fc_builtin_for_normalization.i, line 31) + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main1' +-------------------------------------------------------------------------------- + +[ Valid ] Post-condition for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Post-condition for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Post-condition for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Post-condition for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Post-condition for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Post-condition for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Post-condition for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Post-condition for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Assigns for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Behavior 'Frama_C_implicit_init' at block + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 11 Completely validated + 3 Considered valid + 14 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/unroll_property_status_bts1442.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unroll_property_status_bts1442.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/unroll_property_status_bts1442.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unroll_property_status_bts1442.res.oracle 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,49 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/unroll_property_status_bts1442.i (no preprocessing) +[report] Computing properties status... + +-------------------------------------------------------------------------------- +--- Properties of Function 'Frama_C_bzero' +-------------------------------------------------------------------------------- + +[ Extern ] Post-condition (file share/libc/__fc_builtin_for_normalization.i, line 32) + Unverifiable but considered Valid. +[ Extern ] Assigns (file share/libc/__fc_builtin_for_normalization.i, line 31) + Unverifiable but considered Valid. +[ Extern ] Froms (file share/libc/__fc_builtin_for_normalization.i, line 31) + Unverifiable but considered Valid. +[ Valid ] Default behavior + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Properties of Function 'main1' +-------------------------------------------------------------------------------- + +[ Valid ] Post-condition for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Post-condition for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Post-condition for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Post-condition for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Post-condition for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Post-condition for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Post-condition for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Post-condition for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Assigns for 'Frama_C_implicit_init' (file tests/syntax/unroll_property_status_bts1442.i, line 19) at block + by Frama-C kernel. +[ Valid ] Behavior 'Frama_C_implicit_init' at block + by Frama-C kernel. + +-------------------------------------------------------------------------------- +--- Status Report Summary +-------------------------------------------------------------------------------- + 11 Completely validated + 3 Considered valid + 14 Total +-------------------------------------------------------------------------------- diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/unroll_visit.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unroll_visit.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/unroll_visit.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unroll_visit.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,55 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/unroll_visit.i (no preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + +tests/syntax/unroll_visit.i:8:[value] Assertion got status valid. +tests/syntax/unroll_visit.i:6:[value] entering loop for the first time +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function main: + i ∈ {100} +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function main: + NO EFFECTS +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function main: + i +[inout] Inputs for function main: + \nothing +/* Generated by Frama-C */ +void main(void) +{ + int i; + i = 0; + if (! (i < 100)) goto unrolling_2_loop; + i --; + /*@ assert i < 100; */ ; + i ++; + i ++; + unrolling_4_loop: ; + if (! (i < 100)) goto unrolling_2_loop; + i --; + /*@ assert i < 100; */ ; + i ++; + i ++; + unrolling_3_loop: ; + /*@ loop pragma UNROLL 2; + loop pragma UNROLL "done", 2; */ + while (i < 100) { + i --; + /*@ assert i < 100; */ ; + i ++; + i ++; + } + unrolling_2_loop: ; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/unspecified_access_call_bts0888.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unspecified_access_call_bts0888.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/unspecified_access_call_bts0888.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unspecified_access_call_bts0888.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,60 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/unspecified_access_call_bts0888.i (no preprocessing) +tests/syntax/unspecified_access_call_bts0888.i:9:[kernel] warning: Unspecified sequence with side effect: + /* y x <- */ + y = 2; + x = f(y); + /* z <- */ + z = 3; + /* y <- */ + y = x + z; +tests/syntax/unspecified_access_call_bts0888.i:10:[kernel] warning: Unspecified sequence with side effect: + /* y x <- */ + y = 2; + x = f(y); + /* z <- y */ + z = x + y; +tests/syntax/unspecified_access_call_bts0888.i:11:[kernel] warning: Unspecified sequence with side effect: + /* y x <- */ + y = 2; + x = f(y); + /* y <- */ + y = 3; + /* y <- */ + y = x + y; +/* Generated by Frama-C */ +extern int f(int); + +int main(void) +{ + int __retres; + int x; + int y; + int z; + x = 2; + x = f(x); + { + /*sequence*/ + y = 2; + x = f(y); + z = 3; + y = x + z; + } + { + /*sequence*/ + y = 2; + x = f(y); + z = x + y; + } + { + /*sequence*/ + y = 2; + x = f(y); + y = 3; + y = x + y; + } + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/unspecified_access_if_bts01114.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unspecified_access_if_bts01114.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/unspecified_access_if_bts01114.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unspecified_access_if_bts01114.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,19 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/unspecified_access_if_bts01114.i (no preprocessing) +/* Generated by Frama-C */ +int x; +int *p; +int main(void) +{ + int __retres; + int tmp; + p = & x; + *p = *p < 3; + tmp = *p < 3; + *p = tmp; + if (tmp) x = 4; + __retres = 0; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/unspecified_access_ptr_bts1519.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unspecified_access_ptr_bts1519.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/unspecified_access_ptr_bts1519.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unspecified_access_ptr_bts1519.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,38 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/unspecified_access_ptr_bts1519.i (no preprocessing) +/* Generated by Frama-C */ +int t[10]; +int u[10]; +int v[10]; +int i = 4; +int j = 0; +void main(void) +{ + int *p1; + int *p2; + int tmp; + int tmp_0; + p1 = & v[i]; + p2 = & v[j]; + { + /*sequence*/ + tmp = *p1; + /*effects: (t[i]) <- */ + (*p1) ++; + /*effects: (t[i]) *p1 <- p1*/ + t[i] += tmp + *p2; + /*effects: (t[i]) t[i] <- i, tmp, *p2, p2*/ + } + { + /*sequence*/ + tmp_0 = v[i]; + /*effects: (t[i]) <- */ + (v[i]) ++; + /*effects: (t[i]) v[i] <- i*/ + t[i] += tmp_0 + v[j]; + /*effects: (t[i]) t[i] <- i, tmp_0, v[j], j*/ + } + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/unspecified_access_struct.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unspecified_access_struct.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/unspecified_access_struct.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/unspecified_access_struct.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,27 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/unspecified_access_struct.i (no preprocessing) +/* Generated by Frama-C */ +struct S { + int f ; +}; +int main(void) +{ + int __retres; + struct S s1; + struct S s2; + struct S s3; + struct S s4; + struct S s5; + s1.f = 0; + { + /*sequence*/ + s5.f = s1.f; + s4.f = s5.f; + s3.f = s4.f; + s2.f = s3.f; + } + __retres = s2.f; + return __retres; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/variadic.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/variadic.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/variadic.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/variadic.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,34 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/variadic.i (no preprocessing) +tests/syntax/variadic.i:20:[kernel] warning: Calling undeclared function f. Old style K&R code? +/* Generated by Frama-C */ +typedef char tt; +struct T { + int a ; +}; +extern int normal(int n); + +extern int vf(int x , ...); + +struct T st; +tt abstract; +unsigned char uchar; +signed char chr; +unsigned short ushort; +unsigned long long ll; +long double ld; +double d; +extern void h(int x_0, int x_1); + +extern int ( /* missing proto */ f)(int x_0, int x_1); + +void g(void) +{ + vf(1,1u,(int)uchar,(double)3.0f,(int)ushort,ll,(int)abstract,st,ld,d); + f(1,(int)uchar); + h(1,(int)uchar); + normal((int)uchar); + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/vdefined_bts1241.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/vdefined_bts1241.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/vdefined_bts1241.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/vdefined_bts1241.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,37 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/vdefined_bts1241.i (no preprocessing) +[kernel] Parsing tests/syntax/vdefined_bts1241_1.i (no preprocessing) +/* Generated by Frama-C */ +int f(void); + +int g(void) +{ + int __retres; + __retres = 0; + return __retres; +} + +int f(void) +{ + int __retres; + __retres = 1; + return __retres; +} + +int h(void); + +int h1(void) +{ + int tmp; + tmp = h(); + return tmp; +} + +int h(void) +{ + int tmp; + tmp = f(); + return tmp; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/vdescr_bts1387.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/vdescr_bts1387.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/vdescr_bts1387.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/vdescr_bts1387.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,30 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/vdescr_bts1387.i (no preprocessing) +[kernel] Variable Frama_C_bzero has vdescr '' +[kernel] Variable dest has vdescr '' +[kernel] Variable n has vdescr '' +[kernel] Variable Frama_C_copy_block has vdescr '' +[kernel] Variable dest has vdescr '' +[kernel] Variable size has vdescr '' +[kernel] Variable n has vdescr '' +[kernel] Variable f has vdescr '' +[kernel] Variable has vdescr '' +[kernel] Variable g has vdescr '' +[kernel] Variable has vdescr '' +[kernel] Variable fptr has vdescr '' +[kernel] Variable main has vdescr '' +[kernel] Variable a has vdescr '' +[kernel] Variable b has vdescr '' +[kernel] Variable c has vdescr '' +[kernel] Variable d has vdescr '' +[kernel] Variable p has vdescr '' +[kernel] Variable t has vdescr '' +[kernel] Variable tmp has vdescr 'j++' +[kernel] Variable tmp_0 has vdescr 'p++' +[kernel] Variable tmp_1 has vdescr 'p++' +[kernel] Variable tmp_2 has vdescr 'f(j)' +[kernel] Variable tmp_3 has vdescr 'g(j)' +[kernel] Variable tmp_4 has vdescr 'k?& j:(int *)0' +[kernel] Variable l has vdescr '' +[kernel] Variable j has vdescr '' +[kernel] Variable k has vdescr '' diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/oracle/visit_create_local.res.oracle frama-c-20150201+sodium+dfsg/tests/syntax/oracle/visit_create_local.res.oracle --- frama-c-20140301+neon+dfsg/tests/syntax/oracle/visit_create_local.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/oracle/visit_create_local.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,14 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/syntax/visit_create_local.i (no preprocessing) +/* Generated by Frama-C */ +void main(void) +{ + int varbidon; + int x; + int y; + varbidon = x; + x = y; + return; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/Refresh_visitor.i frama-c-20150201+sodium+dfsg/tests/syntax/Refresh_visitor.i --- frama-c-20140301+neon+dfsg/tests/syntax/Refresh_visitor.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/Refresh_visitor.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,15 @@ +/* run.config +EXECNOW: make -s @PTEST_DIR@/@PTEST_NAME@.cmxs +OPT: -check -load-module @PTEST_DIR@/@PTEST_NAME@ +*/ + +struct S { int i; }; + +/*@ lemma foo: \forall struct S x; x.i >= 0 || x.i < 0; */ + +/*@ ensures \result >= x.i; */ +int main(struct S x) { + int y = x.i; + /*@ assert y == x.i; */ + return y; +} diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/Refresh_visitor.ml frama-c-20150201+sodium+dfsg/tests/syntax/Refresh_visitor.ml --- frama-c-20140301+neon+dfsg/tests/syntax/Refresh_visitor.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/Refresh_visitor.ml 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,76 @@ +open Cil_types +open Cil + +let category = Kernel.register_category "refresh-test" + +module Check(M: Datatype.S_with_collections) = +struct + let check cat fold bhv = + let f o c (orig, copy) = M.Set.add o orig, M.Set.add c copy in + let (orig,copy) = fold bhv f (M.Set.empty, M.Set.empty) in + let common = M.Set.inter orig copy in + if not (M.Set.is_empty common) then begin + Format.printf "ids for %s are not properly refreshed.@." cat; + end; + orig, copy, common +end + +module CheckVarinfo = Check(Cil_datatype.Varinfo) + +module CheckCompinfo = Check(Cil_datatype.Compinfo) + +module CheckStmt = Check (Cil_datatype.Stmt) + +module CheckLogic_var = Check(Cil_datatype.Logic_var) + +let main () = + Ast.compute (); + let p = Project.create "p" in + let vis = new Visitor.frama_c_refresh p in + Format.printf "Start@."; + File.init_project_from_visitor p vis; + Cil_datatype.( + let orig_id, copy_id, shared_id = + CheckVarinfo.check "varinfo" fold_visitor_varinfo vis#behavior + in + if Kernel.is_debug_key_enabled category then begin + Varinfo.Set.iter + (fun x -> + Format.printf "variable id %d (%s) is in orig@." x.vid x.vname) + orig_id; + Varinfo.Set.iter + (fun x -> + Format.printf "variable id %d (%s) is in copy@." x.vid x.vname) + copy_id; + Varinfo.Set.iter + (fun x -> Format.printf "variable id %d (%s) is reused@." x.vid x.vname) + shared_id; + end; + let _ = + CheckCompinfo.check "compinfo" fold_visitor_compinfo vis#behavior + in + let _ = + CheckStmt.check "stmt" fold_visitor_stmt vis#behavior; + in + let orig_id, copy_id, shared_id = + CheckLogic_var.check "logic var" fold_visitor_logic_var vis#behavior + in + if Kernel.is_debug_key_enabled category then begin + Logic_var.Set.iter + (fun x -> Format.printf "logic variable id %d (%s) is in orig@." + x.lv_id x.lv_name) + orig_id; + Logic_var.Set.iter + (fun x -> Format.printf "logic variable id %d (%s) is in copy@." + x.lv_id x.lv_name) + copy_id; + Logic_var.Set.iter + (fun x -> Format.printf "logic variable id %d (%s) is reused@." + x.lv_id x.lv_name) + shared_id; + end + ); + Project.on p !Db.Value.compute (); + File.pretty_ast ~prj:p () + +let () = Db.Main.extend main diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/test_config frama-c-20150201+sodium+dfsg/tests/syntax/test_config --- frama-c-20140301+neon+dfsg/tests/syntax/test_config 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/test_config 2015-05-29 15:31:43.000000000 +0000 @@ -0,0 +1,4 @@ +COMMENT: this directory is meant to test exclusively the front-end +COMMENT: (parser, type-checker, linker, syntactic transformations) +CMD: FRAMAC_PLUGIN=tests/.empty @frama-c@ +OPT: -print -journal-disable -check diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/undeclared_local_bts1113.c frama-c-20150201+sodium+dfsg/tests/syntax/undeclared_local_bts1113.c --- frama-c-20140301+neon+dfsg/tests/syntax/undeclared_local_bts1113.c 2014-03-12 15:07:51.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/undeclared_local_bts1113.c 2015-05-28 08:53:24.000000000 +0000 @@ -2,6 +2,7 @@ { int k[2*rounds]; int i; + int kk[2*rounds]; for (i = 0; i < 2*rounds; i++) { diff -Nru frama-c-20140301+neon+dfsg/tests/syntax/unroll_const.i frama-c-20150201+sodium+dfsg/tests/syntax/unroll_const.i --- frama-c-20140301+neon+dfsg/tests/syntax/unroll_const.i 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/syntax/unroll_const.i 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,66 @@ +const int t[4] = { 4, 2 }; + +const struct { int i1; int i2;} u[3] = { 2, 5, 3, 7}; + +struct s { + int i; + int j ; + struct v { int k; int l;} v; +}; + +const struct s s = { 5, 8, 3 }; + +struct T; + +volatile int c; + +void main() { + unsigned int i = 0; + + //@ loop pragma UNROLL sizeof(t)/sizeof(t[0]); // 4 + while (c) { + i++; + } + + //@ loop pragma UNROLL \offset(&s.v.l); // 12 + while (c) { + i++; + } + + //@ loop pragma UNROLL s.i + s.v.l; // 5+0 + while (c) { + i++; + } + + + //@ loop pragma UNROLL \max(t[..]); // 4 + while (c) { + i++; + } + + //@ loop pragma UNROLL \min(t[..]); // 0 because of missing initializer + while (c) { + i++; + } + + //@ loop pragma UNROLL \max(\union(1, 1+s.i)); // 6 + while (c) { + i++; + } + + + //@ loop pragma UNROLL \min(t[\union(1, 3)]) + \max(t[\union(1, 3)]); // 2+0 + while (c) { + i++; + } + + //@ loop pragma UNROLL \min(u[..1].i1) * \max(u[..1].i1); // 2*3 + while (c) { + i++; + } + + + +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/test/oracle/adpcm.res.oracle frama-c-20150201+sodium+dfsg/tests/test/oracle/adpcm.res.oracle --- frama-c-20140301+neon+dfsg/tests/test/oracle/adpcm.res.oracle 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/test/oracle/adpcm.res.oracle 2015-05-28 08:53:24.000000000 +0000 @@ -0,0 +1,1834 @@ +[kernel] Parsing share/libc/__fc_builtin_for_normalization.i (no preprocessing) +[kernel] Parsing tests/test/adpcm.c (with preprocessing) +[value] Analyzing a complete application starting at main +[value] Computing initial state +[value] Initial state computed +[value] Values of globals at initialization + tqmf[0..23] ∈ {0} + h[0] ∈ {12} + [1..2] ∈ {-44} + [3] ∈ {212} + [4] ∈ {48} + [5] ∈ {-624} + [6] ∈ {128} + [7] ∈ {1448} + [8] ∈ {-840} + [9] ∈ {-3220} + [10] ∈ {3804} + [11..12] ∈ {15504} + [13] ∈ {3804} + [14] ∈ {-3220} + [15] ∈ {-840} + [16] ∈ {1448} + [17] ∈ {128} + [18] ∈ {-624} + [19] ∈ {48} + [20] ∈ {212} + [21..22] ∈ {-44} + [23] ∈ {12} + xl ∈ {0} + xh ∈ {0} + accumc[0..10] ∈ {0} + accumd[0..10] ∈ {0} + xout1 ∈ {0} + xout2 ∈ {0} + xs ∈ {0} + xd ∈ {0} + il ∈ {0} + szl ∈ {0} + spl ∈ {0} + sl ∈ {0} + el ∈ {0} + qq4_code4_table[0] ∈ {0} + [1] ∈ {-20456} + [2] ∈ {-12896} + [3] ∈ {-8968} + [4] ∈ {-6288} + [5] ∈ {-4240} + [6] ∈ {-2584} + [7] ∈ {-1200} + [8] ∈ {20456} + [9] ∈ {12896} + [10] ∈ {8968} + [11] ∈ {6288} + [12] ∈ {4240} + [13] ∈ {2584} + [14] ∈ {1200} + [15] ∈ {0} + qq5_code5_table[0..1] ∈ {-280} + [2] ∈ {-23352} + [3] ∈ {-17560} + [4] ∈ {-14120} + [5] ∈ {-11664} + [6] ∈ {-9752} + [7] ∈ {-8184} + [8] ∈ {-6864} + [9] ∈ {-5712} + [10] ∈ {-4696} + [11] ∈ {-3784} + [12] ∈ {-2960} + [13] ∈ {-2208} + [14] ∈ {-1520} + [15] ∈ {-880} + [16] ∈ {23352} + [17] ∈ {17560} + [18] ∈ {14120} + [19] ∈ {11664} + [20] ∈ {9752} + [21] ∈ {8184} + [22] ∈ {6864} + [23] ∈ {5712} + [24] ∈ {4696} + [25] ∈ {3784} + [26] ∈ {2960} + [27] ∈ {2208} + [28] ∈ {1520} + [29] ∈ {880} + [30] ∈ {280} + [31] ∈ {-280} + qq6_code6_table[0..3] ∈ {-136} + [4] ∈ {-24808} + [5] ∈ {-21904} + [6] ∈ {-19008} + [7] ∈ {-16704} + [8] ∈ {-14984} + [9] ∈ {-13512} + [10] ∈ {-12280} + [11] ∈ {-11192} + [12] ∈ {-10232} + [13] ∈ {-9360} + [14] ∈ {-8576} + [15] ∈ {-7856} + [16] ∈ {-7192} + [17] ∈ {-6576} + [18] ∈ {-6000} + [19] ∈ {-5456} + [20] ∈ {-4944} + [21] ∈ {-4464} + [22] ∈ {-4008} + [23] ∈ {-3576} + [24] ∈ {-3168} + [25] ∈ {-2776} + [26] ∈ {-2400} + [27] ∈ {-2032} + [28] ∈ {-1688} + [29] ∈ {-1360} + [30] ∈ {-1040} + [31] ∈ {-728} + [32] ∈ {24808} + [33] ∈ {21904} + [34] ∈ {19008} + [35] ∈ {16704} + [36] ∈ {14984} + [37] ∈ {13512} + [38] ∈ {12280} + [39] ∈ {11192} + [40] ∈ {10232} + [41] ∈ {9360} + [42] ∈ {8576} + [43] ∈ {7856} + [44] ∈ {7192} + [45] ∈ {6576} + [46] ∈ {6000} + [47] ∈ {5456} + [48] ∈ {4944} + [49] ∈ {4464} + [50] ∈ {4008} + [51] ∈ {3576} + [52] ∈ {3168} + [53] ∈ {2776} + [54] ∈ {2400} + [55] ∈ {2032} + [56] ∈ {1688} + [57] ∈ {1360} + [58] ∈ {1040} + [59] ∈ {728} + [60] ∈ {432} + [61] ∈ {136} + [62] ∈ {-432} + [63] ∈ {-136} + delay_bpl[0..5] ∈ {0} + delay_dltx[0..5] ∈ {0} + wl_code_table[0] ∈ {-60} + [1] ∈ {3042} + [2] ∈ {1198} + [3] ∈ {538} + [4] ∈ {334} + [5] ∈ {172} + [6] ∈ {58} + [7] ∈ {-30} + [8] ∈ {3042} + [9] ∈ {1198} + [10] ∈ {538} + [11] ∈ {334} + [12] ∈ {172} + [13] ∈ {58} + [14] ∈ {-30} + [15] ∈ {-60} + wl_table[0] ∈ {-60} + [1] ∈ {-30} + [2] ∈ {58} + [3] ∈ {172} + [4] ∈ {334} + [5] ∈ {538} + [6] ∈ {1198} + [7] ∈ {3042} + ilb_table[0] ∈ {2048} + [1] ∈ {2093} + [2] ∈ {2139} + [3] ∈ {2186} + [4] ∈ {2233} + [5] ∈ {2282} + [6] ∈ {2332} + [7] ∈ {2383} + [8] ∈ {2435} + [9] ∈ {2489} + [10] ∈ {2543} + [11] ∈ {2599} + [12] ∈ {2656} + [13] ∈ {2714} + [14] ∈ {2774} + [15] ∈ {2834} + [16] ∈ {2896} + [17] ∈ {2960} + [18] ∈ {3025} + [19] ∈ {3091} + [20] ∈ {3158} + [21] ∈ {3228} + [22] ∈ {3298} + [23] ∈ {3371} + [24] ∈ {3444} + [25] ∈ {3520} + [26] ∈ {3597} + [27] ∈ {3676} + [28] ∈ {3756} + [29] ∈ {3838} + [30] ∈ {3922} + [31] ∈ {4008} + nbl ∈ {0} + al1 ∈ {0} + al2 ∈ {0} + plt ∈ {0} + plt1 ∈ {0} + plt2 ∈ {0} + rs ∈ {0} + dlt ∈ {0} + rlt ∈ {0} + rlt1 ∈ {0} + rlt2 ∈ {0} + decis_levl[0] ∈ {280} + [1] ∈ {576} + [2] ∈ {880} + [3] ∈ {1200} + [4] ∈ {1520} + [5] ∈ {1864} + [6] ∈ {2208} + [7] ∈ {2584} + [8] ∈ {2960} + [9] ∈ {3376} + [10] ∈ {3784} + [11] ∈ {4240} + [12] ∈ {4696} + [13] ∈ {5200} + [14] ∈ {5712} + [15] ∈ {6288} + [16] ∈ {6864} + [17] ∈ {7520} + [18] ∈ {8184} + [19] ∈ {8968} + [20] ∈ {9752} + [21] ∈ {10712} + [22] ∈ {11664} + [23] ∈ {12896} + [24] ∈ {14120} + [25] ∈ {15840} + [26] ∈ {17560} + [27] ∈ {20456} + [28] ∈ {23352} + [29] ∈ {32767} + detl ∈ {0} + quant26bt_pos[0] ∈ {61} + [1] ∈ {60} + [2] ∈ {59} + [3] ∈ {58} + [4] ∈ {57} + [5] ∈ {56} + [6] ∈ {55} + [7] ∈ {54} + [8] ∈ {53} + [9] ∈ {52} + [10] ∈ {51} + [11] ∈ {50} + [12] ∈ {49} + [13] ∈ {48} + [14] ∈ {47} + [15] ∈ {46} + [16] ∈ {45} + [17] ∈ {44} + [18] ∈ {43} + [19] ∈ {42} + [20] ∈ {41} + [21] ∈ {40} + [22] ∈ {39} + [23] ∈ {38} + [24] ∈ {37} + [25] ∈ {36} + [26] ∈ {35} + [27] ∈ {34} + [28] ∈ {33} + [29..30] ∈ {32} + quant26bt_neg[0] ∈ {63} + [1] ∈ {62} + [2] ∈ {31} + [3] ∈ {30} + [4] ∈ {29} + [5] ∈ {28} + [6] ∈ {27} + [7] ∈ {26} + [8] ∈ {25} + [9] ∈ {24} + [10] ∈ {23} + [11] ∈ {22} + [12] ∈ {21} + [13] ∈ {20} + [14] ∈ {19} + [15] ∈ {18} + [16] ∈ {17} + [17] ∈ {16} + [18] ∈ {15} + [19] ∈ {14} + [20] ∈ {13} + [21] ∈ {12} + [22] ∈ {11} + [23] ∈ {10} + [24] ∈ {9} + [25] ∈ {8} + [26] ∈ {7} + [27] ∈ {6} + [28] ∈ {5} + [29..30] ∈ {4} + deth ∈ {0} + sh ∈ {0} + eh ∈ {0} + qq2_code2_table[0] ∈ {-7408} + [1] ∈ {-1616} + [2] ∈ {7408} + [3] ∈ {1616} + wh_code_table[0] ∈ {798} + [1] ∈ {-214} + [2] ∈ {798} + [3] ∈ {-214} + dh ∈ {0} + ih ∈ {0} + nbh ∈ {0} + szh ∈ {0} + sph ∈ {0} + ph ∈ {0} + yh ∈ {0} + rh ∈ {0} + delay_dhx[0..5] ∈ {0} + delay_bph[0..5] ∈ {0} + ah1 ∈ {0} + ah2 ∈ {0} + ph1 ∈ {0} + ph2 ∈ {0} + rh1 ∈ {0} + rh2 ∈ {0} + ilr ∈ {0} + yl ∈ {0} + rl ∈ {0} + dec_deth ∈ {0} + dec_detl ∈ {0} + dec_dlt ∈ {0} + dec_del_bpl[0..5] ∈ {0} + dec_del_dltx[0..5] ∈ {0} + dec_plt ∈ {0} + dec_plt1 ∈ {0} + dec_plt2 ∈ {0} + dec_szl ∈ {0} + dec_spl ∈ {0} + dec_sl ∈ {0} + dec_rlt1 ∈ {0} + dec_rlt2 ∈ {0} + dec_rlt ∈ {0} + dec_al1 ∈ {0} + dec_al2 ∈ {0} + dl ∈ {0} + dec_nbl ∈ {0} + dec_yh ∈ {0} + dec_dh ∈ {0} + dec_nbh ∈ {0} + dec_del_bph[0..5] ∈ {0} + dec_del_dhx[0..5] ∈ {0} + dec_szh ∈ {0} + dec_rh1 ∈ {0} + dec_rh2 ∈ {0} + dec_ah1 ∈ {0} + dec_ah2 ∈ {0} + dec_ph ∈ {0} + dec_sph ∈ {0} + dec_sh ∈ {0} + dec_rh ∈ {0} + dec_ph1 ∈ {0} + dec_ph2 ∈ {0} + test_data[0] ∈ {1} + [1] ∈ {0} + [2] ∈ {1} + [3] ∈ {0} + [4..9] ∈ {1} + compressed[0..9] ∈ {0} +[value] computing for function encode <- main. + Called from tests/test/adpcm.c:608. +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:301. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:304. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function quantl <- encode <- main. + Called from tests/test/adpcm.c:311. +[value] computing for function abs <- quantl <- encode <- main. + Called from tests/test/adpcm.c:444. +[value] Recording results for abs +[value] Done for function abs +[value] Recording results for quantl +[value] Done for function quantl +[value] computing for function logscl <- encode <- main. + Called from tests/test/adpcm.c:318. +[value] Recording results for logscl +[value] Done for function logscl +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:322. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:331. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:335. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:339. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:352. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:354. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function abs <- encode <- main. + Called from tests/test/adpcm.c:370. +[value] Recording results for abs +[value] Done for function abs +[value] computing for function logsch <- encode <- main. + Called from tests/test/adpcm.c:376. +[value] Recording results for logsch +[value] Done for function logsch +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:379. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:387. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:391. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:394. +[value] Recording results for uppol1 +[value] Done for function uppol1 +tests/test/adpcm.c:262:[value] Function encode: postcondition got status valid. +[value] Recording results for encode +[value] Done for function encode +[value] computing for function encode <- main. + Called from tests/test/adpcm.c:608. +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:301. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:304. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function quantl <- encode <- main. + Called from tests/test/adpcm.c:311. +[value] computing for function abs <- quantl <- encode <- main. + Called from tests/test/adpcm.c:444. +[value] Recording results for abs +[value] Done for function abs +[value] Recording results for quantl +[value] Done for function quantl +[value] computing for function logscl <- encode <- main. + Called from tests/test/adpcm.c:318. +[value] Recording results for logscl +[value] Done for function logscl +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:322. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:331. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:335. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:339. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:352. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:354. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function abs <- encode <- main. + Called from tests/test/adpcm.c:370. +[value] Recording results for abs +[value] Done for function abs +[value] computing for function logsch <- encode <- main. + Called from tests/test/adpcm.c:376. +[value] Recording results for logsch +[value] Done for function logsch +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:379. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:387. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:391. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:394. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] Recording results for encode +[value] Done for function encode +[value] computing for function encode <- main. + Called from tests/test/adpcm.c:608. +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:301. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:304. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function quantl <- encode <- main. + Called from tests/test/adpcm.c:311. +[value] computing for function abs <- quantl <- encode <- main. + Called from tests/test/adpcm.c:444. +[value] Recording results for abs +[value] Done for function abs +[value] Recording results for quantl +[value] Done for function quantl +[value] computing for function logscl <- encode <- main. + Called from tests/test/adpcm.c:318. +[value] Recording results for logscl +[value] Done for function logscl +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:322. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:331. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:335. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:339. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:352. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:354. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function abs <- encode <- main. + Called from tests/test/adpcm.c:370. +[value] Recording results for abs +[value] Done for function abs +[value] computing for function logsch <- encode <- main. + Called from tests/test/adpcm.c:376. +[value] Recording results for logsch +[value] Done for function logsch +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:379. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:387. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:391. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:394. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] Recording results for encode +[value] Done for function encode +[value] computing for function encode <- main. + Called from tests/test/adpcm.c:608. +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:301. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:304. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function quantl <- encode <- main. + Called from tests/test/adpcm.c:311. +[value] computing for function abs <- quantl <- encode <- main. + Called from tests/test/adpcm.c:444. +[value] Recording results for abs +[value] Done for function abs +[value] Recording results for quantl +[value] Done for function quantl +[value] computing for function logscl <- encode <- main. + Called from tests/test/adpcm.c:318. +[value] Recording results for logscl +[value] Done for function logscl +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:322. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:331. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:335. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:339. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:352. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:354. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function abs <- encode <- main. + Called from tests/test/adpcm.c:370. +[value] Recording results for abs +[value] Done for function abs +[value] computing for function logsch <- encode <- main. + Called from tests/test/adpcm.c:376. +[value] Recording results for logsch +[value] Done for function logsch +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:379. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:387. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:391. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:394. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] Recording results for encode +[value] Done for function encode +[value] computing for function encode <- main. + Called from tests/test/adpcm.c:608. +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:301. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:304. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function quantl <- encode <- main. + Called from tests/test/adpcm.c:311. +[value] computing for function abs <- quantl <- encode <- main. + Called from tests/test/adpcm.c:444. +[value] Recording results for abs +[value] Done for function abs +[value] Recording results for quantl +[value] Done for function quantl +[value] computing for function logscl <- encode <- main. + Called from tests/test/adpcm.c:318. +[value] Recording results for logscl +[value] Done for function logscl +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:322. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:331. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:335. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:339. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] computing for function filtez <- encode <- main. + Called from tests/test/adpcm.c:352. +[value] Recording results for filtez +[value] Done for function filtez +[value] computing for function filtep <- encode <- main. + Called from tests/test/adpcm.c:354. +[value] Recording results for filtep +[value] Done for function filtep +[value] computing for function abs <- encode <- main. + Called from tests/test/adpcm.c:370. +[value] Recording results for abs +[value] Done for function abs +[value] computing for function logsch <- encode <- main. + Called from tests/test/adpcm.c:376. +[value] Recording results for logsch +[value] Done for function logsch +[value] computing for function scalel <- encode <- main. + Called from tests/test/adpcm.c:379. +[value] Recording results for scalel +[value] Done for function scalel +[value] computing for function upzero <- encode <- main. + Called from tests/test/adpcm.c:387. +[value] Recording results for upzero +[value] Done for function upzero +[value] computing for function uppol2 <- encode <- main. + Called from tests/test/adpcm.c:391. +[value] Recording results for uppol2 +[value] Done for function uppol2 +[value] computing for function uppol1 <- encode <- main. + Called from tests/test/adpcm.c:394. +[value] Recording results for uppol1 +[value] Done for function uppol1 +[value] Recording results for encode +[value] Done for function encode +[value] Recording results for main +[value] done for function main +[value] ====== VALUES COMPUTED ====== +[value] Values at end of function abs: + m ∈ {0; 1; 2} +[value] Values at end of function filtep: + pl ∈ {-2464; -1146; 0; 47584; 56154} + pl2 ∈ {-2; 0; 98} + __retres ∈ {-1; 0; 1} +[value] Values at end of function filtez: + bpl ∈ {{ &delay_bpl[6] ; &delay_bph[6] }} + dlt_0 ∈ {{ &delay_dltx[6] ; &delay_dhx[6] }} + i ∈ {6} + zl ∈ {-256; -128; 0; 6223; 6272} + __retres ∈ {-1; 0} +[value] Values at end of function logsch: + nbh_0 ∈ {0; 577; 798} + wd ∈ {0; 791} +[value] Values at end of function logscl: + nbl_0 ∈ {2958; 3042; 5869; 5976; 8865} + wd ∈ {0; 2934; 3018; 5823; 5929} +[value] Values at end of function quantl: + ril ∈ {4; 32; 63} + mil ∈ {0; 29} + wd ∈ {0; 1; 2} + decis ∈ {0; 1; 79; 223} +[value] Values at end of function scalel: + wd1 ∈ {0; 9; 10; 12; 14; 15; 27; 29} + wd2 ∈ {0; 1; 2; 4} + wd3 ∈ {1; 10; 11; 28; 29; 79} + __retres ∈ {8; 80; 88; 224; 232; 632} +[value] Values at end of function uppol1: + wd2 ∈ {0; 191; 381; 570; 759} + wd3 ∈ {14790; 14890; 14997; 15046; 15111; 15232} + apl1 ∈ {192; 383; 573; 762; 951} +[value] Values at end of function uppol2: + wd2 ∈ {-24; -18; -12; -6; 0} + wd4 ∈ {-152; 104; 110; 116; 122; 128} + apl2 ∈ {128; 249; 314; 363; 470; 570} +[value] Values at end of function upzero: + delay_bpl[0] ∈ {0; 127; 128; 254} + [1] ∈ {-2; 0; 127; 128} + [2..5] ∈ {0; 127; 128; 254} + delay_dltx[0] ∈ {-140; 0; 49} + [1] ∈ {0; 49} + [2..5] ∈ {0} + delay_dhx[0..1] ∈ {-1; 0; 1} + [2..5] ∈ {0} + delay_bph[0] ∈ {-1; 0; 128} + [1..5] ∈ {0; 128; 254; 255} + i ∈ {6} + wd2 ∈ {128} or UNINITIALIZED + wd3 ∈ {0; 126; 127} or UNINITIALIZED +[value] Values at end of function encode: + tqmf[0] ∈ {0; 1} + [1] ∈ {1} + [2..5] ∈ {0; 1} + [6] ∈ {0} + [7] ∈ {0; 1} + [8] ∈ {0} + [9] ∈ {0; 1} + [10..23] ∈ {0} + xl ∈ {-1; 0} + xh ∈ {-1; 0} + il ∈ {4; 32; 63} + szl ∈ {0} + spl ∈ {0; 1} + sl ∈ {0; 1} + el ∈ {-2; -1; 0} + delay_bpl[0] ∈ {0; 127; 128; 254} + [1] ∈ {-2; 0; 127; 128} + [2..5] ∈ {0; 127; 128; 254} + delay_dltx[0] ∈ {-140; 0; 49} + [1] ∈ {0; 49} + [2..5] ∈ {0} + nbl ∈ {2958; 3042; 5869; 5976; 8865} + al1 ∈ {192; 383; 573; 762; 951} + al2 ∈ {128; 249; 314; 363; 470} + plt ∈ {-140; 0; 49} + plt1 ∈ {-140; 0; 49} + plt2 ∈ {0; 49} + dlt ∈ {-140; 0; 49} + rlt ∈ {-139; 0; 1; 49} + rlt1 ∈ {-139; 0; 1; 49} + rlt2 ∈ {0; 1; 49} + detl ∈ {80; 88; 224; 232; 632} + deth ∈ {8} + sh ∈ {-2; 0} + eh ∈ {-1; 0; 1; 2} + dh ∈ {-1; 0; 1} + ih ∈ {1; 2; 3} + nbh ∈ {0; 577; 798} + szh ∈ {-1; 0} + sph ∈ {-1; 0} + ph ∈ {-1; 0} + yh ∈ {-2; -1; 0} + delay_dhx[0..1] ∈ {-1; 0; 1} + [2..5] ∈ {0} + delay_bph[0] ∈ {-1; 0; 128} + [1..5] ∈ {0; 128; 254; 255} + ah1 ∈ {192; 383; 573; 762; 951} + ah2 ∈ {128; 249; 363; 470; 570} + ph1 ∈ {-1; 0} + ph2 ∈ {-1; 0} + rh1 ∈ {-2; -1; 0} + rh2 ∈ {-1; 0} + i ∈ {22} + h_ptr ∈ {{ &h[24] }} + tqmf_ptr ∈ {{ &tqmf[0] }} + tqmf_ptr1 ∈ {{ &tqmf[-1] }} + xa ∈ {-32; 0; 12} + xb ∈ {-456; -44; 0; 168; 992} + decis ∈ {0; 1} + __retres ∈ {96; 191; 196; 224; 255} +[value] Values at end of function main: + tqmf[0..5] ∈ {1} + [6] ∈ {0} + [7] ∈ {1} + [8] ∈ {0} + [9] ∈ {1} + [10..23] ∈ {0} + xl ∈ {0} + xh ∈ {-1} + il ∈ {4} + szl ∈ {0} + spl ∈ {1} + sl ∈ {1} + el ∈ {-1} + delay_bpl[0] ∈ {254} + [1] ∈ {-2} + [2..5] ∈ {254} + delay_dltx[0] ∈ {-140} + [1..5] ∈ {0} + nbl ∈ {8865} + al1 ∈ {951} + al2 ∈ {314} + plt ∈ {-140} + plt1 ∈ {-140} + plt2 ∈ {0} + dlt ∈ {-140} + rlt ∈ {-139} + rlt1 ∈ {-139} + rlt2 ∈ {1} + detl ∈ {632} + deth ∈ {8} + sh ∈ {-2} + eh ∈ {1} + dh ∈ {0} + ih ∈ {3} + nbh ∈ {577} + szh ∈ {-1} + sph ∈ {-1} + ph ∈ {-1} + yh ∈ {-2} + delay_dhx[0] ∈ {0} + [1] ∈ {1} + [2..5] ∈ {0} + delay_bph[0] ∈ {-1} + [1..5] ∈ {254} + ah1 ∈ {951} + ah2 ∈ {570} + ph1 ∈ {-1} + ph2 ∈ {0} + rh1 ∈ {-2} + rh2 ∈ {-1} + compressed[0] ∈ {224} + [1] ∈ {255} + [2] ∈ {96} + [3] ∈ {191} + [4] ∈ {196} + [5..9] ∈ {0} + i ∈ {10} +[from] Computing for function abs +[from] Done for function abs +[from] Computing for function filtep +[from] Done for function filtep +[from] Computing for function filtez +[from] Done for function filtez +[from] Computing for function logsch +[from] Done for function logsch +[from] Computing for function logscl +[from] Done for function logscl +[from] Computing for function quantl +[from] Done for function quantl +[from] Computing for function scalel +[from] Done for function scalel +[from] Computing for function uppol1 +[from] Done for function uppol1 +[from] Computing for function uppol2 +[from] Done for function uppol2 +[from] Computing for function upzero +[from] Done for function upzero +[from] Computing for function encode +[from] Done for function encode +[from] Computing for function main +[from] Done for function main +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function abs: + \result FROM x +[from] Function filtep: + \result FROM rlt1_0; al1_0; rlt2_0; al2_0 +[from] Function filtez: + \result FROM delay_bpl[0..5]; delay_dltx[0..5]; delay_dhx[0..5]; + delay_bph[0..5]; bpl; dlt_0 +[from] Function logsch: + \result FROM wh_code_table[1..3]; ih_0; nbh_0 +[from] Function logscl: + \result FROM wl_code_table{[1]; [8]; [15]}; il_0; nbl_0 +[from] Function quantl: + \result FROM decis_levl[0..28]; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; el_0; detl_0 +[from] Function scalel: + \result FROM ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl_0; + shift_constant +[from] Function uppol1: + \result FROM al1_0; plt_0; plt1_0 +[from] Function uppol2: + \result FROM al1_0; al2_0; plt_0; plt1_0; plt2_0 +[from] Function upzero: + delay_bpl[0] + FROM delay_bpl[0]; delay_dltx[0]; delay_dhx[0]; delay_bph[0]; + dlt_0; dlti; bli (and SELF) + [1] + FROM delay_bpl[1]; delay_dltx[1]; delay_dhx[1]; delay_bph[1]; + dlt_0; dlti; bli (and SELF) + [2] + FROM delay_bpl[2]; delay_dltx[2]; delay_dhx[2]; delay_bph[2]; + dlt_0; dlti; bli (and SELF) + [3] + FROM delay_bpl[3]; delay_dltx[3]; delay_dhx[3]; delay_bph[3]; + dlt_0; dlti; bli (and SELF) + [4] + FROM delay_bpl[4]; delay_dltx[4]; delay_dhx[4]; delay_bph[4]; + dlt_0; dlti; bli (and SELF) + [5] + FROM delay_bpl[5]; delay_dltx[5]; delay_dhx[5]; delay_bph[5]; + dlt_0; dlti; bli (and SELF) + delay_dltx[0] FROM dlt_0; dlti (and SELF) + [1] FROM delay_dltx[0]; delay_dhx[0]; dlti (and SELF) + [3] FROM delay_dltx[2]; delay_dhx[2]; dlti (and SELF) + [4] FROM delay_dltx[3]; delay_dhx[3]; dlti (and SELF) + [5] FROM delay_dltx[4]; delay_dhx[4]; dlti (and SELF) + delay_dhx[0] FROM dlt_0; dlti (and SELF) + [1] FROM delay_dltx[0]; delay_dhx[0]; dlti (and SELF) + [3] FROM delay_dltx[2]; delay_dhx[2]; dlti (and SELF) + [4] FROM delay_dltx[3]; delay_dhx[3]; dlti (and SELF) + [5] FROM delay_dltx[4]; delay_dhx[4]; dlti (and SELF) + delay_bph[0] + FROM delay_bpl[0]; delay_dltx[0]; delay_dhx[0]; delay_bph[0]; + dlt_0; dlti; bli (and SELF) + [1] + FROM delay_bpl[1]; delay_dltx[1]; delay_dhx[1]; delay_bph[1]; + dlt_0; dlti; bli (and SELF) + [2] + FROM delay_bpl[2]; delay_dltx[2]; delay_dhx[2]; delay_bph[2]; + dlt_0; dlti; bli (and SELF) + [3] + FROM delay_bpl[3]; delay_dltx[3]; delay_dhx[3]; delay_bph[3]; + dlt_0; dlti; bli (and SELF) + [4] + FROM delay_bpl[4]; delay_dltx[4]; delay_dhx[4]; delay_bph[4]; + dlt_0; dlti; bli (and SELF) + [5] + FROM delay_bpl[5]; delay_dltx[5]; delay_dhx[5]; delay_bph[5]; + dlt_0; dlti; bli (and SELF) +[from] Function encode: + tqmf[0] FROM xin2 + [1] FROM xin1 + [2] FROM tqmf[0] + [3] FROM tqmf[1] + [4] FROM tqmf[2] + [5] FROM tqmf[3] + [6] FROM tqmf[4] + [7] FROM tqmf[5] + [8] FROM tqmf[6] + [9] FROM tqmf[7] + [10] FROM tqmf[8] + [11] FROM tqmf[9] + [12] FROM tqmf[10] + [13] FROM tqmf[11] + [14] FROM tqmf[12] + [15] FROM tqmf[13] + [16] FROM tqmf[14] + [17] FROM tqmf[15] + [18] FROM tqmf[16] + [19] FROM tqmf[17] + [20] FROM tqmf[18] + [21] FROM tqmf[19] + [22] FROM tqmf[20] + [23] FROM tqmf[21] + xl FROM tqmf[0..23]; h[0..23] + xh FROM tqmf[0..23]; h[0..23] + il FROM tqmf[0..23]; h[0..23]; delay_bpl[0..5]; delay_dltx[0..5]; al1; + al2; rlt1; rlt2; decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; delay_dhx[0..5]; delay_bph[0..5] + szl FROM delay_bpl[0..5]; delay_dltx[0..5]; delay_dhx[0..5]; + delay_bph[0..5] + spl FROM al1; al2; rlt1; rlt2 + sl FROM delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + delay_dhx[0..5]; delay_bph[0..5] + el FROM tqmf[0..23]; h[0..23]; delay_bpl[0..5]; delay_dltx[0..5]; al1; + al2; rlt1; rlt2; delay_dhx[0..5]; delay_bph[0..5] + delay_bpl[0] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + [1] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + [2] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + [3] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + [4] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + [5] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + delay_dltx[0] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + [1] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; delay_dhx[0..5]; + delay_bph[0..5] (and SELF) + [3] FROM delay_dltx[2]; delay_dhx[2] (and SELF) + [4] FROM delay_dltx[2..3]; delay_dhx[2..3] (and SELF) + [5] FROM delay_dltx[3..4]; delay_dhx[3..4] (and SELF) + nbl FROM tqmf[0..23]; h[0..23]; delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; nbl; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; delay_dhx[0..5]; delay_bph[0..5] + al1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; plt1; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; delay_dhx[0..5]; delay_bph[0..5] + al2 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; plt1; plt2; rlt1; + rlt2; decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; delay_dhx[0..5]; delay_bph[0..5] + plt FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; delay_dhx[0..5]; delay_bph[0..5] + plt1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; delay_dhx[0..5]; delay_bph[0..5] + plt2 FROM plt1 + dlt FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; delay_dhx[0..5]; delay_bph[0..5] + rlt FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; delay_dhx[0..5]; delay_bph[0..5] + rlt1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; delay_dhx[0..5]; delay_bph[0..5] + rlt2 FROM rlt1 + detl FROM tqmf[0..23]; h[0..23]; delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; rlt1; rlt2; decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; delay_dhx[0..5]; delay_bph[0..5] + deth FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; al1; + al2; rlt1; rlt2; decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; rh2 + sh FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; delay_dhx[0..5]; delay_bph[0..5]; + ah1; ah2; rh1; rh2 + eh FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; delay_dhx[0..5]; delay_bph[0..5]; + ah1; ah2; rh1; rh2 + dh FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; rh2 + ih FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; delay_dhx[0..5]; delay_bph[0..5]; + ah1; ah2; rh1; rh2 + nbh FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; rh2 + szh FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; delay_dhx[0..5]; delay_bph[0..5] + sph FROM ah1; ah2; rh1; rh2 + ph FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; rh2 + yh FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; rh2 + delay_dhx[0] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + [1] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; delay_dhx[0..5]; + delay_bph[0..5] (and SELF) + [3] FROM delay_dltx[2]; delay_dhx[2] (and SELF) + [4] FROM delay_dltx[2..3]; delay_dhx[2..3] (and SELF) + [5] FROM delay_dltx[3..4]; delay_dhx[3..4] (and SELF) + delay_bph[0] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + [1] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + [2] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + [3] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + [4] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + [5] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; + rh2 (and SELF) + ah1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; rh1; rh2 + ah2 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; + rh2 + ph1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; rh2 + ph2 FROM ph1 + rh1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; qq2_code2_table[1..3]; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; rh1; rh2 + rh2 FROM rh1 + \result FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; rh1; rh2 +[from] Function main: + tqmf[0] FROM test_data[9] + [1] FROM test_data[8] + [2] FROM test_data[7] + [3] FROM test_data[6] + [4] FROM test_data[5] + [5] FROM test_data[4] + [6] FROM test_data[3] + [7] FROM test_data[2] + [8] FROM test_data[1] + [9] FROM test_data[0] + [10] FROM tqmf[0] + [11] FROM tqmf[1] + [12] FROM tqmf[2] + [13] FROM tqmf[3] + [14] FROM tqmf[4] + [15] FROM tqmf[5] + [16] FROM tqmf[6] + [17] FROM tqmf[7] + [18] FROM tqmf[8] + [19] FROM tqmf[9] + [20] FROM tqmf[10] + [21] FROM tqmf[11] + [22] FROM tqmf[12] + [23] FROM tqmf[13] + xl FROM tqmf[0..15]; h[0..23]; test_data[0..7] + xh FROM tqmf[0..15]; h[0..23]; test_data[0..7] + il FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; al1; + al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + szl FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..5] + spl FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..5] + sl FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; al1; + al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..5] + el FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; al1; + al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + delay_bpl[0] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] (and SELF) + [1] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] (and SELF) + [2] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] (and SELF) + [3] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] (and SELF) + [4] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] (and SELF) + [5] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] (and SELF) + delay_dltx[0] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] (and SELF) + [1] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] (and SELF) + [3] FROM delay_dltx[2]; delay_dhx[2] (and SELF) + [4] FROM delay_dltx[2..3]; delay_dhx[2..3] (and SELF) + [5] FROM delay_dltx[2..4]; delay_dhx[2..4] (and SELF) + nbl FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + al1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + al2 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + plt FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + plt1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + plt2 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..5] + dlt FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + rlt FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + rlt1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + rlt2 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..5] + detl FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + deth FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + sh FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; al1; + al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + eh FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; al1; + al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + dh FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; al1; + al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + ih FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; al1; + al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + nbh FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + szh FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + sph FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..5] + ph FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; al1; + al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + yh FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; al1; + al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + delay_dhx[0] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] (and SELF) + [1] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] (and SELF) + [3] FROM delay_dltx[2]; delay_dhx[2] (and SELF) + [4] FROM delay_dltx[2..3]; delay_dhx[2..3] (and SELF) + [5] FROM delay_dltx[2..4]; delay_dhx[2..4] (and SELF) + delay_bph[0] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] (and SELF) + [1] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] (and SELF) + [2] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] (and SELF) + [3] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] (and SELF) + [4] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] (and SELF) + [5] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] (and SELF) + ah1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + ah2 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + ph1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + ph2 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..5] + rh1 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..7] + rh2 FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; + al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; rh2; test_data[0..5] + compressed[0] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; al1; al2; rlt1; rlt2; + decis_levl[0..28]; detl; quant26bt_pos[29]; + quant26bt_neg{[0]; [29]}; deth; delay_dhx[0..5]; + delay_bph[0..5]; ah1; ah2; rh1; rh2 + [1] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..1] + [2] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..3] + [3] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..5] + [4] + FROM tqmf[0..23]; h[0..23]; qq4_code4_table{[1]; [8]; [15]}; + delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; + nbl; al1; al2; plt1; plt2; rlt1; rlt2; decis_levl[0..28]; + detl; quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; + qq2_code2_table[1..3]; wh_code_table[1..3]; nbh; + delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; + rh1; rh2; test_data[0..7] +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function abs: + m +[inout] Inputs for function abs: + \nothing +[inout] Out (internal) for function filtep: + pl; pl2; __retres +[inout] Inputs for function filtep: + \nothing +[inout] Out (internal) for function filtez: + bpl; dlt_0; i; zl; tmp; tmp_0; __retres; tmp_1_unroll_123; + tmp_2_unroll_123; tmp_1_unroll_126; tmp_2_unroll_126; tmp_1_unroll_129; + tmp_2_unroll_129; tmp_1_unroll_132; tmp_2_unroll_132; tmp_1_unroll_135; + tmp_2_unroll_135 +[inout] Inputs for function filtez: + delay_bpl[0..5]; delay_dltx[0..5]; delay_dhx[0..5]; delay_bph[0..5] +[inout] Out (internal) for function logsch: + nbh_0; wd +[inout] Inputs for function logsch: + wh_code_table[1..3] +[inout] Out (internal) for function logscl: + nbl_0; wd +[inout] Inputs for function logscl: + wl_code_table{[1]; [8]; [15]} +[inout] Out (internal) for function quantl: + ril; mil; wd; decis +[inout] Inputs for function quantl: + decis_levl[0..29]; quant26bt_pos[29]; quant26bt_neg{[0]; [29]} +[inout] Out (internal) for function scalel: + wd1; wd2; wd3; __retres +[inout] Inputs for function scalel: + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]} +[inout] Out (internal) for function uppol1: + wd2; wd3; apl1 +[inout] Inputs for function uppol1: + \nothing +[inout] Out (internal) for function uppol2: + wd2; wd4; apl2 +[inout] Inputs for function uppol2: + \nothing +[inout] Out (internal) for function upzero: + delay_bpl[0..5]; delay_dltx{[0..1]; [3..5]}; delay_dhx{[0..1]; [3..5]}; + delay_bph[0..5]; i; wd2; wd3 +[inout] Inputs for function upzero: + delay_bpl[0..5]; delay_dltx[0..5]; delay_dhx[0..5]; delay_bph[0..5] +[inout] Out (internal) for function encode: + tqmf[0..23]; xl; xh; il; szl; spl; sl; el; delay_bpl[0..5]; + delay_dltx{[0..1]; [3..5]}; nbl; al1; al2; plt; plt1; plt2; dlt; rlt; + rlt1; rlt2; detl; deth; sh; eh; dh; ih; nbh; szh; sph; ph; yh; + delay_dhx{[0..1]; [3..5]}; delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; + rh2; i; h_ptr; tqmf_ptr; tqmf_ptr1; xa; xb; decis; tmp; tmp_0; tmp_1; + tmp_2; tmp_7; tmp_8; tmp_9; tmp_12; tmp_13; __retres; tmp_3_unroll_8; + tmp_4_unroll_8; tmp_5_unroll_8; tmp_6_unroll_8; tmp_3_unroll_12; + tmp_4_unroll_12; tmp_5_unroll_12; tmp_6_unroll_12; tmp_3_unroll_16; + tmp_4_unroll_16; tmp_5_unroll_16; tmp_6_unroll_16; tmp_3_unroll_20; + tmp_4_unroll_20; tmp_5_unroll_20; tmp_6_unroll_20; tmp_3_unroll_24; + tmp_4_unroll_24; tmp_5_unroll_24; tmp_6_unroll_24; tmp_3_unroll_28; + tmp_4_unroll_28; tmp_5_unroll_28; tmp_6_unroll_28; tmp_3_unroll_32; + tmp_4_unroll_32; tmp_5_unroll_32; tmp_6_unroll_32; tmp_3_unroll_36; + tmp_4_unroll_36; tmp_5_unroll_36; tmp_6_unroll_36; tmp_3_unroll_40; + tmp_4_unroll_40; tmp_5_unroll_40; tmp_6_unroll_40; tmp_3_unroll_44; + tmp_4_unroll_44; tmp_5_unroll_44; tmp_6_unroll_44; tmp_10_unroll_51; + tmp_11_unroll_51; tmp_10_unroll_54; tmp_11_unroll_54; tmp_10_unroll_57; + tmp_11_unroll_57; tmp_10_unroll_60; tmp_11_unroll_60; tmp_10_unroll_63; + tmp_11_unroll_63; tmp_10_unroll_66; tmp_11_unroll_66; tmp_10_unroll_69; + tmp_11_unroll_69; tmp_10_unroll_72; tmp_11_unroll_72; tmp_10_unroll_75; + tmp_11_unroll_75; tmp_10_unroll_78; tmp_11_unroll_78; tmp_10_unroll_81; + tmp_11_unroll_81; tmp_10_unroll_84; tmp_11_unroll_84; tmp_10_unroll_87; + tmp_11_unroll_87; tmp_10_unroll_90; tmp_11_unroll_90; tmp_10_unroll_93; + tmp_11_unroll_93; tmp_10_unroll_96; tmp_11_unroll_96; tmp_10_unroll_99; + tmp_11_unroll_99; tmp_10_unroll_102; tmp_11_unroll_102; tmp_10_unroll_105; + tmp_11_unroll_105; tmp_10_unroll_108; tmp_11_unroll_108; tmp_10_unroll_111; + tmp_11_unroll_111; tmp_10_unroll_114; tmp_11_unroll_114 +[inout] Inputs for function encode: + tqmf[0..23]; h[0..23]; xl; xh; il; szl; spl; sl; el; + qq4_code4_table{[1]; [8]; [15]}; delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; al1; al2; + plt; plt1; plt2; dlt; rlt; rlt1; rlt2; decis_levl[0..29]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; sh; eh; + qq2_code2_table[1..3]; wh_code_table[1..3]; dh; ih; nbh; szh; sph; + ph; yh; delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; + rh2 +[inout] Out (internal) for function main: + tqmf[0..23]; xl; xh; il; szl; spl; sl; el; delay_bpl[0..5]; + delay_dltx{[0..1]; [3..5]}; nbl; al1; al2; plt; plt1; plt2; dlt; rlt; + rlt1; rlt2; detl; deth; sh; eh; dh; ih; nbh; szh; sph; ph; yh; + delay_dhx{[0..1]; [3..5]}; delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; + rh2; compressed[0..4]; i +[inout] Inputs for function main: + tqmf[0..23]; h[0..23]; xl; xh; il; szl; spl; sl; el; + qq4_code4_table{[1]; [8]; [15]}; delay_bpl[0..5]; delay_dltx[0..5]; + wl_code_table{[1]; [8]; [15]}; + ilb_table{[0]; [9..10]; [12]; [14..15]; [27]; [29]}; nbl; al1; al2; + plt; plt1; plt2; dlt; rlt; rlt1; rlt2; decis_levl[0..29]; detl; + quant26bt_pos[29]; quant26bt_neg{[0]; [29]}; deth; sh; eh; + qq2_code2_table[1..3]; wh_code_table[1..3]; dh; ih; nbh; szh; sph; + ph; yh; delay_dhx[0..5]; delay_bph[0..5]; ah1; ah2; ph1; ph2; rh1; + rh2; test_data[0..9] diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/lib/base.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/lib/base.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/lib/base.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/lib/base.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,13 @@ +#ifndef _BASE_H +#define _BASE_H + +/* Only #define it if it hasn't already been defined using -D */ +#ifndef BASE_SZ +#define BASE_SZ 2 +#endif + +#ifndef MAX_GETC +#define MAX_GETC 10 +#endif + +#endif diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/lib/frama_c_journal.ml frama-c-20150201+sodium+dfsg/tests/verisec/suite/lib/frama_c_journal.ml --- frama-c-20140301+neon+dfsg/tests/verisec/suite/lib/frama_c_journal.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/lib/frama_c_journal.ml 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,13 @@ +(* Frama-C journal generated at 15:47 the 08/10/2008 *) + +(* Running *) +let start () = + let () = Journal.run () in + let () = Cmdline.Files.add "stubs.c" in + let () = File.init_from_cmdline () in + (* Finished *) + Journal.finished () + +let () = + try start () + with e -> Format.eprintf "Journal raised an exception: %s" (Printexc.to_string e) diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/lib/stubs.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/lib/stubs.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/lib/stubs.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/lib/stubs.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,399 @@ +#include "stubs.h" + +/* + * KK: I think SatAbs/CBMC front-end complains about this, but the backend + * knows what it means. + */ +/* extern int nondet_int(); */ + +/**************************************************************************** + * + * Begin duplicate relevant functions. + * + ***************************************************************************/ + +char *r_strcat(char *dest, const char *src) +{ + int i, j; + char tmp; + i = 0; j = 0; + while (dest[i] != EOS) + i++; + do { + tmp = src[j]; + /* replace this line.... */ + dest[i] = tmp; + i++; j++; + } while (src[j] != EOS); + + /* strcat man page says that strcat null-terminates dest */ + /* r_strcat RELEVANT */ + dest[i] = EOS; + + return dest; +} + +char *r_strncat(char *dest, const char *src, size_t n) +{ + int i, j; + char tmp; + i = 0; j = 0; + while (dest[i] != EOS) + i++; + do { + if (j >= n) break; + tmp = src[j]; + /* replace this line.... */ + dest[i] = tmp; + i++; j++; + } while (src[j] != EOS); + + /* strncat man page says that strcat null-terminates dest */ + /* r_strncat RELEVANT */ + dest[i] = EOS; + + return dest; +} + +/* We do the copy backwards in order to trip upper bounds assertion + * failures more quickly. */ +void *r_memcpy(void *dest, const void *src, size_t n) +{ + int i; + + /*@ assert \valid((char *)dest+(n-1)); */ + /* dest[n-1]; */ + + for (i = n-1; i >= 0; i--) { + ((char *) dest)[i] = ((char *) src)[i]; + } + return dest; +} + +char *r_strncpy (char *dest, const char *src, size_t n) +{ + int _i; + + /* r_strncpy RELEVANT */ + dest[n]; + + for (_i = 0; _i < n; _i++) { + dest[_i] = src[_i]; // DO NOT CHANGE THE POSITION OF THIS LINE + if (src[_i] == EOS) + break; + } + return dest; +} + +char *r_strcpy (char *dest, const char *src) +{ + int i; + char tmp; + for (i = 0; ; i++) { + tmp = src[i]; + /* r_strcpy RELEVANT */ + dest[i] = tmp; // DO NOT CHANGE THE POSITION OF THIS LINE + if (src[i] == EOS) + break; + } + return dest; +} + +/**************************************************************************** + * + * End duplicate relevant functions. + * + ***************************************************************************/ + + +char *strcat(char *dest, const char *src) +{ + int i, j; + char tmp; + i = 0; j = 0; + while (dest[i] != EOS) + i++; + do { + tmp = src[j]; + dest[i] = tmp; + i++; j++; + } while (src[j] != EOS); + + /* strcat man page says that strcat null-terminates dest */ + dest[i] = EOS; + + return dest; +} + +/* We do the copy backwards in order to trip upper bounds assertion + * failures more quickly. */ +void *memcpy(void *dest, const void *src, size_t n) +{ + int i; + for (i = n-1; i >= 0; i--) { + /* I can't find a way to use a temporary here. :-/ */ + ((char *)dest)[i] = ((char *)src)[i]; + } + return dest; +} + +char *strchr(const char *s, int c) +{ + int i; + for (i = 0; s[i] != EOS; i++) + if (s[i] == c) + return &s[i]; + + return (c == EOS) ? &s[i] : NULL; +} + + +char *strrchr(const char *s, int c) +{ + char *ret = NULL; + int i; + + for (i = 0; s[i] != EOS; i++) + if (s[i] == c) + ret = &s[i]; + + if (c == EOS) + return &s[i]; + + return ret; +} + +char *strncpy (char *dest, const char *src, size_t n) +{ + int _i; + char tmp; + for (_i = 0; _i < n; _i++) { + tmp = src[_i]; + dest[_i] = tmp; + if (src[_i] == EOS) + break; + } + return dest; +} + +char *strncpy_ptr (char *dest, const char *src, size_t n) +{ + char *p, *q; + p = dest; + q = src; + for (; q - src < n; q++, p++) { + *p = *q; + if (*p == 0) + break; + } + return dest; +} + +char *strcpy (char *dest, char *src) +{ + int i; + char tmp; + for (i = 0; ; i++) { + tmp = src[i]; + dest[i] = tmp; + if (src[i] == EOS) + break; + } + return dest; +} + +/* Version of strstr written for analyzability rather than performance. + * + * In this version, EVERYTHING is inlined. This seems to aid + * analyzability considerably. + */ +char *strstr(const char *haystack, const char *needle) +{ + int len; + int i; + int j; + + len = 0; + while (needle[len] != EOS) len++; + + for (i = 0; haystack[i] != EOS; i++) { + for (j = 0; j < len-1; j++) { + if (haystack[i+j] == EOS) break; + if (haystack[i+j] != needle[j]) break; + } + if (j == len-1 && + haystack[i+len-1] == needle[len-1]) + return &haystack[i]; + } + + return NULL; +} + +unsigned strlen(char *s) +{ + int i; + i = 0; + while (s[i] != EOS) + ++i; + return i; +} + +int strncmp (const char *s1, const char *s2, size_t n) +{ + int i; + int retval; + i = 0; + do { + retval = s1[i] - s2[i]; + if (i >= n-1) return retval; + if (retval != 0) return retval; + if (s1[i] == EOS) return 0; + i++; + } while (1); +} + +int strcmp (const char *s1, const char *s2) +{ + int i; + for (i = 0; s1[i] == s2[i]; i++) + if (s1[i] == EOS) + return 0; + return s1[i] - s2[i]; +} + +/* + * getc which returns EOF within MAX_GETC calls if preprocessor macro CBMC is + * defined. + */ +int getc () +{ +#ifdef CBMC + static int getc_count = 0; + if (getc_count++ < MAX_GETC) + { + if (nondet_int ()) + return (int) nondet_unsigned_char (); + + return EOF; + } + else + { + getc_count = 0; + return EOF; + } +#else + return nondet_int (); +#endif +} + +int isascii (int c) +{ + return ('!' <= c && c <= '~'); +} + +int isspace (int c) +{ + return (c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r' + || c == ' '); +} + +/***************************************************************** + * + * Functions which are like the functions in libc, but return indexes + * into arrays rather than pointers into arrays. -1 becomes the + * stand-in for NULL, which is hashish and evil in general. + * + ****************************************************************/ + +char *strrand (char *s) +{ + int i; + for (i = 0; s[i] != EOS; i++) + if (nondet_int () == 1) + return &s[i]; + + return NULL; +} + +int istrrand (char *s) +{ + int i; + for (i = 0; s[i] != EOS; i++) + if (nondet_int () == 1) + return i; + + return -1; +} + +int istrchr(const char *s, int c) +{ + int i; + for (i = 0; s[i] != EOS; i++) + if (s[i] == c) + return i; + + return (c == EOS) ? i : -1; +} + +int istrrchr(const char *s, int c) +{ + int ret = -1; + int i; + + for (i = 0; s[i] != EOS; i++) + if (s[i] == c) + ret = i; + + if (c == EOS) + return i; + + return ret; +} + +int istrncmp (const char *s1, int start, const char *s2, size_t n) +{ + int i; + int end = start + (n-1); + + for (i = start; i < end; i++) { + if (s1[i] == EOS) return 0; + if (s1[i] - s2[i] != 0) return s1[i] - s2[i]; + } + + assert (i == end); //KK: what's this here for? + return s1[end] - s2[end]; +} + +int istrstr(const char *haystack, const char *needle) +{ + int len; + int i; + int j; + + len = 0; + while (needle[len] != EOS) len++; + + for (i = 0; haystack[i] != EOS; i++) { + for (j = 0; j < len-1; j++) { + if (haystack[i+j] == EOS) break; + if (haystack[i+j] != needle[j]) break; + } + if (j == len-1 && + haystack[i+len-1] == needle[len-1]) + return i; + } + + return NULL; +} + +typedef struct modem; +int put_command( struct modem *mdm, char* command, int clen, char* answer, + int max, int timeout,char* expect) { + strcpy(answer,"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\ +ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\ +ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\ +ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\ +ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\ +ABCDEF+CMGR:"); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/lib/stubs.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/lib/stubs.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/lib/stubs.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/lib/stubs.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,53 @@ +#ifndef _STUBS_H +#define _STUBS_H + +#include "base.h" + +#define NULL ((void *)0) +#define EOS 0 +#define EOF -1 +#define ERR -1 + +/* I had size_t being an unsigned long before, but that led to the + * infamous "Equality without matching types" error when I used a + * size_t to index into an array. */ +typedef int size_t; +typedef int bool; +#define true 1 +#define false 0 + +char *strchr(const char *s, int c); +char *strrchr(const char *s, int c); +char *strstr(const char *haystack, const char *needle); +char *strncpy (char *dest, const char *src, size_t n); +char *strncpy_ptr (char *dest, const char *src, size_t n); +char *strcpy (char *dest, const char *src); +unsigned strlen(const char *s); +int strncmp (const char *s1, const char *s2, size_t n); +int strcmp (const char *s1, const char *s2); +char *strcat(char *dest, const char *src); + +void *memcpy(void *dest, const void *src, size_t n); + +int isascii (int c); +int isspace (int c); + +int getc (/* ignore FILE* arg */); + +/* Extensions to libc's string library */ +char *strrand (char *s); +int istrrand (char *s); +int istrchr(const char *s, int c); +int istrrchr(const char *s, int c); +int istrncmp (const char *s1, int start, const char *s2, size_t n); +int istrstr(const char *haystack, const char *needle); + +/* Hackish duplicate functions to enable us to determine which claims + * are relevant. Oh, the hilarity. */ +char *r_strncpy (char *dest, const char *src, size_t n); +char *r_strcpy (char *dest, const char *src); +char *r_strcat(char *dest, const char *src); +char *r_strncat(char *dest, const char *src, size_t n); +void *r_memcpy(void *dest, const void *src, size_t n); + +#endif diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/apache.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/apache.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/apache.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/apache.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,40 @@ +#include "apache.h" + +int ap_isspace(char c) +{ + if (c == '\t' + || c == '\n' + || c == '\v' + || c == '\f' + || c == '\r' + || c == ' ') + return 1; + + return 0; +} + +int ap_tolower(char c) +{ + /* do we have tolower() in our stubs? */ + return c; +} + +/* Rewritten to be more analyzable -- use explicit array indexing. */ +char * ap_cpystrn(char *dst, const char *src, size_t dst_size) +{ + int i; + + if (dst_size == 0) + return (dst); + + for (i = 0; i < dst_size - 1; i++) { + dst[i] = src[i]; + if (src[i] == EOS) { + return dst + i; + } + } + + dst[i] = EOS; + + return dst + i; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/apache.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/apache.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/apache.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/apache.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,13 @@ +#include "../../../../lib/stubs.h" + +#define MAX_STRING_LEN BASE_SZ + 2 + +int ap_isspace(char c); +int ap_tolower(char c); +char * ap_cpystrn(char *dst, const char *src, size_t dst_size); + +/* GET_CHAR reads a char from a file. We're not modelling the + * underlying file, so just non-deterministically return something. */ +extern int nondet_char (); +#define GET_CHAR(c,ret) {c = nondet_char();} + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/ap_iter1_prefixLong_arr.err frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/ap_iter1_prefixLong_arr.err --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/ap_iter1_prefixLong_arr.err 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/ap_iter1_prefixLong_arr.err 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,31 @@ +apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:12: Warning: entering loop for the first time +No code for function nondet_char, default assigns generated +apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:30: Warning: entering loop for the first time +apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:19: Warning: entering loop for the first time +apache/CVE-2004-0940/apache.c:19: Warning: assigning non deterministic value for the first time +apache/CVE-2004-0940/apache.c:30: Warning: entering loop for the first time +apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:47: Warning: entering loop for the first time +apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:54: Warning: entering loop for the first time +apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:62: Warning: entering loop for the first time +apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:71: Warning: out of bounds write. assert \valid(tag + t); + +apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:80: Warning: out of bounds write. assert \valid(tag + t); + +apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:85: Warning: out of bounds write. assert \valid(tag + t); + +[from] computing for function nondet_char +[from] done for function nondet_char +[from] computing for function ap_isspace +[postdominators] computing for function ap_isspace +[postdominators] done for function ap_isspace +[from] done for function ap_isspace +[from] computing for function ap_cpystrn +[postdominators] computing for function ap_cpystrn +[postdominators] done for function ap_cpystrn +[from] done for function ap_cpystrn +[from] computing for function ap_tolower +[from] done for function ap_tolower +[dominators] computing for function get_tag +[dominators] done for function get_tag +[dominators] computing for function r_memcpy +[dominators] done for function r_memcpy diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/ap_iter1_prefixLong_arr.log frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/ap_iter1_prefixLong_arr.log --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/ap_iter1_prefixLong_arr.log 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/ap_iter1_prefixLong_arr.log 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,230 @@ +[preprocessing] running gcc -C -E -I. apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c +[preprocessing] running gcc -C -E -I. apache/CVE-2004-0940/apache.c +[preprocessing] running gcc -C -E -I. ../../lib/stubs.c +[values] computing for function main +====== INITIAL STATE ====== +Computing globals values +====== INITIAL STATE COMPUTED ====== +Values of globals at initialization + +[values] computing for function get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:95 +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:13 +[values] done for function nondet_char +[values] computing for function ap_isspace <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:12 +[values] Recording results for ap_isspace +[values] done for function ap_isspace +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:13 +[values] done for function nondet_char +[values] computing for function ap_isspace <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:12 +[values] Recording results for ap_isspace +[values] done for function ap_isspace +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:17 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:20 +[values] done for function nondet_char +[values] computing for function ap_isspace <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:19 +[values] Recording results for ap_isspace +[values] done for function ap_isspace +[values] computing for function ap_isspace <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:35 +[values] Recording results for ap_isspace +[values] done for function ap_isspace +[values] computing for function ap_tolower <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:38 +[values] Recording results for ap_tolower +[values] done for function ap_tolower +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:20 +[values] done for function nondet_char +[values] computing for function ap_isspace <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:19 +[values] Recording results for ap_isspace +[values] done for function ap_isspace +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:40 +[values] done for function nondet_char +[values] computing for function ap_cpystrn <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:23 +[values] Recording results for ap_cpystrn +[values] done for function ap_cpystrn +[values] computing for function ap_isspace <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:35 +[values] Recording results for ap_isspace +[values] done for function ap_isspace +[values] computing for function ap_tolower <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:38 +[values] Recording results for ap_tolower +[values] done for function ap_tolower +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:40 +[values] done for function nondet_char +[values] computing for function ap_isspace <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:35 +[values] Recording results for ap_isspace +[values] done for function ap_isspace +[values] computing for function ap_tolower <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:38 +[values] Recording results for ap_tolower +[values] done for function ap_tolower +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:40 +[values] done for function nondet_char +[values] computing for function ap_isspace <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:35 +[values] Recording results for ap_isspace +[values] done for function ap_isspace +[values] computing for function ap_tolower <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:38 +[values] Recording results for ap_tolower +[values] done for function ap_tolower +[values] computing for function ap_isspace <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:47 +[values] Recording results for ap_isspace +[values] done for function ap_isspace +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:48 +[values] done for function nondet_char +[values] computing for function ap_isspace <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:47 +[values] Recording results for ap_isspace +[values] done for function ap_isspace +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:55 +[values] done for function nondet_char +[values] computing for function ap_isspace <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:54 +[values] Recording results for ap_isspace +[values] done for function ap_isspace +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:55 +[values] done for function nondet_char +[values] computing for function ap_isspace <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:54 +[values] Recording results for ap_isspace +[values] done for function ap_isspace +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:63 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:73 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:63 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:63 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:73 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:63 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:73 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:63 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:63 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:73 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:73 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:63 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:63 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:73 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:73 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:63 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:63 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:73 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:73 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:63 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:63 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:73 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:73 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:63 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:63 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:73 +[values] done for function nondet_char +[values] computing for function nondet_char <-get_tag <-main +[values] called from apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c:73 +[values] done for function nondet_char +[values] Recording results for get_tag +[values] done for function get_tag +[values] Recording results for main +[values] done for function main + +====== VALUES COMPUTED ====== +Values for function ap_isspace: + __retres ∈ {0; 1; } + +Values for function ap_tolower: + __retres ∈ [-128..127] + +Values for function ap_cpystrn: + tag[0..1] ∈ {100; 111; } or UNINITIALIZED + [2] ∈ {0; } + [3] ∈ UNINITIALIZED + i ∈ {2; } + __retres ∈ {{ &tag + {2; } ;}} + +Values for function get_tag: + tagbuf_len ∈ {3; } + tag_val ∈ {{ &tag + {1; 2; 3; } ;}} or UNINITIALIZED + c ∈ [--..--] + term ∈ {34; 39; } or UNINITIALIZED + t ∈ [--..--] + tmp ∈ {0; } + tmp_0 ∈ {0; } or UNINITIALIZED + tmp_1 ∈ {0; 1; } or UNINITIALIZED + tmp_2 ∈ {0; } or UNINITIALIZED + tmp_3 ∈ {0; } or UNINITIALIZED + tag[0..3] ∈ [--..--] or UNINITIALIZED + __retres ∈ {{ &NULL ; &tag ;}} + +Values for function main: + tag[0..3] ∈ [--..--] or UNINITIALIZED + __retres ∈ {0; } + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/frama-c-journal.ml frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/frama-c-journal.ml --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/frama-c-journal.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/frama-c-journal.ml 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,13 @@ +(* Frama-C journal generated at 15:05 the 29/08/2008 *) + +(* Running *) +let () = Journal.run () +let () = Cmdline.widening level.set 20 +let () = Cmdline.ForceValues.set true +let () = Cmdline.Files.set ["get_tag/iter1_prefixLong_arr_bad.c"; ] +let () = Cmdline.Files.set ["apache.c"; "get_tag/iter1_prefixLong_arr_bad.c"; ] +let () = File.init_from_cmdline () +let () = !Db.Syntactic_callgraph.dump () +let () = !Db.Value.compute () +(* Finished *) +let () = Journal.finished () diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,98 @@ +#include "../apache.h" + +char *get_tag(char *tag, int tagbuf_len) +{ + char *tag_val, c, term; + int t; + + t = 0; + + --tagbuf_len; + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c == '-') { + GET_CHAR(c, NULL); + if (c == '-') { + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + if (c == '>') { + ap_cpystrn(tag, "done", tagbuf_len); + return tag; + } + } + return NULL; + } + + while (1) { + if (t == tagbuf_len) { + tag[t] = EOS; + return NULL; + } + if (c == '=' || ap_isspace(c)) { + break; + } + tag[t] = ap_tolower(c); + t++; + GET_CHAR(c, NULL); + } + + tag[t] = EOS; + t++; + tag_val = tag + t; + + while (ap_isspace(c)) { + GET_CHAR(c, NULL); + } + if (c != '=') { + return NULL; + } + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c != '"' && c != '\'') { + return NULL; + } + term = c; + while (1) { + GET_CHAR(c, NULL); + if (t == tagbuf_len) { /* Suppose t == tagbuf_len - 1 */ + tag[t] = EOS; + return NULL; + } + + if (c == '\\') { + /* BAD */ + tag[t] = c; + t++; /* Now t == tagbuf_len */ + GET_CHAR(c, NULL); + } + else if (c == term) { + break; + } + + /* BAD */ + tag[t] = c; + t++; /* Now t == tagbuf_len + 1 + * So the bounds check (t == tagbuf_len) will fail */ + } + /* BAD */ + tag[t] = EOS; + + return tag; +} + +int main () +{ + char tag[MAX_STRING_LEN]; + + /* The caller always passes in (tag, sizeof(tag)) */ + get_tag (tag, MAX_STRING_LEN); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixLong_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,105 @@ +#include "../apache.h" + +char *get_tag(char *tag, int tagbuf_len) +{ + char *tag_val, c, term; + int t; + + t = 0; + + --tagbuf_len; + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c == '-') { + GET_CHAR(c, NULL); + if (c == '-') { + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + if (c == '>') { + ap_cpystrn(tag, "done", tagbuf_len); + return tag; + } + } + return NULL; + } + + while (1) { + if (t == tagbuf_len) { + tag[t] = EOS; + return NULL; + } + if (c == '=' || ap_isspace(c)) { + break; + } + tag[t] = ap_tolower(c); + t++; + GET_CHAR(c, NULL); + } + + tag[t] = EOS; + t++; + tag_val = tag + t; + + while (ap_isspace(c)) { + GET_CHAR(c, NULL); + } + if (c != '=') { + return NULL; + } + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c != '"' && c != '\'') { + return NULL; + } + term = c; + while (1) { + GET_CHAR(c, NULL); + if (t == tagbuf_len) { /* Suppose t == tagbuf_len - 1 */ + tag[t] = EOS; + return NULL; + } + + if (c == '\\') { + GET_CHAR(c, NULL); + if (c != term) { + /* OK */ + tag[t] = '\\'; + t++; + if (t == tagbuf_len) { + /* OK */ + tag[t] = EOS; + return NULL; + } + } + } + else if (c == term) { + break; + } + + /* OK */ + tag[t] = c; + t++; /* Now t == tagbuf_len + 1 + * So the bounds check (t == tagbuf_len) will fail */ + } + /* OK */ + tag[t] = EOS; + + return tag; +} + +int main () +{ + char tag[MAX_STRING_LEN]; + + /* The caller always passes in (tag, sizeof(tag)) */ + get_tag (tag, MAX_STRING_LEN); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixLong_ptr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixLong_ptr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixLong_ptr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixLong_ptr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,98 @@ +#include "../apache.h" + +char *get_tag(char *tag, int tagbuf_len) +{ + char *tag_val, c, term; + char *t; + + t = tag; + + --tagbuf_len; + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c == '-') { + GET_CHAR(c, NULL); + if (c == '-') { + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + if (c == '>') { + ap_cpystrn(tag, "done", tagbuf_len); + return tag; + } + } + return NULL; + } + + while (1) { + if (t == tag + tagbuf_len) { + *t = EOS; + return NULL; + } + if (c == '=' || ap_isspace(c)) { + break; + } + *t = ap_tolower(c); + t++; + GET_CHAR(c, NULL); + } + + *t = EOS; + t++; + tag_val = t; + + while (ap_isspace(c)) { + GET_CHAR(c, NULL); + } + if (c != '=') { + return NULL; + } + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c != '"' && c != '\'') { + return NULL; + } + term = c; + while (1) { + GET_CHAR(c, NULL); + if (t == tag + tagbuf_len) { /* Suppose t == tag + tagbuf_len - 1 */ + *t = EOS; + return NULL; + } + + if (c == '\\') { + /* BAD */ + *t = c; + t++; /* Now t == tag + tagbuf_len */ + GET_CHAR(c, NULL); + } + else if (c == term) { + break; + } + + /* BAD */ + *t = c; + t++; /* Now t == tag + tagbuf_len + 1 + * So the bounds check (t == tag + tagbuf_len) will fail */ + } + /* BAD */ + *t = EOS; + + return tag; +} + +int main () +{ + char tag[MAX_STRING_LEN]; + + /* The caller always passes in (tag, sizeof(tag)) */ + get_tag (tag, MAX_STRING_LEN); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixLong_ptr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixLong_ptr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixLong_ptr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixLong_ptr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,105 @@ +#include "../apache.h" + +char *get_tag(char *tag, int tagbuf_len) +{ + char *tag_val, c, term; + char *t; + + t = tag; + + --tagbuf_len; + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c == '-') { + GET_CHAR(c, NULL); + if (c == '-') { + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + if (c == '>') { + ap_cpystrn(tag, "done", tagbuf_len); + return tag; + } + } + return NULL; + } + + while (1) { + if (t == tag + tagbuf_len) { + *t = EOS; + return NULL; + } + if (c == '=' || ap_isspace(c)) { + break; + } + *t = ap_tolower(c); + t++; + GET_CHAR(c, NULL); + } + + *t = EOS; + t++; + tag_val = t; + + while (ap_isspace(c)) { + GET_CHAR(c, NULL); + } + if (c != '=') { + return NULL; + } + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c != '"' && c != '\'') { + return NULL; + } + term = c; + while (1) { + GET_CHAR(c, NULL); + if (t == tag + tagbuf_len) { /* Suppose t == tag + tagbuf_len - 1 */ + *t = EOS; + return NULL; + } + + if (c == '\\') { + GET_CHAR(c, NULL); + if (c != term) { + /* OK */ + *t = '\\'; + t++; + if (t == tag + tagbuf_len) { + /* OK */ + *t = EOS; + return NULL; + } + } + } + else if (c == term) { + break; + } + + /* OK */ + *t = c; + t++; /* Now t == tag + tagbuf_len + 1 + * So the bounds check (t == tag + tagbuf_len) will fail */ + } + /* OK */ + *t = EOS; + + return tag; +} + +int main () +{ + char tag[MAX_STRING_LEN]; + + /* The caller always passes in (tag, sizeof(tag)) */ + get_tag (tag, MAX_STRING_LEN); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixShort_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixShort_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixShort_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixShort_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,57 @@ +#include "../apache.h" + +char *get_tag(char *tag, int tagbuf_len) +{ + char *tag_val, c, term; + int t; + + t = 0; + + --tagbuf_len; + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c != '"' && c != '\'') { + return NULL; + } + + term = c; + while (1) { + GET_CHAR(c, NULL); + if (t == tagbuf_len) { /* Suppose t == tagbuf_len - 1 */ + tag[t] = EOS; + return NULL; + } + + if (c == '\\') { + /* BAD */ + tag[t] = c; + t++; /* Now t == tagbuf_len */ + GET_CHAR(c, NULL); + } + else if (c == term) { + break; + } + + /* BAD */ + tag[t] = c; + t++; /* Now t == tagbuf_len + 1 + * So the bounds check (t == tagbuf_len) will fail */ + } + /* BAD */ + tag[t] = EOS; + + return tag; +} + +int main () +{ + char tag[MAX_STRING_LEN]; + + /* The caller always passes in (tag, sizeof(tag)) */ + get_tag (tag, MAX_STRING_LEN); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixShort_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixShort_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixShort_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixShort_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,64 @@ +#include "../apache.h" + +char *get_tag(char *tag, int tagbuf_len) +{ + char *tag_val, c, term; + int t; + + t = 0; + + --tagbuf_len; + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c != '"' && c != '\'') { + return NULL; + } + + term = c; + while (1) { + GET_CHAR(c, NULL); + if (t == tagbuf_len) { /* Suppose t == tagbuf_len - 1 */ + tag[t] = EOS; + return NULL; + } + + if (c == '\\') { + GET_CHAR(c, NULL); + if (c != term) { + /* OK */ + tag[t] = '\\'; + t++; + if (t == tagbuf_len) { + /* OK */ + tag[t] = EOS; + return NULL; + } + } + } + else if (c == term) { + break; + } + + /* OK */ + tag[t] = c; + t++; /* Now t == tagbuf_len + 1 + * So the bounds check (t == tagbuf_len) will fail */ + } + /* OK */ + tag[t] = EOS; + + return tag; +} + +int main () +{ + char tag[MAX_STRING_LEN]; + + /* The caller always passes in (tag, sizeof(tag)) */ + get_tag (tag, MAX_STRING_LEN); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixShort_ptr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixShort_ptr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixShort_ptr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixShort_ptr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,57 @@ +#include "../apache.h" + +char *get_tag(char *tag, int tagbuf_len) +{ + char *tag_val, c, term; + char *t; + + t = tag; + + --tagbuf_len; + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c != '"' && c != '\'') { + return NULL; + } + + term = c; + while (1) { + GET_CHAR(c, NULL); + if (t == tag + tagbuf_len) { /* Suppose t == tag + tagbuf_len - 1 */ + *t = EOS; + return NULL; + } + + if (c == '\\') { + /* BAD */ + *t = c; + t++; /* Now t == tag + tagbuf_len */ + GET_CHAR(c, NULL); + } + else if (c == term) { + break; + } + + /* BAD */ + *t = c; + t++; /* Now t == tag + tagbuf_len + 1 + * So the bounds check (t == tag + tagbuf_len) will fail */ + } + /* BAD */ + *t = EOS; + + return tag; +} + +int main () +{ + char tag[MAX_STRING_LEN]; + + /* The caller always passes in (tag, sizeof(tag)) */ + get_tag (tag, MAX_STRING_LEN); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixShort_ptr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixShort_ptr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixShort_ptr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter1_prefixShort_ptr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,64 @@ +#include "../apache.h" + +char *get_tag(char *tag, int tagbuf_len) +{ + char *tag_val, c, term; + char *t; + + t = tag; + + --tagbuf_len; + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c != '"' && c != '\'') { + return NULL; + } + + term = c; + while (1) { + GET_CHAR(c, NULL); + if (t == tag + tagbuf_len) { /* Suppose t == tag + tagbuf_len - 1 */ + *t = EOS; + return NULL; + } + + if (c == '\\') { + GET_CHAR(c, NULL); + if (c != term) { + /* OK */ + *t = '\\'; + t++; + if (t == tag + tagbuf_len) { + /* OK */ + *t = EOS; + return NULL; + } + } + } + else if (c == term) { + break; + } + + /* OK */ + *t = c; + t++; /* Now t == tag + tagbuf_len + 1 + * So the bounds check (t == tag + tagbuf_len) will fail */ + } + /* OK */ + *t = EOS; + + return tag; +} + +int main () +{ + char tag[MAX_STRING_LEN]; + + /* The caller always passes in (tag, sizeof(tag)) */ + get_tag (tag, MAX_STRING_LEN); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter2_prefixLong_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter2_prefixLong_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter2_prefixLong_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter2_prefixLong_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,103 @@ +#include "../apache.h" + +char *get_tag(char *tag, int tagbuf_len) +{ + char *tag_val, c, term; + int t; + + t = 0; + + --tagbuf_len; + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c == '-') { + GET_CHAR(c, NULL); + if (c == '-') { + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + if (c == '>') { + ap_cpystrn(tag, "done", tagbuf_len); + return tag; + } + } + return NULL; + } + + while (1) { + if (t == tagbuf_len) { + tag[t] = EOS; + return NULL; + } + if (c == '=' || ap_isspace(c)) { + break; + } + tag[t] = ap_tolower(c); + t++; + GET_CHAR(c, NULL); + } + + tag[t] = EOS; + t++; + tag_val = tag + t; + + while (ap_isspace(c)) { + GET_CHAR(c, NULL); + } + if (c != '=') { + return NULL; + } + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c != '"' && c != '\'') { + return NULL; + } + term = c; + while (1) { + GET_CHAR(c, NULL); + if (t == tagbuf_len) { /* Suppose t == tagbuf_len - 1 */ + tag[t] = EOS; + return NULL; + } + + if (c == '\\') { + /* BAD */ + tag[t] = c; + t++; /* Now t == tagbuf_len */ + GET_CHAR(c, NULL); + if (c == term) { /* Assume this branch isn't taken */ + --t; + /* BAD */ + tag[t] = c; + } + } + else if (c == term) { + break; + } + + /* BAD */ + tag[t] = c; + t++; /* Now t == tagbuf_len + 1 + * So the bounds check (t == tagbuf_len) will fail */ + } + /* BAD */ + tag[t] = EOS; + + return tag; +} + +int main () +{ + char tag[MAX_STRING_LEN]; + + /* The caller always passes in (tag, sizeof(tag)) */ + get_tag (tag, MAX_STRING_LEN); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter2_prefixLong_ptr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter2_prefixLong_ptr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter2_prefixLong_ptr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter2_prefixLong_ptr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,103 @@ +#include "../apache.h" + +char *get_tag(char *tag, int tagbuf_len) +{ + char *tag_val, c, term; + char *t; + + t = tag; + + --tagbuf_len; + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c == '-') { + GET_CHAR(c, NULL); + if (c == '-') { + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + if (c == '>') { + ap_cpystrn(tag, "done", tagbuf_len); + return tag; + } + } + return NULL; + } + + while (1) { + if (t == tag + tagbuf_len) { + *t = EOS; + return NULL; + } + if (c == '=' || ap_isspace(c)) { + break; + } + *t = ap_tolower(c); + t++; + GET_CHAR(c, NULL); + } + + *t = EOS; + t++; + tag_val = t; + + while (ap_isspace(c)) { + GET_CHAR(c, NULL); + } + if (c != '=') { + return NULL; + } + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c != '"' && c != '\'') { + return NULL; + } + term = c; + while (1) { + GET_CHAR(c, NULL); + if (t == tag + tagbuf_len) { /* Suppose t == tag + tagbuf_len - 1 */ + *t = EOS; + return NULL; + } + + if (c == '\\') { + /* BAD */ + *t = c; + t++; /* Now t == tag + tagbuf_len */ + GET_CHAR(c, NULL); + if (c == term) { /* Assume this branch isn't taken */ + --t; + /* BAD */ + *t = c; + } + } + else if (c == term) { + break; + } + + /* BAD */ + *t = c; + t++; /* Now t == tag + tagbuf_len + 1 + * So the bounds check (t == tag + tagbuf_len) will fail */ + } + /* BAD */ + *t = EOS; + + return tag; +} + +int main () +{ + char tag[MAX_STRING_LEN]; + + /* The caller always passes in (tag, sizeof(tag)) */ + get_tag (tag, MAX_STRING_LEN); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter2_prefixShort_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter2_prefixShort_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter2_prefixShort_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter2_prefixShort_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,60 @@ +#include "../apache.h" + +char *get_tag(char *tag, int tagbuf_len) +{ + char *tag_val, c, term; + int t; + + t = 0; + + --tagbuf_len; + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c != '"' && c != '\'') { + return NULL; + } + term = c; + while (1) { + GET_CHAR(c, NULL); + if (t == tagbuf_len) { /* Suppose t == tagbuf_len - 1 */ + tag[t] = EOS; + return NULL; + } + + if (c == '\\') { + /* BAD */ + tag[t] = c; + t++; /* Now t == tagbuf_len */ + GET_CHAR(c, NULL); + if (c == term) { /* Assume this branch isn't taken */ + --t; + /* BAD */ + tag[t] = c; + } + } + else if (c == term) { + break; + } + /* BAD */ + tag[t] = c; + t++; /* Now t == tagbuf_len + 1 + * So the bounds check (t == tagbuf_len) will fail */ + } + /* BAD */ + tag[t] = EOS; + + return tag; +} + +int main () +{ + char tag[MAX_STRING_LEN]; + + /* The caller always passes in (tag, sizeof(tag)) */ + get_tag (tag, MAX_STRING_LEN); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter2_prefixShort_ptr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter2_prefixShort_ptr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter2_prefixShort_ptr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/get_tag/iter2_prefixShort_ptr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,60 @@ +#include "../apache.h" + +char *get_tag(char *tag, int tagbuf_len) +{ + char *tag_val, c, term; + char *t; + + t = tag; + + --tagbuf_len; + + do { + GET_CHAR(c, NULL); + } while (ap_isspace(c)); + + if (c != '"' && c != '\'') { + return NULL; + } + term = c; + while (1) { + GET_CHAR(c, NULL); + if (t == tag + tagbuf_len) { /* Suppose t == tag + tagbuf_len - 1 */ + *t = EOS; + return NULL; + } + + if (c == '\\') { + /* BAD */ + *t = c; + t++; /* Now t == tag + tagbuf_len */ + GET_CHAR(c, NULL); + if (c == term) { /* Assume this branch isn't taken */ + --t; + /* BAD */ + *t = c; + } + } + else if (c == term) { + break; + } + /* BAD */ + *t = c; + t++; /* Now t == tag + tagbuf_len + 1 + * So the bounds check (t == tag + tagbuf_len) will fail */ + } + /* BAD */ + *t = EOS; + + return tag; +} + +int main () +{ + char tag[MAX_STRING_LEN]; + + /* The caller always passes in (tag, sizeof(tag)) */ + get_tag (tag, MAX_STRING_LEN); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2004-0940/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,36 @@ +-= CVE-2004-0940 =- + +Vulnerable versions: Apache 1.3.x to 1.3.32 +File(s): src/modules/standard/mod_include.c +Download from: + http://archive.apache.org/dist/httpd/apache_1.3.32.tar.gz + +Domain: Web (HTTP) Server + +_ Vulnerable Functions and Buffers _ + +The function get_tag() is passed a buffer, and an integer representing +the size of this buffer. A loop get_tag() iterates over this buffer, +filling it with characters from a file. A bounds check, + if (t - tag == tagbuf_len) +is meant to keep get_tag() from writing passed the end of the buffer +tag[], into which t points. + +Unfortunately, there is a path through this loop in which t is +incremented twice without an intervening check; hence, t - tag can be +greater than tagbuf_len. Multiple writes to tag[] are thus unsafe. + +_ Decomposed Programs _ + +apache.h +apache.c + +get_tag/ + iter{1,2}_prefix{Short,Long}_{arr,ptr}_{bad,ok}.c + +iter1 -- all iteration is forwards +iter2 -- there is forwards and backwards iteration (only the bad cases do this) +prefixShort -- little of get_tag() up to the relevant loop is preserved +prefixLong -- almost all of get_tag() up to the relevant loop is preserved + +arr, ptr, bad, and ok mean the standard things diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/apache.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/apache.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/apache.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/apache.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,26 @@ +#include "../../../../lib/stubs.h" + +/* Vary these to affect the analysis difficulty of the variants + * calling strncmp() */ +#define LDAP "ldap" +#define LDAP_SZ 4 + +/* Size of the buffer being overflowed + * Must ensure that 0 < TOKEN_SZ - 1 */ +#define TOKEN_SZ BASE_SZ + 1 + +/* This requires an explanation. escape_absolute_uri() gets passed a + * buffer uri[] and an offset into uri[]. The loop which overflows + * token[] is only executed if uri[] starts with the string LDAP of + * size LDAP_SZ, and if the character in uri[] which is one past the + * offset is a slash. Hence the LDAP_SZ (for the string LDAP) and the + * first +1 (for the slash). + * + * The second +1 is because we increment our iterator over uri[] at + * least once before reaching the loop which overflows token[]. + * + * The TOKEN_SZ + 2 is there so that uri[] will have enough characters + * after the offset to overflow token[]. + */ +#define URI_SZ LDAP_SZ + 1 + 1 + TOKEN_SZ + 2 + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/full_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/full_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/full_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/full_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,58 @@ +#include "../apache.h" + +void escape_absolute_uri (char *uri, int scheme) +{ + int cp; + char *token[TOKEN_SZ]; + int c; + + if (scheme == 0 + || strlen(uri) < scheme) { + return; + } + + cp = scheme; + + if (uri[cp-1] == '/') { + while (uri[cp] != EOS + && uri[cp] != '/') { + ++cp; + } + + if (uri[cp] == EOS || uri[cp+1] == EOS) return; + ++cp; + + scheme = cp; + + if (strncmp(uri, LDAP, LDAP_SZ) == 0) { + c = 0; + token[0] = uri; + while (uri[cp] != EOS + && c < TOKEN_SZ) { + if (uri[cp] == '?') { + ++c; + /* BAD */ + token[c] = uri + cp + 1; + uri[cp] = EOS; + } + ++cp; + } + return; + } + } + + return; +} + +int main () +{ + char uri [URI_SZ]; + int scheme; + + uri [URI_SZ-1] = EOS; + scheme = LDAP_SZ + 2; + + escape_absolute_uri (uri, scheme); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/full_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/full_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/full_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/full_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,58 @@ +#include "../apache.h" + +void escape_absolute_uri (char *uri, int scheme) +{ + int cp; + char *token[TOKEN_SZ]; + int c; + + if (scheme == 0 + || strlen(uri) < scheme) { + return; + } + + cp = scheme; + + if (uri[cp-1] == '/') { + while (uri[cp] != EOS + && uri[cp] != '/') { + ++cp; + } + + if (uri[cp] == EOS || uri[cp+1] == EOS) return; + ++cp; + + scheme = cp; + + if (strncmp(uri, LDAP, LDAP_SZ) == 0) { + c = 0; + token[0] = uri; + while (uri[cp] != EOS + && c < TOKEN_SZ - 1) { + if (uri[cp] == '?') { + ++c; + /* OK */ + token[c] = uri + cp + 1; + uri[cp] = EOS; + } + ++cp; + } + return; + } + } + + return; +} + +int main () +{ + char uri [URI_SZ]; + int scheme; + + uri [URI_SZ-1] = EOS; + scheme = LDAP_SZ + 2; + + escape_absolute_uri (uri, scheme); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/full_ptr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/full_ptr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/full_ptr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/full_ptr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,57 @@ +#include "../apache.h" + +void escape_absolute_uri (char *uri, int scheme) +{ + char *cp; + char *token[TOKEN_SZ]; + int c; + + if (scheme == 0 + || strlen(uri) < scheme) { + return; + } + + cp = uri + scheme; + + if (cp[-1] == '/') { + while (*cp != EOS && *cp != '/') { + ++cp; + } + + if (*cp == EOS || *(cp+1) == EOS) return; + ++cp; + + scheme = cp - uri; + + if (strncmp(uri, LDAP, LDAP_SZ) == 0) { + c = 0; + token[0] = uri; + while (*cp != EOS + && c < TOKEN_SZ) { + if (*cp == '?') { + ++c; + /* BAD */ + token[c] = cp + 1; + *cp = EOS; + } + ++cp; + } + return; + } + } + + return; +} + +int main () +{ + char uri [URI_SZ]; + int scheme; + + uri [URI_SZ-1] = EOS; + scheme = LDAP_SZ + 2; + + escape_absolute_uri (uri, scheme); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/full_ptr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/full_ptr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/full_ptr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/full_ptr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,57 @@ +#include "../apache.h" + +void escape_absolute_uri (char *uri, int scheme) +{ + char *cp; + char *token[TOKEN_SZ]; + int c; + + if (scheme == 0 + || strlen(uri) < scheme) { + return; + } + + cp = uri + scheme; + + if (cp[-1] == '/') { + while (*cp != EOS && *cp != '/') { + ++cp; + } + + if (*cp == EOS || *(cp+1) == EOS) return; + ++cp; + + scheme = cp - uri; + + if (strncmp(uri, LDAP, LDAP_SZ) == 0) { + c = 0; + token[0] = uri; + while (*cp != EOS + && c < TOKEN_SZ - 1) { + if (*cp == '?') { + ++c; + /* OK */ + token[c] = cp + 1; + *cp = EOS; + } + ++cp; + } + return; + } + } + + return; +} + +int main () +{ + char uri [URI_SZ]; + int scheme; + + uri [URI_SZ-1] = EOS; + scheme = LDAP_SZ + 2; + + escape_absolute_uri (uri, scheme); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp1_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp1_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp1_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp1_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,36 @@ +#include "../apache.h" + +void escape_absolute_uri (char *uri) +{ + int cp; + char *token[TOKEN_SZ]; + int c; + + cp = 0; + c = 0; + + token[0] = uri; + while (uri[cp] != EOS + && c < TOKEN_SZ) { + if (uri[cp] == '?') { + ++c; + /* BAD */ + token[c] = uri + cp + 1; + uri[cp] = EOS; + } + ++cp; + } + + return; +} + +int main () +{ + char uri [URI_SZ]; + + uri [URI_SZ-1] = EOS; + + escape_absolute_uri (uri); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp1_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp1_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp1_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp1_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,36 @@ +#include "../apache.h" + +void escape_absolute_uri (char *uri) +{ + int cp; + char *token[TOKEN_SZ]; + int c; + + cp = 0; + c = 0; + + token[0] = uri; + while (uri[cp] != EOS + && c < TOKEN_SZ - 1) { + if (uri[cp] == '?') { + ++c; + /* OK */ + token[c] = uri + cp + 1; + uri[cp] = EOS; + } + ++cp; + } + + return; +} + +int main () +{ + char uri [URI_SZ]; + + uri [URI_SZ-1] = EOS; + + escape_absolute_uri (uri); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp2_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp2_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp2_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp2_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,43 @@ +#include "../apache.h" + +void escape_absolute_uri (char *uri, int scheme) +{ + int cp; + char *token[TOKEN_SZ]; + int c; + + if (scheme == 0 + || strlen(uri) < scheme) { + return; + } + + cp = scheme; + c = 0; + + token[0] = uri; + while (uri[cp] != EOS + && c < TOKEN_SZ) { + if (uri[cp] == '?') { + ++c; + /* BAD */ + token[c] = uri + cp + 1; + uri[cp] = EOS; + } + ++cp; + } + + return; +} + +int main () +{ + char uri [URI_SZ]; + int scheme; + + uri [URI_SZ-1] = EOS; + scheme = LDAP_SZ + 2; + + escape_absolute_uri (uri, scheme); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp2_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp2_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp2_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp2_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,43 @@ +#include "../apache.h" + +void escape_absolute_uri (char *uri, int scheme) +{ + int cp; + char *token[TOKEN_SZ]; + int c; + + if (scheme == 0 + || strlen(uri) < scheme) { + return; + } + + cp = scheme; + c = 0; + + token[0] = uri; + while (uri[cp] != EOS + && c < TOKEN_SZ - 1) { + if (uri[cp] == '?') { + ++c; + /* OK */ + token[c] = uri + cp + 1; + uri[cp] = EOS; + } + ++cp; + } + + return; +} + +int main () +{ + char uri [URI_SZ]; + int scheme; + + uri [URI_SZ-1] = EOS; + scheme = LDAP_SZ + 2; + + escape_absolute_uri (uri, scheme); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp3_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp3_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp3_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp3_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,55 @@ +#include "../apache.h" + +void escape_absolute_uri (char *uri, int scheme) +{ + int cp; + char *token[TOKEN_SZ]; + int c; + + if (scheme == 0 + || strlen(uri) < scheme) { + return; + } + + cp = scheme; + + if (uri[cp-1] == '/') { + while (uri[cp] != EOS + && uri[cp] != '/') { + ++cp; + } + + if (uri[cp] == EOS || uri[cp+1] == EOS) return; + ++cp; + + scheme = cp; + + c = 0; + token[0] = uri; + while (uri[cp] != EOS + && c < TOKEN_SZ) { + if (uri[cp] == '?') { + ++c; + /* BAD */ + token[c] = uri + cp + 1; + uri[cp] = EOS; + } + ++cp; + } + } + + return; +} + +int main () +{ + char uri [URI_SZ]; + int scheme; + + uri [URI_SZ-1] = EOS; + scheme = LDAP_SZ + 2; + + escape_absolute_uri (uri, scheme); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp3_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp3_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp3_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/simp3_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,55 @@ +#include "../apache.h" + +void escape_absolute_uri (char *uri, int scheme) +{ + int cp; + char *token[TOKEN_SZ]; + int c; + + if (scheme == 0 + || strlen(uri) < scheme) { + return; + } + + cp = scheme; + + if (uri[cp-1] == '/') { + while (uri[cp] != EOS + && uri[cp] != '/') { + ++cp; + } + + if (uri[cp] == EOS || uri[cp+1] == EOS) return; + ++cp; + + scheme = cp; + + c = 0; + token[0] = uri; + while (uri[cp] != EOS + && c < TOKEN_SZ - 1) { + if (uri[cp] == '?') { + ++c; + /* OK */ + token[c] = uri + cp + 1; + uri[cp] = EOS; + } + ++cp; + } + } + + return; +} + +int main () +{ + char uri [URI_SZ]; + int scheme; + + uri [URI_SZ-1] = EOS; + scheme = LDAP_SZ + 2; + + escape_absolute_uri (uri, scheme); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/strncmp_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/strncmp_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/strncmp_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/strncmp_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,41 @@ +#include "../apache.h" + +void escape_absolute_uri (char *uri, int scheme) +{ + int cp; + char *token[TOKEN_SZ]; + int c; + + cp = scheme; + + if (strncmp(uri, LDAP, LDAP_SZ) == 0) { + c = 0; + token[0] = uri; + while (uri[cp] != EOS + && c < TOKEN_SZ) { + if (uri[cp] == '?') { + ++c; + /* BAD */ + token[c] = uri + cp + 1; + uri[cp] = EOS; + } + ++cp; + } + return; + } + + return; +} + +int main () +{ + char uri [URI_SZ]; + int scheme; + + uri [URI_SZ-1] = EOS; + scheme = LDAP_SZ + 2; + + escape_absolute_uri (uri, scheme); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/strncmp_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/strncmp_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/strncmp_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/escape_absolute_uri/strncmp_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,41 @@ +#include "../apache.h" + +void escape_absolute_uri (char *uri, int scheme) +{ + int cp; + char *token[TOKEN_SZ]; + int c; + + cp = scheme; + + if (strncmp(uri, LDAP, LDAP_SZ) == 0) { + c = 0; + token[0] = uri; + while (uri[cp] != EOS + && c < TOKEN_SZ - 1) { + if (uri[cp] == '?') { + ++c; + /* OK */ + token[c] = uri + cp + 1; + uri[cp] = EOS; + } + ++cp; + } + return; + } + + return; +} + +int main () +{ + char uri [URI_SZ]; + int scheme; + + uri [URI_SZ-1] = EOS; + scheme = LDAP_SZ + 2; + + escape_absolute_uri (uri, scheme); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/CVE-2006-3747/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,37 @@ +-= CVE-2006-3747 =- + +Vulnerable versions: Apache 1.3.x, where x >= 28 + Apache 2.0.x, where 46 <= x < 2.0.59 + Apache 2.2.0, 2.2.2 +File(s): modules/mappers/mod_rewrite.c +Download from: + http://archive.apache.org/dist/httpd/httpd-2.2.2.tar.gz + +Domain: Web (HTTP) Server + +_ Vulnerable Functions and Buffers _ + +The function escape_absolute_uri() declares an array of strings +token[] of size 5 and uses an int, c, to index into it. c is protected +by a bounds check, "c < 5"; however, c is incremented in the loop +prior to being used as an array index, so we have an off-by-one error. + +_ Decomposed Programs _ + +apache.h +apache.c + +escape_absolute_uri/ + simp1_bad.c + simp2_bad.c + simp3_bad.c + strncmp_bad.c + full_bad.c + +_ Note _ + +Note that the original example uses apr_pstrdup(), which I elided to +avoid dynamic memory allocation, and strncasecmp(), for which I +substituted strncmp() to avoid penalizing tools for not understanding +ASCII arithmetic. + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/apache/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/apache/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,7 @@ +-= Apache =- + +Homepage: http://www.apache.org/ +Domain: Web (HTTP) Server + +Apache is a popular open source web server, which can be extended via +modules. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bargraph_tests frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bargraph_tests --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bargraph_tests 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bargraph_tests 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,6 @@ +sendmail/CVE-2002-1337/close_angle/close-angle_ptr_no_test_ok.c +sendmail/CVE-2002-1337/close_angle/close-angle_ptr_two_tests_bad.c +sendmail/CVE-2002-1337/close_angle/close-angle_ptr_one_test_ok.c +sendmail/CVE-2002-1337/close_angle/close-angle_ptr_one_test_bad.c +sendmail/CVE-2002-1337/close_angle/close-angle_ptr_no_test_bad.c +sendmail/CVE-2002-1337/close_angle/close-angle_ptr_two_tests_ok.c diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/bind.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/bind.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/bind.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/bind.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,12 @@ +#include "bind.h" + +int dn_expand(const u_char *msg, const u_char *eomorig, + const u_char *comp_dn, char *exp_dn, int length) +{ + if (nondet_int ()) + return -1; + else { + exp_dn[length-1] = (u_char) EOS; + } + return strlen(comp_dn); +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/bind.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/bind.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/bind.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/bind.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,53 @@ +#include "../../../../lib/stubs.h" + +/* Make u_char be a char. If we use unsigned chars, SatAbs gives us an + * error whenever we use strlen, since it won't iterate over a string + * of unsigned chars passed as chars. + */ +typedef char u_char; +typedef int u_int; +typedef int u_int32_t; + +/* Buffer being overflowed has size (MAXDATA*2); I believe this is + * because its a buffer of bytes, and two bytes keep being written at + * a time. + * + * Overflowed buffers in rrextract-sig/ may have an additional + * SPACE_FOR_VARS elements. */ +#define MAXDATA BASE_SZ + +/* Input buffer has this size, plus some constant depent on how many + * bytes get skipped before the operations involved in the + * overflow. This constant is different different variants (and is 0 + * for most of them). + * + * Input buffers buffers in rrextract-sig/ may have an additional + * SPACE_FOR_VARS elements.*/ +#define MSGLEN MAXDATA + 2 + +/* We don't loop over this, so we don't really care what it is. */ +#define NAMELEN 3 + +#define INT16SZ 2 +#define INT32SZ 4 + +#define CLASS_MAX 100 +#define MAXIMUM_TTL 101 + +/* Macros rrextract() uses */ +#define GETSHORT(to, from) \ + do {(to) = nondet_short(); (from) += INT16SZ;} while(0) +#define GETLONG(to, from) \ + do {(to) = nondet_long(); (from) += INT32SZ;} while(0) +#define BOUNDS_CHECK(ptr, count) \ + do {if ((ptr) + (count) > eom) return -1;} while(0) + +/* dn_expand -- "domain name expand" + * -- expands comp_dn (compressed domain name) to exp_dn (full domain name) + * -- returns -1 on error, or else strlen(comp_dn) + */ +int dn_expand(const u_char *msg, const u_char *eomorig, + const u_char *comp_dn, char *exp_dn, int length); + + +extern int nondet_int(); diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/frama-c-journal.ml frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/frama-c-journal.ml --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/frama-c-journal.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/frama-c-journal.ml 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,12 @@ +(* Frama-C journal generated at 16:32 the 05/09/2008 *) + +(* Running *) +let () = Journal.run () +let () = Cmdline.ForceValues.set true +let () = Cmdline.Files.set ["bind.c"; ] +let () = File.init_from_cmdline () +let () = !Db.Syntactic_callgraph.dump () +(* exception raised on: *) +let __ : unit = !Db.Value.compute () +(* Finished *) +let () = Journal.finished () diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,74 @@ +-= CA-1999-14 =- + +Vulnerable versions: + NXT: BIND [8.2, 8.2.2) + SIG: BIND [4.9.5, 8.x] +File(s): src/bin/named/ns_resp.c +Download from: + ftp://ftp.isc.org/isc/bind/src/DEPRECATED/8.2/bind-8.2-src.tar.gz + +Domain: DNS Server + +_ Vulnerable Functions and Buffers _ + +There are two unrelated vulnerabilities in rrextract(), reported in +the same CERT advisory. rrextract() processes a Resource Record in +packet form, and extracts fields out of it to store in BIND's internal +database format. (For the format of Resource Records, see +http://en.wikipedia.org/wiki/Domain_Name_System and +http://tools.ietf.org/html/rfc1035). The Resource Record packet is an +array of unsigned chars, ie. bytes. The data read from the packet +initializes many of rrextract()'s local variables. + +The "nxt bug" can overflow the local buffer data[] in rrextract() via +a call to memcpy(). The size argument comes from a call to +dn_expand(), and there is no check that this is less than or equal to +the size of dest[]. Creating a path to this error is complicated by +numerous reads of the input buffer, and much arithmetic on pointers +into the buffer. + +The "sig bug" is similar -- the data[] buffer is also overflowed. This +time, the size argument for memcpy() is a function of both a call to +dn_expand(), and the dlen field read out of the input buffer. It is +possible for this size to be a negative signed int, which causes +memcpy() to interpret it as a large unsigned amount. + +** NOTE ** For a tool to find the "sig bug", it must have support for +specific integer overflow semantics. + +The "nxt bug" is "b1" in Zitser's suite, and the "sig bug" is b2. + +These examples involve reading data "off-the-wire", offsets into +packets which aren't necessarily related through IF conditions, and a +bunch of pointer arithmetic based on these offsets. These factors make +it difficult for SMC; hence, the current decompositions are +significantly simpler than Zitser's. + +_ Simplifications _ + +rrextract-nxt: + simp - aims for as little detail as possible while preserving the vulnerability + two-expands - calls dn_expand() a second time, and increments cp by the result + expand_vars - reads several fields out of the rrp packet + +rrextract-sig: + vars - reads a variable out of rrp + expand - uses dn_expand() and advances cp and cp1 + simp - does neither of the above + both - does both of the above + +_ Decomposed Programs _ + +bind.h +bind.c + +rrextract-nxt/ + simp_{ok,bad}.c + two_expands_{ok,bad}.c + expands_vars_{ok,bad}.c + +rrextract-sig/ + simp_{ok,bad}.c + vars_{ok,bad}.c + expand_{ok,bad}.c + both_{ok,bad}.c diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/bind_rrxtract_nxt.err frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/bind_rrxtract_nxt.err --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/bind_rrxtract_nxt.err 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/bind_rrxtract_nxt.err 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,21 @@ +bind/CA-1999-14/rrextract-nxt/simp_bad.c:15: Warning: entering loop for the first time +No code for function nondet_short, default assigns generated +bind/CA-1999-14/rrextract-nxt/simp_bad.c:16: Warning: entering loop for the first time +No code for function dn_expand, default assigns generated +No code for function nondet_int, default assigns generated +bind/CA-1999-14/rrextract-nxt/simp_bad.c:29: Warning: assigning non deterministic value for the first time +../../lib/stubs.c:236: Warning: entering loop for the first time +../../lib/stubs.c:236: Warning: (TODO: emit a proper alarm) accessing uninitialized left-value: *(s + i) +../../lib/stubs.c:236: Warning: out of bounds read. assert \valid(s + i); + +../../lib/stubs.c:64: Warning: Assertion got status unknown. +../../lib/stubs.c:67: Warning: entering loop for the first time +../../lib/stubs.c:68: Warning: out of bounds read. assert \valid((char *)src + i); + +../../lib/stubs.c:68: Warning: (TODO: emit a proper alarm) accessing uninitialized left-value: *((char *)src + i) +../../lib/stubs.c:68: Warning: out of bounds write. assert \valid((char *)dest + i); + +[dominators] computing for function r_memcpy +[dominators] done for function r_memcpy +[dominators] computing for function strlen +[dominators] done for function strlen diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/bin_rrextract_nxt.log frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/bin_rrextract_nxt.log --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/bin_rrextract_nxt.log 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/bin_rrextract_nxt.log 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,66 @@ +[preprocessing] running gcc -C -E -I. bind/CA-1999-14/rrextract-nxt/simp_bad.c +[preprocessing] running gcc -C -E -I. ../../lib/stubs.c +[values] computing for function main +====== INITIAL STATE ====== +Computing globals values +====== INITIAL STATE COMPUTED ====== +Values of globals at initialization + +[values] computing for function rrextract <-main +[values] called from bind/CA-1999-14/rrextract-nxt/simp_bad.c:51 +[values] computing for function nondet_short <-rrextract <-main +[values] called from bind/CA-1999-14/rrextract-nxt/simp_bad.c:15 +[values] done for function nondet_short +[values] computing for function dn_expand <-rrextract <-main +[values] called from bind/CA-1999-14/rrextract-nxt/simp_bad.c:20 +[values] done for function dn_expand +[values] computing for function nondet_int <-rrextract <-main +[values] called from bind/CA-1999-14/rrextract-nxt/simp_bad.c:26 +[values] done for function nondet_int +[values] computing for function strlen <-rrextract <-main +[values] called from bind/CA-1999-14/rrextract-nxt/simp_bad.c:30 +[values] Recording results for strlen +[values] done for function strlen +[values] computing for function r_memcpy <-rrextract <-main +[values] called from bind/CA-1999-14/rrextract-nxt/simp_bad.c:33 +[values] Recording results for r_memcpy +[values] done for function r_memcpy +[values] Recording results for rrextract +[values] done for function rrextract +[values] Recording results for main +[values] done for function main + +====== VALUES COMPUTED ====== +Values for function strlen: + i ∈ [--..--] + __retres ∈ [--..--] + +Values for function r_memcpy: + data[0] ∈ [--..--] or UNINITIALIZED + [1..4] ∈ {0; } or UNINITIALIZED + [5] ∈ {0; } + i ∈ [-2147483648..-1] + +Values for function rrextract: + eom ∈ {{ &msg + {4; } ;}} + cp ∈ {{ &msg + [2..2147483649] ;}} + cp1 ∈ {{ &data + [1..4294967296] ;}} or UNINITIALIZED + dlen ∈ [--..--] + n ∈ [--..--] or UNINITIALIZED + data[0] ∈ [--..--] or UNINITIALIZED + [1..4] ∈ {0; } or UNINITIALIZED + [5] ∈ {0; } + tmp ∈ [--..--] or UNINITIALIZED + tmp_0 ∈ [--..--] or UNINITIALIZED + __retres ∈ {-1; 0; } + +Values for function main: + msglen ∈ {4; } + ret ∈ {-1; 0; } + dp ∈ {{ &msg ;}} + name[0..1] ∈ UNINITIALIZED + [2] ∈ {0; } + msg[0..2] ∈ UNINITIALIZED + [3] ∈ {0; } + __retres ∈ {0; } + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/expands_vars_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/expands_vars_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/expands_vars_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/expands_vars_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,82 @@ +#include "../bind.h" + +#define BYTES_TO_SKIP 10 + +static int +rrextract(u_char *msg, int msglen, u_char *rrp, u_char *dname, int namelen) +{ + u_char *eom, *cp, *cp1, *rdatap; + u_int class, type, dlen; + int n; + u_int32_t ttl; + u_char data[MAXDATA*2]; + data [(MAXDATA*2)-1] = EOS; + + cp = rrp; + eom = msg + msglen; + + if ((n = dn_expand(msg, eom, cp, (char *) dname, namelen)) < 0) { + return (-1); + } + + cp += n; + BOUNDS_CHECK(cp, 2*INT16SZ + INT32SZ + INT16SZ); + GETSHORT(type, cp); + GETSHORT(class, cp); + + if (class > CLASS_MAX) { + return (-1); + } + GETLONG(ttl, cp); + + if (ttl > MAXIMUM_TTL) { + ttl = 0; + } + GETSHORT(dlen, cp); + BOUNDS_CHECK(cp, dlen); + + rdatap = cp; + + if (nondet_int()) { + return (-1); + } + + + /* Cut the switch.... */ + + n = dn_expand(msg, eom, cp, (char *)data, sizeof data); + + if (n < 0) { + return (-1); + } + + if (nondet_int()) { + return (-1); + } + cp += n; + cp1 = data + strlen((char *)data) + 1; + + /* BAD */ + r_memcpy(cp1, cp, dlen - n); + + return 0; +} + +int main(){ + + int msglen, ret; + u_char *dp; + u_char name [NAMELEN]; + u_char msg [MSGLEN+BYTES_TO_SKIP]; + + name [NAMELEN-1] = EOS; + msg [MSGLEN+BYTES_TO_SKIP-1] = EOS; + + msglen = MSGLEN; + dp = msg; + + ret = rrextract(msg, msglen, dp, name, NAMELEN); + + return 0; + +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/expands_vars_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/expands_vars_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/expands_vars_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/expands_vars_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,89 @@ +#include "../bind.h" + +#define BYTES_TO_SKIP 10 + +static int +rrextract(u_char *msg, int msglen, u_char *rrp, u_char *dname, int namelen) +{ + u_char *eom, *cp, *cp1, *rdatap; + u_int class, type, dlen; + int n; + int n1,n2; + u_int32_t ttl; + u_char data[MAXDATA*2]; + data [(MAXDATA*2)-1] = EOS; + + cp = rrp; + eom = msg + msglen; + + if ((n = dn_expand(msg, eom, cp, (char *) dname, namelen)) < 0) { + return (-1); + } + + cp += n; + BOUNDS_CHECK(cp, 2*INT16SZ + INT32SZ + INT16SZ); + GETSHORT(type, cp); + GETSHORT(class, cp); + + if (class > CLASS_MAX) { + return (-1); + } + GETLONG(ttl, cp); + + if (ttl > MAXIMUM_TTL) { + ttl = 0; + } + GETSHORT(dlen, cp); + BOUNDS_CHECK(cp, dlen); + + rdatap = cp; + + if (nondet_int()) { + return (-1); + } + + + /* Cut the switch.... */ + + n = dn_expand(msg, eom, cp, (char *)data, sizeof data); + + if (n < 0) { + return (-1); + } + + if (nondet_int()) { + return (-1); + } + cp += n; + + n1 = strlen((char *)data) + 1; + cp1 = data + n1 + 1; + + n2 = dlen - n; + if (n2 > sizeof data - n1) { + return -1; + } + /* OK */ + r_memcpy(cp1, cp, n2); + + return 0; +} + +int main(){ + + int msglen, ret; + u_char *dp; + u_char name [NAMELEN]; + u_char msg [MSGLEN+BYTES_TO_SKIP]; + + name [NAMELEN-1] = EOS; + msg [MSGLEN+BYTES_TO_SKIP-1] = EOS; + + msglen = MSGLEN; + dp = msg; + + ret = rrextract(msg, msglen, dp, name, NAMELEN); + + return 0; + +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/frama-c.err frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/frama-c.err --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/frama-c.err 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/frama-c.err 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,17 @@ +bind/CA-1999-14/rrextract-nxt/simp_bad.c:15: Warning: entering loop for the first time +No code for function nondet_short, default assigns generated +bind/CA-1999-14/rrextract-nxt/simp_bad.c:16: Warning: entering loop for the first time +No code for function dn_expand, default assigns generated +No code for function nondet_int, default assigns generated +bind/CA-1999-14/rrextract-nxt/simp_bad.c:29: Warning: assigning non deterministic value for the first time +../../lib/stubs.c:236: Warning: entering loop for the first time +../../lib/stubs.c:236: Warning: (TODO: emit a proper alarm) accessing uninitialized left-value: *(s + i) +../../lib/stubs.c:236: Warning: out of bounds read. assert \valid(s + i); + +../../lib/stubs.c:64: Warning: Assertion got status unknown. +../../lib/stubs.c:67: Warning: entering loop for the first time +../../lib/stubs.c:68: Warning: out of bounds read. assert \valid((char *)src + i); + +../../lib/stubs.c:68: Warning: (TODO: emit a proper alarm) accessing uninitialized left-value: *((char *)src + i) +../../lib/stubs.c:68: Warning: out of bounds write. assert \valid((char *)dest + i); + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/frama_c_journal.ml frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/frama_c_journal.ml --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/frama_c_journal.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/frama_c_journal.ml 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,17 @@ +(* Frama-C journal generated at 15:18 the 08/10/2008 *) + +(* Running *) +let start () = + let () = Journal.run () in + let () = Cmdline.ForceValues.set true in + let () = Cmdline.Files.add "simp_bad.c" in + let () = Cmdline.Files.add "../bind.c" in + let () = Cmdline.Files.add "../../../../../lib/stubs.c" in + let () = File.init_from_cmdline () in + let () = !Db.Value.compute () in + (* Finished *) + Journal.finished () + +let () = + try start () + with e -> Format.eprintf "Journal raised an exception: %s" (Printexc.to_string e) diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/frama-c-journal.ml frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/frama-c-journal.ml --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/frama-c-journal.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/frama-c-journal.ml 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,12 @@ +(* Frama-C journal generated at 16:10 the 26/08/2008 *) + +(* Running *) +let () = Journal.run () +let () = Cmdline.ForceValues.set true +let () = Cmdline.Files.set ["expands_vars_bad.c"; ] +let () = Cmdline.Files.set ["../bind.c"; "expands_vars_bad.c"; ] +let () = File.init_from_cmdline () +let () = !Db.Syntactic_callgraph.dump () +let () = !Db.Value.compute () +(* Finished *) +let () = Journal.finished () diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/frama-c.log frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/frama-c.log --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/frama-c.log 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/frama-c.log 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,70 @@ +Parsing +[preprocessing] running gcc -C -E -I. bind/CA-1999-14/rrextract-nxt/simp_bad.c +[preprocessing] running gcc -C -E -I. ../../lib/stubs.c +Cleaning unused parts +Symbolic link +Starting semantical analysis +[values] computing for function main +====== INITIAL STATE ====== +Computing globals values +====== INITIAL STATE COMPUTED ====== +Values of globals at initialization + +[values] computing for function rrextract <-main +[values] called from bind/CA-1999-14/rrextract-nxt/simp_bad.c:51 +[values] computing for function nondet_short <-rrextract <-main +[values] called from bind/CA-1999-14/rrextract-nxt/simp_bad.c:15 +[values] done for function nondet_short +[values] computing for function dn_expand <-rrextract <-main +[values] called from bind/CA-1999-14/rrextract-nxt/simp_bad.c:20 +[values] done for function dn_expand +[values] computing for function nondet_int <-rrextract <-main +[values] called from bind/CA-1999-14/rrextract-nxt/simp_bad.c:26 +[values] done for function nondet_int +[values] computing for function strlen <-rrextract <-main +[values] called from bind/CA-1999-14/rrextract-nxt/simp_bad.c:30 +[values] Recording results for strlen +[values] done for function strlen +[values] computing for function r_memcpy <-rrextract <-main +[values] called from bind/CA-1999-14/rrextract-nxt/simp_bad.c:33 +[values] Recording results for r_memcpy +[values] done for function r_memcpy +[values] Recording results for rrextract +[values] done for function rrextract +[values] Recording results for main +[values] done for function main + +====== VALUES COMPUTED ====== +Values for function strlen: + i ∈ [--..--] + __retres ∈ [--..--] + +Values for function r_memcpy: + data[0] ∈ [--..--] or UNINITIALIZED + [1..4] ∈ {0; } or UNINITIALIZED + [5] ∈ {0; } + i ∈ [-2147483648..-1] + +Values for function rrextract: + eom ∈ {{ &msg + {4; } ;}} + cp ∈ {{ &msg + [2..2147483649] ;}} + cp1 ∈ {{ &data + [1..4294967296] ;}} or UNINITIALIZED + dlen ∈ [--..--] + n ∈ [--..--] or UNINITIALIZED + data[0] ∈ [--..--] or UNINITIALIZED + [1..4] ∈ {0; } or UNINITIALIZED + [5] ∈ {0; } + tmp ∈ [--..--] or UNINITIALIZED + tmp_0 ∈ [--..--] or UNINITIALIZED + __retres ∈ {-1; 0; } + +Values for function main: + msglen ∈ {4; } + ret ∈ {-1; 0; } + dp ∈ {{ &msg ;}} + name[0..1] ∈ UNINITIALIZED + [2] ∈ {0; } + msg[0..2] ∈ UNINITIALIZED + [3] ∈ {0; } + __retres ∈ {0; } + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/simp_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/simp_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/simp_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/simp_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,55 @@ +#include "../bind.h" + +#define SPACE_FOR_VARS 2 + +static int +rrextract(u_char *msg, int msglen, u_char *rrp, u_char *dname, int namelen) +{ + u_char *eom, *cp, *cp1, *rdatap; + u_int class, type, dlen; + int n; + u_char data[MAXDATA*2 + SPACE_FOR_VARS]; + data [(MAXDATA*2 + SPACE_FOR_VARS)-1] = EOS; cp = rrp; + eom = msg + msglen; + + GETSHORT(dlen, cp); + BOUNDS_CHECK(cp, dlen); + + /* Cut a bunch of stuff which we can reintroduce later. */ + + n = dn_expand(msg, eom, cp, (char *)data, sizeof data); + + if (n < 0) { + return (-1); + } + + if (nondet_int()) { + return (-1); + } + cp += n; + cp1 = data + strlen((char *)data) + 1; + + /* BAD */ + r_memcpy(cp1, cp, dlen - n); + + return 0; +} + +int main(){ + + int msglen, ret; + u_char *dp; + u_char name [NAMELEN]; + u_char msg [MSGLEN]; + + name [NAMELEN-1] = EOS; + msg [MSGLEN-1] = EOS; + + msglen = MSGLEN; + dp = msg; + + ret = rrextract(msg, msglen, dp, name, NAMELEN); + + return 0; + +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/simp_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/simp_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/simp_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/simp_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,64 @@ +#include "../bind.h" + +#define SPACE_FOR_VARS 2 + +static int +rrextract(u_char *msg, int msglen, u_char *rrp, u_char *dname, int namelen) +{ + u_char *eom, *cp, *cp1, *rdatap; + u_int class, type, dlen; + int n; + int n1,n2; + u_char data[MAXDATA*2 + SPACE_FOR_VARS]; + data [(MAXDATA*2 + SPACE_FOR_VARS)-1] = EOS; + + cp = rrp; + eom = msg + msglen; + + GETSHORT(dlen, cp); + BOUNDS_CHECK(cp, dlen); + + /* Cut a bunch of stuff which we can reintroduce later. */ + + n = dn_expand(msg, eom, cp, (char *)data, sizeof data); + + if (n < 0) { + return (-1); + } + + if (nondet_int()) { + return (-1); + } + cp += n; + + n1 = strlen((char *)data) + 1; + cp1 = data + n1 + 1; + + n2 = dlen - n; + if (n2 > sizeof data - n1) { + return -1; + } + /* OK */ + r_memcpy(cp1, cp, n2); + + return 0; +} + +int main(){ + + int msglen, ret; + u_char *dp; + u_char name [NAMELEN]; + u_char msg [MSGLEN]; + + name [NAMELEN-1] = EOS; + msg [MSGLEN-1] = EOS; + + msglen = MSGLEN; + dp = msg; + + ret = rrextract(msg, msglen, dp, name, NAMELEN); + + return 0; + +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/two_expands_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/two_expands_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/two_expands_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/two_expands_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,63 @@ +#include "../bind.h" + +#define SPACE_FOR_VARS 2 + +static int +rrextract(u_char *msg, int msglen, u_char *rrp, u_char *dname, int namelen) +{ + u_char *eom, *cp, *cp1, *rdatap; + u_int class, type, dlen; + int n; + u_char data[MAXDATA*2 + SPACE_FOR_VARS]; + data [(MAXDATA*2 + SPACE_FOR_VARS)-1] = EOS; + + cp = rrp; + eom = msg + msglen; + + GETSHORT(dlen, cp); + BOUNDS_CHECK(cp, dlen); + + if ((n = dn_expand(msg, eom, cp, (char *) dname, namelen)) < 0) { + return (-1); + } + + cp += n; + + /* Cut a bunch of stuff which we can reintroduce later. */ + + n = dn_expand(msg, eom, cp, (char *)data, sizeof data); + + if (n < 0) { + return (-1); + } + + if (nondet_int()) { + return (-1); + } + cp += n; + cp1 = data + strlen((char *)data) + 1; + + /* BAD */ + r_memcpy(cp1, cp, dlen - n); + + return 0; +} + +int main(){ + + int msglen, ret; + u_char *dp; + u_char name [NAMELEN]; + u_char msg [MSGLEN]; + + name [NAMELEN-1] = EOS; + msg [MSGLEN-1] = EOS; + + msglen = MSGLEN; + dp = msg; + + ret = rrextract(msg, msglen, dp, name, NAMELEN); + + return 0; + +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/two_expands_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/two_expands_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/two_expands_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-nxt/two_expands_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,71 @@ +#include "../bind.h" + +#define SPACE_FOR_VARS 2 + +static int +rrextract(u_char *msg, int msglen, u_char *rrp, u_char *dname, int namelen) +{ + u_char *eom, *cp, *cp1, *rdatap; + u_int class, type, dlen; + int n; + int n1, n2; + u_char data[MAXDATA*2 + SPACE_FOR_VARS]; + data [(MAXDATA*2 + SPACE_FOR_VARS)-1] = EOS; + + cp = rrp; + eom = msg + msglen; + + GETSHORT(dlen, cp); + BOUNDS_CHECK(cp, dlen); + + if ((n = dn_expand(msg, eom, cp, (char *) dname, namelen)) < 0) { + return (-1); + } + + cp += n; + + /* Cut a bunch of stuff which we can reintroduce later. */ + + n = dn_expand(msg, eom, cp, (char *)data, sizeof data); + + if (n < 0) { + return (-1); + } + + if (nondet_int()) { + return (-1); + } + cp += n; + + n1 = strlen((char *)data) + 1; + cp1 = data + n1 + 1; + + n2 = dlen - n; + if (n2 > sizeof data - n1) { + return -1; + } + + /* OK */ + r_memcpy(cp1, cp, n2); + + return 0; +} + +int main(){ + + int msglen, ret; + u_char *dp; + u_char name [NAMELEN]; + u_char msg [MSGLEN]; + + name [NAMELEN-1] = EOS; + msg [MSGLEN-1] = EOS; + + msglen = MSGLEN; + dp = msg; + + ret = rrextract(msg, msglen, dp, name, NAMELEN); + + return 0; + +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/both_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/both_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/both_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/both_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,81 @@ +#include "../bind.h" + +#define SPACE_FOR_VARS INT32SZ + +static int +rrextract(u_char *msg, int msglen, u_char *rrp, u_char *dname, int namelen) +{ + /* cp is used to read data from rrp[] (the Resource Record) + * cp1 is used to write data into data[] + * However, we sometimes abuse cp1 and use it for reading too. :-/ + */ + u_char *eom, *cp, *cp1, *rdatap; + u_int class, type, dlen; + int n; + long origTTL; + u_char data[MAXDATA*2+SPACE_FOR_VARS]; + data [(MAXDATA*2)-1+SPACE_FOR_VARS] = EOS; + + cp = rrp; + eom = msg + msglen; + + GETSHORT(dlen, cp); + BOUNDS_CHECK(cp, dlen); + + + /* Begin case T_SIG: */ + + /* Just read one variable --- the original reads several. */ + BOUNDS_CHECK(cp, SPACE_FOR_VARS); + cp1 = cp; + GETLONG(origTTL, cp1); + + /* Skip checks on times which are present in the original. */ + + /* Copy over initial fields, which we read above. */ + cp1 = (u_char *)data; + BOUNDS_CHECK(cp, SPACE_FOR_VARS); + memcpy(cp1, cp, SPACE_FOR_VARS); + cp += SPACE_FOR_VARS; + cp1 += SPACE_FOR_VARS; + + /* Expand the domain name, set cp1 past the end of the uncompressed + * domain name. + */ + n = dn_expand(msg, eom, cp, (char *)cp1, (sizeof data)); + if (n < 0) { + return (-1); + } + cp += n; + cp1 += strlen((char*)cp1)+1; + + /* Figure out the length of the "signature" to copy over and copy it. */ + n = dlen - (SPACE_FOR_VARS + n); + if (n > (int)(sizeof data) - (cp1 - (u_char *)data)) { + return (-1); /* out of room! */ + } + /* BAD */ + r_memcpy(cp1, cp, n); + + + return 0; +} + +int main(){ + + int msglen, ret; + u_char *dp; + u_char name [NAMELEN]; + u_char msg [MSGLEN+SPACE_FOR_VARS]; + + name [NAMELEN-1] = EOS; + msg [MSGLEN-1+SPACE_FOR_VARS] = EOS; + + msglen = MSGLEN; + dp = msg; + + ret = rrextract(msg, msglen, dp, name, NAMELEN); + + return 0; + +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/both_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/both_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/both_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/both_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,81 @@ +#include "../bind.h" + +#define SPACE_FOR_VARS INT32SZ + +static int +rrextract(u_char *msg, int msglen, u_char *rrp, u_char *dname, int namelen) +{ + /* cp is used to read data from rrp[] (the Resource Record) + * cp1 is used to write data into data[] + * However, we sometimes abuse cp1 and use it for reading too. :-/ + */ + u_char *eom, *cp, *cp1, *rdatap; + u_int class, type, dlen; + int n; + long origTTL; + u_char data[MAXDATA*2+SPACE_FOR_VARS]; + data [(MAXDATA*2)-1+SPACE_FOR_VARS] = EOS; + + cp = rrp; + eom = msg + msglen; + + GETSHORT(dlen, cp); + BOUNDS_CHECK(cp, dlen); + + + /* Begin case T_SIG: */ + + /* Just read one variable --- the original reads several. */ + BOUNDS_CHECK(cp, SPACE_FOR_VARS); + cp1 = cp; + GETLONG(origTTL, cp1); + + /* Skip checks on times which are present in the original. */ + + /* Copy over initial fields, which we read above. */ + cp1 = (u_char *)data; + BOUNDS_CHECK(cp, SPACE_FOR_VARS); + memcpy(cp1, cp, SPACE_FOR_VARS); + cp += SPACE_FOR_VARS; + cp1 += SPACE_FOR_VARS; + + /* Expand the domain name, set cp1 past the end of the uncompressed + * domain name. + */ + n = dn_expand(msg, eom, cp, (char *)cp1, (sizeof data)); + if (n < 0) { + return (-1); + } + cp += n; + cp1 += strlen((char*)cp1)+1; + + /* Figure out the length of the "signature" to copy over and copy it. */ + n = dlen - (SPACE_FOR_VARS + n); + if (n > (sizeof data) - (cp1 - (u_char *)data)) { + return (-1); /* out of room! */ + } + /* OK */ + r_memcpy(cp1, cp, n); + + + return 0; +} + +int main(){ + + int msglen, ret; + u_char *dp; + u_char name [NAMELEN]; + u_char msg [MSGLEN+SPACE_FOR_VARS]; + + name [NAMELEN-1] = EOS; + msg [MSGLEN-1+SPACE_FOR_VARS] = EOS; + + msglen = MSGLEN; + dp = msg; + + ret = rrextract(msg, msglen, dp, name, NAMELEN); + + return 0; + +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/expand_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/expand_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/expand_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/expand_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,78 @@ +#include "../bind.h" + +#define SPACE_FOR_VARS INT32SZ + +static int +rrextract(u_char *msg, int msglen, u_char *rrp, u_char *dname, int namelen) +{ + /* cp is used to read data from rrp[] (the Resource Record) + * cp1 is used to write data into data[] + * However, we sometimes abuse cp1 and use it for reading too. :-/ + */ + u_char *eom, *cp, *cp1, *rdatap; + u_int class, type, dlen; + int n; + long origTTL; + u_char data[MAXDATA*2+SPACE_FOR_VARS]; + data [(MAXDATA*2)-1+SPACE_FOR_VARS] = EOS; + + cp = rrp; + eom = msg + msglen; + + GETSHORT(dlen, cp); + BOUNDS_CHECK(cp, dlen); + + + /* Begin case T_SIG: */ + + /* Don't read any variables. */ + + /* Skip checks on times which are present in the original. */ + + /* Copy over initial fields, which we read above. */ + cp1 = (u_char *)data; + BOUNDS_CHECK(cp, SPACE_FOR_VARS); + memcpy(cp1, cp, SPACE_FOR_VARS); + cp += SPACE_FOR_VARS; + cp1 += SPACE_FOR_VARS; + + /* Expand the domain name, set cp1 past the end of the uncompressed + * domain name. + */ + n = dn_expand(msg, eom, cp, (char *)cp1, (sizeof data)); + if (n < 0) { + return (-1); + } + cp += n; + cp1 += strlen((char*)cp1)+1; + + /* Figure out the length of the "signature" to copy over and copy it. */ + n = dlen - (SPACE_FOR_VARS + n); + if (n > (int)(sizeof data) - (cp1 - (u_char *)data)) { + return (-1); /* out of room! */ + } + /* BAD */ + r_memcpy(cp1, cp, n); + + + return 0; +} + +int main(){ + + int msglen, ret; + u_char *dp; + u_char name [NAMELEN]; + u_char msg [MSGLEN+SPACE_FOR_VARS]; + + name [NAMELEN-1] = EOS; + msg [MSGLEN-1+SPACE_FOR_VARS] = EOS; + + msglen = MSGLEN; + dp = msg; + + ret = rrextract(msg, msglen, dp, name, NAMELEN); + + return 0; + +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/expand_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/expand_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/expand_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/expand_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,78 @@ +#include "../bind.h" + +#define SPACE_FOR_VARS INT32SZ + +static int +rrextract(u_char *msg, int msglen, u_char *rrp, u_char *dname, int namelen) +{ + /* cp is used to read data from rrp[] (the Resource Record) + * cp1 is used to write data into data[] + * However, we sometimes abuse cp1 and use it for reading too. :-/ + */ + u_char *eom, *cp, *cp1, *rdatap; + u_int class, type, dlen; + int n; + long origTTL; + u_char data[MAXDATA*2+SPACE_FOR_VARS]; + data [(MAXDATA*2)-1+SPACE_FOR_VARS] = EOS; + + cp = rrp; + eom = msg + msglen; + + GETSHORT(dlen, cp); + BOUNDS_CHECK(cp, dlen); + + + /* Begin case T_SIG: */ + + /* Don't read any variables. */ + + /* Skip checks on times which are present in the original. */ + + /* Copy over initial fields, which we read above. */ + cp1 = (u_char *)data; + BOUNDS_CHECK(cp, SPACE_FOR_VARS); + memcpy(cp1, cp, SPACE_FOR_VARS); + cp += SPACE_FOR_VARS; + cp1 += SPACE_FOR_VARS; + + /* Expand the domain name, set cp1 past the end of the uncompressed + * domain name. + */ + n = dn_expand(msg, eom, cp, (char *)cp1, (sizeof data)); + if (n < 0) { + return (-1); + } + cp += n; + cp1 += strlen((char*)cp1)+1; + + /* Figure out the length of the "signature" to copy over and copy it. */ + n = dlen - (SPACE_FOR_VARS + n); + if (n > (sizeof data) - (cp1 - (u_char *)data)) { + return (-1); /* out of room! */ + } + /* OK */ + r_memcpy(cp1, cp, n); + + + return 0; +} + +int main(){ + + int msglen, ret; + u_char *dp; + u_char name [NAMELEN]; + u_char msg [MSGLEN+SPACE_FOR_VARS]; + + name [NAMELEN-1] = EOS; + msg [MSGLEN-1+SPACE_FOR_VARS] = EOS; + + msglen = MSGLEN; + dp = msg; + + ret = rrextract(msg, msglen, dp, name, NAMELEN); + + return 0; + +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/simp_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/simp_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/simp_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/simp_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,75 @@ +#include "../bind.h" + +#define SPACE_FOR_VARS INT32SZ + +static int +rrextract(u_char *msg, int msglen, u_char *rrp, u_char *dname, int namelen) +{ + /* cp is used to read data from rrp[] (the Resource Record) + * cp1 is used to write data into data[] + * However, we sometimes abuse cp1 and use it for reading too. :-/ + */ + u_char *eom, *cp, *cp1, *rdatap; + u_int class, type, dlen; + int n; + long origTTL; + u_char data[MAXDATA*2+SPACE_FOR_VARS]; + data [(MAXDATA*2)-1+SPACE_FOR_VARS] = EOS; + + cp = rrp; + eom = msg + msglen; + + GETSHORT(dlen, cp); + BOUNDS_CHECK(cp, dlen); + + + /* Begin case T_SIG: */ + + /* Don't read any variables. */ + + /* Skip checks on times which are present in the original. */ + + /* Copy over initial fields, which we read above. */ + cp1 = (u_char *)data; + BOUNDS_CHECK(cp, SPACE_FOR_VARS); + memcpy(cp1, cp, SPACE_FOR_VARS); + cp += SPACE_FOR_VARS; + cp1 += SPACE_FOR_VARS; + + /* No dn_expand(), no incrementing the pointers. + */ + n = nondet_int(); + if (n < 0) { + return (-1); + } + + /* Figure out the length of the "signature" to copy over and copy it. */ + n = dlen - (SPACE_FOR_VARS + n); + if (n > (int)(sizeof data) - (cp1 - (u_char *)data)) { + return (-1); /* out of room! */ + } + /* BAD */ + r_memcpy(cp1, cp, n); + + + return 0; +} + +int main(){ + + int msglen, ret; + u_char *dp; + u_char name [NAMELEN]; + u_char msg [MSGLEN+SPACE_FOR_VARS]; + + name [NAMELEN-1] = EOS; + msg [MSGLEN-1+SPACE_FOR_VARS] = EOS; + + msglen = MSGLEN; + dp = msg; + + ret = rrextract(msg, msglen, dp, name, NAMELEN); + + return 0; + +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/simp_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/simp_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/simp_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/simp_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,75 @@ +#include "../bind.h" + +#define SPACE_FOR_VARS INT32SZ + +static int +rrextract(u_char *msg, int msglen, u_char *rrp, u_char *dname, int namelen) +{ + /* cp is used to read data from rrp[] (the Resource Record) + * cp1 is used to write data into data[] + * However, we sometimes abuse cp1 and use it for reading too. :-/ + */ + u_char *eom, *cp, *cp1, *rdatap; + u_int class, type, dlen; + int n; + long origTTL; + u_char data[MAXDATA*2+SPACE_FOR_VARS]; + data [(MAXDATA*2)-1+SPACE_FOR_VARS] = EOS; + + cp = rrp; + eom = msg + msglen; + + GETSHORT(dlen, cp); + BOUNDS_CHECK(cp, dlen); + + + /* Begin case T_SIG: */ + + /* Don't read any variables. */ + + /* Skip checks on times which are present in the original. */ + + /* Copy over initial fields, which we read above. */ + cp1 = (u_char *)data; + BOUNDS_CHECK(cp, SPACE_FOR_VARS); + memcpy(cp1, cp, SPACE_FOR_VARS); + cp += SPACE_FOR_VARS; + cp1 += SPACE_FOR_VARS; + + /* No dn_expand(), no incrementing the pointers. + */ + n = nondet_int(); + if (n < 0) { + return (-1); + } + + /* Figure out the length of the "signature" to copy over and copy it. */ + n = dlen - (SPACE_FOR_VARS + n); + if (n > (sizeof data) - (cp1 - (u_char *)data)) { + return (-1); /* out of room! */ + } + /* OK */ + r_memcpy(cp1, cp, n); + + + return 0; +} + +int main(){ + + int msglen, ret; + u_char *dp; + u_char name [NAMELEN]; + u_char msg [MSGLEN+SPACE_FOR_VARS]; + + name [NAMELEN-1] = EOS; + msg [MSGLEN-1+SPACE_FOR_VARS] = EOS; + + msglen = MSGLEN; + dp = msg; + + ret = rrextract(msg, msglen, dp, name, NAMELEN); + + return 0; + +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/vars_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/vars_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/vars_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/vars_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,78 @@ +#include "../bind.h" + +#define SPACE_FOR_VARS INT32SZ + +static int +rrextract(u_char *msg, int msglen, u_char *rrp, u_char *dname, int namelen) +{ + /* cp is used to read data from rrp[] (the Resource Record) + * cp1 is used to write data into data[] + * However, we sometimes abuse cp1 and use it for reading too. :-/ + */ + u_char *eom, *cp, *cp1, *rdatap; + u_int class, type, dlen; + int n; + long origTTL; + u_char data[MAXDATA*2+SPACE_FOR_VARS]; + data [(MAXDATA*2)-1+SPACE_FOR_VARS] = EOS; + + cp = rrp; + eom = msg + msglen; + + GETSHORT(dlen, cp); + BOUNDS_CHECK(cp, dlen); + + + /* Begin case T_SIG: */ + + /* Just read one variable --- the original reads several. */ + BOUNDS_CHECK(cp, SPACE_FOR_VARS); + cp1 = cp; + GETLONG(origTTL, cp1); + + /* Skip checks on times which are present in the original. */ + + /* Copy over initial fields, which we read above. */ + cp1 = (u_char *)data; + BOUNDS_CHECK(cp, SPACE_FOR_VARS); + memcpy(cp1, cp, SPACE_FOR_VARS); + cp += SPACE_FOR_VARS; + cp1 += SPACE_FOR_VARS; + + /* No dn_expand(), no incrementing the pointers. + */ + n = nondet_int(); + if (n < 0) { + return (-1); + } + + /* Figure out the length of the "signature" to copy over and copy it. */ + n = dlen - (SPACE_FOR_VARS + n); + if (n > (int)(sizeof data) - (cp1 - (u_char *)data)) { + return (-1); /* out of room! */ + } + /* BAD */ + r_memcpy(cp1, cp, n); + + + return 0; +} + +int main(){ + + int msglen, ret; + u_char *dp; + u_char name [NAMELEN]; + u_char msg [MSGLEN+SPACE_FOR_VARS]; + + name [NAMELEN-1] = EOS; + msg [MSGLEN-1+SPACE_FOR_VARS] = EOS; + + msglen = MSGLEN; + dp = msg; + + ret = rrextract(msg, msglen, dp, name, NAMELEN); + + return 0; + +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/vars_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/vars_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/vars_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CA-1999-14/rrextract-sig/vars_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,78 @@ +#include "../bind.h" + +#define SPACE_FOR_VARS INT32SZ + +static int +rrextract(u_char *msg, int msglen, u_char *rrp, u_char *dname, int namelen) +{ + /* cp is used to read data from rrp[] (the Resource Record) + * cp1 is used to write data into data[] + * However, we sometimes abuse cp1 and use it for reading too. :-/ + */ + u_char *eom, *cp, *cp1, *rdatap; + u_int class, type, dlen; + int n; + long origTTL; + u_char data[MAXDATA*2+SPACE_FOR_VARS]; + data [(MAXDATA*2)-1+SPACE_FOR_VARS] = EOS; + + cp = rrp; + eom = msg + msglen; + + GETSHORT(dlen, cp); + BOUNDS_CHECK(cp, dlen); + + + /* Begin case T_SIG: */ + + /* Just read one variable --- the original reads several. */ + BOUNDS_CHECK(cp, SPACE_FOR_VARS); + cp1 = cp; + GETLONG(origTTL, cp1); + + /* Skip checks on times which are present in the original. */ + + /* Copy over initial fields, which we read above. */ + cp1 = (u_char *)data; + BOUNDS_CHECK(cp, SPACE_FOR_VARS); + memcpy(cp1, cp, SPACE_FOR_VARS); + cp += SPACE_FOR_VARS; + cp1 += SPACE_FOR_VARS; + + /* No dn_expand(), no incrementing the pointers. + */ + n = nondet_int(); + if (n < 0) { + return (-1); + } + + /* Figure out the length of the "signature" to copy over and copy it. */ + n = dlen - (SPACE_FOR_VARS + n); + if (n > (sizeof data) - (cp1 - (u_char *)data)) { + return (-1); /* out of room! */ + } + /* OK */ + r_memcpy(cp1, cp, n); + + + return 0; +} + +int main(){ + + int msglen, ret; + u_char *dp; + u_char name [NAMELEN]; + u_char msg [MSGLEN+SPACE_FOR_VARS]; + + name [NAMELEN-1] = EOS; + msg [MSGLEN-1+SPACE_FOR_VARS] = EOS; + + msglen = MSGLEN; + dp = msg; + + ret = rrextract(msg, msglen, dp, name, NAMELEN); + + return 0; + +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/bind.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/bind.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/bind.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/bind.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,75 @@ +#include "../../../../lib/stubs.h" + +/* Size of the buffer being overflowed. */ +#define BUFSZ BASE_SZ + +/* Size of the input buffer. */ +#define INSZ BUFSZ + 3 + +typedef char u_char; +typedef short int16_t; +typedef int time_t; +typedef int u_int; +typedef int uint32_t; +typedef long u_long; + +struct databuf { + struct databuf *d_next; /* linked list */ + int16_t d_type; /* type number */ + u_char d_data[sizeof(char*)]; /* malloc'd (padded) */ + int16_t d_class; /* class number */ + int d_flags; /* see below */ + int16_t d_zone; /* zone number or 0 for the cache */ +}; + +struct namebuf { + u_int n_hashval; /* hash value of n_dname */ + struct namebuf *n_next; /* linked list */ + struct databuf *n_data; /* data records */ + struct namebuf *n_parent; /* parent domain */ + struct hashbuf *n_hash; /* hash table for children */ + char _n_name[sizeof(void*)]; /* Counted str, malloc'ed. */ +}; + +struct timeval +{ + time_t tv_sec; /* Seconds. */ +}; + +/* Internet address. */ +typedef uint32_t in_addr_t; +struct in_addr { + in_addr_t s_addr; +}; + +struct sockaddr_in { + short sin_family; // e.g. AF_INET + unsigned short sin_port; // e.g. htons(3490) + struct in_addr sin_addr; // see struct in_addr, below +}; + +#define NSMAX 16 /* from bind's ns_defs.h */ +struct qinfo { + struct databuf *q_usedns[NSMAX]; /* databuf for NS that we've tried */ + u_char q_naddr; /* number of addr's in q_addr */ + u_char q_nusedns; /* number of elements in q_usedns[] */ +}; + +#define T_A 1 +#define T_NS 2 + +#define INIT_REFRESH 600 /* retry time for initial secondary */ + /* contact (10 minutes) */ + +#define NAME(nb) ((nb)._n_name + 1) + +#define C_ANY 255 /* wildcard match */ +#define T_ANY 255 /* wildcard match */ + +/* + * d_flags definitions + */ +#define DB_F_HINT 0x01 /* databuf belongs to fcachetab */ +#define DB_F_ACTIVE 0x02 /* databuf is linked into a cache */ + +#define DB_Z_CACHE (0) /* cache-zone-only db_dump() */ diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/big_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/big_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/big_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/big_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,238 @@ +#include "../bind.h" + +extern int nondet_int(); + +/* Avoid mallocing databufs and namebufs. */ +struct databuf dummybuf; +struct namebuf dummyNameBuf; +struct databuf dummybuf2; + +struct timeval tt; + +/* Another completely unsound stub brought to you by the Verisec Project. */ +const char *p_type (int type) +{ + return NULL; +} + +/* Since I'm not providing a complete model, this'll complain about some + * invalid pointer dereferences. + */ +int haveComplained (const char *tag1, + const char *tag2) +{ + struct complaint { + const char *tag1, *tag2; + time_t expire; + struct complaint *next; + }; + static struct complaint *List = NULL; + struct complaint *cur, *next, *prev; + int r = 0; + struct complaint dummy; + + for (cur = List, prev = NULL; cur; prev = cur, cur = next) { + next = cur->next; + if (tt.tv_sec > cur->expire) { + if (prev) + prev->next = next; + else + List = next; + //free((char*) cur); + cur = prev; + } else if ((tag1 == cur->tag1) && (tag2 == cur->tag2)) { + r++; + } + } + if (!r) { + cur = &dummy;//(struct complaint *)malloc(sizeof(struct complaint)); + if (cur) { + cur->tag1 = tag1; + cur->tag2 = tag2; + cur->expire = tt.tv_sec + INIT_REFRESH; /* "10:00" */ + cur->next = NULL; + if (prev) + prev->next = cur; + else + List = cur; + } + } + return (r); + +} + +static void +nslookupComplain(const char *sysloginfo, + const char *net_queryname, + const char *complaint, + const char *net_dname, + const struct databuf *a_rr, + const struct databuf *nsdp) +{ + char queryname[INSZ+1], dname[INSZ+1]; + const char *a, *ns; + const char *a_type; + int print_a; + + strncpy(queryname, net_queryname, sizeof queryname); + queryname[(sizeof queryname) - 1] = EOS; + strncpy(dname, net_dname, sizeof dname); + dname[(sizeof dname) - 1] = EOS; + + if (sysloginfo && queryname && !haveComplained(queryname, complaint)) { + char buf[BUFSZ]; + + a = ns = (char *)NULL; + print_a = (a_rr->d_type == T_A); + a_type = p_type(a_rr->d_type); + + if ( a != NULL || ns != NULL) { + /* BAD */ + r_strcpy (buf, sysloginfo); + } else { + /* BAD */ + r_strcpy (buf, sysloginfo); + } + } +} + +int +match(struct databuf *dp, + int class, + int type) +{ + if (dp->d_class != class && class != C_ANY) + return (0); + if (dp->d_type != type && type != T_ANY) + return (0); + return (1); +} + +/* Really dumb stub. */ +struct namebuf * +nlookup(const char *name, + struct hashbuf **htpp, + const char **fname, + int insert) +{ + dummyNameBuf.n_data = &dummybuf2; + /* I suspect SatAbs assumes globals are initialized to 0 -- I really + shouldn't need to be hard-wiring these. - Tom */ + dummybuf2.d_type = T_NS; + dummybuf2.d_zone = 1; + return &dummyNameBuf; +} + +int +findMyZone(struct namebuf *np, + int class) +{ + return nondet_int (); +} + + +int +nslookup(struct databuf *nsp[], + struct qinfo *qp, + const char *syslogdname, + const char *sysloginfo) +{ + struct namebuf *np; + struct databuf *dp, *nsdp; + struct qserv *qs; + int n; + u_int i; + struct hashbuf *tmphtp; + char *dname; + const char *fname; + int oldn, naddr, class, found_arr, potential_ns; + time_t curtime; + + + potential_ns = 0; + n = qp->q_naddr; + naddr = n; + curtime = (u_long) tt.tv_sec; + while (1) { + nsdp = *nsp; + nsp++; + if (nsdp == NULL) break; + class = nsdp->d_class; + dname = (char *)nsdp->d_data; + + for (i = 0; i < qp->q_nusedns; i++) { + if (qp->q_usedns[i] == nsdp) { + goto skipserver; + } + } + + /* Heap-allocated pointers seem to break SatAbs. */ + /*tmphtp = ((nsdp->d_flags & DB_F_HINT) ?fcachetab :hashtab);*/ + np = nlookup(dname, &tmphtp, &fname, 1); + if (np == NULL) { + found_arr = 0; + goto need_sysquery; + } + if (fname != dname) { + if (findMyZone(np, class) == DB_Z_CACHE) { + assert (np != NULL); + for (; np != NULL; /*np = np_parent(np)*/) { + for (dp = np->n_data; dp; dp = dp->d_next) { + if (match(dp, class, T_NS)) { + /* SatAbs won't accept just "if (dp->d_zone)" :-/ */ + if (dp->d_zone != 0) { + //assert (0); + static char *complaint = + "Glue A RR missing"; + nslookupComplain(sysloginfo, + syslogdname, + complaint, + dname, dp, + nsdp); + goto skipserver; + } else { + found_arr = 0; + goto need_sysquery; + } + } + } + } + found_arr = 0; + goto need_sysquery; + } else { + continue; + } + } + + break; + } + + /* Totally bogus GOTO targets. */ + need_sysquery: + skipserver: + return (n - naddr); + +} + + +int main () +{ + struct databuf *nsp[2]; + struct qinfo qp; + char sysloginfo [INSZ]; + char syslogdname [INSZ]; + + nsp[0] = &dummybuf; + nsp[1] = NULL; + + sysloginfo[INSZ-1] = EOS; + syslogdname[INSZ-1] = EOS; + + + nslookup(nsp, + &qp, + &sysloginfo, + &syslogdname); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/big_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/big_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/big_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/big_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,238 @@ +#include "../bind.h" + +extern int nondet_int(); + +/* Avoid mallocing databufs and namebufs. */ +struct databuf dummybuf; +struct namebuf dummyNameBuf; +struct databuf dummybuf2; + +struct timeval tt; + +/* Another completely unsound stub brought to you by the Verisec Project. */ +const char *p_type (int type) +{ + return NULL; +} + +/* Since I'm not providing a complete model, this'll complain about some + * invalid pointer dereferences. + */ +int haveComplained (const char *tag1, + const char *tag2) +{ + struct complaint { + const char *tag1, *tag2; + time_t expire; + struct complaint *next; + }; + static struct complaint *List = NULL; + struct complaint *cur, *next, *prev; + int r = 0; + struct complaint dummy; + + for (cur = List, prev = NULL; cur; prev = cur, cur = next) { + next = cur->next; + if (tt.tv_sec > cur->expire) { + if (prev) + prev->next = next; + else + List = next; + //free((char*) cur); + cur = prev; + } else if ((tag1 == cur->tag1) && (tag2 == cur->tag2)) { + r++; + } + } + if (!r) { + cur = &dummy;//(struct complaint *)malloc(sizeof(struct complaint)); + if (cur) { + cur->tag1 = tag1; + cur->tag2 = tag2; + cur->expire = tt.tv_sec + INIT_REFRESH; /* "10:00" */ + cur->next = NULL; + if (prev) + prev->next = cur; + else + List = cur; + } + } + return (r); + +} + +static void +nslookupComplain(const char *sysloginfo, + const char *net_queryname, + const char *complaint, + const char *net_dname, + const struct databuf *a_rr, + const struct databuf *nsdp) +{ + char queryname[INSZ+1], dname[INSZ+1]; + const char *a, *ns; + const char *a_type; + int print_a; + + strncpy(queryname, net_queryname, sizeof queryname); + queryname[(sizeof queryname) - 1] = EOS; + strncpy(dname, net_dname, sizeof dname); + dname[(sizeof dname) - 1] = EOS; + + if (sysloginfo && queryname && !haveComplained(queryname, complaint)) { + char buf[BUFSZ]; + + a = ns = (char *)NULL; + print_a = (a_rr->d_type == T_A); + a_type = p_type(a_rr->d_type); + + if ( a != NULL || ns != NULL) { + /* OK */ + r_strncpy (buf, sysloginfo, BUFSZ); + } else { + /* OK */ + r_strncpy (buf, sysloginfo, BUFSZ); + } + } +} + +int +match(struct databuf *dp, + int class, + int type) +{ + if (dp->d_class != class && class != C_ANY) + return (0); + if (dp->d_type != type && type != T_ANY) + return (0); + return (1); +} + +/* Really dumb stub. */ +struct namebuf * +nlookup(const char *name, + struct hashbuf **htpp, + const char **fname, + int insert) +{ + dummyNameBuf.n_data = &dummybuf2; + /* I suspect SatAbs assumes globals are initialized to 0 -- I really + shouldn't need to be hard-wiring these. - Tom */ + dummybuf2.d_type = T_NS; + dummybuf2.d_zone = 1; + return &dummyNameBuf; +} + +int +findMyZone(struct namebuf *np, + int class) +{ + return nondet_int (); +} + + +int +nslookup(struct databuf *nsp[], + struct qinfo *qp, + const char *syslogdname, + const char *sysloginfo) +{ + struct namebuf *np; + struct databuf *dp, *nsdp; + struct qserv *qs; + int n; + u_int i; + struct hashbuf *tmphtp; + char *dname; + const char *fname; + int oldn, naddr, class, found_arr, potential_ns; + time_t curtime; + + + potential_ns = 0; + n = qp->q_naddr; + naddr = n; + curtime = (u_long) tt.tv_sec; + while (1) { + nsdp = *nsp; + nsp++; + if (nsdp == NULL) break; + class = nsdp->d_class; + dname = (char *)nsdp->d_data; + + for (i = 0; i < qp->q_nusedns; i++) { + if (qp->q_usedns[i] == nsdp) { + goto skipserver; + } + } + + /* Heap-allocated pointers seem to break SatAbs. */ + /*tmphtp = ((nsdp->d_flags & DB_F_HINT) ?fcachetab :hashtab);*/ + np = nlookup(dname, &tmphtp, &fname, 1); + if (np == NULL) { + found_arr = 0; + goto need_sysquery; + } + if (fname != dname) { + if (findMyZone(np, class) == DB_Z_CACHE) { + assert (np != NULL); + for (; np != NULL; /*np = np_parent(np)*/) { + for (dp = np->n_data; dp; dp = dp->d_next) { + if (match(dp, class, T_NS)) { + /* SatAbs won't accept just "if (dp->d_zone)" :-/ */ + if (dp->d_zone != 0) { + //assert (0); + static char *complaint = + "Glue A RR missing"; + nslookupComplain(sysloginfo, + syslogdname, + complaint, + dname, dp, + nsdp); + goto skipserver; + } else { + found_arr = 0; + goto need_sysquery; + } + } + } + } + found_arr = 0; + goto need_sysquery; + } else { + continue; + } + } + + break; + } + + /* Totally bogus GOTO targets. */ + need_sysquery: + skipserver: + return (n - naddr); + +} + + +int main () +{ + struct databuf *nsp[2]; + struct qinfo qp; + char sysloginfo [INSZ]; + char syslogdname [INSZ]; + + nsp[0] = &dummybuf; + nsp[1] = NULL; + + sysloginfo[INSZ-1] = EOS; + syslogdname[INSZ-1] = EOS; + + + nslookup(nsp, + &qp, + &sysloginfo, + &syslogdname); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/med_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/med_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/med_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/med_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,109 @@ +#include "../bind.h" + +extern int nondet_int(); + +struct timeval tt; + +/* Another completely unsound stub brought to you by the Verisec Project. */ +const char *p_type (int type) +{ + return NULL; +} + +int haveComplained (const char *tag1, + const char *tag2) +{ + struct complaint { + const char *tag1, *tag2; + time_t expire; + struct complaint *next; + }; + static struct complaint *List = NULL; + struct complaint *cur, *next, *prev; + int r = 0; + struct complaint dummy; + + for (cur = List, prev = NULL; cur; prev = cur, cur = next) { + next = cur->next; + if (tt.tv_sec > cur->expire) { + if (prev) + prev->next = next; + else + List = next; + //free((char*) cur); + cur = prev; + } else if ((tag1 == cur->tag1) && (tag2 == cur->tag2)) { + r++; + } + } + if (!r) { + cur = &dummy;//(struct complaint *)malloc(sizeof(struct complaint)); + if (cur) { + cur->tag1 = tag1; + cur->tag2 = tag2; + cur->expire = tt.tv_sec + INIT_REFRESH; // "10:00" + cur->next = NULL; + if (prev) + prev->next = cur; + else + List = cur; + } + } + return (r); + +} + +static void +nslookupComplain(const char *sysloginfo, + const char *net_queryname, + const char *complaint, + const char *net_dname, + const struct databuf *a_rr, + const struct databuf *nsdp) +{ + char queryname[INSZ+1], dname[INSZ+1]; + const char *a, *ns; + const char *a_type; + int print_a; + + strncpy(queryname, net_queryname, sizeof queryname); + queryname[(sizeof queryname) - 1] = EOS; + strncpy(dname, net_dname, sizeof dname); + dname[(sizeof dname) - 1] = EOS; + + if (sysloginfo && queryname && !haveComplained(queryname, complaint)) { + char buf[BUFSZ]; + + a = ns = (char *)NULL; + print_a = (a_rr->d_type == T_A); + a_type = p_type(a_rr->d_type); + + if ( a != NULL || ns != NULL) { + /* BAD */ + r_strcpy (buf, sysloginfo); + } else { + /* BAD */ + r_strcpy (buf, sysloginfo); + } + } +} + +int main () +{ + char sysloginfo [INSZ]; + char net_queryname [INSZ]; + char net_dname [INSZ]; + struct databuf a_rr; + struct databuf nsdp; + static char *complaint = + "Glue A RR missing"; + + sysloginfo [INSZ-1] = EOS; + net_queryname [INSZ-1] = EOS; + net_dname [INSZ-1] = EOS; + + nslookupComplain (sysloginfo, net_queryname, complaint, net_dname, + &a_rr, &nsdp); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/med_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/med_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/med_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/med_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,109 @@ +#include "../bind.h" + +extern int nondet_int(); + +struct timeval tt; + +/* Another completely unsound stub brought to you by the Verisec Project. */ +const char *p_type (int type) +{ + return NULL; +} + +int haveComplained (const char *tag1, + const char *tag2) +{ + struct complaint { + const char *tag1, *tag2; + time_t expire; + struct complaint *next; + }; + static struct complaint *List = NULL; + struct complaint *cur, *next, *prev; + int r = 0; + struct complaint dummy; + + for (cur = List, prev = NULL; cur; prev = cur, cur = next) { + next = cur->next; + if (tt.tv_sec > cur->expire) { + if (prev) + prev->next = next; + else + List = next; + //free((char*) cur); + cur = prev; + } else if ((tag1 == cur->tag1) && (tag2 == cur->tag2)) { + r++; + } + } + if (!r) { + cur = &dummy;//(struct complaint *)malloc(sizeof(struct complaint)); + if (cur) { + cur->tag1 = tag1; + cur->tag2 = tag2; + cur->expire = tt.tv_sec + INIT_REFRESH; // "10:00" + cur->next = NULL; + if (prev) + prev->next = cur; + else + List = cur; + } + } + return (r); + +} + +static void +nslookupComplain(const char *sysloginfo, + const char *net_queryname, + const char *complaint, + const char *net_dname, + const struct databuf *a_rr, + const struct databuf *nsdp) +{ + char queryname[INSZ+1], dname[INSZ+1]; + const char *a, *ns; + const char *a_type; + int print_a; + + strncpy(queryname, net_queryname, sizeof queryname); + queryname[(sizeof queryname) - 1] = EOS; + strncpy(dname, net_dname, sizeof dname); + dname[(sizeof dname) - 1] = EOS; + + if (sysloginfo && queryname && !haveComplained(queryname, complaint)) { + char buf[BUFSZ]; + + a = ns = (char *)NULL; + print_a = (a_rr->d_type == T_A); + a_type = p_type(a_rr->d_type); + + if ( a != NULL || ns != NULL) { + /* OK */ + r_strncpy (buf, sysloginfo, BUFSZ); + } else { + /* OK */ + r_strncpy (buf, sysloginfo, BUFSZ); + } + } +} + +int main () +{ + char sysloginfo [INSZ]; + char net_queryname [INSZ]; + char net_dname [INSZ]; + struct databuf a_rr; + struct databuf nsdp; + static char *complaint = + "Glue A RR missing"; + + sysloginfo [INSZ-1] = EOS; + net_queryname [INSZ-1] = EOS; + net_dname [INSZ-1] = EOS; + + nslookupComplain (sysloginfo, net_queryname, complaint, net_dname, + &a_rr, &nsdp); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/small_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/small_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/small_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/small_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,72 @@ +#include "../bind.h" + +extern int nondet_int(); + +int haveComplained (const char *tag1, + const char *tag2) +{ + return nondet_int(); +} + +/* Another completely unsound stub brought to you by the Verisec Project. */ +const char *p_type (int type) +{ + return NULL; +} + + +static void +nslookupComplain(const char *sysloginfo, + const char *net_queryname, + const char *complaint, + const char *net_dname, + const struct databuf *a_rr, + const struct databuf *nsdp) +{ + char queryname[INSZ+1], dname[INSZ+1]; + const char *a, *ns; + const char *a_type; + int print_a; + + strncpy(queryname, net_queryname, sizeof queryname); + queryname[(sizeof queryname) - 1] = EOS; + strncpy(dname, net_dname, sizeof dname); + dname[(sizeof dname) - 1] = EOS; + + if (sysloginfo && queryname && !haveComplained(queryname, complaint)) + { + char buf[BUFSZ]; + + a = ns = (char *)NULL; + print_a = (a_rr->d_type == T_A); + a_type = p_type(a_rr->d_type); + + if ( a != NULL || ns != NULL) { + /* BAD */ + r_strcpy (buf, sysloginfo); + } else { + /* BAD */ + r_strcpy (buf, sysloginfo); + } + } +} + +int main () +{ + char sysloginfo [INSZ]; + char net_queryname [INSZ]; + char net_dname [INSZ]; + struct databuf a_rr; + struct databuf nsdp; + static char *complaint = + "Glue A RR missing"; + + sysloginfo [INSZ-1] = EOS; + net_queryname [INSZ-1] = EOS; + net_dname [INSZ-1] = EOS; + + nslookupComplain (sysloginfo, net_queryname, complaint, net_dname, + &a_rr, &nsdp); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/small_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/small_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/small_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/nslookupComplain/small_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,72 @@ +#include "../bind.h" + +extern int nondet_int(); + +int haveComplained (const char *tag1, + const char *tag2) +{ + return nondet_int(); +} + +/* Another completely unsound stub brought to you by the Verisec Project. */ +const char *p_type (int type) +{ + return NULL; +} + + +static void +nslookupComplain(const char *sysloginfo, + const char *net_queryname, + const char *complaint, + const char *net_dname, + const struct databuf *a_rr, + const struct databuf *nsdp) +{ + char queryname[INSZ+1], dname[INSZ+1]; + const char *a, *ns; + const char *a_type; + int print_a; + + strncpy(queryname, net_queryname, sizeof queryname); + queryname[(sizeof queryname) - 1] = EOS; + strncpy(dname, net_dname, sizeof dname); + dname[(sizeof dname) - 1] = EOS; + + if (sysloginfo && queryname && !haveComplained(queryname, complaint)) + { + char buf[BUFSZ]; + + a = ns = (char *)NULL; + print_a = (a_rr->d_type == T_A); + a_type = p_type(a_rr->d_type); + + if ( a != NULL || ns != NULL) { + /* OK */ + r_strncpy (buf, sysloginfo, BUFSZ); + } else { + /* OK */ + r_strncpy (buf, sysloginfo, BUFSZ); + } + } +} + +int main () +{ + char sysloginfo [INSZ]; + char net_queryname [INSZ]; + char net_dname [INSZ]; + struct databuf a_rr; + struct databuf nsdp; + static char *complaint = + "Glue A RR missing"; + + sysloginfo [INSZ-1] = EOS; + net_queryname [INSZ-1] = EOS; + net_dname [INSZ-1] = EOS; + + nslookupComplain (sysloginfo, net_queryname, complaint, net_dname, + &a_rr, &nsdp); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/CVE-2001-0011/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,36 @@ +-= CVE-2001-0011 =- + +Vulnerable versions: BIND 4.9.x, where x < 8 +File(s): named/ns_forw.c +Download from: + ftp://ftp.isc.org/isc/bind/src/DEPRECATED/4.9.11/bind-4.9.11-REL.tar.gz + +Domain: DNS Server + +_ Vulnerable Functions and Buffers _ + +nslookupComplain uses sprintf() to overflow a local buffer. The input +buffers used to overflow the output buffer are passed through many +functions, and which contain data that must be logged. + +The program does not do heavy buffer manipulations, but the input +buffers are long-lived, so the model-checker needs to discover long +paths through the code. We observe two things: + 1. We cannot see any way in which this code is "special" due to its + involving a buffer overflow. + 2. This code is much easier to analyze than many smaller programs + containing buffer overflows, since it doesn't do much string + manipulation. + +We take only a limited slice of this program -- pulling in more of the +original program decreases the comprehensibility of the example, +without leading to any useful variable static measures. + +_ Decomposed Programs _ + +bind.h + +nslookupComplain/ + small_bad.c + med_bad.c + big_bad.c diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/frama-c-journal.ml frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/frama-c-journal.ml --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/frama-c-journal.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/frama-c-journal.ml 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,12 @@ +(* Frama-C journal generated at 16:31 the 05/09/2008 *) + +(* Running *) +let () = Journal.run () +let () = Cmdline.ForceValues.set true +let () = Cmdline.Files.set ["loop_ok.c"; ] +let () = File.init_from_cmdline () +let () = !Db.Syntactic_callgraph.dump () +(* exception raised on: *) +let __ : unit = !Db.Value.compute () +(* Finished *) +let () = Journal.finished () diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/bind/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/bind/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,7 @@ +-= BIND =- + +Homepage: http://www.isc.org/sw/bind/ +Domain: DNS Server + +DNS is the Domain Name System. BIND (Berkeley Internet Name Daemon) is +the most common DNS server. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/constants.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/constants.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/constants.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/constants.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,28 @@ +#ifndef CONSTANTS_C +#define CONSTANTS_C + +#include "../../../../lib/stubs.h" + +/* Originally "-rwxdls". This will affect the number of times strchr() + * loops, so vary it to vary analysis difficulty. */ +#define CHARS_NOT_WANTED "-" + +/* Size of the buffer being overflowed */ +#define USERSZ BASE_SZ + +/* One less than the number of iterations the first FOR loop must go + * through in order to hit the error. + * + * XXX Not sure how this affects analysis difficulty, except that the + * XXX bigger this is, the bigger INSZ has to be.*/ +#define J 2 + +/* Must read at least NPFLEN characters and contain the string NPF in + * order to cal ftpls(). */ +#define NPF "N" +#define NPFSZ 1 + +/* Size of the input buffer. Also affects a loop bound. */ +#define INSZ USERSZ + NPFSZ + J + 2 + +#endif diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/no_strcmp_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/no_strcmp_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/no_strcmp_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/no_strcmp_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,65 @@ +#include "../constants.h" + +extern int nondet_int(); + +void ftpls (char *line) +{ + int j; + + /* Stop at either: + * (1) first char before EOS which isn't in "-rwxdls", or, + * (2) first EOS + */ + for(j = 0; line[j] != EOS; ++j) + if (!strchr("-", line[j])) + break; + + if(j == J && line[j] == ' ') { /* long list */ + /* BUG! No bounds check. */ + char user[USERSZ]; + /* BAD */ + r_strcpy (user, line + j); + } +} + +int main () +{ + char out [INSZ]; + int out_l; + bool dirmode; + static const char npf[] = NPF; + const int npfsize = NPFSZ; + int c; + + dirmode = false; + + out_l = 0; + out[INSZ-1] = EOS; + + top: + + while((c = nondet_int()) != EOF) { + if(c == '\r') + c = '\n'; + if(c == '\n') { + if(dirmode) { + ftpls(out); + } else { + if(!out_l) + continue; + if (out_l > npfsize) { + dirmode = true; + goto top; + } + } + out_l = 0; + } else { + out[out_l] = c; + out_l++; + if (out_l > INSZ-1) + return ERR; + } + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/no_strcmp_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/no_strcmp_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/no_strcmp_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/no_strcmp_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,64 @@ +#include "../constants.h" + +extern int nondet_int(); + +void ftpls (char *line) +{ + int j; + + /* Stop at either: + * (1) first char before EOS which isn't in "-rwxdls", or, + * (2) first EOS + */ + for(j = 0; line[j] != EOS; ++j) + if (!strchr("-", line[j])) + break; + + if(j == J && line[j] == ' ') { /* long list */ + char user[USERSZ]; + /* OK */ + r_strncpy (user, line + j, USERSZ); + } +} + +int main () +{ + char out [INSZ]; + int out_l; + bool dirmode; + static const char npf[] = NPF; + const int npfsize = NPFSZ; + int c; + + dirmode = false; + + out_l = 0; + out[INSZ-1] = EOS; + + top: + + while((c = nondet_int()) != EOF) { + if(c == '\r') + c = '\n'; + if(c == '\n') { + if(dirmode) { + ftpls(out); + } else { + if(!out_l) + continue; + if (out_l > npfsize) { + dirmode = true; + goto top; + } + } + out_l = 0; + } else { + out[out_l] = c; + out_l++; + if (out_l > INSZ-1) + return ERR; + } + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strchr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strchr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strchr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strchr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,36 @@ +#include "../constants.h" + +/* Input of death is: + * (OTHER)^2(' ')(NOT_EOS)^(sizeof(user)) + * + */ + +void ftpls (char *line) +{ + int j; + + /* Stop at either: + * (1) first char before EOS which isn't in "-rwxdls", or, + * (2) first EOS + */ + for(j = 0; line[j] != EOS; ++j) + if (!strchr("-", line[j])) + break; + + if(j == J && line[j] == ' ') { /* long list */ + /* BUG! No bounds check. */ + char user[USERSZ]; + /* BAD */ + r_strcpy (user, line + j); + } +} + +int main () +{ + char in [INSZ]; + in [INSZ-1] = EOS; + + ftpls(in); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strchr_bad.err frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strchr_bad.err --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strchr_bad.err 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strchr_bad.err 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,8 @@ +edbrowse/CVE-2006-6909/ftpls/strchr_bad.c:16: Warning: entering loop for the first time +edbrowse/CVE-2006-6909/ftpls/strchr_bad.c:16: Warning: (TODO: emit a proper alarm) accessing uninitialized left-value: *(line + j) +edbrowse/CVE-2006-6909/ftpls/strchr_bad.c:16: Warning: completely unspecified value in {{ +in -> {0; } ;}} (size:<8>). This path is assumed to be dead. +edbrowse/CVE-2006-6909/ftpls/strchr_bad.c:16: Warning: non termination detected in function ftpls +edbrowse/CVE-2006-6909/ftpls/strchr_bad.c:35: Warning: non termination detected in function main +[dominators] computing for function r_memcpy +[dominators] done for function r_memcpy diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strchr_bad.log frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strchr_bad.log --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strchr_bad.log 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strchr_bad.log 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,20 @@ +[preprocessing] running gcc -C -E -I. edbrowse/CVE-2006-6909/ftpls/strchr_bad.c +[preprocessing] running gcc -C -E -I. ../../lib/stubs.c +[values] computing for function main +====== INITIAL STATE ====== +Computing globals values +====== INITIAL STATE COMPUTED ====== +Values of globals at initialization + +[values] computing for function ftpls <-main +[values] called from edbrowse/CVE-2006-6909/ftpls/strchr_bad.c:33 +[values] Recording results for ftpls +[values] done for function ftpls +[values] Recording results for main +[values] done for function main + +====== VALUES COMPUTED ====== +Values for function ftpls: + NON TERMINATING FUNCTION +Values for function main: + NON TERMINATING FUNCTION diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strchr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strchr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strchr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strchr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,35 @@ +#include "../constants.h" + +/* Input of death is: + * (OTHER)^2(' ')(NOT_EOS)^(sizeof(user)) + * + */ + +void ftpls (char *line) +{ + int j; + + /* Stop at either: + * (1) first char before EOS which isn't in "-rwxdls", or, + * (2) first EOS + */ + for(j = 0; line[j] != EOS; ++j) + if (!strchr("-", line[j])) + break; + + if(j == J && line[j] == ' ') { /* long list */ + char user[USERSZ]; + /* OK */ + r_strncpy (user, line + j, USERSZ); + } +} + +int main () +{ + char in [INSZ]; + in [INSZ-1] = EOS; + + ftpls(in); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strcmp_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strcmp_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strcmp_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strcmp_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,70 @@ +#include "../constants.h" + +extern int nondet_int(); + +void ftpls (char *line) +{ + int j; + + /* Stop at either: + * (1) first char before EOS which isn't in "-rwxdls", or, + * (2) first EOS + */ + for(j = 0; line[j] != EOS; ++j) + if (!strchr("-", line[j])) + break; + + if(j == J && line[j] == ' ') { /* long list */ + /* BUG! No bounds check. */ + char user[USERSZ]; + /* BAD */ + r_strcpy (user, line + j); + } +} + +int main () +{ + char out [INSZ]; + int out_l; + bool dirmode; + static const char npf[] = NPF; + const int npfsize = NPFSZ; + int c; + + dirmode = false; + + out_l = 0; + out[INSZ-1] = EOS; + + top: + + while((c = nondet_int()) != EOF) { + if(c == '\r') + c = '\n'; + if(c == '\n') { + if(dirmode) { + ftpls(out); + } else { + if(!out_l) + continue; + /* This assertion is meant to stop SatAbs from going insane + * and reporting a spurious error in strcmp. Which it still + * does. :-/ + * + */ + assert (out_l <= INSZ-1); + if (out_l > npfsize && !strcmp(out + out_l - npfsize, npf)) { + dirmode = true; + goto top; + } + } + out_l = 0; + } else { + out_l++; + if (out_l > INSZ-1) + return ERR; + } + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strcmp_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strcmp_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strcmp_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/ftpls/strcmp_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,69 @@ +#include "../constants.h" + +extern int nondet_int(); + +void ftpls (char *line) +{ + int j; + + /* Stop at either: + * (1) first char before EOS which isn't in "-rwxdls", or, + * (2) first EOS + */ + for(j = 0; line[j] != EOS; ++j) + if (!strchr("-", line[j])) + break; + + if(j == J && line[j] == ' ') { /* long list */ + char user[USERSZ]; + /* OK */ + r_strncpy (user, line + j, USERSZ); + } +} + +int main () +{ + char out [INSZ]; + int out_l; + bool dirmode; + static const char npf[] = NPF; + const int npfsize = NPFSZ; + int c; + + dirmode = false; + + out_l = 0; + out[INSZ-1] = EOS; + + top: + + while((c = nondet_int()) != EOF) { + if(c == '\r') + c = '\n'; + if(c == '\n') { + if(dirmode) { + ftpls(out); + } else { + if(!out_l) + continue; + /* This assertion is meant to stop SatAbs from going insane + * and reporting a spurious error in strcmp. Which it still + * does. :-/ + * + */ + assert (out_l <= INSZ-1); + if (out_l > npfsize && !strcmp(out + out_l - npfsize, npf)) { + dirmode = true; + goto top; + } + } + out_l = 0; + } else { + out_l++; + if (out_l > INSZ-1) + return ERR; + } + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/CVE-2006-6909/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,30 @@ +-= CVE-2006-6909 =- + +Vulnerable versions: Edbrowse 3.1.3 +File(s): {ebc,ebsmjs}/http.c +Download from: http://sourceforge.net/projects/edbrowse/ +Domain: Text-based editor/browser/email + +_ Vulnerable Functions and Buffers _ + +A call to sscanf() with no bounds checks allows a buffer user[] to be +overflowed in ftpls(). The function which calls ftpls(), ftpConnect(), +does some nifty looping to fill a buffer and see if ftpls() should be +called. + +Note that there are technical issues in the original program which we +elide in our current decomposed probrams: + - ftpConnect() uses a custom string library which does reallocation of + string buffers; we don't attempt to model this, and we use + standard C strings instead + - ftpls() uses sscanf(); since we don't have anything close to a sscanf() + stub, we change it to strcpy() + +_ Decomposed Programs _ + +constants.h + +ftpls/ + strchr_{bad,ok}.c /* No calling context */ + no_strcmp_{bad,ok}.c /* Simplified ftpConnect() calls ftpls() */ + strcmp_{bad,ok}.c /* Less simplified ftpConnect() calls ftpls() */ diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/edbrowse/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/edbrowse/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,8 @@ +-= Edbrowse =- + +Homepage: http://www.eklhad.net/linux/app/ +Domain: Text-based editor/browser/email + +Edbrowse is a command-line editor, browser, and email client, intended +to be usable by the blind. + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/frama_c_journal.ml frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/frama_c_journal.ml --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/frama_c_journal.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/frama_c_journal.ml 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,27 @@ +(* Frama-C journal generated at 17:37 the 24/04/2009 *) + +(* Running *) +let run () = + Parameters.ForceValues.set true; + Parameters.SemanticUnrollingLevel.set 500; + Parameters.Verbose.set 0; + Parameters.Debug.set 0; + Parameters.Files.set + [ "../../lib/stubs.c"; "OpenSER/CVE-2006-6876/fetchsms/fetchsms2.c" ]; + File.init_from_cmdline (); + !Db.Value.compute (); + () + +(* Main *) +let main () = + try run () + with e -> + Format.eprintf "Journal raised an exception: %s@." (Printexc.to_string e) + +(* Registering *) +let main : unit -> unit = + Dynamic.register + "Frama_c_journal.main" + (Type.func Type.unit Type.unit) + ~journalize:false + main diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/constants.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/constants.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/constants.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/constants.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,13 @@ +#include "../../../../lib/stubs.h" + +/* Size of buffer being overflowed. + * Ensure that SUN_PATH_SZ - 1 is non-negative */ +#define SUN_PATH_SZ BASE_SZ + 1/* originally 108 */ + +/* Size of input buffer. */ +#define FILENAME_SZ SUN_PATH_SZ + 2 /* originally 1024 */ + +struct sockaddr_un +{ + char sun_path[SUN_PATH_SZ]; /* Path name. */ +}; diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/main/frama-c.err frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/main/frama-c.err --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/main/frama-c.err 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/main/frama-c.err 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,12 @@ +../../lib/stubs.c:92: Warning: entering loop for the first time +../../lib/stubs.c:92: Warning: assigning non deterministic value for the first time +../../lib/stubs.c:95: Warning: out of bounds write. assert \valid(dest + i); + +../../lib/stubs.c:93: Warning: out of bounds read. assert \valid(src + i); + +../../lib/stubs.c:96: Warning: out of bounds read. assert \valid(src + i); + +[dominators] computing for function r_memcpy +[dominators] done for function r_memcpy +[dominators] computing for function r_strcpy +[dominators] done for function r_strcpy diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/main/frama-c.log frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/main/frama-c.log --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/main/frama-c.log 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/main/frama-c.log 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,31 @@ +[preprocessing] running gcc -C -E -I. gxine/CVE-2007-0406/main/simp_bad.c +[preprocessing] running gcc -C -E -I. ../../lib/stubs.c +[values] computing for function main +====== INITIAL STATE ====== +Computing globals values +====== INITIAL STATE COMPUTED ====== +Values of globals at initialization + +[values] computing for function r_strcpy <-main +[values] called from gxine/CVE-2007-0406/main/simp_bad.c:13 +[values] Recording results for r_strcpy +[values] done for function r_strcpy +[values] Recording results for main +[values] done for function main +[check_asserts] 1 assertions could be removed + +====== VALUES COMPUTED ====== +Values for function r_strcpy: + serv_adr.sun_path[0..2] ∈ {0; 101; 115; 116; } or UNINITIALIZED + i ∈ [--..--] + tmp ∈ {0; 101; 115; 116; } + +Values for function main: + serv_adr.sun_path[0..2] ∈ {0; 101; 115; 116; } or UNINITIALIZED + filename[0] ∈ {116; } + [1] ∈ {101; } + [2] ∈ {115; } + [3] ∈ {116; } + [4] ∈ {0; } + __retres ∈ {0; } + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/main/simp_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/main/simp_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/main/simp_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/main/simp_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,16 @@ +#include "../constants.h" + +int main () +{ + struct sockaddr_un serv_adr; + char filename [FILENAME_SZ] = "test"; + + /* server filename */ + filename[FILENAME_SZ-1] = EOS; + + /* initialize the server address structure */ + /* BAD */ + r_strcpy (serv_adr.sun_path, filename); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/main/simp_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/main/simp_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/main/simp_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/main/simp_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,16 @@ +#include "../constants.h" + +int main () +{ + struct sockaddr_un serv_adr; + char filename [FILENAME_SZ]; + + /* server filename */ + filename[FILENAME_SZ-1] = EOS; + + /* initialize the server address structure */ + /* OK */ + r_strncpy (serv_adr.sun_path, filename, SUN_PATH_SZ-1); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/gxine/CVE-2007-0406/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,28 @@ +-= CVE-2007-0406 =- + +Vulnerable versions: gxine <= 0.5.9 +File(s): src/server.c, src/client.c +Download from: + http://prdownloads.sourceforge.net/xine/gxine-0.5.9.tar.bz2?download + +Domain: GUI (Media Player) + +_ Vulnerable Functions and Buffers _ + +Functions main() in client.c and functions server_setup() and +server_client_connect() in server.c are vulnerable. All three +functions use snprintf() to copy the $HOME environment variable into a +fixed-size buffer (safe); however, the contents of this buffer are +later copied into a smaller buffer using strcpy(). + +Algorithmically, this overflow is very simple, and isn't +string-content-based. The difficult parts are the technical bits -- +modelling snprintf, structures, and unions. + +_ Decomposed Programs _ + +constants.h + +main/ + simp_bad.c + nonsimp_bad.c diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/gxine/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/gxine/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/gxine/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/gxine/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,7 @@ +-= gxine =- + +Homepage: http://xinehq.de +Domain: GUI (Media Player) + +Xine is an open source media player; gxine is a gtk-based graphical +front-end for it. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gd.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gd.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gd.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gd.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,34 @@ +#include "../../../../lib/stubs.h" + +/* Size of the input buffer. Since this example is a read overflow, + * there is no output buffer. Must be at least 2 for things to work. */ +#define INSZ BASE_SZ + 1 + +/* Size of a buffer used in gd_full.c; will affect a loop bound, so is + * important for that example. */ +#define ENTITY_NAME_LENGTH_MAX 8 + +/* The number of entities in entities[] and NR_OF_ENTITIES must + * match. NR_OF_ENTITIES affects the number of iterations of search() + * in gd_full_bad.c, so varying it should affect difficulty of that + * example. + * + * Note that this is a *very* chopped-down array of entities -- see + * entities.h in the gd sources for the real one. */ +struct entities_s { + char *name; + int value; +}; +struct entities_s entities[] = { + {"AElig", 198}, + {"Aacute", 193}, + {"Acirc", 194}, +}; +#define NR_OF_ENTITIES 3 + +/* These things don't matter. */ +#define Tcl_UniChar int +#define gdFTEX_Unicode 0 +#define gdFTEX_Shift_JIS 1 +#define gdFTEX_Big5 2 + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_full_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_full_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_full_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_full_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,218 @@ +#include "../gd.h" + +struct entities_s * search(struct entities_s *key, + struct entities_s *base, + int nmemb) +{ + int iter; + for (iter = 0; iter < nmemb; iter++) + if (strcmp (key->name, base[iter].name) == 0) + return base + iter; + return NULL; +} + +/* All we care about is what it returns, and that it doesn't enable us + * to skip past the terminating EOS. */ +static int +gdTcl_UtfToUniChar (char *str, Tcl_UniChar * chPtr) +{ + int byte; + char entity_name_buf[ENTITY_NAME_LENGTH_MAX+1]; + char *p; + struct entities_s key, *res; + + byte = (unsigned char)(str[0]); + + /* If we see an ampersand, treat what follows as an HTML4.0 entity, + * terminated with a semicolon + */ + if (byte == '&') { + int i, n = 0; + + byte = *((unsigned char *) (str + 1)); + if (byte == '#') { + byte = *((unsigned char *) (str + 2)); + if (byte == 'x' || byte == 'X') { + for (i = 3; i < 8; i++) { + byte = *((unsigned char *) (str + i)); + if (byte >= 'A' && byte <= 'F') + byte = byte - 'A' + 10; + else if (byte >= 'a' && byte <= 'f') + byte = byte - 'a' + 10; + else if (byte >= '0' && byte <= '9') + byte = byte - '0'; + else + break; /* end FOR */ + n = (n * 16) + byte; + } + } + else { + for (i = 2; i < 8; i++) { + byte = (unsigned char)(str[i]); + if (byte >= '0' && byte <= '9') + n = (n * 10) + (byte - '0'); + else + break; + } + } + /* In each of the above branches, i was computed. It's the number of + * characters representing an HTML4.0 entity. Increment i since we're + * also consuming the semicolon. + * + * If this branch isn't taken, we're not dealing with an HTML4.0 + * entity, so we go back to the start of str, and process it as + * UTF-8. + */ + if (byte == ';') { + return ++i; + } + } + /* This isn't an HTML4.0 entity. But it could be an entity name -- + * they're listed in the entities[] array. So we read until we see + * an EOS or a comma, and write what we're seeing into + * entity_name_buf as we go, using it to do a search. + * + * ... + * + * Ugh. That'll be hard. + * + * What can we vary? The size of this entities[] buffer, I + * guess. We'd definitely have to provide a bsearch stub -- which + * would easily be a linear search, since we don't care about + * runtime performance. + * + */ + else { + key.name = p = entity_name_buf; + for (i = 1; i < 1 + ENTITY_NAME_LENGTH_MAX; i++) { + byte = (unsigned char)(str[i]); + if (byte == EOS) + break; + if (byte == ';') { + *p++ = EOS; + /* This was originally bsearch(), which is a polymorphic + * function that uses void pointers and size arguments. I + * think most tools and tool users would rewrite the program + * as a first phase, using type information to choose the + * implementation of bsearch. + */ + res = search(&key, entities, NR_OF_ENTITIES); + if (res != NULL) { + return ++i; + } + break; + } + *p++ = byte; + } /* End FOR */ + } + } + + /* This is the UTF-8 case. */ + byte = (unsigned char)(str[0]); + if (byte < 0xC0) { + return 1; + } + else if (byte < 0xE0) { + if ((str[1] & 0xC0) == 0x80) { + return 2; + } + return 1; + } + else if (byte < 0xF0) { + if (((str[1] & 0xC0) == 0x80) && ((str[2] & 0xC0) == 0x80)) { + return 3; + } + return 1; + } + + return 1; +} + + + +/* Greatly, GREATLY simplified. There's a bunch of cruft that doesn't + * have to do with the manipulation of "string". */ +void gdImageStringFTEx (char *string) { + int next; + int encoding; + int i; + int ch; + int len; + + encoding = nondet_int(); + if (encoding > 2 || encoding < 0) + return; + + next = 0; + /* Unsafe read -- next can be out of bounds. */ + /* BAD */ + for (i=0; string[next] != EOS; i++) + { + /* grabbing a character and storing it in an int + * + * this'll fill the low-order byte, and keep more space free for + * extra bytes for Unicode encoding, etc. + */ + ch = string[next]; + + /* carriage returns */ + if (ch == '\r') + { + next++; + continue; + } + /* newlines */ + if (ch == '\n') + { + next++; + continue; + } + + + switch (encoding) + { + case gdFTEX_Unicode: + { + len = gdTcl_UtfToUniChar (string + next, &ch); + next += len; + } + break; + case gdFTEX_Shift_JIS: + { + unsigned char c; + c = (unsigned char) string[next]; + if (0xA1 <= c && c <= 0xFE) + { + next++; + } + /* We're incrementing next twice, which could make us skip + * the terminating EOS character. The read of "string" + * could then be out of bounds. */ + next++; + } + break; + case gdFTEX_Big5: + { + ch = (string[next]) & 0xFF; /* don't extend sign */ + next++; + if (ch >= 161 + && string[next] != EOS) + { + next++; + } + } + break; + } + } +} + +int main () +{ + char in [INSZ]; + in [INSZ-1] = EOS; + + gdImageStringFTEx (in); + + return 0; +} + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_full_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_full_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_full_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_full_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,215 @@ +#include "../gd.h" + +struct entities_s * search(struct entities_s *key, + struct entities_s *base, + int nmemb) +{ + int iter; + for (iter = 0; iter < nmemb; iter++) + if (strcmp (key->name, base[iter].name) == 0) + return base + iter; + return NULL; +} + +/* All we care about is what it returns, and that it doesn't enable us + * to skip past the terminating EOS. */ +static int +gdTcl_UtfToUniChar (char *str, Tcl_UniChar * chPtr) +{ + int byte; + char entity_name_buf[ENTITY_NAME_LENGTH_MAX+1]; + char *p; + struct entities_s key, *res; + + byte = (unsigned char)(str[0]); + + /* If we see an ampersand, treat what follows as an HTML4.0 entity, + * terminated with a semicolon + */ + if (byte == '&') { + int i, n = 0; + + byte = *((unsigned char *) (str + 1)); + if (byte == '#') { + byte = *((unsigned char *) (str + 2)); + if (byte == 'x' || byte == 'X') { + for (i = 3; i < 8; i++) { + byte = *((unsigned char *) (str + i)); + if (byte >= 'A' && byte <= 'F') + byte = byte - 'A' + 10; + else if (byte >= 'a' && byte <= 'f') + byte = byte - 'a' + 10; + else if (byte >= '0' && byte <= '9') + byte = byte - '0'; + else + break; /* end FOR */ + n = (n * 16) + byte; + } + } + else { + for (i = 2; i < 8; i++) { + byte = (unsigned char)(str[i]); + if (byte >= '0' && byte <= '9') + n = (n * 10) + (byte - '0'); + else + break; + } + } + /* In each of the above branches, i was computed. It's the number of + * characters representing an HTML4.0 entity. Increment i since we're + * also consuming the semicolon. + * + * If this branch isn't taken, we're not dealing with an HTML4.0 + * entity, so we go back to the start of str, and process it as + * UTF-8. + */ + if (byte == ';') { + return ++i; + } + } + /* This isn't an HTML4.0 entity. But it could be an entity name -- + * they're listed in the entities[] array. So we read until we see + * an EOS or a comma, and write what we're seeing into + * entity_name_buf as we go, using it to do a search. + * + * ... + * + * Ugh. That'll be hard. + * + * What can we vary? The size of this entities[] buffer, I + * guess. We'd definitely have to provide a bsearch stub -- which + * would easily be a linear search, since we don't care about + * runtime performance. + * + */ + else { + key.name = p = entity_name_buf; + for (i = 1; i < 1 + ENTITY_NAME_LENGTH_MAX; i++) { + byte = (unsigned char)(str[i]); + if (byte == EOS) + break; + if (byte == ';') { + *p++ = EOS; + /* This was originally bsearch(), which is a polymorphic + * function that uses void pointers and size arguments. I + * think most tools and tool users would rewrite the program + * as a first phase, using type information to choose the + * implementation of bsearch. + */ + res = search(&key, entities, NR_OF_ENTITIES); + if (res != NULL) { + return ++i; + } + break; + } + *p++ = byte; + } /* End FOR */ + } + } + + /* This is the UTF-8 case. */ + byte = (unsigned char)(str[0]); + if (byte < 0xC0) { + return 1; + } + else if (byte < 0xE0) { + if ((str[1] & 0xC0) == 0x80) { + return 2; + } + return 1; + } + else if (byte < 0xF0) { + if (((str[1] & 0xC0) == 0x80) && ((str[2] & 0xC0) == 0x80)) { + return 3; + } + return 1; + } + + return 1; +} + + + +/* Greatly, GREATLY simplified. There's a bunch of cruft that doesn't + * have to do with the manipulation of "string". */ +void gdImageStringFTEx (char *string) { + int next; + int encoding; + int i; + int ch; + int len; + + encoding = nondet_int(); + if (encoding > 2 || encoding < 0) + return; + + next = 0; + /* OK */ + for (i=0; string[next] != EOS; i++) + { + /* grabbing a character and storing it in an int + * + * this'll fill the low-order byte, and keep more space free for + * extra bytes for Unicode encoding, etc. + */ + ch = string[next]; + + /* carriage returns */ + if (ch == '\r') + { + next++; + continue; + } + /* newlines */ + if (ch == '\n') + { + next++; + continue; + } + + + switch (encoding) + { + case gdFTEX_Unicode: + { + len = gdTcl_UtfToUniChar (string + next, &ch); + next += len; + } + break; + case gdFTEX_Shift_JIS: + { + unsigned char c; + c = (unsigned char) string[next]; + if (0xA1 <= c && c <= 0xFE) + { + next++; + } + if (string[next] != EOS) + next++; + } + break; + case gdFTEX_Big5: + { + ch = (string[next]) & 0xFF; /* don't extend sign */ + next++; + if (ch >= 161 + && string[next] != EOS) + { + next++; + } + } + break; + } + } +} + +int main () +{ + char in [INSZ]; + in [INSZ-1] = EOS; + + gdImageStringFTEx (in); + + return 0; +} + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_no_entities_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_no_entities_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_no_entities_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_no_entities_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,118 @@ +#include "../gd.h" + +/* All we care about is what it returns, and that it doesn't enable us + * to skip past the terminating EOS. */ +static int +gdTcl_UtfToUniChar (char *str, Tcl_UniChar * chPtr) +{ + int byte; + + /* This is the UTF-8 case. */ + byte = (unsigned char)(str[0]); + if (byte < 0xC0) { + return 1; + } + else if (byte < 0xE0) { + if ((str[1] & 0xC0) == 0x80) { + return 2; + } + return 1; + } + else if (byte < 0xF0) { + if (((str[1] & 0xC0) == 0x80) && ((str[2] & 0xC0) == 0x80)) { + return 3; + } + return 1; + } + + return 1; +} + + + +/* Greatly, GREATLY simplified. There's a bunch of cruft that doesn't + * have to do with the manipulation of "string". */ +void gdImageStringFTEx (char *string) { + int next; + int encoding; + int i; + int ch; + int len; + + encoding = nondet_int(); + if (encoding > 2 || encoding < 0) + return; + + next = 0; + /* Unsafe read -- next can be out of bounds. */ + /* BAD */ + for (i=0; string[next] != EOS; i++) + { + /* grabbing a character and storing it in an int + * + * this'll fill the low-order byte, and keep more space free for + * extra bytes for Unicode encoding, etc. + */ + ch = string[next]; + + /* carriage returns */ + if (ch == '\r') + { + next++; + continue; + } + /* newlines */ + if (ch == '\n') + { + next++; + continue; + } + + + switch (encoding) + { + case gdFTEX_Unicode: + { + len = gdTcl_UtfToUniChar (string + next, &ch); + next += len; + } + break; + case gdFTEX_Shift_JIS: + { + unsigned char c; + c = (unsigned char) string[next]; + if (0xA1 <= c && c <= 0xFE) + { + next++; + } + /* We're incrementing next twice, which could make us skip + * the terminating EOS character. The read of "string" + * could then be out of bounds. */ + next++; + } + break; + case gdFTEX_Big5: + { + ch = (string[next]) & 0xFF; /* don't extend sign */ + next++; + if (ch >= 161 + && string[next] != EOS) + { + next++; + } + } + break; + } + } +} + +int main () +{ + char in [INSZ]; + in [INSZ-1] = EOS; + + gdImageStringFTEx (in); + + return 0; +} + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_no_entities_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_no_entities_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_no_entities_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_no_entities_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,115 @@ +#include "../gd.h" + +/* All we care about is what it returns, and that it doesn't enable us + * to skip past the terminating EOS. */ +static int +gdTcl_UtfToUniChar (char *str, Tcl_UniChar * chPtr) +{ + int byte; + + /* This is the UTF-8 case. */ + byte = (unsigned char)(str[0]); + if (byte < 0xC0) { + return 1; + } + else if (byte < 0xE0) { + if ((str[1] & 0xC0) == 0x80) { + return 2; + } + return 1; + } + else if (byte < 0xF0) { + if (((str[1] & 0xC0) == 0x80) && ((str[2] & 0xC0) == 0x80)) { + return 3; + } + return 1; + } + + return 1; +} + + + +/* Greatly, GREATLY simplified. There's a bunch of cruft that doesn't + * have to do with the manipulation of "string". */ +void gdImageStringFTEx (char *string) { + int next; + int encoding; + int i; + int ch; + int len; + + encoding = nondet_int(); + if (encoding > 2 || encoding < 0) + return; + + next = 0; + /* OK */ + for (i=0; string[next] != EOS; i++) + { + /* grabbing a character and storing it in an int + * + * this'll fill the low-order byte, and keep more space free for + * extra bytes for Unicode encoding, etc. + */ + ch = string[next]; + + /* carriage returns */ + if (ch == '\r') + { + next++; + continue; + } + /* newlines */ + if (ch == '\n') + { + next++; + continue; + } + + + switch (encoding) + { + case gdFTEX_Unicode: + { + len = gdTcl_UtfToUniChar (string + next, &ch); + next += len; + } + break; + case gdFTEX_Shift_JIS: + { + unsigned char c; + c = (unsigned char) string[next]; + if (0xA1 <= c && c <= 0xFE) + { + next++; + } + if (string[next] != EOS) + next++; + } + break; + case gdFTEX_Big5: + { + ch = (string[next]) & 0xFF; /* don't extend sign */ + next++; + if (ch >= 161 + && string[next] != EOS) + { + next++; + } + } + break; + } + } +} + +int main () +{ + char in [INSZ]; + in [INSZ-1] = EOS; + + gdImageStringFTEx (in); + + return 0; +} + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_simp_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_simp_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_simp_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_simp_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,96 @@ +#include "../gd.h" + +static int +gdTcl_UtfToUniChar (char *str, Tcl_UniChar * chPtr) +{ + return 1; +} + + +/* Greatly, GREATLY simplified. There's a bunch of cruft that doesn't + * have to do with the manipulation of "string". */ +void gdImageStringFTEx (char *string) { + int next; + int encoding; + int i; + int ch; + int len; + + encoding = nondet_int(); + if (encoding > 2 || encoding < 0) + return; + + next = 0; + /* Unsafe read -- next can be out of bounds. */ + /* BAD */ + for (i=0; string[next] != EOS; i++) + { + /* grabbing a character and storing it in an int + * + * this'll fill the low-order byte, and keep more space free for + * extra bytes for Unicode encoding, etc. + */ + ch = string[next]; + + /* carriage returns */ + if (ch == '\r') + { + next++; + continue; + } + /* newlines */ + if (ch == '\n') + { + next++; + continue; + } + + + switch (encoding) + { + case gdFTEX_Unicode: + { + len = gdTcl_UtfToUniChar (string + next, &ch); + next += len; + } + break; + case gdFTEX_Shift_JIS: + { + unsigned char c; + c = (unsigned char) string[next]; + if (0xA1 <= c && c <= 0xFE) + { + next++; + } + /* We're incrementing next twice, which could make us skip + * the terminating EOS character. The read of "string" + * could then be out of bounds. */ + next++; + } + break; + case gdFTEX_Big5: + { + ch = (string[next]) & 0xFF; /* don't extend sign */ + next++; + if (ch >= 161 /* first code of JIS-8 pair */ + && string[next] != EOS) + { + ch = (ch * 256) + ((string[next]) & 255); + next++; + } + } + break; + } + } +} + +int main () +{ + char in [INSZ]; + in [INSZ-1] = EOS; + + gdImageStringFTEx (in); + + return 0; +} + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_simp_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_simp_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_simp_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_simp_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,93 @@ +#include "../gd.h" + +static int +gdTcl_UtfToUniChar (char *str, Tcl_UniChar * chPtr) +{ + return 1; +} + + +/* Greatly, GREATLY simplified. There's a bunch of cruft that doesn't + * have to do with the manipulation of "string". */ +void gdImageStringFTEx (char *string) { + int next; + int encoding; + int i; + int ch; + int len; + + encoding = nondet_int(); + if (encoding > 2 || encoding < 0) + return; + + next = 0; + /* OK */ + for (i=0; string[next] != EOS; i++) + { + /* grabbing a character and storing it in an int + * + * this'll fill the low-order byte, and keep more space free for + * extra bytes for Unicode encoding, etc. + */ + ch = string[next]; + + /* carriage returns */ + if (ch == '\r') + { + next++; + continue; + } + /* newlines */ + if (ch == '\n') + { + next++; + continue; + } + + + switch (encoding) + { + case gdFTEX_Unicode: + { + len = gdTcl_UtfToUniChar (string + next, &ch); + next += len; + } + break; + case gdFTEX_Shift_JIS: + { + unsigned char c; + c = (unsigned char) string[next]; + if (0xA1 <= c && c <= 0xFE) + { + next++; + } + if (string[next] != EOS) + next++; + } + break; + case gdFTEX_Big5: + { + ch = (string[next]) & 0xFF; /* don't extend sign */ + next++; + if (ch >= 161 /* first code of JIS-8 pair */ + && string[next] != EOS) + { + ch = (ch * 256) + ((string[next]) & 255); + next++; + } + } + break; + } + } +} + +int main () +{ + char in [INSZ]; + in [INSZ-1] = EOS; + + gdImageStringFTEx (in); + + return 0; +} + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_some_entities_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_some_entities_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_some_entities_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_some_entities_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,166 @@ +#include "../gd.h" + +/* All we care about is what it returns, and that it doesn't enable us + * to skip past the terminating EOS. */ +static int +gdTcl_UtfToUniChar (char *str, Tcl_UniChar * chPtr) +{ + int byte; + + byte = (unsigned char)(str[0]); + + /* If we see an ampersand, treat what follows as an HTML4.0 entity, + * terminated with a semicolon + */ + if (byte == '&') { + int i, n = 0; + + byte = *((unsigned char *) (str + 1)); + if (byte == '#') { + byte = *((unsigned char *) (str + 2)); + if (byte == 'x' || byte == 'X') { + for (i = 3; i < 8; i++) { + byte = *((unsigned char *) (str + i)); + if (byte >= 'A' && byte <= 'F') + byte = byte - 'A' + 10; + else if (byte >= 'a' && byte <= 'f') + byte = byte - 'a' + 10; + else if (byte >= '0' && byte <= '9') + byte = byte - '0'; + else + break; /* end FOR */ + n = (n * 16) + byte; + } + } + else { + for (i = 2; i < 8; i++) { + byte = (unsigned char)(str[i]); + if (byte >= '0' && byte <= '9') + n = (n * 10) + (byte - '0'); + else + break; + } + } + /* In each of the above branches, i was computed. It's the number of + * characters representing an HTML4.0 entity. Increment i since we're + * also consuming the semicolon. + * + * If this branch isn't taken, we're not dealing with an HTML4.0 + * entity, so we go back to the start of str, and process it as + * UTF-8. + */ + if (byte == ';') { + return ++i; + } + } + } + + /* This is the UTF-8 case. */ + byte = (unsigned char)(str[0]); + if (byte < 0xC0) { + return 1; + } + else if (byte < 0xE0) { + if ((str[1] & 0xC0) == 0x80) { + return 2; + } + return 1; + } + else if (byte < 0xF0) { + if (((str[1] & 0xC0) == 0x80) && ((str[2] & 0xC0) == 0x80)) { + return 3; + } + return 1; + } + + return 1; +} + + + +/* Greatly, GREATLY simplified. There's a bunch of cruft that doesn't + * have to do with the manipulation of "string". */ +void gdImageStringFTEx (char *string) { + int next; + int encoding; + int i; + int ch; + int len; + + encoding = nondet_int(); + if (encoding > 2 || encoding < 0) + return; + + next = 0; + /* Unsafe read -- next can be out of bounds. */ + /* BAD */ + for (i=0; string[next] != EOS; i++) + { + /* grabbing a character and storing it in an int + * + * this'll fill the low-order byte, and keep more space free for + * extra bytes for Unicode encoding, etc. + */ + ch = string[next]; + + /* carriage returns */ + if (ch == '\r') + { + next++; + continue; + } + /* newlines */ + if (ch == '\n') + { + next++; + continue; + } + + + switch (encoding) + { + case gdFTEX_Unicode: + { + len = gdTcl_UtfToUniChar (string + next, &ch); + next += len; + } + break; + case gdFTEX_Shift_JIS: + { + unsigned char c; + c = (unsigned char) string[next]; + if (0xA1 <= c && c <= 0xFE) + { + next++; + } + /* We're incrementing next twice, which could make us skip + * the terminating EOS character. The read of "string" + * could then be out of bounds. */ + next++; + } + break; + case gdFTEX_Big5: + { + ch = (string[next]) & 0xFF; /* don't extend sign */ + next++; + if (ch >= 161 + && string[next] != EOS) + { + next++; + } + } + break; + } + } +} + +int main () +{ + char in [INSZ]; + in [INSZ-1] = EOS; + + gdImageStringFTEx (in); + + return 0; +} + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_some_entities_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_some_entities_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_some_entities_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/gdImageStringFTEx/gd_some_entities_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,163 @@ +#include "../gd.h" + +/* All we care about is what it returns, and that it doesn't enable us + * to skip past the terminating EOS. */ +static int +gdTcl_UtfToUniChar (char *str, Tcl_UniChar * chPtr) +{ + int byte; + + byte = (unsigned char)(str[0]); + + /* If we see an ampersand, treat what follows as an HTML4.0 entity, + * terminated with a semicolon + */ + if (byte == '&') { + int i, n = 0; + + byte = *((unsigned char *) (str + 1)); + if (byte == '#') { + byte = *((unsigned char *) (str + 2)); + if (byte == 'x' || byte == 'X') { + for (i = 3; i < 8; i++) { + byte = *((unsigned char *) (str + i)); + if (byte >= 'A' && byte <= 'F') + byte = byte - 'A' + 10; + else if (byte >= 'a' && byte <= 'f') + byte = byte - 'a' + 10; + else if (byte >= '0' && byte <= '9') + byte = byte - '0'; + else + break; /* end FOR */ + n = (n * 16) + byte; + } + } + else { + for (i = 2; i < 8; i++) { + byte = (unsigned char)(str[i]); + if (byte >= '0' && byte <= '9') + n = (n * 10) + (byte - '0'); + else + break; + } + } + /* In each of the above branches, i was computed. It's the number of + * characters representing an HTML4.0 entity. Increment i since we're + * also consuming the semicolon. + * + * If this branch isn't taken, we're not dealing with an HTML4.0 + * entity, so we go back to the start of str, and process it as + * UTF-8. + */ + if (byte == ';') { + return ++i; + } + } + } + + /* This is the UTF-8 case. */ + byte = (unsigned char)(str[0]); + if (byte < 0xC0) { + return 1; + } + else if (byte < 0xE0) { + if ((str[1] & 0xC0) == 0x80) { + return 2; + } + return 1; + } + else if (byte < 0xF0) { + if (((str[1] & 0xC0) == 0x80) && ((str[2] & 0xC0) == 0x80)) { + return 3; + } + return 1; + } + + return 1; +} + + + +/* Greatly, GREATLY simplified. There's a bunch of cruft that doesn't + * have to do with the manipulation of "string". */ +void gdImageStringFTEx (char *string) { + int next; + int encoding; + int i; + int ch; + int len; + + encoding = nondet_int(); + if (encoding > 2 || encoding < 0) + return; + + next = 0; + /* OK */ + for (i=0; string[next] != EOS; i++) + { + /* grabbing a character and storing it in an int + * + * this'll fill the low-order byte, and keep more space free for + * extra bytes for Unicode encoding, etc. + */ + ch = string[next]; + + /* carriage returns */ + if (ch == '\r') + { + next++; + continue; + } + /* newlines */ + if (ch == '\n') + { + next++; + continue; + } + + + switch (encoding) + { + case gdFTEX_Unicode: + { + len = gdTcl_UtfToUniChar (string + next, &ch); + next += len; + } + break; + case gdFTEX_Shift_JIS: + { + unsigned char c; + c = (unsigned char) string[next]; + if (0xA1 <= c && c <= 0xFE) + { + next++; + } + if (string[next] != EOS) + next++; + } + break; + case gdFTEX_Big5: + { + ch = (string[next]) & 0xFF; /* don't extend sign */ + next++; + if (ch >= 161 + && string[next] != EOS) + { + next++; + } + } + break; + } + } +} + +int main () +{ + char in [INSZ]; + in [INSZ-1] = EOS; + + gdImageStringFTEx (in); + + return 0; +} + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/CVE-2007-0455/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,46 @@ +-= CVE-2007-0455 =- + +Vulnerable versions: LibGD <= 2.0.33 +File(s): gdft.c +Download from: + http://www.libgd.org/releases/oldreleases/gd-2.0.33.tar.gz + +Domain: Graphics Library + +_ Vulnerable Functions and Buffers _ + +This is actually an out-of-bounds read, but it seems structurally the +same as the out-of-bounds writes, and was reported using the term +"buffer overflow." + +A buffer, string[], is a parameter to the function +gdImageStringFTEx(). This string is traversed using a loop containing +a switch statement, with cases based on the character encoding of the +string. If the string is JIS-encoded, the iterator variable can be +incremented twice. The second increment is performed without first +checking for the end-of-string character, which can thus cause the +loop reading the string to access out-of-bounds memory. This can lead +to a crash. + +I've chopped out the stuff that doesn't relate to how the iterator is +incremented -- we don't care about cruft for which we just need to +know "there is some path through this." + +The variants in the program actually come from variations in the +algorithm used to parse Unicode characters. Since Unicode characters +are encoded using a variable number of bytes, the iterator over +string[] can be advanced by a variable number of bytes on each +iteration. The helper function for reading Unicode recognizes HTML 4.0 +entities; I've made versions of this function dealing with different +subsets of the characters recognized by the original. + +_ Decomposed Programs _ + +gd.h + +gdImageStringFTEx/ + gd_simp_bad.c + gd_no_entities_bad.c + gd_some_entities_bad.c + gd_full_bad.c + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/libgd/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/libgd/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,8 @@ +-= LibGD =- + +Homepage: http://www.libgd.org +Domain: Graphics Library + +GD is an open source library for dynamically creating images. It is +often used by higher-level languages, like PHP, to creates graphs, +charts, etc. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/constants.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/constants.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/constants.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/constants.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,21 @@ +#include "../../../../lib/stubs.h" + +typedef unsigned int u_int; +typedef unsigned char u_int8_t; + +struct ieee80211_scan_entry { + u_int8_t *se_rsn_ie; /* captured RSN ie */ +}; + +#define IEEE80211_ELEMID_RSN 200 /* fake */ + +/* Size of an array leader[] which is written to buf[] before it is + * overflowed by the ie[] array. */ +#define LEADERSZ 1 + +/* We first write the "leader" to buf[], and then write from the "ie" + * array. buf[] has to be bigger than LEADERSZ by at least 2. */ +#define BUFSZ BASE_SZ + LEADERSZ + 2 + +/* Just has to be big enough to overflow buf[] */ +#define IESZ (BUFSZ - LEADERSZ) + 5 diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/encode_ie/interproc_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/encode_ie/interproc_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/encode_ie/interproc_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/encode_ie/interproc_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,70 @@ +#include "../constants.h" + +static u_int +encode_ie(void *buf, size_t bufsize, // 8-byte character array + const u_int8_t *ie, size_t ielen, // 8-byte uint array + const char *leader, size_t leader_len) +{ + /* buf is treated as an array of unsigned 8-byte ints */ + u_int8_t *p; + int i; + + // copy the contents of leader into buf + if (bufsize < leader_len) + return 0; + p = buf; + memcpy(p, leader, leader_len); + bufsize -= leader_len; + p += leader_len; + + for (i = 0; i < ielen && bufsize > 2; i++) { + /* This was originally + * p += sprintf(p, "%02x", ie[i]); + * This would print two digits from ie[i] into p, and + * return the number of bytes written. + * + * Simplified to remove sprintf. + * + */ + /* BAD */ + *p = 'x'; + /* BAD. */ + *(p+1) = 'x'; + p += 2; + } + + // if we wrote all of ie[], say how many bytes written in total, + // otherwise, claim we wrote nothing + return (i == ielen ? p - (u_int8_t *)buf : 0); +} + + +static int +giwscan_cb(const struct ieee80211_scan_entry *se) +{ + u_int8_t buf[BUFSZ]; + char rsn_leader [LEADERSZ]; + + /* Everything up to this point seems irrelevant to the following. */ + + if (se->se_rsn_ie != NULL) { + if (se->se_rsn_ie[0] == IEEE80211_ELEMID_RSN) + encode_ie(buf, sizeof(buf), + se->se_rsn_ie, se->se_rsn_ie[1] + 2, + rsn_leader, sizeof(rsn_leader) - 1); + } + + return 0; +} + +int main () +{ + struct ieee80211_scan_entry se; + u_int8_t ie [IESZ]; + se.se_rsn_ie = ie; + se.se_rsn_ie[1] = IESZ - 2; + + giwscan_cb (&se); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/encode_ie/interproc_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/encode_ie/interproc_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/encode_ie/interproc_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/encode_ie/interproc_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,74 @@ +#include "../constants.h" + +static u_int +encode_ie(void *buf, size_t bufsize, // 8-byte character array + const u_int8_t *ie, size_t ielen, // 8-byte uint array + const char *leader, size_t leader_len) +{ + /* buf is treated as an array of unsigned 8-byte ints */ + u_int8_t *p; + int i; + + // copy the contents of leader into buf + if (bufsize < leader_len) + return 0; + p = buf; + memcpy(p, leader, leader_len); + bufsize -= leader_len; + p += leader_len; + + /* This is the fix. */ + if (bufsize < ielen) + return 0; + + for (i = 0; i < ielen && bufsize > 2; i++) { + /* This was originally + * p += sprintf(p, "%02x", ie[i]); + * This would print two digits from ie[i] into p, and + * return the number of bytes written. + * + * Simplified to remove sprintf. + * + */ + /* OK */ + *p = 'x'; + /* OK. */ + *(p+1) = 'x'; + p += 2; + } + + // if we wrote all of ie[], say how many bytes written in total, + // otherwise, claim we wrote nothing + return (i == ielen ? p - (u_int8_t *)buf : 0); +} + + +static int +giwscan_cb(const struct ieee80211_scan_entry *se) +{ + u_int8_t buf[BUFSZ]; + char rsn_leader [LEADERSZ]; + + /* Everything up to this point seems irrelevant to the following. */ + + if (se->se_rsn_ie != NULL) { + if (se->se_rsn_ie[0] == IEEE80211_ELEMID_RSN) + encode_ie(buf, sizeof(buf), + se->se_rsn_ie, se->se_rsn_ie[1] + 2, + rsn_leader, sizeof(rsn_leader) - 1); + } + + return 0; +} + +int main () +{ + struct ieee80211_scan_entry se; + u_int8_t ie [IESZ]; + se.se_rsn_ie = ie; + se.se_rsn_ie[1] = IESZ - 2; + + giwscan_cb (&se); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/encode_ie/no_sprintf_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/encode_ie/no_sprintf_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/encode_ie/no_sprintf_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/encode_ie/no_sprintf_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,52 @@ +#include "../constants.h" + +static u_int +encode_ie(void *buf, size_t bufsize, // 8-byte character array + const u_int8_t *ie, size_t ielen, // 8-byte uint array + const char *leader, size_t leader_len) +{ + /* buf is treated as an array of unsigned 8-byte ints */ + u_int8_t *p; + int i; + + // copy the contents of leader into buf + if (bufsize < leader_len) + return 0; + p = buf; + memcpy(p, leader, leader_len); + bufsize -= leader_len; + p += leader_len; + + for (i = 0; i < ielen && bufsize > 2; i++) { + /* This was originally + * p += sprintf(p, "%02x", ie[i]); + * This would print two digits from ie[i] into p, and + * return the number of bytes written. + * + * Simplified to remove sprintf. + * + */ + /* BAD */ + *p = 'x'; + /* BAD. */ + *(p+1) = 'x'; + p += 2; + } + + // if we wrote all of ie[], say how many bytes written in total, + // otherwise, claim we wrote nothing + return (i == ielen ? p - (u_int8_t *)buf : 0); +} + +int main() +{ + u_int8_t buf [BUFSZ]; + u_int8_t ie [IESZ]; + char leader [LEADERSZ]; + + encode_ie (buf, BUFSZ, + ie, IESZ, + leader, LEADERSZ); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/encode_ie/no_sprintf_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/encode_ie/no_sprintf_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/encode_ie/no_sprintf_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/encode_ie/no_sprintf_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,56 @@ +#include "../constants.h" + +static u_int +encode_ie(void *buf, size_t bufsize, // 8-byte character array + const u_int8_t *ie, size_t ielen, // 8-byte uint array + const char *leader, size_t leader_len) +{ + /* buf is treated as an array of unsigned 8-byte ints */ + u_int8_t *p; + int i; + + // copy the contents of leader into buf + if (bufsize < leader_len) + return 0; + p = buf; + memcpy(p, leader, leader_len); + bufsize -= leader_len; + p += leader_len; + + /* This is the fix. */ + if (bufsize < ielen) + return 0; + + for (i = 0; i < ielen && bufsize > 2; i++) { + /* This was originally + * p += sprintf(p, "%02x", ie[i]); + * This would print two digits from ie[i] into p, and + * return the number of bytes written. + * + * Simplified to remove sprintf. + * + */ + /* OK */ + *p = 'x'; + /* OK. */ + *(p+1) = 'x'; + p += 2; + } + + // if we wrote all of ie[], say how many bytes written in total, + // otherwise, claim we wrote nothing + return (i == ielen ? p - (u_int8_t *)buf : 0); +} + +int main() +{ + u_int8_t buf [BUFSZ]; + u_int8_t ie [IESZ]; + char leader [LEADERSZ]; + + encode_ie (buf, BUFSZ, + ie, IESZ, + leader, LEADERSZ); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/giwscan_cb/giwscan_cb_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/giwscan_cb/giwscan_cb_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/giwscan_cb/giwscan_cb_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/giwscan_cb/giwscan_cb_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,28 @@ +#include "../constants.h" + +static int +giwscan_cb(const struct ieee80211_scan_entry *se) +{ + char buf[IESZ]; + + /* Everything up to this point seems irrelevant to the following. */ + + if (se->se_rsn_ie != NULL) { + /* BAD */ + r_memcpy(buf, se->se_rsn_ie, se->se_rsn_ie[1] + 2); + } + + return 0; +} + +int main () +{ + struct ieee80211_scan_entry se; + u_int8_t ie [IESZ * 2]; + se.se_rsn_ie = ie; + se.se_rsn_ie[1] = (IESZ * 2) - 2; + + giwscan_cb (&se); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/giwscan_cb/giwscan_cb_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/giwscan_cb/giwscan_cb_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/giwscan_cb/giwscan_cb_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/giwscan_cb/giwscan_cb_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,31 @@ +#include "../constants.h" + +static int +giwscan_cb(const struct ieee80211_scan_entry *se) +{ + char buf[IESZ]; + + /* Everything up to this point seems irrelevant to the following. */ + + if (se->se_rsn_ie != NULL) { + /* Here's the fix. */ + if ((se->se_rsn_ie[1] + 2) > IESZ) + return E2BIG; + /* OK */ + r_memcpy(buf, se->se_rsn_ie, se->se_rsn_ie[1] + 2); + } + + return 0; +} + +int main () +{ + struct ieee80211_scan_entry se; + u_int8_t ie [IESZ * 2]; + se.se_rsn_ie = ie; + se.se_rsn_ie[1] = (IESZ * 2) - 2; + + giwscan_cb (&se); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/CVE-2006-6332/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,30 @@ +-= CVE-2006-6332 =- + +Vulnerable versions: MadWifi < 0.9.2.1 +File(s): net80211/ieee80211_wireless.c +Download from: http://madwifi.org/wiki/UserDocs/GettingMadwifi + +Domain: Device Driver + +_ Vulnerable Functions and Buffers _ + +The overflows are due to lack of bounds checking. buf in encode_ie() +can be overflowed by a call to sprintf(), and buf in giwscan_cb() can +by overflowed by a call to memcpy(). + +_ Notes _ + +The buffer overflows in this example are simple; however, there are +technical issues in the original implementation which would make +analysis difficult. First, in the original program, the overflow in +encode_ie() is due to a write by sprintf(). Second, giwscan_cb() is +called via a function pointer stored in a struct in the original. + +_ Decomposed Programs _ + +encode_ie/ + no_sprintf_bad.c + interproc_bad.c + +giwscan_cb/ + giwscan_cb.c diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/MADWiFi/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/MADWiFi/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,7 @@ +-= MadWiFi =- + +Homepage: http://madwifi.org/ +Domain: Device Driver + +MadWifi is an open source Linux driver for wireless LAN chipsets made +by Atheros. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/Makefile frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/Makefile --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/Makefile 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,46 @@ +FRAMAC=frama-c +STUBS=../../lib/stubs.c +BIND_DIR=bind +BIND_CA_DIR=$(BIND_DIR)/CA-1999-14 +BIND_RREXTRACT_NXT_DIR=$(BIND_CA_DIR)/rrextract-nxt + +APACHE_DIR=apache +APACHE_2004_DIR=$(APACHE_DIR)/CVE-2004-0940 + +EDBROWSE_DIR=edbrowse/CVE-2006-6909/ftpls + +GXINE_DIR=gxine/CVE-2007-0406/main + +OPENSER_DIR=OpenSER +OPENSER_6876_DIR=$(OPENSER_DIR)/CVE-2006-6876/fetchsms + +all:bind gxine apache edbrowse openser + +bind:bind_CA bind_CVE + +bind_CA:bind_rrextract_nxt + +bind_rrextract_nxt:$(BIND_RREXTRACT_NXT_DIR)/simp_bad.c + $(FRAMAC) -val $(STUBS) $(BIND_RREXTRACT_NXT_DIR)/simp_bad.c >$(BIND_RREXTRACT_NXT_DIR)/bin_rrextract_nxt.log 2>$(BIND_RREXTRACT_NXT_DIR)/bind_rrxtract_nxt.err + +gxine:$(GXINE_DIR)/simp_bad.c + $(FRAMAC) -val $(STUBS) $(GXINE_DIR)/simp_bad.c >$(GXINE_DIR)/frama-c.log 2>$(GXINE_DIR)/frama-c.err + +bind_CVE:$(APACHE_2004_DIR)/apache.c + +apache:apache_CVE_2004 apache_CVE_2006 + +apache_CVE_2004_iter1_prefixLong_arr: $(APACHE_2004_DIR)/apache.c + $(FRAMAC) -val $(STUBS) $(APACHE_2004_DIR)/apache.c $(APACHE_2004_DIR)/get_tag/iter1_prefixLong_arr_bad.c >$(APACHE_2004_DIR)/ap_iter1_prefixLong_arr.log 2>$(APACHE_2004_DIR)/ap_iter1_prefixLong_arr.err + +apache_CVE_2004:apache_CVE_2004_iter1_prefixLong_arr + +apache_CVE_2006: + +edbrowse: $(EDBROWSE_DIR)/strchr_bad.c + $(FRAMAC) -val $(STUBS) $(EDBROWSE_DIR)/strchr_bad.c >$(EDBROWSE_DIR)/strchr_bad.log 2>$(EDBROWSE_DIR)/strchr_bad.err + +openser:openser_6876 + +openser_6876:$(OPENSER_6876_DIR)/full_bad.c + $(FRAMAC) -val $(STUBS) $(OPENSER_6876_DIR)/full_bad.c -slevel 500 >$(OPENSER_6876_DIR)/full_bad.log 2>$(OPENSER_6876_DIR)/full_bad.err \ No newline at end of file diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob1/bounds_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob1/bounds_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob1/bounds_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob1/bounds_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,17 @@ +#include "../glob.h" + +int main () +{ + Char pathbuf[MAXPATHLEN+1]; + + Char *bound = pathbuf + sizeof(pathbuf) - 1; + + /* Force SatAbs to check that bound is in bounds. + * + * This test is meant to mimic checking that "bound" is computed + * correctly *before* passing it to glob2(). + */ + /* BAD */ + *bound = 10; + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob1/bounds_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob1/bounds_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob1/bounds_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob1/bounds_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,17 @@ +#include "../glob.h" + +int main () +{ + Char pathbuf[MAXPATHLEN+1]; + + Char *bound = pathbuf + sizeof(pathbuf)/sizeof(*pathbuf) - 1; + + /* Force SatAbs to check that bound is in bounds. + * + * This test is meant to mimic checking that "bound" is computed + * correctly *before* passing it to glob2(). + */ + /* OK */ + *bound = 10; + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/anyMeta_int_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/anyMeta_int_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/anyMeta_int_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/anyMeta_int_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,50 @@ +#include "../glob.h" + +int glob2 (Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + int i; + int anymeta; + Char tmp; + + for (anymeta = 0;;) { + + /* Copies a single string from pattern into pathend, checking for + * the presence of meta-characters. + */ + i = 0; + while (pattern[i] != EOS && pattern[i] != SEP) { + if (ismeta(pattern[i])) + anymeta = 1; + if (pathend + i >= pathlim) + return 1; + tmp = pattern[i]; + /* BAD */ + pathend[i] = tmp; + i++; + } + + if (nondet_int ()) + return 0; + } + + /* NOT REACHED */ +} + +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A) - 1; + + glob2 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/anyMeta_int_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/anyMeta_int_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/anyMeta_int_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/anyMeta_int_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,50 @@ +#include "../glob.h" + +int glob2 (Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + int i; + int anymeta; + Char tmp; + + for (anymeta = 0;;) { + + /* Copies a single string from pattern into pathend, checking for + * the presence of meta-characters. + */ + i = 0; + while (pattern[i] != EOS && pattern[i] != SEP) { + if (ismeta(pattern[i])) + anymeta = 1; + if (pathend + i >= pathlim) + return 1; + tmp = pattern[i]; + /* OK */ + pathend[i] = tmp; + i++; + } + + if (nondet_int ()) + return 0; + } + + /* NOT REACHED */ +} + +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A)/sizeof(*A) - 1; + + glob2 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/anyMeta_ptr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/anyMeta_ptr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/anyMeta_ptr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/anyMeta_ptr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,52 @@ +#include "../glob.h" + +int glob2 (Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + Char *p, *q; + int anymeta; + Char tmp; + + for (anymeta = 0;;) { + + /* Copies a single string from pattern into pathend, checking for + * the presence of meta-characters. + */ + q = pathend; + p = pattern; + while (*p != EOS && *p != SEP) { + if (ismeta(*p)) + anymeta = 1; + if (q >= pathlim) + return 1; + tmp = *p; + /* BAD */ + *q = tmp; + q++; + p++; + } + + if (nondet_int ()) + return 0; + } + + /* NOT REACHED */ +} + +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A) - 1; + + glob2 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/anyMeta_ptr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/anyMeta_ptr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/anyMeta_ptr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/anyMeta_ptr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,52 @@ +#include "../glob.h" + +int glob2 (Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + Char *p, *q; + int anymeta; + Char tmp; + + for (anymeta = 0;;) { + + /* Copies a single string from pattern into pathend, checking for + * the presence of meta-characters. + */ + q = pathend; + p = pattern; + while (*p != EOS && *p != SEP) { + if (ismeta(*p)) + anymeta = 1; + if (q >= pathlim) + return 1; + tmp = *p; + /* OK */ + *q = tmp; + q++; + p++; + } + + if (nondet_int ()) + return 0; + } + + /* NOT REACHED */ +} + +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A)/sizeof(*A) - 1; + + glob2 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/glob2_int_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/glob2_int_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/glob2_int_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/glob2_int_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,91 @@ +#include "../glob.h" + +int glob2 (Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + int i; + int anymeta; + Char tmp; + + for (anymeta = 0;;) { + + /* End of the pattern. Recursion stops, and we extend the glob + * structure. + */ + if (*pattern == EOS) { + *pathend = EOS; + if (NONDET()) { + if (pathend >= pathlim) + return 1; + /* BAD */ + *pathend = SEP; + pathend++; + /* BAD */ + *pathend = EOS; + } + // replaces globextend + return 0; + } + + /* Copies a single string from pattern into pathend, checking for + * the presence of meta-characters. + */ + i = 0; + while (pattern[i] != EOS && pattern[i] != SEP) { + if (ismeta(pattern[i])) + anymeta = 1; + if (pathend + i >= pathlim) + return 1; + tmp = pattern[i]; + /* BAD */ + pathend[i] = tmp; + i++; + } + + /* If there was no metacharacter, we take whatever came + * after the string we previously copied, copy it into + * pathend, and continue. + * + * If we did encounter a meta-character, we recurse + * by calling glob3 () -- we elide glob3 () in + * this example. + */ + if (!anymeta) { + pathend = pathend + i; + pattern = pattern + i; + while (*pattern == SEP) { + // bounds check + if (pathend >= pathlim) + return 1; + tmp = *pattern; + /* BAD */ + *pathend = tmp; + pathend++; + pattern++; + } + } else { + // stand-in for glob3 (which is recursive) + return 0; + } + } + + /* NOT REACHED */ +} + +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A) - 1; + + glob2 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/glob2_int_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/glob2_int_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/glob2_int_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/glob2_int_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,91 @@ +#include "../glob.h" + +int glob2 (Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + int i; + int anymeta; + Char tmp; + + for (anymeta = 0;;) { + + /* End of the pattern. Recursion stops, and we extend the glob + * structure. + */ + if (*pattern == EOS) { + *pathend = EOS; + if (NONDET()) { + if (pathend >= pathlim) + return 1; + /* OK */ + *pathend = SEP; + pathend++; + /* OK */ + *pathend = EOS; + } + // replaces globextend + return 0; + } + + /* Copies a single string from pattern into pathend, checking for + * the presence of meta-characters. + */ + i = 0; + while (pattern[i] != EOS && pattern[i] != SEP) { + if (ismeta(pattern[i])) + anymeta = 1; + if (pathend + i >= pathlim) + return 1; + tmp = pattern[i]; + /* OK */ + pathend[i] = tmp; + i++; + } + + /* If there was no metacharacter, we take whatever came + * after the string we previously copied, copy it into + * pathend, and continue. + * + * If we did encounter a meta-character, we recurse + * by calling glob3 () -- we elide glob3 () in + * this example. + */ + if (!anymeta) { + pathend = pathend + i; + pattern = pattern + i; + while (*pattern == SEP) { + // bounds check + if (pathend >= pathlim) + return 1; + tmp = *pattern; + /* OK */ + *pathend = tmp; + pathend++; + pattern++; + } + } else { + // stand-in for glob3 (which is recursive) + return 0; + } + } + + /* NOT REACHED */ +} + +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A)/sizeof(*A) - 1; + + glob2 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/glob2_ptr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/glob2_ptr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/glob2_ptr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/glob2_ptr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,92 @@ +#include "../glob.h" + +int glob2 (Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + Char *p, *q; + int anymeta; + Char tmp; + + for (anymeta = 0;;) { + + /* End of the pattern. Recursion stops, and we extend the glob + * structure. + */ + if (*pattern == EOS) { + *pathend = EOS; + if (NONDET()) { + if (pathend >= pathlim) + return 1; + *pathend = SEP; + pathend++; + /* BAD */ + *pathend = EOS; + } + // replaces globextend + return 0; + } + + /* Copies a single string from pattern into pathend, checking for + * the presence of meta-characters. + */ + q = pathend; + p = pattern; + while (*p != EOS && *p != SEP) { + if (ismeta(*p)) + anymeta = 1; + if (q >= pathlim) + return 1; + tmp = *p; + /* BAD */ + *q = tmp; + q++; + p++; + } + + /* If there was no metacharacter, we take whatever came + * after the string we previously copied, copy it into + * pathend, and continue. + * + * If we did encounter a meta-character, we recurse + * by calling glob3 () -- we elide glob3 () in + * this example. + */ + if (!anymeta) { + pathend = q; + pattern = p; + while (*pattern == SEP) { + // bounds check + if (pathend >= pathlim) + return 1; + tmp = *pattern; + /* BAD */ + *pathend = tmp; + pathend++; + pattern++; + } + } else { + // stand-in for glob3 (which is recursive) + return 0; + } + } + + /* NOT REACHED */ +} + +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A) - 1; + + glob2 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/glob2_ptr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/glob2_ptr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/glob2_ptr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/glob2_ptr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,92 @@ +#include "../glob.h" + +int glob2 (Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + Char *p, *q; + int anymeta; + Char tmp; + + for (anymeta = 0;;) { + + /* End of the pattern. Recursion stops, and we extend the glob + * structure. + */ + if (*pattern == EOS) { + *pathend = EOS; + if (NONDET()) { + if (pathend >= pathlim) + return 1; + *pathend = SEP; + pathend++; + /* OK */ + *pathend = EOS; + } + // replaces globextend + return 0; + } + + /* Copies a single string from pattern into pathend, checking for + * the presence of meta-characters. + */ + q = pathend; + p = pattern; + while (*p != EOS && *p != SEP) { + if (ismeta(*p)) + anymeta = 1; + if (q >= pathlim) + return 1; + tmp = *p; + /* OK */ + *q = tmp; + q++; + p++; + } + + /* If there was no metacharacter, we take whatever came + * after the string we previously copied, copy it into + * pathend, and continue. + * + * If we did encounter a meta-character, we recurse + * by calling glob3 () -- we elide glob3 () in + * this example. + */ + if (!anymeta) { + pathend = q; + pattern = p; + while (*pattern == SEP) { + // bounds check + if (pathend >= pathlim) + return 1; + tmp = *pattern; + /* OK */ + *pathend = tmp; + pathend++; + pattern++; + } + } else { + // stand-in for glob3 (which is recursive) + return 0; + } + } + + /* NOT REACHED */ +} + +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A)/sizeof(*A) - 1; + + glob2 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/loop_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/loop_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/loop_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/loop_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,24 @@ +#include "../glob.h" + +int glob2 (Char *pathbuf, Char *pathlim) +{ + Char *p; + + for (p = pathbuf; p <= pathlim; p++) { + /* BAD */ + *p = 1; + } + + return 0; +} + +int main () +{ + Char pathbuf[MAXPATHLEN+1]; + + Char *bound = pathbuf + sizeof(pathbuf) - 1; + + glob2 (pathbuf, bound); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/loop_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/loop_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/loop_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/loop_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,24 @@ +#include "../glob.h" + +int glob2 (Char *pathbuf, Char *pathlim) +{ + Char *p; + + for (p = pathbuf; p <= pathlim; p++) { + /* OK */ + *p = 1; + } + + return 0; +} + +int main () +{ + Char pathbuf[MAXPATHLEN+1]; + + Char *bound = pathbuf + sizeof(pathbuf)/sizeof(*pathbuf) - 1; + + glob2 (pathbuf, bound); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/noAnyMeta_int_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/noAnyMeta_int_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/noAnyMeta_int_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/noAnyMeta_int_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,43 @@ +#include "../glob.h" + +int glob2 (Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + int i; + Char tmp; + + i = 0; + for (;;) { + while (pattern[i] != EOS && pattern[i] != SEP) { + if (pathend + i >= pathlim) + return 1; + tmp = pattern[i]; + /* BAD */ + pathend[i] = tmp; + i++; + } + + if (nondet_int ()) + return 0; + } + + /* NOT REACHED */ +} + +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A) - 1; + + glob2 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/noAnyMeta_int_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/noAnyMeta_int_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/noAnyMeta_int_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/noAnyMeta_int_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,43 @@ +#include "../glob.h" + +int glob2 (Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + int i; + Char tmp; + + i = 0; + for (;;) { + while (pattern[i] != EOS && pattern[i] != SEP) { + if (pathend + i >= pathlim) + return 1; + tmp = pattern[i]; + /* OK */ + pathend[i] = tmp; + i++; + } + + if (nondet_int ()) + return 0; + } + + /* NOT REACHED */ +} + +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A)/sizeof(*A) - 1; + + glob2 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/noAnyMeta_ptr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/noAnyMeta_ptr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/noAnyMeta_ptr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/noAnyMeta_ptr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,45 @@ +#include "../glob.h" + +int glob2 (Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + Char *p, *q; + Char tmp; + + for (;;) { + q = pathend; + p = pattern; + while (*p != EOS && *p != SEP) { + if (q >= pathlim) + return 1; + tmp = *p; + /* BAD */ + *q = tmp; + q++; + p++; + } + + if (nondet_int ()) + return 0; + } + + /* NOT REACHED */ +} + +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A) - 1; + + glob2 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/noAnyMeta_ptr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/noAnyMeta_ptr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/noAnyMeta_ptr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob2/noAnyMeta_ptr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,45 @@ +#include "../glob.h" + +int glob2 (Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + Char *p, *q; + Char tmp; + + for (;;) { + q = pathend; + p = pattern; + while (*p != EOS && *p != SEP) { + if (q >= pathlim) + return 1; + tmp = *p; + /* OK */ + *q = tmp; + q++; + p++; + } + + if (nondet_int ()) + return 0; + } + + /* NOT REACHED */ +} + +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A)/sizeof(*A) - 1; + + glob2 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/glob3_int_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/glob3_int_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/glob3_int_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/glob3_int_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,117 @@ +#include "../glob.h" + +struct dirent { + char d_name[MAXNAMLEN + 1]; +}; + +static int +g_Ctoc(Char *str, char *buf, size_t len) +{ + int i; + + if (len == 0) + return 1; + + for (i = 0; len && (buf[i] = str[i]) != EOS; len--) + i++; + + return len == 0; +} + +static int +glob3(Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + struct dirent dp; + int error; + char buf[MAXPATHLEN]; + + + *pathend = EOS; + + if (nondet_int()) { + if (nondet_int()) { + if (g_Ctoc(pathbuf, buf, sizeof(buf))) + return (GLOB_ABORTED); + if (nondet_int()) + return (GLOB_ABORTED); + } + + if (nondet_int()) + return (GLOB_ABORTED); + + return(0); + } + + error = 0; + while (nondet_int()) { + int i; + + /* Initial DOT must be matched literally. */ + if (dp.d_name[0] == DOT && *pattern != DOT) + continue; + /* + * The resulting string contains EOS, so we can + * use the pathlim character, if it is the nul + */ + i = 0; + for (;;) + if (pathend + i > pathlim) break; + else { + pathend[i] = dp.d_name[i]; + i++; + /* BAD */ + if (pathend[i] == EOS) break; + } + + /* + * Have we filled the buffer without seeing EOS? + */ + if (pathend + i > pathlim && *pathlim != EOS) { + /* + * Abort when requested by caller, otherwise + * reset pathend back to last SEP and continue + * with next dir entry. + */ + if (nondet_int()) { + error = GLOB_ABORTED; + break; + } + else { + /* BAD */ + pathend[i] = EOS; + continue; + } + } + + /* match() is scary, and recursive, which Satabs can't handle. + * Replacing it with a non-deterministic stub.... + * + * This is irrelevant to overflow detection anyhow, since this + * is *after* the overflow. */ + if (/*!match(pathend, pattern, restpattern)*/nondet_int()) { + /* BAD */ + pathend[i] = EOS; + continue; + } + } + + return error; +} +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A) - 1; + + glob3 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/glob3_int_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/glob3_int_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/glob3_int_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/glob3_int_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,117 @@ +#include "../glob.h" + +struct dirent { + char d_name[MAXNAMLEN + 1]; +}; + +static int +g_Ctoc(Char *str, char *buf, size_t len) +{ + int i; + + if (len == 0) + return 1; + + for (i = 0; len && (buf[i] = str[i]) != EOS; len--) + i++; + + return len == 0; +} + +static int +glob3(Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + struct dirent dp; + int error; + char buf[MAXPATHLEN]; + + + *pathend = EOS; + + if (nondet_int()) { + if (nondet_int()) { + if (g_Ctoc(pathbuf, buf, sizeof(buf))) + return (GLOB_ABORTED); + if (nondet_int()) + return (GLOB_ABORTED); + } + + if (nondet_int()) + return (GLOB_ABORTED); + + return(0); + } + + error = 0; + while (nondet_int()) { + int i; + + /* Initial DOT must be matched literally. */ + if (dp.d_name[0] == DOT && *pattern != DOT) + continue; + /* + * The resulting string contains EOS, so we can + * use the pathlim character, if it is the nul + */ + i = 0; + for (;;) + if (pathend + i > pathlim) break; + else { + pathend[i] = dp.d_name[i]; + i++; + /* OK */ + if (pathend[i] == EOS) break; + } + + /* + * Have we filled the buffer without seeing EOS? + */ + if (pathend + i > pathlim && *pathlim != EOS) { + /* + * Abort when requested by caller, otherwise + * reset pathend back to last SEP and continue + * with next dir entry. + */ + if (nondet_int()) { + error = GLOB_ABORTED; + break; + } + else { + /* OK */ + pathend[i] = EOS; + continue; + } + } + + /* match() is scary, and recursive, which Satabs can't handle. + * Replacing it with a non-deterministic stub.... + * + * This is irrelevant to overflow detection anyhow, since this + * is *after* the overflow. */ + if (/*!match(pathend, pattern, restpattern)*/nondet_int()) { + /* OK */ + pathend[i] = EOS; + continue; + } + } + + return error; +} +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A)/sizeof(*A) - 1; + + glob3 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/glob3_ptr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/glob3_ptr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/glob3_ptr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/glob3_ptr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,118 @@ +#include "../glob.h" + +struct dirent { + char d_name[MAXNAMLEN + 1]; +}; + +static int +g_Ctoc(Char *str, char *buf, size_t len) +{ + char *dc; + + if (len == 0) + return 1; + + for (dc = buf; len && (*dc++ = *str++) != EOS; len--) + continue; + + return len == 0; +} + +static int +glob3(Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + struct dirent dp; + int error; + char buf[MAXPATHLEN]; + + + *pathend = EOS; + + if (nondet_int()) { + if (nondet_int()) { + if (g_Ctoc(pathbuf, buf, sizeof(buf))) + return (GLOB_ABORTED); + if (nondet_int()) + return (GLOB_ABORTED); + } + + if (nondet_int()) + return (GLOB_ABORTED); + + return(0); + } + + error = 0; + while (nondet_int()) { + char *sc; + Char *dc; + + /* Initial DOT must be matched literally. */ + if (dp.d_name[0] == DOT && *pattern != DOT) + continue; + /* + * The resulting string contains EOS, so we can + * use the pathlim character, if it is the nul + */ + for (sc = dp.d_name, dc = pathend;;) + if (dc > pathlim) break; + else { + *dc = *sc; + dc++; + sc++; + /* BAD */ + if (*dc == EOS) break; + } + + + /* + * Have we filled the buffer without seeing EOS? + */ + if (dc > pathlim && *pathlim != EOS) { + /* + * Abort when requested by caller, otherwise + * reset pathend back to last SEP and continue + * with next dir entry. + */ + if (nondet_int()) { + error = GLOB_ABORTED; + break; + } + else { + /* BAD */ + *pathend = EOS; + continue; + } + } + + /* match is scary */ + if (/*!match(pathend, pattern, restpattern)*/nondet_int()) { + /* BAD */ + *pathend = EOS; + continue; + }/* + error = glob2(pathbuf, --dc, pathlim, restpattern, pglob, limit); + if (error) + break;*/ + } + + return error; +} +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A) - 1; + + glob3 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/glob3_ptr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/glob3_ptr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/glob3_ptr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/glob3_ptr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,118 @@ +#include "../glob.h" + +struct dirent { + char d_name[MAXNAMLEN + 1]; +}; + +static int +g_Ctoc(Char *str, char *buf, size_t len) +{ + char *dc; + + if (len == 0) + return 1; + + for (dc = buf; len && (*dc++ = *str++) != EOS; len--) + continue; + + return len == 0; +} + +static int +glob3(Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + struct dirent dp; + int error; + char buf[MAXPATHLEN]; + + + *pathend = EOS; + + if (nondet_int()) { + if (nondet_int()) { + if (g_Ctoc(pathbuf, buf, sizeof(buf))) + return (GLOB_ABORTED); + if (nondet_int()) + return (GLOB_ABORTED); + } + + if (nondet_int()) + return (GLOB_ABORTED); + + return(0); + } + + error = 0; + while (nondet_int()) { + char *sc; + Char *dc; + + /* Initial DOT must be matched literally. */ + if (dp.d_name[0] == DOT && *pattern != DOT) + continue; + /* + * The resulting string contains EOS, so we can + * use the pathlim character, if it is the nul + */ + for (sc = dp.d_name, dc = pathend;;) + if (dc > pathlim) break; + else { + *dc = *sc; + dc++; + sc++; + /* OK */ + if (*dc == EOS) break; + } + + + /* + * Have we filled the buffer without seeing EOS? + */ + if (dc > pathlim && *pathlim != EOS) { + /* + * Abort when requested by caller, otherwise + * reset pathend back to last SEP and continue + * with next dir entry. + */ + if (nondet_int()) { + error = GLOB_ABORTED; + break; + } + else { + /* OK */ + *pathend = EOS; + continue; + } + } + + /* match is scary */ + if (/*!match(pathend, pattern, restpattern)*/nondet_int()) { + /* OK */ + *pathend = EOS; + continue; + }/* + error = glob2(pathbuf, --dc, pathlim, restpattern, pglob, limit); + if (error) + break;*/ + } + + return error; +} +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A)/sizeof(*A) - 1; + + glob3 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/loop_int_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/loop_int_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/loop_int_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/loop_int_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,37 @@ +#include "../glob.h" + +static int +glob3(Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + int dc; + dc = 0; + for (;;) + if (pathend + dc > pathlim) break; + else { + pathend[dc] = 1; + dc++; + /* BAD */ + if (pathend[dc] == EOS) break; + } + + return 0; +} + +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A) - 1; + + glob3 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/loop_int_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/loop_int_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/loop_int_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/loop_int_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,37 @@ +#include "../glob.h" + +static int +glob3(Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + int dc; + dc = 0; + for (;;) + if (pathend + dc > pathlim) break; + else { + pathend[dc] = 1; + dc++; + /* OK */ + if (pathend[dc] == EOS) break; + } + + return 0; +} + +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A)/sizeof(*A) - 1; + + glob3 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/loop_ptr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/loop_ptr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/loop_ptr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/loop_ptr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,37 @@ +#include "../glob.h" + +static int +glob3(Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + Char *dc; + dc = pathend; + for (;;) + if (dc > pathlim) break; + else { + *dc = 1; + dc++; + /* BAD */ + if (*dc == EOS) break; + } + + return 0; +} + +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A) - 1; + + glob3 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/loop_ptr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/loop_ptr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/loop_ptr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob3/loop_ptr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,37 @@ +#include "../glob.h" + +static int +glob3(Char *pathbuf, Char *pathend, Char *pathlim, Char *pattern) +{ + Char *dc; + dc = pathend; + for (;;) + if (dc > pathlim) break; + else { + *dc = 1; + dc++; + /* OK */ + if (*dc == EOS) break; + } + + return 0; +} + +int main () +{ + Char *buf; + Char *pattern; + Char *bound; + + Char A [MAXPATHLEN+1]; + Char B [PATTERNLEN]; + + buf = A; + pattern = B; + + bound = A + sizeof(A)/sizeof(*A) - 1; + + glob3 (buf, buf, bound, pattern); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/glob.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,60 @@ +#include "../../../../lib/stubs.h" + +/* (One less than the) size of the buffer being overflowed. */ +#define MAXPATHLEN BASE_SZ + +/* Make PATTERNLEN bigger than MAXPATHLEN -- we want to be able to overflow + * the buffer of length MAXPATHLEN+1 without having a tool complain about + * out-of-bounds reads of the pattern buffer. + */ +#define PATTERNLEN MAXPATHLEN+5 + +/* Size of d_name. We don't care about it; like PATTERNLEN, just make + * it "big enough". + */ +#define MAXNAMLEN (MAXPATHLEN * 4) + +#define DOLLAR '$' +#define DOT '.' +#define LBRACKET '[' +#define NOT '!' +#define QUESTION '?' +#define QUOTE '\\' +#define RANGE '-' +#define RBRACKET ']' +#define SEP '/' +#define STAR '*' +#define TILDE '~' +#define UNDERSCORE '_' +#define LBRACE '{' +#define RBRACE '}' +#define SLASH '/' +#define COMMA ',' + +#define M_QUOTE 0x80 +#define M_PROTECT 0x40 +#define M_MASK 0xff +#define M_ASCII 0x7f + +/* In the original, a Char is an unsigned short. + * + * However, this triggers a bug in SatAbs. Hence, it's an int. + */ +//typedef unsigned short Char; +typedef int Char; +typedef char u_char; + +#define CHAR(c) ((Char)((c)&M_ASCII)) +#define META(c) ((Char)((c)|M_QUOTE)) +#define M_ALL META('*') +#define M_END META(']') +#define M_NOT META('!') +#define M_ONE META('?') +#define M_RNG META('-') +#define M_SET META('[') +#define ismeta(c) (((c)&(0x80)) != 0) + +#define GLOB_ABORTED -1 + +// For SatAbs +extern int nondet_int (void); diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/CVE-2006-6652/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,47 @@ +-= CVE-2006-6652 =- + +Vulnerable versions: libc in NetBSD-current before 20050914, + NetBSD 2.* and 3.* before 20061203 +File(s): src/lib/libc/gen/glob.c +Download from: + To get the original file, do the following (using bash): + $ CVSROOT=:pserver:anoncvs@anoncvs.NetBSD.org:/cvsroot; export CVSROOT + $ cvs login + ---> use the password "anoncvs" + $ cvs co -D 2005-09-13 src/lib/libc/gen/glob.c + If NetBSD has changed their anonymouns cvs checkout procedures since + the time of this writing, visit + http://www.netbsd.org/Documentation/current/#using-anoncvs-pserver + for instructions. + +Domain: C library + +_ Vulnerable Functions and Buffers _ + +glob1() passes a buffer, pathbuf, to glob2(). glob1() also passes a +pointer, pathlim, which is meant to point to the end of pathbuf, for +glob2() and glob3() to use for bounds checking. pathlim is computed +incorrectly, so multiple instructions in glob2() and glob3() can +overflow pathbuf. + +_ Decomposed Programs _ + +glob.h + +glob1/ + bounds_bad.c + +glob2/ + loop_bad.c + noAnyMeta_int_bad.c + noAnyMeta_ptr_bad.c + anyMeta_int_bad.c + anyMeta_ptr_bad.c + glob2_int_bad.c + glob2_ptr_bad.c + +glob3/ + loop_int_bad.c + loop_ptr_bad.c + glob3_int_bad.c + glob3_ptr_bad.c diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/NetBSD-libc/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,7 @@ +-= NetBSD libc =- + +Homepage: http://www.netbsd.org +Domain: C Library + +NetBSD is a Unix-like operating system, and this is it's +implementation of the C standard library. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/complete/parse_config_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/complete/parse_config_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/complete/parse_config_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/complete/parse_config_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,80 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + r_strncpy(str2, str+start, j-start+1); + /* BAD */ + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + +int parse_expression (char *str) { + char *except; + char str2 [LINE_LENGTH]; + + except = strstr(str, NEEDLE); + if (except) { + strncpy(str2, str, except-str); + str2[except-str] = EOS; + if (parse_expression_list(except+NEEDLE_SZ)) { + /* error */ + return -1; + } + } + + return 0; +} + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/complete/parse_config_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/complete/parse_config_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/complete/parse_config_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/complete/parse_config_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,83 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + r_strncpy(str2, str+start, j-start+1); + /* OK */ + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + +int parse_expression (char *str) { + char *except; + char str2 [LINE_LENGTH+1]; + + except = strstr(str, NEEDLE); + if (except) { + strncpy(str2, str, except-str); + str2[except-str] = EOS; + if (parse_expression_list(except+NEEDLE_SZ)) { + /* error */ + return -1; + } + } + + return 0; +} + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/constants.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/constants.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/constants.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/constants.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,14 @@ +#ifndef _CONSTANTS_H +#define _CONSTANTS_H + +#include "../../../../lib/stubs.h" + +#define EXPRESSION_LENGTH BASE_SZ +#define NEEDLE "EX" +#define NEEDLE_SZ 2 + +/* Enough to fill a buffer of size EXPRESSION_LENGTH, enough to + * contain the needle, and enough to overflow the buffer. */ +#define LINE_LENGTH EXPRESSION_LENGTH + NEEDLE_SZ + 4 + +#endif diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_random_index_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_random_index_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_random_index_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_random_index_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,28 @@ +#include "../constants.h" + +int parse_expression (char *str) { + int ind; + char str2 [LINE_LENGTH]; + + ind = nondet_int (); + if (ind < -1 || ind >= LINE_LENGTH) + return -1; + + if (ind != -1) { + strncpy (str2, str, ind); + } else { + /* BAD */ + r_strcpy (str2, str); + } + + return 0; +} + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_random_index_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_random_index_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_random_index_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_random_index_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,28 @@ +#include "../constants.h" + +int parse_expression (char *str) { + int ind; + char str2 [LINE_LENGTH+1]; + + ind = nondet_int (); + if (ind < -1 || ind >= LINE_LENGTH) + return -1; + + if (ind != -1) { + strncpy (str2, str, ind); + } else { + /* OK */ + r_strcpy (str2, str); + } + + return 0; +} + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_strchr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_strchr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_strchr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_strchr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,27 @@ +#include "../constants.h" + +int parse_expression (char *str) { + char *except; + char str2 [LINE_LENGTH]; + + except = strchr (str, 'e'); + if (except) { + // SAFE: the 'e' is not copied + strncpy (str2, str, (unsigned int)(except-str)); + } else { + // UNSAFE: can copy up to LINE_LENGTH+1 characters + /* BAD */ + r_strcpy (str2, str); + } + + return 0; +} + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_strchr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_strchr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_strchr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_strchr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,25 @@ +#include "../constants.h" + +int parse_expression (char *str) { + char *except; + char str2 [LINE_LENGTH+1]; + + except = strchr (str, 'e'); + if (except) { + strncpy (str2, str, (unsigned int)(except-str)); + } else { + /* OK */ + r_strcpy (str2, str); + } + + return 0; +} + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_strstr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_strstr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_strstr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_strstr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,27 @@ +#include "../constants.h" + +int parse_expression (char *str) { + char *except; + char str2 [LINE_LENGTH]; + + except = strstr(str, NEEDLE); + if (except) { + // SAFE: the needle is not copied + strncpy (str2, str, (unsigned int)(except-str)); + } else { + // UNSAFE: can copy up to LINE_LENGTH+1 characters + /* BAD */ + r_strcpy (str2, str); + } + + return 0; +} + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_strstr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_strstr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_strstr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression/guard_strstr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,25 @@ +#include "../constants.h" + +int parse_expression (char *str) { + char *except; + char str2 [LINE_LENGTH+1]; + + except = strstr(str, NEEDLE); + if (except) { + strncpy (str2, str, (unsigned int)(except-str)); + } else { + /* OK */ + r_strcpy (str2, str); + } + + return 0; +} + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullBoth_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullBoth_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullBoth_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullBoth_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,56 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullBoth_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullBoth_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullBoth_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullBoth_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,57 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullBoth_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullBoth_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullBoth_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullBoth_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,60 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullBoth_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullBoth_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullBoth_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullBoth_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,59 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullEnd_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullEnd_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullEnd_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullEnd_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,50 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullEnd_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullEnd_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullEnd_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullEnd_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,51 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullEnd_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullEnd_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullEnd_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullEnd_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,54 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullEnd_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullEnd_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullEnd_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullEnd_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,53 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullStart_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullStart_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullStart_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullStart_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,52 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullStart_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullStart_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullStart_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullStart_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,53 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullStart_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullStart_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullStart_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullStart_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,56 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullStart_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullStart_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullStart_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripFullStart_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,55 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripNone_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripNone_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripNone_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripNone_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,46 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripNone_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripNone_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripNone_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripNone_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,47 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripNone_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripNone_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripNone_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripNone_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,50 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripNone_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripNone_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripNone_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripNone_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,49 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesBoth_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesBoth_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesBoth_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesBoth_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,52 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesBoth_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesBoth_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesBoth_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesBoth_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,53 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesBoth_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesBoth_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesBoth_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesBoth_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,56 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesBoth_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesBoth_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesBoth_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesBoth_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,55 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesEnd_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesEnd_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesEnd_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesEnd_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,49 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesEnd_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesEnd_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesEnd_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesEnd_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,50 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesEnd_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesEnd_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesEnd_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesEnd_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,53 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesEnd_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesEnd_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesEnd_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesEnd_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,52 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesStart_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesStart_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesStart_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesStart_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,49 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesStart_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesStart_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesStart_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesStart_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,50 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesStart_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesStart_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesStart_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesStart_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,53 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesStart_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesStart_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesStart_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases1_stripSpacesStart_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,52 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullBoth_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullBoth_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullBoth_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullBoth_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,59 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullBoth_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullBoth_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullBoth_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullBoth_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,60 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullBoth_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullBoth_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullBoth_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullBoth_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,63 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullBoth_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullBoth_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullBoth_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullBoth_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,62 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullEnd_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullEnd_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullEnd_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullEnd_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,53 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullEnd_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullEnd_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullEnd_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullEnd_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,54 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullEnd_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullEnd_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullEnd_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullEnd_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,57 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullEnd_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullEnd_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullEnd_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullEnd_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,56 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullStart_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullStart_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullStart_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullStart_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,55 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullStart_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullStart_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullStart_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullStart_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,56 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullStart_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullStart_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullStart_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullStart_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,59 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullStart_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullStart_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullStart_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripFullStart_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,58 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripNone_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripNone_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripNone_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripNone_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,49 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripNone_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripNone_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripNone_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripNone_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,50 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripNone_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripNone_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripNone_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripNone_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,53 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripNone_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripNone_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripNone_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripNone_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,52 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesBoth_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesBoth_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesBoth_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesBoth_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,55 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesBoth_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesBoth_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesBoth_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesBoth_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,56 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesBoth_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesBoth_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesBoth_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesBoth_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,59 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesBoth_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesBoth_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesBoth_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesBoth_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,58 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesEnd_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesEnd_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesEnd_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesEnd_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,52 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesEnd_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesEnd_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesEnd_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesEnd_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,53 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesEnd_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesEnd_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesEnd_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesEnd_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,56 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesEnd_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesEnd_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesEnd_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesEnd_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,55 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesStart_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesStart_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesStart_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesStart_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,52 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesStart_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesStart_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesStart_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesStart_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,53 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesStart_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesStart_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesStart_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesStart_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,56 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesStart_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesStart_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesStart_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases2_stripSpacesStart_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,55 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullBoth_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullBoth_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullBoth_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullBoth_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,62 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullBoth_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullBoth_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullBoth_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullBoth_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,63 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullBoth_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullBoth_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullBoth_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullBoth_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,66 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullBoth_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullBoth_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullBoth_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullBoth_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,65 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullEnd_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullEnd_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullEnd_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullEnd_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,56 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullEnd_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullEnd_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullEnd_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullEnd_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,57 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullEnd_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullEnd_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullEnd_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullEnd_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,60 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullEnd_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullEnd_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullEnd_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullEnd_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,59 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' ') || (str[j] == '\t'))) j--; + if ((0 < j) && (str[j] == '"')) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullStart_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullStart_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullStart_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullStart_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,58 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullStart_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullStart_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullStart_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullStart_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,59 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullStart_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullStart_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullStart_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullStart_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,62 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullStart_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullStart_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullStart_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripFullStart_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,61 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ') || (str[start] == '\t')) start++; + + /* Skip quote marks */ + if (str[start] == '"') start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripNone_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripNone_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripNone_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripNone_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,52 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripNone_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripNone_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripNone_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripNone_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,53 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripNone_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripNone_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripNone_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripNone_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,56 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripNone_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripNone_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripNone_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripNone_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,55 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesBoth_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesBoth_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesBoth_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesBoth_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,58 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesBoth_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesBoth_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesBoth_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesBoth_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,59 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesBoth_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesBoth_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesBoth_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesBoth_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,62 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesBoth_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesBoth_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesBoth_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesBoth_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,61 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesEnd_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesEnd_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesEnd_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesEnd_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,55 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesEnd_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesEnd_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesEnd_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesEnd_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,56 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesEnd_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesEnd_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesEnd_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesEnd_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,59 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesEnd_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesEnd_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesEnd_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesEnd_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,58 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Set j to point to the end of the current word */ + j = i-1; + + /* Skip over quotes and whitespace at the END of the word */ + while ((0 < j) && ((str[j] == ' '))) j--; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesStart_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesStart_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesStart_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesStart_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,55 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesStart_arr_inlined_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesStart_arr_inlined_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesStart_arr_inlined_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesStart_arr_inlined_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,56 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + /* BAD */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesStart_arr_inlined_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesStart_arr_inlined_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesStart_arr_inlined_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesStart_arr_inlined_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,59 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + assert (j-start+1 < EXPRESSION_LENGTH); + strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesStart_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesStart_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesStart_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/parse_expression_list/cases3_stripSpacesStart_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,58 @@ +#include "../constants.h" + +static int parse_expression_list(char *str) +{ + int start=0, i=-1, j=-1, apost=0; + char str2[EXPRESSION_LENGTH]; + + if (!str) return -1; + + do { + + /* i only changes here --> it's the "current character" */ + i++; + switch(str[i]) { + case '"': apost = !apost; + break; + + /* Comman and NULL are both word terminators, stop parsing if + your word terminator is a NULL. */ + case ',': if (apost) break; + case EOS: /* word found */ + + /* Skip initial whitespace from start of the word being processed */ + while ((str[start] == ' ')) start++; + + /* Set j to point to the end of the current word */ + j = i-1; + + /* If word not empty.... */ + if (start<=j) { + /* valid word */ + if (j-start+1>=EXPRESSION_LENGTH) { + return -1; + } + /* OK */ + r_strncpy(str2, str+start, j-start+1); + str2[j-start+1] = EOS; + } else { + /* parsing error */ + return -1; + } + /* for the next word */ + start = i+1; + } + } while (str[i] != EOS); + + return 0; +} + + +int main () +{ + char A [LINE_LENGTH+1]; + A[LINE_LENGTH] = EOS; + + parse_expression_list (A); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6749/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,65 @@ +-= CVE-2006-6749 =- + +Vulnerable versions: OpenSER <= 1.1.0 +File(s): openser-1.1.0-tls/modules/permissions/parse_config.c +Download from: + http://www.openser.org/pub/openser/1.1.0/ + src/openser-1.1.0-tls_src.tar.gz + +Domain: SIP (Session Initiation Protocol) + +_ Vulnerable Functions and Buffers _ + +Due to the lack of bounds checking, the buffers str2 +in parse_expression() and str2 in parse_expression_list() +can both be overflowed. + +str2 in parse_expression() is overflowed by a call to +strcpy(); reaching this call depends on the outcome +of a call to strstr(). + +str2 in parse_expression_list() is also overflowed by +a call to strncpy(); however, the overflow depends on +several branches made according to the value of the +characters in the input buffer -- including stripping +of characters from both ends of the substring. + +_ Decomposed Programs _ + +stubs.h + Defines LINE_LENGTH and EXPRESSION_LENGTH + +parse_expression/ + guard_random_index_bad.c + guard_strchr_e_bad.c + guard_strstr_e_bad.c + guard_strstr_eee_bad.c + guard_strstr_except_bad.c + +parse_expression_list/ + single_strip_spaces_copy_bad.c + single_strip_full_copy_bad.c + + copy_zero_bad.c + copy_bad.c + copy_apost_bad.c + copy_strip_spaces_bad.c + copy_strip_full_bad.c + +complete/ + parse_config_bad.c + +pel2/ + cases{1,2,3}_strip{None,SpacesStart,SpacesBoth,FullStart,FullBoth}_{arr,ptr}_{ok,bad}.c + cases1 - switch has only EOS case + cases2 - switch has EOS and , cases + cases3 - switch has EOS and , and " cases + None - no whitespace stripping + Spaces - strip only spaces + Full - strip spaces, tabs, and quote marks + Start - strip only from the start + Both - strip from both sides + arr - using array indexing (original) + ptr - using pointers + + relevant assertion is an explicit assert before strncpy diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/constants.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/constants.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/constants.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/constants.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,26 @@ +#include "../../../../lib/stubs.h" + +/* Note on NEEDLE_SZ: The original program searches for "+CMGR:" or + * "+CMGL: ", and then skips seven characters in either case. I + * *think* that they meant to have a space after teh "+CMGR:", but + * just forgot it, and the parsing works right either way. + */ +#define NEEDLE "+C" // "+CMGR:" or "+CMGL: " +#define NEEDLE_SZ 2 // 7 + +#define NEEDLE2 "," // ",,0\r" + +#define MIN_DIFF BASE_SZ + +/* fetchsms() aborts if it can't advance end at least MIN_DIFF + * characters twice; so, make PDUSIZE 2*MIN_DIFF. + */ +#define PDUSIZE 2*MIN_DIFF + +/* NEEDLE_SZ -- because we search for NEEDLE and skip it + * + * PDUSIZE + 2 so we have enough left to overflow pdu[] + */ +#define ANSWERSIZE NEEDLE_SZ + PDUSIZE + 2 + + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/fetchsms2.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/fetchsms2.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/fetchsms2.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/fetchsms2.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,83 @@ +/* +SMS Server Tools +Copyright (C) 2000-2002 Stefan Frings + +This program is free software unless you got it under another license directly +from the author. You can redistribute it and/or modify it under the terms of +the GNU General Public License as published by the Free Software Foundation. +Either version 2 of the License, or (at your option) any later version. + +http://www.isis.de/members/~s.frings +mailto:s.frings@mail.isis.de + */ +#include "../constants.h" + +/* reads a SMS from the SIM-memory 1-10 */ +/* returns number of SIM memory if successful */ +/* on digicom the return value can be != sim */ +static int fetchsms(char* pdu, int sim) +{ + char command[16]; + char answer[ANSWERSIZE]= "F+CMGR:"; + char* position; + char* beginning; + char* end; + int foo,err; + int clen; + +/* + int i; + for (i = 0; i < ANSWERSIZE; i++) + { + answer[i] = nondet_int(); + } +*/ + answer[sizeof(answer)-1] = EOS; + + // Digicom reports date+time only with AT+CMGL + if (0 && nondet_int() == 0) { + /* search for beginning of the answer */ + position=strstr(answer,"+CMGL: "); + if (position) { + end=position+7; + while (*end<'9' && *end>'0') end++; + position = 0; + } + } else { + position=strstr(answer,"+CMGR:"); + } + + /* keine SMS empfangen, weil Modem nicht mit +CMGR + oder +CMGL geantwortet hat */ + if (position==0) + return 0; + beginning=position+7; + /* keine SMS, weil Modem mit +CMGR: 0,,0 geantwortet hat */ + if (strstr(answer,",,0\r")) + return 0; + + /* After that we have the PDU or ASCII string */ + for( end=beginning ; *end && *end!='\r' ; end++ ); + if ( !*end || end-beginning<4) + return 0; + for( end=end+1 ; *end && *end!='\r' ; end++ ); + if ( !*end || end-beginning<4) + return 0; + /* Now we have the end of the PDU or ASCII string */ + *end=0; + r_strcpy(pdu,beginning); + + return sim; +} + +int main () +{ + char pdu [PDUSIZE]; + int sim = 0; + + fetchsms (pdu, sim); + + return 0; +} + + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/full_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/full_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/full_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/full_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,72 @@ +#include "../constants.h" + +int fetchsms (char *pdu, int sim) +{ + char answer[ANSWERSIZE] = "ABCDE+C"; + int position; + int beginning; + int end; + int foo,err; +#if 0 +//@ loop pragma UNROLL 10 ; + for (int i = 0; i < ANSWERSIZE-1; i++) + answer[i] = nondet_int(); + +/* Input magically appears */ + answer[ANSWERSIZE-1] = EOS; +#endif + + /* Still chopped down a bit from the original in the interests of + * not being heinous */ + if (0 && nondet_int() == 0) { + /* Original program uses a different needle here */ + position=istrstr(answer, NEEDLE); + if (position != -1) { + end=position+NEEDLE_SZ; + while (answer[end] < '9' && answer[end] > '0') + end++; + position = 0; + } + } else { + position=istrstr(answer, NEEDLE); + } + + /* Skip the needle */ + if (position==-1) + return 0; + beginning = position + NEEDLE_SZ + 1; + + /* Answer must contain NEEDLE2; we don't need to skip it. */ + if (istrstr(answer, NEEDLE2) == -1) + return 0; + + /* Find (something)\r(something)\r, where each (something) is at + * least MIN_DIFF characters + * + * If we don't find anything satisfying that, abort + */ + for( end=beginning ; answer[end] != EOS && answer[end] != '\r' ; end++ ); + if ( answer[end] == EOS || end-beginning < MIN_DIFF) + return 0; + for( end=end+1 ; answer[end] != EOS && answer[end] !='\r' ; end++ ); + if ( answer[end] == EOS || end-beginning < MIN_DIFF ) + return 0; + + /* Change the last '\r' to an EOS */ + answer[end] = EOS; + + /* BAD */ + r_strcpy(pdu,answer+beginning); + + return sim; +} + +int main () +{ + char pdu [PDUSIZE]; + int sim = 0; + + fetchsms (pdu, sim); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/full_bad.err frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/full_bad.err --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/full_bad.err 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/full_bad.err 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,9 @@ +No code for function nondet_int, default assigns generated +../../lib/stubs.c:376: Warning: (TODO: emit a proper alarm) accessing uninitialized left-value: *(haystack + i) +../../lib/stubs.c:376: Warning: completely unspecified value in {{ +answer -> {0; } ;}} (size:<8>). This path is assumed to be dead. +../../lib/stubs.c:376: Warning: non termination detected in function istrstr +OpenSER/CVE-2006-6876/fetchsms/full_bad.c:30: Warning: non termination detected in function fetchsms +OpenSER/CVE-2006-6876/fetchsms/full_bad.c:66: Warning: non termination detected in function main +[dominators] computing for function r_memcpy +[dominators] done for function r_memcpy diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/full_bad.log frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/full_bad.log --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/full_bad.log 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/full_bad.log 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,33 @@ +[preprocessing] running gcc -C -E -I. ../../lib/stubs.c +[preprocessing] running gcc -C -E -I. OpenSER/CVE-2006-6876/fetchsms/full_bad.c +[values] computing for function main +====== INITIAL STATE ====== +Computing globals values +====== INITIAL STATE COMPUTED ====== +Values of globals at initialization + +[values] computing for function fetchsms <-main +[values] called from OpenSER/CVE-2006-6876/fetchsms/full_bad.c:64 +[values] computing for function nondet_int <-fetchsms <-main +[values] called from OpenSER/CVE-2006-6876/fetchsms/full_bad.c:16 +[values] done for function nondet_int +[values] computing for function istrstr <-fetchsms <-main +[values] called from OpenSER/CVE-2006-6876/fetchsms/full_bad.c:18 +[values] Recording results for istrstr +[values] done for function istrstr +[values] computing for function istrstr <-fetchsms <-main +[values] called from OpenSER/CVE-2006-6876/fetchsms/full_bad.c:26 +[values] Recording results for istrstr +[values] done for function istrstr +[values] Recording results for fetchsms +[values] done for function fetchsms +[values] Recording results for main +[values] done for function main + +====== VALUES COMPUTED ====== +Values for function istrstr: + NON TERMINATING FUNCTION +Values for function fetchsms: + NON TERMINATING FUNCTION +Values for function main: + NON TERMINATING FUNCTION diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/full_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/full_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/full_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/full_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,67 @@ +#include "../constants.h" + +int fetchsms (char *pdu, int sim) +{ + char answer[ANSWERSIZE]; + int position; + int beginning; + int end; + int foo,err; + + /* Input magically appears */ + answer[ANSWERSIZE-1] = EOS; + + /* Still chopped down a bit from the original in the interests of + * not being heinous */ + if (nondet_int() == 0) { + /* Original program uses a different needle here */ + position=istrstr(answer, NEEDLE); + if (position != -1) { + end=position+NEEDLE_SZ; + while (answer[end] < '9' && answer[end] > '0') + end++; + position = 0; + } + } else { + position=istrstr(answer, NEEDLE); + } + + /* Skip the needle */ + if (position==-1) + return 0; + beginning = position + NEEDLE_SZ + 1; + + /* Answer must contain NEEDLE2; we don't need to skip it. */ + if (istrstr(answer, NEEDLE2) == -1) + return 0; + + /* Find (something)\r(something)\r, where each (something) is at + * least MIN_DIFF characters + * + * If we don't find anything satisfying that, abort + */ + for( end=beginning ; answer[end] != EOS && answer[end] != '\r' ; end++ ); + if ( answer[end] == EOS || end-beginning < MIN_DIFF) + return 0; + for( end=end+1 ; answer[end] != EOS && answer[end] !='\r' ; end++ ); + if ( answer[end] == EOS || end-beginning < MIN_DIFF ) + return 0; + + /* Change the last '\r' to an EOS */ + answer[end] = EOS; + + /* OK */ + r_strcpy(pdu,answer+beginning); + + return sim; +} + +int main () +{ + char pdu [ANSWERSIZE]; + int sim = 0; + + fetchsms (pdu, sim); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr2_loops_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr2_loops_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr2_loops_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr2_loops_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,53 @@ +#include "../constants.h" + +int fetchsms (char *pdu, int sim) +{ + char answer[ANSWERSIZE]; + int position; + int beginning; + int end; + int foo,err; + + /* Input magically appears */ + answer[ANSWERSIZE-1] = EOS; + + /* Search for NEEDLE and skip it */ + position=istrstr(answer,NEEDLE); + if (position==-1) + return 0; + beginning = position + NEEDLE_SZ + 1; + + /* Answer must contain NEEDLE2; we don't need to skip it. */ + if (istrstr(answer, NEEDLE2) == -1) + return 0; + + /* Find (something)\r(something)\r, where each (something) is at + * least MIN_DIFF characters + * + * If we don't find anything satisfying that, abort + */ + for( end=beginning ; answer[end] != EOS && answer[end] != '\r' ; end++ ); + if ( answer[end] == EOS || end-beginning < MIN_DIFF) + return 0; + for( end=end+1 ; answer[end] != EOS && answer[end] !='\r' ; end++ ); + if ( answer[end] == EOS || end-beginning < MIN_DIFF ) + return 0; + + /* Change the last '\r' to an EOS */ + answer[end] = EOS; + + /* BAD */ + r_strcpy(pdu,answer+beginning); + + return sim; +} + +int main () +{ + char pdu [PDUSIZE]; + int sim = 0; + + fetchsms (pdu, sim); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr2_loops_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr2_loops_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr2_loops_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr2_loops_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,53 @@ +#include "../constants.h" + +int fetchsms (char *pdu, int sim) +{ + char answer[ANSWERSIZE]; + int position; + int beginning; + int end; + int foo,err; + + /* Input magically appears */ + answer[ANSWERSIZE-1] = EOS; + + /* Search for NEEDLE and skip it */ + position=istrstr(answer,NEEDLE); + if (position==-1) + return 0; + beginning = position + NEEDLE_SZ + 1; + + /* Answer must contain NEEDLE2; we don't need to skip it. */ + if (istrstr(answer, NEEDLE2) == -1) + return 0; + + /* Find (something)\r(something)\r, where each (something) is at + * least MIN_DIFF characters + * + * If we don't find anything satisfying that, abort + */ + for( end=beginning ; answer[end] != EOS && answer[end] != '\r' ; end++ ); + if ( answer[end] == EOS || end-beginning < MIN_DIFF) + return 0; + for( end=end+1 ; answer[end] != EOS && answer[end] !='\r' ; end++ ); + if ( answer[end] == EOS || end-beginning < MIN_DIFF ) + return 0; + + /* Change the last '\r' to an EOS */ + answer[end] = EOS; + + /* OK */ + r_strcpy(pdu,answer+beginning); + + return sim; +} + +int main () +{ + char pdu [ANSWERSIZE]; + int sim = 0; + + fetchsms (pdu, sim); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,34 @@ +#include "../constants.h" + +int fetchsms (char *pdu, int sim) +{ + char answer[ANSWERSIZE]; + int position; + int beginning; + int end; + int foo,err; + + /* Input magically appears */ + answer[ANSWERSIZE-1] = EOS; + + /* Search for NEEDLE and skip it */ + position=istrstr(answer,NEEDLE); + if (position==-1) + return 0; + beginning = position + NEEDLE_SZ + 1; + + /* BAD */ + r_strcpy(pdu,answer+beginning); + + return sim; +} + +int main () +{ + char pdu [PDUSIZE]; + int sim = 0; + + fetchsms (pdu, sim); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr_loops_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr_loops_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr_loops_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr_loops_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,49 @@ +#include "../constants.h" + +int fetchsms (char *pdu, int sim) +{ + char answer[ANSWERSIZE]; + int position; + int beginning; + int end; + int foo,err; + + /* Input magically appears */ + answer[ANSWERSIZE-1] = EOS; + + /* Search for NEEDLE and skip it */ + position=istrstr(answer,NEEDLE); + if (position==-1) + return 0; + beginning = position + NEEDLE_SZ + 1; + + /* Find (something)\r(something)\r, where each (something) is at + * least MIN_DIFF characters + * + * If we don't find anything satisfying that, abort + */ + for( end=beginning ; answer[end] != EOS && answer[end] != '\r' ; end++ ); + if ( answer[end] == EOS || end-beginning < MIN_DIFF) + return 0; + for( end=end+1 ; answer[end] != EOS && answer[end] !='\r' ; end++ ); + if ( answer[end] == EOS || end-beginning < MIN_DIFF ) + return 0; + + /* Change the last '\r' to an EOS */ + answer[end] = EOS; + + /* BAD */ + r_strcpy(pdu,answer+beginning); + + return sim; +} + +int main () +{ + char pdu [PDUSIZE]; + int sim = 0; + + fetchsms (pdu, sim); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr_loops_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr_loops_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr_loops_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr_loops_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,49 @@ +#include "../constants.h" + +int fetchsms (char *pdu, int sim) +{ + char answer[ANSWERSIZE]; + int position; + int beginning; + int end; + int foo,err; + + /* Input magically appears */ + answer[ANSWERSIZE-1] = EOS; + + /* Search for NEEDLE and skip it */ + position=istrstr(answer,NEEDLE); + if (position==-1) + return 0; + beginning = position + NEEDLE_SZ + 1; + + /* Find (something)\r(something)\r, where each (something) is at + * least MIN_DIFF characters + * + * If we don't find anything satisfying that, abort + */ + for( end=beginning ; answer[end] != EOS && answer[end] != '\r' ; end++ ); + if ( answer[end] == EOS || end-beginning < MIN_DIFF) + return 0; + for( end=end+1 ; answer[end] != EOS && answer[end] !='\r' ; end++ ); + if ( answer[end] == EOS || end-beginning < MIN_DIFF ) + return 0; + + /* Change the last '\r' to an EOS */ + answer[end] = EOS; + + /* OK */ + r_strcpy(pdu,answer+beginning); + + return sim; +} + +int main () +{ + char pdu [ANSWERSIZE]; + int sim = 0; + + fetchsms (pdu, sim); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/istrstr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,34 @@ +#include "../constants.h" + +int fetchsms (char *pdu, int sim) +{ + char answer[ANSWERSIZE]; + int position; + int beginning; + int end; + int foo,err; + + /* Input magically appears */ + answer[ANSWERSIZE-1] = EOS; + + /* Search for NEEDLE and skip it */ + position=istrstr(answer,NEEDLE); + if (position==-1) + return 0; + beginning = position + NEEDLE_SZ + 1; + + /* OK */ + r_strcpy(pdu,answer+beginning); + + return sim; +} + +int main () +{ + char pdu [ANSWERSIZE]; + int sim = 0; + + fetchsms (pdu, sim); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/loops_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/loops_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/loops_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/loops_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,49 @@ +#include "../constants.h" + +int fetchsms (char *pdu, int sim) +{ + char answer[ANSWERSIZE]; + int position; + int beginning; + int end; + int foo,err; + + /* Input magically appears */ + answer[ANSWERSIZE-1] = EOS; + + /* Don't skip anything */ + position = 0; + if (position==-1) + return 0; + beginning = position + NEEDLE_SZ + 1; + + /* Find (something)\r(something)\r, where each (something) is at + * least MIN_DIFF characters + * + * If we don't find anything satisfying that, abort + */ + for( end=beginning ; answer[end] != EOS && answer[end] != '\r' ; end++ ); + if ( answer[end] == EOS || end-beginning < MIN_DIFF) + return 0; + for( end=end+1 ; answer[end] != EOS && answer[end] !='\r' ; end++ ); + if ( answer[end] == EOS || end-beginning < MIN_DIFF ) + return 0; + + /* Change the last '\r' to an EOS */ + answer[end] = EOS; + + /* BAD */ + r_strcpy(pdu,answer+beginning); + + return sim; +} + +int main () +{ + char pdu [PDUSIZE]; + int sim = 0; + + fetchsms (pdu, sim); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/loops_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/loops_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/loops_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/fetchsms/loops_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,49 @@ +#include "../constants.h" + +int fetchsms (char *pdu, int sim) +{ + char answer[ANSWERSIZE]; + int position; + int beginning; + int end; + int foo,err; + + /* Input magically appears */ + answer[ANSWERSIZE-1] = EOS; + + /* Don't skip anything */ + position = 0; + if (position==-1) + return 0; + beginning = position + NEEDLE_SZ + 1; + + /* Find (something)\r(something)\r, where each (something) is at + * least MIN_DIFF characters + * + * If we don't find anything satisfying that, abort + */ + for( end=beginning ; answer[end] != EOS && answer[end] != '\r' ; end++ ); + if ( answer[end] == EOS || end-beginning < MIN_DIFF) + return 0; + for( end=end+1 ; answer[end] != EOS && answer[end] !='\r' ; end++ ); + if ( answer[end] == EOS || end-beginning < MIN_DIFF ) + return 0; + + /* Change the last '\r' to an EOS */ + answer[end] = EOS; + + /* OK */ + r_strcpy(pdu,answer+beginning); + + return sim; +} + +int main () +{ + char pdu [ANSWERSIZE]; + int sim = 0; + + fetchsms (pdu, sim); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/CVE-2006-6876/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,28 @@ +-= CVE-2006-6876 =- + +Vulnerable versions: OpenSER <= 1.2.0 +File(s): openser-1.1.0-tls/modules/sms/libsms_getsms.c +Download from: + http://www.openser.org/pub/openser/1.1.0/src/openser-1.1.0-tls_src.tar.gz + +Domain: SIP (Session Initiation Protocol) + +_ Vulnerable Functions and Buffers _ + +A buffer, pdu[], is passed to fetchsms(). fetchsms() writes into pdu[] +from another buffer, answer[], which it gets from the +modem. fetchsms() does some heavyweight string parsing of answer[], +and copies part of answer[] into pdu[]. Unfortunately, pdu[] is too +small to hold this substring of answer[]. + +_ Decomposed Programs _ + +constants.h + +fetchsms/ + loops_bad.c + istrstr_bad.c + istrstr_loops_bad.c + istrstr2_loops_bad.c + full_bad.c + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/OpenSER/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/OpenSER/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,8 @@ +-= OpenSER =- + +Homepage: http://www.openser.org +Domain: SIP (Session Initiation Protocol) Server + +SIP is the Session Initiation Protocol. It is an application-layer +networking protocol which handles sessions. OpenSER is an open-source +SIP server. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/constants.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/constants.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/constants.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/constants.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,10 @@ +#include "../../../../lib/stubs.h" + +typedef int NSS_STATUS; + +/* Size of overflowed buffer. */ +#define FSTRING_LEN BASE_SZ /* originally 256 */ +typedef char fstring[FSTRING_LEN]; + +/* Size of input buffer. */ +#define INSZ (FSTRING_LEN+2) diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/_nss_winbind_ipnodes_getbyname/nonsimp_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/_nss_winbind_ipnodes_getbyname/nonsimp_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/_nss_winbind_ipnodes_getbyname/nonsimp_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/_nss_winbind_ipnodes_getbyname/nonsimp_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,28 @@ +#include "../structs.h" + +char in [INSZ]; + +static NSS_STATUS +_nss_winbind_ipnodes_getbyname(void *args) +{ + nss_XbyY_args_t *argp = (nss_XbyY_args_t*) args; + struct winbindd_request request; + + /* BAD */ + r_strncpy(request.data.winsreq, argp->key.name, strlen(argp->key.name)) ; + + return 0; +} + +int main () +{ + nss_XbyY_args_t k; + + in[INSZ] = EOS; + k.key.name = in; + + _nss_winbind_ipnodes_getbyname(&k); + + return 0; +} + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/_nss_winbind_ipnodes_getbyname/nonsimp_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/_nss_winbind_ipnodes_getbyname/nonsimp_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/_nss_winbind_ipnodes_getbyname/nonsimp_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/_nss_winbind_ipnodes_getbyname/nonsimp_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,28 @@ +#include "../structs.h" + +char in [INSZ]; + +static NSS_STATUS +_nss_winbind_ipnodes_getbyname(void *args) +{ + nss_XbyY_args_t *argp = (nss_XbyY_args_t*) args; + struct winbindd_request request; + + /* OK */ + r_strncpy(request.data.winsreq, argp->key.name, FSTRING_LEN) ; + + return 0; +} + +int main () +{ + nss_XbyY_args_t k; + + in[INSZ] = EOS; + k.key.name = in; + + _nss_winbind_ipnodes_getbyname(&k); + + return 0; +} + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/_nss_winbind_ipnodes_getbyname/simp_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/_nss_winbind_ipnodes_getbyname/simp_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/_nss_winbind_ipnodes_getbyname/simp_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/_nss_winbind_ipnodes_getbyname/simp_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,22 @@ +#include "../constants.h" + +static NSS_STATUS +_nss_winbind_ipnodes_getbyname(char *name) +{ + char winsreq [FSTRING_LEN]; + + /* BAD */ + r_strncpy(winsreq, name, strlen(name)) ; + + return 0; +} + +int main () +{ + char in [INSZ]; + in[INSZ-1] = EOS; + + _nss_winbind_ipnodes_getbyname(in); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/_nss_winbind_ipnodes_getbyname/simp_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/_nss_winbind_ipnodes_getbyname/simp_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/_nss_winbind_ipnodes_getbyname/simp_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/_nss_winbind_ipnodes_getbyname/simp_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,22 @@ +#include "../constants.h" + +static NSS_STATUS +_nss_winbind_ipnodes_getbyname(char *name) +{ + char winsreq [FSTRING_LEN]; + + /* OK */ + r_strncpy(winsreq, name, FSTRING_LEN) ; + + return 0; +} + +int main () +{ + char in [INSZ]; + in[INSZ-1] = EOS; + + _nss_winbind_ipnodes_getbyname(in); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,27 @@ +-= CVE-2007-0453 =- + +Vulnerable versions: Samba 3.0.21 through 3.0.23d +File(s): source/nsswitch/winbind_nss_solaris.c +Download from: + http://us4.samba.org/samba/ftp/old-versions/samba-3.0.23d.tar.gz + +Domain: SMB (Server Message Block) Suite + +_ Vulnerable Functions and Buffers _ + +The library functions _nss_winbind_ipnodes_getbyname() and +_nss_winbind_hosts_getbyname() are both vulnerable. Each function copies +data into request.data.winsreq, passing an incorrect bound to strncpy(). + +Algorithmically, this overflow is very simple, and isn't +string-content-based. The difficult parts are the technical bits -- +modelling structures, unions, and typecasting. + +_ Decomposed Programs _ + +constants.h +structs.h + +_nss_winbind_ipnodes_getbyname/ + simp_bad.c + nonsimp_bad.c diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/structs.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/structs.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/structs.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/samba/CVE-2007-0453/structs.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,24 @@ +#include "constants.h" + +#ifndef BOOL +typedef int BOOL; +#endif + +struct winbindd_request { + union { + /* Got rid of most union fields.... */ + fstring winsreq; /* WINS request */ + BOOL list_all_domains; + } data; +}; + +union nss_XbyY_key { + /* Got rid of most fields.... */ + const char *name; + int number; +}; + +typedef struct nss_XbyY_args { + union nss_XbyY_key key; +} nss_XbyY_args_t; + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/samba/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/samba/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/samba/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/samba/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,8 @@ +-= Samba =- + +Homepage: http://www.samba.org +Domain: SMB (Server Message Block) Suite + +SMB is the Server Message Block protocol. It is an application-layer +networking protocol for accessing files, printers, etc. on Microsoft +Windows networks. Samba is an open-source SMB suite. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/complete/mime2-bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/complete/mime2-bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/complete/mime2-bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/complete/mime2-bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,318 @@ + +/* + +MIT Copyright Notice + +Copyright 2003 M.I.T. + +Permission is hereby granted, without written agreement or royalty fee, to use, +copy, modify, and distribute this software and its documentation for any +purpose, provided that the above copyright notice and the following three +paragraphs appear in all copies of this software. + +IN NO EVENT SHALL M.I.T. BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, +INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE +AND ITS DOCUMENTATION, EVEN IF M.I.T. HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMANGE. + +M.I.T. SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +AND NON-INFRINGEMENT. + +THE SOFTWARE IS PROVIDED ON AN "AS-IS" BASIS AND M.I.T. HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +$Author: tleek $ +$Date: 2004/01/05 17:27:44 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s4/mime2-bad.c,v 1.1.1.1 2004/01/05 17:27:44 tleek Exp $ + + + +*/ + + +/* + +Sendmail Copyright Notice + + +Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. + All rights reserved. +Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. +Copyright (c) 1988, 1993 + The Regents of the University of California. All rights reserved. + +By using this file, you agree to the terms and conditions set +forth in the LICENSE file which can be found at the top level of +the sendmail distribution. + + +$Author: tleek $ +$Date: 2004/01/05 17:27:44 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s4/mime2-bad.c,v 1.1.1.1 2004/01/05 17:27:44 tleek Exp $ + + + +*/ + + +/* + + + +*/ + +# include "mime2.h" +# include +#include + +void mime7to8(HDR *, ENVELOPE *); +char * hvalue(char *, HDR *); + +int main(int argc, char **argv){ + + HDR *header; + register ENVELOPE *e; + FILE *temp; + + assert (argc==2); + + header = (HDR *) malloc(sizeof(struct header)); + + header->h_field = "Content-Transfer-Encoding"; + header->h_value = "base64"; + + e = (ENVELOPE *) malloc(sizeof(struct envelope)); + e->e_id = "First Entry"; + + temp = fopen(argv[1],"r"); + + e->e_dfp = temp; + mime7to8(header, e); + + fclose(temp); + + return 0; + + + return 0; +} + +static char index_64[128] = +{ + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, + 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1,-1,-1,-1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, + 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1, + -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, + 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 +}; + +#define CHAR64(c) (((c) < 0 || (c) > 127) ? -1 : index_64[(c)]) + +/* +** MIME7TO8 -- output 7 bit encoded MIME body in 8 bit format +** +** This is a hack. Supports translating the two 7-bit body-encodings +** (quoted-printable and base64) to 8-bit coded bodies. +** +** There is not much point in supporting multipart here, as the UA +** will be able to deal with encoded MIME bodies if it can parse MIME +** multipart messages. +** +** Note also that we wont be called unless it is a text/plain MIME +** message, encoded base64 or QP and mailer flag '9' has been defined +** on mailer. +** +** Contributed by Marius Olaffson . Modified by Misha Zitser +** +** Parameters: +** header -- the header for this body part. +** e -- envelope. +** +** Returns: +** none. +*/ + +void +mime7to8(header, e) + HDR *header; + register ENVELOPE *e; +{ + + register char *p; + u_char *fbufp; + char canary[10]; + u_char fbuf[MAXLINE + 1]; + + strcpy(canary, "GOOD"); /* use canary to see if fbuf gets overflowed */ + + p = hvalue("Content-Transfer-Encoding", header); + if (p == NULL) + { + printf("Content-Transfer-Encoding not found in header\n"); + return; + } + + /* + ** Translate body encoding to 8-bit. Supports two types of + ** encodings; "base64" and "quoted-printable". Assume qp if + ** it is not base64. + */ + + if (strcasecmp(p, "base64") == 0) + { + int c1, c2, c3, c4; + + fbufp = fbuf; + while ((c1 = fgetc(e->e_dfp)) != EOF) + { + if (isascii(c1) && isspace(c1)) + continue; + + do + { + c2 = fgetc(e->e_dfp); + } while (isascii(c2) && isspace(c2)); + if (c2 == EOF) + break; + + do + { + c3 = fgetc(e->e_dfp); + } while (isascii(c3) && isspace(c3)); + if (c3 == EOF) + break; + + do + { + c4 = fgetc(e->e_dfp); + } while (isascii(c4) && isspace(c4)); + if (c4 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + c1 = CHAR64(c1); + c2 = CHAR64(c2); + + /*We have read in four characters, skipping spaces */ + /*BAD*/ + *fbufp = (c1 << 2) | ((c2 & 0x30) >> 4); /* Write first char to fbuf */ + + + /* Check to see if either 1) reached a '\n' or */ + /* 2) fbufp about to point past end of fbuf (unfortunately there is a typo in the if-check) */ + + /* suppose the string in e->e_dfp is longer than MAXLINE + 1 and doesn't contain any '\n's, then" */ + /* we will never catch the case when fbufp points past the end of fbuf because of the */ + /*typo in the check below. fbuf will get overflowed with arbitrary data */ + + if (*fbufp++ == '\n' || fbuf >= &fbuf[MAXLINE]) /* it shoud say fbufp >= &fbuf[MAXLINE] */ + { + /*BAD*/ + if (*--fbufp != '\n' || *--fbufp != '\r') /* possible illegal read *--fbufp != '\r'*/ + fbufp++; /* if fbufp points to */ + /* fbuf[0] and first char read in is \n */ + *fbufp = '\0'; + /* putline((char *) fbuf, mci); */ + printf("resetting fbufp\n"); + fbufp = fbuf; /* fbufp gets reset to fbuf. unfortunately this never */ + /* happens */ + } + if (c3 == '=') + continue; + c3 = CHAR64(c3); + + /*BAD*/ + *fbufp = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2); + if (*fbufp++ == '\n' || fbuf >= &fbuf[MAXLINE]) + { + /*BAD*/ + if (*--fbufp != '\n' || *--fbufp != '\r') + fbufp++; + *fbufp = '\0'; + /* putline((char *) fbuf, mci);*/ + printf("resetting fbufp\n"); + fbufp = fbuf; + } + if (c4 == '=') + continue; + c4 = CHAR64(c4); + + /*BAD*/ + *fbufp = ((c3 & 0x03) << 6) | c4; + if (*fbufp++ == '\n' || fbuf >= &fbuf[MAXLINE]) + { + /*BAD*/ + if (*--fbufp != '\n' || *--fbufp != '\r') + fbufp++; + *fbufp = '\0'; + /* putline((char *) fbuf, mci); */ + printf("resetting fbufp\n"); + fbufp = fbuf; + } + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /*BAD*/ + *fbufp = '\0'; + /* putline((char *) fbuf, mci); */ + } + } + else + { + /* do something else... */ + printf("We only support base64 encoding...\n"); + } + + printf("canary should be GOOD\n"); + printf("canary = %s\n", canary); +} + + + +/* +** HVALUE -- return value of a header. +** +** Only "real" fields (i.e., ones that have not been supplied +** as a default) are used. +** +** Parameters: +** field -- the field name. +** header -- the header list. +** +** Returns: +** pointer to the value part. +** NULL if not found. +** +** Side Effects: +** none. +*/ + +char * hvalue(field, header) + char *field; + HDR *header; +{ + register HDR *h; + + for (h = header; h != NULL; h = h->h_link) + { + if (!bitset(H_DEFAULT, h->h_flags) && + strcasecmp(h->h_field, field) == 0) + return (h->h_value); + } + return (NULL); +} + + +/* + + + +*/ + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/complete/mime2.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/complete/mime2.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/complete/mime2.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/complete/mime2.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,167 @@ + +/* + +MIT Copyright Notice + +Copyright 2003 M.I.T. + +Permission is hereby granted, without written agreement or royalty fee, to use, +copy, modify, and distribute this software and its documentation for any +purpose, provided that the above copyright notice and the following three +paragraphs appear in all copies of this software. + +IN NO EVENT SHALL M.I.T. BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, +INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE +AND ITS DOCUMENTATION, EVEN IF M.I.T. HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMANGE. + +M.I.T. SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +AND NON-INFRINGEMENT. + +THE SOFTWARE IS PROVIDED ON AN "AS-IS" BASIS AND M.I.T. HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +$Author: tleek $ +$Date: 2004/01/05 17:27:44 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s4/mime2.h,v 1.1.1.1 2004/01/05 17:27:44 tleek Exp $ + + + +*/ + + +/* + +Sendmail Copyright Notice + + +Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. + All rights reserved. +Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. +Copyright (c) 1988, 1993 + The Regents of the University of California. All rights reserved. + +By using this file, you agree to the terms and conditions set +forth in the LICENSE file which can be found at the top level of +the sendmail distribution. + + +$Author: tleek $ +$Date: 2004/01/05 17:27:44 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s4/mime2.h,v 1.1.1.1 2004/01/05 17:27:44 tleek Exp $ + + + +*/ + + +/* + + + +*/ + +#include +#include +#include +#include +#include +#include +#include + +/* I have cut out the BITMAP field of header */ +struct header +{ + char *h_field; /* the name of the field */ + char *h_value; /* the value of that field */ + struct header *h_link; /* the next header */ + u_short h_flags; /* status bits, see below */ + +}; + +typedef struct header HDR; + +/* modified address structure */ +struct address +{ + char *q_paddr; /* the printname for the address */ + char *q_user; /* user name */ + char *q_ruser; /* real user name, or NULL if q_user */ + char *q_host; /* host name */ + /*struct mailer *q_mailer;*/ /* mailer to use */ + u_long q_flags; /* status flags, see below */ + uid_t q_uid; /* user-id of receiver (if known) */ + gid_t q_gid; /* group-id of receiver (if known) */ + char *q_home; /* home dir (local mailer only) */ + char *q_fullname; /* full name if known */ + struct address *q_next; /* chain */ + struct address *q_alias; /* address this results from */ + char *q_owner; /* owner of q_alias */ + struct address *q_tchain; /* temporary use chain */ + char *q_orcpt; /* ORCPT parameter from RCPT TO: line */ + char *q_status; /* status code for DSNs */ + char *q_rstatus; /* remote status message for DSNs */ + /*time_t q_statdate; */ /* date of status messages */ + char *q_statmta; /* MTA generating q_rstatus */ + short q_specificity; /* how "specific" this address is */ +}; + +typedef struct address ADDRESS; + + +/* modified envelope structure */ +struct envelope +{ + HDR *e_header; /* head of header list */ + long e_msgpriority; /* adjusted priority of this message */ + time_t e_ctime; /* time message appeared in the queue */ + char *e_to; /* the target person */ + ADDRESS e_from; /* the person it is from */ + char *e_sender; /* e_from.q_paddr w comments stripped */ + char **e_fromdomain; /* the domain part of the sender */ + ADDRESS *e_sendqueue; /* list of message recipients */ + ADDRESS *e_errorqueue; /* the queue for error responses */ + long e_msgsize; /* size of the message in bytes */ + long e_flags; /* flags, see below */ + int e_nrcpts; /* number of recipients */ + short e_class; /* msg class (priority, junk, etc.) */ + short e_hopcount; /* number of times processed */ + short e_nsent; /* number of sends since checkpoint */ + short e_sendmode; /* message send mode */ + short e_errormode; /* error return mode */ + short e_timeoutclass; /* message timeout class */ + struct envelope *e_parent; /* the message this one encloses */ + struct envelope *e_sibling; /* the next envelope of interest */ + char *e_bodytype; /* type of message body */ + FILE *e_dfp; /* temporary file */ + char *e_id; /* code for this entry in queue */ + FILE *e_xfp; /* transcript file */ + FILE *e_lockfp; /* the lock file for this message */ + char *e_message; /* error message */ + char *e_statmsg; /* stat msg (changes per delivery) */ + char *e_msgboundary; /* MIME-style message part boundary */ + char *e_origrcpt; /* original recipient (one only) */ + char *e_envid; /* envelope id from MAIL FROM: line */ + char *e_status; /* DSN status for this message */ + time_t e_dtime; /* time of last delivery attempt */ + int e_ntries; /* number of delivery attempts */ + dev_t e_dfdev; /* df file's device, for crash recov */ + ino_t e_dfino; /* df file's ino, for crash recovery */ + char *e_macro[256]; /* macro definitions */ +}; + + +typedef struct envelope ENVELOPE; + +# define bitset(bit, word) (((word) & (bit)) != 0) +# define MAXLINE 50 /* modified max line length */ +# define H_DEFAULT 0x0004 /* if another value is found, drop this */ + + +/* + + + +*/ + Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/array_vs_pointer.ods and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/array_vs_pointer.ods differ Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/data_testing.ods and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/data_testing.ods differ diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_heavy_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_heavy_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_heavy_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_heavy_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,48 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1; + + fb = 0; + while ((c1 = nondet_int ()) != EOF) + { + if (isascii (c1) && isspace (c1)) + continue; + if (c1 == '=') + continue; + + /* BAD */ + fbuf[fb] = c1; + + /* BAD */ + if (fbuf[fb] == '\n') + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* BAD */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + } + + /* force out partial last line */ + if (fb > 0) + { + /* BAD */ + fbuf[fb] = 0; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_heavy_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_heavy_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_heavy_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_heavy_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,48 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1; + + fb = 0; + while ((c1 = nondet_int ()) != EOF) + { + if (isascii (c1) && isspace (c1)) + continue; + if (c1 == '=') + continue; + + /* OK */ + fbuf[fb] = c1; + + /* OK */ + if (fbuf[fb] == '\n' || fb >= MAXLINE) + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* OK */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + } + + /* force out partial last line */ + if (fb > 0) + { + /* OK */ + fbuf[fb] = 0; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_med_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_med_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_med_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_med_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,46 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1; + + fb = 0; + while ((c1 = nondet_int ()) != EOF) + { + if (c1 == '=') + continue; + + /* BAD */ + fbuf[fb] = c1; + + /* BAD */ + if (fbuf[fb] == '\n') + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* BAD */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + } + + /* force out partial last line */ + if (fb > 0) + { + /* BAD */ + fbuf[fb] = 0; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_med_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_med_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_med_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_med_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,46 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1; + + fb = 0; + while ((c1 = nondet_int ()) != EOF) + { + if (c1 == '=') + continue; + + /* OK */ + fbuf[fb] = c1; + + /* OK */ + if (fbuf[fb] == '\n' || fb >= MAXLINE) + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* OK */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + } + + /* force out partial last line */ + if (fb > 0) + { + /* OK */ + fbuf[fb] = 0; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_no_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_no_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_no_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_no_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,29 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1; + + fb = 0; + + while ((c1 = nondet_int ()) != EOF) + { + /* BAD */ + fbuf[fb] = c1; + fb++; + } + + /* force out partial last line */ + if (fb > 0) + { + /* BAD */ + fbuf[fb] = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_no_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_no_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_no_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_one_char_no_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,31 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1; + + fb = 0; + + while ((c1 = nondet_int ()) != EOF) + { + /* OK */ + fbuf[fb] = c1; + fb++; + if (fb >= MAXLINE) + fb = 0; + } + + /* force out partial last line */ + if (fb > 0) + { + /* OK */ + fbuf[fb] = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_heavy_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_heavy_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_heavy_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_heavy_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,103 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1, c2, c3; + + fb = 0; + while ((c1 = nondet_int ()) != EOF) + { + if (isascii(c1) && isspace(c1)) + continue; + + do + { + c2 = nondet_int (); + } while (isascii(c2) && isspace(c2)); + if (c2 == EOF) + break; + + do + { + c3 = nondet_int (); + } while (isascii(c3) && isspace(c3)); + if (c3 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + + /* BAD */ + fbuf[fb] = c1; + + /* BAD */ + if (fbuf[fb] == '\n') + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* BAD */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + + /* BAD */ + fbuf[fb] = c2; + + /* BAD */ + if (fbuf[fb] == '\n') + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* BAD */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + + if (c3 == '=') + continue; + /* BAD */ + fbuf[fb] = c3; + + /* BAD */ + if (fbuf[fb] == '\n') + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* BAD */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + } + + /* force out partial last line */ + if (fb > 0) + { + /* BAD */ + fbuf[fb] = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_heavy_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_heavy_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_heavy_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_heavy_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,103 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1, c2, c3; + + fb = 0; + while ((c1 = nondet_int ()) != EOF) + { + if (isascii(c1) && isspace(c1)) + continue; + + do + { + c2 = nondet_int (); + } while (isascii(c2) && isspace(c2)); + if (c2 == EOF) + break; + + do + { + c3 = nondet_int (); + } while (isascii(c3) && isspace(c3)); + if (c3 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + + /* OK */ + fbuf[fb] = c1; + + /* OK */ + if (fbuf[fb] == '\n' || fb >= MAXLINE) + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* OK */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + + /* OK */ + fbuf[fb] = c2; + + /* OK */ + if (fbuf[fb] == '\n' || fb >= MAXLINE) + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* OK */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + + if (c3 == '=') + continue; + /* OK */ + fbuf[fb] = c3; + + /* OK */ + if (fbuf[fb] == '\n' || fb >= MAXLINE) + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* OK */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + } + + /* force out partial last line */ + if (fb > 0) + { + /* OK */ + fbuf[fb] = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_med_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_med_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_med_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_med_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,94 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1, c2, c3; + + fb = 0; + while ((c1 = nondet_int ()) != EOF) + { + c2 = nondet_int (); + if (c2 == EOF) + break; + + c3 = nondet_int (); + if (c3 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + + /* BAD */ + fbuf[fb] = c1; + + /* BAD */ + if (fbuf[fb] == '\n') + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* BAD */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + + /* BAD */ + fbuf[fb] = c2; + + /* BAD */ + if (fbuf[fb] == '\n') + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* BAD */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + + if (c3 == '=') + continue; + /* BAD */ + fbuf[fb] = c3; + + /* BAD */ + if (fbuf[fb] == '\n') + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* BAD */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + } + + /* force out partial last line */ + if (fb > 0) + { + /* BAD */ + fbuf[fb] = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_med_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_med_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_med_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_med_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,94 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1, c2, c3; + + fb = 0; + while ((c1 = nondet_int ()) != EOF) + { + c2 = nondet_int (); + if (c2 == EOF) + break; + + c3 = nondet_int (); + if (c3 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + + /* OK */ + fbuf[fb] = c1; + + /* OK */ + if (fbuf[fb] == '\n' || fb >= MAXLINE) + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* OK */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + + /* OK */ + fbuf[fb] = c2; + + /* OK */ + if (fbuf[fb] == '\n' || fb >= MAXLINE) + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* OK */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + + if (c3 == '=') + continue; + /* OK */ + fbuf[fb] = c3; + + /* OK */ + if (fbuf[fb] == '\n' || fb >= MAXLINE) + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* OK */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + } + + /* force out partial last line */ + if (fb > 0) + { + /* OK */ + fbuf[fb] = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_no_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_no_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_no_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_no_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,44 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1, c2, c3; + + fb = 0; + while ((c1 = nondet_int ()) != EOF) + { + c2 = nondet_int (); + if (c2 == EOF) + break; + + c3 = nondet_int (); + if (c3 == EOF) + break; + + /* BAD */ + fbuf[fb] = c1; + fb++; + + /* BAD */ + fbuf[fb] = c2; + fb++; + + /* BAD */ + fbuf[fb] = c3; + fb++; + } + + /* force out partial last line */ + if (fb > 0) + { + /* BAD */ + fbuf[fb] = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_no_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_no_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_no_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_three_chars_no_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,50 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1, c2, c3; + + fb = 0; + while ((c1 = nondet_int ()) != EOF) + { + c2 = nondet_int (); + if (c2 == EOF) + break; + + c3 = nondet_int (); + if (c3 == EOF) + break; + + /* OK */ + fbuf[fb] = c1; + fb++; + if (fb >= MAXLINE) + fb = 0; + + /* OK */ + fbuf[fb] = c2; + fb++; + if (fb >= MAXLINE) + fb = 0; + + /* OK */ + fbuf[fb] = c3; + fb++; + if (fb >= MAXLINE) + fb = 0; + } + + /* force out partial last line */ + if (fb > 0) + { + /* OK */ + fbuf[fb] = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_heavy_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_heavy_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_heavy_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_heavy_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,75 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1, c2; + + fb = 0; + while ((c1 = nondet_int ()) != EOF) + { + if (isascii(c1) && isspace(c1)) + continue; + + do + { + c2 = nondet_int (); + } while (isascii(c2) && isspace(c2)); + if (c2 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + + /* BAD */ + fbuf[fb] = c1; + + /* BAD */ + if (fbuf[fb] == '\n') + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* BAD */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + + /* BAD */ + fbuf[fb] = c2; + + /* BAD */ + if (fbuf[fb] == '\n') + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* BAD */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + } + + /* force out partial last line */ + if (fb > 0) + { + /* BAD */ + fbuf[fb] = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_heavy_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_heavy_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_heavy_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_heavy_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,75 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1, c2; + + fb = 0; + while ((c1 = nondet_int ()) != EOF) + { + if (isascii(c1) && isspace(c1)) + continue; + + do + { + c2 = nondet_int (); + } while (isascii(c2) && isspace(c2)); + if (c2 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + + /* OK */ + fbuf[fb] = c1; + + /* OK */ + if (fbuf[fb] == '\n' || fb >= MAXLINE) + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* OK */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + + /* OK */ + fbuf[fb] = c2; + + /* OK */ + if (fbuf[fb] == '\n' || fb >= MAXLINE) + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* OK */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + } + + /* force out partial last line */ + if (fb > 0) + { + /* OK */ + fbuf[fb] = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_med_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_med_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_med_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_med_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,69 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1, c2; + + fb = 0; + while ((c1 = nondet_int ()) != EOF) + { + c2 = nondet_int (); + if (c2 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + + /* BAD */ + fbuf[fb] = c1; + + /* BAD */ + if (fbuf[fb] == '\n') + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* BAD */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + + /* BAD */ + fbuf[fb] = c2; + + /* BAD */ + if (fbuf[fb] == '\n') + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* BAD */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + } + + /* force out partial last line */ + if (fb > 0) + { + /* BAD */ + fbuf[fb] = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_med_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_med_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_med_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_med_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,69 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1, c2; + + fb = 0; + while ((c1 = nondet_int ()) != EOF) + { + c2 = nondet_int (); + if (c2 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + + /* OK */ + fbuf[fb] = c1; + + /* OK */ + if (fbuf[fb] == '\n' || fb >= MAXLINE) + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* OK */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + + /* OK */ + fbuf[fb] = c2; + + /* OK */ + if (fbuf[fb] == '\n' || fb >= MAXLINE) + { + fb--; + if (fb < 0) + fb = 0; + else if (fbuf[fb] != '\r') + fb++; + + /* OK */ + fbuf[fb] = 0; + fb = 0; + } + else + fb++; + } + + /* force out partial last line */ + if (fb > 0) + { + /* OK */ + fbuf[fb] = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_no_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_no_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_no_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_no_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,36 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1, c2; + + fb = 0; + while ((c1 = nondet_int ()) != EOF) + { + c2 = nondet_int (); + if (c2 == EOF) + break; + + /* BAD */ + fbuf[fb] = c1; + fb++; + + /* BAD */ + fbuf[fb] = c2; + fb++; + } + + /* force out partial last line */ + if (fb > 0) + { + /* BAD */ + fbuf[fb] = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_no_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_no_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_no_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_arr_two_chars_no_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,40 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + int fb; + int c1, c2; + + fb = 0; + while ((c1 = nondet_int ()) != EOF) + { + c2 = nondet_int (); + if (c2 == EOF) + break; + + /* OK */ + fbuf[fb] = c1; + fb++; + if (fb >= MAXLINE) + fb = 0; + + /* OK */ + fbuf[fb] = c2; + fb++; + if (fb >= MAXLINE) + fb = 0; + } + + /* force out partial last line */ + if (fb > 0) + { + /* OK */ + fbuf[fb] = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_heavy_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_heavy_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_heavy_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_heavy_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,46 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + if (isascii (c1) && isspace (c1)) + continue; + if (c1 == '=') + continue; + + /* BAD */ + *fbufp = c1; + + /* BAD */ + if (*fbufp++ == '\n') + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* BAD */ + *fbufp = EOS; + fbufp = fbuf; + } + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* BAD */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_heavy_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_heavy_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_heavy_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_heavy_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,46 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + if (isascii (c1) && isspace (c1)) + continue; + if (c1 == '=') + continue; + + /* OK */ + *fbufp = c1; + + /* OK */ + if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* OK */ + *fbufp = EOS; + fbufp = fbuf; + } + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* OK */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_med_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_med_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_med_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_med_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,44 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + if (c1 == '=') + continue; + + /* BAD */ + *fbufp = c1; + + /* BAD */ + if (*fbufp++ == '\n') + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* BAD */ + *fbufp = EOS; + fbufp = fbuf; + } + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* BAD */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_med_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_med_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_med_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_med_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,44 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + if (c1 == '=') + continue; + + /* OK */ + *fbufp = c1; + + /* OK */ + if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* OK */ + *fbufp = EOS; + fbufp = fbuf; + } + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* OK */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_no_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_no_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_no_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_no_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,28 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + /* BAD */ + *fbufp++ = c1; + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* BAD */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_no_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_no_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_no_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_one_char_no_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,30 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + /* OK */ + *fbufp++ = c1; + if (fbufp >= &fbuf[MAXLINE]) + fbufp = fbuf; + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* OK */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_heavy_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_heavy_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_heavy_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_heavy_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,94 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1, c2, c3; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + if (isascii(c1) && isspace(c1)) + continue; + + do + { + c2 = nondet_int (); + } while (isascii(c2) && isspace(c2)); + if (c2 == EOF) + break; + + do + { + c3 = nondet_int (); + } while (isascii(c3) && isspace(c3)); + if (c3 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + + /* BAD */ + *fbufp = c1; + + /* BAD */ + if (*fbufp++ == '\n') + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + *fbufp = EOS; + fbufp = fbuf; + } + + /* BAD */ + *fbufp = c2; + + /* BAD */ + if (*fbufp++ == '\n') + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* BAD */ + *fbufp = EOS; + fbufp = fbuf; + } + + if (c3 == '=') + continue; + /* BAD */ + *fbufp = c3; + + /* BAD */ + if (*fbufp++ == '\n') + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* BAD */ + *fbufp = EOS; + fbufp = fbuf; + } + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* BAD */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_heavy_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_heavy_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_heavy_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_heavy_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,94 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1, c2, c3; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + if (isascii(c1) && isspace(c1)) + continue; + + do + { + c2 = nondet_int (); + } while (isascii(c2) && isspace(c2)); + if (c2 == EOF) + break; + + do + { + c3 = nondet_int (); + } while (isascii(c3) && isspace(c3)); + if (c3 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + + /* OK */ + *fbufp = c1; + + /* OK */ + if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + *fbufp = EOS; + fbufp = fbuf; + } + + /* OK */ + *fbufp = c2; + + /* OK */ + if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* OK */ + *fbufp = EOS; + fbufp = fbuf; + } + + if (c3 == '=') + continue; + /* OK */ + *fbufp = c3; + + /* OK */ + if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* OK */ + *fbufp = EOS; + fbufp = fbuf; + } + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* OK */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_med_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_med_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_med_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_med_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,86 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1, c2, c3; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + c2 = nondet_int (); + if (c2 == EOF) + break; + + c3 = nondet_int (); + if (c3 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + + /* BAD */ + *fbufp = c1; + + /* BAD */ + if (*fbufp++ == '\n') + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* BAD */ + *fbufp = EOS; + fbufp = fbuf; + } + + /* BAD */ + *fbufp = c2; + + /* BAD */ + if (*fbufp++ == '\n') + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* BAD */ + *fbufp = EOS; + fbufp = fbuf; + } + + if (c3 == '=') + continue; + /* BAD */ + *fbufp = c3; + + /* BAD */ + if (*fbufp++ == '\n') + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* BAD */ + *fbufp = EOS; + fbufp = fbuf; + } + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* BAD */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_med_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_med_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_med_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_med_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,86 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1, c2, c3; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + c2 = nondet_int (); + if (c2 == EOF) + break; + + c3 = nondet_int (); + if (c3 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + + /* OK */ + *fbufp = c1; + + /* OK */ + if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* OK */ + *fbufp = EOS; + fbufp = fbuf; + } + + /* OK */ + *fbufp = c2; + + /* OK */ + if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* OK */ + *fbufp = EOS; + fbufp = fbuf; + } + + if (c3 == '=') + continue; + /* OK */ + *fbufp = c3; + + /* OK */ + if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* OK */ + *fbufp = EOS; + fbufp = fbuf; + } + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* OK */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_no_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_no_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_no_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_no_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,42 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1, c2, c3; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + c2 = nondet_int (); + if (c2 == EOF) + break; + + c3 = nondet_int (); + if (c3 == EOF) + break; + + /* BAD */ + *fbufp++ = c1; + + /* BAD */ + *fbufp++ = c2; + + /* BAD */ + *fbufp++ = c3; + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* BAD */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_no_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_no_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_no_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_no_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,48 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1, c2, c3; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + c2 = nondet_int (); + if (c2 == EOF) + break; + + c3 = nondet_int (); + if (c3 == EOF) + break; + + /* OK */ + *fbufp++ = c1; + if (fbufp >= &fbuf[MAXLINE]) + fbufp = fbuf; + + /* OK */ + *fbufp++ = c2; + if (fbufp >= &fbuf[MAXLINE]) + fbufp = fbuf; + + /* OK */ + *fbufp++ = c3; + if (fbufp >= &fbuf[MAXLINE]) + fbufp = fbuf; + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* OK */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_heavy_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_heavy_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_heavy_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_heavy_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,69 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1, c2; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + if (isascii(c1) && isspace(c1)) + continue; + + do + { + c2 = nondet_int (); + } while (isascii(c2) && isspace(c2)); + if (c2 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + + /* BAD */ + *fbufp = c1; + + /* BAD */ + if (*fbufp++ == '\n') + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + *fbufp = EOS; + fbufp = fbuf; + } + + /* BAD */ + *fbufp = c2; + + /* BAD */ + if (*fbufp++ == '\n') + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* BAD */ + *fbufp = EOS; + fbufp = fbuf; + } + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* BAD */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_heavy_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_heavy_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_heavy_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_heavy_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,69 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1, c2; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + if (isascii(c1) && isspace(c1)) + continue; + + do + { + c2 = nondet_int (); + } while (isascii(c2) && isspace(c2)); + if (c2 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + + /* OK */ + *fbufp = c1; + + /* OK */ + if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + *fbufp = EOS; + fbufp = fbuf; + } + + /* OK */ + *fbufp = c2; + + /* OK */ + if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* OK */ + *fbufp = EOS; + fbufp = fbuf; + } + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* OK */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_med_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_med_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_med_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_med_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,64 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1, c2; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + c2 = nondet_int (); + if (c2 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + + /* BAD */ + *fbufp = c1; + + /* BAD */ + if (*fbufp++ == '\n') + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* BAD */ + *fbufp = EOS; + fbufp = fbuf; + } + + /* BAD */ + *fbufp = c2; + + /* BAD */ + if (*fbufp++ == '\n') + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* BAD */ + *fbufp = EOS; + fbufp = fbuf; + } + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* BAD */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_med_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_med_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_med_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_med_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,64 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1, c2; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + c2 = nondet_int (); + if (c2 == EOF) + break; + + if (c1 == '=' || c2 == '=') + continue; + + /* OK */ + *fbufp = c1; + + /* OK */ + if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* OK */ + *fbufp = EOS; + fbufp = fbuf; + } + + /* OK */ + *fbufp = c2; + + /* OK */ + if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) + { + if (fbufp <= fbuf) + fbufp = fbuf; + else if (*--fbufp != '\r') + fbufp++; + + /* OK */ + *fbufp = EOS; + fbufp = fbuf; + } + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* OK */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_no_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_no_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_no_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_no_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,35 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1, c2; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + c2 = nondet_int (); + if (c2 == EOF) + break; + + /* BAD */ + *fbufp++ = c1; + + /* BAD */ + *fbufp++ = c2; + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* BAD */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_no_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_no_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_no_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/mime7to8/mime7to8_ptr_two_chars_no_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,39 @@ +#include "../../../../../lib/stubs.h" +#include "../../../../../lib/base.h" + +#define MAXLINE BASE_SZ + +int main (void) +{ + char fbuf[MAXLINE+1]; + char *fbufp; + int c1, c2; + + fbufp = fbuf; + + while ((c1 = nondet_int ()) != EOF) + { + c2 = nondet_int (); + if (c2 == EOF) + break; + + /* OK */ + *fbufp++ = c1; + if (fbufp >= &fbuf[MAXLINE]) + fbufp = fbuf; + + /* OK */ + *fbufp++ = c2; + if (fbufp >= &fbuf[MAXLINE]) + fbufp = fbuf; + } + + /* force out partial last line */ + if (fbufp > fbuf) + { + /* OK */ + *fbufp = EOS; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0047/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,26 @@ +-= CVE-1999-0047 =- + +Vulnerable version: Sendmail 8.8.3 and 8.8.4 +File: sendmail/mime.c +Download from: source not available anymore + +Domain: Server + +_ Vulnerable Functions and Buffers _ + +Function mime7to8 reads four characters at a time from a file and copies each character into a fixed sized buffer. The number of elements copied depends on the length of the input, but the pointer into the dest buffer is reset if a '\n' is encountered. A typo (fbuf >= &fbuf[X], which is always false, instead of fbufp >= &fbuf[X]) prevents the copying loop from stopping early if the end of the dest buffer is reached. The patched version fixes the typo. + +_ Decomposed Programs _ + +Zitser's model program: + +mime7to8/ + mime7to8_{arr,ptr}_{one,two,three}_char*_{no,med,heavy}_test_{bad,ok}.c + +Variants arr and ptr use array indexing and pointer operations, respectively. Variants one, two, and three read (and test) one, two, and three characters from input on each iteration of the while loop. Variant no only checks whether the input char is EOF; med also checks whether the input is '=', '\n', or '\r'; heavy also checks the input with isascii and isspace. + +_ Notes _ + +This is Zitser's sendmail/s4, simplified. + +BASE_SZ was originally 50. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/mime_fromqp/mime_fromqp_arr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/mime_fromqp/mime_fromqp_arr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/mime_fromqp/mime_fromqp_arr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/mime_fromqp/mime_fromqp_arr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,74 @@ +#include "../../../../../lib/stubs.h" + +int main (void) +{ + // XXX infile originally at most MAXLINE long per call to mime_fromqp + + char outfile[BASE_SZ]; // originally MAXLINE + // originally a function argument **ooutfile; this function modified + // caller's pointer into outbut buffer + + int c1, c2; + + // number of chars copied from infile into outfile; reset when + // continuation sequence "=\n" is read + int nchar = 0; + + int out = 0; // index into outfile + + while ((c1 = nondet_char ()) != EOS) + { + if (c1 == '=') + { + // malformed: early EOS + if ((c1 = nondet_char ()) == EOS) + // in Zitser, these breaks actually return to the caller where the + // pointer into outfile is reset before this is called again + break; + + // =\n: continuation; signal to caller it's ok to pass in more infile + // BAD: forgot to reset out + if (c1 == '\n') + { + nchar = 0; + continue; + } + else + { + // convert, e.g., "=5c" to int + + // malformed: early EOF + if ((c2 = nondet_char ()) == EOS) + break; + + nchar++; + if (nchar > BASE_SZ) + break; + + /* BAD */ + outfile[out] = c1; + out++; + } + } + else + { + // regular character, copy verbatim + + nchar++; + if (nchar > BASE_SZ) + break; + + /* BAD */ + outfile[out] = c1; + out++; + + if (c1 == '\n') + break; + } + } + + /* BAD */ + outfile[out] = EOS; + out++; + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/mime_fromqp/mime_fromqp_arr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/mime_fromqp/mime_fromqp_arr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/mime_fromqp/mime_fromqp_arr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/mime_fromqp/mime_fromqp_arr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,75 @@ +#include "../../../../../lib/stubs.h" + +int main (void) +{ + // XXX infile originally at most MAXLINE long per call to mime_fromqp + + char outfile[BASE_SZ]; // originally MAXLINE + // originally a function argument **ooutfile; this function modified + // caller's pointer into outbut buffer + + int c1, c2; + + // number of chars copied from infile into outfile; reset when + // continuation sequence "=\n" is read + int nchar = 0; + + int out = 0; // index into outfile + + while ((c1 = nondet_char ()) != EOS) + { + if (c1 == '=') + { + // malformed: early EOS + if ((c1 = nondet_char ()) == EOS) + // in Zitser, these breaks actually return to the caller where the + // pointer into outfile is reset before this is called again + break; + + // =\n: continuation; signal to caller it's ok to pass in more infile + // OK: reset out before taking more input + if (c1 == '\n') + { + out = 0; + nchar = 0; + continue; + } + else + { + // convert, e.g., "=5c" to int + + // malformed: early EOF + if ((c2 = nondet_char ()) == EOS) + break; + + nchar++; + if (nchar > BASE_SZ) + break; + + /* OK */ + outfile[out] = c1; + out++; + } + } + else + { + // regular character, copy verbatim + + nchar++; + if (nchar > BASE_SZ) + break; + + /* OK */ + outfile[out] = c1; + out++; + + if (c1 == '\n') + break; + } + } + + /* OK */ + outfile[out] = EOS; + out++; + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/mime_fromqp/mime_fromqp_ptr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/mime_fromqp/mime_fromqp_ptr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/mime_fromqp/mime_fromqp_ptr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/mime_fromqp/mime_fromqp_ptr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,70 @@ +#include "../../../../../lib/stubs.h" + +int main (void) +{ + // XXX infile originally at most MAXLINE long per call to mime_fromqp + + char outfile[BASE_SZ]; // originally MAXLINE + // originally a function argument **ooutfile; this function modified + // caller's pointer into outbut buffer + char *outp = outfile; + + int c1, c2; + + // number of chars copied from infile into outfile; reset when + // continuation sequence "=\n" is read + int nchar = 0; + + while ((c1 = nondet_char ()) != EOS) + { + if (c1 == '=') + { + // malformed: early EOS + if ((c1 = nondet_char ()) == EOS) + // in Zitser, these breaks actually return to the caller where the + // pointer into outfile is reset before this is called again + break; + + // =\n: continuation; signal to caller it's ok to pass in more infile + // BAD: forgot to reset outp + if (c1 == '\n') + { + nchar = 0; + continue; + } + else + { + // convert, e.g., "=5c" to int + + // malformed: early EOF + if ((c2 = nondet_char ()) == EOS) + break; + + nchar++; + if (nchar > BASE_SZ) + break; + + /* BAD */ + *outp++ = c1; + } + } + else + { + // regular character, copy verbatim + + nchar++; + if (nchar > BASE_SZ) + break; + + /* BAD */ + *outp++ = c1; + + if (c1 == '\n') + break; + } + } + + /* BAD */ + *outp++ = EOS; + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/mime_fromqp/mime_fromqp_ptr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/mime_fromqp/mime_fromqp_ptr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/mime_fromqp/mime_fromqp_ptr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/mime_fromqp/mime_fromqp_ptr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,71 @@ +#include "../../../../../lib/stubs.h" + +int main (void) +{ + // XXX infile originally at most MAXLINE long per call to mime_fromqp + + char outfile[BASE_SZ]; // originally MAXLINE + // originally a function argument **ooutfile; this function modified + // caller's pointer into outbut buffer + char *outp = outfile; + + int c1, c2; + + // number of chars copied from infile into outfile; reset when + // continuation sequence "=\n" is read + int nchar = 0; + + while ((c1 = nondet_char ()) != EOS) + { + if (c1 == '=') + { + // malformed: early EOS + if ((c1 = nondet_char ()) == EOS) + // in Zitser, these breaks actually return to the caller where the + // pointer into outfile is reset before this is called again + break; + + // =\n: continuation; signal to caller it's ok to pass in more infile + // OK: reset out before taking more input + if (c1 == '\n') + { + outp = outfile; + nchar = 0; + continue; + } + else + { + // convert, e.g., "=5c" to int + + // malformed: early EOF + if ((c2 = nondet_char ()) == EOS) + break; + + nchar++; + if (nchar > BASE_SZ) + break; + + /* OK */ + *outp++ = c1; + } + } + else + { + // regular character, copy verbatim + + nchar++; + if (nchar > BASE_SZ) + break; + + /* OK */ + *outp++ = c1; + + if (c1 == '\n') + break; + } + } + + /* OK */ + *outp++ = EOS; + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-1999-0206/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,24 @@ +-= CVE-1999-0206 =- + +Vulnerable version: Sendmail 8.8.0 to ? +File: sendmail/mime.c +Download from: source not available anymore + +Domain: Server + +_ Vulnerable Functions and Buffers _ + +Function mime7to8 (not shown in testcases) loops over fgets, passing each fgets'd string to function mime_fromqp which decodes input into a fixed sized buffer passed in from mime7to8. However, mime_fromqp's return value indicates to mime7to8 whether the current fgets string includes the continuation string "=\n", in which case the subsequent fgets'd string is also passed to mime_fromqp which continues writing into the buffer where it previously left off. Thus, a sufficiently long input where each substring between "=\n"s is not too long will yield an overflow. In the patched version, the pointer into the dest buffer is reset to the start of dest before mime_fromqp is called again. + +_ Decomposed Programs _ + +mime_fromqp/ + mime_fromqp_{arr,ptr}_{bad,ok}.c + +Variant arr replaces pointer operations with array operations. + +_ Notes _ + +This is Zitser's sendmail/s3, simplified. + +BASE_SZ was originally 50. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/complete/my-main.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/complete/my-main.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/complete/my-main.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/complete/my-main.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,125 @@ + +/* + +MIT Copyright Notice + +Copyright 2003 M.I.T. + +Permission is hereby granted, without written agreement or royalty fee, to use, +copy, modify, and distribute this software and its documentation for any +purpose, provided that the above copyright notice and the following three +paragraphs appear in all copies of this software. + +IN NO EVENT SHALL M.I.T. BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, +INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE +AND ITS DOCUMENTATION, EVEN IF M.I.T. HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMANGE. + +M.I.T. SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +AND NON-INFRINGEMENT. + +THE SOFTWARE IS PROVIDED ON AN "AS-IS" BASIS AND M.I.T. HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +$Author: tleek $ +$Date: 2004/01/05 17:27:45 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s6/my-main.c,v 1.1.1.1 2004/01/05 17:27:45 tleek Exp $ + + + +*/ + + +/* + +Sendmail Copyright Notice + + +Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. + All rights reserved. +Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. +Copyright (c) 1988, 1993 + The Regents of the University of California. All rights reserved. + +By using this file, you agree to the terms and conditions set +forth in the LICENSE file which can be found at the top level of +the sendmail distribution. + + +$Author: tleek $ +$Date: 2004/01/05 17:27:45 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s6/my-main.c,v 1.1.1.1 2004/01/05 17:27:45 tleek Exp $ + + + +*/ + + +/* + + + +*/ + +#include +#include +#include +#include +#include +#include +#include + +#define OPTIONS "B:b:C:cd:e:F:f:Gh:IiL:M:mN:nO:o:p:q:R:r:sTtUV:vX:" + +#define LEN 100 +unsigned char tTdvect[LEN]; + + +int +main(argc, argv, envp) + int argc; + char **argv; + char **envp; +{ + int j; + + tTsetup(tTdvect, LEN, "0-99.1"); + + while ((j = getopt(argc, argv, OPTIONS)) != -1) + { + switch (j) + { + case 'd': + /* hack attack -- see if should use ANSI mode */ + if (strcmp(optarg, "ANSI") == 0) + { + break; + } + tTflag(optarg); + setbuf(stdout, (char *) NULL); + break; + + case 'G': /* relay (gateway) submission */ + break; + + case 'L': + break; + + case 'U': /* initial (user) submission */ + break; + } + } + + + return 0; + + +} + +/* + + + +*/ + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/complete/sendmail.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/complete/sendmail.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/complete/sendmail.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/complete/sendmail.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,75 @@ + +/* + +MIT Copyright Notice + +Copyright 2003 M.I.T. + +Permission is hereby granted, without written agreement or royalty fee, to use, +copy, modify, and distribute this software and its documentation for any +purpose, provided that the above copyright notice and the following three +paragraphs appear in all copies of this software. + +IN NO EVENT SHALL M.I.T. BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, +INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE +AND ITS DOCUMENTATION, EVEN IF M.I.T. HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMANGE. + +M.I.T. SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +AND NON-INFRINGEMENT. + +THE SOFTWARE IS PROVIDED ON AN "AS-IS" BASIS AND M.I.T. HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +$Author: tleek $ +$Date: 2004/01/05 17:27:46 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s6/sendmail.h,v 1.1.1.1 2004/01/05 17:27:46 tleek Exp $ + + + +*/ + + +/* + +Sendmail Copyright Notice + + +Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. + All rights reserved. +Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. +Copyright (c) 1988, 1993 + The Regents of the University of California. All rights reserved. + +By using this file, you agree to the terms and conditions set +forth in the LICENSE file which can be found at the top level of +the sendmail distribution. + + +$Author: tleek $ +$Date: 2004/01/05 17:27:46 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s6/sendmail.h,v 1.1.1.1 2004/01/05 17:27:46 tleek Exp $ + + + +*/ + + +/* + + + +*/ + +extern u_char tTdvect[]; /* trace vector */ + +extern void tTflag __P((char *)); +extern void tTsetup __P((u_char *, int, char *)); + +/* + + + +*/ + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/complete/tTflag-bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/complete/tTflag-bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/complete/tTflag-bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/complete/tTflag-bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,192 @@ + +/* + +MIT Copyright Notice + +Copyright 2003 M.I.T. + +Permission is hereby granted, without written agreement or royalty fee, to use, +copy, modify, and distribute this software and its documentation for any +purpose, provided that the above copyright notice and the following three +paragraphs appear in all copies of this software. + +IN NO EVENT SHALL M.I.T. BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, +INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE +AND ITS DOCUMENTATION, EVEN IF M.I.T. HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMANGE. + +M.I.T. SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +AND NON-INFRINGEMENT. + +THE SOFTWARE IS PROVIDED ON AN "AS-IS" BASIS AND M.I.T. HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +$Author: tleek $ +$Date: 2004/01/05 17:27:46 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s6/tTflag-bad.c,v 1.1.1.1 2004/01/05 17:27:46 tleek Exp $ + + + +*/ + + +/* + +Sendmail Copyright Notice + + +Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. + All rights reserved. +Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. +Copyright (c) 1988, 1993 + The Regents of the University of California. All rights reserved. + +By using this file, you agree to the terms and conditions set +forth in the LICENSE file which can be found at the top level of +the sendmail distribution. + + +$Author: tleek $ +$Date: 2004/01/05 17:27:46 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s6/tTflag-bad.c,v 1.1.1.1 2004/01/05 17:27:46 tleek Exp $ + + + +*/ + + +/* + + + +*/ + +/** +** TtSETUP -- set up for trace package. +** +** Parameters: +** vect -- pointer to trace vector. +** size -- number of flags in trace vector. +** defflags -- flags to set if no value given. +** +** Returns: +** none +** +** Side Effects: +** environment is set up. +*/ + +#include +#include +#include +#include +#include +#include +#include + +static u_char *tTvect; +static int tTsize; +static char *DefFlags; + +#define OPTIONS "B:b:C:cd:e:F:f:Gh:IiL:M:mN:nO:o:p:q:R:r:sTtUV:vX:" + +void +tTsetup(vect, size, defflags) + u_char *vect; + int size; + char *defflags; +{ + tTvect = vect; /* vect is an alias for tTdvect, tTvect is an alias for vect */ + tTsize = size; + DefFlags = defflags; +} + +/* +** TtFLAG -- process an external trace flag description. +** +** Parameters: +** s -- the trace flag. +** +** Returns: +** none. +** +** Side Effects: +** sets/clears trace flags. +*/ + +void +tTflag(s) + register char *s; +{ + int first, last; + register unsigned int i; + + printf ("s: %s", s); + + if (*s == '\0') + s = DefFlags; + + for (;;) + { + /* find first flag to set */ + i = 0; + + while (isascii(*s) && isdigit(*s)) + i = i * 10 + (*s++ - '0'); + + /* assigning unsigned int to signed int */ + /* if i is a large positive number, first will become a negative number */ + first = i; + + /* find last flag to set */ + if (*s == '-') + { + i = 0; + while (isascii(*++s) && isdigit(*s)) + i = i * 10 + (*s - '0'); + } + last = i; + + /* find the level to set it to */ + i = 1; + if (*s == '.') + { + i = 0; + while (isascii(*++s) && isdigit(*s)) + i = i * 10 + (*s - '0'); + } + + /* clean up args */ + + if (first >= tTsize) /* check will fail if first is negative! */ + first = tTsize - 1; + if (last >= tTsize) + last = tTsize - 1; + + /* set the flags */ + while (first <= last){ /* this check will hold true for a while if */ + { /* first is negative and last is positive */ + printf("index = %d\n", first); + /*BAD*/ + tTvect[first++] = i; /* UNDERFLOW CAN OCCUR HERE. */ + /* tTvect can only hold tTsize elements */ + } + /* This is a potential BSS underflow of tTdvect defined inside sendmail.h */ + } + /* more arguments? */ + if (*s++ == '\0') + return; + } +} + + + + + +/* + + + +*/ + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/complete/tTflag-ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/complete/tTflag-ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/complete/tTflag-ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/complete/tTflag-ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,189 @@ + +/* + +MIT Copyright Notice + +Copyright 2003 M.I.T. + +Permission is hereby granted, without written agreement or royalty fee, to use, +copy, modify, and distribute this software and its documentation for any +purpose, provided that the above copyright notice and the following three +paragraphs appear in all copies of this software. + +IN NO EVENT SHALL M.I.T. BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, +INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE +AND ITS DOCUMENTATION, EVEN IF M.I.T. HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMANGE. + +M.I.T. SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +AND NON-INFRINGEMENT. + +THE SOFTWARE IS PROVIDED ON AN "AS-IS" BASIS AND M.I.T. HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +$Author: tleek $ +$Date: 2004/01/05 17:27:46 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s6/tTflag-ok.c,v 1.1.1.1 2004/01/05 17:27:46 tleek Exp $ + + + +*/ + + +/* + +Sendmail Copyright Notice + + +Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. + All rights reserved. +Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. +Copyright (c) 1988, 1993 + The Regents of the University of California. All rights reserved. + +By using this file, you agree to the terms and conditions set +forth in the LICENSE file which can be found at the top level of +the sendmail distribution. + + +$Author: tleek $ +$Date: 2004/01/05 17:27:46 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s6/tTflag-ok.c,v 1.1.1.1 2004/01/05 17:27:46 tleek Exp $ + + + +*/ + + +/* + + + +*/ + +/** +** TtSETUP -- set up for trace package. +** +** Parameters: +** vect -- pointer to trace vector. +** size -- number of flags in trace vector. +** defflags -- flags to set if no value given. +** +** Returns: +** none +** +** Side Effects: +** environment is set up. +*/ + +#include +#include +#include +#include +#include +#include +#include + +static u_char *tTvect; +static int tTsize; +static char *DefFlags; + +#define OPTIONS "B:b:C:cd:e:F:f:Gh:IiL:M:mN:nO:o:p:q:R:r:sTtUV:vX:" + +void +tTsetup(vect, size, defflags) + u_char *vect; + int size; + char *defflags; +{ + tTvect = vect; /* vect is an alias for tTdvect, tTvect is an alias for vect */ + tTsize = size; + DefFlags = defflags; +} + +/* +** TtFLAG -- process an external trace flag description. +** +** Parameters: +** s -- the trace flag. +** +** Returns: +** none. +** +** Side Effects: +** sets/clears trace flags. +*/ + +void +tTflag(s) + register char *s; +{ + unsigned int first, last; /* here we make sure that first and last are unsigned */ + register unsigned int i; + + if (*s == '\0') + s = DefFlags; + + for (;;) + { + /* find first flag to set */ + i = 0; + + while (isascii(*s) && isdigit(*s)) + i = i * 10 + (*s++ - '0'); + + first = i; + + /* find last flag to set */ + if (*s == '-') + { + i = 0; + while (isascii(*++s) && isdigit(*s)) + i = i * 10 + (*s - '0'); + } + last = i; + + /* find the level to set it to */ + i = 1; + if (*s == '.') + { + i = 0; + while (isascii(*++s) && isdigit(*s)) + i = i * 10 + (*s - '0'); + } + + /* clean up args */ + + + if (first >= tTsize) /* check will fail if first is negative! */ + first = tTsize - 1; + if (last >= tTsize) + last = tTsize - 1; + + /* set the flags */ + while (first <= last){ + { + printf("index = %u\n", first); + /*OK*/ + tTvect[first++] = i; + } + + + } + /* more arguments? */ + if (*s++ == '\0') + return; + } +} + + + + + +/* + + + +*/ + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,25 @@ +-= CVE-2001-0653 =- + +Vulnerable version: Sendmail up to 8.12.9 +File: sendmail/parseaddr.c +Download from: ftp://ftp.sendmail.org/pub/sendmail/past-releases/ + +Domain: Server + +_ Vulnerable Functions and Buffers _ + +Function tTflag parses a string of digits into two signed integers, first and last. If first <= last, first is used afterwards to index into an array. Since a signed integer is used to store the temporary values of the number being accumulated from the input, it is possible for arithmetic overflow to occur and a negative value is assigned to first. If this happens, first passes the comparison to last and is subsequently used to access negative indices of a local buffer. The patched version declares first and last as unsigned integers, thereby inhibiting the arithmetic overflow. + +_ Decomposed Programs _ + +tTflag/ + tTflag_arr_one_loop_{bad,ok}.c + tTflag_arr_two_loops_{bad,ok}.c + +Variant one_loop computes (lexes) a single int from the char input. Variant two_loops computs two ints from the input. + +_ Notes _ + +This is Zitser's sendmail/s6, simplified. + +BASE_SZ originally 100. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/tTflag/tTflag_arr_one_loop_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/tTflag/tTflag_arr_one_loop_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/tTflag/tTflag_arr_one_loop_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/tTflag/tTflag_arr_one_loop_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,23 @@ +int main (void) +{ + char in[11]; // = "3277192070"; + char *s; + unsigned char c; + int i, j; + int idx_in; + in[10] = 0; + idx_in = 0; + s = in; + i = 0; + c = in[idx_in]; + while (('0' <= c) && (c <= '9')) + { + j = c - '0'; + i = i * 10 + j; + idx_in++; + c = in[idx_in]; + } + /* BAD */ + assert (i >= 0); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/tTflag/tTflag_arr_one_loop_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/tTflag/tTflag_arr_one_loop_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/tTflag/tTflag_arr_one_loop_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/tTflag/tTflag_arr_one_loop_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,23 @@ +int main (void) +{ + char in[11]; // = "3277192070"; + char *s; + unsigned char c; + unsigned int i, j; + int idx_in; + in[10] = 0; + idx_in = 0; + s = in; + i = 0; + c = in[idx_in]; + while (('0' <= c) && (c <= '9')) + { + j = c - '0'; + i = i * 10 + j; + idx_in++; + c = in[idx_in]; + } + /* OK */ + assert (i >= 0); + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/tTflag/tTflag_arr_two_loops_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/tTflag/tTflag_arr_two_loops_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/tTflag/tTflag_arr_two_loops_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/tTflag/tTflag_arr_two_loops_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,64 @@ +#include "../../../../../lib/stubs.h" + +#define INSIZE 14 + +int main (void) +{ + unsigned char in[INSIZE+1]; // = "3277192070-100"; + unsigned char buf[BASE_SZ]; + unsigned char *s; + unsigned char c; + int first, last; + int i, j; + int idx_in; + + idx_in = 0; + s = in; + i = 0; + + /* accumulate first (int) from in (char[]) */ + c = in[idx_in]; + while (('0' <= c) && (c <= '9')) + { + j = c - '0'; + i = i * 10 + j; + idx_in++; + c = in[idx_in]; + } + first = i; + + /* accumulate last (int) from in (char[]) */ + c = in[idx_in]; + if (c == '-') + { + i = 0; + idx_in++; + c = in[idx_in]; + while (('0' <= c) && (c <= '9')) + { + j = c - '0'; + i = i * 10 + j; + idx_in++; + c = in[idx_in]; + } + } + last = i; + +// printf ("first: %d, last: %d\n", first, last); + + /* clean up args */ + + if (first >= BASE_SZ) /* check will fail if first is negative! */ + first = BASE_SZ - 1; + if (last >= BASE_SZ) + last = BASE_SZ - 1; + + while (first <= last) + { + /* BAD */ + buf[first] = 'a'; /* possibly first < 0, cast to uint is huuuuge */ + first++; /* signed int arithmetic */ + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/tTflag/tTflag_arr_two_loops_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/tTflag/tTflag_arr_two_loops_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/tTflag/tTflag_arr_two_loops_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2001-0653/tTflag/tTflag_arr_two_loops_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,64 @@ +#include "../../../../../lib/stubs.h" + +#define INSIZE 14 + +int main (void) +{ + unsigned char in[INSIZE+1]; // = "3277192070-100"; + unsigned char buf[BASE_SZ]; + unsigned char *s; + unsigned char c; + unsigned int first, last; + int i, j; + int idx_in; + + idx_in = 0; + s = in; + i = 0; + + /* accumulate first (int) from in (char[]) */ + c = in[idx_in]; + while (('0' <= c) && (c <= '9')) + { + j = c - '0'; + i = i * 10 + j; + idx_in++; + c = in[idx_in]; + } + first = i; + + /* accumulate last (int) from in (char[]) */ + c = in[idx_in]; + if (c == '-') + { + i = 0; + idx_in++; + c = in[idx_in]; + while (('0' <= c) && (c <= '9')) + { + j = c - '0'; + i = i * 10 + j; + idx_in++; + c = in[idx_in]; + } + } + last = i; + +// printf ("first: %d, last: %d\n", first, last); + + /* clean up args */ + + if (first >= BASE_SZ) /* check will fail if first is negative! */ + first = BASE_SZ - 1; + if (last >= BASE_SZ) + last = BASE_SZ - 1; + + while (first <= last) + { + /* OK */ + buf[first] = 'a'; /* possibly first < 0, cast to uint is huuuuge */ + first++; /* signed int arithmetic */ + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply_cast_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply_cast_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply_cast_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply_cast_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,24 @@ +#include "parse_dns_reply.h" +#include "../../../../../lib/stubs.h" + +#define DATA 100 + +int main (void) +{ + unsigned char data[sizeof (u_int16_t) + sizeof (u_char) + DATA]; + unsigned char *p; + int size; + char *rr_txt; + + p = data; + + NS_GET16(size, p); + rr_txt = (char *) malloc (size + 1); + if (rr_txt == 0) + return 0; + + /* BAD */ + strncpy (rr_txt, (char *) p + 1, *p); + /* BAD */ + rr_txt[*p] = 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply_cast_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply_cast_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply_cast_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply_cast_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,24 @@ +#include "parse_dns_reply.h" +#include "../../../../../lib/stubs.h" + +int main (void) +{ + unsigned char data[sizeof (u_int16_t) + sizeof (u_char) + BASE_SZ]; + unsigned char *p; + int size, txtlen; + char *rr_txt; + + p = data; + + NS_GET16(size, p); // size is no longer used + + txtlen = *p; + rr_txt = (char *) malloc (txtlen + 1); + if (rr_txt == 0) + return 0; + + /* OK */ + strncpy (rr_txt, (char *) p + 1, *p); + /* OK */ + rr_txt[*p] = 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,24 @@ +typedef unsigned short u_int16_t; +typedef unsigned char u_char; + +void *malloc(unsigned int size); + +#define NS_GET32(l, cp) do { \ + u_char *t_cp = (u_char *)(cp); \ + (l) = ((u_int32_t)t_cp[0] << 24) \ + | ((u_int32_t)t_cp[1] << 16) \ + | ((u_int32_t)t_cp[2] << 8) \ + | ((u_int32_t)t_cp[3]) \ + ; \ + (cp) += 4; \ +} while (0) + +#define NS_GET16(s, cp) do { \ + u_char *t_cp = (u_char *)(cp); \ + (s) = ((u_int16_t)t_cp[0] << 8) \ + | ((u_int16_t)t_cp[1]) \ + ; \ + (cp) += 2; \ +} while (0) + + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply_no_cast_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply_no_cast_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply_no_cast_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply_no_cast_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,23 @@ +#include "parse_dns_reply.h" +#include "../../../../../lib/stubs.h" + +#define DATA 100 + +int main (void) +{ + unsigned char *p; + int size; + char *rr_txt; + + *p = nondet_unsigned_char (); + + size = nondet_int (); + rr_txt = (char *) malloc (size + 1); + if (rr_txt == 0) + return 0; + + /* BAD */ + strncpy (rr_txt, (char *) p + 1, *p); + /* BAD */ + rr_txt[*p] = 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply_no_cast_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply_no_cast_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply_no_cast_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/parse_dns_reply_no_cast_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,23 @@ +#include "parse_dns_reply.h" +#include "../../../../../lib/stubs.h" + +#define DATA 100 + +int main (void) +{ + unsigned char *p; + int size; + char *rr_txt; + + *p = nondet_unsigned_char (); + size = *p; + + rr_txt = (char *) malloc (size + 1); + if (rr_txt == 0) + return 0; + + /* OK */ + strncpy (rr_txt, (char *) p + 1, *p); + /* OK */ + rr_txt[*p] = 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/txt-dns.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/txt-dns.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/txt-dns.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/parse_dns_reply/txt-dns.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,133 @@ + +/* + +MIT Copyright Notice + +Copyright 2003 M.I.T. + +Permission is hereby granted, without written agreement or royalty fee, to use, +copy, modify, and distribute this software and its documentation for any +purpose, provided that the above copyright notice and the following three +paragraphs appear in all copies of this software. + +IN NO EVENT SHALL M.I.T. BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, +INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE +AND ITS DOCUMENTATION, EVEN IF M.I.T. HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMANGE. + +M.I.T. SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +AND NON-INFRINGEMENT. + +THE SOFTWARE IS PROVIDED ON AN "AS-IS" BASIS AND M.I.T. HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +$Author: tleek $ +$Date: 2004/01/05 17:27:47 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s7/txt-dns.h,v 1.1.1.1 2004/01/05 17:27:47 tleek Exp $ + + + +*/ + + +/* + +Sendmail Copyright Notice + + +Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. + All rights reserved. +Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. +Copyright (c) 1988, 1993 + The Regents of the University of California. All rights reserved. + +By using this file, you agree to the terms and conditions set +forth in the LICENSE file which can be found at the top level of +the sendmail distribution. + + +$Author: tleek $ +$Date: 2004/01/05 17:27:47 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s7/txt-dns.h,v 1.1.1.1 2004/01/05 17:27:47 tleek Exp $ + + + +*/ + + +/* + + + +*/ + +#include + +#define DNSMAP 1 + +typedef struct +{ + char *dns_q_domain; + unsigned int dns_q_type; + unsigned int dns_q_class; +} DNS_QUERY_T; + +typedef struct +{ + unsigned int mx_r_preference; + char mx_r_domain[1]; +} MX_RECORD_T; + +typedef struct +{ + unsigned int srv_r_priority; + unsigned int srv_r_weight; + unsigned int srv_r_port; + char srv_r_target[1]; +} SRV_RECORDT_T; + + +typedef struct resource_record RESOURCE_RECORD_T; /* from sm_resolve.h */ + +struct resource_record +{ + char *rr_domain; + unsigned int rr_type; + unsigned int rr_class; + unsigned int rr_ttl; + unsigned int rr_size; + union + { + void *rr_data; + MX_RECORD_T *rr_mx; + MX_RECORD_T *rr_afsdb; /* mx and afsdb are identical */ + SRV_RECORDT_T *rr_srv; +# if NETINET + struct in_addr *rr_a; +# endif /* NETINET */ +# if NETINET6 + struct in6_addr *rr_aaaa; +# endif /* NETINET6 */ + char *rr_txt; + } rr_u; + RESOURCE_RECORD_T *rr_next; +}; + +typedef struct +{ + HEADER dns_r_h; + DNS_QUERY_T dns_r_q; + RESOURCE_RECORD_T *dns_r_head; +} DNS_REPLY_T; + + + + + +/* + + + +*/ + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-0906/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,25 @@ +-= CVE-2002-0906 =- + +Vulnerable version: Sendmail up to 8.12.5 +File: sendmail/sm_resolve.c +Download from: ftp://ftp.sendmail.org/pub/sendmail/past-releases/ + +Domain: Server + +_ Vulnerable Functions and Buffers _ + +Function parse_dns_reply allocates a buffer of a user-specified size, then copies a separately user-specified amount of user-data into that buffer. All data is passed into the function as an unsigned char array over which a sequence of different types of records is overlaid. The overflow only occurs if a record contains a specific "type" field value. The patched version only copies as much data as the buffer can hold. + +_ Decomposed Programs _ + +parse_dns_reply/ + parse_dns_reply_no_cast_{bad,ok}.c + parse_dns_reply_cast_{bad,ok}.c + +Variant cast casts an array of uchars to an int (size) using bitops. Variant no_cast assigns size non-deterministically. + +_ Notes _ + +This is Zitser's sendmail/s7, simplified. + +This vulnerability does not depend on BASE_SZ. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_no_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_no_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_no_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_no_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,45 @@ +/* + * This one just blindly copies the input into buffer and writes '>''\0' at the + * end. + */ + +#include "../../../../../lib/stubs.h" + +int main (void) +{ + char buffer[BASE_SZ+1]; + char input[BASE_SZ+70]; + char *buf; + char *buflim; + char *in; + char cur; + +// shouldn't be necessary unless checking for safety of *in +// input[BASE_SZ+70-1] = EOS; + in = input; + buf = buffer; + buflim = &buffer[sizeof buffer - 1]; + // didn't reserve enough space for both '>' and '\0'! + + cur = *in; + while (cur != EOS) + { + if (buf == buflim) + break; + + *buf = cur; + buf++; +out: + in++; + cur = *in; + } + + *buf = '>'; + buf++; + + /* BAD */ + *buf = EOS; + buf++; + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_no_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_no_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_no_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_no_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,44 @@ +/* + * Variant: This one just blindly copies the input into buffer and writes '>''\0' at the end. + */ + +#include "../../../../../lib/stubs.h" + +int main (void) +{ + char buffer[BASE_SZ+1]; + char input[BASE_SZ+70]; + char *buf; + char *buflim; + char *in; + char cur; + +// shouldn't be necessary unless checking for safety of *in +// input[BASE_SZ+70-1] = EOS; + in = input; + buf = buffer; + buflim = &buffer[sizeof buffer - 2]; + // reserved enough space for both '>' and '\0'! + + cur = *in; + while (cur != EOS) + { + if (buf == buflim) + break; + + *buf = cur; + buf++; +out: + in++; + cur = *in; + } + + *buf = '>'; + buf++; + + /* OK */ + *buf = EOS; + buf++; + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_one_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_one_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_one_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_one_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,57 @@ +/* + * This one bails out of the copy loop as soon as the end of buffer is + * reached, keeping only one extra spot at the end for either a '\0' or a + * '<', but not both. + */ + +#include "../../../../../lib/stubs.h" + +int main (void) +{ + char buffer[BASE_SZ+1]; + char input[BASE_SZ+70]; + char *buf; + char *buflim; + char *in; + char cur; + int anglelev; + int skipping; + + in = input; + buf = buffer; + buflim = &buffer[sizeof buffer - 1]; + // didn't reserve enough space for both '>' and '\0'! + + skipping = 0; + + cur = *in; + while (cur != EOS) + { + if (buf == buflim) + break; + + if (cur == '<') + anglelev = 1; + else + goto out; + + *buf = cur; + buf++; + +out: + in++; + cur = *in; + } + + if (anglelev > 0) + { + *buf = '>'; + buf++; + } + + /* BAD */ + *buf = EOS; + buf++; + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_one_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_one_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_one_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_one_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,57 @@ +/* + * This one bails out of the copy loop as soon as the end of buffer is + * reached, keeping only one extra spot at the end for either a '\0' or a + * '<', but not both. + */ + +#include "../../../../../lib/stubs.h" + +int main (void) +{ + char buffer[BASE_SZ+1]; + char input[BASE_SZ+70]; + char *buf; + char *buflim; + char *in; + char cur; + int anglelev; + int skipping; + + in = input; + buf = buffer; + buflim = &buffer[sizeof buffer - 2]; + // reserved enough space for both '>' and '\0'! + + skipping = 0; + + cur = *in; + while (cur != EOS) + { + if (buf == buflim) + break; + + if (cur == '<') + anglelev = 1; + else + goto out; + + *buf = cur; + buf++; + +out: + in++; + cur = *in; + } + + if (anglelev > 0) + { + *buf = '>'; + buf++; + } + + /* OK */ + *buf = 0; + buf++; + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_two_tests_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_two_tests_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_two_tests_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_two_tests_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,64 @@ +/* + * This one copies '<' as long as there's safe space, then writes + * '>''\0' at the end if at least one '<' was read. + */ + +#include "../../../../../lib/stubs.h" + +int main (void) +{ + char buffer[BASE_SZ+1]; + char input[BASE_SZ+70]; // = "<"; + char *buf; + char *buflim; + char *in; + char cur; + int anglelev; + int skipping; + + in = input; + buf = buffer; + buflim = &buffer[sizeof buffer - 1]; + // didn't reserve enough space for both '>' and '\0'! + + skipping = 0; + + cur = *in; + while (cur != EOS) + { + if (buf >= buflim) + skipping = 1; + else + skipping = 0; + + if (cur == '<') + { + if (!skipping) + anglelev = 1; + } + else + goto out; + + if (!skipping) + { + *buf = cur; + buf++; + } + +out: + in++; + cur = *in; + } + + if (anglelev > 0) + { + *buf = '>'; + buf++; + } + + /* BAD */ + *buf = EOS; + buf++; + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_two_tests_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_two_tests_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_two_tests_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/close_angle/close-angle_ptr_two_tests_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,64 @@ +/* + * This one copies '<' as long as there's safe space, then writes + * '>''\0' at the end if at least one '<' was read. + */ + +#include "../../../../../lib/stubs.h" + +int main (void) +{ + char buffer[BASE_SZ+1]; + char input[BASE_SZ+70]; // = "<"; + char *buf; + char *buflim; + char *in; + char cur; + int anglelev; + int skipping; + + in = input; + buf = buffer; + buflim = &buffer[sizeof buffer - 2]; + // reserved enough space for both '>' and '\0'! + + skipping = 0; + + cur = *in; + while (cur != EOS) + { + if (buf >= buflim) + skipping = 1; + else + skipping = 0; + + if (cur == '<') + { + if (!skipping) + anglelev = 1; + } + else + goto out; + + if (!skipping) + { + *buf = cur; + buf++; + } + +out: + in++; + cur = *in; + } + + if (anglelev > 0) + { + *buf = '>'; + buf++; + } + + /* OK */ + *buf = EOS; + buf++; + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/complete/crackaddr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/complete/crackaddr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/complete/crackaddr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/complete/crackaddr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,538 @@ + +/* + +MIT Copyright Notice + +Copyright 2003 M.I.T. + +Permission is hereby granted, without written agreement or royalty fee, to use, +copy, modify, and distribute this software and its documentation for any +purpose, provided that the above copyright notice and the following three +paragraphs appear in all copies of this software. + +IN NO EVENT SHALL M.I.T. BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, +INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE +AND ITS DOCUMENTATION, EVEN IF M.I.T. HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMANGE. + +M.I.T. SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +AND NON-INFRINGEMENT. + +THE SOFTWARE IS PROVIDED ON AN "AS-IS" BASIS AND M.I.T. HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +$Author: tleek $ +$Date: 2004/01/05 17:27:48 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s1/crackaddr-bad.c,v 1.1.1.1 2004/01/05 17:27:48 tleek Exp $ + + + +*/ + + +/* + +Sendmail Copyright Notice + + +Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. + All rights reserved. +Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. +Copyright (c) 1988, 1993 + The Regents of the University of California. All rights reserved. + +By using this file, you agree to the terms and conditions set +forth in the LICENSE file which can be found at the top level of +the sendmail distribution. + + +$Author: tleek $ +$Date: 2004/01/05 17:27:48 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s1/crackaddr-bad.c,v 1.1.1.1 2004/01/05 17:27:48 tleek Exp $ + + + +*/ + + +/* + + + +*/ + +// NB: Derived from sendmail/headers.c + +/* + * Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. + * All rights reserved. + * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the sendmail distribution. + * + */ + + + + +#include +#include +#include +#include + +/* ccured needs this */ +#pragma ccuredvararg("scanf", printf(1)) + +/* macro substitution character */ +#define MACROEXPAND ((unsigned char)0201) /* macro expansion */ +#define MAXNAME 30 /* max length of a name */ +#define MAXCANARY 10 + +enum bool {false, true}; + + +int ColonOkInAddr; /* single colon legal in address */ +char *MustQuoteChars; /* quote these characters in phrases */ + + +/* +** CRACKADDR -- parse an address and turn it into a macro +** +** This doesn't actually parse the address -- it just extracts +** it and replaces it with "$g". The parse is totally ad hoc +** and isn't even guaranteed to leave something syntactically +** identical to what it started with. However, it does leave +** something semantically identical. +** +** This algorithm has been cleaned up to handle a wider range +** of cases -- notably quoted and backslash escaped strings. +** This modification makes it substantially better at preserving +** the original syntax. +** +** Parameters: +** addr -- the address to be cracked. +** +** Returns: +** a pointer to the new version. +** +** Side Effects: +** none. +** +** Warning: +** The return value is saved in local storage and should +** be copied if it is to be reused. +*/ + +char * +crackaddr(addr) + register char *addr; +{ + register char *p; + register char c; + int cmtlev; + int realcmtlev; + int anglelev, realanglelev; + int copylev; + int bracklev; + enum bool qmode; + enum bool realqmode; + enum bool skipping; + enum bool putgmac = false; + enum bool quoteit = false; + enum bool gotangle = false; + enum bool gotcolon = false; + register char *bp; + char *obp; + char *buflim; + char *bufhead; + char *addrhead; + static char canary[MAXCANARY+1]; + static char buf[MAXNAME + 1]; + static char test_buf[10]; /* will use as a canary to detect overflow */ + /* of buf[] */ + + memset (canary, 'A', MAXCANARY+1); + strcpy(test_buf, "GOOD"); + + printf("Inside crackaddr!\n"); + + + /* strip leading spaces */ + while (*addr != '\0' && isascii((int)*addr) && isspace((int)*addr)) + addr++; + + /* + ** Start by assuming we have no angle brackets. This will be + ** adjusted later if we find them. + */ + + + bp = bufhead = buf; + obp = bp; + buflim = &buf[sizeof buf - 7]; + p = addrhead = addr; + copylev = anglelev = realanglelev = cmtlev = realcmtlev = 0; + bracklev = 0; + qmode = realqmode = false; + + printf("qmode = %d\n", qmode); + + while ((c = *p++) != '\0') + { + /* + ** If the buffer is overful, go into a special "skipping" + ** mode that tries to keep legal syntax but doesn't actually + ** output things. + */ + + printf("c = %c\n", c); + + skipping = bp >= buflim; + + if (copylev > 0 && !skipping) + { + /*BAD*/ + *bp++ = c; + } + /* check for backslash escapes */ + if (c == '\\') + { + /* arrange to quote the address */ + if (cmtlev <= 0 && !qmode) + quoteit = true; + + if ((c = *p++) == '\0') + { + /* too far */ + p--; + goto putg; + } + if (copylev > 0 && !skipping) + { + /*BAD*/ + *bp++ = c; + } + goto putg; + } + + /* check for quoted strings */ + if (c == '"' && cmtlev <= 0) + { + printf("quoted string...\n"); + qmode = !qmode; + if (copylev > 0 && !skipping) + realqmode = !realqmode; + continue; + } + if (qmode) + goto putg; + + /* check for comments */ + if (c == '(') + { + printf("left ( seen....\n"); + cmtlev++; + + /* allow space for closing paren */ + if (!skipping) + { + buflim--; + realcmtlev++; + if (copylev++ <= 0) + { + if (bp != bufhead) + { + /*BAD*/ + *bp++ = ' '; + } + + /*BAD*/ + *bp++ = c; + } + } + } + if (cmtlev > 0) + { + if (c == ')') + { + cmtlev--; + copylev--; + if (!skipping) + { + realcmtlev--; + buflim++; + } + } + continue; + } + else if (c == ')') + { + /* syntax error: unmatched ) */ + if (copylev > 0 && !skipping) + bp--; + } + + /* count nesting on [ ... ] (for IPv6 domain literals) */ + if (c == '[') + bracklev++; + else if (c == ']') + bracklev--; + + /* check for group: list; syntax */ + if (c == ':' && anglelev <= 0 && bracklev <= 0 && + !gotcolon && !ColonOkInAddr) + { + register char *q; + + /* + ** Check for DECnet phase IV ``::'' (host::user) + ** or ** DECnet phase V ``:.'' syntaxes. The latter + ** covers ``user@DEC:.tay.myhost'' and + ** ``DEC:.tay.myhost::user'' syntaxes (bletch). + */ + + if (*p == ':' || *p == '.') + { + if (cmtlev <= 0 && !qmode) + quoteit = true; + if (copylev > 0 && !skipping) + { + /*BAD*/ + *bp++ = c; + /*BAD*/ + *bp++ = *p; + } + p++; + goto putg; + } + + gotcolon = true; + + bp = bufhead; + if (quoteit) + { + /*BAD*/ + *bp++ = '"'; + + /* back up over the ':' and any spaces */ + --p; + + while (isascii((int) *--p) && isspace((int) *p)) + continue; + p++; + } + for (q = addrhead; q < p; ) + { + c = *q++; + if (bp < buflim) + { + if (quoteit && c == '"') + /*BAD*/ + *bp++ = '\\'; + /*BAD*/ + *bp++ = c; + + } + } + if (quoteit) + { + if (bp == &bufhead[1]) + bp--; + else{ + /*BAD*/ + *bp++ = '"'; + } + while ((c = *p++) != ':') + { + if (bp < buflim){ + /*BAD*/ + *bp++ = c; + } + } + /*BAD*/ + *bp++ = c; + } + + /* any trailing white space is part of group: */ + while (isascii((int) *p) && isspace((int)*p) && bp < buflim) + { + /*BAD*/ + *bp++ = *p++; + } + copylev = 0; + putgmac = quoteit = false; + bufhead = bp; + addrhead = p; + continue; + } + + if (c == ';' && copylev <= 0 && !ColonOkInAddr) + { + if (bp < buflim) + /*BAD*/ + *bp++ = c; + } + + /* check for characters that may have to be quoted */ + if (strchr(MustQuoteChars, c) != NULL) + { + /* + ** If these occur as the phrase part of a <> + ** construct, but are not inside of () or already + ** quoted, they will have to be quoted. Note that + ** now (but don't actually do the quoting). + */ + + if (cmtlev <= 0 && !qmode) + quoteit = true; + } + + /* check for angle brackets */ + if (c == '<') + { + register char *q; + + /* assume first of two angles is bogus */ + if (gotangle) + quoteit = true; + gotangle = true; + + /* oops -- have to change our mind */ + anglelev = 1; + if (!skipping) + realanglelev = 1; + + bp = bufhead; + if (quoteit) + { + /*BAD*/ + *bp++ = '"'; + + /* back up over the '<' and any spaces */ + --p; + while (isascii((int)*--p) && isspace((int)*p)) + continue; + p++; + } + for (q = addrhead; q < p; ) + { + c = *q++; + if (bp < buflim) + { + if (quoteit && c == '"') + /*BAD*/ + *bp++ = '\\'; + /*BAD*/ + *bp++ = c; + } + } + if (quoteit) + { + if (bp == &buf[1]) + bp--; + else + /*BAD*/ + *bp++ = '"'; + while ((c = *p++) != '<') + { + if (bp < buflim) + /*BAD*/ + *bp++ = c; + } + /*BAD*/ + *bp++ = c; + } + copylev = 0; + putgmac = quoteit = false; + continue; + } + + if (c == '>') + { + if (anglelev > 0) + { + anglelev--; + if (!skipping) + { + realanglelev--; + buflim++; + } + } + else if (!skipping) + { + /* syntax error: unmatched > */ + if (copylev > 0) + bp--; + quoteit = true; + continue; + } + if (copylev++ <= 0) + /*BAD*/ + *bp++ = c; + continue; + } + + /* must be a real address character */ + putg: + if (copylev <= 0 && !putgmac) + { + if (bp > bufhead && bp[-1] == ')') + /*BAD*/ + *bp++ = ' '; + /*BAD*/ + *bp++ = MACROEXPAND; + /*BAD*/ + *bp++ = 'g'; + putgmac = true; + } + printf("Buf = %s\n", buf); + } + + /* repair any syntactic damage */ + if (realqmode) + /*BAD*/ + *bp++ = '"'; + while (realcmtlev-- > 0) + /*BAD*/ + *bp++ = ')'; + while (realanglelev-- > 0) + /*BAD*/ + *bp++ = '>'; + /*BAD*/ + *bp++ = '\0'; + + printf("canary:\n"); + printbuf (canary, MAXCANARY+1); + printf("buf:\n"); + printbuf (buf, MAXNAME+1); + + return buf; +} + + +int main(){ + + char address[100]; + char *res_addr; + + MustQuoteChars = "@,;:\\()[].'"; + + printf("Enter email address:\n"); + scanf("%99s", address); + + res_addr = crackaddr(address); + + return 0; +} + +/* + + + +*/ + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2002-1337/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,24 @@ +-= CVE-2002-1337 =- + +Vulnerable versions: Sendmail 5.79 to 8.12.7 +File: sendmail/headers.c +Download from: ftp://ftp.sendmail.org/pub/sendmail/past-releases/sendmail.8.12.7.tar.gz + +Domain: Server + +_ Vulnerable Functions and Buffers _ + +Function crackaddr copies the source string, addr, into the dest buffer, buf, but incorrectly computes the amount of space to reserve at the end of buf to insert angle brackets ('>') which are missing in the input. Specific inputs can lead to an overflow of buf. The patched version reserves more space at the end of buf. + +_ Decomposed Programs _ + +close_angle/ + close-angle_ptr_{no,one,two}_test*_{bad,ok}.c + +Variant no_test simply copies the input into the dest buffer and writes ">\0" at the end. Variant one_test additionally checks for '<' in the input and only writes '>' at the end if '<' was seen. Variant two_tests also keeps track of "skipping" mode, in which input is not copied into the dest buffer. + +_ Notes _ + +This is from Zitser's sendmail/s1. + +BASE_SZ was originally 30. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/prescan/prescan_arr_med_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/prescan/prescan_arr_med_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/prescan/prescan_arr_med_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/prescan/prescan_arr_med_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,86 @@ +#include "../../../../../lib/stubs.h" + +#define ADDRSIZE 500 // originally 500 +#define PSBUFSIZE BASE_SZ +#define MAXNAME (4 * BASE_SZ / 5) +#define NOCHAR -1 +#define TRUE 1 +#define FALSE 0 + +int main (void) +{ + // originally function arguments + char addr[ADDRSIZE]; + char pvpbuf[PSBUFSIZE]; + + int p, q, q_old; + int c; + + int pvpbuf_end = sizeof (pvpbuf); + + int bslashmode; + int i; + + p = 0; + q = 0; + bslashmode = FALSE; + + c = NOCHAR; + + q_old = q; + do + { + // bounds check and write lookahead (c) to pvpbuf + if (c != NOCHAR && !bslashmode) + { + if (q >= pvpbuf_end - 1) + return 0; + pvpbuf[q] = c; + q++; + } + + // read next input char + c = addr[p]; + p++; + if (c == EOS) + break; + + //assert (q < pvpbuf_end); + /* BAD */ + pvpbuf[q] = EOS; // precautiously write EOS to dest + + if (bslashmode) + { + bslashmode = FALSE; + + if (c != '!') + { + //assert (q < pvpbuf_end); + /* BAD */ + pvpbuf[q] = '\\'; // SatAbs 1.8 says this is safe + q++; + continue; + } + } + + if (c == '\\') + bslashmode = TRUE; + if (c == NOCHAR) // not supposed to be in the input alphabet + continue; // skip bounds check on next for loop so another \ can be copied + if (c == EOS) + break; + } while (1); + + if (q_old != q) + { + //assert (q < pvpbuf_end); + /* BAD */ + pvpbuf[q] = 0; + q++; + + if (q - q_old > MAXNAME) + return 0; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/prescan/prescan_arr_med_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/prescan/prescan_arr_med_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/prescan/prescan_arr_med_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/prescan/prescan_arr_med_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,86 @@ +#include "../../../../../lib/stubs.h" + +#define ADDRSIZE 500 // originally 500 +#define PSBUFSIZE BASE_SZ +#define MAXNAME (4 * BASE_SZ / 5) +#define NOCHAR -1 +#define TRUE 1 +#define FALSE 0 + +int main (void) +{ + // originally function arguments + char addr[ADDRSIZE]; + char pvpbuf[PSBUFSIZE]; + + int p, q, q_old; + int c; + + int pvpbuf_end = sizeof (pvpbuf); + + int bslashmode; + int i; + + p = 0; + q = 0; + bslashmode = FALSE; + + c = NOCHAR; + + q_old = q; + do + { + // bounds check and write lookahead (c) to pvpbuf + if (c != NOCHAR && !bslashmode) + { + if (q >= pvpbuf_end - 1) + return 0; + pvpbuf[q] = c; + q++; + } + + // read next input char + c = addr[p] & 0xff; // mask out high bits to prevent sign extension + p++; + if (c == EOS) + break; + + //assert (q < pvpbuf_end); + /* OK */ + pvpbuf[q] = EOS; // precautiously write EOS to dest + + if (bslashmode) + { + bslashmode = FALSE; + + if (c != '!') + { + //assert (q < pvpbuf_end); + /* OK */ + pvpbuf[q] = '\\'; // SatAbs 1.8 says this is safe + q++; + continue; + } + } + + if (c == '\\') + bslashmode = TRUE; + if (c == NOCHAR) // not supposed to be in the input alphabet + continue; // skip bounds check on next for loop so another \ can be copied + if (c == EOS) + break; + } while (1); + + if (q_old != q) + { + //assert (q < pvpbuf_end); + /* OK */ + pvpbuf[q] = 0; + q++; + + if (q - q_old > MAXNAME) + return 0; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/prescan/prescan_arr_min_test_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/prescan/prescan_arr_min_test_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/prescan/prescan_arr_min_test_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/prescan/prescan_arr_min_test_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,83 @@ +#include "../../../../../lib/stubs.h" + +#define ADDRSIZE 500 // originally 500 +#define PSBUFSIZE BASE_SZ +#define MAXNAME (4 * BASE_SZ / 5) +#define NOCHAR -1 +#define TRUE 1 +#define FALSE 0 + +int main (void) +{ + // originally function arguments + char addr[ADDRSIZE]; + char pvpbuf[PSBUFSIZE]; + + int p, q, q_old; + int c; + + int pvpbuf_end = sizeof (pvpbuf); + + int bslashmode; + int i; + + p = 0; + q = 0; + bslashmode = FALSE; + + c = NOCHAR; + + q_old = q; + do + { + // bounds check and write lookahead (c) to pvpbuf + if (c != NOCHAR && !bslashmode) + { + if (q >= pvpbuf_end - 1) + return 0; + pvpbuf[q] = c; + q++; + } + + // read next input char + c = addr[p]; + p++; + if (c == EOS) + break; + + //assert (q < pvpbuf_end); + /*BAD*/ + pvpbuf[q] = EOS; // precautiously write EOS to dest + + if (bslashmode) + { + bslashmode = FALSE; + + //assert (q < pvpbuf_end); + /*BAD*/ + pvpbuf[q] = '\\'; + q++; + continue; + } + + if (c == '\\') + bslashmode = TRUE; + if (c == NOCHAR) // not supposed to be in the input alphabet + continue; // skip bounds check on next for loop so another \ can be copied + if (c == EOS) + break; + } while (1); + + if (q_old != q) + { + //assert (q < pvpbuf_end); + /*BAD*/ + pvpbuf[q] = 0; + q++; + + if (q - q_old > MAXNAME) + return 0; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/prescan/prescan_arr_min_test_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/prescan/prescan_arr_min_test_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/prescan/prescan_arr_min_test_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/prescan/prescan_arr_min_test_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,92 @@ +#include "../../../../../lib/stubs.h" + +#define ADDRSIZE 500 // originally 500 +#define PSBUFSIZE BASE_SZ +#define MAXNAME (4 * BASE_SZ / 5) +#define NOCHAR -1 +#define TRUE 1 +#define FALSE 0 + +int main (void) +{ + // originally function arguments + char addr[ADDRSIZE]; + char pvpbuf[PSBUFSIZE]; + + int p, q, q_old; + int c; + + int pvpbuf_end = sizeof (pvpbuf); + + int bslashmode; + int i; + + // alternative method to initialize addr to attack string + /* + for(i=0; i<20; i=i+2) + { + addr[i] = '\\'; + addr[i+1] = '\377'; // when cast to int, gets sign extended to -1 (NOCHAR) + } + */ + + p = 0; + q = 0; + bslashmode = FALSE; + + c = NOCHAR; + + q_old = q; + do + { + // bounds check and write lookahead (c) to pvpbuf + if (c != NOCHAR && !bslashmode) + { + if (q >= pvpbuf_end - 1) + return 0; + pvpbuf[q] = c; + q++; + } + + // read next input char + c = addr[p] & 0xff; // mask out high bits to prevent sign extension + p++; + if (c == EOS) + break; + + //assert (q < pvpbuf_end); + /* OK */ + pvpbuf[q] = EOS; // precautiously write EOS to dest + + if (bslashmode) + { + bslashmode = FALSE; + + //assert (q < pvpbuf_end); + /* OK */ + pvpbuf[q] = '\\'; + q++; + continue; + } + + if (c == '\\') + bslashmode = TRUE; + if (c == NOCHAR) // not supposed to be in the input alphabet + continue; // skip bounds check on next for loop so another \ can be copied + if (c == EOS) + break; + } while (1); + + if (q_old != q) + { + //assert (q < pvpbuf_end); + /* OK */ + pvpbuf[q] = 0; + q++; + + if (q - q_old > MAXNAME) + return 0; + } + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0161/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,28 @@ +-= CVE-2003-0161 =- + +Vulnerable versions: Sendmail to 8.12.9 +File: sendmail/parseaddr +Download from: ftp://ftp.sendmail.org/pub/sendmail/past-releases/ + +Domain: Server + +_ Vulnerable Functions and Buffers _ + +Function prescan writes to a fixed size buffer, pvpbuf, while scanning a user string, addr. In the original code, it sets a temporary variable, int c, to the current character (char) in addr, but can also set c to (int) -1 to indicate that the current char should not be copied to pvpbuf. This causes the loop which scans addr to skip a bounds check on pvpbuf in the next iteration. Subsequently, if '\\' is the next char in addr, it is written into pvpbuf without a bounds check. The special value -1 is not supposed to be in the character set of addr, but due to sign extension from int to char, the (char) value '\377' is interpreted as (int) -1. Thus, a sufficiently long input of the pattern ('\\''\377')+ overflows pvpbuf. The patched version masks out the high bits of each input char to prevent sign extension. + +_ Decomposed Programs _ + +prescan/ + prescan_arr_{min,med}_test_{bad,ok}.c + +Variant min_test omits an input test which guards a dereference and increment of the dest pointer. + +_ Notes _ + +This is Zitser's sendmail/s5, simplified. + +BASE_SZ was originally 50. + +LOGIN is originally unbounded, but passwd (1) probably limits it to something small. + +GECOS is shorter than BASE_SZ. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/buildfname/buildfname_arr_one_gecos_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/buildfname/buildfname_arr_one_gecos_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/buildfname/buildfname_arr_one_gecos_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/buildfname/buildfname_arr_one_gecos_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,47 @@ +#define BUF BASE_SZ +#define GECOS 1 +#define LOGIN (BASE_SZ + 1)/GECOS // unbounded? + +#include "../../../../../lib/stubs.h" + +int +main (void) +{ + // these were parameters + char login[LOGIN + 1]; + char gecos[GECOS + 1]; + + char buf[BUF + 1]; + char c; + int i, j; + + login[(int) (sizeof login - 1)] = EOS; + gecos[(int) (sizeof gecos - 1)] = EOS; + + i = 0; + if (gecos[i] == '*') + i++; + + c = gecos[i]; + j = 0; + while (c != EOS && c != ',' && c != ';' && c != '%') + { + if (c == '&') + { + /* BAD */ + (void) strcpy (buf + j, login); + while (buf[j] != EOS) + j++; + } + else + { + /* BAD */ + buf[j] = c; + j++; + } + i++; + c = gecos[i]; + } + buf[j] = EOS; + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/buildfname/buildfname_arr_one_gecos_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/buildfname/buildfname_arr_one_gecos_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/buildfname/buildfname_arr_one_gecos_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/buildfname/buildfname_arr_one_gecos_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,49 @@ +#define BUF BASE_SZ +#define GECOS 1 +#define LOGIN (BASE_SZ + 1)/GECOS // unbounded? + +//#include +//#include +#include "../../../../../lib/stubs.h" + +int +main (void) +{ + // these were parameters + char login[LOGIN + 1]; + char gecos[GECOS + 1]; + + char buf[BUF + 1]; + char c; + int i, j; + + login[(int) (sizeof login - 1)] = EOS; + gecos[(int) (sizeof gecos - 1)] = EOS; + + i = 0; + if (gecos[i] == '*') + i++; + + c = gecos[i]; + j = 0; + while (c != EOS && c != ',' && c != ';' && c != '%') + { + if (c == '&') + { + /* OK */ + (void) strncpy (buf + j, login, sizeof (buf) - j); + while (buf[j] != EOS) + j++; + } + else + { + /* OK */ + buf[j] = c; + j++; + } + i++; + c = gecos[i]; + } + buf[j] = EOS; + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/buildfname/buildfname_arr_two_gecos_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/buildfname/buildfname_arr_two_gecos_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/buildfname/buildfname_arr_two_gecos_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/buildfname/buildfname_arr_two_gecos_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,47 @@ +#define BUF BASE_SZ +#define GECOS 2 +#define LOGIN (BASE_SZ + 2)/GECOS + +#include "../../../../../lib/stubs.h" + +int +main (void) +{ + // these were parameters + char login[LOGIN + 1]; + char gecos[GECOS + 1]; + + char buf[BUF + 1]; + char c; + int i, j; + + login[(int) (sizeof login - 1)] = EOS; + gecos[(int) (sizeof gecos - 1)] = EOS; + + i = 0; + if (gecos[i] == '*') + i++; + + c = gecos[i]; + j = 0; + while (c != EOS && c != ',' && c != ';' && c != '%') + { + if (c == '&') + { + /* BAD */ + (void) strcpy (buf + j, login); + while (buf[j] != EOS) + j++; + } + else + { + /* BAD */ + buf[j] = c; + j++; + } + i++; + c = gecos[i]; + } + buf[j] = EOS; + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/buildfname/buildfname_arr_two_gecos_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/buildfname/buildfname_arr_two_gecos_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/buildfname/buildfname_arr_two_gecos_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/buildfname/buildfname_arr_two_gecos_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,47 @@ +#define BUF BASE_SZ +#define GECOS 2 +#define LOGIN (BASE_SZ + 2)/GECOS + +#include "../../../../../lib/stubs.h" + +int +main (void) +{ + // these were parameters + char login[LOGIN + 1]; + char gecos[GECOS + 1]; + + char buf[BUF + 1]; + char c; + int i, j; + + login[(int) (sizeof login - 1)] = EOS; + gecos[(int) (sizeof gecos - 1)] = EOS; + + i = 0; + if (gecos[i] == '*') + i++; + + c = gecos[i]; + j = 0; + while (c != EOS && c != ',' && c != ';' && c != '%') + { + if (c == '&') + { + /* OK */ + (void) strncpy (buf + j, login, sizeof (buf) - j); + while (buf[j] != EOS) + j++; + } + else + { + /* OK */ + buf[j] = c; + j++; + } + i++; + c = gecos[i]; + } + buf[j] = EOS; + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/complete/util-bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/complete/util-bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/complete/util-bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/complete/util-bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,136 @@ + +/* + +MIT Copyright Notice + +Copyright 2003 M.I.T. + +Permission is hereby granted, without written agreement or royalty fee, to use, +copy, modify, and distribute this software and its documentation for any +purpose, provided that the above copyright notice and the following three +paragraphs appear in all copies of this software. + +IN NO EVENT SHALL M.I.T. BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, +INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE +AND ITS DOCUMENTATION, EVEN IF M.I.T. HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMANGE. + +M.I.T. SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +AND NON-INFRINGEMENT. + +THE SOFTWARE IS PROVIDED ON AN "AS-IS" BASIS AND M.I.T. HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +$Author: tleek $ +$Date: 2004/02/05 15:19:49 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s2/util-bad.c,v 1.2 2004/02/05 15:19:49 tleek Exp $ + + + +*/ + + +/* + +Sendmail Copyright Notice + + +Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. + All rights reserved. +Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. +Copyright (c) 1988, 1993 + The Regents of the University of California. All rights reserved. + +By using this file, you agree to the terms and conditions set +forth in the LICENSE file which can be found at the top level of +the sendmail distribution. + + +$Author: tleek $ +$Date: 2004/02/05 15:19:49 $ +$Header: /mnt/leo2/cvs/sabo/hist-040105/sendmail/s2/util-bad.c,v 1.2 2004/02/05 15:19:49 tleek Exp $ + + + +*/ + + +/* + + + +*/ + +#include +#include +#include + +/* +** BUILDFNAME -- build full name from gecos style entry. +** +** This routine interprets the strange entry that would appear +** in the GECOS field of the password file. +** +** Parameters: +** p -- name to build. +** login -- the login name of this user (for &). +** buf -- place to put the result. +** +** Returns: +** none. +** +** Side Effects: +** none. +*/ + +int +main (void) +{ + char *gecos, *login, *buf; // these were parameters + char *p; + char *bp; + int l; + + bp = buf; + + if (*gecos == '*') + gecos++; + + /* find length of final string */ + l = 0; + for (p = gecos; *p != '\0' && *p != ',' && *p != ';' && *p != '%'; p++) + { + if (*p == '&') + l += strlen(login); + else + l++; + } + + /* now fill in buf */ + for (p = gecos; *p != '\0' && *p != ',' && *p != ';' && *p != '%'; p++) + { + if (*p == '&') + { + + // printf ("strcpy(bp,login)\n"); + // printf ("strlen(bp) = %d strlen(login) = %d\n", + // strlen(bp), strlen(login)); + + /*BAD*/ + (void) strcpy(bp, login); + // *bp = toupper(*bp); + while (*bp != '\0') + bp++; + } + else { + /*BAD*/ + *bp++ = *p; + // printf ("bp-buf = %d\n", (bp-buf)); + } + } + *bp = '\0'; + + // printf("buf can store at most %d bytes; strlen(buf) = %d\n", MAXNAME+1, strlen(buf)); +} + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/CVE-2003-0681/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,24 @@ +-= CVE-2003-0681 =- + +Vulnerable versions: Sendmail 8.6.12 to ? +File: libsm/mbdb.c +Download from: source not available anymore + +Domain: Server + +_ Vulnerable Functions and Buffers _ + +Function buildfname (originally sm_pwfullname) takes a gecos and a login string as arguments and, for each occurence of the '&' character in the gecos string, blindly appends (strcpy) the login string to a fixed size buffer. The patched version uses strncpy with a safe bound instead of strcpy. + +_ Decomposed Programs _ + +buildfname/ + buildfname_arr_{one,two}_gecos_{bad,ok}.c + +Variant two_gecos allocates a gecos string of strlen two (so the login string can be copied into the dest buffer twice), whereas one_gecos only allocates a gecos string of strlen one. + +_ Notes _ + +This is Zitser's sendmail/s2, simplified. + +BASE_SZ was originally 256. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/main_tests frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/main_tests --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/main_tests 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/main_tests 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,28 @@ +./CVE-2003-0161/prescan/prescan_arr_min_test_ok.c +./CVE-2003-0161/prescan/prescan_arr_min_test_bad.c +./CVE-2003-0161/prescan/prescan_arr_med_test_bad.c +./CVE-2003-0161/prescan/prescan_arr_med_test_ok.c +./CVE-2002-0906/parse_dns_reply/parse_dns_reply_cast_bad.c +./CVE-2002-0906/parse_dns_reply/parse_dns_reply_no_cast_bad.c +./CVE-2002-0906/parse_dns_reply/parse_dns_reply_no_cast_ok.c +./CVE-2002-0906/parse_dns_reply/parse_dns_reply_cast_ok.c +./CVE-2001-0653/tTflag/tTflag_arr_two_loops_ok.c +./CVE-2001-0653/tTflag/tTflag_arr_one_loop_bad.c +./CVE-2001-0653/tTflag/tTflag_arr_two_loops_bad.c +./CVE-2001-0653/tTflag/tTflag_arr_one_loop_ok.c +./CVE-2003-0681/buildfname/buildfname_arr_one_gecos_ok.c +./CVE-2003-0681/buildfname/buildfname_arr_two_gecos_ok.c +./CVE-2003-0681/buildfname/buildfname_arr_one_gecos_bad.c +./CVE-2003-0681/buildfname/buildfname_arr_two_gecos_bad.c +./CVE-2002-1337/close_angle/close-angle_ptr_no_test_ok.c +./CVE-2002-1337/close_angle/close-angle_ptr_one_test_bad.c +./CVE-2002-1337/close_angle/close-angle_ptr_no_test_bad.c +./CVE-2002-1337/close_angle/close-angle_ptr_one_test_ok.c +./CVE-1999-0047/mime7to8/mime7to8_arr_one_char_no_test_ok.c +./CVE-1999-0047/mime7to8/mime7to8_arr_one_char_no_test_bad.c +./CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_heavy_test_bad.c +./CVE-1999-0047/mime7to8/mime7to8_ptr_three_chars_heavy_test_ok.c +./CVE-1999-0206/mime_fromqp/mime_fromqp_ptr_bad.c +./CVE-1999-0206/mime_fromqp/mime_fromqp_ptr_ok.c +./CVE-1999-0206/mime_fromqp/mime_fromqp_arr_bad.c +./CVE-1999-0206/mime_fromqp/mime_fromqp_arr_ok.c diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/sendmail/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/sendmail/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,6 @@ +-= Sendmail =- + +Homepage: http://www.sendmail.org +Domain: Server + +Sendmail is the standard Unix mail (SMTP) server. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/constants.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/constants.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/constants.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/constants.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,5 @@ +#include "../../../../lib/stubs.h" + +#define BUFSZ BASE_SZ + 2 +#define INSZ BUFSZ + 5 + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/message_write/frama-c-journal.ml frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/message_write/frama-c-journal.ml --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/message_write/frama-c-journal.ml 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/message_write/frama-c-journal.ml 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,11 @@ +(* Frama-C journal generated at 15:32 the 02/09/2008 *) + +(* Running *) +let () = Journal.run () +let () = Cmdline.ForceValues.set true +let () = Cmdline.Files.set ["loop_ok.c"; ] +let () = File.init_from_cmdline () +let () = !Db.Syntactic_callgraph.dump () +let () = !Db.Value.compute () +(* Finished *) +let () = Journal.finished () diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/message_write/loop_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/message_write/loop_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/message_write/loop_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/message_write/loop_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,42 @@ +#include "../constants.h" + +void message_write (char *msg, int len) +{ + int i; + int j; + char buffer[BUFSZ]; + + int limit = BUFSZ - 1; + + for (i = 0; i < len; ) { + for (j = 0; i < len && j < limit; ){ + if (i + 1 < len + && msg[i] == '\n' + && msg[i+1]== '.') { + buffer[j] = msg[i]; /* Suppose j == limit - 1 */ + j++; + i++; + buffer[j] = msg[i]; /* Now j == limit */ + j++; + i++; + /* BAD */ + buffer[j] = '.'; /* Now j == limit + 1 = sizeof(buffer) */ + j++; + } else { + buffer[j] = msg[i]; + j++; + i++; + } + } + } +} + +int main () +{ + char msg [INSZ] = "message"; + + message_write (msg, INSZ); + + return 0; +} + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/message_write/loop_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/message_write/loop_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/message_write/loop_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/message_write/loop_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,42 @@ +#include "../constants.h" + +void message_write (char *msg, int len) +{ + int i; + int j; + char buffer[BUFSZ]; + + int limit = BUFSZ - 4; + + for (i = 0; i < len; ) { + for (j = 0; i < len && j < limit; ){ + if (i + 1 < len + && msg[i] == '\n' + && msg[i+1]== '.') { + buffer[j] = msg[i]; + j++; + i++; + buffer[j] = msg[i]; + j++; + i++; + /* OK */ + buffer[j] = '.'; + j++; + } else { + buffer[j] = msg[i]; + j++; + i++; + } + } + } +} + +int main () +{ + char msg [INSZ] = "message"; + + message_write (msg, INSZ); + + return 0; +} + Binary files /tmp/4k8HAQak0c/frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/message_write/test and /tmp/s6BvkO3fyh/frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/message_write/test differ diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/BID-6679/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,30 @@ +-= BID-6679 =- + +Vulnerable versions: SpamAssassin 2.40 to 2.43 +File(s): spamd/libspamc.c +Download from: + http://www.cpan.org/modules/by-module/Mail/Mail-SpamAssassin-2.43.tar.gz + +Domain: Spam Filter + +_ Note _ + +This vulnerability doesn't seem to have a CVE entry, so I'm using its +Bugtraq ID. It also has a Secunia Advisory number, SA7951. I heard +about it via the CRunner paper. + +_ Vulnerable Functions and Buffers _ + +A buffer called buffer[] is allocated in message_write(). Writes to +this buffer are protected by a limit check, but there's an off-by-one +error in the check. + +I'm currently not including any of the calling context, but that can +change if need be. + +_ Decomposed Programs _ + +constants.h + +message_write/ + loop.c diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/SpamAssassin/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,6 @@ +-= SpamAssassin =- + +Homepage: http://spamassassin.apache.org/ +Domain: Spam Filter + +SpamAssassin is a popular open source filter for getting rid of email spam. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,52 @@ +-= CVE-1999-0368 =- + +Vulnerable versions: wu-ftpd < 2.4.2-beta18-vr10 +File(s): src/realpath.c +Download from: + ftp://ftp.wu-ftpd.org/pub/wu-ftpd-attic/wu-ftpd-2.4.2-beta18-vr8.tar.gz + +Domain: FTP Server + +_ Vulnerable Functions and Buffers _ + +The vulnerabilities are in the realpath() funtion. + +First, no bounds checking is done on the input pathname, which is +blindly strcpy()'d into curpath, a global variable. + +Second, a local buffer workpath can be filled with up to MAXPATHLEN +bytes via a call to getcwd(); workpath is then strcpy()'d to +namebuf. More bytes are then written to namebuf using +strcat(). Several subsequent calls to strcpy() and strcat() can +propagate this overflow. We only try to find the initial overflow. + +Third, a buffer linkpath is filled, potentially to capacity of +MAXPATHLEN, using readlink(). More data is then appended to linkpath +using strcat(), which can overflow it. + +NOTE: SatAbs was having a lot of problems with the namebuf example in +the original version which used pointers as iterators (similar to the +NetBSD glob() example). Since my experience with YASM indicates that +using pointers as iterators shouldn't be much harder than using ints +(explicit aliasing, model pointers as pairs), I +suspect this to be a technical limitation of SatAbs rather than an +algorithmic one. I've therefore turned the iterators into ints in +these examples. + +_ Decomposed Programs _ + +wu-ftpd.h + +realpath-curpath/ + simple.c + +realpath-namebuf/ + strcpy_strcat_bad.c + iter_ints_simp_bad.c + iter_ints_bad.c + +realpath-linkpath/ + strcpy_strcat_bad.c + prefix_simp_bad.c + prefix_bad.c + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-curpath/simple_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-curpath/simple_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-curpath/simple_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-curpath/simple_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,38 @@ +#include "../wu-ftpd.h" + +/* Allocated size of buffer pathname[] in main () */ +#define PATHNAME_SZ MAXPATHLEN+1 + +char * +realpath(const char *pathname, char *result, char* chroot_path) +{ + char curpath[MAXPATHLEN]; + + if (result == NULL) + return(NULL); + + if(pathname == NULL){ + *result = EOS; + return(NULL); + } + + /* BAD */ + r_strcpy(curpath, pathname); + + return result; +} + +int main () +{ + char pathname [PATHNAME_SZ]; + char result [MAXPATHLEN]; + char chroot_path [MAXPATHLEN]; + + pathname [PATHNAME_SZ-1] = EOS; + result [MAXPATHLEN-1] = EOS; + chroot_path [MAXPATHLEN-1] = EOS; + + realpath(pathname, result, chroot_path); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-curpath/simple_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-curpath/simple_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-curpath/simple_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-curpath/simple_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,38 @@ +#include "../wu-ftpd.h" + +/* Allocated size of buffer pathname[] in main () */ +#define PATHNAME_SZ MAXPATHLEN+1 + +char * +realpath(const char *pathname, char *result, char* chroot_path) +{ + char curpath[MAXPATHLEN]; + + if (result == NULL) + return(NULL); + + if(pathname == NULL){ + *result = EOS; + return(NULL); + } + + /* OK */ + r_strncpy(curpath, pathname, MAXPATHLEN); + + return result; +} + +int main () +{ + char pathname [PATHNAME_SZ]; + char result [MAXPATHLEN]; + char chroot_path [MAXPATHLEN]; + + pathname [PATHNAME_SZ-1] = EOS; + result [MAXPATHLEN-1] = EOS; + chroot_path [MAXPATHLEN-1] = EOS; + + realpath(pathname, result, chroot_path); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/prefix_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/prefix_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/prefix_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/prefix_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,115 @@ +#include "../wu-ftpd.h" + +char * +realpath(const char *pathname, char *result, char* chroot_path) +{ + char curpath[MAXPATHLEN], + workpath[MAXPATHLEN], + linkpath[MAXPATHLEN], + namebuf[MAXPATHLEN]; + int len; + int where; + int ptr; + int last; + + if (result == NULL) + return(NULL); + + if(pathname == NULL){ + *result = EOS; + return(NULL); + } + + strcpy(curpath, pathname); + + if (*pathname != '/') { + uid_t userid; + + if (!getcwd(workpath,MAXPATHLEN)) { + userid = geteuid(); + delay_signaling(); + seteuid(0); + if (!getcwd(workpath,MAXPATHLEN)) { + strcpy(result, "."); + seteuid(userid); + enable_signaling(); + return (NULL); + } + seteuid(userid); + enable_signaling(); + } + } else + *workpath = EOS; + + where = 0; + while (curpath[where] != EOS) { + if (!strcmp(curpath + where, ".")) { + where++; + continue; + } + if (!strncmp(curpath + where, "./", 2)) { + where += 2; + continue; + } + if (!strncmp(curpath + where, "../", 3)) { + where += 3; + ptr = last = 0; + while (workpath[ptr] != EOS) { + if (workpath[ptr] == '/') + last = ptr; + ptr++; + } + workpath[last] = EOS; + continue; + } + ptr = istrchr(curpath + where, '/'); + if (curpath[ptr] == EOS) + ptr = where + strlen(curpath + where) - 1; + else + curpath[ptr] = EOS; + + strcpy(namebuf, workpath); + for (last = 0; namebuf[last] != EOS; last++) + continue; + + /* Chop out the out-of-bounds writes.... */ + } + + /* Stand-in for checking stat fields. */ + if (nondet_int() == 1) { + len = readlink(namebuf, linkpath, MAXPATHLEN); + if (len <= 0) + return NULL; + + linkpath[len] = EOS; + + if (linkpath[0] == '/') + workpath[0] = EOS; + if (curpath[where] != EOS) { + /* BAD */ + r_strcat(linkpath, "/"); + /* BAD */ + r_strcat(linkpath, curpath + where); + } + /* BAD */ + r_strcpy(curpath, linkpath); + } + + return result; +} + +int main () +{ + char pathname [MAXPATHLEN]; + char result [MAXPATHLEN]; + char chroot_path [MAXPATHLEN]; + + /* Don't use too big a pathname; we're not trying to overflow curpath */ + pathname [MAXPATHLEN-1] = EOS; + result [MAXPATHLEN-1] = EOS; + chroot_path [MAXPATHLEN-1] = EOS; + + realpath(pathname, result, chroot_path); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/prefix_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/prefix_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/prefix_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/prefix_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,121 @@ +#include "../wu-ftpd.h" + +char * +realpath(const char *pathname, char *result, char* chroot_path) +{ + char curpath[MAXPATHLEN], + workpath[MAXPATHLEN], + linkpath[MAXPATHLEN], + namebuf[MAXPATHLEN]; + int len; + int where; + int ptr; + int last; + + if (result == NULL) + return(NULL); + + if(pathname == NULL){ + *result = EOS; + return(NULL); + } + + strcpy(curpath, pathname); + + if (*pathname != '/') { + uid_t userid; + + if (!getcwd(workpath,MAXPATHLEN)) { + userid = geteuid(); + delay_signaling(); + seteuid(0); + if (!getcwd(workpath,MAXPATHLEN)) { + strcpy(result, "."); + seteuid(userid); + enable_signaling(); + return (NULL); + } + seteuid(userid); + enable_signaling(); + } + } else + *workpath = EOS; + + where = 0; + while (curpath[where] != EOS) { + if (!strcmp(curpath + where, ".")) { + where++; + continue; + } + if (!strncmp(curpath + where, "./", 2)) { + where += 2; + continue; + } + if (!strncmp(curpath + where, "../", 3)) { + where += 3; + ptr = last = 0; + while (workpath[ptr] != EOS) { + if (workpath[ptr] == '/') + last = ptr; + ptr++; + } + workpath[last] = EOS; + continue; + } + ptr = istrchr(curpath + where, '/'); + if (curpath[ptr] == EOS) + ptr = where + strlen(curpath + where) - 1; + else + curpath[ptr] = EOS; + + strcpy(namebuf, workpath); + for (last = 0; namebuf[last] != EOS; last++) + continue; + + /* Chop out the out-of-bounds writes.... */ + } + + /* Stand-in for checking stat fields. */ + if (nondet_int() == 1) { + len = readlink(namebuf, linkpath, MAXPATHLEN); + if (len <= 0) + return NULL; + + linkpath[len] = EOS; + + if (linkpath[0] == '/') + workpath[0] = EOS; + if (where[0] != EOS) { + /* OK */ + r_strncat(linkpath, "/", MAXPATHLEN-strlen(linkpath)-1); + if (strlen(linkpath)+strlen(where)>=MAXPATHLEN) { + return NULL; + } + /* OK */ + r_strncat(linkpath, where, MAXPATHLEN-strlen(linkpath)- 1); + } + if (strlen(linkpath) >= MAXPATHLEN) { + return NULL; + } + /* OK */ + r_strcpy(curpath, linkpath); + } + + return result; +} + +int main () +{ + char pathname [MAXPATHLEN]; + char result [MAXPATHLEN]; + char chroot_path [MAXPATHLEN]; + + /* Don't use too big a pathname; we're not trying to overflow curpath */ + pathname [MAXPATHLEN-1] = EOS; + result [MAXPATHLEN-1] = EOS; + chroot_path [MAXPATHLEN-1] = EOS; + + realpath(pathname, result, chroot_path); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/prefix_simp_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/prefix_simp_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/prefix_simp_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/prefix_simp_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,95 @@ +#include "../wu-ftpd.h" + +char * +realpath(const char *pathname, char *result, char* chroot_path) +{ + char curpath[MAXPATHLEN], + workpath[MAXPATHLEN], + linkpath[MAXPATHLEN], + namebuf[MAXPATHLEN]; + int len; + int where; + int ptr; + int last; + + if (result == NULL) + return(NULL); + + if(pathname == NULL){ + *result = EOS; + return(NULL); + } + + strcpy(curpath, pathname); + + if (pathname[0] != '/') { + uid_t userid; + + if (!getcwd(workpath,MAXPATHLEN)) { + userid = geteuid(); + delay_signaling(); + seteuid(0); + if (!getcwd(workpath,MAXPATHLEN)) { + strcpy(result, "."); + seteuid(userid); + enable_signaling(); + return (NULL); + } + seteuid(userid); + enable_signaling(); + } + } else + workpath[0] = EOS; + + where = 0; + while (curpath[where] != EOS) { + if (!strcmp(curpath + where, ".")) { + where++; + continue; + } + + strcpy(namebuf, workpath); + for (last = 0; namebuf[last] != EOS; last++) + continue; + + /* Chop out the out-of-bounds writes.... */ + } + + /* Stand-in for checking stat fields. */ + if (nondet_int() == 1) { + len = readlink(namebuf, linkpath, MAXPATHLEN); + if (len <= 0) + return NULL; + + linkpath[len] = EOS; + + if (linkpath[0] == '/') + workpath[0] = EOS; + if (curpath[where] != EOS) { + /* BAD */ + r_strcat(linkpath, "/"); + /* BAD */ + r_strcat(linkpath, curpath + where); + } + /* BAD */ + r_strcpy(curpath, linkpath); + } + + return result; +} + +int main () +{ + char pathname [MAXPATHLEN]; + char result [MAXPATHLEN]; + char chroot_path [MAXPATHLEN]; + + /* Don't use too big a pathname; we're not trying to overflow curpath */ + pathname [MAXPATHLEN-1] = EOS; + result [MAXPATHLEN-1] = EOS; + chroot_path [MAXPATHLEN-1] = EOS; + + realpath(pathname, result, chroot_path); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/prefix_simp_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/prefix_simp_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/prefix_simp_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/prefix_simp_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,101 @@ +#include "../wu-ftpd.h" + +char * +realpath(const char *pathname, char *result, char* chroot_path) +{ + char curpath[MAXPATHLEN], + workpath[MAXPATHLEN], + linkpath[MAXPATHLEN], + namebuf[MAXPATHLEN]; + int len; + int where; + int ptr; + int last; + + if (result == NULL) + return(NULL); + + if(pathname == NULL){ + *result = EOS; + return(NULL); + } + + strcpy(curpath, pathname); + + if (pathname[0] != '/') { + uid_t userid; + + if (!getcwd(workpath,MAXPATHLEN)) { + userid = geteuid(); + delay_signaling(); + seteuid(0); + if (!getcwd(workpath,MAXPATHLEN)) { + strcpy(result, "."); + seteuid(userid); + enable_signaling(); + return (NULL); + } + seteuid(userid); + enable_signaling(); + } + } else + workpath[0] = EOS; + + where = 0; + while (curpath[where] != EOS) { + if (!strcmp(curpath + where, ".")) { + where++; + continue; + } + + strcpy(namebuf, workpath); + for (last = 0; namebuf[last] != EOS; last++) + continue; + + /* Chop out the out-of-bounds writes.... */ + } + + /* Stand-in for checking stat fields. */ + if (nondet_int() == 1) { + len = readlink(namebuf, linkpath, MAXPATHLEN); + if (len <= 0) + return NULL; + + linkpath[len] = EOS; + + if (linkpath[0] == '/') + workpath[0] = EOS; + if (where[0] != EOS) { + /* OK */ + r_strncat(linkpath, "/", MAXPATHLEN-strlen(linkpath)-1); + if (strlen(linkpath)+strlen(where)>=MAXPATHLEN) { + return NULL; + } + /* OK */ + r_strncat(linkpath, where, MAXPATHLEN-strlen(linkpath)- 1); + } + if (strlen(linkpath) >= MAXPATHLEN) { + return NULL; + } + /* OK */ + r_strcpy(curpath, linkpath); + } + + return result; +} + +int main () +{ + char pathname [MAXPATHLEN]; + char result [MAXPATHLEN]; + char chroot_path [MAXPATHLEN]; + + /* Don't use too big a pathname; we're not trying to overflow curpath */ + pathname [MAXPATHLEN-1] = EOS; + result [MAXPATHLEN-1] = EOS; + chroot_path [MAXPATHLEN-1] = EOS; + + realpath(pathname, result, chroot_path); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/strcpy_strcat_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/strcpy_strcat_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/strcpy_strcat_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/strcpy_strcat_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,52 @@ +#include "../wu-ftpd.h" + +char * +realpath(const char *pathname, char *result, char* chroot_path) +{ + char curpath[MAXPATHLEN], + workpath[MAXPATHLEN], + linkpath[MAXPATHLEN], + namebuf[MAXPATHLEN], + *where; + int len; + + where = curpath; + + /* Stand-in for checking stat fields. */ + if (nondet_int() == 1) { + len = readlink(namebuf, linkpath, MAXPATHLEN); + if (len <= 0) + return NULL; + + linkpath[len] = EOS; + + if (linkpath[0] == '/') + workpath[0] = EOS; + if (where[0] != EOS) { + /* BAD */ + r_strcat(linkpath, "/"); + /* BAD */ + r_strcat(linkpath, where); + } + /* BAD */ + r_strcpy(curpath, linkpath); + } + + return result; +} + +int main () +{ + char pathname [MAXPATHLEN]; + char result [MAXPATHLEN]; + char chroot_path [MAXPATHLEN]; + + /* Don't use too big a pathname; we're not trying to overflow curpath */ + pathname [MAXPATHLEN-1] = EOS; + result [MAXPATHLEN-1] = EOS; + chroot_path [MAXPATHLEN-1] = EOS; + + realpath(pathname, result, chroot_path); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/strcpy_strcat_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/strcpy_strcat_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/strcpy_strcat_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-linkpath/strcpy_strcat_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,58 @@ +#include "../wu-ftpd.h" + +char * +realpath(const char *pathname, char *result, char* chroot_path) +{ + char curpath[MAXPATHLEN], + workpath[MAXPATHLEN], + linkpath[MAXPATHLEN], + namebuf[MAXPATHLEN], + *where; + int len; + + where = curpath; + + /* Stand-in for checking stat fields. */ + if (nondet_int() == 1) { + len = readlink(namebuf, linkpath, MAXPATHLEN); + if (len <= 0) + return NULL; + + linkpath[len] = EOS; + + if (linkpath[0] == '/') + workpath[0] = EOS; + if (where[0] != EOS) { + /* OK */ + r_strncat(linkpath, "/", MAXPATHLEN-strlen(linkpath)-1); + if (strlen(linkpath)+strlen(where)>=MAXPATHLEN) { + return NULL; + } + /* OK */ + r_strncat(linkpath, where, MAXPATHLEN-strlen(linkpath)- 1); + } + if (strlen(linkpath) >= MAXPATHLEN) { + return NULL; + } + /* OK */ + r_strcpy(curpath, linkpath); + } + + return result; +} + +int main () +{ + char pathname [MAXPATHLEN]; + char result [MAXPATHLEN]; + char chroot_path [MAXPATHLEN]; + + /* Don't use too big a pathname; we're not trying to overflow curpath */ + pathname [MAXPATHLEN-1] = EOS; + result [MAXPATHLEN-1] = EOS; + chroot_path [MAXPATHLEN-1] = EOS; + + realpath(pathname, result, chroot_path); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/iter_ints_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/iter_ints_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/iter_ints_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/iter_ints_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,98 @@ +#include "../wu-ftpd.h" + +char * +realpath(const char *pathname, char *result, char* chroot_path) +{ + char curpath[MAXPATHLEN], + workpath[MAXPATHLEN], + linkpath[MAXPATHLEN], + namebuf[MAXPATHLEN]; + int len; + int where; + int ptr; + int last; + + if (result == NULL) + return(NULL); + + if(pathname == NULL){ + *result = EOS; + return(NULL); + } + + strcpy(curpath, pathname); + + if (*pathname != '/') { + uid_t userid; + + if (!getcwd(workpath,MAXPATHLEN)) { + userid = geteuid(); + delay_signaling(); + seteuid(0); + if (!getcwd(workpath,MAXPATHLEN)) { + strcpy(result, "."); + seteuid(userid); + enable_signaling(); + return (NULL); + } + seteuid(userid); + enable_signaling(); + } + } else + *workpath = EOS; + + where = 0; + while (curpath[where] != EOS) { + if (!strcmp(curpath + where, ".")) { + where++; + continue; + } + if (!strncmp(curpath + where, "./", 2)) { + where += 2; + continue; + } + if (!strncmp(curpath + where, "../", 3)) { + where += 3; + ptr = last = 0; + while (workpath[ptr] != EOS) { + if (workpath[ptr] == '/') + last = ptr; + ptr++; + } + workpath[last] = EOS; + continue; + } + ptr = istrchr(curpath + where, '/'); + if (curpath[ptr] == EOS) + ptr = where + strlen(curpath + where) - 1; + else + curpath[ptr] = EOS; + + strcpy(namebuf, workpath); + for (last = 0; namebuf[last] != EOS; last++) + continue; + if ((last == 0) || (namebuf[--last] != '/')) + /* BAD */ + r_strcat(namebuf, "/"); + + /* BAD */ + r_strcat(namebuf, curpath + where); + } + return result; +} + +int main () +{ + char pathname [MAXPATHLEN]; + char result [MAXPATHLEN]; + char chroot_path [MAXPATHLEN]; + + /* Don't use too big a pathname; we're not trying to overflow curpath */ + pathname [MAXPATHLEN-1] = EOS; + result [MAXPATHLEN-1] = EOS; + chroot_path [MAXPATHLEN-1] = EOS; + + realpath(pathname, result, chroot_path); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/iter_ints_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/iter_ints_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/iter_ints_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/iter_ints_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,98 @@ +#include "../wu-ftpd.h" + +char * +realpath(const char *pathname, char *result, char* chroot_path) +{ + char curpath[MAXPATHLEN], + workpath[MAXPATHLEN], + linkpath[MAXPATHLEN], + namebuf[MAXPATHLEN]; + int len; + int where; + int ptr; + int last; + + if (result == NULL) + return(NULL); + + if(pathname == NULL){ + *result = EOS; + return(NULL); + } + + strcpy(curpath, pathname); + + if (*pathname != '/') { + uid_t userid; + + if (!getcwd(workpath,MAXPATHLEN)) { + userid = geteuid(); + delay_signaling(); + seteuid(0); + if (!getcwd(workpath,MAXPATHLEN)) { + strcpy(result, "."); + seteuid(userid); + enable_signaling(); + return (NULL); + } + seteuid(userid); + enable_signaling(); + } + } else + *workpath = EOS; + + where = 0; + while (curpath[where] != EOS) { + if (!strcmp(curpath + where, ".")) { + where++; + continue; + } + if (!strncmp(curpath + where, "./", 2)) { + where += 2; + continue; + } + if (!strncmp(curpath + where, "../", 3)) { + where += 3; + ptr = last = 0; + while (workpath[ptr] != EOS) { + if (workpath[ptr] == '/') + last = ptr; + ptr++; + } + workpath[last] = EOS; + continue; + } + ptr = istrchr(curpath + where, '/'); + if (curpath[ptr] == EOS) + ptr = where + strlen(curpath + where) - 1; + else + curpath[ptr] = EOS; + + strcpy(namebuf, workpath); + for (last = 0; namebuf[last] != EOS; last++) + continue; + if ((last == 0) || (namebuf[--last] != '/')) + /* OK */ + r_strncat(namebuf, "/", MAXPATHLEN-strlen(namebuf)-1); + + /* OK */ + r_strncat(namebuf, curpath + where, MAXPATHLEN-strlen(namebuf)-1); + } + return result; +} + +int main () +{ + char pathname [MAXPATHLEN]; + char result [MAXPATHLEN]; + char chroot_path [MAXPATHLEN]; + + /* Don't use too big a pathname; we're not trying to overflow curpath */ + pathname [MAXPATHLEN-1] = EOS; + result [MAXPATHLEN-1] = EOS; + chroot_path [MAXPATHLEN-1] = EOS; + + realpath(pathname, result, chroot_path); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/iter_ints_simp_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/iter_ints_simp_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/iter_ints_simp_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/iter_ints_simp_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,79 @@ +#include "../wu-ftpd.h" + +char * +realpath(const char *pathname, char *result, char* chroot_path) +{ + char curpath[MAXPATHLEN], + workpath[MAXPATHLEN], + linkpath[MAXPATHLEN], + namebuf[MAXPATHLEN]; + int len; + int where; + int ptr; + int last; + + if (result == NULL) + return(NULL); + + if(pathname == NULL){ + *result = EOS; + return(NULL); + } + + strcpy(curpath, pathname); + + if (pathname[0] != '/') { + uid_t userid; + + if (!getcwd(workpath,MAXPATHLEN)) { + userid = geteuid(); + delay_signaling(); + seteuid(0); + if (!getcwd(workpath,MAXPATHLEN)) { + strcpy(result, "."); + seteuid(userid); + enable_signaling(); + return (NULL); + } + seteuid(userid); + enable_signaling(); + } + } else + workpath[0] = EOS; + + where = 0; + while (curpath[where] != EOS) { + if (!strcmp(curpath + where, ".")) { + where++; + continue; + } + + strcpy(namebuf, workpath); + for (last = 0; namebuf[last] != EOS; last++) + continue; + if ((last == 0) || (namebuf[--last] != '/')) + /* BAD */ + r_strcat(namebuf, "/"); + + /* BAD */ + r_strcat(namebuf, curpath + where); + } + + return result; +} + +int main () +{ + char pathname [MAXPATHLEN]; + char result [MAXPATHLEN]; + char chroot_path [MAXPATHLEN]; + + /* Don't use too big a pathname; we're not trying to overflow curpath */ + pathname [MAXPATHLEN-1] = EOS; + result [MAXPATHLEN-1] = EOS; + chroot_path [MAXPATHLEN-1] = EOS; + + realpath(pathname, result, chroot_path); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/iter_ints_simp_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/iter_ints_simp_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/iter_ints_simp_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/iter_ints_simp_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,78 @@ +#include "../wu-ftpd.h" + +char * +realpath(const char *pathname, char *result, char* chroot_path) +{ + char curpath[MAXPATHLEN], + workpath[MAXPATHLEN], + linkpath[MAXPATHLEN], + namebuf[MAXPATHLEN]; + int len; + int where; + int ptr; + int last; + + if (result == NULL) + return(NULL); + + if(pathname == NULL){ + *result = EOS; + return(NULL); + } + + strcpy(curpath, pathname); + + if (pathname[0] != '/') { + uid_t userid; + + if (!getcwd(workpath,MAXPATHLEN)) { + userid = geteuid(); + delay_signaling(); + seteuid(0); + if (!getcwd(workpath,MAXPATHLEN)) { + strcpy(result, "."); + seteuid(userid); + enable_signaling(); + return (NULL); + } + seteuid(userid); + enable_signaling(); + } + } else + workpath[0] = EOS; + + where = 0; + while (curpath[where] != EOS) { + if (!strcmp(curpath + where, ".")) { + where++; + continue; + } + + strcpy(namebuf, workpath); + for (last = 0; namebuf[last] != EOS; last++) + continue; + if ((last == 0) || (namebuf[--last] != '/')) + /* OK */ + r_strncat(namebuf, "/", MAXPATHLEN-strlen(namebuf)-1); + + /* OK */ + r_strncat(namebuf, curpath + where, MAXPATHLEN-strlen(namebuf)-1); } + + return result; +} + +int main () +{ + char pathname [MAXPATHLEN]; + char result [MAXPATHLEN]; + char chroot_path [MAXPATHLEN]; + + /* Don't use too big a pathname; we're not trying to overflow curpath */ + pathname [MAXPATHLEN-1] = EOS; + result [MAXPATHLEN-1] = EOS; + chroot_path [MAXPATHLEN-1] = EOS; + + realpath(pathname, result, chroot_path); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/strcpy_strcat_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/strcpy_strcat_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/strcpy_strcat_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/strcpy_strcat_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,42 @@ +#include "../wu-ftpd.h" + +char * +realpath(const char *pathname, char *result, char* chroot_path) +{ + char curpath[MAXPATHLEN], + workpath[MAXPATHLEN], + namebuf[MAXPATHLEN]; + + if (result == NULL) + return(NULL); + + if(pathname == NULL){ + *result = EOS; + return(NULL); + } + + workpath[MAXPATHLEN-1] = EOS; + strcpy(curpath, pathname); + strcpy(namebuf, workpath); + + /* BAD */ + r_strcat(namebuf, curpath); + + return result; +} + +int main () +{ + char pathname [MAXPATHLEN]; + char result [MAXPATHLEN]; + char chroot_path [MAXPATHLEN]; + + /* Don't use too big a pathname; we're not trying to overflow curpath */ + pathname [MAXPATHLEN-1] = EOS; + result [MAXPATHLEN-1] = EOS; + chroot_path [MAXPATHLEN-1] = EOS; + + realpath(pathname, result, chroot_path); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/strcpy_strcat_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/strcpy_strcat_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/strcpy_strcat_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/realpath-namebuf/strcpy_strcat_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,42 @@ +#include "../wu-ftpd.h" + +char * +realpath(const char *pathname, char *result, char* chroot_path) +{ + char curpath[MAXPATHLEN], + workpath[MAXPATHLEN], + namebuf[MAXPATHLEN]; + + if (result == NULL) + return(NULL); + + if(pathname == NULL){ + *result = EOS; + return(NULL); + } + + workpath[MAXPATHLEN-1] = EOS; + strcpy(curpath, pathname); + strcpy(namebuf, workpath); + + /* OK */ + r_strncat(namebuf, curpath, MAXPATHLEN-strlen(namebuf)-1); + + return result; +} + +int main () +{ + char pathname [MAXPATHLEN]; + char result [MAXPATHLEN]; + char chroot_path [MAXPATHLEN]; + + /* Don't use too big a pathname; we're not trying to overflow curpath */ + pathname [MAXPATHLEN-1] = EOS; + result [MAXPATHLEN-1] = EOS; + chroot_path [MAXPATHLEN-1] = EOS; + + realpath(pathname, result, chroot_path); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/wu-ftpd.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/wu-ftpd.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/wu-ftpd.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/wu-ftpd.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,44 @@ +#include "wu-ftpd.h" + +uid_t geteuid(void) +{ + return nondet_short(); +} + +int seteuid(uid_t euid) +{ + if (nondet_int() == 0) + return 0; + return -1; +} + +int enable_signaling() +{ + return (0); +} + +int delay_signaling() +{ + return (0); +} + +/* Returns the number of bytes written to buf, or -1 if there's an + error. This'll do it, assuming buf is initially uninitialized. */ +int readlink(const char *path, char *buf, int bufsiz) +{ + int n = nondet_int (); + if (n < bufsiz && n >= 0) + return n; + return -1; +} + +/* Just make sure buf is null-terminated unless we simulate an error. */ +char *getcwd(char *buf, size_t size) +{ + if (nondet_int() == 0) { + return NULL; + } + buf [size-1] = EOS; + return buf; +} + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/wu-ftpd.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/wu-ftpd.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/wu-ftpd.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-1999-0368/wu-ftpd.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,16 @@ +#include "../../../../lib/stubs.h" + +/* Size of buffer being overflowed, and most input buffers. We + * strncmp() it against "../", so make sure it has at least 3 + * cells. */ +#define MAXPATHLEN BASE_SZ + 3 + +typedef short uid_t; +uid_t geteuid(void); +int seteuid(uid_t euid); + +int enable_signaling(); +int delay_signaling(); + +int readlink(const char *path, char *buf, int bufsiz); +char *getcwd(char *buf, size_t size); diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/almost_simple_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/almost_simple_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/almost_simple_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/almost_simple_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,53 @@ +#include "../wu-ftpd.h" + + +/* resolved is an *input*, initially uninitialized */ +char *fb_realpath(const char *path, char *resolved) +{ + int rootd; + char wbuf[MAXPATHLEN]; + int resultcode; + char tmp [MAXPATHLEN]; + int p, q; + + (void) strncpy(resolved, path, MAXPATHLEN - 1); + resolved[MAXPATHLEN - 1] = EOS; + + p = 0; + + /* wbuf contains the filename, but not the path to it */ + strcpy(wbuf, resolved + p); + + if (getcwd(resolved, MAXPATHLEN) == NULL) + return NULL; + + if (resolved[0] == '/' && resolved[1] == EOS) + rootd = 1; + else + rootd = 0; + + if (wbuf[0] != EOS) { + if (strlen(resolved) + strlen(wbuf) + rootd + 1 > MAXPATHLEN) { + return NULL; + } + if (rootd == 0) + (void) strcat(resolved, "/"); + + /* BAD */ + (void) r_strcat(resolved, wbuf); + } + return (NULL); +} + +int main () +{ + char pathname [MAXPATHLEN]; + char resolved [MAXPATHLEN]; + + pathname [MAXPATHLEN-1] = EOS; + resolved [MAXPATHLEN-1] = EOS; + + fb_realpath(pathname, resolved); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/almost_simple_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/almost_simple_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/almost_simple_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/almost_simple_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,53 @@ +#include "../wu-ftpd.h" + + +/* resolved is an *input*, initially uninitialized */ +char *fb_realpath(const char *path, char *resolved) +{ + int rootd; + char wbuf[MAXPATHLEN]; + int resultcode; + char tmp [MAXPATHLEN]; + int p, q; + + (void) strncpy(resolved, path, MAXPATHLEN - 1); + resolved[MAXPATHLEN - 1] = EOS; + + p = 0; + + /* wbuf contains the filename, but not the path to it */ + strcpy(wbuf, resolved + p); + + if (getcwd(resolved, MAXPATHLEN) == NULL) + return NULL; + + if (resolved[0] == '/' && resolved[1] == EOS) + rootd = 1; + else + rootd = 0; + + if (wbuf[0] != EOS) { + if (strlen(resolved) + strlen(wbuf) + !rootd + 1 > MAXPATHLEN) { + return NULL; + } + if (rootd == 0) + (void) strcat(resolved, "/"); + + /* OK */ + (void) r_strcat(resolved, wbuf); + } + return (NULL); +} + +int main () +{ + char pathname [MAXPATHLEN]; + char resolved [MAXPATHLEN]; + + pathname [MAXPATHLEN-1] = EOS; + resolved [MAXPATHLEN-1] = EOS; + + fb_realpath(pathname, resolved); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/istrrchr_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/istrrchr_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/istrrchr_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/istrrchr_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,63 @@ +#include "../wu-ftpd.h" + + +/* resolved is an *input*, initially uninitialized */ +char *fb_realpath(const char *path, char *resolved) +{ + int rootd; + char wbuf[MAXPATHLEN]; + int resultcode; + char tmp [MAXPATHLEN]; + int p, q; + + (void) strncpy(resolved, path, MAXPATHLEN - 1); + resolved[MAXPATHLEN - 1] = EOS; + + /* Once this loop terminates, the final slash in resolved has been + * replaced with an EOS, and p points to the filename after it. + */ + q = istrrchr(resolved, '/'); + if (q != -1) { + /* p is whatever's after the last slash */ + p = q + 1; + } + else + /* no slashes found ==> just a filename */ + p = 0; + + /* wbuf contains the filename, but not the path to it */ + strcpy(wbuf, resolved + p); + + if (getcwd(resolved, MAXPATHLEN) == NULL) + return NULL; + + if (resolved[0] == '/' && resolved[1] == EOS) + rootd = 1; + else + rootd = 0; + + if (wbuf[0] != EOS) { + if (strlen(resolved) + strlen(wbuf) + rootd + 1 > MAXPATHLEN) { + return NULL; + } + if (rootd == 0) + (void) strcat(resolved, "/"); + + /* BAD */ + (void) r_strcat(resolved, wbuf); + } + return (NULL); +} + +int main () +{ + char pathname [MAXPATHLEN]; + char resolved [MAXPATHLEN]; + + pathname [MAXPATHLEN-1] = EOS; + resolved [MAXPATHLEN-1] = EOS; + + fb_realpath(pathname, resolved); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/istrrchr_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/istrrchr_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/istrrchr_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/istrrchr_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,63 @@ +#include "../wu-ftpd.h" + + +/* resolved is an *input*, initially uninitialized */ +char *fb_realpath(const char *path, char *resolved) +{ + int rootd; + char wbuf[MAXPATHLEN]; + int resultcode; + char tmp [MAXPATHLEN]; + int p, q; + + (void) strncpy(resolved, path, MAXPATHLEN - 1); + resolved[MAXPATHLEN - 1] = EOS; + + /* Once this loop terminates, the final slash in resolved has been + * replaced with an EOS, and p points to the filename after it. + */ + q = istrrchr(resolved, '/'); + if (q != -1) { + /* p is whatever's after the last slash */ + p = q + 1; + } + else + /* no slashes found ==> just a filename */ + p = 0; + + /* wbuf contains the filename, but not the path to it */ + strcpy(wbuf, resolved + p); + + if (getcwd(resolved, MAXPATHLEN) == NULL) + return NULL; + + if (resolved[0] == '/' && resolved[1] == EOS) + rootd = 1; + else + rootd = 0; + + if (wbuf[0] != EOS) { + if (strlen(resolved) + strlen(wbuf) + !rootd + 1 > MAXPATHLEN) { + return NULL; + } + if (rootd == 0) + (void) strcat(resolved, "/"); + + /* OK */ + (void) r_strcat(resolved, wbuf); + } + return (NULL); +} + +int main () +{ + char pathname [MAXPATHLEN]; + char resolved [MAXPATHLEN]; + + pathname [MAXPATHLEN-1] = EOS; + resolved [MAXPATHLEN-1] = EOS; + + fb_realpath(pathname, resolved); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/no_symlinks_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/no_symlinks_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/no_symlinks_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/no_symlinks_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,78 @@ +#include "../wu-ftpd.h" + + +/* resolved is an *input*, initially uninitialized */ +char *fb_realpath(const char *path, char *resolved) +{ + int rootd; + char wbuf[MAXPATHLEN]; + int resultcode; + char tmp [MAXPATHLEN]; + int p, q; + + (void) strncpy(resolved, path, MAXPATHLEN - 1); + resolved[MAXPATHLEN - 1] = EOS; + + /* Once this loop terminates, the final slash in resolved has been + * replaced with an EOS, and p points to the filename after it. + */ + q = istrrchr(resolved, '/'); + if (q != -1) { + /* p is whatever's after the last slash */ + p = q + 1; + + if (q == 0) { + /* Don't do anything. Originally, q was a pointer, we set it + * to "/", and chdir'd to "/". Since we're chopping out the chdir, + * we don't need to do anything. + */ + } else { + /* chops off the last slash and terminates resolved[] at it */ + do { + --q; + } while (q > 0 && resolved[q] == '/'); + resolved[q+1] = EOS; + q = 0; + } + + } + else + /* no slashes found ==> just a filename */ + p = 0; + + /* wbuf contains the filename, but not the path to it */ + strcpy(wbuf, resolved + p); + + if (getcwd(resolved, MAXPATHLEN) == NULL) + return NULL; + + if (resolved[0] == '/' && resolved[1] == EOS) + rootd = 1; + else + rootd = 0; + + if (wbuf[0] != EOS) { + if (strlen(resolved) + strlen(wbuf) + rootd + 1 > MAXPATHLEN) { + return NULL; + } + if (rootd == 0) + (void) strcat(resolved, "/"); + + /* BAD */ + (void) r_strcat(resolved, wbuf); + } + return (NULL); +} + +int main () +{ + char pathname [MAXPATHLEN]; + char resolved [MAXPATHLEN]; + + pathname [MAXPATHLEN-1] = EOS; + resolved [MAXPATHLEN-1] = EOS; + + fb_realpath(pathname, resolved); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/no_symlinks_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/no_symlinks_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/no_symlinks_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/no_symlinks_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,78 @@ +#include "../wu-ftpd.h" + + +/* resolved is an *input*, initially uninitialized */ +char *fb_realpath(const char *path, char *resolved) +{ + int rootd; + char wbuf[MAXPATHLEN]; + int resultcode; + char tmp [MAXPATHLEN]; + int p, q; + + (void) strncpy(resolved, path, MAXPATHLEN - 1); + resolved[MAXPATHLEN - 1] = EOS; + + /* Once this loop terminates, the final slash in resolved has been + * replaced with an EOS, and p points to the filename after it. + */ + q = istrrchr(resolved, '/'); + if (q != -1) { + /* p is whatever's after the last slash */ + p = q + 1; + + if (q == 0) { + /* Don't do anything. Originally, q was a pointer, we set it + * to "/", and chdir'd to "/". Since we're chopping out the chdir, + * we don't need to do anything. + */ + } else { + /* chops off the last slash and terminates resolved[] at it */ + do { + --q; + } while (q > 0 && resolved[q] == '/'); + resolved[q+1] = EOS; + q = 0; + } + + } + else + /* no slashes found ==> just a filename */ + p = 0; + + /* wbuf contains the filename, but not the path to it */ + strcpy(wbuf, resolved + p); + + if (getcwd(resolved, MAXPATHLEN) == NULL) + return NULL; + + if (resolved[0] == '/' && resolved[1] == EOS) + rootd = 1; + else + rootd = 0; + + if (wbuf[0] != EOS) { + if (strlen(resolved) + strlen(wbuf) + !rootd + 1 > MAXPATHLEN) { + return NULL; + } + if (rootd == 0) + (void) strcat(resolved, "/"); + + /* OK */ + (void) r_strcat(resolved, wbuf); + } + return (NULL); +} + +int main () +{ + char pathname [MAXPATHLEN]; + char resolved [MAXPATHLEN]; + + pathname [MAXPATHLEN-1] = EOS; + resolved [MAXPATHLEN-1] = EOS; + + fb_realpath(pathname, resolved); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/simple_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/simple_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/simple_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/simple_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,46 @@ +#include "../wu-ftpd.h" + + +/* resolved is an *input*, initially uninitialized */ +char *fb_realpath(const char *path, char *resolved) +{ + int rootd; + char *p, *q, wbuf[MAXPATHLEN]; + int resultcode; + char tmp [MAXPATHLEN]; + + wbuf[MAXPATHLEN-1] = EOS; + + if (getcwd(resolved, MAXPATHLEN) == NULL) + return NULL; + + if (resolved[0] == '/' && resolved[1] == EOS) + rootd = 1; + else + rootd = 0; + + if (wbuf[0] != EOS) { + if (strlen(resolved) + strlen(wbuf) + rootd + 1 > MAXPATHLEN) { + return NULL; + } + if (rootd == 0) + (void) strcat(resolved, "/"); + + /* BAD */ + (void) r_strcat(resolved, wbuf); + } + return (NULL); +} + +int main () +{ + char pathname [MAXPATHLEN]; + char resolved [MAXPATHLEN]; + + pathname [MAXPATHLEN-1] = EOS; + resolved [MAXPATHLEN-1] = EOS; + + fb_realpath(pathname, resolved); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/simple_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/simple_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/simple_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/simple_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,46 @@ +#include "../wu-ftpd.h" + + +/* resolved is an *input*, initially uninitialized */ +char *fb_realpath(const char *path, char *resolved) +{ + int rootd; + char *p, *q, wbuf[MAXPATHLEN]; + int resultcode; + char tmp [MAXPATHLEN]; + + wbuf[MAXPATHLEN-1] = EOS; + + if (getcwd(resolved, MAXPATHLEN) == NULL) + return NULL; + + if (resolved[0] == '/' && resolved[1] == EOS) + rootd = 1; + else + rootd = 0; + + if (wbuf[0] != EOS) { + if (strlen(resolved) + strlen(wbuf) + !rootd + 1 > MAXPATHLEN) { + return NULL; + } + if (rootd == 0) + (void) strcat(resolved, "/"); + + /* OK */ + (void) r_strcat(resolved, wbuf); + } + return (NULL); +} + +int main () +{ + char pathname [MAXPATHLEN]; + char resolved [MAXPATHLEN]; + + pathname [MAXPATHLEN-1] = EOS; + resolved [MAXPATHLEN-1] = EOS; + + fb_realpath(pathname, resolved); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/symlinks_bad.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/symlinks_bad.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/symlinks_bad.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/symlinks_bad.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,108 @@ +#include "../wu-ftpd.h" + +/* resolved is an *input*, initially uninitialized */ +char *fb_realpath(const char *path, char *resolved) +{ + int rootd; + char wbuf[MAXPATHLEN]; + int resultcode; + char tmp [MAXPATHLEN]; + int p, q; + + (void) strncpy(resolved, path, MAXPATHLEN - 1); + resolved[MAXPATHLEN - 1] = EOS; + + loop: + /* Once this loop terminates, the final slash in resolved has been + * replaced with an EOS, and p points to the filename after it. + */ + q = istrrchr(resolved, '/'); + if (q != -1) { + /* p is whatever's after the last slash */ + p = q + 1; + + if (q == 0) { + /* Don't do anything. Originally, q was a pointer, we set it + * to "/", and chdir'd to "/". Since we're chopping out the chdir, + * we don't need to do anything. + */ + } else { + /* chops off the last slash and terminates resolved[] at it */ + do { + --q; + } while (q > 0 && resolved[q] == '/'); + resolved[q+1] = EOS; + q = 0; + } + + } + else + /* no slashes found ==> just a filename */ + p = 0; + + if (resolved[p] != EOS) { + resultcode = nondet_int(); + /* If lstat() didn't fail.... */ + if (resultcode == 0) { + int symlinks = 0; + int n; + + /* If this was a symlink.... */ + if (nondet_int()) { + if (++symlinks > MAXSYMLINKS) { + return NULL; + } + strcpy(tmp, resolved + p); + n = readlink(tmp, resolved, MAXPATHLEN); + if (n < 0) { + return NULL; + } + resolved[n] = EOS; + + goto loop; + } + /* p was originally a pointer, and it could have been set to "" + * here if the final component were a directory. + * + * That's hard to do with an integer, so I'm slicing that + * out. This example's already plenty complex. + */ + } + } + + /* wbuf contains the filename, but not the path to it */ + strcpy(wbuf, resolved + p); + + if (getcwd(resolved, MAXPATHLEN) == NULL) + return NULL; + + if (resolved[0] == '/' && resolved[1] == EOS) + rootd = 1; + else + rootd = 0; + + if (wbuf[0] != EOS) { + if (strlen(resolved) + strlen(wbuf) + rootd + 1 > MAXPATHLEN) { + return NULL; + } + if (rootd == 0) + (void) strcat(resolved, "/"); + + /* BAD */ + (void) r_strcat(resolved, wbuf); + } + return (NULL); +} + +int main () +{ + char pathname [MAXPATHLEN]; + char resolved [MAXPATHLEN]; + + pathname [MAXPATHLEN-1] = EOS; + resolved [MAXPATHLEN-1] = EOS; + + fb_realpath(pathname, resolved); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/symlinks_ok.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/symlinks_ok.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/symlinks_ok.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/fb_realpath/symlinks_ok.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,108 @@ +#include "../wu-ftpd.h" + +/* resolved is an *input*, initially uninitialized */ +char *fb_realpath(const char *path, char *resolved) +{ + int rootd; + char wbuf[MAXPATHLEN]; + int resultcode; + char tmp [MAXPATHLEN]; + int p, q; + + (void) strncpy(resolved, path, MAXPATHLEN - 1); + resolved[MAXPATHLEN - 1] = EOS; + + loop: + /* Once this loop terminates, the final slash in resolved has been + * replaced with an EOS, and p points to the filename after it. + */ + q = istrrchr(resolved, '/'); + if (q != -1) { + /* p is whatever's after the last slash */ + p = q + 1; + + if (q == 0) { + /* Don't do anything. Originally, q was a pointer, we set it + * to "/", and chdir'd to "/". Since we're chopping out the chdir, + * we don't need to do anything. + */ + } else { + /* chops off the last slash and terminates resolved[] at it */ + do { + --q; + } while (q > 0 && resolved[q] == '/'); + resolved[q+1] = EOS; + q = 0; + } + + } + else + /* no slashes found ==> just a filename */ + p = 0; + + if (resolved[p] != EOS) { + resultcode = nondet_int(); + /* If lstat() didn't fail.... */ + if (resultcode == 0) { + int symlinks = 0; + int n; + + /* If this was a symlink.... */ + if (nondet_int()) { + if (++symlinks > MAXSYMLINKS) { + return NULL; + } + strcpy(tmp, resolved + p); + n = readlink(tmp, resolved, MAXPATHLEN); + if (n < 0) { + return NULL; + } + resolved[n] = EOS; + + goto loop; + } + /* p was originally a pointer, and it could have been set to "" + * here if the final component were a directory. + * + * That's hard to do with an integer, so I'm slicing that + * out. This example's already plenty complex. + */ + } + } + + /* wbuf contains the filename, but not the path to it */ + strcpy(wbuf, resolved + p); + + if (getcwd(resolved, MAXPATHLEN) == NULL) + return NULL; + + if (resolved[0] == '/' && resolved[1] == EOS) + rootd = 1; + else + rootd = 0; + + if (wbuf[0] != EOS) { + if (strlen(resolved) + strlen(wbuf) + !rootd + 1 > MAXPATHLEN) { + return NULL; + } + if (rootd == 0) + (void) strcat(resolved, "/"); + + /* OK */ + (void) r_strcat(resolved, wbuf); + } + return (NULL); +} + +int main () +{ + char pathname [MAXPATHLEN]; + char resolved [MAXPATHLEN]; + + pathname [MAXPATHLEN-1] = EOS; + resolved [MAXPATHLEN-1] = EOS; + + fb_realpath(pathname, resolved); + + return 0; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,36 @@ +-= CVE-2003-0466 =- + +Vulnerable versions: wu-ftpd 2.5.0 - 2.6.2 +File(s): src/realpath.c +Download from: + ftp://ftp.wu-ftpd.org/pub/wu-ftpd-attic/wu-ftpd-2.5.0.tar.gz + +Domain: FTP Server + +_ Vulnerable Functions and Buffers _ + +The buffer resolved[], which is an input to fb_realpath(), can be +overflowed. This buffer can be filled with up to MAXPATHLEN bytes by a +call to getcwd(). A slash ("/") and another buffer, wbuf[], can then +be appended to resolved[] using strcat. The bounds check is wrong --- +it should be saying that we need more room if we copy in a slash, but +it says that we need more if we *don't*. Hence there's an off-by-one +error if we do copy the salsh in. + +The patch involves adding a single exclamation point. ;-) + +fb_realpath() does some heavy string manipulations on the way to these +calls, and makes calls to the filesystem (which we model with +nondeterminism). For every decomposed program but the most simple one, +SatAbs gets a lot of timeouts. + +_ Decomposed Programs _ + +wu-ftpd.h + +fb_realpath/ + simple_bad.c + almost_simple_bad.c + istrrchr_bad.c + no_symlinks_bad.c + symlinks_bad.c diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/wu-ftpd.c frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/wu-ftpd.c --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/wu-ftpd.c 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/wu-ftpd.c 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,26 @@ +#include "wu-ftpd.h" + +extern char nondet_char(); + +/* Returns the number of bytes written to buf, or -1 if there's an + error. This'll do it, assuming buf is initially uninitialized. */ +int readlink(const char *path, char *buf, int bufsiz) +{ + int n = nondet_int (); + if (n < bufsiz && n >= 0) + return n; + return -1; +} + +/* Havoc everything in buf, then null-terminate it. */ +char *getcwd(char *buf, size_t size) +{ + int i; + if (nondet_int() == 0) { + return NULL; + } + for (i = 0; i < size-1; i++) + buf[i] = nondet_char(); + buf [size-1] = EOS; + return buf; +} diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/wu-ftpd.h frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/wu-ftpd.h --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/wu-ftpd.h 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/CVE-2003-0466/wu-ftpd.h 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,12 @@ +#include "../../../../lib/stubs.h" + +/* Size of input buffers and overflowed buffer; must be able to hold + * null-terminators in addition to actual data. */ +#define MAXPATHLEN BASE_SZ + 2 + +/* Used in symlinks_bad.c. */ +#define MAXSYMLINKS 1 + +int readlink(const char *path, char *buf, int bufsiz); +char *getcwd(char *buf, size_t size); + diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/README frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/README --- frama-c-20140301+neon+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/README 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/programs/apps/wu-ftpd/README 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,6 @@ +-= WU-FTPD =- + +Homepage: http://www.wu-ftpd.org +Domain: FTP Server + +FTP is the File Transfer Protocol. diff -Nru frama-c-20140301+neon+dfsg/tests/verisec/suite/README.verisec_suite frama-c-20150201+sodium+dfsg/tests/verisec/suite/README.verisec_suite --- frama-c-20140301+neon+dfsg/tests/verisec/suite/README.verisec_suite 1970-01-01 00:00:00.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/tests/verisec/suite/README.verisec_suite 2015-05-28 08:53:22.000000000 +0000 @@ -0,0 +1,60 @@ +-= Directory Structure of the Verisec Suite =- + +/lib contains stubs (simple implementations) of library functions in a file +stubs.c which should be linked into each testcase at analysis time. It also +includes two header files, stubs.h and base.h. The header file stubs.h is +#included in every testcase in the suite and itself #includes base.h. The file +base.h #defines the macro BASE_SZ which sets the base buffer size for all +testcases. This macro can be changed either by directly modifying base.h or, if +a tool supports it, by overriding it at the command line, e.g., via the -D +option in SatAbs and CBMC. + +/programs/apps contains the testcases which are first organized into +directories by program, e.g., as shown in Figure 1 below, sendmail, OpenSER, +and MADWiFi. Within each directory is a README file containing a brief +description of the related program. Then there is a directory for each +vulnerability in the program for which we developed testcases. Each +vulnerability has a README file which explains the vulnerability and briefly +describes its testcases. There are typically multiple testcases capturing the +vulnerability. For example, in the figure, there are two sets of testcases for +the CVE-2006-6749 vulnerability in OpenSER. These testcases are partitioned +into directories according to the depth of the function in the calling context +of the vulnerability. For example, in the figure below, in vulnerability +CVE-2006-6749, the overflow occurs in function parse_expression which is called +by function parse_expression_list. Thus, the testcases in the directory +parse_expression only capture the body of parse_expression, whereas the +testcases in the directory parse_expression_list capture the bodies of both +functions, i.e., they include some of the calling context of parse_expression. +Each testcase has unsafe and safe variants, indicated by the suffixes "bad" and +"ok", respectively. The vulnerable statements in unsafe variants are indicated +by the comment, "/* BAD */," on the line immediately preceding the statement. +The corresponding statements in safe variants are indicated by the comment, "/* +OK */." Some vulnerabilities include a subdirectory "complete", which includes +a testcase capturing most of the calling context of the vulnerability. + +-------------------------------------------------------------------------- + suite/ + README.verisec_suite + lib/ + programs/ + apps/ + OpenSER/ + README + CVE-2006-6749/ + README + complete/ + parse_expression/ + guard_random_index_bad.c + guard_random_index_ok.c + guard_strchr_bad.c + guard_strchr_ok.c + guard_strstr_bad.c + guard_strstr_ok.c + parse_expression_list/ + sendmail/ + MADWiFi/ + ... + +Fig. 1 -- Suite directory structure. +-------------------------------------------------------------------------- + diff -Nru frama-c-20140301+neon+dfsg/VERSION frama-c-20150201+sodium+dfsg/VERSION --- frama-c-20140301+neon+dfsg/VERSION 2014-03-12 15:07:50.000000000 +0000 +++ frama-c-20150201+sodium+dfsg/VERSION 2015-06-01 13:17:42.000000000 +0000 @@ -1 +1 @@ -Neon-20140301 +Sodium-20150201